From cb37baec2c39bc51bf9033ae0209a1d288767dcc Mon Sep 17 00:00:00 2001 From: nrslib <38722970+nrslib@users.noreply.github.com> Date: Fri, 30 Jan 2026 11:59:06 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=AC=E3=83=9D=E3=83=BC=E3=83=88=E5=87=BA?= =?UTF-8?q?=E5=8A=9B=E6=8C=87=E7=A4=BA=E3=82=92=E8=87=AA=E5=8B=95=E7=94=9F?= =?UTF-8?q?=E6=88=90=E3=81=AB=E7=B5=B1=E4=B8=80=E3=81=97=E3=80=81YAML=20?= =?UTF-8?q?=E3=81=AE=E6=89=8B=E5=8B=95=20order/instruction=5Ftemplate=20?= =?UTF-8?q?=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - REPORT_OUTPUT_STRINGS (en/ja) と renderReportOutputInstruction() を追加 - 全8ワークフローYAMLから手動の order フィールドとレポート出力指示を削除 - ReportObjectConfig に明示的 order がある場合は後方互換として優先 - .envrc を .gitignore に追加 ref #29 --- .gitignore | 1 + resources/global/en/workflows/default.yaml | 24 ---- .../global/en/workflows/expert-cqrs.yaml | 32 ------ resources/global/en/workflows/expert.yaml | 32 ------ resources/global/en/workflows/simple.yaml | 20 ---- resources/global/ja/workflows/default.yaml | 24 ---- .../global/ja/workflows/expert-cqrs.yaml | 32 ------ resources/global/ja/workflows/expert.yaml | 32 ------ resources/global/ja/workflows/simple.yaml | 20 ---- src/__tests__/instructionBuilder.test.ts | 107 ++++++++++++++++-- src/workflow/instruction-builder.ts | 47 +++++++- 11 files changed, 142 insertions(+), 229 deletions(-) diff --git a/.gitignore b/.gitignore index 202d1f8..e3685e9 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ coverage/ .env .env.local .env.*.local +.envrc # TAKT config (user data) .takt/ diff --git a/resources/global/en/workflows/default.yaml b/resources/global/en/workflows/default.yaml index 17bd774..5beb1a3 100644 --- a/resources/global/en/workflows/default.yaml +++ b/resources/global/en/workflows/default.yaml @@ -32,10 +32,6 @@ steps: agent: ~/.takt/agents/default/planner.md report: name: 00-plan.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # Task Plan @@ -116,10 +112,6 @@ steps: Follow the plan from the plan step and implement. Refer to the plan report (00-plan.md) and proceed with implementation. - **Report output:** Output to the `Report Files` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section - **Scope report format (create at implementation start):** ```markdown # Change Scope Declaration @@ -155,10 +147,6 @@ steps: agent: ~/.takt/agents/default/ai-antipattern-reviewer.md report: name: 03-ai-review.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # AI-Generated Code Review @@ -239,10 +227,6 @@ steps: agent: ~/.takt/agents/default/architecture-reviewer.md report: name: 04-architect-review.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # Architecture Review @@ -353,10 +337,6 @@ steps: agent: ~/.takt/agents/default/security-reviewer.md report: name: 05-security-review.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # Security Review @@ -461,10 +441,6 @@ steps: **Review Reports:** Read all reports in Report Directory and check for any unaddressed improvement suggestions. - **Report output:** Output to the `Report Files` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section - **Validation report format:** ```markdown # Final Validation Results diff --git a/resources/global/en/workflows/expert-cqrs.yaml b/resources/global/en/workflows/expert-cqrs.yaml index b649605..b8c8dd9 100644 --- a/resources/global/en/workflows/expert-cqrs.yaml +++ b/resources/global/en/workflows/expert-cqrs.yaml @@ -35,10 +35,6 @@ steps: agent: ~/.takt/agents/default/planner.md report: name: 00-plan.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # Task Plan @@ -110,10 +106,6 @@ steps: Follow the plan from the plan step and implement. Refer to the plan report (00-plan.md) and proceed with implementation. - **Report output:** Output to the `Report Files` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section - **Scope report format (create at implementation start):** ```markdown # Change Scope Declaration @@ -157,10 +149,6 @@ steps: agent: ~/.takt/agents/default/ai-antipattern-reviewer.md report: name: 03-ai-review.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # AI-Generated Code Review @@ -243,10 +231,6 @@ steps: agent: ~/.takt/agents/expert-cqrs/cqrs-es-reviewer.md report: name: 04-cqrs-es-review.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # CQRS+ES Review @@ -335,10 +319,6 @@ steps: agent: ~/.takt/agents/expert/frontend-reviewer.md report: name: 05-frontend-review.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # Frontend Review @@ -427,10 +407,6 @@ steps: agent: ~/.takt/agents/expert/security-reviewer.md report: name: 06-security-review.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # Security Review @@ -526,10 +502,6 @@ steps: agent: ~/.takt/agents/expert/qa-reviewer.md report: name: 07-qa-review.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # QA Review @@ -656,10 +628,6 @@ steps: **Review Reports:** Read all reports in Report Directory and check for any unaddressed improvement suggestions. - **Report output:** Output to the `Report Files` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section - **Validation report format:** ```markdown # Final Validation Results diff --git a/resources/global/en/workflows/expert.yaml b/resources/global/en/workflows/expert.yaml index d5affbb..a7dd490 100644 --- a/resources/global/en/workflows/expert.yaml +++ b/resources/global/en/workflows/expert.yaml @@ -47,10 +47,6 @@ steps: agent: ~/.takt/agents/default/planner.md report: name: 00-plan.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # Task Plan @@ -122,10 +118,6 @@ steps: Follow the plan from the plan step and implement. Refer to the plan report (00-plan.md) and proceed with implementation. - **Report output:** Output to the `Report Files` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section - **Scope report format (create at implementation start):** ```markdown # Change Scope Declaration @@ -169,10 +161,6 @@ steps: agent: ~/.takt/agents/default/ai-antipattern-reviewer.md report: name: 03-ai-review.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # AI-Generated Code Review @@ -255,10 +243,6 @@ steps: agent: ~/.takt/agents/default/architecture-reviewer.md report: name: 04-architect-review.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # Architecture Review @@ -349,10 +333,6 @@ steps: agent: ~/.takt/agents/expert/frontend-reviewer.md report: name: 05-frontend-review.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # Frontend Review @@ -441,10 +421,6 @@ steps: agent: ~/.takt/agents/expert/security-reviewer.md report: name: 06-security-review.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # Security Review @@ -540,10 +516,6 @@ steps: agent: ~/.takt/agents/expert/qa-reviewer.md report: name: 07-qa-review.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # QA Review @@ -670,10 +642,6 @@ steps: **Review Reports:** Read all reports in Report Directory and check for any unaddressed improvement suggestions. - **Report output:** Output to the `Report Files` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section - **Validation report format:** ```markdown # Final Validation Results diff --git a/resources/global/en/workflows/simple.yaml b/resources/global/en/workflows/simple.yaml index 0ed418c..1524ea3 100644 --- a/resources/global/en/workflows/simple.yaml +++ b/resources/global/en/workflows/simple.yaml @@ -29,10 +29,6 @@ steps: agent: ~/.takt/agents/default/planner.md report: name: 00-plan.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # Task Plan @@ -109,10 +105,6 @@ steps: Follow the plan from the plan step and implement. Refer to the plan report (00-plan.md) and proceed with implementation. - **Report output:** Output to the `Report Files` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section - **Scope report format (create at implementation start):** ```markdown # Change Scope Declaration @@ -148,10 +140,6 @@ steps: agent: ~/.takt/agents/default/ai-antipattern-reviewer.md report: name: 03-ai-review.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # AI-Generated Code Review @@ -202,10 +190,6 @@ steps: agent: ~/.takt/agents/default/architecture-reviewer.md report: name: 04-architect-review.md - order: | - **Report output:** Output to the `Report File` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section format: | ```markdown # Architecture Review @@ -283,10 +267,6 @@ steps: **Review Reports:** Read all reports in Report Directory and check for any unaddressed improvement suggestions. - **Report output:** Output to the `Report Files` specified above. - - If file does not exist: Create new file - - If file exists: Append with `## Iteration {step_iteration}` section - **Validation report format:** ```markdown # Final Validation Results diff --git a/resources/global/ja/workflows/default.yaml b/resources/global/ja/workflows/default.yaml index 0d35bbc..9026f30 100644 --- a/resources/global/ja/workflows/default.yaml +++ b/resources/global/ja/workflows/default.yaml @@ -23,10 +23,6 @@ steps: agent: ~/.takt/agents/default/planner.md report: name: 00-plan.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # タスク計画 @@ -112,10 +108,6 @@ steps: - 既存コードを変更した場合は該当するテストを更新 - テストファイルの配置: プロジェクトの規約に従う(例: `__tests__/`, `*.test.ts`) - **レポート出力:** Report Files に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 - **Scopeレポートフォーマット(実装開始時に作成):** ```markdown # 変更スコープ宣言 @@ -151,10 +143,6 @@ steps: agent: ~/.takt/agents/default/ai-antipattern-reviewer.md report: name: 03-ai-review.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # AI生成コードレビュー @@ -235,10 +223,6 @@ steps: agent: ~/.takt/agents/default/architecture-reviewer.md report: name: 04-architect-review.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # アーキテクチャレビュー @@ -359,10 +343,6 @@ steps: agent: ~/.takt/agents/default/security-reviewer.md report: name: 05-security-review.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # セキュリティレビュー @@ -467,10 +447,6 @@ steps: **レポートの確認:** Report Directory内の全レポートを読み、 未対応の改善提案がないか確認してください。 - **レポート出力:** Report Files に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 - **Validationレポートフォーマット:** ```markdown # 最終検証結果 diff --git a/resources/global/ja/workflows/expert-cqrs.yaml b/resources/global/ja/workflows/expert-cqrs.yaml index d2f7286..ba94f6e 100644 --- a/resources/global/ja/workflows/expert-cqrs.yaml +++ b/resources/global/ja/workflows/expert-cqrs.yaml @@ -44,10 +44,6 @@ steps: agent: ~/.takt/agents/default/planner.md report: name: 00-plan.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # タスク計画 @@ -119,10 +115,6 @@ steps: planステップで立てた計画に従って実装してください。 計画レポート(00-plan.md)を参照し、実装を進めてください。 - **レポート出力:** Report Files に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 - **Scopeレポートフォーマット(実装開始時に作成):** ```markdown # 変更スコープ宣言 @@ -166,10 +158,6 @@ steps: agent: ~/.takt/agents/default/ai-antipattern-reviewer.md report: name: 03-ai-review.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # AI生成コードレビュー @@ -252,10 +240,6 @@ steps: agent: ~/.takt/agents/expert-cqrs/cqrs-es-reviewer.md report: name: 04-cqrs-es-review.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # CQRS+ESレビュー @@ -344,10 +328,6 @@ steps: agent: ~/.takt/agents/expert/frontend-reviewer.md report: name: 05-frontend-review.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # フロントエンドレビュー @@ -436,10 +416,6 @@ steps: agent: ~/.takt/agents/expert/security-reviewer.md report: name: 06-security-review.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # セキュリティレビュー @@ -535,10 +511,6 @@ steps: agent: ~/.takt/agents/expert/qa-reviewer.md report: name: 07-qa-review.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # QAレビュー @@ -665,10 +637,6 @@ steps: **レポートの確認:** Report Directory内の全レポートを読み、 未対応の改善提案がないか確認してください。 - **レポート出力:** Report Files に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 - **Validationレポートフォーマット:** ```markdown # 最終検証結果 diff --git a/resources/global/ja/workflows/expert.yaml b/resources/global/ja/workflows/expert.yaml index 9dd0909..2084468 100644 --- a/resources/global/ja/workflows/expert.yaml +++ b/resources/global/ja/workflows/expert.yaml @@ -35,10 +35,6 @@ steps: agent: ~/.takt/agents/default/planner.md report: name: 00-plan.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # タスク計画 @@ -110,10 +106,6 @@ steps: planステップで立てた計画に従って実装してください。 計画レポート(00-plan.md)を参照し、実装を進めてください。 - **レポート出力:** Report Files に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 - **Scopeレポートフォーマット(実装開始時に作成):** ```markdown # 変更スコープ宣言 @@ -157,10 +149,6 @@ steps: agent: ~/.takt/agents/default/ai-antipattern-reviewer.md report: name: 03-ai-review.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # AI生成コードレビュー @@ -243,10 +231,6 @@ steps: agent: ~/.takt/agents/default/architecture-reviewer.md report: name: 04-architect-review.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # アーキテクチャレビュー @@ -337,10 +321,6 @@ steps: agent: ~/.takt/agents/expert/frontend-reviewer.md report: name: 05-frontend-review.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # フロントエンドレビュー @@ -429,10 +409,6 @@ steps: agent: ~/.takt/agents/expert/security-reviewer.md report: name: 06-security-review.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # セキュリティレビュー @@ -528,10 +504,6 @@ steps: agent: ~/.takt/agents/expert/qa-reviewer.md report: name: 07-qa-review.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # QAレビュー @@ -658,10 +630,6 @@ steps: **レポートの確認:** Report Directory内の全レポートを読み、 未対応の改善提案がないか確認してください。 - **レポート出力:** Report Files に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 - **Validationレポートフォーマット:** ```markdown # 最終検証結果 diff --git a/resources/global/ja/workflows/simple.yaml b/resources/global/ja/workflows/simple.yaml index dd74e49..fd86d39 100644 --- a/resources/global/ja/workflows/simple.yaml +++ b/resources/global/ja/workflows/simple.yaml @@ -24,10 +24,6 @@ steps: agent: ~/.takt/agents/default/planner.md report: name: 00-plan.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # タスク計画 @@ -103,10 +99,6 @@ steps: planステップで立てた計画に従って実装してください。 計画レポート(00-plan.md)を参照し、実装を進めてください。 - **レポート出力:** Report Files に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 - **Scopeレポートフォーマット(実装開始時に作成):** ```markdown # 変更スコープ宣言 @@ -147,10 +139,6 @@ steps: agent: ~/.takt/agents/default/ai-antipattern-reviewer.md report: name: 03-ai-review.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # AI生成コードレビュー @@ -201,10 +189,6 @@ steps: agent: ~/.takt/agents/default/architecture-reviewer.md report: name: 04-architect-review.md - order: | - **レポート出力:** `Report File` に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 format: | ```markdown # アーキテクチャレビュー @@ -277,10 +261,6 @@ steps: **レポートの確認:** Report Directory内の全レポートを読み、 未対応の改善提案がないか確認してください。 - **レポート出力:** Report Files に出力してください。 - - ファイルが存在しない場合: 新規作成 - - ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記 - **Validationレポートフォーマット:** ```markdown # 最終検証結果 diff --git a/src/__tests__/instructionBuilder.test.ts b/src/__tests__/instructionBuilder.test.ts index afa3048..77e9eaa 100644 --- a/src/__tests__/instructionBuilder.test.ts +++ b/src/__tests__/instructionBuilder.test.ts @@ -626,7 +626,7 @@ describe('instruction-builder', () => { expect(result).not.toContain('{report:00-plan.md}'); }); - it('should not inject order/format when report is a simple string', () => { + it('should auto-inject report output instruction when report is a simple string', () => { const step = createMinimalStep('Do work'); step.report = '00-plan.md'; const context = createMinimalContext({ @@ -636,17 +636,16 @@ describe('instruction-builder', () => { const result = buildInstruction(step, context); - // Should contain instructions normally - expect(result).toContain('## Instructions'); - expect(result).toContain('Do work'); - // The instruction should appear right after Additional User Inputs, not after any order section - const additionalIdx = result.indexOf('## Additional User Inputs'); + // Auto-generated report output instruction should be injected before ## Instructions + expect(result).toContain('**Report output:** Output to the `Report File` specified above.'); + expect(result).toContain('- If file does not exist: Create new file'); + const reportIdx = result.indexOf('**Report output:**'); const instructionsIdx = result.indexOf('## Instructions'); - expect(additionalIdx).toBeGreaterThan(-1); - expect(instructionsIdx).toBeGreaterThan(additionalIdx); + expect(reportIdx).toBeGreaterThan(-1); + expect(instructionsIdx).toBeGreaterThan(reportIdx); }); - it('should not inject order/format when report is ReportConfig[]', () => { + it('should auto-inject report output instruction when report is ReportConfig[]', () => { const step = createMinimalStep('Do work'); step.report = [ { label: 'Scope', path: '01-scope.md' }, @@ -658,9 +657,9 @@ describe('instruction-builder', () => { const result = buildInstruction(step, context); - // Just verify normal behavior without extra sections - expect(result).toContain('## Instructions'); - expect(result).toContain('Do work'); + // Auto-generated multi-file report output instruction + expect(result).toContain('**Report output:** Output to the `Report Files` specified above.'); + expect(result).toContain('- If file does not exist: Create new file'); }); it('should replace {report:filename} in instruction_template too', () => { @@ -692,6 +691,90 @@ describe('instruction-builder', () => { expect(result).toContain('Append ## Iteration 3 section'); }); + + it('should auto-inject Japanese report output instruction for ja language', () => { + const step = createMinimalStep('作業する'); + step.report = { name: '00-plan.md' }; + const context = createMinimalContext({ + reportDir: '20260129-test', + language: 'ja', + }); + + const result = buildInstruction(step, context); + + expect(result).toContain('**レポート出力:** `Report File` に出力してください。'); + expect(result).toContain('- ファイルが存在しない場合: 新規作成'); + expect(result).toContain('- ファイルが存在する場合: `## Iteration 1` セクションを追記'); + }); + + it('should auto-inject Japanese multi-file report output instruction', () => { + const step = createMinimalStep('作業する'); + step.report = [{ label: 'Scope', path: '01-scope.md' }]; + const context = createMinimalContext({ + reportDir: '20260129-test', + language: 'ja', + }); + + const result = buildInstruction(step, context); + + expect(result).toContain('**レポート出力:** Report Files に出力してください。'); + }); + + it('should replace {step_iteration} in auto-generated report output instruction', () => { + const step = createMinimalStep('Do work'); + step.report = '00-plan.md'; + const context = createMinimalContext({ + reportDir: '20260129-test', + stepIteration: 5, + language: 'en', + }); + + const result = buildInstruction(step, context); + + expect(result).toContain('Append with `## Iteration 5` section'); + }); + + it('should prefer explicit order over auto-generated report instruction', () => { + const step = createMinimalStep('Do work'); + step.report = { + name: '00-plan.md', + order: 'Custom order instruction', + }; + const context = createMinimalContext({ + reportDir: '20260129-test', + language: 'en', + }); + + const result = buildInstruction(step, context); + + expect(result).toContain('Custom order instruction'); + expect(result).not.toContain('**Report output:**'); + }); + + it('should auto-inject report output for ReportObjectConfig without order', () => { + const step = createMinimalStep('Do work'); + step.report = { name: '00-plan.md', format: '# Plan' }; + const context = createMinimalContext({ + reportDir: '20260129-test', + language: 'en', + }); + + const result = buildInstruction(step, context); + + expect(result).toContain('**Report output:** Output to the `Report File` specified above.'); + }); + + it('should NOT inject report output when no reportDir', () => { + const step = createMinimalStep('Do work'); + step.report = '00-plan.md'; + const context = createMinimalContext({ + language: 'en', + }); + + const result = buildInstruction(step, context); + + expect(result).not.toContain('**Report output:**'); + }); }); describe('auto-injected User Request and Additional User Inputs sections', () => { diff --git a/src/workflow/instruction-builder.ts b/src/workflow/instruction-builder.ts index ab034df..cb952c5 100644 --- a/src/workflow/instruction-builder.ts +++ b/src/workflow/instruction-builder.ts @@ -269,6 +269,44 @@ const SECTION_STRINGS = { }, } as const; +/** Localized strings for auto-generated report output instructions */ +const REPORT_OUTPUT_STRINGS = { + en: { + singleHeading: '**Report output:** Output to the `Report File` specified above.', + multiHeading: '**Report output:** Output to the `Report Files` specified above.', + createRule: '- If file does not exist: Create new file', + appendRule: '- If file exists: Append with `## Iteration {step_iteration}` section', + }, + ja: { + singleHeading: '**レポート出力:** `Report File` に出力してください。', + multiHeading: '**レポート出力:** Report Files に出力してください。', + createRule: '- ファイルが存在しない場合: 新規作成', + appendRule: '- ファイルが存在する場合: `## Iteration {step_iteration}` セクションを追記', + }, +} as const; + +/** + * Generate report output instructions from step.report config. + * Returns undefined if step has no report or no reportDir. + * + * This replaces the manual `order:` fields and instruction_template + * report output blocks that were previously hand-written in each YAML. + */ +function renderReportOutputInstruction( + step: WorkflowStep, + context: InstructionContext, + language: Language, +): string | undefined { + if (!step.report || !context.reportDir) return undefined; + + const s = REPORT_OUTPUT_STRINGS[language]; + const isMulti = Array.isArray(step.report); + const heading = isMulti ? s.multiHeading : s.singleHeading; + const appendRule = s.appendRule.replace('{step_iteration}', String(context.stepIteration)); + + return [heading, s.createRule, appendRule].join('\n'); +} + /** * Render the Workflow Context section. */ @@ -428,10 +466,17 @@ export function buildInstruction( sections.push(`${s.additionalUserInputs}\n${escapeTemplateChars(userInputsStr)}`); } - // 6a. Report order (prepended before instruction_template, from ReportObjectConfig) + // 6a. Report output instruction (auto-generated from step.report) + // If ReportObjectConfig has an explicit `order:`, use that (backward compat). + // Otherwise, auto-generate from the report declaration. if (step.report && isReportObjectConfig(step.report) && step.report.order) { const processedOrder = replaceTemplatePlaceholders(step.report.order.trimEnd(), step, context); sections.push(processedOrder); + } else { + const reportInstruction = renderReportOutputInstruction(step, context, language); + if (reportInstruction) { + sections.push(reportInstruction); + } } // 6b. Instructions header + instruction_template content