@memstack/cli 0.7.3 → 0.8.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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../config-env/src/index.ts","../src/config.ts","../src/cli.ts"],"names":[],"mappings":"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","file":"cli.js","sourcesContent":["import type { MemStackConfig, StorageProvider, LLMProvider, EmbeddingProvider } from \"@memstack/core\";\nimport {\n InMemoryStorageAdapter,\n DiskStorageAdapter,\n MarkdownStorageAdapter,\n PostgresStorageAdapter,\n SQLiteStorageAdapter,\n RedisStorageAdapter,\n OpenAILLMAdapter,\n AnthropicLLMAdapter,\n OpenAIEmbeddingAdapter,\n} from \"@memstack/core\";\n\nfunction buildLLMAdapter(): LLMProvider {\n if (!process.env.ANTHROPIC_API_KEY && !process.env.OPENAI_API_KEY) {\n throw new Error(\"At least one of OPENAI_API_KEY or ANTHROPIC_API_KEY must be set\");\n }\n if (process.env.ANTHROPIC_API_KEY) {\n return new AnthropicLLMAdapter({ apiKey: process.env.ANTHROPIC_API_KEY });\n }\n return new OpenAILLMAdapter({\n apiKey: process.env.OPENAI_API_KEY ?? \"\",\n baseURL: process.env.MEMSTACK_OPENAI_BASE_URL,\n defaultModel: process.env.MEMSTACK_LLM_MODEL,\n });\n}\n\nfunction buildEmbeddingAdapter(): EmbeddingProvider | undefined {\n if (process.env.MEMSTACK_OPENAI_BASE_URL) return undefined;\n if (process.env.OPENAI_API_KEY) {\n return new OpenAIEmbeddingAdapter({ apiKey: process.env.OPENAI_API_KEY });\n }\n return undefined;\n}\n\nasync function buildStorageAdapter(): Promise<StorageProvider> {\n const storage = process.env.MEMSTACK_STORAGE ?? \"memory\";\n\n switch (storage) {\n case \"memory\":\n return new InMemoryStorageAdapter();\n\n case \"markdown\":\n return new MarkdownStorageAdapter({\n dir: process.env.MEMSTACK_DIR ?? \"./memories\",\n });\n\n case \"disk\":\n return new DiskStorageAdapter({\n storageDir: process.env.MEMSTACK_DIR ?? \"./memstack-data\",\n });\n\n case \"postgres\":\n if (!process.env.DATABASE_URL) {\n throw new Error(\"postgres storage requires DATABASE_URL\");\n }\n return new PostgresStorageAdapter({\n connectionString: process.env.DATABASE_URL,\n });\n\n case \"sqlite\": {\n try {\n // @ts-expect-error optional peer dep\n const BetterSqlite3 = await import(\"better-sqlite3\");\n const db = new BetterSqlite3.default(\n process.env.SQLITE_PATH ?? \"./memstack.db\",\n );\n return new SQLiteStorageAdapter({ db: db as never });\n } catch {\n throw new Error(\n \"SQLite requires better-sqlite3. Install: npm install better-sqlite3\",\n );\n }\n }\n\n case \"redis\": {\n try {\n const Redis = await import(\"ioredis\");\n const client = new Redis.default(\n process.env.REDIS_URL ?? \"redis://localhost:6379\",\n );\n return new RedisStorageAdapter({ redis: client as never });\n } catch {\n throw new Error(\n \"Redis requires ioredis. Install: npm install ioredis\",\n );\n }\n }\n\n default:\n throw new Error(`Unknown MEMSTACK_STORAGE: \"${storage}\". Supported: memory, markdown, disk, postgres, sqlite, redis`);\n }\n}\n\nexport interface EnvConfigResult {\n config: MemStackConfig;\n /** From MEMSTACK_ACTOR, defaults to \"default\". Only meaningful for clients that scope work to one actor per process (e.g. the MCP server). */\n defaultActorId: string;\n}\n\n/**\n * Builds a MemStackConfig purely from environment variables. Shared by\n * @memstack/cli, @memstack/mcp, and @memstack/server so storage/LLM/embedding\n * wiring and env var behavior can't drift between the three entry points.\n */\nexport async function loadConfigFromEnv(): Promise<EnvConfigResult> {\n const llm = buildLLMAdapter();\n const embedding = buildEmbeddingAdapter();\n const storage = await buildStorageAdapter();\n const embedOnStore = process.env.MEMSTACK_EMBED_ON_STORE !== \"false\";\n const defaultActorId = process.env.MEMSTACK_ACTOR ?? \"default\";\n\n return {\n config: { llm, embedding, storage, defaults: { embedOnStore } },\n defaultActorId,\n };\n}\n","import type { MemStackConfig } from \"@memstack/core\";\nimport { loadConfigFromEnv } from \"@memstack/config-env\";\n\nexport async function loadConfig(): Promise<MemStackConfig> {\n const { config } = await loadConfigFromEnv();\n return config;\n}\n","#!/usr/bin/env node\nimport { parseArgs } from \"node:util\";\nimport { writeFile, readFile } from \"node:fs/promises\";\nimport { MemStack } from \"@memstack/core\";\nimport type { MemStackConfig, MemoryType, PruneStrategy } from \"@memstack/core\";\nimport { loadConfig } from \"./config.js\";\n\nasync function main() {\n const { positionals, values } = parseArgs({\n allowPositionals: true,\n options: {\n actor: { type: \"string\" },\n content: { type: \"string\" },\n type: { type: \"string\" },\n importance: { type: \"string\" },\n tags: { type: \"string\" },\n query: { type: \"string\" },\n strategy: { type: \"string\" },\n limit: { type: \"string\" },\n \"max-tokens\": { type: \"string\" },\n \"older-than\": { type: \"string\" },\n \"max-age\": { type: \"string\" },\n \"min-importance\": { type: \"string\" },\n \"max-count\": { type: \"string\" },\n ids: { type: \"string\" },\n id: { type: \"string\" },\n \"created-after\": { type: \"string\" },\n \"created-before\": { type: \"string\" },\n \"dry-run\": { type: \"boolean\" },\n out: { type: \"string\" },\n file: { type: \"string\" },\n },\n });\n\n const command = positionals[0];\n if (!command) {\n printUsage();\n process.exit(1);\n }\n\n const config: MemStackConfig = await loadConfig();\n const ms = new MemStack(config);\n\n let result: unknown;\n switch (command) {\n case \"store\": {\n if (!values.actor) fail(\"--actor is required\");\n if (!values.content) fail(\"--content is required\");\n const importance = values.importance ? Math.max(0, Math.min(1, Number(values.importance))) : undefined;\n result = await ms.memory.store({\n actorId: String(values.actor).trim(),\n content: String(values.content),\n memoryType: values.type as MemoryType | undefined,\n importance,\n tags: values.tags\n ? String(values.tags)\n .split(\",\")\n .map((t) => t.trim())\n .filter((t) => t.length > 0)\n : undefined,\n });\n break;\n }\n\n case \"retrieve\": {\n if (!values.actor) fail(\"--actor is required\");\n result = await ms.memory.retrieve({\n actorId: values.actor as string | undefined,\n query: values.query as string | undefined,\n strategy: values.strategy as \"recent\" | \"important\" | \"semantic\" | \"hybrid\" | undefined,\n limit: values.limit ? Number(values.limit) : undefined,\n tags: values.tags ? String(values.tags).split(\",\") : undefined,\n createdAfter: values[\"created-after\"]\n ? new Date(String(values[\"created-after\"]))\n : undefined,\n createdBefore: values[\"created-before\"]\n ? new Date(String(values[\"created-before\"]))\n : undefined,\n });\n break;\n }\n\n case \"context\": {\n if (!values.actor) fail(\"--actor is required\");\n result = await ms.memory.compileContext({\n actorId: String(values.actor),\n maxTokens: values[\"max-tokens\"] ? Number(values[\"max-tokens\"]) : undefined,\n });\n break;\n }\n\n case \"summarize\": {\n if (!values.actor) fail(\"--actor is required\");\n const durationMs = values[\"older-than\"]\n ? parseDuration(String(values[\"older-than\"]))\n : undefined;\n const olderThan = durationMs ? new Date(Date.now() - durationMs) : undefined;\n result = await ms.memory.summarize({\n actorId: values.actor as string | undefined,\n olderThan,\n });\n break;\n }\n\n case \"prune\": {\n if (!values.actor) fail(\"--actor is required\");\n const VALID_TYPES = [\"byAge\", \"byImportance\", \"byCount\", \"byType\", \"custom\", \"compose\"];\n const pruneType = values.type ?? \"byAge\";\n if (!VALID_TYPES.includes(String(pruneType))) {\n fail(`Invalid prune type: ${pruneType}. Valid: ${VALID_TYPES.join(\", \")}`);\n }\n const strategy: PruneStrategy = {\n type: pruneType as PruneStrategy[\"type\"],\n actorId: String(values.actor).trim(),\n maxAge: values[\"max-age\"]\n ? parseDuration(String(values[\"max-age\"]))\n : undefined,\n minImportance: values[\"min-importance\"]\n ? Number(values[\"min-importance\"])\n : undefined,\n maxPerActor: values[\"max-count\"]\n ? Number(values[\"max-count\"])\n : undefined,\n };\n\n if (values[\"dry-run\"]) {\n result = await ms.memory.dryRunPrune(strategy);\n } else {\n result = await ms.memory.prune(strategy);\n }\n break;\n }\n\n case \"purge\": {\n if (!values.actor) fail(\"--actor is required\");\n result = await ms.memory.purgeActor(String(values.actor));\n break;\n }\n\n case \"merge\": {\n if (!values.ids) fail(\"--ids is required\");\n result = await ms.memory.merge(\n String(values.ids)\n .split(\",\")\n .map((s) => s.trim()),\n );\n break;\n }\n\n case \"stats\": {\n result = await ms.memory.stats(values.actor as string | undefined);\n break;\n }\n\n case \"delete\": {\n if (!values.id) fail(\"--id is required\");\n await ms.memory.delete(String(values.id));\n result = { deleted: true };\n break;\n }\n\n case \"health\": {\n result = await ms.health();\n break;\n }\n\n case \"export\": {\n const snapshot = await ms.export(values.actor as string | undefined);\n const outPath = values.out as string | undefined;\n if (outPath) {\n await writeFile(outPath, JSON.stringify(snapshot, null, 2), \"utf-8\");\n }\n result = outPath ? { saved: outPath, count: snapshot.memories.length } : snapshot;\n break;\n }\n\n case \"import\": {\n if (!values.actor) fail(\"--actor is required\");\n if (!values.file) fail(\"--file is required\");\n const raw = await readFile(String(values.file), \"utf-8\");\n let snapshot = JSON.parse(raw);\n if (Array.isArray(snapshot)) {\n snapshot = { version: 1 as const, memories: snapshot, exportedAt: new Date().toISOString() };\n }\n if (!snapshot.memories || !Array.isArray(snapshot.memories) || snapshot.memories.length === 0) {\n fail(\"Snapshot contains no memories to import\");\n }\n await ms.import(snapshot);\n result = { imported: snapshot.memories.length };\n break;\n }\n\n default:\n printUsage();\n process.exit(1);\n }\n\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n await ms.close();\n}\n\nfunction parseDuration(input: string): number {\n const match = input.match(/^(\\d+)([smhd])$/);\n if (!match) {\n throw new Error(\n `Invalid duration: ${input}. Use format like \"7d\", \"24h\", \"30m\".`,\n );\n }\n const value = Number(match[1]);\n switch (match[2]) {\n case \"s\":\n return value * 1000;\n case \"m\":\n return value * 60 * 1000;\n case \"h\":\n return value * 3600 * 1000;\n case \"d\":\n return value * 86400 * 1000;\n default:\n return value;\n }\n}\n\nfunction printUsage() {\n process.stderr.write(`memstack <command> [flags]\n\nCommands:\n store Store a memory\n retrieve Retrieve memories\n context Compile LLM-ready context\n summarize Compress old interactions\n prune Remove stale memories\n purge Delete all memories for an actor\n merge Merge multiple memories\n stats Memory diagnostics\n delete Delete a single memory\n health Check connectivity\n export Export all memories\n import Import memories from a JSON snapshot\n\nRun memstack <command> --help for flags.\n`);\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`Error: ${message}\\n`);\n process.exit(1);\n}\n\nmain().catch((err) => {\n process.stderr.write(\n `Error: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n process.exit(1);\n});\n"]}
1
+ {"version":3,"sources":["../../config-env/src/config-file.ts","../../config-env/src/project.ts","../../config-env/src/index.ts","../src/config.ts","../src/harness/exec.ts","../src/harness/types.ts","../src/harness/claude-code.ts","../src/harness/files.ts","../src/harness/instructions.ts","../src/harness/codex.ts","../src/harness/hooks.ts","../src/harness/verify.ts","../src/harness/connect.ts","../src/harness/locate.ts","../src/harness/index.ts","../src/harness-commands.ts","../src/help.ts","../src/cli.ts"],"names":["fail","join","existsSync","readFileSync","writeFileSync","out","loadConfig","resolve","homedir","version","mkdirSync","dirname","statSync","renameSync","rmSync","init","realpathSync","AnthropicLLMAdapter","OpenAILLMAdapter","removeBlock","removeHook","project","write","projectNamespace","snapshot"],"mappings":"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","file":"cli.js","sourcesContent":["// ~/.memstack/config.json. Holds the LLM provider and key and\n// the storage choice, so harness MCP configs carry no secrets. The file never\n// makes MemStack install a storage driver; it only records which one to load.\nimport { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const STORAGE_TYPES = [\"memory\", \"markdown\", \"disk\", \"postgres\", \"sqlite\", \"redis\"] as const;\nexport type StorageType = (typeof STORAGE_TYPES)[number];\n\nexport interface MemStackConfigFile {\n version: 1;\n llm?: {\n provider: \"openai-compatible\" | \"anthropic\";\n apiKey: string;\n baseURL?: string;\n model?: string;\n };\n storage?: {\n type: StorageType;\n /** File path for sqlite, directory for disk and markdown. */\n path?: string;\n /** Connection URL for postgres and redis. */\n url?: string;\n };\n}\n\n/** `$MEMSTACK_HOME`, or `~/.memstack`. */\nexport function memstackHome(): string {\n return process.env.MEMSTACK_HOME ?? join(homedir(), \".memstack\");\n}\n\nexport function configFilePath(home: string = memstackHome()): string {\n return join(home, \"config.json\");\n}\n\n/** The parsed config file, or undefined when it does not exist. Throws on invalid content. */\nexport function readConfigFile(path: string = configFilePath()): MemStackConfigFile | undefined {\n if (!existsSync(path)) return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(path, \"utf8\"));\n } catch (error) {\n throw new Error(`${path} is not valid JSON: ${(error as Error).message}`);\n }\n return validateConfigFile(parsed, path);\n}\n\n/**\n * Writes the config file atomically, creating the directory with mode 0700\n * and the file with mode 0600, and tightening modes of existing ones.\n */\nexport function writeConfigFile(config: MemStackConfigFile, path: string = configFilePath()): void {\n validateConfigFile(config, path);\n const dir = join(path, \"..\");\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n chmodSync(dir, 0o700);\n const tmp = `${path}.${process.pid}.tmp`;\n writeFileSync(tmp, `${JSON.stringify(config, null, 2)}\\n`, { mode: 0o600 });\n chmodSync(tmp, 0o600);\n renameSync(tmp, path);\n}\n\n/** Warnings about the config file's permissions; empty when they are owner-only or the file is absent. */\nexport function checkConfigPermissions(path: string = configFilePath()): string[] {\n if (process.platform === \"win32\" || !existsSync(path)) return [];\n const warnings: string[] = [];\n const fileMode = statSync(path).mode & 0o777;\n if (fileMode & 0o077) {\n warnings.push(`${path} is readable by other users (mode ${fileMode.toString(8)}). Run: chmod 600 ${path}`);\n }\n const dir = join(path, \"..\");\n const dirMode = statSync(dir).mode & 0o777;\n if (dirMode & 0o077) {\n warnings.push(`${dir} is accessible by other users (mode ${dirMode.toString(8)}). Run: chmod 700 ${dir}`);\n }\n return warnings;\n}\n\nfunction validateConfigFile(value: unknown, path: string): MemStackConfigFile {\n const fail = (message: string): never => {\n throw new Error(`Invalid ${path}: ${message}`);\n };\n if (!isObject(value)) fail(\"expected a JSON object\");\n const config = value as Record<string, unknown>;\n if (config.version !== 1) fail(`unsupported version ${JSON.stringify(config.version)}, expected 1`);\n\n if (config.llm !== undefined) {\n if (!isObject(config.llm)) fail(\"llm must be an object\");\n const llm = config.llm as Record<string, unknown>;\n if (llm.provider !== \"openai-compatible\" && llm.provider !== \"anthropic\") {\n fail('llm.provider must be \"openai-compatible\" or \"anthropic\"');\n }\n if (typeof llm.apiKey !== \"string\" || !llm.apiKey) fail(\"llm.apiKey must be a non-empty string\");\n for (const key of [\"baseURL\", \"model\"]) {\n if (llm[key] !== undefined && typeof llm[key] !== \"string\") fail(`llm.${key} must be a string`);\n }\n }\n\n if (config.storage !== undefined) {\n if (!isObject(config.storage)) fail(\"storage must be an object\");\n const storage = config.storage as Record<string, unknown>;\n if (!STORAGE_TYPES.includes(storage.type as StorageType)) {\n fail(`storage.type must be one of ${STORAGE_TYPES.join(\", \")}`);\n }\n for (const key of [\"path\", \"url\"]) {\n if (storage[key] !== undefined && typeof storage[key] !== \"string\") fail(`storage.${key} must be a string`);\n }\n }\n\n return config as unknown as MemStackConfigFile;\n}\n\nfunction isObject(value: unknown): boolean {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","// Project identity shared by every harness. The ID is derived\n// from the repository itself every time, with no stored state, so it survives\n// remote changes, moves, new clones, new machines, and switching storage.\nimport { execFileSync } from \"node:child_process\";\nimport { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync, realpathSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\n\nexport type ProjectSource = \"pin\" | \"root-commit\" | \"remote\" | \"git\" | \"directory\";\n\nexport interface ProjectIdentity {\n /** Stable ID used in `project:<id>` namespaces. */\n id: string;\n source: ProjectSource;\n /** What the ID was derived from: the pinned name, commit hash, remote, or path. */\n key: string;\n /** Git working tree root, or the directory itself outside git. */\n root: string;\n /**\n * IDs this project had before a more stable source became available,\n * e.g. before its first commit. Memories under them are adopted once.\n */\n previousIds: string[];\n}\n\nexport const PIN_FILE = \".memstack.json\";\nconst PIN_PATTERN = /^[a-z0-9][a-z0-9._-]{0,63}$/i;\n\n/**\n * Resolves the project for a working directory, preferring, in order:\n *\n * 1. a pinned ID in `.memstack.json` at the repository root, shared by the team;\n * 2. the repository's first commit on its main line, which every clone shares\n * and which survives adding or renaming a remote and moving the folder;\n * 3. the normalized `origin` remote, for shallow clones whose first commit is\n * not available;\n * 4. the shared git directory, for repositories without commits, so worktrees\n * still match;\n * 5. the directory, outside git.\n */\nexport function resolveProject(cwd: string = process.cwd()): ProjectIdentity {\n const dir = realpathSync(resolve(cwd));\n const root = git(dir, [\"rev-parse\", \"--show-toplevel\"]);\n const base = root ?? dir;\n\n const pinned = readPin(base);\n const fallbacks = transitionalIds(dir, root);\n\n if (pinned) return { id: pinned, source: \"pin\", key: pinned, root: base, previousIds: [] };\n if (!root) return { ...identity(\"directory\", dir), root: dir, previousIds: [] };\n\n const shallow = git(root, [\"rev-parse\", \"--is-shallow-repository\"]) === \"true\";\n const rootCommit = shallow ? null : firstCommit(root);\n if (rootCommit) return { ...identity(\"root-commit\", rootCommit), root, previousIds: fallbacks };\n\n const remote = git(root, [\"config\", \"--get\", \"remote.origin.url\"]);\n const normalized = shallow && remote ? normalizeRemote(remote) : null;\n if (normalized) return { ...identity(\"remote\", normalized), root, previousIds: fallbacks };\n\n const gitId = identity(\"git\", gitRepoKey(root));\n return { ...gitId, root, previousIds: fallbacks.filter((id) => id !== gitId.id) };\n}\n\n/**\n * Writes `.memstack.json` with a pinned project ID at the repository root.\n * Commit the file so every clone and teammate uses the same project.\n */\nexport function pinProject(name: string, cwd: string = process.cwd()): string {\n if (!PIN_PATTERN.test(name)) {\n throw new Error(\"A pinned project ID uses letters, digits, '.', '_', or '-', starts with a letter or digit, and is at most 64 characters.\");\n }\n const dir = realpathSync(resolve(cwd));\n const base = git(dir, [\"rev-parse\", \"--show-toplevel\"]) ?? dir;\n const path = join(base, PIN_FILE);\n const existing = existsSync(path) ? (JSON.parse(readFileSync(path, \"utf8\")) as Record<string, unknown>) : {};\n writeFileSync(path, `${JSON.stringify({ ...existing, project: name }, null, 2)}\\n`);\n return path;\n}\n\n/**\n * Reduces a git remote URL to `host/path` without protocol, credentials,\n * port, or `.git` suffix, so https, ssh, and scp-style URLs of the same\n * repository match. Returns null for local paths and unparseable values.\n */\nexport function normalizeRemote(url: string): string | null {\n const value = url.trim();\n if (!value) return null;\n\n let host: string;\n let path: string;\n const scp = value.match(/^(?:[^@/]+@)?([^:/]+):(?!\\/)(.+)$/);\n if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(value)) {\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n return null;\n }\n if (parsed.protocol === \"file:\" || !parsed.hostname) return null;\n host = parsed.hostname;\n path = decodeURIComponent(parsed.pathname);\n } else if (scp) {\n host = scp[1];\n path = scp[2];\n } else {\n return null;\n }\n\n path = path.replace(/^\\/+|\\/+$/g, \"\").replace(/\\.git$/i, \"\");\n if (!path) return null;\n return `${host.toLowerCase()}/${path}`;\n}\n\nfunction readPin(base: string): string | null {\n const path = join(base, PIN_FILE);\n if (!existsSync(path)) return null;\n let project: unknown;\n try {\n project = (JSON.parse(readFileSync(path, \"utf8\")) as { project?: unknown }).project;\n } catch (error) {\n throw new Error(`${path} is not valid JSON: ${(error as Error).message}`);\n }\n if (project === undefined) return null;\n if (typeof project !== \"string\" || !PIN_PATTERN.test(project)) {\n throw new Error(`${path}: \"project\" must use letters, digits, '.', '_', or '-' and be at most 64 characters.`);\n }\n return project;\n}\n\n// The first-parent root: merging an unrelated history later does not change it.\nfunction firstCommit(root: string): string | null {\n const out = git(root, [\"rev-list\", \"--max-parents=0\", \"--first-parent\", \"HEAD\"]);\n return out ? out.split(\"\\n\").pop()!.trim() : null;\n}\n\nfunction gitRepoKey(root: string): string {\n const commonDir = git(root, [\"rev-parse\", \"--path-format=absolute\", \"--git-common-dir\"]);\n return commonDir ? dirname(realpathSync(commonDir)) : root;\n}\n\n// IDs a repository has before its first commit: its git directory, and the\n// working directory it was opened from.\nfunction transitionalIds(dir: string, root: string | null): string[] {\n const ids = new Set<string>();\n if (root) ids.add(identity(\"git\", gitRepoKey(root)).id);\n ids.add(identity(\"directory\", dir).id);\n return [...ids];\n}\n\nfunction identity(source: Exclude<ProjectSource, \"pin\">, key: string): { id: string; source: ProjectSource; key: string } {\n const id = createHash(\"sha256\").update(`${source}:${key}`).digest(\"hex\").slice(0, 16);\n return { id, source, key };\n}\n\nfunction git(cwd: string, args: string[]): string | null {\n try {\n const out = execFileSync(\"git\", [\"-C\", cwd, ...args], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n timeout: 5000,\n }).trim();\n return out || null;\n } catch {\n return null;\n }\n}\n","import type { MemStackConfig, StorageProvider, LLMProvider, EmbeddingProvider } from \"@memstack/core\";\nimport { readConfigFile } from \"./config-file.js\";\nimport type { MemStackConfigFile } from \"./config-file.js\";\nimport {\n InMemoryStorageAdapter,\n DiskStorageAdapter,\n MarkdownStorageAdapter,\n PostgresStorageAdapter,\n SQLiteStorageAdapter,\n RedisStorageAdapter,\n OpenAILLMAdapter,\n AnthropicLLMAdapter,\n OpenAIEmbeddingAdapter,\n} from \"@memstack/core\";\n\ntype Env = Record<string, string | undefined>;\n\n// Drivers are optional peers the user installs; only a missing module means \"install it\".\nfunction isMissingModule(error: unknown): boolean {\n const code = (error as NodeJS.ErrnoException | undefined)?.code;\n return code === \"ERR_MODULE_NOT_FOUND\" || code === \"MODULE_NOT_FOUND\";\n}\n\nfunction buildLLMAdapter(env: Env): LLMProvider {\n if (!env.ANTHROPIC_API_KEY && !env.OPENAI_API_KEY) {\n throw new Error(\"At least one of OPENAI_API_KEY or ANTHROPIC_API_KEY must be set\");\n }\n if (env.ANTHROPIC_API_KEY) {\n return new AnthropicLLMAdapter({ apiKey: env.ANTHROPIC_API_KEY, defaultModel: env.MEMSTACK_LLM_MODEL });\n }\n return new OpenAILLMAdapter({\n apiKey: env.OPENAI_API_KEY ?? \"\",\n baseURL: env.MEMSTACK_OPENAI_BASE_URL,\n defaultModel: env.MEMSTACK_LLM_MODEL,\n });\n}\n\nfunction buildEmbeddingAdapter(env: Env): EmbeddingProvider | undefined {\n if (env.MEMSTACK_OPENAI_BASE_URL) return undefined;\n if (env.OPENAI_API_KEY) {\n return new OpenAIEmbeddingAdapter({ apiKey: env.OPENAI_API_KEY });\n }\n return undefined;\n}\n\nasync function buildStorageAdapter(env: Env): Promise<StorageProvider> {\n const storage = env.MEMSTACK_STORAGE ?? \"memory\";\n\n switch (storage) {\n case \"memory\":\n return new InMemoryStorageAdapter();\n\n case \"markdown\":\n return new MarkdownStorageAdapter({\n dir: env.MEMSTACK_DIR ?? \"./memories\",\n });\n\n case \"disk\":\n return new DiskStorageAdapter({\n storageDir: env.MEMSTACK_DIR ?? \"./memstack-data\",\n });\n\n case \"postgres\":\n if (!env.DATABASE_URL) {\n throw new Error(\"postgres storage requires DATABASE_URL\");\n }\n return new PostgresStorageAdapter({\n connectionString: env.DATABASE_URL,\n });\n\n case \"sqlite\": {\n try {\n // @ts-expect-error optional peer dep\n const BetterSqlite3 = await import(\"better-sqlite3\");\n const db = new BetterSqlite3.default(\n env.SQLITE_PATH ?? \"./memstack.db\",\n );\n return new SQLiteStorageAdapter({ db: db as never });\n } catch (error) {\n if (!isMissingModule(error)) throw error;\n throw new Error(\n \"SQLite requires better-sqlite3. Install: npm install better-sqlite3@^11.10.0\",\n );\n }\n }\n\n case \"redis\": {\n try {\n const Redis = await import(\"ioredis\");\n const client = new Redis.default(\n env.REDIS_URL ?? \"redis://localhost:6379\",\n );\n return new RedisStorageAdapter({ redis: client as never });\n } catch (error) {\n if (!isMissingModule(error)) throw error;\n throw new Error(\n \"Redis requires ioredis. Install: npm install ioredis@^5.11.1\",\n );\n }\n }\n\n default:\n throw new Error(`Unknown MEMSTACK_STORAGE: \"${storage}\". Supported: memory, markdown, disk, postgres, sqlite, redis`);\n }\n}\n\nexport interface EnvConfigResult {\n config: MemStackConfig;\n /** From MEMSTACK_ACTOR, defaults to \"default\". Only meaningful for clients that scope work to one actor per process (e.g. the MCP server). */\n defaultActorId: string;\n}\n\n/**\n * Builds a MemStackConfig purely from environment variables. Shared by\n * @memstack/cli, @memstack/mcp, and @memstack/server so storage/LLM/embedding\n * wiring and env var behavior can't drift between the three entry points.\n */\nexport async function loadConfigFromEnv(): Promise<EnvConfigResult> {\n return buildConfig(process.env);\n}\n\n/**\n * Builds a MemStackConfig from `~/.memstack/config.json` overlaid with\n * environment variables. Used by harness entry points. Each section is taken\n * whole from one source: any LLM variable in the environment replaces the\n * file's `llm` section, and `MEMSTACK_STORAGE` replaces its `storage`\n * section, so a key from one provider is never sent to another's URL.\n */\nexport async function loadConfig(options: { configPath?: string } = {}): Promise<EnvConfigResult> {\n return buildConfig(mergeConfigFile(readConfigFile(options.configPath), process.env));\n}\n\n/** The environment with the config file's sections filled in where the environment has none. */\nexport function mergeConfigFile(file: MemStackConfigFile | undefined, env: Env): Env {\n const merged: Env = { ...env };\n const envHasLLM = LLM_ENV.some((key) => env[key] !== undefined);\n if (file?.llm && !envHasLLM) {\n if (file.llm.provider === \"anthropic\") merged.ANTHROPIC_API_KEY = file.llm.apiKey;\n else {\n merged.OPENAI_API_KEY = file.llm.apiKey;\n merged.MEMSTACK_OPENAI_BASE_URL = file.llm.baseURL;\n }\n merged.MEMSTACK_LLM_MODEL = file.llm.model;\n }\n if (file?.storage && env.MEMSTACK_STORAGE === undefined) {\n const { type, path, url } = file.storage;\n merged.MEMSTACK_STORAGE = type;\n if (type === \"sqlite\") merged.SQLITE_PATH = path;\n if (type === \"disk\" || type === \"markdown\") merged.MEMSTACK_DIR = path;\n if (type === \"postgres\") merged.DATABASE_URL = url;\n if (type === \"redis\") merged.REDIS_URL = url;\n }\n return merged;\n}\n\nconst LLM_ENV = [\"OPENAI_API_KEY\", \"ANTHROPIC_API_KEY\", \"MEMSTACK_OPENAI_BASE_URL\", \"MEMSTACK_LLM_MODEL\"];\n\nasync function buildConfig(env: Env): Promise<EnvConfigResult> {\n const llm = buildLLMAdapter(env);\n const embedding = buildEmbeddingAdapter(env);\n const storage = await buildStorageAdapter(env);\n const embedOnStore = env.MEMSTACK_EMBED_ON_STORE !== \"false\";\n const defaultActorId = env.MEMSTACK_ACTOR ?? \"default\";\n\n return {\n config: { llm, embedding, storage, defaults: { embedOnStore } },\n defaultActorId,\n };\n}\n\nexport { resolveProject, normalizeRemote, pinProject, PIN_FILE } from \"./project.js\";\nexport type { ProjectIdentity, ProjectSource } from \"./project.js\";\nexport {\n STORAGE_TYPES,\n memstackHome,\n configFilePath,\n readConfigFile,\n writeConfigFile,\n checkConfigPermissions,\n} from \"./config-file.js\";\nexport type { MemStackConfigFile, StorageType } from \"./config-file.js\";\n","import type { MemStackConfig } from \"@memstack/core\";\nimport { loadConfig as loadConfigFile } from \"@memstack/config-env\";\n\n/** ~/.memstack/config.json overlaid with environment variables, as the harness commands use. */\nexport async function loadConfig(): Promise<MemStackConfig> {\n const { config } = await loadConfigFile();\n return config;\n}\n","import { execFile } from \"node:child_process\";\n\nexport interface RunResult {\n /** Exit code; 127 when the command was not found. */\n code: number;\n stdout: string;\n stderr: string;\n}\n\nexport type Runner = (command: string, args: string[]) => Promise<RunResult>;\n\n/** Runs commands without a shell, so arguments are never interpreted. */\nexport const createRunner = (env: NodeJS.ProcessEnv = process.env): Runner => (command, args) =>\n new Promise((resolve) => {\n execFile(command, args, { env, timeout: 60_000, maxBuffer: 10 * 1024 * 1024 }, (error, stdout, stderr) => {\n if (!error) return resolve({ code: 0, stdout, stderr });\n const code = (error as NodeJS.ErrnoException).code === \"ENOENT\" ? 127 : typeof error.code === \"number\" ? error.code : 1;\n resolve({ code, stdout, stderr: stderr || error.message });\n });\n });\n\nexport const run: Runner = createRunner();\n","export type HarnessId = \"claude-code\" | \"codex\";\n\n/** How a harness starts the MemStack MCP server. */\nexport interface ServerLaunch {\n command: string;\n args: string[];\n env?: Record<string, string>;\n}\n\nexport interface HarnessState {\n /** The harness CLI is on PATH. */\n installed: boolean;\n version?: string;\n /** Config file the harness keeps MCP servers in. */\n configPath: string;\n /** The `memstack` server entry, when one is configured. */\n entry?: ServerLaunch;\n}\n\nexport interface CommandStep {\n command: string;\n args: string[];\n}\n\nexport interface ConnectPlan {\n harness: HarnessId;\n /** Harness CLI commands that apply the change, in order. Empty when nothing changes. */\n steps: CommandStep[];\n /** Entry before the change, used to roll back. */\n previous?: ServerLaunch;\n /** Entry after the change; undefined for a disconnect. */\n target?: ServerLaunch;\n /** Instruction file change, when the harness has one and it is not skipped. */\n instructions?: { path: string; change: FileChange };\n /** Session-start hook change, when the harness supports hooks and they are not skipped. */\n hook?: { path: string; change: FileChange };\n}\n\nexport type FileChange = \"add\" | \"update\" | \"remove\" | \"none\";\n\n/**\n * One agent harness. Adapters change configuration only through the\n * harness's own `mcp` commands, never by editing its files, so they stay\n * correct when the harness changes its file format or rewrites the file.\n */\nexport interface HarnessAdapter {\n id: HarnessId;\n displayName: string;\n /** Harness CLI binary. */\n binary: string;\n inspect(): Promise<HarnessState>;\n addSteps(launch: ServerLaunch): CommandStep[];\n removeSteps(): CommandStep[];\n /** Global instruction file the harness always loads, when MemStack should add guidance to it. */\n instructions?: { path: string; body: string };\n /** Hooks file where MemStack adds its session-start hook, and the SessionStart matcher to use. */\n sessionHook?: { path: string; matcher: string };\n}\n\nexport const SERVER_NAME = \"memstack\";\n\nexport function sameLaunch(a: ServerLaunch | undefined, b: ServerLaunch | undefined): boolean {\n if (!a || !b) return a === b;\n return (\n a.command === b.command &&\n JSON.stringify(a.args) === JSON.stringify(b.args) &&\n JSON.stringify(a.env ?? {}) === JSON.stringify(b.env ?? {})\n );\n}\n","// Claude Code: user-scope servers, managed with `claude mcp add-json -s user`\n// and `claude mcp remove -s user`, stored under top-level `mcpServers` in\n// $CLAUDE_CONFIG_DIR/.claude.json (default ~/.claude.json). Verified against\n// Claude Code 2.1.285 and https://code.claude.com/docs/en/mcp.\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { createRunner, type Runner } from \"./exec.js\";\nimport { SERVER_NAME, type HarnessAdapter, type HarnessState, type ServerLaunch } from \"./types.js\";\n\nexport function claudeCodeAdapter(options: { runner?: Runner; env?: NodeJS.ProcessEnv } = {}): HarnessAdapter {\n const env = options.env ?? process.env;\n const runner = options.runner ?? createRunner(env);\n const binary = \"claude\";\n const configPath = join(env.CLAUDE_CONFIG_DIR ?? homedir(), \".claude.json\");\n const settingsPath = env.CLAUDE_CONFIG_DIR ? join(env.CLAUDE_CONFIG_DIR, \"settings.json\") : join(homedir(), \".claude\", \"settings.json\");\n\n return {\n id: \"claude-code\",\n displayName: \"Claude Code\",\n binary,\n // Also on clear and compact, so the memories survive /clear and context compaction.\n sessionHook: { path: settingsPath, matcher: \"startup|resume|clear|compact\" },\n\n async inspect(): Promise<HarnessState> {\n const version = await runner(binary, [\"--version\"]);\n const state: HarnessState = { installed: version.code === 0, configPath };\n if (state.installed) state.version = version.stdout.trim().split(/\\s+/)[0];\n state.entry = readEntry(configPath);\n return state;\n },\n\n addSteps(launch: ServerLaunch) {\n const json = JSON.stringify({ type: \"stdio\", command: launch.command, args: launch.args, ...(launch.env ? { env: launch.env } : {}) });\n return [{ command: binary, args: [\"mcp\", \"add-json\", \"-s\", \"user\", SERVER_NAME, json] }];\n },\n\n removeSteps() {\n return [{ command: binary, args: [\"mcp\", \"remove\", \"-s\", \"user\", SERVER_NAME] }];\n },\n };\n}\n\n// Read-only: `claude mcp get` would also start the server to health-check it.\nfunction readEntry(configPath: string): ServerLaunch | undefined {\n if (!existsSync(configPath)) return undefined;\n let config: { mcpServers?: Record<string, { command?: unknown; args?: unknown; env?: unknown }> };\n try {\n config = JSON.parse(readFileSync(configPath, \"utf8\"));\n } catch (error) {\n throw new Error(`Could not read ${configPath}: ${(error as Error).message}`);\n }\n const entry = config.mcpServers?.[SERVER_NAME];\n if (!entry || typeof entry.command !== \"string\") return undefined;\n return {\n command: entry.command,\n args: Array.isArray(entry.args) ? entry.args.map(String) : [],\n ...(entry.env && typeof entry.env === \"object\" ? { env: entry.env as Record<string, string> } : {}),\n };\n}\n","// Small file helpers shared by the instruction-block and hook editors.\nimport { constants, copyFileSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\n\n/** Writes content atomically, keeping an existing file's mode. `null` deletes the file. */\nexport function writeFileAtomic(path: string, content: string | null): void {\n if (content === null) {\n rmSync(path, { force: true });\n return;\n }\n mkdirSync(dirname(path), { recursive: true });\n const mode = existsSync(path) ? statSync(path).mode & 0o777 : 0o644;\n const tmp = `${path}.memstack-${process.pid}.tmp`;\n writeFileSync(tmp, content, { mode });\n renameSync(tmp, path);\n}\n\n/**\n * Copies a file into `backupDir` with a timestamp suffix. Never overwrites an\n * earlier backup: changes in the same millisecond get numbered names.\n */\nexport function backupFile(path: string, backupDir: string): void {\n mkdirSync(backupDir, { recursive: true, mode: 0o700 });\n const base = join(backupDir, `${basename(path)}.${new Date().toISOString().replace(/[:.]/g, \"-\")}`);\n for (let n = 0; ; n++) {\n try {\n copyFileSync(path, n === 0 ? base : `${base}-${n}`, constants.COPYFILE_EXCL);\n return;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n }\n }\n}\n\n/** The file's content, or null when it does not exist; used to undo a change exactly. */\nexport function snapshot(path: string): string | null {\n return existsSync(path) ? readFileSync(path, \"utf8\") : null;\n}\n","// A marked block of agent instructions in a harness's global instruction file\n// (Codex: $CODEX_HOME/AGENTS.md). Only the text between the markers is ever\n// touched; the rest of the file is kept byte for byte.\nimport { existsSync, readFileSync, rmSync } from \"node:fs\";\nimport { backupFile, writeFileAtomic } from \"./files.js\";\n\nconst BEGIN = \"<!-- memstack:begin\";\nconst END = \"<!-- memstack:end -->\";\nconst BLOCK_PATTERN = /\\n?<!-- memstack:begin[^\\n]*-->\\n[\\s\\S]*?<!-- memstack:end -->\\n?/;\n\nexport const CODEX_INSTRUCTIONS = [\n \"## Project memory (MemStack)\",\n \"\",\n \"When the user asks you to remember something, save it with the memstack `memory_store` tool. Do not only acknowledge it, and do not write it into project files unless the user asks for a file change.\",\n \"At the start of a task, and before answering questions about this project's conventions, decisions, or the user's preferences, check `memory_retrieve`: it holds what earlier sessions, in Codex or other agents, were told to remember.\",\n].join(\"\\n\");\n\nexport function renderBlock(body: string, harness: string): string {\n return `${BEGIN} (managed by \\`memstack connect ${harness}\\`; removed by \\`memstack disconnect ${harness}\\`) -->\\n${body}\\n${END}\\n`;\n}\n\n/** The managed block currently in the file, or null. */\nexport function readBlock(path: string): string | null {\n if (!existsSync(path)) return null;\n const match = readFileSync(path, \"utf8\").match(BLOCK_PATTERN);\n return match ? match[0].replace(/^\\n/, \"\") : null;\n}\n\n/**\n * Adds or replaces the managed block. Returns false when the file already\n * holds exactly this block. The previous file is copied to `backupDir` first.\n */\nexport function upsertBlock(path: string, block: string, backupDir: string): boolean {\n const current = existsSync(path) ? readFileSync(path, \"utf8\") : null;\n if (current !== null && readBlock(path) === block) return false;\n\n let next: string;\n if (current === null || current.trim() === \"\") next = block;\n else if (BLOCK_PATTERN.test(current)) next = current.replace(BLOCK_PATTERN, (m) => `${m.startsWith(\"\\n\") ? \"\\n\" : \"\"}${block}`);\n else next = `${current}${current.endsWith(\"\\n\") ? \"\" : \"\\n\"}\\n${block}`;\n\n write(path, next, current, backupDir);\n return true;\n}\n\n/** Removes the managed block, deleting the file if nothing else was in it. Returns false when absent. */\nexport function removeBlock(path: string, backupDir: string): boolean {\n if (!existsSync(path)) return false;\n const current = readFileSync(path, \"utf8\");\n if (!BLOCK_PATTERN.test(current)) return false;\n // The block and the blank-line separator added before it.\n const next = current.replace(BLOCK_PATTERN, \"\");\n if (next.trim() === \"\") {\n backupFile(path, backupDir);\n rmSync(path);\n } else {\n write(path, next, current, backupDir);\n }\n return true;\n}\n\nfunction write(path: string, content: string, previous: string | null, backupDir: string): void {\n if (previous !== null) backupFile(path, backupDir);\n writeFileAtomic(path, content);\n}\n","// Codex: global servers in $CODEX_HOME/config.toml (default ~/.codex),\n// managed with `codex mcp add NAME -- CMD...`, `codex mcp remove NAME`, and\n// read with `codex mcp get NAME --json`. Verified against codex-cli 0.158.0.\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { createRunner, type Runner } from \"./exec.js\";\nimport { CODEX_INSTRUCTIONS } from \"./instructions.js\";\nimport { SERVER_NAME, type HarnessAdapter, type HarnessState, type ServerLaunch } from \"./types.js\";\n\nexport function codexAdapter(options: { runner?: Runner; env?: NodeJS.ProcessEnv } = {}): HarnessAdapter {\n const env = options.env ?? process.env;\n const runner = options.runner ?? createRunner(env);\n const binary = \"codex\";\n const home = env.CODEX_HOME ?? join(homedir(), \".codex\");\n const configPath = join(home, \"config.toml\");\n\n return {\n id: \"codex\",\n displayName: \"Codex\",\n binary,\n // Codex gives MCP server instructions little weight, so without this it\n // acknowledges \"remember that...\" instead of calling memory_store.\n instructions: { path: join(home, \"AGENTS.md\"), body: CODEX_INSTRUCTIONS },\n sessionHook: { path: join(home, \"hooks.json\"), matcher: \"startup|resume\" },\n\n async inspect(): Promise<HarnessState> {\n const version = await runner(binary, [\"--version\"]);\n const state: HarnessState = { installed: version.code === 0, configPath };\n if (!state.installed) return state;\n state.version = version.stdout.trim().split(/\\s+/).pop();\n\n const got = await runner(binary, [\"mcp\", \"get\", SERVER_NAME, \"--json\"]);\n if (got.code !== 0) {\n if (/No MCP server named/i.test(got.stderr + got.stdout)) return state;\n throw new Error(`codex mcp get failed: ${(got.stderr || got.stdout).trim()}`);\n }\n const transport = (JSON.parse(got.stdout) as { transport?: { command?: unknown; args?: unknown; env?: unknown } }).transport;\n if (transport && typeof transport.command === \"string\") {\n state.entry = {\n command: transport.command,\n args: Array.isArray(transport.args) ? transport.args.map(String) : [],\n ...(transport.env && typeof transport.env === \"object\" && Object.keys(transport.env).length > 0\n ? { env: transport.env as Record<string, string> }\n : {}),\n };\n }\n return state;\n },\n\n addSteps(launch: ServerLaunch) {\n const envFlags = Object.entries(launch.env ?? {}).flatMap(([key, value]) => [\"--env\", `${key}=${value}`]);\n return [{ command: binary, args: [\"mcp\", \"add\", SERVER_NAME, ...envFlags, \"--\", launch.command, ...launch.args] }];\n },\n\n removeSteps() {\n return [{ command: binary, args: [\"mcp\", \"remove\", SERVER_NAME] }];\n },\n };\n}\n","// MemStack's session-start hook entry in a harness's hooks file. Claude Code\n// ($CLAUDE_CONFIG_DIR/settings.json, default ~/.claude/settings.json) and\n// Codex ($CODEX_HOME/hooks.json) share the shape\n// { hooks: { SessionStart: [{ matcher, hooks: [{ type, command, ... }] }] } }.\n// Only MemStack's own entry is ever added, replaced, or removed.\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { writeFileAtomic, backupFile } from \"./files.js\";\nimport type { HarnessId, ServerLaunch } from \"./types.js\";\n\nexport interface HookCommand {\n type: \"command\";\n command: string;\n timeout: number;\n statusMessage: string;\n}\n\ninterface MatcherGroup {\n matcher?: string;\n hooks?: { command?: unknown }[];\n [key: string]: unknown;\n}\n\ntype HooksFile = { hooks?: Record<string, MatcherGroup[] | undefined> & Record<string, unknown> } & Record<string, unknown>;\n\nconst OURS = /\\bhook session-start --harness (claude-code|codex)\\b/;\n\n/** The hook command a harness runs: the installed server's `hook session-start` subcommand. */\nexport function sessionStartHook(launch: ServerLaunch, harness: HarnessId): HookCommand {\n // The launch runs the server; the hook runs the same binary and script with the hook subcommand.\n const script = launch.args[0]?.endsWith(\".js\") ? [launch.args[0]] : [];\n const parts = [launch.command, ...script].map(shellQuote);\n return {\n type: \"command\",\n command: `${parts.join(\" \")} hook session-start --harness ${harness}`,\n timeout: 10,\n statusMessage: \"Loading MemStack project memory\",\n };\n}\n\n/** MemStack's current hook command in the file, or null. Throws if the file is not valid JSON. */\nexport function readHook(path: string): HookCommand | null {\n const file = read(path);\n for (const group of file?.hooks?.SessionStart ?? []) {\n for (const hook of group.hooks ?? []) {\n if (typeof hook.command === \"string\" && OURS.test(hook.command)) return hook as HookCommand;\n }\n }\n return null;\n}\n\n/** Adds or replaces MemStack's entry. Returns false when it is already exactly this hook. */\nexport function upsertHook(path: string, hook: HookCommand, matcher: string, backupDir: string): boolean {\n const file = read(path) ?? {};\n const current = readHook(path);\n if (current && JSON.stringify(current) === JSON.stringify(hook) && ourGroups(file).every((g) => g.matcher === matcher)) return false;\n\n const hooks = (file.hooks ??= {} as NonNullable<HooksFile[\"hooks\"]>);\n hooks.SessionStart = [...withoutOurs(hooks.SessionStart ?? []), { matcher, hooks: [hook] }];\n save(path, file, backupDir);\n return true;\n}\n\n/** Removes MemStack's entry, and the file when nothing else is left in it. Returns false when absent. */\nexport function removeHook(path: string, backupDir: string): boolean {\n const file = read(path);\n if (!file || !readHook(path)) return false;\n const remaining = withoutOurs(file.hooks!.SessionStart ?? []);\n if (remaining.length > 0) file.hooks!.SessionStart = remaining;\n else delete file.hooks!.SessionStart;\n if (Object.keys(file.hooks!).length === 0) delete file.hooks;\n save(path, file, backupDir);\n return true;\n}\n\nfunction ourGroups(file: HooksFile): MatcherGroup[] {\n return (file.hooks?.SessionStart ?? []).filter((g) => (g.hooks ?? []).some((h) => typeof h.command === \"string\" && OURS.test(h.command)));\n}\n\n// Drops MemStack's hooks, keeping other hooks that share a matcher group.\nfunction withoutOurs(groups: MatcherGroup[]): MatcherGroup[] {\n return groups\n .map((g) => ({ ...g, hooks: (g.hooks ?? []).filter((h) => !(typeof h.command === \"string\" && OURS.test(h.command))) }))\n .filter((g, i) => g.hooks.length > 0 || (groups[i].hooks ?? []).length === 0);\n}\n\nfunction read(path: string): HooksFile | null {\n if (!existsSync(path)) return null;\n const text = readFileSync(path, \"utf8\");\n if (!text.trim()) return {};\n try {\n const parsed = JSON.parse(text) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) throw new Error(\"expected a JSON object\");\n return parsed as HooksFile;\n } catch (error) {\n throw new Error(`${path} is not valid JSON, so MemStack left it unchanged: ${(error as Error).message}`);\n }\n}\n\n// Keeps the file's own indentation and trailing newline, so removing the\n// hook restores a user's file byte for byte.\nfunction save(path: string, file: HooksFile, backupDir: string): void {\n const previous = existsSync(path) ? readFileSync(path, \"utf8\") : null;\n if (previous !== null) backupFile(path, backupDir);\n const indent = previous?.match(/^[ \\t]+(?=\")/m)?.[0] ?? \" \";\n const newline = previous === null || previous.endsWith(\"\\n\") ? \"\\n\" : \"\";\n writeFileAtomic(path, Object.keys(file).length === 0 ? null : `${JSON.stringify(file, null, indent)}${newline}`);\n}\n\nfunction shellQuote(value: string): string {\n return /^[\\w@%+=:,./-]+$/.test(value) ? value : `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n","// Starts the MCP server as a harness would and checks it answers: the MCP\n// handshake, the five harness tools, and a storage round trip.\nimport { spawn } from \"node:child_process\";\nimport type { ServerLaunch } from \"./types.js\";\n\nexport const HARNESS_TOOLS = [\"memory_store\", \"memory_retrieve\", \"memory_get\", \"memory_delete\", \"memory_stats\"];\n\nexport interface VerifyResult {\n ok: boolean;\n /** memory_stats output, e.g. \"Project abc (/repo): 3 memories. Global: 1.\" */\n stats?: string;\n error?: string;\n}\n\nexport type Verifier = (launch: ServerLaunch, options?: { cwd?: string; env?: NodeJS.ProcessEnv }) => Promise<VerifyResult>;\n\nexport const verifyServer: Verifier = (launch, options = {}) =>\n new Promise((resolve) => {\n const child = spawn(launch.command, launch.args, {\n cwd: options.cwd,\n env: { ...(options.env ?? process.env), ...launch.env },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n let stdout = \"\";\n let stderr = \"\";\n let settled = false;\n const pending = new Map<number, (message: { result?: unknown; error?: { message: string } }) => void>();\n\n const finish = (result: VerifyResult) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n child.kill();\n resolve(result);\n };\n const timer = setTimeout(() => finish({ ok: false, error: `No response within 20 s. ${lastLine(stderr)}`.trim() }), 20_000);\n\n child.on(\"error\", (error) => finish({ ok: false, error: `Could not start ${launch.command}: ${error.message}` }));\n child.on(\"exit\", (code) => finish({ ok: false, error: `Server exited with code ${code}. ${lastLine(stderr)}`.trim() }));\n child.stderr.on(\"data\", (chunk) => (stderr += chunk));\n child.stdout.on(\"data\", (chunk) => {\n stdout += chunk;\n let newline: number;\n while ((newline = stdout.indexOf(\"\\n\")) >= 0) {\n const line = stdout.slice(0, newline).trim();\n stdout = stdout.slice(newline + 1);\n if (!line) continue;\n try {\n const message = JSON.parse(line);\n pending.get(message.id)?.(message);\n } catch {\n // Not JSON-RPC; ignore.\n }\n }\n });\n\n let nextId = 1;\n const request = (method: string, params: unknown) =>\n new Promise<{ result?: unknown; error?: { message: string } }>((reply) => {\n const id = nextId++;\n pending.set(id, reply);\n child.stdin.write(`${JSON.stringify({ jsonrpc: \"2.0\", id, method, params })}\\n`);\n });\n\n void (async () => {\n const init = await request(\"initialize\", {\n protocolVersion: \"2025-06-18\",\n capabilities: {},\n clientInfo: { name: \"memstack-connect\", version: \"1\" },\n });\n if (init.error) return finish({ ok: false, error: init.error.message });\n child.stdin.write(`${JSON.stringify({ jsonrpc: \"2.0\", method: \"notifications/initialized\" })}\\n`);\n\n const list = await request(\"tools/list\", {});\n const names = ((list.result as { tools?: { name: string }[] })?.tools ?? []).map((t) => t.name);\n const missing = HARNESS_TOOLS.filter((t) => !names.includes(t));\n if (missing.length > 0) return finish({ ok: false, error: `Server is missing harness tools: ${missing.join(\", \")}` });\n\n const stats = await request(\"tools/call\", { name: \"memory_stats\", arguments: {} });\n const result = stats.result as { content?: { text: string }[]; isError?: boolean } | undefined;\n const text = result?.content?.map((c) => c.text).join(\"\\n\") ?? stats.error?.message ?? \"\";\n if (!result || result.isError) return finish({ ok: false, error: text || \"memory_stats failed\" });\n finish({ ok: true, stats: text });\n })();\n });\n\nfunction lastLine(text: string): string {\n return text.trim().split(\"\\n\").filter(Boolean).pop() ?? \"\";\n}\n","import { join } from \"node:path\";\nimport { memstackHome } from \"@memstack/config-env\";\nimport { run, type Runner } from \"./exec.js\";\nimport { readBlock, removeBlock, renderBlock, upsertBlock } from \"./instructions.js\";\nimport { readHook, removeHook, sessionStartHook, upsertHook } from \"./hooks.js\";\nimport { snapshot, writeFileAtomic } from \"./files.js\";\nimport { verifyServer, type Verifier, type VerifyResult } from \"./verify.js\";\nimport { sameLaunch, type CommandStep, type ConnectPlan, type HarnessAdapter, type ServerLaunch } from \"./types.js\";\n\nexport interface ConnectOptions {\n adapter: HarnessAdapter;\n launch: ServerLaunch;\n runner?: Runner;\n verify?: Verifier;\n /** Plan and verify, but change nothing. */\n dryRun?: boolean;\n /** Add MemStack guidance to the harness's instruction file, when it has one. Default true. */\n instructions?: boolean;\n /** Add the session-start hook, when the harness supports hooks. Default true. */\n hooks?: boolean;\n /** Where instruction files are backed up before a change. Default ~/.memstack/backups. */\n backupDir?: string;\n}\n\nexport interface ConnectResult {\n plan: ConnectPlan;\n /** Config was changed. False when already connected or on a dry run. */\n changed: boolean;\n verification: VerifyResult;\n}\n\n/**\n * Registers MemStack with a harness. The server is started and checked\n * before any config changes, so a broken install never gets registered.\n * After the change the harness's own config is read back to confirm it,\n * and any failure part-way restores the previous entry. Running it again\n * with the same launch changes nothing.\n */\nexport async function connectHarness({\n adapter,\n launch,\n runner = run,\n verify = verifyServer,\n dryRun,\n instructions = true,\n hooks = true,\n backupDir = join(memstackHome(), \"backups\"),\n}: ConnectOptions): Promise<ConnectResult> {\n const state = await adapter.inspect();\n if (!state.installed) throw new Error(`${adapter.displayName} is not installed: \\`${adapter.binary}\\` is not on PATH.`);\n\n const alreadyConnected = sameLaunch(state.entry, launch);\n const plan: ConnectPlan = {\n harness: adapter.id,\n previous: state.entry,\n target: launch,\n steps: alreadyConnected ? [] : [...(state.entry ? adapter.removeSteps() : []), ...adapter.addSteps(launch)],\n };\n const block = adapter.instructions && instructions ? renderBlock(adapter.instructions.body, adapter.id) : undefined;\n if (adapter.instructions && block) {\n const current = readBlock(adapter.instructions.path);\n plan.instructions = { path: adapter.instructions.path, change: current === null ? \"add\" : current === block ? \"none\" : \"update\" };\n }\n const hook = adapter.sessionHook && hooks ? sessionStartHook(launch, adapter.id) : undefined;\n if (adapter.sessionHook && hook) {\n const current = readHook(adapter.sessionHook.path);\n plan.hook = { path: adapter.sessionHook.path, change: current === null ? \"add\" : JSON.stringify(current) === JSON.stringify(hook) ? \"none\" : \"update\" };\n }\n\n const verification = await verify(launch);\n if (!verification.ok) {\n throw new Error(`MemStack's MCP server did not start correctly, so ${adapter.displayName} was not changed: ${verification.error}`);\n }\n if (dryRun) return { plan, changed: false, verification };\n\n // Each applied change records how to undo it; any failure unwinds them all.\n const undo: (() => Promise<boolean>)[] = [];\n let changed = false;\n try {\n if (!alreadyConnected) {\n await applyWithRollback(adapter, plan, runner);\n undo.push(() => restore(adapter, plan.previous, runner));\n changed = true;\n }\n if (block && plan.instructions && plan.instructions.change !== \"none\") {\n const path = plan.instructions.path;\n const before = snapshot(path);\n // Writes are atomic, so a failed step changed nothing and needs no undo.\n fileStep(path, () => upsertBlock(path, block, backupDir));\n undo.push(async () => (writeFileAtomic(path, before), true));\n changed = true;\n }\n if (hook && adapter.sessionHook && plan.hook && plan.hook.change !== \"none\") {\n const path = plan.hook.path;\n const before = snapshot(path);\n const matcher = adapter.sessionHook.matcher;\n fileStep(path, () => upsertHook(path, hook, matcher, backupDir));\n undo.push(async () => (writeFileAtomic(path, before), true));\n changed = true;\n }\n } catch (error) {\n let restored = true;\n for (const step of undo.reverse()) restored = (await step().catch(() => false)) && restored;\n const message = error instanceof Error ? error.message : String(error);\n if (/previous configuration/.test(message)) throw error;\n throw new Error(`${message} ${restored ? \"The previous configuration was restored.\" : \"Restoring the previous configuration failed; run `memstack doctor`.\"}`);\n }\n return { plan, changed, verification };\n}\n\n/** Removes MemStack from a harness. Does nothing when it is not registered. */\nexport async function disconnectHarness({\n adapter,\n runner = run,\n dryRun,\n backupDir = join(memstackHome(), \"backups\"),\n}: Omit<ConnectOptions, \"launch\" | \"verify\" | \"instructions\" | \"hooks\">): Promise<{ plan: ConnectPlan; changed: boolean }> {\n const state = await adapter.inspect();\n if (!state.installed) throw new Error(`${adapter.displayName} is not installed: \\`${adapter.binary}\\` is not on PATH.`);\n const plan: ConnectPlan = { harness: adapter.id, previous: state.entry, steps: state.entry ? adapter.removeSteps() : [] };\n if (adapter.instructions) {\n plan.instructions = { path: adapter.instructions.path, change: readBlock(adapter.instructions.path) === null ? \"none\" : \"remove\" };\n }\n if (adapter.sessionHook) {\n plan.hook = { path: adapter.sessionHook.path, change: readHook(adapter.sessionHook.path) === null ? \"none\" : \"remove\" };\n }\n if (dryRun) return { plan, changed: false };\n\n let changed = false;\n if (plan.steps.length > 0) {\n await applyWithRollback(adapter, plan, runner);\n changed = true;\n }\n if (plan.instructions?.change === \"remove\") changed = removeBlock(plan.instructions.path, backupDir) || changed;\n if (plan.hook?.change === \"remove\") changed = removeHook(plan.hook.path, backupDir) || changed;\n return { plan, changed };\n}\n\nasync function applyWithRollback(adapter: HarnessAdapter, plan: ConnectPlan, runner: Runner): Promise<void> {\n try {\n for (const step of plan.steps) await runStep(step, runner);\n const after = await adapter.inspect();\n if (!sameLaunch(after.entry, plan.target)) {\n throw new Error(`${adapter.displayName} does not show the expected MemStack entry after the change.`);\n }\n } catch (error) {\n const restored = await restore(adapter, plan.previous, runner);\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`${message} ${restored ? \"The previous configuration was restored.\" : \"Restoring the previous configuration failed; run `memstack doctor`.\"}`);\n }\n}\n\nasync function restore(adapter: HarnessAdapter, previous: ServerLaunch | undefined, runner: Runner): Promise<boolean> {\n try {\n const current = await adapter.inspect();\n if (sameLaunch(current.entry, previous)) return true;\n if (current.entry) for (const step of adapter.removeSteps()) await runStep(step, runner);\n if (previous) for (const step of adapter.addSteps(previous)) await runStep(step, runner);\n return sameLaunch((await adapter.inspect()).entry, previous);\n } catch {\n return false;\n }\n}\n\nfunction fileStep(path: string, apply: () => unknown): void {\n try {\n apply();\n } catch (error) {\n throw new Error(`Could not update ${path}: ${(error as Error).message}.`);\n }\n}\n\nasync function runStep(step: CommandStep, runner: Runner): Promise<void> {\n const result = await runner(step.command, step.args);\n if (result.code !== 0) {\n throw new Error(`\\`${step.command} ${step.args.slice(0, 3).join(\" \")}\\` failed: ${(result.stderr || result.stdout).trim()}`);\n }\n}\n\n/** A step as a shell-like line for previews; JSON arguments are shown quoted. */\nexport function describeStep(step: CommandStep): string {\n return [step.command, ...step.args.map((a) => (/^[\\w@%+=:,./-]+$/.test(a) ? a : `'${a.replace(/'/g, \"'\\\\''\")}'`))].join(\" \");\n}\n","// Finds the user's own install of memstack-mcp and their storage driver.\n// MemStack never installs either: these checks only look.\nimport { existsSync, realpathSync } from \"node:fs\";\nimport { delimiter, dirname, join } from \"node:path\";\nimport type { StorageType } from \"@memstack/config-env\";\nimport type { ServerLaunch, HarnessId } from \"./types.js\";\n\n/** Driver package each store loads, with the range MemStack supports. */\nexport const STORAGE_DRIVERS: Partial<Record<StorageType, { module: string; spec: string }>> = {\n sqlite: { module: \"better-sqlite3\", spec: \"better-sqlite3@^11.10.0\" },\n postgres: { module: \"postgres\", spec: \"postgres@^3.4.9\" },\n redis: { module: \"ioredis\", spec: \"ioredis@^5.11.1\" },\n};\n\n/** The command a user runs to install the MCP server and their driver. */\nexport function installCommand(storage: StorageType | undefined): string {\n const driver = storage ? STORAGE_DRIVERS[storage] : undefined;\n return `npm install -g @memstack/mcp${driver ? ` ${driver.spec}` : \"\"}`;\n}\n\n/** Resolved path of `memstack-mcp` on PATH, or null. */\nexport function findMemstackMcp(env: NodeJS.ProcessEnv = process.env): string | null {\n const names = process.platform === \"win32\" ? [\"memstack-mcp.cmd\", \"memstack-mcp\"] : [\"memstack-mcp\"];\n for (const dir of (env.PATH ?? \"\").split(delimiter)) {\n if (!dir) continue;\n for (const name of names) {\n const candidate = join(dir, name);\n if (existsSync(candidate)) return realpathSync(candidate);\n }\n }\n return null;\n}\n\n/**\n * Whether `module` can be loaded from where the script lives, walking up\n * node_modules directories the way Node resolves packages. A global npm\n * install finds drivers installed globally next to @memstack/mcp.\n */\nexport function canResolveFrom(scriptPath: string, module: string): boolean {\n let dir = dirname(scriptPath);\n for (;;) {\n if (existsSync(join(dir, \"node_modules\", module, \"package.json\"))) return true;\n const parent = dirname(dir);\n if (parent === dir) return false;\n dir = parent;\n }\n}\n\n/**\n * How a harness starts the server: the current Node binary running the\n * installed script by absolute path, so it works even when the harness is\n * launched without the user's shell PATH. No secrets go in the harness\n * config; the server reads ~/.memstack/config.json.\n */\nexport function harnessLaunch(mcpScript: string, harness: HarnessId): ServerLaunch {\n const isScript = /\\.(c|m)?js$/.test(mcpScript);\n const args = [\"--profile\", \"harness\", \"--harness\", harness];\n return isScript ? { command: process.execPath, args: [mcpScript, ...args] } : { command: mcpScript, args };\n}\n","import { claudeCodeAdapter } from \"./claude-code.js\";\nimport { codexAdapter } from \"./codex.js\";\nimport type { HarnessAdapter, HarnessId } from \"./types.js\";\n\nexport const HARNESS_IDS: HarnessId[] = [\"claude-code\", \"codex\"];\n\nexport function harnessAdapter(id: string, options: { env?: NodeJS.ProcessEnv } = {}): HarnessAdapter {\n if (id === \"claude-code\") return claudeCodeAdapter(options);\n if (id === \"codex\") return codexAdapter(options);\n throw new Error(`Unknown harness \"${id}\". Supported: ${HARNESS_IDS.join(\", \")}.`);\n}\n\nexport * from \"./types.js\";\nexport { connectHarness, disconnectHarness, describeStep } from \"./connect.js\";\nexport { createRunner, run } from \"./exec.js\";\nexport { verifyServer } from \"./verify.js\";\nexport { findMemstackMcp, canResolveFrom, harnessLaunch, installCommand, STORAGE_DRIVERS } from \"./locate.js\";\n","// Harness commands: init, connect, disconnect, status, doctor, memories\n// None of them installs packages: when the MCP server or a\n// storage driver is missing they print the command for the user to run.\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport {\n AnthropicLLMAdapter,\n HarnessMemory,\n OpenAILLMAdapter,\n defaultRecallNamespaces,\n projectNamespace,\n} from \"@memstack/core\";\nimport type { LLMProvider } from \"@memstack/core\";\nimport {\n STORAGE_TYPES,\n checkConfigPermissions,\n configFilePath,\n loadConfig,\n memstackHome,\n mergeConfigFile,\n PIN_FILE,\n pinProject,\n readConfigFile,\n resolveProject,\n writeConfigFile,\n type MemStackConfigFile,\n type StorageType,\n} from \"@memstack/config-env\";\nimport {\n HARNESS_IDS,\n STORAGE_DRIVERS,\n canResolveFrom,\n connectHarness,\n describeStep,\n disconnectHarness,\n findMemstackMcp,\n harnessAdapter,\n harnessLaunch,\n installCommand,\n sameLaunch,\n verifyServer,\n} from \"./harness/index.js\";\nimport { readBlock, renderBlock } from \"./harness/instructions.js\";\nimport { readHook, sessionStartHook } from \"./harness/hooks.js\";\n\nexport const HARNESS_COMMANDS = [\"init\", \"connect\", \"disconnect\", \"status\", \"doctor\", \"memories\", \"project\"] as const;\n\nexport interface HarnessFlags {\n provider?: string;\n \"base-url\"?: string;\n model?: string;\n \"api-key-env\"?: string;\n store?: string;\n path?: string;\n url?: string;\n yes?: boolean;\n \"dry-run\"?: boolean;\n live?: boolean;\n global?: boolean;\n limit?: string;\n delete?: string;\n \"no-agents-md\"?: boolean;\n \"no-hooks\"?: boolean;\n}\n\nconst out = (line = \"\") => process.stdout.write(`${line}\\n`);\n\nexport async function runHarnessCommand(command: string, args: string[], flags: HarnessFlags): Promise<number> {\n switch (command) {\n case \"init\":\n return init(flags);\n case \"connect\":\n return connect(args, flags);\n case \"disconnect\":\n return disconnect(args, flags);\n case \"status\":\n return status();\n case \"doctor\":\n return doctor(flags);\n case \"memories\":\n return memories(args, flags);\n case \"project\":\n return projectCommand(args);\n default:\n throw new Error(`Unknown command: ${command}`);\n }\n}\n\n// ── init ──\n\nasync function init(flags: HarnessFlags): Promise<number> {\n const existing = readConfigFile();\n const interactive = process.stdin.isTTY && !flags.yes;\n const prompt = interactive ? createPrompter() : undefined;\n\n try {\n const provider = (flags.provider ?? (await prompt?.choose(\"LLM provider\", [\"openai-compatible\", \"anthropic\"], existing?.llm?.provider ?? \"openai-compatible\")) ?? existing?.llm?.provider ?? \"openai-compatible\") as \"openai-compatible\" | \"anthropic\";\n if (provider !== \"openai-compatible\" && provider !== \"anthropic\") throw new Error('--provider must be \"openai-compatible\" or \"anthropic\"');\n\n const sameProvider = existing?.llm?.provider === provider;\n let baseURL: string | undefined;\n if (provider === \"openai-compatible\") {\n baseURL = flags[\"base-url\"] ?? (await prompt?.ask(\"Base URL (empty for OpenAI)\", sameProvider ? existing?.llm?.baseURL ?? \"\" : \"\")) ?? (sameProvider ? existing?.llm?.baseURL : undefined);\n baseURL = baseURL || undefined;\n }\n const model = flags.model ?? (await prompt?.ask(\"Model (empty for the provider default)\", sameProvider ? existing?.llm?.model ?? \"\" : \"\")) ?? (sameProvider ? existing?.llm?.model : undefined);\n\n let apiKey: string | undefined;\n if (flags[\"api-key-env\"]) {\n apiKey = process.env[flags[\"api-key-env\"]];\n if (!apiKey) throw new Error(`Environment variable ${flags[\"api-key-env\"]} is empty.`);\n } else if (prompt) {\n apiKey = (await prompt.secret(sameProvider && existing?.llm?.apiKey ? \"API key (empty to keep the current one)\" : \"API key\")) || (sameProvider ? existing?.llm?.apiKey : undefined);\n } else if (sameProvider) {\n apiKey = existing?.llm?.apiKey;\n }\n if (!apiKey) throw new Error(\"An API key is required. Pass --api-key-env <VAR> to read it from an environment variable.\");\n\n const store = (flags.store ?? (await prompt?.choose(\"Storage\", [...STORAGE_TYPES], existing?.storage?.type ?? \"sqlite\")) ?? existing?.storage?.type ?? \"sqlite\") as StorageType;\n if (!STORAGE_TYPES.includes(store)) throw new Error(`--store must be one of ${STORAGE_TYPES.join(\", \")}`);\n const storage = await storageSettings(store, flags, existing, prompt);\n\n const llm = { provider, apiKey, ...(baseURL ? { baseURL } : {}), ...(model ? { model } : {}) };\n out(\"Checking the LLM provider with a test request...\");\n await checkLLM(buildLLM(llm));\n out(\" ✓ The provider answered.\");\n\n const config: MemStackConfigFile = { version: 1, llm, storage };\n if (storage.type === \"sqlite\" && storage.path) mkdirSync(join(storage.path, \"..\"), { recursive: true, mode: 0o700 });\n writeConfigFile(config);\n out(`Saved ${configFilePath()} (readable only by you).`);\n\n const mcp = findMemstackMcp();\n const driver = STORAGE_DRIVERS[store];\n out();\n if (!mcp || (driver && !canResolveFrom(mcp, driver.module))) {\n out(\"Next, install the MCP server and your storage driver (MemStack does not install them for you):\");\n out(` ${installCommand(store)}`);\n }\n out(\"Then connect your agents:\");\n out(\" memstack connect claude-code\");\n out(\" memstack connect codex\");\n return 0;\n } finally {\n prompt?.close();\n }\n}\n\nasync function storageSettings(\n type: StorageType,\n flags: HarnessFlags,\n existing: MemStackConfigFile | undefined,\n prompt: Prompter | undefined,\n): Promise<NonNullable<MemStackConfigFile[\"storage\"]>> {\n const previous = existing?.storage?.type === type ? existing.storage : undefined;\n switch (type) {\n case \"sqlite\":\n case \"disk\":\n case \"markdown\": {\n const fallback = previous?.path ?? join(memstackHome(), type === \"sqlite\" ? \"memstack.db\" : type === \"disk\" ? \"data\" : \"memories\");\n const path = flags.path ?? (await prompt?.ask(type === \"sqlite\" ? \"Database file\" : \"Directory\", fallback)) ?? fallback;\n return { type, path };\n }\n case \"postgres\":\n case \"redis\": {\n const url = flags.url ?? (await prompt?.ask(`${type === \"postgres\" ? \"Postgres\" : \"Redis\"} connection URL`, previous?.url ?? \"\")) ?? previous?.url;\n if (!url) throw new Error(`--url is required for ${type}.`);\n return { type, url };\n }\n case \"memory\":\n return { type };\n }\n}\n\nfunction buildLLM(llm: NonNullable<MemStackConfigFile[\"llm\"]>): LLMProvider {\n return llm.provider === \"anthropic\"\n ? new AnthropicLLMAdapter({ apiKey: llm.apiKey, defaultModel: llm.model })\n : new OpenAILLMAdapter({ apiKey: llm.apiKey, baseURL: llm.baseURL, defaultModel: llm.model });\n}\n\nasync function checkLLM(llm: LLMProvider): Promise<void> {\n let text: string;\n try {\n // Generous token cap: reasoning models think before they answer.\n ({ text } = await llm.complete({ system: \"Reply with the single word OK.\", user: \"ping\", maxTokens: 1024, temperature: 0 }));\n } catch (error) {\n throw new Error(`The LLM provider rejected the test request: ${(error as Error).message}`);\n }\n if (!text.trim()) throw new Error(\"The LLM provider returned an empty reply to the test request.\");\n}\n\n// ── connect / disconnect ──\n\nasync function connect(ids: string[], flags: HarnessFlags): Promise<number> {\n if (ids.length === 0) throw new Error(`Name a harness: memstack connect <${HARNESS_IDS.join(\"|\")}>`);\n const file = readConfigFile();\n if (!file && !process.env.OPENAI_API_KEY && !process.env.ANTHROPIC_API_KEY) {\n throw new Error(\"No MemStack configuration found. Run `memstack init` first.\");\n }\n const mcp = findMemstackMcp();\n if (!mcp) {\n throw new Error(`memstack-mcp is not installed. MemStack does not install it for you; run:\\n ${installCommand(file?.storage?.type)}`);\n }\n\n for (const id of ids) {\n const adapter = harnessAdapter(id);\n const launch = harnessLaunch(mcp, adapter.id);\n const result = await connectHarness({\n adapter,\n launch,\n dryRun: flags[\"dry-run\"],\n instructions: !flags[\"no-agents-md\"],\n hooks: !flags[\"no-hooks\"],\n });\n const instructions = result.plan.instructions;\n const hook = result.plan.hook;\n if (flags[\"dry-run\"]) {\n out(`${adapter.displayName}: the server works (${result.verification.stats}).`);\n const pending = result.plan.steps.length > 0 || (instructions && instructions.change !== \"none\") || (hook && hook.change !== \"none\");\n out(pending ? \"Would run:\" : \"Already connected; nothing to change.\");\n for (const step of result.plan.steps) out(` ${describeStep(step)}`);\n if (instructions && instructions.change !== \"none\") {\n out(` ${instructions.change === \"add\" ? \"add\" : \"update\"} the marked MemStack block in ${instructions.path}:`);\n for (const line of renderBlock(adapter.instructions!.body, adapter.id).trimEnd().split(\"\\n\")) out(` ${line}`);\n }\n if (hook && hook.change !== \"none\") {\n out(` ${hook.change} the MemStack session-start hook in ${hook.path}:`);\n out(` ${sessionStartHook(launch, adapter.id).command}`);\n }\n } else if (result.changed) {\n out(`✓ Connected ${adapter.displayName}. ${result.verification.stats}`);\n if (instructions && instructions.change !== \"none\") {\n out(` ${instructions.change === \"add\" ? \"Added\" : \"Updated\"} MemStack guidance in ${instructions.path} (between memstack:begin/end markers).`);\n }\n if (hook && hook.change !== \"none\") {\n out(` ${hook.change === \"add\" ? \"Added\" : \"Updated\"} a session-start hook in ${hook.path} that loads project memories.`);\n if (adapter.id === \"codex\") out(\" Codex runs new hooks only after you approve them: open Codex and run /hooks once.\");\n }\n out(` ${adapter.id === \"claude-code\" ? \"Restart Claude Code\" : \"Start a new Codex session\"} to load MemStack.`);\n } else {\n out(`✓ ${adapter.displayName} is already connected. ${result.verification.stats}`);\n }\n }\n return 0;\n}\n\nasync function disconnect(ids: string[], flags: HarnessFlags): Promise<number> {\n if (ids.length === 0) throw new Error(`Name a harness: memstack disconnect <${HARNESS_IDS.join(\"|\")}>`);\n for (const id of ids) {\n const adapter = harnessAdapter(id);\n const result = await disconnectHarness({ adapter, dryRun: flags[\"dry-run\"] });\n const removeBlock = result.plan.instructions?.change === \"remove\";\n const removeHook = result.plan.hook?.change === \"remove\";\n if (flags[\"dry-run\"]) {\n const pending = result.plan.steps.length > 0 || removeBlock || removeHook;\n out(pending ? `${adapter.displayName}: would run:` : `${adapter.displayName}: not connected; nothing to change.`);\n for (const step of result.plan.steps) out(` ${describeStep(step)}`);\n if (removeBlock) out(` remove the marked MemStack block from ${result.plan.instructions!.path}`);\n if (removeHook) out(` remove the MemStack session-start hook from ${result.plan.hook!.path}`);\n } else {\n out(result.changed ? `✓ Disconnected ${adapter.displayName}. Your memories are kept.` : `${adapter.displayName} was not connected.`);\n }\n }\n return 0;\n}\n\n// ── status ──\n\nconst label = (name: string) => (name ? `${name}:` : \"\").padEnd(14);\n\nasync function status(): Promise<number> {\n const file = readConfigFile();\n const fromEnv = envOverrides();\n const config = file ? configFilePath() : fromEnv.llm || fromEnv.storage ? \"none, using environment variables\" : \"none (run `memstack init`)\";\n out(`${label(\"Config\")}${config}`);\n const env = mergeConfigFile(file, process.env);\n const envNote = (overridden: boolean) => (overridden ? \" (from environment variables)\" : \"\");\n if (env.OPENAI_API_KEY || env.ANTHROPIC_API_KEY) {\n const provider = env.ANTHROPIC_API_KEY ? \"anthropic\" : \"openai-compatible\";\n const baseURL = provider === \"openai-compatible\" ? env.MEMSTACK_OPENAI_BASE_URL : undefined;\n out(`${label(\"LLM\")}${provider}${env.MEMSTACK_LLM_MODEL ? ` (${env.MEMSTACK_LLM_MODEL})` : \"\"}${baseURL ? ` at ${baseURL}` : \"\"}${envNote(fromEnv.llm)}`);\n } else if (file || fromEnv.llm) {\n out(`${label(\"LLM\")}no API key (run \\`memstack init\\`)`);\n }\n if (env.MEMSTACK_STORAGE) out(`${label(\"Storage\")}${describeStorage(env)}${envNote(fromEnv.storage)}`);\n\n const project = resolveProject();\n out(`${label(\"Project\")}${project.id} (${describeSource(project.source)}: ${project.key})`);\n\n const mcp = findMemstackMcp();\n out(`${label(\"Server\")}${mcp ?? \"memstack-mcp not installed\"}`);\n\n for (const id of HARNESS_IDS) {\n const adapter = harnessAdapter(id);\n const state = await adapter.inspect();\n let line: string;\n if (!state.installed) line = \"not installed\";\n else if (!state.entry) line = \"not connected\";\n else if (!mcp) {\n const present = [state.entry.command, ...state.entry.args.filter((a) => a.startsWith(\"/\"))].every((p) => existsSync(p));\n line = present ? \"connected (memstack-mcp is not on PATH, so updates can't be checked)\" : \"connected to a command that no longer exists (run `memstack doctor`)\";\n } else if (sameLaunch(state.entry, harnessLaunch(mcp, adapter.id))) line = \"connected\";\n else line = \"connected with a different command (run `memstack connect` to update)\";\n out(`${label(adapter.displayName)}${line}`);\n if (adapter.instructions && state.installed) {\n const block = readBlock(adapter.instructions.path);\n const current = block === renderBlock(adapter.instructions.body, adapter.id);\n out(`${label(\"\")}guidance in ${adapter.instructions.path}: ${block === null ? \"none\" : current ? \"present\" : \"outdated (run `memstack connect`)\"}`);\n }\n if (adapter.sessionHook && state.installed) {\n out(`${label(\"\")}session-start hook in ${adapter.sessionHook.path}: ${hookState(adapter, mcp)}`);\n }\n }\n return 0;\n}\n\n/** Which config file sections environment variables replace; see mergeConfigFile. */\nfunction envOverrides(): { llm: boolean; storage: boolean } {\n return {\n llm: [\"OPENAI_API_KEY\", \"ANTHROPIC_API_KEY\", \"MEMSTACK_OPENAI_BASE_URL\", \"MEMSTACK_LLM_MODEL\"].some((key) => process.env[key] !== undefined),\n storage: process.env.MEMSTACK_STORAGE !== undefined,\n };\n}\n\nfunction describeStorage(env: Record<string, string | undefined>): string {\n const type = env.MEMSTACK_STORAGE!;\n if (type === \"memory\") return \"memory (lost when the process exits)\";\n const path = type === \"sqlite\" ? env.SQLITE_PATH : type === \"disk\" || type === \"markdown\" ? env.MEMSTACK_DIR : undefined;\n if (path) return `${type} at ${path}`;\n const url = type === \"postgres\" ? env.DATABASE_URL : type === \"redis\" ? env.REDIS_URL : undefined;\n return url ? `${type} (URL configured)` : type;\n}\n\nfunction hookState(adapter: ReturnType<typeof harnessAdapter>, mcp: string | null): string {\n const current = readHook(adapter.sessionHook!.path);\n if (!current) return \"missing\";\n if (mcp && JSON.stringify(current) !== JSON.stringify(sessionStartHook(harnessLaunch(mcp, adapter.id), adapter.id))) return \"outdated\";\n return \"present\";\n}\n\n// ── doctor ──\n\nasync function doctor(flags: HarnessFlags): Promise<number> {\n let failures = 0;\n const pass = (message: string) => out(`✓ ${message}`);\n const warn = (message: string) => out(`! ${message}`);\n const fail = (message: string) => {\n failures++;\n out(`✗ ${message}`);\n };\n\n let file: MemStackConfigFile | undefined;\n try {\n file = readConfigFile();\n if (file) pass(`Config file ${configFilePath()}`);\n else if (envOverrides().llm || envOverrides().storage) pass(`Using environment variables (no config file at ${configFilePath()})`);\n else warn(`No config file at ${configFilePath()}; run \\`memstack init\\`.`);\n } catch (error) {\n fail((error as Error).message);\n }\n for (const warning of checkConfigPermissions()) warn(warning);\n\n const env = mergeConfigFile(file, process.env);\n if (env.OPENAI_API_KEY || env.ANTHROPIC_API_KEY) {\n pass(`LLM key configured (${env.ANTHROPIC_API_KEY ? \"anthropic\" : \"openai-compatible\"}${env.MEMSTACK_LLM_MODEL ? `, ${env.MEMSTACK_LLM_MODEL}` : \"\"})`);\n if (flags.live && file?.llm && !process.env.OPENAI_API_KEY && !process.env.ANTHROPIC_API_KEY) {\n try {\n await checkLLM(buildLLM(file.llm));\n pass(\"LLM provider answered a test request\");\n } catch (error) {\n fail((error as Error).message);\n }\n }\n } else {\n fail(\"No LLM key. Run `memstack init`.\");\n }\n\n const storageType = (env.MEMSTACK_STORAGE ?? \"memory\") as StorageType;\n if (storageType === \"memory\") warn(\"Storage is in-memory: memories are lost when a session ends. Run `memstack init` to choose a store.\");\n else pass(`Storage: ${storageType}`);\n\n const mcp = findMemstackMcp();\n if (!mcp) {\n fail(`memstack-mcp is not installed. Run: ${installCommand(storageType)}`);\n } else {\n pass(`memstack-mcp at ${mcp}`);\n const driver = STORAGE_DRIVERS[storageType];\n if (driver) {\n if (canResolveFrom(mcp, driver.module)) pass(`Storage driver ${driver.module} is installed`);\n else fail(`Storage driver ${driver.module} is not installed next to memstack-mcp. Run: npm install -g ${driver.spec}`);\n }\n }\n\n const project = resolveProject();\n pass(`Project ${project.id} (${describeSource(project.source)}: ${project.key})`);\n\n for (const id of HARNESS_IDS) {\n const adapter = harnessAdapter(id);\n let state;\n try {\n state = await adapter.inspect();\n } catch (error) {\n fail(`${adapter.displayName}: ${(error as Error).message}`);\n continue;\n }\n if (!state.installed) {\n out(`- ${adapter.displayName} is not installed`);\n continue;\n }\n if (!state.entry) {\n warn(`${adapter.displayName} is not connected. Run: memstack connect ${id}`);\n continue;\n }\n const missing = [state.entry.command, ...state.entry.args.filter((a) => a.startsWith(\"/\"))].filter((p) => !existsSync(p));\n if (missing.length > 0) fail(`${adapter.displayName} points at ${missing.join(\", \")}, which no longer exists. Run: memstack connect ${id}`);\n else if (mcp && !sameLaunch(state.entry, harnessLaunch(mcp, adapter.id))) warn(`${adapter.displayName} uses a different MemStack command. Run: memstack connect ${id}`);\n else pass(`${adapter.displayName} is connected`);\n if (adapter.instructions) {\n const block = readBlock(adapter.instructions.path);\n if (block === null) warn(`${adapter.displayName} has no MemStack guidance in ${adapter.instructions.path}, so it may not save memories when asked. Run: memstack connect ${id}`);\n else if (block !== renderBlock(adapter.instructions.body, adapter.id)) warn(`MemStack guidance in ${adapter.instructions.path} is outdated. Run: memstack connect ${id}`);\n else pass(`${adapter.displayName} guidance in ${adapter.instructions.path}`);\n }\n if (adapter.sessionHook) {\n const hookStatus = hookState(adapter, mcp);\n if (hookStatus === \"present\") {\n pass(`${adapter.displayName} session-start hook in ${adapter.sessionHook.path}${id === \"codex\" ? \" (approve it once in Codex with /hooks)\" : \"\"}`);\n } else {\n warn(`${adapter.displayName} session-start hook is ${hookStatus}. Run: memstack connect ${id}`);\n }\n }\n }\n\n if (mcp) {\n const verification = await verifyServer(harnessLaunch(mcp, \"claude-code\"));\n if (verification.ok) pass(`MCP server starts and answers: ${verification.stats}`);\n else fail(`MCP server check failed: ${verification.error}`);\n }\n\n out();\n out(failures === 0 ? \"No problems found.\" : `${failures} problem${failures === 1 ? \"\" : \"s\"} found.`);\n return failures === 0 ? 0 : 1;\n}\n\n// ── memories ──\n\nasync function memories(args: string[], flags: HarnessFlags): Promise<number> {\n const { config } = await loadConfig();\n if (!config.storage) throw new Error(\"No storage configured. Run `memstack init`.\");\n const project = resolveProject();\n const namespaces = defaultRecallNamespaces(project.id);\n const memory = new HarnessMemory({ storage: config.storage, llm: config.llm, autoTags: false });\n\n try {\n await memory.adoptProjects(project.previousIds, project.id);\n if (flags.delete) {\n await memory.forget(flags.delete, namespaces);\n out(`Deleted ${flags.delete}.`);\n return 0;\n }\n const query = args.join(\" \").trim() || undefined;\n const { hits, fallback } = await memory.recall({\n namespaces: flags.global ? [\"global\"] : namespaces,\n query,\n limit: flags.limit ? Number(flags.limit) : 20,\n maxChars: 50_000,\n });\n out(`Project ${project.id} (${project.key})`);\n if (hits.length === 0) {\n out(\"No memories.\");\n return 0;\n }\n if (query && fallback) out(`Nothing matched \"${query}\". The most important memories instead:`);\n for (const { memory: m } of hits) {\n const source = (m.metadata?.source as { harness?: string } | undefined)?.harness;\n const scope = m.actorId === \"global\" ? \"global\" : \"project\";\n out(`${m.id} ${m.memoryType}, ${scope}${source ? `, from ${source}` : \"\"}, ${m.createdAt.toISOString().slice(0, 10)}`);\n out(` ${m.content}`);\n }\n return 0;\n } finally {\n await config.storage.close();\n }\n}\n\n// ── project ──\n\nasync function projectCommand(args: string[]): Promise<number> {\n const [sub, value] = args;\n if (sub === \"pin\") {\n if (!value) throw new Error(\"Name the project: memstack project pin <id>\");\n const before = resolveProject();\n const path = pinProject(value);\n out(`Pinned this repository to project \"${value}\" in ${path}. Commit it so every clone uses the same project.`);\n if (before.id !== value) {\n out(`Memories stored under the previous ID stay there. To move them: memstack project merge ${before.id}`);\n }\n return 0;\n }\n\n if (sub === \"merge\") {\n if (!value) throw new Error(\"Name the old project ID: memstack project merge <old-id>\");\n const oldId = value.replace(/^project:/, \"\");\n const project = resolveProject();\n const { config } = await loadConfig();\n if (!config.storage) throw new Error(\"No storage configured. Run `memstack init`.\");\n const memory = new HarnessMemory({ storage: config.storage, llm: config.llm, autoTags: false });\n try {\n const moved = await memory.moveNamespace(projectNamespace(oldId), projectNamespace(project.id));\n out(`Moved ${moved} ${moved === 1 ? \"memory\" : \"memories\"} from ${oldId} to ${project.id}.`);\n } finally {\n await config.storage.close();\n }\n return 0;\n }\n\n if (sub) throw new Error(`Unknown subcommand \"${sub}\". Use: memstack project [pin <id> | merge <old-id>]`);\n\n const project = resolveProject();\n out(`${label(\"Project\")}${project.id}`);\n out(`${label(\"From\")}${describeSource(project.source)}: ${project.key}`);\n out(`${label(\"Root\")}${project.root}`);\n return 0;\n}\n\nfunction describeSource(source: string): string {\n switch (source) {\n case \"pin\":\n return `pinned in ${PIN_FILE}`;\n case \"root-commit\":\n return \"first commit\";\n case \"remote\":\n return \"origin remote (shallow clone)\";\n case \"git\":\n return \"git directory (no commits yet)\";\n default:\n return \"directory\";\n }\n}\n\n// ── prompts ──\n\ninterface Prompter {\n ask(question: string, fallback: string): Promise<string>;\n choose(question: string, options: string[], fallback: string): Promise<string>;\n secret(question: string): Promise<string>;\n close(): void;\n}\n\nfunction createPrompter(): Prompter {\n const rl = createInterface({ input: process.stdin, output: process.stdout, terminal: true });\n let muted = false;\n const output = rl as unknown as { _writeToOutput: (text: string) => void; output: NodeJS.WriteStream };\n const write = output._writeToOutput.bind(rl);\n // Hide typed characters while a secret is entered.\n output._writeToOutput = (text: string) => {\n if (!muted || text.includes(\"\\n\") || text.includes(\"\\r\")) write(text);\n };\n\n return {\n async ask(question, fallback) {\n const answer = (await rl.question(`${question}${fallback ? ` [${fallback}]` : \"\"}: `)).trim();\n return answer || fallback;\n },\n async choose(question, options, fallback) {\n for (;;) {\n const answer = (await rl.question(`${question} (${options.join(\", \")}) [${fallback}]: `)).trim() || fallback;\n if (options.includes(answer)) return answer;\n out(`Choose one of: ${options.join(\", \")}`);\n }\n },\n async secret(question) {\n const pending = rl.question(`${question}: `);\n muted = true;\n try {\n return (await pending).trim();\n } finally {\n muted = false;\n out();\n }\n },\n close() {\n rl.close();\n },\n };\n}\n","// Per-command help, printed by `memstack <command> --help` and `memstack help <command>`.\n// Keep in step with packages/skills/memstack-cli/REFERENCE.md.\n\nconst ACTOR = ` --actor <id> Actor ID that groups related memories\n --project Use this repository's project instead of --actor, the same\n memories Claude Code and Codex see through \\`memstack connect\\``;\n\nconst MEMORY_ENV = `\nReads ~/.memstack/config.json (written by \\`memstack init\\`); environment variables\nsuch as OPENAI_API_KEY and MEMSTACK_STORAGE override it. Prints JSON.\n`;\n\nexport const COMMAND_HELP: Record<string, string> = {\n init: `memstack init [flags]\n\nChoose an LLM provider and a store, check the key with a real request, and write\n~/.memstack/config.json (readable only by you). Prompts for anything not given\nas a flag; with --yes or without a terminal it uses flags and existing values.\n\n --provider <name> openai-compatible (default) or anthropic\n --base-url <url> OpenAI-compatible endpoint, e.g. https://api.deepseek.com\n --model <name> Model override\n --api-key-env <VAR> Read the API key from this environment variable\n --store <type> Storage type (default: sqlite)\n --path <path> File or directory for sqlite, disk, or markdown\n --url <url> Connection URL for postgres, redis, or mongodb\n --yes Don't prompt\n`,\n\n connect: `memstack connect <claude-code|codex> [flags]\n\nRegister MemStack's MCP server with a harness, add a session-start hook that\nloads the project's memories, and for Codex add a marked block to\n~/.codex/AGENTS.md. Checks the server first and undoes every change if a step\nfails. Safe to run again.\n\n --dry-run Show what would change without changing it\n --no-hooks Skip the session-start hook\n --no-agents-md Skip the Codex AGENTS.md block\n`,\n\n disconnect: `memstack disconnect <claude-code|codex> [flags]\n\nRemove everything \\`memstack connect\\` added. Memories are kept.\n\n --dry-run Show what would change without changing it\n`,\n\n status: `memstack status\n\nShow where configuration comes from (config file or environment variables), the\nLLM and storage in use, this repository's project ID, and each harness's\nconnection, guidance, and session-start hook.\n`,\n\n doctor: `memstack doctor [flags]\n\nCheck the configuration, storage driver, MCP server, and harness connections,\nand print a fix for each problem. Exits non-zero when it finds any.\n\n --live Also send a test request to the LLM provider\n`,\n\n memories: `memstack memories [query] [flags]\n\nList this repository's memories (project and global), or search them.\n\n --global Only global memories\n --limit <n> Maximum to show (default: 20)\n --delete <id> Delete one memory\n`,\n\n project: `memstack project [pin <id> | merge <old-id>]\n\n memstack project Show this repository's project ID and where it comes from\n memstack project pin <id> Write .memstack.json so every clone uses <id>\n memstack project merge <old> Move memories stored under an old project ID to this one\n`,\n\n store: `memstack store --content <text> (--actor <id> | --project) [flags]\n\n${ACTOR}\n --content <text> Memory text (required)\n --type <type> interaction (default), summary, observation, fact, reflection,\n preference, decision, or instruction\n --importance <n> 0.0 to 1.0\n --tags <a,b> Comma-separated tags\n${MEMORY_ENV}`,\n\n retrieve: `memstack retrieve (--actor <id> | --project) [flags]\n\n${ACTOR}\n --query <text> Search text\n --strategy <name> recent (default), important, semantic, or hybrid\n --limit <n> Default: 10\n --tags <a,b> Only memories with these tags\n --created-after <iso> e.g. 2026-01-01T00:00:00Z\n --created-before <iso>\n${MEMORY_ENV}`,\n\n context: `memstack context (--actor <id> | --project) [flags]\n\nCompile memories into a token-budgeted system prompt.\n\n${ACTOR}\n --max-tokens <n> Token budget (default: 2000)\n${MEMORY_ENV}`,\n\n summarize: `memstack summarize (--actor <id> | --project) [flags]\n\nCompress old interactions into summaries.\n\n${ACTOR}\n --older-than <d> Only memories older than this, e.g. 7d, 24h, 30m\n${MEMORY_ENV}`,\n\n prune: `memstack prune (--actor <id> | --project) [flags]\n\n${ACTOR}\n --type <name> byAge (default), byImportance, or byCount\n --max-age <d> For byAge, e.g. 30d\n --min-importance <n> For byImportance\n --max-count <n> For byCount: keep the top n\n --dry-run Show what would be removed\n${MEMORY_ENV}`,\n\n purge: `memstack purge (--actor <id> | --project)\n\nDelete every memory for the actor.\n\n${ACTOR}\n${MEMORY_ENV}`,\n\n merge: `memstack merge --ids <id,id,...>\n\nMerge several memories into one.\n${MEMORY_ENV}`,\n\n stats: `memstack stats [--actor <id> | --project]\n\nMemory counts and diagnostics; all actors when neither flag is given.\n${MEMORY_ENV}`,\n\n delete: `memstack delete --id <id>\n${MEMORY_ENV}`,\n\n health: `memstack health\n\nCheck storage, LLM, and embedding connectivity.\n${MEMORY_ENV}`,\n\n export: `memstack export [--actor <id> | --project] [--out <file>]\n\nExport memories as a JSON snapshot; all actors when neither flag is given.\n${MEMORY_ENV}`,\n\n import: `memstack import (--actor <id> | --project) --file <file>\n\nImport memories from a JSON snapshot.\n\n${ACTOR}\n --file <file> Snapshot path (required)\n${MEMORY_ENV}`,\n};\n","#!/usr/bin/env node\nimport { parseArgs } from \"node:util\";\nimport { writeFile, readFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { MemStack, projectNamespace } from \"@memstack/core\";\nimport { resolveProject } from \"@memstack/config-env\";\nimport type { MemStackConfig, MemoryType, PruneStrategy } from \"@memstack/core\";\nimport { loadConfig } from \"./config.js\";\nimport { HARNESS_COMMANDS, runHarnessCommand } from \"./harness-commands.js\";\nimport { COMMAND_HELP } from \"./help.js\";\n\n// Exit quietly when the reader goes away, e.g. `memstack status | head -1`.\nprocess.stdout.on(\"error\", (error: NodeJS.ErrnoException) => {\n if (error.code === \"EPIPE\") process.exit(0);\n throw error;\n});\n\nasync function main() {\n const { positionals, values } = parseArgs({\n allowPositionals: true,\n options: {\n actor: { type: \"string\" },\n content: { type: \"string\" },\n type: { type: \"string\" },\n importance: { type: \"string\" },\n tags: { type: \"string\" },\n query: { type: \"string\" },\n strategy: { type: \"string\" },\n limit: { type: \"string\" },\n \"max-tokens\": { type: \"string\" },\n \"older-than\": { type: \"string\" },\n \"max-age\": { type: \"string\" },\n \"min-importance\": { type: \"string\" },\n \"max-count\": { type: \"string\" },\n ids: { type: \"string\" },\n id: { type: \"string\" },\n \"created-after\": { type: \"string\" },\n \"created-before\": { type: \"string\" },\n \"dry-run\": { type: \"boolean\" },\n out: { type: \"string\" },\n file: { type: \"string\" },\n provider: { type: \"string\" },\n \"base-url\": { type: \"string\" },\n model: { type: \"string\" },\n \"api-key-env\": { type: \"string\" },\n store: { type: \"string\" },\n path: { type: \"string\" },\n url: { type: \"string\" },\n yes: { type: \"boolean\" },\n live: { type: \"boolean\" },\n global: { type: \"boolean\" },\n delete: { type: \"string\" },\n \"no-agents-md\": { type: \"boolean\" },\n \"no-hooks\": { type: \"boolean\" },\n project: { type: \"boolean\" },\n help: { type: \"boolean\", short: \"h\" },\n version: { type: \"boolean\", short: \"v\" },\n },\n });\n\n if (values.version) {\n process.stdout.write(`${version()}\\n`);\n return;\n }\n\n const command = positionals[0];\n if (command === \"help\" || values.help) {\n const topic = command === \"help\" ? positionals[1] : command;\n if (topic && !COMMAND_HELP[topic]) fail(`Unknown command: ${topic}. Run memstack --help for the list.`);\n process.stdout.write(topic ? COMMAND_HELP[topic] : USAGE);\n return;\n }\n if (!command) {\n process.stderr.write(USAGE);\n process.exit(1);\n }\n\n if ((HARNESS_COMMANDS as readonly string[]).includes(command)) {\n process.exitCode = await runHarnessCommand(command, positionals.slice(1), values);\n return;\n }\n\n if (!COMMAND_HELP[command]) fail(`Unknown command: ${command}. Run memstack --help for the list.`);\n\n if (values.project) {\n if (values.actor) fail(\"Use either --actor or --project, not both\");\n values.actor = projectNamespace(resolveProject().id);\n }\n\n const config: MemStackConfig = await loadConfig();\n const ms = new MemStack(config);\n\n let result: unknown;\n switch (command) {\n case \"store\": {\n if (!values.actor) fail(\"--actor (or --project) is required\");\n if (!values.content) fail(\"--content is required\");\n const importance = values.importance ? Math.max(0, Math.min(1, Number(values.importance))) : undefined;\n result = await ms.memory.store({\n actorId: String(values.actor).trim(),\n content: String(values.content),\n memoryType: values.type as MemoryType | undefined,\n importance,\n tags: values.tags\n ? String(values.tags)\n .split(\",\")\n .map((t) => t.trim())\n .filter((t) => t.length > 0)\n : undefined,\n });\n break;\n }\n\n case \"retrieve\": {\n if (!values.actor) fail(\"--actor (or --project) is required\");\n result = await ms.memory.retrieve({\n actorId: values.actor as string | undefined,\n query: values.query as string | undefined,\n strategy: values.strategy as \"recent\" | \"important\" | \"semantic\" | \"hybrid\" | undefined,\n limit: values.limit ? Number(values.limit) : undefined,\n tags: values.tags ? String(values.tags).split(\",\") : undefined,\n createdAfter: values[\"created-after\"]\n ? new Date(String(values[\"created-after\"]))\n : undefined,\n createdBefore: values[\"created-before\"]\n ? new Date(String(values[\"created-before\"]))\n : undefined,\n });\n break;\n }\n\n case \"context\": {\n if (!values.actor) fail(\"--actor (or --project) is required\");\n result = await ms.memory.compileContext({\n actorId: String(values.actor),\n maxTokens: values[\"max-tokens\"] ? Number(values[\"max-tokens\"]) : undefined,\n });\n break;\n }\n\n case \"summarize\": {\n if (!values.actor) fail(\"--actor (or --project) is required\");\n const durationMs = values[\"older-than\"]\n ? parseDuration(String(values[\"older-than\"]))\n : undefined;\n const olderThan = durationMs ? new Date(Date.now() - durationMs) : undefined;\n result = await ms.memory.summarize({\n actorId: values.actor as string | undefined,\n olderThan,\n });\n break;\n }\n\n case \"prune\": {\n if (!values.actor) fail(\"--actor (or --project) is required\");\n const VALID_TYPES = [\"byAge\", \"byImportance\", \"byCount\", \"byType\", \"custom\", \"compose\"];\n const pruneType = values.type ?? \"byAge\";\n if (!VALID_TYPES.includes(String(pruneType))) {\n fail(`Invalid prune type: ${pruneType}. Valid: ${VALID_TYPES.join(\", \")}`);\n }\n const strategy: PruneStrategy = {\n type: pruneType as PruneStrategy[\"type\"],\n actorId: String(values.actor).trim(),\n maxAge: values[\"max-age\"]\n ? parseDuration(String(values[\"max-age\"]))\n : undefined,\n minImportance: values[\"min-importance\"]\n ? Number(values[\"min-importance\"])\n : undefined,\n maxPerActor: values[\"max-count\"]\n ? Number(values[\"max-count\"])\n : undefined,\n };\n\n if (values[\"dry-run\"]) {\n result = await ms.memory.dryRunPrune(strategy);\n } else {\n result = await ms.memory.prune(strategy);\n }\n break;\n }\n\n case \"purge\": {\n if (!values.actor) fail(\"--actor (or --project) is required\");\n result = await ms.memory.purgeActor(String(values.actor));\n break;\n }\n\n case \"merge\": {\n if (!values.ids) fail(\"--ids is required\");\n result = await ms.memory.merge(\n String(values.ids)\n .split(\",\")\n .map((s) => s.trim()),\n );\n break;\n }\n\n case \"stats\": {\n result = await ms.memory.stats(values.actor as string | undefined);\n break;\n }\n\n case \"delete\": {\n if (!values.id) fail(\"--id is required\");\n await ms.memory.delete(String(values.id));\n result = { deleted: true };\n break;\n }\n\n case \"health\": {\n result = await ms.health();\n break;\n }\n\n case \"export\": {\n const snapshot = await ms.export(values.actor as string | undefined);\n const outPath = values.out as string | undefined;\n if (outPath) {\n await writeFile(outPath, JSON.stringify(snapshot, null, 2), \"utf-8\");\n }\n result = outPath ? { saved: outPath, count: snapshot.memories.length } : snapshot;\n break;\n }\n\n case \"import\": {\n if (!values.actor) fail(\"--actor (or --project) is required\");\n if (!values.file) fail(\"--file is required\");\n const raw = await readFile(String(values.file), \"utf-8\");\n let snapshot = JSON.parse(raw);\n if (Array.isArray(snapshot)) {\n snapshot = { version: 1 as const, memories: snapshot, exportedAt: new Date().toISOString() };\n }\n if (!snapshot.memories || !Array.isArray(snapshot.memories) || snapshot.memories.length === 0) {\n fail(\"Snapshot contains no memories to import\");\n }\n await ms.import(snapshot);\n result = { imported: snapshot.memories.length };\n break;\n }\n\n default:\n fail(`Unknown command: ${command}. Run memstack --help for the list.`);\n }\n\n process.stdout.write(JSON.stringify(result, null, 2) + \"\\n\");\n await ms.close();\n}\n\nfunction parseDuration(input: string): number {\n const match = input.match(/^(\\d+)([smhd])$/);\n if (!match) {\n throw new Error(\n `Invalid duration: ${input}. Use format like \"7d\", \"24h\", \"30m\".`,\n );\n }\n const value = Number(match[1]);\n switch (match[2]) {\n case \"s\":\n return value * 1000;\n case \"m\":\n return value * 60 * 1000;\n case \"h\":\n return value * 3600 * 1000;\n case \"d\":\n return value * 86400 * 1000;\n default:\n return value;\n }\n}\n\nfunction version(): string {\n return (createRequire(import.meta.url)(\"../package.json\") as { version: string }).version;\n}\n\nconst USAGE = `memstack <command> [flags]\n\nAgent harnesses (Claude Code, Codex):\n init Choose an LLM provider and store; writes ~/.memstack/config.json\n connect Register MemStack with a harness: connect claude-code|codex [--dry-run]\n Adds a session-start hook that loads project memories (skip with --no-hooks)\n For Codex, also adds a marked block to ~/.codex/AGENTS.md (skip with --no-agents-md)\n disconnect Remove MemStack from a harness; memories are kept\n status Show configuration, project, and harness connections\n doctor Diagnose setup problems [--live to test the LLM key]\n memories List or search this project's memories [query] [--delete <id>]\n project Show this repository's project ID; project pin <id>; project merge <old-id>\n\nCommands:\n store Store a memory\n retrieve Retrieve memories\n context Compile LLM-ready context\n summarize Compress old interactions\n prune Remove stale memories\n purge Delete all memories for an actor\n merge Merge multiple memories\n stats Memory diagnostics\n delete Delete a single memory\n health Check connectivity\n export Export all memories\n import Import memories from a JSON snapshot\n\nRun memstack <command> --help for flags, or memstack --version.\n`;\n\nfunction fail(message: string): never {\n process.stderr.write(`Error: ${message}\\n`);\n process.exit(1);\n}\n\nmain().catch((err) => {\n process.stderr.write(\n `Error: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n process.exit(1);\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memstack/cli",
3
- "version": "0.7.3",
3
+ "version": "0.8.1",
4
4
  "description": "CLI for MemStack — shell-based agent memory",
5
5
  "type": "module",
6
6
  "main": "dist/cli.js",
@@ -29,14 +29,14 @@
29
29
  },
30
30
  "homepage": "https://github.com/isiomaC/memstack",
31
31
  "dependencies": {
32
- "@memstack/core": "0.7.3"
32
+ "@memstack/core": "0.8.1"
33
33
  },
34
34
  "devDependencies": {
35
35
  "tsup": "^8.0.0",
36
36
  "typescript": "^5.7.0",
37
37
  "vitest": "^1.0.0",
38
38
  "@types/node": "^22.0.0",
39
- "@memstack/config-env": "0.7.3"
39
+ "@memstack/config-env": "0.8.1"
40
40
  },
41
41
  "keywords": [
42
42
  "cli",