@mneme-ai/core 0.25.0 → 0.27.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 (82) hide show
  1. package/dist/audit/baseline.d.ts +92 -0
  2. package/dist/audit/baseline.d.ts.map +1 -0
  3. package/dist/audit/baseline.js +276 -0
  4. package/dist/audit/baseline.js.map +1 -0
  5. package/dist/audit/baseline.test.d.ts +2 -0
  6. package/dist/audit/baseline.test.d.ts.map +1 -0
  7. package/dist/audit/baseline.test.js +180 -0
  8. package/dist/audit/baseline.test.js.map +1 -0
  9. package/dist/audit/certify.d.ts +139 -0
  10. package/dist/audit/certify.d.ts.map +1 -0
  11. package/dist/audit/certify.js +295 -0
  12. package/dist/audit/certify.js.map +1 -0
  13. package/dist/audit/certify.test.d.ts +2 -0
  14. package/dist/audit/certify.test.d.ts.map +1 -0
  15. package/dist/audit/certify.test.js +324 -0
  16. package/dist/audit/certify.test.js.map +1 -0
  17. package/dist/audit/index.d.ts +14 -0
  18. package/dist/audit/index.d.ts.map +1 -0
  19. package/dist/audit/index.js +14 -0
  20. package/dist/audit/index.js.map +1 -0
  21. package/dist/audit/trace.d.ts +88 -0
  22. package/dist/audit/trace.d.ts.map +1 -0
  23. package/dist/audit/trace.js +173 -0
  24. package/dist/audit/trace.js.map +1 -0
  25. package/dist/audit/trace.test.d.ts +2 -0
  26. package/dist/audit/trace.test.d.ts.map +1 -0
  27. package/dist/audit/trace.test.js +198 -0
  28. package/dist/audit/trace.test.js.map +1 -0
  29. package/dist/audit/verify.d.ts +61 -0
  30. package/dist/audit/verify.d.ts.map +1 -0
  31. package/dist/audit/verify.js +278 -0
  32. package/dist/audit/verify.js.map +1 -0
  33. package/dist/audit/verify.test.d.ts +2 -0
  34. package/dist/audit/verify.test.d.ts.map +1 -0
  35. package/dist/audit/verify.test.js +129 -0
  36. package/dist/audit/verify.test.js.map +1 -0
  37. package/dist/index.d.ts +2 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +2 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/pipeline/index.d.ts +34 -0
  42. package/dist/pipeline/index.d.ts.map +1 -0
  43. package/dist/pipeline/index.js +51 -0
  44. package/dist/pipeline/index.js.map +1 -0
  45. package/dist/pipeline/mpe.d.ts +83 -0
  46. package/dist/pipeline/mpe.d.ts.map +1 -0
  47. package/dist/pipeline/mpe.js +259 -0
  48. package/dist/pipeline/mpe.js.map +1 -0
  49. package/dist/pipeline/mpe.test.d.ts +2 -0
  50. package/dist/pipeline/mpe.test.d.ts.map +1 -0
  51. package/dist/pipeline/mpe.test.js +196 -0
  52. package/dist/pipeline/mpe.test.js.map +1 -0
  53. package/dist/pipeline/pipeline.integration.test.d.ts +2 -0
  54. package/dist/pipeline/pipeline.integration.test.d.ts.map +1 -0
  55. package/dist/pipeline/pipeline.integration.test.js +99 -0
  56. package/dist/pipeline/pipeline.integration.test.js.map +1 -0
  57. package/dist/pipeline/super-pipeline.d.ts +38 -0
  58. package/dist/pipeline/super-pipeline.d.ts.map +1 -0
  59. package/dist/pipeline/super-pipeline.js +247 -0
  60. package/dist/pipeline/super-pipeline.js.map +1 -0
  61. package/dist/pipeline/super-pipeline.test.d.ts +2 -0
  62. package/dist/pipeline/super-pipeline.test.d.ts.map +1 -0
  63. package/dist/pipeline/super-pipeline.test.js +130 -0
  64. package/dist/pipeline/super-pipeline.test.js.map +1 -0
  65. package/dist/pipeline/superscalar.d.ts +36 -0
  66. package/dist/pipeline/superscalar.d.ts.map +1 -0
  67. package/dist/pipeline/superscalar.js +130 -0
  68. package/dist/pipeline/superscalar.js.map +1 -0
  69. package/dist/pipeline/superscalar.test.d.ts +2 -0
  70. package/dist/pipeline/superscalar.test.d.ts.map +1 -0
  71. package/dist/pipeline/superscalar.test.js +130 -0
  72. package/dist/pipeline/superscalar.test.js.map +1 -0
  73. package/dist/pipeline/types.d.ts +104 -0
  74. package/dist/pipeline/types.d.ts.map +1 -0
  75. package/dist/pipeline/types.js +15 -0
  76. package/dist/pipeline/types.js.map +1 -0
  77. package/dist/retrieve/intent.d.ts.map +1 -1
  78. package/dist/retrieve/intent.js +16 -0
  79. package/dist/retrieve/intent.js.map +1 -1
  80. package/dist/retrieve/intent.test.js +23 -0
  81. package/dist/retrieve/intent.test.js.map +1 -1
  82. package/package.json +1 -1
