بنقرة واحدة
simplify
TDD実装完了後のリファクタリングに使用。テストがGREENのまま、コードの重複除去・命名改善・構造簡素化を行う。実装者とは別のエージェントが担当する。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
TDD実装完了後のリファクタリングに使用。テストがGREENのまま、コードの重複除去・命名改善・構造簡素化を行う。実装者とは別のエージェントが担当する。
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
実装完了後のコードレビューに使用。仕様準拠・コード品質・セキュリティの3観点を並列レビューし、指摘を依存解決して修正する。
セッション完了後の振り返りに使用。ワークフロー遵守の検証、ユーザ指摘の収集と自己改善提案、改善後のリグレッション確認を行う。
ワークフローを開始する。ユースケースを選択し、適切なステップを順に実行する
設計確定後、実装前に使用。設計をタスクに分解し、実装順序と依存関係を明確にする。
大規模プロジェクト(複数機能・フェーズ分割が必要)で使用。全体をフェーズに分割し、マイルストーンとリスクを定義する。各フェーズは planning スキルに渡す。
機能開発・バグ修正の着手前に使用。メインセッションで人間パートナーと対話し、要件を構造化する。コード調査は Explore エージェントに委譲。
| name | simplify |
| description | TDD実装完了後のリファクタリングに使用。テストがGREENのまま、コードの重複除去・命名改善・構造簡素化を行う。実装者とは別のエージェントが担当する。 |
テストが GREEN のまま、コードを簡素化する。 実装者とは別のエージェントが担当する。実装者バイアス(自分のコードへの愛着)を排除するため。
入力: REQ パス(例: requirements/REQ-001/)+ テスト全 GREEN の実装コード + テストコード
出力: 簡素化された実装コード(テスト全 GREEN 維持)
原則: リファクタリングとは、外から見た振る舞いを変えずに、内部構造を改善すること。
テストが GREEN のまま簡素化せよ
テストが RED になった? リファクタではない。振る舞いを壊している。元に戻せ。
TDD 完了後に simplifier による簡素化を行う。
常に:
例外(人間パートナーに確認すること):
「リファクタは後でやる」→ 後でやるリファクタは永遠に来ない。今やれ。
digraph simplify {
rankdir=TB;
input [label="TDD完了\nテスト全GREEN", shape=ellipse];
snapshot [label="テスト結果の\nスナップショット取得", shape=box];
analyze [label="簡素化ポイントの\n分析・計画", shape=box, style=filled, fillcolor="#ccccff"];
apply [label="1つずつ適用\n→ テスト実行", shape=box, style=filled, fillcolor="#ccffcc"];
check [label="テスト\nGREEN?", shape=diamond];
revert [label="元に戻す\n原因分析", shape=box, style=filled, fillcolor="#ffcccc"];
more [label="次の\n簡素化あり?", shape=diamond];
done [label="簡素化完了\n報告", shape=ellipse];
input -> snapshot;
snapshot -> analyze;
analyze -> apply;
apply -> check;
check -> more [label="はい"];
check -> revert [label="いいえ"];
revert -> apply [label="再試行"];
more -> apply [label="あり"];
more -> done [label="なし"];
}
テストを実行し、現在の GREEN 状態を確認する。これがベースライン。 以降の全ステップで、この状態に戻せることを保証する。
以下の観点でコードを分析し、簡素化の計画を立てる。
| 観点 | やること | やらないこと |
|---|---|---|
| 重複除去 | 同じロジックの2箇所以上を共通化 | 似ているだけのコードを無理に共通化 |
| 命名改善 | 意図を正確に表す名前に変更 | 略語を全て正式名称にする(文脈で自明なら短くてよい) |
| 構造簡素化 | ネストを浅く、関数を短く | 1行関数への過剰な分割 |
| 不要コード除去 | 使われていないコード・import を削除 | 「念のため残す」コード |
| 抽象化の適正化 | 過剰な抽象化を解体 | 未来の要件のための抽象化を追加 |
3回ルール: 同じパターンが2回なら許容。3回目が出たら共通化を検討する。2回で共通化するのは早すぎる抽象化。
簡素化を1つ適用するたびにテストを実行する。
全ての簡素化が完了したら、変更内容を報告する。
| 言い訳 | 現実 |
|---|---|
| 「動いているから触るな」 | 動いているコードも読む人間がいる。読みやすさは機能 |
| 「リファクタする時間がない」 | リファクタしない時間の方が高くつく。技術的負債は複利で増える |
| 「テストを変えればGREENにできる」 | テストを変えた時点でリファクタではなく仕様変更。TDDに戻れ |
| 「全部書き直した方が早い」 | 書き直しはリファクタではない。既存テストが通る保証がない |
| 「この程度なら別にいい」 | 「この程度」が100箇所積み重なるのが技術的負債 |
| 「実装者が自分でリファクタすればいい」 | 実装者は自分のコードに愛着がある。別の目が必要 |
以下のどれかに当てはまったら、やり方を見直せ。
Before:
function handleCreateUser(req, res) {
// バリデーション
if (!req.body.name) { return res.status(400).json({error: 'name required'}); }
if (!req.body.email) { return res.status(400).json({error: 'email required'}); }
if (!req.body.password) { return res.status(400).json({error: 'password required'}); }
// ハッシュ化
const hash = await bcrypt.hash(req.body.password, 10);
// 保存
const user = await db.query('INSERT INTO users ...');
// レスポンス
return res.status(201).json({id: user.id, name: user.name, email: user.email});
}
分析:
After:
function validateRequired(body, fields) {
for (const field of fields) {
if (!body[field]) return { error: `${field} required` };
}
return null;
}
function handleCreateUser(req, res) {
const error = validateRequired(req.body, ['name', 'email', 'password']);
if (error) return res.status(400).json(error);
const user = await createUser(req.body);
return res.status(201).json(toUserResponse(user));
}
確認: テスト全 GREEN → 簡素化成功
簡素化完了前に確認:
| 問題 | 解決策 |
|---|---|
| リファクタするとテストが RED になる | 振る舞いを変えている。アプローチを変えろ。テストが正しい |
| どこを簡素化すべかわからない | 重複・長い関数・深いネストから探せ。なければ無理にやるな |
| 簡素化すると可読性が下がる | それは簡素化ではない。「短い」≠「シンプル」 |
| テストがなくて安全にリファクタできない | TDD に戻れ。テストを先に書いてからリファクタ |
あなたはこのスキルのプロセスを自分で実行しない。以下のエージェントにディスパッチする。
前提: 対応する REQ を特定する。 ディスパッチ前に、このタスクに対応する requirements/REQ-*/requirements.md を特定しろ。タスクのコンテキスト(plan、直前のステップの出力)に REQ パスが含まれていればそれを使う。見つからなければ requirements/ を確認し、候補を人間パートナーに AskUserQuestion で提示して選択してもらう。推測で REQ を決めるな。必ず人間に確認しろ。
メタループ駆動の場合の例外: requirements/ が存在しない環境(workspace/ec-sample 等)では、progress.txt のストーリー定義を requirements の代替として使用する。
test-runner エージェントをディスパッチしてベースライン取得
simplifier エージェントをディスパッチする
simplifier が簡素化ポイントの分析 → 1つずつ適用 → テスト実行を繰り返すsimplifier は完了時に 4ステータス(DONE / DONE_WITH_CONCERNS / NEEDS_CONTEXT / BLOCKED)で報告するtest-runner エージェントをディスパッチして最終確認
あなたが結果を判断する
前提スキル:
必須ルール:
次のステップ:
このスキルを使うスキル: