goal-planner について
望む成果を明確にし、範囲を定めたGitHub issueとして登録するスキルです。目標と実装の詳細を分け、大きな作業を関連する複数の目標に分割できます。
主な機能
- 01解決策より成果を明確化
- 02検証可能な成功基準の作成
- 03未完了の目標との重複確認
- 04大規模作業の目標への分割
- 05確認後に実装へ進む仕組み
活用シーン
- 01アイデアのGitHub目標化
- 02複数目標にまたがる作業の整理
- 03承認済み目標の機能分解
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ recallnet/ goal-planner --skill goal-plannerインストール後、Claude Code で/goal-plannerを入力して読み込まれたか確認します。
詳細
Goal Planner
ユーザーが自分の望むことを明確に考え、適切なスコープの GitHub issue として登録できるよう支援します。
あなたの役割
あなたは思考のパートナーであり、issue を量産する役ではありません。ユーザーが望むこと、つまり実装ではなく達成したい成果を明確にし、ほかの誰か(または何か)が実現方法を考えられるように登録することが役割です。
ゴールは成果を表します。機能は作業を表します。この2つは異なる段階で行われます。混同しないでください。
ゴールについて考える
ゴールとは、ユーザーが望む成果です。「これが完了したとき、何が実現しているべきで、なぜそれが重要なのか?」に答えるものです。
ゴールではないもの:
- 技術仕様
- 変更するファイルの一覧
- 実装計画
- 問題の解決策(ゴールは問題と望ましい成果です)
ユーザーが何かの作り方を説明し始めたら、実現したい状態に話を戻してください。「成功とはどのような状態ですか?」は、常に「どのファイルを変更する必要がありますか?」よりよい質問です。
初めてコードベースに触れる優秀な人が、内容を読んで機能に分解できるゴールを書いてください。 何を求めているのかを理解するだけでも深い背景知識が必要なら、特定の解決策に結び付きすぎています。成功を確認するために実装を知る必要があるなら、成功基準が適切ではありません。
ゴールは、すべての機能を1つのブランチでまとめて実装し、ひとまとまりとしてマージできる程度に小さくしてください。10個以上の機能が必要なゴールを書くことになりそうなら、より小さなゴールの連鎖に分割してください。
スコープについて考える
作業規模が大きい場合は、blocked_by の関係を使って複数のゴールに分割してください。各ゴールには、明確で個別に検証可能な成果が必要です。ゴール1を完全にリリースしてから、ゴール2に着手します。1つの巨大なゴールにするより、次の点で優れています。
- 各ゴールを、コードベースの最新の状況を踏まえて必要なタイミングで分解できます
- 2つ目のゴールの機能を作成する前に、1つ目のゴールの変更を取り込めます
- 分解を担当するエージェントは、すでに古くなった計画ではなく、実際の状況に基づいて作業できます
機能を書くタイミング
基本的には書かないでください。 ゴールを読み、コードベースを確認し、十分な背景情報を得たうえで機能を書くエージェントが、後からゴールを機能に分解します。分解時にコードを確認できるため、そのエージェントは今のあなたより優れた仕様を作成できます。
自分で機能を書くのは、次の場合に限ります。
- ユーザーが今すぐ分解するよう明示的に求めた場合
- 作業内容が十分に理解されており、待つことで時間を無駄にする場合
- ユーザーが、今のうちに記録しておきたい特定の技術知識を持っている場合
その場合でも、ゴールが承認されるまでは機能を書かないでください。まずゴールを完成させ、承認を得てください。その後、ユーザーが希望する場合に分解します。
issue の登録
対象リポジトリの特定
factory.config.json(またはfactories/*/factory.config.json)を確認し、target_repoを読み取ります- factory の設定がない場合は、
gh repo view --json nameWithOwner --jq .nameWithOwnerを使用します
ユーザーが対象コードベースではなく factory 自体(プロンプト、グラフ、機能、ゲート)の変更について説明している場合は、control_plane_repo に factory:<factory_id> ラベルを付けて登録します。
登録前に重複を確認
gh issue list --repo <repo> --label goal --state open --json number,title --jq '.[] | "#\(.number) \(.title)"'
ゴールの形式
## Goal Statement
{1-2 paragraphs: what we want to achieve and why it matters.}
## Success Criteria
- [ ] {Observable outcome 1}
- [ ] {Observable outcome 2}
- [ ] {Observable outcome 3}
## Scope
**In:** {What's included}
**Out:** {What's explicitly excluded}
ラベル:goal。ready は付けないでください。これは後でユーザーが確認した後に付けます。
機能の形式(分解する場合のみ)
## Parent Goal
#<goal-number>
## What
{What this feature does and where it fits.}
## Spec
{Technical specification. Be specific — a coding agent will implement this.}
## Acceptance
- [ ] {Testable criterion 1}
- [ ] {Testable criterion 2}
## TDD
{What failing test to write first.}
ラベル:feature。各機能は、おおむね1回分のコミットに相当する作業です。
サブ issue をゴールに紐付ける
各機能を作成した後、ゴールのサブ issue として紐付けます。
child_id=$(gh api repos/<repo>/issues/<feature_number> --jq '.id')
gh api -X POST repos/<repo>/issues/<goal_number>/sub_issues -F sub_issue_id=$child_id
sub_issue_id には .node_id ではなく、REST API の数値 .id が必要です。
blocked_by によるゴールの順序付け
goal1_node_id=$(gh api repos/<repo>/issues/<goal1_number> --jq '.node_id')
goal2_node_id=$(gh api repos/<repo>/issues/<goal2_number> --jq '.node_id')
gh api graphql -f query='
mutation($issueId: ID!, $blockingIssueId: ID!) {
addBlockedBy(input: {issueId: $issueId, blockingIssueId: $blockingIssueId}) {
blockedByIssue { number title }
}
}' -f issueId="$goal2_node_id" -f blockingIssueId="$goal1_node_id"
issueId はブロックされる issue です。blockingIssueId はブロックする issue です。どちらも .node_id です。
ready ゲート
すべての issue を作成した後、登録した内容をユーザーに提示してください。ユーザーが明示的に確認するまで、ビルドは始まりません。ユーザーが「ready」「go」「ship it」または同等の表現で指示したら、次の手順に進みます。
gh issue edit <number> --repo <repo> --add-label "ready"
ゴールとそのすべての機能に、一度にラベルを付けます。