@opvs-ai/cli 0.22.0 → 0.24.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/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 +5 -5
- 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 +562 -0
- package/dist/commands/memory-capture.js.map +1 -0
- package/dist/commands/memory-hook.d.ts +21 -0
- package/dist/commands/memory-hook.js +138 -0
- package/dist/commands/memory-hook.js.map +1 -0
- 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 +24 -0
- package/dist/commands/memory.js +239 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/myMail.d.ts +3 -0
- package/dist/commands/myMail.js +119 -0
- package/dist/commands/myMail.js.map +1 -0
- 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 +8 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/redact.d.ts +16 -0
- package/dist/lib/redact.js +92 -0
- package/dist/lib/redact.js.map +1 -0
- package/package.json +3 -1
- package/runtime-plugins/cline/opvs-memory.ts +99 -0
- package/runtime-plugins/opencode/opvs-memory.ts +94 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code and Codex memory hooks.
|
|
3
|
+
*
|
|
4
|
+
* SessionStart is deliberately fail-open: a missing login, an unavailable
|
|
5
|
+
* gateway, malformed hook input, or an unexpected response must never stop a
|
|
6
|
+
* Claude Code session from opening.
|
|
7
|
+
*/
|
|
8
|
+
import { execFileSync } from "node:child_process";
|
|
9
|
+
import { readFileSync } from "node:fs";
|
|
10
|
+
import { relative, resolve } from "node:path";
|
|
11
|
+
import { createClient, getEffectiveConfig } from "@opvs-ai/core";
|
|
12
|
+
import { parseServicePatterns, serviceForPath } from "./memory.js";
|
|
13
|
+
export const MEMORY_CONTEXT_CHAR_BUDGET = 12_000;
|
|
14
|
+
const DEFAULT_DEPENDENCIES = {
|
|
15
|
+
getConfig: (workspace) => getEffectiveConfig(workspace),
|
|
16
|
+
makeClient: createClient,
|
|
17
|
+
readInput: async () => {
|
|
18
|
+
let input = "";
|
|
19
|
+
for await (const chunk of process.stdin)
|
|
20
|
+
input += String(chunk);
|
|
21
|
+
return input;
|
|
22
|
+
},
|
|
23
|
+
writeOutput: (text) => process.stdout.write(text),
|
|
24
|
+
repoRoot: (cwd) => execFileSync("git", ["rev-parse", "--show-toplevel"], {
|
|
25
|
+
cwd,
|
|
26
|
+
encoding: "utf8",
|
|
27
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
28
|
+
}).trim(),
|
|
29
|
+
readServices: (root) => readFileSync(resolve(root, "memory", "services.yaml"), "utf8"),
|
|
30
|
+
};
|
|
31
|
+
function entriesFrom(payload) {
|
|
32
|
+
if (Array.isArray(payload)) {
|
|
33
|
+
return payload.filter((item) => item !== null && typeof item === "object");
|
|
34
|
+
}
|
|
35
|
+
if (!payload || typeof payload !== "object")
|
|
36
|
+
return [];
|
|
37
|
+
const body = payload;
|
|
38
|
+
for (const key of ["items", "entries", "memories"]) {
|
|
39
|
+
const value = body[key];
|
|
40
|
+
if (Array.isArray(value)) {
|
|
41
|
+
return value.filter((item) => item !== null && typeof item === "object");
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
function pinned(entry) {
|
|
47
|
+
return entry.pinned === true || entry.is_pinned === true;
|
|
48
|
+
}
|
|
49
|
+
function entryBody(entry) {
|
|
50
|
+
for (const key of ["body", "content", "text", "core", "summary"]) {
|
|
51
|
+
if (typeof entry[key] === "string" && entry[key])
|
|
52
|
+
return entry[key];
|
|
53
|
+
}
|
|
54
|
+
return JSON.stringify(entry);
|
|
55
|
+
}
|
|
56
|
+
/** Render complete entries where possible, then hard-truncate at the budget. */
|
|
57
|
+
export function renderMemoryContext(entries, budget = MEMORY_CONTEXT_CHAR_BUDGET) {
|
|
58
|
+
if (!Number.isFinite(budget) || budget <= 0 || entries.length === 0)
|
|
59
|
+
return "";
|
|
60
|
+
const ordered = entries
|
|
61
|
+
.map((entry, index) => ({ entry, index }))
|
|
62
|
+
.sort((a, b) => Number(pinned(b.entry)) - Number(pinned(a.entry)) || a.index - b.index)
|
|
63
|
+
.map(({ entry }) => entry);
|
|
64
|
+
const sections = ordered.map((entry) => {
|
|
65
|
+
const id = [entry.type, entry.id ?? entry.path]
|
|
66
|
+
.filter((value) => typeof value === "string" && value)
|
|
67
|
+
.join(" · ");
|
|
68
|
+
const label = `${pinned(entry) ? "[pinned] " : ""}${id || "memory"}`;
|
|
69
|
+
return `## ${label}\n${entryBody(entry)}`;
|
|
70
|
+
});
|
|
71
|
+
const rendered = `# Relevant OPVS memories\n\n${sections.join("\n\n")}`;
|
|
72
|
+
if (rendered.length < budget)
|
|
73
|
+
return `${rendered}\n`;
|
|
74
|
+
if (rendered.length === budget)
|
|
75
|
+
return rendered;
|
|
76
|
+
if (budget === 1)
|
|
77
|
+
return "…";
|
|
78
|
+
return `${rendered.slice(0, budget - 1)}…`;
|
|
79
|
+
}
|
|
80
|
+
function searchParams(cwd, deps) {
|
|
81
|
+
const root = deps.repoRoot(cwd);
|
|
82
|
+
const rel = relative(root, cwd).replace(/\\/g, "/");
|
|
83
|
+
const params = new URLSearchParams({ pinned_first: "true" });
|
|
84
|
+
if (rel) {
|
|
85
|
+
const patterns = parseServicePatterns(deps.readServices(root));
|
|
86
|
+
const service = serviceForPath(`${rel.replace(/\/$/, "")}/`, patterns)
|
|
87
|
+
?? serviceForPath(rel, patterns);
|
|
88
|
+
if (service)
|
|
89
|
+
params.set("scope", `service:${service}`);
|
|
90
|
+
}
|
|
91
|
+
return params;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Run the SessionStart read path. All errors are intentionally swallowed so
|
|
95
|
+
* the command emits no bytes and resolves normally (CLI exit status 0).
|
|
96
|
+
*/
|
|
97
|
+
export async function runSessionStartHook(dependencies = {}, budget = MEMORY_CONTEXT_CHAR_BUDGET) {
|
|
98
|
+
const deps = { ...DEFAULT_DEPENDENCIES, ...dependencies };
|
|
99
|
+
try {
|
|
100
|
+
const parsed = JSON.parse(await deps.readInput());
|
|
101
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
102
|
+
return;
|
|
103
|
+
const input = parsed;
|
|
104
|
+
if (typeof input.cwd !== "string" || input.cwd.length === 0)
|
|
105
|
+
return;
|
|
106
|
+
// Both runtimes may provide a session/thread id. Reading it defensively
|
|
107
|
+
// here keeps unknown future fields harmless; SessionStart lookup only
|
|
108
|
+
// needs cwd today.
|
|
109
|
+
const sessionId = input.session_id ?? input.thread_id ?? input["thread-id"];
|
|
110
|
+
if (sessionId !== undefined && typeof sessionId !== "string")
|
|
111
|
+
return;
|
|
112
|
+
const params = searchParams(input.cwd, deps);
|
|
113
|
+
const workspace = process.env.OPVS_WORKSPACE;
|
|
114
|
+
const cfg = deps.getConfig(workspace);
|
|
115
|
+
if (!cfg.token)
|
|
116
|
+
return;
|
|
117
|
+
const response = await deps
|
|
118
|
+
.makeClient(workspace)
|
|
119
|
+
.get(`/api/v1/memory/entries/search?${params.toString()}`);
|
|
120
|
+
const output = renderMemoryContext(entriesFrom(await response.json()), budget);
|
|
121
|
+
if (output)
|
|
122
|
+
deps.writeOutput(output);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Session startup must remain available when memory is not.
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
export function registerMemoryHooks(memory) {
|
|
129
|
+
memory
|
|
130
|
+
.command("hook")
|
|
131
|
+
.description("Agent runtime memory hooks")
|
|
132
|
+
.command("session-start")
|
|
133
|
+
.description("Print relevant memories for a SessionStart hook")
|
|
134
|
+
.action(async () => {
|
|
135
|
+
await runSessionStartHook();
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=memory-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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;
|