@mnemo-mcp/cli 1.0.0 → 1.1.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 (45) hide show
  1. package/dist/commands/cite.d.ts +3 -0
  2. package/dist/commands/cite.d.ts.map +1 -0
  3. package/dist/commands/cite.js +31 -0
  4. package/dist/commands/cite.js.map +1 -0
  5. package/dist/commands/completion.d.ts +3 -0
  6. package/dist/commands/completion.d.ts.map +1 -0
  7. package/dist/commands/completion.js +88 -0
  8. package/dist/commands/completion.js.map +1 -0
  9. package/dist/commands/dead.d.ts +3 -0
  10. package/dist/commands/dead.d.ts.map +1 -0
  11. package/dist/commands/dead.js +36 -0
  12. package/dist/commands/dead.js.map +1 -0
  13. package/dist/commands/digest.d.ts +3 -0
  14. package/dist/commands/digest.d.ts.map +1 -0
  15. package/dist/commands/digest.js +55 -0
  16. package/dist/commands/digest.js.map +1 -0
  17. package/dist/commands/ingest.d.ts +3 -0
  18. package/dist/commands/ingest.d.ts.map +1 -0
  19. package/dist/commands/ingest.js +95 -0
  20. package/dist/commands/ingest.js.map +1 -0
  21. package/dist/commands/recall.d.ts.map +1 -1
  22. package/dist/commands/recall.js +31 -4
  23. package/dist/commands/recall.js.map +1 -1
  24. package/dist/commands/remember.d.ts.map +1 -1
  25. package/dist/commands/remember.js +40 -14
  26. package/dist/commands/remember.js.map +1 -1
  27. package/dist/commands/team.d.ts +3 -0
  28. package/dist/commands/team.d.ts.map +1 -0
  29. package/dist/commands/team.js +150 -0
  30. package/dist/commands/team.js.map +1 -0
  31. package/dist/commands/why.d.ts +3 -0
  32. package/dist/commands/why.d.ts.map +1 -0
  33. package/dist/commands/why.js +59 -0
  34. package/dist/commands/why.js.map +1 -0
  35. package/dist/index.js +20 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/interactive.d.ts +7 -0
  38. package/dist/interactive.d.ts.map +1 -0
  39. package/dist/interactive.js +71 -0
  40. package/dist/interactive.js.map +1 -0
  41. package/dist/json-mode.d.ts +13 -0
  42. package/dist/json-mode.d.ts.map +1 -0
  43. package/dist/json-mode.js +20 -0
  44. package/dist/json-mode.js.map +1 -0
  45. package/package.json +2 -2
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerCite(program: Command): void;
3
+ //# sourceMappingURL=cite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cite.d.ts","sourceRoot":"","sources":["../../src/commands/cite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuBnD"}
@@ -0,0 +1,31 @@
1
+ import { Mnemo } from '@mnemo-mcp/core';
2
+ import chalk from 'chalk';
3
+ import { writeJsonResult } from '../json-mode.js';
4
+ export function registerCite(program) {
5
+ program
6
+ .command('cite <id>')
7
+ .description('Print a memory in a referencable format ([mem:id] header + content) for prompt injection')
8
+ .option('--data-dir <path>', 'Data directory override')
9
+ .action(async (id, opts) => {
10
+ const embedderType = (process.env.MNEMO_EMBEDDER === 'hash' ? 'hash' : 'onnx');
11
+ const m = await Mnemo.open({ dataDir: opts.dataDir, embedderType });
12
+ try {
13
+ const list = await m.list({ includeExpired: true });
14
+ const match = list.find(r => r.id === id || r.id.startsWith(id));
15
+ if (!match) {
16
+ if (writeJsonResult({ error: 'not_found', query: id }))
17
+ return;
18
+ console.error(chalk.yellow(`no memory matches "${id}"`));
19
+ process.exitCode = 1;
20
+ return;
21
+ }
22
+ if (writeJsonResult({ id: match.id, content: match.content, scope: match.scope, channel: match.channel }))
23
+ return;
24
+ process.stdout.write(`[mem:${match.id.slice(0, 8)}] ${match.content}\n`);
25
+ }
26
+ finally {
27
+ await m.close();
28
+ }
29
+ });
30
+ }
31
+ //# sourceMappingURL=cite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cite.js","sourceRoot":"","sources":["../../src/commands/cite.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIlD,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,0FAA0F,CAAC;SACvG,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,IAAU,EAAE,EAAE;QACvC,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAoB,CAAC;QAClG,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;YACjE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;oBAAE,OAAO;gBAC/D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC,CAAC;gBACzD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,IAAI,eAAe,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;gBAAE,OAAO;YAClH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QAC3E,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerCompletion(program: Command): void;
3
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuEzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAczD"}
@@ -0,0 +1,88 @@
1
+ const BASH = `# mnemo bash completion. Source this from your ~/.bashrc:
2
+ # source <(mnemo completion bash)
3
+ _mnemo() {
4
+ local cur prev cmds
5
+ cur="\${COMP_WORDS[COMP_CWORD]}"
6
+ prev="\${COMP_WORDS[COMP_CWORD-1]}"
7
+ cmds="remember recall list forget stats export import doctor hook init edit prune ingest cite why digest dead team completion"
8
+ if [[ \${COMP_CWORD} -eq 1 ]] ; then
9
+ COMPREPLY=( $(compgen -W "\${cmds}" -- \${cur}) )
10
+ return 0
11
+ fi
12
+ }
13
+ complete -F _mnemo mnemo
14
+ `;
15
+ const ZSH = `# mnemo zsh completion. Source from your .zshrc:
16
+ # source <(mnemo completion zsh)
17
+ _mnemo() {
18
+ local -a cmds
19
+ cmds=(
20
+ 'remember:Capture a memory'
21
+ 'recall:Semantic search'
22
+ 'list:List memories'
23
+ 'forget:Delete a memory'
24
+ 'stats:Show stats'
25
+ 'export:Export to JSON'
26
+ 'import:Import from JSON'
27
+ 'doctor:Diagnose installation'
28
+ 'hook:Run a Claude Code hook handler'
29
+ 'init:Install into Claude Code'
30
+ 'edit:Edit a memory'
31
+ 'prune:Drop expired/duplicate memories'
32
+ 'ingest:Bulk-import a markdown file'
33
+ 'cite:Print a memory in citable form'
34
+ 'why:Show provenance + ranking breakdown'
35
+ 'digest:Summary of recent activity'
36
+ 'dead:List never-recalled memories'
37
+ 'team:Team-shared memory commands'
38
+ 'completion:Print shell completion script'
39
+ )
40
+ _describe 'mnemo command' cmds
41
+ }
42
+ compdef _mnemo mnemo
43
+ `;
44
+ const FISH = `# mnemo fish completion. Save to ~/.config/fish/completions/mnemo.fish:
45
+ # mnemo completion fish > ~/.config/fish/completions/mnemo.fish
46
+ complete -c mnemo -f
47
+ complete -c mnemo -n __fish_use_subcommand -a remember -d 'Capture a memory'
48
+ complete -c mnemo -n __fish_use_subcommand -a recall -d 'Semantic search'
49
+ complete -c mnemo -n __fish_use_subcommand -a list -d 'List memories'
50
+ complete -c mnemo -n __fish_use_subcommand -a forget -d 'Delete a memory'
51
+ complete -c mnemo -n __fish_use_subcommand -a stats -d 'Show stats'
52
+ complete -c mnemo -n __fish_use_subcommand -a export -d 'Export to JSON'
53
+ complete -c mnemo -n __fish_use_subcommand -a import -d 'Import from JSON'
54
+ complete -c mnemo -n __fish_use_subcommand -a doctor -d 'Diagnose installation'
55
+ complete -c mnemo -n __fish_use_subcommand -a hook -d 'Run a Claude Code hook'
56
+ complete -c mnemo -n __fish_use_subcommand -a init -d 'Install into Claude Code'
57
+ complete -c mnemo -n __fish_use_subcommand -a edit -d 'Edit a memory'
58
+ complete -c mnemo -n __fish_use_subcommand -a prune -d 'Drop expired/duplicates'
59
+ complete -c mnemo -n __fish_use_subcommand -a ingest -d 'Bulk-import a markdown file'
60
+ complete -c mnemo -n __fish_use_subcommand -a cite -d 'Print citable form'
61
+ complete -c mnemo -n __fish_use_subcommand -a why -d 'Show provenance'
62
+ complete -c mnemo -n __fish_use_subcommand -a digest -d 'Activity summary'
63
+ complete -c mnemo -n __fish_use_subcommand -a dead -d 'List never-recalled'
64
+ complete -c mnemo -n __fish_use_subcommand -a team -d 'Team commands'
65
+ complete -c mnemo -n __fish_use_subcommand -a completion -d 'Shell completion'
66
+ `;
67
+ export function registerCompletion(program) {
68
+ program
69
+ .command('completion <shell>')
70
+ .description('Print shell completion script (bash | zsh | fish)')
71
+ .action((shell) => {
72
+ switch (shell) {
73
+ case 'bash':
74
+ process.stdout.write(BASH);
75
+ return;
76
+ case 'zsh':
77
+ process.stdout.write(ZSH);
78
+ return;
79
+ case 'fish':
80
+ process.stdout.write(FISH);
81
+ return;
82
+ default:
83
+ console.error(`unknown shell: ${shell}. Choose bash, zsh, or fish.`);
84
+ process.exitCode = 2;
85
+ }
86
+ });
87
+ }
88
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAEA,MAAM,IAAI,GAAG;;;;;;;;;;;;;CAaZ,CAAC;AAEF,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BX,CAAC;AAEF,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBZ,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CAAC,mDAAmD,CAAC;SAChE,MAAM,CAAC,CAAC,KAAa,EAAE,EAAE;QACxB,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,MAAM;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAAC,OAAO;YAChD,KAAK,KAAK;gBAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAAC,OAAO;YAC/C,KAAK,MAAM;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAAC,OAAO;YAChD;gBACE,OAAO,CAAC,KAAK,CAAC,kBAAkB,KAAK,8BAA8B,CAAC,CAAC;gBACrE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerDead(program: Command): void;
3
+ //# sourceMappingURL=dead.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dead.d.ts","sourceRoot":"","sources":["../../src/commands/dead.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8BnD"}
@@ -0,0 +1,36 @@
1
+ import { Mnemo, parseDuration } from '@mnemo-mcp/core';
2
+ import chalk from 'chalk';
3
+ import { writeJsonResult } from '../json-mode.js';
4
+ export function registerDead(program) {
5
+ program
6
+ .command('dead')
7
+ .description('List memories that have never been recalled (candidates for prune)')
8
+ .option('--older-than <duration>', 'Only show memories older than this', '7d')
9
+ .option('--data-dir <path>', 'Data directory override')
10
+ .action(async (opts) => {
11
+ const embedderType = (process.env.MNEMO_EMBEDDER === 'hash' ? 'hash' : 'onnx');
12
+ const m = await Mnemo.open({ dataDir: opts.dataDir, embedderType });
13
+ try {
14
+ const olderMs = parseDuration(opts.olderThan);
15
+ const days = olderMs !== null ? Math.floor(olderMs / 86400_000) : 7;
16
+ const dead = await m.dead({ olderThanDays: days });
17
+ if (writeJsonResult(dead.map(r => ({ id: r.id, content: r.content, scope: r.scope, channel: r.channel, age_days: Math.floor((Date.now() - r.createdAt) / 86400_000) }))))
18
+ return;
19
+ if (dead.length === 0) {
20
+ console.log(chalk.green(`no never-recalled memories older than ${opts.olderThan}`));
21
+ return;
22
+ }
23
+ console.log(chalk.bold(`${dead.length} never-recalled, older than ${opts.olderThan}:`));
24
+ for (const r of dead) {
25
+ const age = Math.floor((Date.now() - r.createdAt) / 86400_000);
26
+ console.log(` ${chalk.dim(r.id.slice(0, 8))} ${chalk.yellow(`${age}d`)} ${r.content.slice(0, 80)}`);
27
+ }
28
+ console.log('');
29
+ console.log(chalk.dim(`run \`mnemo prune --min-access-count 1 --stale-after-days ${days}\` to clean these up`));
30
+ }
31
+ finally {
32
+ await m.close();
33
+ }
34
+ });
35
+ }
36
+ //# sourceMappingURL=dead.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dead.js","sourceRoot":"","sources":["../../src/commands/dead.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAIlD,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,oEAAoE,CAAC;SACjF,MAAM,CAAC,yBAAyB,EAAE,oCAAoC,EAAE,IAAI,CAAC;SAC7E,MAAM,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,IAAU,EAAE,EAAE;QAC3B,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAoB,CAAC;QAClG,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;gBAAE,OAAO;YAEjL,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,yCAAyC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBACpF,OAAO;YACT,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,+BAA+B,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YACxF,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC;gBAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YACzG,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,6DAA6D,IAAI,sBAAsB,CAAC,CAAC,CAAC;QAClH,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerDigest(program: Command): void;
3
+ //# sourceMappingURL=digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../../src/commands/digest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkDrD"}
@@ -0,0 +1,55 @@
1
+ import { Mnemo, sinceFromAgo } from '@mnemo-mcp/core';
2
+ import chalk from 'chalk';
3
+ import { writeJsonResult } from '../json-mode.js';
4
+ export function registerDigest(program) {
5
+ program
6
+ .command('digest')
7
+ .description('Summary of recent activity: captures, top-recalled, never-recalled candidates')
8
+ .option('--since <duration>', 'Period to summarize over', '7d')
9
+ .option('--data-dir <path>', 'Data directory override')
10
+ .action(async (opts) => {
11
+ const embedderType = (process.env.MNEMO_EMBEDDER === 'hash' ? 'hash' : 'onnx');
12
+ const m = await Mnemo.open({ dataDir: opts.dataDir, embedderType });
13
+ try {
14
+ const since = sinceFromAgo(opts.since) ?? Date.now() - 7 * 86400_000;
15
+ const all = await m.list({ includeExpired: true });
16
+ const captured = all.filter(r => r.createdAt >= since);
17
+ const accessed = all.filter(r => r.lastAccessedAt >= since && r.accessCount > 0);
18
+ const topAccessed = [...all]
19
+ .filter(r => r.accessCount > 0)
20
+ .sort((a, b) => b.accessCount - a.accessCount)
21
+ .slice(0, 5);
22
+ const dead = all.filter(r => r.accessCount === 0 && r.createdAt < since);
23
+ const stats = await m.stats();
24
+ if (writeJsonResult({
25
+ since,
26
+ captured: captured.length,
27
+ accessed: accessed.length,
28
+ top_accessed: topAccessed.map(r => ({ id: r.id, content: r.content, accessCount: r.accessCount })),
29
+ never_recalled: dead.length,
30
+ totals: stats,
31
+ }))
32
+ return;
33
+ console.log(chalk.bold(`📊 Mnemo digest — last ${opts.since}`));
34
+ console.log('');
35
+ console.log(`${chalk.bold('captured:')} ${captured.length}`);
36
+ console.log(`${chalk.bold('recalled:')} ${accessed.length}`);
37
+ console.log(`${chalk.bold('total memories:')} ${stats.totalMemories} (${stats.expired} expired)`);
38
+ console.log('');
39
+ if (topAccessed.length) {
40
+ console.log(chalk.bold('top recalled:'));
41
+ for (const r of topAccessed) {
42
+ console.log(` ${chalk.cyan(r.accessCount)}× ${chalk.dim(r.id.slice(0, 8))} ${r.content.slice(0, 70)}`);
43
+ }
44
+ console.log('');
45
+ }
46
+ if (dead.length) {
47
+ console.log(chalk.dim(`${dead.length} memories never recalled (older than ${opts.since}). Run \`mnemo dead\` for details or \`mnemo prune\` to clean up.`));
48
+ }
49
+ }
50
+ finally {
51
+ await m.close();
52
+ }
53
+ });
54
+ }
55
+ //# sourceMappingURL=digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.js","sourceRoot":"","sources":["../../src/commands/digest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerIngest(program: Command): void;
3
+ //# sourceMappingURL=ingest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/commands/ingest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsFrD"}
@@ -0,0 +1,95 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { extname } from 'node:path';
3
+ import { Mnemo, projectHashOf, parseMarkdown, parsePlain, hasSecrets, CHANNELS } from '@mnemo-mcp/core';
4
+ import { SecretContentError } from '@mnemo-mcp/core';
5
+ import chalk from 'chalk';
6
+ import { writeJsonResult } from '../json-mode.js';
7
+ export function registerIngest(program) {
8
+ program
9
+ .command('ingest <file>')
10
+ .description('Bulk-import a markdown or text file into memories (one per heading/paragraph/bullet)')
11
+ .option('-g, --global', 'Store all chunks as global memories', false)
12
+ .option('--team', 'Store all chunks as team memories', false)
13
+ .option('-c, --channel <channel>', `Force a single channel (${CHANNELS.join('|')})`)
14
+ .option('--default-channel <channel>', 'Channel to use when ingest cannot infer one')
15
+ .option('--skip-sensitive', 'Skip chunks that look like secrets (default: refuse all)', false)
16
+ .option('--dry-run', 'Show what would be captured without writing', false)
17
+ .option('--data-dir <path>', 'Data directory override')
18
+ .action(async (file, opts) => {
19
+ const raw = await readFile(file, 'utf8');
20
+ const chunks = extname(file).toLowerCase() === '.md' ? parseMarkdown(raw) : parsePlain(raw);
21
+ if (opts.channel && !CHANNELS.includes(opts.channel)) {
22
+ console.error(chalk.red(`invalid channel: ${opts.channel}`));
23
+ process.exitCode = 2;
24
+ return;
25
+ }
26
+ const forced = opts.channel;
27
+ const fallback = opts.defaultChannel;
28
+ const skipped = [];
29
+ const willCapture = [];
30
+ for (const c of chunks) {
31
+ if (hasSecrets(c.content)) {
32
+ if (opts.skipSensitive) {
33
+ skipped.push({ reason: 'secret', preview: c.content.slice(0, 60) });
34
+ continue;
35
+ }
36
+ }
37
+ willCapture.push({ ...c, channel: forced ?? c.channel ?? fallback ?? null });
38
+ }
39
+ if (writeJsonResult({
40
+ file,
41
+ chunks: chunks.length,
42
+ will_capture: willCapture.length,
43
+ skipped: skipped.length,
44
+ dry_run: opts.dryRun,
45
+ previews: willCapture.slice(0, 5).map(c => ({ channel: c.channel, content: c.content.slice(0, 80) })),
46
+ }))
47
+ return;
48
+ console.log(chalk.bold(`parsed ${chunks.length} chunks from ${file}`));
49
+ if (skipped.length)
50
+ console.log(chalk.yellow(` skipped ${skipped.length} (secret content)`));
51
+ if (opts.dryRun) {
52
+ for (const c of willCapture.slice(0, 10)) {
53
+ console.log(chalk.dim('would capture:'), c.channel ? chalk.dim(`[${c.channel}]`) : '', c.content.slice(0, 80));
54
+ }
55
+ if (willCapture.length > 10)
56
+ console.log(chalk.dim(` …and ${willCapture.length - 10} more`));
57
+ return;
58
+ }
59
+ const embedderType = (process.env.MNEMO_EMBEDDER === 'hash' ? 'hash' : 'onnx');
60
+ const m = await Mnemo.open({ dataDir: opts.dataDir, embedderType });
61
+ try {
62
+ const scope = opts.team ? 'team' : opts.global ? 'global' : 'project';
63
+ let captured = 0;
64
+ let deduped = 0;
65
+ let secrets = 0;
66
+ for (const c of willCapture) {
67
+ try {
68
+ await m.capture({
69
+ content: c.content,
70
+ scope,
71
+ projectHash: scope === 'global' || scope === 'team' ? null : projectHashOf(process.cwd()),
72
+ tags: ['ingested'],
73
+ channel: c.channel,
74
+ source: 'imported',
75
+ });
76
+ captured++;
77
+ if (m.lastCaptureDeduped)
78
+ deduped++;
79
+ }
80
+ catch (err) {
81
+ if (err instanceof SecretContentError) {
82
+ secrets++;
83
+ continue;
84
+ }
85
+ throw err;
86
+ }
87
+ }
88
+ console.log(chalk.green('ingested'), captured, 'memories', chalk.dim(`(${deduped} deduped, ${secrets} blocked as secret)`));
89
+ }
90
+ finally {
91
+ await m.close();
92
+ }
93
+ });
94
+ }
95
+ //# sourceMappingURL=ingest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/commands/ingest.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../src/commands/recall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0CrD"}
1
+ {"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../src/commands/recall.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsErD"}
@@ -1,18 +1,22 @@
1
- import { Mnemo, projectHashOf, sinceFromAgo } from '@mnemo-mcp/core';
1
+ import { Mnemo, projectHashOf, sinceFromAgo, CHANNELS } from '@mnemo-mcp/core';
2
2
  import chalk from 'chalk';
