@zhuwenqa/governed-memory 0.1.0 → 0.1.1
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/cli.js +8 -5
- package/dist/cli.js.map +2 -2
- package/dist/mcp.js +75 -12
- package/dist/mcp.js.map +3 -3
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -341,7 +341,7 @@ async function runCli(argv = process.argv.slice(2)) {
|
|
|
341
341
|
case "mcp-config": {
|
|
342
342
|
printMcpConfig({
|
|
343
343
|
host: stringFlag(args.flags.host) ?? "claude-code",
|
|
344
|
-
project: stringFlag(args.flags.project)
|
|
344
|
+
project: stringFlag(args.flags.project)
|
|
345
345
|
});
|
|
346
346
|
break;
|
|
347
347
|
}
|
|
@@ -466,12 +466,15 @@ function printMcpConfig(input) {
|
|
|
466
466
|
if (input.host !== "claude-code") {
|
|
467
467
|
throw new Error(`Unsupported host: ${input.host}`);
|
|
468
468
|
}
|
|
469
|
+
const serverConfig = input.project ? {
|
|
470
|
+
command: "governed-memory-mcp",
|
|
471
|
+
args: ["--project", input.project]
|
|
472
|
+
} : {
|
|
473
|
+
command: "governed-memory-mcp"
|
|
474
|
+
};
|
|
469
475
|
console.log(JSON.stringify({
|
|
470
476
|
mcpServers: {
|
|
471
|
-
"governed-memory":
|
|
472
|
-
command: "governed-memory-mcp",
|
|
473
|
-
args: ["--project", input.project]
|
|
474
|
-
}
|
|
477
|
+
"governed-memory": serverConfig
|
|
475
478
|
}
|
|
476
479
|
}, null, 2));
|
|
477
480
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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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",
|
|
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)\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 const serverConfig = input.project\n ? {\n command: \"governed-memory-mcp\",\n args: [\"--project\", input.project]\n }\n : {\n command: \"governed-memory-mcp\"\n };\n\n console.log(\n JSON.stringify(\n {\n mcpServers: {\n \"governed-memory\": serverConfig\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
6
|
"names": ["mkdir", "writeFile", "join", "resolve", "join", "join", "resolve", "mkdir", "join", "writeFile"]
|
|
7
7
|
}
|
package/dist/mcp.js
CHANGED
|
@@ -21972,14 +21972,29 @@ import { homedir } from "node:os";
|
|
|
21972
21972
|
import { join as join2, resolve } from "node:path";
|
|
21973
21973
|
import { pathToFileURL } from "node:url";
|
|
21974
21974
|
var scopeSchema = _enum(["global", "project", "machine", "session"]);
|
|
21975
|
-
|
|
21975
|
+
var projectPathSchema = string2().min(1).describe("Optional project root. Project-scoped memory is stored under <projectPath>/.governed-memory.").optional();
|
|
21976
|
+
function resolveServerStoreConfig(argv) {
|
|
21976
21977
|
const project = readFlag(argv, "--project");
|
|
21977
21978
|
const root = readFlag(argv, "--store");
|
|
21978
|
-
|
|
21979
|
-
|
|
21980
|
-
|
|
21981
|
-
|
|
21982
|
-
|
|
21979
|
+
return {
|
|
21980
|
+
defaultProjectPath: project ? resolve(project) : void 0,
|
|
21981
|
+
globalPaths: resolveStorePaths(resolve(root ?? join2(homedir(), ".governed-memory", "global")))
|
|
21982
|
+
};
|
|
21983
|
+
}
|
|
21984
|
+
function resolveToolStore(config2, input = {}) {
|
|
21985
|
+
if (input.scope === "global") {
|
|
21986
|
+
return config2.globalPaths;
|
|
21987
|
+
}
|
|
21988
|
+
if (input.projectPath) {
|
|
21989
|
+
return resolveProjectStore(input.projectPath);
|
|
21990
|
+
}
|
|
21991
|
+
if (config2.defaultProjectPath) {
|
|
21992
|
+
return resolveProjectStore(config2.defaultProjectPath);
|
|
21993
|
+
}
|
|
21994
|
+
return config2.globalPaths;
|
|
21995
|
+
}
|
|
21996
|
+
function resolveProjectStore(projectPath) {
|
|
21997
|
+
return resolveStorePaths(join2(resolve(projectPath), ".governed-memory"));
|
|
21983
21998
|
}
|
|
21984
21999
|
function readFlag(argv, name) {
|
|
21985
22000
|
const index = argv.indexOf(name);
|
|
@@ -21998,7 +22013,7 @@ function asText(value) {
|
|
|
21998
22013
|
};
|
|
21999
22014
|
}
|
|
22000
22015
|
function createServer(argv = process.argv.slice(2)) {
|
|
22001
|
-
const
|
|
22016
|
+
const storeConfig = resolveServerStoreConfig(argv);
|
|
22002
22017
|
const server = new McpServer({
|
|
22003
22018
|
name: "governed-memory",
|
|
22004
22019
|
version: "0.1.0"
|
|
@@ -22008,13 +22023,14 @@ function createServer(argv = process.argv.slice(2)) {
|
|
|
22008
22023
|
description: "Query approved facts. Pending related proposals are returned separately and must not be treated as durable memory.",
|
|
22009
22024
|
inputSchema: {
|
|
22010
22025
|
scope: scopeSchema.optional(),
|
|
22026
|
+
projectPath: projectPathSchema,
|
|
22027
|
+
includeGlobal: boolean2().default(false).describe("When projectPath is provided, query global memory together with the project store."),
|
|
22011
22028
|
query: string2().optional(),
|
|
22012
22029
|
category: string2().optional(),
|
|
22013
22030
|
limit: number2().int().positive().max(50).optional()
|
|
22014
22031
|
}
|
|
22015
22032
|
}, async (input) => {
|
|
22016
|
-
await
|
|
22017
|
-
const result = await queryMemory(paths, input);
|
|
22033
|
+
const result = await queryForInput(storeConfig, input);
|
|
22018
22034
|
return asText(result);
|
|
22019
22035
|
});
|
|
22020
22036
|
server.registerTool("memory.propose", {
|
|
@@ -22022,6 +22038,7 @@ function createServer(argv = process.argv.slice(2)) {
|
|
|
22022
22038
|
description: "Create a pending memory proposal with evidence. This does not create durable memory; a human must approve it.",
|
|
22023
22039
|
inputSchema: {
|
|
22024
22040
|
scope: scopeSchema.default("project"),
|
|
22041
|
+
projectPath: projectPathSchema,
|
|
22025
22042
|
category: string2().default("general"),
|
|
22026
22043
|
content: string2().min(1),
|
|
22027
22044
|
evidence: string2().min(1),
|
|
@@ -22029,6 +22046,7 @@ function createServer(argv = process.argv.slice(2)) {
|
|
|
22029
22046
|
confidence: number2().min(0).max(1).optional()
|
|
22030
22047
|
}
|
|
22031
22048
|
}, async (input) => {
|
|
22049
|
+
const paths = resolveToolStore(storeConfig, input);
|
|
22032
22050
|
await ensureStore(paths);
|
|
22033
22051
|
const proposal = await createProposal(paths, {
|
|
22034
22052
|
scope: input.scope,
|
|
@@ -22041,6 +22059,7 @@ function createServer(argv = process.argv.slice(2)) {
|
|
|
22041
22059
|
});
|
|
22042
22060
|
return asText({
|
|
22043
22061
|
proposal,
|
|
22062
|
+
storeRoot: paths.rootDir,
|
|
22044
22063
|
status: "pending_review",
|
|
22045
22064
|
reminder: "Unapproved proposals are not durable memory. Review with governed-memory inbox."
|
|
22046
22065
|
});
|
|
@@ -22048,10 +22067,15 @@ function createServer(argv = process.argv.slice(2)) {
|
|
|
22048
22067
|
server.registerTool("memory.list_pending", {
|
|
22049
22068
|
title: "List pending governed memory proposals",
|
|
22050
22069
|
description: "List proposals waiting for human review.",
|
|
22051
|
-
inputSchema: {
|
|
22052
|
-
|
|
22070
|
+
inputSchema: {
|
|
22071
|
+
scope: scopeSchema.optional(),
|
|
22072
|
+
projectPath: projectPathSchema
|
|
22073
|
+
}
|
|
22074
|
+
}, async (input) => {
|
|
22075
|
+
const paths = resolveToolStore(storeConfig, input);
|
|
22053
22076
|
await ensureStore(paths);
|
|
22054
|
-
|
|
22077
|
+
const proposals = (await listPending(paths)).filter((proposal) => !input.scope || proposal.scope === input.scope);
|
|
22078
|
+
return asText({ proposals, storeRoot: paths.rootDir });
|
|
22055
22079
|
});
|
|
22056
22080
|
server.registerTool("memory.propose_update", {
|
|
22057
22081
|
title: "Propose an update to governed memory",
|
|
@@ -22059,6 +22083,7 @@ function createServer(argv = process.argv.slice(2)) {
|
|
|
22059
22083
|
inputSchema: {
|
|
22060
22084
|
factId: string2().min(1),
|
|
22061
22085
|
scope: scopeSchema.default("project"),
|
|
22086
|
+
projectPath: projectPathSchema,
|
|
22062
22087
|
category: string2().default("memory-update"),
|
|
22063
22088
|
content: string2().min(1),
|
|
22064
22089
|
evidence: string2().min(1),
|
|
@@ -22066,6 +22091,7 @@ function createServer(argv = process.argv.slice(2)) {
|
|
|
22066
22091
|
confidence: number2().min(0).max(1).optional()
|
|
22067
22092
|
}
|
|
22068
22093
|
}, async (input) => {
|
|
22094
|
+
const paths = resolveToolStore(storeConfig, input);
|
|
22069
22095
|
await ensureStore(paths);
|
|
22070
22096
|
const proposal = await createProposal(paths, {
|
|
22071
22097
|
scope: input.scope,
|
|
@@ -22078,6 +22104,7 @@ function createServer(argv = process.argv.slice(2)) {
|
|
|
22078
22104
|
});
|
|
22079
22105
|
return asText({
|
|
22080
22106
|
proposal,
|
|
22107
|
+
storeRoot: paths.rootDir,
|
|
22081
22108
|
status: "pending_review",
|
|
22082
22109
|
reminder: "This is only an update proposal. A human must approve before the fact changes."
|
|
22083
22110
|
});
|
|
@@ -22088,11 +22115,13 @@ function createServer(argv = process.argv.slice(2)) {
|
|
|
22088
22115
|
inputSchema: {
|
|
22089
22116
|
factId: string2().min(1),
|
|
22090
22117
|
scope: scopeSchema.default("project"),
|
|
22118
|
+
projectPath: projectPathSchema,
|
|
22091
22119
|
reason: string2().min(1),
|
|
22092
22120
|
evidence: string2().min(1),
|
|
22093
22121
|
confidence: number2().min(0).max(1).optional()
|
|
22094
22122
|
}
|
|
22095
22123
|
}, async (input) => {
|
|
22124
|
+
const paths = resolveToolStore(storeConfig, input);
|
|
22096
22125
|
await ensureStore(paths);
|
|
22097
22126
|
const proposal = await createProposal(paths, {
|
|
22098
22127
|
scope: input.scope,
|
|
@@ -22105,6 +22134,7 @@ function createServer(argv = process.argv.slice(2)) {
|
|
|
22105
22134
|
});
|
|
22106
22135
|
return asText({
|
|
22107
22136
|
proposal,
|
|
22137
|
+
storeRoot: paths.rootDir,
|
|
22108
22138
|
status: "pending_review",
|
|
22109
22139
|
reminder: "This is only a forget proposal. A human must approve before the fact is deprecated."
|
|
22110
22140
|
});
|
|
@@ -22118,11 +22148,44 @@ function createServer(argv = process.argv.slice(2)) {
|
|
|
22118
22148
|
"Approved active facts may be used as durable memory.",
|
|
22119
22149
|
"Pending proposals are suggestions only and must not be treated as approved facts.",
|
|
22120
22150
|
"Agents can propose memory, but humans approve durable truth.",
|
|
22151
|
+
"Agents can target global memory with scope=global, or project memory with projectPath.",
|
|
22121
22152
|
"All durable transitions should be written through the memory core."
|
|
22122
22153
|
]
|
|
22123
22154
|
}));
|
|
22124
22155
|
return server;
|
|
22125
22156
|
}
|
|
22157
|
+
async function queryForInput(config2, input) {
|
|
22158
|
+
const queryInput = toQueryMemoryInput(input);
|
|
22159
|
+
const targetPaths = resolveToolStore(config2, input);
|
|
22160
|
+
await ensureStore(targetPaths);
|
|
22161
|
+
if (input.includeGlobal && input.projectPath && input.scope !== "global") {
|
|
22162
|
+
await ensureStore(config2.globalPaths);
|
|
22163
|
+
const [projectResult, globalResult] = await Promise.all([
|
|
22164
|
+
queryMemory(targetPaths, queryInput),
|
|
22165
|
+
queryMemory(config2.globalPaths, { ...queryInput, scope: "global" })
|
|
22166
|
+
]);
|
|
22167
|
+
return {
|
|
22168
|
+
facts: [...globalResult.facts, ...projectResult.facts].slice(0, input.limit ?? 8),
|
|
22169
|
+
pendingRelatedProposals: [
|
|
22170
|
+
...globalResult.pendingRelatedProposals,
|
|
22171
|
+
...projectResult.pendingRelatedProposals
|
|
22172
|
+
].slice(0, input.limit ?? 8),
|
|
22173
|
+
storeRoots: [config2.globalPaths.rootDir, targetPaths.rootDir]
|
|
22174
|
+
};
|
|
22175
|
+
}
|
|
22176
|
+
return {
|
|
22177
|
+
...await queryMemory(targetPaths, queryInput),
|
|
22178
|
+
storeRoots: [targetPaths.rootDir]
|
|
22179
|
+
};
|
|
22180
|
+
}
|
|
22181
|
+
function toQueryMemoryInput(input) {
|
|
22182
|
+
return {
|
|
22183
|
+
scope: input.scope,
|
|
22184
|
+
query: input.query,
|
|
22185
|
+
category: input.category,
|
|
22186
|
+
limit: input.limit
|
|
22187
|
+
};
|
|
22188
|
+
}
|
|
22126
22189
|
async function runServer(argv = process.argv.slice(2)) {
|
|
22127
22190
|
const server = createServer(argv);
|
|
22128
22191
|
const transport = new StdioServerTransport();
|