Files
proffesor-for-testing__agen…/docs/multi-language-goap-implementation-plan.md
Profa e2fb4a2f14 feat(multi-lang): add docs, ADRs, tests, and fixtures for multi-language support
Update ADRs 075-079 with implementation details, revise the
multi-language GOAP implementation plan, add test generators and
parser test fixtures for Go, Rust, Java, C#, Swift, Python.
Include skill validation schema updates and v2→v3 migration skill.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 12:00:01 +00:00

965 lines
40 KiB
Markdown

# AQE Multi-Language Test Generation -- GOAP Implementation Plan
**Date**: 2026-03-04
**Status**: Phases 1-4 Complete (2026-03-05). Phase 5 pending.
**Prerequisite**: Read `docs/multi-language-test-generation-plan.md` for full context
**GitHub Issue**: [#319](https://github.com/proffesor-for-testing/agentic-qe/issues/319)
### Governing ADRs
| ADR | Governs Milestones |
|-----|-------------------|
| [ADR-075](../implementation/adrs/ADR-075-unified-test-framework-type-system.md) — Unified TestFramework Type System | M1.1, M1.2, M1.3 |
| [ADR-076](../implementation/adrs/ADR-076-tree-sitter-wasm-multi-language-parser.md) — tree-sitter WASM Multi-Language Parser | M1.4, M1.5, M1.5-PY, M1.11 |
| [ADR-077](../implementation/adrs/ADR-077-compilation-validation-loop.md) — Compilation Validation Loop | M1.7, M1.9 |
| [ADR-078](../implementation/adrs/ADR-078-backward-compatible-multi-language-api.md) — Backward-Compatible Multi-Language API | M1.2, M1.6, M1.9 |
| [ADR-079](../implementation/adrs/ADR-079-language-specific-test-file-path-resolution.md) — Language-Specific Test File Path Resolution | M1.8 |
---
## State Model
```
CURRENT STATE:
languages_with_full_generation: [typescript, javascript]
languages_with_stub_generation: [python]
languages_with_zero_generation: [java, csharp, go, rust, swift, kotlin, dart]
test_framework_types_divergent: true (routing/types.ts vs interfaces.ts)
parser_abstraction: false (only TypeScriptParser, no ILanguageParser)
tree_sitter_integrated: false
language_auto_detection: false
compilation_validation: false
python_ast_parsing: false (always falls back to stubs)
GOAL STATE:
languages_with_full_generation: [typescript, javascript, python, java, csharp, go, rust, swift, kotlin, dart]
test_framework_types_divergent: false (single source of truth)
parser_abstraction: true
tree_sitter_integrated: true
language_auto_detection: true
compilation_validation: true (opt-in)
python_ast_parsing: true
ACTUAL STATE (2026-03-05):
languages_with_full_generation: [typescript, javascript, python, java, csharp, go, rust, swift, kotlin, dart] ✅
test_framework_types_divergent: false ✅ (unified in src/shared/types/test-frameworks.ts)
parser_abstraction: true ✅ (ILanguageParser interface + 8 implementations)
tree_sitter_integrated: AMENDED ⚠️ (enhanced regex, not WASM — see ADR-076 amendment)
language_auto_detection: true ✅ (src/shared/language-detector.ts)
compilation_validation: true ✅ (opt-in, src/.../compilation-validator.ts)
python_ast_parsing: true ✅ (via regex parser, not TS compiler)
```
---
## Execution Status (2026-03-05)
| Milestone | Status | Tests | Notes |
|-----------|--------|-------|-------|
| M1.1 | ✅ Complete | 24 pass | `test-frameworks.ts` — 18 frameworks, 10 languages |
| M1.2 | ✅ Complete | — | Interfaces updated, framework optional |
| M1.3 | ✅ Complete | 47 pass | Factory with alias resolution, 18 frameworks |
| M1.4 | ✅ Complete | 7 pass | `ILanguageParser` + `TypeScriptLanguageParser` adapter |
| M1.5 | ✅ Complete (amended) | 24 pass | Enhanced regex, NOT tree-sitter WASM (see ADR-076) |
| M1.5-PY | ✅ Complete | — | Python routes to regex parser |
| M1.6 | ✅ Complete | 25 pass | Language auto-detection |
| M1.7 | ✅ Complete | 7 pass | Compilation validation loop |
| M1.8 | ✅ Complete | 13 pass | Test file path resolver |
| M1.9 | ✅ Complete | 131 pass | Wired into TestGeneratorService |
| M1.10 | ✅ Complete | — | Language-aware prompts for all 10 languages |
| M1.11 | ✅ Complete | — | Code metrics tree-sitter dispatch |
| **GATE 1** | ✅ PASSED | 211 | Build clean |
| M2.1 | ✅ Complete | 18 pass | JUnit 5 + Mockito + AssertJ + Spring |
| M2.2 | ✅ Complete | 27 pass | xUnit + Moq + FluentAssertions |
| M2.3 | ✅ Complete | 13 pass | Go table-driven + t.Run |
| M2.REGISTRY | ✅ Complete | — | All Phase 2 generators wired |
| **GATE 2** | ✅ PASSED | 146 | Build clean |
| M3.1 | ✅ Complete | 28 pass | Rust + ownership analysis + tokio |
| M4.1 | ✅ Complete | 26 pass | Swift Testing (@Suite/@Test/#expect) |
| M4.2 | ✅ Complete | 22 pass | Kotlin JUnit + MockK + coroutines |
| M4.3 | ✅ Complete | 27 pass | Flutter test + Mockito + widgets |
| M4.4 | ✅ Complete | 28 pass | React Native Jest + RNTL |
| M4.5 | ✅ Complete | 19 pass | Mobile detectors (SwiftUI/Compose/Flutter/RN) |
| M4.REGISTRY | ✅ Complete | — | All generators wired, factory complete |
| **GATE 3** | ✅ PASSED | 18,244 | Full suite, 0 failures |
### Post-Implementation Fixes (Brutal Honesty Review, 2026-03-05)
| Fix | Description |
|-----|-------------|
| Rename `tree-sitter-parser.ts` → `multi-language-parser.ts` | Honest naming for regex-based implementation |
| Add `convertParsedFile` to `RustTestGenerator` | Missing ParsedFile→CodeAnalysis bridge |
| Update `services/index.ts` barrel | Export all 12 generators (was only 4) |
| Create M4.5 mobile-detector.ts | Was silently skipped — now implemented with 19 tests |
| Document TestNG/NUnit aliasing | Inline comments on factory alias limitations |
| Enhanced regex utilities | `joinMultiLineSignatures`, `matchBalancedBrackets`, brace-depth tracking |
### Decision Amendments
| ADR | Original Decision | Amended Decision | Reason |
|-----|-------------------|------------------|--------|
| ADR-076 | tree-sitter WASM (Option 1) | Enhanced regex (Option 3b) | Zero deps, sufficient accuracy (~97-98%), tree-sitter deferred as future enhancement |
### Remaining Work
| Item | Priority | Description |
|------|----------|-------------|
| tree-sitter WASM | Low | Optional upgrade for 100% parsing accuracy (GitHub issue created) |
| TestNG generator | Low | Dedicated generator instead of JUnit5 alias |
| NUnit generator | Low | Dedicated generator instead of xUnit alias |
| Phase 5: KG + Quality | Future | Multi-language KG indexing, coverage report parsing |
---
## File Ownership Map
This is CRITICAL for swarm execution. Two agents must NEVER edit the same file simultaneously. Every file touched by the plan is assigned to exactly one milestone task.
### Shared Foundation Files (Phase 1 only -- must complete before any Phase 2+ work)
| File | Owner Milestone |
|------|----------------|
| `src/shared/types/test-frameworks.ts` | M1.1 |
| `src/shared/types/index.ts` | M1.1 |
| `src/domains/test-generation/interfaces.ts` | M1.2 |
| `src/routing/types.ts` | M1.2 |
| `src/domains/test-generation/factories/test-generator-factory.ts` | M1.3 |
| `src/shared/parsers/interfaces.ts` | M1.4 |
| `src/shared/parsers/typescript-parser.ts` | M1.4 |
| `src/shared/parsers/index.ts` | M1.4 |
| `src/shared/parsers/multi-language-parser.ts` | M1.5 |
| `src/shared/language-detector.ts` | M1.6 |
| `src/domains/test-generation/services/compilation-validator.ts` | M1.7 |
| `src/domains/test-generation/services/test-file-resolver.ts` | M1.8 |
| `src/domains/test-generation/services/test-generator.ts` | M1.9 |
| `src/domains/test-generation/prompts/language-prompts.ts` | M1.10 |
| `src/domains/test-generation/generators/index.ts` | M2.REGISTRY (after all generators created) |
| `src/shared/metrics/code-metrics.ts` | M1.11 |
### Generator Files (Phase 2-4 -- can be parallel after Phase 1)
| File | Owner Milestone |
|------|----------------|
| `src/domains/test-generation/generators/junit5-generator.ts` | M2.1 |
| `src/domains/test-generation/detectors/spring-detector.ts` | M2.1 |
| `src/domains/test-generation/generators/xunit-generator.ts` | M2.2 |
| `src/domains/test-generation/generators/go-test-generator.ts` | M2.3 |
| `src/domains/test-generation/generators/rust-test-generator.ts` | M3.1 |
| `src/shared/parsers/rust-ownership-analyzer.ts` | M3.1 |
| `src/domains/test-generation/context/rust-context-builder.ts` | M3.1 |
| `src/domains/test-generation/generators/swift-testing-generator.ts` | M4.1 |
| `src/domains/test-generation/generators/xctest-generator.ts` | M4.1 |
| `src/domains/test-generation/generators/kotlin-junit-generator.ts` | M4.2 |
| `src/domains/test-generation/generators/flutter-test-generator.ts` | M4.3 |
| `src/domains/test-generation/generators/jest-rn-generator.ts` | M4.4 |
| `src/domains/test-generation/detectors/mobile-detector.ts` | M4.5 |
| `src/domains/test-generation/generators/pytest-generator.ts` | M1.5-PY (Python AST upgrade) |
### Test Files (mirror source ownership)
| File | Owner Milestone |
|------|----------------|
| `tests/shared/types/test-frameworks.test.ts` | M1.1 |
| `tests/shared/parsers/interfaces.test.ts` | M1.4 |
| `tests/shared/parsers/multi-language-parser.test.ts` | M1.5 |
| `tests/shared/language-detector.test.ts` | M1.6 |
| `tests/domains/test-generation/services/compilation-validator.test.ts` | M1.7 |
| `tests/domains/test-generation/services/test-file-resolver.test.ts` | M1.8 |
| `tests/domains/test-generation/generators/junit5-generator.test.ts` | M2.1 |
| `tests/domains/test-generation/generators/xunit-generator.test.ts` | M2.2 |
| `tests/domains/test-generation/generators/go-test-generator.test.ts` | M2.3 |
| `tests/domains/test-generation/generators/rust-test-generator.test.ts` | M3.1 |
| `tests/domains/test-generation/generators/swift-testing-generator.test.ts` | M4.1 |
| `tests/domains/test-generation/generators/kotlin-junit-generator.test.ts` | M4.2 |
| `tests/domains/test-generation/generators/flutter-test-generator.test.ts` | M4.3 |
| `tests/domains/test-generation/generators/jest-rn-generator.test.ts` | M4.4 |
---
## Phase 1: Foundation (SEQUENTIAL -- blocks everything else)
All Phase 1 milestones execute in dependency order. No Phase 2+ work can begin until Phase 1 passes the risk gate.
### M1.1 -- Unified Type System ([ADR-075](../implementation/adrs/ADR-075-unified-test-framework-type-system.md))
**Goal**: Single source of truth for `TestFramework`, `SupportedLanguage`, `E2EFramework`
**Agent**: `system-architect`
**Preconditions**: None (first task)
**Actions**:
1. Create `src/shared/types/test-frameworks.ts` with:
- `TestFramework` union type (all 18 values from plan Section 2.0.1)
- `E2EFramework` union type (`playwright`, `cypress`, `selenium`)
- `SupportedLanguage` union type (10 values)
- `RecognizedLanguage` type (superset including `ruby`, `php`)
- `DEFAULT_FRAMEWORKS` map: `Record<SupportedLanguage, TestFramework>`
- `FRAMEWORK_ALIASES` map: `Record<string, TestFramework>` (maps `'junit'` -> `'junit5'`, `'xunit'` -> `'xunit'`, etc.)
- `FRAMEWORK_TO_LANGUAGE` map: `Record<TestFramework, SupportedLanguage>`
- `LANGUAGE_FILE_EXTENSIONS` map: `Record<string, SupportedLanguage>` (`.java` -> `'java'`, etc.)
2. Export from `src/shared/types/index.ts`
3. Create `tests/shared/types/test-frameworks.test.ts`:
- Verify all aliases resolve
- Verify all frameworks map to a language
- Verify all old 5-value TestFramework values still exist (backward compat)
**Verification**:
```bash
npm run build && npm test -- --run tests/shared/types/test-frameworks.test.ts
```
**Files touched**: `src/shared/types/test-frameworks.ts` (NEW), `src/shared/types/index.ts` (EDIT), `tests/shared/types/test-frameworks.test.ts` (NEW)
---
### M1.2 -- Update Interfaces and Routing Types ([ADR-075](../implementation/adrs/ADR-075-unified-test-framework-type-system.md), [ADR-078](../implementation/adrs/ADR-078-backward-compatible-multi-language-api.md))
**Goal**: `IGenerateTestsRequest` gets optional `language` field; both `interfaces.ts` and `routing/types.ts` import `TestFramework` from shared
**Agent**: `system-architect`
**Preconditions**: M1.1
**Actions**:
1. Edit `src/domains/test-generation/interfaces.ts`:
- Change line 132 (`export type TestFramework = ...`) to re-export from shared: `export type { TestFramework } from '../../shared/types/test-frameworks.js';`
- Also re-export `SupportedLanguage` from shared
- Update `IGenerateTestsRequest` (line 34-40): make `framework` optional (`framework?: TestFramework`), add `language?: SupportedLanguage`, add `projectRoot?: string`, `compileValidation?: boolean`, `maxCompileRetries?: number`
- Update `IGeneratedTest`: add `language?: SupportedLanguage`, `framework?: TestFramework`, `compilationValidated?: boolean`, `compilationErrors?: string[]`
2. Edit `src/routing/types.ts`:
- Change `ProgrammingLanguage` to re-export from shared: `export type { RecognizedLanguage as ProgrammingLanguage } from '../shared/types/test-frameworks.js';`
- Change `TestFramework` to re-export from shared: `export type { TestFramework } from '../shared/types/test-frameworks.js';`
- Keep `E2EFramework` as local or also re-export depending on overlap
3. Verify no TypeScript compilation errors across the entire project
**Verification**:
```bash
npm run build # MUST pass with zero type errors
npm test -- --run # All 14,000+ tests pass
```
**Files touched**: `src/domains/test-generation/interfaces.ts` (EDIT), `src/routing/types.ts` (EDIT)
**Risk**: This touches two high-traffic files. Every downstream import of `TestFramework` must still resolve. Run full build to confirm.
---
### M1.3 -- Update Factory with Alias Resolution
**Goal**: `TestGeneratorFactory` resolves `FRAMEWORK_ALIASES` and has placeholder `case` branches for new frameworks (throws "not yet implemented")
**Agent**: `coder`
**Preconditions**: M1.1, M1.2
**Actions**:
1. Edit `src/domains/test-generation/factories/test-generator-factory.ts`:
- Import `FRAMEWORK_ALIASES`, `TestFramework` from shared types
- Update `SUPPORTED_FRAMEWORKS` array to include all 18 values
- Add alias resolution in `create()`: if framework is an alias key, resolve to canonical value
- Add `case` branches in `createGenerator()` for new frameworks that throw `new Error('Generator for ${framework} not yet implemented')`
- Update `supports()` to check aliases too
2. Update factory tests if they exist
**Verification**:
```bash
npm run build && npm test -- --run tests/domains/test-generation/
```
**Files touched**: `src/domains/test-generation/factories/test-generator-factory.ts` (EDIT)
---
### M1.4 -- Parser Abstraction Layer ([ADR-076](../implementation/adrs/ADR-076-tree-sitter-wasm-multi-language-parser.md))
**Goal**: Define `ILanguageParser` interface; refactor `TypeScriptParser` to implement it
**Agent**: `system-architect`
**Preconditions**: M1.1
**Actions**:
1. Create `src/shared/parsers/interfaces.ts`:
- `ILanguageParser` interface with `language`, `supportedExtensions`, `parseFile(content, filePath): Promise<ParsedFile>`
- `ParsedFile` interface: `functions: UniversalFunctionInfo[]`, `classes: UniversalClassInfo[]`, `imports: ImportInfo[]`, `language: SupportedLanguage`, `framework?: string`
- `UniversalFunctionInfo`: name, parameters (reuse `ParameterInfo`), returnType, isAsync, isPublic, complexity, decorators, genericParams, body
- `UniversalClassInfo`: name, methods (`UniversalFunctionInfo[]`), properties, isPublic, implements, extends, decorators
- `ImportInfo`: module, namedImports, isTypeOnly
2. Create adapter: `TypeScriptLanguageParser` class wrapping existing `TypeScriptParser` and implementing `ILanguageParser`. This is a thin adapter -- calls existing parser methods and maps results to `ParsedFile`.
3. Update `src/shared/parsers/index.ts` to export new interfaces and adapter
4. Create `tests/shared/parsers/interfaces.test.ts` -- verify adapter produces correct `ParsedFile` from known TS source
**Verification**:
```bash
npm run build && npm test -- --run tests/shared/parsers/
```
**Files touched**: `src/shared/parsers/interfaces.ts` (NEW), `src/shared/parsers/typescript-parser.ts` (EDIT -- add `implements ILanguageParser` or create separate adapter), `src/shared/parsers/index.ts` (EDIT), `tests/shared/parsers/interfaces.test.ts` (NEW)
---
### M1.5 -- tree-sitter Integration ([ADR-076](../implementation/adrs/ADR-076-tree-sitter-wasm-multi-language-parser.md))
**Goal**: `web-tree-sitter` WASM integration with grammars for Python, Java, C#, Go, Rust, Swift, Kotlin, Dart
**Agent**: `coder`
**Preconditions**: M1.4
**Actions**:
1. Install dependencies:
```bash
npm install web-tree-sitter
# Grammar WASMs -- verify availability before adding
```
2. Create `src/shared/parsers/tree-sitter-parser.ts`:
- `TreeSitterParserRegistry` class
- Lazy-loads WASM grammars per language
- Implements `ILanguageParser` for each supported language
- Per-language query functions that extract `UniversalFunctionInfo[]` and `UniversalClassInfo[]`
- Language-specific tree-sitter queries for: function declarations, class/struct/trait/impl declarations, parameters, return types, decorators/attributes, visibility modifiers
3. Create `tests/shared/parsers/tree-sitter-parser.test.ts`:
- Test Python parsing (existing gap fix)
- Test Java, Go, Rust parsing with fixture files
- Verify `ParsedFile` output matches expected structure
4. Create fixture files: `tests/fixtures/parsers/sample.py`, `sample.java`, `sample.go`, `sample.rs`, etc.
**Verification**:
```bash
npm run build && npm test -- --run tests/shared/parsers/tree-sitter-parser.test.ts
```
**Files touched**: `src/shared/parsers/tree-sitter-parser.ts` (NEW), `tests/shared/parsers/tree-sitter-parser.test.ts` (NEW), `tests/fixtures/parsers/*` (NEW), `package.json` (EDIT -- new dep)
---
### M1.5-PY -- Fix Python AST Parsing + Upgrade PytestGenerator
**Goal**: Python files get real AST parsing via tree-sitter instead of always producing stubs
**Agent**: `coder`
**Preconditions**: M1.5
**Actions**:
1. Edit `src/domains/test-generation/generators/pytest-generator.ts`:
- Import `ParsedFile` from parsers
- Add method to convert `ParsedFile` (from tree-sitter) into the existing `CodeAnalysis` shape used by `generateTests()`
- When `context.analysis` is populated (from tree-sitter), use it instead of falling back to stubs
2. Edit `src/domains/test-generation/services/test-generator.ts`:
- In `analyzeSourceCode()`, detect `.py` files and route to tree-sitter parser instead of TypeScript compiler
- The tree-sitter parser produces `ParsedFile` which is converted to `CodeAnalysis`
3. Create integration test with a real Python file
**Verification**:
```bash
npm run build && npm test -- --run tests/domains/test-generation/
# Manual: Generate tests for a .py file and verify real function/class extraction (not stubs)
```
**Files touched**: `src/domains/test-generation/generators/pytest-generator.ts` (EDIT), `src/domains/test-generation/services/test-generator.ts` (EDIT)
---
### M1.6 -- Language Auto-Detection ([ADR-078](../implementation/adrs/ADR-078-backward-compatible-multi-language-api.md))
**Goal**: Detect language from file extensions, detect framework from project files
**Agent**: `coder`
**Preconditions**: M1.1
**Actions**:
1. Create `src/shared/language-detector.ts`:
- `detectLanguage(filePaths: string[]): SupportedLanguage` -- from file extensions
- `detectFramework(language: SupportedLanguage, projectRoot?: string): TestFramework` -- from project file scanning
- `detectProjectConfig(projectRoot: string): { buildTool: string, configPath: string, languageVersion?: string }` -- scans for pom.xml, Cargo.toml, go.mod, Package.swift, pubspec.yaml, *.csproj, package.json
- `resolveRequest(request: Partial<IGenerateTestsRequest>): { language: SupportedLanguage, framework: TestFramework }` -- the full resolution chain from plan Section 2.0.2
- Exclusion patterns: skip `.g.cs`, `.pb.go`, `.freezed.dart`, `*_generated.go`
2. Create `tests/shared/language-detector.test.ts`
**Verification**:
```bash
npm run build && npm test -- --run tests/shared/language-detector.test.ts
```
**Files touched**: `src/shared/language-detector.ts` (NEW), `tests/shared/language-detector.test.ts` (NEW)
---
### M1.7 -- Compilation Validation Loop ([ADR-077](../implementation/adrs/ADR-077-compilation-validation-loop.md))
**Goal**: Optional compile-check for generated tests with LLM repair loop
**Agent**: `coder`
**Preconditions**: M1.1
**Actions**:
1. Create `src/domains/test-generation/services/compilation-validator.ts`:
- `ICompilationValidator` interface
- `CompilationValidator` class with per-language compile commands
- `validate(code, language, projectPath): Promise<ValidationResult>`
- `ValidationResult`: `{ compiles: boolean, errors: CompilationError[], suggestions: string[] }`
- Graceful fallback when compiler not found (return `{ compiles: false, errors: [{ message: 'compiler not found' }] }`)
2. Create `tests/domains/test-generation/services/compilation-validator.test.ts`
**Verification**:
```bash
npm run build && npm test -- --run tests/domains/test-generation/services/compilation-validator.test.ts
```
**Files touched**: `src/domains/test-generation/services/compilation-validator.ts` (NEW), `tests/domains/test-generation/services/compilation-validator.test.ts` (NEW)
---
### M1.8 -- Test File Path Resolver ([ADR-079](../implementation/adrs/ADR-079-language-specific-test-file-path-resolution.md))
**Goal**: Resolve correct test file output paths per language convention
**Agent**: `coder`
**Preconditions**: M1.1
**Actions**:
1. Create `src/domains/test-generation/services/test-file-resolver.ts`:
- `TEST_FILE_CONVENTIONS` record from plan Section 4.6
- `resolveTestFilePath(sourceFile, language, projectRoot?): string`
- Handle: alongside, tests-directory, maven-mirror, test-project, inline (Rust)
2. Create `tests/domains/test-generation/services/test-file-resolver.test.ts`
**Verification**:
```bash
npm run build && npm test -- --run tests/domains/test-generation/services/test-file-resolver.test.ts
```
**Files touched**: `src/domains/test-generation/services/test-file-resolver.ts` (NEW), `tests/domains/test-generation/services/test-file-resolver.test.ts` (NEW)
---
### M1.9 -- Wire Foundation into TestGeneratorService
**Goal**: `TestGeneratorService` uses language detection, parser dispatch, test file resolver, and compilation validation
**Agent**: `system-architect`
**Preconditions**: M1.2, M1.3, M1.5-PY, M1.6, M1.7, M1.8
**Actions**:
1. Edit `src/domains/test-generation/services/test-generator.ts`:
- Import language detector, test file resolver, compilation validator
- In `generateTests()`: if `language` not in request, auto-detect it; if `framework` not in request, resolve from language
- In `analyzeSourceCode()`: dispatch to tree-sitter for non-TS/JS files
- In `generateTestsForFile()`: use `TestFileResolver` for test file path
- After test generation: if `compileValidation` enabled, run validation loop
- Add `language` and `framework` to `IGeneratedTest` output
2. Ensure all existing tests still pass (backward compat)
**Verification**:
```bash
npm run build && npm test -- --run # Full suite must pass
```
**Files touched**: `src/domains/test-generation/services/test-generator.ts` (EDIT)
---
### M1.10 -- Language-Aware LLM Prompts
**Goal**: Per-language prompt configs for LLM enhancement
**Agent**: `coder`
**Preconditions**: M1.1
**Actions**:
1. Create `src/domains/test-generation/prompts/language-prompts.ts`:
- `LanguagePromptConfig` interface: `systemContext`, `conventions[]`, `assertionStyle`, `mockingStyle`
- `LANGUAGE_PROMPTS: Record<SupportedLanguage, LanguagePromptConfig>`
- Configs for all 10 languages (see plan Section 4.3)
- `getPromptConfig(language: SupportedLanguage): LanguagePromptConfig`
**Verification**:
```bash
npm run build
```
**Files touched**: `src/domains/test-generation/prompts/language-prompts.ts` (NEW)
---
### M1.11 -- Update Code Metrics for tree-sitter
**Goal**: `CodeMetrics` uses tree-sitter for non-TS/JS files instead of regex heuristics
**Agent**: `coder`
**Preconditions**: M1.5
**Actions**:
1. Edit `src/shared/metrics/code-metrics.ts`:
- Add tree-sitter dispatch path for supported languages
- TS/JS continues to use TypeScript compiler
- Supported tree-sitter languages get proper complexity counting
- Others fall back to existing regex heuristics
**Verification**:
```bash
npm run build && npm test -- --run tests/shared/metrics/
```
**Files touched**: `src/shared/metrics/code-metrics.ts` (EDIT)
---
### RISK GATE 1: Foundation Validation
**Before proceeding to Phase 2, ALL of the following must pass:**
```bash
# 1. Full build
npm run build
# 2. Full test suite (all 14,000+ tests)
npm test -- --run
# 3. Specific foundation tests
npm test -- --run tests/shared/types/
npm test -- --run tests/shared/parsers/
npm test -- --run tests/shared/language-detector.test.ts
# 4. Backward compatibility smoke test
# Verify existing Jest/Vitest/Mocha/Pytest/NodeTest generators still work identically
npm test -- --run tests/domains/test-generation/
# 5. Manual MCP tool test
# Call qe/tests/generate with framework: "jest" -- must produce same output as before
```
**Decision point**: If any test fails, fix before proceeding. Do NOT start Phase 2 generators on a broken foundation.
---
## Phase 2: Core Enterprise Languages (PARALLEL)
After Phase 1 risk gate passes, M2.1, M2.2, and M2.3 can run simultaneously -- they each create NEW files with no overlaps.
### Parallel Group A (can run simultaneously)
---
### M2.1 -- JUnit 5 Generator (Java)
**Goal**: Full test generation for Java with JUnit 5, Mockito, AssertJ, Spring detection
**Agent**: `coder` (Java specialist)
**Preconditions**: Phase 1 complete
**Actions**:
1. Create `src/domains/test-generation/generators/junit5-generator.ts`:
- Extends `BaseTestGenerator`
- `framework = 'junit5'`
- Generates `@ExtendWith(MockitoExtension.class)` test classes
- `@Test` + `@DisplayName` methods
- AssertJ assertions (`assertThat(x).isEqualTo(y)`)
- Mockito setup (`when(...).thenReturn(...)`)
- Handles: generic types, `Optional<T>`, `CompletableFuture`, `List<T>`
- Constructor injection detection for mock setup
2. Create `src/domains/test-generation/detectors/spring-detector.ts`:
- Detect `@Service`, `@RestController`, `@Repository`, `@Component`
- Route to appropriate test type: `@WebMvcTest`, `@DataJpaTest`, or plain `@ExtendWith`
3. Create `tests/domains/test-generation/generators/junit5-generator.test.ts`:
- Test with simple class, service class, Spring controller, async methods
4. Create fixture: `tests/fixtures/parsers/UserService.java`
**Verification**:
```bash
npm run build && npm test -- --run tests/domains/test-generation/generators/junit5-generator.test.ts
```
**Files touched**: ALL NEW -- `junit5-generator.ts`, `spring-detector.ts`, test file, fixture
---
### M2.2 -- xUnit Generator (C#)
**Goal**: Full test generation for C# with xUnit, Moq, FluentAssertions
**Agent**: `coder` (C# specialist)
**Preconditions**: Phase 1 complete
**Actions**:
1. Create `src/domains/test-generation/generators/xunit-generator.ts`:
- Extends `BaseTestGenerator`
- `framework = 'xunit'`
- Generates `[Fact]` and `[Theory]` / `[InlineData]` methods
- Moq setup (`new Mock<IRepository>()`, `.Setup(...)`, `.ReturnsAsync(...)`)
- `Assert.Equal`, `Assert.NotNull`, `Assert.ThrowsAsync`
- Handles: `async Task`, nullable reference types, records, LINQ, `IOptions<T>`
2. Create `tests/domains/test-generation/generators/xunit-generator.test.ts`
3. Create fixture: `tests/fixtures/parsers/UserService.cs`
**Verification**:
```bash
npm run build && npm test -- --run tests/domains/test-generation/generators/xunit-generator.test.ts
```
**Files touched**: ALL NEW
---
### M2.3 -- Go Test Generator
**Goal**: Full test generation for Go with table-driven tests and interface mocks
**Agent**: `coder` (Go specialist)
**Preconditions**: Phase 1 complete
**Actions**:
1. Create `src/domains/test-generation/generators/go-test-generator.ts`:
- Extends `BaseTestGenerator`
- `framework = 'go-test'`
- Generates table-driven tests (`tests := []struct { ... }`)
- `(value, error)` return handling -- both checked in every test case
- Mock struct generation implementing interfaces
- `t.Run(tt.name, func(t *testing.T) { ... })` subtests
- Handles: goroutines (basic), channels, `context.Context` parameter
- `go.mod` module path for imports
- `_test.go` file naming convention
2. Create `tests/domains/test-generation/generators/go-test-generator.test.ts`
3. Create fixture: `tests/fixtures/parsers/user_service.go`
**Verification**:
```bash
npm run build && npm test -- --run tests/domains/test-generation/generators/go-test-generator.test.ts
```
**Files touched**: ALL NEW
---
### M2.REGISTRY -- Register Phase 2 Generators
**Goal**: Wire JUnit5, xUnit, GoTest generators into the factory
**Agent**: `coder`
**Preconditions**: M2.1, M2.2, M2.3 all complete
**Actions**:
1. Edit `src/domains/test-generation/factories/test-generator-factory.ts`:
- Import `JUnit5Generator`, `XUnitGenerator`, `GoTestGenerator`
- Add `case 'junit5'`, `case 'xunit'`, `case 'go-test'` in `createGenerator()`
- Remove "not yet implemented" throws for these three
2. Edit `src/domains/test-generation/generators/index.ts`:
- Export `JUnit5Generator`, `XUnitGenerator`, `GoTestGenerator`
3. Run integration tests
**Verification**:
```bash
npm run build && npm test -- --run tests/domains/test-generation/
```
**Files touched**: `test-generator-factory.ts` (EDIT), `generators/index.ts` (EDIT)
---
### RISK GATE 2: Core Languages Validation
```bash
# Full build + test
npm run build && npm test -- --run
# Specific generator tests
npm test -- --run tests/domains/test-generation/generators/junit5
npm test -- --run tests/domains/test-generation/generators/xunit
npm test -- --run tests/domains/test-generation/generators/go-test
# Integration: generate tests for fixture files via TestGeneratorService
# Verify output is idiomatic (manual review)
```
---
## Phase 3: Rust (SEQUENTIAL -- complex, single agent)
### M3.1 -- Rust Test Generator with Ownership Analysis
**Goal**: Test generation for Rust with `#[test]`, `#[should_panic]`, ownership-aware mock generation
**Agent**: `coder` (Rust specialist)
**Preconditions**: Phase 1 complete (can run in parallel with Phase 2)
**Actions**:
1. Create `src/shared/parsers/rust-ownership-analyzer.ts`:
- Analyze tree-sitter output for: `&T` vs `&mut T` vs `T` (owned), lifetimes, `Clone`/`Copy` trait bounds
- Determine if parameters are borrowed, moved, or cloned
- Output: ownership annotations per parameter
2. Create `src/domains/test-generation/context/rust-context-builder.ts`:
- RUG-style bottom-up context: recursively resolve all referenced types before building test
- Extract `use super::*` imports
- Detect `#[cfg(test)] mod tests` placement requirement
3. Create `src/domains/test-generation/generators/rust-test-generator.ts`:
- Extends `BaseTestGenerator`
- `framework = 'rust-test'`
- Generates `#[cfg(test)] mod tests { use super::*; ... }`
- `assert!`, `assert_eq!`, `assert_ne!` macros
- `#[should_panic(expected = "...")]` for panic tests
- `Result<(), Box<dyn Error>>` return for `?` operator tests
- Tokio `#[tokio::test]` for async functions
- `mockall` crate patterns for trait-based mocking
- NOTE: Rust tests go INLINE (same file) -- generator must produce a module, not a separate file
4. Create `tests/domains/test-generation/generators/rust-test-generator.test.ts`
5. Create fixture: `tests/fixtures/parsers/user_service.rs`
**Verification**:
```bash
npm run build && npm test -- --run tests/domains/test-generation/generators/rust-test-generator.test.ts
```
**Files touched**: ALL NEW
---
## Phase 4: Mobile Languages (PARALLEL)
M4.1, M4.2, M4.3, M4.4 can all run simultaneously -- they each create NEW files with no overlaps.
### Parallel Group B (can run simultaneously)
---
### M4.1 -- Swift Generator (Swift Testing + XCTest)
**Goal**: Test generation for Swift with both Swift Testing (5.10+) and XCTest
**Agent**: `coder`
**Preconditions**: Phase 1 complete
**Actions**:
1. Create `src/domains/test-generation/generators/swift-testing-generator.ts`:
- `framework = 'swift-testing'`
- `@Suite`, `@Test("description")`, `#expect(...)` macros
- `async throws` test methods
- Protocol-based mocking (manual stubs, no reflection mocks)
2. Create `src/domains/test-generation/generators/xctest-generator.ts`:
- `framework = 'xctest'`
- `XCTestCase` subclass, `func testXxx()`, `XCTAssert*`
3. Create tests and fixtures
**Files touched**: ALL NEW
---
### M4.2 -- Kotlin Generator (JUnit + MockK + Coroutines)
**Goal**: Kotlin test generation with coroutine awareness
**Agent**: `coder`
**Preconditions**: Phase 1 complete
**Actions**:
1. Create `src/domains/test-generation/generators/kotlin-junit-generator.ts`:
- `framework = 'kotlin-junit'`
- `@ExtendWith(MockKExtension::class)`
- `@MockK`, `coEvery { ... }`, `coVerify { ... }` for suspend functions
- `runTest { }` wrapper for coroutine tests
- Turbine patterns for `Flow` testing
- Backtick test names (`` `should do something` ``)
2. Create tests and fixtures
**Files touched**: ALL NEW
---
### M4.3 -- Flutter/Dart Generator
**Goal**: Dart test generation with widget test routing
**Agent**: `coder`
**Preconditions**: Phase 1 complete
**Actions**:
1. Create `src/domains/test-generation/generators/flutter-test-generator.ts`:
- `framework = 'flutter-test'`
- `test()` for unit tests, `testWidgets()` for widget tests
- `@GenerateMocks` annotation for Mockito
- `group()` blocks for organization
- Widget detection: route `Widget` subclasses to `testWidgets` + `pumpWidget`
2. Create tests and fixtures
**Files touched**: ALL NEW
---
### M4.4 -- React Native Generator (extends Jest)
**Goal**: RN-specific Jest test generation
**Agent**: `coder`
**Preconditions**: Phase 1 complete
**Actions**:
1. Create `src/domains/test-generation/generators/jest-rn-generator.ts`:
- Extends `JestVitestGenerator`
- `framework = 'jest-rn'`
- Imports `@testing-library/react-native` instead of `@testing-library/react`
- Detects `Platform.OS`, `NativeModules`, `Animated` usage
- Generates `jest.useFakeTimers()` when animations detected
- Generates `NavigationContainer` wrapper when React Navigation detected
2. Create tests
**Files touched**: ALL NEW
---
### M4.5 -- Mobile Framework Detectors
**Goal**: Detect SwiftUI, Compose, Flutter Widget patterns for routing
**Agent**: `coder`
**Preconditions**: Phase 1 complete
**Actions**:
1. Create `src/domains/test-generation/detectors/mobile-detector.ts`:
- `detectSwiftUIView(parsedFile)`: looks for `import SwiftUI`, `var body: some View`
- `detectComposable(parsedFile)`: looks for `@Composable` decorator
- `detectFlutterWidget(parsedFile)`: looks for `extends StatelessWidget` / `StatefulWidget`
- Returns routing decision: "unit test" vs "widget/UI test"
**Files touched**: ALL NEW
---
### M4.REGISTRY -- Register Phase 3 + 4 Generators
**Goal**: Wire all remaining generators into the factory
**Agent**: `coder`
**Preconditions**: M3.1, M4.1-M4.5 all complete
**Actions**:
1. Edit `src/domains/test-generation/factories/test-generator-factory.ts`:
- Import and register all new generators
- Remove all remaining "not yet implemented" throws
2. Edit `src/domains/test-generation/generators/index.ts`:
- Export all new generators
3. Run full integration tests
**Verification**:
```bash
npm run build && npm test -- --run
```
---
### RISK GATE 3: Full Language Coverage
```bash
# Full build + test
npm run build && npm test -- --run
# All generator tests
npm test -- --run tests/domains/test-generation/generators/
# Verify factory supports all 18 frameworks
# (integration test that calls factory.create() for each)
# Manual: Generate tests for at least one file per language and review output quality
```
---
## Phase 5: KG + Quality Extension (FUTURE)
Not included in this execution plan. Deferred to a follow-up after Phase 4 is stable. Covers:
- Multi-language KG indexing
- Multi-language coverage report parsing (JaCoCo, dotcover, tarpaulin, go cover)
- Routing score boost for language-matched agents
- MCP tool schema update
---
## Swarm Execution Strategy
### Swarm Configuration
```bash
npx @claude-flow/cli@latest swarm init --topology hierarchical --max-agents 8 --strategy specialized
```
### Phase 1 Execution (Sequential -- 1 coordinator + 2 coders max)
Phase 1 milestones have strict dependency ordering. Use at most 2 parallel agents where dependencies allow:
```
Timeline:
T0: M1.1 (types)
T1: M1.2 (interfaces) + M1.4 (parser abstraction) [parallel -- different files]
T2: M1.3 (factory) + M1.6 (language detector) + M1.10 (prompts) [parallel -- different files]
T3: M1.5 (tree-sitter) [depends on M1.4]
T4: M1.5-PY (Python fix) + M1.7 (compilation validator) + M1.8 (test file resolver) [parallel]
T5: M1.9 (wire into service) [depends on ALL above]
T6: M1.11 (metrics update) [depends on M1.5]
T7: RISK GATE 1
```
### Phase 2 Execution (Parallel -- 3 coders)
```
Timeline:
T8: M2.1 (Java) + M2.2 (C#) + M2.3 (Go) [fully parallel -- all NEW files]
T9: M2.REGISTRY [depends on T8]
T10: RISK GATE 2
```
### Phase 3 + 4 Execution (Parallel -- up to 5 coders)
```
Timeline:
T8: M3.1 (Rust) can start same time as Phase 2 [all NEW files]
T11: M4.1 (Swift) + M4.2 (Kotlin) + M4.3 (Flutter) + M4.4 (RN) + M4.5 (detectors) [fully parallel]
T12: M4.REGISTRY [depends on M3.1 + all M4.x]
T13: RISK GATE 3
```
### Agent Type Assignments
| Agent Type | Milestones |
|-----------|------------|
| `system-architect` | M1.1, M1.2, M1.4, M1.9 |
| `coder` | M1.3, M1.5, M1.5-PY, M1.6, M1.7, M1.8, M1.10, M1.11 |
| `coder` (Java) | M2.1 |
| `coder` (C#) | M2.2 |
| `coder` (Go) | M2.3 |
| `coder` (Rust) | M3.1 |
| `coder` (Swift) | M4.1 |
| `coder` (Kotlin) | M4.2 |
| `coder` (Dart) | M4.3 |
| `coder` (RN) | M4.4 |
| `coder` | M4.5, M2.REGISTRY, M4.REGISTRY |
| `tester` | Risk gate validation at each checkpoint |
### Maximum Parallelism Diagram
```
Phase 1 (sequential with local parallelism):
----[M1.1]----[M1.2 + M1.4]----[M1.3 + M1.6 + M1.10]----[M1.5]----[M1.5-PY + M1.7 + M1.8]----[M1.9]----[M1.11]----[GATE 1]
Phase 2 + 3 (parallel after Gate 1):
----[M2.1 Java]--------[M2.REG]----[GATE 2]
----[M2.2 C# ]--------'
----[M2.3 Go ]--------'
----[M3.1 Rust]------------------------------+
|
Phase 4 (parallel, after Gate 2 or Gate 1): |
----[M4.1 Swift ]------[M4.REG]----[GATE 3] |
----[M4.2 Kotlin ]------' |
----[M4.3 Flutter]------' |
----[M4.4 RN ]------' |
----[M4.5 detect ]------'--------------------'
```
---
## Summary Table
| Milestone | Phase | Agent | New Files | Edited Files | Blocks | Blocked By |
|-----------|-------|-------|-----------|-------------|--------|------------|
| M1.1 | 1 | system-architect | 2 | 1 | M1.2, M1.3, M1.6, M1.7, M1.8, M1.10 | -- |
| M1.2 | 1 | system-architect | 0 | 2 | M1.3, M1.9 | M1.1 |
| M1.3 | 1 | coder | 0 | 1 | M1.9 | M1.1, M1.2 |
| M1.4 | 1 | system-architect | 2 | 2 | M1.5 | M1.1 |
| M1.5 | 1 | coder | 2+ | 1 | M1.5-PY, M1.11 | M1.4 |
| M1.5-PY | 1 | coder | 0 | 2 | M1.9 | M1.5 |
| M1.6 | 1 | coder | 2 | 0 | M1.9 | M1.1 |
| M1.7 | 1 | coder | 2 | 0 | M1.9 | M1.1 |
| M1.8 | 1 | coder | 2 | 0 | M1.9 | M1.1 |
| M1.9 | 1 | system-architect | 0 | 1 | GATE 1 | M1.2, M1.3, M1.5-PY, M1.6, M1.7, M1.8 |
| M1.10 | 1 | coder | 1 | 0 | -- | M1.1 |
| M1.11 | 1 | coder | 0 | 1 | -- | M1.5 |
| GATE 1 | 1 | tester | 0 | 0 | Phase 2-4 | M1.9 |
| M2.1 | 2 | coder | 4 | 0 | M2.REG | GATE 1 |
| M2.2 | 2 | coder | 3 | 0 | M2.REG | GATE 1 |
| M2.3 | 2 | coder | 3 | 0 | M2.REG | GATE 1 |
| M2.REG | 2 | coder | 0 | 2 | GATE 2 | M2.1, M2.2, M2.3 |
| GATE 2 | 2 | tester | 0 | 0 | Phase 4 | M2.REG |
| M3.1 | 3 | coder | 4 | 0 | M4.REG | GATE 1 |
| M4.1 | 4 | coder | 3 | 0 | M4.REG | GATE 1 |
| M4.2 | 4 | coder | 3 | 0 | M4.REG | GATE 1 |
| M4.3 | 4 | coder | 3 | 0 | M4.REG | GATE 1 |
| M4.4 | 4 | coder | 2 | 0 | M4.REG | GATE 1 |
| M4.5 | 4 | coder | 1 | 0 | M4.REG | GATE 1 |
| M4.REG | 4 | coder | 0 | 2 | GATE 3 | M3.1, M4.1-M4.5 |
| GATE 3 | 4 | tester | 0 | 0 | Phase 5 | M4.REG |
**Total new files**: ~40
**Total edited files**: ~12 (all in Phase 1)
**Maximum concurrent agents**: 5 (during Phase 2+3+4 parallel execution)
**Estimated total milestones**: 24