@raidiant/notifai 8.0.0 → 9.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.
Files changed (145) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +20 -13
  3. package/dist/atomic-file.d.ts +14 -0
  4. package/dist/atomic-file.js +27 -2
  5. package/dist/atomic-file.js.map +1 -1
  6. package/dist/cli-bin.d.ts +4 -0
  7. package/dist/cli-bin.js +62 -0
  8. package/dist/cli-bin.js.map +1 -0
  9. package/dist/cli-release.d.ts +10 -0
  10. package/dist/cli-release.js +75 -0
  11. package/dist/cli-release.js.map +1 -0
  12. package/dist/client.d.ts +1 -0
  13. package/dist/client.js +13 -3
  14. package/dist/client.js.map +1 -1
  15. package/dist/commands-auth.d.ts +6 -0
  16. package/dist/commands-auth.js +28 -3
  17. package/dist/commands-auth.js.map +1 -1
  18. package/dist/commands-config.js +22 -3
  19. package/dist/commands-config.js.map +1 -1
  20. package/dist/commands-core.d.ts +12 -0
  21. package/dist/commands-core.js +27 -3
  22. package/dist/commands-core.js.map +1 -1
  23. package/dist/commands-doctor.d.ts +1 -0
  24. package/dist/commands-doctor.js +71 -15
  25. package/dist/commands-doctor.js.map +1 -1
  26. package/dist/commands-guidance.d.ts +7 -3
  27. package/dist/commands-guidance.js +63 -28
  28. package/dist/commands-guidance.js.map +1 -1
  29. package/dist/commands-hooks.d.ts +9 -4
  30. package/dist/commands-hooks.js +430 -32
  31. package/dist/commands-hooks.js.map +1 -1
  32. package/dist/commands-init.d.ts +10 -18
  33. package/dist/commands-init.js +114 -32
  34. package/dist/commands-init.js.map +1 -1
  35. package/dist/commands-send-support.d.ts +17 -2
  36. package/dist/commands-send-support.js +61 -5
  37. package/dist/commands-send-support.js.map +1 -1
  38. package/dist/commands-send.js +60 -11
  39. package/dist/commands-send.js.map +1 -1
  40. package/dist/commands-setup-proof.d.ts +8 -0
  41. package/dist/commands-setup-proof.js +31 -2
  42. package/dist/commands-setup-proof.js.map +1 -1
  43. package/dist/commands-skill.d.ts +11 -1
  44. package/dist/commands-skill.js +61 -11
  45. package/dist/commands-skill.js.map +1 -1
  46. package/dist/commands.d.ts +1 -1
  47. package/dist/commands.js.map +1 -1
  48. package/dist/config-schema.d.ts +1 -1
  49. package/dist/config-schema.js +25 -0
  50. package/dist/config-schema.js.map +1 -1
  51. package/dist/config.d.ts +24 -3
  52. package/dist/config.js +37 -5
  53. package/dist/config.js.map +1 -1
  54. package/dist/credentials.d.ts +10 -1
  55. package/dist/credentials.js +25 -12
  56. package/dist/credentials.js.map +1 -1
  57. package/dist/guidance-content.d.ts +20 -0
  58. package/dist/guidance-content.js +73 -8
  59. package/dist/guidance-content.js.map +1 -1
  60. package/dist/guidance.d.ts +21 -0
  61. package/dist/guidance.js +73 -18
  62. package/dist/guidance.js.map +1 -1
  63. package/dist/hook-adapter.js +37 -3
  64. package/dist/hook-adapter.js.map +1 -1
  65. package/dist/hooks.d.ts +68 -7
  66. package/dist/hooks.js +231 -85
  67. package/dist/hooks.js.map +1 -1
  68. package/dist/install-hooks.d.ts +10 -18
  69. package/dist/install-hooks.js +110 -23
  70. package/dist/install-hooks.js.map +1 -1
  71. package/dist/interactive.d.ts +1 -1
  72. package/dist/interactive.js +1 -1
  73. package/dist/interactive.js.map +1 -1
  74. package/dist/logging.d.ts +8 -1
  75. package/dist/logging.js +43 -2
  76. package/dist/logging.js.map +1 -1
  77. package/dist/main.js +2 -13
  78. package/dist/main.js.map +1 -1
  79. package/dist/native-skills.d.ts +19 -0
  80. package/dist/native-skills.js +30 -8
  81. package/dist/native-skills.js.map +1 -1
  82. package/dist/opencode-plugin.js +14 -1
  83. package/dist/opencode-plugin.js.map +1 -1
  84. package/dist/program.js +13 -8
  85. package/dist/program.js.map +1 -1
  86. package/dist/send.d.ts +8 -1
  87. package/dist/send.js +17 -1
  88. package/dist/send.js.map +1 -1
  89. package/dist/session-activation.d.ts +15 -0
  90. package/dist/session-activation.js +35 -0
  91. package/dist/session-activation.js.map +1 -0
  92. package/dist/url-policy.d.ts +85 -0
  93. package/dist/url-policy.js +369 -0
  94. package/dist/url-policy.js.map +1 -0
  95. package/package.json +3 -3
  96. package/src/atomic-file.ts +36 -2
  97. package/src/cli-bin.test.ts +38 -0
  98. package/src/cli-bin.ts +67 -0
  99. package/src/cli-release.test.ts +46 -0
  100. package/src/cli-release.ts +78 -0
  101. package/src/client.test.ts +95 -0
  102. package/src/client.ts +16 -3
  103. package/src/commands-auth.ts +32 -3
  104. package/src/commands-config.ts +25 -2
  105. package/src/commands-core.ts +38 -3
  106. package/src/commands-doctor.ts +99 -13
  107. package/src/commands-guidance.ts +75 -29
  108. package/src/commands-hooks.ts +503 -34
  109. package/src/commands-init.ts +139 -38
  110. package/src/commands-send-support.test.ts +156 -0
  111. package/src/commands-send-support.ts +67 -5
  112. package/src/commands-send.ts +73 -10
  113. package/src/commands-setup-proof.ts +36 -2
  114. package/src/commands-skill.ts +78 -15
  115. package/src/commands.test.ts +1083 -101
  116. package/src/commands.ts +1 -0
  117. package/src/config-schema.ts +28 -1
  118. package/src/config.test.ts +1 -1
  119. package/src/config.ts +49 -5
  120. package/src/credentials.test.ts +71 -3
  121. package/src/credentials.ts +29 -15
  122. package/src/guidance-content.ts +74 -8
  123. package/src/guidance.test.ts +42 -11
  124. package/src/guidance.ts +100 -18
  125. package/src/hook-adapter.test.ts +113 -1
  126. package/src/hook-adapter.ts +37 -3
  127. package/src/hooks.test.ts +746 -165
  128. package/src/hooks.ts +299 -124
  129. package/src/install-hooks.test.ts +135 -16
  130. package/src/install-hooks.ts +113 -25
  131. package/src/interactive.ts +1 -1
  132. package/src/logging.test.ts +66 -3
  133. package/src/logging.ts +45 -2
  134. package/src/main.ts +2 -14
  135. package/src/native-skills.test.ts +41 -1
  136. package/src/native-skills.ts +40 -6
  137. package/src/opencode-plugin.ts +14 -1
  138. package/src/program.test.ts +37 -2
  139. package/src/program.ts +40 -12
  140. package/src/send.test.ts +28 -0
  141. package/src/send.ts +28 -2
  142. package/src/session-activation.ts +45 -0
  143. package/src/skill.test.ts +120 -4
  144. package/src/trust-policy.test.ts +701 -0
  145. package/src/url-policy.ts +399 -0
