用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/ryanzhao1011/workframe --skill task-management命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | task-management |
| description | 管理项目看板 board.yaml 的任务创建、状态流转与进度统计 |
| when_to_use | 用于 board.yaml 任务创建 / 状态变更 / 流转规则查阅 / schema 约束确认时调用。 典型触发:"看板 X" / "任务状态改 Y" / "怎么流转研发任务到 pending_qa" / "签发权限"。 不用于:summary 数字重算(由 SessionEnd hook 自动 + 用户显式 `workframe-recompute-board-summary` 命令)/ 节奏复盘与周报(暂无对应 skill,由主 Claude 自由发挥)。 |
| user-invocable | false |
| allowed-tools | ["Read","Write","Edit","Glob","Grep"] |
# projects/board.yaml
summary:
total: 0
pending: 0
in_progress: 0
pending_qa: 0
completed: 0
blocked: 0
cancelled: 0
last_updated: "YYYY-MM-DD"
tasks:
- id: "TASK-001"
title: "任务标题"
description: "任务描述"
status: pending # pending | in_progress | pending_qa | completed | blocked | cancelled
priority: P1 # P0 | P1 | P2
assigned_to: dev # pm | dev | qa | prompt-eng
created_at: "YYYY-MM-DD"
updated_at: "YYYY-MM-DD"
deadline: null # "YYYY-MM-DD" 可选;有截止要求才填。heartbeat-check.py 会扫此字段判逾期
depends_on: [] # 依赖的任务 ID 列表
tags: [] # 标签(合法值见下方约定)
estimate_hours: 4 # 预估工时(小时)
notes: "" # 备注
# ── modules/ 体系叠加字段 ──
# module: profile/edit # ★ 二段式 basic/sub;modules/ 体系下必填
# req_slug: avatar-cropper # 可选;需求级任务用,对应 modules/<basic>/<sub>/requirements/<req_slug>/
# sub_req_slug: main # 与 req_slug 同进同出;main 也要显式写
# # (缺省按 main 解释仅对**存量**条目成立)
# affected_modules: [] # 可选;横切多模块任务用二段式数组
# ── 可选生命周期字段(按事件触发写入)─────────────────────
# completed_at: "YYYY-MM-DD" # status 改为 completed 时填写
# actual_output: "" # completed 时补充实际产出描述
# blocked_reason: "" # status 改为 blocked 时必填
# cancelled_at: "YYYY-MM-DD" # status 改为 cancelled 时填写
# cancel_reason: "" # cancelled 时必填
modules/ 体系下,task 字段叠加 modules 归属:
| 字段 | 取值 | 必填条件 |
|---|---|---|
module | 二段式 <basic>/<sub>,如 profile/edit | modules/ 体系下必填(与 issue 字段策略一致) |
req_slug | 父需求 slug,如 avatar-cropper | 需求级任务必填(document-norms §2.6 引用契约);维护 / 看板 / 记忆整理这类不挂需求的任务留空 |
sub_req_slug | 子需求 slug,如 main 或 phase-1 | 与 req_slug 同进同出——填了 req_slug 就必须填它(main 也显式写)。只有存量条目缺它时才按 main 解释,那是兼容条款不是写法(document-norms §2.6) |
affected_modules | 二段式数组 [a/b, c/d] | 横切多模块任务可选 |
未启用 modules/ 的存量项目:上述字段全部可选;module 可单值或留空(兼容现有结构)。
框架维护类任务例外:无业务模块归属的任务(如 self-iteration 的 iteration-tracking 提案追踪、框架升级跟进等)可不填 module——「必填」针对的是业务任务。
创建/状态变更任务时(modules/ 体系下):必须确认
module二段式合规(grepprojects/modules/<basic>/<sub>/是否存在);不合规建议先调module-init创建对应子模块再回写module字段。 字段叠加策略与projects/issues/TEMPLATES.md一致;详见 skill:document-norms§1。
"YYYY-MM-DD" 或 nulldeadline < today 且 status ∉ {completed, cancelled} 时计为逾期「可选」指的是任务没走到那个状态就不该有这个字段,不是「到了也可以不填」——下表的 "必填"是状态触发后的硬要求(原标题写「可选」与表内「必填」互相打架)。 流转到对应状态的角色负责当场填,不留给下一个人补。
| 字段 | 填写时机 | 状态触发后 |
|---|---|---|
completed_at | status 流转到 completed 时 | 必填 |
actual_output | status 流转到 completed 时 | 建议填(区别于 notes,记录实际产出) |
blocked_reason | status 流转到 blocked 时 | 必填 |
cancelled_at | status 流转到 cancelled 时 | 必填 |
cancel_reason | status 流转到 cancelled 时 | 必填 |
notes是自由备注,actual_output是结构化交付物描述(如"已交付 specs/REQ-003.md + 3 个 Task 条目"),两者互补不重复。
| tag | 含义 | 使用场景 |
|---|---|---|
auto-update | 由 auto-update 规则自动创建的任务 | P0/P1 信号触发时自动追加 |
needs-qa-regression | 需要 @qa 执行回归验证 | 安全类修复完成后 |
prompt-review | 需要 @prompt-eng 介入评估 | 需求变更涉及 Prompt 质量时 |
security | 安全相关任务 | SEC issue 关联任务 |
main-executed | 主 Claude 实际完成了使任务进入 pending_qa 的研发交付 | 主 Claude 直做研发任务、代行 in_progress → pending_qa 时 |
P0 / P1 / P2 | 优先级标签 | 与 issue severity 对应 |
tags 用于协同角色标注:当
assigned_to为单值时,通过 tags 标注需要协同的其他角色。例如assigned_to: dev+tags: [needs-qa-regression]表示 dev 完成后需 qa 回归验证。
main-executed是执行事实标记,不是角色标记——判据为「谁完成了使任务进入pending_qa的那份研发交付」:主 Claude 实际做完才打,只是参与讨论 / 出方案不打。assigned_to始终保持域角色不变,便于按域统计。
| 状态 | 含义 | 流转规则 |
|---|---|---|
pending | 待开始 | 初始状态 |
in_progress | 进行中 | 从 pending 流转,依赖项须全部 completed |
pending_qa | 待 QA 验证 | 从 in_progress 流转,仅研发类任务经过此状态 |
completed | 已完成 | 研发任务:从 pending_qa 流转(仅 @qa 可操作);非研发任务:从 in_progress 直接流转 |
blocked | 被阻塞 | 从任意状态流转,须注明阻塞原因(QA 不通过时也使用此状态) |
cancelled | 已取消 | 从任意状态流转,须注明取消原因 |
需经 pending_qa 的任务(研发类):
assigned_to 为 dev 或 prompt-eng 的编码/配置/变更类任务needs-qa-regression 的任务(安全修复回归验证等)不需经 pending_qa 的任务(非研发类):
| 状态变更 | 允许操作者 |
|---|---|
pending → in_progress | 该任务 assigned_to 的角色(认领即开工,不需要谁签发) |
in_progress → pending_qa | @dev、@prompt-eng(研发任务必经);主 Claude 直做时代行——assigned_to 仍填对应角色(域语义不变),并打 tags: [main-executed] |
pending_qa → completed | @qa(唯一可签发研发任务完成的角色)。代行不含签发权,签发权仍仅 @qa——主 Claude 直做研发任务后仍须实际调度 @qa,不得自签 |
pending_qa → blocked | @qa(测试不通过时) |
in_progress → completed | @pm、@dev(非研发任务)、@qa(非研发任务)、@prompt-eng(非研发类 Prompt 咨询) |
任意 → blocked | 任何角色(遇阻即可标,必须同时写 blocked_reason)。非 QA 角色直接标 blocked 是被允许的路径——agent-protocols.md 的 task_blocked fallback 正是为它准备的 |
blocked → in_progress | 阻塞解除后由 assigned_to 角色自行恢复;QA 打回的任务由 @dev / @prompt-eng 修复后恢复,不需要 @qa 再签一次 |
任意 → cancelled | @pm 或用户(范围决策,必须同时写 cancelled_at + cancel_reason) |
上表补齐前只定义了 4 行,而状态定义表写着 blocked / cancelled 「从任意状态流转」——出边和执行主体都没有落点,dev 修完被打回的任务找不到恢复依据。
每次 Claude Code 会话结束时,session-end-flush.py hook 自动调用 recompute_board_summary.py,根据 tasks 列表重算 summary 块:
summary.total = count(all tasks)
summary.pending = count(tasks where status == "pending")
summary.in_progress = count(tasks where status == "in_progress")
summary.pending_qa = count(tasks where status == "pending_qa")
summary.completed = count(tasks where status == "completed")
summary.blocked = count(tasks where status == "blocked")
summary.cancelled = count(tasks where status == "cancelled")
summary.last_updated = 当前日期
所有角色(@pm / @dev / @qa / @prompt-eng)更新 tasks 条目时不修改 summary 段——hook 会在会话结束时自动同步,避免多角色并发写 summary 导致的不一致。
手工兜底:以下场景用户可要求立即重算(由主 Claude 执行):
主 Claude 通过 Bash 调用插件内兜底命令(不重新实现统计公式;插件根路径从 plugin-root.txt 取,不依赖 PATH):
python "$(cat .claude/workframe-state/plugin-root.txt)/bin/workframe-recompute-board-summary"
plugin-root.txt 由 SessionStart hook 每次会话刷新为当前插件根(正斜杠绝对路径,Git Bash / macOS 通用)。若环境里 workframe-recompute-board-summary 恰好已在 PATH(CC plugin bin/ 注入生效的环境),裸调等价。
脚本返回 JSON 表明结果(status: ok / skipped / error),并在 events.jsonl 写一条 summary_recomputed 事件。
强制终止 caveat:如果 Claude Code 被强制终止(关闭窗口 / SIGKILL / OS shutdown),SessionEnd hook 不会触发——summary 会保持上次正常 flush 的值。
自动兜底:session-start-prep.py 在每次 SessionStart 时执行 drift check(对比 summary vs tasks 实际计数),发现不一致自动调用 recompute 修复并写 summary_drift_repaired 事件。手工兜底主要用于"用户希望立即看到最新 summary 不等下次 session"或"drift check 因 board.yaml 异常而 skip"等场景。
SessionEnd timeout caveat:SessionEnd hook 默认 1.5 秒整体 budget,plugin-provided hooks 的 timeout 配置不会提升整体 budget。如果项目 board.yaml 超大(>5000 tasks)导致 recompute 超时,用户可设环境变量 CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000(或更高)。SessionStart drift check 兜底机制保证即使 SessionEnd 超时,下次启动仍能修复。
projects/modules/ 存在)必须填 module 二段式 <basic>/<sub>;如对应子模块未建,先调 module-init 再回写 module 字段,不要凭空写不存在的模块路径recompute_board_summary.py);主 Claude 可在用户要求或发现异常时手工兜底调用该脚本。各角色只更新任务条目,不修改 summary 段