@opvs-ai/cli 0.23.0 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +73 -0
  2. package/claude-plugin/.claude-plugin/marketplace.json +14 -0
  3. package/claude-plugin/.claude-plugin/plugin.json +9 -0
  4. package/claude-plugin/.mcp.json +8 -0
  5. package/claude-plugin/README.md +24 -0
  6. package/claude-plugin/hooks/hooks.json +50 -0
  7. package/claude-plugin/skills/remember/SKILL.md +31 -0
  8. package/claude-plugin/skills/remember/scripts/remember.mjs +121 -0
  9. package/dist/.build-stamp.json +4 -4
  10. package/dist/commands/code-graph.d.ts +17 -0
  11. package/dist/commands/code-graph.js +64 -0
  12. package/dist/commands/code-graph.js.map +1 -0
  13. package/dist/commands/code.d.ts +13 -3
  14. package/dist/commands/code.js +191 -3
  15. package/dist/commands/code.js.map +1 -1
  16. package/dist/commands/memory-capture.d.ts +76 -0
  17. package/dist/commands/memory-capture.js +592 -0
  18. package/dist/commands/memory-capture.js.map +1 -0
  19. package/dist/commands/memory-hook.d.ts +1 -0
  20. package/dist/commands/memory-hook.js +35 -11
  21. package/dist/commands/memory-hook.js.map +1 -1
  22. package/dist/commands/memory-install.d.ts +17 -0
  23. package/dist/commands/memory-install.js +349 -0
  24. package/dist/commands/memory-install.js.map +1 -0
  25. package/dist/commands/memory-lessons.d.ts +8 -0
  26. package/dist/commands/memory-lessons.js +135 -0
  27. package/dist/commands/memory-lessons.js.map +1 -0
  28. package/dist/commands/memory.d.ts +1 -9
  29. package/dist/commands/memory.js +17 -85
  30. package/dist/commands/memory.js.map +1 -1
  31. package/dist/commands/orgChart.d.ts +3 -0
  32. package/dist/commands/orgChart.js +88 -0
  33. package/dist/commands/orgChart.js.map +1 -0
  34. package/dist/commands/tasks.js +45 -3
  35. package/dist/commands/tasks.js.map +1 -1
  36. package/dist/index.js +4 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/lib/redact.d.ts +16 -0
  39. package/dist/lib/redact.js +120 -0
  40. package/dist/lib/redact.js.map +1 -0
  41. package/memory-services.d.ts +9 -0
  42. package/memory-services.js +118 -0
  43. package/package.json +5 -1
  44. package/runtime-plugins/cline/opvs-memory.ts +99 -0
  45. package/runtime-plugins/opencode/opvs-memory.ts +94 -0
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Claude Code memory hooks.
2
+ * Claude Code and Codex memory hooks.
3
3
  *
4
4
  * SessionStart is deliberately fail-open: a missing login, an unavailable
5
5
  * gateway, malformed hook input, or an unexpected response must never stop a
@@ -9,7 +9,7 @@ import { execFileSync } from "node:child_process";
9
9
  import { readFileSync } from "node:fs";
10
10
  import { relative, resolve } from "node:path";
11
11
  import { createClient, getEffectiveConfig } from "@opvs-ai/core";
12
- import { parseServicePatterns, serviceForPath } from "./memory.js";
12
+ import { OPVS_MEMORY_REPOSITORY, parseServicePatterns, repositoryNameFromRemote, serviceForPath, } from "./memory.js";
13
13
  export const MEMORY_CONTEXT_CHAR_BUDGET = 12_000;
14
14
  const DEFAULT_DEPENDENCIES = {
15
15
  getConfig: (workspace) => getEffectiveConfig(workspace),
@@ -26,6 +26,11 @@ const DEFAULT_DEPENDENCIES = {
26
26
  encoding: "utf8",
27
27
  stdio: ["ignore", "pipe", "ignore"],
28
28
  }).trim(),
29
+ repoName: (root) => repositoryNameFromRemote(execFileSync("git", ["remote", "get-url", "origin"], {
30
+ cwd: root,
31
+ encoding: "utf8",
32
+ stdio: ["ignore", "pipe", "ignore"],
33
+ })),
29
34
  readServices: (root) => readFileSync(resolve(root, "memory", "services.yaml"), "utf8"),
