@autopilot-harness/cli 0.1.0 → 0.2.1
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/README.md +1 -1
- package/assets/autopilot-harness-hook.mjs +292 -39
- package/assets/vendor/runtime.mjs +397 -15
- package/dist/assets/autopilot-harness-hook.mjs +292 -39
- package/dist/assets/vendor/runtime.mjs +397 -15
- package/dist/bin.js +6 -3
- package/dist/bin.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/init/claude-settings-merge.d.ts +56 -0
- package/dist/init/claude-settings-merge.d.ts.map +1 -0
- package/dist/init/claude-settings-merge.js +347 -0
- package/dist/init/claude-settings-merge.js.map +1 -0
- package/dist/init/hooks-merge.d.ts +12 -0
- package/dist/init/hooks-merge.d.ts.map +1 -1
- package/dist/init/hooks-merge.js +55 -1
- package/dist/init/hooks-merge.js.map +1 -1
- package/dist/init/install.d.ts +4 -1
- package/dist/init/install.d.ts.map +1 -1
- package/dist/init/install.js +258 -83
- package/dist/init/install.js.map +1 -1
- package/dist/init/platforms.d.ts +5 -0
- package/dist/init/platforms.d.ts.map +1 -1
- package/dist/init/platforms.js +17 -0
- package/dist/init/platforms.js.map +1 -1
- package/dist/init/types.d.ts +1 -1
- package/dist/init/types.js +1 -1
- package/dist/init/wizard-helpers.d.ts.map +1 -1
- package/dist/init/wizard-helpers.js +21 -10
- package/dist/init/wizard-helpers.js.map +1 -1
- package/dist/status-doctor.d.ts.map +1 -1
- package/dist/status-doctor.js +132 -56
- package/dist/status-doctor.js.map +1 -1
- package/dist/uninstall.d.ts.map +1 -1
- package/dist/uninstall.js +163 -5
- package/dist/uninstall.js.map +1 -1
- package/dist/upgrade.d.ts.map +1 -1
- package/dist/upgrade.js +100 -2
- package/dist/upgrade.js.map +1 -1
- package/dist/vendor-entry.d.ts +4 -1
- package/dist/vendor-entry.d.ts.map +1 -1
- package/dist/vendor-entry.js +6 -2
- package/dist/vendor-entry.js.map +1 -1
- package/package.json +5 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,yBAAyB,EACzB,uBAAuB,EACvB,6BAA6B,EAC7B,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,yBAAyB,EACzB,uBAAuB,EACvB,6BAA6B,EAC7B,oBAAoB,EACpB,mBAAmB,EACnB,2BAA2B,EAC3B,qBAAqB,EACrB,+BAA+B,EAC/B,6BAA6B,EAC7B,4BAA4B,EAC5B,8BAA8B,EAC9B,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAQ3B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE5H,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAKlD,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,8BAA8B,EAC9B,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,0BAA0B,EAC1B,uBAAuB,EACvB,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,EAC3B,iBAAiB,EACjB,eAAe,EACf,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC;AAMlC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,0BAA0B,EAC1B,0BAA0B,EAC1B,0BAA0B,EAC1B,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,EAC1B,gBAAgB,EAChB,+BAA+B,EAC/B,qBAAqB,EACrB,cAAc,EACd,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAKnD,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,EACzB,cAAc,GACf,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export declare const CLAUDE_BLOCK_CAP_ENV = "CLAUDE_CODE_STOP_HOOK_BLOCK_CAP";
|
|
2
|
+
/** Events Autopilot registers under Claude Code hooks. */
|
|
3
|
+
export declare const CLAUDE_AUTOPILOT_EVENTS: readonly ["UserPromptSubmit", "PostToolUse", "Stop", "StopFailure"];
|
|
4
|
+
export type ClaudeAutopilotEvent = (typeof CLAUDE_AUTOPILOT_EVENTS)[number];
|
|
5
|
+
export interface ClaudeHookHandler {
|
|
6
|
+
type?: string;
|
|
7
|
+
command?: string;
|
|
8
|
+
timeout?: number;
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
export interface ClaudeMatcherGroup {
|
|
12
|
+
matcher?: string;
|
|
13
|
+
hooks?: ClaudeHookHandler[];
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
export interface ClaudeSettingsFile {
|
|
17
|
+
env?: Record<string, unknown>;
|
|
18
|
+
hooks?: Record<string, ClaudeMatcherGroup[] | unknown>;
|
|
19
|
+
[key: string]: unknown;
|
|
20
|
+
}
|
|
21
|
+
/** Build the Autopilot command handler for a Claude hook event. */
|
|
22
|
+
export declare function autopilotClaudeHookHandler(event: ClaudeAutopilotEvent): ClaudeHookHandler;
|
|
23
|
+
/** Matcher group Autopilot installs for one Claude event. */
|
|
24
|
+
export declare function autopilotClaudeMatcherGroup(event: ClaudeAutopilotEvent): ClaudeMatcherGroup;
|
|
25
|
+
/**
|
|
26
|
+
* Ensure settings.json shape is merge-safe; otherwise refuse (do not wipe).
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateClaudeSettingsShape(settings: ClaudeSettingsFile): string | null;
|
|
29
|
+
/**
|
|
30
|
+
* Merge Autopilot Claude hooks + BLOCK_CAP=0 into existing or empty settings.
|
|
31
|
+
*/
|
|
32
|
+
export declare function mergeClaudeSettings(existing: ClaudeSettingsFile | null): ClaudeSettingsFile;
|
|
33
|
+
/**
|
|
34
|
+
* Remove Autopilot Claude hook handlers and BLOCK_CAP env; keep foreign hooks/env.
|
|
35
|
+
* Does not delete settings.json — caller decides write/unlink.
|
|
36
|
+
*/
|
|
37
|
+
export declare function stripAutopilotClaudeSettings(existing: ClaudeSettingsFile): ClaudeSettingsFile;
|
|
38
|
+
/**
|
|
39
|
+
* True when Autopilot Claude markers remain (hook commands and/or BLOCK_CAP env).
|
|
40
|
+
* BLOCK_CAP alone counts so uninstall can clear leftover env after partial strip.
|
|
41
|
+
*/
|
|
42
|
+
export declare function claudeSettingsContainAutopilot(settings: ClaudeSettingsFile | null): boolean;
|
|
43
|
+
/** True when BLOCK_CAP is present and set to "0" (string or number). */
|
|
44
|
+
export declare function hasClaudeBlockCapZero(settings: ClaudeSettingsFile): boolean;
|
|
45
|
+
/** Counts of Autopilot command handlers per required Claude event. */
|
|
46
|
+
export declare function summarizeClaudeAutopilotHooks(settings: ClaudeSettingsFile): {
|
|
47
|
+
missingEvents: string[];
|
|
48
|
+
duplicates: number;
|
|
49
|
+
};
|
|
50
|
+
export declare function hasCompleteClaudeAutopilotHooks(settings: ClaudeSettingsFile): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* True when every Autopilot Claude command stamps `--platform claude-code`.
|
|
53
|
+
* Incomplete installs (no Autopilot handlers) return false.
|
|
54
|
+
*/
|
|
55
|
+
export declare function claudeHooksHavePlatformStamp(settings: ClaudeSettingsFile): boolean;
|
|
56
|
+
//# sourceMappingURL=claude-settings-merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-settings-merge.d.ts","sourceRoot":"","sources":["../../src/init/claude-settings-merge.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,oBAAoB,oCAAoC,CAAC;AAEtE,0DAA0D;AAC1D,eAAO,MAAM,uBAAuB,qEAK1B,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5E,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,CAAC;IACvD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAeD,mEAAmE;AACnE,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,oBAAoB,GAC1B,iBAAiB,CAKnB;AAED,6DAA6D;AAC7D,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,oBAAoB,GAC1B,kBAAkB,CASpB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,kBAAkB,GAC3B,MAAM,GAAG,IAAI,CAqEf;AAyBD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,GAClC,kBAAkB,CAqDpB;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,kBAAkB,GAC3B,kBAAkB,CA4CpB;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,kBAAkB,GAAG,IAAI,GAClC,OAAO,CA2BT;AAED,wEAAwE;AACxE,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAU3E;AAED,sEAAsE;AACtE,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,kBAAkB,GAAG;IAC3E,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB,CAsBA;AAED,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAGT;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAwBT"}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge Autopilot hooks + BLOCK_CAP into Claude Code `.claude/settings.json`.
|
|
3
|
+
* Preserves foreign hooks/env; replaces Autopilot-marked command entries only.
|
|
4
|
+
*/
|
|
5
|
+
import { HOOK_PLATFORM_CLAUDE_CODE, autopilotHookCommandLine, commandHasPlatformStamp, isAutopilotCommand, } from "./hooks-merge.js";
|
|
6
|
+
export const CLAUDE_BLOCK_CAP_ENV = "CLAUDE_CODE_STOP_HOOK_BLOCK_CAP";
|
|
7
|
+
/** Events Autopilot registers under Claude Code hooks. */
|
|
8
|
+
export const CLAUDE_AUTOPILOT_EVENTS = [
|
|
9
|
+
"UserPromptSubmit",
|
|
10
|
+
"PostToolUse",
|
|
11
|
+
"Stop",
|
|
12
|
+
"StopFailure",
|
|
13
|
+
];
|
|
14
|
+
function safeKeyLabel(key) {
|
|
15
|
+
const cleaned = key
|
|
16
|
+
.replace(/[\u0000-\u001f\u007f]+/g, " ")
|
|
17
|
+
.replace(/ +/g, " ")
|
|
18
|
+
.trim();
|
|
19
|
+
return cleaned || "?";
|
|
20
|
+
}
|
|
21
|
+
/** Keys that must never be copied from JSON into merged objects (see config-merge). */
|
|
22
|
+
function isUnsafeKey(key) {
|
|
23
|
+
return key === "__proto__" || key === "prototype" || key === "constructor";
|
|
24
|
+
}
|
|
25
|
+
/** Build the Autopilot command handler for a Claude hook event. */
|
|
26
|
+
export function autopilotClaudeHookHandler(event) {
|
|
27
|
+
return {
|
|
28
|
+
type: "command",
|
|
29
|
+
command: autopilotHookCommandLine(HOOK_PLATFORM_CLAUDE_CODE, event),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** Matcher group Autopilot installs for one Claude event. */
|
|
33
|
+
export function autopilotClaudeMatcherGroup(event) {
|
|
34
|
+
const handler = autopilotClaudeHookHandler(event);
|
|
35
|
+
if (event === "PostToolUse") {
|
|
36
|
+
return {
|
|
37
|
+
matcher: "Edit|Write|NotebookEdit",
|
|
38
|
+
hooks: [handler],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return { hooks: [handler] };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Ensure settings.json shape is merge-safe; otherwise refuse (do not wipe).
|
|
45
|
+
*/
|
|
46
|
+
export function validateClaudeSettingsShape(settings) {
|
|
47
|
+
for (const key of Object.keys(settings)) {
|
|
48
|
+
if (isUnsafeKey(key)) {
|
|
49
|
+
return `settings.json key "${safeKeyLabel(key)}" is not allowed.`;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (settings.env != null) {
|
|
53
|
+
if (typeof settings.env !== "object" ||
|
|
54
|
+
Array.isArray(settings.env) ||
|
|
55
|
+
settings.env === null) {
|
|
56
|
+
return 'settings.json "env" must be an object.';
|
|
57
|
+
}
|
|
58
|
+
for (const key of Object.keys(settings.env)) {
|
|
59
|
+
if (isUnsafeKey(key)) {
|
|
60
|
+
return `settings.json env key "${safeKeyLabel(key)}" is not allowed.`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (settings.hooks == null)
|
|
65
|
+
return null;
|
|
66
|
+
if (typeof settings.hooks !== "object" ||
|
|
67
|
+
Array.isArray(settings.hooks) ||
|
|
68
|
+
settings.hooks === null) {
|
|
69
|
+
return 'settings.json "hooks" must be an object.';
|
|
70
|
+
}
|
|
71
|
+
for (const [key, value] of Object.entries(settings.hooks)) {
|
|
72
|
+
const label = safeKeyLabel(key);
|
|
73
|
+
if (isUnsafeKey(key)) {
|
|
74
|
+
return `settings.json hooks key "${label}" is not allowed.`;
|
|
75
|
+
}
|
|
76
|
+
if (value == null)
|
|
77
|
+
continue;
|
|
78
|
+
if (!Array.isArray(value)) {
|
|
79
|
+
return `settings.json hooks.${label} must be an array of matcher groups.`;
|
|
80
|
+
}
|
|
81
|
+
for (const group of value) {
|
|
82
|
+
if (!group || typeof group !== "object" || Array.isArray(group)) {
|
|
83
|
+
return `settings.json hooks.${label} contains a non-object matcher group.`;
|
|
84
|
+
}
|
|
85
|
+
const g = group;
|
|
86
|
+
if (g.matcher != null && typeof g.matcher !== "string") {
|
|
87
|
+
return `settings.json hooks.${label} has a non-string matcher.`;
|
|
88
|
+
}
|
|
89
|
+
if (g.hooks == null)
|
|
90
|
+
continue;
|
|
91
|
+
if (!Array.isArray(g.hooks)) {
|
|
92
|
+
return `settings.json hooks.${label} matcher group hooks must be an array.`;
|
|
93
|
+
}
|
|
94
|
+
for (const h of g.hooks) {
|
|
95
|
+
if (!h || typeof h !== "object" || Array.isArray(h)) {
|
|
96
|
+
return `settings.json hooks.${label} contains a non-object hook handler.`;
|
|
97
|
+
}
|
|
98
|
+
if (h.command != null && typeof h.command !== "string") {
|
|
99
|
+
return `settings.json hooks.${label} has a non-string command.`;
|
|
100
|
+
}
|
|
101
|
+
if (h.type != null && typeof h.type !== "string") {
|
|
102
|
+
return `settings.json hooks.${label} has a non-string type.`;
|
|
103
|
+
}
|
|
104
|
+
if (h.timeout != null &&
|
|
105
|
+
(typeof h.timeout !== "number" || !Number.isFinite(h.timeout))) {
|
|
106
|
+
return `settings.json hooks.${label} has a non-finite timeout.`;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
function stripAutopilotFromGroups(groups) {
|
|
114
|
+
const out = [];
|
|
115
|
+
for (const group of groups) {
|
|
116
|
+
if (!Array.isArray(group.hooks)) {
|
|
117
|
+
// No hooks list — preserve foreign matcher metadata as-is.
|
|
118
|
+
out.push({ ...group });
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const kept = group.hooks.filter((h) => !isAutopilotCommand(h?.command));
|
|
122
|
+
if (kept.length === 0) {
|
|
123
|
+
// Drop Autopilot-only groups; keep intentionally empty foreign groups.
|
|
124
|
+
if (group.hooks.length === 0) {
|
|
125
|
+
out.push({ ...group, hooks: [] });
|
|
126
|
+
}
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
out.push({ ...group, hooks: kept });
|
|
130
|
+
}
|
|
131
|
+
return out;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Merge Autopilot Claude hooks + BLOCK_CAP=0 into existing or empty settings.
|
|
135
|
+
*/
|
|
136
|
+
export function mergeClaudeSettings(existing) {
|
|
137
|
+
const base = {};
|
|
138
|
+
if (existing && typeof existing === "object" && !Array.isArray(existing)) {
|
|
139
|
+
const shapeError = validateClaudeSettingsShape(existing);
|
|
140
|
+
if (shapeError) {
|
|
141
|
+
throw new Error(shapeError);
|
|
142
|
+
}
|
|
143
|
+
for (const [key, value] of Object.entries(existing)) {
|
|
144
|
+
if (isUnsafeKey(key))
|
|
145
|
+
continue;
|
|
146
|
+
base[key] = value;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
const shapeError = validateClaudeSettingsShape(base);
|
|
151
|
+
if (shapeError) {
|
|
152
|
+
throw new Error(shapeError);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const prevEnv = Object.create(null);
|
|
156
|
+
if (base.env && typeof base.env === "object" && !Array.isArray(base.env)) {
|
|
157
|
+
for (const [key, value] of Object.entries(base.env)) {
|
|
158
|
+
if (isUnsafeKey(key))
|
|
159
|
+
continue;
|
|
160
|
+
prevEnv[key] = value;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
base.env = {
|
|
164
|
+
...prevEnv,
|
|
165
|
+
[CLAUDE_BLOCK_CAP_ENV]: "0",
|
|
166
|
+
};
|
|
167
|
+
const nextHooks = Object.create(null);
|
|
168
|
+
if (base.hooks && typeof base.hooks === "object" && !Array.isArray(base.hooks)) {
|
|
169
|
+
for (const [key, value] of Object.entries(base.hooks)) {
|
|
170
|
+
if (isUnsafeKey(key))
|
|
171
|
+
continue;
|
|
172
|
+
if (!Array.isArray(value)) {
|
|
173
|
+
// validateClaudeSettingsShape should have rejected; keep fail-closed.
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
nextHooks[key] = stripAutopilotFromGroups(value);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
for (const event of CLAUDE_AUTOPILOT_EVENTS) {
|
|
180
|
+
const current = Array.isArray(nextHooks[event])
|
|
181
|
+
? [...nextHooks[event]]
|
|
182
|
+
: [];
|
|
183
|
+
const stripped = stripAutopilotFromGroups(current);
|
|
184
|
+
stripped.push(autopilotClaudeMatcherGroup(event));
|
|
185
|
+
nextHooks[event] = stripped;
|
|
186
|
+
}
|
|
187
|
+
base.hooks = nextHooks;
|
|
188
|
+
return base;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Remove Autopilot Claude hook handlers and BLOCK_CAP env; keep foreign hooks/env.
|
|
192
|
+
* Does not delete settings.json — caller decides write/unlink.
|
|
193
|
+
*/
|
|
194
|
+
export function stripAutopilotClaudeSettings(existing) {
|
|
195
|
+
const shapeError = validateClaudeSettingsShape(existing);
|
|
196
|
+
if (shapeError) {
|
|
197
|
+
throw new Error(shapeError);
|
|
198
|
+
}
|
|
199
|
+
const base = {};
|
|
200
|
+
for (const [key, value] of Object.entries(existing)) {
|
|
201
|
+
if (isUnsafeKey(key))
|
|
202
|
+
continue;
|
|
203
|
+
base[key] = value;
|
|
204
|
+
}
|
|
205
|
+
if (base.env && typeof base.env === "object" && !Array.isArray(base.env)) {
|
|
206
|
+
const nextEnv = Object.create(null);
|
|
207
|
+
for (const [key, value] of Object.entries(base.env)) {
|
|
208
|
+
if (isUnsafeKey(key))
|
|
209
|
+
continue;
|
|
210
|
+
if (key === CLAUDE_BLOCK_CAP_ENV)
|
|
211
|
+
continue;
|
|
212
|
+
nextEnv[key] = value;
|
|
213
|
+
}
|
|
214
|
+
if (Object.keys(nextEnv).length === 0) {
|
|
215
|
+
delete base.env;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
base.env = nextEnv;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const prevHooks = base.hooks;
|
|
222
|
+
if (prevHooks && typeof prevHooks === "object" && !Array.isArray(prevHooks)) {
|
|
223
|
+
const nextHooks = Object.create(null);
|
|
224
|
+
for (const [key, value] of Object.entries(prevHooks)) {
|
|
225
|
+
if (isUnsafeKey(key))
|
|
226
|
+
continue;
|
|
227
|
+
if (!Array.isArray(value))
|
|
228
|
+
continue;
|
|
229
|
+
const kept = stripAutopilotFromGroups(value);
|
|
230
|
+
// Drop empty event lists so uninstall does not leave Stop: [].
|
|
231
|
+
if (kept.length > 0)
|
|
232
|
+
nextHooks[key] = kept;
|
|
233
|
+
}
|
|
234
|
+
if (Object.keys(nextHooks).length === 0) {
|
|
235
|
+
delete base.hooks;
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
base.hooks = nextHooks;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return base;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* True when Autopilot Claude markers remain (hook commands and/or BLOCK_CAP env).
|
|
245
|
+
* BLOCK_CAP alone counts so uninstall can clear leftover env after partial strip.
|
|
246
|
+
*/
|
|
247
|
+
export function claudeSettingsContainAutopilot(settings) {
|
|
248
|
+
if (!settings || typeof settings !== "object" || Array.isArray(settings)) {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
const env = settings.env;
|
|
252
|
+
if (env &&
|
|
253
|
+
typeof env === "object" &&
|
|
254
|
+
!Array.isArray(env) &&
|
|
255
|
+
Object.prototype.hasOwnProperty.call(env, CLAUDE_BLOCK_CAP_ENV)) {
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
const bag = settings.hooks &&
|
|
259
|
+
typeof settings.hooks === "object" &&
|
|
260
|
+
!Array.isArray(settings.hooks)
|
|
261
|
+
? settings.hooks
|
|
262
|
+
: {};
|
|
263
|
+
for (const value of Object.values(bag)) {
|
|
264
|
+
if (!Array.isArray(value))
|
|
265
|
+
continue;
|
|
266
|
+
for (const g of value) {
|
|
267
|
+
const hooks = Array.isArray(g?.hooks) ? g.hooks : [];
|
|
268
|
+
if (hooks.some((h) => isAutopilotCommand(h?.command)))
|
|
269
|
+
return true;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
/** True when BLOCK_CAP is present and set to "0" (string or number). */
|
|
275
|
+
export function hasClaudeBlockCapZero(settings) {
|
|
276
|
+
const env = settings.env;
|
|
277
|
+
if (!env || typeof env !== "object" || Array.isArray(env))
|
|
278
|
+
return false;
|
|
279
|
+
if (!Object.prototype.hasOwnProperty.call(env, CLAUDE_BLOCK_CAP_ENV)) {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
const raw = env[CLAUDE_BLOCK_CAP_ENV];
|
|
283
|
+
if (raw === 0)
|
|
284
|
+
return true;
|
|
285
|
+
if (typeof raw === "string" && raw.trim() === "0")
|
|
286
|
+
return true;
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
/** Counts of Autopilot command handlers per required Claude event. */
|
|
290
|
+
export function summarizeClaudeAutopilotHooks(settings) {
|
|
291
|
+
const bag = settings.hooks &&
|
|
292
|
+
typeof settings.hooks === "object" &&
|
|
293
|
+
!Array.isArray(settings.hooks)
|
|
294
|
+
? settings.hooks
|
|
295
|
+
: {};
|
|
296
|
+
const missingEvents = [];
|
|
297
|
+
let duplicates = 0;
|
|
298
|
+
for (const event of CLAUDE_AUTOPILOT_EVENTS) {
|
|
299
|
+
const groups = Array.isArray(bag[event])
|
|
300
|
+
? bag[event]
|
|
301
|
+
: [];
|
|
302
|
+
let n = 0;
|
|
303
|
+
for (const g of groups) {
|
|
304
|
+
const hooks = Array.isArray(g.hooks) ? g.hooks : [];
|
|
305
|
+
n += hooks.filter((h) => isAutopilotCommand(h?.command)).length;
|
|
306
|
+
}
|
|
307
|
+
if (n === 0)
|
|
308
|
+
missingEvents.push(event);
|
|
309
|
+
if (n > 1)
|
|
310
|
+
duplicates += n - 1;
|
|
311
|
+
}
|
|
312
|
+
return { missingEvents, duplicates };
|
|
313
|
+
}
|
|
314
|
+
export function hasCompleteClaudeAutopilotHooks(settings) {
|
|
315
|
+
const { missingEvents, duplicates } = summarizeClaudeAutopilotHooks(settings);
|
|
316
|
+
return missingEvents.length === 0 && duplicates === 0;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* True when every Autopilot Claude command stamps `--platform claude-code`.
|
|
320
|
+
* Incomplete installs (no Autopilot handlers) return false.
|
|
321
|
+
*/
|
|
322
|
+
export function claudeHooksHavePlatformStamp(settings) {
|
|
323
|
+
const bag = settings.hooks &&
|
|
324
|
+
typeof settings.hooks === "object" &&
|
|
325
|
+
!Array.isArray(settings.hooks)
|
|
326
|
+
? settings.hooks
|
|
327
|
+
: {};
|
|
328
|
+
let seen = 0;
|
|
329
|
+
for (const event of CLAUDE_AUTOPILOT_EVENTS) {
|
|
330
|
+
const groups = Array.isArray(bag[event])
|
|
331
|
+
? bag[event]
|
|
332
|
+
: [];
|
|
333
|
+
for (const g of groups) {
|
|
334
|
+
const hooks = Array.isArray(g.hooks) ? g.hooks : [];
|
|
335
|
+
for (const h of hooks) {
|
|
336
|
+
if (!isAutopilotCommand(h?.command))
|
|
337
|
+
continue;
|
|
338
|
+
seen += 1;
|
|
339
|
+
if (!commandHasPlatformStamp(h.command, HOOK_PLATFORM_CLAUDE_CODE)) {
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return seen > 0;
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=claude-settings-merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-settings-merge.js","sourceRoot":"","sources":["../../src/init/claude-settings-merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import type { HookCommand, HooksFile } from "./types.js";
|
|
2
|
+
/** Installed `--platform` ids (argv primary dispatch). */
|
|
3
|
+
export declare const HOOK_PLATFORM_CURSOR = "cursor";
|
|
4
|
+
export declare const HOOK_PLATFORM_CLAUDE_CODE = "claude-code";
|
|
5
|
+
/** Canonical Autopilot hook command line (platform + event). */
|
|
6
|
+
export declare function autopilotHookCommandLine(platform: string, event: string): string;
|
|
7
|
+
/** True when an Autopilot command stamps the expected `--platform <id>`. */
|
|
8
|
+
export declare function commandHasPlatformStamp(cmd: string | undefined, platform: string): boolean;
|
|
2
9
|
export declare function autopilotHookCommand(event: string): HookCommand;
|
|
3
10
|
/** True when project Autopilot stop entry disables Cursor's default loop cap. */
|
|
4
11
|
export declare function autopilotStopHasUnlimitedLoop(hooks: HooksFile): boolean;
|
|
@@ -22,4 +29,9 @@ export declare function summarizeAutopilotHooks(hooks: HooksFile): {
|
|
|
22
29
|
export declare function hasCompleteAutopilotHooks(hooks: HooksFile): boolean;
|
|
23
30
|
/** Count duplicate Autopilot commands per event (doctor WARN). */
|
|
24
31
|
export declare function countAutopilotDuplicates(hooks: HooksFile): number;
|
|
32
|
+
/**
|
|
33
|
+
* True when every Autopilot command for required Cursor events stamps
|
|
34
|
+
* `--platform cursor`. Empty / incomplete installs return false.
|
|
35
|
+
*/
|
|
36
|
+
export declare function cursorHooksHavePlatformStamp(hooks: HooksFile): boolean;
|
|
25
37
|
//# sourceMappingURL=hooks-merge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks-merge.d.ts","sourceRoot":"","sources":["../../src/init/hooks-merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGzD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAY/D;AAED,iFAAiF;AACjF,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAWvE;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAInE;AAQD,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CA0BlE;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,CAwBpE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,SAAS,GAAG,SAAS,CAelE;AAED,uDAAuD;AACvD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,GAAG;IACzD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB,CAgBA;AAED,wEAAwE;AACxE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAGnE;AAED,kEAAkE;AAClE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAEjE"}
|
|
1
|
+
{"version":3,"file":"hooks-merge.d.ts","sourceRoot":"","sources":["../../src/init/hooks-merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGzD,0DAA0D;AAC1D,eAAO,MAAM,oBAAoB,WAAW,CAAC;AAC7C,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;AAEvD,gEAAgE;AAChE,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,MAAM,CAkBR;AAED,4EAA4E;AAC5E,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAQT;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAY/D;AAED,iFAAiF;AACjF,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAWvE;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAInE;AAQD,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CA0BlE;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,CAwBpE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,SAAS,GAAG,SAAS,CAelE;AAED,uDAAuD;AACvD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,SAAS,GAAG;IACzD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB,CAgBA;AAED,wEAAwE;AACxE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAGnE;AAED,kEAAkE;AAClE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAEjE;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAmBtE"}
|
package/dist/init/hooks-merge.js
CHANGED
|
@@ -1,7 +1,37 @@
|
|
|
1
1
|
import { AUTOPILOT_EVENTS } from "./types.js";
|
|
2
|
+
/** Installed `--platform` ids (argv primary dispatch). */
|
|
3
|
+
export const HOOK_PLATFORM_CURSOR = "cursor";
|
|
4
|
+
export const HOOK_PLATFORM_CLAUDE_CODE = "claude-code";
|
|
5
|
+
/** Canonical Autopilot hook command line (platform + event). */
|
|
6
|
+
export function autopilotHookCommandLine(platform, event) {
|
|
7
|
+
// Defense in depth: only allow safe argv tokens (callers pass constants).
|
|
8
|
+
// Reject (do not silently rewrite) if sanitization would change the token —
|
|
9
|
+
// rewriting could invent a different platform id.
|
|
10
|
+
if (typeof platform !== "string" || typeof event !== "string") {
|
|
11
|
+
throw new Error("autopilotHookCommandLine: invalid platform or event");
|
|
12
|
+
}
|
|
13
|
+
const safePlatform = platform.replace(/[^A-Za-z0-9._+-]/g, "").slice(0, 64);
|
|
14
|
+
const safeEvent = event.replace(/[^A-Za-z0-9._+-]/g, "").slice(0, 64);
|
|
15
|
+
if (!safePlatform ||
|
|
16
|
+
!safeEvent ||
|
|
17
|
+
safePlatform !== platform ||
|
|
18
|
+
safeEvent !== event) {
|
|
19
|
+
throw new Error("autopilotHookCommandLine: invalid platform or event");
|
|
20
|
+
}
|
|
21
|
+
return `node .autopilot/bin/autopilot-harness-hook.mjs --platform ${safePlatform} --event ${safeEvent}`;
|
|
22
|
+
}
|
|
23
|
+
/** True when an Autopilot command stamps the expected `--platform <id>`. */
|
|
24
|
+
export function commandHasPlatformStamp(cmd, platform) {
|
|
25
|
+
if (typeof cmd !== "string" || !platform)
|
|
26
|
+
return false;
|
|
27
|
+
const needle = `--platform ${platform}`;
|
|
28
|
+
// Token boundary: avoid matching `--platform cursor-extra`
|
|
29
|
+
const re = new RegExp(`(?:^|\\s)${needle.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}(?:\\s|$)`);
|
|
30
|
+
return re.test(cmd);
|
|
31
|
+
}
|
|
2
32
|
export function autopilotHookCommand(event) {
|
|
3
33
|
const base = {
|
|
4
|
-
command:
|
|
34
|
+
command: autopilotHookCommandLine(HOOK_PLATFORM_CURSOR, event),
|
|
5
35
|
};
|
|
6
36
|
// Cursor defaults loop_limit to 5 for stop hooks that omit the field.
|
|
7
37
|
// Autopilot's fix + multi-angle confirm chain routinely exceeds 5
|
|
@@ -131,4 +161,28 @@ export function hasCompleteAutopilotHooks(hooks) {
|
|
|
131
161
|
export function countAutopilotDuplicates(hooks) {
|
|
132
162
|
return summarizeAutopilotHooks(hooks).duplicates;
|
|
133
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* True when every Autopilot command for required Cursor events stamps
|
|
166
|
+
* `--platform cursor`. Empty / incomplete installs return false.
|
|
167
|
+
*/
|
|
168
|
+
export function cursorHooksHavePlatformStamp(hooks) {
|
|
169
|
+
const bag = hooks.hooks && typeof hooks.hooks === "object" && !Array.isArray(hooks.hooks)
|
|
170
|
+
? hooks.hooks
|
|
171
|
+
: {};
|
|
172
|
+
let seen = 0;
|
|
173
|
+
for (const event of AUTOPILOT_EVENTS) {
|
|
174
|
+
const list = Array.isArray(bag[event])
|
|
175
|
+
? bag[event]
|
|
176
|
+
: [];
|
|
177
|
+
for (const h of list) {
|
|
178
|
+
if (!isAutopilotCommand(h?.command))
|
|
179
|
+
continue;
|
|
180
|
+
seen += 1;
|
|
181
|
+
if (!commandHasPlatformStamp(h.command, HOOK_PLATFORM_CURSOR)) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return seen > 0;
|
|
187
|
+
}
|
|
134
188
|
//# sourceMappingURL=hooks-merge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks-merge.js","sourceRoot":"","sources":["../../src/init/hooks-merge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,IAAI,GAAgB;QACxB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"hooks-merge.js","sourceRoot":"","sources":["../../src/init/hooks-merge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,0DAA0D;AAC1D,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAC7C,MAAM,CAAC,MAAM,yBAAyB,GAAG,aAAa,CAAC;AAEvD,gEAAgE;AAChE,MAAM,UAAU,wBAAwB,CACtC,QAAgB,EAChB,KAAa;IAEb,0EAA0E;IAC1E,4EAA4E;IAC5E,kDAAkD;IAClD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5E,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtE,IACE,CAAC,YAAY;QACb,CAAC,SAAS;QACV,YAAY,KAAK,QAAQ;QACzB,SAAS,KAAK,KAAK,EACnB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,6DAA6D,YAAY,YAAY,SAAS,EAAE,CAAC;AAC1G,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,uBAAuB,CACrC,GAAuB,EACvB,QAAgB;IAEhB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACvD,MAAM,MAAM,GAAG,cAAc,QAAQ,EAAE,CAAC;IACxC,2DAA2D;IAC3D,MAAM,EAAE,GAAG,IAAI,MAAM,CACnB,YAAY,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,WAAW,CACrE,CAAC;IACF,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,IAAI,GAAgB;QACxB,OAAO,EAAE,wBAAwB,CAAC,oBAAoB,EAAE,KAAK,CAAC;KAC/D,CAAC;IACF,sEAAsE;IACtE,kEAAkE;IAClE,sEAAsE;IACtE,kEAAkE;IAClE,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,6BAA6B,CAAC,KAAgB;IAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QACtB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAClE,OAAO,CACL,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7B,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,YAAY,CAAC;YACrD,CAAC,CAAC,UAAU,KAAK,IAAI,CACtB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,kBAAkB,CAAC,GAAuB;IACxD,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CACtE,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACvF,OAAO,OAAO,IAAI,GAAG,CAAC;AACxB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,kBAAkB,CAAC,KAAgB;IACjD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,qDAAqD,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACpD,OAAO,uCAAuC,CAAC;IACjD,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,KAAK,IAAI,IAAI;YAAE,SAAS;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,oBAAoB,KAAK,2CAA2C,CAAC;QAC9E,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChE,OAAO,oBAAoB,KAAK,+BAA+B,CAAC;YAClE,CAAC;YACD,IACG,KAAqB,CAAC,OAAO,IAAI,IAAI;gBACtC,OAAQ,KAAqB,CAAC,OAAO,KAAK,QAAQ,EAClD,CAAC;gBACD,OAAO,oBAAoB,KAAK,4BAA4B,CAAC;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,cAAc,CAAC,QAA0B;IACvD,MAAM,IAAI,GACR,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QACtC,CAAC,CAAC;YACE,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,CAAC;YAC9B,KAAK,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE;SACrC;QACH,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAEhC,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC,GAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAmB,CAAC;YAC3C,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAmB;IACrD,MAAM,IAAI,GAAc;QACtB,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,CAAC;QAC9B,KAAK,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE;KACrC,CAAC;IACF,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,SAAS;QACpC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,uBAAuB,CAAC,KAAgB;IAItD,MAAM,GAAG,GACP,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAC3E,CAAC,CAAC,KAAK,CAAC,KAAK;QACb,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC,CAAE,GAAG,CAAC,KAAK,CAAmB;YAC/B,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QACpE,IAAI,CAAC,KAAK,CAAC;YAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC;YAAE,UAAU,IAAI,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,yBAAyB,CAAC,KAAgB;IACxD,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACrE,OAAO,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,wBAAwB,CAAC,KAAgB;IACvD,OAAO,uBAAuB,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAAgB;IAC3D,MAAM,GAAG,GACP,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAC3E,CAAC,CAAC,KAAK,CAAC,KAAK;QACb,CAAC,CAAC,EAAE,CAAC;IACT,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC,CAAE,GAAG,CAAC,KAAK,CAAmB;YAC/B,CAAC,CAAC,EAAE,CAAC;QACP,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC;gBAAE,SAAS;YAC9C,IAAI,IAAI,CAAC,CAAC;YACV,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,EAAE,oBAAoB,CAAC,EAAE,CAAC;gBAC9D,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,CAAC;AAClB,CAAC"}
|
package/dist/init/install.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { InitResult, InitYesOptions } from "./types.js";
|
|
2
2
|
export { mergeHooksJson, stripAutopilotHooks, isAutopilotCommand, countAutopilotDuplicates, validateHooksShape, hasCompleteAutopilotHooks, summarizeAutopilotHooks, autopilotStopHasUnlimitedLoop, autopilotHookCommand, } from "./hooks-merge.js";
|
|
3
|
+
export { mergeClaudeSettings, validateClaudeSettingsShape, hasClaudeBlockCapZero, hasCompleteClaudeAutopilotHooks, summarizeClaudeAutopilotHooks, stripAutopilotClaudeSettings, claudeSettingsContainAutopilot, CLAUDE_AUTOPILOT_EVENTS, CLAUDE_BLOCK_CAP_ENV, } from "./claude-settings-merge.js";
|
|
4
|
+
export type { ClaudeSettingsFile, ClaudeMatcherGroup, ClaudeHookHandler, } from "./claude-settings-merge.js";
|
|
3
5
|
export type { InitYesOptions, InitResult, HooksFile } from "./types.js";
|
|
4
6
|
/** Skills written by init; uninstall must remove the same set. */
|
|
5
7
|
export declare const AUTOPILOT_SKILL_NAMES: readonly ["autopilot-on", "autopilot-run", "autopilot-off", "autopilot-resume", "autopilot-replan"];
|
|
@@ -22,7 +24,8 @@ export type PreflightResult = {
|
|
|
22
24
|
*/
|
|
23
25
|
export declare function preflightForceRefresh(projectRoot: string): PreflightResult;
|
|
24
26
|
/**
|
|
25
|
-
* Non-interactive init (`--yes`). Writes .autopilot +
|
|
27
|
+
* Non-interactive init (`--yes`). Writes .autopilot + host hooks/skills
|
|
28
|
+
* (`.cursor/hooks.json` and/or `.claude/settings.json` per platforms).
|
|
26
29
|
* `--force` refreshes hook/skills/pin/hooks merge but does **not** overwrite
|
|
27
30
|
* an existing config.yml, except when `mergePlatforms` / `--add-platform`
|
|
28
31
|
* updates the `platforms` list (committed only after hooks succeed).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/init/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/init/install.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAGV,UAAU,EACV,cAAc,EACf,MAAM,YAAY,CAAC;AAyCpB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,yBAAyB,EACzB,uBAAuB,EACvB,6BAA6B,EAC7B,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,qBAAqB,EACrB,+BAA+B,EAC/B,6BAA6B,EAC7B,4BAA4B,EAC5B,8BAA8B,EAC9B,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIxE,kEAAkE;AAClE,eAAO,MAAM,qBAAqB,qGAMxB,CAAC;AAEX,yEAAyE;AACzE,eAAO,MAAM,wBAAwB,8DAG3B,CAAC;AAgVX;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,MAAM,GAAG,IAAI,CA6Df;AAwMD,MAAM,MAAM,eAAe,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CA8C1E;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,CAuhB/D"}
|