← Back to Skills Marketplace
pirumpi

Kyndlo Events

by Carlos Martin · GitHub ↗ · v3.5.0 · MIT-0
darwinlinux ⚠ suspicious
201
Downloads
0
Stars
0
Active Installs
6
Versions
Install in OpenClaw
/install kyndlo-events
Description
WORKFLOW-DRIVEN event creation and validation from Kyndlo campaign tasks. When invoked, the agent MUST follow the mandatory step-by-step onboarding flow belo...
README (SKILL.md)

kyndlo-events — Kyndlo Event Management

CRITICAL: This skill has MANDATORY step-by-step workflows for both event creation and event validation. You MUST follow the exact steps in order. Do NOT skip steps. Do NOT ask your own questions. Do NOT improvise. The workflow tells you exactly what to run and what to ask at each step.

STOP — Read This First

When this skill is invoked (user says anything like "create events", "kyndlo-events", "generate events", etc.):

If the user says "validate events", "check events", "review events", or "validation" — skip directly to the Event Validation Workflow section below.

For event creation:

  1. Do NOT ask the user for city, date range, event style, theme, or any other freeform questions
  2. Do NOT try to gather requirements conversationally — the workflow below handles that
  3. DO immediately start at Step 1 below and follow every step in order
  4. DO run the CLI commands shown — they provide the data you need
  5. DO wait for the user's response where indicated before moving to the next step
  6. DO always check for existing events before creating — duplicates waste resources

Events are created from campaign tasks stored in the Kyndlo database, not from user-provided descriptions. The system tells you what events to create. Your job is to follow the workflow.

Setup

npm install -g gokyn
export KYNDLO_API_TOKEN="kyndlo_..."
export GOOGLE_PLACES_API_KEY="..."   # Required for venue discovery via goplaces

All gokyn commands accept --token \x3Ctoken> if the env var is not set. Add --json to any command for machine-readable output. goplaces is used for venue discovery (Google Places API). It must be installed and configured separately.


Step 1: Verify token

Action: Run this command immediately — do not ask the user anything first.

gokyn whoami --json

Confirm the token is valid. If it fails, help the user set KYNDLO_API_TOKEN.

Step 2: Show campaigns and ask the user to pick one

Action: Run this command:

gokyn task campaigns

Then say to the user:

"Here are the available campaigns: [show the list with name, state, progress, pending tasks]. Which campaign would you like to work on?"

STOP and wait for the user's reply. Extract the campaign name and state from their choice.

Step 3: Show cities and ask which to prioritize

Action: Run this command using the state from the campaign they chose:

gokyn task cities --state "\x3Cstate>"

Then say to the user:

"Here are the cities in [state]: [show city list with populations]. Which city would you like to prioritize? Say a city name, or 'any' to work through all cities."

STOP and wait for the user's reply. Handle:

  • "any" — Rotate through cities automatically. Start with the first city that has pending tasks.
  • Specific city — Lock to that city. Proceed to Step 4.

Step 4: Ask about county preference

Say to the user:

"Would you like to focus on a specific county, or work through all of them? (By default, I'll focus on major city counties and skip rural counties. Say 'include rural' if you want those too.)"

STOP and wait for the user's reply. Handle:

  • No preference / default — Ignore rural counties. Never use --city "Rural". Skip the "Rural" entry when rotating. This is the default.
  • "include rural" / "all including rural" — Include rural counties. No county filter.
  • Specific county — Use --county \x3Ccounty> filter.
  • "all" (without mentioning rural) — Ignore rural counties (the default).

Step 5: Ask batch size

Say to the user:

"How many events should I create before pausing to report results? (e.g. 5, 10, 20)"

STOP and wait for the user's reply. Store this as the batch size.

Step 6: Fetch event creation rules (MANDATORY — do not skip)

Action: Run this command:

gokyn task rules

