@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 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) ?? "${PWD}"
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
- function resolveServerStore(argv) {
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
- if (root)
21979
- return resolveStorePaths(resolve(root));
21980
- if (project)
21981
- return resolveStorePaths(join2(resolve(project), ".governed-memory"));
21982
- return resolveStorePaths(join2(homedir(), ".governed-memory", "global"));
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 paths = resolveServerStore(argv);
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 ensureStore(paths);
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
- }, async () => {
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
- return asText({ proposals: await listPending(paths) });
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();