@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
|
@@ -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 = "@burmese/mcp";
|
|
6
|
+
export function buildClaudeMcpPreview(selectedPetId, commandMode = "published", nodeCommand = "node") {
|
|
7
|
+
const server = buildOpenPetsMcpServerCommand(selectedPetId, commandMode, nodeCommand);
|
|
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", nodeCommand = "node") {
|
|
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: nodeCommand, args: [entryPath] };
|
|
39
|
+
validateOpenPetsPetArg(selectedPetId);
|
|
40
|
+
return { command: nodeCommand, 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", nodeCommand = "node") {
|
|
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, nodeCommand);
|
|
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) || /@(?:burmese|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", nodeCommand = "node") {
|
|
107
|
+
if (getOutput) {
|
|
108
|
+
const parsedGet = parseClaudeMcpGetOutput(getOutput, expectedPetId, commandMode, nodeCommand);
|
|
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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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ClaudeHookOptions } from "./hooks.js";
|
|
2
|
+
export declare function readHookCliOptions(args: readonly string[]): Pick<ClaudeHookOptions, "configuredPetId" | "clientLabel" | "projectLocal" | "eventName">;
|
|
3
|
+
export declare function readPetArg(args: readonly string[]): string | undefined;
|
|
4
|
+
//# sourceMappingURL=cli-args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAuB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIzE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,aAAa,GAAG,cAAc,GAAG,WAAW,CAAC,CAOrJ;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAGtE"}
|
package/dist/cli-args.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { validateOpenPetsPetArg } from "./claude-code.js";
|
|
2
|
+
const hookEventNames = new Set(["UserPromptSubmit", "PreToolUse", "PostToolUse", "PermissionRequest", "Notification", "Stop", "StopFailure"]);
|
|
3
|
+
export function readHookCliOptions(args) {
|
|
4
|
+
return {
|
|
5
|
+
configuredPetId: readPetArg(args),
|
|
6
|
+
clientLabel: readClientLabelArg(args),
|
|
7
|
+
projectLocal: args.includes("--project-local"),
|
|
8
|
+
eventName: readHookEventArg(args),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export function readPetArg(args) {
|
|
12
|
+
const value = readValueArg(args, "--pet");
|
|
13
|
+
return value ? validateOpenPetsPetArg(value) : undefined;
|
|
14
|
+
}
|
|
15
|
+
function readClientLabelArg(args) {
|
|
16
|
+
const value = readValueArg(args, "--client-label");
|
|
17
|
+
const cleaned = value?.replace(/[\x00-\x1F\x7F]/g, "").trim().slice(0, 40);
|
|
18
|
+
return cleaned || undefined;
|
|
19
|
+
}
|
|
20
|
+
function readHookEventArg(args) {
|
|
21
|
+
const value = readValueArg(args, "--hook-event");
|
|
22
|
+
if (!value)
|
|
23
|
+
return undefined;
|
|
24
|
+
if (!hookEventNames.has(value))
|
|
25
|
+
throw new Error("Invalid --hook-event.");
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
function readValueArg(args, name) {
|
|
29
|
+
const equals = args.find((arg) => arg.startsWith(`${name}=`));
|
|
30
|
+
if (equals) {
|
|
31
|
+
const value = equals.slice(name.length + 1);
|
|
32
|
+
if (!value)
|
|
33
|
+
throw new Error(`Missing value for ${name}.`);
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
const index = args.indexOf(name);
|
|
37
|
+
if (index < 0)
|
|
38
|
+
return undefined;
|
|
39
|
+
const value = args[index + 1];
|
|
40
|
+
if (!value || value.startsWith("--"))
|
|
41
|
+
throw new Error(`Missing value for ${name}.`);
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=cli-args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAsB,CAAC,kBAAkB,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;AAEnK,MAAM,UAAU,kBAAkB,CAAC,IAAuB;IACxD,OAAO;QACL,eAAe,EAAE,UAAU,CAAC,IAAI,CAAC;QACjC,WAAW,EAAE,kBAAkB,CAAC,IAAI,CAAC;QACrC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAC9C,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAuB;IAChD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAuB;IACjD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3E,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAuB;IAC/C,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAA4B,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAChG,OAAO,KAA4B,CAAC;AACtC,CAAC;AAED,SAAS,YAAY,CAAC,IAAuB,EAAE,IAAY;IACzD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;IAC9D,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,GAAG,CAAC,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,GAAG,CAAC,CAAC;IACpF,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { runClaudeHookFromStdin } from "./hooks.js";
|
|
3
|
+
import { doctorClaudeHooks, installClaudeHooks, uninstallClaudeHooks } from "./hook-settings.js";
|
|
4
|
+
import { readHookCliOptions, readPetArg } from "./cli-args.js";
|
|
5
|
+
async function main() {
|
|
6
|
+
const [command, ...args] = process.argv.slice(2);
|
|
7
|
+
if (command === "hook") {
|
|
8
|
+
const code = await runClaudeHookFromStdin(process.stdin, { ...readHookCliOptions(args), debug: process.env.OPENPETS_DEBUG === "1" });
|
|
9
|
+
process.exitCode = code;
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
if (command === "doctor-hooks") {
|
|
13
|
+
process.stderr.write(`${JSON.stringify(doctorClaudeHooks(readPathArg(args), undefined, readPetArg(args)), null, 2)}\n`);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (command === "install-hooks") {
|
|
17
|
+
process.stderr.write(`${JSON.stringify(installClaudeHooks(readPathArg(args), undefined, readPetArg(args)), null, 2)}\n`);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (command === "uninstall-hooks") {
|
|
21
|
+
process.stderr.write(`${JSON.stringify(uninstallClaudeHooks(readPathArg(args)), null, 2)}\n`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
process.stderr.write("Usage: burmese-claude <hook|doctor-hooks|install-hooks|uninstall-hooks> [--settings <path>] [--pet <id>]\n");
|
|
25
|
+
process.exitCode = 1;
|
|
26
|
+
}
|
|
27
|
+
function readPathArg(args) {
|
|
28
|
+
const index = args.indexOf("--settings");
|
|
29
|
+
const value = index >= 0 ? args[index + 1] : undefined;
|
|
30
|
+
return value && value.length > 0 ? value : undefined;
|
|
31
|
+
}
|
|
32
|
+
main().catch((error) => {
|
|
33
|
+
process.stderr.write(`OpenPets Claude CLI failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
34
|
+
process.exitCode = 1;
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AACjG,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE/D,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG,EAAE,CAAC,CAAC;QACrI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;QACxB,OAAO;IACT,CAAC;IACD,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACxH,OAAO;IACT,CAAC;IACD,IAAI,OAAO,KAAK,eAAe,EAAE,CAAC;QAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACzH,OAAO;IACT,CAAC;IACD,IAAI,OAAO,KAAK,iBAAiB,EAAE,CAAC;QAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9F,OAAO;IACT,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4GAA4G,CAAC,CAAC;IACnI,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,WAAW,CAAC,IAAuB;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,OAAO,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChH,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type ClaudeCommandSpec } from "./claude-code.js";
|
|
2
|
+
export declare const codexMcpServerName = "openpets";
|
|
3
|
+
export declare const codexManagedBlockStart = "# OPENPETS:CODEX:START";
|
|
4
|
+
export declare const codexManagedBlockEnd = "# OPENPETS:CODEX:END";
|
|
5
|
+
export declare const codexHookEvents: readonly ["UserPromptSubmit", "PreToolUse", "PostToolUse", "PermissionRequest", "Stop"];
|
|
6
|
+
export declare const codexClientLabel = "Codex";
|
|
7
|
+
export type CodexSetupStatus = "not_installed" | "installed" | "needs_update" | "custom" | "error";
|
|
8
|
+
export type CodexHookTrustStatus = "unknown" | "pending" | "trusted";
|
|
9
|
+
export interface CodexSetupStatusResult {
|
|
10
|
+
readonly status: CodexSetupStatus;
|
|
11
|
+
readonly message: string;
|
|
12
|
+
readonly configPath: string;
|
|
13
|
+
readonly canInstall: boolean;
|
|
14
|
+
readonly canReplace: boolean;
|
|
15
|
+
readonly canRemove: boolean;
|
|
16
|
+
readonly hookTrustStatus: CodexHookTrustStatus;
|
|
17
|
+
readonly hookTrustMessage: string;
|
|
18
|
+
}
|
|
19
|
+
export interface CodexConfigOptions {
|
|
20
|
+
readonly mcpCommand: ClaudeCommandSpec;
|
|
21
|
+
readonly hookCommand: ClaudeCommandSpec;
|
|
22
|
+
}
|
|
23
|
+
export declare function getCodexUserConfigPath(homeDir?: string): string;
|
|
24
|
+
export declare function buildCodexConfigBlock(options: CodexConfigOptions): string;
|
|
25
|
+
export declare function classifyCodexConfigText(text: string, configPath: string): CodexSetupStatusResult;
|
|
26
|
+
export declare function doctorCodexConfig(configPath?: string): CodexSetupStatusResult;
|
|
27
|
+
export declare function updateCodexConfigText(text: string, options: CodexConfigOptions, force?: boolean): string;
|
|
28
|
+
export declare function removeCodexConfigText(text: string): string;
|
|
29
|
+
export declare function writeCodexConfig(configPath: string, content: string): void;
|
|
30
|
+
export declare function assertSafeCodexConfigPath(configPath: string): void;
|
|
31
|
+
export declare function validateCodexPetArg(value: string): string;
|
|
32
|
+
//# sourceMappingURL=codex-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-code.d.ts","sourceRoot":"","sources":["../src/codex-code.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmD,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG3G,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAC7C,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAC/D,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAC3D,eAAO,MAAM,eAAe,yFAA0F,CAAC;AAGvH,eAAO,MAAM,gBAAgB,UAAU,CAAC;AAExC,MAAM,MAAM,gBAAgB,GAAG,eAAe,GAAG,WAAW,GAAG,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;AACnG,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAErE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,oBAAoB,CAAC;IAC/C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;CACzC;AAED,wBAAgB,sBAAsB,CAAC,OAAO,SAAY,GAAG,MAAM,CAElE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAyBzE;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,sBAAsB,CAkBhG;AAED,wBAAgB,iBAAiB,CAAC,UAAU,SAA2B,GAAG,sBAAsB,CAM/F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,KAAK,UAAQ,GAAG,MAAM,CAQtG;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAM1E;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAIlE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { existsSync, lstatSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { formatCommandForDisplay, validateOpenPetsPetArg } from "./claude-code.js";
|
|
5
|
+
import { openPetsHookMarker } from "./hook-settings.js";
|
|
6
|
+
export const codexMcpServerName = "openpets";
|
|
7
|
+
export const codexManagedBlockStart = "# OPENPETS:CODEX:START";
|
|
8
|
+
export const codexManagedBlockEnd = "# OPENPETS:CODEX:END";
|
|
9
|
+
export const codexHookEvents = ["UserPromptSubmit", "PreToolUse", "PostToolUse", "PermissionRequest", "Stop"];
|
|
10
|
+
// Label Codex hooks carry so the desktop roster attributes them to Codex, not
|
|
11
|
+
// the default "Claude". Shared by generation and detection so they can't drift.
|
|
12
|
+
export const codexClientLabel = "Codex";
|
|
13
|
+
export function getCodexUserConfigPath(homeDir = homedir()) {
|
|
14
|
+
return join(homeDir, ".codex", "config.toml");
|
|
15
|
+
}
|
|
16
|
+
export function buildCodexConfigBlock(options) {
|
|
17
|
+
const lines = [
|
|
18
|
+
codexManagedBlockStart,
|
|
19
|
+
"# Managed by OpenPets. Rerun setup instead of editing this block.",
|
|
20
|
+
`[mcp_servers.${codexMcpServerName}]`,
|
|
21
|
+
`command = ${tomlString(options.mcpCommand.command)}`,
|
|
22
|
+
`args = ${tomlStringArray(options.mcpCommand.args)}`,
|
|
23
|
+
"",
|
|
24
|
+
];
|
|
25
|
+
for (const event of codexHookEvents) {
|
|
26
|
+
const command = formatCommandForDisplay({ command: options.hookCommand.command, args: [...options.hookCommand.args, "--client-label", codexClientLabel, "--hook-event", event] });
|
|
27
|
+
lines.push(`[[hooks.${event}]]`, `[[hooks.${event}.hooks]]`, `type = "command"`, `command = ${tomlString(`${command}; exit 0`)}`, `timeout = 10`, `statusMessage = "Updating OpenPets"`, "");
|
|
28
|
+
}
|
|
29
|
+
lines.push(codexManagedBlockEnd, "");
|
|
30
|
+
return lines.join("\n");
|
|
31
|
+
}
|
|
32
|
+
export function classifyCodexConfigText(text, configPath) {
|
|
33
|
+
if (!text.trim())
|
|
34
|
+
return createCodexStatus("not_installed", "Codex OpenPets setup is not installed.", configPath);
|
|
35
|
+
const block = extractManagedBlock(text);
|
|
36
|
+
if (block) {
|
|
37
|
+
// A managed block from before the roster client-label change has the hook
|
|
38
|
+
// marker but no `--client-label Codex`; flag it needs_update so the user
|
|
39
|
+
// reinstalls and the desktop can attribute Codex rows correctly.
|
|
40
|
+
const installed = block.includes(`[mcp_servers.${codexMcpServerName}]`) && block.includes(openPetsHookMarker) && block.includes(`--client-label ${codexClientLabel}`);
|
|
41
|
+
const trust = installed ? classifyCodexHookTrustText(text, configPath) : createCodexHookTrust("unknown", "Hook permission status is unavailable until Codex OpenPets setup is installed.");
|
|
42
|
+
const message = installed && trust.status === "trusted"
|
|
43
|
+
? "Codex OpenPets setup is installed and hook permission is approved."
|
|
44
|
+
: installed
|
|
45
|
+
? "Codex OpenPets setup is installed. Hook permission is pending until the OpenPets hooks are approved in Codex."
|
|
46
|
+
: "Codex OpenPets setup needs update.";
|
|
47
|
+
return createCodexStatus(installed ? "installed" : "needs_update", message, configPath, trust);
|
|
48
|
+
}
|
|
49
|
+
if (hasCodexOpenPetsMcpTable(text))
|
|
50
|
+
return createCodexStatus("custom", "Codex has a custom openpets MCP entry. Rerun with --force to replace it.", configPath);
|
|
51
|
+
return createCodexStatus("not_installed", "Codex OpenPets setup is not installed.", configPath);
|
|
52
|
+
}
|
|
53
|
+
export function doctorCodexConfig(configPath = getCodexUserConfigPath()) {
|
|
54
|
+
try {
|
|
55
|
+
return classifyCodexConfigText(existsSync(configPath) ? readFileSync(configPath, "utf8") : "", configPath);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
return createCodexStatus("error", error instanceof Error ? error.message : "Codex config status is unavailable.", configPath);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export function updateCodexConfigText(text, options, force = false) {
|
|
62
|
+
let next = removeManagedBlock(text);
|
|
63
|
+
if (hasCodexOpenPetsMcpTable(next)) {
|
|
64
|
+
if (!force)
|
|
65
|
+
throw new Error("Codex already has a custom openpets MCP entry. Rerun with --force to replace it.");
|
|
66
|
+
next = removeTomlTable(next, `mcp_servers.${codexMcpServerName}`);
|
|
67
|
+
}
|
|
68
|
+
const trimmed = next.trimEnd();
|
|
69
|
+
return `${trimmed}${trimmed ? "\n\n" : ""}${buildCodexConfigBlock(options)}`;
|
|
70
|
+
}
|
|
71
|
+
export function removeCodexConfigText(text) {
|
|
72
|
+
return removeManagedBlock(text).trimEnd() + "\n";
|
|
73
|
+
}
|
|
74
|
+
export function writeCodexConfig(configPath, content) {
|
|
75
|
+
assertSafeCodexConfigPath(configPath);
|
|
76
|
+
mkdirSync(dirname(configPath), { recursive: true, mode: 0o700 });
|
|
77
|
+
const tempPath = `${configPath}.${process.pid}.tmp`;
|
|
78
|
+
writeFileSync(tempPath, content, { encoding: "utf8", mode: 0o600 });
|
|
79
|
+
renameSync(tempPath, configPath);
|
|
80
|
+
}
|
|
81
|
+
export function assertSafeCodexConfigPath(configPath) {
|
|
82
|
+
if (!existsSync(configPath))
|
|
83
|
+
return;
|
|
84
|
+
const stat = lstatSync(configPath);
|
|
85
|
+
if (stat.isSymbolicLink() || !stat.isFile())
|
|
86
|
+
throw new Error("Codex config path must be a regular file.");
|
|
87
|
+
}
|
|
88
|
+
export function validateCodexPetArg(value) {
|
|
89
|
+
return validateOpenPetsPetArg(value);
|
|
90
|
+
}
|
|
91
|
+
function createCodexStatus(status, message, configPath, hookTrust = createCodexHookTrust("unknown", "Hook permission status is unavailable until Codex OpenPets setup is installed.")) {
|
|
92
|
+
return {
|
|
93
|
+
status,
|
|
94
|
+
message,
|
|
95
|
+
configPath,
|
|
96
|
+
canInstall: status === "not_installed" || status === "needs_update",
|
|
97
|
+
canReplace: status === "custom" || status === "needs_update",
|
|
98
|
+
canRemove: status === "installed" || status === "needs_update",
|
|
99
|
+
hookTrustStatus: hookTrust.status,
|
|
100
|
+
hookTrustMessage: hookTrust.message,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function createCodexHookTrust(status, message) {
|
|
104
|
+
return { status, message };
|
|
105
|
+
}
|
|
106
|
+
function classifyCodexHookTrustText(text, configPath) {
|
|
107
|
+
const hookIds = findOpenPetsHookStateIds(text, configPath);
|
|
108
|
+
if (hookIds.length === 0)
|
|
109
|
+
return createCodexHookTrust("unknown", "OpenPets hooks were not found in the Codex config.");
|
|
110
|
+
const pending = hookIds.filter((hook) => !hasTrustedHookState(text, hook.stateId));
|
|
111
|
+
if (pending.length === 0)
|
|
112
|
+
return createCodexHookTrust("trusted", "Hook permission is approved in Codex.");
|
|
113
|
+
const approvalPath = configPath === getCodexUserConfigPath()
|
|
114
|
+
? "Open Codex Settings > Hooks > From Config > User config, then approve the OpenPets hooks."
|
|
115
|
+
: "Run /hooks in Codex and approve the OpenPets hooks from this config.";
|
|
116
|
+
return createCodexHookTrust("pending", `Permission is pending. ${approvalPath}`);
|
|
117
|
+
}
|
|
118
|
+
function findOpenPetsHookStateIds(text, configPath) {
|
|
119
|
+
const counts = new Map();
|
|
120
|
+
const hooks = [];
|
|
121
|
+
let current;
|
|
122
|
+
for (const line of text.split(/\r?\n/)) {
|
|
123
|
+
const group = /^\s*\[\[hooks\.([A-Za-z]+)\]\]\s*$/.exec(line);
|
|
124
|
+
if (group && isCodexHookEvent(group[1])) {
|
|
125
|
+
const event = group[1];
|
|
126
|
+
const groupIndex = counts.get(event) ?? 0;
|
|
127
|
+
counts.set(event, groupIndex + 1);
|
|
128
|
+
current = { event, groupIndex, hookIndex: -1 };
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
const hook = /^\s*\[\[hooks\.([A-Za-z]+)\.hooks\]\]\s*$/.exec(line);
|
|
132
|
+
if (hook && current?.event === hook[1]) {
|
|
133
|
+
current = { ...current, hookIndex: current.hookIndex + 1 };
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
if (current && current.hookIndex >= 0 && line.includes(openPetsHookMarker) && line.includes(`--hook-event ${current.event}`)) {
|
|
137
|
+
hooks.push({ event: current.event, stateId: `${configPath}:${codexHookStateEventName(current.event)}:${current.groupIndex}:${current.hookIndex}` });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return hooks;
|
|
141
|
+
}
|
|
142
|
+
function isCodexHookEvent(value) {
|
|
143
|
+
return codexHookEvents.includes(value);
|
|
144
|
+
}
|
|
145
|
+
function codexHookStateEventName(event) {
|
|
146
|
+
return event.replace(/([a-z0-9])([A-Z])/g, "$1_$2").toLowerCase();
|
|
147
|
+
}
|
|
148
|
+
function hasTrustedHookState(text, stateId) {
|
|
149
|
+
const header = new RegExp(`^\\s*\\[hooks\\.state\\.${escapeRegExp(tomlString(stateId))}\\]\\s*$`, "m").exec(text);
|
|
150
|
+
if (!header)
|
|
151
|
+
return false;
|
|
152
|
+
const rest = text.slice(header.index + header[0].length);
|
|
153
|
+
const nextTable = /\n\s*\[/.exec(rest);
|
|
154
|
+
const table = nextTable ? rest.slice(0, nextTable.index) : rest;
|
|
155
|
+
return /^\s*trusted_hash\s*=\s*"sha256:[a-f0-9]{64}"\s*$/im.test(table);
|
|
156
|
+
}
|
|
157
|
+
function extractManagedBlock(text) {
|
|
158
|
+
const start = text.indexOf(codexManagedBlockStart);
|
|
159
|
+
const end = text.indexOf(codexManagedBlockEnd, start);
|
|
160
|
+
if (start < 0 || end < 0)
|
|
161
|
+
return undefined;
|
|
162
|
+
return text.slice(start, end + codexManagedBlockEnd.length);
|
|
163
|
+
}
|
|
164
|
+
function removeManagedBlock(text) {
|
|
165
|
+
const start = text.indexOf(codexManagedBlockStart);
|
|
166
|
+
const end = text.indexOf(codexManagedBlockEnd, start);
|
|
167
|
+
if (start < 0 || end < 0)
|
|
168
|
+
return text;
|
|
169
|
+
return `${text.slice(0, start)}${text.slice(end + codexManagedBlockEnd.length)}`.replace(/\n{3,}/g, "\n\n");
|
|
170
|
+
}
|
|
171
|
+
function hasCodexOpenPetsMcpTable(text) {
|
|
172
|
+
return new RegExp(`^\\s*\\[${escapeRegExp(`mcp_servers.${codexMcpServerName}`)}\\]\\s*$`, "m").test(text);
|
|
173
|
+
}
|
|
174
|
+
function removeTomlTable(text, table) {
|
|
175
|
+
const lines = text.split(/\r?\n/);
|
|
176
|
+
const header = new RegExp(`^\\s*\\[${escapeRegExp(table)}\\]\\s*$`);
|
|
177
|
+
const nextHeader = /^\s*\[[^\]]+\]\s*$/;
|
|
178
|
+
const output = [];
|
|
179
|
+
let removing = false;
|
|
180
|
+
for (const line of lines) {
|
|
181
|
+
if (header.test(line)) {
|
|
182
|
+
removing = true;
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (removing && nextHeader.test(line))
|
|
186
|
+
removing = false;
|
|
187
|
+
if (!removing)
|
|
188
|
+
output.push(line);
|
|
189
|
+
}
|
|
190
|
+
return output.join("\n");
|
|
191
|
+
}
|
|
192
|
+
function tomlString(value) {
|
|
193
|
+
return JSON.stringify(value);
|
|
194
|
+
}
|
|
195
|
+
function tomlStringArray(values) {
|
|
196
|
+
return `[${values.map(tomlString).join(", ")}]`;
|
|
197
|
+
}
|
|
198
|
+
function escapeRegExp(value) {
|
|
199
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=codex-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-code.js","sourceRoot":"","sources":["../src/codex-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-messages.d.ts","sourceRoot":"","sources":["../src/hook-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-messages.js","sourceRoot":"","sources":["../src/hook-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAA2B,MAAM,uBAAuB,CAAC"}
|