关于 speckit-taskstoissues
speckit-taskstoissues 将 Spec Kit 项目中的任务转换为 GitHub issue。它会检查扩展钩子、验证 Git 远程地址,并按任务 ID 查找已有 issue 以避免重复。
主要功能
- 01检查转换前后的扩展钩子
- 02通过脚本读取任务和项目文档
- 03仅在 GitHub 远程地址下继续
- 04按任务 ID 查找已有 issue
- 05只为未匹配的任务创建 issue
适用场景
- 01将 Spec Kit 任务转为 GitHub issue
- 02重新转换时避免创建重复 issue
MCP 相关
使用 GitHub MCP 服务查找已有 issue,并为尚无匹配项的任务创建 issue。
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ full-stack-skills/ speckit-skills --skill speckit-taskstoissues安装后在 Claude Code 中输入/speckit-taskstoissues确认已加载。
附带文件agents/openai.yamlLICENSE.txt
详细介绍
speckit-taskstoissues
本技能内容源自 GitHub Spec Kit 官方提示词模板。
- 上游:https://github.com/github/spec-kit
- 许可:MIT License, Copyright GitHub, Inc.(完整文本见同目录
LICENSE.txt) - 适配说明:官方模板面向斜杠命令场景;原文中的
$ARGUMENTS指用户在对话中给出的请求, 跨命令引用(如speckit.plan)在本技能体系中对应同名的speckit-*技能。 其余内容保持与上游一致,未作改写。
用户输入
$ARGUMENTS
如果用户输入不为空,继续操作前必须先考虑用户输入。
执行前检查
检查扩展钩子(任务转问题之前):
- 检查项目根目录中是否存在
.specify/extensions.yml。 - 如果存在,读取该文件并查找
hooks.before_taskstoissues键下的条目。 - 如果无法解析 YAML 或 YAML 无效,不得静默跳过:告知用户无法读取
.specify/extensions.yml(包括解析器错误),并说明未检查任何钩子,包括其中注册的任何必需(optional: false)钩子,然后继续正常操作。 - 筛除
enabled明确为false的钩子。未设置enabled字段的钩子默认视为已启用。 - 对每个剩余钩子,不要尝试解释或评估钩子的
condition表达式:- 如果钩子没有
condition字段,或该字段为 null/空,则视为可执行钩子。 - 如果钩子定义了非空的
condition,则跳过该钩子,并将条件评估留给 HookExecutor 实现。
- 如果钩子没有
- 对于每个可执行钩子,根据其
optional标志输出以下内容:- 可选钩子(
optional: true):## 扩展钩子 **可选前置钩子**:{extension} 命令:`/{command}` 描述:{description} 提示词:{prompt} 执行方式:`/{command}` - 必需钩子(
optional: false):
输出上述代码块后,必须实际调用该钩子,并等待其执行完毕后才能继续。调用方式与在当前 Agent/会话中自行运行该命令的方式相同(实际调用可能不同于上方显示的字面## 扩展钩子 **自动前置钩子**:{extension} 正在执行:`/{command}` EXECUTE_COMMAND: {command} 继续到大纲之前,请等待钩子命令的结果。{command}ID,例如,技能模式的 Agent 会运行/skill:speckit-...或$speckit-...)。仅输出代码块并不会运行钩子。
- 可选钩子(
- 如果未注册任何钩子,或
.specify/extensions.yml不存在,则静默跳过。
概述
- 从仓库根目录运行
{SCRIPT},并解析 FEATURE_DIR 和 AVAILABLE_DOCS 列表。所有路径都必须是绝对路径。对于参数中的单引号,例如 "I'm Groot",请使用转义语法:例如 'I'''m Groot'(如果可行,也可以使用双引号:"I'm Groot")。 - 如果存在:加载
/memory/constitution.md,了解项目原则和治理约束。 - 从已执行的脚本中提取 tasks 的路径。
- 运行以下命令获取 Git 远程地址:
git config --get remote.origin.url
注意
只有当远程地址是 GitHub URL 时,才能继续执行后续步骤。
- 获取现有 issue 以进行去重:在创建任何内容之前,先从
tasks.md中构建即将处理的任务 ID 集合(每个 ID 都是T后跟 至少 三位数字,例如T001——__SPECKIT_COMMAND_CONVERGE__会用T{M+1:03d}分配新 ID,其中03d表示最小位数而非上限,因此文件中的任务超过 999 个后,ID 会变成四位或更多位)。然后使用 GitHub MCP 服务的list_issues工具查找已涵盖这些 ID 的 issue。不要传入state值,因为省略该值时,工具会同时返回打开和关闭的 issue。请求perPage: 100以减少调用次数;由于该工具使用基于游标的分页,请通过after参数请求各页(使用上一响应中的endCursor)。对于每个 issue 标题,使用任务 ID 模式\bT\d{3,}\b进行匹配({3,}可匹配四位及更多位数的 ID——如果使用\d{3},包含T1000的标题将完全无法匹配,因为尾部的\b不能出现在两个数字之间,导致该任务被静默地既未去重也未创建;单词边界仍会阻止匹配ST001这样的标记,并确保匹配完整的数字序列,因此T100永远不会匹配T1000中的一部分;此模式也能识别T001 ...、T001: ...或[T001] ...这样的标题)。如果标题匹配某个任务 ID,就将该 ID 标记为已有 issue。只要所有任务 ID 都已匹配,或没有更多页面,就停止翻页;不要在所有任务 ID 都已处理后继续获取整个仓库的 issue 历史。这样既能限制 issue 历史记录很长的仓库所需的调用次数,也能在重新生成tasks.md或再次调用此技能时避免重复创建。 - 对列表中的每个任务,使用 GitHub MCP 服务在与 Git 远程地址相对应的仓库中创建新 issue。
tasks.md中的任务行以 Markdown 复选框开头,因此首先移除开头的- [ ](以及任何[P]/[US#]标记),以提取任务 ID 和描述。创建 issue 时,使用唯一规范标题,格式为T001: <description>,ID 只写一次,后接任务描述(例如,行- [ ] T001 Create project structure应生成标题T001: Create project structure)。- 跳过其 ID 已存在于上一步现有 issue 集合中的任务,并报告该情况(例如,
T001 already has an issue, skipping)。 - 只为尚无匹配 issue 的任务创建 issue。
- 跳过其 ID 已存在于上一步现有 issue 集合中的任务,并报告该情况(例如,
注意
在任何情况下,都绝不要在与远程 URL 不匹配的仓库中创建 issue。
执行后检查
检查扩展钩子(将任务转换为问题后):
检查项目根目录中是否存在 .specify/extensions.yml。
- 如果存在,请读取该文件,并查找
hooks.after_taskstoissues键下的条目 - 如果 YAML 无法解析或无效,不要默默跳过:告知用户无法读取
.specify/extensions.yml(包含解析器错误),并说明未检查任何钩子,包括其中注册的任何强制钩子(optional: false),然后正常继续 - 过滤掉
enabled明确为false的钩子。未包含enabled字段的钩子默认视为已启用。 - 对于其余每个钩子,不要尝试解释或计算钩子的
condition表达式:- 如果钩子没有
condition字段,或者该字段为 null/空值,则视为可执行 - 如果钩子定义了非空的
condition,则跳过该钩子,并将条件评估留给 HookExecutor 实现
- 如果钩子没有
- 对于每个可执行钩子,根据其
optional标志输出以下内容:- 可选钩子(
optional: true):## Extension Hooks **Optional Hook**: {extension} Command: `/{command}` Description: {description} Prompt: {prompt} To execute: `/{command}` - 强制钩子(
optional: false):
输出上面的内容块后,必须实际调用该钩子,并等待其完成后再继续。调用方式应与在此 Agent/会话中自行运行该命令的方式相同(调用方式可能与上面显示的字面## Extension Hooks **Automatic Hook**: {extension} Executing: `/{command}` EXECUTE_COMMAND: {command}{command}ID 不同,例如,技能模式的 Agent 会将其作为/skill:speckit-...或$speckit-...运行)。仅输出内容块并不等于运行了钩子。
- 可选钩子(
- 如果没有注册任何钩子,或者
.specify/extensions.yml不存在,则默默跳过
评论
支持 Markdown