greprag 5.14.0 → 5.15.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 (40) hide show
  1. package/README.md +7 -6
  2. package/dist/commands/checkpoint-helpers.js +4 -1
  3. package/dist/commands/checkpoint-helpers.js.map +1 -1
  4. package/dist/commands/init.js +141 -11
  5. package/dist/commands/init.js.map +1 -1
  6. package/dist/commands/lore.js +7 -5
  7. package/dist/commands/lore.js.map +1 -1
  8. package/dist/commands/memory.d.ts +31 -0
  9. package/dist/commands/memory.js +514 -0
  10. package/dist/commands/memory.js.map +1 -0
  11. package/dist/commands/project.d.ts +16 -0
  12. package/dist/commands/project.js +430 -0
  13. package/dist/commands/project.js.map +1 -0
  14. package/dist/hook.d.ts +1 -1
  15. package/dist/hook.js +9 -10
  16. package/dist/hook.js.map +1 -1
  17. package/dist/index.js +49 -18
  18. package/dist/index.js.map +1 -1
  19. package/dist/project-anchor.d.ts +1 -1
  20. package/dist/project-anchor.js +1 -1
  21. package/dist/session-id.d.ts +30 -25
  22. package/dist/session-id.js +39 -33
  23. package/dist/session-id.js.map +1 -1
  24. package/package.json +2 -1
  25. package/plugin/.claude-plugin/marketplace.json +13 -0
  26. package/plugin/plugins/greprag-inbox/.claude-plugin/plugin.json +7 -0
  27. package/plugin/plugins/greprag-inbox/monitors/monitors.json +8 -0
  28. package/skill/commander/SKILL.md +2 -2
  29. package/skill/content-advisor/SKILL.md +1 -1
  30. package/skill/greprag/SKILL.md +61 -662
  31. package/skill/greprag/docs/corpus.md +98 -0
  32. package/skill/greprag/docs/discord-handoff.md +47 -0
  33. package/skill/greprag/docs/discover.md +28 -0
  34. package/skill/greprag/docs/doctor.md +22 -0
  35. package/skill/greprag/docs/inbox-watch.md +57 -0
  36. package/skill/greprag/docs/inbox.md +100 -0
  37. package/skill/greprag/docs/lore.md +70 -0
  38. package/skill/greprag/docs/memory-advanced.md +23 -0
  39. package/skill/greprag/docs/per-project-flags.md +14 -0
  40. package/skill/greprag/docs/setup.md +208 -0
