@open-pets/claude 2.0.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-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,55 @@
1
+ import assert from "node:assert/strict";
2
+ import { buildClaudeMcpGetCommand, buildClaudeMcpPreview, classifyClaudeMcpStatus, formatCommandForDisplay, getBundledMcpEntryPath, getLocalMcpEntryPath, mapAsarPathToUnpacked, parseClaudeMcpGetOutput, parseClaudeMcpListOutput, validateOpenPetsPetArg } from "./claude-code.js";
3
+ const defaultPreview = buildClaudeMcpPreview();
4
+ assert.deepEqual(defaultPreview.add.args, ["mcp", "add", "--scope", "user", "openpets", "--", "npx", "-y", "@open-pets/mcp"]);
5
+ assert.deepEqual(defaultPreview.remove.args, ["mcp", "remove", "--scope", "user", "openpets"]);
6
+ assert.deepEqual(defaultPreview.mcpJson.mcpServers.openpets.args, ["-y", "@open-pets/mcp"]);
7
+ assert.equal(formatCommandForDisplay(defaultPreview.add), "claude mcp add --scope user openpets -- npx -y @open-pets/mcp");
8
+ const petPreview = buildClaudeMcpPreview("snoopy");
9
+ assert.deepEqual(petPreview.add.args, ["mcp", "add", "--scope", "user", "openpets", "--", "npx", "-y", "@open-pets/mcp", "--pet", "snoopy"]);
10
+ assert.deepEqual(petPreview.mcpJson.mcpServers.openpets.args, ["-y", "@open-pets/mcp", "--pet", "snoopy"]);
11
+ assert.deepEqual(buildClaudeMcpGetCommand().args, ["mcp", "get", "openpets"]);
12
+ const localPreview = buildClaudeMcpPreview("snoopy", "local");
13
+ assert.deepEqual(localPreview.add.args, ["mcp", "add", "--scope", "user", "openpets", "--", "node", getLocalMcpEntryPath(), "--pet", "snoopy"]);
14
+ assert.equal(localPreview.mcpJson.mcpServers.openpets.command, "node");
15
+ assert.deepEqual(localPreview.mcpJson.mcpServers.openpets.args, [getLocalMcpEntryPath(), "--pet", "snoopy"]);
16
+ assert.throws(() => validateOpenPetsPetArg("Bad Pet"));
17
+ assert.throws(() => validateOpenPetsPetArg("bad/pet"));
18
+ assert.equal(validateOpenPetsPetArg("snoopy"), "snoopy");
19
+ assert.equal(parseClaudeMcpListOutput("openpets: npx -y @open-pets/mcp").present, true);
20
+ assert.equal(parseClaudeMcpListOutput("No MCP servers configured").present, false);
21
+ const jsonGet = parseClaudeMcpGetOutput(JSON.stringify({ command: "npx", args: ["-y", "@open-pets/mcp", "--pet", "snoopy"] }), "snoopy");
22
+ assert.equal(jsonGet.present, true);
23
+ assert.equal(jsonGet.verified, true);
24
+ assert.equal(jsonGet.matchesExpected, true);
25
+ const localGet = parseClaudeMcpGetOutput(JSON.stringify({ command: "node", args: [getLocalMcpEntryPath(), "--pet", "snoopy"] }), "snoopy", "local");
26
+ assert.equal(localGet.matchesExpected, true);
27
+ const bundledPreview = buildClaudeMcpPreview("snoopy", "bundled");
28
+ assert.deepEqual(bundledPreview.add.args, ["mcp", "add", "--scope", "user", "openpets", "--", "node", getBundledMcpEntryPath(), "--pet", "snoopy"]);
29
+ assert.equal(bundledPreview.mcpJson.mcpServers.openpets.command, "node");
30
+ assert.deepEqual(bundledPreview.mcpJson.mcpServers.openpets.args, [getBundledMcpEntryPath(), "--pet", "snoopy"]);
31
+ const bundledGet = parseClaudeMcpGetOutput(JSON.stringify({ command: "node", args: [getBundledMcpEntryPath(), "--pet", "snoopy"] }), "snoopy", "bundled");
32
+ assert.equal(bundledGet.matchesExpected, true);
33
+ const spacedPath = "/Applications/OpenPets Test.app/Contents/Resources/app/node_modules/@open-pets/mcp/dist/index.js";
34
+ assert.equal(formatCommandForDisplay({ command: "node", args: [spacedPath, "--pet", "snoopy"] }), 'node "/Applications/OpenPets Test.app/Contents/Resources/app/node_modules/@open-pets/mcp/dist/index.js" --pet snoopy');
35
+ const spacedTextGet = parseClaudeMcpGetOutput(`openpets\nCommand: node\nArgs: "${getBundledMcpEntryPath()}" --pet snoopy`, "snoopy", "bundled");
36
+ assert.equal(spacedTextGet.matchesExpected, true);
37
+ assert.equal(formatCommandForDisplay({ command: "node", args: ["C:\\Program Files\\OpenPets\\resources\\app\\node_modules\\@open-pets\\mcp\\dist\\index.js"] }), 'node "C:\\\\Program Files\\\\OpenPets\\\\resources\\\\app\\\\node_modules\\\\@open-pets\\\\mcp\\\\dist\\\\index.js"');
38
+ assert.equal(mapAsarPathToUnpacked("/Applications/OpenPets.app/Contents/Resources/app.asar/node_modules/@open-pets/mcp/dist/index.js"), "/Applications/OpenPets.app/Contents/Resources/app.asar.unpacked/node_modules/@open-pets/mcp/dist/index.js");
39
+ assert.equal(mapAsarPathToUnpacked("C:\\Program Files\\OpenPets\\resources\\app.asar\\node_modules\\@open-pets\\mcp\\dist\\index.js"), "C:\\Program Files\\OpenPets\\resources\\app.asar.unpacked\\node_modules\\@open-pets\\mcp\\dist\\index.js");
40
+ assert.equal(mapAsarPathToUnpacked("/Applications/app.asarish/OpenPets.app/Contents/Resources/app.asar/node_modules/@open-pets/mcp/dist/index.js"), "/Applications/app.asarish/OpenPets.app/Contents/Resources/app.asar.unpacked/node_modules/@open-pets/mcp/dist/index.js");
41
+ assert.equal(mapAsarPathToUnpacked("/tmp/app.asar.unpacked/node_modules/@open-pets/mcp/dist/index.js"), "/tmp/app.asar.unpacked/node_modules/@open-pets/mcp/dist/index.js");
42
+ const textGet = parseClaudeMcpGetOutput("openpets\nCommand: npx\nArgs: -y @open-pets/mcp --pet snoopy", "snoopy");
43
+ assert.equal(textGet.present, true);
44
+ assert.equal(textGet.verified, true);
45
+ assert.equal(textGet.matchesExpected, true);
46
+ const different = parseClaudeMcpGetOutput(JSON.stringify({ command: "node", args: ["server.js"] }), "snoopy");
47
+ assert.equal(different.present, true);
48
+ assert.equal(different.verified, true);
49
+ assert.equal(different.matchesExpected, false);
50
+ const unverifiable = classifyClaudeMcpStatus("openpets", "Name: openpets\nTransport: stdio", "snoopy");
51
+ assert.equal(unverifiable.present, true);
52
+ assert.equal(unverifiable.verified, false);
53
+ assert.equal(unverifiable.matchesExpected, false);
54
+ console.error("Claude Code setup validation passed.");
55
+ //# 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":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAErR,MAAM,cAAc,GAAG,qBAAqB,EAAE,CAAC;AAC/C,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAC9H,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AAC/F,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAC5F,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,+DAA+D,CAAC,CAAC;AAE3H,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;AACnD,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC7I,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC3G,MAAM,CAAC,SAAS,CAAC,wBAAwB,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;AAE9E,MAAM,YAAY,GAAG,qBAAqB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9D,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAChJ,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACvE,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE7G,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC;AACvD,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;AAEzD,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,iCAAiC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACxF,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,2BAA2B,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAEnF,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AACzI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACpC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACrC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;AAE5C,MAAM,QAAQ,GAAG,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AACpJ,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;AAE7C,MAAM,cAAc,GAAG,qBAAqB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAClE,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,sBAAsB,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AACpJ,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACzE,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,sBAAsB,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AACjH,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,sBAAsB,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAC1J,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;AAE/C,MAAM,UAAU,GAAG,kGAAkG,CAAC;AACtH,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,sHAAsH,CAAC,CAAC;AAC1N,MAAM,aAAa,GAAG,uBAAuB,CAAC,mCAAmC,sBAAsB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAChJ,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;AAClD,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,4FAA4F,CAAC,EAAE,CAAC,EAAE,qHAAqH,CAAC,CAAC;AACxR,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,kGAAkG,CAAC,EAAE,2GAA2G,CAAC,CAAC;AACrP,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,iGAAiG,CAAC,EAAE,0GAA0G,CAAC,CAAC;AACnP,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,8GAA8G,CAAC,EAAE,uHAAuH,CAAC,CAAC;AAC7Q,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,kEAAkE,CAAC,EAAE,kEAAkE,CAAC,CAAC;AAE5K,MAAM,OAAO,GAAG,uBAAuB,CAAC,8DAA8D,EAAE,QAAQ,CAAC,CAAC;AAClH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACpC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACrC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;AAE5C,MAAM,SAAS,GAAG,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC9G,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACtC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACvC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;AAE/C,MAAM,YAAY,GAAG,uBAAuB,CAAC,UAAU,EAAE,kCAAkC,EAAE,QAAQ,CAAC,CAAC;AACvG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACzC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC3C,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;AAElD,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC"}
@@ -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,163 @@
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
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "UserPromptSubmit" })?.reaction, "thinking");
10
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "UserPromptSubmit" })?.speechCategory, undefined);
11
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "PreToolUse", tool_name: "Write" })?.reaction, "editing");
12
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "PreToolUse", tool_name: "Bash", tool_input: { command: "pnpm test" } })?.reaction, "testing");
13
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "PreToolUse", tool_name: "Bash", tool_input: { command: "ls" } })?.reaction, undefined);
14
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "PreToolUse", tool_name: "Read" })?.reaction, undefined);
15
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "PermissionRequest" })?.speechCategory, "permission");
16
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "Notification" })?.reaction, undefined);
17
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "Stop" })?.reaction, "success");
18
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "Stop" })?.speechCategory, undefined);
19
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "StopFailure" })?.reaction, "error");
20
+ assert.equal(mapClaudeHookEvent({ hook_event_name: "Unknown" })?.reaction, undefined);
21
+ validateHookSpeech("Thinking it through");
22
+ for (const [category, messages] of Object.entries(hookSpeechPools)) {
23
+ for (const message of messages) {
24
+ assert.match(message, /^[A-Z]/, `${category} hook speech must start with an uppercase letter: ${message}`);
25
+ validateHookSpeech(message);
26
+ }
27
+ }
28
+ for (const unsafe of ["", "a".repeat(141), "line\nbreak", "const x = 1", "https://example.com", "/Users/alvin/project", "api_key=secret"]) {
29
+ assert.throws(() => validateHookSpeech(unsafe));
30
+ }
31
+ const calls = [];
32
+ const client = {
33
+ hello: async () => ({}),
34
+ status: async () => ({ ok: true, appRunning: true }),
35
+ listPets: async () => ({ ok: true, pets: [], defaultPetId: "builtin" }),
36
+ acquireLease: async (options) => {
37
+ calls.push({ kind: "lease", value: "acquire", requestedPetId: options?.requestedPetId });
38
+ return { leaseId: "lease-fixer", requestedPetId: options?.requestedPetId, targetKind: "explicit", actualTargetPetId: options?.requestedPetId ?? "builtin", actualTargetPetName: "Fixer", usingDefaultPet: false, expiresAt: Date.now() + 15_000, leaseActive: true };
39
+ },
40
+ heartbeatLease: async () => { throw new Error("unused"); },
41
+ releaseLease: async () => { throw new Error("unused"); },
42
+ react: async (reaction, options) => { calls.push({ kind: "react", value: reaction, leaseId: options?.leaseId }); },
43
+ say: async (message, options) => { calls.push({ kind: "say", value: message, leaseId: options?.leaseId }); },
44
+ };
45
+ const dir = mkdtempSync(join(tmpdir(), "openpets-hooks-"));
46
+ try {
47
+ await handleClaudeHookPayload(JSON.stringify({ hook_event_name: "UserPromptSubmit", prompt: "never shown" }), { client, configuredPetId: "fixer", throttlePath: join(dir, "throttle.json"), now: () => 100_000, random: () => 0 });
48
+ assert.deepEqual(calls[0], { kind: "lease", value: "acquire", requestedPetId: "fixer" });
49
+ assert.deepEqual(calls[1], { kind: "react", value: "thinking", leaseId: "lease-fixer" });
50
+ 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 });
51
+ assert.deepEqual(calls[2], { kind: "react", value: "testing", leaseId: undefined });
52
+ const beforeSilentBash = calls.length;
53
+ await handleClaudeHookPayload(JSON.stringify({ hook_event_name: "PreToolUse", tool_name: "Bash", tool_input: { command: "ls" } }), { client, throttlePath: join(dir, "throttle.json"), now: () => 102_000 });
54
+ assert.equal(calls.length, beforeSilentBash);
55
+ 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 });
56
+ assert.equal(calls.length, beforeSilentBash, "duplicate testing reaction should be throttled");
57
+ await handleClaudeHookPayload("not json", { client, throttlePath: join(dir, "throttle.json") });
58
+ const projectDir = join(dir, "project-with-local-hook");
59
+ mkdirSync(join(projectDir, ".claude"), { recursive: true });
60
+ writeFileSync(join(projectDir, ".claude", "settings.local.json"), JSON.stringify({ hooks: { UserPromptSubmit: [{ hooks: [{ type: "command", command: "openpets hook --openpets-managed --project-local --pet fixer" }] }] } }), "utf8");
61
+ assert.equal(hasProjectLocalOpenPetsHook(projectDir), true);
62
+ const beforeSkippedGlobal = calls.length;
63
+ const previousProjectDir = process.env.CLAUDE_PROJECT_DIR;
64
+ process.env.CLAUDE_PROJECT_DIR = projectDir;
65
+ try {
66
+ await handleClaudeHookPayload(JSON.stringify({ hook_event_name: "PermissionRequest" }), { client, throttlePath: join(dir, "project-skip-throttle.json"), now: () => 102_000, debug: true, random: () => 0 });
67
+ assert.equal(calls.length, beforeSkippedGlobal);
68
+ await handleClaudeHookPayload(JSON.stringify({ hook_event_name: "PermissionRequest" }), { client, projectLocal: true, configuredPetId: "fixer", throttlePath: join(dir, "throttle.json"), now: () => 103_000, random: () => 0 });
69
+ assert.deepEqual(calls.at(-2), { kind: "lease", value: "acquire", requestedPetId: "fixer" });
70
+ assert.deepEqual(calls.at(-1), { kind: "say", value: "Approval needed", leaseId: "lease-fixer" });
71
+ }
72
+ finally {
73
+ if (previousProjectDir === undefined)
74
+ delete process.env.CLAUDE_PROJECT_DIR;
75
+ else
76
+ process.env.CLAUDE_PROJECT_DIR = previousProjectDir;
77
+ }
78
+ const preview = createOpenPetsHookSettingsPreview();
79
+ const hooks = (preview.hooks ?? {});
80
+ for (const event of claudeHookEvents) {
81
+ const entries = hooks[event];
82
+ const hook = entries[0]?.hooks[0];
83
+ assert.ok(hook?.command.includes(openPetsHookMarker));
84
+ assert.equal(hook.timeout, 3);
85
+ assert.equal(hook.async, true);
86
+ assert.equal(hook.asyncRewake, false);
87
+ }
88
+ const localPreview = createOpenPetsHookSettingsPreview("local");
89
+ const localHook = (localPreview.hooks.Stop[0]?.hooks[0]);
90
+ assert.ok(localHook?.command.includes(getLocalClaudeCliPath()));
91
+ assert.ok(localHook?.command.includes(openPetsHookMarker));
92
+ const bundledPreview = createOpenPetsHookSettingsPreview("bundled");
93
+ const bundledHook = (bundledPreview.hooks.Stop[0]?.hooks[0]);
94
+ assert.ok(bundledHook?.command.includes(getBundledClaudeCliPath()));
95
+ assert.ok(bundledHook?.command.includes(openPetsHookMarker));
96
+ assert.ok(createOpenPetsHookCommand("published", "fixer").endsWith("--openpets-managed --pet fixer"));
97
+ const petPreview = createOpenPetsHookSettingsPreview("published", "fixer");
98
+ const petHook = (petPreview.hooks.UserPromptSubmit[0]?.hooks[0]);
99
+ assert.ok(petHook?.command.includes("--pet fixer"));
100
+ const settings = { theme: "dark", hooks: { PreToolUse: [{ matcher: "Bash", hooks: [{ type: "command", command: "echo safe" }] }] } };
101
+ const installed = addOpenPetsHooks(settings);
102
+ assert.equal(doctorStatus(installed), "installed");
103
+ const installedForFixer = addOpenPetsHooks(settings, "published", "fixer");
104
+ assert.equal(doctorStatus(installedForFixer, "fixer"), "installed");
105
+ assert.equal(doctorStatus(installedForFixer), "needs_update");
106
+ assert.ok(doctorClaudeHooks(doctorStatusPath(installedForFixer), "published", "fixer").message.includes("Hook events target fixer."));
107
+ const reinstalled = addOpenPetsHooks(removeOpenPetsHooks(installed));
108
+ assert.deepEqual(reinstalled, installed);
109
+ const uninstalled = removeOpenPetsHooks(installed);
110
+ assert.deepEqual(uninstalled, settings);
111
+ assert.throws(() => addOpenPetsHooks({ hooks: { UserPromptSubmit: { bad: true } } }));
112
+ const stale = addOpenPetsHooks({});
113
+ stale.hooks.Stop.push({ hooks: [{ type: "command", command: "npx -y @open-pets/claude hook --openpets-managed --old" }] });
114
+ const stalePath = join(dir, "stale-settings.json");
115
+ writeFileSync(stalePath, JSON.stringify(stale), "utf8");
116
+ assert.equal(doctorClaudeHooks(stalePath).status, "needs_update");
117
+ assert.equal(installClaudeHooks(stalePath).status, "installed");
118
+ const settingsPath = join(dir, "settings.json");
119
+ writeFileSync(settingsPath, JSON.stringify(settings), "utf8");
120
+ assert.equal(doctorClaudeHooks(settingsPath).status, "not_installed");
121
+ assert.equal(installClaudeHooks(settingsPath).status, "installed");
122
+ assert.equal(installClaudeHooks(settingsPath).changed, false);
123
+ assert.equal(uninstallClaudeHooks(settingsPath).status, "not_installed");
124
+ assert.equal(uninstallClaudeHooks(settingsPath).changed, false);
125
+ writeFileSync(settingsPath, JSON.stringify({ hooks: [] }), "utf8");
126
+ assert.equal(doctorClaudeHooks(settingsPath).status, "error");
127
+ writeFileSync(settingsPath, JSON.stringify({ hooks: { Stop: { bad: true } } }), "utf8");
128
+ assert.equal(doctorClaudeHooks(settingsPath).status, "error");
129
+ const symlinkPath = join(dir, "settings-link.json");
130
+ symlinkSync(settingsPath, symlinkPath);
131
+ assert.equal(doctorClaudeHooks(symlinkPath).status, "error");
132
+ process.env.OPENPETS_DISABLE_CLAUDE_ASYNC_HOOKS = "1";
133
+ assert.throws(() => installClaudeHooks(join(dir, "async-disabled.json")));
134
+ delete process.env.OPENPETS_DISABLE_CLAUDE_ASYNC_HOOKS;
135
+ const isolatedEnv = { ...process.env, OPENPETS_DISCOVERY_FILE: join(dir, "missing-ipc.json") };
136
+ 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 });
137
+ assert.equal(normalHook.status, 0);
138
+ assert.equal(normalHook.stdout, "");
139
+ 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 });
140
+ assert.equal(petHookRun.status, 0);
141
+ assert.equal(petHookRun.stdout, "");
142
+ 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 });
143
+ assert.equal(invalidPetHook.status, 1);
144
+ 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 });
145
+ assert.equal(missingPetHook.status, 1);
146
+ const malformedHook = spawnSync(process.execPath, [new URL("./cli.js", import.meta.url).pathname, "hook", "--openpets-managed"], { input: "not json", encoding: "utf8", env: isolatedEnv });
147
+ assert.equal(malformedHook.status, 0);
148
+ assert.equal(malformedHook.stdout, "");
149
+ }
150
+ finally {
151
+ rmSync(dir, { recursive: true, force: true });
152
+ }
153
+ console.error("Claude hooks validation passed.");
154
+ function doctorStatus(value, selectedPetId) {
155
+ const path = doctorStatusPath(value);
156
+ return doctorClaudeHooks(path, "published", selectedPetId).status;
157
+ }
158
+ function doctorStatusPath(value) {
159
+ const path = join(dir, `settings-${Math.random()}.json`);
160
+ writeFileSync(path, JSON.stringify(value), "utf8");
161
+ return path;
162
+ }
163
+ //# 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 = "@open-pets/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: "npx" | "node";
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): ClaudeMcpPreview;
33
+ export declare function buildOpenPetsMcpArgs(selectedPetId?: string): readonly string[];
34
+ export declare function buildOpenPetsMcpServerCommand(selectedPetId?: string, commandMode?: OpenPetsCommandMode): {
35
+ readonly command: "npx" | "node";
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): ParsedClaudeMcpEntry;
47
+ export declare function classifyClaudeMcpStatus(listOutput: string, getOutput: string | undefined, expectedPetId?: string, commandMode?: OpenPetsCommandMode): 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,mBAAmB,CAAC;AACvD,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,KAAK,GAAG,MAAM,CAAC;gBACjC,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,GAAG,gBAAgB,CAqB9H;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,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,GAAG,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAS5L;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,GAAG,oBAAoB,CAwBpJ;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,GAAE,mBAAiC,GAAG,oBAAoB,CAMvL;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAEvE"}
@@ -0,0 +1,222 @@
1
+ import { dirname, isAbsolute, join, relative } from "node:path";
2
+ import { fileURLToPath } from "node:url";
3
+ import { lstatSync, realpathSync, statSync } from "node:fs";
4
+ export const claudeMcpServerName = "openpets";
5
+ export const openPetsMcpPackageName = "@open-pets/mcp";
6
+ export function buildClaudeMcpPreview(selectedPetId, commandMode = "published") {
7
+ const server = buildOpenPetsMcpServerCommand(selectedPetId, commandMode);
8
+ const addArgs = ["mcp", "add", "--scope", "user", claudeMcpServerName, "--", server.command, ...server.args];
9
+ const removeArgs = ["mcp", "remove", "--scope", "user", claudeMcpServerName];
10
+ const add = { command: "claude", args: addArgs };
11
+ return {
12
+ commandMode,
13
+ add,
14
+ remove: { command: "claude", args: removeArgs },
15
+ mcpJson: {
16
+ mcpServers: {
17
+ openpets: {
18
+ type: "stdio",
19
+ command: server.command,
20
+ args: server.args,
21
+ },
22
+ },
23
+ },
24
+ displayCommand: formatCommandForDisplay(add),
25
+ };
26
+ }
27
+ export function buildOpenPetsMcpArgs(selectedPetId) {
28
+ if (selectedPetId === undefined)
29
+ return ["-y", openPetsMcpPackageName];
30
+ validateOpenPetsPetArg(selectedPetId);
31
+ return ["-y", openPetsMcpPackageName, "--pet", selectedPetId];
32
+ }
33
+ export function buildOpenPetsMcpServerCommand(selectedPetId, commandMode = "published") {
34
+ if (commandMode === "local" || commandMode === "bundled") {
35
+ const entryPath = commandMode === "bundled" ? getBundledMcpEntryPath() : getLocalMcpEntryPath();
36
+ commandMode === "bundled" ? assertBundledMcpEntryPath() : assertLocalMcpEntryPath();
37
+ if (selectedPetId === undefined)
38
+ return { command: "node", args: [entryPath] };
39
+ validateOpenPetsPetArg(selectedPetId);
40
+ return { command: "node", args: [entryPath, "--pet", selectedPetId] };
41
+ }
42
+ return { command: "npx", args: buildOpenPetsMcpArgs(selectedPetId) };
43
+ }
44
+ export function assertLocalMcpEntryPath() {
45
+ assertSafeLocalDistFile(getLocalMcpEntryPath(), "MCP entry");
46
+ }
47
+ export function getLocalMcpEntryPath() {
48
+ return getSiblingMcpEntryPath();
49
+ }
50
+ export function getBundledMcpEntryPath() {
51
+ return mapAsarPathToUnpacked(getSiblingMcpEntryPath());
52
+ }
53
+ export function mapAsarPathToUnpacked(path) {
54
+ return path.replace(/(^|[\\/])app\.asar(?=$|[\\/])/, "$1app.asar.unpacked");
55
+ }
56
+ function getSiblingMcpEntryPath() {
57
+ const here = dirname(fileURLToPath(import.meta.url));
58
+ return join(here, "..", "..", "mcp", "dist", "index.js");
59
+ }
60
+ export function assertBundledMcpEntryPath() {
61
+ assertSafeBundledDistFile(getBundledMcpEntryPath(), "MCP entry");
62
+ }
63
+ export function buildClaudeMcpGetCommand() {
64
+ return { command: "claude", args: ["mcp", "get", claudeMcpServerName] };
65
+ }
66
+ export function validateOpenPetsPetArg(value) {
67
+ const trimmed = value.trim();
68
+ if (trimmed !== value || trimmed.length < 1)
69
+ throw new Error("Invalid OpenPets pet id.");
70
+ if (!/^[a-z0-9][a-z0-9_-]{0,63}$/.test(trimmed))
71
+ throw new Error("Invalid OpenPets pet id.");
72
+ return trimmed;
73
+ }
74
+ export function parseClaudeMcpListOutput(output) {
75
+ const normalized = output.toLowerCase();
76
+ const present = /(^|\s|[•*-])openpets(\s|$|:|-)/m.test(normalized) || normalized.includes("openpets:");
77
+ return {
78
+ present,
79
+ source: present ? "list" : "none",
80
+ verified: false,
81
+ matchesExpected: false,
82
+ };
83
+ }
84
+ export function parseClaudeMcpGetOutput(output, expectedPetId, commandMode = "published") {
85
+ const text = output.trim();
86
+ if (!text)
87
+ return { present: false, source: "none", verified: false, matchesExpected: false };
88
+ const parsed = tryParseJson(text);
89
+ const expected = buildOpenPetsMcpServerCommand(expectedPetId, commandMode);
90
+ const jsonEntry = parsed ? extractJsonEntry(parsed) : null;
91
+ if (jsonEntry) {
92
+ const matchesExpected = jsonEntry.command === expected.command && arraysEqual(jsonEntry.args, expected.args);
93
+ return { present: true, command: jsonEntry.command, args: jsonEntry.args, source: "get", verified: true, matchesExpected };
94
+ }
95
+ const command = extractTextCommand(text);
96
+ const args = extractTextArgs(text);
97
+ if (command && args) {
98
+ const matchesExpected = command === expected.command && arraysEqual(args, expected.args);
99
+ return { present: true, command, args, source: "get", verified: true, matchesExpected };
100
+ }
101
+ if (/openpets/i.test(text) || /@open-pets\/mcp/i.test(text)) {
102
+ return { present: true, source: "get", verified: false, matchesExpected: false };
103
+ }
104
+ return { present: false, source: "none", verified: false, matchesExpected: false };
105
+ }
106
+ export function classifyClaudeMcpStatus(listOutput, getOutput, expectedPetId, commandMode = "published") {
107
+ if (getOutput) {
108
+ const parsedGet = parseClaudeMcpGetOutput(getOutput, expectedPetId, commandMode);
109
+ if (parsedGet.present)
110
+ return parsedGet;
111
+ }
112
+ return parseClaudeMcpListOutput(listOutput);
113
+ }
114
+ export function formatCommandForDisplay(spec) {
115
+ return [spec.command, ...spec.args].map(quoteArg).join(" ");
116
+ }
117
+ function quoteArg(value) {
118
+ if (/^[a-zA-Z0-9_@%+=:,./-]+$/.test(value))
119
+ return value;
120
+ if (/[\r\n"]/.test(value) || value.includes("\0"))
121
+ throw new Error("Command argument contains unsupported shell characters.");
122
+ return `"${value.replaceAll("\\", "\\\\").replaceAll("$", "\\$").replaceAll("`", "\\`")}"`;
123
+ }
124
+ function tryParseJson(value) {
125
+ try {
126
+ return JSON.parse(value);
127
+ }
128
+ catch {
129
+ return null;
130
+ }
131
+ }
132
+ function extractJsonEntry(value) {
133
+ const record = isRecord(value) ? value : null;
134
+ const maybeEntry = record && isRecord(record.mcpServers) && isRecord(record.mcpServers.openpets)
135
+ ? record.mcpServers.openpets
136
+ : record;
137
+ if (!isRecord(maybeEntry) || typeof maybeEntry.command !== "string" || !Array.isArray(maybeEntry.args))
138
+ return null;
139
+ if (!maybeEntry.args.every((arg) => typeof arg === "string"))
140
+ return null;
141
+ return { command: maybeEntry.command, args: maybeEntry.args };
142
+ }
143
+ function extractTextCommand(value) {
144
+ const match = value.match(/(?:^|\n)\s*Command\s*:\s*([^\s\n]+)/i) ?? value.match(/(?:^|\n)\s*command\s+([^\s\n]+)/i);
145
+ return match?.[1];
146
+ }
147
+ function extractTextArgs(value) {
148
+ const jsonArgs = value.match(/(?:^|\n)\s*Args\s*:\s*(\[[^\n]+\])/i);
149
+ if (jsonArgs?.[1]) {
150
+ const parsed = tryParseJson(jsonArgs[1]);
151
+ if (Array.isArray(parsed) && parsed.every((arg) => typeof arg === "string"))
152
+ return parsed;
153
+ }
154
+ const textArgs = value.match(/(?:^|\n)\s*Args\s*:\s*(.+)$/im);
155
+ if (!textArgs?.[1])
156
+ return undefined;
157
+ return splitSimpleArgs(textArgs[1]);
158
+ }
159
+ function splitSimpleArgs(value) {
160
+ const args = [];
161
+ let current = "";
162
+ let quote = null;
163
+ for (let index = 0; index < value.length; index += 1) {
164
+ const char = value[index];
165
+ if (quote) {
166
+ if (char === quote)
167
+ quote = null;
168
+ else
169
+ current += char;
170
+ continue;
171
+ }
172
+ if (char === '"' || char === "'") {
173
+ quote = char;
174
+ continue;
175
+ }
176
+ if (/\s/.test(char)) {
177
+ if (current) {
178
+ args.push(current);
179
+ current = "";
180
+ }
181
+ continue;
182
+ }
183
+ current += char;
184
+ }
185
+ if (current)
186
+ args.push(current);
187
+ return args;
188
+ }
189
+ function arraysEqual(a, b) {
190
+ return a.length === b.length && a.every((value, index) => value === b[index]);
191
+ }
192
+ function isRecord(value) {
193
+ return typeof value === "object" && value !== null;
194
+ }
195
+ function assertSafeLocalDistFile(path, label) {
196
+ const expectedPrefix = join(dirname(fileURLToPath(import.meta.url)), "..", "..");
197
+ if (!path.startsWith(expectedPrefix))
198
+ throw new Error(`Local ${label} path is outside the OpenPets workspace.`);
199
+ const stat = statSync(path);
200
+ if (!stat.isFile())
201
+ throw new Error(`Local ${label} path is not a regular file.`);
202
+ }
203
+ function assertSafeBundledDistFile(path, label) {
204
+ if (isTrueAsarPath(path))
205
+ throw new Error(`Bundled ${label} path must be unpacked outside app.asar.`);
206
+ if (path.includes("\n") || path.includes("\r") || path.includes("\0"))
207
+ throw new Error(`Bundled ${label} path contains unsupported characters.`);
208
+ if (lstatSync(path).isSymbolicLink())
209
+ throw new Error(`Bundled ${label} path must not be a symlink.`);
210
+ const stat = statSync(path);
211
+ if (!stat.isFile())
212
+ throw new Error(`Bundled ${label} path is not a regular file.`);
213
+ const expectedRoot = realpathSync(mapAsarPathToUnpacked(join(dirname(fileURLToPath(import.meta.url)), "..", "..")));
214
+ const realPath = realpathSync(path);
215
+ const rel = relative(expectedRoot, realPath);
216
+ if (rel.startsWith("..") || isAbsolute(rel))
217
+ throw new Error(`Bundled ${label} path is outside the packaged OpenPets resources.`);
218
+ }
219
+ function isTrueAsarPath(path) {
220
+ return /app\.asar(?:$|[\\/])/.test(path) && !/app\.asar\.unpacked(?:$|[\\/])/.test(path);
221
+ }
222
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../src/claude-code.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}