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
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
import * as fs from "node:fs";
|
||||
import * as path from "node:path";
|
||||
import * as os from "node:os";
|
||||
import { RoadmapperAgent } from "../agents/roadmapper.js";
|
||||
|
||||
describe("RoadmapperAgent", () => {
|
||||
let tempDir: string;
|
||||
|
||||
beforeEach(() => {
|
||||
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "ciagent-roadmapper-test-"));
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
fs.rmSync(tempDir, { recursive: true, force: true });
|
||||
});
|
||||
|
||||
it("generates phases from REQUIREMENTS.md", () => {
|
||||
const ciagentDir = path.join(tempDir, ".ciagent");
|
||||
fs.mkdirSync(ciagentDir, { recursive: true });
|
||||
fs.writeFileSync(
|
||||
path.join(ciagentDir, "REQUIREMENTS.md"),
|
||||
"REQ-1: Phase: 1 — Build core\nREQ-2: Phase: 1 — Build utils\nREQ-3: Phase: 2 — Add features"
|
||||
);
|
||||
|
||||
const agent = new RoadmapperAgent();
|
||||
const phases = agent.mechanicalRoadmapGenerate(tempDir);
|
||||
|
||||
expect(phases.length).toBeGreaterThanOrEqual(2);
|
||||
expect(phases[0].requirements).toContain("REQ-1");
|
||||
expect(phases[0].requirements).toContain("REQ-2");
|
||||
expect(phases[1].requirements).toContain("REQ-3");
|
||||
});
|
||||
|
||||
it("sets phase dependencies correctly", () => {
|
||||
const ciagentDir = path.join(tempDir, ".ciagent");
|
||||
fs.mkdirSync(ciagentDir, { recursive: true });
|
||||
fs.writeFileSync(
|
||||
path.join(ciagentDir, "REQUIREMENTS.md"),
|
||||
"REQ-1: Phase: 1 — Core\nREQ-2: Phase: 2 — Extension"
|
||||
);
|
||||
|
||||
const agent = new RoadmapperAgent();
|
||||
const phases = agent.mechanicalRoadmapGenerate(tempDir);
|
||||
|
||||
expect(phases.length).toBe(2);
|
||||
expect(phases[0].dependencies).toEqual([]);
|
||||
expect(phases[1].dependencies).toEqual([1]);
|
||||
});
|
||||
|
||||
it("generates success criteria from requirements", () => {
|
||||
const ciagentDir = path.join(tempDir, ".ciagent");
|
||||
fs.mkdirSync(ciagentDir, { recursive: true });
|
||||
fs.writeFileSync(
|
||||
path.join(ciagentDir, "REQUIREMENTS.md"),
|
||||
"REQ-1: Phase: 1 — Build core"
|
||||
);
|
||||
|
||||
const agent = new RoadmapperAgent();
|
||||
const phases = agent.mechanicalRoadmapGenerate(tempDir);
|
||||
|
||||
expect(phases.length).toBe(1);
|
||||
expect(phases[0].successCriteria.length).toBeGreaterThan(0);
|
||||
expect(phases[0].successCriteria.some((c) => c.includes("REQ-1"))).toBe(true);
|
||||
});
|
||||
|
||||
it("returns empty when no REQUIREMENTS.md exists", () => {
|
||||
const agent = new RoadmapperAgent();
|
||||
const phases = agent.mechanicalRoadmapGenerate(tempDir);
|
||||
|
||||
expect(phases).toEqual([]);
|
||||
});
|
||||
|
||||
it("agent name is roadmapper", () => {
|
||||
const agent = new RoadmapperAgent();
|
||||
expect(agent.name).toBe("roadmapper");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user