@mohantn/gate-keeper 2.1.1 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +82 -46
  2. package/package.json +1 -1
  3. package/dist/cli/query-repl.d.ts +0 -37
  4. package/dist/cli/query-repl.d.ts.map +0 -1
  5. package/dist/cli/query-repl.js +0 -298
  6. package/dist/cli/query-repl.js.map +0 -1
  7. package/dist/cli/repl-algorithms.d.ts +0 -49
  8. package/dist/cli/repl-algorithms.d.ts.map +0 -1
  9. package/dist/cli/repl-algorithms.js +0 -147
  10. package/dist/cli/repl-algorithms.js.map +0 -1
  11. package/dist/cli/setup-core.d.ts +0 -38
  12. package/dist/cli/setup-core.d.ts.map +0 -1
  13. package/dist/cli/setup-core.js +0 -427
  14. package/dist/cli/setup-core.js.map +0 -1
  15. package/dist/cli/setup.d.ts +0 -25
  16. package/dist/cli/setup.d.ts.map +0 -1
  17. package/dist/cli/setup.js +0 -159
  18. package/dist/cli/setup.js.map +0 -1
  19. package/dist/github/app.d.ts +0 -34
  20. package/dist/github/app.d.ts.map +0 -1
  21. package/dist/github/app.js +0 -261
  22. package/dist/github/app.js.map +0 -1
  23. package/dist/github/commenter.d.ts +0 -67
  24. package/dist/github/commenter.d.ts.map +0 -1
  25. package/dist/github/commenter.js +0 -155
  26. package/dist/github/commenter.js.map +0 -1
  27. package/dist/hooks/git-hooks.d.ts +0 -30
  28. package/dist/hooks/git-hooks.d.ts.map +0 -1
  29. package/dist/hooks/git-hooks.js +0 -179
  30. package/dist/hooks/git-hooks.js.map +0 -1
  31. package/dist/mcp/cache-preload.d.ts +0 -29
  32. package/dist/mcp/cache-preload.d.ts.map +0 -1
  33. package/dist/mcp/cache-preload.js +0 -103
  34. package/dist/mcp/cache-preload.js.map +0 -1
  35. package/dist/mcp/handlers/context.d.ts +0 -25
  36. package/dist/mcp/handlers/context.d.ts.map +0 -1
  37. package/dist/mcp/handlers/context.js +0 -382
  38. package/dist/mcp/handlers/context.js.map +0 -1
  39. package/dist/mcp/handlers/graph-intelligence.d.ts +0 -26
  40. package/dist/mcp/handlers/graph-intelligence.d.ts.map +0 -1
  41. package/dist/mcp/handlers/graph-intelligence.js +0 -371
  42. package/dist/mcp/handlers/graph-intelligence.js.map +0 -1
  43. package/dist/mcp/handlers/graph-query.d.ts +0 -25
  44. package/dist/mcp/handlers/graph-query.d.ts.map +0 -1
  45. package/dist/mcp/handlers/graph-query.js +0 -410
  46. package/dist/mcp/handlers/graph-query.js.map +0 -1
  47. package/dist/mcp/handlers/impact.d.ts +0 -4
  48. package/dist/mcp/handlers/impact.d.ts.map +0 -1
  49. package/dist/mcp/handlers/impact.js +0 -139
  50. package/dist/mcp/handlers/impact.js.map +0 -1
  51. package/dist/mcp/handlers/improvement.d.ts +0 -4
  52. package/dist/mcp/handlers/improvement.d.ts.map +0 -1
  53. package/dist/mcp/handlers/improvement.js +0 -136
  54. package/dist/mcp/handlers/improvement.js.map +0 -1
  55. package/dist/mcp/handlers/platform-installer.d.ts +0 -10
  56. package/dist/mcp/handlers/platform-installer.d.ts.map +0 -1
  57. package/dist/mcp/handlers/platform-installer.js +0 -168
  58. package/dist/mcp/handlers/platform-installer.js.map +0 -1
  59. package/dist/mcp/handlers/pr-review.d.ts +0 -33
  60. package/dist/mcp/handlers/pr-review.d.ts.map +0 -1
  61. package/dist/mcp/handlers/pr-review.js +0 -170
  62. package/dist/mcp/handlers/pr-review.js.map +0 -1
  63. package/dist/mcp/token-tracker.d.ts +0 -47
  64. package/dist/mcp/token-tracker.d.ts.map +0 -1
  65. package/dist/mcp/token-tracker.js +0 -93
  66. package/dist/mcp/token-tracker.js.map +0 -1
  67. package/dist/quality-loop/file-lock.d.ts +0 -12
  68. package/dist/quality-loop/file-lock.d.ts.map +0 -1
  69. package/dist/quality-loop/file-lock.js +0 -38
  70. package/dist/quality-loop/file-lock.js.map +0 -1
  71. package/dist/quality-loop/fix-worker.d.ts +0 -44
  72. package/dist/quality-loop/fix-worker.d.ts.map +0 -1
  73. package/dist/quality-loop/fix-worker.js +0 -414
  74. package/dist/quality-loop/fix-worker.js.map +0 -1
  75. package/dist/quality-loop/orchestrator.d.ts +0 -137
  76. package/dist/quality-loop/orchestrator.d.ts.map +0 -1
  77. package/dist/quality-loop/orchestrator.js +0 -894
  78. package/dist/quality-loop/orchestrator.js.map +0 -1
  79. package/dist/quality-loop/queue-manager.d.ts +0 -45
  80. package/dist/quality-loop/queue-manager.d.ts.map +0 -1
  81. package/dist/quality-loop/queue-manager.js +0 -173
  82. 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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"}