@opvs-ai/cli 0.5.5 → 0.6.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.
@@ -0,0 +1,19 @@
1
+ /**
2
+ * ``opvs mail install-*`` and ``opvs mail daemon`` subcommands.
3
+ *
4
+ * Phase E + F of the OPVS Mail rollout — turns the CLI into a one-command
5
+ * onramp for Claude Code, Codex, Antigravity, and headless boxes:
6
+ *
7
+ * opvs mail install-slash-commands → drops slash commands at
8
+ * ~/.claude/commands/
9
+ * opvs mail install-hooks claude-code → writes Stop hook to
10
+ * ~/.claude/settings.json
11
+ * opvs mail install-hooks codex|antigravity → writes MCP server entry
12
+ * to ~/.codex/config.json
13
+ * or ~/.antigravity/...
14
+ * opvs mail daemon install/start/stop/status → systemd-user (Linux) or
15
+ * launchd (macOS) wrapper
16
+ * around ``mail watch``
17
+ */
18
+ import { Command } from "commander";
19
+ export declare function registerInstallCommands(mail: Command): void;
@@ -0,0 +1,253 @@
1
+ /**
2
+ * ``opvs mail install-*`` and ``opvs mail daemon`` subcommands.
3
+ *
4
+ * Phase E + F of the OPVS Mail rollout — turns the CLI into a one-command
5
+ * onramp for Claude Code, Codex, Antigravity, and headless boxes:
6
+ *
7
+ * opvs mail install-slash-commands → drops slash commands at
8
+ * ~/.claude/commands/
9
+ * opvs mail install-hooks claude-code → writes Stop hook to
10
+ * ~/.claude/settings.json
11
+ * opvs mail install-hooks codex|antigravity → writes MCP server entry
12
+ * to ~/.codex/config.json
13
+ * or ~/.antigravity/...
14
+ * opvs mail daemon install/start/stop/status → systemd-user (Linux) or
15
+ * launchd (macOS) wrapper
16
+ * around ``mail watch``
17
+ */
18
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync, } from "node:fs";
19
+ import { homedir, platform } from "node:os";
20
+ import { join, dirname } from "node:path";
21
+ import { spawnSync } from "node:child_process";
22
+ import { fileURLToPath } from "node:url";
23
+ // templates/ ships at ../../templates relative to compiled commands/ dir.
24
+ function getTemplatesRoot() {
25
+ // Resolve relative to this module; works for both src/ (dev) and dist/ (prod).
26
+ const here = dirname(fileURLToPath(import.meta.url));
27
+ // Compiled: dist/commands/install.js → ../../templates
28
+ // Dev: src/commands/install.ts → ../../templates
29
+ return join(here, "..", "..", "templates");
30
+ }
31
+ function readTemplate(rel) {
32
+ const p = join(getTemplatesRoot(), rel);
33
+ return readFileSync(p, "utf-8");
34
+ }
35
+ // ── slash commands ───────────────────────────────────────────────────────
36
+ const SLASH_COMMANDS = ["mail.md", "inbox.md", "thread.md", "reply.md", "awaiting.md", "ack.md"];
37
+ function installSlashCommands(target) {
38
+ const written = [];
39
+ const skipped = [];
40
+ if (!existsSync(target))
41
+ mkdirSync(target, { recursive: true });
42
+ const src = join(getTemplatesRoot(), "slash-commands");
43
+ for (const name of SLASH_COMMANDS) {
44
+ const from = join(src, name);
45
+ const to = join(target, name);
46
+ if (!existsSync(from))
47
+ continue;
48
+ if (existsSync(to)) {
49
+ skipped.push(to);
50
+ continue;
51
+ }
52
+ copyFileSync(from, to);
53
+ written.push(to);
54
+ }
55
+ return { written, skipped };
56
+ }
57
+ function installClaudeCodeHooks(target) {
58
+ const tmpl = JSON.parse(readTemplate("hooks/claude-code-stop.json"));
59
+ const wantedStop = tmpl.hooks?.Stop ?? [];
60
+ let existing = {};
61
+ const settingsExisted = existsSync(target);
62
+ if (settingsExisted) {
63
+ try {
64
+ existing = JSON.parse(readFileSync(target, "utf-8"));
65
+ }
66
+ catch {
67
+ existing = {};
68
+ }
69
+ }
70
+ existing.hooks = existing.hooks ?? {};
71
+ existing.hooks.Stop = existing.hooks.Stop ?? [];
72
+ // Merge — append our entries, dedupe by command string.
73
+ const haveCommands = new Set(existing.hooks.Stop.flatMap((entry) => entry.hooks.map((h) => h.command)));
74
+ let merged = false;
75
+ for (const entry of wantedStop) {
76
+ const fresh = entry.hooks.filter((h) => !haveCommands.has(h.command));
77
+ if (fresh.length === 0)
78
+ continue;
79
+ existing.hooks.Stop.push({ matcher: entry.matcher, hooks: fresh });
80
+ merged = true;
81
+ }
82
+ if (merged || !settingsExisted) {
83
+ if (!existsSync(dirname(target)))
84
+ mkdirSync(dirname(target), { recursive: true });
85
+ writeFileSync(target, JSON.stringify(existing, null, 2) + "\n");
86
+ }
87
+ return { merged, existing: settingsExisted };
88
+ }
89
+ function installMCPEntry(target, key = "opvs") {
90
+ let cfg = {};
91
+ const targetExisted = existsSync(target);
92
+ if (targetExisted) {
93
+ try {
94
+ cfg = JSON.parse(readFileSync(target, "utf-8"));
95
+ }
96
+ catch {
97
+ cfg = {};
98
+ }
99
+ }
100
+ cfg.mcpServers = cfg.mcpServers ?? {};
101
+ if (cfg.mcpServers[key])
102
+ return { merged: false };
103
+ cfg.mcpServers[key] = {
104
+ command: "npx",
105
+ args: ["-y", "@opvs-ai/mcp"],
106
+ };
107
+ if (!existsSync(dirname(target)))
108
+ mkdirSync(dirname(target), { recursive: true });
109
+ writeFileSync(target, JSON.stringify(cfg, null, 2) + "\n");
110
+ return { merged: true };
111
+ }
112
+ // ── daemon ──────────────────────────────────────────────────────────────
113
+ function getOpvsBin() {
114
+ // Resolve the real ``opvs`` binary path so the unit/plist is portable
115
+ // across user installs.
116
+ const which = spawnSync("which", ["opvs"], { encoding: "utf-8" });
117
+ if (which.status === 0 && which.stdout.trim())
118
+ return which.stdout.trim();
119
+ return "/usr/local/bin/opvs";
120
+ }
121
+ function renderTemplate(rel, vars) {
122
+ let out = readTemplate(rel);
123
+ for (const [k, v] of Object.entries(vars)) {
124
+ out = out.split(`__${k}__`).join(v);
125
+ }
126
+ return out;
127
+ }
128
+ function daemonInstall() {
129
+ const home = homedir();
130
+ const opvs = getOpvsBin();
131
+ if (platform() === "linux") {
132
+ const dir = join(home, ".config", "systemd", "user");
133
+ if (!existsSync(dir))
134
+ mkdirSync(dir, { recursive: true });
135
+ const target = join(dir, "opvs-mail.service");
136
+ writeFileSync(target, renderTemplate("systemd/opvs-mail.service", { OPVS_BIN: opvs, HOME: home }));
137
+ return target;
138
+ }
139
+ if (platform() === "darwin") {
140
+ const dir = join(home, "Library", "LaunchAgents");
141
+ if (!existsSync(dir))
142
+ mkdirSync(dir, { recursive: true });
143
+ const target = join(dir, "com.opvs.mail.plist");
144
+ writeFileSync(target, renderTemplate("launchd/com.opvs.mail.plist", { OPVS_BIN: opvs, HOME: home }));
145
+ return target;
146
+ }
147
+ throw new Error(`Unsupported platform: ${platform()} (only linux + darwin supported)`);
148
+ }
149
+ function daemonControl(verb) {
150
+ if (platform() === "linux") {
151
+ const cmd = verb === "uninstall"
152
+ ? ["disable", "--now", "opvs-mail.service"]
153
+ : verb === "status"
154
+ ? ["status", "--no-pager", "opvs-mail.service"]
155
+ : [verb, "opvs-mail.service"];
156
+ const r = spawnSync("systemctl", ["--user", ...cmd], { encoding: "utf-8" });
157
+ return { ok: r.status === 0, output: (r.stdout ?? "") + (r.stderr ?? "") };
158
+ }
159
+ if (platform() === "darwin") {
160
+ const target = join(homedir(), "Library", "LaunchAgents", "com.opvs.mail.plist");
161
+ if (verb === "start") {
162
+ const r = spawnSync("launchctl", ["load", target], { encoding: "utf-8" });
163
+ return { ok: r.status === 0, output: r.stderr ?? "" };
164
+ }
165
+ if (verb === "stop" || verb === "uninstall") {
166
+ const r = spawnSync("launchctl", ["unload", target], { encoding: "utf-8" });
167
+ return { ok: r.status === 0, output: r.stderr ?? "" };
168
+ }
169
+ if (verb === "status") {
170
+ const r = spawnSync("launchctl", ["list", "com.opvs.mail"], { encoding: "utf-8" });
171
+ return { ok: r.status === 0, output: (r.stdout ?? "") + (r.stderr ?? "") };
172
+ }
173
+ }
174
+ return { ok: false, output: `Unsupported platform: ${platform()}` };
175
+ }
176
+ // ── register ────────────────────────────────────────────────────────────
177
+ export function registerInstallCommands(mail) {
178
+ // ``opvs mail install-slash-commands [--target <dir>]``
179
+ mail
180
+ .command("install-slash-commands")
181
+ .description("Drop slash commands (mail / inbox / thread / reply / awaiting / ack) into a target dir")
182
+ .option("--target <dir>", "Where to write the .md files", join(homedir(), ".claude", "commands"))
183
+ .action((opts) => {
184
+ const result = installSlashCommands(opts.target);
185
+ console.log(JSON.stringify({
186
+ target: opts.target,
187
+ written: result.written,
188
+ skipped_existing: result.skipped,
189
+ }, null, 2));
190
+ });
191
+ // ``opvs mail install-hooks claude-code|codex|antigravity``
192
+ mail
193
+ .command("install-hooks <client>")
194
+ .description("Auto-config hooks (claude-code) or MCP entry (codex, antigravity)")
195
+ .option("--target <path>", "Override default settings file path")
196
+ .action((client, opts) => {
197
+ const home = homedir();
198
+ let target;
199
+ let result;
200
+ switch (client) {
201
+ case "claude-code": {
202
+ target = opts.target ?? join(home, ".claude", "settings.json");
203
+ const { merged, existing } = installClaudeCodeHooks(target);
204
+ result = { client, target, merged, settings_existed: existing };
205
+ break;
206
+ }
207
+ case "codex": {
208
+ target = opts.target ?? join(home, ".codex", "config.json");
209
+ const { merged } = installMCPEntry(target);
210
+ result = { client, target, merged };
211
+ break;
212
+ }
213
+ case "antigravity": {
214
+ target = opts.target ?? join(home, ".antigravity", "mcp.json");
215
+ const { merged } = installMCPEntry(target);
216
+ result = { client, target, merged };
217
+ break;
218
+ }
219
+ default:
220
+ console.error(`Unsupported client: ${client}. Supported: claude-code, codex, antigravity`);
221
+ process.exit(1);
222
+ return;
223
+ }
224
+ console.log(JSON.stringify(result, null, 2));
225
+ });
226
+ // ``opvs mail daemon <verb>``
227
+ const daemon = mail.command("daemon").description("systemd-user (Linux) / launchd (macOS) wrapper around ``mail watch``");
228
+ daemon
229
+ .command("install")
230
+ .description("Write the unit/plist file to the user's autostart directory")
231
+ .action(() => {
232
+ try {
233
+ const target = daemonInstall();
234
+ console.log(JSON.stringify({ installed: target }, null, 2));
235
+ }
236
+ catch (e) {
237
+ console.error(`Error: ${e.message}`);
238
+ process.exit(1);
239
+ }
240
+ });
241
+ for (const verb of ["start", "stop", "status", "uninstall"]) {
242
+ daemon
243
+ .command(verb)
244
+ .description(`${verb[0].toUpperCase() + verb.slice(1)} the OPVS mail daemon`)
245
+ .action(() => {
246
+ const result = daemonControl(verb);
247
+ console.log(result.output || (result.ok ? "ok" : "failed"));
248
+ if (!result.ok && verb !== "status")
249
+ process.exit(1);
250
+ });
251
+ }
252
+ }
253
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * opvs mail — OPVS Protocol messaging commands.
3
+ *
4
+ * Two layers:
5
+ * 1. Server-facing commands (send, reply, resolve, claim, pair, …) —
6
+ * hit the gateway and mirror the result to the local store.
7
+ * 2. Local-mirror commands (sync, watch, thread, list, search, unread,
8
+ * status, ack, working, decline, flag, draft, awaiting, tickle,
9
+ * sub, compact, log) — read/write the IMAP-style store at
10
+ * ``~/.opvs/mail/`` shipped by ``@opvs-ai/core``'s mailstore.
11
+ *
12
+ * Per the IMAP-mail plan (`/root/.claude/plans/read-root-opvs-...`):
13
+ * - No auto-seen — recipient must explicitly ``mail ack``.
14
+ * - SLA fields are advisory, never server-enforced.
15
+ * - Plus-addressing (``+suffix``) is first-class.
16
+ */
17
+ import { Command } from "commander";
18
+ export declare function registerMailCommands(program: Command): void;