claude-mycelium 2.0.0 → 2.2.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.
- package/.agent-meta/_inhibitors.ndjson +1287 -0
- package/.agent-meta/_quarantine.json +45 -0
- package/.agent-meta/config.json +9 -0
- package/.agent-meta/tasks/_active.json +4 -0
- package/.agent-meta/tasks/task_0657b028-05a0-4b0c-b0b9-a4eae3d66cd9.json +168 -0
- package/.claude/memory.db +0 -0
- package/.claude/settings.local.json +4 -1
- package/README.md +85 -233
- package/SECURITY.md +145 -0
- package/dist/agent/task-worker.d.ts +11 -0
- package/dist/agent/task-worker.d.ts.map +1 -0
- package/dist/agent/task-worker.js +173 -0
- package/dist/agent/task-worker.js.map +1 -0
- package/dist/agent/worker.d.ts +8 -0
- package/dist/agent/worker.d.ts.map +1 -0
- package/dist/agent/worker.js +97 -0
- package/dist/agent/worker.js.map +1 -0
- package/dist/bin.d.ts +7 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +11 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/cost.d.ts +10 -0
- package/dist/cli/cost.d.ts.map +1 -0
- package/dist/cli/cost.js +163 -0
- package/dist/cli/cost.js.map +1 -0
- package/dist/cli/gc.d.ts +10 -0
- package/dist/cli/gc.d.ts.map +1 -0
- package/dist/cli/gc.js +108 -0
- package/dist/cli/gc.js.map +1 -0
- package/dist/cli/gradients.d.ts +10 -0
- package/dist/cli/gradients.d.ts.map +1 -0
- package/dist/cli/gradients.js +70 -0
- package/dist/cli/gradients.js.map +1 -0
- package/dist/cli/grow.d.ts +17 -0
- package/dist/cli/grow.d.ts.map +1 -0
- package/dist/cli/grow.js +373 -0
- package/dist/cli/grow.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +74 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +11 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +97 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/status.d.ts +10 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +191 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/coordination/file-locks.d.ts +42 -0
- package/dist/coordination/file-locks.d.ts.map +1 -0
- package/dist/coordination/file-locks.js +269 -0
- package/dist/coordination/file-locks.js.map +1 -0
- package/dist/coordination/index.d.ts +4 -0
- package/dist/coordination/index.d.ts.map +1 -1
- package/dist/coordination/index.js +4 -0
- package/dist/coordination/index.js.map +1 -1
- package/dist/coordination/inhibitors.d.ts +84 -0
- package/dist/coordination/inhibitors.d.ts.map +1 -0
- package/dist/coordination/inhibitors.js +290 -0
- package/dist/coordination/inhibitors.js.map +1 -0
- package/dist/coordination/process-manager.d.ts +73 -0
- package/dist/coordination/process-manager.d.ts.map +1 -0
- package/dist/coordination/process-manager.js +144 -0
- package/dist/coordination/process-manager.js.map +1 -0
- package/dist/core/agent-executor.d.ts +4 -1
- package/dist/core/agent-executor.d.ts.map +1 -1
- package/dist/core/agent-executor.js +38 -12
- package/dist/core/agent-executor.js.map +1 -1
- package/dist/core/change-applier.d.ts +29 -5
- package/dist/core/change-applier.d.ts.map +1 -1
- package/dist/core/change-applier.js +254 -24
- package/dist/core/change-applier.js.map +1 -1
- package/dist/core/signals/churn.d.ts.map +1 -1
- package/dist/core/signals/churn.js +6 -4
- package/dist/core/signals/churn.js.map +1 -1
- package/dist/core/signals/debt.d.ts.map +1 -1
- package/dist/core/signals/debt.js +4 -3
- package/dist/core/signals/debt.js.map +1 -1
- package/dist/cost/cost-tracker.d.ts.map +1 -1
- package/dist/cost/cost-tracker.js +2 -0
- package/dist/cost/cost-tracker.js.map +1 -1
- package/dist/gc/index.d.ts +17 -0
- package/dist/gc/index.d.ts.map +1 -0
- package/dist/gc/index.js +17 -0
- package/dist/gc/index.js.map +1 -0
- package/dist/gc/runner.d.ts +39 -0
- package/dist/gc/runner.d.ts.map +1 -0
- package/dist/gc/runner.js +277 -0
- package/dist/gc/runner.js.map +1 -0
- package/dist/gc/trace-compactor.d.ts +31 -0
- package/dist/gc/trace-compactor.d.ts.map +1 -0
- package/dist/gc/trace-compactor.js +162 -0
- package/dist/gc/trace-compactor.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/prompts/index.d.ts +2 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js.map +1 -1
- package/dist/quarantine/explorer.d.ts +65 -0
- package/dist/quarantine/explorer.d.ts.map +1 -0
- package/dist/quarantine/explorer.js +175 -0
- package/dist/quarantine/explorer.js.map +1 -0
- package/dist/quarantine/index.d.ts +7 -0
- package/dist/quarantine/index.d.ts.map +1 -0
- package/dist/quarantine/index.js +7 -0
- package/dist/quarantine/index.js.map +1 -0
- package/dist/quarantine/manager.d.ts +75 -0
- package/dist/quarantine/manager.d.ts.map +1 -0
- package/dist/quarantine/manager.js +275 -0
- package/dist/quarantine/manager.js.map +1 -0
- package/dist/task/acceptance.d.ts +29 -0
- package/dist/task/acceptance.d.ts.map +1 -0
- package/dist/task/acceptance.js +228 -0
- package/dist/task/acceptance.js.map +1 -0
- package/dist/task/agent-coordinator.d.ts +40 -0
- package/dist/task/agent-coordinator.d.ts.map +1 -0
- package/dist/task/agent-coordinator.js +168 -0
- package/dist/task/agent-coordinator.js.map +1 -0
- package/dist/task/executor.d.ts +37 -0
- package/dist/task/executor.d.ts.map +1 -0
- package/dist/task/executor.js +462 -0
- package/dist/task/executor.js.map +1 -0
- package/dist/task/index.d.ts +12 -0
- package/dist/task/index.d.ts.map +1 -0
- package/dist/task/index.js +12 -0
- package/dist/task/index.js.map +1 -0
- package/dist/task/planner.d.ts +21 -0
- package/dist/task/planner.d.ts.map +1 -0
- package/dist/task/planner.js +253 -0
- package/dist/task/planner.js.map +1 -0
- package/dist/task/storage.d.ts +46 -0
- package/dist/task/storage.d.ts.map +1 -0
- package/dist/task/storage.js +266 -0
- package/dist/task/storage.js.map +1 -0
- package/dist/trace/trace-event.d.ts +2 -18
- package/dist/trace/trace-event.d.ts.map +1 -1
- package/dist/trace/trace-event.js +6 -6
- package/dist/trace/trace-event.js.map +1 -1
- package/dist/utils/file-utils.d.ts.map +1 -1
- package/dist/utils/file-utils.js +54 -15
- package/dist/utils/file-utils.js.map +1 -1
- package/docs/PHASE5_IMPLEMENTATION.md +237 -0
- package/docs/PHASES-3-7-COMPLETE.md +177 -0
- package/docs/PHASE_4_COMPLETE.md +135 -0
- package/docs/PHASE_7_DELIVERABLES.md +295 -0
- package/docs/PHASE_7_IMPLEMENTATION.md +306 -0
- package/docs/PHASE_7_SUMMARY.txt +195 -0
- package/docs/RELEASE-NOTES-v2.1.md +213 -0
- package/docs/ROADMAP.md +194 -107
- package/docs/SECURITY-AUDIT.md +387 -0
- package/docs/SNAPSHOT.md +59 -32
- package/docs/implementation/phase3-summary.md +220 -0
- package/package.json +27 -11
- package/src/agent/task-worker.ts +196 -0
- package/src/agent/worker.ts +111 -0
- package/src/bin.ts +13 -0
- package/src/cli/cost.ts +210 -0
- package/src/cli/gc.ts +138 -0
- package/src/cli/gradients.ts +97 -0
- package/src/cli/grow.ts +416 -0
- package/src/cli/index.ts +81 -0
- package/src/cli/init.ts +139 -0
- package/src/cli/status.ts +218 -0
- package/src/coordination/file-locks.ts +300 -0
- package/src/coordination/index.ts +4 -0
- package/src/coordination/inhibitors.ts +345 -0
- package/src/coordination/process-manager.ts +199 -0
- package/src/core/agent-executor.ts +37 -8
- package/src/core/signals/churn.ts +8 -5
- package/src/core/signals/debt.ts +4 -3
- package/src/cost/cost-tracker.ts +2 -0
- package/src/gc/index.ts +17 -0
- package/src/gc/runner.ts +314 -0
- package/src/gc/trace-compactor.ts +187 -0
- package/src/index.ts +7 -1
- package/src/prompts/index.ts +2 -1
- package/src/quarantine/explorer.ts +234 -0
- package/src/quarantine/index.ts +7 -0
- package/src/quarantine/manager.ts +336 -0
- package/src/task/acceptance.ts +267 -0
- package/src/task/agent-coordinator.ts +220 -0
- package/src/task/executor.ts +543 -0
- package/src/task/index.ts +38 -0
- package/src/task/planner.ts +294 -0
- package/src/task/storage.ts +332 -0
- package/src/trace/trace-event.ts +7 -26
- package/src/utils/file-utils.ts +61 -15
- package/tests/cli/gc.test.ts +206 -0
- package/tests/cli/init.test.ts +181 -0
- package/tests/cli/status.test.ts +282 -0
- package/tests/coordination/file-locks.test.ts +196 -0
- package/tests/coordination/inhibitors.test.ts +459 -0
- package/tests/coordination/integration.test.ts +195 -0
- package/tests/coordination/process-manager.test.ts +165 -0
- package/tests/gc/trace-compactor.test.ts +245 -0
- package/tests/integration/phase-7.test.ts +145 -0
- package/tests/quarantine/explorer.test.ts +381 -0
- package/tests/quarantine/manager.test.ts +399 -0
- package/tests/security/command-injection.test.ts +88 -0
- package/tests/security/path-traversal.test.ts +103 -0
- package/tests/task/acceptance.test.ts +411 -0
- package/tests/task/executor.test.ts +421 -0
- package/tests/task/planner.test.ts +359 -0
- package/tests/trace/trace-event.test.ts +62 -20
- 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":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Agent Coordinator
|
|
3
|
+
*
|
|
4
|
+
* Coordinates multi-agent execution of task steps using the mycelium
|
|
5
|
+
* process spawning system (Phase 3) for true RALPH-style parallelization.
|
|
6
|
+
*
|
|
7
|
+
* This replaces the simple Promise.all() approach with real agent processes
|
|
8
|
+
* that use file locks, inhibitors, and the full executeAgent() cycle.
|
|
9
|
+
*/
|
|
10
|
+
import { Task, TaskStep, Mode } from '../types/index.js';
|
|
11
|
+
export interface StepAssignment {
|
|
12
|
+
stepOrder: number;
|
|
13
|
+
targetFile: string;
|
|
14
|
+
mode: Mode;
|
|
15
|
+
description: string;
|
|
16
|
+
taskId: string;
|
|
17
|
+
}
|
|
18
|
+
export interface AgentResult {
|
|
19
|
+
stepOrder: number;
|
|
20
|
+
success: boolean;
|
|
21
|
+
traceId?: string;
|
|
22
|
+
error?: string;
|
|
23
|
+
exitCode: number | null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Spawn an agent for a specific task step
|
|
27
|
+
* Each agent runs as an independent process via child_process.fork()
|
|
28
|
+
*/
|
|
29
|
+
export declare function spawnAgentForStep(task: Task, step: TaskStep): Promise<AgentResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Execute a wave of task steps in parallel using agent processes
|
|
32
|
+
* This is the true mycelium multi-agent coordination
|
|
33
|
+
*/
|
|
34
|
+
export declare function executeWaveWithAgents(task: Task, wave: TaskStep[]): Promise<AgentResult[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Get parallelizable steps grouped by dependency waves
|
|
37
|
+
* Same logic as before, but now we spawn agents for each wave
|
|
38
|
+
*/
|
|
39
|
+
export declare function getParallelizableSteps(steps: TaskStep[]): TaskStep[][];
|
|
40
|
+
//# sourceMappingURL=agent-coordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-coordinator.d.ts","sourceRoot":"","sources":["../../src/task/agent-coordinator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAUzD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,WAAW,CAAC,CAsHtB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,QAAQ,EAAE,GACf,OAAO,CAAC,WAAW,EAAE,CAAC,CAqBxB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,EAAE,CAqBtE"}
|