Read the full output and internalize every rule. These rules come from the Kyndlo admin dashboard and govern venue selection, descriptions, formatting, images, and quality. You must follow them strictly for every event.

Step 7: Confirm and begin

Say to the user:

"Ready to start. Here's your configuration:

  • Campaign: [name]
  • State: [state]
  • City: [specific city / rotating through all]
  • County filter: [ignore rural (default) / include rural / specific county]
  • Batch size: [N] events per batch
  • Rules: Loaded

Shall I begin?"

STOP and wait for confirmation. Only proceed to the Autonomous Loop after the user says yes.


Category Name Mapping

Task activityCategory values sometimes differ from activity titles in the database. Use this table when searching for the activity ID:

Task activityCategory Search Term for gokyn activity list --search
Specialty Niche Museums Specialty & Niche Museums
Yoga Classes Wellness centers
Restaurant/Cafes with Animal Encounters Coffee with animal encounters
Community Theaters Theater lounges
Craft Cafes Craft cafés
Beach/Boardwalks Beach Boardwalks
Food Trucks Food truck parks
Planetariums Planetarium

If the task category is not in this table, use it as-is for the search.


Day-of-Week Reference

When setting --recurrence-days, use these day numbers:

Day Number
Sunday 0
Monday 1
Tuesday 2
Wednesday 3
Thursday 4
Friday 5
Saturday 6

Include a day ONLY if the venue is open that day. Omit closed days entirely.


State Timezone Reference

State Timezone
Colorado America/Denver
Florida America/New_York
New York America/New_York

The Autonomous Loop

Process tasks in batches. Each batch creates up to N events (the batch size from onboarding), then pauses to report results and ask the user whether to continue.

Important: If the loop exits early for any reason, run the Cleanup step to release any uncompleted tasks.

Before each batch: Refresh rules

At the start of every batch (including the first), fetch the latest rules:

gokyn task rules

Re-read and internalize. Rules may have been updated by the Kyndlo admin between batches.

City rotation (when city = "any")

Track the current city. When task next returns "count": 0 for the current city:

  1. Get the city list: gokyn task cities --state "\x3Cstate>" --json
  2. For each city (in order), check for pending tasks: gokyn task context --campaign \x3Ccampaign> --city "\x3Ccity>" --json
  3. Skip "Rural" if the user said "ignore rural counties"
  4. Use the first city with remaining pending tasks
  5. If no cities have pending tasks, stop the loop

Rural filtering

