@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.
- package/LICENSE +21 -0
- package/dist/check-claude-code.d.ts +2 -0
- package/dist/check-claude-code.d.ts.map +1 -0
- package/dist/check-claude-code.js +89 -0
- package/dist/check-claude-code.js.map +1 -0
- package/dist/check-claude-hooks.d.ts +2 -0
- package/dist/check-claude-hooks.d.ts.map +1 -0
- package/dist/check-claude-hooks.js +193 -0
- package/dist/check-claude-hooks.js.map +1 -0
- package/dist/claude-code.d.ts +49 -0
- package/dist/claude-code.d.ts.map +1 -0
- package/dist/claude-code.js +222 -0
- package/dist/claude-code.js.map +1 -0
- package/dist/cli-args.d.ts +4 -0
- package/dist/cli-args.d.ts.map +1 -0
- package/dist/cli-args.js +44 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +36 -0
- package/dist/cli.js.map +1 -0
- package/dist/codex-code.d.ts +32 -0
- package/dist/codex-code.d.ts.map +1 -0
- package/dist/codex-code.js +201 -0
- package/dist/codex-code.js.map +1 -0
- package/dist/hook-messages.d.ts +2 -0
- package/dist/hook-messages.d.ts.map +1 -0
- package/dist/hook-messages.js +2 -0
- package/dist/hook-messages.js.map +1 -0
- package/dist/hook-settings.d.ts +30 -0
- package/dist/hook-settings.d.ts.map +1 -0
- package/dist/hook-settings.js +243 -0
- package/dist/hook-settings.js.map +1 -0
- package/dist/hooks.d.ts +27 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +254 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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"}
|