@@ -0,0 +1,514 @@
1
+ "use strict";
2
+ // adr: adr/odyssey-rename.md
3
+ /** greprag memory — episodic project memory (turn / hourly / daily / weekly / ship-event).
4
+ *
5
+ * Per-project narrative pyramid. Stop hook captures raw turns; crons compact
6
+ * at hourly, daily, and weekly tiers; advisor skills pull on demand by
7
+ * project + time window. This CLI is the read surface (plus a manual
8
+ * compaction trigger for admin use).
9
+ *
10
+ * Verb history: was `odyssey` v5.8.0; `odyssey` kept as silent alias for
11
+ * back-compat with v5.8.0-era scripts. Marketing brand stays "Odyssey" on
12
+ * the website and agent-card display name; the literal-noun verb is the
13
+ * operator's primary access point. See adr/odyssey-rename.md.
14
+ *
15
+ * Note: the server-side route + shape values stay named `memory` / `turn` /
16
+ * `hourly` / `daily` / `weekly` / `ship-event` (internal). The CLI maps
17
+ * `memory` subcommands to /v1/memory/* URLs.
18
+ *
19
+ * Subcommands:
20
+ * briefing [--project <name>] [--format markdown|json]
21
+ * The SessionStart-shaped briefing — most recent weekly + 7 daily summaries.
22
+ * daily [--last N=7] [--project <name>] [--from ISO --to ISO] [--format markdown|json]
23
+ * weekly [--last N=2] [--project <name>] [--from ISO --to ISO] [--format markdown|json]
24
+ * hourly [--last N=24] [--project <name>] [--from ISO --to ISO] [--format markdown|json]
25
+ * turns [--last N=20] [--project <name>] [--from ISO --to ISO] [--format markdown|json]
26
+ * ships [--last N=50] [--project <name>] [--from ISO --to ISO] [--format markdown|json]
27
+ * compact <hour|day|week> [--now ISO]
28
+ * Manual compaction trigger (cron also runs these on schedule).
29
+ *
30
+ * Project resolution: without --project, uses the current cwd's project
31
+ * anchor (readAnchor). With --project <name>, hits /v1/projects to resolve
32
+ * name → projectId (case-insensitive). */
33
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
34
+ if (k2 === undefined) k2 = k;
35
+ var desc = Object.getOwnPropertyDescriptor(m, k);
36
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
37
+ desc = { enumerable: true, get: function() { return m[k]; } };
38
+ }
39
+ Object.defineProperty(o, k2, desc);
40
+ }) : (function(o, m, k, k2) {
41
+ if (k2 === undefined) k2 = k;
42
+ o[k2] = m[k];
43
+ }));
44
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
45
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
46
+ }) : function(o, v) {
47
+ o["default"] = v;
48
+ });
49
+ var __importStar = (this && this.__importStar) || (function () {
50
+ var ownKeys = function(o) {
51
+ ownKeys = Object.getOwnPropertyNames || function (o) {
52
+ var ar = [];
53
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
54
+ return ar;
55
+ };
56
+ return ownKeys(o);
57
+ };
58
+ return function (mod) {
59
+ if (mod && mod.__esModule) return mod;
60
+ var result = {};
61
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
62
+ __setModuleDefault(result, mod);
63
+ return result;
64
+ };
65
+ })();
66
+ Object.defineProperty(exports, "__esModule", { value: true });
67
+ exports.runMemory = runMemory;
68
+ const fs = __importStar(require("fs"));
69
+ const path = __importStar(require("path"));
70
+ const project_anchor_1 = require("../project-anchor");
71
+ const API_URL_DEFAULT = 'https://api.greprag.com';
72
+ // ---------- Config / env (mirrors lore.ts) --------------------------------
73
+ function loadEnvFile(filePath) {
74
+ try {
75
+ const content = fs.readFileSync(filePath, 'utf-8');
76
+ for (const line of content.split('\n')) {
77
+ const trimmed = line.trim();
78
+ if (!trimmed || trimmed.startsWith('#'))
79
+ continue;
80
+ const eqIdx = trimmed.indexOf('=');
81
+ if (eqIdx < 1)
82
+ continue;
83
+ const key = trimmed.slice(0, eqIdx).trim();
84
+ let value = trimmed.slice(eqIdx + 1).trim();
85
+ if ((value.startsWith('"') && value.endsWith('"')) ||
86
+ (value.startsWith("'") && value.endsWith("'"))) {
87
+ value = value.slice(1, -1);
88
+ }
89
+ if (!process.env[key])
90
+ process.env[key] = value;
91
+ }
92
+ }
93
+ catch { /* file missing — fine */ }
94
+ }
95
+ function getConfig() {
96
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
97
+ if (homeDir)
98
+ loadEnvFile(path.join(homeDir, '.greprag', '.env'));
99
+ if (!process.env.GREPRAG_API_KEY)
100
+ loadEnvFile(path.join(process.cwd(), '.env'));
101
+ return {
102
+ apiUrl: process.env.GREPRAG_API_URL || API_URL_DEFAULT,
103
+ apiKey: process.env.GREPRAG_API_KEY || '',
104
+ };
105
+ }
106
+ async function apiGet(url, apiKey) {
107
+ const res = await fetch(url, { headers: { 'Authorization': `Bearer ${apiKey}` } });
108
+ if (!res.ok)
109
+ throw new Error(`API ${res.status}: ${await res.text()}`);
110
+ return res.json();
111
+ }
112
+ async function apiPost(url, apiKey, body) {
113
+ const res = await fetch(url, {
114
+ method: 'POST',
115
+ headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
116
+ body: JSON.stringify(body),
117
+ });
118
+ if (!res.ok)
119
+ throw new Error(`API ${res.status}: ${await res.text()}`);
120
+ return res.json();
121
+ }
122
+ // ---------- Helpers -------------------------------------------------------
123
+ function getFlag(args, flag) {
124
+ const idx = args.indexOf(flag);
125
+ if (idx === -1 || idx + 1 >= args.length)
126
+ return undefined;
127
+ return args[idx + 1];
128
+ }
129
+ function abortNotConfigured() {
130
+ console.error('Not configured. Run: greprag init');
131
+ process.exit(1);
132
+ }
133
+ /** Resolve which project a memory command operates on. --project <name>
134
+ * wins via the tenant's projects registry; otherwise the cwd's anchor
135
+ * decides. */
136
+ async function resolveProject(args, apiUrl, apiKey) {
137
+ const projectArg = getFlag(args, '--project');
138
+ if (!projectArg) {
139
+ const anchor = (0, project_anchor_1.readAnchor)(process.cwd());
140
+ return { projectId: anchor.projectId, projectName: anchor.projectName };
141
+ }
142
+ // The tenant-wide project registry list is served by /v1/inbox/projects
143
+ // (the inbox router owns the project name → id map). /v1/projects on its
144
+ // own is reserved for repair endpoints (/orphans, /merge, /discover).
145
+ const r = await apiGet(`${apiUrl}/v1/inbox/projects`, apiKey);
146
+ const needle = projectArg.trim().toLowerCase();
147
+ const match = (r.projects || []).find(p => p.project_name.toLowerCase() === needle);
148
+ if (!match) {
149
+ throw new Error(`project "${projectArg}" not found under this tenant. ` +
150
+ `Register it via 'greprag init' in that directory, then retry.`);
151
+ }
152
+ return { projectId: match.project_id, projectName: match.project_name };
153
+ }
154
+ function nowIso() { return new Date().toISOString(); }
155
+ function daysAgoIso(days) {
156
+ const d = new Date();
157
+ d.setUTCDate(d.getUTCDate() - days);
158
+ return d.toISOString();
159
+ }
160
+ function hoursAgoIso(hours) {
161
+ const d = new Date();
162
+ d.setUTCHours(d.getUTCHours() - hours);
163
+ return d.toISOString();
164
+ }
165
+ function validateFormat(raw) {
166
+ const f = (raw || 'markdown').toLowerCase();
167
+ if (f !== 'markdown' && f !== 'json') {
168
+ console.error('--format must be markdown or json');
169
+ process.exit(1);
170
+ }
171
+ return f;
172
+ }
173
+ function parsePositiveInt(raw, fallback, flag) {
174
+ if (raw === undefined)
175
+ return fallback;
176
+ const n = parseInt(raw, 10);
177
+ if (!Number.isFinite(n) || n <= 0) {
178
+ console.error(`${flag} must be a positive integer (got "${raw}")`);
179
+ process.exit(1);
180
+ }
181
+ return n;
182
+ }
183
+ /** Fetch /v1/memory/by-period and return rows in ASC order. */
184
+ async function fetchPeriod(apiUrl, apiKey, projectId, fromIso, toIso, shape, limit) {
185
+ const params = new URLSearchParams();
186
+ params.set('projectId', projectId);
187
+ params.set('from', fromIso);
188
+ params.set('to', toIso);
189
+ params.set('type', shape);
190
+ params.set('limit', String(limit));
191
+ const url = `${apiUrl}/v1/memory/by-period?${params.toString()}`;
192
+ const res = await apiGet(url, apiKey);
193
+ if (!res.ok)
194
+ throw new Error(res.error || 'by-period failed');
195
+ return res.memories || [];
196
+ }
197
+ /** Take the most-recent N rows from an ASC-sorted array, return ASC. */
198
+ function tailN(rows, n) {
199
+ if (rows.length <= n)
200
+ return rows;
201
+ return rows.slice(rows.length - n);
202
+ }
203
+ // ---------- Shape renderers -----------------------------------------------
204
+ function renderSummaryRow(row) {
205
+ const day = row.createdAt ? row.createdAt.slice(0, 10) : '';
206
+ const win = row.windowStart && row.windowEnd
207
+ ? ` (${row.windowStart.slice(0, 16).replace('T', ' ')} → ${row.windowEnd.slice(0, 16).replace('T', ' ')})`
208
+ : '';
209
+ const branch = row.branch ? ` [${row.branch}]` : '';
210
+ return `### ${day} — ${row.shape}${branch}${win}\n\n${row.content.trim()}`;
211
+ }
212
+ function renderShipRow(row) {
213
+ const day = row.createdAt ? row.createdAt.slice(0, 10) : '';
214
+ const branch = row.branch ? ` [${row.branch}]` : '';
215
+ const url = row.artifactUrl ? ` ${row.artifactUrl}` : '';
216
+ const head = `### ${day} — ${row.artifactType}:${row.artifactId}${branch}${url}`;
217
+ return `${head}\n\n${row.content.trim()}`;
218
+ }
219
+ function renderTurnRow(row) {
220
+ const ts = row.createdAt ? row.createdAt.slice(0, 16).replace('T', ' ') : '';
221
+ const branch = row.branch ? ` [${row.branch}]` : '';
222
+ return `### ${ts}${branch}\n\n${row.content.trim()}`;
223
+ }
224
+ const SHAPE_DEFAULTS = {
225
+ daily: { lastDefault: 7, windowDays: 30, apiLimit: 100, render: renderSummaryRow },
226
+ weekly: { lastDefault: 2, windowDays: 90, apiLimit: 100, render: renderSummaryRow },
227
+ hourly: { lastDefault: 24, windowDays: 7, apiLimit: 200, render: renderSummaryRow },
228
+ turn: { lastDefault: 20, windowDays: 7, apiLimit: 500, render: renderTurnRow },
229
+ 'ship-event': { lastDefault: 50, windowDays: 30, apiLimit: 200, render: renderShipRow },
230
+ };
231
+ // ---------- Generic per-shape query ---------------------------------------
232
+ async function queryShape(args, shape) {
233
+ const cfg = getConfig();
234
+ if (!cfg.apiKey)
235
+ abortNotConfigured();
236
+ const defaults = SHAPE_DEFAULTS[shape];
237
+ const last = parsePositiveInt(getFlag(args, '--last'), defaults.lastDefault, '--last');
238
+ const format = validateFormat(getFlag(args, '--format'));
239
+ const fromOverride = getFlag(args, '--from');
240
+ const toOverride = getFlag(args, '--to');
241
+ const { projectId, projectName } = await resolveProject(args, cfg.apiUrl, cfg.apiKey);
242
+ const fromIso = fromOverride || daysAgoIso(defaults.windowDays);
243
+ const toIso = toOverride || nowIso();
244
+ const rowsAll = await fetchPeriod(cfg.apiUrl, cfg.apiKey, projectId, fromIso, toIso, shape, defaults.apiLimit);
245
+ const rows = tailN(rowsAll, last);
246
+ if (format === 'json') {
247
+ console.log(JSON.stringify({
248
+ project: projectName,
249
+ shape, from: fromIso, to: toIso, count: rows.length, rows,
250
+ }, null, 2));
251
+ return;
252
+ }
253
+ if (rows.length === 0) {
254
+ console.log(`No ${shape} rows in ${projectName} between ${fromIso.slice(0, 10)} and ${toIso.slice(0, 10)}.`);
255
+ return;
256
+ }
257
+ console.log(`## ${projectName} — ${shape} (last ${rows.length})\n`);
258
+ for (const row of rows) {
259
+ console.log(defaults.render(row));
260
+ console.log('');
261
+ }
262
+ }
263
+ // ---------- search --------------------------------------------------------
264
+ /** Find the project's kind='memory' store. Memory stores are deterministically
265
+ * named `memory:${projectId}` (see StoreService.ensureMemoryStore), so a
266
+ * single list-and-match call resolves it. Throws if the project has no
267
+ * memory store yet — typically means no turns have been captured. */
268
+ async function findMemoryStoreId(apiUrl, apiKey, projectId, projectName) {
269
+ const list = await apiGet(`${apiUrl}/v1/stores?kind=memory`, apiKey);
270
+ const targetName = `memory:${projectId}`;
271
+ const hit = (list.stores || []).find(s => s.name === targetName)
272
+ || (list.stores || []).find(s => {
273
+ const md = s.metadata;
274
+ return md?.projectId === projectId;
275
+ });
276
+ if (!hit) {
277
+ throw new Error(`no memory store for project "${projectName}" yet — capture some turns first ` +
278
+ `(any Claude Code session with the Stop hook enabled will populate it).`);
279
+ }
280
+ return hit.id;
281
+ }
282
+ /** greprag memory search "<query>" — lexical retrieval over the project's
283
+ * episodic memory. Mirrors `corpus search` semantics: same /v1/stores/:id/query
284
+ * endpoint, same v5 RRF + adjacency-boosted pipeline. The agent formulates
285
+ * the query string (websearch_to_tsquery syntax: AND default, OR explicit,
286
+ * "phrases", -negation). No server-side LLM at read time. */
287
+ async function searchCmd(args) {
288
+ const cfg = getConfig();
289
+ if (!cfg.apiKey)
290
+ abortNotConfigured();
291
+ // First positional that isn't a flag value is the query string.
292
+ const flagsTakingValue = new Set([
293
+ '--project', '--limit', '--shape', '--format',
294
+ ]);
295
+ let queryText;
296
+ for (let i = 0; i < args.length; i++) {
297
+ if (args[i].startsWith('--'))
298
+ continue;
299
+ if (i > 0 && flagsTakingValue.has(args[i - 1]))
300
+ continue;
301
+ queryText = args[i];
302
+ break;
303
+ }
304
+ if (!queryText) {
305
+ console.error('Usage: greprag memory search "<query>" [--limit 5] [--shape <name>] [--project <name>] [--format markdown|json]');
306
+ process.exit(1);
307
+ }
308
+ const limit = parsePositiveInt(getFlag(args, '--limit'), 5, '--limit');
309
+ const shape = getFlag(args, '--shape');
310
+ const format = validateFormat(getFlag(args, '--format'));
311
+ const { projectId, projectName } = await resolveProject(args, cfg.apiUrl, cfg.apiKey);
312
+ const storeId = await findMemoryStoreId(cfg.apiUrl, cfg.apiKey, projectId, projectName);
313
+ const filters = {};
314
+ if (shape)
315
+ filters.shape = shape;
316
+ const t0 = Date.now();
317
+ const result = await apiPost(`${cfg.apiUrl}/v1/stores/${storeId}/query`, cfg.apiKey, {
318
+ query: queryText, limit,
319
+ ...(Object.keys(filters).length > 0 ? { filters } : {}),
320
+ });
321
+ if (!result.ok || !result.nodes)
322
+ throw new Error(result.error || 'query failed');
323
+ const ms = Date.now() - t0;
324
+ if (format === 'json') {
325
+ console.log(JSON.stringify({
326
+ project: projectName,
327
+ query: queryText,
328
+ shape: shape || null,
329
+ limit,
330
+ count: result.nodes.length,
331
+ executedQuery: result.executedQuery,
332
+ latencyMs: result.latencyMs,
333
+ hits: result.nodes,
334
+ }, null, 2));
335
+ return;
336
+ }
337
+ console.log(`\n## ${projectName} — memory search "${queryText}"${shape ? ` [shape=${shape}]` : ''}`);
338
+ console.log(`${result.nodes.length} hit${result.nodes.length === 1 ? '' : 's'} in ${ms}ms (server ${result.latencyMs ?? '?'}ms)\n`);
339
+ if (result.nodes.length === 0) {
340
+ console.log(`No memory matches "${queryText}" in ${projectName}.`);
341
+ return;
342
+ }
343
+ for (const n of result.nodes) {
344
+ const shapeTag = n.shape ? n.shape : 'node';
345
+ const md = (n.metadata || {});
346
+ const win = md.windowStart && md.windowEnd
347
+ ? ` (${md.windowStart.slice(0, 16).replace('T', ' ')} → ${md.windowEnd.slice(0, 16).replace('T', ' ')})`
348
+ : '';
349
+ console.log(`### [${n.nodeId}] ${shapeTag} score=${n.score.toFixed(3)}${win}`);
350
+ console.log('');
351
+ console.log(n.content.trim());
352
+ console.log('');
353
+ }
354
+ }
355
+ // ---------- recap ---------------------------------------------------------
356
+ /** SessionStart-shaped recap: the most recent weekly summary (if any)
357
+ * followed by the last N daily summaries (default 7). Same shape advisor
358
+ * skills use to catch a session up at the top of a turn.
359
+ *
360
+ * Verb history: was `briefing` through v5.15.0; kept as a silent alias
361
+ * for back-compat. `recap` matches the SessionStart hook's verb. */
362
+ async function recapCmd(args) {
363
+ const cfg = getConfig();
364
+ if (!cfg.apiKey)
365
+ abortNotConfigured();
366
+ const format = validateFormat(getFlag(args, '--format'));
367
+ const dailyLast = parsePositiveInt(getFlag(args, '--daily-last'), 7, '--daily-last');
368
+ const weeklyLast = parsePositiveInt(getFlag(args, '--weekly-last'), 1, '--weekly-last');
369
+ const { projectId, projectName } = await resolveProject(args, cfg.apiUrl, cfg.apiKey);
370
+ const nowI = nowIso();
371
+ const [dailyAll, weeklyAll] = await Promise.all([
372
+ fetchPeriod(cfg.apiUrl, cfg.apiKey, projectId, daysAgoIso(30), nowI, 'daily', 100),
373
+ fetchPeriod(cfg.apiUrl, cfg.apiKey, projectId, daysAgoIso(90), nowI, 'weekly', 100),
374
+ ]);
375
+ const daily = tailN(dailyAll, dailyLast);
376
+ const weekly = tailN(weeklyAll, weeklyLast);
377
+ if (format === 'json') {
378
+ console.log(JSON.stringify({
379
+ project: projectName, weekly, daily,
380
+ }, null, 2));
381
+ return;
382
+ }
383
+ if (weekly.length === 0 && daily.length === 0) {
384
+ console.log(`No episodic rows yet for ${projectName} — compaction runs hourly. Check back after the first active session.`);
385
+ return;
386
+ }
387
+ console.log(`## ${projectName} — memory recap\n`);
388
+ if (weekly.length > 0) {
389
+ console.log('### This week\n');
390
+ for (const w of weekly) {
391
+ console.log(w.content.trim());
392
+ console.log('');
393
+ }
394
+ }
395
+ if (daily.length > 0) {
396
+ console.log('### Recent days\n');
397
+ // Show newest-first within the recent-days block — matches the
398
+ // SessionStart recap shape used by advisor skills.
399
+ for (const d of [...daily].reverse()) {
400
+ const day = d.createdAt ? d.createdAt.slice(0, 10) : '';
401
+ console.log(`**${day}**`);
402
+ console.log(d.content.trim());
403
+ console.log('');
404
+ }
405
+ }
406
+ }
407
+ // ---------- compact -------------------------------------------------------
408
+ async function compactCmd(args) {
409
+ const cfg = getConfig();
410
+ if (!cfg.apiKey)
411
+ abortNotConfigured();
412
+ const tier = args[0];
413
+ if (!tier || (tier !== 'hour' && tier !== 'day' && tier !== 'week')) {
414
+ console.error('Usage: greprag memory compact <hour|day|week> [--now ISO]');
415
+ process.exit(1);
416
+ }
417
+ const nowOverride = getFlag(args, '--now');
418
+ const body = {};
419
+ if (nowOverride)
420
+ body.now = nowOverride;
421
+ const route = tier === 'hour' ? 'compact-hour' :
422
+ tier === 'day' ? 'compact-day' : 'compact-week';
423
+ const res = await apiPost(`${cfg.apiUrl}/v1/memory/${route}`, cfg.apiKey, body);
424
+ console.log(JSON.stringify(res, null, 2));
425
+ }
426
+ // ---------- Dispatch ------------------------------------------------------
427
+ const SUB_HELP = `
428
+ greprag memory — episodic project memory (per-project narrative pyramid).
429
+
430
+ Two access patterns: pull by time (the recap / per-shape verbs) or grep by
431
+ topic (search). Both read the same rows: hourly / daily / weekly summaries,
432
+ plus raw turns and ship-events. Pulls per-project by default (uses the
433
+ current cwd's anchor); --project <name> targets another project under your
434
+ tenant.
435
+
436
+ Subcommands:
437
+ search "<query>" Lexical retrieval over the project's memory.
438
+ Same v5 RRF + adjacency pipeline as
439
+ 'corpus search'. Use when looking up a
440
+ specific problem, bug, or topic.
441
+ [--limit N=5] Top-N hits.
442
+ [--shape <name>] Restrict to one shape (daily / weekly /
443
+ hourly / turn / ship-event). Default: all.
444
+ [--project <name>] Target another project under this tenant.
445
+ [--format markdown|json] Default markdown.
446
+
447
+ recap Weekly summary + last 7 daily summaries.
448
+ The "catch me up" no-flags shortcut.
449
+ [--daily-last N=7] How many recent daily rows to include.
450
+ [--weekly-last N=1] How many recent weekly rows to include.
451
+ [--project <name>] Target another project under this tenant.
452
+ [--format markdown|json] Default markdown.
453
+
454
+ daily [--last N=7] [--project <name>] [--from ISO --to ISO]
455
+ weekly [--last N=2] [--project <name>] [--from ISO --to ISO]
456
+ hourly [--last N=24] [--project <name>] [--from ISO --to ISO]
457
+ turns [--last N=20] [--project <name>] [--from ISO --to ISO]
458
+ ships [--last N=50] [--project <name>] [--from ISO --to ISO]
459
+ Newest-N for one shape. Default window is
460
+ shape-appropriate; --from / --to override.
461
+ [--format markdown|json]
462
+
463
+ compact <hour|day|week> [--now ISO]
464
+ Manual compaction trigger. Cron runs these
465
+ on schedule (hourly / 03:00 UTC daily /
466
+ 04:00 UTC Sundays); this is for backfill.
467
+
468
+ Aliases (silent back-compat):
469
+ briefing → recap (renamed in v5.16.0 — recap matches the SessionStart
470
+ hook verb and reads more intuitively to operators)
471
+ odyssey → memory (top-level CLI verb, kept for v5.8.0-era scripts;
472
+ marketing brand stays "Odyssey" on /odyssey/)
473
+
474
+ Examples:
475
+ greprag memory search "auth middleware bug"
476
+ greprag memory search "discord pairing" --shape daily --limit 10
477
+ greprag memory recap
478
+ greprag memory daily --last 14 --format json
479
+ greprag memory weekly --project openwriter
480
+ greprag memory hourly --last 8
481
+ greprag memory turns --last 5
482
+ greprag memory ships --last 20
483
+ greprag memory compact day --now 2026-05-25T00:00:00Z
484
+ `.trim();
485
+ async function runMemory(args) {
486
+ const sub = args[0];
487
+ const rest = args.slice(1);
488
+ switch (sub) {
489
+ case 'search': return searchCmd(rest);
490
+ case 'recap': return recapCmd(rest);
491
+ case 'briefing': return recapCmd(rest); // silent back-compat alias (renamed in v5.16.0)
492
+ case 'daily': return queryShape(rest, 'daily');
493
+ case 'weekly': return queryShape(rest, 'weekly');
494
+ case 'hourly': return queryShape(rest, 'hourly');
495
+ case 'turns':
496
+ case 'turn': return queryShape(rest, 'turn');
497
+ case 'ships':
498
+ case 'ship':
499
+ case 'ship-event':
500
+ case 'ship-events': return queryShape(rest, 'ship-event');
501
+ case 'compact': return compactCmd(rest);
502
+ case undefined:
503
+ case 'help':
504
+ case '--help':
505
+ case '-h':
506
+ console.log(SUB_HELP);
507
+ return;
508
+ default:
509
+ console.error(`Unknown subcommand: ${sub}\n`);
510
+ console.log(SUB_HELP);
511
+ process.exit(1);
512
+ }
513
+ }
514
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /** greprag project — metadata operations on projects (rename, merge, list).
2
+ *
3
+ * Wraps the same tenant-scoped /v1/projects/merge endpoint that doctor uses,
4
+ * but exposed for explicit operator workflows that doctor can't reach:
5
+ * - rename: change a project's display name in one verb (anchor file +
6
+ * ~/.greprag/projects.json + API registry + server-side store metadata).
7
+ * Use when a directory basename auto-inferred a wrong project_name
8
+ * during init.
9
+ * - merge: explicit ID-or-name consolidation. doctor finds orphans only
10
+ * by projectName match against the current anchor; this verb lets the
11
+ * operator point at two projects directly, regardless of name.
12
+ * - list: discover-shaped table of every project under this tenant.
13
+ *
14
+ * Safety posture matches doctor: rename confirms before writing (skip with
15
+ * --yes); merge defaults to dry-run, requires --apply to commit. */
16
+ export declare function runProject(args: string[]): Promise<void>;