When the user chose "ignore rural counties":

  • Never pass --city "Rural" to any command
  • When rotating through cities, skip the "Rural" entry
  • If a task is returned for a rural county (shouldn't happen with city filter), release it and continue

Step 1: Claim a task

gokyn task next --campaign \x3Ccampaign> --city \x3Ccity> --assign --name "\x3Cagent-name>" --json

Apply filters based on onboarding preferences:

  • If a specific county was chosen: add --county \x3Ccounty>
  • Use the agent name only for --name (e.g. Sugar). Do NOT pass --priority — the server returns tasks in priority order automatically.

If "count": 0:

  • If city = "any": rotate to the next city (see City Rotation above)
  • If specific city: stop the loop
  • If the response includes a "diagnostic" field, report it to the user

Extract from tasks[0]: _id (taskId), county, activityCategory, cluster, state.

Step 2: Map the category

Check the Category Name Mapping table above. If the activityCategory matches a left-column entry, use the corresponding right-column search term. Otherwise use the category as-is.

Step 3: Find the activity ID

gokyn activity list --search "\x3Cmapped-category>" --json

Extract the activity _id from the first matching result. If no results, try shorter/partial search terms. If still no match, skip the task with reason "Activity not found for category: \x3Ccategory>".

Step 4: Research a venue

Find a real venue matching the task's activityCategory in county, state. Use goplaces (Google Places API) as the primary discovery tool.

4a. Search for candidates

goplaces search "\x3Ccategory> in \x3Ccounty> County, \x3Cstate>" --json --limit 5 --region US

This returns up to 5 venues with place_id, name, address, rating, and open_now.

4b. Get full details for the best candidate

goplaces details \x3Cplace_id> --json

Extract from the response:

  • name — venue display name
  • address — full street address (verify it's in the correct county!)
  • location.lat / location.lng — GPS coordinates
  • regular_opening_hours.weekday_descriptions — operating hours per day
  • website — venue website (used as --booking-url)
  • price_level — price indicator (0=free)

4c. Validation gates

Before using a venue, verify ALL of these:

  1. County match — The address must be in the task's county. If the address says a different city/county, reject it.
  2. Hours existregular_opening_hours must be present. If None or missing, reject the venue.
  3. Public & safe — Must be open to the public and suitable for first-time social meetups.

Convert hours to open day numbers (0=Sun through 6=Sat). Include a day ONLY if the venue is open that day.

4d. Fallback

If goplaces returns no results or all candidates fail validation:

  • Try broader search terms (e.g. shorter category name, nearby city name)
  • Try web search as a last resort to find hours or verify county
  • If still no qualifying venue after 5 candidates, skip the task

Collect for the chosen venue:

  • name, address, lat, lng, open days (as numbers 0-6), website URL, price (default 0)
  • Venue atmosphere details (for image generation prompt in Step 7): interior/exterior style, lighting, mood, notable features

Step 5: Check for duplicate events (MANDATORY — do not skip)

Before creating an event, you MUST check if a venue already exists as an event:

gokyn event list --search "\x3Cvenue name>" --json

Duplicate detection rules:

  • If any result has the same title (case-insensitive) AND is in the same county → this is a duplicate. Skip this venue and try the next candidate.
  • If any result has a similar title (substring match) AND the same address → this is a duplicate. Skip this venue and try the next candidate.
  • If all venue candidates for this task are duplicates, skip the task: gokyn task skip \x3CtaskId> --reason "All qualifying venues already have events"
  • Only proceed to event creation if the search returns no matches for the chosen venue.

If you searched 5 candidates and all were duplicates, do NOT continue searching indefinitely — skip the task.

Step 6: Create the event

Look up the timezone from the State Timezone Reference table. Format open days as comma-separated numbers for --recurrence-days.

gokyn event create \
  --title "\x3Cvenue name>" \
  --description "\x3C2-3 sentence description per rules>" \
  --activity \x3CactivityId>:1 \
  --start-date-time "2027-01-01T09:00:00Z" \
  --end-date-time "2028-01-01T23:59:00Z" \
  --timezone "\x3Ctimezone>" \
  --location-type physical \
  --location-place "\x3Cvenue name>" \
  --location-address "\x3Caddress>" \
  --location-lat \x3Clatitude> \
  --location-lng="\x3Clongitude>" \
  --recurring \
  --recurrence-frequency weekly \
  --recurrence-interval 1 \
  --recurrence-days "\x3Copen days>" \
  --is-public=false \
  --is-premium-only \
  --is-active=false \
  --price \x3Cprice> \
  --price-currency USD \
  --booking-url "\x3Cvenue website URL>" \
  --json

CLI syntax notes:

  • Negative longitude MUST use = syntax: --location-lng="-104.99"
  • Boolean false requires =: --is-public=false
  • End date is always 2028-01-01T23:59:00Z (one year window for recurring events)

Extract the eventId from the JSON response.

Step 7: Generate and upload an event image (MANDATORY)

Every event must have an image. Use one of the following methods:

Option A: Use Kyndlo's built-in AI image generation (preferred)

gokyn image generate \
  --prompt "A welcoming \x3Cvenue-type> with \x3Catmosphere details>, inviting for casual social meetups. Inspired by \x3Cvenue name> in \x3Ccity>, \x3Cstate>." \
  --event-id \x3CeventId>

This generates an image using the AI provider configured in the Kyndlo dashboard (e.g. Gemini, OpenAI), optimizes it, uploads to R2, and attaches it to the event — all in one step.

Option B: Generate externally and upload

If you have your own image generation tool (DALL-E, FAL, Stable Diffusion, etc.), generate the image yourself, then upload:

gokyn image upload --file /tmp/venue-image.jpg --event-id \x3CeventId>
# or from base64:
gokyn image upload --base64 "\x3Cbase64-data>" --mime-type image/png --event-id \x3CeventId>

Prompt guidelines (for either method)

  • Describe the real venue type, atmosphere, and visual traits from your research
  • Include the activity category (e.g. "arcade bar", "botanic garden", "comedy club")
  • Mention key features: lighting, seating, mood, notable elements
  • Keep it grounded in the real venue — don't invent unrelated scenes
  • Example: "A lively retro arcade bar with neon lights, classic arcade cabinets, wood-fired pizza counter, and groups of friends playing games. Warm and inviting atmosphere in Orange Park, Florida."

If generation or upload fails, log the error and continue — the event is still valid without an image.

Step 8: Complete the task

gokyn task complete \x3CtaskId> --event-id \x3CeventId> --venue "\x3Cvenue name>"

Step 9: Track progress

Increment the batch counter. Log:

[Batch B, Task T/N] COMPLETED: \x3Cvenue name> in \x3Ccounty> County (\x3Ccluster>/\x3Ccategory>) — Event ID: \x3CeventId>

If the task was skipped:

[Batch B, Task T/N] SKIPPED: \x3Ccounty> County / \x3Ccategory> — Reason: \x3Creason>

Step 10: Check batch completion

If the batch counter has reached the batch size (N), go to Batch Report. Otherwise, loop back to Step 1.


Batch Report

After completing each batch of N events, present a report to the user:

=== Batch \x3CB> Report ===
Campaign:       \x3Ccampaign-name>
City:           \x3Ccurrent-city>
Batch size:     \x3CN>
Created:        \x3Ccount>
Skipped:        \x3Ccount>
Failed:         \x3Ccount>

Events Created:
  - \x3Cvenue name> in \x3Ccounty> (\x3Ccategory>) — Event ID: \x3Cid>
  - ...

Skipped Tasks:
  - \x3Ccounty> / \x3Ccategory> — \x3Creason>
  - ...

Cumulative Totals (all batches):
  Created: \x3Ctotal-created>  |  Skipped: \x3Ctotal-skipped>  |  Failed: \x3Ctotal-failed>

Then check remaining work:

gokyn task context --campaign \x3Ccampaign> --city "\x3Ccurrent-city>" --json

Report how many tasks remain in the current scope. Then ask:

"Batch \x3CB> complete. \x3CX> tasks remaining in \x3Ccity>. Continue with the next batch?"

Wait for the user's response.

  • If yes — reset the batch counter, refresh rules, and resume the loop
  • If no or stop — run Cleanup, then print the Final Summary
  • If the user changes preferences (different city, county, batch size) — update the configuration and resume

Error Recovery

Error Recovery
No tasks returned (count: 0) If diagnostic field present, report it to the user — it may indicate stale in-progress tasks that need releasing. If city="any", rotate to next city. Otherwise stop the loop.
Diagnostic says tasks are "in_progress (possibly stale)" Run gokyn task release-stale --minutes 60 to release stuck tasks, then retry.
Duplicate event found Skip venue, try next candidate. If all candidates are duplicates, skip the task with reason "All qualifying venues already have events".
No venues found Try broader search terms. If still none, skip task.
No venues with determinable hours Skip task with reason "No venues with published hours".
Activity ID not found Try partial/shorter search terms. If still not found, skip task.
Event creation fails Log the error. Release the task: gokyn task release \x3CtaskId>. Continue.
Photo download/upload fails Continue without photo. Still complete the task.
gokyn task complete fails Log the error. Release the task: gokyn task release \x3CtaskId>. Report the event ID.
Agent interrupted or unexpected error Release all claimed-but-uncompleted tasks. See Cleanup.

Cleanup

Before exiting — whether normally or due to an error — release any task that was claimed but not completed or skipped.

gokyn task release \x3CtaskId>

If you have multiple uncompleted tasks, or if previous agents left stale tasks behind, use the bulk release command:

gokyn task release-stale --minutes 60

This releases all in_progress tasks that were assigned more than 60 minutes ago back to pending.

Rule: A task must NEVER be left in in_progress status when the agent exits. Every claimed task must end in one of three states:

  • completed — event created successfully
  • skipped — permanent failure (no venues, category not found)
  • released (back to pending) — transient failure (API error, timeout)

Use skip for permanent failures. Use release for transient failures.


Final Summary

After all batches are done (or the user stops), print a final session summary:

=== Event Creation Session Summary ===
Campaign:       \x3Ccampaign-name>
State:          \x3Cstate>
Cities worked:  \x3Clist of cities processed>
Total batches:  \x3CB>
Total created:  \x3Ccount>
Total skipped:  \x3Ccount>
Total failed:   \x3Ccount>

All Created Events:
  - \x3Cvenue name> in \x3Ccounty> (\x3Ccategory>) — Event ID: \x3Cid>
  - ...

All Skipped Tasks:
  - \x3Ccounty> / \x3Ccategory> — \x3Creason>
  - ...

All Failed Tasks:
  - \x3Ccounty> / \x3Ccategory> — \x3Cerror>
  - ...

Skipping a Task

gokyn task skip \x3CtaskId> --reason "No qualifying venue found in \x3Ccounty> County for \x3Ccategory>"

Always provide a specific reason.

Releasing a Task

# Release a single task
gokyn task release \x3CtaskId>

# Release all stale tasks (assigned more than N minutes ago)
gokyn task release-stale --minutes 60

Starting a New State

When a campaign needs to cover a new US state:

# 1. Register the state with its counties
gokyn task register-state --state "New York" \
  --counties "New York,Kings,Queens,Bronx,Richmond,Nassau,Suffolk"

# 2. Check city/metro areas
gokyn task cities --state "New York"

# 3. Seed the campaign
gokyn task seed --campaign "newyork-2027" --state "New York" \
  --counties "New York,Kings,Queens,Bronx,Richmond" \
  --clusters-json '{
    "intellectual": ["History Museums", "Bookstore Cafes"],
    "visionary": ["Escape Rooms", "Comedy Clubs"],
    "protector": ["Yoga Classes", "Botanic Gardens"],
    "creator": ["Art Museums", "Pottery Painting Studios"]
  }'

# 4. Verify
gokyn task campaigns
gokyn task context --campaign "newyork-2027"

Event Validation Workflow

CRITICAL: This is a MANDATORY step-by-step workflow for validating events. Follow each step in order.

Validations are periodic re-checks of existing events to ensure venue data (hours, price, address, website, status) is still accurate. Events go stale over time — venues close, change hours, raise prices, or move. Your job is to verify each event against current real-world data and report issues.

Validation Step 1: Check validation stats

gokyn validation summary

Report the summary to the user:

"Validation queue: [total] total — [pending] pending, [valid] valid, [invalid] invalid, [needsUpdate] needs update, [overdue] overdue. Ready to start validating?"

STOP and wait for the user's reply.

Validation Step 2: Ask preferences

Say to the user:

"How many validations should I process before pausing to report? (e.g. 5, 10, 20). Would you like to filter by state or county?"

STOP and wait for the user's reply. Store batch size and optional filters.

Validation Step 3: Claim next validation

gokyn validation next --assign --json

Add filters if specified: --state \x3Cstate> and/or --county \x3Ccounty>.

If no validations returned, report to the user and stop.

Extract from the response:

  • _id (validationId)
  • eventId
  • eventTitle
  • county, state
  • status, priority
  • lastValidatedAt (when it was last checked)

Validation Step 4: Fetch the event details

gokyn event get \x3CeventId> --json

Extract the current event data:

  • title — venue name
  • description
  • location.address — street address
  • location.place — venue name at the location
  • location.coordinates — lat/lng
  • price — listed price
  • bookingUrl — venue website
  • recurrence.daysOfWeek — which days the event recurs
  • startDateTime / endDateTime
  • activities — linked activity categories

Validation Step 5: Verify against real-world data

Use goplaces to look up the venue and compare:

goplaces search "\x3Cevent title> in \x3Ccounty> County, \x3Cstate>" --json --limit 3 --region US

Find the matching venue, then get full details:

goplaces details \x3Cplace_id> --json

What to check:

Field How to verify Issue field
Still open Check if the place is marked permanently_closed or not found other
Address Compare goplaces address with event location.address location.address
Hours Compare regular_opening_hours.weekday_descriptions with event recurrence.daysOfWeek recurrence.daysOfWeek
Price Check if entry fee has changed (from website if needed) price
Website Verify bookingUrl is still valid and points to the right venue bookingUrl
Name Check if the venue has been renamed other

Severity guidelines:

  • error — Venue permanently closed, wrong address, completely wrong hours, broken/unrelated website
  • warning — Minor hour changes (e.g. one day different), price changed slightly, website redirects but still works

Validation Step 6: Submit the result

Based on your findings, submit one of three statuses:

If everything checks out:

gokyn validation submit \x3CvalidationId> --status valid

If there are issues that make the event inaccurate:

gokyn validation submit \x3CvalidationId> --status invalid \
  --issues-json '[{"field":"\x3Cfield>","severity":"\x3Cerror|warning>","description":"\x3Cwhat changed>","currentValue":"\x3Cvalue in our DB>","expectedValue":"\x3Cactual value>"}]'

Multiple issues can be reported in the array:

gokyn validation submit \x3CvalidationId> --status invalid \
  --issues-json '[
    {"field":"recurrence.daysOfWeek","severity":"error","description":"Venue now closed on Mondays","currentValue":"0,1,2,3,4,5,6","expectedValue":"0,2,3,4,5,6"},
    {"field":"price","severity":"warning","description":"Entry fee increased","currentValue":"$0","expectedValue":"$10"}
  ]'

