claude-mycelium 2.0.0 → 2.1.0

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 (189) hide show
  1. package/.agent-meta/_inhibitors.ndjson +1287 -0
  2. package/.agent-meta/_quarantine.json +45 -0
  3. package/.agent-meta/config.json +9 -0
  4. package/.claude/memory.db +0 -0
  5. package/.claude/settings.local.json +4 -1
  6. package/README.md +81 -235
  7. package/SECURITY.md +145 -0
  8. package/dist/agent/worker.d.ts +8 -0
  9. package/dist/agent/worker.d.ts.map +1 -0
  10. package/dist/agent/worker.js +97 -0
  11. package/dist/agent/worker.js.map +1 -0
  12. package/dist/bin.d.ts +7 -0
  13. package/dist/bin.d.ts.map +1 -0
  14. package/dist/bin.js +11 -0
  15. package/dist/bin.js.map +1 -0
  16. package/dist/cli/cost.d.ts +10 -0
  17. package/dist/cli/cost.d.ts.map +1 -0
  18. package/dist/cli/cost.js +163 -0
  19. package/dist/cli/cost.js.map +1 -0
  20. package/dist/cli/gc.d.ts +10 -0
  21. package/dist/cli/gc.d.ts.map +1 -0
  22. package/dist/cli/gc.js +108 -0
  23. package/dist/cli/gc.js.map +1 -0
  24. package/dist/cli/gradients.d.ts +10 -0
  25. package/dist/cli/gradients.d.ts.map +1 -0
  26. package/dist/cli/gradients.js +69 -0
  27. package/dist/cli/gradients.js.map +1 -0
  28. package/dist/cli/index.d.ts +17 -0
  29. package/dist/cli/index.d.ts.map +1 -0
  30. package/dist/cli/index.js +72 -0
  31. package/dist/cli/index.js.map +1 -0
  32. package/dist/cli/init.d.ts +11 -0
  33. package/dist/cli/init.d.ts.map +1 -0
  34. package/dist/cli/init.js +97 -0
  35. package/dist/cli/init.js.map +1 -0
  36. package/dist/cli/status.d.ts +10 -0
  37. package/dist/cli/status.d.ts.map +1 -0
  38. package/dist/cli/status.js +191 -0
  39. package/dist/cli/status.js.map +1 -0
  40. package/dist/coordination/file-locks.d.ts +42 -0
  41. package/dist/coordination/file-locks.d.ts.map +1 -0
  42. package/dist/coordination/file-locks.js +269 -0
  43. package/dist/coordination/file-locks.js.map +1 -0
  44. package/dist/coordination/index.d.ts +4 -0
  45. package/dist/coordination/index.d.ts.map +1 -1
  46. package/dist/coordination/index.js +4 -0
  47. package/dist/coordination/index.js.map +1 -1
  48. package/dist/coordination/inhibitors.d.ts +84 -0
  49. package/dist/coordination/inhibitors.d.ts.map +1 -0
  50. package/dist/coordination/inhibitors.js +290 -0
  51. package/dist/coordination/inhibitors.js.map +1 -0
  52. package/dist/coordination/process-manager.d.ts +73 -0
  53. package/dist/coordination/process-manager.d.ts.map +1 -0
  54. package/dist/coordination/process-manager.js +144 -0
  55. package/dist/coordination/process-manager.js.map +1 -0
  56. package/dist/core/agent-executor.d.ts.map +1 -1
  57. package/dist/core/agent-executor.js +28 -10
  58. package/dist/core/agent-executor.js.map +1 -1
  59. package/dist/core/change-applier.d.ts +29 -5
  60. package/dist/core/change-applier.d.ts.map +1 -1
  61. package/dist/core/change-applier.js +254 -24
  62. package/dist/core/change-applier.js.map +1 -1
  63. package/dist/core/signals/churn.d.ts.map +1 -1
  64. package/dist/core/signals/churn.js +6 -4
  65. package/dist/core/signals/churn.js.map +1 -1
  66. package/dist/core/signals/debt.d.ts.map +1 -1
  67. package/dist/core/signals/debt.js +4 -3
  68. package/dist/core/signals/debt.js.map +1 -1
  69. package/dist/cost/cost-tracker.d.ts.map +1 -1
  70. package/dist/cost/cost-tracker.js +2 -0
  71. package/dist/cost/cost-tracker.js.map +1 -1
  72. package/dist/gc/index.d.ts +17 -0
  73. package/dist/gc/index.d.ts.map +1 -0
  74. package/dist/gc/index.js +17 -0
  75. package/dist/gc/index.js.map +1 -0
  76. package/dist/gc/runner.d.ts +39 -0
  77. package/dist/gc/runner.d.ts.map +1 -0
  78. package/dist/gc/runner.js +277 -0
  79. package/dist/gc/runner.js.map +1 -0
  80. package/dist/gc/trace-compactor.d.ts +31 -0
  81. package/dist/gc/trace-compactor.d.ts.map +1 -0
  82. package/dist/gc/trace-compactor.js +162 -0
  83. package/dist/gc/trace-compactor.js.map +1 -0
  84. package/dist/index.d.ts +5 -1
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +6 -1
  87. package/dist/index.js.map +1 -1
  88. package/dist/prompts/index.d.ts +2 -1
  89. package/dist/prompts/index.d.ts.map +1 -1
  90. package/dist/prompts/index.js.map +1 -1
  91. package/dist/quarantine/explorer.d.ts +65 -0
  92. package/dist/quarantine/explorer.d.ts.map +1 -0
  93. package/dist/quarantine/explorer.js +175 -0
  94. package/dist/quarantine/explorer.js.map +1 -0
  95. package/dist/quarantine/index.d.ts +7 -0
  96. package/dist/quarantine/index.d.ts.map +1 -0
  97. package/dist/quarantine/index.js +7 -0
  98. package/dist/quarantine/index.js.map +1 -0
  99. package/dist/quarantine/manager.d.ts +75 -0
  100. package/dist/quarantine/manager.d.ts.map +1 -0
  101. package/dist/quarantine/manager.js +275 -0
  102. package/dist/quarantine/manager.js.map +1 -0
  103. package/dist/task/acceptance.d.ts +29 -0
  104. package/dist/task/acceptance.d.ts.map +1 -0
  105. package/dist/task/acceptance.js +228 -0
  106. package/dist/task/acceptance.js.map +1 -0
  107. package/dist/task/executor.d.ts +30 -0
  108. package/dist/task/executor.d.ts.map +1 -0
  109. package/dist/task/executor.js +429 -0
  110. package/dist/task/executor.js.map +1 -0
  111. package/dist/task/index.d.ts +12 -0
  112. package/dist/task/index.d.ts.map +1 -0
  113. package/dist/task/index.js +12 -0
  114. package/dist/task/index.js.map +1 -0
  115. package/dist/task/planner.d.ts +21 -0
  116. package/dist/task/planner.d.ts.map +1 -0
  117. package/dist/task/planner.js +253 -0
  118. package/dist/task/planner.js.map +1 -0
  119. package/dist/task/storage.d.ts +46 -0
  120. package/dist/task/storage.d.ts.map +1 -0
  121. package/dist/task/storage.js +266 -0
  122. package/dist/task/storage.js.map +1 -0
  123. package/dist/trace/trace-event.d.ts +2 -18
  124. package/dist/trace/trace-event.d.ts.map +1 -1
  125. package/dist/trace/trace-event.js +6 -6
  126. package/dist/trace/trace-event.js.map +1 -1
  127. package/dist/utils/file-utils.d.ts.map +1 -1
  128. package/dist/utils/file-utils.js +54 -15
  129. package/dist/utils/file-utils.js.map +1 -1
  130. package/docs/PHASE5_IMPLEMENTATION.md +237 -0
  131. package/docs/PHASES-3-7-COMPLETE.md +177 -0
  132. package/docs/PHASE_4_COMPLETE.md +135 -0
  133. package/docs/PHASE_7_DELIVERABLES.md +295 -0
  134. package/docs/PHASE_7_IMPLEMENTATION.md +306 -0
  135. package/docs/PHASE_7_SUMMARY.txt +195 -0
  136. package/docs/RELEASE-NOTES-v2.1.md +213 -0
  137. package/docs/ROADMAP.md +64 -57
  138. package/docs/SECURITY-AUDIT.md +387 -0
  139. package/docs/SNAPSHOT.md +59 -32
  140. package/docs/implementation/phase3-summary.md +220 -0
  141. package/package.json +19 -11
  142. package/src/agent/worker.ts +111 -0
  143. package/src/bin.ts +13 -0
  144. package/src/cli/cost.ts +210 -0
  145. package/src/cli/gc.ts +138 -0
  146. package/src/cli/gradients.ts +95 -0
  147. package/src/cli/index.ts +79 -0
  148. package/src/cli/init.ts +139 -0
  149. package/src/cli/status.ts +218 -0
  150. package/src/coordination/file-locks.ts +300 -0
  151. package/src/coordination/index.ts +4 -0
  152. package/src/coordination/inhibitors.ts +345 -0
  153. package/src/coordination/process-manager.ts +199 -0
  154. package/src/core/agent-executor.ts +20 -4
  155. package/src/core/signals/churn.ts +8 -5
  156. package/src/core/signals/debt.ts +4 -3
  157. package/src/cost/cost-tracker.ts +2 -0
  158. package/src/gc/index.ts +17 -0
  159. package/src/gc/runner.ts +314 -0
  160. package/src/gc/trace-compactor.ts +187 -0
  161. package/src/index.ts +7 -1
  162. package/src/prompts/index.ts +2 -1
  163. package/src/quarantine/explorer.ts +234 -0
  164. package/src/quarantine/index.ts +7 -0
  165. package/src/quarantine/manager.ts +336 -0
  166. package/src/task/acceptance.ts +267 -0
  167. package/src/task/executor.ts +538 -0
  168. package/src/task/index.ts +38 -0
  169. package/src/task/planner.ts +294 -0
  170. package/src/task/storage.ts +332 -0
  171. package/src/trace/trace-event.ts +7 -26
  172. package/src/utils/file-utils.ts +61 -15
  173. package/tests/cli/gc.test.ts +206 -0
  174. package/tests/cli/init.test.ts +181 -0
  175. package/tests/cli/status.test.ts +282 -0
  176. package/tests/coordination/file-locks.test.ts +196 -0
  177. package/tests/coordination/inhibitors.test.ts +459 -0
  178. package/tests/coordination/integration.test.ts +195 -0
  179. package/tests/coordination/process-manager.test.ts +165 -0
  180. package/tests/gc/trace-compactor.test.ts +245 -0
  181. package/tests/integration/phase-7.test.ts +145 -0
  182. package/tests/quarantine/explorer.test.ts +381 -0
  183. package/tests/quarantine/manager.test.ts +399 -0
  184. package/tests/security/command-injection.test.ts +88 -0
  185. package/tests/security/path-traversal.test.ts +103 -0
  186. package/tests/task/acceptance.test.ts +411 -0
  187. package/tests/task/executor.test.ts +421 -0
  188. package/tests/task/planner.test.ts +359 -0
  189. package/tsconfig.json +2 -2
