@mclawnet/swarm 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/action-parser.test.d.ts +2 -0
- package/dist/__tests__/action-parser.test.d.ts.map +1 -0
- package/dist/__tests__/action-parser.test.js +91 -0
- package/dist/__tests__/action-parser.test.js.map +1 -0
- package/dist/__tests__/migration-roles.test.d.ts +2 -0
- package/dist/__tests__/migration-roles.test.d.ts.map +1 -0
- package/dist/__tests__/migration-roles.test.js +213 -0
- package/dist/__tests__/migration-roles.test.js.map +1 -0
- package/dist/__tests__/retrospective.test.d.ts +2 -0
- package/dist/__tests__/retrospective.test.d.ts.map +1 -0
- package/dist/__tests__/retrospective.test.js +467 -0
- package/dist/__tests__/retrospective.test.js.map +1 -0
- package/dist/__tests__/role-loader.test.d.ts +2 -0
- package/dist/__tests__/role-loader.test.d.ts.map +1 -0
- package/dist/__tests__/role-loader.test.js +217 -0
- package/dist/__tests__/role-loader.test.js.map +1 -0
- package/dist/__tests__/swarm-coordinator-init.test.d.ts +2 -0
- package/dist/__tests__/swarm-coordinator-init.test.d.ts.map +1 -0
- package/dist/__tests__/swarm-coordinator-init.test.js +194 -0
- package/dist/__tests__/swarm-coordinator-init.test.js.map +1 -0
- package/dist/__tests__/swarm-coordinator-roleId.test.d.ts +2 -0
- package/dist/__tests__/swarm-coordinator-roleId.test.d.ts.map +1 -0
- package/dist/__tests__/swarm-coordinator-roleId.test.js +147 -0
- package/dist/__tests__/swarm-coordinator-roleId.test.js.map +1 -0
- package/dist/__tests__/template-loader.test.d.ts +2 -0
- package/dist/__tests__/template-loader.test.d.ts.map +1 -0
- package/dist/__tests__/template-loader.test.js +103 -0
- package/dist/__tests__/template-loader.test.js.map +1 -0
- package/dist/action-parser.d.ts.map +1 -1
- package/dist/action-parser.js +96 -6
- package/dist/action-parser.js.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/message-router.d.ts +6 -2
- package/dist/message-router.d.ts.map +1 -1
- package/dist/message-router.js +13 -7
- package/dist/message-router.js.map +1 -1
- package/dist/persistence.d.ts +1 -0
- package/dist/persistence.d.ts.map +1 -1
- package/dist/persistence.js +26 -3
- package/dist/persistence.js.map +1 -1
- package/dist/retrospective.d.ts +42 -0
- package/dist/retrospective.d.ts.map +1 -0
- package/dist/retrospective.js +307 -0
- package/dist/retrospective.js.map +1 -0
- package/dist/roles/role-loader.d.ts +12 -1
- package/dist/roles/role-loader.d.ts.map +1 -1
- package/dist/roles/role-loader.js +160 -7
- package/dist/roles/role-loader.js.map +1 -1
- package/dist/roles/types.d.ts +26 -2
- package/dist/roles/types.d.ts.map +1 -1
- package/dist/swarm-coordinator.d.ts +10 -2
- package/dist/swarm-coordinator.d.ts.map +1 -1
- package/dist/swarm-coordinator.js +267 -38
- package/dist/swarm-coordinator.js.map +1 -1
- package/dist/templates/template-loader.d.ts +20 -0
- package/dist/templates/template-loader.d.ts.map +1 -0
- package/dist/templates/template-loader.js +117 -0
- package/dist/templates/template-loader.js.map +1 -0
- package/dist/templates/types.d.ts +25 -0
- package/dist/templates/types.d.ts.map +1 -0
- package/dist/templates/types.js +2 -0
- package/dist/templates/types.js.map +1 -0
- package/dist/types.d.ts +13 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +17 -11
- package/roles/analyst-livermore.md +112 -0
- package/roles/designer-rams.md +266 -0
- package/roles/dev-torvalds.md +214 -0
- package/roles/developer.md +22 -1
- package/roles/director-jia.md +286 -0
- package/roles/editor-boyong.md +148 -0
- package/roles/macro-dalio.md +115 -0
- package/roles/planner-maoni.md +306 -0
- package/roles/pm-jobs.md +326 -0
- package/roles/preset-analyst-simons.md +55 -0
- package/roles/preset-architect-knuth.md +55 -0
- package/roles/preset-designer-norman.md +55 -0
- package/roles/preset-designer.md +55 -0
- package/roles/preset-dev-carmack.md +55 -0
- package/roles/preset-dev-gosling.md +55 -0
- package/roles/preset-developer.md +68 -0
- package/roles/preset-manager-grove.md +55 -0
- package/roles/preset-manager-musk.md +55 -0
- package/roles/preset-pm.md +105 -0
- package/roles/preset-researcher-feynman.md +55 -0
- package/roles/preset-reviewer.md +62 -0
- package/roles/preset-strategist-buffett.md +55 -0
- package/roles/preset-strategist-munger.md +55 -0
- package/roles/preset-strategist-sunzi.md +55 -0
- package/roles/preset-tester-beck.md +56 -0
- package/roles/preset-tester.md +63 -0
- package/roles/preset-writer-orwell.md +55 -0
- package/roles/preset-writer.md +55 -0
- package/roles/quant-simons.md +136 -0
- package/roles/queen.md +27 -1
- package/roles/reviewer-martin.md +200 -0
- package/roles/reviewer.md +18 -1
- package/roles/rhythm-tangsan.md +135 -0
- package/roles/risk-taleb.md +112 -0
- package/roles/script-shitiesheng.md +129 -0
- package/roles/storyboard-xuke.md +138 -0
- package/roles/strategist-soros.md +257 -0
- package/roles/tester-beck.md +232 -0
- package/roles/tester.md +19 -1
- package/roles/trader-jones.md +124 -0
- package/roles/vfx-guchangwei.md +129 -0
- package/roles/writer-zhouzi.md +144 -0
- package/templates/dev-team-pro.md +21 -0
- package/templates/dev-team.md +19 -0
- package/templates/minimal.md +14 -0
- package/templates/trading-team.md +22 -0
- package/templates/video-team.md +18 -0
- package/templates/writing-team.md +18 -0
|
@@ -0,0 +1,467 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { parseRetrospectiveJSON, fallbackExtraction, runRetrospective, RETROSPECTIVE_PROMPT, } from "../retrospective.js";
|
|
3
|
+
import { initDatabase, MemoryStore, EmbeddingService } from "@mclawnet/memory";
|
|
4
|
+
// ── Test fixtures ────────────────────────────────────────────────────
|
|
5
|
+
function makeSnapshot(overrides) {
|
|
6
|
+
return {
|
|
7
|
+
id: "swarm-test-1",
|
|
8
|
+
hubSessionId: "hub-1",
|
|
9
|
+
roles: [
|
|
10
|
+
{ instanceId: "dev-0", roleName: "developer", status: "active" },
|
|
11
|
+
{ instanceId: "qn-0", roleName: "queen", status: "active" },
|
|
12
|
+
],
|
|
13
|
+
plan: { description: "Build a feature" },
|
|
14
|
+
nextInstanceSeq: { developer: 1, queen: 1 },
|
|
15
|
+
savedAt: Date.now(),
|
|
16
|
+
status: "completed",
|
|
17
|
+
planStatus: "approved",
|
|
18
|
+
...overrides,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const validResult = {
|
|
22
|
+
taskSummary: "Built a REST API",
|
|
23
|
+
roleEvaluations: [
|
|
24
|
+
{
|
|
25
|
+
roleId: "role-developer",
|
|
26
|
+
qualityScore: 0.85,
|
|
27
|
+
reworkCount: 1,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
roleId: "role-queen",
|
|
31
|
+
qualityScore: 0.9,
|
|
32
|
+
reworkCount: 0,
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
projectInsights: [{ content: "REST over GraphQL for this scale", topic: "architecture" }],
|
|
36
|
+
crossRolePatterns: [
|
|
37
|
+
"Developer-Queen feedback loop worked well",
|
|
38
|
+
"Parallel work between developer and reviewer increases efficiency",
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
// ── parseRetrospectiveJSON ───────────────────────────────────────────
|
|
42
|
+
describe("parseRetrospectiveJSON", () => {
|
|
43
|
+
it("correctly parses valid JSON", () => {
|
|
44
|
+
const json = JSON.stringify(validResult);
|
|
45
|
+
const parsed = parseRetrospectiveJSON(json);
|
|
46
|
+
expect(parsed.taskSummary).toBe("Built a REST API");
|
|
47
|
+
expect(parsed.roleEvaluations).toHaveLength(2);
|
|
48
|
+
expect(parsed.roleEvaluations[0].qualityScore).toBe(0.85);
|
|
49
|
+
expect(parsed.roleEvaluations[0]).not.toHaveProperty("experiences");
|
|
50
|
+
expect(parsed.projectInsights).toHaveLength(1);
|
|
51
|
+
expect(parsed.crossRolePatterns).toHaveLength(2);
|
|
52
|
+
});
|
|
53
|
+
it("strips markdown fencing (```json ... ```)", () => {
|
|
54
|
+
const fenced = "```json\n" + JSON.stringify(validResult) + "\n```";
|
|
55
|
+
const parsed = parseRetrospectiveJSON(fenced);
|
|
56
|
+
expect(parsed.taskSummary).toBe("Built a REST API");
|
|
57
|
+
expect(parsed.roleEvaluations).toHaveLength(2);
|
|
58
|
+
});
|
|
59
|
+
it("strips markdown fencing without language tag (``` ... ```)", () => {
|
|
60
|
+
const fenced = "```\n" + JSON.stringify(validResult) + "\n```";
|
|
61
|
+
const parsed = parseRetrospectiveJSON(fenced);
|
|
62
|
+
expect(parsed.taskSummary).toBe("Built a REST API");
|
|
63
|
+
});
|
|
64
|
+
it("throws on invalid JSON", () => {
|
|
65
|
+
expect(() => parseRetrospectiveJSON("not json")).toThrow();
|
|
66
|
+
});
|
|
67
|
+
it("handles result with empty arrays gracefully", () => {
|
|
68
|
+
const minimal = {
|
|
69
|
+
taskSummary: "Quick task",
|
|
70
|
+
roleEvaluations: [],
|
|
71
|
+
projectInsights: [],
|
|
72
|
+
crossRolePatterns: [],
|
|
73
|
+
};
|
|
74
|
+
const parsed = parseRetrospectiveJSON(JSON.stringify(minimal));
|
|
75
|
+
expect(parsed.roleEvaluations).toHaveLength(0);
|
|
76
|
+
expect(parsed.projectInsights).toHaveLength(0);
|
|
77
|
+
expect(parsed.crossRolePatterns).toHaveLength(0);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
// ── RETROSPECTIVE_PROMPT ─────────────────────────────────────────────
|
|
81
|
+
describe("RETROSPECTIVE_PROMPT", () => {
|
|
82
|
+
it("contains team-focused instructions, not personal experience extraction", () => {
|
|
83
|
+
expect(RETROSPECTIVE_PROMPT).toContain("团队协作");
|
|
84
|
+
expect(RETROSPECTIVE_PROMPT).toContain("跨角色协作模式");
|
|
85
|
+
expect(RETROSPECTIVE_PROMPT).toContain("个人技术经验由角色在运行时通过 MCP memory_store");
|
|
86
|
+
// Should NOT ask to extract per-role experiences
|
|
87
|
+
expect(RETROSPECTIVE_PROMPT).not.toContain("经验提取");
|
|
88
|
+
expect(RETROSPECTIVE_PROMPT).not.toContain("每个角色最多提取");
|
|
89
|
+
});
|
|
90
|
+
it("output schema has no experiences field in roleEvaluations", () => {
|
|
91
|
+
// The JSON template in the prompt should NOT include experiences
|
|
92
|
+
expect(RETROSPECTIVE_PROMPT).toContain('"qualityScore"');
|
|
93
|
+
expect(RETROSPECTIVE_PROMPT).toContain('"reworkCount"');
|
|
94
|
+
expect(RETROSPECTIVE_PROMPT).not.toMatch(/"experiences"\s*:/);
|
|
95
|
+
});
|
|
96
|
+
it("includes skill evolution analysis instructions", () => {
|
|
97
|
+
expect(RETROSPECTIVE_PROMPT).toContain("Skill 改进分析");
|
|
98
|
+
expect(RETROSPECTIVE_PROMPT).toContain("skillEvolutions");
|
|
99
|
+
expect(RETROSPECTIVE_PROMPT).toContain("skill-error-fixed");
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
describe("parseRetrospectiveJSON skillEvolutions", () => {
|
|
103
|
+
it("defaults skillEvolutions to empty array when missing", () => {
|
|
104
|
+
const parsed = parseRetrospectiveJSON(JSON.stringify({ taskSummary: "x", roleEvaluations: [], projectInsights: [], crossRolePatterns: [] }));
|
|
105
|
+
expect(parsed.skillEvolutions).toEqual([]);
|
|
106
|
+
});
|
|
107
|
+
it("parses skillEvolutions when present", () => {
|
|
108
|
+
const parsed = parseRetrospectiveJSON(JSON.stringify({
|
|
109
|
+
taskSummary: "x",
|
|
110
|
+
roleEvaluations: [],
|
|
111
|
+
projectInsights: [],
|
|
112
|
+
crossRolePatterns: [],
|
|
113
|
+
skillEvolutions: [
|
|
114
|
+
{
|
|
115
|
+
skillName: "demo",
|
|
116
|
+
signal: "skill-error-fixed",
|
|
117
|
+
problem: "p",
|
|
118
|
+
fix: "f",
|
|
119
|
+
confidence: 0.7,
|
|
120
|
+
evidence: "dev-0 turn 3",
|
|
121
|
+
},
|
|
122
|
+
],
|
|
123
|
+
}));
|
|
124
|
+
expect(parsed.skillEvolutions).toHaveLength(1);
|
|
125
|
+
expect(parsed.skillEvolutions[0].skillName).toBe("demo");
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
// ── fallbackExtraction ───────────────────────────────────────────────
|
|
129
|
+
describe("fallbackExtraction", () => {
|
|
130
|
+
it("produces roleEvaluations for all snapshot roles", () => {
|
|
131
|
+
const messages = [
|
|
132
|
+
{ type: "action", action: "report", from: "dev-0", data: "Implemented user auth module" },
|
|
133
|
+
{ type: "action", action: "send", from: "qn-0", data: "Please review" },
|
|
134
|
+
];
|
|
135
|
+
const snapshot = makeSnapshot();
|
|
136
|
+
const result = fallbackExtraction(messages, snapshot);
|
|
137
|
+
expect(result.taskSummary).toContain("fallback");
|
|
138
|
+
expect(result.roleEvaluations).toHaveLength(2);
|
|
139
|
+
expect(result.roleEvaluations[0].roleId).toBe("role-developer");
|
|
140
|
+
expect(result.roleEvaluations[0].qualityScore).toBe(0.5);
|
|
141
|
+
expect(result.roleEvaluations[0]).not.toHaveProperty("experiences");
|
|
142
|
+
expect(result.roleEvaluations[1].roleId).toBe("role-queen");
|
|
143
|
+
});
|
|
144
|
+
it("generates crossRolePatterns when multiple roles are active", () => {
|
|
145
|
+
const messages = [
|
|
146
|
+
{ type: "action", action: "report", from: "dev-0", data: "Done" },
|
|
147
|
+
{ type: "action", action: "report", from: "qn-0", data: "Approved" },
|
|
148
|
+
];
|
|
149
|
+
const snapshot = makeSnapshot();
|
|
150
|
+
const result = fallbackExtraction(messages, snapshot);
|
|
151
|
+
expect(result.crossRolePatterns).toHaveLength(1);
|
|
152
|
+
expect(result.crossRolePatterns[0]).toContain("developer");
|
|
153
|
+
expect(result.crossRolePatterns[0]).toContain("queen");
|
|
154
|
+
});
|
|
155
|
+
it("returns empty crossRolePatterns when only one role is active", () => {
|
|
156
|
+
const messages = [
|
|
157
|
+
{ type: "action", action: "send", from: "dev-0", data: "Task done" },
|
|
158
|
+
];
|
|
159
|
+
const snapshot = makeSnapshot();
|
|
160
|
+
const result = fallbackExtraction(messages, snapshot);
|
|
161
|
+
expect(result.crossRolePatterns).toHaveLength(0);
|
|
162
|
+
});
|
|
163
|
+
it("returns empty projectInsights always", () => {
|
|
164
|
+
const messages = [
|
|
165
|
+
{ type: "action", action: "send", from: "qn-0", data: "Task assigned" },
|
|
166
|
+
];
|
|
167
|
+
const snapshot = makeSnapshot();
|
|
168
|
+
const result = fallbackExtraction(messages, snapshot);
|
|
169
|
+
expect(result.projectInsights).toHaveLength(0);
|
|
170
|
+
});
|
|
171
|
+
it("handles empty messages array", () => {
|
|
172
|
+
const snapshot = makeSnapshot();
|
|
173
|
+
const result = fallbackExtraction([], snapshot);
|
|
174
|
+
// All roles still get evaluations
|
|
175
|
+
expect(result.roleEvaluations).toHaveLength(2);
|
|
176
|
+
// No active roles → no cross-role patterns
|
|
177
|
+
expect(result.crossRolePatterns).toHaveLength(0);
|
|
178
|
+
});
|
|
179
|
+
it("handles snapshot with 3+ roles", () => {
|
|
180
|
+
const snapshot = makeSnapshot({
|
|
181
|
+
roles: [
|
|
182
|
+
{ instanceId: "dev-0", roleName: "developer", status: "active" },
|
|
183
|
+
{ instanceId: "qn-0", roleName: "queen", status: "active" },
|
|
184
|
+
{ instanceId: "rv-0", roleName: "reviewer", status: "active" },
|
|
185
|
+
],
|
|
186
|
+
});
|
|
187
|
+
const messages = [
|
|
188
|
+
{ type: "action", from: "dev-0", data: "code done" },
|
|
189
|
+
{ type: "action", from: "qn-0", data: "approved" },
|
|
190
|
+
{ type: "action", from: "rv-0", data: "reviewed" },
|
|
191
|
+
];
|
|
192
|
+
const result = fallbackExtraction(messages, snapshot);
|
|
193
|
+
expect(result.roleEvaluations).toHaveLength(3);
|
|
194
|
+
expect(result.crossRolePatterns).toHaveLength(1);
|
|
195
|
+
expect(result.crossRolePatterns[0]).toContain("developer");
|
|
196
|
+
expect(result.crossRolePatterns[0]).toContain("queen");
|
|
197
|
+
expect(result.crossRolePatterns[0]).toContain("reviewer");
|
|
198
|
+
});
|
|
199
|
+
it("handles custom (non-builtin) role names", () => {
|
|
200
|
+
const snapshot = makeSnapshot({
|
|
201
|
+
roles: [
|
|
202
|
+
{ instanceId: "custom-0", roleName: "data-engineer", status: "active" },
|
|
203
|
+
],
|
|
204
|
+
});
|
|
205
|
+
const messages = [{ type: "action", from: "custom-0", data: "done" }];
|
|
206
|
+
const result = fallbackExtraction(messages, snapshot);
|
|
207
|
+
expect(result.roleEvaluations).toHaveLength(1);
|
|
208
|
+
expect(result.roleEvaluations[0].roleId).toBe("role-data-engineer");
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
// ── runRetrospective — end-to-end with DB ────────────────────────────
|
|
212
|
+
describe("runRetrospective — end-to-end via fallback", () => {
|
|
213
|
+
beforeEach(() => {
|
|
214
|
+
// Force fallback path by mocking execSync to throw
|
|
215
|
+
vi.mock("node:child_process", () => ({
|
|
216
|
+
execSync: () => {
|
|
217
|
+
throw new Error("claude not found");
|
|
218
|
+
},
|
|
219
|
+
}));
|
|
220
|
+
});
|
|
221
|
+
afterEach(() => {
|
|
222
|
+
vi.restoreAllMocks();
|
|
223
|
+
});
|
|
224
|
+
it("returns null for empty messages", async () => {
|
|
225
|
+
const result = await runRetrospective({
|
|
226
|
+
swarmId: "swarm-empty",
|
|
227
|
+
messages: [],
|
|
228
|
+
snapshot: makeSnapshot(),
|
|
229
|
+
dbPath: ":memory:",
|
|
230
|
+
});
|
|
231
|
+
expect(result).toBeNull();
|
|
232
|
+
});
|
|
233
|
+
it("persists crossRolePatterns to DB as collaboration memories", async () => {
|
|
234
|
+
const messages = [
|
|
235
|
+
{ type: "action", from: "dev-0", data: "impl done" },
|
|
236
|
+
{ type: "action", from: "qn-0", data: "approved" },
|
|
237
|
+
];
|
|
238
|
+
const snapshot = makeSnapshot();
|
|
239
|
+
const result = await runRetrospective({
|
|
240
|
+
swarmId: "swarm-e2e-1",
|
|
241
|
+
messages,
|
|
242
|
+
snapshot,
|
|
243
|
+
dbPath: ":memory:",
|
|
244
|
+
});
|
|
245
|
+
expect(result).not.toBeNull();
|
|
246
|
+
expect(result.taskSummary).toContain("fallback");
|
|
247
|
+
// Fallback with 2 active roles produces 1 crossRolePattern
|
|
248
|
+
expect(result.crossRolePatterns.length).toBeGreaterThanOrEqual(1);
|
|
249
|
+
});
|
|
250
|
+
it("persists role_stats for each role via fallback", async () => {
|
|
251
|
+
const db = initDatabase(":memory:");
|
|
252
|
+
const messages = [
|
|
253
|
+
{ type: "action", from: "dev-0", data: "done" },
|
|
254
|
+
{ type: "action", from: "qn-0", data: "ok" },
|
|
255
|
+
];
|
|
256
|
+
const snapshot = makeSnapshot();
|
|
257
|
+
// runRetrospective opens its own DB, so we test the DB persistence logic directly
|
|
258
|
+
// by simulating what persistToDb does
|
|
259
|
+
const { fallbackExtraction: fb } = await import("../retrospective.js");
|
|
260
|
+
const result = fb(messages, snapshot);
|
|
261
|
+
const store = new MemoryStore(db);
|
|
262
|
+
const embeddingService = new EmbeddingService(db);
|
|
263
|
+
// Persist crossRolePatterns
|
|
264
|
+
for (const pattern of result.crossRolePatterns) {
|
|
265
|
+
await store.addMemoryWithEmbedding({
|
|
266
|
+
roleId: "role-queen",
|
|
267
|
+
content: pattern,
|
|
268
|
+
type: "pattern",
|
|
269
|
+
level: "long-term",
|
|
270
|
+
domain: "collaboration",
|
|
271
|
+
importance: 0.7,
|
|
272
|
+
sourceSwarmIds: ["swarm-e2e-2"],
|
|
273
|
+
}, embeddingService);
|
|
274
|
+
}
|
|
275
|
+
// Verify: only queen collaboration memories, NO developer personal memories
|
|
276
|
+
const queenMem = store.getMemoriesByRole("role-queen");
|
|
277
|
+
const devMem = store.getMemoriesByRole("role-developer");
|
|
278
|
+
expect(devMem).toHaveLength(0); // key: no personal dev memories
|
|
279
|
+
// Each crossRolePattern becomes a queen collaboration memory
|
|
280
|
+
expect(queenMem.length).toBe(result.crossRolePatterns.length);
|
|
281
|
+
for (const m of queenMem) {
|
|
282
|
+
expect(m.domain).toBe("collaboration");
|
|
283
|
+
expect(m.type).toBe("pattern");
|
|
284
|
+
}
|
|
285
|
+
db.close();
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
// ── DB persistence — role_stats ──────────────────────────────────────
|
|
289
|
+
describe("runRetrospective — DB persistence", () => {
|
|
290
|
+
let db;
|
|
291
|
+
beforeEach(() => {
|
|
292
|
+
db = initDatabase(":memory:");
|
|
293
|
+
});
|
|
294
|
+
it("writes team-level memories (crossRolePatterns + projectInsights) to DB", async () => {
|
|
295
|
+
vi.mock("node:child_process", () => ({
|
|
296
|
+
execSync: () => {
|
|
297
|
+
throw new Error("claude not found");
|
|
298
|
+
},
|
|
299
|
+
}));
|
|
300
|
+
const result = {
|
|
301
|
+
taskSummary: "Built a feature",
|
|
302
|
+
roleEvaluations: [
|
|
303
|
+
{ roleId: "role-developer", qualityScore: 0.85, reworkCount: 1 },
|
|
304
|
+
{ roleId: "role-queen", qualityScore: 0.9, reworkCount: 0 },
|
|
305
|
+
],
|
|
306
|
+
projectInsights: [{ content: "REST is better for this scale", topic: "architecture" }],
|
|
307
|
+
crossRolePatterns: ["Developer-Queen feedback loop was effective"],
|
|
308
|
+
};
|
|
309
|
+
const store = new MemoryStore(db);
|
|
310
|
+
const embeddingService = new EmbeddingService(db);
|
|
311
|
+
for (const pattern of result.crossRolePatterns) {
|
|
312
|
+
await store.addMemoryWithEmbedding({
|
|
313
|
+
roleId: "role-queen",
|
|
314
|
+
content: pattern,
|
|
315
|
+
type: "pattern",
|
|
316
|
+
level: "long-term",
|
|
317
|
+
domain: "collaboration",
|
|
318
|
+
importance: 0.7,
|
|
319
|
+
sourceSwarmIds: ["swarm-test-1"],
|
|
320
|
+
}, embeddingService);
|
|
321
|
+
}
|
|
322
|
+
for (const insight of result.projectInsights) {
|
|
323
|
+
await store.addMemoryWithEmbedding({
|
|
324
|
+
roleId: "role-queen",
|
|
325
|
+
content: insight.content,
|
|
326
|
+
type: "experience",
|
|
327
|
+
level: "long-term",
|
|
328
|
+
domain: insight.topic,
|
|
329
|
+
importance: 0.6,
|
|
330
|
+
sourceSwarmIds: ["swarm-test-1"],
|
|
331
|
+
}, embeddingService);
|
|
332
|
+
}
|
|
333
|
+
const queenMemories = store.getMemoriesByRole("role-queen");
|
|
334
|
+
expect(queenMemories).toHaveLength(2);
|
|
335
|
+
const patternMemory = queenMemories.find((m) => m.type === "pattern");
|
|
336
|
+
expect(patternMemory).toBeDefined();
|
|
337
|
+
expect(patternMemory.content).toBe("Developer-Queen feedback loop was effective");
|
|
338
|
+
expect(patternMemory.domain).toBe("collaboration");
|
|
339
|
+
expect(patternMemory.sourceSwarmIds).toEqual(["swarm-test-1"]);
|
|
340
|
+
const insightMemory = queenMemories.find((m) => m.type === "experience");
|
|
341
|
+
expect(insightMemory).toBeDefined();
|
|
342
|
+
expect(insightMemory.content).toBe("REST is better for this scale");
|
|
343
|
+
expect(insightMemory.domain).toBe("architecture");
|
|
344
|
+
// No personal developer memories written by retrospective
|
|
345
|
+
const devMemories = store.getMemoriesByRole("role-developer");
|
|
346
|
+
expect(devMemories).toHaveLength(0);
|
|
347
|
+
db.close();
|
|
348
|
+
});
|
|
349
|
+
it("does NOT write personal per-role experiences to memories table", async () => {
|
|
350
|
+
// This is the key negative test: even if LLM were to return experiences,
|
|
351
|
+
// persistToDb should only write crossRolePatterns and projectInsights
|
|
352
|
+
const store = new MemoryStore(db);
|
|
353
|
+
const embeddingService = new EmbeddingService(db);
|
|
354
|
+
// Simulate what persistToDb does — only crossRolePatterns + projectInsights
|
|
355
|
+
const result = {
|
|
356
|
+
taskSummary: "Test",
|
|
357
|
+
roleEvaluations: [
|
|
358
|
+
{ roleId: "role-developer", qualityScore: 0.9, reworkCount: 0 },
|
|
359
|
+
{ roleId: "role-reviewer", qualityScore: 0.8, reworkCount: 1 },
|
|
360
|
+
],
|
|
361
|
+
projectInsights: [],
|
|
362
|
+
crossRolePatterns: ["Good collaboration pattern"],
|
|
363
|
+
};
|
|
364
|
+
// Only crossRolePatterns get written (as queen's team memories)
|
|
365
|
+
for (const pattern of result.crossRolePatterns) {
|
|
366
|
+
await store.addMemoryWithEmbedding({
|
|
367
|
+
roleId: "role-queen",
|
|
368
|
+
content: pattern,
|
|
369
|
+
type: "pattern",
|
|
370
|
+
level: "long-term",
|
|
371
|
+
domain: "collaboration",
|
|
372
|
+
importance: 0.7,
|
|
373
|
+
}, embeddingService);
|
|
374
|
+
}
|
|
375
|
+
// Check: developer and reviewer have ZERO memories from retrospective
|
|
376
|
+
expect(store.getMemoriesByRole("role-developer")).toHaveLength(0);
|
|
377
|
+
expect(store.getMemoriesByRole("role-reviewer")).toHaveLength(0);
|
|
378
|
+
// Only queen has the collaboration pattern
|
|
379
|
+
expect(store.getMemoriesByRole("role-queen")).toHaveLength(1);
|
|
380
|
+
db.close();
|
|
381
|
+
});
|
|
382
|
+
it("updates role_stats correctly", async () => {
|
|
383
|
+
const now = Date.now();
|
|
384
|
+
db.prepare(`INSERT INTO role_stats (role_id, tasks_completed, tasks_failed, avg_quality_score, avg_rework_count, total_memories, domains, updated_at)
|
|
385
|
+
VALUES ('role-developer', 2, 0, 0.8, 0, 0, NULL, ?)`).run(now);
|
|
386
|
+
const roleId = "role-developer";
|
|
387
|
+
const newScore = 0.9;
|
|
388
|
+
const existingStats = db
|
|
389
|
+
.prepare("SELECT * FROM role_stats WHERE role_id = ?")
|
|
390
|
+
.get(roleId);
|
|
391
|
+
const tasksCompleted = existingStats.tasks_completed ?? 0;
|
|
392
|
+
const newAvg = ((existingStats.avg_quality_score ?? 0) * tasksCompleted + newScore) /
|
|
393
|
+
(tasksCompleted + 1);
|
|
394
|
+
db.prepare(`UPDATE role_stats
|
|
395
|
+
SET tasks_completed = tasks_completed + 1,
|
|
396
|
+
avg_quality_score = @newAvg,
|
|
397
|
+
updated_at = @now
|
|
398
|
+
WHERE role_id = @roleId`).run({ roleId, newAvg, now: Date.now() });
|
|
399
|
+
const updated = db
|
|
400
|
+
.prepare("SELECT * FROM role_stats WHERE role_id = ?")
|
|
401
|
+
.get(roleId);
|
|
402
|
+
expect(updated.tasks_completed).toBe(3);
|
|
403
|
+
expect(updated.avg_quality_score).toBeCloseTo(0.8333, 3);
|
|
404
|
+
db.close();
|
|
405
|
+
});
|
|
406
|
+
it("inserts role_stats when no row exists", () => {
|
|
407
|
+
const roleId = "role-tester";
|
|
408
|
+
const score = 0.75;
|
|
409
|
+
const now = Date.now();
|
|
410
|
+
const existingStats = db
|
|
411
|
+
.prepare("SELECT * FROM role_stats WHERE role_id = ?")
|
|
412
|
+
.get(roleId);
|
|
413
|
+
expect(existingStats).toBeUndefined();
|
|
414
|
+
db.prepare(`INSERT INTO role_stats (role_id, tasks_completed, tasks_failed, avg_quality_score, avg_rework_count, total_memories, domains, updated_at)
|
|
415
|
+
VALUES (@roleId, 1, 0, @score, 0, 0, NULL, @now)`).run({ roleId, score, now });
|
|
416
|
+
const inserted = db
|
|
417
|
+
.prepare("SELECT * FROM role_stats WHERE role_id = ?")
|
|
418
|
+
.get(roleId);
|
|
419
|
+
expect(inserted.tasks_completed).toBe(1);
|
|
420
|
+
expect(inserted.avg_quality_score).toBe(0.75);
|
|
421
|
+
db.close();
|
|
422
|
+
});
|
|
423
|
+
it("increments tasks_failed for failed swarms", () => {
|
|
424
|
+
const roleId = "role-developer";
|
|
425
|
+
const now = Date.now();
|
|
426
|
+
db.prepare(`INSERT INTO role_stats (role_id, tasks_completed, tasks_failed, avg_quality_score, avg_rework_count, total_memories, domains, updated_at)
|
|
427
|
+
VALUES ('role-developer', 3, 1, 0.8, 0, 0, NULL, ?)`).run(now);
|
|
428
|
+
const isFailure = true;
|
|
429
|
+
const column = isFailure ? "tasks_failed" : "tasks_completed";
|
|
430
|
+
const newScore = 0.4;
|
|
431
|
+
const existingStats = db
|
|
432
|
+
.prepare("SELECT * FROM role_stats WHERE role_id = ?")
|
|
433
|
+
.get(roleId);
|
|
434
|
+
const tasksCompleted = existingStats.tasks_completed ?? 0;
|
|
435
|
+
const newAvg = ((existingStats.avg_quality_score ?? 0) * tasksCompleted + newScore) /
|
|
436
|
+
(tasksCompleted + 1);
|
|
437
|
+
db.prepare(`UPDATE role_stats
|
|
438
|
+
SET ${column} = ${column} + 1,
|
|
439
|
+
avg_quality_score = @newAvg,
|
|
440
|
+
updated_at = @now
|
|
441
|
+
WHERE role_id = @roleId`).run({ roleId, newAvg, now: Date.now() });
|
|
442
|
+
const updated = db
|
|
443
|
+
.prepare("SELECT * FROM role_stats WHERE role_id = ?")
|
|
444
|
+
.get(roleId);
|
|
445
|
+
expect(updated.tasks_completed).toBe(3);
|
|
446
|
+
expect(updated.tasks_failed).toBe(2);
|
|
447
|
+
db.close();
|
|
448
|
+
});
|
|
449
|
+
it("inserts tasks_failed=1 for failed swarm with no prior stats", () => {
|
|
450
|
+
const roleId = "role-reviewer";
|
|
451
|
+
const score = 0.3;
|
|
452
|
+
const now = Date.now();
|
|
453
|
+
const isFailure = true;
|
|
454
|
+
const completed = isFailure ? 0 : 1;
|
|
455
|
+
const failed = isFailure ? 1 : 0;
|
|
456
|
+
db.prepare(`INSERT INTO role_stats (role_id, tasks_completed, tasks_failed, avg_quality_score, avg_rework_count, total_memories, domains, updated_at)
|
|
457
|
+
VALUES (@roleId, @completed, @failed, @score, 0, 0, NULL, @now)`).run({ roleId, completed, failed, score, now });
|
|
458
|
+
const inserted = db
|
|
459
|
+
.prepare("SELECT * FROM role_stats WHERE role_id = ?")
|
|
460
|
+
.get(roleId);
|
|
461
|
+
expect(inserted.tasks_completed).toBe(0);
|
|
462
|
+
expect(inserted.tasks_failed).toBe(1);
|
|
463
|
+
expect(inserted.avg_quality_score).toBe(0.3);
|
|
464
|
+
db.close();
|
|
465
|
+
});
|
|
466
|
+
});
|
|
467
|
+
//# sourceMappingURL=retrospective.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retrospective.test.js","sourceRoot":"","sources":["../../src/__tests__/retrospective.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role-loader.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/role-loader.test.ts"],"names":[],"mappings":""}
|