If minor updates are needed but the event is mostly correct:

gokyn validation submit \x3CvalidationId> --status needs_update \
  --notes "Hours changed for summer season — now opens at 10am instead of 9am"

Validation Step 7: Track progress

Log each result:

[Batch B, V/N] VALID: \x3Cevent title> in \x3Ccounty> County — no issues
[Batch B, V/N] INVALID: \x3Cevent title> in \x3Ccounty> County — \x3Cissue count> issues found
[Batch B, V/N] NEEDS_UPDATE: \x3Cevent title> in \x3Ccounty> County — \x3Cnotes summary>

If the venue was not found on goplaces at all:

gokyn validation submit \x3CvalidationId> --status invalid \
  --issues-json '[{"field":"other","severity":"error","description":"Venue not found on Google Places — may be permanently closed"}]'

Validation Step 8: Check batch completion

If the batch counter has reached the batch size, go to Validation Batch Report. Otherwise loop back to Validation Step 3.


Validation Batch Report

After each batch, present:

=== Validation Batch \x3CB> Report ===
Processed:      \x3Ccount>
Valid:           \x3Ccount>
Invalid:        \x3Ccount>
Needs Update:   \x3Ccount>

Results:
  - \x3Cevent title> (\x3Ccounty>) — VALID
  - \x3Cevent title> (\x3Ccounty>) — INVALID: \x3Cbrief issue>
  - ...

