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.
Files changed (121) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +43 -1
  3. package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
  4. package/dist/analyzers/cross-language/SchemaValidator.js +122 -43
  5. package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
  6. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts +2 -2
  7. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +6 -7
  8. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -1
  9. package/dist/analyzers/ruleRegistry.d.ts.map +1 -1
  10. package/dist/analyzers/ruleRegistry.js +19 -18
  11. package/dist/analyzers/ruleRegistry.js.map +1 -1
  12. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts +9 -1
  13. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
  14. package/dist/analyzers/universal/UniversalDRYAnalyzer.js +63 -44
  15. package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
  16. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
  17. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +76 -28
  18. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
  19. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +73 -13
  20. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
  21. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +12 -2
  22. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
  23. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +30 -18
  24. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
  25. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts +2 -8
  26. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -1
  27. package/dist/analyzers/universal/UniversalStylesAnalyzer.js +54 -45
  28. package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -1
  29. package/dist/analyzers/universal/functionConcerns.d.ts +9 -4
  30. package/dist/analyzers/universal/functionConcerns.d.ts.map +1 -1
  31. package/dist/analyzers/universal/functionConcerns.js +25 -11
  32. package/dist/analyzers/universal/functionConcerns.js.map +1 -1
  33. package/dist/analyzers/universal/schema/codeAnalysis.js +4 -4
  34. package/dist/analyzers/universal/schema/codeAnalysis.js.map +1 -1
  35. package/dist/analyzers/universal/schema/jsonSchema.js +124 -11
  36. package/dist/analyzers/universal/schema/jsonSchema.js.map +1 -1
  37. package/dist/auditRouter.d.ts.map +1 -1
  38. package/dist/auditRouter.js +4 -6
  39. package/dist/auditRouter.js.map +1 -1
  40. package/dist/auditRunner.js +1 -1
  41. package/dist/auditRunner.js.map +1 -1
  42. package/dist/cli.js +284 -75
  43. package/dist/cli.js.map +1 -1
  44. package/dist/config/configLoader.d.ts.map +1 -1
  45. package/dist/config/configLoader.js +23 -0
  46. package/dist/config/configLoader.js.map +1 -1
  47. package/dist/config/defaults.d.ts +3 -0
  48. package/dist/config/defaults.d.ts.map +1 -1
  49. package/dist/config/defaults.js +30 -8
  50. package/dist/config/defaults.js.map +1 -1
  51. package/dist/conventions/conventionMiner.d.ts +18 -3
  52. package/dist/conventions/conventionMiner.d.ts.map +1 -1
  53. package/dist/conventions/conventionMiner.js +130 -12
  54. package/dist/conventions/conventionMiner.js.map +1 -1
  55. package/dist/daemon/core.d.ts +128 -0
  56. package/dist/daemon/core.d.ts.map +1 -0
  57. package/dist/daemon/core.js +700 -0
  58. package/dist/daemon/core.js.map +1 -0
  59. package/dist/daemon/lspServer.d.ts +51 -0
  60. package/dist/daemon/lspServer.d.ts.map +1 -0
  61. package/dist/daemon/lspServer.js +168 -0
  62. package/dist/daemon/lspServer.js.map +1 -0
  63. package/dist/daemon/main.d.ts +34 -0
  64. package/dist/daemon/main.d.ts.map +1 -0
  65. package/dist/daemon/main.js +147 -0
  66. package/dist/daemon/main.js.map +1 -0
  67. package/dist/daemon/resolve.d.ts +41 -0
  68. package/dist/daemon/resolve.d.ts.map +1 -0
  69. package/dist/daemon/resolve.js +90 -0
  70. package/dist/daemon/resolve.js.map +1 -0
  71. package/dist/daemon/socketClient.d.ts +21 -0
  72. package/dist/daemon/socketClient.d.ts.map +1 -0
  73. package/dist/daemon/socketClient.js +60 -0
  74. package/dist/daemon/socketClient.js.map +1 -0
  75. package/dist/daemon/socketServer.d.ts +33 -0
  76. package/dist/daemon/socketServer.d.ts.map +1 -0
  77. package/dist/daemon/socketServer.js +106 -0
  78. package/dist/daemon/socketServer.js.map +1 -0
  79. package/dist/daemon/types.d.ts +78 -0
  80. package/dist/daemon/types.d.ts.map +1 -0
  81. package/dist/daemon/types.js +10 -0
  82. package/dist/daemon/types.js.map +1 -0
  83. package/dist/dataPaths.d.ts +21 -0
  84. package/dist/dataPaths.d.ts.map +1 -1
  85. package/dist/dataPaths.js +27 -0
  86. package/dist/dataPaths.js.map +1 -1
  87. package/dist/hooks/core.d.ts.map +1 -1
  88. package/dist/hooks/core.js +21 -4
  89. package/dist/hooks/core.js.map +1 -1
  90. package/dist/languages/RuntimeManager.js +10 -0
  91. package/dist/languages/RuntimeManager.js.map +1 -1
  92. package/dist/languages/go/analyzer +0 -0
  93. package/dist/languages/go/analyzer-src/analyzer.go +166 -35
  94. package/dist/languages/go/analyzer-src/solid.go +80 -172
  95. package/dist/languages/go/analyzer-src/types.go +18 -18
  96. package/dist/ledger.d.ts +1 -1
  97. package/dist/ledger.d.ts.map +1 -1
  98. package/dist/ledger.js +3 -3
  99. package/dist/ledger.js.map +1 -1
  100. package/dist/mcpAuditJobs.js +1 -1
  101. package/dist/mcpAuditJobs.js.map +1 -1
  102. package/dist/nextFileIncremental.d.ts +9 -3
  103. package/dist/nextFileIncremental.d.ts.map +1 -1
  104. package/dist/nextFileIncremental.js +32 -6
  105. package/dist/nextFileIncremental.js.map +1 -1
  106. package/dist/pipeline.d.ts +26 -0
  107. package/dist/pipeline.d.ts.map +1 -1
  108. package/dist/pipeline.js +86 -10
  109. package/dist/pipeline.js.map +1 -1
  110. package/dist/pipelineAdapters.d.ts +1 -1
  111. package/dist/pipelineAdapters.js +1 -1
  112. package/dist/reporting/csvReportGenerator.js +1 -1
  113. package/dist/ruleAliases.d.ts.map +1 -1
  114. package/dist/ruleAliases.js +41 -2
  115. package/dist/ruleAliases.js.map +1 -1
  116. package/dist/types.d.ts +23 -1
  117. package/dist/types.d.ts.map +1 -1
  118. package/dist/types.js.map +1 -1
  119. package/package.json +5 -2
  120. package/plugin/.claude-plugin/plugin.json +1 -1
  121. 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"}
@@ -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
@@ -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);
@@ -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":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,yBAAyB,CAAC,WAAoB;IAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC;IACtD,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;QACxF,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC9D,yEAAyE;QACzE,wEAAwE;QACxE,IAAI,WAAW,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACrC,CAAC;IAED,4EAA4E;IAC5E,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;AACtF,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,uBAAuB,CAAC,WAAoB;IAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,uBAAuB,CAAC,WAAmB;IACzD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,SAAS,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,MAAM,CAAC,CAAC;IACtD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AACxE,CAAC;AAED,8FAA8F;AAC9F,SAAS,kBAAkB,CAAC,KAAa;IACvC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,SAAS,CAAC;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACjD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACrE,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,SAAS,oBAAoB;IAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,CAAS;IAChC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;QACzE,2DAA2D;QAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3F,CAAC"}
@@ -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,CA4DlF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,aAAa,EAAE,EAC3B,MAAM,EAAE,QAAQ,GACf,OAAO,CAOT"}
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"}
@@ -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 || v.type || '',
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: result.metadata.filesAnalyzed,
122
+ filesAnalyzed,
106
123
  };
107
124
  }
108
125
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/hooks/core.ts"],"names":[],"mappings":"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"}
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
  // ---------------------------------------------------------------------------