@@ -2,34 +2,62 @@ import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { describeSource } from './config-schema.js';
4
4
  import { EXIT } from './commands-core.js';
5
- import { SHIPPED_GUIDANCE, shippedGuidanceTopic } from './guidance-content.js';
5
+ import { GUIDANCE_TRUST_PREAMBLE, SHIPPED_GUIDANCE, shippedGuidanceTopic, } from './guidance-content.js';
6
6
  import { GUIDANCE_TOPIC_MAX_BYTES, GUIDANCE_TOPIC_PATTERN, findProjectGuidanceDir, globalGuidanceDir, personalProjectGuidanceDir, resolveGuidance, } from './guidance.js';
7
7
  // ---------------------------------------------------------------------------
8
8
  // guidance show / set / unset
9
9
  // ---------------------------------------------------------------------------
10
+ /** How each authority is named in the marker above a topic. */
11
+ const AUTHORITY_LABEL = {
12
+ user: 'you',
13
+ repository: 'this repository',
14
+ shipped: 'shipped default',
15
+ };
10
16
  /**
11
- * The whole effective guidance, ready to be followed as read. Each topic is
12
- * printed under a provenance comment so a reader can tell the user's standing
13
- * word from the shipped default without the output stopping being Markdown.
17
+ * The token that makes a marker line ours.
18
+ *
19
+ * Without it, a repository topic could open with a handwritten
20
+ * `<!-- when-to-notify · this machine · /Users/... -->` and everything after
21
+ * it would read as the User's own standing word. The marker therefore carries
22
+ * a fixed token, and any occurrence of that token inside file content is
23
+ * defanged below — so the only lines that can claim to be provenance are the
24
+ * ones this command wrote.
25
+ */
26
+ const MARKER_TOKEN = 'notifai:guidance';
27
+ function markerSafe(content) {
28
+ return content.replaceAll(MARKER_TOKEN, `${MARKER_TOKEN.replace(':', '-')} [not a provenance marker]`);
29
+ }
30
+ /**
31
+ * The whole effective guidance, ready to be followed as read.
32
+ *
33
+ * The trust preamble comes first and belongs to the CLI: it says who supplied
34
+ * each topic and what no topic may ask for. Each topic then follows its own
35
+ * marker, so a reader can tell the User's standing word from a repository's
36
+ * house rules from the shipped default without the output stopping being
37
+ * Markdown.
14
38
  */