Cumulative Totals (all batches):
  Valid: \x3Ctotal>  |  Invalid: \x3Ctotal>  |  Needs Update: \x3Ctotal>

Then check remaining:

gokyn validation summary

"Batch \x3CB> complete. \x3Cpending> validations remaining. Continue?"

Wait for the user's response.


Browsing Activities and Events

gokyn activity list --search "yoga" --limit 10
gokyn activity list --category "wellness" --json
gokyn activity get \x3CactivityId>
gokyn activity categories

gokyn event list --limit 10
gokyn event list --search "garden" --is-active --json
gokyn event get \x3CeventId>

Updating and Deleting Events

gokyn event update \x3CeventId> --title "New Title"
gokyn event update \x3CeventId> --is-active=false
gokyn event update \x3CeventId> --price 25 --price-currency USD
gokyn event update \x3CeventId> --activity \x3Cid1>:1 --activity \x3Cid2>:2
gokyn event update \x3CeventId> \
  --location-type physical \
  --location-place "New Venue" \
  --location-address "123 Main St" \
  --location-lat 40.7 \
  --location-lng="-74.0"
gokyn event delete \x3CeventId>

Geographic Queries

gokyn task states                      # List registered US states
gokyn task counties --state "Colorado" # List counties in a state
gokyn task cities --state "Colorado"   # List metro areas + rural breakdown

