本技能是 事件驱动的 issue 落地流程总控。由组织者确认 issue 草稿后触发,非 cron。
职责分工:
check 验证前置条件confirmed_issue.md 内容,解析出每条 action item 的结构化字段meeting_category(single / cross-project)create-issues 批量建 Gitea issuefinish 收尾,获取邮件参数finish(跳过建 issue),调用 imap-smtp-email 向组织者发建议邮件check:校验 meta.yaml status 和 confirmed_issue.md 存在性,返回内容与元信息create-issues:接收 OpenClaw 解析好的 JSON,批量在 Gitea 建 issue + 依赖回填finish:meta.yaml → minutes-published,写 created_issues 字段,写日志,返回邮件参数webhook.py:独立常驻进程,监听 Gitea push webhook,检测到 confirmed_issue.md 时向 OpenClaw 发送触发信号配置文件:~/.config/skill-d-create-issues/.env
首次使用前运行:
bash setup.sh
组织者在 Gitea 网页将 draft_issue.md 改名为 confirmed_issue.md,触发 push webhook。
Webhook 配置步骤:
http://43.156.243.152:/gitea-webhook (端口见 .env)application/jsonPush Events启动 Webhook 监听服务(后台常驻):
nohup python3 scripts/webhook.py > ~/.config/skill-d-create-issues/webhook.log 2>&1 &
用户:"确认 2026-04-22-1500 的 issue"
OpenClaw 识别后,询问用户确认的是哪个仓库(如果上下文不明确),然后进入以下工作流。
node main.js check \
--repo "HKU-AIFusion/dexterous-hand" \
--meeting-dir "2026-04-22-1500"
返回 JSON,关键字段:
valid:true / false(false 时含 reason 字段,OpenClaw 直接告知用户)category:single | cross-projecttopic、organizer、organizer_email、attendees、attendee_emailsconfirmed_issue_content:confirmed_issue.md 的完整文本minutes_content:minutes.md 的完整文本(用于正式纪要邮件)meeting_dir、repo、join_urlvalid 为 false 时,OpenClaw 向用户说明原因,不继续执行后续步骤。
此步骤 OpenClaw 作为 AI 负责全部解析,不调用任何脚本。
从 confirmed_issue_content 中解析每条带勾选框的 action item,输出 JSON 数组,只输出 JSON,不加任何说明文字或 markdown 标记:
[
{
"local_id": "1",
"task": "任务描述",
"assignee": "sujinze",
"due_date": "2026-04-29",
"depends_on_local_ids": [],
"quote": "原话引用"
},
{
"local_id": "2",
"task": "另一个任务",
"assignee": "liuzhaolin",
"due_date": "2026-05-06",
"depends_on_local_ids": ["1"],
"quote": "相关原话"
}
]
字段说明:
local_id:本次解析的临时编号("1" "2" ...),用于 depends_on_local_ids 引用assignee:Gitea 用户名(参考 attendees 列表)due_date:YYYY-MM-DD 格式depends_on_local_ids:依赖的其他任务 local_id 列表(无依赖则为 [])quote:原话引用(来自 confirmed_issue.md 中的 > "..." 内容)如果解析结果为空数组(无待办),跳过第三步,直接进入第四步(finish)。
node main.js create-issues \
--repo "HKU-AIFusion/dexterous-hand" \
--meeting-dir "2026-04-22-1500" \
--topic "v2 设计评审" \
--issues-json '[{"local_id":"1","task":"...","assignee":"sujinze","due_date":"2026-04-29","depends_on_local_ids":[],"quote":"..."}]'
本命令会:
meeting-action、meeting:YYYY-MM-DD-HHMMDepends-on: #N 行)返回 JSON,关键字段:
successcreated:[{local_id, issue_number, issue_url, assignee, task}]failed:[{local_id, task, error}](部分失败时非空)跨项目会议跳过此步骤,直接进入第四步。
node main.js finish \
--repo "HKU-AIFusion/dexterous-hand" \
--meeting-dir "2026-04-22-1500" \
--topic "v2 设计评审" \
--category "single" \
--organizer-email "organizer@163.com" \
--attendee-emails "email1@163.com,email2@163.com" \
[--created-issues-json '[{"local_id":"1","issue_number":42,"issue_url":"...","assignee":"sujinze","task":"..."}]'] \
[--failed-issues-json '[...]']
本命令会:
minutes-published,写入 created_issues 字段(issue 编号列表)minutes_email:正式纪要邮件,发给全体参会人(含 minutes.md 内容摘要 + issue 列表链接)assignee_emails:每位 assignee 的个人任务通知邮件(数组,每人一封)cross_email:跨项目会议时,给组织者的建议邮件(含 confirmed_issue.md 完整内容)单项目会议:
minutes_email):minutes_email.to)minutes_email.subjectminutes_email.htmlassignee_emails 数组,每人一封):assignee_emails[i].to)assignee_emails[i].subjectassignee_emails[i].html跨项目会议:
发送组织者建议邮件(cross_email):
cross_email.to(组织者邮箱)cross_email.subjectcross_email.html| 错误场景 | 处理方式 |
|---|---|
| ---------- | ---------- |
| check 发现 status 不符 | 返回 valid=false + reason,OpenClaw 告知用户 |
| check 发现 confirmed_issue.md 不存在 | 返回 valid=false,OpenClaw 提示用户先改文件名 |
| confirmed_issue.md 解析结果为空 | 跳过 create-issues,finish 时 created_issues=[] |
| 某条 issue 创建失败 | 继续创建其他,failed 列表记录,finish 后邮件提醒组织者 |
| 依赖回填失败 | 不影响 issue 本身,日志警告 |
| finish 写 Gitea 失败 | 报错,OpenClaw 提示用户重试(可再次调用 confirm 触发) |
| 邮件发送失败 | 状态已更新为 minutes-published,日志标注 email_failed |
check:只读,天然幂等create-issues:若 meta.yaml 已是 minutes-published,拒绝执行(避免重复建 issue)finish:若 meta.yaml 已是 minutes-published,返回幂等成功(不重复写)共 1 个版本
暂无安全检测报告