关于 speckit-taskstoissues
speckit-taskstoissues 是一项将 Specify 任务列表转换为 GitHub issue 的技能,面向使用 GitHub 项目跟踪开发任务的团队。它会先按任务 ID 查找已有 issue,再创建缺失项,并检查转换前后的扩展钩子;该技能已弃用,建议改用捆绑的 github 扩展。
主要功能
- 01将任务条目转换为 issue
- 02按任务 ID 查重
- 03为缺失任务创建 issue
- 04执行转换前后钩子检查
- 05发出弃用提示
适用场景
- 01将 tasks.md 同步到 GitHub issue
- 02再次运行时避免重复创建 issue
MCP 相关
该技能依赖 GitHub MCP server 的 list_issues 和 issue 创建工具来查重并创建任务 issue。README 建议改用 github 扩展中的 /speckit-github-taskstoissues。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dceoy/ speckit-agent-skills --skill speckit-taskstoissues安装后在 Claude Code 中输入/speckit-taskstoissues确认已加载。
详细介绍
弃用通知
你必须首先显示以下简短警告,将其作为此命令的第一步,并置于下方的“用户输入”和“执行前检查”部分之前:
⚠️
/speckit-taskstoissues已弃用,并将在未来的次要版本中移除。请改用内置的github扩展:运行specify extension add github,然后调用/speckit-github-taskstoissues。
继续执行现有工作流,不作更改。不要自动安装或启用扩展,不要停止,也不要运行替代命令。
用户输入
$ARGUMENTS
如果用户输入不为空,你必须在继续之前予以考虑。
执行前检查
检查扩展钩子(在将任务转换为 Issue 之前):
- 检查项目根目录中是否存在
.specify/extensions.yml。 - 如果存在,读取该文件并查找
hooks.before_taskstoissues键下的条目。 - 如果无法解析 YAML 或 YAML 无效,不要默默跳过:告知用户
.specify/extensions.yml无法读取(包括解析器错误),且未检查任何钩子,包括其中注册的任何强制钩子(optional: false),然后正常继续。 - 过滤掉
enabled明确设为false的钩子。未设置enabled字段的钩子默认视为启用。 - 对于其余每个钩子,不要尝试解释或评估钩子的
condition表达式:- 如果钩子没有
condition字段,或其值为 null/空,则视为可执行。 - 如果钩子定义了非空的
condition,则跳过该钩子,并将条件评估留给 HookExecutor 实现。
- 如果钩子没有
- 从钩子命令名称构造命令调用时,将点号(
.)替换为连字符(-)。例如,speckit.git.commit→/speckit-git-commit。 - 对于每个可执行钩子,根据其
optional标志输出以下内容:-
可选钩子(
optional: true):## 扩展钩子 **可选的前置钩子**:{extension} 命令:`/{command}` 描述:{description} 提示词:{prompt} 执行方式:`/{command}` -
强制钩子(
optional: false):## 扩展钩子 **自动前置钩子**:{extension} 正在执行:`/{command}` EXECUTE_COMMAND: {command} 继续到大纲之前,请等待钩子命令执行完成并返回结果。输出以上内容后,你必须实际调用该钩子,并等待其执行完成后再继续。调用方式应与你在此 Agent/会话中自行运行命令的方式相同(调用形式可能与显示的
{command}标识不同,例如,技能模式的 Agent 会运行/skill:speckit-...或$speckit-...)。仅输出该内容并不代表已运行钩子。
-
- 如果没有注册任何钩子,或
.specify/extensions.yml不存在,则静默跳过。
大纲
- 从仓库根目录运行
.specify/scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks,并解析 FEATURE_DIR 和 AVAILABLE_DOCS 列表。所有路径都必须是绝对路径。对于参数中的单引号,例如 "I'm Groot",请使用转义语法:例如 'I'''m Groot'(或在可行时使用双引号:"I'm Groot")。 - 如果存在:加载
.specify/memory/constitution.md,了解项目原则和治理约束。 - 从已执行的脚本中提取 tasks 的路径。
- 运行以下命令获取 Git 远程地址:
git config --get remote.origin.url
注意
只有远程地址是 GitHub URL 时,才继续执行后续步骤。
- 获取现有问题以进行去重:创建任何内容之前,先根据
tasks.md建立要处理的任务 ID 集合(每个 ID 都是T后跟至少三位数字,例如T001——/speckit-converge使用T{M+1:03d}分配新 ID,其中03d表示最小宽度而非最大宽度,因此文件中的任务超过 999 个时,ID 会是四位或更多位数字)。然后使用 GitHub MCP 服务的list_issues工具查找已涵盖这些 ID 的问题。不要传递state值,因为省略该值会让工具同时返回未关闭和已关闭的问题。请求perPage: 100以减少调用次数;由于该工具使用基于游标的分页,请通过after参数请求页面(使用上一次响应中的endCursor)。对于每个问题标题,按任务 ID 模式\bT\d{3,}\b进行匹配({3,}可匹配四位及更多位数字的 ID——若使用\d{3},标题中的T1000将完全无法匹配,因为末尾的\b不可能出现在两个数字之间,这会导致该任务既不会被去重,也不会被创建;单词边界仍可阻止ST001这样的标记匹配,并确保整个数字序列都被匹配,因此T100永远不会匹配到T1000的一部分;此模式也可识别T001 ...、T001: ...或[T001] ...这样的标题)。如果标题匹配到某个任务 ID,就将该 ID 标记为已有问题。所有任务 ID 都匹配到,或没有更多页面时,立即停止分页;不要在所有任务 ID 都已核实后继续获取整个仓库的问题历史。这样可以限制大型仓库中的调用次数,同时避免在重新生成tasks.md或再次调用此技能后创建重复问题。 - 对列表中的每项任务,使用 GitHub MCP 服务在与 Git 远程地址对应的仓库中创建新问题。
tasks.md中的任务行以 Markdown 复选框开头,因此请先移除前导的- [ ](以及任何[P]/[US#]标记),以提取任务 ID 和描述。使用唯一的规范标题创建问题,格式为T001: <description>:ID 只写一次,后接任务描述(例如,行- [ ] T001 Create project structure应转换为标题T001: Create project structure)。- 跳过 ID 已存在于上一步所得问题集合中的任务,并报告跳过情况(例如,
T001 already has an issue, skipping)。 - 只为尚无匹配问题的任务创建问题。
- 跳过 ID 已存在于上一步所得问题集合中的任务,并报告跳过情况(例如,
注意
绝对不得在与远程 URL 不匹配的仓库中创建问题。
执行后检查
检查扩展钩子(将任务转换为问题之后):
检查项目根目录中是否存在 .specify/extensions.yml。
- 如果存在,请读取该文件,并查找
hooks.after_taskstoissues键下的条目 - 如果无法解析 YAML 或 YAML 无效,不要默默跳过:告知用户无法读取
.specify/extensions.yml(附上解析器错误),并说明未检查任何钩子,包括其中注册的任何必需钩子(optional: false),然后正常继续 - 过滤掉
enabled明确设为false的钩子。未设置enabled字段的钩子默认视为已启用。 - 对其余每个钩子,不要尝试解释或评估钩子的
condition表达式:- 如果钩子没有
condition字段,或该字段为 null/空,则视为可执行 - 如果钩子定义了非空的
condition,则跳过该钩子,并将条件评估留给 HookExecutor 实现
- 如果钩子没有
- 根据钩子命令名称构造命令调用时,将点号(
.)替换为连字符(-)。例如,speckit.git.commit→/speckit-git-commit。 - 对每个可执行钩子,根据其
optional标志输出以下内容:-
可选钩子(
optional: true):## 扩展钩子 **可选钩子**:{extension} 命令:`/{command}` 描述:{description} 提示词:{prompt} 执行:`/{command}` -
必需钩子(
optional: false):## 扩展钩子 **自动钩子**:{extension} 正在执行:`/{command}` EXECUTE_COMMAND: {command}输出上述内容后,你必须实际调用该钩子,并等待其执行完毕后再继续。按照你在此 Agent/会话中自行运行命令的方式运行它(实际调用可能不同于上方显示的字面
{command}标识,例如,技能模式 Agent 可能会运行/skill:speckit-...或$speckit-...)。仅输出上述内容并不会运行钩子。
-
- 如果未注册任何钩子,或
.specify/extensions.yml不存在,则静默跳过