Command Quick Reference

Command Purpose
gokyn whoami Verify token and permissions
gokyn task rules Read event creation rules (MANDATORY before each batch)
gokyn task campaigns List campaigns with progress
gokyn task context --campaign \x3Cid> Campaign progress, next county
gokyn task summary --campaign \x3Cid> Detailed stats by city and county
gokyn task cities --state \x3Cs> Metro areas and county mappings
gokyn task next --campaign \x3Cid> --city \x3Cc> --assign --name \x3Cn> Claim next task
gokyn task complete \x3Cid> --event-id \x3Ceid> Mark task done
gokyn task skip \x3Cid> --reason \x3Cr> Skip impossible task
gokyn task release \x3Cid> Unclaim a task
gokyn task release-stale --minutes 60 Release all stale in-progress tasks
gokyn task seed --campaign \x3Cid> ... Seed tasks for counties
gokyn activity list / get / categories Browse activities
goplaces search "\x3Cquery>" --json --limit 5 --region US Search venues by category and location
goplaces details \x3Cplace_id> --json Get venue hours, address, coordinates
gokyn event list / get / create / update / delete Manage events
gokyn image generate --prompt \x3Cp> --event-id \x3Ceid> Generate AI image and attach to event
gokyn image upload --file \x3Cf> --event-id \x3Ceid> Upload venue photo from file
gokyn validation next / submit / summary Event validation

