@cleocode/core 2026.3.45 → 2026.3.47

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 (154) hide show
  1. package/dist/bootstrap.d.ts.map +1 -1
  2. package/dist/index.js +1508 -377
  3. package/dist/index.js.map +4 -4
  4. package/dist/init.d.ts.map +1 -1
  5. package/dist/injection.d.ts +1 -1
  6. package/dist/injection.d.ts.map +1 -1
  7. package/dist/routing/capability-matrix.d.ts +6 -4
  8. package/dist/routing/capability-matrix.d.ts.map +1 -1
  9. package/dist/scaffold.d.ts +35 -9
  10. package/dist/scaffold.d.ts.map +1 -1
  11. package/dist/skills/agents/install.d.ts.map +1 -1
  12. package/dist/skills/routing-table.d.ts +17 -16
  13. package/dist/skills/routing-table.d.ts.map +1 -1
  14. package/dist/skills/skill-paths.d.ts.map +1 -1
  15. package/dist/system/health.d.ts.map +1 -1
  16. package/dist/ui/index.d.ts +0 -1
  17. package/dist/ui/index.d.ts.map +1 -1
  18. package/package.json +9 -4
  19. package/schemas/adr-frontmatter.schema.json +72 -0
  20. package/schemas/agent-configs.schema.json +120 -0
  21. package/schemas/agent-registry.json +243 -0
  22. package/schemas/agent-registry.schema.json +132 -0
  23. package/schemas/archive/research-manifest.schema.json +257 -0
  24. package/schemas/archive.schema.json +450 -0
  25. package/schemas/brain-decision.schema.json +69 -0
  26. package/schemas/brain-learning.schema.json +57 -0
  27. package/schemas/brain-pattern.schema.json +72 -0
  28. package/schemas/config.schema.json +2606 -0
  29. package/schemas/context-state.schema.json +137 -0
  30. package/schemas/contribution.schema.json +722 -0
  31. package/schemas/critical-path.schema.json +246 -0
  32. package/schemas/deps-cache.schema.json +97 -0
  33. package/schemas/doctor-output.schema.json +283 -0
  34. package/schemas/error.schema.json +161 -0
  35. package/schemas/export-package.schema.json +375 -0
  36. package/schemas/global-config.schema.json +219 -0
  37. package/schemas/grade.schema.json +49 -0
  38. package/schemas/log.schema.json +250 -0
  39. package/schemas/metrics.schema.json +328 -0
  40. package/schemas/migrations.schema.json +150 -0
  41. package/schemas/nexus-registry.schema.json +90 -0
  42. package/schemas/operation-constitution.schema.json +438 -0
  43. package/schemas/output.schema.json +164 -0
  44. package/schemas/project-context.schema.json +164 -0
  45. package/schemas/project-info.schema.json +180 -0
  46. package/schemas/projects-registry.schema.json +107 -0
  47. package/schemas/protocol-frontmatter.schema.json +72 -0
  48. package/schemas/rcasd-consensus-report.schema.json +10 -0
  49. package/schemas/rcasd-evidence.schema.json +42 -0
  50. package/schemas/rcasd-gate-result.schema.json +46 -0
  51. package/schemas/rcasd-hitl-resolution.schema.json +10 -0
  52. package/schemas/rcasd-index.schema.json +10 -0
  53. package/schemas/rcasd-manifest.schema.json +10 -0
  54. package/schemas/rcasd-research-output.schema.json +10 -0
  55. package/schemas/rcasd-spec-frontmatter.schema.json +10 -0
  56. package/schemas/rcasd-stage-transition.schema.json +38 -0
  57. package/schemas/releases.schema.json +267 -0
  58. package/schemas/skills-manifest.schema.json +91 -0
  59. package/schemas/skillsmp.schema.json +208 -0
  60. package/schemas/spec-index.schema.json +196 -0
  61. package/schemas/system-flow-atlas.schema.json +125 -0
  62. package/src/__tests__/injection-chain.test.d.ts +4 -3
  63. package/src/__tests__/injection-chain.test.d.ts.map +1 -1
  64. package/src/__tests__/injection-chain.test.js +11 -10
  65. package/src/__tests__/injection-chain.test.js.map +1 -1
  66. package/src/__tests__/injection-chain.test.ts +11 -10
  67. package/src/__tests__/injection-mvi-tiers.test.js +4 -2
  68. package/src/__tests__/injection-mvi-tiers.test.js.map +1 -1
  69. package/src/__tests__/injection-mvi-tiers.test.ts +4 -2
  70. package/src/agents/__tests__/capacity.test.d.ts +7 -0
  71. package/src/agents/__tests__/capacity.test.d.ts.map +1 -0
  72. package/src/agents/__tests__/capacity.test.js +173 -0
  73. package/src/agents/__tests__/capacity.test.js.map +1 -0
  74. package/src/agents/__tests__/registry.test.d.ts +8 -0
  75. package/src/agents/__tests__/registry.test.d.ts.map +1 -0
  76. package/src/agents/__tests__/registry.test.js +348 -0
  77. package/src/agents/__tests__/registry.test.js.map +1 -0
  78. package/src/agents/__tests__/retry.test.d.ts +7 -0
  79. package/src/agents/__tests__/retry.test.d.ts.map +1 -0
  80. package/src/agents/__tests__/retry.test.js +225 -0
  81. package/src/agents/__tests__/retry.test.js.map +1 -0
  82. package/src/bootstrap.ts +37 -6
  83. package/src/init.ts +63 -18
  84. package/src/injection.ts +11 -5
  85. package/src/intelligence/__tests__/impact.test.d.ts +15 -0
  86. package/src/intelligence/__tests__/impact.test.d.ts.map +1 -0
  87. package/src/intelligence/__tests__/impact.test.js +384 -0
  88. package/src/intelligence/__tests__/impact.test.js.map +1 -0
  89. package/src/intelligence/__tests__/patterns.test.d.ts +8 -0
  90. package/src/intelligence/__tests__/patterns.test.d.ts.map +1 -0
  91. package/src/intelligence/__tests__/patterns.test.js +370 -0
  92. package/src/intelligence/__tests__/patterns.test.js.map +1 -0
  93. package/src/intelligence/__tests__/prediction.test.d.ts +8 -0
  94. package/src/intelligence/__tests__/prediction.test.d.ts.map +1 -0
  95. package/src/intelligence/__tests__/prediction.test.js +314 -0
  96. package/src/intelligence/__tests__/prediction.test.js.map +1 -0
  97. package/src/nexus/__tests__/nexus-e2e.test.d.ts +12 -0
  98. package/src/nexus/__tests__/nexus-e2e.test.d.ts.map +1 -0
  99. package/src/nexus/__tests__/nexus-e2e.test.js +1220 -0
  100. package/src/nexus/__tests__/nexus-e2e.test.js.map +1 -0
  101. package/src/nexus/__tests__/transfer.test.d.ts +8 -0
  102. package/src/nexus/__tests__/transfer.test.d.ts.map +1 -0
  103. package/src/nexus/__tests__/transfer.test.js +372 -0
  104. package/src/nexus/__tests__/transfer.test.js.map +1 -0
  105. package/src/nexus/__tests__/transfer.test.ts +1 -1
  106. package/src/routing/capability-matrix.ts +1435 -205
  107. package/src/scaffold.ts +70 -13
  108. package/src/sessions/__tests__/briefing.test.js +28 -2
  109. package/src/sessions/__tests__/briefing.test.js.map +1 -1
  110. package/src/skills/__tests__/routing-table.test.js +48 -31
  111. package/src/skills/__tests__/routing-table.test.js.map +1 -1
  112. package/src/skills/__tests__/routing-table.test.ts +53 -33
  113. package/src/skills/agents/install.ts +9 -1
  114. package/src/skills/orchestrator/__tests__/spawn-tier.test.js +41 -32
  115. package/src/skills/orchestrator/__tests__/spawn-tier.test.js.map +1 -1
  116. package/src/skills/routing-table.ts +39 -253
  117. package/src/skills/skill-paths.ts +3 -2
  118. package/src/store/__tests__/project-detect.test.js +1 -1
  119. package/src/store/__tests__/project-detect.test.js.map +1 -1
  120. package/src/store/__tests__/project-detect.test.ts +1 -1
  121. package/src/store/__tests__/test-db-helper.d.ts.map +1 -1
  122. package/src/store/__tests__/test-db-helper.js +0 -1
  123. package/src/store/__tests__/test-db-helper.js.map +1 -1
  124. package/src/system/health.ts +18 -7
  125. package/src/ui/index.ts +0 -6
  126. package/src/validation/operation-gate-validators.ts +2 -2
  127. package/templates/CLEO-INJECTION.md +120 -0
  128. package/templates/README.md +29 -0
  129. package/templates/agent-registry.json +305 -0
  130. package/templates/cleo-gitignore +74 -0
  131. package/templates/config.template.json +187 -0
  132. package/templates/git-hooks/commit-msg +149 -0
  133. package/templates/git-hooks/pre-commit +40 -0
  134. package/templates/git-hooks/pre-push +79 -0
  135. package/templates/github/ISSUE_TEMPLATE/bug_report.yml +143 -0
  136. package/templates/github/ISSUE_TEMPLATE/config.yml +8 -0
  137. package/templates/github/ISSUE_TEMPLATE/feature_request.yml +125 -0
  138. package/templates/github/ISSUE_TEMPLATE/help_question.yml +99 -0
  139. package/templates/global-config.template.json +56 -0
  140. package/templates/hooks/precompact-safestop.sh +89 -0
  141. package/templates/issue-templates/bug_report.yml +143 -0
  142. package/templates/issue-templates/config.yml +8 -0
  143. package/templates/issue-templates/feature_request.yml +125 -0
  144. package/templates/issue-templates/help_question.yml +99 -0
  145. package/templates/skillsmp.json.example +28 -0
  146. package/templates/skillsmp.json.example.md +214 -0
  147. package/dist/ui/injection-legacy.d.ts +0 -26
  148. package/dist/ui/injection-legacy.d.ts.map +0 -1
  149. package/src/ui/__tests__/injection-registry.test.d.ts +0 -11
  150. package/src/ui/__tests__/injection-registry.test.d.ts.map +0 -1
  151. package/src/ui/__tests__/injection-registry.test.js +0 -46
  152. package/src/ui/__tests__/injection-registry.test.js.map +0 -1
  153. package/src/ui/__tests__/injection-registry.test.ts +0 -57
  154. package/src/ui/injection-legacy.ts +0 -44
