From b5eef8d3fa707757ca563d2096f357d39614122a Mon Sep 17 00:00:00 2001 From: nrs <38722970+nrslib@users.noreply.github.com> Date: Mon, 9 Feb 2026 00:25:53 +0900 Subject: [PATCH] takt: desu-koremadee2etesuto-tesuto (#150) --- builtins/en/piece-categories.yaml | 3 + builtins/en/pieces/structural-reform.yaml | 455 ++++++++++++++++++++++ builtins/ja/piece-categories.yaml | 12 +- builtins/ja/pieces/structural-reform.yaml | 455 ++++++++++++++++++++++ src/__tests__/facet-resolution.test.ts | 15 + src/__tests__/it-piece-loader.test.ts | 135 ++++++- 6 files changed, 1070 insertions(+), 5 deletions(-) create mode 100644 builtins/en/pieces/structural-reform.yaml create mode 100644 builtins/ja/pieces/structural-reform.yaml diff --git a/builtins/en/piece-categories.yaml b/builtins/en/piece-categories.yaml index 54bd219..6c0b750 100644 --- a/builtins/en/piece-categories.yaml +++ b/builtins/en/piece-categories.yaml @@ -17,6 +17,9 @@ piece_categories: pieces: - expert - expert-cqrs + Refactoring: + pieces: + - structural-reform 🔀 Hybrid (Codex Coding): 🚀 Quick Start: pieces: diff --git a/builtins/en/pieces/structural-reform.yaml b/builtins/en/pieces/structural-reform.yaml new file mode 100644 index 0000000..07f8abc --- /dev/null +++ b/builtins/en/pieces/structural-reform.yaml @@ -0,0 +1,455 @@ +name: structural-reform +description: Full project review and structural reform - iterative codebase restructuring with staged file splits +max_iterations: 50 +policies: + coding: ../policies/coding.md + review: ../policies/review.md + testing: ../policies/testing.md + qa: ../policies/qa.md +knowledge: + backend: ../knowledge/backend.md + architecture: ../knowledge/architecture.md +personas: + planner: ../personas/planner.md + coder: ../personas/coder.md + architecture-reviewer: ../personas/architecture-reviewer.md + qa-reviewer: ../personas/qa-reviewer.md + supervisor: ../personas/supervisor.md +instructions: + implement: ../instructions/implement.md + review-arch: ../instructions/review-arch.md + review-qa: ../instructions/review-qa.md + fix: ../instructions/fix.md +initial_movement: review +loop_monitors: + - cycle: + - implement + - fix + threshold: 3 + judge: + persona: supervisor + instruction_template: | + The implement -> reviewers -> fix loop has repeated {cycle_count} times for the current reform target. + + Review the reports from each cycle and determine whether this loop + is making progress or repeating the same issues. + + **Reports to reference:** + - Architect review: {report:04-architect-review.md} + - QA review: {report:05-qa-review.md} + + **Judgment criteria:** + - Are review findings being addressed in each fix cycle? + - Are the same issues recurring without resolution? + - Is the implementation converging toward approval? + rules: + - condition: Healthy (making progress toward approval) + next: implement + - condition: Unproductive (same issues recurring, no convergence) + next: next_target +movements: + - name: review + edit: false + persona: architecture-reviewer + policy: review + knowledge: + - architecture + - backend + allowed_tools: + - Read + - Glob + - Grep + - WebSearch + - WebFetch + instruction_template: | + ## Piece Status + - Iteration: {iteration}/{max_iterations} (piece-wide) + - Movement Iteration: {movement_iteration} (times this movement has run) + - Movement: review (full project review) + + ## User Request + {task} + + ## Instructions + Conduct a comprehensive structural review of the entire project codebase. + + **Focus areas:** + 1. **God Classes/Functions**: Files exceeding 300 lines, classes with multiple responsibilities + 2. **Coupling**: Circular dependencies, tight coupling between modules + 3. **Cohesion**: Low-cohesion modules mixing unrelated concerns + 4. **Testability**: Untestable code due to tight coupling or side effects + 5. **Layer violations**: Wrong dependency directions, domain logic in adapters + 6. **DRY violations**: Duplicated logic across 3+ locations + + **For each issue found, report:** + - File path and line count + - Problem category (God Class, Low Cohesion, etc.) + - Severity (Critical / High / Medium) + - Specific responsibilities that should be separated + - Dependencies that would be affected by splitting + + **Output format:** + + ```markdown + # Full Project Structural Review + + ## Summary + - Total files reviewed: N + - Issues found: N (Critical: N, High: N, Medium: N) + + ## Critical Issues + + ### 1. {File path} ({line count} lines) + - **Problem**: {category} + - **Severity**: Critical + - **Responsibilities found**: + 1. {responsibility 1} + 2. {responsibility 2} + - **Proposed split**: + - `{new-file-1}.ts`: {responsibility} + - `{new-file-2}.ts`: {responsibility} + - **Affected dependents**: {files that import this module} + + ## High Priority Issues + ... + + ## Medium Priority Issues + ... + + ## Dependency Graph Concerns + - {circular dependencies, layering violations} + + ## Recommended Reform Order + 1. {file} - {reason for priority} + 2. {file} - {reason for priority} + ``` + rules: + - condition: Full review is complete with findings + next: plan_reform + - condition: No structural issues found + next: COMPLETE + output_contracts: + report: + - name: 00-full-review.md + + - name: plan_reform + edit: false + persona: planner + knowledge: architecture + allowed_tools: + - Read + - Glob + - Grep + - Bash + - WebSearch + - WebFetch + instruction_template: | + ## Piece Status + - Iteration: {iteration}/{max_iterations} (piece-wide) + - Movement Iteration: {movement_iteration} (times this movement has run) + - Movement: plan_reform (reform plan creation) + + ## User Request + {task} + + ## Full Review Results + {previous_response} + + ## Additional User Inputs + {user_inputs} + + ## Instructions + Based on the full review results, create a concrete reform execution plan. + + **Planning principles:** + - One file split per iteration (keep changes manageable) + - Order by dependency: split leaf nodes first, then work inward + - Each split must leave tests and build passing + - No backward compatibility concerns (per user instruction) + + **For each reform target, specify:** + 1. Target file and current line count + 2. Proposed new files with responsibilities + 3. Expected changes to imports in dependent files + 4. Test strategy (new tests needed, existing tests to update) + 5. Risk assessment (what could break) + + **Output format:** + + ```markdown + # Structural Reform Plan + + ## Reform Targets (ordered by execution priority) + + ### Target 1: {file path} + - **Current state**: {line count} lines, {N} responsibilities + - **Proposed split**: + | New file | Responsibility | Estimated lines | + |----------|---------------|-----------------| + | `{path}` | {responsibility} | ~{N} | + - **Dependent files**: {list of files that import this} + - **Test plan**: {what tests to add/update} + - **Risk**: {Low/Medium/High} - {description} + + ### Target 2: {file path} + ... + + ## Execution Order Rationale + {Why this order minimizes risk and dependency conflicts} + + ## Success Criteria + - All tests pass after each split + - Build succeeds after each split + - No file exceeds 300 lines + - Each file has single responsibility + ``` + rules: + - condition: Reform plan is complete and ready to execute + next: implement + - condition: No actionable reforms identified + next: COMPLETE + - condition: Requirements unclear, need user input + next: ABORT + appendix: | + Clarifications needed: + - {Question 1} + - {Question 2} + output_contracts: + report: + - name: 01-reform-plan.md + format: plan + + - name: implement + edit: true + persona: coder + policy: + - coding + - testing + session: refresh + knowledge: + - backend + - architecture + allowed_tools: + - Read + - Glob + - Grep + - Edit + - Write + - Bash + - WebSearch + - WebFetch + permission_mode: edit + instruction: implement + rules: + - condition: Implementation complete + next: reviewers + - condition: Cannot proceed, insufficient info + next: reviewers + - condition: User input required + next: implement + requires_user_input: true + interactive_only: true + output_contracts: + report: + - Scope: 02-coder-scope.md + - Decisions: 03-coder-decisions.md + + - name: reviewers + parallel: + - name: arch-review + edit: false + persona: architecture-reviewer + policy: review + knowledge: + - architecture + - backend + allowed_tools: + - Read + - Glob + - Grep + - WebSearch + - WebFetch + rules: + - condition: approved + - condition: needs_fix + instruction: review-arch + output_contracts: + report: + - name: 04-architect-review.md + format: architecture-review + - name: qa-review + edit: false + persona: qa-reviewer + policy: + - review + - qa + allowed_tools: + - Read + - Glob + - Grep + - WebSearch + - WebFetch + rules: + - condition: approved + - condition: needs_fix + instruction: review-qa + output_contracts: + report: + - name: 05-qa-review.md + format: qa-review + rules: + - condition: all("approved") + next: verify + - condition: any("needs_fix") + next: fix + + - name: fix + edit: true + persona: coder + policy: + - coding + - testing + knowledge: + - backend + - architecture + allowed_tools: + - Read + - Glob + - Grep + - Edit + - Write + - Bash + - WebSearch + - WebFetch + permission_mode: edit + rules: + - condition: Fix complete + next: reviewers + - condition: Cannot proceed, insufficient info + next: plan_reform + instruction: fix + + - name: verify + edit: false + persona: supervisor + policy: review + allowed_tools: + - Read + - Glob + - Grep + - Bash + - WebSearch + - WebFetch + instruction_template: | + ## Piece Status + - Iteration: {iteration}/{max_iterations} (piece-wide) + - Movement Iteration: {movement_iteration} (times this movement has run) + - Movement: verify (build and test verification) + + ## Instructions + Verify that the current reform step has been completed successfully. + + **Verification checklist:** + 1. **Build**: Run the build command and confirm it passes + 2. **Tests**: Run the test suite and confirm all tests pass + 3. **File sizes**: Confirm no new file exceeds 300 lines + 4. **Single responsibility**: Confirm each new file has a clear, single purpose + 5. **Import consistency**: Confirm all imports are updated correctly + + **Report format:** + + ```markdown + # Verification Results + + ## Result: PASS / FAIL + + | Check | Status | Details | + |-------|--------|---------| + | Build | PASS/FAIL | {output summary} | + | Tests | PASS/FAIL | {N passed, N failed} | + | File sizes | PASS/FAIL | {any file > 300 lines} | + | Single responsibility | PASS/FAIL | {assessment} | + | Import consistency | PASS/FAIL | {any broken imports} | + + ## Issues (if FAIL) + 1. {issue description} + ``` + rules: + - condition: All verifications passed + next: next_target + - condition: Verification failed + next: fix + output_contracts: + report: + - name: 06-verification.md + format: validation + + - name: next_target + edit: false + persona: planner + knowledge: architecture + allowed_tools: + - Read + - Glob + - Grep + - Bash + - WebSearch + - WebFetch + instruction_template: | + ## Piece Status + - Iteration: {iteration}/{max_iterations} (piece-wide) + - Movement Iteration: {movement_iteration} (times this movement has run) + - Movement: next_target (progress check and next target selection) + + ## Original Reform Plan + {report:01-reform-plan.md} + + ## Latest Verification + {previous_response} + + ## Instructions + Assess the progress of the structural reform and determine the next action. + + **Steps:** + 1. Review the reform plan and identify which targets have been completed + 2. Check the current codebase state against the plan + 3. Determine if there are remaining reform targets + + **Output format:** + + ```markdown + # Reform Progress + + ## Completed Targets + | # | Target | Status | + |---|--------|--------| + | 1 | {file} | Completed | + | 2 | {file} | Completed | + + ## Remaining Targets + | # | Target | Priority | + |---|--------|----------| + | 3 | {file} | Next | + | 4 | {file} | Pending | + + ## Next Action + - **Target**: {next file to reform} + - **Plan**: {brief description of the split} + + ## Overall Progress + {N}/{total} targets completed. Estimated remaining iterations: {N} + ``` + rules: + - condition: More reform targets remain + next: implement + - condition: All reform targets completed + next: COMPLETE + output_contracts: + report: + - name: 07-progress.md +report_formats: + plan: ../output-contracts/plan.md + architecture-review: ../output-contracts/architecture-review.md + qa-review: ../output-contracts/qa-review.md + validation: ../output-contracts/validation.md + summary: ../output-contracts/summary.md diff --git a/builtins/ja/piece-categories.yaml b/builtins/ja/piece-categories.yaml index 94263bb..72ed02e 100644 --- a/builtins/ja/piece-categories.yaml +++ b/builtins/ja/piece-categories.yaml @@ -12,10 +12,14 @@ piece_categories: - review-only 🎨 フロントエンド: {} ⚙️ バックエンド: {} - 🔧 フルスタック: - pieces: - - expert - - expert-cqrs + 🔧 エキスパート: + フルスタック: + pieces: + - expert + - expert-cqrs + リファクタリング: + pieces: + - structural-reform 🔀 ハイブリッド (Codex Coding): 🚀 クイックスタート: pieces: diff --git a/builtins/ja/pieces/structural-reform.yaml b/builtins/ja/pieces/structural-reform.yaml new file mode 100644 index 0000000..2445b6d --- /dev/null +++ b/builtins/ja/pieces/structural-reform.yaml @@ -0,0 +1,455 @@ +name: structural-reform +description: プロジェクト全体レビューと構造改革 - 段階的なファイル分割による反復的コードベース再構築 +max_iterations: 50 +policies: + coding: ../policies/coding.md + review: ../policies/review.md + testing: ../policies/testing.md + qa: ../policies/qa.md +knowledge: + backend: ../knowledge/backend.md + architecture: ../knowledge/architecture.md +personas: + planner: ../personas/planner.md + coder: ../personas/coder.md + architecture-reviewer: ../personas/architecture-reviewer.md + qa-reviewer: ../personas/qa-reviewer.md + supervisor: ../personas/supervisor.md +instructions: + implement: ../instructions/implement.md + review-arch: ../instructions/review-arch.md + review-qa: ../instructions/review-qa.md + fix: ../instructions/fix.md +initial_movement: review +loop_monitors: + - cycle: + - implement + - fix + threshold: 3 + judge: + persona: supervisor + instruction_template: | + implement → reviewers → fix のループが現在の改革ターゲットに対して {cycle_count} 回繰り返されました。 + + 各サイクルのレポートを確認し、このループが進捗しているか、 + 同じ問題を繰り返しているかを判断してください。 + + **参照するレポート:** + - アーキテクチャレビュー: {report:04-architect-review.md} + - QAレビュー: {report:05-qa-review.md} + + **判断基準:** + - 各修正サイクルでレビュー指摘が解消されているか + - 同じ問題が解決されずに繰り返されていないか + - 実装が承認に向かって収束しているか + rules: + - condition: 健全(承認に向けて進捗あり) + next: implement + - condition: 非生産的(同じ問題が繰り返され、収束なし) + next: next_target +movements: + - name: review + edit: false + persona: architecture-reviewer + policy: review + knowledge: + - architecture + - backend + allowed_tools: + - Read + - Glob + - Grep + - WebSearch + - WebFetch + instruction_template: | + ## ピースステータス + - イテレーション: {iteration}/{max_iterations}(ピース全体) + - ムーブメントイテレーション: {movement_iteration}(このムーブメントの実行回数) + - ムーブメント: review(プロジェクト全体レビュー) + + ## ユーザーリクエスト + {task} + + ## 指示 + プロジェクトのコードベース全体に対して、包括的な構造レビューを実施してください。 + + **重点領域:** + 1. **God Class/Function**: 300行を超えるファイル、複数の責務を持つクラス + 2. **結合度**: 循環依存、モジュール間の密結合 + 3. **凝集度**: 無関係な関心事が混在した低凝集モジュール + 4. **テスタビリティ**: 密結合や副作用によるテスト困難なコード + 5. **レイヤー違反**: 依存方向の誤り、アダプター層にドメインロジック + 6. **DRY違反**: 3箇所以上の重複ロジック + + **発見した問題ごとに報告:** + - ファイルパスと行数 + - 問題カテゴリ(God Class、低凝集など) + - 深刻度(Critical / High / Medium) + - 分離すべき具体的な責務 + - 分割により影響を受ける依存先 + + **出力フォーマット:** + + ```markdown + # プロジェクト全体構造レビュー + + ## サマリー + - レビュー対象ファイル数: N + - 検出された問題: N(Critical: N, High: N, Medium: N) + + ## Critical Issues + + ### 1. {ファイルパス}({行数}行) + - **問題**: {カテゴリ} + - **深刻度**: Critical + - **検出された責務**: + 1. {責務1} + 2. {責務2} + - **分割提案**: + - `{新ファイル1}.ts`: {責務} + - `{新ファイル2}.ts`: {責務} + - **影響を受ける依存先**: {このモジュールをインポートしているファイル} + + ## High Priority Issues + ... + + ## Medium Priority Issues + ... + + ## 依存グラフの懸念事項 + - {循環依存、レイヤー違反} + + ## 推奨改革順序 + 1. {ファイル} - {優先理由} + 2. {ファイル} - {優先理由} + ``` + rules: + - condition: 全体レビューが完了し、問題が検出された + next: plan_reform + - condition: 構造的な問題は見つからなかった + next: COMPLETE + output_contracts: + report: + - name: 00-full-review.md + + - name: plan_reform + edit: false + persona: planner + knowledge: architecture + allowed_tools: + - Read + - Glob + - Grep + - Bash + - WebSearch + - WebFetch + instruction_template: | + ## ピースステータス + - イテレーション: {iteration}/{max_iterations}(ピース全体) + - ムーブメントイテレーション: {movement_iteration}(このムーブメントの実行回数) + - ムーブメント: plan_reform(改革計画策定) + + ## ユーザーリクエスト + {task} + + ## 全体レビュー結果 + {previous_response} + + ## ユーザー追加入力 + {user_inputs} + + ## 指示 + 全体レビュー結果を基に、具体的な改革実行計画を策定してください。 + + **計画の原則:** + - 1イテレーションにつき1ファイルの分割(変更を管理可能に保つ) + - 依存順に実行:まずリーフノードを分割し、内側に向かって進む + - 各分割後にテストとビルドが通ること + - 後方互換は不要(ユーザー指示通り) + + **各改革ターゲットについて指定:** + 1. 対象ファイルと現在の行数 + 2. 提案する新ファイルと責務 + 3. 依存先ファイルのインポート変更予定 + 4. テスト戦略(新規テスト、既存テストの更新) + 5. リスク評価(何が壊れる可能性があるか) + + **出力フォーマット:** + + ```markdown + # 構造改革計画 + + ## 改革ターゲット(実行優先順) + + ### ターゲット1: {ファイルパス} + - **現状**: {行数}行、{N}個の責務 + - **分割提案**: + | 新ファイル | 責務 | 推定行数 | + |----------|------|---------| + | `{パス}` | {責務} | ~{N} | + - **依存先ファイル**: {このモジュールをインポートしているファイル一覧} + - **テスト計画**: {追加・更新すべきテスト} + - **リスク**: {Low/Medium/High} - {説明} + + ### ターゲット2: {ファイルパス} + ... + + ## 実行順序の根拠 + {この順序がリスクと依存関係の競合を最小化する理由} + + ## 成功基準 + - 各分割後に全テストが通る + - 各分割後にビルドが成功する + - 300行を超えるファイルがない + - 各ファイルが単一責務を持つ + ``` + rules: + - condition: 改革計画が完成し、実行可能な状態 + next: implement + - condition: 実行可能な改革が特定されなかった + next: COMPLETE + - condition: 要件が不明確、ユーザー入力が必要 + next: ABORT + appendix: | + 確認事項: + - {質問1} + - {質問2} + output_contracts: + report: + - name: 01-reform-plan.md + format: plan + + - name: implement + edit: true + persona: coder + policy: + - coding + - testing + session: refresh + knowledge: + - backend + - architecture + allowed_tools: + - Read + - Glob + - Grep + - Edit + - Write + - Bash + - WebSearch + - WebFetch + permission_mode: edit + instruction: implement + rules: + - condition: 実装完了 + next: reviewers + - condition: 判断できない、情報不足 + next: reviewers + - condition: ユーザー入力が必要 + next: implement + requires_user_input: true + interactive_only: true + output_contracts: + report: + - Scope: 02-coder-scope.md + - Decisions: 03-coder-decisions.md + + - name: reviewers + parallel: + - name: arch-review + edit: false + persona: architecture-reviewer + policy: review + knowledge: + - architecture + - backend + allowed_tools: + - Read + - Glob + - Grep + - WebSearch + - WebFetch + rules: + - condition: approved + - condition: needs_fix + instruction: review-arch + output_contracts: + report: + - name: 04-architect-review.md + format: architecture-review + - name: qa-review + edit: false + persona: qa-reviewer + policy: + - review + - qa + allowed_tools: + - Read + - Glob + - Grep + - WebSearch + - WebFetch + rules: + - condition: approved + - condition: needs_fix + instruction: review-qa + output_contracts: + report: + - name: 05-qa-review.md + format: qa-review + rules: + - condition: all("approved") + next: verify + - condition: any("needs_fix") + next: fix + + - name: fix + edit: true + persona: coder + policy: + - coding + - testing + knowledge: + - backend + - architecture + allowed_tools: + - Read + - Glob + - Grep + - Edit + - Write + - Bash + - WebSearch + - WebFetch + permission_mode: edit + rules: + - condition: 修正完了 + next: reviewers + - condition: 判断できない、情報不足 + next: plan_reform + instruction: fix + + - name: verify + edit: false + persona: supervisor + policy: review + allowed_tools: + - Read + - Glob + - Grep + - Bash + - WebSearch + - WebFetch + instruction_template: | + ## ピースステータス + - イテレーション: {iteration}/{max_iterations}(ピース全体) + - ムーブメントイテレーション: {movement_iteration}(このムーブメントの実行回数) + - ムーブメント: verify(ビルド・テスト検証) + + ## 指示 + 現在の改革ステップが正常に完了したことを検証してください。 + + **検証チェックリスト:** + 1. **ビルド**: ビルドコマンドを実行し、成功することを確認 + 2. **テスト**: テストスイートを実行し、全テストが通ることを確認 + 3. **ファイルサイズ**: 新しいファイルが300行を超えていないことを確認 + 4. **単一責務**: 各新ファイルが明確な単一の目的を持つことを確認 + 5. **インポート整合性**: すべてのインポートが正しく更新されていることを確認 + + **レポートフォーマット:** + + ```markdown + # 検証結果 + + ## 結果: PASS / FAIL + + | チェック項目 | 状態 | 詳細 | + |------------|------|------| + | ビルド | PASS/FAIL | {出力サマリー} | + | テスト | PASS/FAIL | {N passed, N failed} | + | ファイルサイズ | PASS/FAIL | {300行超のファイルの有無} | + | 単一責務 | PASS/FAIL | {評価} | + | インポート整合性 | PASS/FAIL | {壊れたインポートの有無} | + + ## 問題点(FAILの場合) + 1. {問題の説明} + ``` + rules: + - condition: すべての検証に合格 + next: next_target + - condition: 検証に失敗 + next: fix + output_contracts: + report: + - name: 06-verification.md + format: validation + + - name: next_target + edit: false + persona: planner + knowledge: architecture + allowed_tools: + - Read + - Glob + - Grep + - Bash + - WebSearch + - WebFetch + instruction_template: | + ## ピースステータス + - イテレーション: {iteration}/{max_iterations}(ピース全体) + - ムーブメントイテレーション: {movement_iteration}(このムーブメントの実行回数) + - ムーブメント: next_target(進捗確認と次ターゲット選択) + + ## 改革計画 + {report:01-reform-plan.md} + + ## 最新の検証結果 + {previous_response} + + ## 指示 + 構造改革の進捗を評価し、次のアクションを決定してください。 + + **手順:** + 1. 改革計画を確認し、完了したターゲットを特定 + 2. 現在のコードベースの状態を計画と照合 + 3. 残りの改革ターゲットがあるか判断 + + **出力フォーマット:** + + ```markdown + # 改革進捗 + + ## 完了ターゲット + | # | ターゲット | 状態 | + |---|----------|------| + | 1 | {ファイル} | 完了 | + | 2 | {ファイル} | 完了 | + + ## 残りターゲット + | # | ターゲット | 優先度 | + |---|----------|-------| + | 3 | {ファイル} | 次 | + | 4 | {ファイル} | 保留 | + + ## 次のアクション + - **ターゲット**: {次に改革するファイル} + - **計画**: {分割の概要} + + ## 全体進捗 + {N}/{合計}ターゲット完了。残りの推定イテレーション数: {N} + ``` + rules: + - condition: まだ改革ターゲットが残っている + next: implement + - condition: すべての改革ターゲットが完了 + next: COMPLETE + output_contracts: + report: + - name: 07-progress.md +report_formats: + plan: ../output-contracts/plan.md + architecture-review: ../output-contracts/architecture-review.md + qa-review: ../output-contracts/qa-review.md + validation: ../output-contracts/validation.md + summary: ../output-contracts/summary.md diff --git a/src/__tests__/facet-resolution.test.ts b/src/__tests__/facet-resolution.test.ts index c863338..3070ecc 100644 --- a/src/__tests__/facet-resolution.test.ts +++ b/src/__tests__/facet-resolution.test.ts @@ -158,6 +158,21 @@ describe('resolveRefToContent with layer resolution', () => { // No context, no file — returns the spec as-is (inline content behavior) expect(content).toBe('some-name'); }); + + it('should fall back to resolveResourceContent when facet not found with context', () => { + // Given: facetType and context provided, but no matching facet file exists + // When: resolveRefToContent is called with a name that has no facet file + const content = resolveRefToContent( + 'nonexistent-facet-xyz', + undefined, + tempDir, + 'policies', + context, + ); + + // Then: falls back to resolveResourceContent, which returns the ref as inline content + expect(content).toBe('nonexistent-facet-xyz'); + }); }); describe('resolveRefList with layer resolution', () => { diff --git a/src/__tests__/it-piece-loader.test.ts b/src/__tests__/it-piece-loader.test.ts index 53b7efa..edbd725 100644 --- a/src/__tests__/it-piece-loader.test.ts +++ b/src/__tests__/it-piece-loader.test.ts @@ -45,7 +45,7 @@ describe('Piece Loader IT: builtin piece loading', () => { rmSync(testDir, { recursive: true, force: true }); }); - const builtinNames = ['default', 'minimal', 'expert', 'expert-cqrs', 'research', 'magi', 'review-only', 'review-fix-minimal']; + const builtinNames = ['default', 'minimal', 'expert', 'expert-cqrs', 'coding', 'passthrough', 'compound-eye', 'research', 'magi', 'review-only', 'review-fix-minimal', 'structural-reform']; for (const name of builtinNames) { it(`should load builtin piece: ${name}`, () => { @@ -572,6 +572,139 @@ movements: }); }); +describe('Piece Loader IT: structural-reform piece', () => { + let testDir: string; + + beforeEach(() => { + testDir = createTestDir(); + }); + + afterEach(() => { + rmSync(testDir, { recursive: true, force: true }); + }); + + it('should load structural-reform with 7 movements', () => { + const config = loadPiece('structural-reform', testDir); + + expect(config).not.toBeNull(); + expect(config!.name).toBe('structural-reform'); + expect(config!.movements.length).toBe(7); + expect(config!.maxIterations).toBe(50); + expect(config!.initialMovement).toBe('review'); + }); + + it('should have expected movement names in order', () => { + const config = loadPiece('structural-reform', testDir); + expect(config).not.toBeNull(); + + const movementNames = config!.movements.map((m) => m.name); + expect(movementNames).toEqual([ + 'review', + 'plan_reform', + 'implement', + 'reviewers', + 'fix', + 'verify', + 'next_target', + ]); + }); + + it('should have review as read-only with instruction_template', () => { + const config = loadPiece('structural-reform', testDir); + expect(config).not.toBeNull(); + + const review = config!.movements.find((m) => m.name === 'review'); + expect(review).toBeDefined(); + expect(review!.edit).not.toBe(true); + expect(review!.instructionTemplate).toBeDefined(); + expect(review!.instructionTemplate).toContain('{task}'); + }); + + it('should have implement with edit: true and session: refresh', () => { + const config = loadPiece('structural-reform', testDir); + expect(config).not.toBeNull(); + + const implement = config!.movements.find((m) => m.name === 'implement'); + expect(implement).toBeDefined(); + expect(implement!.edit).toBe(true); + expect(implement!.session).toBe('refresh'); + }); + + it('should have 2 parallel reviewers (arch-review and qa-review)', () => { + const config = loadPiece('structural-reform', testDir); + expect(config).not.toBeNull(); + + const reviewers = config!.movements.find( + (m) => m.parallel && m.parallel.length > 0, + ); + expect(reviewers).toBeDefined(); + expect(reviewers!.parallel!.length).toBe(2); + + const subNames = reviewers!.parallel!.map((s) => s.name); + expect(subNames).toContain('arch-review'); + expect(subNames).toContain('qa-review'); + }); + + it('should have aggregate rules on reviewers movement', () => { + const config = loadPiece('structural-reform', testDir); + expect(config).not.toBeNull(); + + const reviewers = config!.movements.find( + (m) => m.parallel && m.parallel.length > 0, + ); + expect(reviewers).toBeDefined(); + + const allRule = reviewers!.rules?.find( + (r) => r.isAggregateCondition && r.aggregateType === 'all', + ); + expect(allRule).toBeDefined(); + expect(allRule!.aggregateConditionText).toBe('approved'); + expect(allRule!.next).toBe('verify'); + + const anyRule = reviewers!.rules?.find( + (r) => r.isAggregateCondition && r.aggregateType === 'any', + ); + expect(anyRule).toBeDefined(); + expect(anyRule!.aggregateConditionText).toBe('needs_fix'); + expect(anyRule!.next).toBe('fix'); + }); + + it('should have verify movement with instruction_template', () => { + const config = loadPiece('structural-reform', testDir); + expect(config).not.toBeNull(); + + const verify = config!.movements.find((m) => m.name === 'verify'); + expect(verify).toBeDefined(); + expect(verify!.edit).not.toBe(true); + expect(verify!.instructionTemplate).toBeDefined(); + }); + + it('should have next_target movement routing to implement or COMPLETE', () => { + const config = loadPiece('structural-reform', testDir); + expect(config).not.toBeNull(); + + const nextTarget = config!.movements.find((m) => m.name === 'next_target'); + expect(nextTarget).toBeDefined(); + expect(nextTarget!.edit).not.toBe(true); + + const nextValues = nextTarget!.rules?.map((r) => r.next); + expect(nextValues).toContain('implement'); + expect(nextValues).toContain('COMPLETE'); + }); + + it('should have loop_monitors for implement-fix cycle', () => { + const config = loadPiece('structural-reform', testDir); + expect(config).not.toBeNull(); + expect(config!.loopMonitors).toBeDefined(); + expect(config!.loopMonitors!.length).toBe(1); + + const monitor = config!.loopMonitors![0]!; + expect(monitor.cycle).toEqual(['implement', 'fix']); + expect(monitor.threshold).toBe(3); + expect(monitor.judge).toBeDefined(); + }); +}); + describe('Piece Loader IT: invalid YAML handling', () => { let testDir: string;