@mohantn/gate-keeper 2.2.0 → 2.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -46
- package/package.json +2 -2
- package/dist/cli/query-repl.d.ts +0 -37
- package/dist/cli/query-repl.d.ts.map +0 -1
- package/dist/cli/query-repl.js +0 -298
- package/dist/cli/query-repl.js.map +0 -1
- package/dist/cli/repl-algorithms.d.ts +0 -49
- package/dist/cli/repl-algorithms.d.ts.map +0 -1
- package/dist/cli/repl-algorithms.js +0 -147
- package/dist/cli/repl-algorithms.js.map +0 -1
- package/dist/cli/setup-core.d.ts +0 -38
- package/dist/cli/setup-core.d.ts.map +0 -1
- package/dist/cli/setup-core.js +0 -427
- package/dist/cli/setup-core.js.map +0 -1
- package/dist/cli/setup.d.ts +0 -25
- package/dist/cli/setup.d.ts.map +0 -1
- package/dist/cli/setup.js +0 -159
- package/dist/cli/setup.js.map +0 -1
- package/dist/github/app.d.ts +0 -34
- package/dist/github/app.d.ts.map +0 -1
- package/dist/github/app.js +0 -261
- package/dist/github/app.js.map +0 -1
- package/dist/github/commenter.d.ts +0 -67
- package/dist/github/commenter.d.ts.map +0 -1
- package/dist/github/commenter.js +0 -155
- package/dist/github/commenter.js.map +0 -1
- package/dist/hooks/git-hooks.d.ts +0 -30
- package/dist/hooks/git-hooks.d.ts.map +0 -1
- package/dist/hooks/git-hooks.js +0 -179
- package/dist/hooks/git-hooks.js.map +0 -1
- package/dist/mcp/cache-preload.d.ts +0 -29
- package/dist/mcp/cache-preload.d.ts.map +0 -1
- package/dist/mcp/cache-preload.js +0 -103
- package/dist/mcp/cache-preload.js.map +0 -1
- package/dist/mcp/handlers/context.d.ts +0 -25
- package/dist/mcp/handlers/context.d.ts.map +0 -1
- package/dist/mcp/handlers/context.js +0 -382
- package/dist/mcp/handlers/context.js.map +0 -1
- package/dist/mcp/handlers/graph-intelligence.d.ts +0 -26
- package/dist/mcp/handlers/graph-intelligence.d.ts.map +0 -1
- package/dist/mcp/handlers/graph-intelligence.js +0 -371
- package/dist/mcp/handlers/graph-intelligence.js.map +0 -1
- package/dist/mcp/handlers/graph-query.d.ts +0 -25
- package/dist/mcp/handlers/graph-query.d.ts.map +0 -1
- package/dist/mcp/handlers/graph-query.js +0 -410
- package/dist/mcp/handlers/graph-query.js.map +0 -1
- package/dist/mcp/handlers/impact.d.ts +0 -4
- package/dist/mcp/handlers/impact.d.ts.map +0 -1
- package/dist/mcp/handlers/impact.js +0 -139
- package/dist/mcp/handlers/impact.js.map +0 -1
- package/dist/mcp/handlers/improvement.d.ts +0 -4
- package/dist/mcp/handlers/improvement.d.ts.map +0 -1
- package/dist/mcp/handlers/improvement.js +0 -136
- package/dist/mcp/handlers/improvement.js.map +0 -1
- package/dist/mcp/handlers/platform-installer.d.ts +0 -10
- package/dist/mcp/handlers/platform-installer.d.ts.map +0 -1
- package/dist/mcp/handlers/platform-installer.js +0 -168
- package/dist/mcp/handlers/platform-installer.js.map +0 -1
- package/dist/mcp/handlers/pr-review.d.ts +0 -33
- package/dist/mcp/handlers/pr-review.d.ts.map +0 -1
- package/dist/mcp/handlers/pr-review.js +0 -170
- package/dist/mcp/handlers/pr-review.js.map +0 -1
- package/dist/mcp/token-tracker.d.ts +0 -47
- package/dist/mcp/token-tracker.d.ts.map +0 -1
- package/dist/mcp/token-tracker.js +0 -93
- package/dist/mcp/token-tracker.js.map +0 -1
- package/dist/quality-loop/file-lock.d.ts +0 -12
- package/dist/quality-loop/file-lock.d.ts.map +0 -1
- package/dist/quality-loop/file-lock.js +0 -38
- package/dist/quality-loop/file-lock.js.map +0 -1
- package/dist/quality-loop/fix-worker.d.ts +0 -44
- package/dist/quality-loop/fix-worker.d.ts.map +0 -1
- package/dist/quality-loop/fix-worker.js +0 -414
- package/dist/quality-loop/fix-worker.js.map +0 -1
- package/dist/quality-loop/orchestrator.d.ts +0 -137
- package/dist/quality-loop/orchestrator.d.ts.map +0 -1
- package/dist/quality-loop/orchestrator.js +0 -894
- package/dist/quality-loop/orchestrator.js.map +0 -1
- package/dist/quality-loop/queue-manager.d.ts +0 -45
- package/dist/quality-loop/queue-manager.d.ts.map +0 -1
- package/dist/quality-loop/queue-manager.js +0 -173
- package/dist/quality-loop/queue-manager.js.map +0 -1
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Session-scoped token savings tracker.
|
|
4
|
-
*
|
|
5
|
-
* Maintains an in-memory tally of graph queries made and estimated tokens
|
|
6
|
-
* saved vs. the naive "read every affected file" approach. The MCP server
|
|
7
|
-
* exposes this via get_session_metrics so agents can report efficiency.
|
|
8
|
-
*/
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.tokenTracker = exports.TokenTracker = void 0;
|
|
11
|
-
const AVG_FILE_TOKENS = 5000;
|
|
12
|
-
class TokenTracker {
|
|
13
|
-
records = [];
|
|
14
|
-
record(tool, filesNotRead, responseText) {
|
|
15
|
-
const responseTokens = Math.ceil(responseText.length / 4);
|
|
16
|
-
this.records.push({
|
|
17
|
-
tool,
|
|
18
|
-
filesNotRead,
|
|
19
|
-
estimatedSavedTokens: filesNotRead * AVG_FILE_TOKENS - responseTokens,
|
|
20
|
-
responseTokens,
|
|
21
|
-
timestamp: Date.now(),
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
getMetrics() {
|
|
25
|
-
const totalFilesNotRead = this.records.reduce((s, r) => s + r.filesNotRead, 0);
|
|
26
|
-
const estimatedNaiveTokens = totalFilesNotRead * AVG_FILE_TOKENS;
|
|
27
|
-
const estimatedSavedTokens = this.records.reduce((s, r) => s + Math.max(0, r.estimatedSavedTokens), 0);
|
|
28
|
-
const savingsPercent = estimatedNaiveTokens > 0
|
|
29
|
-
? Math.round((estimatedSavedTokens / estimatedNaiveTokens) * 100)
|
|
30
|
-
: 0;
|
|
31
|
-
return {
|
|
32
|
-
totalQueries: this.records.length,
|
|
33
|
-
totalFilesNotRead,
|
|
34
|
-
estimatedSavedTokens,
|
|
35
|
-
estimatedNaiveTokens,
|
|
36
|
-
savingsPercent,
|
|
37
|
-
queries: [...this.records],
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
/** Richer budget breakdown with per-tool stats and recommendations. */
|
|
41
|
-
getContextBudget() {
|
|
42
|
-
const totalFilesNotRead = this.records.reduce((s, r) => s + r.filesNotRead, 0);
|
|
43
|
-
const actualResponseTokens = this.records.reduce((s, r) => s + r.responseTokens, 0);
|
|
44
|
-
const estimatedNaiveTokens = totalFilesNotRead * AVG_FILE_TOKENS;
|
|
45
|
-
const savingsTokens = Math.max(0, estimatedNaiveTokens - actualResponseTokens);
|
|
46
|
-
const savingsPercent = estimatedNaiveTokens > 0
|
|
47
|
-
? Math.round((savingsTokens / estimatedNaiveTokens) * 100)
|
|
48
|
-
: 0;
|
|
49
|
-
// Per-tool breakdown
|
|
50
|
-
const perToolMap = new Map();
|
|
51
|
-
for (const r of this.records) {
|
|
52
|
-
const entry = perToolMap.get(r.tool) ?? { calls: 0, filesAvoided: 0, tokensSaved: 0 };
|
|
53
|
-
entry.calls++;
|
|
54
|
-
entry.filesAvoided += r.filesNotRead;
|
|
55
|
-
entry.tokensSaved += Math.max(0, r.estimatedSavedTokens);
|
|
56
|
-
perToolMap.set(r.tool, entry);
|
|
57
|
-
}
|
|
58
|
-
const perTool = [...perToolMap.entries()]
|
|
59
|
-
.map(([tool, v]) => ({ tool, ...v }))
|
|
60
|
-
.sort((a, b) => b.tokensSaved - a.tokensSaved);
|
|
61
|
-
// Generate recommendations
|
|
62
|
-
const recommendations = [];
|
|
63
|
-
if (totalFilesNotRead > 0) {
|
|
64
|
-
recommendations.push(`You avoided reading ~${totalFilesNotRead} files using the graph (~${savingsPercent}% token reduction).`);
|
|
65
|
-
}
|
|
66
|
-
if (this.records.length > 0) {
|
|
67
|
-
const mostUsed = perTool[0];
|
|
68
|
-
if (mostUsed) {
|
|
69
|
-
recommendations.push(`Most effective tool: \`${mostUsed.tool}\` saved ~${mostUsed.tokensSaved.toLocaleString()} tokens across ${mostUsed.calls} calls.`);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
if (recommendations.length === 0) {
|
|
73
|
-
recommendations.push('No graph queries yet. Try `get_impact_set`, `trace_path`, or `summarize_file`.');
|
|
74
|
-
}
|
|
75
|
-
return {
|
|
76
|
-
totalQueries: this.records.length,
|
|
77
|
-
totalFilesNotRead,
|
|
78
|
-
estimatedNaiveTokens,
|
|
79
|
-
actualResponseTokens,
|
|
80
|
-
savingsPercent,
|
|
81
|
-
savingsTokens,
|
|
82
|
-
perTool,
|
|
83
|
-
recommendations,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
reset() {
|
|
87
|
-
this.records = [];
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
exports.TokenTracker = TokenTracker;
|
|
91
|
-
// Singleton shared across the MCP session
|
|
92
|
-
exports.tokenTracker = new TokenTracker();
|
|
93
|
-
//# sourceMappingURL=token-tracker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"token-tracker.js","sourceRoot":"","sources":["../../src/mcp/token-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { SqliteCache } from '../cache/sqlite-cache';
|
|
2
|
-
export declare class FileLockManager {
|
|
3
|
-
private memoryLocks;
|
|
4
|
-
private cache;
|
|
5
|
-
constructor(cache: SqliteCache);
|
|
6
|
-
acquire(filePath: string, workerId: string): boolean;
|
|
7
|
-
release(filePath: string, workerId: string): void;
|
|
8
|
-
isLocked(filePath: string): boolean;
|
|
9
|
-
getLockedPaths(): Set<string>;
|
|
10
|
-
clearStale(): number;
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=file-lock.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-lock.d.ts","sourceRoot":"","sources":["../../src/quality-loop/file-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,KAAK,CAAc;gBAEf,KAAK,EAAE,WAAW;IAI9B,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAOpD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAInC,cAAc,IAAI,GAAG,CAAC,MAAM,CAAC;IAI7B,UAAU,IAAI,MAAM;CAOrB"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FileLockManager = void 0;
|
|
4
|
-
const STALE_LOCK_MS = 300_000; // 5 minutes
|
|
5
|
-
class FileLockManager {
|
|
6
|
-
memoryLocks = new Map(); // filePath -> workerId
|
|
7
|
-
cache;
|
|
8
|
-
constructor(cache) {
|
|
9
|
-
this.cache = cache;
|
|
10
|
-
}
|
|
11
|
-
acquire(filePath, workerId) {
|
|
12
|
-
if (this.memoryLocks.has(filePath))
|
|
13
|
-
return false;
|
|
14
|
-
if (!this.cache.quality.acquireLock(filePath, workerId, STALE_LOCK_MS))
|
|
15
|
-
return false;
|
|
16
|
-
this.memoryLocks.set(filePath, workerId);
|
|
17
|
-
return true;
|
|
18
|
-
}
|
|
19
|
-
release(filePath, workerId) {
|
|
20
|
-
this.memoryLocks.delete(filePath);
|
|
21
|
-
this.cache.quality.releaseLock(filePath, workerId);
|
|
22
|
-
}
|
|
23
|
-
isLocked(filePath) {
|
|
24
|
-
return this.memoryLocks.has(filePath);
|
|
25
|
-
}
|
|
26
|
-
getLockedPaths() {
|
|
27
|
-
return new Set(this.memoryLocks.keys());
|
|
28
|
-
}
|
|
29
|
-
clearStale() {
|
|
30
|
-
const stale = this.cache.quality.getStaleLocks(STALE_LOCK_MS);
|
|
31
|
-
for (const lock of stale) {
|
|
32
|
-
this.memoryLocks.delete(lock.file_path);
|
|
33
|
-
}
|
|
34
|
-
return this.cache.quality.clearStaleLocks(STALE_LOCK_MS);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
exports.FileLockManager = FileLockManager;
|
|
38
|
-
//# sourceMappingURL=file-lock.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-lock.js","sourceRoot":"","sources":["../../src/quality-loop/file-lock.ts"],"names":[],"mappings":";;;AAEA,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,YAAY;AAE3C,MAAa,eAAe;IAClB,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,uBAAuB;IAChE,KAAK,CAAc;IAE3B,YAAY,KAAkB;QAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,QAAgB,EAAE,QAAgB;QACxC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,CAAC;YAAE,OAAO,KAAK,CAAC;QACrF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,QAAgB,EAAE,QAAgB;QACxC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,QAAQ,CAAC,QAAgB;QACvB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,UAAU;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QAC9D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;IAC3D,CAAC;CACF;AAnCD,0CAmCC"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { WorkerResult } from '../types';
|
|
2
|
-
export declare class FixWorker {
|
|
3
|
-
private filePath;
|
|
4
|
-
private repo;
|
|
5
|
-
private threshold;
|
|
6
|
-
constructor(opts: {
|
|
7
|
-
filePath: string;
|
|
8
|
-
repo: string;
|
|
9
|
-
threshold: number;
|
|
10
|
-
});
|
|
11
|
-
fix(): Promise<WorkerResult>;
|
|
12
|
-
private createHandle;
|
|
13
|
-
private cleanupHandle;
|
|
14
|
-
/**
|
|
15
|
-
* Writes the bash script and opens a terminal to run it.
|
|
16
|
-
*
|
|
17
|
-
* The script writes a JSON status file via a `trap EXIT` handler so the
|
|
18
|
-
* worker hears about Claude finishing regardless of how the terminal closes
|
|
19
|
-
* (clean exit, crash, user closes the window, SIGTERM from OS, etc.).
|
|
20
|
-
*
|
|
21
|
-
* The prompt is written to a separate file so no shell-escaping is needed
|
|
22
|
-
* for the arbitrary text inside it.
|
|
23
|
-
*/
|
|
24
|
-
private openTerminal;
|
|
25
|
-
/**
|
|
26
|
-
* Polls until one of four terminal conditions is met:
|
|
27
|
-
*
|
|
28
|
-
* 1. Status file appears with exitCode 0 → Claude ran to completion
|
|
29
|
-
* 2. Status file appears with exitCode ≠ 0 → Claude crashed / window closed → retry
|
|
30
|
-
* 3. Rating crosses threshold while Claude is still running → early success
|
|
31
|
-
* 4. MAX_WAIT elapsed with no status file → Claude hung / too slow → retry
|
|
32
|
-
*/
|
|
33
|
-
private waitForCompletion;
|
|
34
|
-
private readStatus;
|
|
35
|
-
private readLog;
|
|
36
|
-
private tryOpenWSL;
|
|
37
|
-
private tryOpenLinux;
|
|
38
|
-
private resolveClaudePath;
|
|
39
|
-
private isWSL;
|
|
40
|
-
private fetchAnalysis;
|
|
41
|
-
private reanalyze;
|
|
42
|
-
private sleep;
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=fix-worker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fix-worker.d.ts","sourceRoot":"","sources":["../../src/quality-loop/fix-worker.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,YAAY,EAAE,MAAM,UAAU,CAAC;AAsBtD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAS;gBAEd,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAMjE,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC;IA2DlC,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,aAAa;IAUrB;;;;;;;;;OASG;IACH,OAAO,CAAC,YAAY;IAuDpB;;;;;;;OAOG;YACW,iBAAiB;IA+F/B,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,UAAU;IAyBlB,OAAO,CAAC,YAAY;IA2BpB,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,KAAK;YAUC,aAAa;YAYb,SAAS;IAevB,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -1,414 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.FixWorker = void 0;
|
|
37
|
-
const fs = __importStar(require("fs"));
|
|
38
|
-
const path = __importStar(require("path"));
|
|
39
|
-
const os = __importStar(require("os"));
|
|
40
|
-
const child_process_1 = require("child_process");
|
|
41
|
-
const fix_text_1 = require("../util/fix-text");
|
|
42
|
-
const DAEMON_IPC = 'http://127.0.0.1:5379';
|
|
43
|
-
const VIZ_API = 'http://127.0.0.1:5378';
|
|
44
|
-
const POLL_INTERVAL = 5_000; // 5 s — snappy enough without hammering the daemon
|
|
45
|
-
const MAX_WAIT = 300_000; // 5 min hard ceiling
|
|
46
|
-
class FixWorker {
|
|
47
|
-
filePath;
|
|
48
|
-
repo;
|
|
49
|
-
threshold;
|
|
50
|
-
constructor(opts) {
|
|
51
|
-
this.filePath = opts.filePath;
|
|
52
|
-
this.repo = opts.repo;
|
|
53
|
-
this.threshold = opts.threshold;
|
|
54
|
-
}
|
|
55
|
-
async fix() {
|
|
56
|
-
const startTime = Date.now();
|
|
57
|
-
const analysis = await this.fetchAnalysis();
|
|
58
|
-
if (!analysis) {
|
|
59
|
-
return {
|
|
60
|
-
success: false, newRating: 0, ratingBefore: 0,
|
|
61
|
-
violationsRemaining: 0, violationsFixed: 0,
|
|
62
|
-
durationMs: Date.now() - startTime, attemptNumber: 1,
|
|
63
|
-
fixSummary: '', error: 'Could not fetch analysis',
|
|
64
|
-
shouldRetry: false,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
const ratingBefore = analysis.rating;
|
|
68
|
-
if (ratingBefore >= this.threshold) {
|
|
69
|
-
return {
|
|
70
|
-
success: true, newRating: ratingBefore, ratingBefore,
|
|
71
|
-
violationsRemaining: 0, violationsFixed: 0,
|
|
72
|
-
durationMs: 0, attemptNumber: 0,
|
|
73
|
-
fixSummary: 'Already passes threshold',
|
|
74
|
-
shouldRetry: false,
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
const numberedViolations = analysis.violations.map((v, i) => {
|
|
78
|
-
const t = (0, fix_text_1.fixText)(v.fix);
|
|
79
|
-
return `${i + 1}. [${v.severity.toUpperCase()}]${v.line ? ` (line ${v.line})` : ''}: ${v.message}${t ? `\n Fix: ${t}` : ''}`;
|
|
80
|
-
}).join('\n');
|
|
81
|
-
const prompt = `fix all violation going on in this file @${this.filePath}
|
|
82
|
-
File: ${this.filePath}
|
|
83
|
-
Rating: ${analysis.rating}/10
|
|
84
|
-
Violations: ${analysis.violations.length}
|
|
85
|
-
|
|
86
|
-
${numberedViolations}`;
|
|
87
|
-
const claudePath = this.resolveClaudePath();
|
|
88
|
-
const handle = this.createHandle();
|
|
89
|
-
const opened = this.openTerminal(prompt, claudePath, handle);
|
|
90
|
-
if (!opened) {
|
|
91
|
-
this.cleanupHandle(handle, 0);
|
|
92
|
-
return {
|
|
93
|
-
success: false, newRating: ratingBefore, ratingBefore,
|
|
94
|
-
violationsRemaining: analysis.violations.length, violationsFixed: 0,
|
|
95
|
-
durationMs: Date.now() - startTime, attemptNumber: 1,
|
|
96
|
-
fixSummary: '', error: 'Could not open terminal',
|
|
97
|
-
shouldRetry: true,
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
const result = await this.waitForCompletion(handle, analysis, ratingBefore, startTime);
|
|
101
|
-
this.cleanupHandle(handle, 5_000);
|
|
102
|
-
return result;
|
|
103
|
-
}
|
|
104
|
-
// ── Terminal lifecycle ─────────────────────────────────────────────────────
|
|
105
|
-
createHandle() {
|
|
106
|
-
const id = `gk-fix-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
|
|
107
|
-
const tmp = os.tmpdir();
|
|
108
|
-
return {
|
|
109
|
-
scriptFile: path.join(tmp, `${id}.sh`),
|
|
110
|
-
promptFile: path.join(tmp, `${id}.prompt`),
|
|
111
|
-
statusFile: path.join(tmp, `${id}.status`),
|
|
112
|
-
logFile: path.join(tmp, `${id}.log`),
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
cleanupHandle(handle, delayMs) {
|
|
116
|
-
const remove = () => {
|
|
117
|
-
for (const f of Object.values(handle)) {
|
|
118
|
-
try {
|
|
119
|
-
fs.unlinkSync(f);
|
|
120
|
-
}
|
|
121
|
-
catch { /* already gone */ }
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
if (delayMs <= 0)
|
|
125
|
-
remove();
|
|
126
|
-
else
|
|
127
|
-
setTimeout(remove, delayMs);
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Writes the bash script and opens a terminal to run it.
|
|
131
|
-
*
|
|
132
|
-
* The script writes a JSON status file via a `trap EXIT` handler so the
|
|
133
|
-
* worker hears about Claude finishing regardless of how the terminal closes
|
|
134
|
-
* (clean exit, crash, user closes the window, SIGTERM from OS, etc.).
|
|
135
|
-
*
|
|
136
|
-
* The prompt is written to a separate file so no shell-escaping is needed
|
|
137
|
-
* for the arbitrary text inside it.
|
|
138
|
-
*/
|
|
139
|
-
openTerminal(prompt, claudePath, handle) {
|
|
140
|
-
try {
|
|
141
|
-
fs.writeFileSync(handle.promptFile, prompt, 'utf8');
|
|
142
|
-
// Single-quoted variable references inside the heredoc are intentional:
|
|
143
|
-
// they expand at bash runtime (inside the terminal), not at Node write time.
|
|
144
|
-
fs.writeFileSync(handle.scriptFile, `#!/usr/bin/env bash
|
|
145
|
-
# Note: this script is invoked via "bash -i" so ~/.bashrc is sourced automatically.
|
|
146
|
-
set -uo pipefail
|
|
147
|
-
|
|
148
|
-
PROMPT_FILE='${handle.promptFile}'
|
|
149
|
-
STATUS_FILE='${handle.statusFile}'
|
|
150
|
-
LOG_FILE='${handle.logFile}'
|
|
151
|
-
CLAUDE='${claudePath}'
|
|
152
|
-
REPO='${this.repo}'
|
|
153
|
-
|
|
154
|
-
EXIT_CODE=0
|
|
155
|
-
|
|
156
|
-
# This trap fires for ANY exit — clean, crashed, SIGTERM, window close, etc.
|
|
157
|
-
on_exit() {
|
|
158
|
-
local last=$?
|
|
159
|
-
# If EXIT_CODE is still 0 but the shell caught a signal, record the signal exit
|
|
160
|
-
[ "$last" -ne 0 ] && [ "$EXIT_CODE" -eq 0 ] && EXIT_CODE=$last
|
|
161
|
-
printf '{"exitCode":%d,"timestamp":%d}' "$EXIT_CODE" "$(date +%s)" > "$STATUS_FILE" 2>/dev/null || true
|
|
162
|
-
}
|
|
163
|
-
trap on_exit EXIT
|
|
164
|
-
|
|
165
|
-
cd "$REPO"
|
|
166
|
-
|
|
167
|
-
"$CLAUDE" --dangerously-skip-permissions "$(cat "$PROMPT_FILE")" 2>&1 | tee "$LOG_FILE" || EXIT_CODE=$?
|
|
168
|
-
|
|
169
|
-
echo ""
|
|
170
|
-
echo "────────────────────────────────────────────"
|
|
171
|
-
if [ "$EXIT_CODE" -eq 0 ]; then
|
|
172
|
-
echo " Claude fix finished — press Enter to close"
|
|
173
|
-
else
|
|
174
|
-
echo " Claude exited with code $EXIT_CODE — press Enter to close"
|
|
175
|
-
fi
|
|
176
|
-
echo "────────────────────────────────────────────"
|
|
177
|
-
read -r || true`, 'utf8');
|
|
178
|
-
fs.chmodSync(handle.scriptFile, 0o755);
|
|
179
|
-
}
|
|
180
|
-
catch {
|
|
181
|
-
return false;
|
|
182
|
-
}
|
|
183
|
-
const opened = this.isWSL()
|
|
184
|
-
? this.tryOpenWSL(handle.scriptFile)
|
|
185
|
-
: this.tryOpenLinux(handle.scriptFile);
|
|
186
|
-
return opened;
|
|
187
|
-
}
|
|
188
|
-
// ── Completion polling ─────────────────────────────────────────────────────
|
|
189
|
-
/**
|
|
190
|
-
* Polls until one of four terminal conditions is met:
|
|
191
|
-
*
|
|
192
|
-
* 1. Status file appears with exitCode 0 → Claude ran to completion
|
|
193
|
-
* 2. Status file appears with exitCode ≠ 0 → Claude crashed / window closed → retry
|
|
194
|
-
* 3. Rating crosses threshold while Claude is still running → early success
|
|
195
|
-
* 4. MAX_WAIT elapsed with no status file → Claude hung / too slow → retry
|
|
196
|
-
*/
|
|
197
|
-
async waitForCompletion(handle, originalAnalysis, ratingBefore, startTime) {
|
|
198
|
-
let elapsed = 0;
|
|
199
|
-
let lastRating = ratingBefore;
|
|
200
|
-
while (elapsed < MAX_WAIT) {
|
|
201
|
-
await this.sleep(POLL_INTERVAL);
|
|
202
|
-
elapsed += POLL_INTERVAL;
|
|
203
|
-
const status = this.readStatus(handle.statusFile);
|
|
204
|
-
const current = await this.reanalyze();
|
|
205
|
-
const currentRating = current?.rating ?? lastRating;
|
|
206
|
-
lastRating = currentRating;
|
|
207
|
-
// ── Case 1 & 2: Claude exited (status file written by trap) ────────────
|
|
208
|
-
if (status !== null) {
|
|
209
|
-
const finalRating = currentRating;
|
|
210
|
-
const finalViolations = current?.violations.length ?? originalAnalysis.violations.length;
|
|
211
|
-
const violationsFixed = Math.max(0, originalAnalysis.violations.length - finalViolations);
|
|
212
|
-
if (status.exitCode !== 0) {
|
|
213
|
-
// Abnormal exit (crash, window closed, SIGTERM) — worth retrying
|
|
214
|
-
return {
|
|
215
|
-
success: false,
|
|
216
|
-
newRating: finalRating,
|
|
217
|
-
ratingBefore,
|
|
218
|
-
violationsRemaining: finalViolations,
|
|
219
|
-
violationsFixed,
|
|
220
|
-
durationMs: Date.now() - startTime,
|
|
221
|
-
attemptNumber: 1,
|
|
222
|
-
fixSummary: `Claude exited abnormally (code ${status.exitCode})`,
|
|
223
|
-
error: `Terminal closed or Claude crashed (exit ${status.exitCode})`,
|
|
224
|
-
shouldRetry: true,
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
// Clean exit — Claude ran to completion
|
|
228
|
-
const success = finalRating >= this.threshold;
|
|
229
|
-
return {
|
|
230
|
-
success,
|
|
231
|
-
newRating: finalRating,
|
|
232
|
-
ratingBefore,
|
|
233
|
-
violationsRemaining: finalViolations,
|
|
234
|
-
violationsFixed,
|
|
235
|
-
durationMs: Date.now() - startTime,
|
|
236
|
-
attemptNumber: 1,
|
|
237
|
-
fixSummary: success
|
|
238
|
-
? `Rating improved from ${ratingBefore} to ${finalRating}`
|
|
239
|
-
: `Claude finished but rating ${finalRating} is still below threshold ${this.threshold}`,
|
|
240
|
-
error: success ? undefined : 'Below threshold after Claude finished',
|
|
241
|
-
// Claude cleanly finished but couldn't reach threshold — retrying
|
|
242
|
-
// the same file automatically is unlikely to help without human review
|
|
243
|
-
shouldRetry: false,
|
|
244
|
-
workerOutput: this.readLog(handle.logFile),
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
|
-
// ── Case 3: threshold met while Claude is still running ─────────────────
|
|
248
|
-
if (currentRating >= this.threshold) {
|
|
249
|
-
const finalViolations = current?.violations.length ?? 0;
|
|
250
|
-
return {
|
|
251
|
-
success: true,
|
|
252
|
-
newRating: currentRating,
|
|
253
|
-
ratingBefore,
|
|
254
|
-
violationsRemaining: finalViolations,
|
|
255
|
-
violationsFixed: Math.max(0, originalAnalysis.violations.length - finalViolations),
|
|
256
|
-
durationMs: Date.now() - startTime,
|
|
257
|
-
attemptNumber: 1,
|
|
258
|
-
fixSummary: `Threshold met mid-session: rating ${ratingBefore} → ${currentRating}`,
|
|
259
|
-
shouldRetry: false,
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
// ── Case 4: timeout — Claude never signaled completion ───────────────────
|
|
264
|
-
const final = await this.reanalyze();
|
|
265
|
-
const finalRating = final?.rating ?? lastRating;
|
|
266
|
-
return {
|
|
267
|
-
success: finalRating >= this.threshold,
|
|
268
|
-
newRating: finalRating,
|
|
269
|
-
ratingBefore,
|
|
270
|
-
violationsRemaining: final?.violations.length ?? originalAnalysis.violations.length,
|
|
271
|
-
violationsFixed: Math.max(0, originalAnalysis.violations.length - (final?.violations.length ?? 0)),
|
|
272
|
-
durationMs: Date.now() - startTime,
|
|
273
|
-
attemptNumber: 1,
|
|
274
|
-
fixSummary: `Timed out after ${MAX_WAIT / 1000}s. Final rating: ${finalRating}`,
|
|
275
|
-
error: finalRating >= this.threshold ? undefined : 'Timed out without reaching threshold',
|
|
276
|
-
shouldRetry: finalRating < this.threshold,
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
readStatus(statusFile) {
|
|
280
|
-
try {
|
|
281
|
-
if (!fs.existsSync(statusFile))
|
|
282
|
-
return null;
|
|
283
|
-
return JSON.parse(fs.readFileSync(statusFile, 'utf8'));
|
|
284
|
-
}
|
|
285
|
-
catch {
|
|
286
|
-
return null;
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
readLog(logFile) {
|
|
290
|
-
try {
|
|
291
|
-
return fs.existsSync(logFile) ? fs.readFileSync(logFile, 'utf8') : undefined;
|
|
292
|
-
}
|
|
293
|
-
catch {
|
|
294
|
-
return undefined;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
// ── Terminal openers ───────────────────────────────────────────────────────
|
|
298
|
-
tryOpenWSL(scriptPath) {
|
|
299
|
-
// Strategy 1: cmd.exe /c start — opens a new CMD window (most reliable on WSL)
|
|
300
|
-
try {
|
|
301
|
-
(0, child_process_1.spawn)('cmd.exe', ['/c', 'start', '', 'cmd', '/k', 'wsl.exe', 'bash', '-i', scriptPath], { detached: true, stdio: 'ignore' }).unref();
|
|
302
|
-
return true;
|
|
303
|
-
}
|
|
304
|
-
catch { /* cmd.exe not available */ }
|
|
305
|
-
// Strategy 2: Windows Terminal (wt.exe) — best UX on Win11 / Win10 if available
|
|
306
|
-
try {
|
|
307
|
-
(0, child_process_1.execSync)(`command -v wt.exe 2>/dev/null`, { timeout: 1000 });
|
|
308
|
-
(0, child_process_1.spawn)('wt.exe', ['-w', '0', 'nt', '--', 'wsl.exe', 'bash', '-i', scriptPath], { detached: true, stdio: 'ignore' }).unref();
|
|
309
|
-
return true;
|
|
310
|
-
}
|
|
311
|
-
catch { /* wt.exe not available */ }
|
|
312
|
-
// Strategy 3: powershell Start-Process (fallback)
|
|
313
|
-
try {
|
|
314
|
-
(0, child_process_1.spawn)('powershell.exe', ['-NoProfile', '-Command',
|
|
315
|
-
`Start-Process cmd -ArgumentList '/k wsl.exe bash -i \\"${scriptPath}\\"'`], { detached: true, stdio: 'ignore' }).unref();
|
|
316
|
-
return true;
|
|
317
|
-
}
|
|
318
|
-
catch { /* powershell.exe not available */ }
|
|
319
|
-
return false;
|
|
320
|
-
}
|
|
321
|
-
tryOpenLinux(scriptPath) {
|
|
322
|
-
const terminals = [
|
|
323
|
-
['gnome-terminal', ['--', 'bash', '-i', scriptPath]],
|
|
324
|
-
['konsole', ['--hold', '-e', 'bash', '-i', scriptPath]],
|
|
325
|
-
['xterm', ['-e', `bash -i "${scriptPath}"`]],
|
|
326
|
-
['x-terminal-emulator', ['-e', `bash -i "${scriptPath}"`]],
|
|
327
|
-
];
|
|
328
|
-
for (const [bin, args] of terminals) {
|
|
329
|
-
try {
|
|
330
|
-
(0, child_process_1.execSync)(`command -v ${bin} 2>/dev/null`, { timeout: 1000 });
|
|
331
|
-
(0, child_process_1.spawn)(bin, args, { detached: true, stdio: 'ignore' }).unref();
|
|
332
|
-
return true;
|
|
333
|
-
}
|
|
334
|
-
catch { /* not found, try next */ }
|
|
335
|
-
}
|
|
336
|
-
// Last resort: spawn bash without a new window (headless CI / no display)
|
|
337
|
-
try {
|
|
338
|
-
(0, child_process_1.spawn)('bash', ['-i', scriptPath], { detached: true, stdio: 'ignore' }).unref();
|
|
339
|
-
return true;
|
|
340
|
-
}
|
|
341
|
-
catch {
|
|
342
|
-
return false;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
// ── Utilities ──────────────────────────────────────────────────────────────
|
|
346
|
-
resolveClaudePath() {
|
|
347
|
-
const candidates = [
|
|
348
|
-
'claude',
|
|
349
|
-
'/home/mohantn/.local/bin/claude',
|
|
350
|
-
'/usr/local/bin/claude',
|
|
351
|
-
`${os.homedir()}/.npm-global/bin/claude`,
|
|
352
|
-
`${os.homedir()}/.npm-packages/bin/claude`,
|
|
353
|
-
];
|
|
354
|
-
for (const c of candidates) {
|
|
355
|
-
try {
|
|
356
|
-
if (fs.existsSync(c))
|
|
357
|
-
return c;
|
|
358
|
-
}
|
|
359
|
-
catch { /* ignore */ }
|
|
360
|
-
}
|
|
361
|
-
try {
|
|
362
|
-
const resolved = (0, child_process_1.execSync)('which claude 2>/dev/null', { encoding: 'utf8', timeout: 2000 }).trim();
|
|
363
|
-
if (resolved)
|
|
364
|
-
return resolved;
|
|
365
|
-
}
|
|
366
|
-
catch { /* ignore */ }
|
|
367
|
-
return 'claude';
|
|
368
|
-
}
|
|
369
|
-
isWSL() {
|
|
370
|
-
if (process.env['WSL_DISTRO_NAME'])
|
|
371
|
-
return true;
|
|
372
|
-
try {
|
|
373
|
-
const v = fs.readFileSync('/proc/version', 'utf8').toLowerCase();
|
|
374
|
-
return v.includes('microsoft') || v.includes('wsl');
|
|
375
|
-
}
|
|
376
|
-
catch {
|
|
377
|
-
return false;
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
async fetchAnalysis() {
|
|
381
|
-
try {
|
|
382
|
-
const url = `${VIZ_API}/api/file-detail?file=${encodeURIComponent(this.filePath)}&repo=${encodeURIComponent(this.repo)}`;
|
|
383
|
-
const res = await fetch(url);
|
|
384
|
-
if (!res.ok)
|
|
385
|
-
return null;
|
|
386
|
-
const data = await res.json();
|
|
387
|
-
return data.analysis ?? null;
|
|
388
|
-
}
|
|
389
|
-
catch {
|
|
390
|
-
return null;
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
async reanalyze() {
|
|
394
|
-
try {
|
|
395
|
-
const res = await fetch(`${DAEMON_IPC}/analyze`, {
|
|
396
|
-
method: 'POST',
|
|
397
|
-
headers: { 'Content-Type': 'application/json' },
|
|
398
|
-
body: JSON.stringify({ filePath: this.filePath, repoRoot: this.repo }),
|
|
399
|
-
});
|
|
400
|
-
if (!res.ok)
|
|
401
|
-
return null;
|
|
402
|
-
const data = await res.json();
|
|
403
|
-
return data.analysis ?? null;
|
|
404
|
-
}
|
|
405
|
-
catch {
|
|
406
|
-
return null;
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
sleep(ms) {
|
|
410
|
-
return new Promise(r => setTimeout(r, ms));
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
exports.FixWorker = FixWorker;
|
|
414
|
-
//# sourceMappingURL=fix-worker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fix-worker.js","sourceRoot":"","sources":["../../src/quality-loop/fix-worker.ts"],"names":[],"mappings":"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"}
|