3
3
  import { formatHit } from '../output.js';
4
- const SOURCES = ['manual', 'auto-edit', 'auto-task', 'imported'];
4
+ import { interactiveRecall } from '../interactive.js';
5
+ import { writeJsonResult } from '../json-mode.js';
6
+ const SOURCES = ['manual', 'auto-edit', 'auto-task', 'imported', 'team-sync'];
5
7
  export function registerRecall(program) {
6
8
  program
7
9
  .command('recall <query...>')
8
10
  .description('Semantic search across memories')
9
11
  .option('-k, --top <n>', 'Number of hits', '5')
10
- .option('-s, --scope <scope>', 'project | global | all', 'all')
12
+ .option('-s, --scope <scope>', 'project | global | team | all', 'all')
11
13
  .option('--min-score <n>', 'Minimum composite score', '0')
12
14
  .option('--tag <tags>', 'Comma-separated tags (memory must have ALL)')
13
15
  .option('--source <sources>', `Comma-separated sources (${SOURCES.join('|')})`)
14
- .option('--since <duration>', 'Only memories updated within (e.g. 7d, 24h, 30m)')
16
+ .option('-c, --channel <channels>', `Comma-separated channels (${CHANNELS.join('|')})`)
17
+ .option('--since <duration>', 'Only memories updated within (e.g. 7d)')
15
18
  .option('--include-expired', 'Include expired memories', false)
19
+ .option('-i, --interactive', 'Interactive picker (arrow keys + Enter)', false)
16
20
  .option('--data-dir <path>', 'Data directory override')
17
21
  .action(async (queryParts, opts) => {
18
22
  const query = queryParts.join(' ');
@@ -24,6 +28,9 @@ export function registerRecall(program) {
24
28
  const source = opts.source
25
29
  ? opts.source.split(',').map(s => s.trim()).filter(Boolean)
26
30
  : undefined;
31
+ const channel = opts.channel
32
+ ? opts.channel.split(',').map(s => s.trim()).filter(Boolean)
33
+ : undefined;
27
34
  const since = sinceFromAgo(opts.since);
28
35
  const hits = await m.recall(query, {
29
36
  k: Number(opts.top),
@@ -32,13 +39,33 @@ export function registerRecall(program) {
32
39
  minScore: Number(opts.minScore),
33
40
  tags,
34
41
  source,
42
+ channel,
35
43
  since,
36
44
  includeExpired: opts.includeExpired,
37
45
  });
46
+ if (writeJsonResult(hits.map(h => ({
47
+ id: h.record.id,
48
+ score: h.score,
49
+ similarity: h.similarity,
50
+ content: h.record.content,
51
+ scope: h.record.scope,
52
+ channel: h.record.channel,
53
+ tags: h.record.tags,
54
+ }))))
55
+ return;
38
56
  if (hits.length === 0) {
39
57
  console.log(chalk.yellow('no matching memories'));
40
58
  return;
41
59
  }
60
+ if (opts.interactive) {
61
+ const chosen = await interactiveRecall(hits);
62
+ if (chosen) {
63
+ console.log('');
64
+ console.log(chalk.bold('selected'), chalk.dim(chosen.id.slice(0, 8)));
65
+ console.log(chosen.content);
66
+ }
67
+ return;
68
+ }
42
69
  for (const h of hits)
43
70
  console.log(formatHit(h));
44
71
  }
@@ -1 +1 @@
1
- {"version":3,"file":"recall.js","sourceRoot":"","sources":["../../src/commands/recall.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recall.js","sourceRoot":"","sources":["../../src/commands/recall.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"remember.d.ts","sourceRoot":"","sources":["../../src/commands/remember.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqCvD"}
1
+ {"version":3,"file":"remember.d.ts","sourceRoot":"","sources":["../../src/commands/remember.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8DvD"}
@@ -1,38 +1,64 @@
1
- import { Mnemo, projectHashOf, expiresAtFromTtl } from '@mnemo-mcp/core';
1
+ import { Mnemo, projectHashOf, expiresAtFromTtl, CHANNELS, SecretContentError } from '@mnemo-mcp/core';
2
2
  import chalk from 'chalk';
3
+ import { writeJsonResult } from '../json-mode.js';
3
4
  export function registerRemember(program) {
4
5
  program
5
6
  .command('remember <content...>')
6
7
  .description('Capture a memory')
7
8
  .option('-g, --global', 'Store as global (cross-project) memory', false)
9
+ .option('--team', 'Store as team-shared memory (sync via mnemo team push)', false)
8
10
  .option('-t, --tags <list>', 'Comma-separated tags', '')
11
+ .option('-c, --channel <channel>', `Structured channel: ${CHANNELS.join('|')}`)
9
12
  .option('--expires-in <duration>', 'Auto-forget after (e.g. 30d, 12h, 7d)')
10
13
  .option('--dedup-threshold <n>', 'Cosine similarity above which to update existing instead of inserting (0 disables)', '0.95')
14
+ .option('--allow-sensitive', 'Bypass the secret-guard (use with care)', false)
11
15
  .option('--data-dir <path>', 'Data directory override')
12
16
  .action(async (contentParts, opts) => {
13
17
  const content = contentParts.join(' ');
14
18
  const tags = opts.tags ? opts.tags.split(',').map(t => t.trim()).filter(Boolean) : [];
15
19
  const embedderType = (process.env.MNEMO_EMBEDDER === 'hash' ? 'hash' : 'onnx');
20
+ if (opts.channel && !CHANNELS.includes(opts.channel)) {
21
+ console.error(chalk.red(`invalid channel: ${opts.channel}. Valid: ${CHANNELS.join(', ')}`));
22
+ process.exitCode = 2;
23
+ return;
24
+ }
16
25
  const m = await Mnemo.open({ dataDir: opts.dataDir, embedderType });
17
26
  try {
18
27
  const expiresAt = expiresAtFromTtl(opts.expiresIn);
19
28
  if (opts.expiresIn && expiresAt === null) {
20
- console.error(chalk.red('invalid --expires-in value:'), opts.expiresIn, chalk.dim('(use 30d, 12h, 45m, 10s, 2w)'));
29
+ console.error(chalk.red('invalid --expires-in value:'), opts.expiresIn);
21
30
  process.exitCode = 2;
22
31
  return;
23
32
  }
24
- const rec = await m.capture({
25
- content,
26
- scope: opts.global ? 'global' : 'project',
27
- projectHash: opts.global ? null : projectHashOf(process.cwd()),
28
- tags,
29
- source: 'manual',
30
- expiresAt,
31
- dedupThreshold: Number(opts.dedupThreshold),
32
- });
33
- const verb = m.lastCaptureDeduped ? chalk.cyan('updated') : chalk.green('saved');
34
- const ttl = expiresAt ? chalk.dim(` (expires ${new Date(expiresAt).toISOString().slice(0, 10)})`) : '';
35
- console.log(verb, chalk.dim(rec.id.slice(0, 8)) + ttl);
33
+ const scope = opts.team ? 'team' : opts.global ? 'global' : 'project';
34
+ try {
35
+ const rec = await m.capture({
36
+ content,
37
+ scope,
38
+ projectHash: scope === 'global' || scope === 'team' ? null : projectHashOf(process.cwd()),
39
+ tags,
40
+ source: 'manual',
41
+ channel: opts.channel ?? null,
42
+ expiresAt,
43
+ dedupThreshold: Number(opts.dedupThreshold),
44
+ allowSensitive: opts.allowSensitive,
45
+ });
46
+ if (writeJsonResult({ id: rec.id, scope: rec.scope, channel: rec.channel, deduped: m.lastCaptureDeduped }))
47
+ return;
48
+ const verb = m.lastCaptureDeduped ? chalk.cyan('updated') : chalk.green('saved');
49
+ const ttl = expiresAt ? chalk.dim(` (expires ${new Date(expiresAt).toISOString().slice(0, 10)})`) : '';
50
+ const ch = rec.channel ? chalk.dim(` [${rec.channel}]`) : '';
51
+ console.log(verb, chalk.dim(rec.id.slice(0, 8)) + ch + ttl);
52
+ }
53
+ catch (err) {
54
+ if (err instanceof SecretContentError) {
55
+ console.error(chalk.red('refused to capture:'), err.message);
56
+ console.error(chalk.dim('use --allow-sensitive if you really mean it'));
57
+ process.exitCode = 3;
58
+ return;
59
+ }
60
+ throw err;
61
+ }
36
62
  }
37
63
  finally {
38
64
  await m.close();
@@ -1 +1 @@
1
- {"version":3,"file":"remember.js","sourceRoot":"","sources":["../../src/commands/remember.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"remember.js","sourceRoot":"","sources":["../../src/commands/remember.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerTeam(program: Command): void;
3
+ //# sourceMappingURL=team.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team.d.ts","sourceRoot":"","sources":["../../src/commands/team.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4HnD"}
@@ -0,0 +1,150 @@
1
+ import { Mnemo, projectHashOf } from '@mnemo-mcp/core';
2
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
3
+ import { existsSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import chalk from 'chalk';
6
+ import { writeJsonResult } from '../json-mode.js';
7
+ const TEAM_DIR = '.mnemo';
8
+ const TEAM_FILE = 'team.json';
9
+ function teamFile() {
10
+ return join(process.cwd(), TEAM_DIR, TEAM_FILE);
11
+ }
12
+ export function registerTeam(program) {
13
+ const team = program.command('team').description('Team-shared memory synced via git (.mnemo/team.json)');
14
+ team
15
+ .command('init')
16
+ .description('Create .mnemo/team.json so memories can be checked into git')
17
+ .option('--data-dir <path>', 'Data directory override')
18
+ .action(async (_opts) => {
19
+ const file = teamFile();
20
+ if (existsSync(file)) {
21
+ console.log(chalk.yellow('team file already exists at'), file);
22
+ return;
23
+ }
24
+ await mkdir(join(process.cwd(), TEAM_DIR), { recursive: true });
25
+ await writeFile(file, JSON.stringify({ version: 1, memories: [] }, null, 2));
26
+ console.log(chalk.green('created'), file);
27
+ console.log(chalk.dim('commit this file. Use `mnemo team push` to publish your team-scoped memories.'));
28
+ });
29
+ team
30
+ .command('push')
31
+ .description('Export local team-scoped memories to .mnemo/team.json')
32
+ .option('--from <scope>', 'Source scope: team (default), project, global', 'team')
33
+ .option('--data-dir <path>', 'Data directory override')
34
+ .action(async (opts) => {
35
+ const file = teamFile();
36
+ const embedderType = (process.env.MNEMO_EMBEDDER === 'hash' ? 'hash' : 'onnx');
37
+ const m = await Mnemo.open({ dataDir: opts.dataDir, embedderType });
38
+ try {
39
+ const fromScope = (opts.from ?? 'team');
40
+ const projectHash = fromScope === 'project' ? projectHashOf(process.cwd()) : undefined;
41
+ const all = await m.list({ scope: fromScope, projectHash, includeExpired: true });
42
+ await mkdir(join(process.cwd(), TEAM_DIR), { recursive: true });
43
+ const payload = { version: 1, memories: all.map(toShareable) };
44
+ await writeFile(file, JSON.stringify(payload, null, 2));
45
+ if (writeJsonResult({ pushed: all.length, file }))
46
+ return;
47
+ console.log(chalk.green('pushed'), all.length, 'memories →', file);
48
+ console.log(chalk.dim('commit + push to share with the team.'));
49
+ }
50
+ finally {
51
+ await m.close();
52
+ }
53
+ });
54
+ team
55
+ .command('pull')
56
+ .description('Import .mnemo/team.json into local DB as scope=team')
57
+ .option('--data-dir <path>', 'Data directory override')
58
+ .action(async (opts) => {
59
+ const file = teamFile();
60
+ if (!existsSync(file)) {
61
+ console.error(chalk.red('no team file found at'), file);
62
+ console.error(chalk.dim('run `mnemo team init` first, or pull from your remote.'));
63
+ process.exitCode = 1;
64
+ return;
65
+ }
66
+ const raw = JSON.parse(await readFile(file, 'utf8'));
67
+ const embedderType = (process.env.MNEMO_EMBEDDER === 'hash' ? 'hash' : 'onnx');
68
+ const m = await Mnemo.open({ dataDir: opts.dataDir, embedderType });
69
+ try {
70
+ let imported = 0;
71
+ let updated = 0;
72
+ for (const rec of raw.memories ?? []) {
73
+ await m.capture({
74
+ id: rec.id,
75
+ content: rec.content,
76
+ scope: 'team',
77
+ projectHash: null,
78
+ tags: rec.tags ?? [],
79
+ channel: rec.channel ?? null,
80
+ source: 'team-sync',
81
+ allowSensitive: true, // already vetted upstream
82
+ dedupThreshold: 0,
83
+ });
84
+ if (m.lastCaptureDeduped)
85
+ updated++;
86
+ else
87
+ imported++;
88
+ }
89
+ if (writeJsonResult({ imported, updated, file }))
90
+ return;
91
+ console.log(chalk.green('pulled'), imported, 'new,', updated, 'updated');
92
+ }
93
+ finally {
94
+ await m.close();
95
+ }
96
+ });
97
+ team
98
+ .command('status')
99
+ .description('Show team file vs local team-scoped memories')
100
+ .option('--data-dir <path>', 'Data directory override')
101
+ .action(async (opts) => {
102
+ const file = teamFile();
103
+ const embedderType = (process.env.MNEMO_EMBEDDER === 'hash' ? 'hash' : 'onnx');
104
+ const m = await Mnemo.open({ dataDir: opts.dataDir, embedderType });
105
+ try {
106
+ const local = await m.list({ scope: 'team', includeExpired: true });
107
+ let remote = [];
108
+ if (existsSync(file)) {
109
+ const raw = JSON.parse(await readFile(file, 'utf8'));
110
+ remote = raw.memories ?? [];
111
+ }
112
+ const localIds = new Set(local.map(r => r.id));
113
+ const remoteIds = new Set(remote.map(r => r.id));
114
+ const onlyLocal = [...local].filter(r => !remoteIds.has(r.id));
115
+ const onlyRemote = [...remote].filter(r => !localIds.has(r.id));
116
+ if (writeJsonResult({
117
+ file,
118
+ file_exists: existsSync(file),
119
+ local: local.length,
120
+ remote: remote.length,
121
+ only_local: onlyLocal.length,
122
+ only_remote: onlyRemote.length,
123
+ }))
124
+ return;
125
+ console.log(chalk.bold('Team file:'), existsSync(file) ? file : chalk.yellow('(missing — run team init)'));
126
+ console.log(chalk.bold('Local team memories:'), local.length);
127
+ console.log(chalk.bold('Remote (file) memories:'), remote.length);
128
+ if (onlyLocal.length)
129
+ console.log(chalk.cyan(` ${onlyLocal.length} local-only — will be sent on next push`));
130
+ if (onlyRemote.length)
131
+ console.log(chalk.magenta(` ${onlyRemote.length} remote-only — will be added on next pull`));
132
+ if (!onlyLocal.length && !onlyRemote.length && existsSync(file)) {
133
+ console.log(chalk.green(' in sync ✓'));
134
+ }
135
+ }
136
+ finally {
137
+ await m.close();
138
+ }
139
+ });
140
+ }
141
+ function toShareable(r) {
142
+ return {
143
+ ...r,
144
+ scope: 'team',
145
+ projectHash: null,
146
+ accessCount: 0,
147
+ lastAccessedAt: r.lastAccessedAt,
148
+ };
149
+ }
150
+ //# sourceMappingURL=team.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team.js","sourceRoot":"","sources":["../../src/commands/team.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerWhy(program: Command): void;
3
+ //# sourceMappingURL=why.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"why.d.ts","sourceRoot":"","sources":["../../src/commands/why.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqDlD"}
@@ -0,0 +1,59 @@
1
+ import { Mnemo } from '@mnemo-mcp/core';
2
+ import chalk from 'chalk';
3
+ import { writeJsonResult } from '../json-mode.js';
4
+ export function registerWhy(program) {
5
+ program
6
+ .command('why <id>')
7
+ .description('Show why this memory exists: provenance + (with --query) full ranking breakdown for a query')
8
+ .option('-q, --query <text>', 'Show how this memory would score against this query')
9
+ .option('--data-dir <path>', 'Data directory override')
10
+ .action(async (id, opts) => {
11
+ const embedderType = (process.env.MNEMO_EMBEDDER === 'hash' ? 'hash' : 'onnx');
12
+ const m = await Mnemo.open({ dataDir: opts.dataDir, embedderType });
13
+ try {
14
+ const list = await m.list({ includeExpired: true });
15
+ const r = list.find(x => x.id === id || x.id.startsWith(id));
16
+ if (!r) {
17
+ if (writeJsonResult({ error: 'not_found', query: id }))
18
+ return;
19
+ console.error(chalk.yellow(`no memory matches "${id}"`));
20
+ process.exitCode = 1;
21
+ return;
22
+ }
23
+ let breakdown;
24
+ if (opts.query) {
25
+ const hits = await m.recall(opts.query, { k: 50, scope: 'all' });
26
+ const hit = hits.find(h => h.record.id === r.id);
27
+ if (hit)
28
+ breakdown = m.scoreBreakdown(hit.similarity, r);
29
+ }
30
+ if (writeJsonResult({ record: r, breakdown }))
31
+ return;
32
+ console.log(chalk.bold('Memory'), chalk.dim(r.id));
33
+ console.log(` ${chalk.bold('content:')} ${r.content}`);
34
+ console.log(` ${chalk.bold('scope:')} ${r.scope}` + (r.projectHash ? chalk.dim(` (project ${r.projectHash.slice(0, 8)})`) : ''));
35
+ console.log(` ${chalk.bold('channel:')} ${r.channel ?? chalk.dim('—')}`);
36
+ console.log(` ${chalk.bold('source:')} ${r.source}`);
37
+ console.log(` ${chalk.bold('tags:')} ${r.tags.length ? r.tags.join(', ') : chalk.dim('—')}`);
38
+ console.log(` ${chalk.bold('created:')} ${new Date(r.createdAt).toISOString()}`);
39
+ console.log(` ${chalk.bold('updated:')} ${new Date(r.updatedAt).toISOString()}`);
40
+ console.log(` ${chalk.bold('accessed:')} ${r.accessCount} times, last ${new Date(r.lastAccessedAt).toISOString()}`);
41
+ console.log(` ${chalk.bold('expires:')} ${r.expiresAt ? new Date(r.expiresAt).toISOString() : chalk.dim('never')}`);
42
+ if (breakdown) {
43
+ console.log('');
44
+ console.log(chalk.bold(`Ranking against "${opts.query}":`));
45
+ console.log(` similarity: ${breakdown.similarity.toFixed(4)} × 0.7 = ${(breakdown.similarity * 0.7).toFixed(4)}`);
46
+ console.log(` recency: ${breakdown.recency.toFixed(4)} × 0.2 = ${(breakdown.recency * 0.2).toFixed(4)}`);
47
+ console.log(` access: ${breakdown.accessBoost.toFixed(4)} × 0.1 = ${(breakdown.accessBoost * 0.1).toFixed(4)}`);
48
+ console.log(` ${chalk.bold('composite:')} ${breakdown.composite.toFixed(4)}`);
49
+ }
50
+ else if (opts.query) {
51
+ console.log(chalk.dim(`(memory was not in top 50 hits for query "${opts.query}")`));
52
+ }
53
+ }
54
+ finally {
55
+ await m.close();
56
+ }
57
+ });
58
+ }
59
+ //# sourceMappingURL=why.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"why.js","sourceRoot":"","sources":["../../src/commands/why.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -11,11 +11,23 @@ import { registerHook } from './commands/hook.js';
11
11
  import { registerInit } from './commands/init.js';
12
12
  import { registerEdit } from './commands/edit.js';
13
13
  import { registerPrune } from './commands/prune.js';
14
+ import { registerIngest } from './commands/ingest.js';
15
+ import { registerCite } from './commands/cite.js';
16
+ import { registerWhy } from './commands/why.js';
17
+ import { registerDigest } from './commands/digest.js';
18
+ import { registerDead } from './commands/dead.js';
19
+ import { registerTeam } from './commands/team.js';
20
+ import { registerCompletion } from './commands/completion.js';
14
21
  const program = new Command();
15
22
  program
16
23
  .name('mnemo')
17
24
  .description('Persistent memory for Claude Code')
18
- .version('1.0.0');
25
+ .version('1.1.0')
26
+ .option('--json', 'machine-readable JSON output')
27
+ .hook('preAction', thisCommand => {
28
+ if (thisCommand.opts().json)
29
+ process.env.MNEMO_JSON = '1';
30
+ });
19
31
  registerRemember(program);
20
32
  registerRecall(program);
21
33
  registerList(program);
@@ -28,6 +40,13 @@ registerHook(program);
28
40
  registerInit(program);
29
41
  registerEdit(program);
30
42
  registerPrune(program);
43
+ registerIngest(program);
44
+ registerCite(program);
45
+ registerWhy(program);
46
+ registerDigest(program);
47
+ registerDead(program);
48
+ registerTeam(program);
49
+ registerCompletion(program);
31
50
  program.parseAsync(process.argv).catch(err => {
32
51
  console.error('mnemo:', err.message);
33
52
  process.exit(1);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,mCAAmC,CAAC;KAChD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAC1B,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,aAAa,CAAC,OAAO,CAAC,CAAC;AAEvB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IAC3C,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,mCAAmC,CAAC;KAChD,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,QAAQ,EAAE,8BAA8B,CAAC;KAChD,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE;IAC/B,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;AAC5D,CAAC,CAAC,CAAC;AAEL,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAC1B,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,WAAW,CAAC,OAAO,CAAC,CAAC;AACrB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAE5B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IAC3C,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { MemoryHit, MemoryRecord } from '@mnemo-mcp/core';
2
+ /**
3
+ * Minimal arrow-key interactive picker. No external deps.
4
+ * Returns the chosen MemoryRecord, or null if the user aborted (Esc / Ctrl-C).
5
+ */
6
+ export declare function interactiveRecall(hits: MemoryHit[]): Promise<MemoryRecord | null>;
7
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAK/D;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA+DvF"}
@@ -0,0 +1,71 @@
1
+ import chalk from 'chalk';
2
+ import { stdin, stdout } from 'node:process';
3
+ import { emitKeypressEvents } from 'node:readline';
4
+ /**
5
+ * Minimal arrow-key interactive picker. No external deps.
6
+ * Returns the chosen MemoryRecord, or null if the user aborted (Esc / Ctrl-C).
7
+ */
8
+ export async function interactiveRecall(hits) {
9
+ if (hits.length === 0)
10
+ return null;
11
+ if (!stdin.isTTY) {
12
+ // Non-interactive — fall back to first hit
13
+ return hits[0].record;
14
+ }
15
+ let cursor = 0;
16
+ const max = hits.length;
17
+ emitKeypressEvents(stdin);
18
+ stdin.setRawMode(true);
19
+ stdin.resume();
20
+ const render = (first = false) => {
21
+ if (!first) {
22
+ // Move cursor up by previous render height
23
+ stdout.write(`\x1b[${max + 2}A`);
24
+ }
25
+ stdout.write(chalk.dim('↑/↓ select · Enter pick · Esc cancel\n\n'));
26
+ for (let i = 0; i < max; i++) {
27
+ const h = hits[i];
28
+ const sel = i === cursor;
29
+ const arrow = sel ? chalk.cyan('▶ ') : ' ';
30
+ const id = chalk.dim(h.record.id.slice(0, 8));
31
+ const score = chalk.cyan(h.score.toFixed(3));
32
+ const content = h.record.content.length > 80 ? h.record.content.slice(0, 77) + '…' : h.record.content;
33
+ const line = sel ? chalk.bold(`${id} ${score} ${content}`) : `${id} ${score} ${content}`;
34
+ // \x1b[2K clears line so previous render is overwritten
35
+ stdout.write(`\x1b[2K${arrow}${line}\n`);
36
+ }
37
+ };
38
+ return await new Promise(resolve => {
39
+ const cleanup = (val) => {
40
+ stdin.setRawMode(false);
41
+ stdin.removeListener('keypress', onKey);
42
+ stdin.pause();
43
+ // Move below the picker
44
+ stdout.write('\n');
45
+ resolve(val);
46
+ };
47
+ function onKey(_, key) {
48
+ if (!key)
49
+ return;
50
+ if (key.ctrl && key.name === 'c')
51
+ return cleanup(null);
52
+ if (key.name === 'escape' || key.name === 'q')
53
+ return cleanup(null);
54
+ if (key.name === 'return' || key.name === 'enter')
55
+ return cleanup(hits[cursor].record);
56
+ if (key.name === 'up' || key.name === 'k') {
57
+ cursor = (cursor - 1 + max) % max;
58
+ render();
59
+ return;
60
+ }
61
+ if (key.name === 'down' || key.name === 'j') {
62
+ cursor = (cursor + 1) % max;
63
+ render();
64
+ return;
65
+ }
66
+ }
67
+ stdin.on('keypress', onKey);
68
+ render(true);
69
+ });
70
+ }
71
+ //# sourceMappingURL=interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../src/interactive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Global --json mode: when MNEMO_JSON=1 is set in the env (set by the root
3
+ * commander option), commands emit machine-readable JSON to stdout instead
4
+ * of human output and skip the rest of their pretty printing.
5
+ */
6
+ export declare function jsonMode(): boolean;
7
+ /**
8
+ * Helper used by commands. If JSON mode is on, prints the payload and
9
+ * returns `true` (caller should bail without further output).
10
+ * Returns `false` in human mode so caller continues with chalk output.
11
+ */
12
+ export declare function writeJsonResult(payload: unknown): boolean;
13
+ //# sourceMappingURL=json-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-mode.d.ts","sourceRoot":"","sources":["../src/json-mode.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAgB,QAAQ,IAAI,OAAO,CAElC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAIzD"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Global --json mode: when MNEMO_JSON=1 is set in the env (set by the root
3
+ * commander option), commands emit machine-readable JSON to stdout instead
4
+ * of human output and skip the rest of their pretty printing.
5
+ */
6
+ export function jsonMode() {
7
+ return process.env.MNEMO_JSON === '1';
8
+ }
9
+ /**
10
+ * Helper used by commands. If JSON mode is on, prints the payload and
11
+ * returns `true` (caller should bail without further output).
12
+ * Returns `false` in human mode so caller continues with chalk output.
13
+ */
14
+ export function writeJsonResult(payload) {
15
+ if (!jsonMode())
16
+ return false;
17
+ process.stdout.write(JSON.stringify(payload) + '\n');
18
+ return true;
19
+ }
20
+ //# sourceMappingURL=json-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-mode.js","sourceRoot":"","sources":["../src/json-mode.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,UAAU,QAAQ;IACtB,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,IAAI,CAAC,QAAQ,EAAE;QAAE,OAAO,KAAK,CAAC;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnemo-mcp/cli",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Mnemo CLI — install Mnemo into Claude Code, capture and recall memories from your terminal",
5
5
  "license": "MIT",
6
6
  "author": "Omer Maksuti",
@@ -37,7 +37,7 @@
37
37
  "test": "vitest run"
38
38
  },
39
39
  "dependencies": {
40
- "@mnemo-mcp/core": "1.0.0",
40
+ "@mnemo-mcp/core": "1.1.0",
41
41
  "commander": "^12.0.0",
42
42
  "chalk": "^5.3.0"
43
43
  },