code-auditor-mcp 3.7.0 → 3.8.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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +43 -1
- package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.js +122 -43
- package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts +2 -2
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +6 -7
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -1
- package/dist/analyzers/ruleRegistry.d.ts.map +1 -1
- package/dist/analyzers/ruleRegistry.js +19 -18
- package/dist/analyzers/ruleRegistry.js.map +1 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +9 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js +63 -44
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +76 -28
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +73 -13
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +12 -2
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +30 -18
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts +2 -8
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js +54 -45
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/functionConcerns.d.ts +9 -4
- package/dist/analyzers/universal/functionConcerns.d.ts.map +1 -1
- package/dist/analyzers/universal/functionConcerns.js +25 -11
- package/dist/analyzers/universal/functionConcerns.js.map +1 -1
- package/dist/analyzers/universal/schema/codeAnalysis.js +4 -4
- package/dist/analyzers/universal/schema/codeAnalysis.js.map +1 -1
- package/dist/analyzers/universal/schema/jsonSchema.js +124 -11
- package/dist/analyzers/universal/schema/jsonSchema.js.map +1 -1
- package/dist/auditRouter.d.ts.map +1 -1
- package/dist/auditRouter.js +4 -6
- package/dist/auditRouter.js.map +1 -1
- package/dist/auditRunner.js +1 -1
- package/dist/auditRunner.js.map +1 -1
- package/dist/cli.js +284 -75
- package/dist/cli.js.map +1 -1
- package/dist/config/configLoader.d.ts.map +1 -1
- package/dist/config/configLoader.js +23 -0
- package/dist/config/configLoader.js.map +1 -1
- package/dist/config/defaults.d.ts +3 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +30 -8
- package/dist/config/defaults.js.map +1 -1
- package/dist/conventions/conventionMiner.d.ts +18 -3
- package/dist/conventions/conventionMiner.d.ts.map +1 -1
- package/dist/conventions/conventionMiner.js +130 -12
- package/dist/conventions/conventionMiner.js.map +1 -1
- package/dist/daemon/core.d.ts +128 -0
- package/dist/daemon/core.d.ts.map +1 -0
- package/dist/daemon/core.js +700 -0
- package/dist/daemon/core.js.map +1 -0
- package/dist/daemon/lspServer.d.ts +51 -0
- package/dist/daemon/lspServer.d.ts.map +1 -0
- package/dist/daemon/lspServer.js +168 -0
- package/dist/daemon/lspServer.js.map +1 -0
- package/dist/daemon/main.d.ts +34 -0
- package/dist/daemon/main.d.ts.map +1 -0
- package/dist/daemon/main.js +147 -0
- package/dist/daemon/main.js.map +1 -0
- package/dist/daemon/resolve.d.ts +41 -0
- package/dist/daemon/resolve.d.ts.map +1 -0
- package/dist/daemon/resolve.js +90 -0
- package/dist/daemon/resolve.js.map +1 -0
- package/dist/daemon/socketClient.d.ts +21 -0
- package/dist/daemon/socketClient.d.ts.map +1 -0
- package/dist/daemon/socketClient.js +60 -0
- package/dist/daemon/socketClient.js.map +1 -0
- package/dist/daemon/socketServer.d.ts +33 -0
- package/dist/daemon/socketServer.d.ts.map +1 -0
- package/dist/daemon/socketServer.js +106 -0
- package/dist/daemon/socketServer.js.map +1 -0
- package/dist/daemon/types.d.ts +78 -0
- package/dist/daemon/types.d.ts.map +1 -0
- package/dist/daemon/types.js +10 -0
- package/dist/daemon/types.js.map +1 -0
- package/dist/dataPaths.d.ts +21 -0
- package/dist/dataPaths.d.ts.map +1 -1
- package/dist/dataPaths.js +27 -0
- package/dist/dataPaths.js.map +1 -1
- package/dist/hooks/core.d.ts.map +1 -1
- package/dist/hooks/core.js +21 -4
- package/dist/hooks/core.js.map +1 -1
- package/dist/languages/RuntimeManager.js +10 -0
- package/dist/languages/RuntimeManager.js.map +1 -1
- package/dist/languages/go/analyzer +0 -0
- package/dist/languages/go/analyzer-src/analyzer.go +166 -35
- package/dist/languages/go/analyzer-src/solid.go +80 -172
- package/dist/languages/go/analyzer-src/types.go +18 -18
- package/dist/ledger.d.ts +1 -1
- package/dist/ledger.d.ts.map +1 -1
- package/dist/ledger.js +3 -3
- package/dist/ledger.js.map +1 -1
- package/dist/mcpAuditJobs.js +1 -1
- package/dist/mcpAuditJobs.js.map +1 -1
- package/dist/nextFileIncremental.d.ts +9 -3
- package/dist/nextFileIncremental.d.ts.map +1 -1
- package/dist/nextFileIncremental.js +32 -6
- package/dist/nextFileIncremental.js.map +1 -1
- package/dist/pipeline.d.ts +26 -0
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +86 -10
- package/dist/pipeline.js.map +1 -1
- package/dist/pipelineAdapters.d.ts +1 -1
- package/dist/pipelineAdapters.js +1 -1
- package/dist/reporting/csvReportGenerator.js +1 -1
- package/dist/ruleAliases.d.ts.map +1 -1
- package/dist/ruleAliases.js +41 -2
- package/dist/ruleAliases.js.map +1 -1
- package/dist/types.d.ts +23 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +5 -2
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/skills/code-auditor/SKILL.md +6 -6
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec 50 — Face B client: connect, send one request, read one response.
|
|
3
|
+
*
|
|
4
|
+
* Used by the resolution layer (`resolve.ts`) to probe a daemon and, when it is
|
|
5
|
+
* ready, read findings/diagnostics. A probe that cannot connect (ENOENT — no
|
|
6
|
+
* socket file — or ECONNREFUSED — a half-dead daemon) returns `null`, which the
|
|
7
|
+
* caller maps to "no daemon → run in-process" (R2).
|
|
8
|
+
*/
|
|
9
|
+
import type { SocketRequest, SocketResponse } from './types.js';
|
|
10
|
+
export interface SocketClientOptions {
|
|
11
|
+
socketPath: string;
|
|
12
|
+
timeoutMs: number;
|
|
13
|
+
}
|
|
14
|
+
/** True if a live daemon is listening at `socketPath`. */
|
|
15
|
+
export declare function isDaemonListening(socketPath: string, timeoutMs?: number): Promise<boolean>;
|
|
16
|
+
/**
|
|
17
|
+
* Send a single request/response exchange. Resolves with the parsed response, or
|
|
18
|
+
* `null` when the daemon cannot be reached (so the caller falls back in-process).
|
|
19
|
+
*/
|
|
20
|
+
export declare function sendSocketRequest(socketPath: string, request: SocketRequest, timeoutMs?: number): Promise<SocketResponse | null>;
|
|
21
|
+
//# sourceMappingURL=socketClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socketClient.d.ts","sourceRoot":"","sources":["../../src/daemon/socketClient.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAWvF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,aAAa,EACtB,SAAS,SAAO,GACf,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA+BhC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec 50 — Face B client: connect, send one request, read one response.
|
|
3
|
+
*
|
|
4
|
+
* Used by the resolution layer (`resolve.ts`) to probe a daemon and, when it is
|
|
5
|
+
* ready, read findings/diagnostics. A probe that cannot connect (ENOENT — no
|
|
6
|
+
* socket file — or ECONNREFUSED — a half-dead daemon) returns `null`, which the
|
|
7
|
+
* caller maps to "no daemon → run in-process" (R2).
|
|
8
|
+
*/
|
|
9
|
+
import { connect } from 'node:net';
|
|
10
|
+
/** True if a live daemon is listening at `socketPath`. */
|
|
11
|
+
export function isDaemonListening(socketPath, timeoutMs = 500) {
|
|
12
|
+
return new Promise((resolve) => {
|
|
13
|
+
const sock = connect(socketPath);
|
|
14
|
+
const done = (v) => {
|
|
15
|
+
sock.destroy();
|
|
16
|
+
resolve(v);
|
|
17
|
+
};
|
|
18
|
+
sock.once('connect', () => done(true));
|
|
19
|
+
sock.once('error', () => done(false));
|
|
20
|
+
sock.setTimeout(timeoutMs, () => done(false));
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Send a single request/response exchange. Resolves with the parsed response, or
|
|
25
|
+
* `null` when the daemon cannot be reached (so the caller falls back in-process).
|
|
26
|
+
*/
|
|
27
|
+
export function sendSocketRequest(socketPath, request, timeoutMs = 2000) {
|
|
28
|
+
return new Promise((resolve) => {
|
|
29
|
+
const sock = connect(socketPath);
|
|
30
|
+
let buffer = '';
|
|
31
|
+
let settled = false;
|
|
32
|
+
const finish = (res) => {
|
|
33
|
+
if (settled)
|
|
34
|
+
return;
|
|
35
|
+
settled = true;
|
|
36
|
+
sock.destroy();
|
|
37
|
+
resolve(res);
|
|
38
|
+
};
|
|
39
|
+
sock.setEncoding('utf8');
|
|
40
|
+
sock.setTimeout(timeoutMs, () => finish(null));
|
|
41
|
+
sock.once('error', () => finish(null));
|
|
42
|
+
sock.on('data', (chunk) => {
|
|
43
|
+
buffer += chunk;
|
|
44
|
+
const idx = buffer.indexOf('\n');
|
|
45
|
+
if (idx < 0)
|
|
46
|
+
return;
|
|
47
|
+
const line = buffer.slice(0, idx).trim();
|
|
48
|
+
try {
|
|
49
|
+
finish(JSON.parse(line));
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
finish(null);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
sock.once('connect', () => {
|
|
56
|
+
sock.write(JSON.stringify(request) + '\n');
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=socketClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socketClient.js","sourceRoot":"","sources":["../../src/daemon/socketClient.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAQnC,0DAA0D;AAC1D,MAAM,UAAU,iBAAiB,CAAC,UAAkB,EAAE,SAAS,GAAG,GAAG;IACnE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,CAAC,CAAU,EAAE,EAAE;YAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,CAAC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,UAAkB,EAClB,OAAsB,EACtB,SAAS,GAAG,IAAI;IAEhB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACjC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,MAAM,GAAG,CAAC,GAA0B,EAAE,EAAE;YAC5C,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YAChC,MAAM,IAAI,KAAK,CAAC;YAChB,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,GAAG,GAAG,CAAC;gBAAE,OAAO;YACpB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC,CAAC;YAC7C,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,IAAI,CAAC,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YACxB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec 50 — Face B: the Unix-domain-socket request/response server.
|
|
3
|
+
*
|
|
4
|
+
* Agents and the CLI are not LSP clients; they shell out to a binary and need a
|
|
5
|
+
* plain request/response face. This is it: a Unix socket at
|
|
6
|
+
* `resolveDaemonSocketPath(root)`, speaking newline-delimited JSON.
|
|
7
|
+
*
|
|
8
|
+
* This adapter contains no analysis — it only translates `SocketRequest` method
|
|
9
|
+
* names to `DaemonCore` calls and serializes the result (R1: the boundary is
|
|
10
|
+
* explicit so the two faces cannot drift).
|
|
11
|
+
*/
|
|
12
|
+
import type { DaemonCore } from './core.js';
|
|
13
|
+
export interface SocketFaceOptions {
|
|
14
|
+
core: DaemonCore;
|
|
15
|
+
socketPath: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class SocketFace {
|
|
18
|
+
private server;
|
|
19
|
+
readonly socketPath: string;
|
|
20
|
+
private readonly core;
|
|
21
|
+
constructor(options: SocketFaceOptions);
|
|
22
|
+
/**
|
|
23
|
+
* Remove a stale socket file left by a crashed predecessor, then listen.
|
|
24
|
+
* Callers must already have confirmed no *live* daemon owns the socket
|
|
25
|
+
* (via `isDaemonListening`) before binding, or the live daemon's socket is
|
|
26
|
+
* stolen out from under it.
|
|
27
|
+
*/
|
|
28
|
+
start(): Promise<void>;
|
|
29
|
+
private handleConnection;
|
|
30
|
+
private dispatch;
|
|
31
|
+
stop(): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=socketServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socketServer.d.ts","sourceRoot":"","sources":["../../src/daemon/socketServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAG5C,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAuB;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAElC,YAAY,OAAO,EAAE,iBAAiB,EAGrC;IAED;;;;;OAKG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAY3B;IAED,OAAO,CAAC,gBAAgB;YA0BV,QAAQ;IA8BhB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAM1B;CACF"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec 50 — Face B: the Unix-domain-socket request/response server.
|
|
3
|
+
*
|
|
4
|
+
* Agents and the CLI are not LSP clients; they shell out to a binary and need a
|
|
5
|
+
* plain request/response face. This is it: a Unix socket at
|
|
6
|
+
* `resolveDaemonSocketPath(root)`, speaking newline-delimited JSON.
|
|
7
|
+
*
|
|
8
|
+
* This adapter contains no analysis — it only translates `SocketRequest` method
|
|
9
|
+
* names to `DaemonCore` calls and serializes the result (R1: the boundary is
|
|
10
|
+
* explicit so the two faces cannot drift).
|
|
11
|
+
*/
|
|
12
|
+
import { createServer } from 'node:net';
|
|
13
|
+
import { rmSync, existsSync, mkdirSync } from 'node:fs';
|
|
14
|
+
import path from 'node:path';
|
|
15
|
+
export class SocketFace {
|
|
16
|
+
server = null;
|
|
17
|
+
socketPath;
|
|
18
|
+
core;
|
|
19
|
+
constructor(options) {
|
|
20
|
+
this.core = options.core;
|
|
21
|
+
this.socketPath = options.socketPath;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Remove a stale socket file left by a crashed predecessor, then listen.
|
|
25
|
+
* Callers must already have confirmed no *live* daemon owns the socket
|
|
26
|
+
* (via `isDaemonListening`) before binding, or the live daemon's socket is
|
|
27
|
+
* stolen out from under it.
|
|
28
|
+
*/
|
|
29
|
+
async start() {
|
|
30
|
+
if (existsSync(this.socketPath))
|
|
31
|
+
rmSync(this.socketPath, { force: true });
|
|
32
|
+
mkdirSync(path.dirname(this.socketPath), { recursive: true });
|
|
33
|
+
this.server = createServer((socket) => this.handleConnection(socket));
|
|
34
|
+
await new Promise((resolve, reject) => {
|
|
35
|
+
this.server.once('error', reject);
|
|
36
|
+
this.server.listen(this.socketPath, () => {
|
|
37
|
+
this.server.off('error', reject);
|
|
38
|
+
resolve();
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
handleConnection(socket) {
|
|
43
|
+
this.core.registerConnection();
|
|
44
|
+
// A peer that disconnects mid-response (the client times out, or destroys
|
|
45
|
+
// its socket right after reading the first newline) will EPIPE the next
|
|
46
|
+
// `write`. Without an `error` listener that EPIPE surfaces as an unhandled
|
|
47
|
+
// 'error' event and crashes the whole daemon. Swallow it — 'close' still
|
|
48
|
+
// fires and unregisters the connection.
|
|
49
|
+
socket.on('error', () => { });
|
|
50
|
+
socket.on('close', () => this.core.unregisterConnection());
|
|
51
|
+
let buffer = '';
|
|
52
|
+
socket.setEncoding('utf8');
|
|
53
|
+
socket.on('data', (chunk) => {
|
|
54
|
+
buffer += chunk;
|
|
55
|
+
let idx;
|
|
56
|
+
while ((idx = buffer.indexOf('\n')) >= 0) {
|
|
57
|
+
const line = buffer.slice(0, idx).trim();
|
|
58
|
+
buffer = buffer.slice(idx + 1);
|
|
59
|
+
if (!line)
|
|
60
|
+
continue;
|
|
61
|
+
void this.dispatch(line).then((res) => {
|
|
62
|
+
if (!socket.destroyed && socket.writable)
|
|
63
|
+
socket.write(JSON.stringify(res) + '\n');
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async dispatch(line) {
|
|
69
|
+
let req;
|
|
70
|
+
try {
|
|
71
|
+
req = JSON.parse(line);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return { id: -1, ok: false, error: 'invalid JSON request' };
|
|
75
|
+
}
|
|
76
|
+
const respond = (result) => ({ id: req.id, ok: true, result });
|
|
77
|
+
const fail = (error) => ({ id: req.id, ok: false, error });
|
|
78
|
+
try {
|
|
79
|
+
switch (req.method) {
|
|
80
|
+
case 'status':
|
|
81
|
+
return respond(this.core.getState());
|
|
82
|
+
case 'diagnostics':
|
|
83
|
+
return respond(this.core.getDiagnostics(req.params?.files ?? []));
|
|
84
|
+
case 'findings':
|
|
85
|
+
return respond(this.core.getFindings());
|
|
86
|
+
case 'shutdown':
|
|
87
|
+
void this.core.shutdown('socket request');
|
|
88
|
+
return respond({ ok: true });
|
|
89
|
+
default:
|
|
90
|
+
return fail(`unknown method: ${String(req?.method)}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
return fail(e instanceof Error ? e.message : String(e));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async stop() {
|
|
98
|
+
if (this.server) {
|
|
99
|
+
await new Promise((resolve) => this.server.close(() => resolve()));
|
|
100
|
+
this.server = null;
|
|
101
|
+
}
|
|
102
|
+
if (existsSync(this.socketPath))
|
|
103
|
+
rmSync(this.socketPath, { force: true });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=socketServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socketServer.js","sourceRoot":"","sources":["../../src/daemon/socketServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec 50 — shared daemon types.
|
|
3
|
+
*
|
|
4
|
+
* The daemon's core owns the store + pipeline; the LSP and Unix-socket faces are
|
|
5
|
+
* thin adapters over it (R1). These types are the single contract both faces and
|
|
6
|
+
* the resolution layer (`resolve.ts`) consume, so nothing analysis-related leaks
|
|
7
|
+
* into an adapter.
|
|
8
|
+
*/
|
|
9
|
+
import type { Violation } from '../types.js';
|
|
10
|
+
/** Daemon lifecycle state (R1/R3). */
|
|
11
|
+
export type DaemonStatus = 'starting' | 'indexing' | 'ready' | 'reindexing' | 'shutting-down';
|
|
12
|
+
/** Seed phases, in completion order. `retryAfterMs` prices each on its own rate. */
|
|
13
|
+
export type DaemonSeedPhase = 'files' | 'reducers' | 'derived' | 'finalize';
|
|
14
|
+
export interface DaemonProgress {
|
|
15
|
+
filesIndexed: number;
|
|
16
|
+
filesTotal: number;
|
|
17
|
+
/** Source files (have a LanguageAdapter) — parsed first, priced at the source rate. */
|
|
18
|
+
sourceTotal?: number;
|
|
19
|
+
/** Orphan files (no adapter) — read last, priced at the orphan rate. */
|
|
20
|
+
orphanTotal?: number;
|
|
21
|
+
/** Which seed phase the daemon is in — visible so a caller watches phase, not a frozen file count. */
|
|
22
|
+
phase: DaemonSeedPhase;
|
|
23
|
+
/** Progress within the current phase (e.g. reducer 2/4). */
|
|
24
|
+
phaseCurrent?: number;
|
|
25
|
+
phaseTotal?: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The answer every read surface gets for "what is the daemon's state" (R3).
|
|
29
|
+
*
|
|
30
|
+
* `retryAfterMs` is derived from observed progress across the seed's *whole*
|
|
31
|
+
* lifetime — files, corpus reducers, derived reducers, and finalization — so it
|
|
32
|
+
* covers time-to-ready, not just time-to-finish-files. Each phase is priced on
|
|
33
|
+
* its own observed rate; at a phase boundary (rate not yet observed) the value
|
|
34
|
+
* is clamped conservatively rather than collapsing to "done". When the first
|
|
35
|
+
* files have not yet been indexed, throughput is unknown and `retryAfterMs` is
|
|
36
|
+
* `null` with `throughputUnknown` set, so a client can distinguish "not ready,
|
|
37
|
+
* wait ~N ms" from "not ready, we don't yet know how long" without parsing prose.
|
|
38
|
+
*/
|
|
39
|
+
export interface DaemonState {
|
|
40
|
+
status: DaemonStatus;
|
|
41
|
+
progress?: DaemonProgress;
|
|
42
|
+
retryAfterMs: number | null;
|
|
43
|
+
throughputUnknown: boolean;
|
|
44
|
+
}
|
|
45
|
+
/** Per-file diagnostics (Face A / Face B) — a violation plus its resolved range. */
|
|
46
|
+
export interface DaemonDiagnostic extends Violation {
|
|
47
|
+
/** True when this file's findings could not be validated as current (R4). */
|
|
48
|
+
stale?: boolean;
|
|
49
|
+
}
|
|
50
|
+
export interface DaemonDiagnosticsResult {
|
|
51
|
+
status: DaemonStatus;
|
|
52
|
+
diagnostics: DaemonDiagnostic[];
|
|
53
|
+
/** R4 — files whose recorded hash no longer matches disk; findings not served. */
|
|
54
|
+
staleFiles: string[];
|
|
55
|
+
}
|
|
56
|
+
export interface DaemonFindingsResult {
|
|
57
|
+
status: DaemonStatus;
|
|
58
|
+
violations: Violation[];
|
|
59
|
+
/** R4 — files whose recorded hash no longer matches disk. */
|
|
60
|
+
staleFiles: string[];
|
|
61
|
+
}
|
|
62
|
+
/** Wire protocol for the Unix socket face (Face B). Newline-delimited JSON. */
|
|
63
|
+
export type SocketMethod = 'status' | 'diagnostics' | 'findings' | 'shutdown';
|
|
64
|
+
export interface SocketRequest {
|
|
65
|
+
id: number;
|
|
66
|
+
method: SocketMethod;
|
|
67
|
+
params: {
|
|
68
|
+
/** File paths (absolute or project-relative) for `diagnostics`. */
|
|
69
|
+
files?: string[];
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export interface SocketResponse {
|
|
73
|
+
id: number;
|
|
74
|
+
ok: boolean;
|
|
75
|
+
result?: unknown;
|
|
76
|
+
error?: string;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/daemon/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,sCAAsC;AACtC,MAAM,MAAM,YAAY,GACpB,UAAU,GACV,UAAU,GACV,OAAO,GACP,YAAY,GACZ,eAAe,CAAC;AAEpB,oFAAoF;AACpF,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;AAE5E,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,uFAAuF;IACvF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sGAAsG;IACtG,KAAK,EAAE,eAAe,CAAC;IACvB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,oFAAoF;AACpF,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,6EAA6E;IAC7E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,kFAAkF;IAClF,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,6DAA6D;IAC7D,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,+EAA+E;AAC/E,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,aAAa,GAAG,UAAU,GAAG,UAAU,CAAC;AAE9E,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE;QACN,mEAAmE;QACnE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec 50 — shared daemon types.
|
|
3
|
+
*
|
|
4
|
+
* The daemon's core owns the store + pipeline; the LSP and Unix-socket faces are
|
|
5
|
+
* thin adapters over it (R1). These types are the single contract both faces and
|
|
6
|
+
* the resolution layer (`resolve.ts`) consume, so nothing analysis-related leaks
|
|
7
|
+
* into an adapter.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/daemon/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
package/dist/dataPaths.d.ts
CHANGED
|
@@ -20,4 +20,25 @@
|
|
|
20
20
|
export declare function resolvePersistedIndexPath(projectRoot?: string): string;
|
|
21
21
|
/** Directory that contains `index.db`. Optionally accepts projectRoot for scoped paths. */
|
|
22
22
|
export declare function getPersistedStorageRoot(projectRoot?: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Path of the per-project daemon Unix-domain socket (Spec 50 R5).
|
|
25
|
+
*
|
|
26
|
+
* Derived from the realpath'd project root using the *same* `projectHash` the
|
|
27
|
+
* data directory uses, so the daemon and every read surface (CLI, hook, agent)
|
|
28
|
+
* derive an identical socket path for the same physical project regardless of
|
|
29
|
+
* how it was spelled (`/tmp/foo` vs `/private/tmp/foo`). The socket lives under
|
|
30
|
+
* the OS cache dir rather than next to `index.db` for two reasons: it sidesteps
|
|
31
|
+
* the Unix socket path-length limit (`~104` bytes on macOS, `~108` on Linux) that
|
|
32
|
+
* a deeply nested `node_modules` cache path could exceed, and it avoids the
|
|
33
|
+
* still-lexical local-`node_modules` branch of `resolvePersistedIndexPath`.
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolveDaemonSocketPath(projectRoot: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* Log file for a detached daemon (Spec 50 R5). A detached daemon's stderr is
|
|
38
|
+
* redirected here (mirroring the Spec 41 `--detach` job log) so a background
|
|
39
|
+
* failure is diagnosable rather than silently lost to `/dev/null`. Lives under
|
|
40
|
+
* the OS cache's `logs/` sibling of the socket directory, keyed by the same
|
|
41
|
+
* `projectHash`.
|
|
42
|
+
*/
|
|
43
|
+
export declare function resolveDaemonLogPath(projectRoot: string): string;
|
|
23
44
|
//# sourceMappingURL=dataPaths.d.ts.map
|
package/dist/dataPaths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataPaths.d.ts","sourceRoot":"","sources":["../src/dataPaths.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAuBtE;AAED,2FAA2F;AAC3F,wBAAgB,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpE"}
|
|
1
|
+
{"version":3,"file":"dataPaths.d.ts","sourceRoot":"","sources":["../src/dataPaths.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAuBtE;AAED,2FAA2F;AAC3F,wBAAgB,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGnE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGhE"}
|
package/dist/dataPaths.js
CHANGED
|
@@ -47,6 +47,33 @@ export function resolvePersistedIndexPath(projectRoot) {
|
|
|
47
47
|
export function getPersistedStorageRoot(projectRoot) {
|
|
48
48
|
return path.dirname(resolvePersistedIndexPath(projectRoot));
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Path of the per-project daemon Unix-domain socket (Spec 50 R5).
|
|
52
|
+
*
|
|
53
|
+
* Derived from the realpath'd project root using the *same* `projectHash` the
|
|
54
|
+
* data directory uses, so the daemon and every read surface (CLI, hook, agent)
|
|
55
|
+
* derive an identical socket path for the same physical project regardless of
|
|
56
|
+
* how it was spelled (`/tmp/foo` vs `/private/tmp/foo`). The socket lives under
|
|
57
|
+
* the OS cache dir rather than next to `index.db` for two reasons: it sidesteps
|
|
58
|
+
* the Unix socket path-length limit (`~104` bytes on macOS, `~108` on Linux) that
|
|
59
|
+
* a deeply nested `node_modules` cache path could exceed, and it avoids the
|
|
60
|
+
* still-lexical local-`node_modules` branch of `resolvePersistedIndexPath`.
|
|
61
|
+
*/
|
|
62
|
+
export function resolveDaemonSocketPath(projectRoot) {
|
|
63
|
+
const dir = path.join(getFallbackCacheRoot(), 'sockets');
|
|
64
|
+
return path.join(dir, `code-auditor-${projectHash(projectRoot)}.sock`);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Log file for a detached daemon (Spec 50 R5). A detached daemon's stderr is
|
|
68
|
+
* redirected here (mirroring the Spec 41 `--detach` job log) so a background
|
|
69
|
+
* failure is diagnosable rather than silently lost to `/dev/null`. Lives under
|
|
70
|
+
* the OS cache's `logs/` sibling of the socket directory, keyed by the same
|
|
71
|
+
* `projectHash`.
|
|
72
|
+
*/
|
|
73
|
+
export function resolveDaemonLogPath(projectRoot) {
|
|
74
|
+
const dir = path.join(getFallbackCacheRoot(), 'logs');
|
|
75
|
+
return path.join(dir, `code-auditor-${projectHash(projectRoot)}.log`);
|
|
76
|
+
}
|
|
50
77
|
/** Walk up from `start` and return the nearest existing `node_modules` directory, or null. */
|
|
51
78
|
function findNodeModulesDir(start) {
|
|
52
79
|
let dir = path.resolve(start);
|
package/dist/dataPaths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataPaths.js","sourceRoot":"","sources":["../src/dataPaths.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dataPaths.js","sourceRoot":"","sources":["../src/dataPaths.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/hooks/core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CA+BjD;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/hooks/core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CA+BjD;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CA8ClF;AAmCD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,aAAa,EAAE,EAC3B,MAAM,EAAE,QAAQ,GACf,OAAO,CAOT"}
|
package/dist/hooks/core.js
CHANGED
|
@@ -57,8 +57,6 @@ export async function readStdin() {
|
|
|
57
57
|
* This is the shared core — all hook adapters call this.
|
|
58
58
|
*/
|
|
59
59
|
export async function runHookAudit(input) {
|
|
60
|
-
// Initialize parsers (idempotent once loaded)
|
|
61
|
-
await initParsers();
|
|
62
60
|
if (input.filePaths.length === 0) {
|
|
63
61
|
return {
|
|
64
62
|
violations: [],
|
|
@@ -68,6 +66,21 @@ export async function runHookAudit(input) {
|
|
|
68
66
|
}
|
|
69
67
|
// Convert to absolute paths
|
|
70
68
|
const resolvedPaths = [...new Set(input.filePaths.map((f) => resolve(input.projectRoot, f)))];
|
|
69
|
+
// Spec 50 R2 — the gate "looks up" instead of shelling out and waiting. Consult
|
|
70
|
+
// a live daemon first; only trust it when it is `ready` and none of the queried
|
|
71
|
+
// files are stale (R4 — a just-edited file whose re-audit hasn't landed must
|
|
72
|
+
// fall through so the gate never misses a finding). Absent/stale/not-ready all
|
|
73
|
+
// fall through to the in-process path below, byte-identical to before.
|
|
74
|
+
const { resolveDaemon, readDaemonDiagnostics } = await import('../daemon/resolve.js');
|
|
75
|
+
const daemon = await resolveDaemon(input.projectRoot);
|
|
76
|
+
if (daemon.mode === 'ready') {
|
|
77
|
+
const diag = await readDaemonDiagnostics(daemon.socketPath, resolvedPaths);
|
|
78
|
+
if (diag && diag.status === 'ready' && diag.staleFiles.length === 0) {
|
|
79
|
+
return buildHookOutput(diag.diagnostics, resolvedPaths.length);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Initialize parsers (idempotent once loaded)
|
|
83
|
+
await initParsers();
|
|
71
84
|
// Create runner with the resolved scope
|
|
72
85
|
const runner = createAuditRunner({
|
|
73
86
|
projectRoot: input.projectRoot,
|
|
@@ -77,9 +90,13 @@ export async function runHookAudit(input) {
|
|
|
77
90
|
const result = await runner.run();
|
|
78
91
|
// Collect all violations
|
|
79
92
|
const allViolations = Object.values(result.analyzerResults).flatMap((r) => r.violations || []);
|
|
93
|
+
return buildHookOutput(allViolations, result.metadata.filesAnalyzed);
|
|
94
|
+
}
|
|
95
|
+
/** Map raw violations to the hook's output contract and summarize by severity. */
|
|
96
|
+
function buildHookOutput(allViolations, filesAnalyzed) {
|
|
80
97
|
const violations = allViolations.map((v) => ({
|
|
81
98
|
analyzer: v.analyzer || '',
|
|
82
|
-
rule: v.rule
|
|
99
|
+
rule: v.rule,
|
|
83
100
|
severity: v.severity,
|
|
84
101
|
message: v.message,
|
|
85
102
|
file: v.file || '',
|
|
@@ -102,7 +119,7 @@ export async function runHookAudit(input) {
|
|
|
102
119
|
warning: warningCount,
|
|
103
120
|
suggestion: suggestionCount,
|
|
104
121
|
},
|
|
105
|
-
filesAnalyzed
|
|
122
|
+
filesAnalyzed,
|
|
106
123
|
};
|
|
107
124
|
}
|
|
108
125
|
/**
|
package/dist/hooks/core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/hooks/core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAmCpD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,6CAA6C;QAC7C,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,EAAE,CAAC,CAAC;YACZ,OAAO;QACT,CAAC;QAED,MAAM,EAAE,GAAG,eAAe,CAAC;YACzB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,SAAgB;YACxB,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QAEH,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACrB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,qDAAqD;QACrD,UAAU,CAAC,GAAG,EAAE;YACd,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5B,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAqB;IACtD,
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/hooks/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -987,6 +987,16 @@ function parseGoAnalyzerResponse(stdout) {
|
|
|
987
987
|
const result = response.result;
|
|
988
988
|
result.violations = result.violations || [];
|
|
989
989
|
result.indexEntries = result.indexEntries || [];
|
|
990
|
+
// The seam rule-identity invariant. The Go subprocess emits its rule ID under
|
|
991
|
+
// `rule` (the canonical field shared with the TS pipeline); every consumer
|
|
992
|
+
// downstream reads `v.rule` and assumes it is present. A violation without a
|
|
993
|
+
// non-empty `rule` is a seam regression — fail loudly here rather than let a
|
|
994
|
+
// downstream `|| 'unknown'` fallback swallow the mismatch silently.
|
|
995
|
+
for (const v of result.violations) {
|
|
996
|
+
if (!v || typeof v.rule !== 'string' || v.rule.length === 0) {
|
|
997
|
+
throw new Error(`Go analyzer emitted a violation without a canonical rule: ${JSON.stringify(v)}`);
|
|
998
|
+
}
|
|
999
|
+
}
|
|
990
1000
|
return result;
|
|
991
1001
|
}
|
|
992
1002
|
// ---------------------------------------------------------------------------
|