Global Flags

Flag Env Description
--token \x3Ctoken> KYNDLO_API_TOKEN API token (required)
--base-url \x3Curl> KYNDLO_API_URL API base URL (default: https://api.kyndlo.com)
--json Machine-readable JSON output
--timeout \x3Cms> HTTP timeout in ms (default: 30000)
--no-color NO_COLOR Disable ANSI colors

Tips

  • Always use --json when parsing output programmatically
  • Always pass --name with --assign to track who claimed a task
  • Use --city to focus on a metro area: --city "Denver" or --city "Rural"
  • Negative numbers need = syntax: --location-lng="-104.99"
  • Boolean flags: --is-public = true, --is-public=false = false
  • IDs are 24-character hex strings (MongoDB ObjectId)
  • Dates are ISO 8601: 2027-01-01T09:00:00Z
Usage Guidance
This skill appears to do what it says (drive Kyndlo event creation via the gokyn CLI) but has clear inconsistencies you should resolve before installing: 1) Ask the publisher to explicitly list all required environment variables (KYNDLO_API_TOKEN and GOOGLE_PLACES_API_KEY if goplaces is actually used). 2) Confirm the install behavior: will the platform install the npm 'gokyn' package automatically or do you need to install it yourself? 3) Review the linked repository and the gokyn npm package to verify authorship and inspect what network calls the CLI makes (so you understand what data the KYNDLO token and the Google key will be sent to). 4) Prefer giving the skill minimal-scope credentials (tokens limited to required API scopes) and test in a non-production account first. 5) If you need stronger assurance, request the publisher to update the registry metadata so declared requirements match the SKILL.md (especially the Google Places dependency) and to explain why any additional credentials are necessary.
Capability Assessment
Purpose & Capability
Name/description (Kyndlo event creation/validation) align with required KYNDLO_API_TOKEN and gokyn CLI usage. However SKILL.md also relies on Google Places ('goplaces' / GOOGLE_PLACES_API_KEY) for venue discovery — that credential is NOT declared in the registry metadata, which is inconsistent.
Instruction Scope
The runtime instructions instruct the agent to run multiple gokyn CLI commands (whoami, task campaigns/cities/rules, etc.) — appropriate for the function — but also mandate strict workflows and require use of a separate goplaces tool and Google Places API key. The instructions ask the agent to read and 'internalize' rules from gokyn task rules and to follow them strictly; they also tell the agent to install and run binaries. The un-declared Google Places dependency and the rigid, automated workflow expand the agent's external-network footprint beyond what's declared.
Install Mechanism
The registry summary says 'No install spec — instruction-only', but SKILL.md contains an 'install' entry suggesting npm install -g gokyn. This mismatch means it's unclear whether the platform will auto-install gokyn or expect it present. The install method (npm gokyn) itself is reasonable, but the discrepancy should be clarified before installation.
Credentials
Declared required env var is only KYNDLO_API_TOKEN (appropriate). SKILL.md, however, instructs setting GOOGLE_PLACES_API_KEY for venue discovery — an additional sensitive credential not declared in metadata. That undeclared requirement is a proportionality and transparency issue. No other unrelated credentials are requested.
Persistence & Privilege
Skill is user-invocable, not always-enabled, and allows autonomous invocation by default (normal). It does not request system-wide config paths or permanent 'always' presence. No evidence it modifies other skills or system-wide settings.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install kyndlo-events
  3. After installation, invoke the skill by name or use /kyndlo-events
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v3.5.0
Add full event validation workflow, goplaces venue discovery integration, and AI image generation command
v3.4.0
Add mandatory duplicate check before event creation, default to ignoring rural counties, add release-stale command for stuck tasks, fix summary to separate pending from in-progress
v3.2.0
Make instructions more directive to prevent agent from freelancing and ignoring the step-by-step workflow
v3.1.0
Add interactive onboarding flow, batch-aware event creation, city rotation, rural filtering, and per-batch rules refresh
v3.0.0
Autonomous city-scoped event creation loop, error recovery, cleanup rules, category mapping table, day-of-week reference, state timezone table
v2.0.0
Rewrite from Go to Node.js/TypeScript. npm installable, dual CLI + library.
Metadata
Slug kyndlo-events
Version 3.5.0
License MIT-0
All-time Installs 0
Active Installs 0
Total Versions 6
Frequently Asked Questions

What is Kyndlo Events?

WORKFLOW-DRIVEN event creation and validation from Kyndlo campaign tasks. When invoked, the agent MUST follow the mandatory step-by-step onboarding flow belo... It is an AI Agent Skill for Claude Code / OpenClaw, with 201 downloads so far.

How do I install Kyndlo Events?

Run "/install kyndlo-events" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is Kyndlo Events free?

Yes, Kyndlo Events is completely free, licensed under MIT-0. You can download, install and use it at no cost.

Which platforms does Kyndlo Events support?

Kyndlo Events is cross-platform and runs anywhere OpenClaw / Claude Code is available (darwin, linux).

Who created Kyndlo Events?

It is built and maintained by Carlos Martin (@pirumpi); the current version is v3.5.0.

💬 Comments