@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.
Files changed (116) hide show
  1. package/dist/__tests__/action-parser.test.d.ts +2 -0
  2. package/dist/__tests__/action-parser.test.d.ts.map +1 -0
  3. package/dist/__tests__/action-parser.test.js +91 -0
  4. package/dist/__tests__/action-parser.test.js.map +1 -0
  5. package/dist/__tests__/migration-roles.test.d.ts +2 -0
  6. package/dist/__tests__/migration-roles.test.d.ts.map +1 -0
  7. package/dist/__tests__/migration-roles.test.js +213 -0
  8. package/dist/__tests__/migration-roles.test.js.map +1 -0
  9. package/dist/__tests__/retrospective.test.d.ts +2 -0
  10. package/dist/__tests__/retrospective.test.d.ts.map +1 -0
  11. package/dist/__tests__/retrospective.test.js +467 -0
  12. package/dist/__tests__/retrospective.test.js.map +1 -0
  13. package/dist/__tests__/role-loader.test.d.ts +2 -0
  14. package/dist/__tests__/role-loader.test.d.ts.map +1 -0
  15. package/dist/__tests__/role-loader.test.js +217 -0
  16. package/dist/__tests__/role-loader.test.js.map +1 -0
  17. package/dist/__tests__/swarm-coordinator-init.test.d.ts +2 -0
  18. package/dist/__tests__/swarm-coordinator-init.test.d.ts.map +1 -0
  19. package/dist/__tests__/swarm-coordinator-init.test.js +194 -0
  20. package/dist/__tests__/swarm-coordinator-init.test.js.map +1 -0
  21. package/dist/__tests__/swarm-coordinator-roleId.test.d.ts +2 -0
  22. package/dist/__tests__/swarm-coordinator-roleId.test.d.ts.map +1 -0
  23. package/dist/__tests__/swarm-coordinator-roleId.test.js +147 -0
  24. package/dist/__tests__/swarm-coordinator-roleId.test.js.map +1 -0
  25. package/dist/__tests__/template-loader.test.d.ts +2 -0
  26. package/dist/__tests__/template-loader.test.d.ts.map +1 -0
  27. package/dist/__tests__/template-loader.test.js +103 -0
  28. package/dist/__tests__/template-loader.test.js.map +1 -0
  29. package/dist/action-parser.d.ts.map +1 -1
  30. package/dist/action-parser.js +96 -6
  31. package/dist/action-parser.js.map +1 -1
  32. package/dist/index.d.ts +7 -3
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +4 -2
  35. package/dist/index.js.map +1 -1
  36. package/dist/message-router.d.ts +6 -2
  37. package/dist/message-router.d.ts.map +1 -1
  38. package/dist/message-router.js +13 -7
  39. package/dist/message-router.js.map +1 -1
  40. package/dist/persistence.d.ts +1 -0
  41. package/dist/persistence.d.ts.map +1 -1
  42. package/dist/persistence.js +26 -3
  43. package/dist/persistence.js.map +1 -1
  44. package/dist/retrospective.d.ts +42 -0
  45. package/dist/retrospective.d.ts.map +1 -0
  46. package/dist/retrospective.js +307 -0
  47. package/dist/retrospective.js.map +1 -0
  48. package/dist/roles/role-loader.d.ts +12 -1
  49. package/dist/roles/role-loader.d.ts.map +1 -1
  50. package/dist/roles/role-loader.js +160 -7
  51. package/dist/roles/role-loader.js.map +1 -1
  52. package/dist/roles/types.d.ts +26 -2
  53. package/dist/roles/types.d.ts.map +1 -1
  54. package/dist/swarm-coordinator.d.ts +10 -2
  55. package/dist/swarm-coordinator.d.ts.map +1 -1
  56. package/dist/swarm-coordinator.js +267 -38
  57. package/dist/swarm-coordinator.js.map +1 -1
  58. package/dist/templates/template-loader.d.ts +20 -0
  59. package/dist/templates/template-loader.d.ts.map +1 -0
  60. package/dist/templates/template-loader.js +117 -0
  61. package/dist/templates/template-loader.js.map +1 -0
  62. package/dist/templates/types.d.ts +25 -0
  63. package/dist/templates/types.d.ts.map +1 -0
  64. package/dist/templates/types.js +2 -0
  65. package/dist/templates/types.js.map +1 -0
  66. package/dist/types.d.ts +13 -2
  67. package/dist/types.d.ts.map +1 -1
  68. package/package.json +17 -11
  69. package/roles/analyst-livermore.md +112 -0
  70. package/roles/designer-rams.md +266 -0
  71. package/roles/dev-torvalds.md +214 -0
  72. package/roles/developer.md +22 -1
  73. package/roles/director-jia.md +286 -0
  74. package/roles/editor-boyong.md +148 -0
  75. package/roles/macro-dalio.md +115 -0
  76. package/roles/planner-maoni.md +306 -0
  77. package/roles/pm-jobs.md +326 -0
  78. package/roles/preset-analyst-simons.md +55 -0
  79. package/roles/preset-architect-knuth.md +55 -0
  80. package/roles/preset-designer-norman.md +55 -0
  81. package/roles/preset-designer.md +55 -0
  82. package/roles/preset-dev-carmack.md +55 -0
  83. package/roles/preset-dev-gosling.md +55 -0
  84. package/roles/preset-developer.md +68 -0
  85. package/roles/preset-manager-grove.md +55 -0
  86. package/roles/preset-manager-musk.md +55 -0
  87. package/roles/preset-pm.md +105 -0
  88. package/roles/preset-researcher-feynman.md +55 -0
  89. package/roles/preset-reviewer.md +62 -0
  90. package/roles/preset-strategist-buffett.md +55 -0
  91. package/roles/preset-strategist-munger.md +55 -0
  92. package/roles/preset-strategist-sunzi.md +55 -0
  93. package/roles/preset-tester-beck.md +56 -0
  94. package/roles/preset-tester.md +63 -0
  95. package/roles/preset-writer-orwell.md +55 -0
  96. package/roles/preset-writer.md +55 -0
  97. package/roles/quant-simons.md +136 -0
  98. package/roles/queen.md +27 -1
  99. package/roles/reviewer-martin.md +200 -0
  100. package/roles/reviewer.md +18 -1
  101. package/roles/rhythm-tangsan.md +135 -0
  102. package/roles/risk-taleb.md +112 -0
  103. package/roles/script-shitiesheng.md +129 -0
  104. package/roles/storyboard-xuke.md +138 -0
  105. package/roles/strategist-soros.md +257 -0
  106. package/roles/tester-beck.md +232 -0
  107. package/roles/tester.md +19 -1
  108. package/roles/trader-jones.md +124 -0
  109. package/roles/vfx-guchangwei.md +129 -0
  110. package/roles/writer-zhouzi.md +144 -0
  111. package/templates/dev-team-pro.md +21 -0
  112. package/templates/dev-team.md +19 -0
  113. package/templates/minimal.md +14 -0
  114. package/templates/trading-team.md +22 -0
  115. package/templates/video-team.md +18 -0
  116. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=role-loader.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-loader.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/role-loader.test.ts"],"names":[],"mappings":""}