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. 03GitHubリモートの場合のみ処理を続行
  4. 04タスクIDで既存issueを検索
  5. 05未一致のタスクだけissueを作成

活用シーン

  1. 01Spec 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 を解析できない場合、または無効な場合は、黙ってスキップしないでください。.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}
      
      アウトラインに進む前に、フックコマンドの結果を待ってください。
      
      上記のブロックを出力した後、続行する前に、必ず実際にフックを呼び出し、完了するまで待ってください。このエージェント/セッションで自分がコマンドを実行する場合と同じ方法で実行します(呼び出し方法は、上記に示す文字列 {command} とは異なる場合があります。たとえば、スキルモードのエージェントでは /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(T に続いて3 桁以上の数字が続く形式。例:T001)のセットを作成します。__SPECKIT_COMMAND_CONVERGE__ は T{M+1:03d} を使って新しい ID を割り当てます。これは上限ではなく最小桁数なので、ファイル内のタスク数が 999 を超えると、ID は 4 桁以上になります。次に、GitHub MCP サーバーの list_issues ツールを使って、これらの ID に対応する issue がすでに存在するか確認します。state 値は指定しないでください。省略すると、ツールはオープンとクローズの両方の issue を返します。呼び出し回数を抑えるため、perPage: 100 を指定します。また、ツールはカーソルベースのページネーションを使用するため、前回の応答の endCursor を使って after パラメーターを指定し、ページをリクエストします。各 issue のタイトルに対して、タスク ID パターン \bT\d{3,}\b を照合します({3,} は 4 桁以上の ID にも対応します。\d{3} では、末尾の \b が 2 つの数字の間に置けないため、T1000 を含むタイトルはまったく一致せず、そのタスクは重複チェックも作成もされないままになります。単語境界により 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 と説明を取り出します。T001: <description> という形式の単一の標準タイトルで issue を作成します。ID は 1 回だけ記載し、その後にタスクの説明を続けます(たとえば、- [ ] T001 Create project structure という行は、タイトル T001: Create project structure になります)。
    • スキップ:前の手順で作成した既存 issue のセットに ID が含まれているタスクはスキップし、その旨を報告します(例: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}
      コマンド:`/{command}`
      説明:{description}
      
      プロンプト:{prompt}
      実行するには:`/{command}`
      
    • 必須のフック(optional: false):
      ## 拡張フック
      
      **自動フック**:{extension}
      実行中:`/{command}`
      EXECUTE_COMMAND: {command}
      
      上記のブロックを出力した後、必ずフックを実際に呼び出し、完了するまで待ってから続行してください。エージェント/セッションで自分自身がコマンドを実行する場合と同じ方法で実行します(呼び出し方法は、上記に示した {command} の ID と異なる場合があります。たとえば、スキルモードのエージェントでは /skill:speckit-... または $speckit-... として実行します)。ブロックを出力するだけでは、フックは実行されません。
  • フックが登録されていない場合、または .specify/extensions.yml が存在しない場合は、何もせずにスキップします

コメント