@@ -0,0 +1,275 @@
1
+ /**
2
+ * Quarantine Manager for Claude-Mycelium
3
+ * Full withdrawal mechanism when files resist all approaches
4
+ * Storage: .agent-meta/_quarantine.json
5
+ * Reference: initial-spec §6, second-spec §9
6
+ */
7
+ import * as path from 'path';
8
+ import { readJsonFile, writeJsonFile, fileExists } from '../utils/file-utils.js';
9
+ import { logInfo, logWarn, logError } from '../utils/logger.js';
10
+ // Compute file path at runtime to respect TEST_META_DIR
11
+ function getQuarantineFile() {
12
+ const META_DIR = process.env.TEST_META_DIR || '.agent-meta';
13
+ return path.join(META_DIR, '_quarantine.json');
14
+ }
15
+ const DEFAULT_CONFIG = {
16
+ minSamplesBeforeQuarantine: 10, // Spec requirement
17
+ efficiencyThreshold: 0.02, // All samples must be below this
18
+ maxExplorerAttempts: 3, // Spec requirement
19
+ };
20
+ /**
21
+ * Check if a file should be quarantined
22
+ * Trigger: 10+ samples, all with efficiency < 0.02
23
+ */
24
+ export async function shouldQuarantine(file, getTracesForFile, config = DEFAULT_CONFIG) {
25
+ try {
26
+ const traces = await getTracesForFile(file);
27
+ // Need minimum samples
28
+ if (traces.length < config.minSamplesBeforeQuarantine) {
29
+ return false;
30
+ }
31
+ // Take last 10 samples
32
+ const recent = traces.slice(-config.minSamplesBeforeQuarantine);
33
+ // All must have poor efficiency
34
+ const allPoor = recent.every(t => {
35
+ const efficiency = t.efficiency || 0;
36
+ return efficiency < config.efficiencyThreshold;
37
+ });
38
+ return allPoor;
39
+ }
40
+ catch (error) {
41
+ logError('Failed to check quarantine condition', error, { file });
42
+ return false;
43
+ }
44
+ }
45
+ /**
46
+ * Add a file to quarantine
47
+ */
48
+ export async function addToQuarantine(entry) {
49
+ try {
50
+ const state = await readQuarantineState();
51
+ // Check if already quarantined
52
+ const existing = state.entries.find(e => e.file === entry.file);
53
+ if (existing) {
54
+ logWarn('File already quarantined', { file: entry.file });
55
+ return;
56
+ }
57
+ // Add entry
58
+ state.entries.push(entry);
59
+ state.updated_at = new Date().toISOString();
60
+ await writeQuarantineState(state);
61
+ logWarn('File quarantined', {
62
+ file: entry.file,
63
+ reason: entry.reason,
64
+ attempts: entry.attempts_before_quarantine,
65
+ });
66
+ }
67
+ catch (error) {
68
+ logError('Failed to add to quarantine', error, { entry });
69
+ throw error;
70
+ }
71
+ }
72
+ /**
73
+ * Check if a file is quarantined
74
+ */
75
+ export async function isQuarantined(file) {
76
+ try {
77
+ const state = await readQuarantineState();
78
+ return state.entries.some(e => e.file === file);
79
+ }
80
+ catch (error) {
81
+ logError('Failed to check quarantine status', error, { file });
82
+ return false;
83
+ }
84
+ }
85
+ /**
86
+ * Get quarantine entry for a file
87
+ */
88
+ export async function getQuarantineEntry(file) {
89
+ try {
90
+ const state = await readQuarantineState();
91
+ return state.entries.find(e => e.file === file) ?? null;
92
+ }
93
+ catch (error) {
94
+ logError('Failed to get quarantine entry', error, { file });
95
+ return null;
96
+ }
97
+ }
98
+ /**
99
+ * Check if explorer can attempt quarantined file
100
+ */
101
+ export async function canExplorerAttempt(file) {
102
+ try {
103
+ const entry = await getQuarantineEntry(file);
104
+ if (!entry)
105
+ return true; // Not quarantined
106
+ return entry.explorer_attempts < entry.max_explorer_attempts;
107
+ }
108
+ catch (error) {
109
+ logError('Failed to check explorer attempts', error, { file });
110
+ return false;
111
+ }
112
+ }
113
+ /**
114
+ * Record an explorer attempt on quarantined file
115
+ */
116
+ export async function recordExplorerAttempt(file) {
117
+ try {
118
+ const state = await readQuarantineState();
119
+ const entry = state.entries.find(e => e.file === file);
120
+ if (entry) {
121
+ entry.explorer_attempts++;
122
+ state.updated_at = new Date().toISOString();
123
+ await writeQuarantineState(state);
124
+ logInfo('Explorer attempt recorded', {
125
+ file,
126
+ attempts: entry.explorer_attempts,
127
+ remaining: entry.max_explorer_attempts - entry.explorer_attempts,
128
+ });
129
+ }
130
+ }
131
+ catch (error) {
132
+ logError('Failed to record explorer attempt', error, { file });
133
+ }
134
+ }
135
+ /**
136
+ * Check if quarantine should be released after explorer success
137
+ * Only explorer mode with efficiency >= 0.2 can release
138
+ */
139
+ export async function checkQuarantineRelease(file, trace) {
140
+ try {
141
+ if (!(await isQuarantined(file)))
142
+ return false;
143
+ // Only explorer can release
144
+ if (trace.mode !== 'explorer')
145
+ return false;
146
+ // Must have good efficiency
147
+ const efficiency = trace.efficiency || 0;
148
+ if (efficiency < 0.2)
149
+ return false;
150
+ await removeFromQuarantine(file);
151
+ logInfo('Quarantine released', {
152
+ file,
153
+ explorer_efficiency: efficiency.toFixed(3),
154
+ });
155
+ return true;
156
+ }
157
+ catch (error) {
158
+ logError('Failed to check quarantine release', error, { file });
159
+ return false;
160
+ }
161
+ }
162
+ /**
163
+ * Remove a file from quarantine
164
+ */
165
+ export async function removeFromQuarantine(file) {
166
+ try {
167
+ const state = await readQuarantineState();
168
+ const before = state.entries.length;
169
+ state.entries = state.entries.filter(e => e.file !== file);
170
+ state.updated_at = new Date().toISOString();
171
+ await writeQuarantineState(state);
172
+ if (state.entries.length < before) {
173
+ logInfo('File removed from quarantine', { file });
174
+ }
175
+ }
176
+ catch (error) {
177
+ logError('Failed to remove from quarantine', error, { file });
178
+ throw error;
179
+ }
180
+ }
181
+ /**
182
+ * Get all quarantined files
183
+ */
184
+ export async function getQuarantinedFiles() {
185
+ try {
186
+ const state = await readQuarantineState();
187
+ return state.entries;
188
+ }
189
+ catch (error) {
190
+ logError('Failed to get quarantined files', error);
191
+ return [];
192
+ }
193
+ }
194
+ /**
195
+ * Check and potentially quarantine a file after agent run
196
+ */
197
+ export async function checkAndQuarantine(file, getTracesForFile, config) {
198
+ try {
199
+ // Already quarantined?
200
+ if (await isQuarantined(file)) {
201
+ return true;
202
+ }
203
+ // Should quarantine now?
204
+ if (await shouldQuarantine(file, getTracesForFile, config)) {
205
+ const traces = await getTracesForFile(file);
206
+ const recentEfficiency = traces.slice(-5).map(t => t.efficiency || 0);
207
+ const avgEfficiency = recentEfficiency.reduce((a, b) => a + b, 0) / recentEfficiency.length;
208
+ await addToQuarantine({
209
+ file,
210
+ quarantined_at: new Date().toISOString(),
211
+ reason: `No progress after ${traces.length} attempts. Avg efficiency: ${avgEfficiency.toFixed(3)}`,
212
+ attempts_before_quarantine: traces.length,
213
+ explorer_attempts: 0,
214
+ max_explorer_attempts: config?.maxExplorerAttempts ?? DEFAULT_CONFIG.maxExplorerAttempts,
215
+ });
216
+ return true;
217
+ }
218
+ return false;
219
+ }
220
+ catch (error) {
221
+ logError('Failed to check and quarantine', error, { file });
222
+ return false;
223
+ }
224
+ }
225
+ /**
226
+ * Read quarantine state from file
227
+ */
228
+ async function readQuarantineState() {
229
+ try {
230
+ if (!fileExists(getQuarantineFile())) {
231
+ return {
232
+ updated_at: new Date().toISOString(),
233
+ entries: [],
234
+ };
235
+ }
236
+ return readJsonFile(getQuarantineFile());
237
+ }
238
+ catch (error) {
239
+ logError('Failed to read quarantine state', error);
240
+ return {
241
+ updated_at: new Date().toISOString(),
242
+ entries: [],
243
+ };
244
+ }
245
+ }
246
+ /**
247
+ * Write quarantine state to file
248
+ */
249
+ async function writeQuarantineState(state) {
250
+ try {
251
+ writeJsonFile(getQuarantineFile(), state, 2);
252
+ }
253
+ catch (error) {
254
+ logError('Failed to write quarantine state', error);
255
+ throw error;
256
+ }
257
+ }
258
+ /**
259
+ * Get quarantine statistics
260
+ */
261
+ export async function getQuarantineStats() {
262
+ try {
263
+ const state = await readQuarantineState();
264
+ return {
265
+ total: state.entries.length,
266
+ withExplorerAttempts: state.entries.filter(e => e.explorer_attempts > 0).length,
267
+ exhausted: state.entries.filter(e => e.explorer_attempts >= e.max_explorer_attempts).length,
268
+ };
269
+ }
270
+ catch (error) {
271
+ logError('Failed to get quarantine stats', error);
272
+ return { total: 0, withExplorerAttempts: 0, exhausted: 0 };
273
+ }
274
+ }
275
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/quarantine/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Acceptance Criteria Validation
3
+ * Per ROADMAP §Phase 5 Week 6 Day 5-6: Acceptance Criteria
4
+ *
5
+ * Validates task completion against acceptance criteria including
6
+ * file existence, test execution, lint checks, and custom validation.
7
+ */
8
+ import { Task, AcceptanceCriterion } from '../types/index.js';
9
+ /**
10
+ * Validate all acceptance criteria for a task
11
+ */
12
+ export declare function validateAcceptance(task: Task): Promise<boolean>;
13
+ /**
14
+ * Check if a file exists
15
+ */
16
+ export declare function checkFileExists(filePath: string): Promise<boolean>;
17
+ /**
18
+ * Run specific tests and check if they pass
19
+ */
20
+ export declare function runTests(testPattern: string): Promise<boolean>;
21
+ /**
22
+ * Generate default acceptance criteria for a task
23
+ */
24
+ export declare function generateDefaultCriteria(task: Task): AcceptanceCriterion[];
25
+ /**
26
+ * Check if task can be marked as completed
27
+ */
28
+ export declare function canCompleteTask(task: Task): boolean;
29
+ //# sourceMappingURL=acceptance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acceptance.d.ts","sourceRoot":"","sources":["../../src/task/acceptance.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAQ9D;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BrE;AAoCD;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAIxE;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4BpE;AA2ED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,mBAAmB,EAAE,CA8CzE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAanD"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Acceptance Criteria Validation
3
+ * Per ROADMAP §Phase 5 Week 6 Day 5-6: Acceptance Criteria
4
+ *
5
+ * Validates task completion against acceptance criteria including
6
+ * file existence, test execution, lint checks, and custom validation.
7
+ */
8
+ import { fileExists } from '../utils/file-utils.js';
9
+ import { logDebug, logError } from '../utils/logger.js';
10
+ import { exec } from 'child_process';
11
+ import { promisify } from 'util';
12
+ const execAsync = promisify(exec);
13
+ /**
14
+ * Validate all acceptance criteria for a task
15
+ */
16
+ export async function validateAcceptance(task) {
17
+ logDebug('Validating acceptance criteria', {
18
+ taskId: task.id,
19
+ criteriaCount: task.acceptance_criteria.length,
20
+ });
21
+ let allMet = true;
22
+ for (const criterion of task.acceptance_criteria) {
23
+ const met = await validateCriterion(criterion);
24
+ criterion.met = met;
25
+ if (!met) {
26
+ allMet = false;
27
+ logDebug('Acceptance criterion not met', {
28
+ taskId: task.id,
29
+ type: criterion.type,
30
+ description: criterion.description,
31
+ });
32
+ }
33
+ }
34
+ logDebug('Acceptance validation complete', {
35
+ taskId: task.id,
36
+ allMet,
37
+ metCount: task.acceptance_criteria.filter(c => c.met).length,
38
+ });
39
+ return allMet;
40
+ }
41
+ /**
42
+ * Validate a single acceptance criterion
43
+ */
44
+ async function validateCriterion(criterion) {
45
+ try {
46
+ switch (criterion.type) {
47
+ case 'file_exists':
48
+ return await checkFileExists(criterion.check);
49
+ case 'test_passes':
50
+ return await runTests(criterion.check);
51
+ case 'no_lint_errors':
52
+ return await checkLintErrors(criterion.check);
53
+ case 'custom':
54
+ return await runCustomValidation(criterion.check);
55
+ default:
56
+ logError('Unknown criterion type', new Error('Invalid type'), {
57
+ type: criterion.type,
58
+ });
59
+ return false;
60
+ }
61
+ }
62
+ catch (error) {
63
+ const errorObj = error instanceof Error ? error : new Error(String(error));
64
+ logError('Criterion validation failed', errorObj, {
65
+ type: criterion.type,
66
+ check: criterion.check,
67
+ });
68
+ return false;
69
+ }
70
+ }
71
+ /**
72
+ * Check if a file exists
73
+ */
74
+ export async function checkFileExists(filePath) {
75
+ const exists = fileExists(filePath);
76
+ logDebug('File existence check', { filePath, exists });
77
+ return exists;
78
+ }
79
+ /**
80
+ * Run specific tests and check if they pass
81
+ */
82
+ export async function runTests(testPattern) {
83
+ logDebug('Running tests', { pattern: testPattern });
84
+ try {
85
+ // Run vitest with specific pattern
86
+ const command = `npm test -- --run ${testPattern}`;
87
+ const { stdout, stderr } = await execAsync(command, {
88
+ timeout: 60000, // 60 second timeout
89
+ });
90
+ // Check for test failures in output
91
+ const output = stdout + stderr;
92
+ const hasFailed = output.includes('FAILED') ||
93
+ output.includes('failed') ||
94
+ output.includes('Error:');
95
+ logDebug('Test execution result', {
96
+ pattern: testPattern,
97
+ passed: !hasFailed,
98
+ });
99
+ return !hasFailed;
100
+ }
101
+ catch (error) {
102
+ // exec throws on non-zero exit code
103
+ const errorObj = error instanceof Error ? error : new Error(String(error));
104
+ logError('Test execution failed', errorObj, { pattern: testPattern });
105
+ return false;
106
+ }
107
+ }
108
+ /**
109
+ * Check if file has lint errors
110
+ */
111
+ async function checkLintErrors(filePath) {
112
+ logDebug('Checking lint errors', { filePath });
113
+ try {
114
+ // Run eslint on specific file
115
+ const command = `npx eslint ${filePath} --format json`;
116
+ const { stdout } = await execAsync(command, {
117
+ timeout: 30000, // 30 second timeout
118
+ });
119
+ // Parse eslint JSON output
120
+ const results = JSON.parse(stdout);
121
+ // Check if there are any errors
122
+ const totalErrors = results.reduce((sum, result) => sum + result.errorCount, 0);
123
+ const noErrors = totalErrors === 0;
124
+ logDebug('Lint check result', {
125
+ filePath,
126
+ errors: totalErrors,
127
+ passed: noErrors,
128
+ });
129
+ return noErrors;
130
+ }
131
+ catch (error) {
132
+ // eslint returns non-zero exit code when errors found
133
+ // Try to parse the output to get error count
134
+ if (error instanceof Error && 'stdout' in error) {
135
+ try {
136
+ const results = JSON.parse(error.stdout);
137
+ const totalErrors = results.reduce((sum, result) => sum + result.errorCount, 0);
138
+ return totalErrors === 0;
139
+ }
140
+ catch {
141
+ // Failed to parse, assume errors
142
+ return false;
143
+ }
144
+ }
145
+ const errorObj = error instanceof Error ? error : new Error(String(error));
146
+ logError('Lint check failed', errorObj, { filePath });
147
+ return false;
148
+ }
149
+ }
150
+ /**
151
+ * Run custom validation command
152
+ */
153
+ async function runCustomValidation(command) {
154
+ logDebug('Running custom validation', { command });
155
+ try {
156
+ await execAsync(command, {
157
+ timeout: 60000, // 60 second timeout
158
+ });
159
+ logDebug('Custom validation passed', { command });
160
+ return true;
161
+ }
162
+ catch (error) {
163
+ const errorObj = error instanceof Error ? error : new Error(String(error));
164
+ logError('Custom validation failed', errorObj, { command });
165
+ return false;
166
+ }
167
+ }
168
+ /**
169
+ * Generate default acceptance criteria for a task
170
+ */
171
+ export function generateDefaultCriteria(task) {
172
+ const criteria = [];
173
+ // If task plan exists, generate criteria based on files
174
+ if (task.plan) {
175
+ // Check that all created files exist
176
+ const createSteps = task.plan.steps.filter(s => s.mode === 'create');
177
+ for (const step of createSteps) {
178
+ criteria.push({
179
+ description: `File ${step.target_file} exists`,
180
+ type: 'file_exists',
181
+ check: step.target_file,
182
+ met: false,
183
+ });
184
+ // If it's a test file, add a test_passes criterion
185
+ if (step.target_file.includes('.test.')) {
186
+ criteria.push({
187
+ description: `Tests in ${step.target_file} pass`,
188
+ type: 'test_passes',
189
+ check: step.target_file,
190
+ met: false,
191
+ });
192
+ }
193
+ }
194
+ // Add lint check for all touched files
195
+ const allFiles = new Set([
196
+ ...createSteps.map(s => s.target_file),
197
+ ...task.plan.steps.filter(s => s.mode !== 'create').map(s => s.target_file),
198
+ ]);
199
+ for (const file of allFiles) {
200
+ // Only check non-test files for lint
201
+ if (!file.includes('.test.')) {
202
+ criteria.push({
203
+ description: `No lint errors in ${file}`,
204
+ type: 'no_lint_errors',
205
+ check: file,
206
+ met: false,
207
+ });
208
+ }
209
+ }
210
+ }
211
+ return criteria;
212
+ }
213
+ /**
214
+ * Check if task can be marked as completed
215
+ */
216
+ export function canCompleteTask(task) {
217
+ // All steps must be completed
218
+ if (task.steps_completed < task.steps_total) {
219
+ return false;
220
+ }
221
+ // All acceptance criteria must be met
222
+ if (task.acceptance_criteria.length > 0) {
223
+ return task.acceptance_criteria.every(c => c.met);
224
+ }
225
+ // If no criteria defined, task is complete when all steps done
226
+ return true;
227
+ }
228
+ //# sourceMappingURL=acceptance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acceptance.js","sourceRoot":"","sources":["../../src/task/acceptance.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAU;IACjD,QAAQ,CAAC,gCAAgC,EAAE;QACzC,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,aAAa,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM;KAC/C,CAAC,CAAC;IAEH,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACjD,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC/C,SAAS,CAAC,GAAG,GAAG,GAAG,CAAC;QAEpB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,GAAG,KAAK,CAAC;YACf,QAAQ,CAAC,8BAA8B,EAAE;gBACvC,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,WAAW,EAAE,SAAS,CAAC,WAAW;aACnC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,gCAAgC,EAAE;QACzC,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,MAAM;QACN,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM;KAC7D,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,SAA8B;IAC7D,IAAI,CAAC;QACH,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;YACvB,KAAK,aAAa;gBAChB,OAAO,MAAM,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAEhD,KAAK,aAAa;gBAChB,OAAO,MAAM,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAEzC,KAAK,gBAAgB;gBACnB,OAAO,MAAM,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAEhD,KAAK,QAAQ;gBACX,OAAO,MAAM,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAEpD;gBACE,QAAQ,CAAC,wBAAwB,EAAE,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE;oBAC5D,IAAI,EAAE,SAAS,CAAC,IAAI;iBACrB,CAAC,CAAC;gBACH,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3E,QAAQ,CAAC,6BAA6B,EAAE,QAAQ,EAAE;YAChD,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,KAAK,EAAE,SAAS,CAAC,KAAK;SACvB,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB;IACpD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpC,QAAQ,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACvD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,WAAmB;IAChD,QAAQ,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,mCAAmC;QACnC,MAAM,OAAO,GAAG,qBAAqB,WAAW,EAAE,CAAC;QACnD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE;YAClD,OAAO,EAAE,KAAK,EAAE,oBAAoB;SACrC,CAAC,CAAC;QAEH,oCAAoC;QACpC,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;QAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC1B,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACzB,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE3C,QAAQ,CAAC,uBAAuB,EAAE;YAChC,OAAO,EAAE,WAAW;YACpB,MAAM,EAAE,CAAC,SAAS;SACnB,CAAC,CAAC;QAEH,OAAO,CAAC,SAAS,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,oCAAoC;QACpC,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3E,QAAQ,CAAC,uBAAuB,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QACtE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAAC,QAAgB;IAC7C,QAAQ,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE/C,IAAI,CAAC;QACH,8BAA8B;QAC9B,MAAM,OAAO,GAAG,cAAc,QAAQ,gBAAgB,CAAC;QACvD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE;YAC1C,OAAO,EAAE,KAAK,EAAE,oBAAoB;SACrC,CAAC,CAAC;QAEH,2BAA2B;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEnC,gCAAgC;QAChC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAChC,CAAC,GAAW,EAAE,MAAW,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,EACrD,CAAC,CACF,CAAC;QAEF,MAAM,QAAQ,GAAG,WAAW,KAAK,CAAC,CAAC;QACnC,QAAQ,CAAC,mBAAmB,EAAE;YAC5B,QAAQ;YACR,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sDAAsD;QACtD,6CAA6C;QAC7C,IAAI,KAAK,YAAY,KAAK,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;YAChD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAE,KAAa,CAAC,MAAM,CAAC,CAAC;gBAClD,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAChC,CAAC,GAAW,EAAE,MAAW,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,EACrD,CAAC,CACF,CAAC;gBACF,OAAO,WAAW,KAAK,CAAC,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,iCAAiC;gBACjC,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3E,QAAQ,CAAC,mBAAmB,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAAC,OAAe;IAChD,QAAQ,CAAC,2BAA2B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,OAAO,EAAE;YACvB,OAAO,EAAE,KAAK,EAAE,oBAAoB;SACrC,CAAC,CAAC;QAEH,QAAQ,CAAC,0BAA0B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3E,QAAQ,CAAC,0BAA0B,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5D,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAU;IAChD,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAE3C,wDAAwD;IACxD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,qCAAqC;QACrC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACrE,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC;gBACZ,WAAW,EAAE,QAAQ,IAAI,CAAC,WAAW,SAAS;gBAC9C,IAAI,EAAE,aAAa;gBACnB,KAAK,EAAE,IAAI,CAAC,WAAW;gBACvB,GAAG,EAAE,KAAK;aACX,CAAC,CAAC;YAEH,mDAAmD;YACnD,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxC,QAAQ,CAAC,IAAI,CAAC;oBACZ,WAAW,EAAE,YAAY,IAAI,CAAC,WAAW,OAAO;oBAChD,IAAI,EAAE,aAAa;oBACnB,KAAK,EAAE,IAAI,CAAC,WAAW;oBACvB,GAAG,EAAE,KAAK;iBACX,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,uCAAuC;QACvC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;YACvB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;YACtC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;SAC5E,CAAC,CAAC;QAEH,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,qCAAqC;YACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,QAAQ,CAAC,IAAI,CAAC;oBACZ,WAAW,EAAE,qBAAqB,IAAI,EAAE;oBACxC,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,IAAI;oBACX,GAAG,EAAE,KAAK;iBACX,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAU;IACxC,8BAA8B;IAC9B,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sCAAsC;IACtC,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,+DAA+D;IAC/D,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Task Execution Implementation
3
+ * Per second-spec §12.2: Task Step Execution
4
+ *
5
+ * Executes task steps in dependency order, tracking progress
6
+ * and handling create mode appropriately.
7
+ */
8
+ import { Task, TaskStep } from '../types/index.js';
9
+ /**
10
+ * Execute a complete task by running all steps in dependency order
11
+ */
12
+ export declare function executeTask(task: Task): Promise<Task>;
13
+ /**
14
+ * Execute a single task step
15
+ */
16
+ export declare function executeStep(task: Task, step: TaskStep): Promise<{
17
+ success: boolean;
18
+ trace_id?: string;
19
+ error?: string;
20
+ }>;
21
+ /**
22
+ * Track progress of task execution
23
+ */
24
+ export declare function trackProgress(task: Task): {
25
+ percentage: number;
26
+ completed: number;
27
+ total: number;
28
+ status: string;
29
+ };
30
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/task/executor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAA+B,MAAM,mBAAmB,CAAC;AAQhF;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAqD3D;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBlE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAWA"}