mcpField
S
speckit-taskstoissues

speckit-taskstoissues

github.com/full-stack-skills开发061 次安装4 周前更新
代码仓库

关于 speckit-taskstoissues

speckit-taskstoissues 将 Spec Kit 项目中的任务转换为 GitHub issue。它会检查扩展钩子、验证 Git 远程地址,并按任务 ID 查找已有 issue 以避免重复。

主要功能

  1. 01检查转换前后的扩展钩子
  2. 02通过脚本读取任务和项目文档
  3. 03仅在 GitHub 远程地址下继续
  4. 04按任务 ID 查找已有 issue
  5. 05只为未匹配的任务创建 issue

适用场景

  1. 01将 Spec Kit 任务转为 GitHub issue
  2. 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):
      ## 扩展钩子
      
      **自动前置钩子**:{extension}
      正在执行:`/{command}`
      EXECUTE_COMMAND: {command}
      
      继续到大纲之前,请等待钩子命令的结果。
      
      输出上述代码块后,必须实际调用该钩子,并等待其执行完毕后才能继续。调用方式与在当前 Agent/会话中自行运行该命令的方式相同(实际调用可能不同于上方显示的字面 {command} ID,例如,技能模式的 Agent 会运行 /skill:speckit-... 或 $speckit-...)。仅输出代码块并不会运行钩子。
  • 如果未注册任何钩子,或 .specify/extensions.yml 不存在,则静默跳过。

概述

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

注意

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

  1. 获取现有 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 或再次调用此技能时避免重复创建。
  2. 对列表中的每个任务,使用 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。

注意

在任何情况下,都绝不要在与远程 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):
      ## Extension Hooks
      
      **Automatic Hook**: {extension}
      Executing: `/{command}`
      EXECUTE_COMMAND: {command}
      
      输出上面的内容块后,必须实际调用该钩子,并等待其完成后再继续。调用方式应与在此 Agent/会话中自行运行该命令的方式相同(调用方式可能与上面显示的字面 {command} ID 不同,例如,技能模式的 Agent 会将其作为 /skill:speckit-... 或 $speckit-... 运行)。仅输出内容块并不等于运行了钩子。
  • 如果没有注册任何钩子,或者 .specify/extensions.yml 不存在,则默默跳过

评论

支持 Markdown