mcpField
S
speckit-taskstoissues

speckit-taskstoissues

github.com/dceoy开发1561.5k 次安装2 天前更新
代码仓库

关于 speckit-taskstoissues

speckit-taskstoissues 是一项将 Specify 任务列表转换为 GitHub issue 的技能,面向使用 GitHub 项目跟踪开发任务的团队。它会先按任务 ID 查找已有 issue,再创建缺失项,并检查转换前后的扩展钩子;该技能已弃用,建议改用捆绑的 github 扩展。

主要功能

  1. 01将任务条目转换为 issue
  2. 02按任务 ID 查重
  3. 03为缺失任务创建 issue
  4. 04执行转换前后钩子检查
  5. 05发出弃用提示

适用场景

  1. 01将 tasks.md 同步到 GitHub issue
  2. 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 不存在,则静默跳过。

大纲

  1. 从仓库根目录运行 .specify/scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks,并解析 FEATURE_DIR 和 AVAILABLE_DOCS 列表。所有路径都必须是绝对路径。对于参数中的单引号,例如 "I'm Groot",请使用转义语法:例如 'I'''m Groot'(或在可行时使用双引号:"I'm Groot")。
  2. 如果存在:加载 .specify/memory/constitution.md,了解项目原则和治理约束。
  3. 从已执行的脚本中提取 tasks 的路径。
  4. 运行以下命令获取 Git 远程地址:
git config --get remote.origin.url

注意

只有远程地址是 GitHub URL 时,才继续执行后续步骤。

  1. 获取现有问题以进行去重:创建任何内容之前,先根据 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 或再次调用此技能后创建重复问题。
  2. 对列表中的每项任务,使用 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)。
    • 只为尚无匹配问题的任务创建问题。

注意

绝对不得在与远程 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 不存在,则静默跳过

评论

支持 Markdown