@mneme-ai/core 2.19.5 → 2.19.7
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/dist/__v197_extras/v197_extras.test.d.ts +9 -0
- package/dist/__v197_extras/v197_extras.test.d.ts.map +1 -0
- package/dist/__v197_extras/v197_extras.test.js +208 -0
- package/dist/__v197_extras/v197_extras.test.js.map +1 -0
- package/dist/agent_manifest.d.ts +1 -1
- package/dist/agent_manifest.d.ts.map +1 -1
- package/dist/agent_manifest.js +21 -1
- package/dist/agent_manifest.js.map +1 -1
- package/dist/chronostasis/index.d.ts +24 -0
- package/dist/chronostasis/index.d.ts.map +1 -1
- package/dist/chronostasis/index.js +88 -0
- package/dist/chronostasis/index.js.map +1 -1
- package/dist/colony_mind/colony_mind.test.d.ts +2 -0
- package/dist/colony_mind/colony_mind.test.d.ts.map +1 -0
- package/dist/colony_mind/colony_mind.test.js +89 -0
- package/dist/colony_mind/colony_mind.test.js.map +1 -0
- package/dist/colony_mind/index.d.ts +100 -0
- package/dist/colony_mind/index.d.ts.map +1 -0
- package/dist/colony_mind/index.js +141 -0
- package/dist/colony_mind/index.js.map +1 -0
- package/dist/conversation_compiler/conversation_compiler.test.d.ts +2 -0
- package/dist/conversation_compiler/conversation_compiler.test.d.ts.map +1 -0
- package/dist/conversation_compiler/conversation_compiler.test.js +280 -0
- package/dist/conversation_compiler/conversation_compiler.test.js.map +1 -0
- package/dist/conversation_compiler/index.d.ts +157 -0
- package/dist/conversation_compiler/index.d.ts.map +1 -0
- package/dist/conversation_compiler/index.js +457 -0
- package/dist/conversation_compiler/index.js.map +1 -0
- package/dist/cosmic/aurelian_v196.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v196.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v196.test.js +33 -0
- package/dist/cosmic/aurelian_v196.test.js.map +1 -0
- package/dist/cosmic/aurelian_v197.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v197.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v197.test.js +91 -0
- package/dist/cosmic/aurelian_v197.test.js.map +1 -0
- package/dist/dream_consolidation/dream_consolidation.test.d.ts +2 -0
- package/dist/dream_consolidation/dream_consolidation.test.d.ts.map +1 -0
- package/dist/dream_consolidation/dream_consolidation.test.js +122 -0
- package/dist/dream_consolidation/dream_consolidation.test.js.map +1 -0
- package/dist/dream_consolidation/index.d.ts +107 -0
- package/dist/dream_consolidation/index.d.ts.map +1 -0
- package/dist/dream_consolidation/index.js +265 -0
- package/dist/dream_consolidation/index.js.map +1 -0
- package/dist/genetic_patch/genetic_patch.test.d.ts +2 -0
- package/dist/genetic_patch/genetic_patch.test.d.ts.map +1 -0
- package/dist/genetic_patch/genetic_patch.test.js +75 -0
- package/dist/genetic_patch/genetic_patch.test.js.map +1 -0
- package/dist/genetic_patch/index.d.ts +91 -0
- package/dist/genetic_patch/index.d.ts.map +1 -0
- package/dist/genetic_patch/index.js +163 -0
- package/dist/genetic_patch/index.js.map +1 -0
- package/dist/honey_decision/honey_decision.test.d.ts +2 -0
- package/dist/honey_decision/honey_decision.test.d.ts.map +1 -0
- package/dist/honey_decision/honey_decision.test.js +83 -0
- package/dist/honey_decision/honey_decision.test.js.map +1 -0
- package/dist/honey_decision/index.d.ts +96 -0
- package/dist/honey_decision/index.d.ts.map +1 -0
- package/dist/honey_decision/index.js +203 -0
- package/dist/honey_decision/index.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/intent_router/index.d.ts +13 -0
- package/dist/intent_router/index.d.ts.map +1 -1
- package/dist/intent_router/index.js +79 -0
- package/dist/intent_router/index.js.map +1 -1
- package/dist/retroactive_compile/index.d.ts +85 -0
- package/dist/retroactive_compile/index.d.ts.map +1 -0
- package/dist/retroactive_compile/index.js +209 -0
- package/dist/retroactive_compile/index.js.map +1 -0
- package/dist/retroactive_compile/retroactive_compile.test.d.ts +2 -0
- package/dist/retroactive_compile/retroactive_compile.test.d.ts.map +1 -0
- package/dist/retroactive_compile/retroactive_compile.test.js +99 -0
- package/dist/retroactive_compile/retroactive_compile.test.js.map +1 -0
- package/dist/whats_new.d.ts.map +1 -1
- package/dist/whats_new.js +16 -0
- package/dist/whats_new.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { extractDecisions, compileAgreement, verifyAgreementPair, runAgreement, persistAgreement, loadAgreement, listAgreements, formatAgreementLine, formatCheckSummary, generatePreCommitHook, } from "./index.js";
|
|
3
|
+
import { mkdtempSync, existsSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
describe("v2.19.6 · CONVERSATION COMPILER — chat → deterministic signed artifact", () => {
|
|
7
|
+
// ── Extraction ────────────────────────────────────────────────────
|
|
8
|
+
describe("extractDecisions — pattern recognition", () => {
|
|
9
|
+
it("detects 'every commit must have a test' (English)", () => {
|
|
10
|
+
const d = extractDecisions({ transcript: "We agreed: every commit must have a test before merging." });
|
|
11
|
+
expect(d.find((x) => x.pattern === "test_required")).toBeDefined();
|
|
12
|
+
});
|
|
13
|
+
it("detects 'ทุก commit ต้องมี test' (Thai)", () => {
|
|
14
|
+
const d = extractDecisions({ transcript: "ตกลงกันว่า ทุก commit ต้องมี test ก่อน merge" });
|
|
15
|
+
expect(d.find((x) => x.pattern === "test_required")).toBeDefined();
|
|
16
|
+
});
|
|
17
|
+
it("detects 'must use timingSafeEqual'", () => {
|
|
18
|
+
const d = extractDecisions({ transcript: "All HMAC compares must use timingSafeEqual." });
|
|
19
|
+
expect(d.find((x) => x.pattern === "timing_safe_equal_required")).toBeDefined();
|
|
20
|
+
});
|
|
21
|
+
it("detects 'no console.log in production'", () => {
|
|
22
|
+
const d = extractDecisions({ transcript: "Rule: no console.log in production code." });
|
|
23
|
+
expect(d.find((x) => x.pattern === "no_console_log")).toBeDefined();
|
|
24
|
+
});
|
|
25
|
+
it("detects 'no direct push to main' / Thai variant", () => {
|
|
26
|
+
const en = extractDecisions({ transcript: "Never push directly to main." });
|
|
27
|
+
const th = extractDecisions({ transcript: "ห้าม push บน main โดยตรง" });
|
|
28
|
+
expect(en.find((x) => x.pattern === "no_direct_push_main")).toBeDefined();
|
|
29
|
+
expect(th.find((x) => x.pattern === "no_direct_push_main")).toBeDefined();
|
|
30
|
+
});
|
|
31
|
+
it("detects 'has_hmac' for signed responses", () => {
|
|
32
|
+
const d = extractDecisions({ transcript: "All verdicts must be signed with HMAC." });
|
|
33
|
+
expect(d.find((x) => x.pattern === "has_hmac")).toBeDefined();
|
|
34
|
+
});
|
|
35
|
+
it("detects 'no secrets in code'", () => {
|
|
36
|
+
const d = extractDecisions({ transcript: "Never commit secrets in source." });
|
|
37
|
+
expect(d.find((x) => x.pattern === "no_secret_in_code")).toBeDefined();
|
|
38
|
+
});
|
|
39
|
+
it("detects 'must update changelog'", () => {
|
|
40
|
+
const d = extractDecisions({ transcript: "Every release must update changelog." });
|
|
41
|
+
expect(d.find((x) => x.pattern === "must_have_changelog")).toBeDefined();
|
|
42
|
+
});
|
|
43
|
+
it("falls back to 'manual' for unrecognised must/ห้าม sentences", () => {
|
|
44
|
+
const d = extractDecisions({ transcript: "You must arrange the file imports alphabetically." });
|
|
45
|
+
expect(d.some((x) => x.pattern === "manual")).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
it("dedupes same pattern across multiple mentions", () => {
|
|
48
|
+
const d = extractDecisions({ transcript: "Every commit must have a test. Also, test is required for every commit." });
|
|
49
|
+
const tests = d.filter((x) => x.pattern === "test_required");
|
|
50
|
+
expect(tests.length).toBe(1);
|
|
51
|
+
});
|
|
52
|
+
it("empty/whitespace transcript returns []", () => {
|
|
53
|
+
expect(extractDecisions({ transcript: "" }).length).toBe(0);
|
|
54
|
+
expect(extractDecisions({ transcript: " \n\n " }).length).toBe(0);
|
|
55
|
+
});
|
|
56
|
+
it("multiple distinct patterns coexist", () => {
|
|
57
|
+
const d = extractDecisions({
|
|
58
|
+
transcript: [
|
|
59
|
+
"Every commit must have a test.",
|
|
60
|
+
"All HMAC compares must use timingSafeEqual.",
|
|
61
|
+
"Never push directly to main.",
|
|
62
|
+
"Every release must update changelog.",
|
|
63
|
+
].join("\n"),
|
|
64
|
+
});
|
|
65
|
+
const patterns = new Set(d.map((x) => x.pattern));
|
|
66
|
+
expect(patterns.has("test_required")).toBe(true);
|
|
67
|
+
expect(patterns.has("timing_safe_equal_required")).toBe(true);
|
|
68
|
+
expect(patterns.has("no_direct_push_main")).toBe(true);
|
|
69
|
+
expect(patterns.has("must_have_changelog")).toBe(true);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
// ── Compile ──────────────────────────────────────────────────────
|
|
73
|
+
describe("compileAgreement — deterministic, signed, callable", () => {
|
|
74
|
+
it("produces an agreement with HMAC pair-lock", () => {
|
|
75
|
+
const a = compileAgreement({
|
|
76
|
+
transcript: "Every commit must have a test. No console.log in production.",
|
|
77
|
+
name: "team-conventions",
|
|
78
|
+
proposedBy: "shin",
|
|
79
|
+
});
|
|
80
|
+
expect(a.sig).toMatch(/^[0-9a-f]{64}$/);
|
|
81
|
+
expect(a.agreementId).toMatch(/^ag-[0-9a-f]{14}$/);
|
|
82
|
+
expect(a.decisions.length).toBeGreaterThanOrEqual(2);
|
|
83
|
+
expect(verifyAgreementPair({ agreement: a, transcript: "Every commit must have a test. No console.log in production." }).ok).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
it("compilation is DETERMINISTIC — same input → same agreementId + same source", () => {
|
|
86
|
+
const transcript = "Every commit must have a test.";
|
|
87
|
+
const a = compileAgreement({ transcript, name: "x", compiledAt: "2026-05-16T00:00:00Z" });
|
|
88
|
+
const b = compileAgreement({ transcript, name: "x", compiledAt: "2026-05-16T00:00:00Z" });
|
|
89
|
+
expect(a.agreementId).toBe(b.agreementId);
|
|
90
|
+
expect(a.sourceSha256).toBe(b.sourceSha256);
|
|
91
|
+
expect(a.generatedSource).toBe(b.generatedSource);
|
|
92
|
+
expect(a.sig).toBe(b.sig);
|
|
93
|
+
});
|
|
94
|
+
it("agreementId is content-addressed (changes when decisions change)", () => {
|
|
95
|
+
const a = compileAgreement({ transcript: "Every commit must have a test.", name: "x" });
|
|
96
|
+
const b = compileAgreement({ transcript: "Every commit must have a test. No console.log.", name: "x" });
|
|
97
|
+
expect(a.agreementId).not.toBe(b.agreementId);
|
|
98
|
+
});
|
|
99
|
+
it("generated source is valid JavaScript module syntax (eval test)", () => {
|
|
100
|
+
const a = compileAgreement({ transcript: "Every commit must have a test.", name: "x" });
|
|
101
|
+
// Wrap to be evaluable
|
|
102
|
+
const code = a.generatedSource
|
|
103
|
+
.replace(/^export const /gm, "const ")
|
|
104
|
+
.replace(/^export function /gm, "function ")
|
|
105
|
+
+ "\nreturn { runAgreement, DECISIONS, AGREEMENT_NAME };";
|
|
106
|
+
const fn = new Function(code);
|
|
107
|
+
const exported = fn();
|
|
108
|
+
expect(typeof exported.runAgreement).toBe("function");
|
|
109
|
+
expect(exported.AGREEMENT_NAME).toBe("x");
|
|
110
|
+
expect(Array.isArray(exported.DECISIONS)).toBe(true);
|
|
111
|
+
});
|
|
112
|
+
it("transcript SHA-256 + source SHA-256 are recorded", () => {
|
|
113
|
+
const t = "Every commit must have a test.";
|
|
114
|
+
const a = compileAgreement({ transcript: t, name: "x" });
|
|
115
|
+
expect(a.transcriptSha256).toMatch(/^[0-9a-f]{64}$/);
|
|
116
|
+
expect(a.sourceSha256).toMatch(/^[0-9a-f]{64}$/);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
// ── Pair-lock tamper detection ───────────────────────────────────
|
|
120
|
+
describe("verifyAgreementPair — pair-lock tamper detection", () => {
|
|
121
|
+
it("accepts clean pair", () => {
|
|
122
|
+
const t = "Every commit must have a test.";
|
|
123
|
+
const a = compileAgreement({ transcript: t, name: "x" });
|
|
124
|
+
expect(verifyAgreementPair({ agreement: a, transcript: t }).ok).toBe(true);
|
|
125
|
+
});
|
|
126
|
+
it("rejects transcript tampering", () => {
|
|
127
|
+
const t = "Every commit must have a test.";
|
|
128
|
+
const a = compileAgreement({ transcript: t, name: "x" });
|
|
129
|
+
const v = verifyAgreementPair({ agreement: a, transcript: t + " EVIL INJECTION" });
|
|
130
|
+
expect(v.ok).toBe(false);
|
|
131
|
+
expect(v.reason).toContain("transcript sha256 mismatch");
|
|
132
|
+
});
|
|
133
|
+
it("rejects source tampering", () => {
|
|
134
|
+
const t = "Every commit must have a test.";
|
|
135
|
+
const a = compileAgreement({ transcript: t, name: "x" });
|
|
136
|
+
const tampered = { ...a, generatedSource: a.generatedSource + "\n// EVIL\n" };
|
|
137
|
+
const v = verifyAgreementPair({ agreement: tampered, transcript: t });
|
|
138
|
+
expect(v.ok).toBe(false);
|
|
139
|
+
expect(v.reason).toContain("generated source sha256 mismatch");
|
|
140
|
+
});
|
|
141
|
+
it("rejects decisions tampering (sig mismatch even when sha cached)", () => {
|
|
142
|
+
const t = "Every commit must have a test.";
|
|
143
|
+
const a = compileAgreement({ transcript: t, name: "x" });
|
|
144
|
+
const tampered = { ...a, decisions: [...a.decisions, { text: "EVIL DECISION", pattern: "manual", params: {}, detectedAt: 0, confidence: 1 }] };
|
|
145
|
+
expect(verifyAgreementPair({ agreement: tampered, transcript: t }).ok).toBe(false);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
// ── runAgreement — checkers actually work ─────────────────────────
|
|
149
|
+
describe("runAgreement — native checkers fire correctly", () => {
|
|
150
|
+
it("test_required: BLOCKS commit without test file", () => {
|
|
151
|
+
const a = compileAgreement({ transcript: "Every commit must have a test.", name: "x" });
|
|
152
|
+
const r = runAgreement({ agreement: a, target: { filesChanged: ["src/foo.ts"] } });
|
|
153
|
+
const checks = r.filter((x) => x.pattern === "test_required");
|
|
154
|
+
expect(checks[0].ok).toBe(false);
|
|
155
|
+
expect(checks[0].severity).toBe("block");
|
|
156
|
+
});
|
|
157
|
+
it("test_required: PASSES when commit includes test file", () => {
|
|
158
|
+
const a = compileAgreement({ transcript: "Every commit must have a test.", name: "x" });
|
|
159
|
+
const r = runAgreement({ agreement: a, target: { filesChanged: ["src/foo.ts", "src/foo.test.ts"] } });
|
|
160
|
+
expect(r.find((x) => x.pattern === "test_required").ok).toBe(true);
|
|
161
|
+
});
|
|
162
|
+
it("timing_safe_equal_required: BLOCKS when HMAC compared with ===", () => {
|
|
163
|
+
const a = compileAgreement({ transcript: "All HMAC compares must use timingSafeEqual.", name: "x" });
|
|
164
|
+
const r = runAgreement({ agreement: a, target: { diffText: "if (computedHmac === claimedHmac) { return true; }" } });
|
|
165
|
+
expect(r.find((x) => x.pattern === "timing_safe_equal_required").ok).toBe(false);
|
|
166
|
+
});
|
|
167
|
+
it("timing_safe_equal_required: PASSES when timingSafeEqual is used", () => {
|
|
168
|
+
const a = compileAgreement({ transcript: "All HMAC compares must use timingSafeEqual.", name: "x" });
|
|
169
|
+
const r = runAgreement({ agreement: a, target: { diffText: "timingSafeEqual(Buffer.from(hmac, 'hex'), Buffer.from(claimed, 'hex'))" } });
|
|
170
|
+
expect(r.find((x) => x.pattern === "timing_safe_equal_required").ok).toBe(true);
|
|
171
|
+
});
|
|
172
|
+
it("no_console_log: WARNS when console.log found", () => {
|
|
173
|
+
const a = compileAgreement({ transcript: "No console.log in production.", name: "x" });
|
|
174
|
+
const r = runAgreement({ agreement: a, target: { diffText: "console.log('debug')" } });
|
|
175
|
+
const c = r.find((x) => x.pattern === "no_console_log");
|
|
176
|
+
expect(c.ok).toBe(false);
|
|
177
|
+
expect(c.severity).toBe("warn");
|
|
178
|
+
});
|
|
179
|
+
it("no_direct_push_main: BLOCKS on main branch", () => {
|
|
180
|
+
const a = compileAgreement({ transcript: "Never push directly to main.", name: "x" });
|
|
181
|
+
const r = runAgreement({ agreement: a, target: { branch: "main" } });
|
|
182
|
+
expect(r.find((x) => x.pattern === "no_direct_push_main").ok).toBe(false);
|
|
183
|
+
});
|
|
184
|
+
it("no_secret_in_code: BLOCKS when sk-... key present in diff", () => {
|
|
185
|
+
const a = compileAgreement({ transcript: "Never commit secrets in source.", name: "x" });
|
|
186
|
+
const r = runAgreement({ agreement: a, target: { diffText: "const KEY = 'sk-proj-abc1234567890123456789';" } });
|
|
187
|
+
const c = r.find((x) => x.pattern === "no_secret_in_code");
|
|
188
|
+
expect(c.ok).toBe(false);
|
|
189
|
+
expect(c.severity).toBe("block");
|
|
190
|
+
});
|
|
191
|
+
it("must_have_changelog: BLOCKS when CHANGELOG not touched", () => {
|
|
192
|
+
const a = compileAgreement({ transcript: "Every release must update changelog.", name: "x" });
|
|
193
|
+
const r = runAgreement({ agreement: a, target: { filesChanged: ["src/foo.ts"] } });
|
|
194
|
+
expect(r.find((x) => x.pattern === "must_have_changelog").ok).toBe(false);
|
|
195
|
+
});
|
|
196
|
+
it("manual: marks as warn requiring review", () => {
|
|
197
|
+
const a = compileAgreement({ transcript: "You must arrange the file imports alphabetically.", name: "x" });
|
|
198
|
+
const r = runAgreement({ agreement: a, target: {} });
|
|
199
|
+
const manual = r.find((x) => x.pattern === "manual");
|
|
200
|
+
expect(manual.ok).toBe(false);
|
|
201
|
+
expect(manual.severity).toBe("warn");
|
|
202
|
+
expect(manual.reason).toContain("manual review required");
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
// ── Persistence + load round-trip ────────────────────────────────
|
|
206
|
+
describe("persist + load round-trip", () => {
|
|
207
|
+
it("persists 3 files: .json, .mjs, .transcript.txt", () => {
|
|
208
|
+
const t = "Every commit must have a test.";
|
|
209
|
+
const a = compileAgreement({ transcript: t, name: "round-trip" });
|
|
210
|
+
const dir = mkdtempSync(join(tmpdir(), "mneme-agreement-"));
|
|
211
|
+
const p = persistAgreement({ agreement: a, transcript: t, baseDir: dir });
|
|
212
|
+
expect(existsSync(p.agreementJsonPath)).toBe(true);
|
|
213
|
+
expect(existsSync(p.generatedSourcePath)).toBe(true);
|
|
214
|
+
expect(existsSync(p.transcriptPath)).toBe(true);
|
|
215
|
+
const loaded = loadAgreement({ agreementJsonPath: p.agreementJsonPath, transcriptPath: p.transcriptPath });
|
|
216
|
+
expect(loaded.verified).toBe(true);
|
|
217
|
+
expect(loaded.agreement.agreementId).toBe(a.agreementId);
|
|
218
|
+
});
|
|
219
|
+
it("listAgreements returns persisted IDs", () => {
|
|
220
|
+
const dir = mkdtempSync(join(tmpdir(), "mneme-agreements-list-"));
|
|
221
|
+
const a = compileAgreement({ transcript: "Every commit must have a test.", name: "first" });
|
|
222
|
+
const b = compileAgreement({ transcript: "Never push to main.", name: "second" });
|
|
223
|
+
persistAgreement({ agreement: a, transcript: "Every commit must have a test.", baseDir: dir });
|
|
224
|
+
persistAgreement({ agreement: b, transcript: "Never push to main.", baseDir: dir });
|
|
225
|
+
const list = listAgreements(dir);
|
|
226
|
+
expect(list.length).toBe(2);
|
|
227
|
+
});
|
|
228
|
+
it("loadAgreement reports verified=false on tampered transcript file", () => {
|
|
229
|
+
const t = "Every commit must have a test.";
|
|
230
|
+
const a = compileAgreement({ transcript: t, name: "x" });
|
|
231
|
+
const dir = mkdtempSync(join(tmpdir(), "mneme-tamper-"));
|
|
232
|
+
const p = persistAgreement({ agreement: a, transcript: t, baseDir: dir });
|
|
233
|
+
// tamper the on-disk transcript
|
|
234
|
+
const { writeFileSync } = require("node:fs");
|
|
235
|
+
writeFileSync(p.transcriptPath, t + " EVIL", "utf8");
|
|
236
|
+
const loaded = loadAgreement({ agreementJsonPath: p.agreementJsonPath, transcriptPath: p.transcriptPath });
|
|
237
|
+
expect(loaded.verified).toBe(false);
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
// ── Killer demo ──────────────────────────────────────────────────
|
|
241
|
+
describe("killer demo — pre-commit hook integration", () => {
|
|
242
|
+
it("generatePreCommitHook emits runnable script that exits 1 on blocked checks", () => {
|
|
243
|
+
const a = compileAgreement({ transcript: "Every commit must have a test.", name: "block-no-tests" });
|
|
244
|
+
const hook = generatePreCommitHook({
|
|
245
|
+
agreementJsonPath: "/path/to/agreement.json",
|
|
246
|
+
transcriptPath: "/path/to/transcript.txt",
|
|
247
|
+
});
|
|
248
|
+
expect(hook).toContain("#!/usr/bin/env node");
|
|
249
|
+
expect(hook).toContain("loadAgreement");
|
|
250
|
+
expect(hook).toContain("runAgreement");
|
|
251
|
+
expect(hook).toContain("process.exit(blocked ? 1 : 0)");
|
|
252
|
+
expect(hook).toContain("git diff --cached --name-only");
|
|
253
|
+
});
|
|
254
|
+
it("end-to-end: user says 'every commit must have test' → compile → run → blocks naked commit", () => {
|
|
255
|
+
// Simulate the conversation
|
|
256
|
+
const transcript = "User: from now on, every commit must have a test. Assistant: agreed.";
|
|
257
|
+
// Mneme compiles
|
|
258
|
+
const agreement = compileAgreement({ transcript, name: "team-rule" });
|
|
259
|
+
expect(agreement.decisions.some((d) => d.pattern === "test_required")).toBe(true);
|
|
260
|
+
// Future commit attempt: no test file in changeset
|
|
261
|
+
const r = runAgreement({ agreement, target: { filesChanged: ["src/feature.ts"] } });
|
|
262
|
+
const blocked = r.some((x) => !x.ok && x.severity === "block");
|
|
263
|
+
expect(blocked).toBe(true);
|
|
264
|
+
// Same agreement, with test file — passes
|
|
265
|
+
const r2 = runAgreement({ agreement, target: { filesChanged: ["src/feature.ts", "src/feature.test.ts"] } });
|
|
266
|
+
const stillBlocked = r2.some((x) => !x.ok && x.severity === "block");
|
|
267
|
+
expect(stillBlocked).toBe(false);
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
// ── Formatters ───────────────────────────────────────────────────
|
|
271
|
+
describe("formatters", () => {
|
|
272
|
+
it("formatAgreementLine + formatCheckSummary emit short summaries", () => {
|
|
273
|
+
const a = compileAgreement({ transcript: "Every commit must have a test.", name: "x" });
|
|
274
|
+
expect(formatAgreementLine(a)).toContain("AGREEMENT");
|
|
275
|
+
const r = runAgreement({ agreement: a, target: { filesChanged: ["src/foo.ts"] } });
|
|
276
|
+
expect(formatCheckSummary(r)).toContain("BLOCKED");
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
//# sourceMappingURL=conversation_compiler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation_compiler.test.js","sourceRoot":"","sources":["../../src/conversation_compiler/conversation_compiler.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.6 — MNEME CONVERSATION COMPILER (chat → deterministic, signed, callable artifact)
|
|
3
|
+
*
|
|
4
|
+
* "Every conversation with an AI produces decisions ('every commit
|
|
5
|
+
* must have a test', 'all HMAC compares use timingSafeEqual', 'ห้าม
|
|
6
|
+
* push บน main directly'). Today those decisions are markdown ADRs
|
|
7
|
+
* that drift, get re-interpreted, or get forgotten. CONVERSATION
|
|
8
|
+
* COMPILER changes that:
|
|
9
|
+
*
|
|
10
|
+
* transcript → decisions[] → executable checkers → signed
|
|
11
|
+
* pair-locked artifact (transcript + code share one HMAC).
|
|
12
|
+
*
|
|
13
|
+
* Future sessions IMPORT the artifact instead of re-discussing.
|
|
14
|
+
* A pre-commit hook can run the artifact's checkers and refuse
|
|
15
|
+
* commits that violate any agreement. Drift becomes impossible —
|
|
16
|
+
* the agreement is code."
|
|
17
|
+
*
|
|
18
|
+
* Honest scope:
|
|
19
|
+
* - Mneme does NOT compile arbitrary natural language into arbitrary
|
|
20
|
+
* executable logic. That's still an NLP grand challenge.
|
|
21
|
+
* - What Mneme DOES: detect a curated set of common agreement patterns
|
|
22
|
+
* (test-required / timingSafeEqual / no-console-log / no-direct-push
|
|
23
|
+
* to main / has-hmac / etc.) AND wrap UNKNOWN patterns as
|
|
24
|
+
* manual-review stubs. Pattern coverage grows release-over-release.
|
|
25
|
+
* - The artifact is a deterministic JSON + a human-readable ES module
|
|
26
|
+
* source. We do NOT bundle wasm-pack. Same semantics: deterministic +
|
|
27
|
+
* replayable + tamper-evident. True Rust-WASM is a future enhancement
|
|
28
|
+
* callers can layer on top.
|
|
29
|
+
* - The HMAC is over (canonical agreement JSON + transcript). Tampering
|
|
30
|
+
* EITHER side breaks the pair-lock.
|
|
31
|
+
*
|
|
32
|
+
* Composes onto v2.19.5 CHRONOSTASIS (agreements can become axioms),
|
|
33
|
+
* v2.19.3 INVERSE FORENSICS (witness audit each decision), v2.14
|
|
34
|
+
* PROJECT SOUL (agreement violations escalate to SOUL gate). Pure
|
|
35
|
+
* additive layer; zero breaking.
|
|
36
|
+
*/
|
|
37
|
+
declare const PROTOCOL_VERSION: 1;
|
|
38
|
+
export type PatternKind = "test_required" | "timing_safe_equal_required" | "no_console_log" | "no_direct_push_main" | "has_hmac" | "no_secret_in_code" | "must_have_changelog" | "manual";
|
|
39
|
+
export interface Decision {
|
|
40
|
+
/** Raw text matched from the conversation. */
|
|
41
|
+
text: string;
|
|
42
|
+
/** Auto-detected pattern (or 'manual' if unrecognised). */
|
|
43
|
+
pattern: PatternKind;
|
|
44
|
+
/** Per-pattern parameters (regex needles, file globs, etc.). */
|
|
45
|
+
params: Record<string, string | number | boolean>;
|
|
46
|
+
/** Where in the transcript this decision was detected (char offset). */
|
|
47
|
+
detectedAt: number;
|
|
48
|
+
/** Confidence the extraction is correct (0..1). */
|
|
49
|
+
confidence: number;
|
|
50
|
+
}
|
|
51
|
+
export interface Agreement {
|
|
52
|
+
v: typeof PROTOCOL_VERSION;
|
|
53
|
+
agreementId: string;
|
|
54
|
+
name: string;
|
|
55
|
+
decisions: Decision[];
|
|
56
|
+
/** SHA-256 of the transcript (so we don't store transcript twice). */
|
|
57
|
+
transcriptSha256: string;
|
|
58
|
+
/** SHA-256 of the generated source code (for cross-verification). */
|
|
59
|
+
sourceSha256: string;
|
|
60
|
+
/** Generated ES module source (deterministic from decisions). */
|
|
61
|
+
generatedSource: string;
|
|
62
|
+
proposedBy: string;
|
|
63
|
+
compiledAt: string;
|
|
64
|
+
/** HMAC over (canonical agreement body without sig) + transcript. */
|
|
65
|
+
sig: string;
|
|
66
|
+
}
|
|
67
|
+
export interface CheckTarget {
|
|
68
|
+
/** Files added/changed in the staged diff or commit. */
|
|
69
|
+
filesChanged?: string[];
|
|
70
|
+
/** Full text of all changed files concatenated (for grep-style checks). */
|
|
71
|
+
diffText?: string;
|
|
72
|
+
/** Optional commit message. */
|
|
73
|
+
commitMessage?: string;
|
|
74
|
+
/** Optional current branch name. */
|
|
75
|
+
branch?: string;
|
|
76
|
+
/** Free-form additional context. */
|
|
77
|
+
extra?: Record<string, unknown>;
|
|
78
|
+
}
|
|
79
|
+
export interface CheckResult {
|
|
80
|
+
decisionText: string;
|
|
81
|
+
pattern: PatternKind;
|
|
82
|
+
ok: boolean;
|
|
83
|
+
reason: string;
|
|
84
|
+
/** If ok=false, severity hint for UI. */
|
|
85
|
+
severity?: "info" | "warn" | "block";
|
|
86
|
+
}
|
|
87
|
+
export declare function extractDecisions(input: {
|
|
88
|
+
transcript: string;
|
|
89
|
+
}): Decision[];
|
|
90
|
+
export interface CompileInput {
|
|
91
|
+
transcript: string;
|
|
92
|
+
name: string;
|
|
93
|
+
proposedBy?: string;
|
|
94
|
+
decisions?: Decision[];
|
|
95
|
+
compiledAt?: string;
|
|
96
|
+
secret?: string;
|
|
97
|
+
}
|
|
98
|
+
export declare function compileAgreement(input: CompileInput): Agreement;
|
|
99
|
+
export declare function verifyAgreementPair(input: {
|
|
100
|
+
agreement: Agreement;
|
|
101
|
+
transcript: string;
|
|
102
|
+
secret?: string;
|
|
103
|
+
}): {
|
|
104
|
+
ok: boolean;
|
|
105
|
+
reason?: string;
|
|
106
|
+
};
|
|
107
|
+
export declare function runAgreement(input: {
|
|
108
|
+
agreement: Agreement;
|
|
109
|
+
target: CheckTarget;
|
|
110
|
+
}): CheckResult[];
|
|
111
|
+
export interface PersistResult {
|
|
112
|
+
agreementJsonPath: string;
|
|
113
|
+
generatedSourcePath: string;
|
|
114
|
+
transcriptPath: string;
|
|
115
|
+
}
|
|
116
|
+
export declare function persistAgreement(input: {
|
|
117
|
+
agreement: Agreement;
|
|
118
|
+
transcript: string;
|
|
119
|
+
baseDir?: string;
|
|
120
|
+
}): PersistResult;
|
|
121
|
+
export declare function loadAgreement(input: {
|
|
122
|
+
agreementJsonPath: string;
|
|
123
|
+
transcriptPath: string;
|
|
124
|
+
secret?: string;
|
|
125
|
+
}): {
|
|
126
|
+
agreement: Agreement;
|
|
127
|
+
transcript: string;
|
|
128
|
+
verified: boolean;
|
|
129
|
+
reason?: string;
|
|
130
|
+
};
|
|
131
|
+
export declare function listAgreements(baseDir?: string): string[];
|
|
132
|
+
export interface UninstallInput {
|
|
133
|
+
agreementId?: string;
|
|
134
|
+
agreementJsonPath?: string;
|
|
135
|
+
baseDir?: string;
|
|
136
|
+
/** Path to pre-commit hook to remove (if installed). */
|
|
137
|
+
hookPath?: string;
|
|
138
|
+
}
|
|
139
|
+
export interface UninstallResult {
|
|
140
|
+
removed: string[];
|
|
141
|
+
notFound: string[];
|
|
142
|
+
hookRemoved: boolean;
|
|
143
|
+
}
|
|
144
|
+
export declare function uninstallAgreement(input: UninstallInput): UninstallResult;
|
|
145
|
+
export declare function formatAgreementLine(a: Agreement): string;
|
|
146
|
+
export declare function formatCheckSummary(results: CheckResult[]): string;
|
|
147
|
+
/**
|
|
148
|
+
* Generate a pre-commit-hook script (shell + node one-liner) that loads
|
|
149
|
+
* the agreement, runs the staged diff against its checkers, and exits 1
|
|
150
|
+
* on any blocked check.
|
|
151
|
+
*/
|
|
152
|
+
export declare function generatePreCommitHook(input: {
|
|
153
|
+
agreementJsonPath: string;
|
|
154
|
+
transcriptPath: string;
|
|
155
|
+
}): string;
|
|
156
|
+
export {};
|
|
157
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conversation_compiler/index.ts"],"names":[],"mappings":"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"}
|