- Skill ID
- fandhe-ai/agent-cli-skills/implement-issue-tree
- Publisher
- fandhe-ai
- Repository
- agent-cli-skills
- Installs
- 0
- Files
- 39
- Synced
- Sep 23, 2026
Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.
fandhe-ai/agent-cli-skills/implement-issue-treeInstalls these files- SKILL.md
- references/automerge-design.md
- references/out-of-scope-support.md
- references/recovery.md
- references/report-format.md
- references/verification.md
- sample/args-example.json
- sample/issue-tree-example.json
- sample/state-example.json
- scripts/build-workflow.mjs
- scripts/implement-issue-tree.js
- scripts/implement-issue-tree.src.js
- scripts/merge-guard-hook.sh
- scripts/preview-tree.sh
- tests/base-ci-probe-branch.test.mjs
- tests/build-workflow.test.mjs
- tests/commitlint-enum-condition.test.mjs
- tests/conflict-base-merge-dispatch.test.mjs
- tests/conflict-prepush-gate.test.mjs
- tests/dep-reeval.test.mjs
- tests/free-disk-gate.test.mjs
- tests/g0-gates.test.mjs
- tests/high-water-reserve.test.mjs
- tests/lib/workflow-script-contract.mjs
- tests/main-worktree-nested-exclusion.test.mjs
- tests/merge-loop-rescan.test.mjs
- tests/nopush-resolve-progress.test.mjs
- tests/phase-gate.test.mjs
- tests/post-push-checks-gate.test.mjs
- tests/pr-create-checkout-verification.test.mjs
- tests/pr-saved-failsafe.test.mjs
- tests/residual-average-latch-scope.test.mjs
- tests/residual-byte-fallback.test.mjs
- tests/residual-cap-default.test.mjs
- tests/residual-check-detection.test.mjs
- tests/resolve-host-proof.test.mjs
- tests/resolve-pushed-head.test.mjs
- tests/review-diff-base.test.mjs
- tests/workflow-loadability.test.mjs
What this skill tells the agent
implement-issue-tree
親イシュー番号を指定し、配下のサブイシュー(孫含む)を依存順を保ちつつ worktree で並列に自動実装・ローカル diff レビュー・push + PR 作成・CI 監視・マージ可能状態化まで自動化する Workflow を起動する。squash merge は autoMerge: true + externalChecks 明示(全 App の信頼済み check context 宣言込み)の opt-in ランでのみクライアント側で実行する(references/automerge-design.md の「クライアント側自動マージの設計」節参照)。既定(autoMerge 未指定 / false)ではマージせず停止し、マージは GitHub 上で人間が行う。
CI リソース節約のため「push 前 review」設計を採用している。Implement フェーズではローカルブランチにコミットのみ積み、Review が全通過した後にはじめて push・PR 作成を行う。Review が収束失敗した場合は push も PR も作らないため、CI が一切起動しない。push(PR 作成時・Merge ループの fix 後の再 push)の直前には必ず base ブランチを取り込む(git fetch → git merge)。並列ラン(parallel >= 2)で兄弟イシューの PR が先にマージされていると、作成時点の base が既に古くコンフリクトしている場合があり、その状態のまま push すると GitHub は test merge commit を作れず pull_request トリガーの CI check-run が 1 件も発行されない(Issue #435)ため、push 前ゲートで解消を試みてから push する(解消不能なら push 自体を止める)。さらに push 直後(PR 作成時・fix の再 push 時)には、push した head にチェックが発行されたか(check-run の `total_count` + combined status の `statuses` 件数の合計。gh pr checks / merge-exec と同じ集計定義。commit status のみを発行する CI で 0 件と誤判定しないため。Issue #480)と mergeable を有界(30 秒間隔・最大 5 分)で確認し、checksStarted / mergeableAfterPush として返す(Issue #479。push 前ゲート通過後に兄弟 PR がマージされて base が動いたケースを、監視ラウンドを消費する前に捕捉する)。mergeableAfterPush: CONFLICTING を受けたホストは monitor を 1 ラウンドも起動せずに base 取り込み(baseMergeCount で有界)へ直行する。両値はエージェントの自己申告でありマージ判定には使わない(分岐ヒントと状態ファイルへの記録専用。_/issue-trees/<n>.json の pushChecksStarted / pushMergeable)。
末端の実装イシューは post-order DFS の順序を優先度として空きスロットへ貪欲投入し、最大 parallel(既定 3)件まで並列実行する。各 implement / fix は独立した git worktree で隔離実行されるため、並列でもブランチ・working copy が衝突しない。機能的依存(dependsOn)と親子関係(親は全子の完了を待つ verify-close)だけが待機条件となる。
前提条件
ghCLI がインストールされ、認証済みであること(gh auth statusで確認)jqCLI がインストールされていること(command -v jqで確認)。「全チェックが pass に見えるのにマージが進まない場合(cancel された run の残存 check)」節の人間の診断専用コマンド (B) はgh api --paginate --slurpの生 JSON を外部のjqへパイプして平坦化・集約するため、gh --jqだけでは代替できない。未導入の場合はそのコマンドを実行せず(rerun もせず)blockedとして扱うawkCLI がインストールされていること(command -v awkで確認)。同節のエージェント実行可能コマンド (A) は--jqがページ単位にしか適用できないため、ページ跨ぎの重複を集約する際にシェル側awkへ依存する。未導入の場合はそのコマンドを実行せずUNDETERMINED(判定不能)として扱う- git working tree が clean であること(
git statusで確認) - マージ先ブランチが CI green の状態であること(
autoMerge運用ではランの完了後にも確認する。後述の strict = false 前提により、古い base に対して成功したチェックのままマージされ得るため)。この確認はマージ先ブランチへの push で CI が起動することに依存する。push トリガの workflow が無い、またはpathsフィルタで該当 head では起動しないリポジトリでは前提確認・完了後確認のいずれも検証不能であり、autoMerge: trueは非推奨とする。成立可否の確認手順(対象(マージ先)ブランチを検査するプローブ。branch未指定時のみ既定ブランチへフォールバック)と不成立時の扱いは references/automerge-design.md の「補償策の成立確認(base CI プローブ)」節を参照 - (
autoMerge: trueで使う場合)ベースブランチの ruleset で required status checks の strict(マージ前の base 最新化必須 = `strict_required_status_checks_policy`)を `false` にしていること。trueだと 1 件マージするたびに他の open PR の base が陳腐化し、並列ラン(parallel >= 2)が収束しない。G0 は strict を要件にしないためfalseでも自動マージは成立する(references/automerge-design.md の「strict を G0 の要件にしない理由」節) - 対象リポジトリへの書き込み権限があること
- 親イシューと子イシューが GitHub の sub-issues API で紐付いていること(紐付けは
create-issue/create-issue-treeを参照)
使い方
Workflow ツールで scriptPath にこのスキルディレクトリ内の scripts/implement-issue-tree.js を指定して起動する。パスは導入形態で異なり、後述の merge-guard hook のパスと同じ導入形態なら同じルート配下にある(js と hook は必ず同一のスキルディレクトリに同居する)。3 レイアウト:
- upstream `skills/` レイアウト(本リポジトリ
Fandhe-AI/agent-cli-skillsのソース):skills/implement-issue-tree/scripts/implement-issue-tree.js - `.agents/skills/` に vendored(
npx skills add Fandhe-AI/agent-cli-skillsで導入した downstream リポジトリ):.agents/skills/implement-issue-tree/scripts/implement-issue-tree.js - `.claude/skills/` symlink 経由(本リポジトリが内部参照に使うレイアウト。実体は
skills/を指す symlink):.claude/skills/implement-issue-tree/scripts/implement-issue-tree.js
{
"scriptPath": "<このスキルディレクトリ>/scripts/implement-issue-tree.js",
"args": {
"parent": "<親イシュー番号>",
"branch": "<マージ先ブランチ(省略時 main)>",
"parallel": "<並列度 1〜8(省略時 3)>",
"phaseGate": "<boolean。true でルート直下の子(Phase 親 or leaf)を sub-issues リスト順(siblingIndex)に直列化し、前 Phase の全子孫が merged/closed になるまで次 Phase 配下のノードに着手しない(opt-in。Issue #494)。既定 false は現行動作(post-order 優先度のみ・追い越しあり)を完全に維持する。boolean 以外はエラーで停止>",
"externalChecks": "<外部チェック App と信頼済み required check context の組の配列(例: [{\"app\": \"cursor\", \"context\": \"Cursor Bugbot\"}]。使用しない場合は []。slug 文字列のみの旧形式も受理するが、context 未宣言のためクライアント側自動マージは fail-closed で停止する)>",
"autoMerge": "<boolean。true + externalChecks 明示(確定。全 App の信頼済み context 宣言込み)でクライアント側 squash merge を実行する(opt-in。references/automerge-design.md の「クライアント側自動マージの設計」節参照)。既定 false / externalChecks 未確定時はマージ可能状態で停止し、マージは GitHub 上で人間が行うか、サーバー側 auto-merge workflow(upstream の docs/implement-issue-tree/auto-merge-sample.yml)+ branch protection に委ねる>",
"maxResidualWorktrees": "<残置 worktree 総数の上限(0 以上の整数。省略時 100、0 でこの軸のみ上限なし)>",
"maxResidualWorktreeBytes": "<残置 worktree ディスク使用量の上限(バイト。0 以上の整数。省略時 53687091200 = 50 GiB、0 でこの軸のみ上限なし。件数軸とは独立、Issue #348)>",
"maxBaseMerges": "<PR が base とコンフリクト(mergeable: CONFLICTING)した際の自動 base 取り込みの回数上限(0〜10 の整数。省略時 3、0 で自動 base 取り込みを無効化しコンフリクトを即 blocked にする)。fixCount とは独立の予算軸(Issue #441)>",
"repo": "<対象リポジトリの owner/repo(例: \"Fandhe-AI/agent-cli-skills\")。base 取り込み(maxBaseMerges > 0)の worktree routing ガードが期待する owner/repo として使うホスト側明示宣言。未指定時は base 取り込みの自動起動が無効化され、コンフリクトは blocked+quality で終端する(PR #443 codex P0: エージェント自己申告値は信頼境界に使わない)>"
}
}例: 親イシュー #42 の配下を main へ、並列度 3・Cursor Bugbot 導入済みで実行する場合(マージ可能状態まで自動で進み、マージは GitHub 上で人間が行う):
{
"scriptPath": ".claude/skills/implement-issue-tree/scripts/implement-issue-tree.js",
"args": { "parent": 42, "branch": "main", "parallel": 3, "externalChecks": [{"app": "cursor", "context": "Cursor Bugbot"}] }
}引数
| 引数 | 必須 | 既定 | 説明 |
|---|---|---|---|
parent | 必須 | — | 親(ルート)イシュー番号。issue でも可 |
branch | 任意 | main | マージ先ブランチ。不正な文字を含む場合はエラー |
parallel | 任意 | 3 | 並列実行数(1〜8)。1 を指定すると実質的に直列実行になる |
phaseGate | 任意 | false | `true` でルート(`args.parent`)直下の子(Phase 親 or leaf)を sub-issues リスト順(`siblingIndex`。タイトルの `feat(phase-N):` 等は非信頼データのため解析しない)に直列化する opt-in ゲート(Issue #494)。直列化の単位は「ルート直下の子とその子孫全部(部分木)」で、単位 Uₖ(k≥1)の部分木は、それより手前の全単位 U₀…U_{k-1} の前提(子を持つ Phase 親なら自身を除く子孫全部、子を持たない leaf なら自身)がすべて merged/closed になるまで着手しない(Phase 親自身の verify-close 完了は前提に含めない設計。「前 Phase 親の全子が merged/closed」という要件に合わせるため)。新しいスケジューラ状態は作らず、既存の依存グラフ(depsMap)へ合成辺を追加するだけなので、dispatch ループ・前提プローブ(ラン中の人手マージ検知)・前回ランで作成済みの次 Phase PR の monitoring 再開にもそのままゲートが効く(同一引数での再実行でも次 Phase の PR は前 Phase 完了までマージされない)。ゲート辺は循環除去で削除されない(本文由来の逆向き dependsOn の方が無視される)。autoMerge: false では前 Phase の PR がマージ可能状態のまま blocked で停止するため、次 Phase へ進めるには人手マージ後の前提プローブ検知、または再実行を要する。parent に Phase 親そのものを渡した場合はその直下の子が直列化される(仕様上は動くが、ルート〔トラッキング issue〕への指定を推奨)。従来の「Phase ごとに別ランを直列起動する」回避策は不要になる(verify-close がルートまで伝播する)。boolean 以外はエラーで停止(誤記を黙って読み替えない) |
externalChecks | 任意 | 未指定 | GitHub Actions 以外の外部チェック宣言の配列(最大 10 件)。要素は {"app": "<slug>", "context": "<required check context>"} の組で宣言する(slug は英小文字・数字・ハイフン。複数 context は contexts 配列。slug 文字列のみの旧形式も受理するが context 未宣言としてクライアント側自動マージは fail-closed で停止する)。未指定と `[]` は意味が異なる |
More from fandhe-ai
Use this skill in a project
Open any RiverX project, search the Skills panel for fandhe-ai/agent-cli-skills/implement-issue-tree, and install it in one click.
