@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.
- package/README.md +73 -0
- package/claude-plugin/.claude-plugin/marketplace.json +14 -0
- package/claude-plugin/.claude-plugin/plugin.json +9 -0
- package/claude-plugin/.mcp.json +8 -0
- package/claude-plugin/README.md +24 -0
- package/claude-plugin/hooks/hooks.json +50 -0
- package/claude-plugin/skills/remember/SKILL.md +31 -0
- package/claude-plugin/skills/remember/scripts/remember.mjs +121 -0
- package/dist/.build-stamp.json +4 -4
- package/dist/commands/code-graph.d.ts +17 -0
- package/dist/commands/code-graph.js +64 -0
- package/dist/commands/code-graph.js.map +1 -0
- package/dist/commands/code.d.ts +13 -3
- package/dist/commands/code.js +191 -3
- package/dist/commands/code.js.map +1 -1
- package/dist/commands/memory-capture.d.ts +76 -0
- package/dist/commands/memory-capture.js +592 -0
- package/dist/commands/memory-capture.js.map +1 -0
- package/dist/commands/memory-hook.d.ts +1 -0
- package/dist/commands/memory-hook.js +35 -11
- package/dist/commands/memory-hook.js.map +1 -1
- package/dist/commands/memory-install.d.ts +17 -0
- package/dist/commands/memory-install.js +349 -0
- package/dist/commands/memory-install.js.map +1 -0
- package/dist/commands/memory-lessons.d.ts +8 -0
- package/dist/commands/memory-lessons.js +135 -0
- package/dist/commands/memory-lessons.js.map +1 -0
- package/dist/commands/memory.d.ts +1 -9
- package/dist/commands/memory.js +17 -85
- package/dist/commands/memory.js.map +1 -1
- package/dist/commands/orgChart.d.ts +3 -0
- package/dist/commands/orgChart.js +88 -0
- package/dist/commands/orgChart.js.map +1 -0
- package/dist/commands/tasks.js +45 -3
- package/dist/commands/tasks.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/redact.d.ts +16 -0
- package/dist/lib/redact.js +120 -0
- package/dist/lib/redact.js.map +1 -0
- package/memory-services.d.ts +9 -0
- package/memory-services.js +118 -0
- package/package.json +5 -1
- package/runtime-plugins/cline/opvs-memory.ts +99 -0
- 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
|
|
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
|
|
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
|
-
|
|
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
|
|
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("
|
|
146
|
+
.description("Agent runtime memory hooks")
|
|
123
147
|
.command("session-start")
|
|
124
|
-
.description("Print relevant memories for a
|
|
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":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,
|
|
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;
|