@burmese/claude 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.
Files changed (42) hide show
  1. package/LICENSE +21 -0
  2. package/dist/check-claude-code.d.ts +2 -0
  3. package/dist/check-claude-code.d.ts.map +1 -0
  4. package/dist/check-claude-code.js +89 -0
  5. package/dist/check-claude-code.js.map +1 -0
  6. package/dist/check-claude-hooks.d.ts +2 -0
  7. package/dist/check-claude-hooks.d.ts.map +1 -0
  8. package/dist/check-claude-hooks.js +193 -0
  9. package/dist/check-claude-hooks.js.map +1 -0
  10. package/dist/claude-code.d.ts +49 -0
  11. package/dist/claude-code.d.ts.map +1 -0
  12. package/dist/claude-code.js +222 -0
  13. package/dist/claude-code.js.map +1 -0
  14. package/dist/cli-args.d.ts +4 -0
  15. package/dist/cli-args.d.ts.map +1 -0
  16. package/dist/cli-args.js +44 -0
  17. package/dist/cli-args.js.map +1 -0
  18. package/dist/cli.d.ts +3 -0
  19. package/dist/cli.d.ts.map +1 -0
  20. package/dist/cli.js +36 -0
  21. package/dist/cli.js.map +1 -0
  22. package/dist/codex-code.d.ts +32 -0
  23. package/dist/codex-code.d.ts.map +1 -0
  24. package/dist/codex-code.js +201 -0
  25. package/dist/codex-code.js.map +1 -0
  26. package/dist/hook-messages.d.ts +2 -0
  27. package/dist/hook-messages.d.ts.map +1 -0
  28. package/dist/hook-messages.js +2 -0
  29. package/dist/hook-messages.js.map +1 -0
  30. package/dist/hook-settings.d.ts +30 -0
  31. package/dist/hook-settings.d.ts.map +1 -0
  32. package/dist/hook-settings.js +243 -0
  33. package/dist/hook-settings.js.map +1 -0
  34. package/dist/hooks.d.ts +27 -0
  35. package/dist/hooks.d.ts.map +1 -0
  36. package/dist/hooks.js +254 -0
  37. package/dist/hooks.js.map +1 -0
  38. package/dist/index.d.ts +7 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +7 -0
  41. package/dist/index.js.map +1 -0
  42. package/package.json +42 -0
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-claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-claude-code.d.ts","sourceRoot":"","sources":["../src/check-claude-code.ts"],"names":[],"mappings":""}
@@ -0,0 +1,89 @@
1
+ import assert from "node:assert/strict";
2
+ import { buildClaudeMcpGetCommand, buildClaudeMcpPreview, classifyClaudeMcpStatus, formatCommandForDisplay, getBundledMcpEntryPath, getLocalMcpEntryPath, mapAsarPathToUnpacked, parseClaudeMcpGetOutput, parseClaudeMcpListOutput, validateOpenPetsPetArg } from "./claude-code.js";
3
+ import { buildCodexConfigBlock, classifyCodexConfigText, codexHookEvents, updateCodexConfigText } from "./codex-code.js";
4
+ const defaultPreview = buildClaudeMcpPreview();
5
+ assert.deepEqual(defaultPreview.add.args, ["mcp", "add", "--scope", "user", "openpets", "--", "npx", "-y", "@burmese/mcp"]);
6
+ assert.deepEqual(defaultPreview.remove.args, ["mcp", "remove", "--scope", "user", "openpets"]);
7
+ assert.deepEqual(defaultPreview.mcpJson.mcpServers.openpets.args, ["-y", "@burmese/mcp"]);
8
+ assert.equal(formatCommandForDisplay(defaultPreview.add), "claude mcp add --scope user openpets -- npx -y @burmese/mcp");
9
+ const petPreview = buildClaudeMcpPreview("snoopy");
10
+ assert.deepEqual(petPreview.add.args, ["mcp", "add", "--scope", "user", "openpets", "--", "npx", "-y", "@burmese/mcp", "--pet", "snoopy"]);
11
+ assert.deepEqual(petPreview.mcpJson.mcpServers.openpets.args, ["-y", "@burmese/mcp", "--pet", "snoopy"]);
12
+ assert.deepEqual(buildClaudeMcpGetCommand().args, ["mcp", "get", "openpets"]);
13
+ const localPreview = buildClaudeMcpPreview("snoopy", "local");
14
+ assert.deepEqual(localPreview.add.args, ["mcp", "add", "--scope", "user", "openpets", "--", "node", getLocalMcpEntryPath(), "--pet", "snoopy"]);
15
+ assert.equal(localPreview.mcpJson.mcpServers.openpets.command, "node");
16
+ assert.deepEqual(localPreview.mcpJson.mcpServers.openpets.args, [getLocalMcpEntryPath(), "--pet", "snoopy"]);
17
+ assert.throws(() => validateOpenPetsPetArg("Bad Pet"));
18
+ assert.throws(() => validateOpenPetsPetArg("bad/pet"));
19
+ assert.equal(validateOpenPetsPetArg("snoopy"), "snoopy");
20
+ assert.equal(parseClaudeMcpListOutput("openpets: npx -y @burmese/mcp").present, true);
21
+ assert.equal(parseClaudeMcpListOutput("No MCP servers configured").present, false);
22
+ const jsonGet = parseClaudeMcpGetOutput(JSON.stringify({ command: "npx", args: ["-y", "@burmese/mcp", "--pet", "snoopy"] }), "snoopy");
23
+ assert.equal(jsonGet.present, true);
24
+ assert.equal(jsonGet.verified, true);
25
+ assert.equal(jsonGet.matchesExpected, true);
26
+ const localGet = parseClaudeMcpGetOutput(JSON.stringify({ command: "node", args: [getLocalMcpEntryPath(), "--pet", "snoopy"] }), "snoopy", "local");
27
+ assert.equal(localGet.matchesExpected, true);
28
+ const bundledPreview = buildClaudeMcpPreview("snoopy", "bundled");
29
+ assert.deepEqual(bundledPreview.add.args, ["mcp", "add", "--scope", "user", "openpets", "--", "node", getBundledMcpEntryPath(), "--pet", "snoopy"]);
30
+ assert.equal(bundledPreview.mcpJson.mcpServers.openpets.command, "node");
31
+ assert.deepEqual(bundledPreview.mcpJson.mcpServers.openpets.args, [getBundledMcpEntryPath(), "--pet", "snoopy"]);
32
+ const bundledGet = parseClaudeMcpGetOutput(JSON.stringify({ command: "node", args: [getBundledMcpEntryPath(), "--pet", "snoopy"] }), "snoopy", "bundled");
33
+ assert.equal(bundledGet.matchesExpected, true);
34
+ const customNode = "/Users/test/Library/Application Support/Herd/config/nvm/versions/node/v22.22.2/bin/node";
35
+ const customNodePreview = buildClaudeMcpPreview("snoopy", "bundled", customNode);
36
+ assert.equal(customNodePreview.mcpJson.mcpServers.openpets.command, customNode);
37
+ assert.equal(parseClaudeMcpGetOutput(JSON.stringify({ command: customNode, args: [getBundledMcpEntryPath(), "--pet", "snoopy"] }), "snoopy", "bundled", customNode).matchesExpected, true);
38
+ const spacedPath = "/Applications/OpenPets Test.app/Contents/Resources/app/node_modules/@burmese/mcp/dist/index.js";
39
+ assert.equal(formatCommandForDisplay({ command: "node", args: [spacedPath, "--pet", "snoopy"] }), 'node "/Applications/OpenPets Test.app/Contents/Resources/app/node_modules/@burmese/mcp/dist/index.js" --pet snoopy');
40
+ const spacedTextGet = parseClaudeMcpGetOutput(`openpets\nCommand: node\nArgs: "${getBundledMcpEntryPath()}" --pet snoopy`, "snoopy", "bundled");
41
+ assert.equal(spacedTextGet.matchesExpected, true);
42
+ assert.equal(formatCommandForDisplay({ command: "node", args: ["C:\\Program Files\\OpenPets\\resources\\app\\node_modules\\@burmese\\mcp\\dist\\index.js"] }), 'node "C:\\\\Program Files\\\\OpenPets\\\\resources\\\\app\\\\node_modules\\\\@burmese\\\\mcp\\\\dist\\\\index.js"');
43
+ assert.equal(mapAsarPathToUnpacked("/Applications/OpenPets.app/Contents/Resources/app.asar/node_modules/@burmese/mcp/dist/index.js"), "/Applications/OpenPets.app/Contents/Resources/app.asar.unpacked/node_modules/@burmese/mcp/dist/index.js");
44
+ assert.equal(mapAsarPathToUnpacked("C:\\Program Files\\OpenPets\\resources\\app.asar\\node_modules\\@burmese\\mcp\\dist\\index.js"), "C:\\Program Files\\OpenPets\\resources\\app.asar.unpacked\\node_modules\\@burmese\\mcp\\dist\\index.js");
45
+ assert.equal(mapAsarPathToUnpacked("/Applications/app.asarish/OpenPets.app/Contents/Resources/app.asar/node_modules/@burmese/mcp/dist/index.js"), "/Applications/app.asarish/OpenPets.app/Contents/Resources/app.asar.unpacked/node_modules/@burmese/mcp/dist/index.js");
46
+ assert.equal(mapAsarPathToUnpacked("/tmp/app.asar.unpacked/node_modules/@burmese/mcp/dist/index.js"), "/tmp/app.asar.unpacked/node_modules/@burmese/mcp/dist/index.js");
47
+ const codexOptions = {
48
+ mcpCommand: { command: "npx", args: ["-y", "@burmese/cli@1.2.3", "mcp", "--pet", "snoopy"] },
49
+ hookCommand: { command: "npx", args: ["-y", "@burmese/cli@1.2.3", "hook", "--openpets-managed", "--project-local", "--pet", "snoopy"] },
50
+ };
51
+ const codexBlock = buildCodexConfigBlock(codexOptions);
52
+ assert.match(codexBlock, /\[mcp_servers\.openpets\]/);
53
+ assert.match(codexBlock, /--hook-event UserPromptSubmit/);
54
+ assert.match(codexBlock, /--hook-event PreToolUse/);
55
+ assert.equal(classifyCodexConfigText(codexBlock, "/tmp/config.toml").status, "installed");
56
+ assert.match(classifyCodexConfigText(codexBlock, "/tmp/config.toml").message, /pending/);
57
+ assert.equal(classifyCodexConfigText(codexBlock, "/tmp/config.toml").hookTrustStatus, "pending");
58
+ // A managed block from before the roster client-label change (no `--client-label
59
+ // Codex`) must be flagged needs_update so the user reinstalls.
60
+ const codexLegacyBlock = codexBlock.replaceAll(" --client-label Codex", "");
61
+ assert.equal(classifyCodexConfigText(codexLegacyBlock, "/tmp/config.toml").status, "needs_update");
62
+ assert.equal(classifyCodexConfigText(codexLegacyBlock, "/tmp/config.toml").canInstall, true);
63
+ const codexTrustedState = [
64
+ "[hooks.state]",
65
+ ...codexHookEvents.map((event) => `[hooks.state."/tmp/config.toml:${event.replace(/([a-z0-9])([A-Z])/g, "$1_$2").toLowerCase()}:0:0"]\ntrusted_hash = "sha256:${"a".repeat(64)}"`),
66
+ "",
67
+ codexBlock,
68
+ ].join("\n\n");
69
+ assert.equal(classifyCodexConfigText(codexTrustedState, "/tmp/config.toml").hookTrustStatus, "trusted");
70
+ assert.equal(classifyCodexConfigText("[mcp_servers.openpets]\ncommand = \"custom\"\n", "/tmp/config.toml").status, "custom");
71
+ const codexUpdated = updateCodexConfigText("model = \"gpt-5.5\"\n", codexOptions);
72
+ assert.match(codexUpdated, /model = "gpt-5\.5"/);
73
+ assert.equal((updateCodexConfigText(codexUpdated, codexOptions).match(/\[mcp_servers\.openpets\]/g) ?? []).length, 1);
74
+ assert.throws(() => updateCodexConfigText("[mcp_servers.openpets]\ncommand = \"custom\"\n", codexOptions));
75
+ assert.doesNotMatch(updateCodexConfigText("[mcp_servers.openpets]\ncommand = \"custom\"\n", codexOptions, true), /command = "custom"/);
76
+ const textGet = parseClaudeMcpGetOutput("openpets\nCommand: npx\nArgs: -y @burmese/mcp --pet snoopy", "snoopy");
77
+ assert.equal(textGet.present, true);
78
+ assert.equal(textGet.verified, true);
79
+ assert.equal(textGet.matchesExpected, true);
80
+ const different = parseClaudeMcpGetOutput(JSON.stringify({ command: "node", args: ["server.js"] }), "snoopy");
81
+ assert.equal(different.present, true);
82
+ assert.equal(different.verified, true);
83
+ assert.equal(different.matchesExpected, false);
84
+ const unverifiable = classifyClaudeMcpStatus("openpets", "Name: openpets\nTransport: stdio", "snoopy");
85
+ assert.equal(unverifiable.present, true);
86
+ assert.equal(unverifiable.verified, false);
87
+ assert.equal(unverifiable.matchesExpected, false);
88
+ console.error("Claude Code setup validation passed.");
89
+ //# sourceMappingURL=check-claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-claude-code.js","sourceRoot":"","sources":["../src/check-claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=check-claude-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-claude-hooks.d.ts","sourceRoot":"","sources":["../src/check-claude-hooks.ts"],"names":[],"mappings":""}
@@ -0,0 +1,193 @@
1
+ import assert from "node:assert/strict";
2
+ import { spawnSync } from "node:child_process";
3
+ import { mkdirSync, mkdtempSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+ import { addOpenPetsHooks, claudeHookEvents, createOpenPetsHookCommand, createOpenPetsHookSettingsPreview, doctorClaudeHooks, getBundledClaudeCliPath, getLocalClaudeCliPath, installClaudeHooks, openPetsHookMarker, removeOpenPetsHooks, uninstallClaudeHooks } from "./hook-settings.js";
7
+ import { hookSpeechPools } from "./hook-messages.js";
8
+ import { handleClaudeHookPayload, hasProjectLocalOpenPetsHook, mapClaudeHookEvent, validateHookSpeech } from "./hooks.js";
9
+ import { readHookCliOptions } from "./cli-args.js";
10
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "UserPromptSubmit" })?.reaction, "thinking");
11
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "UserPromptSubmit" })?.speechCategory, undefined);
12
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "PreToolUse", tool_name: "Write" })?.reaction, "editing");
13
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "PreToolUse", tool_name: "Bash", tool_input: { command: "pnpm test" } })?.reaction, "testing");
14
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "PreToolUse", tool_name: "Bash", tool_input: { command: "ls" } })?.reaction, undefined);
15
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "PreToolUse", tool_name: "Read" })?.reaction, undefined);
16
+ assert.equal(mapClaudeHookEvent({ toolName: "Read" }, "PreToolUse")?.reaction, "working");
17
+ assert.equal(mapClaudeHookEvent({}, "PostToolUse")?.reaction, "working");
18
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "PermissionRequest" })?.speechCategory, "permission");
19
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "Notification" })?.reaction, undefined);
20
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "Stop" })?.reaction, "success");
21
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "Stop" })?.speechCategory, undefined);
22
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "StopFailure" })?.reaction, "error");
23
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "Unknown" })?.reaction, undefined);
24
+ assert.deepEqual(readHookCliOptions(["--openpets-managed", "--client-label", "Codex", "--hook-event", "Stop"]), { clientLabel: "Codex", eventName: "Stop", projectLocal: false, configuredPetId: undefined });
25
+ assert.deepEqual(readHookCliOptions(["--openpets-managed", "--project-local", "--pet", "fixer"]), { clientLabel: undefined, eventName: undefined, projectLocal: true, configuredPetId: "fixer" });
26
+ assert.throws(() => readHookCliOptions(["--hook-event", "Nope"]));
27
+ validateHookSpeech("Thinking it through");
28
+ for (const [category, messages] of Object.entries(hookSpeechPools)) {
29
+ for (const message of messages) {
30
+ assert.match(message, /^[A-Z]/, `${category} hook speech must start with an uppercase letter: ${message}`);
31
+ validateHookSpeech(message);
32
+ }
33
+ }
34
+ for (const unsafe of ["", "a".repeat(141), "line\nbreak", "const x = 1", "https://example.com", "/Users/alvin/project", "api_key=secret"]) {
35
+ assert.throws(() => validateHookSpeech(unsafe));
36
+ }
37
+ const calls = [];
38
+ const client = {
39
+ hello: async () => ({}),
40
+ status: async () => ({ ok: true, appRunning: true }),
41
+ listPets: async () => ({ ok: true, pets: [], defaultPetId: "builtin" }),
42
+ installPet: async () => { throw new Error("unused"); },
43
+ acquireLease: async (options) => {
44
+ calls.push({ kind: "lease", value: "acquire", requestedPetId: options?.requestedPetId });
45
+ return { leaseId: "lease-fixer", requestedPetId: options?.requestedPetId, targetKind: "explicit", actualTargetPetId: options?.requestedPetId ?? "builtin", actualTargetPetName: "Fixer", usingDefaultPet: false, expiresAt: Date.now() + 15_000, leaseActive: true };
46
+ },
47
+ heartbeatLease: async () => { throw new Error("unused"); },
48
+ releaseLease: async () => { throw new Error("unused"); },
49
+ react: async (reaction, options) => { calls.push({ kind: "react", value: reaction, leaseId: options?.leaseId, clientLabel: options?.clientLabel, source: options?.source, ...(options?.externalSessionId ? { externalSessionId: options.externalSessionId } : {}) }); },
50
+ say: async (message, options) => { calls.push({ kind: "say", value: message, leaseId: options?.leaseId, clientLabel: options?.clientLabel, source: options?.source, ...(options?.externalSessionId ? { externalSessionId: options.externalSessionId } : {}) }); },
51
+ };
52
+ const dir = mkdtempSync(join(tmpdir(), "openpets-hooks-"));
53
+ try {
54
+ await handleClaudeHookPayload(JSON.stringify({ hook_event_name: "UserPromptSubmit", prompt: "never shown" }), { client, configuredPetId: "fixer", throttlePath: join(dir, "throttle.json"), now: () => 100_000, random: () => 0 });
55
+ assert.deepEqual(calls[0], { kind: "lease", value: "acquire", requestedPetId: "fixer" });
56
+ assert.deepEqual(calls[1], { kind: "react", value: "thinking", leaseId: "lease-fixer", clientLabel: "Claude", source: "hook" });
57
+ await handleClaudeHookPayload(JSON.stringify({ hook_event_name: "PreToolUse", tool_name: "Bash", tool_input: { command: "npm test -- --secret" } }), { client, throttlePath: join(dir, "throttle.json"), now: () => 101_000 });
58
+ assert.deepEqual(calls[2], { kind: "react", value: "testing", leaseId: undefined, clientLabel: "Claude", source: "hook" });
59
+ const beforeSilentBash = calls.length;
60
+ await handleClaudeHookPayload(JSON.stringify({ hook_event_name: "PreToolUse", tool_name: "Bash", tool_input: { command: "ls" } }), { client, throttlePath: join(dir, "throttle.json"), now: () => 102_000 });
61
+ assert.equal(calls.length, beforeSilentBash);
62
+ await handleClaudeHookPayload(JSON.stringify({ hook_event_name: "PreToolUse", tool_name: "Bash", tool_input: { command: "npm test" } }), { client, throttlePath: join(dir, "throttle.json"), now: () => 102_000 });
63
+ assert.equal(calls.length, beforeSilentBash, "duplicate testing reaction should be throttled");
64
+ await handleClaudeHookPayload("not json", { client, throttlePath: join(dir, "throttle.json") });
65
+ const projectDir = join(dir, "project-with-local-hook");
66
+ mkdirSync(join(projectDir, ".claude"), { recursive: true });
67
+ writeFileSync(join(projectDir, ".claude", "settings.local.json"), JSON.stringify({ hooks: { UserPromptSubmit: [{ hooks: [{ type: "command", command: "openpets hook --openpets-managed --project-local --pet fixer" }] }] } }), "utf8");
68
+ assert.equal(hasProjectLocalOpenPetsHook(projectDir), true);
69
+ const beforeSkippedGlobal = calls.length;
70
+ const previousProjectDir = process.env.CLAUDE_PROJECT_DIR;
71
+ process.env.CLAUDE_PROJECT_DIR = projectDir;
72
+ try {
73
+ await handleClaudeHookPayload(JSON.stringify({ hook_event_name: "PermissionRequest" }), { client, throttlePath: join(dir, "project-skip-throttle.json"), now: () => 102_000, debug: true, random: () => 0 });
74
+ assert.equal(calls.length, beforeSkippedGlobal);
75
+ await handleClaudeHookPayload(JSON.stringify({ hook_event_name: "PermissionRequest" }), { client, projectLocal: true, configuredPetId: "fixer", throttlePath: join(dir, "throttle.json"), now: () => 103_000, random: () => 0 });
76
+ assert.deepEqual(calls.at(-2), { kind: "lease", value: "acquire", requestedPetId: "fixer" });
77
+ assert.deepEqual(calls.at(-1), { kind: "say", value: "Approval needed", leaseId: "lease-fixer", clientLabel: "Claude", source: "hook" });
78
+ await handleClaudeHookPayload(JSON.stringify({ hook_event_name: "PermissionRequest" }), { client, clientLabel: "Codex", projectLocal: true, configuredPetId: "fixer", throttlePath: join(dir, "codex-throttle.json"), now: () => 104_000, random: () => 0 });
79
+ assert.deepEqual(calls.at(-2), { kind: "lease", value: "acquire", requestedPetId: "fixer" });
80
+ assert.deepEqual(calls.at(-1), { kind: "say", value: "Approval needed", leaseId: "lease-fixer", clientLabel: "Codex", source: "hook" });
81
+ }
82
+ finally {
83
+ if (previousProjectDir === undefined)
84
+ delete process.env.CLAUDE_PROJECT_DIR;
85
+ else
86
+ process.env.CLAUDE_PROJECT_DIR = previousProjectDir;
87
+ }
88
+ // Terminal events (a task finishing) must never be throttled — even back-to-back finishes
89
+ // from different sessions inside the cooldown window both reach the cat.
90
+ const finishPath = join(dir, "finish-throttle.json");
91
+ const beforeFinish = calls.length;
92
+ await handleClaudeHookPayload(JSON.stringify({ hook_event_name: "Stop", session_id: "sess-a" }), { client, throttlePath: finishPath, now: () => 200_000 });
93
+ await handleClaudeHookPayload(JSON.stringify({ hook_event_name: "Stop", session_id: "sess-b" }), { client, throttlePath: finishPath, now: () => 200_500 });
94
+ await handleClaudeHookPayload(JSON.stringify({ hook_event_name: "Stop", session_id: "sess-a" }), { client, throttlePath: finishPath, now: () => 201_000 });
95
+ assert.equal(calls.length, beforeFinish + 3, "every finish must show, even within the cooldown window");
96
+ assert.deepEqual(calls.at(-1), { kind: "react", value: "success", leaseId: undefined, clientLabel: "Claude", source: "hook", externalSessionId: "sess-a" });
97
+ // Reaction throttling is per-session, so concurrent sessions don't mute each other.
98
+ const sessionPath = join(dir, "session-throttle.json");
99
+ const beforeEdits = calls.length;
100
+ await handleClaudeHookPayload(JSON.stringify({ hook_event_name: "PreToolUse", tool_name: "Write", session_id: "sess-a" }), { client, throttlePath: sessionPath, now: () => 300_000 });
101
+ await handleClaudeHookPayload(JSON.stringify({ hook_event_name: "PreToolUse", tool_name: "Write", session_id: "sess-b" }), { client, throttlePath: sessionPath, now: () => 300_500 });
102
+ assert.equal(calls.length, beforeEdits + 2, "different sessions must not share a reaction cooldown");
103
+ await handleClaudeHookPayload(JSON.stringify({ hook_event_name: "PreToolUse", tool_name: "Write", session_id: "sess-a" }), { client, throttlePath: sessionPath, now: () => 301_000 });
104
+ assert.equal(calls.length, beforeEdits + 2, "the same session still throttles a repeated reaction");
105
+ const preview = createOpenPetsHookSettingsPreview();
106
+ const hooks = (preview.hooks ?? {});
107
+ for (const event of claudeHookEvents) {
108
+ const entries = hooks[event];
109
+ const hook = entries[0]?.hooks[0];
110
+ assert.ok(hook?.command.includes(openPetsHookMarker));
111
+ assert.equal(hook.timeout, 3);
112
+ assert.equal(hook.async, true);
113
+ assert.equal(hook.asyncRewake, false);
114
+ }
115
+ const localPreview = createOpenPetsHookSettingsPreview("local");
116
+ const localHook = (localPreview.hooks.Stop[0]?.hooks[0]);
117
+ assert.ok(localHook?.command.includes(getLocalClaudeCliPath()));
118
+ assert.ok(localHook?.command.includes(openPetsHookMarker));
119
+ const bundledPreview = createOpenPetsHookSettingsPreview("bundled");
120
+ const bundledHook = (bundledPreview.hooks.Stop[0]?.hooks[0]);
121
+ assert.ok(bundledHook?.command.includes(getBundledClaudeCliPath()));
122
+ assert.ok(bundledHook?.command.includes(openPetsHookMarker));
123
+ const customNodeHookCommand = createOpenPetsHookCommand("bundled", "fixer", "/Users/test/Library/Application Support/Herd/config/nvm/versions/node/v22.22.2/bin/node");
124
+ assert.ok(customNodeHookCommand.startsWith('"/Users/test/Library/Application Support/Herd/config/nvm/versions/node/v22.22.2/bin/node"'));
125
+ assert.ok(customNodeHookCommand.includes("--pet fixer"));
126
+ assert.ok(createOpenPetsHookCommand("published", "fixer").endsWith("--openpets-managed --pet fixer"));
127
+ const petPreview = createOpenPetsHookSettingsPreview("published", "fixer");
128
+ const petHook = (petPreview.hooks.UserPromptSubmit[0]?.hooks[0]);
129
+ assert.ok(petHook?.command.includes("--pet fixer"));
130
+ const settings = { theme: "dark", hooks: { PreToolUse: [{ matcher: "Bash", hooks: [{ type: "command", command: "echo safe" }] }] } };
131
+ const installed = addOpenPetsHooks(settings);
132
+ assert.equal(doctorStatus(installed), "installed");
133
+ const installedForFixer = addOpenPetsHooks(settings, "published", "fixer");
134
+ assert.equal(doctorStatus(installedForFixer, "fixer"), "installed");
135
+ assert.equal(doctorStatus(installedForFixer), "needs_update");
136
+ assert.ok(doctorClaudeHooks(doctorStatusPath(installedForFixer), "published", "fixer").message.includes("Hook events target fixer."));
137
+ const reinstalled = addOpenPetsHooks(removeOpenPetsHooks(installed));
138
+ assert.deepEqual(reinstalled, installed);
139
+ const uninstalled = removeOpenPetsHooks(installed);
140
+ assert.deepEqual(uninstalled, settings);
141
+ assert.throws(() => addOpenPetsHooks({ hooks: { UserPromptSubmit: { bad: true } } }));
142
+ const stale = addOpenPetsHooks({});
143
+ stale.hooks.Stop.push({ hooks: [{ type: "command", command: "npx -y @burmese/claude hook --openpets-managed --old" }] });
144
+ const stalePath = join(dir, "stale-settings.json");
145
+ writeFileSync(stalePath, JSON.stringify(stale), "utf8");
146
+ assert.equal(doctorClaudeHooks(stalePath).status, "needs_update");
147
+ assert.equal(installClaudeHooks(stalePath).status, "installed");
148
+ const settingsPath = join(dir, "settings.json");
149
+ writeFileSync(settingsPath, JSON.stringify(settings), "utf8");
150
+ assert.equal(doctorClaudeHooks(settingsPath).status, "not_installed");
151
+ assert.equal(installClaudeHooks(settingsPath).status, "installed");
152
+ assert.equal(installClaudeHooks(settingsPath).changed, false);
153
+ assert.equal(uninstallClaudeHooks(settingsPath).status, "not_installed");
154
+ assert.equal(uninstallClaudeHooks(settingsPath).changed, false);
155
+ writeFileSync(settingsPath, JSON.stringify({ hooks: [] }), "utf8");
156
+ assert.equal(doctorClaudeHooks(settingsPath).status, "error");
157
+ writeFileSync(settingsPath, JSON.stringify({ hooks: { Stop: { bad: true } } }), "utf8");
158
+ assert.equal(doctorClaudeHooks(settingsPath).status, "error");
159
+ const symlinkPath = join(dir, "settings-link.json");
160
+ symlinkSync(settingsPath, symlinkPath);
161
+ assert.equal(doctorClaudeHooks(symlinkPath).status, "error");
162
+ process.env.OPENPETS_DISABLE_CLAUDE_ASYNC_HOOKS = "1";
163
+ assert.throws(() => installClaudeHooks(join(dir, "async-disabled.json")));
164
+ delete process.env.OPENPETS_DISABLE_CLAUDE_ASYNC_HOOKS;
165
+ const isolatedEnv = { ...process.env, OPENPETS_DISCOVERY_FILE: join(dir, "missing-ipc.json") };
166
+ const normalHook = spawnSync(process.execPath, [new URL("./cli.js", import.meta.url).pathname, "hook", "--openpets-managed"], { input: JSON.stringify({ hook_event_name: "Notification", message: "safe" }), encoding: "utf8", env: isolatedEnv });
167
+ assert.equal(normalHook.status, 0);
168
+ assert.equal(normalHook.stdout, "");
169
+ const petHookRun = spawnSync(process.execPath, [new URL("./cli.js", import.meta.url).pathname, "hook", "--openpets-managed", "--pet", "fixer"], { input: JSON.stringify({ hook_event_name: "Notification", message: "safe" }), encoding: "utf8", env: isolatedEnv });
170
+ assert.equal(petHookRun.status, 0);
171
+ assert.equal(petHookRun.stdout, "");
172
+ const invalidPetHook = spawnSync(process.execPath, [new URL("./cli.js", import.meta.url).pathname, "hook", "--openpets-managed", "--pet", "bad/pet"], { input: JSON.stringify({ hook_event_name: "Notification", message: "safe" }), encoding: "utf8", env: isolatedEnv });
173
+ assert.equal(invalidPetHook.status, 1);
174
+ const missingPetHook = spawnSync(process.execPath, [new URL("./cli.js", import.meta.url).pathname, "hook", "--openpets-managed", "--pet"], { input: JSON.stringify({ hook_event_name: "Notification", message: "safe" }), encoding: "utf8", env: isolatedEnv });
175
+ assert.equal(missingPetHook.status, 1);
176
+ const malformedHook = spawnSync(process.execPath, [new URL("./cli.js", import.meta.url).pathname, "hook", "--openpets-managed"], { input: "not json", encoding: "utf8", env: isolatedEnv });
177
+ assert.equal(malformedHook.status, 0);
178
+ assert.equal(malformedHook.stdout, "");
179
+ }
180
+ finally {
181
+ rmSync(dir, { recursive: true, force: true });
182
+ }
183
+ console.error("Claude hooks validation passed.");
184
+ function doctorStatus(value, selectedPetId) {
185
+ const path = doctorStatusPath(value);
186
+ return doctorClaudeHooks(path, "published", selectedPetId).status;
187
+ }
188
+ function doctorStatusPath(value) {
189
+ const path = join(dir, `settings-${Math.random()}.json`);
190
+ writeFileSync(path, JSON.stringify(value), "utf8");
191
+ return path;
192
+ }
193
+ //# sourceMappingURL=check-claude-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-claude-hooks.js","sourceRoot":"","sources":["../src/check-claude-hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ export declare const claudeMcpServerName = "openpets";
2
+ export declare const openPetsMcpPackageName = "@burmese/mcp";
3
+ export type OpenPetsCommandMode = "published" | "local" | "bundled";
4
+ export type ClaudeMcpScope = "user";
5
+ export interface ClaudeCommandSpec {
6
+ readonly command: string;
7
+ readonly args: readonly string[];
8
+ }
9
+ export interface ClaudeMcpPreview {
10
+ readonly commandMode: OpenPetsCommandMode;
11
+ readonly add: ClaudeCommandSpec;
12
+ readonly remove: ClaudeCommandSpec;
13
+ readonly mcpJson: {
14
+ readonly mcpServers: {
15
+ readonly openpets: {
16
+ readonly type: "stdio";
17
+ readonly command: string;
18
+ readonly args: readonly string[];
19
+ };
20
+ };
21
+ };
22
+ readonly displayCommand: string;
23
+ }
24
+ export interface ParsedClaudeMcpEntry {
25
+ readonly present: boolean;
26
+ readonly command?: string;
27
+ readonly args?: readonly string[];
28
+ readonly source: "none" | "list" | "get";
29
+ readonly verified: boolean;
30
+ readonly matchesExpected: boolean;
31
+ }
32
+ export declare function buildClaudeMcpPreview(selectedPetId?: string, commandMode?: OpenPetsCommandMode, nodeCommand?: string): ClaudeMcpPreview;
33
+ export declare function buildOpenPetsMcpArgs(selectedPetId?: string): readonly string[];
34
+ export declare function buildOpenPetsMcpServerCommand(selectedPetId?: string, commandMode?: OpenPetsCommandMode, nodeCommand?: string): {
35
+ readonly command: string;
36
+ readonly args: readonly string[];
37
+ };
38
+ export declare function assertLocalMcpEntryPath(): void;
39
+ export declare function getLocalMcpEntryPath(): string;
40
+ export declare function getBundledMcpEntryPath(): string;
41
+ export declare function mapAsarPathToUnpacked(path: string): string;
42
+ export declare function assertBundledMcpEntryPath(): void;
43
+ export declare function buildClaudeMcpGetCommand(): ClaudeCommandSpec;
44
+ export declare function validateOpenPetsPetArg(value: string): string;
45
+ export declare function parseClaudeMcpListOutput(output: string): ParsedClaudeMcpEntry;
46
+ export declare function parseClaudeMcpGetOutput(output: string, expectedPetId?: string, commandMode?: OpenPetsCommandMode, nodeCommand?: string): ParsedClaudeMcpEntry;
47
+ export declare function classifyClaudeMcpStatus(listOutput: string, getOutput: string | undefined, expectedPetId?: string, commandMode?: OpenPetsCommandMode, nodeCommand?: string): ParsedClaudeMcpEntry;
48
+ export declare function formatCommandForDisplay(spec: ClaudeCommandSpec): string;
49
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../src/claude-code.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,mBAAmB,aAAa,CAAC;AAC9C,eAAO,MAAM,sBAAsB,iBAAiB,CAAC;AACrD,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;AAEpE,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAC1C,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,UAAU,EAAE;YACnB,QAAQ,CAAC,QAAQ,EAAE;gBACjB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;gBACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;aAClC,CAAC;SACH,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC;AAED,wBAAgB,qBAAqB,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,GAAE,mBAAiC,EAAE,WAAW,SAAS,GAAG,gBAAgB,CAqBpJ;AAED,wBAAgB,oBAAoB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAI9E;AAED,wBAAgB,6BAA6B,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,GAAE,mBAAiC,EAAE,WAAW,SAAS,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAS1M;AAED,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAOD,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED,wBAAgB,wBAAwB,IAAI,iBAAiB,CAE5D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAS7E;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,GAAE,mBAAiC,EAAE,WAAW,SAAS,GAAG,oBAAoB,CAwB1K;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,GAAE,mBAAiC,EAAE,WAAW,SAAS,GAAG,oBAAoB,CAM7M;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAEvE"}