speckit-taskstoissues について
speckit-taskstoissuesは、Spec KitプロジェクトのタスクをGitHub issueに変換するスキルです。拡張フックとGitリモートを確認し、タスクIDで既存issueを検索して重複を防ぎます。
主な機能
- 01変換前後の拡張フックを確認
- 02スクリプトでタスクとプロジェクト文書を取得
- 03GitHubリモートの場合のみ処理を続行
- 04タスクIDで既存issueを検索
- 05未一致のタスクだけissueを作成
活用シーン
- 01Spec 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 を解析できない場合、または無効な場合は、黙ってスキップしないでください。
.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が存在しない場合は、何もせずにスキップします。
概要
- リポジトリのルートで
{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(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が再生成された場合や、スキルが再び呼び出された場合の重複を防げます。 - リスト内の各タスクについて、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 を作成します。
- スキップ:前の手順で作成した既存 issue のセットに ID が含まれているタスクはスキップし、その旨を報告します(例:
注意
いかなる状況でも、リモート 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が存在しない場合は、何もせずにスキップします
コメント
Markdown 対応