研发协作
在 spec-kit 项目中把 tasks.md…
当项目已有 spec-kit 的 .specify/ 结构与 tasks.md,需要把其中的任务逐条创建为对应的 GitHub issue 且避免重复创建时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
在 spec-kit 项目中把 task特定
解决思路
- 用户输入 $ARGUMENTS 非空时,必须先考虑该输入再继续。
- 执行前检查:查看项目根目录是否存在 `.specify/extensions.yml`;不存在则静默跳过 hook 检查。
- 若该文件存在,读取其中 `hooks.before_taskstoissues` 键下的条目。
- 若 YAML 无法解析或无效,不要静默跳过:告知用户 `.specify/extensions.yml` 无法读取(附上解析器错误),说明未检查任何 hook(包括其中注册的强制 hook,即 `optional: false`),然后照常继续。
- 过滤掉 `enabled` 显式为 `false` 的 hook;没有 `enabled` 字段的默认视为启用。
- 不要自行解释或求值 hook 的 `condition`:无 `condition` 字段或为 null/空的视为可执行;定义了非空 `condition` 的跳过,把条件求值留给 HookExecutor 实现。
- 由 hook 命令名构造调用时,把点 `.` 替换为连字符 `-`,例如 `speckit.git.commit` → `/speckit-git-commit`。
- 对每个可执行的前置 hook:可选 hook(`optional: true`)输出 `## Extension Hooks` + `**Optional Pre-Hook**: {extension}` 提示块,含 Command、Description、Prompt 和 `To execute: /{command}`;强制 hook(`optional: false`)输出 `**Automatic Pre-Hook**` 块并带 `EXECUTE_COMMAND: {command}`,且必须按本 agent/session 的方式真正调用该 hook(例如 skills 模式用 `/skill:speckit-...` 或 `$speckit-...`)并等待其完成后再继续,只输出块不算执行。
- 从仓库根运行 `.specify/scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks`,解析出 FEATURE_DIR 和 AVAILABLE_DOCS 列表;所有路径必须是绝对路径;参数中含单引号(如 "I'm Groot")时使用转义写法 `'I'\''m Groot'`(或改用双引号)。
- 若存在,加载 `.specify/memory/constitution.md` 以获取项目原则与治理约束。
- 从脚本输出中提取 **tasks** 文件的路径。
- 运行 `git config --get remote.origin.url` 获取 Git remote。
- 仅当该 remote 是 GitHub URL 时才继续下一步。
- 创建前去重:先从 `tasks.md` 构建本次要处理的任务 ID 集合(每个 ID 是 `T` 后跟**至少**三位数字,如 `T001`;`/speckit-converge` 用 `T{M+1:03d}` 分配新 ID,这是下限而非上限,文件超过 999 个任务后 ID 为四位或更长)。
- 用 GitHub MCP server 的 `list_issues` 工具查找已覆盖这些 ID 的 issue:不要传 `state`(省略才会同时返回 open 和 closed),请求 `perPage: 100` 以减少调用次数,该工具为游标分页,用上一页响应的 `endCursor` 作为 `after` 参数翻页。
- 对每个 issue 标题用正则 `\bT\d{3,}\b` 匹配:`{3,}` 可接受四位及更长 ID(用 `\d{3}` 时含 `T1000` 的标题完全匹配不上,因为结尾 `\b` 不能落在两个数字之间,该任务会被静默地既不判重也不创建);词边界还能阻止 `ST001` 这类 token 匹配,并强制消费完整数字串,使 `T100` 绝不会匹配到 `T1000` 内部;该正则也识别 `T001 ...`、`T001: ...`、`[T001] ...` 等标题写法;一旦匹配到自己某个任务 ID,就把该 ID 标记为已有 issue。
- 当所有任务 ID 都已匹配上、或没有更多页时立即停止分页,以免在所有任务 ID 都已覆盖后仍继续拉取整个仓库的 issue 历史;这样在大 issue 历史的仓库上调用次数有界,同时在 tasks.md 重新生成或技能被重复调用时仍能防重。
- 逐任务创建 issue:`tasks.md` 的任务行以 markdown checkbox 开头,先剥掉行首的 `- [ ]`(以及任何 `[P]` / `[US#]` 标记)以还原任务 ID 和描述;用规范标题 `T001: <description>` 创建 issue,ID 只写一次后接任务描述(例如 `- [ ] T001 Create project structure` 变成标题 `T001: Create project structure`)。
- 跳过 ID 已在上一步已有 issue 集合中的任务,并报告(例如 `T001 already has an issue, skipping`);只为尚无匹配 issue 的任务创建 issue。
- 绝不在与 remote URL 不匹配的仓库中创建 issue。
- 执行后检查:同样检查项目根目录的 `.specify/extensions.yml`,读取 `hooks.after_taskstoissues` 键下的条目,并按与前置检查相同的规则处理解析失败(告知用户并继续)、过滤 `enabled: false`、跳过带非空 `condition` 的 hook、以及把命令名中的点替换为连字符。
- 对每个可执行的后置 hook:可选 hook(`optional: true`)输出 `## Extension Hooks` + `**Optional Hook**: {extension}` 提示块;强制 hook(`optional: false`)输出 `**Automatic Hook**` 块并带 `EXECUTE_COMMAND: {command}`,且必须真正调用该 hook 并等待其完成。
- 若没有注册任何 hook 或 `.specify/extensions.yml` 不存在,则静默跳过。
适用边界 · 注意事项
- remote 不是 GitHub URL(或仓库与 remote 不匹配)时不适用,禁止在其中创建 issue。
- 没有 spec-kit 项目结构(缺少 `.specify/` 目录、`check-prerequisites.sh` 或 tasks.md)时不适用。
- 不使用 GitHub MCP server / 无法访问 GitHub issues 时不适用。