greprag 5.6.1 → 5.7.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.
@@ -0,0 +1,357 @@
1
+ "use strict";
2
+ // adr: adr/lore-rename.md
3
+ /** greprag lore — per-project LEARNINGS substrate.
4
+ *
5
+ * Lore = what was learned (Old English `lār`). Project-specific emergent
6
+ * knowledge — discovered constraints, gotchas, tribal knowledge that drifts
7
+ * as the codebase evolves. Reviewed via /lore-advisor. Distinct from static
8
+ * project knowledge (which lives in CLAUDE.md / docs / code structure).
9
+ *
10
+ * Pull-based: agents seed lore they wish a future spawned chip had known;
11
+ * future chips query the relevant scope at spawn time and skip the
12
+ * discovery they would otherwise repeat. All server work delegates to
13
+ * FactsService in @greprag/core via /v1/facts/:projectId — the CLI is a
14
+ * thin HTTP printer + project resolver.
15
+ *
16
+ * Note: the server-side route + DB column stay named `facts` (internal —
17
+ * surface-only rename in v5.7.0). The CLI maps `lore` commands to `facts` URLs.
18
+ *
19
+ * Subcommands:
20
+ * add "<text>" --scope <S> [--project <name>] [--source-session <id>]
21
+ * query [--scope <S>] [--query "<intent>"] [--project <name>]
22
+ * [--limit <N=10>] [--format markdown|json]
23
+ * list [--project <name>] [--format markdown|json]
24
+ * delete <nodeId> [--project <name>]
25
+ * scopes [--project <name>]
26
+ *
27
+ * Project resolution: without --project, uses the current cwd's project
28
+ * anchor (readAnchor). With --project <name>, hits /v1/projects to
29
+ * resolve name → projectId (case-insensitive). */
30
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
31
+ if (k2 === undefined) k2 = k;
32
+ var desc = Object.getOwnPropertyDescriptor(m, k);
33
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
34
+ desc = { enumerable: true, get: function() { return m[k]; } };
35
+ }
36
+ Object.defineProperty(o, k2, desc);
37
+ }) : (function(o, m, k, k2) {
38
+ if (k2 === undefined) k2 = k;
39
+ o[k2] = m[k];
40
+ }));
41
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
42
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
43
+ }) : function(o, v) {
44
+ o["default"] = v;
45
+ });
46
+ var __importStar = (this && this.__importStar) || (function () {
47
+ var ownKeys = function(o) {
48
+ ownKeys = Object.getOwnPropertyNames || function (o) {
49
+ var ar = [];
50
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
51
+ return ar;
52
+ };
53
+ return ownKeys(o);
54
+ };
55
+ return function (mod) {
56
+ if (mod && mod.__esModule) return mod;
57
+ var result = {};
58
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
59
+ __setModuleDefault(result, mod);
60
+ return result;
61
+ };
62
+ })();
63
+ Object.defineProperty(exports, "__esModule", { value: true });
64
+ exports.runLore = runLore;
65
+ const fs = __importStar(require("fs"));
66
+ const path = __importStar(require("path"));
67
+ const project_anchor_1 = require("../project-anchor");
68
+ const API_URL_DEFAULT = 'https://api.greprag.com';
69
+ // ---------- Config / env (mirrors corpus.ts) ------------------------------
70
+ function loadEnvFile(filePath) {
71
+ try {
72
+ const content = fs.readFileSync(filePath, 'utf-8');
73
+ for (const line of content.split('\n')) {
74
+ const trimmed = line.trim();
75
+ if (!trimmed || trimmed.startsWith('#'))
76
+ continue;
77
+ const eqIdx = trimmed.indexOf('=');
78
+ if (eqIdx < 1)
79
+ continue;
80
+ const key = trimmed.slice(0, eqIdx).trim();
81
+ let value = trimmed.slice(eqIdx + 1).trim();
82
+ if ((value.startsWith('"') && value.endsWith('"')) ||
83
+ (value.startsWith("'") && value.endsWith("'"))) {
84
+ value = value.slice(1, -1);
85
+ }
86
+ if (!process.env[key])
87
+ process.env[key] = value;
88
+ }
89
+ }
90
+ catch { /* file missing — fine */ }
91
+ }
92
+ function getConfig() {
93
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
94
+ if (homeDir)
95
+ loadEnvFile(path.join(homeDir, '.greprag', '.env'));
96
+ if (!process.env.GREPRAG_API_KEY)
97
+ loadEnvFile(path.join(process.cwd(), '.env'));
98
+ return {
99
+ apiUrl: process.env.GREPRAG_API_URL || API_URL_DEFAULT,
100
+ apiKey: process.env.GREPRAG_API_KEY || '',
101
+ };
102
+ }
103
+ async function apiCall(url, apiKey, body) {
104
+ const res = await fetch(url, {
105
+ method: 'POST',
106
+ headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
107
+ body: JSON.stringify(body),
108
+ });
109
+ if (!res.ok)
110
+ throw new Error(`API ${res.status}: ${await res.text()}`);
111
+ return res.json();
112
+ }
113
+ async function apiGet(url, apiKey) {
114
+ const res = await fetch(url, { headers: { 'Authorization': `Bearer ${apiKey}` } });
115
+ if (!res.ok)
116
+ throw new Error(`API ${res.status}: ${await res.text()}`);
117
+ return res.json();
118
+ }
119
+ async function apiDelete(url, apiKey) {
120
+ const res = await fetch(url, {
121
+ method: 'DELETE',
122
+ headers: { 'Authorization': `Bearer ${apiKey}` },
123
+ });
124
+ if (!res.ok)
125
+ throw new Error(`API ${res.status}: ${await res.text()}`);
126
+ return res.json();
127
+ }
128
+ // ---------- Helpers --------------------------------------------------------
129
+ function getFlag(args, flag) {
130
+ const idx = args.indexOf(flag);
131
+ if (idx === -1 || idx + 1 >= args.length)
132
+ return undefined;
133
+ return args[idx + 1];
134
+ }
135
+ function abortNotConfigured() {
136
+ console.error('Not configured. Run: greprag init');
137
+ process.exit(1);
138
+ }
139
+ /** Resolve which project a lore command operates on. --project <name> wins
140
+ * via the tenant's projects registry; otherwise the cwd's anchor decides. */
141
+ async function resolveProject(args, apiUrl, apiKey) {
142
+ const projectArg = getFlag(args, '--project');
143
+ if (!projectArg) {
144
+ const anchor = (0, project_anchor_1.readAnchor)(process.cwd());
145
+ return { projectId: anchor.projectId, projectName: anchor.projectName };
146
+ }
147
+ const r = await apiGet(`${apiUrl}/v1/projects`, apiKey);
148
+ const needle = projectArg.trim().toLowerCase();
149
+ const match = (r.projects || []).find(p => p.project_name.toLowerCase() === needle);
150
+ if (!match) {
151
+ throw new Error(`project "${projectArg}" not found under this tenant. ` +
152
+ `Register it via 'greprag init' in that directory, then retry.`);
153
+ }
154
+ return { projectId: match.project_id, projectName: match.project_name };
155
+ }
156
+ /** Try to read the current session's UUID from the harness env (Claude Code
157
+ * exposes it as CLAUDE_SESSION_ID on hook invocations). Falls back to
158
+ * undefined — callers should pass --source-session explicitly when they
159
+ * know it. */
160
+ function readSessionEnv() {
161
+ return process.env.CLAUDE_SESSION_ID || process.env.GREPRAG_SESSION_ID || null;
162
+ }
163
+ // ---------- add -----------------------------------------------------------
164
+ async function addCmd(args) {
165
+ const cfg = getConfig();
166
+ if (!cfg.apiKey)
167
+ abortNotConfigured();
168
+ const text = args[0];
169
+ if (!text || text.startsWith('--')) {
170
+ console.error('Usage: greprag lore add "<text>" --scope <scope> [--project <name>] [--source-session <id>]');
171
+ process.exit(1);
172
+ }
173
+ const scope = getFlag(args, '--scope');
174
+ if (!scope) {
175
+ console.error('Usage: greprag lore add "<text>" --scope <scope> [--project <name>]');
176
+ process.exit(1);
177
+ }
178
+ const sourceSession = getFlag(args, '--source-session') || readSessionEnv();
179
+ const { projectId, projectName } = await resolveProject(args, cfg.apiUrl, cfg.apiKey);
180
+ const result = await apiCall(`${cfg.apiUrl}/v1/facts/${projectId}`, cfg.apiKey, {
181
+ text, scope,
182
+ sourceSessionId: sourceSession,
183
+ projectName,
184
+ });
185
+ if (!result.ok || !result.nodeId)
186
+ throw new Error(result.error || 'add failed');
187
+ console.log(`Added lore [${result.nodeId}] scope=${scope} project=${projectName}`);
188
+ }
189
+ // ---------- query ---------------------------------------------------------
190
+ async function queryCmd(args) {
191
+ const cfg = getConfig();
192
+ if (!cfg.apiKey)
193
+ abortNotConfigured();
194
+ const scope = getFlag(args, '--scope');
195
+ const queryStr = getFlag(args, '--query');
196
+ const limit = parseInt(getFlag(args, '--limit') || '10', 10);
197
+ const format = (getFlag(args, '--format') || 'markdown').toLowerCase();
198
+ if (format !== 'markdown' && format !== 'json') {
199
+ console.error('--format must be markdown or json');
200
+ process.exit(1);
201
+ }
202
+ const { projectId, projectName } = await resolveProject(args, cfg.apiUrl, cfg.apiKey);
203
+ const params = new URLSearchParams();
204
+ if (scope)
205
+ params.set('scope', scope);
206
+ if (queryStr)
207
+ params.set('query', queryStr);
208
+ params.set('limit', String(limit));
209
+ const result = await apiGet(`${cfg.apiUrl}/v1/facts/${projectId}?${params.toString()}`, cfg.apiKey);
210
+ if (!result.ok || !result.facts)
211
+ throw new Error(result.error || 'query failed');
212
+ if (format === 'json') {
213
+ console.log(JSON.stringify({
214
+ project: projectName,
215
+ scope: scope ?? null,
216
+ query: queryStr ?? null,
217
+ lore: result.facts,
218
+ }, null, 2));
219
+ return;
220
+ }
221
+ if (result.facts.length === 0) {
222
+ const scopeNote = scope ? ` (scope=${scope})` : '';
223
+ const queryNote = queryStr ? ` matching "${queryStr}"` : '';
224
+ console.log(`No lore in ${projectName}${scopeNote}${queryNote}.`);
225
+ return;
226
+ }
227
+ for (let i = 0; i < result.facts.length; i++) {
228
+ console.log(`${i + 1}. ${result.facts[i].text}`);
229
+ }
230
+ }
231
+ // ---------- list ----------------------------------------------------------
232
+ async function listCmd(args) {
233
+ const cfg = getConfig();
234
+ if (!cfg.apiKey)
235
+ abortNotConfigured();
236
+ const format = (getFlag(args, '--format') || 'text').toLowerCase();
237
+ if (format !== 'text' && format !== 'json' && format !== 'markdown') {
238
+ console.error('--format must be text, markdown, or json');
239
+ process.exit(1);
240
+ }
241
+ const { projectId, projectName } = await resolveProject(args, cfg.apiUrl, cfg.apiKey);
242
+ const result = await apiGet(`${cfg.apiUrl}/v1/facts/${projectId}/list`, cfg.apiKey);
243
+ if (!result.ok || !result.facts)
244
+ throw new Error(result.error || 'list failed');
245
+ if (format === 'json') {
246
+ console.log(JSON.stringify({
247
+ project: projectName,
248
+ lore: result.facts,
249
+ }, null, 2));
250
+ return;
251
+ }
252
+ if (result.facts.length === 0) {
253
+ console.log(`No lore seeded in ${projectName} yet.`);
254
+ console.log('Add some: greprag lore add "<text>" --scope <scope>');
255
+ return;
256
+ }
257
+ // Group by scope (server already orders scope ASC, createdAt DESC).
258
+ const grouped = new Map();
259
+ for (const f of result.facts) {
260
+ const scope = f.scope || '(no scope)';
261
+ if (!grouped.has(scope))
262
+ grouped.set(scope, []);
263
+ grouped.get(scope).push(f);
264
+ }
265
+ console.log(`\n${result.facts.length} lore entr${result.facts.length === 1 ? 'y' : 'ies'} in ${projectName}:\n`);
266
+ for (const [scope, rows] of grouped) {
267
+ console.log(`## ${scope} (${rows.length})`);
268
+ for (const f of rows) {
269
+ const date = f.createdAt ? f.createdAt.slice(0, 10) : '';
270
+ console.log(` [${f.nodeId}] ${date} ${f.text}`);
271
+ }
272
+ console.log('');
273
+ }
274
+ }
275
+ // ---------- delete --------------------------------------------------------
276
+ async function deleteCmd(args) {
277
+ const cfg = getConfig();
278
+ if (!cfg.apiKey)
279
+ abortNotConfigured();
280
+ const nodeId = args[0];
281
+ if (!nodeId || nodeId.startsWith('--')) {
282
+ console.error('Usage: greprag lore delete <nodeId> [--project <name>]');
283
+ process.exit(1);
284
+ }
285
+ if (!/^[0-9a-f]{8}$/i.test(nodeId)) {
286
+ console.error('nodeId must be 8 hex chars (printed in `greprag lore list`).');
287
+ process.exit(1);
288
+ }
289
+ const { projectId, projectName } = await resolveProject(args, cfg.apiUrl, cfg.apiKey);
290
+ const result = await apiDelete(`${cfg.apiUrl}/v1/facts/${projectId}/${nodeId}`, cfg.apiKey);
291
+ if (!result.ok)
292
+ throw new Error(result.error || 'delete failed');
293
+ console.log(`Deleted lore [${nodeId}] from ${projectName}`);
294
+ }
295
+ // ---------- scopes --------------------------------------------------------
296
+ async function scopesCmd(args) {
297
+ const cfg = getConfig();
298
+ if (!cfg.apiKey)
299
+ abortNotConfigured();
300
+ const { projectId, projectName } = await resolveProject(args, cfg.apiUrl, cfg.apiKey);
301
+ const result = await apiGet(`${cfg.apiUrl}/v1/facts/${projectId}/scopes`, cfg.apiKey);
302
+ if (!result.ok || !result.scopes)
303
+ throw new Error(result.error || 'scopes failed');
304
+ if (result.scopes.length === 0) {
305
+ console.log(`No scopes in ${projectName} yet.`);
306
+ return;
307
+ }
308
+ for (const s of result.scopes)
309
+ console.log(s);
310
+ }
311
+ // ---------- Dispatch ------------------------------------------------------
312
+ const SUB_HELP = `
313
+ greprag lore — per-project LEARNINGS substrate.
314
+
315
+ Subcommands:
316
+ add "<text>" --scope <S> [--project <name>] [--source-session <id>]
317
+ Append a new lore entry under the given scope.
318
+ query [--scope <S>] [--query "<intent>"] [--project <name>]
319
+ [--limit N=10] [--format markdown|json]
320
+ Read lore. With --query, lexical-rank by
321
+ relevance. Without, most recent first.
322
+ list [--project <name>] [--format markdown|json]
323
+ Every lore entry grouped by scope (for review).
324
+ delete <nodeId> [--project <name>]
325
+ Drop one lore entry by its 8-char nodeId.
326
+ scopes [--project <name>] Distinct scope labels present in this project.
327
+
328
+ Examples:
329
+ greprag lore add "Migrations live at repo root, not packages/api/migrations." --scope chip-startup
330
+ greprag lore query --scope chip-startup --limit 10 --format markdown
331
+ greprag lore query --query "where do migrations live" --limit 5
332
+ greprag lore list
333
+ greprag lore delete a3f2c1d4
334
+ greprag lore scopes
335
+ `.trim();
336
+ async function runLore(args) {
337
+ const sub = args[0];
338
+ const rest = args.slice(1);
339
+ switch (sub) {
340
+ case 'add': return addCmd(rest);
341
+ case 'query': return queryCmd(rest);
342
+ case 'list': return listCmd(rest);
343
+ case 'delete': return deleteCmd(rest);
344
+ case 'scopes': return scopesCmd(rest);
345
+ case undefined:
346
+ case 'help':
347
+ case '--help':
348
+ case '-h':
349
+ console.log(SUB_HELP);
350
+ return;
351
+ default:
352
+ console.error(`Unknown subcommand: ${sub}\n`);
353
+ console.log(SUB_HELP);
354
+ process.exit(1);
355
+ }
356
+ }
357
+ //# sourceMappingURL=lore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lore.js","sourceRoot":"","sources":["../../src/commands/lore.ts"],"names":[],"mappings":"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"}
@@ -25,7 +25,7 @@ interface StatusReport {
25
25
  hooks: {
26
26
  session_start_recap: boolean;
27
27
  stop_store: boolean;
28
- post_tool_use_spawn_reminder: boolean;
28
+ pre_tool_use_spawn_check: boolean;
29
29
  };
30
30
  project: {
31
31
  cwd: string;
@@ -121,10 +121,12 @@ function buildStatus(cwd) {
121
121
  hooks: {
122
122
  session_start_recap: hasGrepragHook(settings.hooks?.SessionStart, 'recap'),
123
123
  stop_store: hasGrepragHook(settings.hooks?.Stop, 'store'),
124
- post_tool_use_spawn_reminder: hasGrepragHook(settings.hooks?.PostToolUse, 'spawn-reminder'),
124
+ pre_tool_use_spawn_check: hasGrepragHook(settings.hooks?.PreToolUse, 'pre-spawn-check'),
125
125
  // user_prompt_submit_notify removed in v5.6.1 — the inbox-count polling
126
126
  // it surfaced was the eavesdrop vector. Live inbox delivery is now the
127
127
  // Monitor watcher's exclusive job.
128
+ // post_tool_use_spawn_reminder removed in v5.6.2 — validation moved to
129
+ // PreToolUse pre-spawn-check + SessionStart auto-armed watcher.
128
130
  },
129
131
  project: {
130
132
  cwd: path.resolve(cwd),
@@ -155,7 +157,7 @@ function renderHuman(s) {
155
157
  `Hooks:`,
156
158
  ` SessionStart recap: ${check(s.hooks.session_start_recap)}`,
157
159
  ` Stop store: ${check(s.hooks.stop_store)}`,
158
- ` PostToolUse spawn-reminder:${check(s.hooks.post_tool_use_spawn_reminder)}`,
160
+ ` PreToolUse pre-spawn-check:${check(s.hooks.pre_tool_use_spawn_check)}`,
159
161
  ``,
160
162
  `Project (${s.project.cwd}):`,
161
163
  ` Anchor found: ${check(s.project.anchor_found)}${s.project.is_deterministic_fallback ? ' (using deterministic-hash fallback)' : ''}`,
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
package/dist/hook.js CHANGED
@@ -1010,60 +1010,47 @@ async function notify(_input) {
1010
1010
  // Intentional no-op. See docstring above.
1011
1011
  return;
1012
1012
  }
1013
- /** PostToolUse hook fired on `mcp__ccd_session__spawn_task`. Emits a
1014
- * short `<system-reminder>` instructing the agent to arm a Monitor
1015
- * watcher on its own inbox in the same turn — the chip will report back
1016
- * via `greprag inbox` and mid-task replies are invisible without an SSE
1017
- * watcher.
1018
- *
1019
- * Session-scoped is the default and the recommendation. The orchestrator's
1020
- * own session id is always available (the SessionStart hook publishes it
1021
- * on every session). Project-scoped watchers exist only for the rare
1022
- * multi-chip-campaign case where N chips are fanned out in parallel and
1023
- * the parent wants every report on one merged stream. The previous
1024
- * iteration of this hook presented both scopes as coequal options and
1025
- * said "if unsure, arm both"; that turned out to push orchestrators
1026
- * toward project-scoped by default and produced cross-project broadcasts
1027
- * that polluted sibling chips' inboxes (observed in production
1028
- * 2026-05-26). Project-scope must be opted into deliberately, not
1029
- * defaulted to.
1030
- *
1031
- * Session-id sourcing: PostToolUse `input.session_id` has been observed
1032
- * to be unreliable for the spawn_task tool (in one incident it carried a
1033
- * third party's UUID, not the parent's). Rather than emit a wrong concrete
1034
- * id, we render `<your-own-session-id>` as a placeholder — the agent
1035
- * already learned its own session id from the SessionStart session-id
1036
- * hook earlier in the conversation and substitutes correctly.
1037
- *
1038
- * adr: adr/spawn-task-hook-mode.md */
1039
- function handleSpawnReminderHook(_input) {
1040
- const ownIdToken = '<your-own-session-id>';
1041
- const text = `[GrepRAG] Chip spawned. The chip will report back via greprag inbox; `
1042
- + `mid-task replies are invisible without an SSE watcher. `
1043
- + `Arm THIS under \`Monitor\` (persistent:true) THIS TURN, and make sure `
1044
- + `your chip prompt's Block 2 sends with --to <email>/${ownIdToken} `
1045
- + `(scope mismatch = silent delivery failure):\n`
1046
- + ` \`while true; do greprag inbox watch --session ${ownIdToken} --json; `
1047
- + `echo "[wrapper] watcher exited, restarting in 1s" >&2; sleep 1; done\`\n`
1048
- + `Substitute ${ownIdToken} with the short id from your SessionStart hook `
1049
- + `("Your greprag session id: <8-hex>"). It is always present in a current session. `
1050
- + `The \`--project <parent-project>\` form exists ONLY for the rare case of `
1051
- + `orchestrating multiple chips in parallel and wanting all reports on one stream — `
1052
- + `do not default to it. Cross-project broadcasts pollute sibling chips' inboxes. `
1053
- + `See ~/.claude/docs/agent-coordination.md § Block 3 + Parent-side: watch for the report.`;
1013
+ function handlePreSpawnCheck(input) {
1014
+ if (input.tool_name !== 'mcp__ccd_session__spawn_task')
1015
+ return;
1016
+ const title = input.tool_input?.title ?? '';
1017
+ const prompt = input.tool_input?.prompt ?? '';
1018
+ const violations = [];
1019
+ if (!title.startsWith('Chip: ')) {
1020
+ violations.push(`title "${title}" missing required "Chip: " prefix. ` +
1021
+ `Format: "Chip: <imperative verb phrase>" — e.g. "Chip: Fix stale README badge". ` +
1022
+ `The prefix distinguishes chip-spawned sessions from IDE/human sessions in FleetView.`);
1023
+ }
1024
+ if (!/\bgit\s+worktree\s+add\b/.test(prompt)) {
1025
+ violations.push(`prompt missing worktree setup. ` +
1026
+ `Block 1 requires the chip to open with: \`git worktree add .claude/worktrees/<slug> -b chip/<slug>\` ` +
1027
+ `then \`cd\` into it. Chips never edit the main checkout.`);
1028
+ }
1029
+ if (!/\bgreprag\s+send\b/.test(prompt)) {
1030
+ violations.push(`prompt missing report-back instruction. ` +
1031
+ `Block 2 requires the chip to send a status message via: ` +
1032
+ `\`greprag send "<status>: <commit> on chip/<slug>" --to <handle>@greprag.com/<parent-session-id> ` +
1033
+ `--from-session <own-session-id> --artifact commit:<hash>\`.`);
1034
+ }
1035
+ if (violations.length === 0)
1036
+ return;
1037
+ const reason = `Chip prompt rejected by greprag PreToolUse validator. Fix the following and re-call spawn_task:\n - ` +
1038
+ violations.join('\n - ') +
1039
+ `\n\nFull conventions: ~/.claude/CLAUDE.md § Chip Spawning.`;
1054
1040
  const payload = {
1055
1041
  hookSpecificOutput: {
1056
- hookEventName: 'PostToolUse',
1057
- additionalContext: text,
1042
+ hookEventName: 'PreToolUse',
1043
+ permissionDecision: 'deny',
1044
+ permissionDecisionReason: reason,
1058
1045
  },
1059
1046
  };
1060
1047
  process.stdout.write(JSON.stringify(payload) + '\n');
1061
1048
  }
1062
1049
  async function main() {
1063
1050
  const subcommand = process.argv[2];
1064
- const validSubs = new Set(['store', 'recap', 'notify', 'session-id', 'spawn-reminder']);
1051
+ const validSubs = new Set(['store', 'recap', 'notify', 'session-id', 'pre-spawn-check']);
1065
1052
  if (!validSubs.has(subcommand)) {
1066
- process.stderr.write(`Usage: greprag-hook <store|recap|notify|session-id|spawn-reminder>\n`);
1053
+ process.stderr.write(`Usage: greprag-hook <store|recap|notify|session-id|pre-spawn-check>\n`);
1067
1054
  process.exit(1);
1068
1055
  }
1069
1056
  let input = {};
@@ -1095,8 +1082,8 @@ async function main() {
1095
1082
  const cfg = getConfig(cwd);
1096
1083
  (0, session_id_1.handleSessionIdHook)(input, { armWatcher: cfg.enabled && !!cfg.apiKey });
1097
1084
  }
1098
- else if (subcommand === 'spawn-reminder') {
1099
- handleSpawnReminderHook(input);
1085
+ else if (subcommand === 'pre-spawn-check') {
1086
+ handlePreSpawnCheck(input);
1100
1087
  }
1101
1088
  else {
1102
1089
  await store(input);