@zhuwenqa/governed-memory 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +14 -0
- package/dist/cli.js +490 -0
- package/dist/cli.js.map +7 -0
- package/dist/mcp.js +22144 -0
- package/dist/mcp.js.map +7 -0
- package/package.json +36 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Governed Agent Memory contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# @zhuwenqa/governed-memory
|
|
2
|
+
|
|
3
|
+
Installable command package for Governed Agent Memory.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install -g @zhuwenqa/governed-memory
|
|
7
|
+
governed-memory doctor
|
|
8
|
+
governed-memory mcp-config --host claude-code
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
It exposes:
|
|
12
|
+
|
|
13
|
+
- `governed-memory`
|
|
14
|
+
- `governed-memory-mcp`
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// ../core/dist/hash.js
|
|
4
|
+
import { createHash } from "node:crypto";
|
|
5
|
+
function contentHash(content) {
|
|
6
|
+
return createHash("sha256").update(content).digest("hex").slice(0, 16);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// ../core/dist/ids.js
|
|
10
|
+
function createId(prefix) {
|
|
11
|
+
const random = Math.random().toString(36).slice(2, 10);
|
|
12
|
+
return `${prefix}_${Date.now().toString(36)}_${random}`;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// ../core/dist/store.js
|
|
16
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
17
|
+
import { dirname, join } from "node:path";
|
|
18
|
+
function resolveStorePaths(rootDir) {
|
|
19
|
+
return {
|
|
20
|
+
rootDir,
|
|
21
|
+
eventsPath: join(rootDir, "events.jsonl"),
|
|
22
|
+
factsPath: join(rootDir, "facts.jsonl"),
|
|
23
|
+
proposalsPath: join(rootDir, "proposals.jsonl")
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
async function ensureStore(paths) {
|
|
27
|
+
await mkdir(paths.rootDir, { recursive: true });
|
|
28
|
+
await ensureFile(paths.eventsPath);
|
|
29
|
+
await ensureFile(paths.factsPath);
|
|
30
|
+
await ensureFile(paths.proposalsPath);
|
|
31
|
+
}
|
|
32
|
+
async function ensureFile(path) {
|
|
33
|
+
await mkdir(dirname(path), { recursive: true });
|
|
34
|
+
try {
|
|
35
|
+
await readFile(path, "utf8");
|
|
36
|
+
} catch {
|
|
37
|
+
await writeFile(path, "", "utf8");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async function readJsonl(path) {
|
|
41
|
+
let raw = "";
|
|
42
|
+
try {
|
|
43
|
+
raw = await readFile(path, "utf8");
|
|
44
|
+
} catch {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
return raw.split("\n").map((line) => line.trim()).filter(Boolean).map((line) => JSON.parse(line));
|
|
48
|
+
}
|
|
49
|
+
async function writeJsonl(path, records) {
|
|
50
|
+
const body = records.map((record) => JSON.stringify(record)).join("\n");
|
|
51
|
+
await writeFile(path, body ? `${body}
|
|
52
|
+
` : "", "utf8");
|
|
53
|
+
}
|
|
54
|
+
async function appendEvent(paths, event) {
|
|
55
|
+
const events = await readJsonl(paths.eventsPath);
|
|
56
|
+
events.push(event);
|
|
57
|
+
await writeJsonl(paths.eventsPath, events);
|
|
58
|
+
}
|
|
59
|
+
async function readFacts(paths) {
|
|
60
|
+
return readJsonl(paths.factsPath);
|
|
61
|
+
}
|
|
62
|
+
async function writeFacts(paths, facts) {
|
|
63
|
+
await writeJsonl(paths.factsPath, facts);
|
|
64
|
+
}
|
|
65
|
+
async function readProposals(paths) {
|
|
66
|
+
return readJsonl(paths.proposalsPath);
|
|
67
|
+
}
|
|
68
|
+
async function writeProposals(paths, proposals) {
|
|
69
|
+
await writeJsonl(paths.proposalsPath, proposals);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// ../core/dist/core.js
|
|
73
|
+
async function createProposal(paths, input) {
|
|
74
|
+
await ensureStore(paths);
|
|
75
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
76
|
+
const proposal = {
|
|
77
|
+
schemaVersion: 1,
|
|
78
|
+
id: createId("prop"),
|
|
79
|
+
scope: input.scope,
|
|
80
|
+
category: input.category,
|
|
81
|
+
content: input.content,
|
|
82
|
+
evidence: input.evidence,
|
|
83
|
+
whyItMatters: input.whyItMatters,
|
|
84
|
+
confidence: input.confidence,
|
|
85
|
+
status: "pending_review",
|
|
86
|
+
createdAt: now,
|
|
87
|
+
updatedAt: now,
|
|
88
|
+
version: 1,
|
|
89
|
+
contentHash: contentHash(input.content)
|
|
90
|
+
};
|
|
91
|
+
const event = {
|
|
92
|
+
schemaVersion: 1,
|
|
93
|
+
id: createId("evt"),
|
|
94
|
+
type: "proposal.created",
|
|
95
|
+
actor: input.actor ?? "agent",
|
|
96
|
+
createdAt: now,
|
|
97
|
+
payload: { proposal }
|
|
98
|
+
};
|
|
99
|
+
const proposals = await readProposals(paths);
|
|
100
|
+
proposals.push(proposal);
|
|
101
|
+
await writeProposals(paths, proposals);
|
|
102
|
+
await appendEvent(paths, event);
|
|
103
|
+
return proposal;
|
|
104
|
+
}
|
|
105
|
+
async function approveProposal(paths, input) {
|
|
106
|
+
return approveProposalWithContent(paths, input, void 0, "proposal.approved");
|
|
107
|
+
}
|
|
108
|
+
async function editAndApproveProposal(paths, input) {
|
|
109
|
+
return approveProposalWithContent(paths, input, input.content, "proposal.edited_and_approved");
|
|
110
|
+
}
|
|
111
|
+
async function rejectProposal(paths, input) {
|
|
112
|
+
return updateProposalStatus(paths, input, "rejected", "proposal.rejected");
|
|
113
|
+
}
|
|
114
|
+
async function deferProposal(paths, input) {
|
|
115
|
+
return updateProposalStatus(paths, input, "deferred", "proposal.deferred");
|
|
116
|
+
}
|
|
117
|
+
async function listPending(paths) {
|
|
118
|
+
await ensureStore(paths);
|
|
119
|
+
const proposals = await readProposals(paths);
|
|
120
|
+
return proposals.filter((proposal) => proposal.status === "pending_review");
|
|
121
|
+
}
|
|
122
|
+
async function queryMemory(paths, input = {}) {
|
|
123
|
+
await ensureStore(paths);
|
|
124
|
+
const query = input.query?.toLowerCase();
|
|
125
|
+
const limit = input.limit ?? 8;
|
|
126
|
+
const facts = (await readFacts(paths)).filter((fact) => fact.status === "active").filter((fact) => !input.scope || fact.scope === input.scope).filter((fact) => !input.category || fact.category === input.category).filter((fact) => !query || fact.content.toLowerCase().includes(query)).slice(0, limit);
|
|
127
|
+
const pendingRelatedProposals = (await readProposals(paths)).filter((proposal) => proposal.status === "pending_review").filter((proposal) => !input.scope || proposal.scope === input.scope).filter((proposal) => !input.category || proposal.category === input.category).filter((proposal) => !query || proposal.content.toLowerCase().includes(query)).slice(0, limit);
|
|
128
|
+
return { facts, pendingRelatedProposals };
|
|
129
|
+
}
|
|
130
|
+
async function approveProposalWithContent(paths, input, editedContent, eventType) {
|
|
131
|
+
await ensureStore(paths);
|
|
132
|
+
const proposals = await readProposals(paths);
|
|
133
|
+
const proposal = findPendingProposal(proposals, input.proposalId);
|
|
134
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
135
|
+
const approvedContent = editedContent ?? proposal.content;
|
|
136
|
+
const eventId = createId("evt");
|
|
137
|
+
const fact = {
|
|
138
|
+
schemaVersion: 1,
|
|
139
|
+
id: createId("fact"),
|
|
140
|
+
scope: proposal.scope,
|
|
141
|
+
category: proposal.category,
|
|
142
|
+
content: approvedContent,
|
|
143
|
+
status: "active",
|
|
144
|
+
sourceProposalId: proposal.id,
|
|
145
|
+
approvedEventId: eventId,
|
|
146
|
+
createdAt: now,
|
|
147
|
+
approvedAt: now
|
|
148
|
+
};
|
|
149
|
+
proposal.status = eventType === "proposal.approved" ? "approved" : "edited_and_approved";
|
|
150
|
+
proposal.content = approvedContent;
|
|
151
|
+
proposal.contentHash = contentHash(approvedContent);
|
|
152
|
+
proposal.updatedAt = now;
|
|
153
|
+
proposal.version += 1;
|
|
154
|
+
const event = {
|
|
155
|
+
schemaVersion: 1,
|
|
156
|
+
id: eventId,
|
|
157
|
+
type: eventType,
|
|
158
|
+
actor: input.actor ?? "human",
|
|
159
|
+
createdAt: now,
|
|
160
|
+
payload: { proposalId: proposal.id, factId: fact.id, approvedContent }
|
|
161
|
+
};
|
|
162
|
+
const facts = await readFacts(paths);
|
|
163
|
+
facts.push(fact);
|
|
164
|
+
await writeFacts(paths, facts);
|
|
165
|
+
await writeProposals(paths, proposals);
|
|
166
|
+
await appendEvent(paths, event);
|
|
167
|
+
return fact;
|
|
168
|
+
}
|
|
169
|
+
async function updateProposalStatus(paths, input, status, eventType) {
|
|
170
|
+
await ensureStore(paths);
|
|
171
|
+
const proposals = await readProposals(paths);
|
|
172
|
+
const proposal = findPendingProposal(proposals, input.proposalId);
|
|
173
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
174
|
+
proposal.status = status;
|
|
175
|
+
proposal.updatedAt = now;
|
|
176
|
+
proposal.version += 1;
|
|
177
|
+
const event = {
|
|
178
|
+
schemaVersion: 1,
|
|
179
|
+
id: createId("evt"),
|
|
180
|
+
type: eventType,
|
|
181
|
+
actor: input.actor ?? "human",
|
|
182
|
+
createdAt: now,
|
|
183
|
+
payload: { proposalId: proposal.id }
|
|
184
|
+
};
|
|
185
|
+
await writeProposals(paths, proposals);
|
|
186
|
+
await appendEvent(paths, event);
|
|
187
|
+
return proposal;
|
|
188
|
+
}
|
|
189
|
+
function findPendingProposal(proposals, proposalId) {
|
|
190
|
+
const proposal = proposals.find((candidate) => candidate.id === proposalId);
|
|
191
|
+
if (!proposal) {
|
|
192
|
+
throw new Error(`Proposal not found: ${proposalId}`);
|
|
193
|
+
}
|
|
194
|
+
if (proposal.status !== "pending_review") {
|
|
195
|
+
throw new Error(`Proposal is not pending review: ${proposalId}`);
|
|
196
|
+
}
|
|
197
|
+
return proposal;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// ../obsidian-export/dist/index.js
|
|
201
|
+
function renderInboxMarkdown(proposals) {
|
|
202
|
+
const sections = proposals.map((proposal) => {
|
|
203
|
+
return `## ${proposal.id}
|
|
204
|
+
|
|
205
|
+
Scope: ${proposal.scope}
|
|
206
|
+
Category: ${proposal.category}
|
|
207
|
+
Status: ${proposal.status}
|
|
208
|
+
Version: ${proposal.version}
|
|
209
|
+
Content Hash: ${proposal.contentHash}
|
|
210
|
+
|
|
211
|
+
> ${proposal.content}
|
|
212
|
+
|
|
213
|
+
Evidence:
|
|
214
|
+
- ${proposal.evidence}
|
|
215
|
+
|
|
216
|
+
Decision:
|
|
217
|
+
- [ ] Approve
|
|
218
|
+
- [ ] Edit and approve
|
|
219
|
+
- [ ] Reject
|
|
220
|
+
- [ ] Defer
|
|
221
|
+
`;
|
|
222
|
+
});
|
|
223
|
+
return ["# Memory Inbox", "", ...sections].join("\n");
|
|
224
|
+
}
|
|
225
|
+
function renderApprovedMemoriesMarkdown(facts) {
|
|
226
|
+
const sections = facts.map((fact) => {
|
|
227
|
+
return `## ${fact.id}
|
|
228
|
+
|
|
229
|
+
Scope: ${fact.scope}
|
|
230
|
+
Category: ${fact.category}
|
|
231
|
+
Status: ${fact.status}
|
|
232
|
+
Approved: ${fact.approvedAt}
|
|
233
|
+
|
|
234
|
+
${fact.content}
|
|
235
|
+
`;
|
|
236
|
+
});
|
|
237
|
+
return ["# Approved Memories", "", ...sections].join("\n");
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// ../cli/dist/index.js
|
|
241
|
+
import { mkdir as mkdir2, writeFile as writeFile2 } from "node:fs/promises";
|
|
242
|
+
import { join as join3, resolve as resolve2 } from "node:path";
|
|
243
|
+
import { pathToFileURL } from "node:url";
|
|
244
|
+
|
|
245
|
+
// ../cli/dist/paths.js
|
|
246
|
+
import { join as join2, resolve } from "node:path";
|
|
247
|
+
import { homedir } from "node:os";
|
|
248
|
+
function resolveCliStore(projectArg) {
|
|
249
|
+
const root = projectArg ? join2(resolve(projectArg), ".governed-memory") : join2(homedir(), ".governed-memory", "global");
|
|
250
|
+
return resolveStorePaths(root);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// ../cli/dist/index.js
|
|
254
|
+
async function runCli(argv = process.argv.slice(2)) {
|
|
255
|
+
const args = parseArgs(argv);
|
|
256
|
+
const paths = resolveCliStore(stringFlag(args.flags.project));
|
|
257
|
+
switch (args.command) {
|
|
258
|
+
case void 0:
|
|
259
|
+
case "help":
|
|
260
|
+
case "--help":
|
|
261
|
+
case "-h":
|
|
262
|
+
printHelp();
|
|
263
|
+
break;
|
|
264
|
+
case "init":
|
|
265
|
+
await ensureStore(paths);
|
|
266
|
+
console.log(`Initialized governed memory store at ${paths.rootDir}`);
|
|
267
|
+
break;
|
|
268
|
+
case "propose": {
|
|
269
|
+
const content = requiredString(args.flags.content, "--content is required");
|
|
270
|
+
const evidence = requiredString(args.flags.evidence, "--evidence is required");
|
|
271
|
+
const proposal = await createProposal(paths, {
|
|
272
|
+
scope: scopeFlag(args.flags.scope),
|
|
273
|
+
category: stringFlag(args.flags.category) ?? "general",
|
|
274
|
+
content,
|
|
275
|
+
evidence,
|
|
276
|
+
whyItMatters: stringFlag(args.flags.why),
|
|
277
|
+
confidence: numberFlag(args.flags.confidence)
|
|
278
|
+
});
|
|
279
|
+
console.log(JSON.stringify(proposal, null, 2));
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
case "inbox": {
|
|
283
|
+
const pending = await listPending(paths);
|
|
284
|
+
if (pending.length === 0) {
|
|
285
|
+
console.log("No pending memory proposals.");
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
288
|
+
for (const proposal of pending) {
|
|
289
|
+
console.log(`[${proposal.id}] ${proposal.scope} / ${proposal.category}`);
|
|
290
|
+
console.log(proposal.content);
|
|
291
|
+
console.log(`Evidence: ${proposal.evidence}`);
|
|
292
|
+
console.log("");
|
|
293
|
+
}
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
case "approve": {
|
|
297
|
+
const proposalId = requiredPositional(args.positionals[0], "proposal id is required");
|
|
298
|
+
const fact = await approveProposal(paths, { proposalId });
|
|
299
|
+
console.log(JSON.stringify(fact, null, 2));
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
case "reject": {
|
|
303
|
+
const proposalId = requiredPositional(args.positionals[0], "proposal id is required");
|
|
304
|
+
const proposal = await rejectProposal(paths, { proposalId });
|
|
305
|
+
console.log(JSON.stringify(proposal, null, 2));
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
case "defer": {
|
|
309
|
+
const proposalId = requiredPositional(args.positionals[0], "proposal id is required");
|
|
310
|
+
const proposal = await deferProposal(paths, { proposalId });
|
|
311
|
+
console.log(JSON.stringify(proposal, null, 2));
|
|
312
|
+
break;
|
|
313
|
+
}
|
|
314
|
+
case "edit": {
|
|
315
|
+
const proposalId = requiredPositional(args.positionals[0], "proposal id is required");
|
|
316
|
+
const content = requiredString(args.flags.content, "--content is required");
|
|
317
|
+
const fact = await editAndApproveProposal(paths, { proposalId, content });
|
|
318
|
+
console.log(JSON.stringify(fact, null, 2));
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
case "query": {
|
|
322
|
+
const result = await queryMemory(paths, {
|
|
323
|
+
scope: optionalScopeFlag(args.flags.scope),
|
|
324
|
+
category: stringFlag(args.flags.category),
|
|
325
|
+
query: stringFlag(args.flags.query),
|
|
326
|
+
limit: numberFlag(args.flags.limit)
|
|
327
|
+
});
|
|
328
|
+
console.log(JSON.stringify(result, null, 2));
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
case "status": {
|
|
332
|
+
await ensureStore(paths);
|
|
333
|
+
const pending = await listPending(paths);
|
|
334
|
+
console.log(`${pending.length} pending proposal${pending.length === 1 ? "" : "s"}`);
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
case "doctor": {
|
|
338
|
+
await runDoctor(stringFlag(args.flags.project));
|
|
339
|
+
break;
|
|
340
|
+
}
|
|
341
|
+
case "mcp-config": {
|
|
342
|
+
printMcpConfig({
|
|
343
|
+
host: stringFlag(args.flags.host) ?? "claude-code",
|
|
344
|
+
project: stringFlag(args.flags.project) ?? "${PWD}"
|
|
345
|
+
});
|
|
346
|
+
break;
|
|
347
|
+
}
|
|
348
|
+
case "export-md": {
|
|
349
|
+
await ensureStore(paths);
|
|
350
|
+
const outputDir = resolve2(stringFlag(args.flags.output) ?? ".");
|
|
351
|
+
await mkdir2(outputDir, { recursive: true });
|
|
352
|
+
const [pending, facts] = await Promise.all([listPending(paths), readFacts(paths)]);
|
|
353
|
+
const inboxPath = join3(outputDir, "Memory Inbox.md");
|
|
354
|
+
const approvedPath = join3(outputDir, "Approved Memories.md");
|
|
355
|
+
await writeFile2(inboxPath, renderInboxMarkdown(pending), "utf8");
|
|
356
|
+
await writeFile2(approvedPath, renderApprovedMemoriesMarkdown(facts), "utf8");
|
|
357
|
+
console.log(`Wrote ${inboxPath}`);
|
|
358
|
+
console.log(`Wrote ${approvedPath}`);
|
|
359
|
+
break;
|
|
360
|
+
}
|
|
361
|
+
default:
|
|
362
|
+
printHelp();
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
function parseArgs(argv) {
|
|
366
|
+
const [command, ...rest] = argv;
|
|
367
|
+
const positionals = [];
|
|
368
|
+
const flags = {};
|
|
369
|
+
for (let index = 0; index < rest.length; index += 1) {
|
|
370
|
+
const value = rest[index];
|
|
371
|
+
if (!value?.startsWith("--")) {
|
|
372
|
+
if (value)
|
|
373
|
+
positionals.push(value);
|
|
374
|
+
continue;
|
|
375
|
+
}
|
|
376
|
+
const flagName = value.slice(2);
|
|
377
|
+
const next = rest[index + 1];
|
|
378
|
+
if (!next || next.startsWith("--")) {
|
|
379
|
+
flags[flagName] = true;
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
382
|
+
flags[flagName] = next;
|
|
383
|
+
index += 1;
|
|
384
|
+
}
|
|
385
|
+
return { command, positionals, flags };
|
|
386
|
+
}
|
|
387
|
+
function stringFlag(value) {
|
|
388
|
+
return typeof value === "string" ? value : void 0;
|
|
389
|
+
}
|
|
390
|
+
function requiredString(value, message) {
|
|
391
|
+
const parsed = stringFlag(value);
|
|
392
|
+
if (!parsed)
|
|
393
|
+
throw new Error(message);
|
|
394
|
+
return parsed;
|
|
395
|
+
}
|
|
396
|
+
function numberFlag(value) {
|
|
397
|
+
const parsed = stringFlag(value);
|
|
398
|
+
if (!parsed)
|
|
399
|
+
return void 0;
|
|
400
|
+
return Number(parsed);
|
|
401
|
+
}
|
|
402
|
+
function scopeFlag(value) {
|
|
403
|
+
return optionalScopeFlag(value) ?? "project";
|
|
404
|
+
}
|
|
405
|
+
function optionalScopeFlag(value) {
|
|
406
|
+
const parsed = stringFlag(value);
|
|
407
|
+
if (!parsed)
|
|
408
|
+
return void 0;
|
|
409
|
+
if (["global", "project", "machine", "session"].includes(parsed)) {
|
|
410
|
+
return parsed;
|
|
411
|
+
}
|
|
412
|
+
throw new Error(`Invalid scope: ${parsed}`);
|
|
413
|
+
}
|
|
414
|
+
function requiredPositional(value, message) {
|
|
415
|
+
if (!value)
|
|
416
|
+
throw new Error(message);
|
|
417
|
+
return value;
|
|
418
|
+
}
|
|
419
|
+
function printHelp() {
|
|
420
|
+
console.log(`governed-memory
|
|
421
|
+
|
|
422
|
+
Commands:
|
|
423
|
+
help
|
|
424
|
+
init [--project <path>]
|
|
425
|
+
propose --content <text> --evidence <text> [--scope project] [--category workflow]
|
|
426
|
+
inbox [--project <path>]
|
|
427
|
+
approve <proposal-id> [--project <path>]
|
|
428
|
+
edit <proposal-id> --content <text> [--project <path>]
|
|
429
|
+
reject <proposal-id> [--project <path>]
|
|
430
|
+
defer <proposal-id> [--project <path>]
|
|
431
|
+
query [--query <text>] [--scope project] [--category workflow]
|
|
432
|
+
export-md --output <dir> [--project <path>]
|
|
433
|
+
doctor [--project <path>]
|
|
434
|
+
mcp-config [--host claude-code] [--project <path>]
|
|
435
|
+
status [--project <path>]
|
|
436
|
+
`);
|
|
437
|
+
}
|
|
438
|
+
async function runDoctor(projectArg) {
|
|
439
|
+
const checks = [];
|
|
440
|
+
const nodeMajor = Number(process.versions.node.split(".")[0]);
|
|
441
|
+
checks.push({
|
|
442
|
+
name: "node",
|
|
443
|
+
ok: nodeMajor >= 22,
|
|
444
|
+
detail: `v${process.versions.node}`
|
|
445
|
+
});
|
|
446
|
+
const paths = resolveCliStore(projectArg);
|
|
447
|
+
await ensureStore(paths);
|
|
448
|
+
checks.push({
|
|
449
|
+
name: "store",
|
|
450
|
+
ok: true,
|
|
451
|
+
detail: paths.rootDir
|
|
452
|
+
});
|
|
453
|
+
checks.push({
|
|
454
|
+
name: "cli",
|
|
455
|
+
ok: true,
|
|
456
|
+
detail: "governed-memory command is running"
|
|
457
|
+
});
|
|
458
|
+
for (const check of checks) {
|
|
459
|
+
console.log(`${check.ok ? "ok" : "fail"} ${check.name}: ${check.detail}`);
|
|
460
|
+
}
|
|
461
|
+
if (checks.some((check) => !check.ok)) {
|
|
462
|
+
process.exitCode = 1;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
function printMcpConfig(input) {
|
|
466
|
+
if (input.host !== "claude-code") {
|
|
467
|
+
throw new Error(`Unsupported host: ${input.host}`);
|
|
468
|
+
}
|
|
469
|
+
console.log(JSON.stringify({
|
|
470
|
+
mcpServers: {
|
|
471
|
+
"governed-memory": {
|
|
472
|
+
command: "governed-memory-mcp",
|
|
473
|
+
args: ["--project", input.project]
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}, null, 2));
|
|
477
|
+
}
|
|
478
|
+
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
479
|
+
runCli().catch((error) => {
|
|
480
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
481
|
+
process.exitCode = 1;
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// src/cli.ts
|
|
486
|
+
runCli().catch((error) => {
|
|
487
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
488
|
+
process.exitCode = 1;
|
|
489
|
+
});
|
|
490
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../core/src/hash.ts", "../../core/src/ids.ts", "../../core/src/store.ts", "../../core/src/core.ts", "../../obsidian-export/src/index.ts", "../../cli/src/index.ts", "../../cli/src/paths.ts", "../src/cli.ts"],
|
|
4
|
+
"sourcesContent": ["import { createHash } from \"node:crypto\";\n\nexport function contentHash(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 16);\n}\n\n", "export function createId(prefix: string): string {\n const random = Math.random().toString(36).slice(2, 10);\n return `${prefix}_${Date.now().toString(36)}_${random}`;\n}\n\n", "import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { MemoryEvent, MemoryFact, MemoryProposal, MemoryStorePaths } from \"./types.js\";\n\nexport function resolveStorePaths(rootDir: string): MemoryStorePaths {\n return {\n rootDir,\n eventsPath: join(rootDir, \"events.jsonl\"),\n factsPath: join(rootDir, \"facts.jsonl\"),\n proposalsPath: join(rootDir, \"proposals.jsonl\")\n };\n}\n\nexport async function ensureStore(paths: MemoryStorePaths): Promise<void> {\n await mkdir(paths.rootDir, { recursive: true });\n await ensureFile(paths.eventsPath);\n await ensureFile(paths.factsPath);\n await ensureFile(paths.proposalsPath);\n}\n\nasync function ensureFile(path: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n try {\n await readFile(path, \"utf8\");\n } catch {\n await writeFile(path, \"\", \"utf8\");\n }\n}\n\nexport async function readJsonl<T>(path: string): Promise<T[]> {\n let raw = \"\";\n try {\n raw = await readFile(path, \"utf8\");\n } catch {\n return [];\n }\n\n return raw\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => JSON.parse(line) as T);\n}\n\nexport async function writeJsonl<T>(path: string, records: T[]): Promise<void> {\n const body = records.map((record) => JSON.stringify(record)).join(\"\\n\");\n await writeFile(path, body ? `${body}\\n` : \"\", \"utf8\");\n}\n\nexport async function appendEvent(paths: MemoryStorePaths, event: MemoryEvent): Promise<void> {\n const events = await readJsonl<MemoryEvent>(paths.eventsPath);\n events.push(event);\n await writeJsonl(paths.eventsPath, events);\n}\n\nexport async function readFacts(paths: MemoryStorePaths): Promise<MemoryFact[]> {\n return readJsonl<MemoryFact>(paths.factsPath);\n}\n\nexport async function writeFacts(paths: MemoryStorePaths, facts: MemoryFact[]): Promise<void> {\n await writeJsonl(paths.factsPath, facts);\n}\n\nexport async function readProposals(paths: MemoryStorePaths): Promise<MemoryProposal[]> {\n return readJsonl<MemoryProposal>(paths.proposalsPath);\n}\n\nexport async function writeProposals(paths: MemoryStorePaths, proposals: MemoryProposal[]): Promise<void> {\n await writeJsonl(paths.proposalsPath, proposals);\n}\n\n", "import { contentHash } from \"./hash.js\";\nimport { createId } from \"./ids.js\";\nimport {\n appendEvent,\n ensureStore,\n readFacts,\n readProposals,\n writeFacts,\n writeProposals\n} from \"./store.js\";\nimport type {\n CreateProposalInput,\n EditAndApproveProposalInput,\n MemoryEvent,\n MemoryFact,\n MemoryProposal,\n MemoryQueryResult,\n MemoryStorePaths,\n QueryMemoryInput,\n ResolveProposalInput\n} from \"./types.js\";\n\nexport async function createProposal(\n paths: MemoryStorePaths,\n input: CreateProposalInput\n): Promise<MemoryProposal> {\n await ensureStore(paths);\n const now = new Date().toISOString();\n const proposal: MemoryProposal = {\n schemaVersion: 1,\n id: createId(\"prop\"),\n scope: input.scope,\n category: input.category,\n content: input.content,\n evidence: input.evidence,\n whyItMatters: input.whyItMatters,\n confidence: input.confidence,\n status: \"pending_review\",\n createdAt: now,\n updatedAt: now,\n version: 1,\n contentHash: contentHash(input.content)\n };\n\n const event: MemoryEvent = {\n schemaVersion: 1,\n id: createId(\"evt\"),\n type: \"proposal.created\",\n actor: input.actor ?? \"agent\",\n createdAt: now,\n payload: { proposal }\n };\n\n const proposals = await readProposals(paths);\n proposals.push(proposal);\n await writeProposals(paths, proposals);\n await appendEvent(paths, event);\n return proposal;\n}\n\nexport async function approveProposal(\n paths: MemoryStorePaths,\n input: ResolveProposalInput\n): Promise<MemoryFact> {\n return approveProposalWithContent(paths, input, undefined, \"proposal.approved\");\n}\n\nexport async function editAndApproveProposal(\n paths: MemoryStorePaths,\n input: EditAndApproveProposalInput\n): Promise<MemoryFact> {\n return approveProposalWithContent(paths, input, input.content, \"proposal.edited_and_approved\");\n}\n\nexport async function rejectProposal(\n paths: MemoryStorePaths,\n input: ResolveProposalInput\n): Promise<MemoryProposal> {\n return updateProposalStatus(paths, input, \"rejected\", \"proposal.rejected\");\n}\n\nexport async function deferProposal(\n paths: MemoryStorePaths,\n input: ResolveProposalInput\n): Promise<MemoryProposal> {\n return updateProposalStatus(paths, input, \"deferred\", \"proposal.deferred\");\n}\n\nexport async function listPending(paths: MemoryStorePaths): Promise<MemoryProposal[]> {\n await ensureStore(paths);\n const proposals = await readProposals(paths);\n return proposals.filter((proposal) => proposal.status === \"pending_review\");\n}\n\nexport async function queryMemory(\n paths: MemoryStorePaths,\n input: QueryMemoryInput = {}\n): Promise<MemoryQueryResult> {\n await ensureStore(paths);\n const query = input.query?.toLowerCase();\n const limit = input.limit ?? 8;\n const facts = (await readFacts(paths))\n .filter((fact) => fact.status === \"active\")\n .filter((fact) => !input.scope || fact.scope === input.scope)\n .filter((fact) => !input.category || fact.category === input.category)\n .filter((fact) => !query || fact.content.toLowerCase().includes(query))\n .slice(0, limit);\n\n const pendingRelatedProposals = (await readProposals(paths))\n .filter((proposal) => proposal.status === \"pending_review\")\n .filter((proposal) => !input.scope || proposal.scope === input.scope)\n .filter((proposal) => !input.category || proposal.category === input.category)\n .filter((proposal) => !query || proposal.content.toLowerCase().includes(query))\n .slice(0, limit);\n\n return { facts, pendingRelatedProposals };\n}\n\nasync function approveProposalWithContent(\n paths: MemoryStorePaths,\n input: ResolveProposalInput,\n editedContent: string | undefined,\n eventType: \"proposal.approved\" | \"proposal.edited_and_approved\"\n): Promise<MemoryFact> {\n await ensureStore(paths);\n const proposals = await readProposals(paths);\n const proposal = findPendingProposal(proposals, input.proposalId);\n const now = new Date().toISOString();\n const approvedContent = editedContent ?? proposal.content;\n const eventId = createId(\"evt\");\n const fact: MemoryFact = {\n schemaVersion: 1,\n id: createId(\"fact\"),\n scope: proposal.scope,\n category: proposal.category,\n content: approvedContent,\n status: \"active\",\n sourceProposalId: proposal.id,\n approvedEventId: eventId,\n createdAt: now,\n approvedAt: now\n };\n\n proposal.status = eventType === \"proposal.approved\" ? \"approved\" : \"edited_and_approved\";\n proposal.content = approvedContent;\n proposal.contentHash = contentHash(approvedContent);\n proposal.updatedAt = now;\n proposal.version += 1;\n\n const event: MemoryEvent = {\n schemaVersion: 1,\n id: eventId,\n type: eventType,\n actor: input.actor ?? \"human\",\n createdAt: now,\n payload: { proposalId: proposal.id, factId: fact.id, approvedContent }\n };\n\n const facts = await readFacts(paths);\n facts.push(fact);\n await writeFacts(paths, facts);\n await writeProposals(paths, proposals);\n await appendEvent(paths, event);\n return fact;\n}\n\nasync function updateProposalStatus(\n paths: MemoryStorePaths,\n input: ResolveProposalInput,\n status: \"rejected\" | \"deferred\",\n eventType: \"proposal.rejected\" | \"proposal.deferred\"\n): Promise<MemoryProposal> {\n await ensureStore(paths);\n const proposals = await readProposals(paths);\n const proposal = findPendingProposal(proposals, input.proposalId);\n const now = new Date().toISOString();\n proposal.status = status;\n proposal.updatedAt = now;\n proposal.version += 1;\n\n const event: MemoryEvent = {\n schemaVersion: 1,\n id: createId(\"evt\"),\n type: eventType,\n actor: input.actor ?? \"human\",\n createdAt: now,\n payload: { proposalId: proposal.id }\n };\n\n await writeProposals(paths, proposals);\n await appendEvent(paths, event);\n return proposal;\n}\n\nfunction findPendingProposal(proposals: MemoryProposal[], proposalId: string): MemoryProposal {\n const proposal = proposals.find((candidate) => candidate.id === proposalId);\n if (!proposal) {\n throw new Error(`Proposal not found: ${proposalId}`);\n }\n if (proposal.status !== \"pending_review\") {\n throw new Error(`Proposal is not pending review: ${proposalId}`);\n }\n return proposal;\n}\n\n", "import type { MemoryFact, MemoryProposal } from \"@governed-memory/core\";\n\nexport function renderInboxMarkdown(proposals: MemoryProposal[]): string {\n const sections = proposals.map((proposal) => {\n return `## ${proposal.id}\n\nScope: ${proposal.scope}\nCategory: ${proposal.category}\nStatus: ${proposal.status}\nVersion: ${proposal.version}\nContent Hash: ${proposal.contentHash}\n\n> ${proposal.content}\n\nEvidence:\n- ${proposal.evidence}\n\nDecision:\n- [ ] Approve\n- [ ] Edit and approve\n- [ ] Reject\n- [ ] Defer\n`;\n });\n\n return [\"# Memory Inbox\", \"\", ...sections].join(\"\\n\");\n}\n\nexport function renderApprovedMemoriesMarkdown(facts: MemoryFact[]): string {\n const sections = facts.map((fact) => {\n return `## ${fact.id}\n\nScope: ${fact.scope}\nCategory: ${fact.category}\nStatus: ${fact.status}\nApproved: ${fact.approvedAt}\n\n${fact.content}\n`;\n });\n\n return [\"# Approved Memories\", \"\", ...sections].join(\"\\n\");\n}\n\n", "#!/usr/bin/env node\nimport {\n approveProposal,\n createProposal,\n deferProposal,\n editAndApproveProposal,\n ensureStore,\n listPending,\n queryMemory,\n readFacts,\n rejectProposal\n} from \"@governed-memory/core\";\nimport { renderApprovedMemoriesMarkdown, renderInboxMarkdown } from \"@governed-memory/obsidian-export\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { resolveCliStore } from \"./paths.js\";\n\ntype ParsedArgs = {\n command?: string;\n positionals: string[];\n flags: Record<string, string | boolean>;\n};\n\nexport async function runCli(argv = process.argv.slice(2)): Promise<void> {\n const args = parseArgs(argv);\n const paths = resolveCliStore(stringFlag(args.flags.project));\n\n switch (args.command) {\n case undefined:\n case \"help\":\n case \"--help\":\n case \"-h\":\n printHelp();\n break;\n case \"init\":\n await ensureStore(paths);\n console.log(`Initialized governed memory store at ${paths.rootDir}`);\n break;\n case \"propose\": {\n const content = requiredString(args.flags.content, \"--content is required\");\n const evidence = requiredString(args.flags.evidence, \"--evidence is required\");\n const proposal = await createProposal(paths, {\n scope: scopeFlag(args.flags.scope),\n category: stringFlag(args.flags.category) ?? \"general\",\n content,\n evidence,\n whyItMatters: stringFlag(args.flags.why),\n confidence: numberFlag(args.flags.confidence)\n });\n console.log(JSON.stringify(proposal, null, 2));\n break;\n }\n case \"inbox\": {\n const pending = await listPending(paths);\n if (pending.length === 0) {\n console.log(\"No pending memory proposals.\");\n break;\n }\n for (const proposal of pending) {\n console.log(`[${proposal.id}] ${proposal.scope} / ${proposal.category}`);\n console.log(proposal.content);\n console.log(`Evidence: ${proposal.evidence}`);\n console.log(\"\");\n }\n break;\n }\n case \"approve\": {\n const proposalId = requiredPositional(args.positionals[0], \"proposal id is required\");\n const fact = await approveProposal(paths, { proposalId });\n console.log(JSON.stringify(fact, null, 2));\n break;\n }\n case \"reject\": {\n const proposalId = requiredPositional(args.positionals[0], \"proposal id is required\");\n const proposal = await rejectProposal(paths, { proposalId });\n console.log(JSON.stringify(proposal, null, 2));\n break;\n }\n case \"defer\": {\n const proposalId = requiredPositional(args.positionals[0], \"proposal id is required\");\n const proposal = await deferProposal(paths, { proposalId });\n console.log(JSON.stringify(proposal, null, 2));\n break;\n }\n case \"edit\": {\n const proposalId = requiredPositional(args.positionals[0], \"proposal id is required\");\n const content = requiredString(args.flags.content, \"--content is required\");\n const fact = await editAndApproveProposal(paths, { proposalId, content });\n console.log(JSON.stringify(fact, null, 2));\n break;\n }\n case \"query\": {\n const result = await queryMemory(paths, {\n scope: optionalScopeFlag(args.flags.scope),\n category: stringFlag(args.flags.category),\n query: stringFlag(args.flags.query),\n limit: numberFlag(args.flags.limit)\n });\n console.log(JSON.stringify(result, null, 2));\n break;\n }\n case \"status\": {\n await ensureStore(paths);\n const pending = await listPending(paths);\n console.log(`${pending.length} pending proposal${pending.length === 1 ? \"\" : \"s\"}`);\n break;\n }\n case \"doctor\": {\n await runDoctor(stringFlag(args.flags.project));\n break;\n }\n case \"mcp-config\": {\n printMcpConfig({\n host: stringFlag(args.flags.host) ?? \"claude-code\",\n project: stringFlag(args.flags.project) ?? \"${PWD}\"\n });\n break;\n }\n case \"export-md\": {\n await ensureStore(paths);\n const outputDir = resolve(stringFlag(args.flags.output) ?? \".\");\n await mkdir(outputDir, { recursive: true });\n const [pending, facts] = await Promise.all([listPending(paths), readFacts(paths)]);\n const inboxPath = join(outputDir, \"Memory Inbox.md\");\n const approvedPath = join(outputDir, \"Approved Memories.md\");\n await writeFile(inboxPath, renderInboxMarkdown(pending), \"utf8\");\n await writeFile(approvedPath, renderApprovedMemoriesMarkdown(facts), \"utf8\");\n console.log(`Wrote ${inboxPath}`);\n console.log(`Wrote ${approvedPath}`);\n break;\n }\n default:\n printHelp();\n }\n}\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const [command, ...rest] = argv;\n const positionals: string[] = [];\n const flags: Record<string, string | boolean> = {};\n\n for (let index = 0; index < rest.length; index += 1) {\n const value = rest[index];\n if (!value?.startsWith(\"--\")) {\n if (value) positionals.push(value);\n continue;\n }\n\n const flagName = value.slice(2);\n const next = rest[index + 1];\n if (!next || next.startsWith(\"--\")) {\n flags[flagName] = true;\n continue;\n }\n flags[flagName] = next;\n index += 1;\n }\n\n return { command, positionals, flags };\n}\n\nfunction stringFlag(value: string | boolean | undefined): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction requiredString(value: string | boolean | undefined, message: string): string {\n const parsed = stringFlag(value);\n if (!parsed) throw new Error(message);\n return parsed;\n}\n\nfunction numberFlag(value: string | boolean | undefined): number | undefined {\n const parsed = stringFlag(value);\n if (!parsed) return undefined;\n return Number(parsed);\n}\n\nfunction scopeFlag(value: string | boolean | undefined) {\n return optionalScopeFlag(value) ?? \"project\";\n}\n\nfunction optionalScopeFlag(value: string | boolean | undefined) {\n const parsed = stringFlag(value);\n if (!parsed) return undefined;\n if ([\"global\", \"project\", \"machine\", \"session\"].includes(parsed)) {\n return parsed as \"global\" | \"project\" | \"machine\" | \"session\";\n }\n throw new Error(`Invalid scope: ${parsed}`);\n}\n\nfunction requiredPositional(value: string | undefined, message: string): string {\n if (!value) throw new Error(message);\n return value;\n}\n\nfunction printHelp(): void {\n console.log(`governed-memory\n\nCommands:\n help\n init [--project <path>]\n propose --content <text> --evidence <text> [--scope project] [--category workflow]\n inbox [--project <path>]\n approve <proposal-id> [--project <path>]\n edit <proposal-id> --content <text> [--project <path>]\n reject <proposal-id> [--project <path>]\n defer <proposal-id> [--project <path>]\n query [--query <text>] [--scope project] [--category workflow]\n export-md --output <dir> [--project <path>]\n doctor [--project <path>]\n mcp-config [--host claude-code] [--project <path>]\n status [--project <path>]\n`);\n}\n\nasync function runDoctor(projectArg?: string): Promise<void> {\n const checks: Array<{ name: string; ok: boolean; detail: string }> = [];\n const nodeMajor = Number(process.versions.node.split(\".\")[0]);\n checks.push({\n name: \"node\",\n ok: nodeMajor >= 22,\n detail: `v${process.versions.node}`\n });\n\n const paths = resolveCliStore(projectArg);\n await ensureStore(paths);\n checks.push({\n name: \"store\",\n ok: true,\n detail: paths.rootDir\n });\n\n checks.push({\n name: \"cli\",\n ok: true,\n detail: \"governed-memory command is running\"\n });\n\n for (const check of checks) {\n console.log(`${check.ok ? \"ok\" : \"fail\"} ${check.name}: ${check.detail}`);\n }\n\n if (checks.some((check) => !check.ok)) {\n process.exitCode = 1;\n }\n}\n\nfunction printMcpConfig(input: { host: string; project: string }): void {\n if (input.host !== \"claude-code\") {\n throw new Error(`Unsupported host: ${input.host}`);\n }\n\n console.log(\n JSON.stringify(\n {\n mcpServers: {\n \"governed-memory\": {\n command: \"governed-memory-mcp\",\n args: [\"--project\", input.project]\n }\n }\n },\n null,\n 2\n )\n );\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {\n runCli().catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n });\n}\n", "import { join, resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { resolveStorePaths } from \"@governed-memory/core\";\n\nexport function resolveCliStore(projectArg?: string) {\n const root = projectArg\n ? join(resolve(projectArg), \".governed-memory\")\n : join(homedir(), \".governed-memory\", \"global\");\n return resolveStorePaths(root);\n}\n\n", "import { runCli } from \"@governed-memory/cli\";\n\nrunCli().catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["mkdir", "writeFile", "join", "resolve", "join", "join", "resolve", "mkdir", "join", "writeFile"]
|
|
7
|
+
}
|