30
35
  };
31
36
  function entriesFrom(payload) {
@@ -77,18 +82,24 @@ export function renderMemoryContext(entries, budget = MEMORY_CONTEXT_CHAR_BUDGET
77
82
  return "…";
78
83
  return `${rendered.slice(0, budget - 1)}…`;
79
84
  }
80
- function searchParams(cwd, deps) {
85
+ function searchContext(cwd, deps) {
81
86
  const root = deps.repoRoot(cwd);
87
+ const repo = deps.repoName(root)?.toLowerCase();
88
+ if (repo !== OPVS_MEMORY_REPOSITORY)
89
+ return undefined;
90
+ // Read from the resolved root even when cwd itself is the root. Besides
91
+ // keeping root/subdirectory behavior aligned, this proves this checkout has
92
+ // the registry that owns the memories before any request leaves the process.
93
+ const patterns = parseServicePatterns(deps.readServices(root));
82
94
  const rel = relative(root, cwd).replace(/\\/g, "/");
83
95
  const params = new URLSearchParams({ pinned_first: "true" });
84
96
  if (rel) {
85
- const patterns = parseServicePatterns(deps.readServices(root));
86
97
  const service = serviceForPath(`${rel.replace(/\/$/, "")}/`, patterns)
87
98
  ?? serviceForPath(rel, patterns);
88
99
  if (service)
89
100
  params.set("scope", `service:${service}`);
90
101
  }
91
- return params;
102
+ return { params, repo };
92
103
  }
93
104
  /**
94
105
  * Run the SessionStart read path. All errors are intentionally swallowed so
@@ -97,18 +108,31 @@ function searchParams(cwd, deps) {
97
108
  export async function runSessionStartHook(dependencies = {}, budget = MEMORY_CONTEXT_CHAR_BUDGET) {
98
109
  const deps = { ...DEFAULT_DEPENDENCIES, ...dependencies };
99
110
  try {
100
- const input = JSON.parse(await deps.readInput());
111
+ const parsed = JSON.parse(await deps.readInput());
112
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
113
+ return;
114
+ const input = parsed;
101
115
  if (typeof input.cwd !== "string" || input.cwd.length === 0)
102
116
  return;
103
- const params = searchParams(input.cwd, deps);
117
+ // Both runtimes may provide a session/thread id. Reading it defensively
118
+ // here keeps unknown future fields harmless; SessionStart lookup only
119
+ // needs cwd today.
120
+ const sessionId = input.session_id ?? input.thread_id ?? input["thread-id"];
121
+ if (sessionId !== undefined && typeof sessionId !== "string")
122
+ return;
123
+ const context = searchContext(input.cwd, deps);
124
+ if (!context)
125
+ return;
104
126
  const workspace = process.env.OPVS_WORKSPACE;
105
127
  const cfg = deps.getConfig(workspace);
106
128
  if (!cfg.token)
107
129
  return;
108
130
  const response = await deps
109
131
  .makeClient(workspace)
110
- .get(`/api/v1/memory/entries/search?${params.toString()}`);
111
- const output = renderMemoryContext(entriesFrom(await response.json()), budget);
132
+ .get(`/api/v1/memory/entries/search?${context.params.toString()}`);
133
+ const matchingEntries = entriesFrom(await response.json()).filter((entry) => typeof entry.repo === "string"
134
+ && repositoryNameFromRemote(entry.repo) === context.repo);
135
+ const output = renderMemoryContext(matchingEntries, budget);
112
136
  if (output)
113
137
  deps.writeOutput(output);
114
138
  }
@@ -119,9 +143,9 @@ export async function runSessionStartHook(dependencies = {}, budget = MEMORY_CON
119
143
  export function registerMemoryHooks(memory) {
120
144
  memory
121
145
  .command("hook")
122
- .description("Claude Code memory hooks")
146
+ .description("Agent runtime memory hooks")
123
147
  .command("session-start")
124
- .description("Print relevant memories for a Claude Code SessionStart hook")
148
+ .description("Print relevant memories for a SessionStart hook")
125
149
  .action(async () => {
126
150
  await runSessionStartHook();
127
151
  });
@@ -1 +1 @@
1
- {"version":3,"file":"memory-hook.js","sourceRoot":"","sources":["../../src/commands/memory-hook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory-hook.js","sourceRoot":"","sources":["../../src/commands/memory-hook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /** Merge-safe installers for AgentMemory runtime hooks. */
2
+ import { Command } from "commander";
3
+ export type MemoryRuntime = "claude-code" | "cline" | "codex" | "cursor" | "opencode";
4
+ interface InstallOptions {
5
+ project?: boolean;
6
+ cwd?: string;
7
+ home?: string;
8
+ }
9
+ export interface HookFileResult {
10
+ changed: boolean;
11
+ path: string;
12
+ relatedPaths?: string[];
13
+ }
14
+ export declare function installMemoryHooks(runtime: MemoryRuntime, options?: InstallOptions): HookFileResult;
15
+ export declare function uninstallMemoryHooks(runtime: MemoryRuntime, options?: InstallOptions): HookFileResult;
16
+ export declare function registerMemoryInstallCommands(memory: Command): void;
17
+ export {};
@@ -0,0 +1,349 @@
1
+ /** Merge-safe installers for AgentMemory runtime hooks. */
2
+ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync, } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { dirname, join, resolve } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ const MANAGED_PLUGIN_MARKER = "OPVS_MEMORY_PLUGIN_MANAGED";
7
+ const CURSOR_MCP_SERVER = {
8
+ command: "opvs-mcp",
9
+ env: { NODE_NO_WARNINGS: "1" },
10
+ };
11
+ const CURSOR_HOOKS = {
12
+ version: 1,
13
+ hooks: {
14
+ postToolUse: [{ command: "opvs memory hook post-tool", timeout: 10 }],
15
+ stop: [{ command: "opvs memory hook stop", timeout: 10 }],
16
+ sessionEnd: [{ command: "opvs memory hook session-end", timeout: 10 }],
17
+ },
18
+ };
19
+ function object(value) {
20
+ return value !== null && typeof value === "object" && !Array.isArray(value)
21
+ ? value
22
+ : null;
23
+ }
24
+ function claudePluginHooksPath() {
25
+ const here = dirname(fileURLToPath(import.meta.url));
26
+ return join(here, "..", "..", "claude-plugin", "hooks", "hooks.json");
27
+ }
28
+ function readPluginTemplate() {
29
+ const parsed = JSON.parse(readFileSync(claudePluginHooksPath(), "utf8"));
30
+ const template = object(parsed);
31
+ if (!template)
32
+ throw new Error("Claude Code plugin hooks.json must contain an object");
33
+ return template;
34
+ }
35
+ /** Codex uses the plugin's SessionStart commands; Claude Code uses the whole file. */
36
+ function templateFor(runtime) {
37
+ if (runtime === "cursor")
38
+ return CURSOR_HOOKS;
39
+ if (runtime === "cline" || runtime === "opencode") {
40
+ throw new Error(`${runtime} uses a managed plugin template`);
41
+ }
42
+ const template = readPluginTemplate();
43
+ if (runtime === "claude-code")
44
+ return template;
45
+ const hooks = object(template.hooks);
46
+ if (!hooks || !Array.isArray(hooks.SessionStart)) {
47
+ throw new Error("Claude Code plugin hooks.json has no SessionStart hooks");
48
+ }
49
+ const sessionStart = hooks.SessionStart.map((rawGroup) => {
50
+ const group = object(rawGroup);
51
+ if (!group)
52
+ return rawGroup;
53
+ return Object.fromEntries(Object.entries(group).filter(([key]) => key !== "matcher"));
54
+ });
55
+ return { hooks: { SessionStart: sessionStart } };
56
+ }
57
+ function targetPath(runtime, options) {
58
+ const cwd = resolve(options.cwd ?? process.cwd());
59
+ const home = options.home ?? homedir();
60
+ if (options.project) {
61
+ if (runtime === "codex")
62
+ return join(cwd, ".codex", "hooks.json");
63
+ if (runtime === "cursor")
64
+ return join(cwd, ".cursor", "hooks.json");
65
+ if (runtime === "claude-code")
66
+ return join(cwd, ".claude", "settings.json");
67
+ return join(cwd, runtime === "opencode" ? ".opencode" : ".cline", "plugins", "opvs-memory.ts");
68
+ }
69
+ if (runtime === "codex") {
70
+ return join(process.env.CODEX_HOME || join(home, ".codex"), "hooks.json");
71
+ }
72
+ if (runtime === "claude-code") {
73
+ return join(process.env.CLAUDE_CONFIG_DIR || join(home, ".claude"), "settings.json");
74
+ }
75
+ if (runtime === "cursor")
76
+ return join(home, ".cursor", "hooks.json");
77
+ if (runtime === "opencode")
78
+ return join(home, ".config", "opencode", "plugins", "opvs-memory.ts");
79
+ return join(home, ".cline", "plugins", "opvs-memory.ts");
80
+ }
81
+ function isPluginRuntime(runtime) {
82
+ return runtime === "opencode" || runtime === "cline";
83
+ }
84
+ function pluginTemplatePath(runtime) {
85
+ const here = dirname(fileURLToPath(import.meta.url));
86
+ return join(here, "..", "..", "runtime-plugins", runtime, "opvs-memory.ts");
87
+ }
88
+ function pluginTemplate(runtime) {
89
+ const template = readFileSync(pluginTemplatePath(runtime), "utf8");
90
+ if (!template.includes(MANAGED_PLUGIN_MARKER)) {
91
+ throw new Error(`${runtime} memory plugin template has no managed marker`);
92
+ }
93
+ return template;
94
+ }
95
+ function isManagedPlugin(contents) {
96
+ return contents.includes(MANAGED_PLUGIN_MARKER);
97
+ }
98
+ function cursorMcpPath(options) {
99
+ const root = options.project ? resolve(options.cwd ?? process.cwd()) : options.home ?? homedir();
100
+ return join(root, ".cursor", "mcp.json");
101
+ }
102
+ function readTarget(path) {
103
+ if (!existsSync(path))
104
+ return {};
105
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
106
+ const config = object(parsed);
107
+ if (!config)
108
+ throw new Error(`${path} must contain a JSON object`);
109
+ return config;
110
+ }
111
+ function commandsInGroup(group) {
112
+ const entry = object(group);
113
+ const directCommand = entry?.command;
114
+ if (typeof directCommand === "string")
115
+ return [directCommand];
116
+ const hooks = entry?.hooks;
117
+ if (!Array.isArray(hooks))
118
+ return [];
119
+ return hooks.flatMap((hook) => {
120
+ const command = object(hook)?.command;
121
+ return typeof command === "string" ? [command] : [];
122
+ });
123
+ }
124
+ function templateCommands(template) {
125
+ const commands = new Set();
126
+ const hooks = object(template.hooks);
127
+ if (!hooks)
128
+ return commands;
129
+ for (const groups of Object.values(hooks)) {
130
+ if (!Array.isArray(groups))
131
+ continue;
132
+ for (const group of groups) {
133
+ for (const command of commandsInGroup(group))
134
+ commands.add(command);
135
+ }
136
+ }
137
+ return commands;
138
+ }
139
+ function mergeTemplate(config, template) {
140
+ const sourceHooks = object(template.hooks);
141
+ if (!sourceHooks)
142
+ throw new Error("hook template has no hooks object");
143
+ let targetHooks = object(config.hooks);
144
+ if (!targetHooks) {
145
+ if (config.hooks !== undefined)
146
+ throw new Error("config field 'hooks' must be an object");
147
+ targetHooks = {};
148
+ config.hooks = targetHooks;
149
+ }
150
+ let changed = false;
151
+ for (const [event, sourceGroups] of Object.entries(sourceHooks)) {
152
+ if (!Array.isArray(sourceGroups))
153
+ continue;
154
+ const current = targetHooks[event];
155
+ if (current !== undefined && !Array.isArray(current)) {
156
+ throw new Error(`config field 'hooks.${event}' must be an array`);
157
+ }
158
+ const targetGroups = current ?? [];
159
+ const installed = new Set(targetGroups.flatMap(commandsInGroup));
160
+ for (const sourceGroup of sourceGroups) {
161
+ const commands = commandsInGroup(sourceGroup);
162
+ if (commands.length > 0 && commands.every((command) => installed.has(command)))
163
+ continue;
164
+ targetGroups.push(sourceGroup);
165
+ for (const command of commands)
166
+ installed.add(command);
167
+ changed = true;
168
+ }
169
+ if (current === undefined && targetGroups.length > 0)
170
+ targetHooks[event] = targetGroups;
171
+ }
172
+ return changed;
173
+ }
174
+ function mergeCursorVersion(config) {
175
+ if (config.version === undefined) {
176
+ config.version = 1;
177
+ return true;
178
+ }
179
+ if (config.version !== 1)
180
+ throw new Error("Cursor hooks config field 'version' must be 1");
181
+ return false;
182
+ }
183
+ function mergeCursorMcp(config) {
184
+ let servers = object(config.mcpServers);
185
+ if (!servers) {
186
+ if (config.mcpServers !== undefined) {
187
+ throw new Error("Cursor MCP config field 'mcpServers' must be an object");
188
+ }
189
+ servers = {};
190
+ config.mcpServers = servers;
191
+ }
192
+ if (JSON.stringify(servers.opvs) === JSON.stringify(CURSOR_MCP_SERVER))
193
+ return false;
194
+ servers.opvs = CURSOR_MCP_SERVER;
195
+ return true;
196
+ }
197
+ function removeCursorMcp(config) {
198
+ const servers = object(config.mcpServers);
199
+ if (!servers || JSON.stringify(servers.opvs) !== JSON.stringify(CURSOR_MCP_SERVER))
200
+ return false;
201
+ delete servers.opvs;
202
+ return true;
203
+ }
204
+ function removeTemplate(config, template) {
205
+ const owned = templateCommands(template);
206
+ const hooks = object(config.hooks);
207
+ if (!hooks || owned.size === 0)
208
+ return false;
209
+ let changed = false;
210
+ for (const [event, value] of Object.entries(hooks)) {
211
+ if (!Array.isArray(value))
212
+ continue;
213
+ const groups = [];
214
+ for (const rawGroup of value) {
215
+ const group = object(rawGroup);
216
+ const directCommand = group?.command;
217
+ if (typeof directCommand === "string" && owned.has(directCommand)) {
218
+ changed = true;
219
+ continue;
220
+ }
221
+ if (!group || !Array.isArray(group.hooks)) {
222
+ groups.push(rawGroup);
223
+ continue;
224
+ }
225
+ const kept = group.hooks.filter((rawHook) => {
226
+ const command = object(rawHook)?.command;
227
+ const remove = typeof command === "string" && owned.has(command);
228
+ if (remove)
229
+ changed = true;
230
+ return !remove;
231
+ });
232
+ if (kept.length > 0)
233
+ groups.push(kept.length === group.hooks.length ? rawGroup : { ...group, hooks: kept });
234
+ }
235
+ if (groups.length > 0)
236
+ hooks[event] = groups;
237
+ else if (value.length > 0)
238
+ delete hooks[event];
239
+ }
240
+ return changed;
241
+ }
242
+ function writeTarget(path, config) {
243
+ mkdirSync(dirname(path), { recursive: true });
244
+ writeFileSync(path, `${JSON.stringify(config, null, 2)}\n`);
245
+ }
246
+ export function installMemoryHooks(runtime, options = {}) {
247
+ const path = targetPath(runtime, options);
248
+ if (isPluginRuntime(runtime)) {
249
+ const template = pluginTemplate(runtime);
250
+ if (existsSync(path)) {
251
+ const current = readFileSync(path, "utf8");
252
+ if (current === template)
253
+ return { changed: false, path };
254
+ if (!isManagedPlugin(current)) {
255
+ throw new Error(`refusing to overwrite unmanaged plugin at ${path}`);
256
+ }
257
+ }
258
+ mkdirSync(dirname(path), { recursive: true });
259
+ writeFileSync(path, template);
260
+ return { changed: true, path };
261
+ }
262
+ if (runtime === "cursor") {
263
+ const mcpPath = cursorMcpPath(options);
264
+ const hooksConfig = readTarget(path);
265
+ const mcpConfig = readTarget(mcpPath);
266
+ const versionChanged = mergeCursorVersion(hooksConfig);
267
+ const templateChanged = mergeTemplate(hooksConfig, templateFor(runtime));
268
+ const hooksChanged = versionChanged || templateChanged;
269
+ const mcpChanged = mergeCursorMcp(mcpConfig);
270
+ if (hooksChanged)
271
+ writeTarget(path, hooksConfig);
272
+ if (mcpChanged)
273
+ writeTarget(mcpPath, mcpConfig);
274
+ return { changed: hooksChanged || mcpChanged, path, relatedPaths: [mcpPath] };
275
+ }
276
+ const config = readTarget(path);
277
+ const changed = mergeTemplate(config, templateFor(runtime));
278
+ if (changed)
279
+ writeTarget(path, config);
280
+ return { changed, path };
281
+ }
282
+ export function uninstallMemoryHooks(runtime, options = {}) {
283
+ const path = targetPath(runtime, options);
284
+ if (runtime === "cursor") {
285
+ const mcpPath = cursorMcpPath(options);
286
+ const hooksConfig = existsSync(path) ? readTarget(path) : null;
287
+ const mcpConfig = existsSync(mcpPath) ? readTarget(mcpPath) : null;
288
+ const hooksChanged = hooksConfig ? removeTemplate(hooksConfig, templateFor(runtime)) : false;
289
+ const mcpChanged = mcpConfig ? removeCursorMcp(mcpConfig) : false;
290
+ if (hooksChanged && hooksConfig)
291
+ writeTarget(path, hooksConfig);
292
+ if (mcpChanged && mcpConfig)
293
+ writeTarget(mcpPath, mcpConfig);
294
+ return { changed: hooksChanged || mcpChanged, path, relatedPaths: [mcpPath] };
295
+ }
296
+ if (!existsSync(path))
297
+ return { changed: false, path };
298
+ if (isPluginRuntime(runtime)) {
299
+ if (!isManagedPlugin(readFileSync(path, "utf8")))
300
+ return { changed: false, path };
301
+ rmSync(path);
302
+ return { changed: true, path };
303
+ }
304
+ const config = readTarget(path);
305
+ const changed = removeTemplate(config, templateFor(runtime));
306
+ if (changed)
307
+ writeTarget(path, config);
308
+ return { changed, path };
309
+ }
310
+ function runtime(value) {
311
+ if (value === "codex" || value === "claude-code" || value === "cursor" ||
312
+ value === "opencode" || value === "cline")
313
+ return value;
314
+ throw new Error(`unsupported memory runtime '${value}' (expected codex, claude-code, cursor, opencode, or cline)`);
315
+ }
316
+ function report(verb, result) {
317
+ const action = verb === "install" ? "installed in" : "removed from";
318
+ const paths = [result.path, ...(result.relatedPaths ?? [])].join(", ");
319
+ console.log(result.changed ? `Memory integration ${action} ${paths}` : `Memory integration already unchanged at ${paths}`);
320
+ }
321
+ export function registerMemoryInstallCommands(memory) {
322
+ memory
323
+ .command("install <runtime>")
324
+ .description("Install memory integration for codex, claude-code, cursor, opencode, or cline")
325
+ .option("--project", "Install hooks in the current project instead of the user config")
326
+ .action((value, opts) => {
327
+ try {
328
+ report("install", installMemoryHooks(runtime(value), opts));
329
+ }
330
+ catch (error) {
331
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
332
+ process.exitCode = 1;
333
+ }
334
+ });
335
+ memory
336
+ .command("uninstall <runtime>")
337
+ .description("Remove only OPVS memory integration for codex, claude-code, cursor, opencode, or cline")
338
+ .option("--project", "Remove hooks from the current project's config")
339
+ .action((value, opts) => {
340
+ try {
341
+ report("uninstall", uninstallMemoryHooks(runtime(value), opts));
342
+ }
343
+ catch (error) {
344
+ console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
345
+ process.exitCode = 1;
346
+ }
347
+ });
348
+ }
349
+ //# sourceMappingURL=memory-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-install.js","sourceRoot":"","sources":["../../src/commands/memory-install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Command } from "commander";
2
+ export declare function parseSkillRef(ref: string): {
3
+ vendor: string;
4
+ name: string;
5
+ } | null;
6
+ /** sha256("cli:" + workspace_slug + ":" + body) — never a brand id (AS-590). */
7
+ export declare function lessonProvenanceHash(workspace: string | undefined, body: string): string;
8
+ export declare function registerLessonCommands(memory: Command): void;