15
39
  export function guidanceShowCommand(deps, flags) {
16
40
  const topics = resolveGuidance({ cwd: deps.cwd, env: deps.env });
17
41
  if (flags.json) {
18
- deps.io.out(JSON.stringify(topics.map((topic) => ({
19
- name: topic.name,
20
- source: topic.source,
21
- summary: topic.summary,
22
- content: topic.content,
23
- })), null, 2));
42
+ deps.io.out(JSON.stringify({
43
+ trust: GUIDANCE_TRUST_PREAMBLE,
44
+ topics: topics.map((topic) => ({
45
+ name: topic.name,
46
+ source: topic.source,
47
+ authority: topic.authority,
48
+ summary: topic.summary,
49
+ content: topic.content,
50
+ })),
51
+ }, null, 2));
24
52
  return EXIT.ok;
25
53
  }
26
54
  const blocks = topics.map((topic) => {
27
- const { label, path: filePath } = describeSource(topic.source);
28
- const origin = topic.source === 'default' ? 'shipped default' : label;
29
- const provenance = filePath === null ? origin : `${origin} · ${filePath}`;
30
- return `<!-- ${topic.name} · ${provenance} -->\n${topic.content.trimEnd()}`;
55
+ const { path: filePath } = describeSource(topic.source);
56
+ const marker = `<!-- ${MARKER_TOKEN} topic=${topic.name} from=${AUTHORITY_LABEL[topic.authority]}` +
57
+ `${filePath === null ? '' : ` file=${encodeURIComponent(filePath)}`} -->`;
58
+ return `${marker}\n${markerSafe(topic.content).trimEnd()}`;
31
59
  });
32
- deps.io.out(blocks.join('\n\n'));
60
+ deps.io.out([GUIDANCE_TRUST_PREAMBLE, ...blocks].join('\n\n'));
33
61
  return EXIT.ok;
34
62
  }