@@ -0,0 +1,324 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { buildCertificate, classifyForensicAxis, combineVerdicts, compareApiSurface, compareBehavioralParity, comparePerf, compareTestPassRate, evaluateNarrativeAxis, } from "./certify.js";
3
+ function mkBaseline(over = {}) {
4
+ return {
5
+ capturedAt: "2026-05-07T00:00:00Z",
6
+ headHash: "abc123def",
7
+ outputs: {
8
+ git_head: { exitCode: 0, stdoutHash: "h1", stdoutLines: 1 },
9
+ git_log_20: { exitCode: 0, stdoutHash: "h2", stdoutLines: 20 },
10
+ node_version: { exitCode: 0, stdoutHash: "h3", stdoutLines: 1 },
11
+ },
12
+ testPassRate: { passed: 100, failed: 0, files: 5 },
13
+ apiSurface: { core: ["foo", "bar"], cli: ["baz"] },
14
+ perfMs: { git_status: 10, git_head: 5 },
15
+ ...over,
16
+ };
17
+ }
18
+ describe("audit/certify — combineVerdicts + classifyForensicAxis", () => {
19
+ it("combineVerdicts: any fail beats warn beats pass", () => {
20
+ expect(combineVerdicts(["pass", "pass"])).toBe("pass");
21
+ expect(combineVerdicts(["pass", "warn"])).toBe("warn");
22
+ expect(combineVerdicts(["pass", "fail", "warn"])).toBe("fail");
23
+ expect(combineVerdicts([])).toBe("pass");
24
+ });
25
+ it("classifyForensicAxis maps anomaly scores → verdicts", () => {
26
+ expect(classifyForensicAxis(0)).toBe("pass");
27
+ expect(classifyForensicAxis(0.4)).toBe("warn");
28
+ expect(classifyForensicAxis(0.7)).toBe("fail");
29
+ expect(classifyForensicAxis(1.0)).toBe("fail");
30
+ });
31
+ });
32
+ describe("audit/certify — compareBehavioralParity", () => {
33
+ it("pass when all sample hashes match", () => {
34
+ const before = mkBaseline();
35
+ const r = compareBehavioralParity(before, { outputs: before.outputs });
36
+ expect(r.verdict).toBe("pass");
37
+ });
38
+ it("expected drift on git_head/git_log = pass with note", () => {
39
+ const before = mkBaseline();
40
+ const after = {
41
+ outputs: {
42
+ git_head: { exitCode: 0, stdoutHash: "h1-different", stdoutLines: 1 },
43
+ git_log_20: { exitCode: 0, stdoutHash: "h2-different", stdoutLines: 22 },
44
+ node_version: { exitCode: 0, stdoutHash: "h3", stdoutLines: 1 },
45
+ },
46
+ };
47
+ const r = compareBehavioralParity(before, after);
48
+ expect(r.verdict).toBe("pass");
49
+ expect(r.details.some((d) => d.includes("expected"))).toBe(true);
50
+ });
51
+ it("warn when an unexpected sample drifts (e.g. node_version)", () => {
52
+ const before = mkBaseline();
53
+ const after = {
54
+ outputs: {
55
+ ...before.outputs,
56
+ node_version: { exitCode: 0, stdoutHash: "different", stdoutLines: 1 },
57
+ },
58
+ };
59
+ const r = compareBehavioralParity(before, after);
60
+ expect(r.verdict).toBe("warn");
61
+ });
62
+ it("fail when an exit code changes (any sample)", () => {
63
+ const before = mkBaseline();
64
+ const after = {
65
+ outputs: {
66
+ ...before.outputs,
67
+ git_head: { exitCode: 1, stdoutHash: "h1", stdoutLines: 1 },
68
+ },
69
+ };
70
+ const r = compareBehavioralParity(before, after);
71
+ expect(r.verdict).toBe("fail");
72
+ });
73
+ });
74
+ describe("audit/certify — compareApiSurface", () => {
75
+ it("pass when surface unchanged", () => {
76
+ const b = mkBaseline();
77
+ const r = compareApiSurface(b, { apiSurface: b.apiSurface });
78
+ expect(r.verdict).toBe("pass");
79
+ });
80
+ it("pass when only additions", () => {
81
+ const b = mkBaseline();
82
+ const r = compareApiSurface(b, {
83
+ apiSurface: { core: ["foo", "bar", "newOne"], cli: ["baz"] },
84
+ });
85
+ expect(r.verdict).toBe("pass");
86
+ expect(r.details.some((d) => d.includes("newOne"))).toBe(true);
87
+ });
88
+ it("fail when an export is removed", () => {
89
+ const b = mkBaseline();
90
+ const r = compareApiSurface(b, {
91
+ apiSurface: { core: ["foo"], cli: ["baz"] },
92
+ });
93
+ expect(r.verdict).toBe("fail");
94
+ expect(r.details.some((d) => d.includes("bar"))).toBe(true);
95
+ });
96
+ });
97
+ describe("audit/certify — compareTestPassRate", () => {
98
+ it("pass when nothing regresses", () => {
99
+ const b = mkBaseline();
100
+ const r = compareTestPassRate(b, {
101
+ testPassRate: { passed: 100, failed: 0, files: 5 },
102
+ });
103
+ expect(r.verdict).toBe("pass");
104
+ });
105
+ it("fail when failures appear", () => {
106
+ const b = mkBaseline();
107
+ const r = compareTestPassRate(b, {
108
+ testPassRate: { passed: 99, failed: 1, files: 5 },
109
+ });
110
+ expect(r.verdict).toBe("fail");
111
+ });
112
+ it("warn when passing count drops without new failures", () => {
113
+ const b = mkBaseline();
114
+ const r = compareTestPassRate(b, {
115
+ testPassRate: { passed: 95, failed: 0, files: 5 },
116
+ });
117
+ expect(r.verdict).toBe("warn");
118
+ });
119
+ });
120
+ describe("audit/certify — comparePerf", () => {
121
+ it("pass when no degradation", () => {
122
+ const b = mkBaseline();
123
+ const r = comparePerf(b, { perfMs: { git_status: 10, git_head: 5 } });
124
+ expect(r.verdict).toBe("pass");
125
+ });
126
+ it("warn when 10..25% slower", () => {
127
+ const b = mkBaseline();
128
+ const r = comparePerf(b, { perfMs: { git_status: 12, git_head: 5 } });
129
+ expect(r.verdict).toBe("warn");
130
+ expect(r.deltaPercent).toBeCloseTo(20, 0);
131
+ });
132
+ it("fail when >25% slower", () => {
133
+ const b = mkBaseline();
134
+ const r = comparePerf(b, { perfMs: { git_status: 20, git_head: 5 } });
135
+ expect(r.verdict).toBe("fail");
136
+ expect(r.deltaPercent).toBeCloseTo(100, 0);
137
+ });
138
+ });
139
+ describe("audit/certify — evaluateNarrativeAxis", () => {
140
+ it("pass when no commits", () => {
141
+ const trace = {
142
+ fromHash: "x",
143
+ toHash: "y",
144
+ commits: [],
145
+ filesChanged: [],
146
+ insertions: 0,
147
+ deletions: 0,
148
+ };
149
+ const r = evaluateNarrativeAxis({ trace, diffs: {} });
150
+ expect(r.verdict).toBe("pass");
151
+ });
152
+ it("fail when any claim is contradicted", () => {
153
+ const trace = {
154
+ fromHash: "x",
155
+ toHash: "y",
156
+ commits: [
157
+ {
158
+ hash: "abc",
159
+ shortHash: "abc",
160
+ author: "AI",
161
+ authorEmail: "noreply@anthropic.com",
162
+ message: "Tweak handler. No change to db.ts.",
163
+ },
164
+ ],
165
+ filesChanged: ["src/db.ts"],
166
+ insertions: 1,
167
+ deletions: 0,
168
+ };
169
+ const r = evaluateNarrativeAxis({
170
+ trace,
171
+ diffs: { abc: { diff: "+ x", filesTouched: ["src/handler.ts", "src/db.ts"] } },
172
+ });
173
+ expect(r.verdict).toBe("fail");
174
+ expect(r.checks).toHaveLength(1);
175
+ });
176
+ it("pass when narratives verify cleanly", () => {
177
+ const trace = {
178
+ fromHash: "x",
179
+ toHash: "y",
180
+ commits: [
181
+ {
182
+ hash: "abc",
183
+ shortHash: "abc",
184
+ author: "AI",
185
+ authorEmail: "noreply@anthropic.com",
186
+ message: "Adds function fooBar.",
187
+ },
188
+ ],
189
+ filesChanged: ["src/x.ts"],
190
+ insertions: 1,
191
+ deletions: 0,
192
+ };
193
+ const r = evaluateNarrativeAxis({
194
+ trace,
195
+ diffs: { abc: { diff: "+ export function fooBar() {}", filesTouched: ["src/x.ts"] } },
196
+ });
197
+ expect(r.verdict).toBe("pass");
198
+ });
199
+ });
200
+ describe("audit/certify — buildCertificate end-to-end", () => {
201
+ it("clean baseline+trace → pass + exit 0", () => {
202
+ const before = mkBaseline();
203
+ const cert = buildCertificate({
204
+ sessionId: "sess1",
205
+ beforeBaseline: before,
206
+ afterBaseline: before,
207
+ trace: {
208
+ fromHash: "x",
209
+ toHash: "y",
210
+ commits: [],
211
+ filesChanged: [],
212
+ insertions: 0,
213
+ deletions: 0,
214
+ },
215
+ diffs: {},
216
+ });
217
+ expect(cert.overallVerdict).toBe("pass");
218
+ expect(cert.exitCode).toBe(0);
219
+ expect(cert.axes.behavioralParity.verdict).toBe("pass");
220
+ expect(cert.axes.apiContractDrift.verdict).toBe("pass");
221
+ expect(cert.axes.testPassRate.verdict).toBe("pass");
222
+ expect(cert.axes.perfRegression.verdict).toBe("pass");
223
+ expect(cert.axes.aiNarrative.verdict).toBe("pass");
224
+ });
225
+ it("fabricated regression → overall fail + exit 1", () => {
226
+ const before = mkBaseline();
227
+ const after = mkBaseline({
228
+ apiSurface: { core: ["foo"], cli: ["baz"] }, // bar removed
229
+ testPassRate: { passed: 99, failed: 1, files: 5 },
230
+ perfMs: { git_status: 30, git_head: 5 },
231
+ });
232
+ const cert = buildCertificate({
233
+ sessionId: "sess1",
234
+ beforeBaseline: before,
235
+ afterBaseline: after,
236
+ trace: {
237
+ fromHash: "x",
238
+ toHash: "y",
239
+ commits: [
240
+ {
241
+ hash: "abc",
242
+ shortHash: "abc",
243
+ author: "AI",
244
+ authorEmail: "noreply@anthropic.com",
245
+ message: "Refactor. No change to core/foo.ts.",
246
+ },
247
+ ],
248
+ filesChanged: ["core/foo.ts"],
249
+ insertions: 1,
250
+ deletions: 1,
251
+ },
252
+ diffs: {
253
+ abc: { diff: "+ x\n- y", filesTouched: ["core/foo.ts"] },
254
+ },
255
+ });
256
+ expect(cert.overallVerdict).toBe("fail");
257
+ expect(cert.exitCode).toBe(1);
258
+ expect(cert.axes.apiContractDrift.verdict).toBe("fail");
259
+ expect(cert.axes.testPassRate.verdict).toBe("fail");
260
+ expect(cert.axes.perfRegression.verdict).toBe("fail");
261
+ expect(cert.axes.aiNarrative.verdict).toBe("fail");
262
+ });
263
+ it("forensic axes default to pass when no scores supplied", () => {
264
+ const before = mkBaseline();
265
+ const cert = buildCertificate({
266
+ sessionId: "sess1",
267
+ beforeBaseline: before,
268
+ afterBaseline: before,
269
+ trace: {
270
+ fromHash: "x",
271
+ toHash: "x",
272
+ commits: [],
273
+ filesChanged: [],
274
+ insertions: 0,
275
+ deletions: 0,
276
+ },
277
+ diffs: {},
278
+ });
279
+ expect(cert.forensicAxes.size).toBe("pass");
280
+ expect(cert.forensicAxes.files).toBe("pass");
281
+ expect(cert.forensicAxes.style).toBe("pass");
282
+ expect(cert.forensicAxes.time).toBe("pass");
283
+ });
284
+ it("forensic axes propagate to overall when high score", () => {
285
+ const before = mkBaseline();
286
+ const cert = buildCertificate({
287
+ sessionId: "sess1",
288
+ beforeBaseline: before,
289
+ afterBaseline: before,
290
+ trace: {
291
+ fromHash: "x",
292
+ toHash: "x",
293
+ commits: [],
294
+ filesChanged: [],
295
+ insertions: 0,
296
+ deletions: 0,
297
+ },
298
+ diffs: {},
299
+ forensicScores: { size: 0.8, files: 0.1, style: 0.1, time: 0.1 },
300
+ });
301
+ expect(cert.overallVerdict).toBe("fail");
302
+ expect(cert.forensicAxes.size).toBe("fail");
303
+ });
304
+ it("sessionId + capturedAt are populated", () => {
305
+ const before = mkBaseline();
306
+ const cert = buildCertificate({
307
+ sessionId: "my-session",
308
+ beforeBaseline: before,
309
+ afterBaseline: before,
310
+ trace: {
311
+ fromHash: "x",
312
+ toHash: "y",
313
+ commits: [],
314
+ filesChanged: [],
315
+ insertions: 0,
316
+ deletions: 0,
317
+ },
318
+ diffs: {},
319
+ });
320
+ expect(cert.sessionId).toBe("my-session");
321
+ expect(cert.capturedAt).toMatch(/^\d{4}-/);
322
+ });
323
+ });
324
+ //# sourceMappingURL=certify.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"certify.test.js","sourceRoot":"","sources":["../../src/audit/certify.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * AI Session Audit — public surface.
3
+ *
4
+ * The pitch: every AI-driven commit gets a trust certificate. AI tools
5
+ * (Claude Code, Cursor, Codex, Devin, ...) silently introduce
6
+ * regressions; this module snapshots behavior BEFORE the AI works,
7
+ * traces what actually changed, verifies the AI's narrative, and emits
8
+ * a 5-axis trust certificate. Vendor-neutral.
9
+ */
10
+ export * from "./baseline.js";
11
+ export * from "./trace.js";
12
+ export * from "./verify.js";
13
+ export * from "./certify.js";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * AI Session Audit — public surface.
3
+ *
4
+ * The pitch: every AI-driven commit gets a trust certificate. AI tools
5
+ * (Claude Code, Cursor, Codex, Devin, ...) silently introduce
6
+ * regressions; this module snapshots behavior BEFORE the AI works,
7
+ * traces what actually changed, verifies the AI's narrative, and emits
8
+ * a 5-axis trust certificate. Vendor-neutral.
9
+ */
10
+ export * from "./baseline.js";
11
+ export * from "./trace.js";
12
+ export * from "./verify.js";
13
+ export * from "./certify.js";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * AI Session Audit — TRACE module.
3
+ *
4
+ * Given a baseline HEAD hash, find every commit that landed since (the
5
+ * "AI session"), aggregate the diff, and detect which commits were
6
+ * AI-authored and by which vendor.
7
+ *
8
+ * Vendor detection is heuristic and intentionally conservative — we
9
+ * never block on a guess, only annotate. The signals we use:
10
+ * - commit-message regex ("Co-Authored-By: Claude", "[Cursor]", ...)
11
+ * - author/email patterns (noreply@anthropic.com, cursor.sh, ...)
12
+ *
13
+ * All process I/O flows through a `GitRunner` interface so tests can
14
+ * replay canned commit logs.
15
+ */
16
+ /** A single AI-vendor detection rule. */
17
+ export interface VendorRule {
18
+ vendor: string;
19
+ /** If a regex matches the commit message, attribute to `vendor`. */
20
+ messageRe?: RegExp;
21
+ /** If a regex matches the author email, attribute to `vendor`. */
22
+ emailRe?: RegExp;
23
+ /** Confidence in [0, 1]; combined as max across matching rules. */
24
+ confidence: number;
25
+ }
26
+ /**
27
+ * Default rule set. Order doesn't matter — we score every rule against
28
+ * every commit and take the maximum confidence per vendor.
29
+ */
30
+ export declare const DEFAULT_VENDOR_RULES: VendorRule[];
31
+ export interface AuditCommit {
32
+ hash: string;
33
+ shortHash: string;
34
+ author: string;
35
+ authorEmail: string;
36
+ message: string;
37
+ /** Vendor + confidence; `undefined` means "human (or undetected AI)". */
38
+ likelyAI?: {
39
+ vendor: string;
40
+ confidence: number;
41
+ };
42
+ }
43
+ export interface SessionTrace {
44
+ fromHash: string;
45
+ toHash: string;
46
+ commits: AuditCommit[];
47
+ filesChanged: string[];
48
+ insertions: number;
49
+ deletions: number;
50
+ }
51
+ /** Test seam — every git invocation goes through this. */
52
+ export interface GitRunner {
53
+ /** Run `git <args>` in `cwd`; return stdout (empty string on failure). */
54
+ run(cwd: string, args: string[]): string;
55
+ }
56
+ export declare const realGitRunner: GitRunner;
57
+ /** Sentinel separator we ask git to emit between commit blocks. */
58
+ export declare const COMMIT_SEP = "<<<MNEME-AUDIT-COMMIT-SEP>>>";
59
+ /**
60
+ * Detect AI vendor for a single commit.
61
+ *
62
+ * Returns the vendor with the highest confidence, or `undefined` if no
63
+ * rule matched. Ties are broken by alphabetical vendor name (stable).
64
+ */
65
+ export declare function detectAiVendor(commit: {
66
+ message: string;
67
+ authorEmail: string;
68
+ }, rules?: VendorRule[]): {
69
+ vendor: string;
70
+ confidence: number;
71
+ } | undefined;
72
+ /**
73
+ * Trace the session — every commit between `baselineHeadHash` and HEAD.
74
+ */
75
+ export declare function traceSession(repoRoot: string, baselineHeadHash: string, runner?: GitRunner): Promise<SessionTrace>;
76
+ export declare function parseCommitLog(raw: string): AuditCommit[];
77
+ export declare function parseShortstat(s: string): {
78
+ insertions: number;
79
+ deletions: number;
80
+ };
81
+ /** Convenience: how many commits in the trace look AI-authored. */
82
+ export declare function aiCommitCount(trace: SessionTrace): number;
83
+ /** Distinct vendors observed (sorted by descending count, then name). */
84
+ export declare function aiVendorBreakdown(trace: SessionTrace): Array<{
85
+ vendor: string;
86
+ count: number;
87
+ }>;
88
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/audit/trace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,yCAAyC;AACzC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,UAAU,EAa5C,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,QAAQ,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,0DAA0D;AAC1D,MAAM,WAAW,SAAS;IACxB,0EAA0E;IAC1E,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;CAC1C;AAED,eAAO,MAAM,aAAa,EAAE,SAa3B,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,UAAU,iCAAiC,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAChD,KAAK,GAAE,UAAU,EAAyB,GACzC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAiBpD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,EACxB,MAAM,GAAE,SAAyB,GAChC,OAAO,CAAC,YAAY,CAAC,CA0CvB;AAID,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CAyBzD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAQnF;AAED,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAEzD;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAS/F"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * AI Session Audit — TRACE module.
3
+ *
4
+ * Given a baseline HEAD hash, find every commit that landed since (the
5
+ * "AI session"), aggregate the diff, and detect which commits were
6
+ * AI-authored and by which vendor.
7
+ *
8
+ * Vendor detection is heuristic and intentionally conservative — we
9
+ * never block on a guess, only annotate. The signals we use:
10
+ * - commit-message regex ("Co-Authored-By: Claude", "[Cursor]", ...)
11
+ * - author/email patterns (noreply@anthropic.com, cursor.sh, ...)
12
+ *
13
+ * All process I/O flows through a `GitRunner` interface so tests can
14
+ * replay canned commit logs.
15
+ */
16
+ import { execFileSync } from "node:child_process";
17
+ /**
18
+ * Default rule set. Order doesn't matter — we score every rule against
19
+ * every commit and take the maximum confidence per vendor.
20
+ */
21
+ export const DEFAULT_VENDOR_RULES = [
22
+ { vendor: "claude", messageRe: /Co-Authored-By:\s*Claude/i, confidence: 0.95 },
23
+ { vendor: "claude", emailRe: /noreply@anthropic\.com$/i, confidence: 0.95 },
24
+ { vendor: "cursor", messageRe: /\[Cursor\]/, confidence: 0.9 },
25
+ { vendor: "cursor", emailRe: /noreply@cursor\.(sh|com)$/i, confidence: 0.9 },
26
+ { vendor: "codex", messageRe: /Generated\s+by\s+Codex/i, confidence: 0.9 },
27
+ { vendor: "codex", messageRe: /Co-Authored-By:\s*ChatGPT/i, confidence: 0.85 },
28
+ { vendor: "devin", messageRe: /devin\.ai/i, confidence: 0.9 },
29
+ { vendor: "devin", emailRe: /@devin\.ai$/i, confidence: 0.9 },
30
+ { vendor: "sweep", messageRe: /sweep\.dev/i, confidence: 0.85 },
31
+ { vendor: "sweep", emailRe: /@sweep\.dev$/i, confidence: 0.85 },
32
+ { vendor: "aider", messageRe: /\baider\b/i, confidence: 0.7 },
33
+ { vendor: "copilot", messageRe: /Co-Authored-By:\s*GitHub Copilot/i, confidence: 0.9 },
34
+ ];
35
+ export const realGitRunner = {
36
+ run(cwd, args) {
37
+ try {
38
+ return execFileSync("git", args, {
39
+ cwd,
40
+ encoding: "utf8",
41
+ stdio: ["ignore", "pipe", "pipe"],
42
+ maxBuffer: 64 * 1024 * 1024,
43
+ });
44
+ }
45
+ catch {
46
+ return "";
47
+ }
48
+ },
49
+ };
50
+ /** Sentinel separator we ask git to emit between commit blocks. */
51
+ export const COMMIT_SEP = "<<<MNEME-AUDIT-COMMIT-SEP>>>";
52
+ /**
53
+ * Detect AI vendor for a single commit.
54
+ *
55
+ * Returns the vendor with the highest confidence, or `undefined` if no
56
+ * rule matched. Ties are broken by alphabetical vendor name (stable).
57
+ */
58
+ export function detectAiVendor(commit, rules = DEFAULT_VENDOR_RULES) {
59
+ let bestVendor;
60
+ let bestConfidence = -1;
61
+ for (const r of rules) {
62
+ let matched = false;
63
+ if (r.messageRe && r.messageRe.test(commit.message))
64
+ matched = true;
65
+ if (r.emailRe && r.emailRe.test(commit.authorEmail))
66
+ matched = true;
67
+ if (!matched)
68
+ continue;
69
+ if (r.confidence > bestConfidence ||
70
+ (r.confidence === bestConfidence && (bestVendor ?? "z") > r.vendor)) {
71
+ bestVendor = r.vendor;
72
+ bestConfidence = r.confidence;
73
+ }
74
+ }
75
+ return bestVendor ? { vendor: bestVendor, confidence: bestConfidence } : undefined;
76
+ }
77
+ /**
78
+ * Trace the session — every commit between `baselineHeadHash` and HEAD.
79
+ */
80
+ export async function traceSession(repoRoot, baselineHeadHash, runner = realGitRunner) {
81
+ const headOut = runner.run(repoRoot, ["rev-parse", "HEAD"]);
82
+ const toHash = headOut.trim() || baselineHeadHash;
83
+ if (toHash === baselineHeadHash) {
84
+ return {
85
+ fromHash: baselineHeadHash,
86
+ toHash,
87
+ commits: [],
88
+ filesChanged: [],
89
+ insertions: 0,
90
+ deletions: 0,
91
+ };
92
+ }
93
+ const range = `${baselineHeadHash}..HEAD`;
94
+ // Header (TAB-separated) on line 1, commit body follows, separator marks end.
95
+ const fmt = `--pretty=format:%H%x09%an%x09%ae%x09%s%n%b%n${COMMIT_SEP}`;
96
+ const logRaw = runner.run(repoRoot, ["log", range, fmt]);
97
+ const commits = parseCommitLog(logRaw);
98
+ const shortstat = runner.run(repoRoot, ["diff", "--shortstat", range]);
99
+ const { insertions, deletions } = parseShortstat(shortstat);
100
+ const namesOut = runner.run(repoRoot, ["diff", "--name-only", range]);
101
+ const filesChanged = [
102
+ ...new Set(namesOut
103
+ .split(/\r?\n/)
104
+ .map((l) => l.trim())
105
+ .filter((l) => l.length > 0)),
106
+ ];
107
+ return {
108
+ fromHash: baselineHeadHash,
109
+ toHash,
110
+ commits,
111
+ filesChanged,
112
+ insertions,
113
+ deletions,
114
+ };
115
+ }
116
+ // ─── Parsers (exported for tests) ───────────────────────────────────
117
+ export function parseCommitLog(raw) {
118
+ if (!raw)
119
+ return [];
120
+ const out = [];
121
+ for (const block of raw.split(COMMIT_SEP)) {
122
+ const trimmed = block.replace(/^\s+/, "").replace(/\s+$/, "");
123
+ if (!trimmed)
124
+ continue;
125
+ const firstNl = trimmed.indexOf("\n");
126
+ const headerLine = firstNl >= 0 ? trimmed.slice(0, firstNl) : trimmed;
127
+ const body = firstNl >= 0 ? trimmed.slice(firstNl + 1) : "";
128
+ const parts = headerLine.split("\t");
129
+ if (parts.length < 4)
130
+ continue;
131
+ const [hash, author, email, subject] = parts;
132
+ if (!hash || !author || !email)
133
+ continue;
134
+ const fullMessage = body ? `${subject}\n${body}` : (subject ?? "");
135
+ const ai = detectAiVendor({ message: fullMessage, authorEmail: email });
136
+ out.push({
137
+ hash,
138
+ shortHash: hash.slice(0, 7),
139
+ author,
140
+ authorEmail: email,
141
+ message: fullMessage,
142
+ likelyAI: ai,
143
+ });
144
+ }
145
+ return out;
146
+ }
147
+ export function parseShortstat(s) {
148
+ if (!s)
149
+ return { insertions: 0, deletions: 0 };
150
+ const ins = s.match(/(\d+)\s+insertion/);
151
+ const del = s.match(/(\d+)\s+deletion/);
152
+ return {
153
+ insertions: ins ? Number(ins[1]) : 0,
154
+ deletions: del ? Number(del[1]) : 0,
155
+ };
156
+ }
157
+ /** Convenience: how many commits in the trace look AI-authored. */
158
+ export function aiCommitCount(trace) {
159
+ return trace.commits.filter((c) => !!c.likelyAI).length;
160
+ }
161
+ /** Distinct vendors observed (sorted by descending count, then name). */
162
+ export function aiVendorBreakdown(trace) {
163
+ const map = new Map();
164
+ for (const c of trace.commits) {
165
+ if (!c.likelyAI)
166
+ continue;
167
+ map.set(c.likelyAI.vendor, (map.get(c.likelyAI.vendor) ?? 0) + 1);
168
+ }
169
+ return [...map.entries()]
170
+ .map(([vendor, count]) => ({ vendor, count }))
171
+ .sort((a, b) => b.count - a.count || a.vendor.localeCompare(b.vendor));
172
+ }
173
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/audit/trace.ts"],"names":[],"mappings":"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"}