greprag 0.7.1 → 0.8.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 ADDED
@@ -0,0 +1,64 @@
1
+ # GrepRAG
2
+
3
+ Episodic project memory for Claude Code and OpenCode. Auto-captures turns, compacts into hourly/daily/weekly summaries, and delivers briefings at session start. Also handles cross-project async messaging via inbox.
4
+
5
+ ## Quick start (both clients)
6
+
7
+ ```bash
8
+ npm i -g greprag
9
+ ```
10
+
11
+ ### Claude Code
12
+
13
+ Run `/greprag` in any Claude Code session, or:
14
+
15
+ ```bash
16
+ greprag init # set up hooks + anchor + skill
17
+ ```
18
+
19
+ ### OpenCode
20
+
21
+ ```bash
22
+ greprag init --opencode
23
+ ```
24
+
25
+ This creates a project anchor in `.opencode/project.json` and installs the memory plugin at `~/.config/opencode/plugins/greprag-memory.js`. The plugin automatically injects memory briefings at session start and stores every turn. No agent cooperation needed.
26
+
27
+ Status check (works for both):
28
+
29
+ ```bash
30
+ greprag status # check what's configured
31
+ ```
32
+
33
+ ## What's active
34
+
35
+ - **Episodic memory**: every turn captured via Stop hook, compacted into hourly/daily/weekly summaries
36
+ - **SessionStart recap**: injects recent episodic briefings at the start of each session
37
+ - **Inbox**: cross-project async messaging between your projects or other GrepRAG users
38
+
39
+ ## Commands
40
+
41
+ | Command | Description |
42
+ |---------|-------------|
43
+ | `greprag status` | Check auth, hooks, project anchor |
44
+ | `greprag init` | Configure hooks + anchor in current repo |
45
+ | `greprag init --global` | Global anchor for ephemeral sessions |
46
+ | `greprag doctor` | Diagnose project_id drift and orphan consolidation |
47
+ | `greprag inbox` | List unread messages (auto-marks read) |
48
+ | `greprag inbox --all` | Full message history |
49
+ | `greprag send "msg" --to <addr>` | Send markdown message across tenants |
50
+ | `greprag project-id` | Print current project's UUID |
51
+
52
+ ## Requirements
53
+
54
+ - Node.js 18+
55
+ - Claude Code (the `/greprag` skill handles setup)
56
+ - An API key (generated during email signup in the skill flow)
57
+
58
+ ## How it works
59
+
60
+ The CLI is a thin HTTP client. All intelligence — keyword extraction, dedup, scoring, compaction, graduation — lives server-side. The hook fires on Stop/SessionStart, calls the API, and the server handles everything else.
61
+
62
+ ## Links
63
+
64
+ - [GitHub](https://github.com/travsteward/greprag)
@@ -0,0 +1,18 @@
1
+ /** greprag corpus — upload, search, and walk arbitrary text corpora.
2
+ *
3
+ * A corpus is just a `stores` row with `kind != 'memory'`. Books, codebases,
4
+ * reference docs, voice samples — all live in the same nodes table, queried
5
+ * through the same five retrieval modes (anchor / crawl / shape / section /
6
+ * search). This command is the thin user-facing surface over /v1/stores/*.
7
+ *
8
+ * Subcommands:
9
+ * upload <file|url> [--name N] [--kind K]
10
+ * search <store> "<intent>" [--limit 5]
11
+ * walk <store> <nodeId> [--before 2 --after 2]
12
+ * list [--kind K]
13
+ * delete <store>
14
+ *
15
+ * <store> accepts either a store UUID or its name. Names are resolved
16
+ * case-insensitively against the tenant's list of stores; ambiguous
17
+ * names are rejected with a hint to use the UUID. */
18
+ export declare function runCorpus(args: string[]): Promise<void>;
@@ -0,0 +1,431 @@
1
+ "use strict";
2
+ /** greprag corpus — upload, search, and walk arbitrary text corpora.
3
+ *
4
+ * A corpus is just a `stores` row with `kind != 'memory'`. Books, codebases,
5
+ * reference docs, voice samples — all live in the same nodes table, queried
6
+ * through the same five retrieval modes (anchor / crawl / shape / section /
7
+ * search). This command is the thin user-facing surface over /v1/stores/*.
8
+ *
9
+ * Subcommands:
10
+ * upload <file|url> [--name N] [--kind K]
11
+ * search <store> "<intent>" [--limit 5]
12
+ * walk <store> <nodeId> [--before 2 --after 2]
13
+ * list [--kind K]
14
+ * delete <store>
15
+ *
16
+ * <store> accepts either a store UUID or its name. Names are resolved
17
+ * case-insensitively against the tenant's list of stores; ambiguous
18
+ * names are rejected with a hint to use the UUID. */
19
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ var desc = Object.getOwnPropertyDescriptor(m, k);
22
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
23
+ desc = { enumerable: true, get: function() { return m[k]; } };
24
+ }
25
+ Object.defineProperty(o, k2, desc);
26
+ }) : (function(o, m, k, k2) {
27
+ if (k2 === undefined) k2 = k;
28
+ o[k2] = m[k];
29
+ }));
30
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
31
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
32
+ }) : function(o, v) {
33
+ o["default"] = v;
34
+ });
35
+ var __importStar = (this && this.__importStar) || (function () {
36
+ var ownKeys = function(o) {
37
+ ownKeys = Object.getOwnPropertyNames || function (o) {
38
+ var ar = [];
39
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
40
+ return ar;
41
+ };
42
+ return ownKeys(o);
43
+ };
44
+ return function (mod) {
45
+ if (mod && mod.__esModule) return mod;
46
+ var result = {};
47
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
48
+ __setModuleDefault(result, mod);
49
+ return result;
50
+ };
51
+ })();
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ exports.runCorpus = runCorpus;
54
+ const fs = __importStar(require("fs"));
55
+ const path = __importStar(require("path"));
56
+ const API_URL_DEFAULT = 'https://api.greprag.com';
57
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
58
+ const VALID_KINDS = ['book', 'codebase', 'voice', 'memory', 'inbox', 'generic'];
59
+ const VALID_ENRICHMENT_STYLES = ['book', 'codebase', 'transcript', 'reference', 'generic'];
60
+ // -- Config + HTTP --------------------------------------------------------
61
+ function loadEnvFile(filePath) {
62
+ try {
63
+ const content = fs.readFileSync(filePath, 'utf-8');
64
+ for (const line of content.split('\n')) {
65
+ const trimmed = line.trim();
66
+ if (!trimmed || trimmed.startsWith('#'))
67
+ continue;
68
+ const eqIdx = trimmed.indexOf('=');
69
+ if (eqIdx < 1)
70
+ continue;
71
+ const key = trimmed.slice(0, eqIdx).trim();
72
+ let value = trimmed.slice(eqIdx + 1).trim();
73
+ if ((value.startsWith('"') && value.endsWith('"')) ||
74
+ (value.startsWith("'") && value.endsWith("'"))) {
75
+ value = value.slice(1, -1);
76
+ }
77
+ if (!process.env[key])
78
+ process.env[key] = value;
79
+ }
80
+ }
81
+ catch { /* file missing — fine */ }
82
+ }
83
+ function getConfig() {
84
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
85
+ if (homeDir)
86
+ loadEnvFile(path.join(homeDir, '.greprag', '.env'));
87
+ if (!process.env.GREPRAG_API_KEY)
88
+ loadEnvFile(path.join(process.cwd(), '.env'));
89
+ return {
90
+ apiUrl: process.env.GREPRAG_API_URL || API_URL_DEFAULT,
91
+ apiKey: process.env.GREPRAG_API_KEY || '',
92
+ };
93
+ }
94
+ async function apiCall(url, apiKey, body) {
95
+ const res = await fetch(url, {
96
+ method: 'POST',
97
+ headers: {
98
+ 'Authorization': `Bearer ${apiKey}`,
99
+ 'Content-Type': 'application/json',
100
+ },
101
+ body: JSON.stringify(body),
102
+ });
103
+ if (!res.ok)
104
+ throw new Error(`API ${res.status}: ${await res.text()}`);
105
+ return res.json();
106
+ }
107
+ async function apiGet(url, apiKey) {
108
+ const res = await fetch(url, {
109
+ headers: { 'Authorization': `Bearer ${apiKey}` },
110
+ });
111
+ if (!res.ok)
112
+ throw new Error(`API ${res.status}: ${await res.text()}`);
113
+ return res.json();
114
+ }
115
+ async function apiDelete(url, apiKey) {
116
+ const res = await fetch(url, {
117
+ method: 'DELETE',
118
+ headers: { 'Authorization': `Bearer ${apiKey}` },
119
+ });
120
+ if (!res.ok)
121
+ throw new Error(`API ${res.status}: ${await res.text()}`);
122
+ return res.json();
123
+ }
124
+ // -- Helpers ---------------------------------------------------------------
125
+ function getFlag(args, flag) {
126
+ const idx = args.indexOf(flag);
127
+ if (idx === -1 || idx + 1 >= args.length)
128
+ return undefined;
129
+ return args[idx + 1];
130
+ }
131
+ function abortNotConfigured() {
132
+ console.error('Not configured. Run: greprag init');
133
+ process.exit(1);
134
+ }
135
+ /** Resolve a user-supplied store reference to a store row. Accepts a UUID
136
+ * or a case-insensitive name. Ambiguous names fail loud. */
137
+ async function resolveStore(ref, apiUrl, apiKey) {
138
+ if (UUID_RE.test(ref)) {
139
+ const r = await apiGet(`${apiUrl}/v1/stores/${ref}`, apiKey);
140
+ if (!r.ok || !r.store)
141
+ throw new Error(r.error || 'store not found');
142
+ return r.store;
143
+ }
144
+ const list = await apiGet(`${apiUrl}/v1/stores`, apiKey);
145
+ const needle = ref.trim().toLowerCase();
146
+ const matches = list.stores.filter(s => s.name.toLowerCase() === needle);
147
+ if (matches.length === 0) {
148
+ throw new Error(`no store named "${ref}". Run 'greprag corpus list' to see what's available.`);
149
+ }
150
+ if (matches.length > 1) {
151
+ const ids = matches.map(m => `${m.id} (${m.kind})`).join(', ');
152
+ throw new Error(`name "${ref}" is ambiguous — multiple stores match. Use a UUID instead: ${ids}`);
153
+ }
154
+ return matches[0];
155
+ }
156
+ function isUrl(s) {
157
+ return /^https?:\/\//i.test(s);
158
+ }
159
+ async function readSource(source) {
160
+ if (isUrl(source)) {
161
+ const res = await fetch(source);
162
+ if (!res.ok)
163
+ throw new Error(`fetch ${source}: HTTP ${res.status}`);
164
+ const text = await res.text();
165
+ const u = new URL(source);
166
+ const base = path.basename(u.pathname).replace(/\.[a-z0-9]+$/i, '') || u.hostname;
167
+ return { text, defaultName: base };
168
+ }
169
+ const abs = path.resolve(source);
170
+ if (!fs.existsSync(abs))
171
+ throw new Error(`file not found: ${abs}`);
172
+ const text = fs.readFileSync(abs, 'utf-8');
173
+ const base = path.basename(abs).replace(/\.[a-z0-9]+$/i, '');
174
+ return { text, defaultName: base };
175
+ }
176
+ // -- upload ----------------------------------------------------------------
177
+ async function uploadCmd(args) {
178
+ const cfg = getConfig();
179
+ if (!cfg.apiKey)
180
+ abortNotConfigured();
181
+ const source = args[0];
182
+ if (!source) {
183
+ console.error('Usage: greprag corpus upload <file|url> [--name N] [--kind K] [--enrichment-style S]');
184
+ process.exit(1);
185
+ }
186
+ const kindFlag = (getFlag(args, '--kind') || 'book');
187
+ if (!VALID_KINDS.includes(kindFlag)) {
188
+ console.error(`--kind must be one of: ${VALID_KINDS.join(', ')}`);
189
+ process.exit(1);
190
+ }
191
+ const styleFlag = getFlag(args, '--enrichment-style');
192
+ if (styleFlag && !VALID_ENRICHMENT_STYLES.includes(styleFlag)) {
193
+ console.error(`--enrichment-style must be one of: ${VALID_ENRICHMENT_STYLES.join(', ')}`);
194
+ process.exit(1);
195
+ }
196
+ const { text, defaultName } = await readSource(source);
197
+ const name = getFlag(args, '--name') || defaultName;
198
+ const words = text.trim().split(/\s+/).length;
199
+ const styleNote = styleFlag ? ` style=${styleFlag}` : '';
200
+ console.log(`Uploading "${name}" (${kindFlag}${styleNote}, ${words.toLocaleString()} words)...`);
201
+ const create = await apiCall(`${cfg.apiUrl}/v1/stores`, cfg.apiKey, {
202
+ name, kind: kindFlag, metadata: { source },
203
+ ...(styleFlag ? { enrichmentStyle: styleFlag } : {}),
204
+ });
205
+ if (!create.ok || !create.store)
206
+ throw new Error(create.error || 'create failed');
207
+ const store = create.store;
208
+ const ingest = await apiCall(`${cfg.apiUrl}/v1/stores/${store.id}/nodes`, cfg.apiKey, {
209
+ markdown: text,
210
+ ...(styleFlag ? { enrichmentStyle: styleFlag } : {}),
211
+ });
212
+ if (!ingest.ok)
213
+ throw new Error(ingest.error || 'ingest failed');
214
+ console.log(`\n Store ID: ${store.id}`);
215
+ console.log(` Name: ${store.name}`);
216
+ console.log(` Kind: ${store.kind}`);
217
+ const insBits = [`${ingest.inserted ?? 0} nodes`];
218
+ if (ingest.fresh)
219
+ insBits.push(`${ingest.fresh} fresh`);
220
+ if (ingest.preserved)
221
+ insBits.push(`${ingest.preserved} preserved`);
222
+ if (ingest.removed?.length)
223
+ insBits.push(`${ingest.removed.length} removed`);
224
+ console.log(` Ingested: ${insBits.join(', ')}`);
225
+ console.log(` Words: ${ingest.totalWords?.toLocaleString() ?? '?'}`);
226
+ if (ingest.enrichmentQueued) {
227
+ console.log(` Enrich: ${ingest.enrichmentQueued} queued (style: ${ingest.enrichmentStyle || 'auto'})`);
228
+ }
229
+ console.log(`\nTry: greprag corpus search ${JSON.stringify(store.name)} "<lexical query>"`);
230
+ }
231
+ // -- search ----------------------------------------------------------------
232
+ async function searchCmd(args) {
233
+ const cfg = getConfig();
234
+ if (!cfg.apiKey)
235
+ abortNotConfigured();
236
+ const storeRef = args[0];
237
+ const queryText = args[1];
238
+ if (!storeRef || !queryText) {
239
+ console.error('Usage: greprag corpus search <storeIdOrName> "<lexical query>" [--limit 5] [--section "Book VII"] [--shape dialogue]');
240
+ process.exit(1);
241
+ }
242
+ const limit = parseInt(getFlag(args, '--limit') || '5', 10);
243
+ const section = getFlag(args, '--section');
244
+ const shape = getFlag(args, '--shape');
245
+ const store = await resolveStore(storeRef, cfg.apiUrl, cfg.apiKey);
246
+ const filters = {};
247
+ if (section)
248
+ filters.section = section;
249
+ if (shape)
250
+ filters.shape = shape;
251
+ const t0 = Date.now();
252
+ const result = await apiCall(`${cfg.apiUrl}/v1/stores/${store.id}/query`, cfg.apiKey, {
253
+ query: queryText, limit,
254
+ ...(Object.keys(filters).length > 0 ? { filters } : {}),
255
+ });
256
+ if (!result.ok || !result.nodes)
257
+ throw new Error(result.error || 'query failed');
258
+ const ms = Date.now() - t0;
259
+ console.log(`\n${store.name} (${store.kind}, ${store.nodeCount} nodes) ← "${queryText}"`);
260
+ console.log(` ${result.nodes.length} hits in ${ms}ms (server ${result.latencyMs ?? '?'}ms)\n`);
261
+ for (const n of result.nodes) {
262
+ const heading = n.headingPath?.length ? ` · ${n.headingPath.join(' / ')}` : '';
263
+ const snippet = n.content.length > 280 ? n.content.slice(0, 277) + '...' : n.content;
264
+ console.log(` [${n.nodeId}] score=${n.score.toFixed(3)} pos=${n.position}${heading}`);
265
+ console.log(` ${snippet.replace(/\n/g, ' ')}\n`);
266
+ }
267
+ if (result.nodes[0]) {
268
+ console.log(`Walk: greprag corpus walk ${JSON.stringify(store.name)} ${result.nodes[0].nodeId}`);
269
+ }
270
+ }
271
+ async function walkCmd(args) {
272
+ const cfg = getConfig();
273
+ if (!cfg.apiKey)
274
+ abortNotConfigured();
275
+ const storeRef = args[0];
276
+ const nodeId = args[1];
277
+ if (!storeRef || !nodeId) {
278
+ console.error('Usage: greprag corpus walk <storeIdOrName> <nodeId> [--before 2 --after 2]');
279
+ process.exit(1);
280
+ }
281
+ const before = parseInt(getFlag(args, '--before') || '2', 10);
282
+ const after = parseInt(getFlag(args, '--after') || '2', 10);
283
+ const store = await resolveStore(storeRef, cfg.apiUrl, cfg.apiKey);
284
+ // Step 1: fetch the anchor node to learn its position.
285
+ const anchorRes = await apiGet(`${cfg.apiUrl}/v1/stores/${store.id}/by-node-id/${nodeId}`, cfg.apiKey);
286
+ if (!anchorRes.ok || !anchorRes.node)
287
+ throw new Error(anchorRes.error || 'node not found');
288
+ const anchor = anchorRes.node;
289
+ // Step 2: expand around its position.
290
+ const win = await apiGet(`${cfg.apiUrl}/v1/stores/${store.id}/expand?center=${anchor.position}&before=${before}&after=${after}`, cfg.apiKey);
291
+ if (!win.ok || !win.nodes)
292
+ throw new Error(win.error || 'expand failed');
293
+ console.log(`\n${store.name} · walking ${nodeId} (pos ${anchor.position}, ±${before}/${after}):\n`);
294
+ for (const n of win.nodes) {
295
+ const isAnchor = n.nodeId === nodeId;
296
+ const marker = isAnchor ? '★' : ' ';
297
+ const heading = n.headingPath?.length ? ` · ${n.headingPath.join(' / ')}` : '';
298
+ const snippet = n.content.length > 320 ? n.content.slice(0, 317) + '...' : n.content;
299
+ console.log(` ${marker} [${n.nodeId}] pos=${n.position}${heading}`);
300
+ console.log(` ${snippet.replace(/\n/g, ' ')}\n`);
301
+ }
302
+ }
303
+ // -- list ------------------------------------------------------------------
304
+ async function listCmd(args) {
305
+ const cfg = getConfig();
306
+ if (!cfg.apiKey)
307
+ abortNotConfigured();
308
+ const kindFlag = getFlag(args, '--kind');
309
+ const url = `${cfg.apiUrl}/v1/stores${kindFlag ? `?kind=${encodeURIComponent(kindFlag)}` : ''}`;
310
+ const result = await apiGet(url, cfg.apiKey);
311
+ if (result.stores.length === 0) {
312
+ console.log(kindFlag ? `No stores with kind="${kindFlag}".` : 'No stores yet.');
313
+ console.log('Upload one: greprag corpus upload <file|url> --name "<name>"');
314
+ return;
315
+ }
316
+ const sorted = [...result.stores].sort((a, b) => b.createdAt.localeCompare(a.createdAt));
317
+ console.log(`\n${sorted.length} store${sorted.length === 1 ? '' : 's'}:\n`);
318
+ for (const s of sorted) {
319
+ const created = new Date(s.createdAt).toISOString().slice(0, 10);
320
+ console.log(` ${s.id} ${s.kind.padEnd(8)} ${s.nodeCount.toString().padStart(6)} nodes ${s.wordCount.toString().padStart(8)} words ${created} ${s.name}`);
321
+ }
322
+ }
323
+ // -- status ----------------------------------------------------------------
324
+ async function statusCmd(args) {
325
+ const cfg = getConfig();
326
+ if (!cfg.apiKey)
327
+ abortNotConfigured();
328
+ const ref = args[0];
329
+ if (!ref) {
330
+ console.error('Usage: greprag corpus status <storeIdOrName>');
331
+ process.exit(1);
332
+ }
333
+ const store = await resolveStore(ref, cfg.apiUrl, cfg.apiKey);
334
+ const res = await apiGet(`${cfg.apiUrl}/v1/stores/${store.id}/enrichment`, cfg.apiKey);
335
+ if (!res.ok || !res.status)
336
+ throw new Error(res.error || 'status failed');
337
+ const s = res.status;
338
+ const pct = s.total > 0 ? Math.round((s.completed / s.total) * 100) : 0;
339
+ const barWidth = 30;
340
+ const filled = Math.round((pct / 100) * barWidth);
341
+ const bar = '█'.repeat(filled) + '░'.repeat(barWidth - filled);
342
+ console.log(`\n${store.name} · ${store.nodeCount} nodes · ${store.kind}`);
343
+ console.log(`\n Enrichment: [${bar}] ${pct}%`);
344
+ console.log(` Completed: ${s.completed.toLocaleString().padStart(6)} / ${s.total.toLocaleString()}`);
345
+ if (s.pending > 0)
346
+ console.log(` Pending: ${s.pending.toLocaleString().padStart(6)}`);
347
+ if (s.in_progress > 0)
348
+ console.log(` In progress: ${s.in_progress.toLocaleString().padStart(6)}`);
349
+ if (s.failed > 0)
350
+ console.log(` Failed: ${s.failed.toLocaleString().padStart(6)} (after ${5} attempts — won't retry)`);
351
+ if (res.enrichmentNotifiedAt) {
352
+ console.log(` Last notify: ${res.enrichmentNotifiedAt}`);
353
+ }
354
+ console.log('');
355
+ if (s.pending > 0 || s.in_progress > 0) {
356
+ console.log('Drainer runs every 2 minutes. Re-run this command to watch progress.\n');
357
+ }
358
+ else if (s.completed > 0) {
359
+ console.log(`Ready. Try: greprag corpus search ${JSON.stringify(store.name)} "<your question>"\n`);
360
+ }
361
+ }
362
+ // -- delete ----------------------------------------------------------------
363
+ async function deleteCmd(args) {
364
+ const cfg = getConfig();
365
+ if (!cfg.apiKey)
366
+ abortNotConfigured();
367
+ const ref = args[0];
368
+ if (!ref) {
369
+ console.error('Usage: greprag corpus delete <storeIdOrName>');
370
+ process.exit(1);
371
+ }
372
+ const store = await resolveStore(ref, cfg.apiUrl, cfg.apiKey);
373
+ if (!args.includes('--yes') && !args.includes('-y')) {
374
+ console.log(`About to delete: ${store.name} (${store.id}, ${store.nodeCount} nodes)`);
375
+ console.log('Re-run with --yes to confirm.');
376
+ return;
377
+ }
378
+ const result = await apiDelete(`${cfg.apiUrl}/v1/stores/${store.id}`, cfg.apiKey);
379
+ if (!result.ok)
380
+ throw new Error(result.error || 'delete failed');
381
+ console.log(`Deleted ${store.name} (${store.id}).`);
382
+ }
383
+ // -- Dispatch --------------------------------------------------------------
384
+ const SUB_HELP = `
385
+ greprag corpus — upload, search, and walk text corpora.
386
+
387
+ Subcommands:
388
+ upload <file|url> [--name N] [--kind K] Create a store and ingest text. K
389
+ defaults to 'book'. N defaults to
390
+ the filename or URL basename.
391
+ search <store> "<intent>" [--limit 5] Intent-driven search. <store> is a
392
+ UUID or store name.
393
+ walk <store> <nodeId> [--before 2 --after 2]
394
+ Show a node and its neighbors.
395
+ status <store> Show write-side enrichment progress
396
+ (per-node vocabulary bridge).
397
+ list [--kind K] List stores under this tenant.
398
+ delete <store> [--yes] Delete a store. --yes to confirm.
399
+
400
+ Examples:
401
+ greprag corpus upload ./meditations.txt --name "Meditations"
402
+ greprag corpus upload https://www.gutenberg.org/files/2680/2680-0.txt
403
+ greprag corpus search Meditations "how should I respond to insult"
404
+ greprag corpus walk Meditations 7f2a91c4
405
+ greprag corpus status Meditations
406
+ greprag corpus list --kind book
407
+ greprag corpus delete Meditations --yes
408
+ `.trim();
409
+ async function runCorpus(args) {
410
+ const sub = args[0];
411
+ const rest = args.slice(1);
412
+ switch (sub) {
413
+ case 'upload': return uploadCmd(rest);
414
+ case 'search': return searchCmd(rest);
415
+ case 'walk': return walkCmd(rest);
416
+ case 'status': return statusCmd(rest);
417
+ case 'list': return listCmd(rest);
418
+ case 'delete': return deleteCmd(rest);
419
+ case undefined:
420
+ case 'help':
421
+ case '--help':
422
+ case '-h':
423
+ console.log(SUB_HELP);
424
+ return;
425
+ default:
426
+ console.error(`Unknown subcommand: ${sub}\n`);
427
+ console.log(SUB_HELP);
428
+ process.exit(1);
429
+ }
430
+ }
431
+ //# sourceMappingURL=corpus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corpus.js","sourceRoot":"","sources":["../../src/commands/corpus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /** greprag discover — tenant-wide structure dump for cross-project advisors.
2
+ *
3
+ * Returns every project under the authenticated tenant in one HTTP call:
4
+ * per-shape row counts (turn / hourly / daily / weekly / ship-event), date
5
+ * range of activity, and whether the project is `registered` (has an entry
6
+ * in the projects registry) or `fallback` (only known via memory-store
7
+ * metadata — likely a hash-derived UUID from `.claude/project.json` that
8
+ * was never explicitly registered).
9
+ *
10
+ * Use case: a cross-project advisor (content-advisor, business-advisor)
11
+ * needs to know "what projects do I have memory in" without making N
12
+ * exploratory calls or hardcoding directory paths.
13
+ *
14
+ * Usage:
15
+ * greprag discover — human-readable table
16
+ * greprag discover --json — JSON for agent parsing
17
+ */
18
+ interface DiscoverProject {
19
+ id: string;
20
+ name: string | null;
21
+ anchor: 'registered' | 'fallback';
22
+ row_counts: Record<string, number>;
23
+ first_activity: string | null;
24
+ last_activity: string | null;
25
+ }
26
+ interface DiscoverResponse {
27
+ ok: boolean;
28
+ tenant: {
29
+ id: string;
30
+ userEmail: string | null;
31
+ };
32
+ projects: DiscoverProject[];
33
+ crystallization_types: string[];
34
+ totals: {
35
+ rows: number;
36
+ projects: number;
37
+ };
38
+ error?: string;
39
+ }
40
+ /** Build a fixed-width table. Right-pads strings, right-aligns numbers. */
41
+ export declare function renderHuman(r: DiscoverResponse): string;
42
+ export declare function runDiscover(args: string[]): Promise<void>;
43
+ export {};