35
63
  /**
@@ -57,9 +85,9 @@ async function guidanceMutationTarget(deps, topic, flags) {
57
85
  deps.io.interactive === true &&
58
86
  deps.io.select) {
59
87
  const selected = await deps.io.select('Where should this guidance live?', [
60
- { value: 'global', label: 'This machine', hint: 'applies across projects' },
61
- { value: 'project', label: 'This project (shared)', hint: '.notifai/guidance/' },
62
- { value: 'local', label: 'This project (personal)', hint: 'stored on this machine, not in the repo' },
88
+ { value: 'global', label: 'This machine', hint: 'your standing word, applies across projects' },
89
+ { value: 'project', label: 'This project (shared)', hint: '.notifai/guidance/ — committed, read as project policy' },
90
+ { value: 'local', label: 'This project (personal)', hint: 'your standing word here, stored outside the repo' },
63
91
  ]);
64
92
  if (selected === null) {
65
93
  deps.io.err('No guidance layer selected.');
@@ -67,7 +95,7 @@ async function guidanceMutationTarget(deps, topic, flags) {
67
95
  }
68
96
  layer = selected;
69
97
  }
70
- return path.join(guidanceLayerDir(deps, layer), `${topic}.md`);
98
+ return { path: path.join(guidanceLayerDir(deps, layer), `${topic}.md`), layer };
71
99
  }
72
100
  /**
73
101
  * Writes one topic at one layer, replacing the shipped topic of that name for
@@ -92,37 +120,44 @@ export async function guidanceSetCommand(deps, topic, text, flags) {
92
120
  const replaces = shipped === undefined
93
121
  ? `Add guidance topic "${topic}"`
94
122
  : `Replace the shipped "${topic}" guidance for this scope`;
95
- const confirmed = await deps.io.confirm(`${replaces} at ${target}?`);
123
+ const confirmed = await deps.io.confirm(`${replaces} at ${target.path}?`);
96
124
  if (!confirmed) {
97
125
  deps.io.err('Not confirmed. Pass --yes to skip the confirmation gate.');
98
126
  return EXIT.usage;
99
127
  }
100
128
  }
101
- mkdirSync(path.dirname(target), { recursive: true });
102
- writeFileSync(target, text.endsWith('\n') ? text : `${text}\n`);
103
- deps.io.out(`Wrote ${topic} to ${target}`);
129
+ mkdirSync(path.dirname(target.path), { recursive: true });
130
+ writeFileSync(target.path, text.endsWith('\n') ? text : `${text}\n`);
131
+ deps.io.out(`Wrote ${topic} to ${target.path}`);
104
132
  if (shipped !== undefined) {
105
133
  deps.io.out(`This file now replaces the shipped "${topic}" guidance wherever it applies.`);
106
134
  }
135
+ // A shared file is committed and travels to everyone who clones this
136
+ // repository, where it is read as the project's policy rather than as
137
+ // anyone's personal standing word. Worth saying at the moment of writing:
138
+ // the same sentence means something different in the two locations.
139
+ if (target.layer === 'project') {
140
+ deps.io.out('This is shared project policy: it is committed, everyone working here reads it, and it is never read as the User\'s own standing word. Use --local for a personal preference.');
141
+ }
107
142
  return EXIT.ok;
108
143
  }
109
144
  export async function guidanceUnsetCommand(deps, topic, flags) {
110
145
  const target = await guidanceMutationTarget(deps, topic, flags);
111
146
  if (target === null)
112
147
  return EXIT.usage;
113
- if (!existsSync(target)) {
114
- deps.io.out(`${topic} is not set at ${target}`);
148
+ if (!existsSync(target.path)) {
149
+ deps.io.out(`${topic} is not set at ${target.path}`);
115
150
  return EXIT.ok;
116
151
  }
117
152
  if (!flags.yes) {
118
- const confirmed = await deps.io.confirm(`Remove ${target}?`);
153
+ const confirmed = await deps.io.confirm(`Remove ${target.path}?`);
119
154
  if (!confirmed) {
120
155
  deps.io.err('Not confirmed. Pass --yes to skip the confirmation gate.');
121
156
  return EXIT.usage;
122
157
  }
123
158
  }
124
- rmSync(target, { force: true });
125
- deps.io.out(`Removed ${target}; the inherited guidance now applies.`);
159
+ rmSync(target.path, { force: true });
160
+ deps.io.out(`Removed ${target.path}; the inherited guidance now applies.`);
126
161
  return EXIT.ok;
127
162
  }
128
163
  //# sourceMappingURL=commands-guidance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"commands-guidance.js","sourceRoot":"","sources":["../src/commands-guidance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands-guidance.js","sourceRoot":"","sources":["../src/commands-guidance.ts"],"names":[],"mappings":"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"}
@@ -3,14 +3,16 @@ import { type HookHarness } from './hooks.js';
3
3
  import { type Harness, type Installation } from './install-hooks.js';
4
4
  import { type CommandDeps } from './commands-core.js';
5
5
  import { type ActiveHarnessSession } from './commands-harness-context.js';
6
- export declare const HOOK_EVENTS: readonly ["user-prompt-submit", "stop", "session-end"];
6
+ export declare const HOOK_EVENTS: readonly ["session-start", "subagent-start", "activation-stop", "user-prompt-submit", "stop", "session-end"];
7
7
  export type HookEvent = (typeof HOOK_EVENTS)[number];
8
+ /** Lifecycle handlers one installed harness must carry in this CLI build. */
9
+ export declare function requiredHookEvents(harness: Harness): readonly HookEvent[];
8
10
  /** SessionEnd cleanup must precede every diagnostic that can wait on a file lock. */
