@scotthuang/agent-knock-knock 0.3.2 → 0.4.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/CHANGELOG.md +9 -571
- package/README.md +97 -123
- package/dist/src/agent-session-provider.d.ts +1 -2
- package/dist/src/approval-policy.d.ts +1 -1
- package/dist/src/approval-policy.js +1 -1
- package/dist/src/approval-policy.js.map +1 -1
- package/dist/src/claude-terminal-agent-adapter.d.ts +2 -17
- package/dist/src/claude-terminal-agent-adapter.js +4 -489
- package/dist/src/claude-terminal-agent-adapter.js.map +1 -1
- package/dist/src/cli.js +1489 -3406
- package/dist/src/cli.js.map +1 -1
- package/dist/src/codex-local-session-provider.d.ts +1 -2
- package/dist/src/codex-local-session-provider.js +1 -9
- package/dist/src/codex-local-session-provider.js.map +1 -1
- package/dist/src/codex-session-provider.d.ts +1 -8
- package/dist/src/codex-session-provider.js +0 -56
- package/dist/src/codex-session-provider.js.map +1 -1
- package/dist/src/codex-terminal-agent-adapter.d.ts +1 -1
- package/dist/src/doctor-capabilities.d.ts +5 -13
- package/dist/src/doctor-capabilities.js +15 -60
- package/dist/src/doctor-capabilities.js.map +1 -1
- package/dist/src/executors.d.ts +5 -51
- package/dist/src/executors.js +4 -68
- package/dist/src/executors.js.map +1 -1
- package/dist/src/openclaw-doctor.d.ts +1 -1
- package/dist/src/openclaw-doctor.js +1 -1
- package/dist/src/openclaw-doctor.js.map +1 -1
- package/dist/src/openclaw-plugin-helpers.d.ts +5 -8
- package/dist/src/openclaw-plugin-helpers.js +57 -40
- package/dist/src/openclaw-plugin-helpers.js.map +1 -1
- package/dist/src/openclaw-plugin.js +138 -248
- package/dist/src/openclaw-plugin.js.map +1 -1
- package/dist/src/protocol.d.ts +1 -5
- package/dist/src/protocol.js +1 -1
- package/dist/src/protocol.js.map +1 -1
- package/dist/src/session-selector.js +1 -1
- package/dist/src/session-selector.js.map +1 -1
- package/dist/src/terminal-agent-adapter.d.ts +3 -17
- package/dist/src/terminal-agent-adapter.js.map +1 -1
- package/dist/src/terminal-agent-bridge.d.ts +3 -3
- package/dist/src/terminal-agent-bridge.js +0 -75
- package/dist/src/terminal-agent-bridge.js.map +1 -1
- package/dist/src/transcript.js +2 -3
- package/dist/src/transcript.js.map +1 -1
- package/docs/quickstart-tmux.md +7 -7
- package/openclaw.plugin.json +4 -83
- package/package.json +7 -15
- package/templates/openclaw-skills/agent-knock-knock/SKILL.md +94 -147
- package/dist/src/acpx-output.d.ts +0 -18
- package/dist/src/acpx-output.js +0 -223
- package/dist/src/acpx-output.js.map +0 -1
- package/dist/src/bootstrap.d.ts +0 -8
- package/dist/src/bootstrap.js +0 -45
- package/dist/src/bootstrap.js.map +0 -1
- package/dist/src/claude-hook-installer.d.ts +0 -65
- package/dist/src/claude-hook-installer.js +0 -410
- package/dist/src/claude-hook-installer.js.map +0 -1
- package/dist/src/claude-hook-protocol.d.ts +0 -89
- package/dist/src/claude-hook-protocol.js +0 -243
- package/dist/src/claude-hook-protocol.js.map +0 -1
- package/dist/src/claude-hook-store.d.ts +0 -247
- package/dist/src/claude-hook-store.js +0 -1075
- package/dist/src/claude-hook-store.js.map +0 -1
- package/dist/src/session-takeover-planner.d.ts +0 -37
- package/dist/src/session-takeover-planner.js +0 -57
- package/dist/src/session-takeover-planner.js.map +0 -1
- package/docs/quickstart-managed-acpx.md +0 -43
- package/scripts/smoke-acpx.js +0 -139
- package/scripts/smoke-tmux.js +0 -140
package/dist/src/bootstrap.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
export function claudeBootstrapPrompt(options) {
|
|
2
|
-
return executorBootstrapPrompt({
|
|
3
|
-
executorName: "Claude Code",
|
|
4
|
-
...options
|
|
5
|
-
});
|
|
6
|
-
}
|
|
7
|
-
export function executorBootstrapPrompt({ callbackCommand, executorName = "the coding agent", softLimit = 50, hardLimit = 100 }) {
|
|
8
|
-
return `You are ${executorName}, the autonomous engineering implementation agent managed by OpenClaw.
|
|
9
|
-
|
|
10
|
-
OpenClaw owns product direction, requirements interpretation, acceptance criteria, and delivery tradeoffs. Treat OpenClaw as the product manager and final product decision maker.
|
|
11
|
-
|
|
12
|
-
You own engineering execution. You may directly read and edit files, run commands, fix tests, and complete the assigned development task.
|
|
13
|
-
|
|
14
|
-
Use the fewest response-requiring rounds possible. Decide ordinary implementation details yourself when they do not affect product behavior, scope, user experience, acceptance criteria, or delivery risk.
|
|
15
|
-
|
|
16
|
-
Send question or blocked messages when:
|
|
17
|
-
- requirements are ambiguous or conflict
|
|
18
|
-
- product behavior, UX, scope, or acceptance criteria need interpretation
|
|
19
|
-
- an engineering problem requires a product compromise, degraded behavior, narrower scope, workaround, or changed delivery standard
|
|
20
|
-
- architecture, risk, permission, dependency, or environment decisions affect the final product
|
|
21
|
-
- you cannot continue without OpenClaw's decision
|
|
22
|
-
|
|
23
|
-
After OpenClaw answers, implement according to OpenClaw's product decision even if there are multiple engineering alternatives.
|
|
24
|
-
|
|
25
|
-
Progress reports must use type=progress and requires_response=false.
|
|
26
|
-
|
|
27
|
-
When complete, send type=done with:
|
|
28
|
-
- what changed
|
|
29
|
-
- how it was verified
|
|
30
|
-
- any remaining issues
|
|
31
|
-
|
|
32
|
-
Response budget:
|
|
33
|
-
- soft limit: ${softLimit}
|
|
34
|
-
- hard limit: ${hardLimit}
|
|
35
|
-
- after 30 response rounds, converge and choose the shortest completion path
|
|
36
|
-
- after 40 response rounds, finish, degrade, or provide a failure reason within 10 response rounds
|
|
37
|
-
|
|
38
|
-
Send messages back to OpenClaw by executing this command with a single structured JSON message as the final argument:
|
|
39
|
-
|
|
40
|
-
${callbackCommand}
|
|
41
|
-
|
|
42
|
-
Replace <structured-message-json> with one shell-quoted JSON object. If the JSON contains single quotes, escape them using standard shell quoting before executing the command.
|
|
43
|
-
`;
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,qBAAqB,CAAC,OAAqD;IACzF,OAAO,uBAAuB,CAAC;QAC7B,YAAY,EAAE,aAAa;QAC3B,GAAG,OAAO;KACX,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,EAAE,eAAe,EAAE,YAAY,GAAG,kBAAkB,EAAE,SAAS,GAAG,EAAE,EAAE,SAAS,GAAG,GAAG,EAA0B;IACrJ,OAAO,WAAW,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;gBAyBhB,SAAS;gBACT,SAAS;;;;;;EAMvB,eAAe;;;CAGhB,CAAC;AACF,CAAC"}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
export declare const CLAUDE_HOOK_EVENT_NAMES: readonly ["SessionStart", "UserPromptSubmit", "PermissionRequest", "Stop", "StopFailure", "Notification"];
|
|
2
|
-
export type InstalledClaudeHookEventName = typeof CLAUDE_HOOK_EVENT_NAMES[number];
|
|
3
|
-
export interface InstallClaudeHooksOptions {
|
|
4
|
-
/** Absolute path to the agent-knock-knock executable. */
|
|
5
|
-
executablePath: string;
|
|
6
|
-
/** Defaults to ~/.claude/settings.json. */
|
|
7
|
-
settingsPath?: string;
|
|
8
|
-
/** Computes and returns a summary without creating or changing any files. */
|
|
9
|
-
dryRun?: boolean;
|
|
10
|
-
/** Injectable for deterministic backup names in tests. */
|
|
11
|
-
now?: () => Date;
|
|
12
|
-
}
|
|
13
|
-
export interface ClaudeHookInstallSummary {
|
|
14
|
-
addedCount: number;
|
|
15
|
-
existingCount: number;
|
|
16
|
-
warningCount: number;
|
|
17
|
-
}
|
|
18
|
-
export interface InstallClaudeHooksResult {
|
|
19
|
-
settingsPath: string;
|
|
20
|
-
changed: boolean;
|
|
21
|
-
written: boolean;
|
|
22
|
-
dryRun: boolean;
|
|
23
|
-
created: boolean;
|
|
24
|
-
backupPath?: string;
|
|
25
|
-
addedEvents: InstalledClaudeHookEventName[];
|
|
26
|
-
existingEvents: InstalledClaudeHookEventName[];
|
|
27
|
-
warnings: string[];
|
|
28
|
-
summary: ClaudeHookInstallSummary;
|
|
29
|
-
}
|
|
30
|
-
export interface MergeClaudeHookSettingsResult {
|
|
31
|
-
settings: Record<string, unknown>;
|
|
32
|
-
changed: boolean;
|
|
33
|
-
addedEvents: InstalledClaudeHookEventName[];
|
|
34
|
-
existingEvents: InstalledClaudeHookEventName[];
|
|
35
|
-
warnings: string[];
|
|
36
|
-
}
|
|
37
|
-
export interface TrustedClaudeTokenjuiceLauncher {
|
|
38
|
-
/** Exact absolute path configured by the trusted Claude PreToolUse hook. */
|
|
39
|
-
configuredPath: string;
|
|
40
|
-
/** Canonical target observed while loading that configuration. */
|
|
41
|
-
canonicalPath: string;
|
|
42
|
-
}
|
|
43
|
-
/** Returns Claude Code's user settings path without reading it. */
|
|
44
|
-
export declare function defaultClaudeSettingsPath(): string;
|
|
45
|
-
/**
|
|
46
|
-
* Reads only Tokenjuice launcher provenance from Claude's trusted user settings.
|
|
47
|
-
* Invalid, missing, non-executable, or relative launchers are ignored so approval
|
|
48
|
-
* normalization fails closed without exposing settings contents.
|
|
49
|
-
*/
|
|
50
|
-
export declare function loadTrustedClaudeTokenjuiceLaunchers(settingsPath?: string): TrustedClaudeTokenjuiceLauncher[];
|
|
51
|
-
export declare function extractClaudeTokenjuiceLaunchers(settingsValue: unknown): string[];
|
|
52
|
-
/**
|
|
53
|
-
* Adds AKK matcher groups without mutating the supplied settings object.
|
|
54
|
-
* Existing groups and sibling handlers are retained byte-for-byte when the
|
|
55
|
-
* result is serialized, apart from JSON's normal formatting.
|
|
56
|
-
*/
|
|
57
|
-
export declare function mergeClaudeHookSettings(settingsValue: unknown, executablePathValue: string): MergeClaudeHookSettingsResult;
|
|
58
|
-
/**
|
|
59
|
-
* Safely installs Claude Code user hooks. This function does not log settings
|
|
60
|
-
* contents and its result contains only paths, event names, counts, and
|
|
61
|
-
* non-sensitive warnings.
|
|
62
|
-
*/
|
|
63
|
-
export declare function installClaudeHooks(options: InstallClaudeHooksOptions): InstallClaudeHooksResult;
|
|
64
|
-
/** Compatibility-friendly explicit name for callers wiring an install command. */
|
|
65
|
-
export declare const installClaudeHookSettings: typeof installClaudeHooks;
|
|
@@ -1,410 +0,0 @@
|
|
|
1
|
-
import { randomBytes } from "node:crypto";
|
|
2
|
-
import fs from "node:fs";
|
|
3
|
-
import os from "node:os";
|
|
4
|
-
import path from "node:path";
|
|
5
|
-
export const CLAUDE_HOOK_EVENT_NAMES = [
|
|
6
|
-
"SessionStart",
|
|
7
|
-
"UserPromptSubmit",
|
|
8
|
-
"PermissionRequest",
|
|
9
|
-
"Stop",
|
|
10
|
-
"StopFailure",
|
|
11
|
-
"Notification"
|
|
12
|
-
];
|
|
13
|
-
const HOOK_ARGUMENTS = ["claude-hook"];
|
|
14
|
-
const PERMISSION_STATUS_MESSAGE = "Waiting for Agent Knock Knock approval...";
|
|
15
|
-
const HOOK_DEFINITIONS = [
|
|
16
|
-
{
|
|
17
|
-
event: "SessionStart",
|
|
18
|
-
matcher: "startup|resume|clear|compact|fork",
|
|
19
|
-
timeout: 10
|
|
20
|
-
},
|
|
21
|
-
{ event: "UserPromptSubmit", timeout: 10 },
|
|
22
|
-
{ event: "PermissionRequest", matcher: "*", timeout: 600, statusMessage: PERMISSION_STATUS_MESSAGE },
|
|
23
|
-
{ event: "Stop", timeout: 10 },
|
|
24
|
-
{
|
|
25
|
-
event: "StopFailure",
|
|
26
|
-
matcher: "rate_limit|authentication_failed|oauth_org_not_allowed|billing_error|invalid_request|model_not_found|server_error|max_output_tokens|unknown",
|
|
27
|
-
timeout: 10
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
event: "Notification",
|
|
31
|
-
matcher: "permission_prompt|idle_prompt|agent_needs_input|agent_completed",
|
|
32
|
-
timeout: 10
|
|
33
|
-
}
|
|
34
|
-
];
|
|
35
|
-
/** Returns Claude Code's user settings path without reading it. */
|
|
36
|
-
export function defaultClaudeSettingsPath() {
|
|
37
|
-
return path.join(os.homedir(), ".claude", "settings.json");
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Reads only Tokenjuice launcher provenance from Claude's trusted user settings.
|
|
41
|
-
* Invalid, missing, non-executable, or relative launchers are ignored so approval
|
|
42
|
-
* normalization fails closed without exposing settings contents.
|
|
43
|
-
*/
|
|
44
|
-
export function loadTrustedClaudeTokenjuiceLaunchers(settingsPath = defaultClaudeSettingsPath()) {
|
|
45
|
-
let settings;
|
|
46
|
-
try {
|
|
47
|
-
settings = readSettings(path.resolve(settingsPath));
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
return [];
|
|
51
|
-
}
|
|
52
|
-
return extractClaudeTokenjuiceLaunchers(settings).flatMap((launcher) => {
|
|
53
|
-
try {
|
|
54
|
-
fs.accessSync(launcher, fs.constants.X_OK);
|
|
55
|
-
return [{
|
|
56
|
-
configuredPath: launcher,
|
|
57
|
-
canonicalPath: fs.realpathSync(launcher)
|
|
58
|
-
}];
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
return [];
|
|
62
|
-
}
|
|
63
|
-
}).filter((launcher, index, values) => values.findIndex((candidate) => candidate.configuredPath === launcher.configuredPath &&
|
|
64
|
-
candidate.canonicalPath === launcher.canonicalPath) === index);
|
|
65
|
-
}
|
|
66
|
-
export function extractClaudeTokenjuiceLaunchers(settingsValue) {
|
|
67
|
-
if (!isObject(settingsValue) || !isObject(settingsValue.hooks)) {
|
|
68
|
-
return [];
|
|
69
|
-
}
|
|
70
|
-
const groups = settingsValue.hooks.PreToolUse;
|
|
71
|
-
if (!Array.isArray(groups)) {
|
|
72
|
-
return [];
|
|
73
|
-
}
|
|
74
|
-
const launchers = [];
|
|
75
|
-
for (const group of groups) {
|
|
76
|
-
if (!isObject(group) || group.matcher !== "Bash" || !Array.isArray(group.hooks)) {
|
|
77
|
-
continue;
|
|
78
|
-
}
|
|
79
|
-
for (const handler of group.hooks) {
|
|
80
|
-
if (!isObject(handler) || handler.type !== "command" || typeof handler.command !== "string") {
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
const tokens = tokenizeShellWords(handler.command);
|
|
84
|
-
if (!tokens) {
|
|
85
|
-
continue;
|
|
86
|
-
}
|
|
87
|
-
const subcommandIndex = tokens.indexOf("claude-code-pre-tool-use");
|
|
88
|
-
if (subcommandIndex < 1) {
|
|
89
|
-
continue;
|
|
90
|
-
}
|
|
91
|
-
let launcher;
|
|
92
|
-
for (let index = subcommandIndex + 1; index < tokens.length; index += 1) {
|
|
93
|
-
if (tokens[index] === "--wrap-launcher") {
|
|
94
|
-
launcher = tokens[index + 1];
|
|
95
|
-
break;
|
|
96
|
-
}
|
|
97
|
-
if (tokens[index].startsWith("--wrap-launcher=")) {
|
|
98
|
-
launcher = tokens[index].slice("--wrap-launcher=".length);
|
|
99
|
-
break;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
if (launcher && path.isAbsolute(launcher)) {
|
|
103
|
-
launchers.push(path.normalize(launcher));
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return launchers.filter((launcher, index) => launchers.indexOf(launcher) === index);
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Adds AKK matcher groups without mutating the supplied settings object.
|
|
111
|
-
* Existing groups and sibling handlers are retained byte-for-byte when the
|
|
112
|
-
* result is serialized, apart from JSON's normal formatting.
|
|
113
|
-
*/
|
|
114
|
-
export function mergeClaudeHookSettings(settingsValue, executablePathValue) {
|
|
115
|
-
const executablePath = requireAbsoluteExecutable(executablePathValue);
|
|
116
|
-
const settings = requireObject(settingsValue, "Claude settings");
|
|
117
|
-
const existingHooksValue = settings.hooks;
|
|
118
|
-
const existingHooks = existingHooksValue === undefined
|
|
119
|
-
? {}
|
|
120
|
-
: requireObject(existingHooksValue, "Claude settings hooks");
|
|
121
|
-
const mergedSettings = { ...settings };
|
|
122
|
-
const mergedHooks = { ...existingHooks };
|
|
123
|
-
const addedEvents = [];
|
|
124
|
-
const existingEvents = [];
|
|
125
|
-
const warnings = [];
|
|
126
|
-
for (const definition of HOOK_DEFINITIONS) {
|
|
127
|
-
const groupsValue = existingHooks[definition.event];
|
|
128
|
-
if (groupsValue !== undefined && !Array.isArray(groupsValue)) {
|
|
129
|
-
throw new Error(`Claude settings hooks.${definition.event} must be an array`);
|
|
130
|
-
}
|
|
131
|
-
const groups = groupsValue === undefined ? [] : groupsValue;
|
|
132
|
-
const inspection = inspectEventGroups(groups, definition, executablePath);
|
|
133
|
-
warnings.push(...inspection.warnings);
|
|
134
|
-
if (inspection.hasExactHandler) {
|
|
135
|
-
existingEvents.push(definition.event);
|
|
136
|
-
continue;
|
|
137
|
-
}
|
|
138
|
-
mergedHooks[definition.event] = [
|
|
139
|
-
...groups,
|
|
140
|
-
createMatcherGroup(definition, executablePath)
|
|
141
|
-
];
|
|
142
|
-
addedEvents.push(definition.event);
|
|
143
|
-
}
|
|
144
|
-
mergedSettings.hooks = mergedHooks;
|
|
145
|
-
return {
|
|
146
|
-
settings: mergedSettings,
|
|
147
|
-
changed: addedEvents.length > 0,
|
|
148
|
-
addedEvents,
|
|
149
|
-
existingEvents,
|
|
150
|
-
warnings
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Safely installs Claude Code user hooks. This function does not log settings
|
|
155
|
-
* contents and its result contains only paths, event names, counts, and
|
|
156
|
-
* non-sensitive warnings.
|
|
157
|
-
*/
|
|
158
|
-
export function installClaudeHooks(options) {
|
|
159
|
-
const executablePath = requireAbsoluteExecutable(options.executablePath);
|
|
160
|
-
const settingsPath = path.resolve(options.settingsPath ?? defaultClaudeSettingsPath());
|
|
161
|
-
const dryRun = options.dryRun === true;
|
|
162
|
-
const exists = fs.existsSync(settingsPath);
|
|
163
|
-
const settings = exists ? readSettings(settingsPath) : {};
|
|
164
|
-
const merged = mergeClaudeHookSettings(settings, executablePath);
|
|
165
|
-
let backupPath;
|
|
166
|
-
if (merged.changed && !dryRun) {
|
|
167
|
-
const parentDirectory = path.dirname(settingsPath);
|
|
168
|
-
fs.mkdirSync(parentDirectory, { recursive: true, mode: 0o700 });
|
|
169
|
-
if (exists) {
|
|
170
|
-
backupPath = createBackup(settingsPath, options.now ?? (() => new Date()));
|
|
171
|
-
}
|
|
172
|
-
atomicWriteJson(settingsPath, merged.settings);
|
|
173
|
-
}
|
|
174
|
-
return {
|
|
175
|
-
settingsPath,
|
|
176
|
-
changed: merged.changed,
|
|
177
|
-
written: merged.changed && !dryRun,
|
|
178
|
-
dryRun,
|
|
179
|
-
created: !exists && merged.changed && !dryRun,
|
|
180
|
-
...(backupPath === undefined ? {} : { backupPath }),
|
|
181
|
-
addedEvents: merged.addedEvents,
|
|
182
|
-
existingEvents: merged.existingEvents,
|
|
183
|
-
warnings: merged.warnings,
|
|
184
|
-
summary: {
|
|
185
|
-
addedCount: merged.addedEvents.length,
|
|
186
|
-
existingCount: merged.existingEvents.length,
|
|
187
|
-
warningCount: merged.warnings.length
|
|
188
|
-
}
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
/** Compatibility-friendly explicit name for callers wiring an install command. */
|
|
192
|
-
export const installClaudeHookSettings = installClaudeHooks;
|
|
193
|
-
function createMatcherGroup(definition, executablePath) {
|
|
194
|
-
const handler = {
|
|
195
|
-
type: "command",
|
|
196
|
-
command: executablePath,
|
|
197
|
-
args: [...HOOK_ARGUMENTS],
|
|
198
|
-
timeout: definition.timeout,
|
|
199
|
-
...(definition.statusMessage === undefined ? {} : { statusMessage: definition.statusMessage })
|
|
200
|
-
};
|
|
201
|
-
return {
|
|
202
|
-
...(definition.matcher === undefined ? {} : { matcher: definition.matcher }),
|
|
203
|
-
hooks: [handler]
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
function inspectEventGroups(groups, definition, executablePath) {
|
|
207
|
-
let hasExactHandler = false;
|
|
208
|
-
let hasDifferentArguments = false;
|
|
209
|
-
let exactHandlerNeedsReview = false;
|
|
210
|
-
for (const groupValue of groups) {
|
|
211
|
-
if (!isObject(groupValue) || !Array.isArray(groupValue.hooks)) {
|
|
212
|
-
continue;
|
|
213
|
-
}
|
|
214
|
-
for (const handlerValue of groupValue.hooks) {
|
|
215
|
-
if (!isObject(handlerValue) || handlerValue.command !== executablePath) {
|
|
216
|
-
continue;
|
|
217
|
-
}
|
|
218
|
-
if (!isExactHookArguments(handlerValue.args)) {
|
|
219
|
-
hasDifferentArguments = true;
|
|
220
|
-
continue;
|
|
221
|
-
}
|
|
222
|
-
hasExactHandler = true;
|
|
223
|
-
if (!handlerMatchesDefinition(handlerValue, groupValue, definition)) {
|
|
224
|
-
exactHandlerNeedsReview = true;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
const warnings = [];
|
|
229
|
-
if (hasDifferentArguments) {
|
|
230
|
-
warnings.push(`${definition.event} contains a handler for the AKK executable with different arguments; it was preserved.`);
|
|
231
|
-
}
|
|
232
|
-
if (exactHandlerNeedsReview) {
|
|
233
|
-
warnings.push(`${definition.event} already contains the AKK claude-hook handler with non-recommended options; it was preserved.`);
|
|
234
|
-
}
|
|
235
|
-
return { hasExactHandler, warnings };
|
|
236
|
-
}
|
|
237
|
-
function handlerMatchesDefinition(handler, group, definition) {
|
|
238
|
-
const matcherMatches = definition.matcher === undefined
|
|
239
|
-
? group.matcher === undefined
|
|
240
|
-
: group.matcher === definition.matcher;
|
|
241
|
-
const statusMatches = definition.statusMessage === undefined
|
|
242
|
-
? true
|
|
243
|
-
: handler.statusMessage === definition.statusMessage;
|
|
244
|
-
return handler.type === "command" &&
|
|
245
|
-
handler.timeout === definition.timeout &&
|
|
246
|
-
matcherMatches &&
|
|
247
|
-
statusMatches;
|
|
248
|
-
}
|
|
249
|
-
function isExactHookArguments(value) {
|
|
250
|
-
return Array.isArray(value) && value.length === 1 && value[0] === HOOK_ARGUMENTS[0];
|
|
251
|
-
}
|
|
252
|
-
function tokenizeShellWords(command) {
|
|
253
|
-
const tokens = [];
|
|
254
|
-
let token = "";
|
|
255
|
-
let quote;
|
|
256
|
-
let escaped = false;
|
|
257
|
-
let started = false;
|
|
258
|
-
for (const character of command.trim()) {
|
|
259
|
-
if (escaped) {
|
|
260
|
-
token += character;
|
|
261
|
-
escaped = false;
|
|
262
|
-
started = true;
|
|
263
|
-
continue;
|
|
264
|
-
}
|
|
265
|
-
if (character === "\\" && quote !== "'") {
|
|
266
|
-
escaped = true;
|
|
267
|
-
started = true;
|
|
268
|
-
continue;
|
|
269
|
-
}
|
|
270
|
-
if (quote) {
|
|
271
|
-
if (character === quote) {
|
|
272
|
-
quote = undefined;
|
|
273
|
-
}
|
|
274
|
-
else {
|
|
275
|
-
token += character;
|
|
276
|
-
}
|
|
277
|
-
started = true;
|
|
278
|
-
continue;
|
|
279
|
-
}
|
|
280
|
-
if (character === "'" || character === '"') {
|
|
281
|
-
quote = character;
|
|
282
|
-
started = true;
|
|
283
|
-
continue;
|
|
284
|
-
}
|
|
285
|
-
if (/\s/u.test(character)) {
|
|
286
|
-
if (started) {
|
|
287
|
-
tokens.push(token);
|
|
288
|
-
token = "";
|
|
289
|
-
started = false;
|
|
290
|
-
}
|
|
291
|
-
continue;
|
|
292
|
-
}
|
|
293
|
-
token += character;
|
|
294
|
-
started = true;
|
|
295
|
-
}
|
|
296
|
-
if (escaped || quote) {
|
|
297
|
-
return undefined;
|
|
298
|
-
}
|
|
299
|
-
if (started) {
|
|
300
|
-
tokens.push(token);
|
|
301
|
-
}
|
|
302
|
-
return tokens;
|
|
303
|
-
}
|
|
304
|
-
function readSettings(settingsPath) {
|
|
305
|
-
const stat = fs.lstatSync(settingsPath);
|
|
306
|
-
if (stat.isSymbolicLink()) {
|
|
307
|
-
throw new Error(`Refusing to replace symbolic-link Claude settings: ${settingsPath}`);
|
|
308
|
-
}
|
|
309
|
-
if (!stat.isFile()) {
|
|
310
|
-
throw new Error(`Claude settings path is not a regular file: ${settingsPath}`);
|
|
311
|
-
}
|
|
312
|
-
let value;
|
|
313
|
-
try {
|
|
314
|
-
value = JSON.parse(fs.readFileSync(settingsPath, "utf8"));
|
|
315
|
-
}
|
|
316
|
-
catch {
|
|
317
|
-
throw new Error(`Claude settings JSON is invalid: ${settingsPath}`);
|
|
318
|
-
}
|
|
319
|
-
return requireObject(value, "Claude settings");
|
|
320
|
-
}
|
|
321
|
-
function createBackup(settingsPath, now) {
|
|
322
|
-
const date = now();
|
|
323
|
-
if (!(date instanceof Date) || !Number.isFinite(date.getTime())) {
|
|
324
|
-
throw new Error("Claude hook installer clock returned an invalid date");
|
|
325
|
-
}
|
|
326
|
-
const timestamp = date.toISOString().replace(/[:.]/gu, "-");
|
|
327
|
-
let suffix = 0;
|
|
328
|
-
while (true) {
|
|
329
|
-
const candidate = `${settingsPath}.bak.${timestamp}${suffix === 0 ? "" : `.${suffix}`}`;
|
|
330
|
-
let descriptor;
|
|
331
|
-
try {
|
|
332
|
-
descriptor = fs.openSync(candidate, "wx", 0o600);
|
|
333
|
-
fs.writeFileSync(descriptor, fs.readFileSync(settingsPath));
|
|
334
|
-
fs.fsyncSync(descriptor);
|
|
335
|
-
fs.closeSync(descriptor);
|
|
336
|
-
descriptor = undefined;
|
|
337
|
-
return candidate;
|
|
338
|
-
}
|
|
339
|
-
catch (error) {
|
|
340
|
-
if (descriptor !== undefined) {
|
|
341
|
-
fs.closeSync(descriptor);
|
|
342
|
-
fs.rmSync(candidate, { force: true });
|
|
343
|
-
}
|
|
344
|
-
if (isFileExistsError(error)) {
|
|
345
|
-
suffix += 1;
|
|
346
|
-
continue;
|
|
347
|
-
}
|
|
348
|
-
throw error;
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
function atomicWriteJson(filePath, value) {
|
|
353
|
-
const parentDirectory = path.dirname(filePath);
|
|
354
|
-
const temporaryPath = `${filePath}.${process.pid}.${randomBytes(8).toString("hex")}.tmp`;
|
|
355
|
-
let descriptor;
|
|
356
|
-
try {
|
|
357
|
-
descriptor = fs.openSync(temporaryPath, "wx", 0o600);
|
|
358
|
-
fs.writeFileSync(descriptor, `${JSON.stringify(value, null, 2)}\n`, "utf8");
|
|
359
|
-
fs.fsyncSync(descriptor);
|
|
360
|
-
fs.closeSync(descriptor);
|
|
361
|
-
descriptor = undefined;
|
|
362
|
-
fs.renameSync(temporaryPath, filePath);
|
|
363
|
-
fs.chmodSync(filePath, 0o600);
|
|
364
|
-
fsyncDirectory(parentDirectory);
|
|
365
|
-
}
|
|
366
|
-
finally {
|
|
367
|
-
if (descriptor !== undefined) {
|
|
368
|
-
fs.closeSync(descriptor);
|
|
369
|
-
}
|
|
370
|
-
fs.rmSync(temporaryPath, { force: true });
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
function fsyncDirectory(directoryPath) {
|
|
374
|
-
let descriptor;
|
|
375
|
-
try {
|
|
376
|
-
descriptor = fs.openSync(directoryPath, "r");
|
|
377
|
-
fs.fsyncSync(descriptor);
|
|
378
|
-
}
|
|
379
|
-
catch {
|
|
380
|
-
// Some filesystems do not support syncing directories. The rename is
|
|
381
|
-
// still atomic, and the original settings remain available as a backup.
|
|
382
|
-
}
|
|
383
|
-
finally {
|
|
384
|
-
if (descriptor !== undefined) {
|
|
385
|
-
fs.closeSync(descriptor);
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
function requireAbsoluteExecutable(value) {
|
|
390
|
-
if (typeof value !== "string" || value.trim().length === 0 || value.includes("\0")) {
|
|
391
|
-
throw new Error("Claude hook executable path must be a non-empty absolute path");
|
|
392
|
-
}
|
|
393
|
-
if (!path.isAbsolute(value)) {
|
|
394
|
-
throw new Error("Claude hook executable path must be absolute");
|
|
395
|
-
}
|
|
396
|
-
return path.normalize(value);
|
|
397
|
-
}
|
|
398
|
-
function requireObject(value, label) {
|
|
399
|
-
if (!isObject(value)) {
|
|
400
|
-
throw new Error(`${label} must be a JSON object`);
|
|
401
|
-
}
|
|
402
|
-
return value;
|
|
403
|
-
}
|
|
404
|
-
function isObject(value) {
|
|
405
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
406
|
-
}
|
|
407
|
-
function isFileExistsError(error) {
|
|
408
|
-
return isObject(error) && error.code === "EEXIST";
|
|
409
|
-
}
|
|
410
|
-
//# sourceMappingURL=claude-hook-installer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claude-hook-installer.js","sourceRoot":"","sources":["../../src/claude-hook-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
export type ClaudeHookEventName = "SessionStart" | "UserPromptSubmit" | "PermissionRequest" | "Stop" | "StopFailure" | "Notification";
|
|
2
|
-
export type ClaudeJsonValue = null | boolean | number | string | ClaudeJsonValue[] | {
|
|
3
|
-
[key: string]: ClaudeJsonValue;
|
|
4
|
-
};
|
|
5
|
-
export type ClaudeJsonObject = {
|
|
6
|
-
[key: string]: ClaudeJsonValue;
|
|
7
|
-
};
|
|
8
|
-
export interface ClaudeHookInputBase {
|
|
9
|
-
session_id: string;
|
|
10
|
-
transcript_path: string;
|
|
11
|
-
cwd: string;
|
|
12
|
-
permission_mode?: string;
|
|
13
|
-
effort?: ClaudeJsonValue;
|
|
14
|
-
agent_id?: string;
|
|
15
|
-
agent_type?: string;
|
|
16
|
-
/** Present in recent Claude Code hook payloads and useful for exact turn correlation. */
|
|
17
|
-
prompt_id?: string;
|
|
18
|
-
}
|
|
19
|
-
export interface ClaudeSessionStartHookInput extends ClaudeHookInputBase {
|
|
20
|
-
hook_event_name: "SessionStart";
|
|
21
|
-
source: "startup" | "resume" | "clear" | "compact" | "fork";
|
|
22
|
-
model?: string;
|
|
23
|
-
}
|
|
24
|
-
export interface ClaudeUserPromptSubmitHookInput extends ClaudeHookInputBase {
|
|
25
|
-
hook_event_name: "UserPromptSubmit";
|
|
26
|
-
prompt: string;
|
|
27
|
-
}
|
|
28
|
-
export interface ClaudePermissionRequestHookInput extends ClaudeHookInputBase {
|
|
29
|
-
hook_event_name: "PermissionRequest";
|
|
30
|
-
tool_name: string;
|
|
31
|
-
tool_input: ClaudeJsonValue;
|
|
32
|
-
permission_suggestions?: ClaudeJsonValue[];
|
|
33
|
-
}
|
|
34
|
-
export interface ClaudeBackgroundTaskSummary extends ClaudeJsonObject {
|
|
35
|
-
id: string;
|
|
36
|
-
type: string;
|
|
37
|
-
status: string;
|
|
38
|
-
description: string;
|
|
39
|
-
}
|
|
40
|
-
export interface ClaudeSessionCronSummary extends ClaudeJsonObject {
|
|
41
|
-
id: string;
|
|
42
|
-
schedule: string;
|
|
43
|
-
recurring: boolean;
|
|
44
|
-
prompt: string;
|
|
45
|
-
}
|
|
46
|
-
export interface ClaudeStopHookInput extends ClaudeHookInputBase {
|
|
47
|
-
hook_event_name: "Stop";
|
|
48
|
-
stop_hook_active: boolean;
|
|
49
|
-
last_assistant_message?: string;
|
|
50
|
-
/** Undefined is intentionally distinct from an observed empty array. */
|
|
51
|
-
background_tasks?: ClaudeBackgroundTaskSummary[];
|
|
52
|
-
/** Undefined is intentionally distinct from an observed empty array. */
|
|
53
|
-
session_crons?: ClaudeSessionCronSummary[];
|
|
54
|
-
}
|
|
55
|
-
export type ClaudeStopFailureCode = "rate_limit" | "authentication_failed" | "oauth_org_not_allowed" | "billing_error" | "invalid_request" | "model_not_found" | "server_error" | "max_output_tokens" | "unknown";
|
|
56
|
-
export interface ClaudeStopFailureHookInput extends ClaudeHookInputBase {
|
|
57
|
-
hook_event_name: "StopFailure";
|
|
58
|
-
error: ClaudeStopFailureCode;
|
|
59
|
-
error_details?: ClaudeJsonValue;
|
|
60
|
-
last_assistant_message?: string;
|
|
61
|
-
}
|
|
62
|
-
export interface ClaudeNotificationHookInput extends ClaudeHookInputBase {
|
|
63
|
-
hook_event_name: "Notification";
|
|
64
|
-
message: string;
|
|
65
|
-
title?: string;
|
|
66
|
-
notification_type: string;
|
|
67
|
-
}
|
|
68
|
-
export type ClaudeHookInput = ClaudeSessionStartHookInput | ClaudeUserPromptSubmitHookInput | ClaudePermissionRequestHookInput | ClaudeStopHookInput | ClaudeStopFailureHookInput | ClaudeNotificationHookInput;
|
|
69
|
-
export type ClaudePermissionBehavior = "allow" | "deny";
|
|
70
|
-
export type ClaudePermissionHookOutput = {
|
|
71
|
-
hookSpecificOutput: {
|
|
72
|
-
hookEventName: "PermissionRequest";
|
|
73
|
-
decision: {
|
|
74
|
-
behavior: "allow";
|
|
75
|
-
} | {
|
|
76
|
-
behavior: "deny";
|
|
77
|
-
message: string;
|
|
78
|
-
interrupt?: boolean;
|
|
79
|
-
};
|
|
80
|
-
};
|
|
81
|
-
};
|
|
82
|
-
export declare function parseClaudeHookInput(value: unknown): ClaudeHookInput;
|
|
83
|
-
export declare function canonicalClaudePermissionFingerprint(input: ClaudePermissionRequestHookInput): string;
|
|
84
|
-
export declare function claudePermissionHookOutput(decision: {
|
|
85
|
-
behavior: ClaudePermissionBehavior;
|
|
86
|
-
interrupt?: boolean;
|
|
87
|
-
message?: string;
|
|
88
|
-
}): ClaudePermissionHookOutput;
|
|
89
|
-
export declare function canonicalJson(value: ClaudeJsonValue): string;
|