@raidiant/notifai 0.5.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +165 -0
- package/README.md +11 -4
- package/dist/commands.d.ts +16 -1
- package/dist/commands.js +371 -157
- package/dist/commands.js.map +1 -1
- package/dist/config-schema.d.ts +1 -1
- package/dist/config-schema.js +2 -14
- package/dist/config-schema.js.map +1 -1
- package/dist/config.d.ts +19 -8
- package/dist/config.js +50 -7
- package/dist/config.js.map +1 -1
- package/dist/harnesses.d.ts +1 -0
- package/dist/harnesses.js +6 -0
- package/dist/harnesses.js.map +1 -1
- package/dist/hook-adapter.d.ts +10 -1
- package/dist/hook-adapter.js +79 -10
- package/dist/hook-adapter.js.map +1 -1
- package/dist/install-hooks.d.ts +54 -17
- package/dist/install-hooks.js +258 -97
- package/dist/install-hooks.js.map +1 -1
- package/dist/interactive.d.ts +32 -1
- package/dist/interactive.js +163 -47
- package/dist/interactive.js.map +1 -1
- package/dist/main.js +8 -8
- package/dist/main.js.map +1 -1
- package/dist/native-skills.d.ts +1 -1
- package/dist/native-skills.js +23 -58
- package/dist/native-skills.js.map +1 -1
- package/dist/pack-feedback-slice.d.ts +35 -0
- package/dist/pack-feedback-slice.js +126 -0
- package/dist/pack-feedback-slice.js.map +1 -0
- package/dist/readiness.d.ts +20 -0
- package/dist/readiness.js +24 -0
- package/dist/readiness.js.map +1 -1
- package/package.json +3 -2
- package/src/commands.test.ts +364 -31
- package/src/commands.ts +450 -177
- package/src/config-schema.ts +2 -17
- package/src/config.test.ts +29 -4
- package/src/config.ts +67 -11
- package/src/harnesses.ts +7 -0
- package/src/hook-adapter.test.ts +43 -1
- package/src/hook-adapter.ts +83 -11
- package/src/hooks.test.ts +4 -5
- package/src/install-hooks.test.ts +154 -2
- package/src/install-hooks.ts +231 -44
- package/src/interactive.test.ts +338 -0
- package/src/interactive.ts +221 -49
- package/src/main.ts +8 -8
- package/src/native-skills.test.ts +75 -0
- package/src/native-skills.ts +31 -75
- package/src/pack-feedback-slice.test.ts +212 -0
- package/src/pack-feedback-slice.ts +187 -0
- package/src/readiness.test.ts +25 -0
- package/src/readiness.ts +38 -0
- package/src/skill.test.ts +43 -0
- package/src/ui/config-view.test.ts +5 -4
package/dist/config-schema.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export type ConfigKind = 'string' | 'url' | 'integer' | 'boolean' | 'enum' | 'li
|
|
|
4
4
|
* Which surface a key belongs to. Grouping is the difference between a flat
|
|
5
5
|
* list of keys and a few short ones a reader can hold in their head.
|
|
6
6
|
*/
|
|
7
|
-
export type ConfigGroup = 'questions' | 'delivery' | 'project' | 'diagnostics'
|
|
7
|
+
export type ConfigGroup = 'questions' | 'delivery' | 'project' | 'diagnostics';
|
|
8
8
|
export declare const CONFIG_GROUPS: {
|
|
9
9
|
id: ConfigGroup;
|
|
10
10
|
title: string;
|
package/dist/config-schema.js
CHANGED
|
@@ -39,11 +39,6 @@ export const CONFIG_GROUPS = [
|
|
|
39
39
|
title: 'Local logs',
|
|
40
40
|
blurb: 'What this machine records about its own activity, so an agent can find out afterwards what happened.',
|
|
41
41
|
},
|
|
42
|
-
{
|
|
43
|
-
id: 'connection',
|
|
44
|
-
title: 'Connection',
|
|
45
|
-
blurb: 'Which Notifai service this machine talks to. Most people never change this.',
|
|
46
|
-
},
|
|
47
42
|
];
|
|
48
43
|
const INFO = {
|
|
49
44
|
ask_notifications: {
|
|
@@ -180,15 +175,6 @@ const INFO = {
|
|
|
180
175
|
advanced: true,
|
|
181
176
|
example: '3',
|
|
182
177
|
},
|
|
183
|
-
base_url: {
|
|
184
|
-
label: 'Service URL',
|
|
185
|
-
group: 'connection',
|
|
186
|
-
kind: 'url',
|
|
187
|
-
summary: 'Which Notifai service this machine talks to',
|
|
188
|
-
detail: 'Points the CLI at a Notifai service. The default is the hosted service, and signing in stores the URL the credential belongs to, so this rarely needs setting by hand.\n\nChanging it does not move your credential: a URL that does not match the one you paired against will not authenticate.',
|
|
189
|
-
advanced: true,
|
|
190
|
-
example: 'https://notifai.fly.dev',
|
|
191
|
-
},
|
|
192
178
|
};
|
|
193
179
|
export function configInfo(key) {
|
|
194
180
|
return { key, ...INFO[key] };
|
|
@@ -254,6 +240,8 @@ export function describeSource(source) {
|
|
|
254
240
|
return { label: 'default', path: null };
|
|
255
241
|
if (source === 'flag')
|
|
256
242
|
return { label: 'this command', path: null };
|
|
243
|
+
if (source === 'env')
|
|
244
|
+
return { label: 'environment', path: null };
|
|
257
245
|
const separator = source.indexOf(':');
|
|
258
246
|
if (separator === -1)
|
|
259
247
|
return { label: source, path: null };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../src/config-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAC5E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAkB,MAAM,aAAa,CAAA;AAUtE,MAAM,CAAC,MAAM,aAAa,GAAwD;IAChF;QACE,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,sGAAsG;KAC9G;IACD;QACE,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,mBAAmB;QAC1B,KAAK,EAAE,mFAAmF;KAC3F;IACD;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,cAAc;QACrB,KAAK,EAAE,iGAAiG;KACzG;IACD;QACE,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,sGAAsG;KAC9G;
|
|
1
|
+
{"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../src/config-schema.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -9,14 +9,13 @@ import type { CLI_SOUNDS, INTERRUPTION_LEVELS } from '@raidiant/notifai-protocol
|
|
|
9
9
|
* than in the agent's context, because context is lost to compaction and a
|
|
10
10
|
* preference that evaporates mid-session is worse than none.
|
|
11
11
|
*
|
|
12
|
-
* `project-local` is
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* lands. The CLI does not edit a repository's ignore rules or create commits.
|
|
12
|
+
* `project-local` is a personal file under the user's config directory, keyed
|
|
13
|
+
* by the project root so a checkout does not have to gitignore anything. Shared
|
|
14
|
+
* `.notifai/config.toml` stays in the tree for committed project identity.
|
|
16
15
|
*
|
|
17
16
|
* `config show --explain` surfaces the winning layer per key.
|
|
18
17
|
*/
|
|
19
|
-
export type ConfigSource = 'flag' | `session:${string}` | `project-local:${string}` | `project:${string}` | `global:${string}` | 'default';
|
|
18
|
+
export type ConfigSource = 'flag' | 'env' | `session:${string}` | `project-local:${string}` | `project:${string}` | `global:${string}` | 'default';
|
|
20
19
|
export interface ResolvedValue<T> {
|
|
21
20
|
value: T;
|
|
22
21
|
source: ConfigSource;
|
|
@@ -73,7 +72,7 @@ export interface CliConfig {
|
|
|
73
72
|
/** Log files kept in total, the active one included. */
|
|
74
73
|
log_max_files: ResolvedValue<number>;
|
|
75
74
|
}
|
|
76
|
-
export declare const CONFIG_KEYS: readonly ["
|
|
75
|
+
export declare const CONFIG_KEYS: readonly ["wait_seconds", "ttl_seconds", "collapse_key", "devices", "sound", "interruption_level", "project", "notify_criteria", "ask_notifications", "ask_grace_seconds", "log_level", "log_max_bytes", "log_max_files"];
|
|
77
76
|
export type ConfigKey = (typeof CONFIG_KEYS)[number];
|
|
78
77
|
/** Keys whose TOML value must parse as a boolean; used by `config set`. */
|
|
79
78
|
export declare const BOOLEAN_CONFIG_KEYS: readonly ConfigKey[];
|
|
@@ -87,6 +86,8 @@ export declare const NUMERIC_CONFIG_KEYS: readonly ConfigKey[];
|
|
|
87
86
|
* is the same discipline the numeric bounds follow.
|
|
88
87
|
*/
|
|
89
88
|
export declare const ENUM_CONFIG_VALUES: Partial<Record<ConfigKey, readonly string[]>>;
|
|
89
|
+
/** Compiled service origin. Not a user-facing setting; override with `--base-url` or `NOTIFAI_BASE_URL`. */
|
|
90
|
+
export declare const DEFAULT_BASE_URL = "https://notifai.fly.dev";
|
|
90
91
|
/** The shipped value beneath every user-controlled configuration layer. */
|
|
91
92
|
export declare function configDefaultValue(key: ConfigKey): unknown;
|
|
92
93
|
export declare function globalConfigDir(env?: NodeJS.ProcessEnv): string;
|
|
@@ -115,8 +116,18 @@ export declare function sanitizeSessionId(sessionId: string): string;
|
|
|
115
116
|
*/
|
|
116
117
|
export declare function projectSessionPointerPath(cwd: string, env?: NodeJS.ProcessEnv): string;
|
|
117
118
|
export declare function findProjectConfigPath(startDir: string): string | null;
|
|
118
|
-
/**
|
|
119
|
-
|
|
119
|
+
/**
|
|
120
|
+
* Stable identity for personal project preferences.
|
|
121
|
+
*
|
|
122
|
+
* Prefer the directory that owns the shared `.notifai/config.toml`, then the
|
|
123
|
+
* git checkout root, then cwd. Subdirectories of one project therefore share
|
|
124
|
+
* one personal file, and nothing is written inside the repository.
|
|
125
|
+
*/
|
|
126
|
+
export declare function personalProjectIdentity(cwd: string): string;
|
|
127
|
+
/** Personal project layer: `$XDG_CONFIG_HOME/notifai/projects/<identity>.toml`. */
|
|
128
|
+
export declare function personalProjectConfigPath(cwd: string, env?: NodeJS.ProcessEnv): string;
|
|
129
|
+
/** Existing personal project file, or null when this checkout has none. */
|
|
130
|
+
export declare function findProjectLocalConfigPath(startDir: string, env?: NodeJS.ProcessEnv): string | null;
|
|
120
131
|
export declare function configBounds(key: ConfigKey): {
|
|
121
132
|
min: number;
|
|
122
133
|
max: number;
|
package/dist/config.js
CHANGED
|
@@ -10,7 +10,6 @@ import { parse as parseToml } from 'smol-toml';
|
|
|
10
10
|
*/
|
|
11
11
|
export const LOG_LEVELS = ['off', 'error', 'info', 'debug'];
|
|
12
12
|
export const CONFIG_KEYS = [
|
|
13
|
-
'base_url',
|
|
14
13
|
'wait_seconds',
|
|
15
14
|
'ttl_seconds',
|
|
16
15
|
'collapse_key',
|
|
@@ -45,8 +44,9 @@ export const NUMERIC_CONFIG_KEYS = [
|
|
|
45
44
|
export const ENUM_CONFIG_VALUES = {
|
|
46
45
|
log_level: LOG_LEVELS,
|
|
47
46
|
};
|
|
47
|
+
/** Compiled service origin. Not a user-facing setting; override with `--base-url` or `NOTIFAI_BASE_URL`. */
|
|
48
|
+
export const DEFAULT_BASE_URL = 'https://notifai.fly.dev';
|
|
48
49
|
const DEFAULTS = {
|
|
49
|
-
base_url: 'https://notifai.fly.dev',
|
|
50
50
|
wait_seconds: 10,
|
|
51
51
|
ttl_seconds: 86400,
|
|
52
52
|
collapse_key: null,
|
|
@@ -148,9 +148,38 @@ function findProjectFile(startDir, name) {
|
|
|
148
148
|
export function findProjectConfigPath(startDir) {
|
|
149
149
|
return findProjectFile(startDir, 'config.toml');
|
|
150
150
|
}
|
|
151
|
-
/**
|
|
152
|
-
|
|
153
|
-
|
|
151
|
+
/** Walk up from cwd looking for a `.git` file or directory (worktree or checkout). */
|
|
152
|
+
function findGitRoot(startDir) {
|
|
153
|
+
let dir = path.resolve(startDir);
|
|
154
|
+
for (;;) {
|
|
155
|
+
if (existsSync(path.join(dir, '.git')))
|
|
156
|
+
return canonicalDir(dir);
|
|
157
|
+
const parent = path.dirname(dir);
|
|
158
|
+
if (parent === dir)
|
|
159
|
+
return null;
|
|
160
|
+
dir = parent;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Stable identity for personal project preferences.
|
|
165
|
+
*
|
|
166
|
+
* Prefer the directory that owns the shared `.notifai/config.toml`, then the
|
|
167
|
+
* git checkout root, then cwd. Subdirectories of one project therefore share
|
|
168
|
+
* one personal file, and nothing is written inside the repository.
|
|
169
|
+
*/
|
|
170
|
+
export function personalProjectIdentity(cwd) {
|
|
171
|
+
const projectConfig = findProjectConfigPath(cwd);
|
|
172
|
+
const root = projectConfig !== null ? path.dirname(path.dirname(projectConfig)) : (findGitRoot(cwd) ?? cwd);
|
|
173
|
+
return createHash('sha256').update(canonicalDir(root)).digest('hex').slice(0, 32);
|
|
174
|
+
}
|
|
175
|
+
/** Personal project layer: `$XDG_CONFIG_HOME/notifai/projects/<identity>.toml`. */
|
|
176
|
+
export function personalProjectConfigPath(cwd, env = process.env) {
|
|
177
|
+
return path.join(globalConfigDir(env), 'projects', `${personalProjectIdentity(cwd)}.toml`);
|
|
178
|
+
}
|
|
179
|
+
/** Existing personal project file, or null when this checkout has none. */
|
|
180
|
+
export function findProjectLocalConfigPath(startDir, env = process.env) {
|
|
181
|
+
const file = personalProjectConfigPath(startDir, env);
|
|
182
|
+
return existsSync(file) ? file : null;
|
|
154
183
|
}
|
|
155
184
|
/**
|
|
156
185
|
* Ranges every layer is clamped to. Config is readable from a repository, so an
|
|
@@ -199,6 +228,20 @@ function readTomlFile(filePath) {
|
|
|
199
228
|
throw new Error(`Could not parse ${filePath}: ${String(err)}`);
|
|
200
229
|
}
|
|
201
230
|
}
|
|
231
|
+
/**
|
|
232
|
+
* Service origin is not a user setting. Flag and env are developer/self-host
|
|
233
|
+
* overrides; signed-in traffic still pins to the credential origin elsewhere.
|
|
234
|
+
*/
|
|
235
|
+
function resolveServiceUrl(flags, env) {
|
|
236
|
+
if (typeof flags.base_url === 'string' && flags.base_url !== '') {
|
|
237
|
+
return { value: flags.base_url, source: 'flag' };
|
|
238
|
+
}
|
|
239
|
+
const fromEnv = env['NOTIFAI_BASE_URL'];
|
|
240
|
+
if (typeof fromEnv === 'string' && fromEnv !== '') {
|
|
241
|
+
return { value: fromEnv, source: 'env' };
|
|
242
|
+
}
|
|
243
|
+
return { value: DEFAULT_BASE_URL, source: 'default' };
|
|
244
|
+
}
|
|
202
245
|
export function loadConfig(options) {
|
|
203
246
|
const env = options.env ?? process.env;
|
|
204
247
|
const flags = options.flags ?? {};
|
|
@@ -207,7 +250,7 @@ export function loadConfig(options) {
|
|
|
207
250
|
const cwd = options.cwd ?? process.cwd();
|
|
208
251
|
const projectPath = findProjectConfigPath(cwd);
|
|
209
252
|
const projectRaw = projectPath ? readTomlFile(projectPath) : {};
|
|
210
|
-
const projectLocalPath = findProjectLocalConfigPath(cwd);
|
|
253
|
+
const projectLocalPath = findProjectLocalConfigPath(cwd, env);
|
|
211
254
|
const projectLocalRaw = projectLocalPath ? readTomlFile(projectLocalPath) : {};
|
|
212
255
|
const sessionId = options.sessionId ?? env['NOTIFAI_SESSION'];
|
|
213
256
|
const sessionPath = sessionId ? sessionConfigPath(sessionId, env) : null;
|
|
@@ -231,7 +274,7 @@ export function loadConfig(options) {
|
|
|
231
274
|
return { value: DEFAULTS[key], source: 'default' };
|
|
232
275
|
}
|
|
233
276
|
return {
|
|
234
|
-
base_url:
|
|
277
|
+
base_url: resolveServiceUrl(flags, env),
|
|
235
278
|
wait_seconds: resolve('wait_seconds'),
|
|
236
279
|
ttl_seconds: resolve('ttl_seconds'),
|
|
237
280
|
collapse_key: resolve('collapse_key'),
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAChE,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,WAAW,CAAA;AAqC9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAU,CAAA;AA+CpE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/harnesses.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/** Every harness Notifai ships. This is the sole source of the harness union. */
|
|
2
2
|
export declare const HARNESSES: readonly ["claude-code", "codex", "cursor", "opencode"];
|
|
3
3
|
export type Harness = (typeof HARNESSES)[number];
|
|
4
|
+
export declare const HARNESS_LABELS: Record<Harness, string>;
|
|
4
5
|
export type DeliveryRoute = 'hook-continuation' | 'inbox-socket' | 'owned-control-plane' | 'cold-resume' | 'hold-for-next-turn' | 'unsupported';
|
|
5
6
|
export type StopContinuation = 'decision-block' | 'followup-message' | 'unsupported';
|
|
6
7
|
export interface HarnessCapability {
|
package/dist/harnesses.js
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
/** Every harness Notifai ships. This is the sole source of the harness union. */
|
|
2
2
|
export const HARNESSES = ['claude-code', 'codex', 'cursor', 'opencode'];
|
|
3
|
+
export const HARNESS_LABELS = {
|
|
4
|
+
'claude-code': 'Claude Code',
|
|
5
|
+
codex: 'Codex',
|
|
6
|
+
cursor: 'Cursor',
|
|
7
|
+
opencode: 'OpenCode',
|
|
8
|
+
};
|
|
3
9
|
/**
|
|
4
10
|
* Exhaustive runtime contract. Adding a harness without deciding every
|
|
5
11
|
* continuation joint is a type error, not a silently degraded notification.
|
package/dist/harnesses.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../src/harnesses.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../src/harnesses.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAA;AAIhF,MAAM,CAAC,MAAM,cAAc,GAA4B;IACrD,aAAa,EAAE,aAAa;IAC5B,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;CACrB,CAAA;AAwBD;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAuC;IACtE,aAAa,EAAE;QACb,gBAAgB,EAAE,gBAAgB;QAClC,cAAc,EAAE,CAAC,mBAAmB,EAAE,cAAc,EAAE,aAAa,EAAE,oBAAoB,CAAC;QAC1F,gBAAgB,EACd,iNAAiN;KACpN;IACD,KAAK,EAAE;QACL,gBAAgB,EAAE,gBAAgB;QAClC,cAAc,EAAE,CAAC,mBAAmB,EAAE,aAAa,EAAE,oBAAoB,CAAC;QAC1E,gBAAgB,EACd,8JAA8J;KACjK;IACD,MAAM,EAAE;QACN,gBAAgB,EAAE,aAAa;QAC/B,cAAc,EAAE,CAAC,aAAa,CAAC;QAC/B,gBAAgB,EACd,gIAAgI;KACnI;IACD,QAAQ,EAAE;QACR,gBAAgB,EAAE,aAAa;QAC/B,cAAc,EAAE,CAAC,aAAa,CAAC;QAC/B,gBAAgB,EACd,gFAAgF;KACnF;CACF,CAAA"}
|
package/dist/hook-adapter.d.ts
CHANGED
|
@@ -1,7 +1,16 @@
|
|
|
1
|
-
export interface
|
|
1
|
+
export interface HookAdapterFileTarget {
|
|
2
|
+
kind?: 'file';
|
|
2
3
|
execPath: string;
|
|
3
4
|
scriptPath: string;
|
|
4
5
|
}
|
|
6
|
+
export interface HookAdapterNpxTarget {
|
|
7
|
+
kind: 'npx';
|
|
8
|
+
execPath: string;
|
|
9
|
+
npmCli: string;
|
|
10
|
+
spec: string;
|
|
11
|
+
}
|
|
12
|
+
export type HookAdapterTarget = HookAdapterFileTarget | HookAdapterNpxTarget;
|
|
13
|
+
export declare function isNpxAdapterTarget(target: HookAdapterTarget): target is HookAdapterNpxTarget;
|
|
5
14
|
export interface HookAdapterInspection {
|
|
6
15
|
path: string;
|
|
7
16
|
target: HookAdapterTarget | null;
|
package/dist/hook-adapter.js
CHANGED
|
@@ -5,6 +5,9 @@ import { atomicWriteFileSync } from './atomic-file.js';
|
|
|
5
5
|
import { withTargetFileLock } from './file-lock.js';
|
|
6
6
|
const ADAPTER_MARKER = '# notifai managed hook adapter';
|
|
7
7
|
const ADAPTER_VERSION = 1;
|
|
8
|
+
export function isNpxAdapterTarget(target) {
|
|
9
|
+
return target.kind === 'npx';
|
|
10
|
+
}
|
|
8
11
|
/**
|
|
9
12
|
* One user-level identity for every harness and every project/global install.
|
|
10
13
|
*
|
|
@@ -48,6 +51,22 @@ function assertUsableTarget(target) {
|
|
|
48
51
|
if (!exec.isFile() || (exec.mode & 0o111) === 0) {
|
|
49
52
|
throw new Error(`Hook adapter runtime ${target.execPath} is not executable.`);
|
|
50
53
|
}
|
|
54
|
+
if (isNpxAdapterTarget(target)) {
|
|
55
|
+
if (target.spec.trim() === '') {
|
|
56
|
+
throw new Error('Hook adapter npx spec is empty.');
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
if (!statSync(target.npmCli).isFile()) {
|
|
60
|
+
throw new Error(`Hook adapter npm CLI ${target.npmCli} is not a regular file.`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
if (err instanceof Error && err.message.startsWith('Hook adapter npm CLI '))
|
|
65
|
+
throw err;
|
|
66
|
+
throw new Error(`Hook adapter npm CLI ${target.npmCli} does not exist.`);
|
|
67
|
+
}
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
51
70
|
try {
|
|
52
71
|
if (!statSync(target.scriptPath).isFile()) {
|
|
53
72
|
throw new Error(`Hook adapter CLI ${target.scriptPath} is not a regular file.`);
|
|
@@ -108,18 +127,54 @@ export function inspectHookAdapter(homeDir) {
|
|
|
108
127
|
catch {
|
|
109
128
|
problems.push(`registered runtime ${target.execPath} is missing`);
|
|
110
129
|
}
|
|
111
|
-
|
|
112
|
-
if (
|
|
113
|
-
problems.push(
|
|
130
|
+
if (isNpxAdapterTarget(target)) {
|
|
131
|
+
if (target.spec.trim() === '')
|
|
132
|
+
problems.push('registered npx spec is empty');
|
|
133
|
+
try {
|
|
134
|
+
if (!statSync(target.npmCli).isFile()) {
|
|
135
|
+
problems.push(`registered npm CLI ${target.npmCli} is not a regular file`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
problems.push(`registered npm CLI ${target.npmCli} is missing`);
|
|
114
140
|
}
|
|
115
141
|
}
|
|
116
|
-
|
|
117
|
-
|
|
142
|
+
else {
|
|
143
|
+
try {
|
|
144
|
+
if (!statSync(target.scriptPath).isFile()) {
|
|
145
|
+
problems.push(`registered CLI ${target.scriptPath} is not a regular file`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
problems.push(`registered CLI ${target.scriptPath} is missing`);
|
|
150
|
+
}
|
|
118
151
|
}
|
|
119
152
|
}
|
|
120
153
|
return { path: file, target, problems };
|
|
121
154
|
}
|
|
122
155
|
function hookAdapterSource(target) {
|
|
156
|
+
if (isNpxAdapterTarget(target)) {
|
|
157
|
+
return `#!/bin/sh
|
|
158
|
+
${ADAPTER_MARKER}
|
|
159
|
+
# adapter-version: ${ADAPTER_VERSION}
|
|
160
|
+
# target-kind: npx
|
|
161
|
+
# target-exec-json: ${JSON.stringify(target.execPath)}
|
|
162
|
+
# target-npm-cli-json: ${JSON.stringify(target.npmCli)}
|
|
163
|
+
# target-spec-json: ${JSON.stringify(target.spec)}
|
|
164
|
+
set -eu
|
|
165
|
+
|
|
166
|
+
registered_exec=${quote(target.execPath)}
|
|
167
|
+
registered_npm_cli=${quote(target.npmCli)}
|
|
168
|
+
registered_spec=${quote(target.spec)}
|
|
169
|
+
|
|
170
|
+
if [ -x "$registered_exec" ] && [ -f "$registered_npm_cli" ]; then
|
|
171
|
+
exec "$registered_exec" "$registered_npm_cli" exec --yes --package "$registered_spec" -- notifai "$@"
|
|
172
|
+
fi
|
|
173
|
+
|
|
174
|
+
printf '%s\n' 'Notifai hook adapter target is stale; run notifai hooks install.' >&2
|
|
175
|
+
exit 127
|
|
176
|
+
`;
|
|
177
|
+
}
|
|
123
178
|
return `#!/bin/sh
|
|
124
179
|
${ADAPTER_MARKER}
|
|
125
180
|
# adapter-version: ${ADAPTER_VERSION}
|
|
@@ -139,16 +194,30 @@ exit 127
|
|
|
139
194
|
`;
|
|
140
195
|
}
|
|
141
196
|
function parseTarget(contents) {
|
|
197
|
+
const kind = /^# target-kind: (.+)$/m.exec(contents)?.[1];
|
|
142
198
|
const exec = /^# target-exec-json: (.+)$/m.exec(contents)?.[1];
|
|
143
|
-
|
|
144
|
-
if (exec === undefined || script === undefined)
|
|
199
|
+
if (exec === undefined)
|
|
145
200
|
return null;
|
|
146
201
|
try {
|
|
147
202
|
const execPath = JSON.parse(exec);
|
|
203
|
+
if (typeof execPath !== 'string')
|
|
204
|
+
return null;
|
|
205
|
+
if (kind === 'npx') {
|
|
206
|
+
const npmCliRaw = /^# target-npm-cli-json: (.+)$/m.exec(contents)?.[1];
|
|
207
|
+
const specRaw = /^# target-spec-json: (.+)$/m.exec(contents)?.[1];
|
|
208
|
+
if (npmCliRaw === undefined || specRaw === undefined)
|
|
209
|
+
return null;
|
|
210
|
+
const npmCli = JSON.parse(npmCliRaw);
|
|
211
|
+
const spec = JSON.parse(specRaw);
|
|
212
|
+
return typeof npmCli === 'string' && typeof spec === 'string'
|
|
213
|
+
? { kind: 'npx', execPath, npmCli, spec }
|
|
214
|
+
: null;
|
|
215
|
+
}
|
|
216
|
+
const script = /^# target-script-json: (.+)$/m.exec(contents)?.[1];
|
|
217
|
+
if (script === undefined)
|
|
218
|
+
return null;
|
|
148
219
|
const scriptPath = JSON.parse(script);
|
|
149
|
-
return typeof
|
|
150
|
-
? { execPath, scriptPath }
|
|
151
|
-
: null;
|
|
220
|
+
return typeof scriptPath === 'string' ? { execPath, scriptPath } : null;
|
|
152
221
|
}
|
|
153
222
|
catch {
|
|
154
223
|
return null;
|
package/dist/hook-adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-adapter.js","sourceRoot":"","sources":["../src/hook-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,YAAY,EACZ,QAAQ,GACT,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAEnD,MAAM,cAAc,GAAG,gCAAgC,CAAA;AACvD,MAAM,eAAe,GAAG,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"hook-adapter.js","sourceRoot":"","sources":["../src/hook-adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/install-hooks.d.ts
CHANGED
|
@@ -3,10 +3,12 @@ export { HARNESSES, type Harness } from './harnesses.js';
|
|
|
3
3
|
/**
|
|
4
4
|
* Harness hook installation.
|
|
5
5
|
*
|
|
6
|
-
* Claude Code's `settings.json` and Codex's
|
|
6
|
+
* Claude Code's `settings.json` and Codex's hook files use the same shape —
|
|
7
7
|
* `hooks` maps an event name to matcher groups, each holding command handlers
|
|
8
8
|
* with an optional timeout — so one generator serves both. Only the file
|
|
9
|
-
* location and the event set differ.
|
|
9
|
+
* location and the event set differ. Codex accepts that shape as `hooks.json`
|
|
10
|
+
* or as inline `[hooks]` tables in the same layer's `config.toml`; one
|
|
11
|
+
* representation per layer, never both.
|
|
10
12
|
*
|
|
11
13
|
* Cursor's native format is flat and lower-camel-cased, while OpenCode's
|
|
12
14
|
* extension point is a JavaScript plugin module. Each therefore has a bounded
|
|
@@ -142,25 +144,60 @@ export declare function codexLayerDir(cwd: string): string | null;
|
|
|
142
144
|
* into a file Codex never reads and the failure is silent. Observed 2026-08-02.
|
|
143
145
|
*/
|
|
144
146
|
export declare function configHome(env: NodeJS.ProcessEnv, variable: string, fallback: string): string;
|
|
147
|
+
export interface CodexLayerPaths {
|
|
148
|
+
dir: string;
|
|
149
|
+
hooksJson: string;
|
|
150
|
+
configToml: string;
|
|
151
|
+
}
|
|
152
|
+
/** The two files Codex will look at for one config layer. */
|
|
153
|
+
export declare function codexLayerPaths(global: boolean, cwd: string, env?: NodeJS.ProcessEnv): CodexLayerPaths;
|
|
154
|
+
export interface CodexLayerInspection {
|
|
155
|
+
paths: CodexLayerPaths;
|
|
156
|
+
jsonEvents: string[];
|
|
157
|
+
tomlEvents: string[];
|
|
158
|
+
writeTarget: string;
|
|
159
|
+
dual: boolean;
|
|
160
|
+
overlappingEvents: string[];
|
|
161
|
+
canCollapse: boolean;
|
|
162
|
+
}
|
|
145
163
|
/**
|
|
146
|
-
* Which
|
|
147
|
-
* unclear.
|
|
164
|
+
* Which representation this Codex layer already uses.
|
|
148
165
|
*
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
166
|
+
* Codex loads `hooks.json` and inline `[hooks]` side by side, runs every
|
|
167
|
+
* matching handler, and warns when both exist. `[hooks.state]` is the trust
|
|
168
|
+
* store, not a hook definition, so it does not count as a representation.
|
|
169
|
+
*/
|
|
170
|
+
export declare function inspectCodexLayer(paths: CodexLayerPaths): CodexLayerInspection;
|
|
171
|
+
/** Every file in this layer Codex might already be reading hooks from. */
|
|
172
|
+
export declare function hookDefinitionFiles(harness: Harness, global: boolean, cwd: string, env?: NodeJS.ProcessEnv): string[];
|
|
173
|
+
/**
|
|
174
|
+
* Drop the unused representation after writing the one this layer already had.
|
|
175
|
+
*
|
|
176
|
+
* Only safe when the discarded file has no one else's handlers. `hooks.json`
|
|
177
|
+
* is deleted once it has no events left so Codex stops warning; `config.toml`
|
|
178
|
+
* is never deleted.
|
|
179
|
+
*/
|
|
180
|
+
export declare function collapseUnusedCodexRepresentation(keepFile: string, scriptPath: string, paths: CodexLayerPaths): string | null;
|
|
181
|
+
export declare function codexRepresentationProblems(cwd: string, env?: NodeJS.ProcessEnv): string[];
|
|
182
|
+
/**
|
|
183
|
+
* Every supported harness this project or machine shows evidence of, in
|
|
184
|
+
* declared order. Project markers come first, then machine installs that the
|
|
185
|
+
* project did not already name.
|
|
186
|
+
*
|
|
187
|
+
* `AGENTS.md` still counts for nothing — see `localHarnessEvidence`.
|
|
188
|
+
*/
|
|
189
|
+
export declare function detectedHarnesses(cwd: string, env?: NodeJS.ProcessEnv): Harness[];
|
|
190
|
+
/**
|
|
191
|
+
* Which *single* harness to wire when a caller still needs exactly one, or
|
|
192
|
+
* null when it is genuinely unclear.
|
|
157
193
|
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
194
|
+
* Project evidence decides, and machine evidence is consulted only when the
|
|
195
|
+
* project offers none. Several markers are not a failure of detection — they
|
|
196
|
+
* are several harnesses. `detectedHarnesses` is the default for install;
|
|
197
|
+
* this helper stays for uninstall and any caller that cannot take a list.
|
|
161
198
|
*/
|
|
162
|
-
export declare function detectHarness(cwd: string): Harness | null;
|
|
163
|
-
interface SettingsDocument {
|
|
199
|
+
export declare function detectHarness(cwd: string, env?: NodeJS.ProcessEnv): Harness | null;
|
|
200
|
+
export interface SettingsDocument {
|
|
164
201
|
hooks?: HookConfig;
|
|
165
202
|
[key: string]: unknown;
|
|
166
203
|
}
|