9
11
  export declare function hookDefersDiagnosticsUntilAfterCleanup(event: unknown): event is 'session-end';
10
12
  /**
11
13
  * Runs one harness hook. Contract with every harness: hook JSON arrives on
12
- * stdin, the decision (if any) goes to stdout, diagnostics go to stderr, and
13
- * exit 0 with no stdout means "no decision — carry on as normal".
14
+ * stdin, harness output (if any) goes to stdout, diagnostics go to stderr, and
15
+ * exit 0 with no stdout means "no decision or added context — carry on as normal".
14
16
  *
15
17
  * Every failure path in here must reach that no-decision state. A hook that
16
18
  * throws, or that blocks past the harness's timeout, degrades the agent for a
@@ -40,6 +42,8 @@ export interface AskFlags {
40
42
  multi?: boolean;
41
43
  /** Optional Markdown context appended after the question block. */
42
44
  body?: string;
45
+ /** Allow visible backslash-n sequences in `--body`. */
46
+ literalBackslashN?: boolean;
43
47
  /** Raw JSON for a multi-question form; replaces the positional question. */
44
48
  form?: string;
45
49
  image?: string[];
@@ -99,8 +103,9 @@ export declare function acknowledgeCommand(deps: CommandDeps, requestId: string,
99
103
  json?: boolean;
100
104
  }): Promise<number>;
101
105
  /** Retire a question so a late answer is rejected rather than silently lost. */
102
- export declare function closeCommand(deps: CommandDeps, requestId: string, flags?: {
106
+ export declare function closeCommand(deps: CommandDeps, requestId: string | undefined, flags?: {
103
107
  json?: boolean;
108
+ pending?: boolean;
104
109
  }): Promise<number>;
105
110
  export interface HooksInstallFlags {
106
111
  harness?: string;