Files
ci/src/agents/solution-writer.test.ts
T
Jon Chery a8b50f5109
CI / build-and-test (push) Has been cancelled
Publish to npm / publish (push) Has been cancelled
feat(ci): v0.9.0 — Distribution & Expansion milestone complete
---ci---
project: ci
phase: 6
milestone: v0.9
status: complete
artifacts:
  tags: [v0.9.0]
decisions:
  - id: D-047
    decision: v0.9 theme = Distribution & Expansion
    rationale: npm publish + OpenAI/Anthropic backends + agent flesh + parallel execution
    confidence: 0.92
  - id: D-049
    decision: Feature milestone — patch tags v0.8.1-v0.8.6 then v0.9.0
    rationale: OpenAI backend, agent flesh, npm publish all feat
    confidence: 0.95
  - id: D-059
    decision: Rename OllamaBaseBackend to LLMBaseBackend + thin OllamaBaseBackend subclass
    rationale: 15 of 17 methods backend-agnostic
    confidence: 0.92
  - id: D-060
    decision: OpenAI/Anthropic backends use native fetch() not SDK packages
    rationale: No dependency bloat; fetch native in Node 18+
    confidence: 0.85
  - id: D-066
    decision: Concurrency limiter internal (no p-limit dependency)
    rationale: 15 lines; avoids dependency for trivial feature
    confidence: 0.90
  - id: D-067
    decision: Promise.allSettled for review agents at orchestrator lines 373-400
    rationale: Current sequential loop replaced with parallel execution
    confidence: 0.88
requirements:
  covered: [PUBLISH-01, PUBLISH-02, PUBLISH-03, PUBLISH-04, OPENAI-01, OPENAI-02, OPENAI-03, OPENAI-04, OPENAI-05, FLESH-01, FLESH-02, FLESH-03, FLESH-04, FLESH-05, ANTHROPIC-01, ANTHROPIC-02, FLESH-06, FLESH-07, NPM-01, NPM-02, PARALLEL-01, PARALLEL-02, PARALLEL-03, INTEG-01, INTEG-02, INTEG-03, INTEG-04, INTEG-05]
---/ci---

6 phases, 28 tasks, 4077 net lines added, 57 test suites, 527 tests, zero stub agents
2026-05-30 02:19:44 +00:00

89 lines
3.1 KiB
TypeScript

import * as fs from "node:fs";
import * as path from "node:path";
import * as os from "node:os";
import { SolutionWriterAgent } from "../agents/solution-writer.js";
describe("SolutionWriterAgent", () => {
let tempDir: string;
beforeEach(() => {
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "ciagent-solution-writer-test-"));
fs.mkdirSync(path.join(tempDir, ".ciagent"), { recursive: true });
});
afterEach(() => {
fs.rmSync(tempDir, { recursive: true, force: true });
});
it("reads PLAN.md and produces implementation plan section", () => {
fs.writeFileSync(
path.join(tempDir, ".ciagent", "PLAN.md"),
"# Plan\n\n| T-01 | Setup | 1 | none | Files exist | REQ-01 |\n|-----|-------|---|------|------------|--------|\n"
);
const agent = new SolutionWriterAgent();
const result = agent.mechanicalSolutionWrite(tempDir);
expect(result).toContain("# Solution Document");
expect(result).toContain("## Implementation Plan");
expect(result).toContain("T-01");
});
it("reads REQUIREMENTS.md and extracts verification criteria", () => {
fs.writeFileSync(
path.join(tempDir, ".ciagent", "REQUIREMENTS.md"),
"# Requirements\n\nREQ-01: System must boot\nREQ-02: System must respond\n"
);
const agent = new SolutionWriterAgent();
const result = agent.mechanicalSolutionWrite(tempDir);
expect(result).toContain("## Verification Criteria");
expect(result).toContain("REQ-01");
expect(result).toContain("REQ-02");
});
it("reads ARCHITECTURE.md and populates approach and risk sections", () => {
fs.writeFileSync(
path.join(tempDir, ".ciagent", "ARCHITECTURE.md"),
"# Architecture\n\n## Approach\n\nModular monolith with clear boundaries.\n\n## Risks\n\n- Single point of failure in gateway\n"
);
const agent = new SolutionWriterAgent();
const result = agent.mechanicalSolutionWrite(tempDir);
expect(result).toContain("## Approach");
expect(result).toContain("Modular monolith");
expect(result).toContain("## Risk Assessment");
expect(result).toContain("gateway");
});
it("produces structured markdown with all five sections", () => {
const agent = new SolutionWriterAgent();
const result = agent.mechanicalSolutionWrite(tempDir);
expect(result).toContain("# Solution Document");
expect(result).toContain("## Problem Statement");
expect(result).toContain("## Approach");
expect(result).toContain("## Implementation Plan");
expect(result).toContain("## Verification Criteria");
expect(result).toContain("## Risk Assessment");
});
it("extracts problem statement from requirements objective section", () => {
fs.writeFileSync(
path.join(tempDir, ".ciagent", "REQUIREMENTS.md"),
"# Objective\n\nBuild a fast CLI tool.\n\n## Requirements\n\nREQ-01: Speed"
);
const agent = new SolutionWriterAgent();
const result = agent.mechanicalSolutionWrite(tempDir);
expect(result).toContain("Build a fast CLI tool");
});
it("agent name is solution-writer", () => {
const agent = new SolutionWriterAgent();
expect(agent.name).toBe("solution-writer");
});
});