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.
- package/.agent-meta/_inhibitors.ndjson +1287 -0
- package/.agent-meta/_quarantine.json +45 -0
- package/.agent-meta/config.json +9 -0
- package/.claude/memory.db +0 -0
- package/.claude/settings.local.json +4 -1
- package/README.md +81 -235
- package/SECURITY.md +145 -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 +69 -0
- package/dist/cli/gradients.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 +72 -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.map +1 -1
- package/dist/core/agent-executor.js +28 -10
- 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/executor.d.ts +30 -0
- package/dist/task/executor.d.ts.map +1 -0
- package/dist/task/executor.js +429 -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 +64 -57
- package/docs/SECURITY-AUDIT.md +387 -0
- package/docs/SNAPSHOT.md +59 -32
- package/docs/implementation/phase3-summary.md +220 -0
- package/package.json +19 -11
- 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 +95 -0
- package/src/cli/index.ts +79 -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 +20 -4
- 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/executor.ts +538 -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/tsconfig.json +2 -2
|
@@ -16,10 +16,9 @@ import { readFile, writeFile } from 'fs/promises';
|
|
|
16
16
|
import { v4 as uuid } from 'uuid';
|
|
17
17
|
import { calculateGradient } from './gradient.js';
|
|
18
18
|
import { buildPrompt } from '../prompts/index.js';
|
|
19
|
-
import {
|
|
19
|
+
import { callLLM, calculateCost } from '../llm/anthropic-client.js';
|
|
20
20
|
import { applyChanges } from './change-applier.js';
|
|
21
21
|
import { recordTrace } from '../trace/trace-event.js';
|
|
22
|
-
import { calculateCost } from '../cost/cost-tracker.js';
|
|
23
22
|
import { logInfo, logDebug, logWarn, logError } from '../utils/logger.js';
|
|
24
23
|
import { ciProvider } from '../utils/ci-provider.js';
|
|
25
24
|
const DEFAULT_OPTIONS = {
|
|
@@ -76,7 +75,21 @@ export async function executeAgent(file, mode, options) {
|
|
|
76
75
|
}
|
|
77
76
|
else {
|
|
78
77
|
// Real run - apply changes and verify
|
|
79
|
-
|
|
78
|
+
const result = await applyChanges([
|
|
79
|
+
{
|
|
80
|
+
file,
|
|
81
|
+
newContent: parsedChanges.newContent,
|
|
82
|
+
reason: `Applied ${mode} changes`,
|
|
83
|
+
},
|
|
84
|
+
]);
|
|
85
|
+
if (!result.success) {
|
|
86
|
+
throw new Error(result.error || 'Failed to apply changes');
|
|
87
|
+
}
|
|
88
|
+
changeSet = {
|
|
89
|
+
additions: countLines(parsedChanges.newContent) - countLines(originalContent),
|
|
90
|
+
deletions: 0,
|
|
91
|
+
files_touched: [file],
|
|
92
|
+
};
|
|
80
93
|
// Step 7: Run CI checks
|
|
81
94
|
logDebug('Step 7: Running CI checks');
|
|
82
95
|
const ciResult = await ciProvider.run(changeSet);
|
|
@@ -94,10 +107,10 @@ export async function executeAgent(file, mode, options) {
|
|
|
94
107
|
// Step 9: Calculate cost
|
|
95
108
|
logDebug('Step 9: Calculating cost');
|
|
96
109
|
const costRecord = {
|
|
97
|
-
tokens_in: llmResponse.
|
|
98
|
-
tokens_out: llmResponse.
|
|
110
|
+
tokens_in: llmResponse.usage.inputTokens,
|
|
111
|
+
tokens_out: llmResponse.usage.outputTokens,
|
|
99
112
|
model: llmResponse.model,
|
|
100
|
-
estimated_usd: calculateCost(llmResponse.model, llmResponse.
|
|
113
|
+
estimated_usd: calculateCost(llmResponse.model, llmResponse.usage.inputTokens, llmResponse.usage.outputTokens),
|
|
101
114
|
};
|
|
102
115
|
// Step 10: Calculate efficiency
|
|
103
116
|
const gradientDelta = gradientAfter.score - gradientBefore.score;
|
|
@@ -126,24 +139,26 @@ export async function executeAgent(file, mode, options) {
|
|
|
126
139
|
if (!opts.dryRun) {
|
|
127
140
|
await recordTrace(trace);
|
|
128
141
|
}
|
|
142
|
+
const finalCost = Number(costRecord.estimated_usd) || 0;
|
|
129
143
|
logInfo('Agent execution completed', {
|
|
130
144
|
file,
|
|
131
145
|
mode,
|
|
132
146
|
gradientDelta: gradientDelta.toFixed(3),
|
|
133
147
|
efficiency: efficiency.toFixed(3),
|
|
134
|
-
cost:
|
|
148
|
+
cost: finalCost.toFixed(4),
|
|
135
149
|
ciPassed,
|
|
136
150
|
});
|
|
137
151
|
return {
|
|
138
152
|
success: true,
|
|
139
153
|
changes: [file],
|
|
140
154
|
trace,
|
|
141
|
-
cost:
|
|
155
|
+
cost: finalCost,
|
|
142
156
|
};
|
|
143
157
|
}
|
|
144
158
|
catch (error) {
|
|
145
159
|
// Error handling - record failed trace
|
|
146
|
-
|
|
160
|
+
const errorObj = error instanceof Error ? error : new Error(String(error));
|
|
161
|
+
logError('Agent execution failed', errorObj, { file, mode, agentId });
|
|
147
162
|
const errorTrace = {
|
|
148
163
|
id: traceId,
|
|
149
164
|
timestamp: new Date().toISOString(),
|
|
@@ -184,7 +199,10 @@ async function callLLMWithRetry(prompt, mode, maxRetries) {
|
|
|
184
199
|
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
185
200
|
try {
|
|
186
201
|
logDebug('LLM call attempt', { attempt, maxRetries, mode });
|
|
187
|
-
const response = await
|
|
202
|
+
const response = await callLLM({
|
|
203
|
+
prompt: prompt.user,
|
|
204
|
+
systemPrompt: prompt.system,
|
|
205
|
+
});
|
|
188
206
|
return response;
|
|
189
207
|
}
|
|
190
208
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-executor.js","sourceRoot":"","sources":["../../src/core/agent-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"agent-executor.js","sourceRoot":"","sources":["../../src/core/agent-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Change Applier
|
|
3
|
-
*
|
|
2
|
+
* Change Applier - Safe code change application with backup/rollback
|
|
3
|
+
* Per second-spec.md §4.2
|
|
4
|
+
*
|
|
5
|
+
* Applies code changes safely with:
|
|
6
|
+
* - Backup creation before changes
|
|
7
|
+
* - Atomic all-or-nothing application
|
|
8
|
+
* - Rollback on errors
|
|
9
|
+
* - TypeScript syntax validation
|
|
10
|
+
* - Safety checks (paths, size limits)
|
|
4
11
|
*/
|
|
5
|
-
|
|
12
|
+
export interface CodeChange {
|
|
13
|
+
file: string;
|
|
14
|
+
newContent: string;
|
|
15
|
+
reason: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ApplyResult {
|
|
18
|
+
success: boolean;
|
|
19
|
+
filesChanged: string[];
|
|
20
|
+
backup?: string;
|
|
21
|
+
error?: string;
|
|
22
|
+
}
|
|
6
23
|
/**
|
|
7
|
-
* Apply changes
|
|
24
|
+
* Apply code changes with safety checks and backup
|
|
8
25
|
*/
|
|
9
|
-
export declare function applyChanges(
|
|
26
|
+
export declare function applyChanges(changes: CodeChange[], options?: {
|
|
27
|
+
dryRun?: boolean;
|
|
28
|
+
createBackup?: boolean;
|
|
29
|
+
}): Promise<ApplyResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Rollback changes from backup
|
|
32
|
+
*/
|
|
33
|
+
export declare function rollbackChanges(backup: string): Promise<void>;
|
|
10
34
|
//# sourceMappingURL=change-applier.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-applier.d.ts","sourceRoot":"","sources":["../../src/core/change-applier.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"change-applier.d.ts","sourceRoot":"","sources":["../../src/core/change-applier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,UAAU,EAAE,EACrB,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GACA,OAAO,CAAC,WAAW,CAAC,CAmEtB;AAqLD;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCnE"}
|
|
@@ -1,32 +1,262 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Change Applier
|
|
3
|
-
*
|
|
2
|
+
* Change Applier - Safe code change application with backup/rollback
|
|
3
|
+
* Per second-spec.md §4.2
|
|
4
|
+
*
|
|
5
|
+
* Applies code changes safely with:
|
|
6
|
+
* - Backup creation before changes
|
|
7
|
+
* - Atomic all-or-nothing application
|
|
8
|
+
* - Rollback on errors
|
|
9
|
+
* - TypeScript syntax validation
|
|
10
|
+
* - Safety checks (paths, size limits)
|
|
4
11
|
*/
|
|
5
|
-
import
|
|
6
|
-
import
|
|
12
|
+
import * as fs from 'fs';
|
|
13
|
+
import * as path from 'path';
|
|
14
|
+
import * as crypto from 'crypto';
|
|
15
|
+
import { parse } from '@typescript-eslint/typescript-estree';
|
|
16
|
+
import { readFile } from '../utils/file-utils.js';
|
|
17
|
+
import { logDebug, logWarn, logError } from '../utils/logger.js';
|
|
18
|
+
const MAX_FILE_SIZE = 50 * 1024; // 50KB
|
|
19
|
+
const BACKUP_DIR = '.agent-meta/backups';
|
|
20
|
+
const BACKUP_INDEX = path.join(BACKUP_DIR, 'index.json');
|
|
7
21
|
/**
|
|
8
|
-
* Apply changes
|
|
22
|
+
* Apply code changes with safety checks and backup
|
|
9
23
|
*/
|
|
10
|
-
export async function applyChanges(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
24
|
+
export async function applyChanges(changes, options) {
|
|
25
|
+
const { dryRun = false, createBackup = true } = options || {};
|
|
26
|
+
try {
|
|
27
|
+
logDebug('Applying changes', {
|
|
28
|
+
fileCount: changes.length,
|
|
29
|
+
dryRun,
|
|
30
|
+
createBackup,
|
|
31
|
+
});
|
|
32
|
+
// Validate all changes first
|
|
33
|
+
for (const change of changes) {
|
|
34
|
+
await validateChange(change);
|
|
35
|
+
}
|
|
36
|
+
// Dry run mode - validate only
|
|
37
|
+
if (dryRun) {
|
|
38
|
+
logDebug('Dry run mode - changes validated but not applied');
|
|
39
|
+
return {
|
|
40
|
+
success: true,
|
|
41
|
+
filesChanged: changes.map(c => c.file),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Create backup if requested
|
|
45
|
+
let backupId;
|
|
46
|
+
if (createBackup) {
|
|
47
|
+
backupId = await createBackupFiles(changes);
|
|
48
|
+
}
|
|
49
|
+
// Apply all changes
|
|
50
|
+
const filesChanged = [];
|
|
51
|
+
try {
|
|
52
|
+
for (const change of changes) {
|
|
53
|
+
await applyChange(change);
|
|
54
|
+
filesChanged.push(change.file);
|
|
55
|
+
}
|
|
56
|
+
logDebug('All changes applied successfully', {
|
|
57
|
+
filesChanged,
|
|
58
|
+
backup: backupId,
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
success: true,
|
|
62
|
+
filesChanged,
|
|
63
|
+
backup: backupId,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
// Rollback on error
|
|
68
|
+
logError('Error applying changes, rolling back', error);
|
|
69
|
+
if (backupId) {
|
|
70
|
+
await rollbackChanges(backupId);
|
|
71
|
+
}
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
logError('Failed to apply changes', error);
|
|
77
|
+
return {
|
|
78
|
+
success: false,
|
|
79
|
+
filesChanged: [],
|
|
80
|
+
error: error instanceof Error ? error.message : String(error),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Validate a single change before applying
|
|
86
|
+
*/
|
|
87
|
+
async function validateChange(change) {
|
|
88
|
+
const { file, newContent } = change;
|
|
89
|
+
// Check file path is safe
|
|
90
|
+
const absolutePath = path.resolve(file);
|
|
91
|
+
const cwd = process.cwd();
|
|
92
|
+
if (!absolutePath.startsWith(cwd)) {
|
|
93
|
+
throw new Error(`File path outside project directory: ${file}`);
|
|
94
|
+
}
|
|
95
|
+
// Check file exists (only allow modifying existing files)
|
|
96
|
+
if (!fs.existsSync(absolutePath)) {
|
|
97
|
+
throw new Error(`File does not exist: ${file}`);
|
|
98
|
+
}
|
|
99
|
+
// Check existing file size (don't touch files that are already too large)
|
|
100
|
+
const stats = fs.statSync(absolutePath);
|
|
101
|
+
if (stats.size > MAX_FILE_SIZE) {
|
|
102
|
+
throw new Error(`File too large: ${stats.size} bytes (max ${MAX_FILE_SIZE})`);
|
|
103
|
+
}
|
|
104
|
+
// Don't modify protected directories
|
|
105
|
+
const relativePath = path.relative(cwd, absolutePath);
|
|
106
|
+
const pathComponents = relativePath.split(path.sep);
|
|
107
|
+
if (pathComponents.includes('.git') || pathComponents.includes('node_modules')) {
|
|
108
|
+
throw new Error(`Cannot modify protected directory: ${relativePath}`);
|
|
109
|
+
}
|
|
110
|
+
// Check new content size
|
|
111
|
+
if (newContent.length > MAX_FILE_SIZE) {
|
|
112
|
+
throw new Error(`File too large: ${newContent.length} bytes (max ${MAX_FILE_SIZE})`);
|
|
113
|
+
}
|
|
114
|
+
// Check file is writable
|
|
115
|
+
try {
|
|
116
|
+
fs.accessSync(absolutePath, fs.constants.W_OK);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
throw new Error(`File not writable: ${file}`);
|
|
120
|
+
}
|
|
121
|
+
// Validate TypeScript syntax for .ts/.tsx files
|
|
122
|
+
if (file.endsWith('.ts') || file.endsWith('.tsx')) {
|
|
123
|
+
try {
|
|
124
|
+
parse(newContent, {
|
|
125
|
+
loc: true,
|
|
126
|
+
range: true,
|
|
127
|
+
jsx: file.endsWith('.tsx'),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
throw new Error(`TypeScript syntax error: ${error instanceof Error ? error.message : String(error)}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Apply a single change
|
|
137
|
+
*/
|
|
138
|
+
async function applyChange(change) {
|
|
139
|
+
const { file, newContent, reason } = change;
|
|
140
|
+
logDebug('Applying change', {
|
|
141
|
+
file,
|
|
142
|
+
reason,
|
|
143
|
+
size: newContent.length,
|
|
15
144
|
});
|
|
16
|
-
//
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
//
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
145
|
+
// Ensure directory exists
|
|
146
|
+
const dir = path.dirname(file);
|
|
147
|
+
if (!fs.existsSync(dir)) {
|
|
148
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
149
|
+
}
|
|
150
|
+
// Write file
|
|
151
|
+
fs.writeFileSync(file, newContent, 'utf-8');
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Create backup of files before changes
|
|
155
|
+
*/
|
|
156
|
+
async function createBackupFiles(changes) {
|
|
157
|
+
const timestamp = Date.now();
|
|
158
|
+
const backupId = `${timestamp}-${crypto.randomBytes(4).toString('hex')}`;
|
|
159
|
+
const backupPath = path.join(BACKUP_DIR, backupId);
|
|
160
|
+
logDebug('Creating backup', { backupId });
|
|
161
|
+
// Ensure backup directory exists
|
|
162
|
+
if (!fs.existsSync(BACKUP_DIR)) {
|
|
163
|
+
fs.mkdirSync(BACKUP_DIR, { recursive: true });
|
|
164
|
+
}
|
|
165
|
+
// Create backup directory
|
|
166
|
+
fs.mkdirSync(backupPath, { recursive: true });
|
|
167
|
+
// Backup metadata
|
|
168
|
+
const metadata = {
|
|
169
|
+
timestamp,
|
|
170
|
+
files: [],
|
|
171
|
+
};
|
|
172
|
+
// Backup each file
|
|
173
|
+
for (const change of changes) {
|
|
174
|
+
const { file } = change;
|
|
175
|
+
if (fs.existsSync(file)) {
|
|
176
|
+
// Read original content
|
|
177
|
+
const originalContent = readFile(file);
|
|
178
|
+
const hash = crypto.createHash('sha256').update(originalContent).digest('hex');
|
|
179
|
+
// Write to backup
|
|
180
|
+
const backupFile = path.join(backupPath, path.basename(file));
|
|
181
|
+
fs.writeFileSync(backupFile, originalContent, 'utf-8');
|
|
182
|
+
metadata.files.push({
|
|
183
|
+
file,
|
|
184
|
+
hash,
|
|
185
|
+
backed_up: true,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
// File doesn't exist yet (new file)
|
|
190
|
+
metadata.files.push({
|
|
191
|
+
file,
|
|
192
|
+
hash: '',
|
|
193
|
+
backed_up: false,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// Write metadata
|
|
198
|
+
const metadataFile = path.join(backupPath, 'metadata.json');
|
|
199
|
+
fs.writeFileSync(metadataFile, JSON.stringify(metadata, null, 2), 'utf-8');
|
|
200
|
+
// Update backup index
|
|
201
|
+
await updateBackupIndex(backupId, metadata);
|
|
202
|
+
logDebug('Backup created', { backupId, fileCount: metadata.files.length });
|
|
203
|
+
return backupId;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Update backup index
|
|
207
|
+
*/
|
|
208
|
+
async function updateBackupIndex(backupId, metadata) {
|
|
209
|
+
let index = {};
|
|
210
|
+
if (fs.existsSync(BACKUP_INDEX)) {
|
|
211
|
+
const content = fs.readFileSync(BACKUP_INDEX, 'utf-8');
|
|
212
|
+
try {
|
|
213
|
+
index = JSON.parse(content);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
logWarn('Failed to parse backup index, creating new one');
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
index[backupId] = {
|
|
220
|
+
timestamp: metadata.timestamp,
|
|
221
|
+
files: metadata.files.map(f => f.file),
|
|
28
222
|
};
|
|
29
|
-
|
|
30
|
-
|
|
223
|
+
fs.writeFileSync(BACKUP_INDEX, JSON.stringify(index, null, 2), 'utf-8');
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Rollback changes from backup
|
|
227
|
+
*/
|
|
228
|
+
export async function rollbackChanges(backup) {
|
|
229
|
+
const backupPath = path.join(BACKUP_DIR, backup);
|
|
230
|
+
if (!fs.existsSync(backupPath)) {
|
|
231
|
+
throw new Error(`Backup not found: ${backup}`);
|
|
232
|
+
}
|
|
233
|
+
logDebug('Rolling back changes', { backup });
|
|
234
|
+
// Read metadata
|
|
235
|
+
const metadataFile = path.join(backupPath, 'metadata.json');
|
|
236
|
+
if (!fs.existsSync(metadataFile)) {
|
|
237
|
+
throw new Error(`Backup metadata not found: ${backup}`);
|
|
238
|
+
}
|
|
239
|
+
const metadata = JSON.parse(fs.readFileSync(metadataFile, 'utf-8'));
|
|
240
|
+
// Restore each file
|
|
241
|
+
for (const fileInfo of metadata.files) {
|
|
242
|
+
const { file, backed_up } = fileInfo;
|
|
243
|
+
if (backed_up) {
|
|
244
|
+
// Restore from backup
|
|
245
|
+
const backupFile = path.join(backupPath, path.basename(file));
|
|
246
|
+
const content = fs.readFileSync(backupFile, 'utf-8');
|
|
247
|
+
fs.writeFileSync(file, content, 'utf-8');
|
|
248
|
+
logDebug('File restored from backup', { file });
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
// File was new, delete it
|
|
252
|
+
if (fs.existsSync(file)) {
|
|
253
|
+
fs.unlinkSync(file);
|
|
254
|
+
logDebug('New file removed', { file });
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// Remove backup
|
|
259
|
+
fs.rmSync(backupPath, { recursive: true, force: true });
|
|
260
|
+
logDebug('Rollback complete', { backup });
|
|
31
261
|
}
|
|
32
262
|
//# sourceMappingURL=change-applier.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"change-applier.js","sourceRoot":"","sources":["../../src/core/change-applier.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"change-applier.js","sourceRoot":"","sources":["../../src/core/change-applier.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"churn.d.ts","sourceRoot":"","sources":["../../../src/core/signals/churn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,IAAI,CAAC;CACjB;AAgBD;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA0D3E;
|
|
1
|
+
{"version":3,"file":"churn.d.ts","sourceRoot":"","sources":["../../../src/core/signals/churn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,IAAI,CAAC;CACjB;AAgBD;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA0D3E;AA8FD;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAWP;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAUnC"}
|
|
@@ -11,11 +11,11 @@
|
|
|
11
11
|
* Normalization: commits_to_file / max(commits_to_any_file)
|
|
12
12
|
* Cache TTL: 5 minutes (300 seconds)
|
|
13
13
|
*/
|
|
14
|
-
import {
|
|
14
|
+
import { execFile } from 'child_process';
|
|
15
15
|
import { promisify } from 'util';
|
|
16
16
|
import { resolve, dirname } from 'path';
|
|
17
17
|
import { logDebug, logWarn } from '../../utils/logger.js';
|
|
18
|
-
const
|
|
18
|
+
const execFileAsync = promisify(execFile);
|
|
19
19
|
const CHURN_LOOKBACK_DAYS = 30;
|
|
20
20
|
const CHURN_CACHE_TTL_MS = 300_000; // 5 minutes
|
|
21
21
|
// Global cache (in-memory)
|
|
@@ -81,7 +81,8 @@ export async function calculateChurn(filePath) {
|
|
|
81
81
|
async function findGitRootForFile(filePath) {
|
|
82
82
|
const fileDir = dirname(resolve(filePath));
|
|
83
83
|
try {
|
|
84
|
-
|
|
84
|
+
// SECURITY: Use execFile to prevent command injection
|
|
85
|
+
const { stdout } = await execFileAsync('git', ['rev-parse', '--show-toplevel'], {
|
|
85
86
|
cwd: fileDir,
|
|
86
87
|
maxBuffer: 1024,
|
|
87
88
|
});
|
|
@@ -99,7 +100,8 @@ async function buildChurnCache(gitRoot) {
|
|
|
99
100
|
try {
|
|
100
101
|
// Get all commits with changed files
|
|
101
102
|
// Use "30 days ago" which git understands better than ISO dates
|
|
102
|
-
|
|
103
|
+
// SECURITY: Use execFile with array args to prevent command injection
|
|
104
|
+
const { stdout } = await execFileAsync('git', ['log', `--since=${CHURN_LOOKBACK_DAYS} days ago`, '--name-only', '--pretty=format:', '--all'], {
|
|
103
105
|
cwd: gitRoot,
|
|
104
106
|
maxBuffer: 10 * 1024 * 1024, // 10MB buffer for large repos
|
|
105
107
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"churn.js","sourceRoot":"","sources":["../../../src/core/signals/churn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"churn.js","sourceRoot":"","sources":["../../../src/core/signals/churn.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debt.d.ts","sourceRoot":"","sources":["../../../src/core/signals/debt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAYD;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"debt.d.ts","sourceRoot":"","sources":["../../../src/core/signals/debt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAYD;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAuDzE;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CASlC"}
|
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Graceful fallback if ESLint missing or fails (returns 0)
|
|
12
12
|
*/
|
|
13
|
-
import {
|
|
13
|
+
import { execFile } from 'child_process';
|
|
14
14
|
import { promisify } from 'util';
|
|
15
15
|
import { getLineCount } from '../../utils/file-utils.js';
|
|
16
16
|
import { logDebug, logWarn } from '../../utils/logger.js';
|
|
17
|
-
const
|
|
17
|
+
const execFileAsync = promisify(execFile);
|
|
18
18
|
/**
|
|
19
19
|
* Calculate technical debt for a file using ESLint
|
|
20
20
|
*/
|
|
@@ -24,7 +24,8 @@ export async function calculateDebt(filePath) {
|
|
|
24
24
|
const loc = getLineCount(filePath);
|
|
25
25
|
// Run ESLint with JSON formatter
|
|
26
26
|
// Note: ESLint exits with code 1 if there are linting errors, so we catch and parse stdout
|
|
27
|
-
|
|
27
|
+
// SECURITY: Use execFile with array args to prevent command injection
|
|
28
|
+
const { stdout } = await execFileAsync('npx', ['eslint', filePath, '--format', 'json'], {
|
|
28
29
|
maxBuffer: 1024 * 1024,
|
|
29
30
|
}).catch((error) => {
|
|
30
31
|
// ESLint returns exit code 1 when there are lint errors, but stdout still has JSON
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debt.js","sourceRoot":"","sources":["../../../src/core/signals/debt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"debt.js","sourceRoot":"","sources":["../../../src/core/signals/debt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cost-tracker.d.ts","sourceRoot":"","sources":["../../src/cost/cost-tracker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cost-tracker.d.ts","sourceRoot":"","sources":["../../src/cost/cost-tracker.ts"],"names":[],"mappings":"AA0CA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAcD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAkBD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,eAAe,CA6BjB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBpF;AA2BD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAUhE;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAU/E;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAsCnE;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAuCxE;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,GAAE,MAAU,GAAG,OAAO,CAAC,KAAK,CAAC;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC,CAAC,CA8BF;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAAC,CA6BF;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAMhD"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as path from 'path';
|
|
2
2
|
import { fileExists, readFile, writeFile, appendFile, ensureDir, } from '../utils/file-utils';
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
4
|
+
// @ts-ignore
|
|
3
5
|
import { logDebug, createLogger } from '../utils/logger';
|
|
4
6
|
const logger = createLogger({ module: 'cost-tracker' });
|
|
5
7
|
/**
|