feat: builtinワークフローをパラレルレビュー対応に変更し、エージェントに仕様準拠チェックを追加 (#31)
- default.yamlのreview/security_reviewを統合しparallelステップ(reviewers)に変更 - improve/security_fixステップを統合fixステップに集約 - parallelサブステップのrulesでnextをoptionalに(スキーマ・型定義) - planner/architecture-reviewer/supervisorに仕様準拠の確認指示を追加(ja/en) - parallelレビュー構造の検証テストを追加
This commit is contained in:
parent
44cb6b14f4
commit
748f5afb29
@ -327,7 +327,44 @@ function createUser(data: UserData) {
|
|||||||
|
|
||||||
**Always point these out.** Temporary fixes become permanent.
|
**Always point these out.** Temporary fixes become permanent.
|
||||||
|
|
||||||
### 8. Quality Attributes
|
### 8. Spec Compliance Verification
|
||||||
|
|
||||||
|
**Verify that changes comply with the project's documented specifications.**
|
||||||
|
|
||||||
|
**Verification targets:**
|
||||||
|
|
||||||
|
| Target | What to Check |
|
||||||
|
|--------|---------------|
|
||||||
|
| CLAUDE.md / README.md | Conforms to schema definitions, design principles, constraints |
|
||||||
|
| Type definitions / Zod schemas | New fields reflected in schemas |
|
||||||
|
| YAML/JSON config files | Follows documented format |
|
||||||
|
| Existing patterns | Consistent with similar files |
|
||||||
|
|
||||||
|
**Specific checks:**
|
||||||
|
|
||||||
|
1. When config files (YAML, etc.) are modified or added:
|
||||||
|
- Cross-reference with schema definitions in CLAUDE.md, etc.
|
||||||
|
- No ignored or invalid fields present
|
||||||
|
- No required fields missing
|
||||||
|
|
||||||
|
2. When type definitions or interfaces are modified:
|
||||||
|
- Documentation schema descriptions are updated
|
||||||
|
- Existing config files are compatible with new schema
|
||||||
|
|
||||||
|
3. When workflow definitions are modified:
|
||||||
|
- Correct fields used for step type (normal vs. parallel)
|
||||||
|
- No unnecessary fields remaining (e.g., `next` on parallel sub-steps)
|
||||||
|
|
||||||
|
**REJECT when these patterns are found:**
|
||||||
|
|
||||||
|
| Pattern | Problem |
|
||||||
|
|---------|---------|
|
||||||
|
| Fields not in the spec | Ignored or unexpected behavior |
|
||||||
|
| Invalid values per spec | Runtime error or silently ignored |
|
||||||
|
| Violation of documented constraints | Against design intent |
|
||||||
|
| Step type / field mismatch | Sign of copy-paste error |
|
||||||
|
|
||||||
|
### 9. Quality Attributes
|
||||||
|
|
||||||
| Attribute | Review Point |
|
| Attribute | Review Point |
|
||||||
|-----------|--------------|
|
|-----------|--------------|
|
||||||
@ -335,7 +372,7 @@ function createUser(data: UserData) {
|
|||||||
| Maintainability | Easy to modify and fix |
|
| Maintainability | Easy to modify and fix |
|
||||||
| Observability | Logging and monitoring enabled |
|
| Observability | Logging and monitoring enabled |
|
||||||
|
|
||||||
### 9. Big Picture
|
### 10. Big Picture
|
||||||
|
|
||||||
**Caution**: Don't get lost in minor "clean code" nitpicks.
|
**Caution**: Don't get lost in minor "clean code" nitpicks.
|
||||||
|
|
||||||
@ -346,7 +383,7 @@ Verify:
|
|||||||
- Does it align with business requirements
|
- Does it align with business requirements
|
||||||
- Is naming consistent with the domain
|
- Is naming consistent with the domain
|
||||||
|
|
||||||
### 10. Change Scope Assessment
|
### 11. Change Scope Assessment
|
||||||
|
|
||||||
**Check change scope and include in report (non-blocking).**
|
**Check change scope and include in report (non-blocking).**
|
||||||
|
|
||||||
@ -365,7 +402,7 @@ Verify:
|
|||||||
**Include as suggestions (non-blocking):**
|
**Include as suggestions (non-blocking):**
|
||||||
- If splittable, present splitting proposal
|
- If splittable, present splitting proposal
|
||||||
|
|
||||||
### 11. Circular Review Detection
|
### 12. Circular Review Detection
|
||||||
|
|
||||||
When review count is provided (e.g., "Review count: 3rd"), adjust judgment accordingly.
|
When review count is provided (e.g., "Review count: 3rd"), adjust judgment accordingly.
|
||||||
|
|
||||||
|
|||||||
@ -46,13 +46,27 @@ Always verify information used in your analysis against the source of truth:
|
|||||||
|
|
||||||
**Don't guess.** Always verify names, values, and behaviors against actual code.
|
**Don't guess.** Always verify names, values, and behaviors against actual code.
|
||||||
|
|
||||||
### 4. Implementation Approach
|
### 4. Spec & Constraint Verification
|
||||||
|
|
||||||
|
**Always** verify specifications related to the change target:
|
||||||
|
|
||||||
|
| What to Check | How to Check |
|
||||||
|
|---------------|-------------|
|
||||||
|
| Project specs (CLAUDE.md, etc.) | Read the file to understand constraints and schemas |
|
||||||
|
| Type definitions / schemas | Check related type definition files |
|
||||||
|
| Config file specifications | Check YAML/JSON schemas and existing config examples |
|
||||||
|
| Existing patterns / conventions | Check how similar files are written |
|
||||||
|
|
||||||
|
**Don't plan against the specs.** If specs are unclear, explicitly state so.
|
||||||
|
|
||||||
|
### 5. Implementation Approach
|
||||||
|
|
||||||
Determine the implementation direction:
|
Determine the implementation direction:
|
||||||
|
|
||||||
- What steps to follow
|
- What steps to follow
|
||||||
- Points to be careful about
|
- Points to be careful about
|
||||||
- Items requiring confirmation
|
- Items requiring confirmation
|
||||||
|
- **Spec constraints** (schemas, formats, ignored fields, etc.)
|
||||||
|
|
||||||
## Important
|
## Important
|
||||||
|
|
||||||
|
|||||||
@ -81,7 +81,18 @@ You are the **human proxy** in the automated workflow. Before approval, verify t
|
|||||||
| Production ready | No mock/stub/TODO remaining? |
|
| Production ready | No mock/stub/TODO remaining? |
|
||||||
| Operation | Actually works as expected? |
|
| Operation | Actually works as expected? |
|
||||||
|
|
||||||
### 6. Workflow Overall Review
|
### 6. Spec Compliance Final Check
|
||||||
|
|
||||||
|
**Final verification that changes comply with the project's documented specifications.**
|
||||||
|
|
||||||
|
Check:
|
||||||
|
- Changed files are consistent with schemas and constraints documented in CLAUDE.md, etc.
|
||||||
|
- Config files (YAML, etc.) follow the documented format
|
||||||
|
- Type definition changes are reflected in documentation
|
||||||
|
|
||||||
|
**REJECT if spec violations are found.** Don't assume "probably correct"—actually read and cross-reference the specs.
|
||||||
|
|
||||||
|
### 7. Workflow Overall Review
|
||||||
|
|
||||||
**Check all reports in the report directory and verify overall workflow consistency.**
|
**Check all reports in the report directory and verify overall workflow consistency.**
|
||||||
|
|
||||||
@ -98,7 +109,7 @@ Check:
|
|||||||
| Deviation from original purpose | REJECT - Request return to objective |
|
| Deviation from original purpose | REJECT - Request return to objective |
|
||||||
| Scope creep | Record only - Address in next task |
|
| Scope creep | Record only - Address in next task |
|
||||||
|
|
||||||
### 7. Improvement Suggestion Check
|
### 8. Improvement Suggestion Check
|
||||||
|
|
||||||
**Check review reports for unaddressed improvement suggestions.**
|
**Check review reports for unaddressed improvement suggestions.**
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
# Default TAKT Workflow
|
# Default TAKT Workflow
|
||||||
# Plan -> Coder -> AI Review -> Architect Review -> Security Review -> Supervisor Approval
|
# Plan -> Coder -> AI Review -> Reviewers (parallel: Architect + Security) -> Supervisor Approval
|
||||||
#
|
#
|
||||||
# Boilerplate sections (Workflow Context, User Request, Previous Response,
|
# Boilerplate sections (Workflow Context, User Request, Previous Response,
|
||||||
# Additional User Inputs, Instructions heading) are auto-injected by buildInstruction().
|
# Additional User Inputs, Instructions heading) are auto-injected by buildInstruction().
|
||||||
@ -182,7 +182,7 @@ steps:
|
|||||||
- WebFetch
|
- WebFetch
|
||||||
rules:
|
rules:
|
||||||
- condition: No AI-specific issues
|
- condition: No AI-specific issues
|
||||||
next: review
|
next: reviewers
|
||||||
- condition: AI-specific issues found
|
- condition: AI-specific issues found
|
||||||
next: ai_fix
|
next: ai_fix
|
||||||
instruction_template: |
|
instruction_template: |
|
||||||
@ -207,7 +207,7 @@ steps:
|
|||||||
permission_mode: acceptEdits
|
permission_mode: acceptEdits
|
||||||
rules:
|
rules:
|
||||||
- condition: AI issues fixed
|
- condition: AI issues fixed
|
||||||
next: review
|
next: reviewers
|
||||||
- condition: Cannot proceed, insufficient info
|
- condition: Cannot proceed, insufficient info
|
||||||
next: plan
|
next: plan
|
||||||
instruction_template: |
|
instruction_template: |
|
||||||
@ -222,88 +222,110 @@ steps:
|
|||||||
- Removing scope creep
|
- Removing scope creep
|
||||||
pass_previous_response: true
|
pass_previous_response: true
|
||||||
|
|
||||||
- name: review
|
- name: reviewers
|
||||||
edit: false
|
parallel:
|
||||||
agent: ../agents/default/architecture-reviewer.md
|
- name: arch-review
|
||||||
report:
|
edit: false
|
||||||
name: 04-architect-review.md
|
agent: ../agents/default/architecture-reviewer.md
|
||||||
format: |
|
report:
|
||||||
```markdown
|
name: 04-architect-review.md
|
||||||
# Architecture Review
|
format: |
|
||||||
|
```markdown
|
||||||
|
# Architecture Review
|
||||||
|
|
||||||
## Result: APPROVE / IMPROVE / REJECT
|
## Result: APPROVE / IMPROVE / REJECT
|
||||||
|
|
||||||
## Summary
|
## Summary
|
||||||
{1-2 sentences summarizing result}
|
{1-2 sentences summarizing result}
|
||||||
|
|
||||||
## Reviewed Perspectives
|
## Reviewed Perspectives
|
||||||
- [x] Structure & Design
|
- [x] Structure & Design
|
||||||
- [x] Code Quality
|
- [x] Code Quality
|
||||||
- [x] Change Scope
|
- [x] Change Scope
|
||||||
|
|
||||||
## Issues (if REJECT)
|
## Issues (if REJECT)
|
||||||
| # | Location | Issue | Fix |
|
| # | Location | Issue | Fix |
|
||||||
|---|----------|-------|-----|
|
|---|----------|-------|-----|
|
||||||
| 1 | `src/file.ts:42` | Issue description | Fix method |
|
| 1 | `src/file.ts:42` | Issue description | Fix method |
|
||||||
|
|
||||||
## Improvement Suggestions (optional, non-blocking)
|
## Improvement Suggestions (optional, non-blocking)
|
||||||
- {Future improvement suggestions}
|
- {Future improvement suggestions}
|
||||||
```
|
```
|
||||||
|
|
||||||
**Cognitive load reduction rules:**
|
**Cognitive load reduction rules:**
|
||||||
- APPROVE + no issues -> Summary only (5 lines or less)
|
- APPROVE + no issues -> Summary only (5 lines or less)
|
||||||
- APPROVE + minor suggestions -> Summary + suggestions (15 lines or less)
|
- APPROVE + minor suggestions -> Summary + suggestions (15 lines or less)
|
||||||
- REJECT -> Issues in table format (30 lines or less)
|
- REJECT -> Issues in table format (30 lines or less)
|
||||||
allowed_tools:
|
allowed_tools:
|
||||||
- Read
|
- Read
|
||||||
- Glob
|
- Glob
|
||||||
- Grep
|
- Grep
|
||||||
- Write
|
- Write
|
||||||
- WebSearch
|
- WebSearch
|
||||||
- WebFetch
|
- WebFetch
|
||||||
|
rules:
|
||||||
|
- condition: approved
|
||||||
|
- condition: needs_fix
|
||||||
|
instruction_template: |
|
||||||
|
Focus on **architecture and design** review. Do NOT review AI-specific issues (that's the ai_review step).
|
||||||
|
|
||||||
|
Review the changes and provide feedback.
|
||||||
|
|
||||||
|
- name: security-review
|
||||||
|
edit: false
|
||||||
|
agent: ../agents/default/security-reviewer.md
|
||||||
|
report:
|
||||||
|
name: 05-security-review.md
|
||||||
|
format: |
|
||||||
|
```markdown
|
||||||
|
# Security Review
|
||||||
|
|
||||||
|
## Result: APPROVE / REJECT
|
||||||
|
|
||||||
|
## Severity: None / Low / Medium / High / Critical
|
||||||
|
|
||||||
|
## Check Results
|
||||||
|
| Category | Result | Notes |
|
||||||
|
|----------|--------|-------|
|
||||||
|
| Injection | ✅ | - |
|
||||||
|
| Auth/Authz | ✅ | - |
|
||||||
|
| Data Protection | ✅ | - |
|
||||||
|
| Dependencies | ✅ | - |
|
||||||
|
|
||||||
|
## Vulnerabilities (if REJECT)
|
||||||
|
| # | Severity | Type | Location | Fix |
|
||||||
|
|---|----------|------|----------|-----|
|
||||||
|
| 1 | High | SQLi | `src/db.ts:42` | Use parameterized query |
|
||||||
|
|
||||||
|
## Warnings (non-blocking)
|
||||||
|
- {Security recommendations}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Cognitive load reduction rules:**
|
||||||
|
- No issues -> Check table only (10 lines or less)
|
||||||
|
- Warnings -> + Warnings 1-2 lines (15 lines or less)
|
||||||
|
- Vulnerabilities -> + Table format (30 lines or less)
|
||||||
|
allowed_tools:
|
||||||
|
- Read
|
||||||
|
- Glob
|
||||||
|
- Grep
|
||||||
|
- Write
|
||||||
|
- WebSearch
|
||||||
|
- WebFetch
|
||||||
|
rules:
|
||||||
|
- condition: approved
|
||||||
|
- condition: needs_fix
|
||||||
|
instruction_template: |
|
||||||
|
Perform security review on the changes. Check for vulnerabilities including:
|
||||||
|
- Injection attacks (SQL, Command, XSS)
|
||||||
|
- Authentication/Authorization issues
|
||||||
|
- Data exposure risks
|
||||||
|
- Cryptographic weaknesses
|
||||||
rules:
|
rules:
|
||||||
- condition: No issues found
|
- condition: all("approved")
|
||||||
next: security_review
|
next: supervise
|
||||||
- condition: Minor improvements needed
|
- condition: any("needs_fix")
|
||||||
next: improve
|
|
||||||
- condition: Structural fix required
|
|
||||||
next: fix
|
next: fix
|
||||||
instruction_template: |
|
|
||||||
Focus on **architecture and design** review. Do NOT review AI-specific issues (that's the ai_review step).
|
|
||||||
|
|
||||||
Review the changes and provide feedback.
|
|
||||||
|
|
||||||
- name: improve
|
|
||||||
edit: true
|
|
||||||
agent: ../agents/default/coder.md
|
|
||||||
allowed_tools:
|
|
||||||
- Read
|
|
||||||
- Glob
|
|
||||||
- Grep
|
|
||||||
- Edit
|
|
||||||
- Write
|
|
||||||
- Bash
|
|
||||||
- WebSearch
|
|
||||||
- WebFetch
|
|
||||||
permission_mode: acceptEdits
|
|
||||||
rules:
|
|
||||||
- condition: Improvements complete
|
|
||||||
next: review
|
|
||||||
- condition: Cannot proceed, insufficient info
|
|
||||||
next: plan
|
|
||||||
instruction_template: |
|
|
||||||
## Architect Feedback (This is the latest instruction - prioritize this)
|
|
||||||
{previous_response}
|
|
||||||
|
|
||||||
**Important**: Address the Architect's improvement suggestions.
|
|
||||||
These are minor improvements, not major design issues.
|
|
||||||
|
|
||||||
Make improvements such as:
|
|
||||||
- Naming improvements
|
|
||||||
- Small refactoring
|
|
||||||
- Adding/fixing comments
|
|
||||||
- Code organization
|
|
||||||
pass_previous_response: true
|
|
||||||
|
|
||||||
- name: fix
|
- name: fix
|
||||||
edit: true
|
edit: true
|
||||||
@ -319,96 +341,17 @@ steps:
|
|||||||
- WebFetch
|
- WebFetch
|
||||||
permission_mode: acceptEdits
|
permission_mode: acceptEdits
|
||||||
rules:
|
rules:
|
||||||
- condition: Architect feedback addressed
|
- condition: Fix complete
|
||||||
next: review
|
next: reviewers
|
||||||
- condition: Cannot proceed, insufficient info
|
- condition: Cannot proceed, insufficient info
|
||||||
next: plan
|
next: plan
|
||||||
instruction_template: |
|
instruction_template: |
|
||||||
## Architect Feedback (This is the latest instruction - prioritize this)
|
## Review Feedback (This is the latest instruction - prioritize this)
|
||||||
{previous_response}
|
{previous_response}
|
||||||
|
|
||||||
**Important**: Address the Architect's feedback.
|
**Important**: Address the feedback from the reviewers.
|
||||||
The "Original User Request" is reference information, not the latest instruction.
|
The "Original User Request" is reference information, not the latest instruction.
|
||||||
Review the session conversation history and fix the issues raised by the Architect.
|
Review the session conversation history and fix the issues raised by the reviewers.
|
||||||
pass_previous_response: true
|
|
||||||
|
|
||||||
- name: security_review
|
|
||||||
edit: false
|
|
||||||
agent: ../agents/default/security-reviewer.md
|
|
||||||
report:
|
|
||||||
name: 05-security-review.md
|
|
||||||
format: |
|
|
||||||
```markdown
|
|
||||||
# Security Review
|
|
||||||
|
|
||||||
## Result: APPROVE / REJECT
|
|
||||||
|
|
||||||
## Severity: None / Low / Medium / High / Critical
|
|
||||||
|
|
||||||
## Check Results
|
|
||||||
| Category | Result | Notes |
|
|
||||||
|----------|--------|-------|
|
|
||||||
| Injection | ✅ | - |
|
|
||||||
| Auth/Authz | ✅ | - |
|
|
||||||
| Data Protection | ✅ | - |
|
|
||||||
| Dependencies | ✅ | - |
|
|
||||||
|
|
||||||
## Vulnerabilities (if REJECT)
|
|
||||||
| # | Severity | Type | Location | Fix |
|
|
||||||
|---|----------|------|----------|-----|
|
|
||||||
| 1 | High | SQLi | `src/db.ts:42` | Use parameterized query |
|
|
||||||
|
|
||||||
## Warnings (non-blocking)
|
|
||||||
- {Security recommendations}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Cognitive load reduction rules:**
|
|
||||||
- No issues -> Check table only (10 lines or less)
|
|
||||||
- Warnings -> + Warnings 1-2 lines (15 lines or less)
|
|
||||||
- Vulnerabilities -> + Table format (30 lines or less)
|
|
||||||
allowed_tools:
|
|
||||||
- Read
|
|
||||||
- Glob
|
|
||||||
- Grep
|
|
||||||
- Write
|
|
||||||
- WebSearch
|
|
||||||
- WebFetch
|
|
||||||
rules:
|
|
||||||
- condition: No security issues
|
|
||||||
next: supervise
|
|
||||||
- condition: Vulnerabilities require fix
|
|
||||||
next: security_fix
|
|
||||||
instruction_template: |
|
|
||||||
Perform security review on the changes. Check for vulnerabilities including:
|
|
||||||
- Injection attacks (SQL, Command, XSS)
|
|
||||||
- Authentication/Authorization issues
|
|
||||||
- Data exposure risks
|
|
||||||
- Cryptographic weaknesses
|
|
||||||
|
|
||||||
- name: security_fix
|
|
||||||
edit: true
|
|
||||||
agent: ../agents/default/coder.md
|
|
||||||
allowed_tools:
|
|
||||||
- Read
|
|
||||||
- Glob
|
|
||||||
- Grep
|
|
||||||
- Edit
|
|
||||||
- Write
|
|
||||||
- Bash
|
|
||||||
- WebSearch
|
|
||||||
- WebFetch
|
|
||||||
permission_mode: acceptEdits
|
|
||||||
rules:
|
|
||||||
- condition: Security fix complete
|
|
||||||
next: security_review
|
|
||||||
- condition: Cannot proceed, insufficient info
|
|
||||||
next: plan
|
|
||||||
instruction_template: |
|
|
||||||
## Security Review Feedback (This is the latest instruction - prioritize this)
|
|
||||||
{previous_response}
|
|
||||||
|
|
||||||
**Important**: Fix the vulnerabilities identified in the security review.
|
|
||||||
Security issues require highest priority.
|
|
||||||
pass_previous_response: true
|
pass_previous_response: true
|
||||||
|
|
||||||
- name: supervise
|
- name: supervise
|
||||||
|
|||||||
@ -447,7 +447,44 @@ function createOrder(data: OrderData) {
|
|||||||
- 3回の重複 → 即抽出
|
- 3回の重複 → 即抽出
|
||||||
- ドメインが異なる重複 → 抽象化しない(例: 顧客用バリデーションと管理者用バリデーションは別物)
|
- ドメインが異なる重複 → 抽象化しない(例: 顧客用バリデーションと管理者用バリデーションは別物)
|
||||||
|
|
||||||
### 8. 呼び出しチェーン検証
|
### 8. 仕様準拠の検証
|
||||||
|
|
||||||
|
**変更が、プロジェクトの文書化された仕様に準拠しているか検証する。**
|
||||||
|
|
||||||
|
**検証対象:**
|
||||||
|
|
||||||
|
| 対象 | 確認内容 |
|
||||||
|
|------|---------|
|
||||||
|
| CLAUDE.md / README.md | スキーマ定義、設計原則、制約に従っているか |
|
||||||
|
| 型定義・Zodスキーマ | 新しいフィールドがスキーマに反映されているか |
|
||||||
|
| YAML/JSON設定ファイル | 文書化されたフォーマットに従っているか |
|
||||||
|
| 既存パターン | 同種のファイルと一貫性があるか |
|
||||||
|
|
||||||
|
**具体的なチェック:**
|
||||||
|
|
||||||
|
1. 設定ファイル(YAML等)を変更・追加した場合:
|
||||||
|
- CLAUDE.md等に記載されたスキーマ定義と突合する
|
||||||
|
- 無視されるフィールドや無効なフィールドが含まれていないか
|
||||||
|
- 必須フィールドが欠落していないか
|
||||||
|
|
||||||
|
2. 型定義やインターフェースを変更した場合:
|
||||||
|
- ドキュメントのスキーマ説明が更新されているか
|
||||||
|
- 既存の設定ファイルが新しいスキーマと整合するか
|
||||||
|
|
||||||
|
3. ワークフロー定義を変更した場合:
|
||||||
|
- ステップ種別(通常/parallel)に応じた正しいフィールドが使われているか
|
||||||
|
- 不要なフィールド(parallelサブステップのnext等)が残っていないか
|
||||||
|
|
||||||
|
**このパターンを見つけたら REJECT:**
|
||||||
|
|
||||||
|
| パターン | 問題 |
|
||||||
|
|---------|------|
|
||||||
|
| 仕様に存在しないフィールドの使用 | 無視されるか予期しない動作 |
|
||||||
|
| 仕様上無効な値の設定 | 実行時エラーまたは無視される |
|
||||||
|
| 文書化された制約への違反 | 設計意図に反する |
|
||||||
|
| ステップ種別とフィールドの不整合 | コピペミスの兆候 |
|
||||||
|
|
||||||
|
### 9. 呼び出しチェーン検証
|
||||||
|
|
||||||
**新しいパラメータ・フィールドが追加された場合、変更ファイル内だけでなく呼び出し元も検証する。**
|
**新しいパラメータ・フィールドが追加された場合、変更ファイル内だけでなく呼び出し元も検証する。**
|
||||||
|
|
||||||
@ -480,7 +517,7 @@ export async function executeWorkflow(config, cwd, task, options?) {
|
|||||||
|
|
||||||
**このパターンを見つけたら REJECT。** 個々のファイルが正しくても、結合されていなければ機能しない。
|
**このパターンを見つけたら REJECT。** 個々のファイルが正しくても、結合されていなければ機能しない。
|
||||||
|
|
||||||
### 9. 品質特性
|
### 10. 品質特性
|
||||||
|
|
||||||
| 特性 | 確認観点 |
|
| 特性 | 確認観点 |
|
||||||
|------|---------|
|
|------|---------|
|
||||||
@ -488,7 +525,7 @@ export async function executeWorkflow(config, cwd, task, options?) {
|
|||||||
| Maintainability | 変更・修正が容易か |
|
| Maintainability | 変更・修正が容易か |
|
||||||
| Observability | ログ・監視が可能な設計か |
|
| Observability | ログ・監視が可能な設計か |
|
||||||
|
|
||||||
### 10. 大局観
|
### 11. 大局観
|
||||||
|
|
||||||
**注意**: 細かい「クリーンコード」の指摘に終始しない。
|
**注意**: 細かい「クリーンコード」の指摘に終始しない。
|
||||||
|
|
||||||
@ -499,7 +536,7 @@ export async function executeWorkflow(config, cwd, task, options?) {
|
|||||||
- ビジネス要件と整合しているか
|
- ビジネス要件と整合しているか
|
||||||
- 命名がドメインと一貫しているか
|
- 命名がドメインと一貫しているか
|
||||||
|
|
||||||
### 11. 変更スコープの評価
|
### 12. 変更スコープの評価
|
||||||
|
|
||||||
**変更スコープを確認し、レポートに記載する(ブロッキングではない)。**
|
**変更スコープを確認し、レポートに記載する(ブロッキングではない)。**
|
||||||
|
|
||||||
@ -518,7 +555,7 @@ export async function executeWorkflow(config, cwd, task, options?) {
|
|||||||
**提案として記載すること(ブロッキングではない):**
|
**提案として記載すること(ブロッキングではない):**
|
||||||
- 分割可能な場合は分割案を提示
|
- 分割可能な場合は分割案を提示
|
||||||
|
|
||||||
### 12. 堂々巡りの検出
|
### 13. 堂々巡りの検出
|
||||||
|
|
||||||
レビュー回数が渡される場合(例: 「レビュー回数: 3回目」)、回数に応じて判断を変える。
|
レビュー回数が渡される場合(例: 「レビュー回数: 3回目」)、回数に応じて判断を変える。
|
||||||
|
|
||||||
|
|||||||
@ -46,13 +46,27 @@
|
|||||||
|
|
||||||
**推測で書かない。** 名前・値・振る舞いは必ずコードで確認する。
|
**推測で書かない。** 名前・値・振る舞いは必ずコードで確認する。
|
||||||
|
|
||||||
### 4. 実装アプローチ
|
### 4. 仕様・制約の確認
|
||||||
|
|
||||||
|
変更対象に関連する仕様を**必ず**確認する:
|
||||||
|
|
||||||
|
| 確認すべきもの | 確認方法 |
|
||||||
|
|--------------|---------|
|
||||||
|
| プロジェクト仕様(CLAUDE.md等) | ファイルを読んで制約・スキーマを把握 |
|
||||||
|
| 型定義・スキーマ | 関連する型定義ファイルを確認 |
|
||||||
|
| 設定ファイルの仕様 | YAML/JSONスキーマや既存の設定例を確認 |
|
||||||
|
| 既存のパターン・規約 | 同種のファイルがどう書かれているか確認 |
|
||||||
|
|
||||||
|
**仕様に反する計画は立てない。** 仕様が不明確な場合はその旨を明記する。
|
||||||
|
|
||||||
|
### 5. 実装アプローチ
|
||||||
|
|
||||||
実装の方向性を決める:
|
実装の方向性を決める:
|
||||||
|
|
||||||
- どのような手順で進めるか
|
- どのような手順で進めるか
|
||||||
- 注意すべき点
|
- 注意すべき点
|
||||||
- 確認が必要な点
|
- 確認が必要な点
|
||||||
|
- **仕様上の制約**(スキーマ、フォーマット、無視されるフィールド等)
|
||||||
|
|
||||||
## 重要
|
## 重要
|
||||||
|
|
||||||
|
|||||||
@ -81,7 +81,18 @@ Architectが「正しく作られているか(Verification)」を確認す
|
|||||||
| 本番Ready | モック・スタブ・TODO が残っていないか |
|
| 本番Ready | モック・スタブ・TODO が残っていないか |
|
||||||
| 動作 | 実際に期待通り動くか |
|
| 動作 | 実際に期待通り動くか |
|
||||||
|
|
||||||
### 6. ワークフロー全体の見直し
|
### 6. 仕様準拠の最終確認
|
||||||
|
|
||||||
|
**変更が、プロジェクトの文書化された仕様に準拠しているか最終確認する。**
|
||||||
|
|
||||||
|
確認すること:
|
||||||
|
- CLAUDE.md等に記載されたスキーマ・制約と、変更されたファイルが整合しているか
|
||||||
|
- 設定ファイル(YAML等)が文書化されたフォーマットに従っているか
|
||||||
|
- 型定義の変更がドキュメントにも反映されているか
|
||||||
|
|
||||||
|
**仕様違反を見つけたら REJECT。** 仕様は「たぶん合ってる」ではなく、実際に読んで突合する。
|
||||||
|
|
||||||
|
### 7. ワークフロー全体の見直し
|
||||||
|
|
||||||
**レポートディレクトリ内の全レポートを確認し、ワークフロー全体の整合性をチェックする。**
|
**レポートディレクトリ内の全レポートを確認し、ワークフロー全体の整合性をチェックする。**
|
||||||
|
|
||||||
@ -98,7 +109,7 @@ Architectが「正しく作られているか(Verification)」を確認す
|
|||||||
| 本来の目的から逸脱 | REJECT - 目的に立ち返るよう指示 |
|
| 本来の目的から逸脱 | REJECT - 目的に立ち返るよう指示 |
|
||||||
| スコープクリープ | 記録のみ - 次回タスクで対応 |
|
| スコープクリープ | 記録のみ - 次回タスクで対応 |
|
||||||
|
|
||||||
### 7. 改善提案の確認
|
### 8. 改善提案の確認
|
||||||
|
|
||||||
**レビューレポートを確認し、未対応の改善提案がないかチェックする。**
|
**レビューレポートを確認し、未対応の改善提案がないかチェックする。**
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
# Default TAKT Workflow
|
# Default TAKT Workflow
|
||||||
# Plan -> Implement -> AI Review -> Architect Review -> Security Review -> Supervisor Approval
|
# Plan -> Implement -> AI Review -> Reviewers (parallel: Architect + Security) -> Supervisor Approval
|
||||||
#
|
#
|
||||||
# Template Variables (auto-injected by buildInstruction):
|
# Template Variables (auto-injected by buildInstruction):
|
||||||
# {iteration} - Workflow-wide turn count (total steps executed across all agents)
|
# {iteration} - Workflow-wide turn count (total steps executed across all agents)
|
||||||
@ -178,7 +178,7 @@ steps:
|
|||||||
- WebFetch
|
- WebFetch
|
||||||
rules:
|
rules:
|
||||||
- condition: AI特有の問題なし
|
- condition: AI特有の問題なし
|
||||||
next: review
|
next: reviewers
|
||||||
- condition: AI特有の問題あり
|
- condition: AI特有の問題あり
|
||||||
next: ai_fix
|
next: ai_fix
|
||||||
instruction_template: |
|
instruction_template: |
|
||||||
@ -203,7 +203,7 @@ steps:
|
|||||||
permission_mode: acceptEdits
|
permission_mode: acceptEdits
|
||||||
rules:
|
rules:
|
||||||
- condition: AI問題の修正完了
|
- condition: AI問題の修正完了
|
||||||
next: review
|
next: reviewers
|
||||||
- condition: 判断できない、情報不足
|
- condition: 判断できない、情報不足
|
||||||
next: plan
|
next: plan
|
||||||
instruction_template: |
|
instruction_template: |
|
||||||
@ -218,99 +218,121 @@ steps:
|
|||||||
- スコープクリープの除去
|
- スコープクリープの除去
|
||||||
pass_previous_response: true
|
pass_previous_response: true
|
||||||
|
|
||||||
- name: review
|
- name: reviewers
|
||||||
edit: false
|
parallel:
|
||||||
agent: ../agents/default/architecture-reviewer.md
|
- name: arch-review
|
||||||
report:
|
edit: false
|
||||||
name: 04-architect-review.md
|
agent: ../agents/default/architecture-reviewer.md
|
||||||
format: |
|
report:
|
||||||
```markdown
|
name: 04-architect-review.md
|
||||||
# アーキテクチャレビュー
|
format: |
|
||||||
|
```markdown
|
||||||
|
# アーキテクチャレビュー
|
||||||
|
|
||||||
## 結果: APPROVE / IMPROVE / REJECT
|
## 結果: APPROVE / IMPROVE / REJECT
|
||||||
|
|
||||||
## サマリー
|
## サマリー
|
||||||
{1-2文で結果を要約}
|
{1-2文で結果を要約}
|
||||||
|
|
||||||
## 確認した観点
|
## 確認した観点
|
||||||
- [x] 構造・設計
|
- [x] 構造・設計
|
||||||
- [x] コード品質
|
- [x] コード品質
|
||||||
- [x] 変更スコープ
|
- [x] 変更スコープ
|
||||||
- [x] テストカバレッジ
|
- [x] テストカバレッジ
|
||||||
- [x] デッドコード
|
- [x] デッドコード
|
||||||
- [x] 呼び出しチェーン検証
|
- [x] 呼び出しチェーン検証
|
||||||
|
|
||||||
## 問題点(REJECTの場合)
|
## 問題点(REJECTの場合)
|
||||||
| # | 場所 | 問題 | 修正案 |
|
| # | 場所 | 問題 | 修正案 |
|
||||||
|---|------|------|--------|
|
|---|------|------|--------|
|
||||||
| 1 | `src/file.ts:42` | 問題の説明 | 修正方法 |
|
| 1 | `src/file.ts:42` | 問題の説明 | 修正方法 |
|
||||||
|
|
||||||
## 改善提案(任意・ブロッキングではない)
|
## 改善提案(任意・ブロッキングではない)
|
||||||
- {将来的な改善提案}
|
- {将来的な改善提案}
|
||||||
```
|
```
|
||||||
|
|
||||||
**認知負荷軽減ルール:**
|
**認知負荷軽減ルール:**
|
||||||
- APPROVE + 問題なし → サマリーのみ(5行以内)
|
- APPROVE + 問題なし → サマリーのみ(5行以内)
|
||||||
- APPROVE + 軽微な提案 → サマリー + 改善提案(15行以内)
|
- APPROVE + 軽微な提案 → サマリー + 改善提案(15行以内)
|
||||||
- REJECT → 問題点を表形式で(30行以内)
|
- REJECT → 問題点を表形式で(30行以内)
|
||||||
allowed_tools:
|
allowed_tools:
|
||||||
- Read
|
- Read
|
||||||
- Glob
|
- Glob
|
||||||
- Grep
|
- Grep
|
||||||
- Write
|
- Write
|
||||||
- WebSearch
|
- WebSearch
|
||||||
- WebFetch
|
- WebFetch
|
||||||
|
rules:
|
||||||
|
- condition: approved
|
||||||
|
- condition: needs_fix
|
||||||
|
instruction_template: |
|
||||||
|
**アーキテクチャと設計**のレビューに集中してください。AI特有の問題はレビューしないでください(ai_reviewステップで行います)。
|
||||||
|
|
||||||
|
変更をレビューしてフィードバックを提供してください。
|
||||||
|
|
||||||
|
**レビュー観点:**
|
||||||
|
- 構造・設計の妥当性
|
||||||
|
- コード品質
|
||||||
|
- 変更スコープの適切性
|
||||||
|
- テストカバレッジ
|
||||||
|
- デッドコード
|
||||||
|
- 呼び出しチェーン検証
|
||||||
|
|
||||||
|
- name: security-review
|
||||||
|
edit: false
|
||||||
|
agent: ../agents/default/security-reviewer.md
|
||||||
|
report:
|
||||||
|
name: 05-security-review.md
|
||||||
|
format: |
|
||||||
|
```markdown
|
||||||
|
# セキュリティレビュー
|
||||||
|
|
||||||
|
## 結果: APPROVE / REJECT
|
||||||
|
|
||||||
|
## 重大度: None / Low / Medium / High / Critical
|
||||||
|
|
||||||
|
## チェック結果
|
||||||
|
| カテゴリ | 結果 | 備考 |
|
||||||
|
|---------|------|------|
|
||||||
|
| インジェクション | ✅ | - |
|
||||||
|
| 認証・認可 | ✅ | - |
|
||||||
|
| データ保護 | ✅ | - |
|
||||||
|
| 依存関係 | ✅ | - |
|
||||||
|
|
||||||
|
## 脆弱性(REJECTの場合)
|
||||||
|
| # | 重大度 | 種類 | 場所 | 修正案 |
|
||||||
|
|---|--------|------|------|--------|
|
||||||
|
| 1 | High | SQLi | `src/db.ts:42` | パラメータ化クエリを使用 |
|
||||||
|
|
||||||
|
## 警告(ブロッキングではない)
|
||||||
|
- {セキュリティに関する推奨事項}
|
||||||
|
```
|
||||||
|
|
||||||
|
**認知負荷軽減ルール:**
|
||||||
|
- 問題なし → チェック表のみ(10行以内)
|
||||||
|
- 警告あり → + 警告を1-2行(15行以内)
|
||||||
|
- 脆弱性あり → + 表形式で(30行以内)
|
||||||
|
allowed_tools:
|
||||||
|
- Read
|
||||||
|
- Glob
|
||||||
|
- Grep
|
||||||
|
- Write
|
||||||
|
- WebSearch
|
||||||
|
- WebFetch
|
||||||
|
rules:
|
||||||
|
- condition: approved
|
||||||
|
- condition: needs_fix
|
||||||
|
instruction_template: |
|
||||||
|
変更に対してセキュリティレビューを行ってください。以下の脆弱性を確認してください:
|
||||||
|
- インジェクション攻撃(SQL, コマンド, XSS)
|
||||||
|
- 認証・認可の問題
|
||||||
|
- データ露出リスク
|
||||||
|
- 暗号化の弱点
|
||||||
rules:
|
rules:
|
||||||
- condition: 問題なし
|
- condition: all("approved")
|
||||||
next: security_review
|
next: supervise
|
||||||
- condition: 改善すべき点がある(軽微)
|
- condition: any("needs_fix")
|
||||||
next: improve
|
|
||||||
- condition: 構造的な修正が必要
|
|
||||||
next: fix
|
next: fix
|
||||||
instruction_template: |
|
|
||||||
**アーキテクチャと設計**のレビューに集中してください。AI特有の問題はレビューしないでください(次のステップで行います)。
|
|
||||||
|
|
||||||
変更をレビューしてフィードバックを提供してください。
|
|
||||||
|
|
||||||
**レビュー観点:**
|
|
||||||
- 構造・設計の妥当性
|
|
||||||
- コード品質
|
|
||||||
- 変更スコープの適切性
|
|
||||||
- テストカバレッジ
|
|
||||||
- デッドコード
|
|
||||||
- 呼び出しチェーン検証
|
|
||||||
|
|
||||||
- name: improve
|
|
||||||
edit: true
|
|
||||||
agent: ../agents/default/coder.md
|
|
||||||
allowed_tools:
|
|
||||||
- Read
|
|
||||||
- Glob
|
|
||||||
- Grep
|
|
||||||
- Edit
|
|
||||||
- Write
|
|
||||||
- Bash
|
|
||||||
- WebSearch
|
|
||||||
- WebFetch
|
|
||||||
permission_mode: acceptEdits
|
|
||||||
rules:
|
|
||||||
- condition: 改善完了
|
|
||||||
next: review
|
|
||||||
- condition: 判断できない、情報不足
|
|
||||||
next: plan
|
|
||||||
instruction_template: |
|
|
||||||
## Architect Feedback (これが最新の指示です - 優先して対応してください)
|
|
||||||
{previous_response}
|
|
||||||
|
|
||||||
**重要**: Architectの改善提案に対応してください。
|
|
||||||
これらは軽微な改善であり、設計上の大きな問題ではありません。
|
|
||||||
|
|
||||||
以下のような改善を行ってください:
|
|
||||||
- 命名の改善
|
|
||||||
- 小さなリファクタリング
|
|
||||||
- コメントの追加・修正
|
|
||||||
- コードの整理
|
|
||||||
pass_previous_response: true
|
|
||||||
|
|
||||||
- name: fix
|
- name: fix
|
||||||
edit: true
|
edit: true
|
||||||
@ -326,95 +348,16 @@ steps:
|
|||||||
- WebFetch
|
- WebFetch
|
||||||
permission_mode: acceptEdits
|
permission_mode: acceptEdits
|
||||||
rules:
|
rules:
|
||||||
- condition: Architectの指摘を修正完了
|
- condition: 修正完了
|
||||||
next: review
|
next: reviewers
|
||||||
- condition: 判断できない、情報不足
|
- condition: 判断できない、情報不足
|
||||||
next: plan
|
next: plan
|
||||||
instruction_template: |
|
instruction_template: |
|
||||||
## Architect Feedback (これが最新の指示です - 優先して対応してください)
|
## Review Feedback (これが最新の指示です - 優先して対応してください)
|
||||||
{previous_response}
|
{previous_response}
|
||||||
|
|
||||||
**重要**: Architectのフィードバックに対応してください。
|
**重要**: レビュアーのフィードバックに対応してください。
|
||||||
セッションの会話履歴を確認し、Architectの指摘事項を修正してください。
|
セッションの会話履歴を確認し、レビュアーの指摘事項を修正してください。
|
||||||
pass_previous_response: true
|
|
||||||
|
|
||||||
- name: security_review
|
|
||||||
edit: false
|
|
||||||
agent: ../agents/default/security-reviewer.md
|
|
||||||
report:
|
|
||||||
name: 05-security-review.md
|
|
||||||
format: |
|
|
||||||
```markdown
|
|
||||||
# セキュリティレビュー
|
|
||||||
|
|
||||||
## 結果: APPROVE / REJECT
|
|
||||||
|
|
||||||
## 重大度: None / Low / Medium / High / Critical
|
|
||||||
|
|
||||||
## チェック結果
|
|
||||||
| カテゴリ | 結果 | 備考 |
|
|
||||||
|---------|------|------|
|
|
||||||
| インジェクション | ✅ | - |
|
|
||||||
| 認証・認可 | ✅ | - |
|
|
||||||
| データ保護 | ✅ | - |
|
|
||||||
| 依存関係 | ✅ | - |
|
|
||||||
|
|
||||||
## 脆弱性(REJECTの場合)
|
|
||||||
| # | 重大度 | 種類 | 場所 | 修正案 |
|
|
||||||
|---|--------|------|------|--------|
|
|
||||||
| 1 | High | SQLi | `src/db.ts:42` | パラメータ化クエリを使用 |
|
|
||||||
|
|
||||||
## 警告(ブロッキングではない)
|
|
||||||
- {セキュリティに関する推奨事項}
|
|
||||||
```
|
|
||||||
|
|
||||||
**認知負荷軽減ルール:**
|
|
||||||
- 問題なし → チェック表のみ(10行以内)
|
|
||||||
- 警告あり → + 警告を1-2行(15行以内)
|
|
||||||
- 脆弱性あり → + 表形式で(30行以内)
|
|
||||||
allowed_tools:
|
|
||||||
- Read
|
|
||||||
- Glob
|
|
||||||
- Grep
|
|
||||||
- Write
|
|
||||||
- WebSearch
|
|
||||||
- WebFetch
|
|
||||||
rules:
|
|
||||||
- condition: セキュリティ問題なし
|
|
||||||
next: supervise
|
|
||||||
- condition: 脆弱性があり修正が必要
|
|
||||||
next: security_fix
|
|
||||||
instruction_template: |
|
|
||||||
変更に対してセキュリティレビューを行ってください。以下の脆弱性を確認してください:
|
|
||||||
- インジェクション攻撃(SQL, コマンド, XSS)
|
|
||||||
- 認証・認可の問題
|
|
||||||
- データ露出リスク
|
|
||||||
- 暗号化の弱点
|
|
||||||
|
|
||||||
- name: security_fix
|
|
||||||
edit: true
|
|
||||||
agent: ../agents/default/coder.md
|
|
||||||
allowed_tools:
|
|
||||||
- Read
|
|
||||||
- Glob
|
|
||||||
- Grep
|
|
||||||
- Edit
|
|
||||||
- Write
|
|
||||||
- Bash
|
|
||||||
- WebSearch
|
|
||||||
- WebFetch
|
|
||||||
permission_mode: acceptEdits
|
|
||||||
rules:
|
|
||||||
- condition: セキュリティ修正完了
|
|
||||||
next: security_review
|
|
||||||
- condition: 判断できない、情報不足
|
|
||||||
next: plan
|
|
||||||
instruction_template: |
|
|
||||||
## Security Review Feedback (これが最新の指示です - 優先して対応してください)
|
|
||||||
{previous_response}
|
|
||||||
|
|
||||||
**重要**: セキュリティレビューで指摘された脆弱性を修正してください。
|
|
||||||
セキュリティの問題は最優先で対応が必要です。
|
|
||||||
pass_previous_response: true
|
pass_previous_response: true
|
||||||
|
|
||||||
- name: supervise
|
- name: supervise
|
||||||
|
|||||||
@ -48,6 +48,113 @@ describe('getBuiltinWorkflow', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('default workflow parallel reviewers step', () => {
|
||||||
|
it('should have a reviewers step with parallel sub-steps', () => {
|
||||||
|
const workflow = getBuiltinWorkflow('default');
|
||||||
|
expect(workflow).not.toBeNull();
|
||||||
|
|
||||||
|
const reviewersStep = workflow!.steps.find((s) => s.name === 'reviewers');
|
||||||
|
expect(reviewersStep).toBeDefined();
|
||||||
|
expect(reviewersStep!.parallel).toBeDefined();
|
||||||
|
expect(reviewersStep!.parallel).toHaveLength(2);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have arch-review and security-review as parallel sub-steps', () => {
|
||||||
|
const workflow = getBuiltinWorkflow('default');
|
||||||
|
const reviewersStep = workflow!.steps.find((s) => s.name === 'reviewers')!;
|
||||||
|
const subStepNames = reviewersStep.parallel!.map((s) => s.name);
|
||||||
|
|
||||||
|
expect(subStepNames).toContain('arch-review');
|
||||||
|
expect(subStepNames).toContain('security-review');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have aggregate conditions on the reviewers parent step', () => {
|
||||||
|
const workflow = getBuiltinWorkflow('default');
|
||||||
|
const reviewersStep = workflow!.steps.find((s) => s.name === 'reviewers')!;
|
||||||
|
|
||||||
|
expect(reviewersStep.rules).toBeDefined();
|
||||||
|
expect(reviewersStep.rules).toHaveLength(2);
|
||||||
|
|
||||||
|
const allRule = reviewersStep.rules!.find((r) => r.isAggregateCondition && r.aggregateType === 'all');
|
||||||
|
expect(allRule).toBeDefined();
|
||||||
|
expect(allRule!.aggregateConditionText).toBe('approved');
|
||||||
|
expect(allRule!.next).toBe('supervise');
|
||||||
|
|
||||||
|
const anyRule = reviewersStep.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 matching conditions on sub-steps for aggregation', () => {
|
||||||
|
const workflow = getBuiltinWorkflow('default');
|
||||||
|
const reviewersStep = workflow!.steps.find((s) => s.name === 'reviewers')!;
|
||||||
|
|
||||||
|
for (const subStep of reviewersStep.parallel!) {
|
||||||
|
expect(subStep.rules).toBeDefined();
|
||||||
|
const conditions = subStep.rules!.map((r) => r.condition);
|
||||||
|
expect(conditions).toContain('approved');
|
||||||
|
expect(conditions).toContain('needs_fix');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have ai_review transitioning to reviewers step', () => {
|
||||||
|
const workflow = getBuiltinWorkflow('default');
|
||||||
|
const aiReviewStep = workflow!.steps.find((s) => s.name === 'ai_review')!;
|
||||||
|
|
||||||
|
const approveRule = aiReviewStep.rules!.find((r) => r.next === 'reviewers');
|
||||||
|
expect(approveRule).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have ai_fix transitioning to reviewers step', () => {
|
||||||
|
const workflow = getBuiltinWorkflow('default');
|
||||||
|
const aiFixStep = workflow!.steps.find((s) => s.name === 'ai_fix')!;
|
||||||
|
|
||||||
|
const fixedRule = aiFixStep.rules!.find((r) => r.next === 'reviewers');
|
||||||
|
expect(fixedRule).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have fix step transitioning back to reviewers', () => {
|
||||||
|
const workflow = getBuiltinWorkflow('default');
|
||||||
|
const fixStep = workflow!.steps.find((s) => s.name === 'fix')!;
|
||||||
|
|
||||||
|
const fixedRule = fixStep.rules!.find((r) => r.next === 'reviewers');
|
||||||
|
expect(fixedRule).toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not have old separate review/security_review/improve steps', () => {
|
||||||
|
const workflow = getBuiltinWorkflow('default');
|
||||||
|
const stepNames = workflow!.steps.map((s) => s.name);
|
||||||
|
|
||||||
|
expect(stepNames).not.toContain('review');
|
||||||
|
expect(stepNames).not.toContain('security_review');
|
||||||
|
expect(stepNames).not.toContain('improve');
|
||||||
|
expect(stepNames).not.toContain('security_fix');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have sub-steps with correct agents', () => {
|
||||||
|
const workflow = getBuiltinWorkflow('default');
|
||||||
|
const reviewersStep = workflow!.steps.find((s) => s.name === 'reviewers')!;
|
||||||
|
|
||||||
|
const archReview = reviewersStep.parallel!.find((s) => s.name === 'arch-review')!;
|
||||||
|
expect(archReview.agent).toContain('architecture-reviewer');
|
||||||
|
|
||||||
|
const secReview = reviewersStep.parallel!.find((s) => s.name === 'security-review')!;
|
||||||
|
expect(secReview.agent).toContain('security-reviewer');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should have reports configured on sub-steps', () => {
|
||||||
|
const workflow = getBuiltinWorkflow('default');
|
||||||
|
const reviewersStep = workflow!.steps.find((s) => s.name === 'reviewers')!;
|
||||||
|
|
||||||
|
const archReview = reviewersStep.parallel!.find((s) => s.name === 'arch-review')!;
|
||||||
|
expect(archReview.report).toBeDefined();
|
||||||
|
|
||||||
|
const secReview = reviewersStep.parallel!.find((s) => s.name === 'security-review')!;
|
||||||
|
expect(secReview.report).toBeDefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('loadAllWorkflows', () => {
|
describe('loadAllWorkflows', () => {
|
||||||
let testDir: string;
|
let testDir: string;
|
||||||
|
|
||||||
|
|||||||
@ -74,8 +74,8 @@ export const ReportFieldSchema = z.union([
|
|||||||
export const WorkflowRuleSchema = z.object({
|
export const WorkflowRuleSchema = z.object({
|
||||||
/** Human-readable condition text */
|
/** Human-readable condition text */
|
||||||
condition: z.string().min(1),
|
condition: z.string().min(1),
|
||||||
/** Next step name (e.g., implement, COMPLETE, ABORT) */
|
/** Next step name (e.g., implement, COMPLETE, ABORT). Optional for parallel sub-steps (parent handles routing). */
|
||||||
next: z.string().min(1),
|
next: z.string().min(1).optional(),
|
||||||
/** Template for additional AI output */
|
/** Template for additional AI output */
|
||||||
appendix: z.string().optional(),
|
appendix: z.string().optional(),
|
||||||
});
|
});
|
||||||
|
|||||||
@ -53,8 +53,8 @@ export interface SessionState {
|
|||||||
export interface WorkflowRule {
|
export interface WorkflowRule {
|
||||||
/** Human-readable condition text */
|
/** Human-readable condition text */
|
||||||
condition: string;
|
condition: string;
|
||||||
/** Next step name (e.g., implement, COMPLETE, ABORT) */
|
/** Next step name (e.g., implement, COMPLETE, ABORT). Optional for parallel sub-steps. */
|
||||||
next: string;
|
next?: string;
|
||||||
/** Template for additional AI output */
|
/** Template for additional AI output */
|
||||||
appendix?: string;
|
appendix?: string;
|
||||||
/** Whether this condition uses ai() expression (set by loader) */
|
/** Whether this condition uses ai() expression (set by loader) */
|
||||||
|
|||||||
@ -110,7 +110,7 @@ export class WorkflowEngine extends EventEmitter {
|
|||||||
for (const step of this.config.steps) {
|
for (const step of this.config.steps) {
|
||||||
if (step.rules) {
|
if (step.rules) {
|
||||||
for (const rule of step.rules) {
|
for (const rule of step.rules) {
|
||||||
if (!stepNames.has(rule.next)) {
|
if (rule.next && !stepNames.has(rule.next)) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Invalid rule in step "${step.name}": target step "${rule.next}" does not exist`
|
`Invalid rule in step "${step.name}": target step "${rule.next}" does not exist`
|
||||||
);
|
);
|
||||||
|
|||||||
@ -20,7 +20,7 @@ export function determineNextStepByRules(
|
|||||||
if (!rule) {
|
if (!rule) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return rule.next;
|
return rule.next ?? null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user