feat(P03): multi-project support, NFR milestone versioning, phase context reset, install scripts (v0.3.0)

This commit is contained in:
CI
2026-05-29 15:13:45 +00:00
parent e4bb3a9970
commit ddf04792c7
57 changed files with 1748 additions and 59 deletions
+51
View File
@@ -13,6 +13,18 @@ describe("CommitBuilder", () => {
expect(block).toContain("status: execute");
});
it("builds ci block with project", () => {
const ci: CiMetadata = { phase: 1, milestone: "v1.0", status: "execute", project: "task-api" };
const block = CommitBuilder.buildCiBlock(ci);
expect(block).toContain("project: task-api");
});
it("builds ci block without project when not set", () => {
const ci: CiMetadata = { phase: 1, milestone: "v1.0", status: "execute" };
const block = CommitBuilder.buildCiBlock(ci);
expect(block).not.toContain("project:");
});
it("builds ci block with decisions", () => {
const ci: CiMetadata = {
phase: 1,
@@ -172,6 +184,16 @@ describe("CommitBuilder", () => {
expect(parsed.compound!.problem).toBe("Token replay attacks");
expect(parsed.lessons).toHaveLength(1);
});
it("round-trips project field", () => {
const ci: CiMetadata = { phase: 1, milestone: "v1.0", status: "execute", project: "task-api" };
const block = CommitBuilder.buildCiBlock(ci);
const fullMessage = `feat(task-api/P01): test\n\n---ci---\n${block}\n---/ci---`;
const extracted = extractCiBlock(fullMessage)!;
const parsed = parseCiBlock(extracted)!;
expect(parsed.project).toBe("task-api");
});
});
describe("buildInitCommit", () => {
@@ -193,6 +215,19 @@ describe("CommitBuilder", () => {
expect(msg).toContain("Build a REST API for task management");
expect(msg).toContain("AUTH-01");
});
it("builds an init commit message with project", () => {
const msg = CommitBuilder.buildInitCommit({
projectName: "task-api",
phaseCount: 4,
milestone: "v1.0",
project: "task-api",
specification: "Build a REST API",
requirements: ["AUTH-01"],
});
expect(msg).toContain("project: task-api");
});
});
describe("buildTaskCommit", () => {
@@ -223,6 +258,22 @@ describe("CommitBuilder", () => {
expect(msg).toContain("D-003");
expect(msg).toContain("AUTH-01");
});
it("builds a task commit with project prefix", () => {
const msg = CommitBuilder.buildTaskCommit({
type: "feat",
phase: 1,
milestone: "v1.0",
project: "task-api",
plan: "01-01",
task: "01-01-02",
subject: "registration endpoint",
status: "execute",
});
expect(msg).toContain("feat(task-api/P01-01-02):");
expect(msg).toContain("project: task-api");
});
});
describe("buildPhaseCompletionCommit", () => {