一键导入
manage-board
Board の作成・読み込み・状態遷移・Gate 評価・history 追記・アーカイブを手順化する。オーケストレーターが Board 操作時に参照するスキル。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Board の作成・読み込み・状態遷移・Gate 評価・history 追記・アーカイブを手順化する。オーケストレーターが Board 操作時に参照するスキル。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
要求分析・影響分析を並列実行し、実行計画を策定する。Feature の計画フェーズを単独で実行したいときに使用する。
既存プロジェクトへ .github/ を移植した際に、プロジェクト全体の評価(構造解析・テスト状況・コード品質・ドキュメント・DevOps)を実施する。assessor エージェントまたは /assess プロンプトから参照される。
エージェントのモデルを変更する(個別・一括・デフォルトに戻す)。エージェントのモデル変更が必要なときに使用する。
新規プロジェクトに .github/ を導入した際の初期設定を行う。settings.json の作成とプロジェクト固有値の設定を対話的にガイドする。
Feature の開発フロー全体のオーケストレーション手順。Board を使ったエージェント呼び出し・Gate 評価・状態遷移の具体的手順を定義する。オーケストレーターがワークフロー実行時に参照するスキル。
現在の変更に対してコードレビューを実行する。変更のレビューが必要なときに使用する。
| name | manage-board |
| description | Board の作成・読み込み・状態遷移・Gate 評価・history 追記・アーカイブを手順化する。オーケストレーターが Board 操作時に参照するスキル。 |
.github/settings.json からプロジェクト設定を読み取る.github/board.schema.json.github/rules/gate-profiles.json.github/rules/workflow-state.md| 状況 | パス |
|---|---|
| アクティブ Board | .copilot/boards/<feature-id>/board.json |
| アーカイブ Board | .copilot/boards/_archived/<feature-id>/board.json |
$schemaフィールド: 省略可。記載する場合はリポジトリルートからの相対パスで../../.github/board.schema.jsonのように参照する。worktree の深さに依存する パス(../../../../../...)は使わない。省略が推奨。
Board JSON を編集した後は、毎回以下のバリデーションを実行する。 これは旧 PostToolUse Hook が自動実行していたスキーマ検証を、手続きとして明示化したものである。
| # | 項目 | 有効な値 |
|---|---|---|
| 1 | flow_state | initialized, analyzing, designing, planned, implementing, testing, reviewing, approved, documenting, submitting, completed |
| 2 | gates.*.status | not_reached, passed, skipped, blocked, pending |
| 3 | maturity | experimental, development, stable, release-ready, sandbox, abandoned |
| 4 | gate_profile | maturity と同値であること |
| 5 | updated_at | 直前の操作時刻に更新されていること |
| 6 | history | 最新エントリが直前の操作と整合していること |
view で再読み込みするhistory に修正エントリを追記するWhy: 旧 post_tool_use Hook が Board 編集のたびに自動バリデーションを実行していた。 How: Board への書き込み操作のたびにこのチェックを実行することで、不正な状態を早期に検出する。
Feature 開始時に Board を作成する。
{
"schema_version": 1,
"feature_id": "<feature-id>",
"maturity": "<ユーザーに確認。デフォルト: experimental>",
"cycle": 1,
"flow_state": "initialized",
"gate_profile": "<maturity と同値>",
"gates": {
"analysis": { "status": "not_reached" },
"design": { "status": "not_reached" },
"plan": { "status": "not_reached" },
"implementation": { "status": "not_reached" },
"test": { "status": "not_reached" },
"review": { "status": "not_reached" },
"documentation": { "status": "not_reached" },
"submit": { "status": "not_reached" }
},
"artifacts": {
"requirements": null,
"impact_analysis": null,
"architecture_decision": null,
"execution_plan": null,
"implementation": null,
"test_design": null,
"test_results": null,
"test_verification": null,
"review_findings": null,
"documentation": null
},
"history": [
{
"timestamp": "<ISO 8601>",
"cycle": 1,
"agent": "orchestrator",
"action": "board_created",
"details": { "feature_id": "<feature-id>", "maturity": "<maturity>" }
}
],
"created_at": "<ISO 8601>",
"updated_at": "<ISO 8601>"
}
状態遷移時に以下を必ず行う:
passed または skipped であることを確認flow_state を新しい状態に更新updated_at を現在時刻に更新history にエントリを追記(手順 5 を使用){
"timestamp": "<ISO 8601>",
"cycle": "<現在のcycle>",
"agent": "orchestrator",
"action": "flow_state_changed",
"details": { "from": "<旧状態>", "to": "<新状態>" }
}
エージェントの出力を Board に反映する:
artifacts.<セクション> に書き込むupdated_at を現在時刻に更新history にエントリを追記{
"timestamp": "<ISO 8601>",
"cycle": "<現在のcycle>",
"agent": "<エージェント名>",
"action": "artifact_updated",
"details": { "artifact": "<セクション名>", "summary": "<概要>" }
}
Gate 条件を gate-profiles.json から読み取り、評価する:
gate_profile の値で gate-profiles.json の該当プロファイルを取得required フィールドを確認:
false → Gate を skipped にし、次へ進むtrue → 該当エージェントを呼び出し、結果で評価"on_escalation" → エスカレーション評価条件(後述)を判定"blocked" → Gate を blocked にし、遷移を構造的に禁止する。sandbox の場合は approved で作業終了しクリーンアップへtest_gate: pass_rate と coverage_min を artifacts.test_results と比較。
さらに regression_required: true(gate-profiles.json)の場合は artifacts.test_results.regression が存在し { "executed": true, "passed": true } であることを確認する。回帰テスト範囲: cycle >= 2 では前サイクルの修正項目 + affected_files 関連テスト。cycle: 1(初回)では affected_files 関連テストのみを対象とする。review_gate: verdict が lgtm であることgates.<name> を更新:{
"status": "passed",
"required": true,
"evaluated_by": "<エージェント名>",
"timestamp": "<ISO 8601>"
}
history に gate_evaluated エントリを追記required: "on_escalation" の Gate は以下の条件で必須化される:
| Gate | 条件 | 参照フィールド |
|---|---|---|
design_gate(development) | artifacts.impact_analysis.escalation.required == true | planner の影響分析結果 |
design_gate(stable) | 上記 OR artifacts.impact_analysis.affected_files が 2 件以上 | planner の影響分析結果 |
design_gate(sandbox) | artifacts.impact_analysis.escalation.required == true | planner の影響分析結果(development と同条件) |
判定手順:
artifacts.impact_analysis を読み取るrequired: true として処理(architect を呼び出す)skipped にして次へ進むすべての Board 操作で以下のパターンで history に追記する:
history.push({
"timestamp": new Date().toISOString(),
"cycle": board.cycle,
"agent": "<操作者>",
"action": "<操作種別>",
"details": { ... }
})
board.updated_at = new Date().toISOString()
使用可能な action 値:
board_created — Board 初期化時cycle_started — サイクル開始時flow_state_changed — 状態遷移時gate_evaluated — Gate 評価時artifact_updated — 成果物更新時maturity_changed — Maturity 変更時board_archived — アーカイブ時board_destroyed — sandbox Board 破棄時Feature を再開する場合:
cycle をインクリメントflow_state を initialized にリセットgates を全て { "status": "not_reached" } にリセットartifacts と history は保持(前サイクルのコンテキスト)history に cycle_started エントリを追記maturity を新しい値に更新gate_profile を新しい maturity と同値に更新maturity_history に遷移エントリを追記history に maturity_changed エントリを追記Feature 完了後:
.copilot/boards/_archived/<feature-id>/board.json に移動history に board_archived エントリを追記してから移動.copilot/boards/<feature-id>/ を削除# ディレクトリ作成
mkdir -p .copilot/boards/_archived/<feature-id>
# 移動
mv .copilot/boards/<feature-id>/board.json .copilot/boards/_archived/<feature-id>/board.json
# 空ディレクトリ削除
rmdir .copilot/boards/<feature-id>
sandbox(maturity: "sandbox")の作業終了後、Board をアーカイブせず削除する。
sandbox は main マージを構造的に禁止する検証専用のため、成果物を永続化しない。
maturity が "sandbox" であることflow_state が approved または reviewing(LGTM 後)であることhistory に board_destroyed エントリを追記(削除前の最終記録)_archived には移動しない){
"timestamp": "<ISO 8601>",
"cycle": "<現在のcycle>",
"agent": "orchestrator",
"action": "board_destroyed",
"details": {
"feature_id": "<feature-id>",
"reason": "sandbox 検証完了。main マージ対象外のため Board を破棄"
}
}
# Board ファイル削除
rm .copilot/boards/<feature-id>/board.json
rmdir .copilot/boards/<feature-id>
# worktree 削除
git worktree remove .worktrees/<feature-id>
# ローカルブランチ削除
git branch -D <branch-name>
# リモートブランチ削除(存在する場合)
git push origin --delete <branch-name> 2>/dev/null || true
注意:
board_destroyedの history エントリは Board 削除と共に消失する。 これは意図的な設計 — sandbox の痕跡を残さないことが目的。 検証で得た知見を残す必要がある場合は、削除前に別途メモを取ること。
CLI の SQL ツールを活用し、Board JSON のセッション内ミラーを SQL テーブルで維持する。 Board JSON が永続的な真実のソース(git 管理可能)、SQL がセッション内の高速クエリ・バリデーション層。
Board をセッション開始時に SQL にロードし、JSON 更新と同時に SQL も更新する。
-- Board のコア状態
CREATE TABLE board_state (
key TEXT PRIMARY KEY,
value TEXT NOT NULL
);
-- 初期ロード例:
-- INSERT INTO board_state VALUES ('feature_id', '<feature-id>');
-- INSERT INTO board_state VALUES ('maturity', 'development');
-- INSERT INTO board_state VALUES ('flow_state', 'initialized');
-- INSERT INTO board_state VALUES ('cycle', '1');
-- INSERT INTO board_state VALUES ('gate_profile', 'development');
-- Gate 状態の個別追跡
CREATE TABLE gates (
name TEXT PRIMARY KEY,
status TEXT NOT NULL DEFAULT 'not_reached',
required TEXT,
evaluated_by TEXT,
timestamp TEXT
);
-- 初期ロード例:
-- INSERT INTO gates VALUES ('analysis', 'not_reached', NULL, NULL, NULL);
-- INSERT INTO gates VALUES ('design', 'not_reached', NULL, NULL, NULL);
-- ... 全8 Gate
-- Artifact 状態サマリ(JSON 本体は Board JSON に保持)
CREATE TABLE artifacts (
name TEXT PRIMARY KEY,
agent TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'empty',
summary TEXT,
timestamp TEXT
);
-- 初期ロード例:
-- INSERT INTO artifacts VALUES ('requirements', 'analyst', 'empty', NULL, NULL);
-- INSERT INTO artifacts VALUES ('impact_analysis', 'impact-analyst', 'empty', NULL, NULL);
-- INSERT INTO artifacts VALUES ('architecture_decision', 'architect', 'empty', NULL, NULL);
-- INSERT INTO artifacts VALUES ('execution_plan', 'planner', 'empty', NULL, NULL);
-- INSERT INTO artifacts VALUES ('implementation', 'developer', 'empty', NULL, NULL);
-- INSERT INTO artifacts VALUES ('test_design', 'test-designer', 'empty', NULL, NULL);
-- INSERT INTO artifacts VALUES ('test_results', 'developer', 'empty', NULL, NULL);
-- INSERT INTO artifacts VALUES ('test_verification', 'test-verifier', 'empty', NULL, NULL);
-- INSERT INTO artifacts VALUES ('review_findings', 'reviewer', 'empty', NULL, NULL);
-- INSERT INTO artifacts VALUES ('documentation', 'writer', 'empty', NULL, NULL);
-- 操作履歴(Board JSON の history 配列のミラー)
CREATE TABLE board_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL,
cycle INTEGER NOT NULL,
agent TEXT,
action TEXT NOT NULL,
details TEXT
);
Board 初期化時または既存 Board のセッション開始時に実行:
view で読み取るCREATE TABLE IF NOT EXISTS で作成Board JSON 書き込み後のバリデーションを SQL で高速化:
-- flow_state の有効性チェック
SELECT CASE
WHEN value IN ('initialized','analyzing','designing','planned','implementing',
'testing','reviewing','approved','documenting','submitting','completed')
THEN 'valid' ELSE 'INVALID: ' || value
END AS check_result
FROM board_state WHERE key = 'flow_state';
-- gate_profile と maturity の一致チェック
SELECT CASE
WHEN bs1.value = bs2.value THEN 'valid'
ELSE 'MISMATCH: maturity=' || bs1.value || ' gate_profile=' || bs2.value
END AS check_result
FROM board_state bs1, board_state bs2
WHERE bs1.key = 'maturity' AND bs2.key = 'gate_profile';
-- 次に評価すべき Gate を特定
SELECT name, status FROM gates WHERE status = 'not_reached' LIMIT 1;
-- Gate 評価の進捗サマリ
SELECT status, COUNT(*) as count FROM gates GROUP BY status;
planner の実行計画を SQL の todos テーブルにロードし、進捗を追跡する:
-- execution_plan のタスクを todos にロード
INSERT INTO todos (id, title, description, status) VALUES
('task-1', '<タスク説明>', '<agent>: <詳細>', 'pending'),
('task-2', '<タスク説明>', '<agent>: <詳細>', 'pending');
-- 依存関係を todo_deps にロード
INSERT INTO todo_deps (todo_id, depends_on) VALUES ('task-2', 'task-1');
-- 実行可能なタスクを取得(依存が全て done)
SELECT t.* FROM todos t
WHERE t.status = 'pending'
AND NOT EXISTS (
SELECT 1 FROM todo_deps td
JOIN todos dep ON td.depends_on = dep.id
WHERE td.todo_id = t.id AND dep.status != 'done'
);
最低限、以下のタイミングで history に追記する:
board_created)gate_evaluated)flow_state_changed)board_archived)以下は Maturity が experimental の場合に省略可能:
artifact_updated(成果物ごとの記録)flow_state_changed(スキップした状態の記録)Maturity が experimental の場合、SQL ミラーの維持は省略可能。
Board JSON のみで運用し、SQL は必要に応じて参照クエリのみ使用する。