@burmese/cli 3.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 OpenPets
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=check-cli-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-cli-contract.d.ts","sourceRoot":"","sources":["../src/check-cli-contract.ts"],"names":[],"mappings":""}
@@ -0,0 +1,367 @@
1
+ import assert from "node:assert/strict";
2
+ import { spawnSync } from "node:child_process";
3
+ import { chmodSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { realpathSync } from "node:fs";
6
+ import { tmpdir } from "node:os";
7
+ import { assertSafeProjectCodexConfigPath, assertSafeProjectHookPath, cliPackageName, configureProject, createClaudeMcpAddJsonArgs, createLocalDevCliCommand, createVersionPinnedCliCommand, installProjectLocalHooks, parseConfigureArgs, parseDoctorArgs, parseInstallArgs, parsePluginNewArgs, parseReactArgs, parseSayArgs, resolveConfiguredPet, runClaudeMcpAddJson, runDoctor, scaffoldPlugin } from "./index.js";
8
+ import { pluginTemplateNames } from "./plugin-templates.js";
9
+ import { validatePluginFolder } from "./plugin-validate.js";
10
+ const packageVersion = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8")).version;
11
+ const parsed = parseConfigureArgs(["--agent", "claude", "--pet", "fixer", "--cwd", "/tmp/project", "--yes"]);
12
+ assert.equal(parsed.agent, "claude");
13
+ assert.equal(parsed.petId, "fixer");
14
+ assert.equal(parsed.cwd, "/tmp/project");
15
+ assert.equal(parsed.yes, true);
16
+ assert.equal(parseConfigureArgs(["--pet", "fixer", "--force"]).force, true);
17
+ assert.equal(parseConfigureArgs(["--pet", "fixer", "--replace"]).force, true);
18
+ assert.equal(parseConfigureArgs(["--pet", "fixer", "--local-dev"]).localDev, true);
19
+ assert.equal(parseConfigureArgs(["--pet=fixer"]).petId, "fixer");
20
+ assert.equal(parseConfigureArgs(["--agent", "opencode", "--pet", "fixer"]).agent, "opencode");
21
+ assert.equal(parseConfigureArgs(["--agent", "cursor", "--pet", "fixer"]).agent, "cursor");
22
+ assert.equal(parseConfigureArgs(["--agent", "codex", "--pet", "fixer"]).agent, "codex");
23
+ assert.equal(parseConfigureArgs(["--agent", "cursor", "--pet", "fixer"]).cwd, process.cwd());
24
+ assert.equal(parseConfigureArgs(["--agent", "cursor", "--rules-only"]).cursorRulesMode, "only");
25
+ assert.equal(parseConfigureArgs(["--agent", "cursor", "--remove-rules"]).cursorRulesMode, "remove");
26
+ assert.equal(parseConfigureArgs(["--agent", "cursor", "--with-rules"]).cursorRulesMode, "with");
27
+ assert.throws(() => parseConfigureArgs(["--agent", "cursor", "--with-rules", "--rules-only"]));
28
+ assert.throws(() => parseConfigureArgs(["--agent", "claude", "--rules-only"]));
29
+ assert.throws(() => parseConfigureArgs(["--pet", "bad/pet"]));
30
+ assert.deepEqual(parseInstallArgs(["pixel-cat"]), { petId: "pixel-cat" });
31
+ assert.throws(() => parseInstallArgs([]));
32
+ assert.throws(() => parseInstallArgs(["bad/pet"]));
33
+ assert.deepEqual(parseReactArgs(["success"]), { reaction: "success" });
34
+ assert.throws(() => parseReactArgs([]));
35
+ assert.throws(() => parseReactArgs(["bad"]));
36
+ assert.deepEqual(parseSayArgs(["Build", "finished"]), { message: "Build finished", reaction: undefined });
37
+ assert.deepEqual(parseSayArgs(["Build finished", "--reaction", "celebrating"]), { message: "Build finished", reaction: "celebrating" });
38
+ assert.deepEqual(parseSayArgs(["--reaction=success", "Tests", "passed"]), { message: "Tests passed", reaction: "success" });
39
+ assert.throws(() => parseSayArgs([]));
40
+ assert.throws(() => parseSayArgs(["Hello", "--reaction", "bad"]));
41
+ assert.throws(() => parseSayArgs(["Hello", "--unknown"]));
42
+ assert.deepEqual(parseDoctorArgs([]), { cwd: process.cwd(), json: false });
43
+ assert.equal(parseDoctorArgs(["--json"]).json, true);
44
+ assert.equal(parseDoctorArgs(["--cwd", "/tmp/project"]).cwd, "/tmp/project");
45
+ assert.equal(parseDoctorArgs(["--cwd=/tmp/project"]).cwd, "/tmp/project");
46
+ assert.deepEqual(parseDoctorArgs(["--cwd=/tmp/project", "--json"]), { cwd: "/tmp/project", json: true });
47
+ assert.throws(() => parseDoctorArgs(["--unknown"]));
48
+ assert.throws(() => parseDoctorArgs(["--cwd"]));
49
+ assert.deepEqual(parsePluginNewArgs(["My Plugin"]), { name: "My Plugin", id: "local.my-plugin", dir: "my-plugin", author: undefined, template: "blank" });
50
+ assert.equal(parsePluginNewArgs(["My Plugin", "--id", "acme.my-plugin"]).id, "acme.my-plugin");
51
+ assert.equal(parsePluginNewArgs(["My Plugin", "--dir", "/tmp/p"]).dir, "/tmp/p");
52
+ assert.equal(parsePluginNewArgs(["My Plugin", "--author=Jane"]).author, "Jane");
53
+ assert.equal(parsePluginNewArgs(["My Plugin", "--template", "tamagotchi"]).template, "tamagotchi");
54
+ assert.throws(() => parsePluginNewArgs([]));
55
+ assert.throws(() => parsePluginNewArgs(["x", "--id", ".bad"]));
56
+ assert.throws(() => parsePluginNewArgs(["x", "--unknown"]));
57
+ assert.throws(() => parsePluginNewArgs(["x", "--template", "nope"]));
58
+ assert.throws(() => parsePluginNewArgs(["!!!"]));
59
+ const pluginScaffoldDir = mkdtempSync(join(tmpdir(), "openpets-plugin-"));
60
+ try {
61
+ const target = join(pluginScaffoldDir, "demo");
62
+ const result = scaffoldPlugin({ name: "Demo Plugin", id: "local.demo", dir: target, template: "blank" });
63
+ assert.equal(result.manifestPath, join(target, "openpets.plugin.json"));
64
+ const manifest = JSON.parse(readFileSync(result.manifestPath, "utf8"));
65
+ assert.equal(manifest.manifestVersion, 3);
66
+ assert.equal(manifest.id, "local.demo");
67
+ assert.equal(manifest.entry, "index.js");
68
+ assert.ok(manifest.sdkVersion.startsWith("3."));
69
+ assert.ok(manifest.permissions.includes("commands"));
70
+ const entry = readFileSync(result.entryPath, "utf8");
71
+ assert.match(entry, /OpenPetsPlugin\.register/);
72
+ assert.match(entry, /reference types="@burmese\/plugin-sdk"/);
73
+ assert.ok(existsSync(join(target, "README.md")));
74
+ assert.ok(existsSync(join(target, "test.js")));
75
+ assert.equal(validatePluginFolder(target).ok, true, JSON.stringify(validatePluginFolder(target).issues));
76
+ assert.throws(() => scaffoldPlugin({ name: "Demo Plugin", id: "local.demo", dir: target, template: "blank" }));
77
+ // Every template scaffolds to a folder that passes author-time validation.
78
+ for (const template of pluginTemplateNames) {
79
+ const templateTarget = join(pluginScaffoldDir, `tpl-${template}`);
80
+ scaffoldPlugin({ name: `Demo ${template}`, id: `local.demo-${template}`, dir: templateTarget, template });
81
+ const validation = validatePluginFolder(templateTarget);
82
+ assert.equal(validation.ok, true, `${template}: ${JSON.stringify(validation.issues)}`);
83
+ }
84
+ // The validator catches missing referenced files.
85
+ rmSync(join(target, "index.js"));
86
+ assert.equal(validatePluginFolder(target).ok, false);
87
+ }
88
+ finally {
89
+ rmSync(pluginScaffoldDir, { recursive: true, force: true });
90
+ }
91
+ const pinned = createVersionPinnedCliCommand("1.2.3", ["mcp", "--pet", "fixer"]);
92
+ assert.deepEqual(pinned, { command: "npx", args: ["-y", `${cliPackageName}@1.2.3`, "mcp", "--pet", "fixer"] });
93
+ const localDev = createLocalDevCliCommand(["mcp", "--pet", "fixer"]);
94
+ assert.equal(localDev.command, process.execPath);
95
+ assert.deepEqual(localDev.args.slice(-3), ["mcp", "--pet", "fixer"]);
96
+ let listPetsCalled = false;
97
+ const offlineExplicitPet = await resolveConfiguredPet({
98
+ listPets: async () => {
99
+ listPetsCalled = true;
100
+ throw new Error("desktop unavailable");
101
+ },
102
+ }, "fixer");
103
+ assert.deepEqual(offlineExplicitPet, { id: "fixer", displayName: "fixer" });
104
+ assert.equal(listPetsCalled, false);
105
+ const mcpArgs = createClaudeMcpAddJsonArgs({ type: "stdio", command: pinned.command, args: pinned.args, env: {} });
106
+ assert.deepEqual(mcpArgs.slice(0, 3), ["mcp", "add-json", "openpets"]);
107
+ assert.equal(mcpArgs.at(-2), "--scope");
108
+ assert.equal(mcpArgs.at(-1), "local");
109
+ const mcpJson = JSON.parse(mcpArgs[3] ?? "{}");
110
+ assert.equal(mcpJson.command, "npx");
111
+ assert.deepEqual(mcpJson.args, ["-y", `${cliPackageName}@1.2.3`, "mcp", "--pet", "fixer"]);
112
+ const dir = mkdtempSync(join(tmpdir(), "openpets-cli-"));
113
+ try {
114
+ const project = join(dir, "project");
115
+ const settingsDir = join(project, ".claude");
116
+ mkdirSync(project);
117
+ writeFileSync(join(dir, "placeholder"), "x", "utf8");
118
+ assert.throws(() => assertSafeProjectHookPath(join(dir, "missing")));
119
+ installProjectLocalHooks(project, "npx -y @burmese/cli@1.2.3 hook --openpets-managed --project-local --pet fixer");
120
+ const settingsPath = join(settingsDir, "settings.local.json");
121
+ const settings = JSON.parse(readFileSync(settingsPath, "utf8"));
122
+ assert.ok(settings.hooks?.UserPromptSubmit?.[0]?.hooks[0]?.command.includes("--project-local --pet fixer"));
123
+ writeFileSync(settingsPath, JSON.stringify({ hooks: { Stop: [{ hooks: [{ type: "command", command: "echo keep" }] }, { hooks: [{ type: "command", command: "npx -y @burmese/cli@old hook --openpets-managed" }] }] } }), "utf8");
124
+ installProjectLocalHooks(project, "npx -y @burmese/cli@1.2.3 hook --openpets-managed --project-local --pet fixer");
125
+ const updated = JSON.parse(readFileSync(settingsPath, "utf8"));
126
+ const stopCommands = updated.hooks?.Stop?.flatMap((entry) => entry.hooks.map((hook) => hook.command)) ?? [];
127
+ assert.ok(stopCommands.includes("echo keep"));
128
+ assert.equal(stopCommands.some((command) => command.includes("@old")), false);
129
+ assert.ok(stopCommands.some((command) => command.includes("--project-local --pet fixer")));
130
+ assert.equal(updated.hooks?.UserPromptSubmit?.[0]?.hooks[0]?.timeout, 10);
131
+ const badSettingsProject = join(dir, "bad-settings-project");
132
+ mkdirSync(join(badSettingsProject, ".claude"), { recursive: true });
133
+ mkdirSync(join(badSettingsProject, ".claude", "settings.local.json"));
134
+ assert.throws(() => assertSafeProjectHookPath(badSettingsProject));
135
+ const malformedHooksProject = join(dir, "malformed-hooks-project");
136
+ mkdirSync(join(malformedHooksProject, ".claude"), { recursive: true });
137
+ writeFileSync(join(malformedHooksProject, ".claude", "settings.local.json"), JSON.stringify({ hooks: { Stop: { bad: true } } }), "utf8");
138
+ assert.throws(() => installProjectLocalHooks(malformedHooksProject, "npx -y @burmese/cli@1.2.3 hook --openpets-managed --project-local --pet fixer"));
139
+ const symlinkProject = join(dir, "symlink-project");
140
+ const outside = join(dir, "outside-claude");
141
+ mkdirSync(symlinkProject);
142
+ mkdirSync(outside);
143
+ symlinkSync(outside, join(symlinkProject, ".claude"));
144
+ assert.throws(() => assertSafeProjectHookPath(symlinkProject));
145
+ const binDir = join(dir, "bin");
146
+ const logPath = join(dir, "claude-log.json");
147
+ mkdirSync(binDir);
148
+ const fakeClaude = join(binDir, "claude");
149
+ writeFileSync(fakeClaude, `#!/usr/bin/env node\nconst fs = require('fs'); let log = []; try { log = JSON.parse(fs.readFileSync(${JSON.stringify(logPath)}, 'utf8')); } catch {} log.push({ cwd: process.cwd(), argv: process.argv.slice(2) }); fs.writeFileSync(${JSON.stringify(logPath)}, JSON.stringify(log)); process.exit(0);\n`, "utf8");
150
+ chmodSync(fakeClaude, 0o700);
151
+ const oldPath = process.env.PATH;
152
+ process.env.PATH = `${binDir}:${oldPath ?? ""}`;
153
+ try {
154
+ runClaudeMcpAddJson(project, { type: "stdio", command: "npx", args: ["-y", "@burmese/cli@1.2.3", "mcp", "--pet", "fixer"], env: {} }, true);
155
+ }
156
+ finally {
157
+ process.env.PATH = oldPath;
158
+ }
159
+ const claudeLog = JSON.parse(readFileSync(logPath, "utf8"));
160
+ assert.equal(claudeLog.at(-1)?.cwd, realpathSync(project));
161
+ assert.deepEqual(claudeLog.at(-2)?.argv, ["mcp", "remove", "openpets", "--scope", "local"]);
162
+ assert.deepEqual(claudeLog.at(-1)?.argv.slice(0, 3), ["mcp", "add-json", "openpets"]);
163
+ const loggedMcpJson = JSON.parse(claudeLog.at(-1)?.argv[3] ?? "{}");
164
+ assert.equal(loggedMcpJson.command, "npx");
165
+ assert.deepEqual(loggedMcpJson.args, ["-y", "@burmese/cli@1.2.3", "mcp", "--pet", "fixer"]);
166
+ assert.deepEqual(loggedMcpJson.env, {});
167
+ assert.equal(claudeLog.at(-1)?.argv.at(-2), "--scope");
168
+ assert.equal(claudeLog.at(-1)?.argv.at(-1), "local");
169
+ const cliBinLink = join(binDir, "openpets");
170
+ symlinkSync(new URL("./index.js", import.meta.url).pathname, cliBinLink);
171
+ const symlinkedHelp = spawnSync(process.execPath, [cliBinLink, "--help"], { encoding: "utf8" });
172
+ assert.equal(symlinkedHelp.status, 0);
173
+ assert.match(symlinkedHelp.stdout, /Usage:/);
174
+ const opencodeProject = join(dir, "opencode-project");
175
+ mkdirSync(opencodeProject);
176
+ await configureProject({ agent: "opencode", petId: "fixer", cwd: opencodeProject, yes: true, force: false, localDev: false });
177
+ const opencodeConfigPath = join(opencodeProject, ".opencode", "opencode.jsonc");
178
+ const opencodeInstructionPath = join(opencodeProject, ".opencode", "openpets.md");
179
+ const opencodeConfig = JSON.parse(readFileSync(opencodeConfigPath, "utf8"));
180
+ assert.deepEqual(opencodeConfig.mcp?.openpets?.command, ["npx", "-y", `@burmese/cli@${packageVersion}`, "mcp", "--pet", "fixer"]);
181
+ assert.deepEqual(opencodeConfig.instructions, [".opencode/openpets.md"]);
182
+ assert.deepEqual(opencodeConfig.plugin, [[`@burmese/opencode@${packageVersion}`, { pet: "fixer" }]]);
183
+ assert.match(readFileSync(opencodeInstructionPath, "utf8"), /OPENPETS:START/);
184
+ await configureProject({ agent: "opencode", petId: "fixer", cwd: opencodeProject, yes: true, force: false, localDev: false });
185
+ const opencodeConfigAgain = readFileSync(opencodeConfigPath, "utf8");
186
+ assert.equal((opencodeConfigAgain.match(/@burmese\/opencode/g) ?? []).length, 1);
187
+ const existingTopLevel = join(dir, "opencode-existing-top");
188
+ mkdirSync(existingTopLevel);
189
+ writeFileSync(join(existingTopLevel, "opencode.json"), JSON.stringify({ theme: "x", mcp: { other: { type: "local", command: ["other"] } }, plugin: ["other-plugin"], instructions: ["README.md"] }, null, 2), "utf8");
190
+ await configureProject({ agent: "opencode", petId: "fixer", cwd: existingTopLevel, yes: true, force: false, localDev: true });
191
+ const existingConfig = JSON.parse(readFileSync(join(existingTopLevel, "opencode.json"), "utf8"));
192
+ assert.equal(existingConfig.theme, "x");
193
+ assert.deepEqual(existingConfig.mcp?.other?.command, ["other"]);
194
+ assert.equal(existingConfig.mcp?.openpets?.command?.[0], "node");
195
+ assert.ok(existingConfig.instructions?.includes("README.md"));
196
+ assert.ok(existingConfig.instructions?.includes(".opencode/openpets.md"));
197
+ assert.ok(existingConfig.plugin?.includes("other-plugin"));
198
+ const lowerOwnerProject = join(dir, "opencode-lower-owner");
199
+ mkdirSync(join(lowerOwnerProject, ".opencode"), { recursive: true });
200
+ writeFileSync(join(lowerOwnerProject, "opencode.json"), JSON.stringify({ theme: "top" }, null, 2), "utf8");
201
+ writeFileSync(join(lowerOwnerProject, ".opencode", "opencode.jsonc"), JSON.stringify({ mcp: { openpets: { type: "local", command: ["npx", "-y", "@burmese/cli@0.0.1", "mcp", "--pet", "helper"], enabled: true } } }, null, 2), "utf8");
202
+ await configureProject({ agent: "opencode", petId: "fixer", cwd: lowerOwnerProject, yes: true, force: false, localDev: false });
203
+ const lowerTop = readFileSync(join(lowerOwnerProject, "opencode.json"), "utf8");
204
+ const lowerOwned = JSON.parse(readFileSync(join(lowerOwnerProject, ".opencode", "opencode.jsonc"), "utf8"));
205
+ assert.equal(lowerTop.includes("@burmese/cli"), false);
206
+ assert.deepEqual(lowerOwned.mcp?.openpets?.command, ["npx", "-y", `@burmese/cli@${packageVersion}`, "mcp", "--pet", "fixer"]);
207
+ const customProject = join(dir, "opencode-custom");
208
+ mkdirSync(customProject);
209
+ writeFileSync(join(customProject, "opencode.json"), JSON.stringify({ mcp: { openpets: { type: "local", command: ["my-openpets-wrapper"] } } }), "utf8");
210
+ await assert.rejects(() => configureProject({ agent: "opencode", petId: "fixer", cwd: customProject, yes: true, force: false, localDev: false }));
211
+ assert.equal(readFileSync(join(customProject, "opencode.json"), "utf8").includes("@burmese/cli"), false);
212
+ const instructionProject = join(dir, "opencode-instruction");
213
+ mkdirSync(join(instructionProject, ".opencode"), { recursive: true });
214
+ writeFileSync(join(instructionProject, ".opencode", "openpets.md"), "User text\n", "utf8");
215
+ await configureProject({ agent: "opencode", petId: "fixer", cwd: instructionProject, yes: true, force: false, localDev: false });
216
+ const instructionText = readFileSync(join(instructionProject, ".opencode", "openpets.md"), "utf8");
217
+ assert.match(instructionText, /User text/);
218
+ assert.match(instructionText, /OPENPETS:START/);
219
+ const symlinkOpenCodeProject = join(dir, "opencode-symlink");
220
+ const outsideOpenCode = join(dir, "outside-opencode");
221
+ mkdirSync(symlinkOpenCodeProject);
222
+ mkdirSync(outsideOpenCode);
223
+ writeFileSync(join(outsideOpenCode, "opencode.jsonc"), "{}\n", "utf8");
224
+ writeFileSync(join(outsideOpenCode, "openpets.md"), "outside\n", "utf8");
225
+ symlinkSync(outsideOpenCode, join(symlinkOpenCodeProject, ".opencode"));
226
+ await assert.rejects(() => configureProject({ agent: "opencode", petId: "fixer", cwd: symlinkOpenCodeProject, yes: true, force: false, localDev: false }));
227
+ const codexProject = join(dir, "codex-project");
228
+ mkdirSync(codexProject);
229
+ await configureProject({ agent: "codex", petId: "fixer", cwd: codexProject, yes: true, force: false, localDev: false });
230
+ const codexConfigPath = join(codexProject, ".codex", "config.toml");
231
+ const codexConfig = readFileSync(codexConfigPath, "utf8");
232
+ assert.match(codexConfig, /\[mcp_servers\.openpets\]/);
233
+ assert.match(codexConfig, new RegExp(`@burmese/cli@${packageVersion}`));
234
+ assert.match(codexConfig, /--hook-event UserPromptSubmit/);
235
+ assert.match(codexConfig, /--hook-event PreToolUse/);
236
+ assert.match(codexConfig, /--client-label Codex/);
237
+ assert.match(codexConfig, /--project-local/);
238
+ await configureProject({ agent: "codex", petId: "fixer", cwd: codexProject, yes: true, force: false, localDev: false });
239
+ const codexConfigAgain = readFileSync(codexConfigPath, "utf8");
240
+ assert.equal((codexConfigAgain.match(/\[mcp_servers\.openpets\]/g) ?? []).length, 1);
241
+ const codexCustomProject = join(dir, "codex-custom");
242
+ mkdirSync(join(codexCustomProject, ".codex"), { recursive: true });
243
+ writeFileSync(join(codexCustomProject, ".codex", "config.toml"), "[mcp_servers.openpets]\ncommand = \"custom\"\n", "utf8");
244
+ await assert.rejects(() => configureProject({ agent: "codex", petId: "fixer", cwd: codexCustomProject, yes: true, force: false, localDev: false }));
245
+ await configureProject({ agent: "codex", petId: "fixer", cwd: codexCustomProject, yes: true, force: true, localDev: false });
246
+ const codexReplacedConfig = readFileSync(join(codexCustomProject, ".codex", "config.toml"), "utf8");
247
+ assert.equal((codexReplacedConfig.match(/\[mcp_servers\.openpets\]/g) ?? []).length, 1);
248
+ assert.doesNotMatch(codexReplacedConfig, /command = "custom"/);
249
+ const badCodexProject = join(dir, "bad-codex-project");
250
+ mkdirSync(join(badCodexProject, ".codex"), { recursive: true });
251
+ mkdirSync(join(badCodexProject, ".codex", "config.toml"));
252
+ assert.throws(() => assertSafeProjectCodexConfigPath(badCodexProject));
253
+ const cursorProject = join(dir, "cursor-project");
254
+ mkdirSync(cursorProject);
255
+ await configureProject({ agent: "cursor", petId: "fixer", cwd: cursorProject, yes: true, force: false, localDev: false });
256
+ const cursorConfigPath = join(cursorProject, ".cursor", "mcp.json");
257
+ const cursorConfig = JSON.parse(readFileSync(cursorConfigPath, "utf8"));
258
+ assert.equal(cursorConfig.mcpServers?.openpets?.command, "npx");
259
+ assert.deepEqual(cursorConfig.mcpServers?.openpets?.args, ["-y", `@burmese/mcp@${packageVersion}`, "--pet", "fixer"]);
260
+ assert.equal(readFileSync(cursorConfigPath, "utf8").includes("@burmese/cli"), false);
261
+ const cursorExistingProject = join(dir, "cursor-existing");
262
+ mkdirSync(join(cursorExistingProject, ".cursor"), { recursive: true });
263
+ writeFileSync(join(cursorExistingProject, ".cursor", "mcp.json"), JSON.stringify({ mcpServers: { other: { type: "stdio", command: "other", args: ["--token=hidden"], env: { SECRET: "hidden" } } }, topLevel: "keep" }, null, 2), "utf8");
264
+ const originalStdoutWrite = process.stdout.write;
265
+ let cursorOutput = "";
266
+ process.stdout.write = ((chunk) => { cursorOutput += String(chunk); return true; });
267
+ try {
268
+ await configureProject({ agent: "cursor", petId: "helper", cwd: cursorExistingProject, yes: true, force: false, localDev: false });
269
+ }
270
+ finally {
271
+ process.stdout.write = originalStdoutWrite;
272
+ }
273
+ assert.equal(cursorOutput.includes("hidden"), false);
274
+ const cursorExistingConfig = JSON.parse(readFileSync(join(cursorExistingProject, ".cursor", "mcp.json"), "utf8"));
275
+ assert.deepEqual(cursorExistingConfig.mcpServers?.other?.args, ["--token=hidden"]);
276
+ assert.deepEqual(cursorExistingConfig.mcpServers?.other?.env, { SECRET: "hidden" });
277
+ assert.equal(cursorExistingConfig.topLevel, "keep");
278
+ assert.deepEqual(cursorExistingConfig.mcpServers?.openpets?.args, ["-y", `@burmese/mcp@${packageVersion}`, "--pet", "helper"]);
279
+ const cursorConflictProject = join(dir, "cursor-conflict");
280
+ mkdirSync(join(cursorConflictProject, ".cursor"), { recursive: true });
281
+ writeFileSync(join(cursorConflictProject, ".cursor", "mcp.json"), JSON.stringify({ mcpServers: { openpets: { type: "stdio", command: "custom", args: [] }, other: { type: "stdio", command: "other", args: [] } } }, null, 2), "utf8");
282
+ await assert.rejects(() => configureProject({ agent: "cursor", petId: "fixer", cwd: cursorConflictProject, yes: true, force: false, localDev: false }));
283
+ await configureProject({ agent: "cursor", petId: "fixer", cwd: cursorConflictProject, yes: true, force: true, localDev: false });
284
+ const cursorReplaced = JSON.parse(readFileSync(join(cursorConflictProject, ".cursor", "mcp.json"), "utf8"));
285
+ assert.equal(cursorReplaced.mcpServers?.other?.command, "other");
286
+ assert.deepEqual(cursorReplaced.mcpServers?.openpets?.args, ["-y", `@burmese/mcp@${packageVersion}`, "--pet", "fixer"]);
287
+ const cursorRulesOnlyProject = join(dir, "cursor-rules-only");
288
+ mkdirSync(cursorRulesOnlyProject);
289
+ await configureProject({ agent: "cursor", cwd: cursorRulesOnlyProject, yes: true, force: false, localDev: false, cursorRulesMode: "only" });
290
+ const cursorRulesPath = join(cursorRulesOnlyProject, ".cursor", "rules", "openpets.mdc");
291
+ const cursorRulesContent = readFileSync(cursorRulesPath, "utf8");
292
+ assert.match(cursorRulesContent, /OPENPETS:CURSOR_RULES:START/);
293
+ assert.match(cursorRulesContent, /burmese_say/);
294
+ assert.doesNotMatch(cursorRulesContent, /alwaysApply:\s*true/);
295
+ assert.equal(existsSync(join(cursorRulesOnlyProject, ".cursor", "mcp.json")), false);
296
+ await configureProject({ agent: "cursor", cwd: cursorRulesOnlyProject, yes: true, force: false, localDev: false, cursorRulesMode: "remove" });
297
+ assert.equal(existsSync(cursorRulesPath), false);
298
+ assert.equal(existsSync(join(cursorRulesOnlyProject, ".cursor", "rules")), true);
299
+ const cursorWithRulesConflictProject = join(dir, "cursor-with-rules-conflict");
300
+ mkdirSync(join(cursorWithRulesConflictProject, ".cursor", "rules"), { recursive: true });
301
+ writeFileSync(join(cursorWithRulesConflictProject, ".cursor", "rules", "openpets.mdc"), "User rule SECRET=hidden\n", "utf8");
302
+ await assert.rejects(() => configureProject({ agent: "cursor", petId: "fixer", cwd: cursorWithRulesConflictProject, yes: true, force: false, localDev: false, cursorRulesMode: "with" }));
303
+ assert.equal(existsSync(join(cursorWithRulesConflictProject, ".cursor", "mcp.json")), false);
304
+ assert.equal(readFileSync(join(cursorWithRulesConflictProject, ".cursor", "rules", "openpets.mdc"), "utf8"), "User rule SECRET=hidden\n");
305
+ let cursorWithRulesOutput = "";
306
+ process.stdout.write = ((chunk) => { cursorWithRulesOutput += String(chunk); return true; });
307
+ try {
308
+ await configureProject({ agent: "cursor", petId: "fixer", cwd: cursorWithRulesConflictProject, yes: true, force: true, localDev: false, cursorRulesMode: "with" });
309
+ }
310
+ finally {
311
+ process.stdout.write = originalStdoutWrite;
312
+ }
313
+ assert.match(cursorWithRulesOutput, /Rules backup:/);
314
+ assert.equal(cursorWithRulesOutput.includes("hidden"), false);
315
+ const cursorWithRulesConfig = JSON.parse(readFileSync(join(cursorWithRulesConflictProject, ".cursor", "mcp.json"), "utf8"));
316
+ assert.deepEqual(cursorWithRulesConfig.mcpServers?.openpets?.args, ["-y", `@burmese/mcp@${packageVersion}`, "--pet", "fixer"]);
317
+ assert.match(readFileSync(join(cursorWithRulesConflictProject, ".cursor", "rules", "openpets.mdc"), "utf8"), /OPENPETS:CURSOR_RULES:START/);
318
+ const cursorRulesBackups = readdirSync(join(cursorWithRulesConflictProject, ".cursor", "rules")).filter((name) => name.includes("openpets-backup"));
319
+ assert.equal(cursorRulesBackups.length, 1);
320
+ assert.equal(readFileSync(join(cursorWithRulesConflictProject, ".cursor", "rules", cursorRulesBackups[0]), "utf8"), "User rule SECRET=hidden\n");
321
+ }
322
+ finally {
323
+ rmSync(dir, { recursive: true, force: true });
324
+ }
325
+ async function captureDoctorJson(cwd) {
326
+ const originalWrite = process.stdout.write.bind(process.stdout);
327
+ let captured = "";
328
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
329
+ process.stdout.write = ((chunk) => { captured += typeof chunk === "string" ? chunk : String(chunk); return true; });
330
+ try {
331
+ await runDoctor({ cwd, json: true });
332
+ }
333
+ finally {
334
+ process.stdout.write = originalWrite;
335
+ }
336
+ return JSON.parse(captured);
337
+ }
338
+ const doctorInstalledProject = mkdtempSync(join(tmpdir(), "openpets-doctor-installed-"));
339
+ mkdirSync(join(doctorInstalledProject, ".cursor"), { recursive: true });
340
+ writeFileSync(join(doctorInstalledProject, ".cursor", "mcp.json"), JSON.stringify({ mcpServers: { openpets: { type: "stdio", command: "npx", args: ["-y", `@burmese/mcp@${packageVersion}`] } } }, null, 2), "utf8");
341
+ const doctorInstalledReport = await captureDoctorJson(doctorInstalledProject);
342
+ assert.equal(doctorInstalledReport.cursor.status, "installed");
343
+ assert.equal(doctorInstalledReport.codex.status, "not_installed");
344
+ // The OpenPets app IPC is unreachable in CI, so doctor must report app state without throwing.
345
+ assert.equal(doctorInstalledReport.app.running, false);
346
+ rmSync(doctorInstalledProject, { recursive: true, force: true });
347
+ const doctorMissingProject = mkdtempSync(join(tmpdir(), "openpets-doctor-missing-"));
348
+ const doctorMissingReport = await captureDoctorJson(doctorMissingProject);
349
+ assert.equal(doctorMissingReport.cursor.status, "missing");
350
+ assert.equal(doctorMissingReport.codex.status, "not_installed");
351
+ rmSync(doctorMissingProject, { recursive: true, force: true });
352
+ const invalidHook = spawnSync(process.execPath, [new URL("./index.js", import.meta.url).pathname, "hook", "--openpets-managed", "--pet", "bad/pet"], { input: JSON.stringify({ hook_event_name: "Notification" }), encoding: "utf8" });
353
+ assert.equal(invalidHook.status, 1);
354
+ const missingPetHook = spawnSync(process.execPath, [new URL("./index.js", import.meta.url).pathname, "hook", "--openpets-managed", "--pet"], { input: JSON.stringify({ hook_event_name: "Notification" }), encoding: "utf8" });
355
+ assert.equal(missingPetHook.status, 1);
356
+ const invalidHookEvent = spawnSync(process.execPath, [new URL("./index.js", import.meta.url).pathname, "hook", "--openpets-managed", "--hook-event", "Bad"], { input: "{}", encoding: "utf8" });
357
+ assert.equal(invalidHookEvent.status, 1);
358
+ for (const args of [["--help"], ["-h"], ["status", "--help"], ["doctor", "--help"], ["pets", "--help"], ["react", "--help"], ["say", "--help"], ["install", "--help"], ["configure", "--help"], ["configure", "-h"], ["plugin", "--help"], ["plugin", "new", "--help"], ["mcp", "--help"], ["hook", "--help"]]) {
359
+ const help = spawnSync(process.execPath, [new URL("./index.js", import.meta.url).pathname, ...args], { encoding: "utf8" });
360
+ assert.equal(help.status, 0);
361
+ assert.match(help.stdout, /Usage:/);
362
+ }
363
+ const doctorHelp = spawnSync(process.execPath, [new URL("./index.js", import.meta.url).pathname, "doctor", "--help"], { encoding: "utf8" });
364
+ assert.equal(doctorHelp.status, 0);
365
+ assert.match(doctorHelp.stdout, /doctor/);
366
+ console.error("CLI contract validation passed.");
367
+ //# sourceMappingURL=check-cli-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-cli-contract.js","sourceRoot":"","sources":["../src/check-cli-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+ import { createOpenPetsClient, type OpenPetsReaction } from "@burmese/client";
3
+ import { type PluginTemplateName } from "./plugin-templates.js";
4
+ export declare const cliPackageName = "@burmese/cli";
5
+ interface ConfigureOptions {
6
+ readonly agent: "claude" | "opencode" | "cursor" | "codex";
7
+ readonly petId?: string;
8
+ readonly cwd: string;
9
+ readonly yes: boolean;
10
+ readonly force: boolean;
11
+ readonly localDev: boolean;
12
+ readonly cursorRulesMode?: "with" | "only" | "remove";
13
+ }
14
+ interface InstallOptions {
15
+ readonly petId: string;
16
+ }
17
+ interface ReactOptions {
18
+ readonly reaction: OpenPetsReaction;
19
+ }
20
+ interface SayOptions {
21
+ readonly message: string;
22
+ readonly reaction?: OpenPetsReaction;
23
+ }
24
+ interface DoctorOptions {
25
+ readonly cwd: string;
26
+ readonly json: boolean;
27
+ }
28
+ interface CommandSpec {
29
+ readonly command: string;
30
+ readonly args: readonly string[];
31
+ }
32
+ interface PluginNewOptions {
33
+ readonly name: string;
34
+ readonly id: string;
35
+ readonly dir: string;
36
+ readonly author?: string;
37
+ readonly template: PluginTemplateName;
38
+ }
39
+ interface PreparedHooks {
40
+ readonly settingsPath: string;
41
+ readonly settings: Record<string, unknown>;
42
+ }
43
+ interface ConfiguredPet {
44
+ readonly id: string;
45
+ readonly displayName: string;
46
+ }
47
+ export declare function parseDoctorArgs(args: readonly string[]): DoctorOptions;
48
+ export declare function runDoctor(options: DoctorOptions): Promise<void>;
49
+ export declare function configureProject(options: ConfigureOptions): Promise<void>;
50
+ export declare function resolveConfiguredPet(client: Pick<ReturnType<typeof createOpenPetsClient>, "listPets">, petId?: string): Promise<ConfiguredPet>;
51
+ export declare function parseConfigureArgs(args: readonly string[]): ConfigureOptions;
52
+ export declare function parseInstallArgs(args: readonly string[]): InstallOptions;
53
+ export declare function parsePluginNewArgs(args: readonly string[]): PluginNewOptions;
54
+ export declare function scaffoldPlugin(options: PluginNewOptions): {
55
+ readonly dir: string;
56
+ readonly manifestPath: string;
57
+ readonly entryPath: string;
58
+ };
59
+ export declare function parseReactArgs(args: readonly string[]): ReactOptions;
60
+ export declare function parseSayArgs(args: readonly string[]): SayOptions;
61
+ export declare function createVersionPinnedCliCommand(version: string, args: readonly string[]): CommandSpec;
62
+ export declare function createLocalDevCliCommand(args: readonly string[]): CommandSpec;
63
+ export declare function createClaudeMcpAddJsonArgs(config: unknown): readonly string[];
64
+ export declare function installProjectLocalHooks(projectDir: string, hookCommand: string): void;
65
+ export declare function prepareProjectLocalHooks(projectDir: string, hookCommand: string): PreparedHooks;
66
+ export declare function runClaudeMcpAddJson(projectDir: string, config: unknown, force?: boolean): void;
67
+ export declare function assertSafeProjectHookPath(projectDir: string): void;
68
+ export declare function assertSafeProjectCodexConfigPath(projectDir: string): void;
69
+ export {};
70
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}