@@ -0,0 +1,384 @@
1
+ /**
2
+ * Tests for impact analysis module.
3
+ *
4
+ * Covers:
5
+ * - Simple dependency chains (A->B->C)
6
+ * - Complex graphs (diamond dependencies)
7
+ * - Each change type (cancel, block, complete, reprioritize)
8
+ * - Blast radius calculation
9
+ * - Critical path detection
10
+ * - Edge cases (orphan tasks, circular refs, no deps)
11
+ *
12
+ * @module intelligence
13
+ */
14
+ import { describe, expect, it } from 'vitest';
15
+ import { analyzeChangeImpact, analyzeTaskImpact, calculateBlastRadius } from '../impact.js';
16
+ // ============================================================================
17
+ // Test Helpers
18
+ // ============================================================================
19
+ function makeTask(overrides) {
20
+ return {
21
+ title: `Task ${overrides.id}`,
22
+ description: `Description for ${overrides.id}`,
23
+ status: 'pending',
24
+ priority: 'medium',
25
+ createdAt: new Date().toISOString(),
26
+ ...overrides,
27
+ };
28
+ }
29
+ /**
30
+ * Create a mock DataAccessor that returns the given tasks.
31
+ */
32
+ function mockAccessor(tasks) {
33
+ return {
34
+ queryTasks: async () => ({ tasks, total: tasks.length }),
35
+ loadSingleTask: async (id) => tasks.find((t) => t.id === id) ?? null,
36
+ taskExists: async (id) => tasks.some((t) => t.id === id),
37
+ upsertSingleTask: async () => { },
38
+ deleteSingleTask: async () => true,
39
+ close: async () => { },
40
+ };
41
+ }
42
+ // ============================================================================
43
+ // analyzeTaskImpact
44
+ // ============================================================================
45
+ describe('analyzeTaskImpact', () => {
46
+ it('returns empty assessment for non-existent task', async () => {
47
+ const acc = mockAccessor([]);
48
+ const result = await analyzeTaskImpact('T999', acc);
49
+ expect(result.taskId).toBe('T999');
50
+ expect(result.directDependents).toEqual([]);
51
+ expect(result.transitiveDependents).toEqual([]);
52
+ expect(result.blockedWorkCount).toBe(0);
53
+ expect(result.isOnCriticalPath).toBe(false);
54
+ expect(result.blastRadius.severity).toBe('isolated');
55
+ });
56
+ it('analyzes simple linear chain A->B->C', async () => {
57
+ const tasks = [
58
+ makeTask({ id: 'T001' }),
59
+ makeTask({ id: 'T002', depends: ['T001'] }),
60
+ makeTask({ id: 'T003', depends: ['T002'] }),
61
+ ];
62
+ const acc = mockAccessor(tasks);
63
+ const result = await analyzeTaskImpact('T001', acc);
64
+ expect(result.taskId).toBe('T001');
65
+ expect(result.directDependents).toEqual(['T002']);
66
+ expect(result.transitiveDependents.sort()).toEqual(['T002', 'T003']);
67
+ expect(result.blockedWorkCount).toBe(2);
68
+ });
69
+ it('analyzes diamond dependency graph', async () => {
70
+ // T001 -> T002 -> T004
71
+ // T001 -> T003 -> T004
72
+ const tasks = [
73
+ makeTask({ id: 'T001' }),
74
+ makeTask({ id: 'T002', depends: ['T001'] }),
75
+ makeTask({ id: 'T003', depends: ['T001'] }),
76
+ makeTask({ id: 'T004', depends: ['T002', 'T003'] }),
77
+ ];
78
+ const acc = mockAccessor(tasks);
79
+ const result = await analyzeTaskImpact('T001', acc);
80
+ expect(result.directDependents.sort()).toEqual(['T002', 'T003']);
81
+ expect(result.transitiveDependents.sort()).toEqual(['T002', 'T003', 'T004']);
82
+ expect(result.blockedWorkCount).toBe(3);
83
+ });
84
+ it('excludes completed tasks from blocked work count', async () => {
85
+ const tasks = [
86
+ makeTask({ id: 'T001' }),
87
+ makeTask({ id: 'T002', depends: ['T001'], status: 'done' }),
88
+ makeTask({ id: 'T003', depends: ['T001'] }),
89
+ ];
90
+ const acc = mockAccessor(tasks);
91
+ const result = await analyzeTaskImpact('T001', acc);
92
+ expect(result.directDependents.sort()).toEqual(['T002', 'T003']);
93
+ expect(result.blockedWorkCount).toBe(1); // T002 is done, only T003 counts
94
+ });
95
+ it('detects task on critical path', async () => {
96
+ const tasks = [
97
+ makeTask({ id: 'T001' }),
98
+ makeTask({ id: 'T002', depends: ['T001'] }),
99
+ makeTask({ id: 'T003', depends: ['T002'] }),
100
+ makeTask({ id: 'T004' }), // isolated, not on critical path
101
+ ];
102
+ const acc = mockAccessor(tasks);
103
+ const result = await analyzeTaskImpact('T001', acc);
104
+ expect(result.isOnCriticalPath).toBe(true);
105
+ });
106
+ it('detects task NOT on critical path', async () => {
107
+ // T001 -> T002 -> T003 (critical path, length 3)
108
+ // T004 (independent, shorter)
109
+ const tasks = [
110
+ makeTask({ id: 'T001' }),
111
+ makeTask({ id: 'T002', depends: ['T001'] }),
112
+ makeTask({ id: 'T003', depends: ['T002'] }),
113
+ makeTask({ id: 'T004' }),
114
+ ];
115
+ const acc = mockAccessor(tasks);
116
+ const result = await analyzeTaskImpact('T004', acc);
117
+ expect(result.isOnCriticalPath).toBe(false);
118
+ });
119
+ it('finds affected pipelines via parent chain', async () => {
120
+ const tasks = [
121
+ makeTask({ id: 'T001', type: 'epic' }),
122
+ makeTask({ id: 'T002', parentId: 'T001', type: 'task' }),
123
+ makeTask({ id: 'T003', parentId: 'T001', type: 'task', depends: ['T002'] }),
124
+ ];
125
+ const acc = mockAccessor(tasks);
126
+ const result = await analyzeTaskImpact('T002', acc);
127
+ expect(result.affectedPipelines).toContain('T001');
128
+ });
129
+ it('handles orphan task with no dependents', async () => {
130
+ const tasks = [makeTask({ id: 'T001' }), makeTask({ id: 'T002' })];
131
+ const acc = mockAccessor(tasks);
132
+ const result = await analyzeTaskImpact('T001', acc);
133
+ expect(result.directDependents).toEqual([]);
134
+ expect(result.transitiveDependents).toEqual([]);
135
+ expect(result.blockedWorkCount).toBe(0);
136
+ expect(result.blastRadius.severity).toBe('isolated');
137
+ });
138
+ it('handles circular dependency gracefully', async () => {
139
+ const tasks = [
140
+ makeTask({ id: 'T001', depends: ['T002'] }),
141
+ makeTask({ id: 'T002', depends: ['T001'] }),
142
+ ];
143
+ const acc = mockAccessor(tasks);
144
+ // Should not throw, BFS handles cycles via visited set
145
+ const result = await analyzeTaskImpact('T001', acc);
146
+ expect(result.directDependents).toContain('T002');
147
+ expect(result.transitiveDependents).toContain('T002');
148
+ });
149
+ });
150
+ // ============================================================================
151
+ // analyzeChangeImpact
152
+ // ============================================================================
153
+ describe('analyzeChangeImpact', () => {
154
+ it('returns empty for non-existent task', async () => {
155
+ const acc = mockAccessor([]);
156
+ const result = await analyzeChangeImpact('T999', 'cancel', acc);
157
+ expect(result.affectedTasks).toEqual([]);
158
+ expect(result.cascadeDepth).toBe(0);
159
+ expect(result.recommendation).toContain('not found');
160
+ });
161
+ describe('cancel', () => {
162
+ it('identifies orphaned dependents when sole dependency cancelled', async () => {
163
+ const tasks = [
164
+ makeTask({ id: 'T001' }),
165
+ makeTask({ id: 'T002', depends: ['T001'], status: 'blocked' }),
166
+ ];
167
+ const acc = mockAccessor(tasks);
168
+ const result = await analyzeChangeImpact('T001', 'cancel', acc);
169
+ expect(result.affectedTasks).toHaveLength(1);
170
+ expect(result.affectedTasks[0].id).toBe('T002');
171
+ expect(result.affectedTasks[0].newStatus).toBe('pending');
172
+ expect(result.affectedTasks[0].reason).toContain('orphaned');
173
+ });
174
+ it('identifies tasks with remaining dependencies', async () => {
175
+ const tasks = [
176
+ makeTask({ id: 'T001' }),
177
+ makeTask({ id: 'T003' }),
178
+ makeTask({ id: 'T002', depends: ['T001', 'T003'] }),
179
+ ];
180
+ const acc = mockAccessor(tasks);
181
+ const result = await analyzeChangeImpact('T001', 'cancel', acc);
182
+ expect(result.affectedTasks).toHaveLength(1);
183
+ expect(result.affectedTasks[0].reason).toContain('other dependencies remain');
184
+ });
185
+ it('skips already-completed dependents', async () => {
186
+ const tasks = [
187
+ makeTask({ id: 'T001' }),
188
+ makeTask({ id: 'T002', depends: ['T001'], status: 'done' }),
189
+ ];
190
+ const acc = mockAccessor(tasks);
191
+ const result = await analyzeChangeImpact('T001', 'cancel', acc);
192
+ expect(result.affectedTasks).toEqual([]);
193
+ });
194
+ });
195
+ describe('block', () => {
196
+ it('cascade-blocks all downstream tasks', async () => {
197
+ const tasks = [
198
+ makeTask({ id: 'T001' }),
199
+ makeTask({ id: 'T002', depends: ['T001'] }),
200
+ makeTask({ id: 'T003', depends: ['T002'] }),
201
+ ];
202
+ const acc = mockAccessor(tasks);
203
+ const result = await analyzeChangeImpact('T001', 'block', acc);
204
+ expect(result.affectedTasks).toHaveLength(2);
205
+ expect(result.affectedTasks.every((t) => t.newStatus === 'blocked')).toBe(true);
206
+ });
207
+ it('includes direct dependency reason', async () => {
208
+ const tasks = [makeTask({ id: 'T001' }), makeTask({ id: 'T002', depends: ['T001'] })];
209
+ const acc = mockAccessor(tasks);
210
+ const result = await analyzeChangeImpact('T001', 'block', acc);
211
+ expect(result.affectedTasks[0].reason).toContain('Direct dependency blocked');
212
+ });
213
+ });
214
+ describe('complete', () => {
215
+ it('unblocks tasks whose last dependency is completed', async () => {
216
+ const tasks = [
217
+ makeTask({ id: 'T001' }),
218
+ makeTask({ id: 'T002', depends: ['T001'], status: 'blocked' }),
219
+ ];
220
+ const acc = mockAccessor(tasks);
221
+ const result = await analyzeChangeImpact('T001', 'complete', acc);
222
+ expect(result.affectedTasks).toHaveLength(1);
223
+ expect(result.affectedTasks[0].id).toBe('T002');
224
+ expect(result.affectedTasks[0].newStatus).toBe('pending');
225
+ expect(result.affectedTasks[0].reason).toContain('unblocked');
226
+ });
227
+ it('reports partially unblocked tasks with remaining deps', async () => {
228
+ const tasks = [
229
+ makeTask({ id: 'T001' }),
230
+ makeTask({ id: 'T003' }),
231
+ makeTask({ id: 'T002', depends: ['T001', 'T003'], status: 'blocked' }),
232
+ ];
233
+ const acc = mockAccessor(tasks);
234
+ const result = await analyzeChangeImpact('T001', 'complete', acc);
235
+ expect(result.affectedTasks).toHaveLength(1);
236
+ expect(result.affectedTasks[0].reason).toContain('1 other dependency');
237
+ });
238
+ });
239
+ describe('reprioritize', () => {
240
+ it('flags downstream tasks for reordering', async () => {
241
+ const tasks = [
242
+ makeTask({ id: 'T001' }),
243
+ makeTask({ id: 'T002', depends: ['T001'] }),
244
+ makeTask({ id: 'T003', depends: ['T002'] }),
245
+ ];
246
+ const acc = mockAccessor(tasks);
247
+ const result = await analyzeChangeImpact('T001', 'reprioritize', acc);
248
+ expect(result.affectedTasks).toHaveLength(2);
249
+ expect(result.affectedTasks.every((t) => t.reason.includes('reprioritized'))).toBe(true);
250
+ });
251
+ });
252
+ it('computes cascade depth correctly', async () => {
253
+ const tasks = [
254
+ makeTask({ id: 'T001' }),
255
+ makeTask({ id: 'T002', depends: ['T001'] }),
256
+ makeTask({ id: 'T003', depends: ['T002'] }),
257
+ makeTask({ id: 'T004', depends: ['T003'] }),
258
+ ];
259
+ const acc = mockAccessor(tasks);
260
+ const result = await analyzeChangeImpact('T001', 'block', acc);
261
+ expect(result.cascadeDepth).toBe(3);
262
+ });
263
+ it('generates recommendation text', async () => {
264
+ const tasks = [makeTask({ id: 'T001' }), makeTask({ id: 'T002', depends: ['T001'] })];
265
+ const acc = mockAccessor(tasks);
266
+ const result = await analyzeChangeImpact('T001', 'block', acc);
267
+ expect(result.recommendation).toContain('blocking');
268
+ expect(result.recommendation).toContain('T001');
269
+ });
270
+ });
271
+ // ============================================================================
272
+ // calculateBlastRadius
273
+ // ============================================================================
274
+ describe('calculateBlastRadius', () => {
275
+ it('returns isolated for non-existent task', async () => {
276
+ const acc = mockAccessor([]);
277
+ const result = await calculateBlastRadius('T999', acc);
278
+ expect(result.directCount).toBe(0);
279
+ expect(result.transitiveCount).toBe(0);
280
+ expect(result.severity).toBe('isolated');
281
+ });
282
+ it('computes correct counts for linear chain', async () => {
283
+ const tasks = [
284
+ makeTask({ id: 'T001' }),
285
+ makeTask({ id: 'T002', depends: ['T001'] }),
286
+ makeTask({ id: 'T003', depends: ['T002'] }),
287
+ ];
288
+ const acc = mockAccessor(tasks);
289
+ const result = await calculateBlastRadius('T001', acc);
290
+ expect(result.directCount).toBe(1);
291
+ expect(result.transitiveCount).toBe(2);
292
+ });
293
+ it('computes correct counts for diamond dependency', async () => {
294
+ const tasks = [
295
+ makeTask({ id: 'T001' }),
296
+ makeTask({ id: 'T002', depends: ['T001'] }),
297
+ makeTask({ id: 'T003', depends: ['T001'] }),
298
+ makeTask({ id: 'T004', depends: ['T002', 'T003'] }),
299
+ ];
300
+ const acc = mockAccessor(tasks);
301
+ const result = await calculateBlastRadius('T001', acc);
302
+ expect(result.directCount).toBe(2);
303
+ expect(result.transitiveCount).toBe(3);
304
+ });
305
+ it('counts affected epics', async () => {
306
+ const tasks = [
307
+ makeTask({ id: 'T001', type: 'epic' }),
308
+ makeTask({ id: 'T002', parentId: 'T001', type: 'task' }),
309
+ makeTask({ id: 'T003', parentId: 'T001', type: 'task', depends: ['T002'] }),
310
+ ];
311
+ const acc = mockAccessor(tasks);
312
+ const result = await calculateBlastRadius('T002', acc);
313
+ expect(result.epicCount).toBeGreaterThanOrEqual(1);
314
+ });
315
+ it('calculates project percentage', async () => {
316
+ // 3 out of 10 tasks affected = 30%
317
+ const tasks = [];
318
+ for (let i = 1; i <= 10; i++) {
319
+ tasks.push(makeTask({
320
+ id: `T${String(i).padStart(3, '0')}`,
321
+ depends: i > 1 && i <= 4 ? [`T${String(i - 1).padStart(3, '0')}`] : undefined,
322
+ }));
323
+ }
324
+ const acc = mockAccessor(tasks);
325
+ const result = await calculateBlastRadius('T001', acc);
326
+ // T001 -> T002 -> T003 -> T004 (transitive: T002, T003, T004 = 3 tasks)
327
+ expect(result.transitiveCount).toBe(3);
328
+ expect(result.projectPercentage).toBe(30);
329
+ });
330
+ it('classifies severity as isolated for 0%', async () => {
331
+ const tasks = [makeTask({ id: 'T001' }), makeTask({ id: 'T002' })];
332
+ const acc = mockAccessor(tasks);
333
+ const result = await calculateBlastRadius('T001', acc);
334
+ expect(result.severity).toBe('isolated');
335
+ });
336
+ it('classifies severity as moderate for 2-10%', async () => {
337
+ // 1 out of 20 = 5%
338
+ const tasks = [];
339
+ for (let i = 1; i <= 20; i++) {
340
+ tasks.push(makeTask({ id: `T${String(i).padStart(3, '0')}` }));
341
+ }
342
+ // Make T002 depend on T001
343
+ tasks[1] = makeTask({ id: 'T002', depends: ['T001'] });
344
+ const acc = mockAccessor(tasks);
345
+ const result = await calculateBlastRadius('T001', acc);
346
+ expect(result.severity).toBe('moderate');
347
+ });
348
+ it('classifies severity as critical for >30%', async () => {
349
+ // Chain of 4 out of 5 tasks = 60%
350
+ const tasks = [
351
+ makeTask({ id: 'T001' }),
352
+ makeTask({ id: 'T002', depends: ['T001'] }),
353
+ makeTask({ id: 'T003', depends: ['T002'] }),
354
+ makeTask({ id: 'T004', depends: ['T003'] }),
355
+ makeTask({ id: 'T005' }),
356
+ ];
357
+ const acc = mockAccessor(tasks);
358
+ const result = await calculateBlastRadius('T001', acc);
359
+ expect(result.severity).toBe('critical');
360
+ });
361
+ it('handles orphan task with no dependents', async () => {
362
+ const tasks = [makeTask({ id: 'T001' }), makeTask({ id: 'T002' }), makeTask({ id: 'T003' })];
363
+ const acc = mockAccessor(tasks);
364
+ const result = await calculateBlastRadius('T001', acc);
365
+ expect(result.directCount).toBe(0);
366
+ expect(result.transitiveCount).toBe(0);
367
+ expect(result.severity).toBe('isolated');
368
+ });
369
+ it('handles circular dependency without infinite loop', async () => {
370
+ const tasks = [
371
+ makeTask({ id: 'T001', depends: ['T002'] }),
372
+ makeTask({ id: 'T002', depends: ['T001'] }),
373
+ ];
374
+ const acc = mockAccessor(tasks);
375
+ // Should complete without hanging.
376
+ // In a cycle, both tasks appear in the transitive closure
377
+ // because BFS from T001 finds T002 (direct dep), then from T002
378
+ // finds T001 (since T001 depends on T002), yielding 2.
379
+ const result = await calculateBlastRadius('T001', acc);
380
+ expect(result.directCount).toBe(1);
381
+ expect(result.transitiveCount).toBe(2);
382
+ });
383
+ });
384
+ //# sourceMappingURL=impact.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impact.test.js","sourceRoot":"","sources":["impact.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Unit tests for the Pattern Extraction module.
3
+ *
4
+ * Tests pattern extraction from history, pattern matching against tasks,
5
+ * pattern storage, and stat updates. All external dependencies are mocked.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=patterns.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.test.d.ts","sourceRoot":"","sources":["patterns.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}