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
- Do NOT try to gather requirements conversationally — the workflow below handles that
- DO immediately start at Step 1 below and follow every step in order
- DO run the CLI commands shown — they provide the data you need
- DO wait for the user's response where indicated before moving to the next step
- 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
CODEBLOCK0
All gokyn commands accept --token <token> 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.
CODEBLOCK1
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:
CODEBLOCK2
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:
CODEBLOCK3
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 <county> 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:
CODEBLOCK4
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 INLINECODE7 |
|---|
| 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:
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:
CODEBLOCK5
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: INLINECODE11
- For each city (in order), check for pending tasks: INLINECODE12
- Skip "Rural" if the user said "ignore rural counties"
- Use the first city with remaining pending tasks
- 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
CODEBLOCK6
Apply filters based on onboarding preferences:
- - If a specific county was chosen: add INLINECODE14
- 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
CODEBLOCK7
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: \".
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
CODEBLOCK8
This returns up to 5 venues with place_id, name, address, rating, and open_now.
4b. Get full details for the best candidate
CODEBLOCK9
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
- regularopeninghours.weekdaydescriptions — operating hours per day
- website — venue website (used as
--booking-url) - pricelevel — 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.
- Hours exist —
regular_opening_hours must be present. If None or missing, reject the venue. - 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:
CODEBLOCK10
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: INLINECODE39
- 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.
CODEBLOCK11
CLI syntax notes:
- - Negative longitude MUST use
= syntax: INLINECODE42 - Boolean false requires
=: INLINECODE44 - 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)
CODEBLOCK12
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:
CODEBLOCK13
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
CODEBLOCK14
Step 9: Track progress
Increment the batch counter. Log:
CODEBLOCK15
If the task was skipped:
CODEBLOCK16
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:
CODEBLOCK17
Then check remaining work:
CODEBLOCK18
Report how many tasks remain in the current scope. Then ask:
"Batch complete. tasks remaining in . 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 <taskId>. 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 <taskId>. 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.
CODEBLOCK19
If you have multiple uncompleted tasks, or if previous agents left stale tasks behind, use the bulk release command:
CODEBLOCK20
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:
CODEBLOCK21
Skipping a Task
CODEBLOCK22
Always provide a specific reason.
Releasing a Task
CODEBLOCK23
Starting a New State
When a campaign needs to cover a new US state:
CODEBLOCK24
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
CODEBLOCK25
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
CODEBLOCK26
Add filters if specified: --state <state> and/or --county <county>.
If no validations returned, report to the user and stop.
Extract from the response:
- -
_id (validationId) - INLINECODE59
- INLINECODE60
- INLINECODE61 , INLINECODE62
- INLINECODE63 , INLINECODE64
- INLINECODE65 (when it was last checked)
Validation Step 4: Fetch the event details
CODEBLOCK27
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:
CODEBLOCK28
Find the matching venue, then get full details:
CODEBLOCK29
What to check:
| Field | How to verify | Issue field |
|---|
| Still open | Check if the place is marked permanently_closed or not found | INLINECODE67 |
| 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:
CODEBLOCK30
If there are issues that make the event inaccurate:
CODEBLOCK31
Multiple issues can be reported in the array:
CODEBLOCK32
If minor updates are needed but the event is mostly correct:
CODEBLOCK33
Validation Step 7: Track progress
Log each result:
CODEBLOCK34
If the venue was not found on goplaces at all:
CODEBLOCK35
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:
CODEBLOCK36
Then check remaining:
CODEBLOCK37
"Batch complete. validations remaining. Continue?"
Wait for the user's response.
Browsing Activities and Events
CODEBLOCK38
Updating and Deleting Events
CODEBLOCK39
Geographic Queries
CODEBLOCK40
Command Quick Reference
| Command | Purpose |
|---|
| INLINECODE79 | Verify token and permissions |
| INLINECODE80 |
Read event creation rules (MANDATORY before each batch) |
|
gokyn task campaigns | List campaigns with progress |
|
gokyn task context --campaign <id> | Campaign progress, next county |
|
gokyn task summary --campaign <id> | Detailed stats by city and county |
|
gokyn task cities --state <s> | Metro areas and county mappings |
|
gokyn task next --campaign <id> --city <c> --assign --name <n> | Claim next task |
|
gokyn task complete <id> --event-id <eid> | Mark task done |
|
gokyn task skip <id> --reason <r> | Skip impossible task |
|
gokyn task release <id> | Unclaim a task |
|
gokyn task release-stale --minutes 60 | Release all stale in-progress tasks |
|
gokyn task seed --campaign <id> ... | Seed tasks for counties |
|
gokyn activity list / get / categories | Browse activities |
|
goplaces search "<query>" --json --limit 5 --region US |
Search venues by category and location |
|
goplaces details <place_id> --json |
Get venue hours, address, coordinates |
|
gokyn event list / get / create / update / delete | Manage events |
|
gokyn image generate --prompt <p> --event-id <eid> |
Generate AI image and attach to event |
|
gokyn image upload --file <f> --event-id <eid> | Upload venue photo from file |
|
gokyn validation next / submit / summary | Event validation |
Global Flags
| Flag | Env | Description |
|---|
| INLINECODE98 | INLINECODE99 | API token (required) |
| INLINECODE100 |
KYNDLO_API_URL | API base URL (default: https://api.kyndlo.com) |
|
--json | | Machine-readable JSON output |
|
--timeout <ms> | | 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 INLINECODE111 - Negative numbers need
= syntax: INLINECODE113 - Boolean flags:
--is-public = true, --is-public=false = false - IDs are 24-character hex strings (MongoDB ObjectId)
- Dates are ISO 8601: INLINECODE116
kyndlo-events — Kyndlo 活动管理
关键提示:本技能对活动创建和活动验证有强制性的分步工作流程。您必须按顺序执行确切的步骤。不要跳过步骤。不要自行提问。不要即兴发挥。工作流程会明确告诉您在每个步骤中要运行什么以及要询问什么。
停止 — 请先阅读此内容
当调用此技能时(用户说创建活动、kyndlo-events、生成活动等):
如果用户说验证活动、检查活动、审核活动或验证 — 直接跳转到下方的活动验证工作流程部分。
对于活动创建:
- 1. 不要向用户询问城市、日期范围、活动风格、主题或任何其他自由形式的问题
- 不要尝试通过对话收集需求 — 下方的工作流程会处理这些
- 必须立即从下方的步骤1开始,并按顺序执行每个步骤
- 必须运行显示的CLI命令 — 它们提供您所需的数据
- 必须在指示处等待用户回复,然后再进入下一步
- 必须在创建前始终检查现有活动 — 重复会浪费资源
活动是从存储在Kyndlo数据库中的营销任务创建的,而不是从用户提供的描述中创建。系统会告诉您要创建哪些活动。您的工作是遵循工作流程。
设置
bash
npm install -g gokyn
export KYNDLOAPITOKEN=kyndlo_...
export GOOGLEPLACESAPI_KEY=... # 通过goplaces进行场地发现所需
如果未设置环境变量,所有gokyn命令都接受--token 参数。
为任何命令添加--json可获得机器可读的输出。
goplaces用于场地发现(Google Places API)。它需要单独安装和配置。
步骤1:验证令牌
操作: 立即运行此命令 — 不要先询问用户任何问题。
bash
gokyn whoami --json
确认令牌有效。如果失败,帮助用户设置KYNDLOAPITOKEN。
步骤2:显示营销活动并让用户选择一个
操作: 运行此命令:
bash
gokyn task campaigns
然后对用户说:
以下是可用的营销活动:[显示包含名称、状态、进度、待处理任务的列表]。您想处理哪个营销活动?
停止并等待用户的回复。 从他们的选择中提取营销活动名称和状态。
步骤3:显示城市并询问优先处理哪个
操作: 使用他们选择的营销活动中的状态运行此命令:
bash
gokyn task cities --state
然后对用户说:
以下是[州名]中的城市:[显示包含人口数量的城市列表]。您想优先处理哪个城市?说出城市名称,或说any来处理所有城市。
停止并等待用户的回复。 处理:
- - any — 自动轮换城市。从第一个有待处理任务的城市开始。
- 特定城市 — 锁定到该城市。进入步骤4。
步骤4:询问县偏好
对用户说:
您想专注于某个特定的县,还是处理所有县?(默认情况下,我会专注于主要城市的县,跳过农村县。如果您也想处理那些,请说include rural。)
停止并等待用户的回复。 处理:
- - 无偏好/默认 — 忽略农村县。绝不使用--city Rural。轮换时跳过Rural条目。这是默认设置。
- include rural / all including rural — 包括农村县。无县过滤器。
- 特定县 — 使用--county 过滤器。
- all(未提及rural)— 忽略农村县(默认)。
步骤5:询问批次大小
对用户说:
在暂停报告结果之前,我应该创建多少个活动?(例如5、10、20)
停止并等待用户的回复。 将此存储为批次大小。
步骤6:获取活动创建规则(强制 — 不要跳过)
操作: 运行此命令:
bash
gokyn task rules
阅读完整输出并内化每条规则。这些规则来自Kyndlo管理仪表板,管理场地选择、描述、格式、图像和质量。您必须为每个活动严格遵守这些规则。
步骤7:确认并开始
对用户说:
准备开始。以下是您的配置:
- - 营销活动:[名称]
- 州:[州名]
- 城市:[特定城市/轮换所有城市]
- 县过滤器:[忽略农村(默认)/包括农村/特定县]
- 批次大小:每批[N]个活动
- 规则:已加载
我可以开始了吗?
停止并等待确认。 只有在用户同意后才进入自主循环。
类别名称映射
任务activityCategory值有时与数据库中的活动标题不同。搜索活动ID时使用此表:
| 任务 activityCategory | 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 |
如果任务类别不在此表中,则直接使用原词进行搜索。
星期参考
设置--recurrence-days时,使用这些日期编号:
1 |
| 星期二 | 2 |
| 星期三 | 3 |
| 星期四 | 4 |
| 星期五 | 5 |
| 星期六 | 6 |
仅当场地在该天营业时才包含该天。完全省略休息日。
州时区参考
| 州 | 时区 |
|---|
| Colorado | America/Denver |
| Florida |
America/New_York |
| New York | America/New_York |
自主循环
分批处理任务。每批创建最多N个活动(来自初始设置的批次大小),然后暂停报告结果并询问用户是否继续。
重要提示: 如果循环因任何原因提前退出,请运行清理步骤以释放任何未完成的任务。
每批之前:刷新规则
在每批开始时(包括第一批),获取最新规则:
bash
gokyn task rules
重新阅读并内化。规则可能已在批次之间由Kyndlo管理员更新。
城市轮换(当城市 = any时)
跟踪当前城市。当task next为当前城市返回count: 0时:
- 1. 获取城市列表:gokyn task cities --state --json
- 对于每个城市(按顺序),检查待处理任务:gokyn task context --campaign --city --json
- 如果用户说忽略农村县,则跳过Rural
- 使用第一个仍有待处理任务的城市
- 如果没有城市有待处理任务,停止循环
农村过滤
当用户选择忽略农村县时:
- - 绝不向任何命令传递--city Rural
- 轮换城市时,跳过Rural条目
- 如果返回的任务属于农村县(使用城市过滤器时不应发生),释放它并继续
步骤1:认领任务
bash
gokyn task next --campaign --city --assign --name --json
根据初始设置偏好应用过滤器:
- - 如果选择了特定县:添加--county
- 仅对--name使用代理名称(例如Sugar)。不要传递--priority — 服务器会自动按优先级顺序返回任务。
如果count: 0:
- - 如果城市 = any:轮换到下一个城市(参见上面的城市轮换)
- 如果特定城市:停止循环
- 如果响应包含diagnostic字段,向用户报告
从tasks[0]中提取:_id(taskId)、county、activityCategory、cluster、state。
步骤2:映射类别
检查上面的类别名称映射表。如果activityCategory匹配左列条目,使用相应的右列搜索词。否则直接使用该类别。
步骤3:查找活动ID
bash
gokyn activity list --search --json
从第一个匹配结果中提取活动_id。如果没有结果,尝试更短/部分的搜索词。如果仍然不匹配,跳过任务,原因:Activity not found for category: \。