brainbank 0.1.3 → 0.1.4

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 (167) hide show
  1. package/README.md +84 -1107
  2. package/assets/architecture.png +0 -0
  3. package/bin/brainbank +8 -1
  4. package/bin/brainbank-mcp +19 -0
  5. package/dist/chunk-3UIWA32X.js +3341 -0
  6. package/dist/chunk-3UIWA32X.js.map +1 -0
  7. package/dist/chunk-3YBCD6DI.js +117 -0
  8. package/dist/chunk-3YBCD6DI.js.map +1 -0
  9. package/dist/chunk-DAGVUEXL.js +258 -0
  10. package/dist/chunk-DAGVUEXL.js.map +1 -0
  11. package/dist/chunk-DMFMTOHF.js +123 -0
  12. package/dist/chunk-DMFMTOHF.js.map +1 -0
  13. package/dist/chunk-FQYKWB2Q.js +136 -0
  14. package/dist/chunk-FQYKWB2Q.js.map +1 -0
  15. package/dist/chunk-IMJJ2VEM.js +74 -0
  16. package/dist/chunk-IMJJ2VEM.js.map +1 -0
  17. package/dist/chunk-M744PCJQ.js +43 -0
  18. package/dist/chunk-M744PCJQ.js.map +1 -0
  19. package/dist/chunk-NNDY7P2R.js +211 -0
  20. package/dist/chunk-NNDY7P2R.js.map +1 -0
  21. package/dist/chunk-O3J6ZIXK.js +82 -0
  22. package/dist/chunk-O3J6ZIXK.js.map +1 -0
  23. package/dist/chunk-RDQYDLYZ.js +69 -0
  24. package/dist/chunk-RDQYDLYZ.js.map +1 -0
  25. package/dist/chunk-WCQVDF3K.js +14 -0
  26. package/dist/cli.js +2713 -325
  27. package/dist/cli.js.map +1 -1
  28. package/dist/haiku-pruner-5KVT5AI2.js +8 -0
  29. package/dist/http-server-2ZQ6I43B.js +9 -0
  30. package/dist/index.d.ts +1886 -626
  31. package/dist/index.js +319 -46
  32. package/dist/index.js.map +1 -1
  33. package/dist/local-embedding-NZQTILGV.js +8 -0
  34. package/dist/mcp.d.ts +2 -0
  35. package/dist/mcp.js +386 -0
  36. package/dist/mcp.js.map +1 -0
  37. package/dist/openai-embedding-ZP5TSUJG.js +8 -0
  38. package/dist/perplexity-context-embedding-GI5PHE6X.js +9 -0
  39. package/dist/perplexity-context-embedding-GI5PHE6X.js.map +1 -0
  40. package/dist/perplexity-embedding-KZRYGJRC.js +10 -0
  41. package/dist/perplexity-embedding-KZRYGJRC.js.map +1 -0
  42. package/dist/plugin-IKQ6IRSJ.js +32 -0
  43. package/dist/plugin-IKQ6IRSJ.js.map +1 -0
  44. package/dist/resolve-ASGLBNUC.js +10 -0
  45. package/dist/resolve-ASGLBNUC.js.map +1 -0
  46. package/dist/stats-tui-AD3AMYGV.js +1904 -0
  47. package/dist/stats-tui-AD3AMYGV.js.map +1 -0
  48. package/package.json +38 -53
  49. package/src/brainbank.ts +617 -0
  50. package/src/cli/commands/collection.ts +77 -0
  51. package/src/cli/commands/context.ts +59 -0
  52. package/src/cli/commands/daemon.ts +100 -0
  53. package/src/cli/commands/docs.ts +71 -0
  54. package/src/cli/commands/files.ts +69 -0
  55. package/src/cli/commands/help.ts +82 -0
  56. package/src/cli/commands/index.ts +478 -0
  57. package/src/cli/commands/kv.ts +140 -0
  58. package/src/cli/commands/mcp-export.ts +273 -0
  59. package/src/cli/commands/mcp.ts +6 -0
  60. package/src/cli/commands/query.ts +167 -0
  61. package/src/cli/commands/reembed.ts +30 -0
  62. package/src/cli/commands/reindex.ts +40 -0
  63. package/src/cli/commands/scan.ts +336 -0
  64. package/src/cli/commands/search.ts +203 -0
  65. package/src/cli/commands/stats.ts +68 -0
  66. package/src/cli/commands/status.ts +47 -0
  67. package/src/cli/commands/watch.ts +47 -0
  68. package/src/cli/factory/brain-context.ts +43 -0
  69. package/src/cli/factory/builtin-registration.ts +87 -0
  70. package/src/cli/factory/config-loader.ts +77 -0
  71. package/src/cli/factory/index.ts +69 -0
  72. package/src/cli/factory/plugin-loader.ts +324 -0
  73. package/src/cli/index.ts +76 -0
  74. package/src/cli/server-client.ts +186 -0
  75. package/src/cli/tui/index-tui.tsx +667 -0
  76. package/src/cli/tui/stats-data.ts +523 -0
  77. package/src/cli/tui/stats-search.ts +262 -0
  78. package/src/cli/tui/stats-tui.tsx +1465 -0
  79. package/src/cli/tui/tree-scanner.ts +650 -0
  80. package/src/cli/utils.ts +137 -0
  81. package/src/config.ts +48 -0
  82. package/src/constants.ts +21 -0
  83. package/src/db/adapter.ts +112 -0
  84. package/src/db/metadata.ts +130 -0
  85. package/src/db/migrations.ts +66 -0
  86. package/src/db/sqlite-adapter.ts +218 -0
  87. package/src/db/tracker.ts +91 -0
  88. package/src/engine/index-api.ts +81 -0
  89. package/src/engine/reembed.ts +206 -0
  90. package/src/engine/search-api.ts +218 -0
  91. package/src/index.ts +150 -0
  92. package/src/lib/fts.ts +57 -0
  93. package/src/lib/languages.ts +179 -0
  94. package/src/lib/logger.ts +126 -0
  95. package/src/lib/math.ts +87 -0
  96. package/src/lib/provider-key.ts +20 -0
  97. package/src/lib/prune.ts +72 -0
  98. package/src/lib/rrf.ts +133 -0
  99. package/src/lib/write-lock.ts +108 -0
  100. package/src/mcp/mcp-server.ts +268 -0
  101. package/src/mcp/workspace-factory.ts +68 -0
  102. package/src/mcp/workspace-pool.ts +224 -0
  103. package/src/plugin.ts +381 -0
  104. package/src/providers/embeddings/embedding-worker-thread.ts +95 -0
  105. package/src/providers/embeddings/embedding-worker.ts +141 -0
  106. package/src/providers/embeddings/local-embedding.ts +115 -0
  107. package/src/providers/embeddings/openai-embedding.ts +167 -0
  108. package/src/providers/embeddings/perplexity-context-embedding.ts +195 -0
  109. package/src/providers/embeddings/perplexity-embedding.ts +165 -0
  110. package/src/providers/embeddings/resolve.ts +34 -0
  111. package/src/providers/pruners/haiku-expander.ts +178 -0
  112. package/src/providers/pruners/haiku-pruner.ts +263 -0
  113. package/src/providers/vector/hnsw-index.ts +174 -0
  114. package/src/providers/vector/hnsw-loader.ts +129 -0
  115. package/src/search/bm25-boost.ts +76 -0
  116. package/src/search/context-builder.ts +209 -0
  117. package/src/search/keyword/composite-bm25-search.ts +47 -0
  118. package/src/search/query-decomposer.ts +124 -0
  119. package/src/search/types.ts +37 -0
  120. package/src/search/vector/composite-vector-search.ts +105 -0
  121. package/src/search/vector/mmr.ts +64 -0
  122. package/src/services/collection.ts +384 -0
  123. package/src/services/daemon.ts +87 -0
  124. package/src/services/http-server.ts +344 -0
  125. package/src/services/kv-service.ts +64 -0
  126. package/src/services/plugin-registry.ts +77 -0
  127. package/src/services/watch.ts +340 -0
  128. package/src/services/webhook-server.ts +100 -0
  129. package/src/types.ts +509 -0
  130. package/dist/chunk-2P3EGY6S.js +0 -37
  131. package/dist/chunk-2P3EGY6S.js.map +0 -1
  132. package/dist/chunk-3GAIDXRW.js +0 -105
  133. package/dist/chunk-3GAIDXRW.js.map +0 -1
  134. package/dist/chunk-4ZKBQ33J.js +0 -56
  135. package/dist/chunk-4ZKBQ33J.js.map +0 -1
  136. package/dist/chunk-7QVYU63E.js +0 -7
  137. package/dist/chunk-GOUBW7UA.js +0 -373
  138. package/dist/chunk-GOUBW7UA.js.map +0 -1
  139. package/dist/chunk-MJ3Y24H6.js +0 -185
  140. package/dist/chunk-MJ3Y24H6.js.map +0 -1
  141. package/dist/chunk-N6ZMBFDE.js +0 -224
  142. package/dist/chunk-N6ZMBFDE.js.map +0 -1
  143. package/dist/chunk-RAEBYV75.js +0 -709
  144. package/dist/chunk-RAEBYV75.js.map +0 -1
  145. package/dist/chunk-TW5NTYYZ.js +0 -2066
  146. package/dist/chunk-TW5NTYYZ.js.map +0 -1
  147. package/dist/chunk-Z5SU54HP.js +0 -171
  148. package/dist/chunk-Z5SU54HP.js.map +0 -1
  149. package/dist/code.d.ts +0 -31
  150. package/dist/code.js +0 -8
  151. package/dist/docs.d.ts +0 -19
  152. package/dist/docs.js +0 -8
  153. package/dist/git.d.ts +0 -31
  154. package/dist/git.js +0 -8
  155. package/dist/memory.d.ts +0 -19
  156. package/dist/memory.js +0 -146
  157. package/dist/memory.js.map +0 -1
  158. package/dist/notes.d.ts +0 -19
  159. package/dist/notes.js +0 -57
  160. package/dist/notes.js.map +0 -1
  161. package/dist/openai-PCTYLOWI.js +0 -8
  162. package/dist/types-Da_zLLOl.d.ts +0 -474
  163. /package/dist/{chunk-7QVYU63E.js.map → chunk-WCQVDF3K.js.map} +0 -0
  164. /package/dist/{code.js.map → haiku-pruner-5KVT5AI2.js.map} +0 -0
  165. /package/dist/{docs.js.map → http-server-2ZQ6I43B.js.map} +0 -0
  166. /package/dist/{git.js.map → local-embedding-NZQTILGV.js.map} +0 -0
  167. /package/dist/{openai-PCTYLOWI.js.map → openai-embedding-ZP5TSUJG.js.map} +0 -0
@@ -0,0 +1,59 @@
1
+ /**
2
+ * brainbank context — DEPRECATED, use `brainbank query` instead.
3
+ *
4
+ * Kept as fallback. Subcommands (add/list) remain here since they are
5
+ * context-metadata specific, not query-related.
6
+ */
7
+
8
+ import { c, args, stripFlags, findDocsPlugin } from '@/cli/utils.ts';
9
+ import { createBrain } from '@/cli/factory/index.ts';
10
+ import { cmdQuery } from './query.ts';
11
+
12
+ export async function cmdContext(): Promise<void> {
13
+ const pos = stripFlags(args);
14
+ const sub = pos[1];
15
+
16
+ // brainbank context add <collection> <path> <description>
17
+ if (sub === 'add') {
18
+ const collection = pos[2];
19
+ const path = pos[3];
20
+ const desc = pos.slice(4).join(' ');
21
+
22
+ if (!collection || !path || !desc) {
23
+ console.log(c.red('Usage: brainbank context add <collection> <path> <description>'));
24
+ process.exit(1);
25
+ }
26
+
27
+ const brain = await createBrain();
28
+ await brain.initialize();
29
+ const docsPlugin = findDocsPlugin(brain);
30
+ if (!docsPlugin) { console.log(c.red('Docs plugin not loaded.')); process.exit(1); }
31
+ docsPlugin.addContext(collection, path, desc);
32
+ console.log(c.green(`✓ Context added: ${collection}:${path} → "${desc}"`));
33
+ brain.close();
34
+ return;
35
+ }
36
+
37
+ // brainbank context list
38
+ if (sub === 'list') {
39
+ const brain = await createBrain();
40
+ await brain.initialize();
41
+ const docsPlugin = findDocsPlugin(brain);
42
+ if (!docsPlugin) { console.log(c.yellow(' Docs plugin not loaded.')); brain.close(); return; }
43
+ const contexts = docsPlugin.listContexts();
44
+ if (contexts.length === 0) {
45
+ console.log(c.yellow(' No contexts configured.'));
46
+ } else {
47
+ console.log(c.bold('\n━━━ Contexts ━━━\n'));
48
+ for (const ctx of contexts) {
49
+ console.log(` ${c.cyan(ctx.collection)}:${ctx.path} → ${c.dim(ctx.context)}`);
50
+ }
51
+ }
52
+ brain.close();
53
+ return;
54
+ }
55
+
56
+ // brainbank context <task> → delegate to query (deprecated)
57
+ console.error(c.yellow('⚠ `brainbank context` is deprecated — use `brainbank query` instead.\n'));
58
+ return cmdQuery();
59
+ }
@@ -0,0 +1,100 @@
1
+ /**
2
+ * brainbank daemon — HTTP daemon for CLI delegation.
3
+ *
4
+ * brainbank daemon → Start foreground
5
+ * brainbank daemon start → Start background (fork + PID file)
6
+ * brainbank daemon stop → Stop background daemon
7
+ * brainbank daemon restart → Stop + start
8
+ */
9
+
10
+ import { c, args, getFlag, stripFlags } from '@/cli/utils.ts';
11
+ import { isServerRunning, removePid, DEFAULT_PORT } from '@/services/daemon.ts';
12
+ import { createBrain } from '@/cli/factory/index.ts';
13
+
14
+ export async function cmdDaemon(): Promise<void> {
15
+ const pos = stripFlags(args);
16
+ const sub = pos[1]; // start | stop | undefined
17
+
18
+ if (sub === 'stop') return stopDaemon();
19
+ if (sub === 'restart') { stopDaemon(); return forkDaemon(); }
20
+ if (sub === 'start') return forkDaemon();
21
+ return startForeground();
22
+ }
23
+
24
+ // ── Foreground ──────────────────────────────────
25
+
26
+ async function startForeground(): Promise<void> {
27
+ const port = parseInt(getFlag('port') ?? String(DEFAULT_PORT), 10);
28
+ const { HttpServer } = await import('@/services/http-server.ts');
29
+
30
+ const server = new HttpServer({
31
+ port,
32
+ factory: async (repoPath: string) => {
33
+ const brain = await createBrain(repoPath);
34
+ await brain.initialize();
35
+ return brain;
36
+ },
37
+ onError: (repo, err) => {
38
+ const msg = err instanceof Error ? err.message : String(err);
39
+ console.error(c.red(` Pool error [${repo}]: ${msg}`));
40
+ },
41
+ onLog: (msg) => console.log(c.dim(` ${msg}`)),
42
+ });
43
+
44
+ console.log(c.bold('\n━━━ BrainBank HTTP Daemon ━━━\n'));
45
+
46
+ await server.start();
47
+
48
+ console.log(c.dim(` Port: ${port}`));
49
+ console.log(c.dim(' Press Ctrl+C to stop.\n'));
50
+
51
+ const shutdown = () => {
52
+ console.log(c.dim('\n Shutting down...'));
53
+ server.close();
54
+ process.exit(0);
55
+ };
56
+ process.on('SIGINT', shutdown);
57
+ process.on('SIGTERM', shutdown);
58
+
59
+ await new Promise(() => {});
60
+ }
61
+
62
+ // ── Background ──────────────────────────────────
63
+
64
+ async function forkDaemon(): Promise<void> {
65
+ const port = parseInt(getFlag('port') ?? String(DEFAULT_PORT), 10);
66
+ const { fork } = await import('node:child_process');
67
+
68
+ const existing = isServerRunning();
69
+ if (existing) {
70
+ console.log(c.yellow(` Daemon already running (PID ${existing.pid}, port ${existing.port})`));
71
+ return;
72
+ }
73
+
74
+ const child = fork(process.argv[1], ['daemon', '--port', String(port)], {
75
+ detached: true,
76
+ stdio: 'ignore',
77
+ });
78
+
79
+ child.unref();
80
+
81
+ console.log(c.green(` ✓ Daemon started (PID ${child.pid}, port ${port})`));
82
+ console.log(c.dim(' Stop with: brainbank daemon stop'));
83
+ }
84
+
85
+ function stopDaemon(): void {
86
+ const info = isServerRunning();
87
+ if (!info) {
88
+ console.log(c.yellow(' No daemon running.'));
89
+ return;
90
+ }
91
+
92
+ try {
93
+ process.kill(info.pid, 'SIGTERM');
94
+ removePid();
95
+ console.log(c.green(` ✓ Daemon stopped (PID ${info.pid})`));
96
+ } catch {
97
+ removePid();
98
+ console.log(c.yellow(` PID ${info.pid} not found. Cleaned up stale PID file.`));
99
+ }
100
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * brainbank docs — Index document collections
3
+ * brainbank dsearch — Search documents only
4
+ */
5
+
6
+ import { c, args, getFlag, stripFlags, findDocsPlugin } from '@/cli/utils.ts';
7
+ import { createBrain } from '@/cli/factory/index.ts';
8
+
9
+ export async function cmdDocs(): Promise<void> {
10
+ const collection = getFlag('collection');
11
+ const brain = await createBrain();
12
+
13
+ console.log(c.bold('\n━━━ BrainBank Docs Index ━━━\n'));
14
+
15
+ const opts: { collections?: string[]; onProgress?: (collection: string, file: string, current: number, total: number) => void } = {};
16
+ if (collection) opts.collections = [collection];
17
+ opts.onProgress = (col: string, file: string, cur: number, total: number) => {
18
+ process.stdout.write(`\r ${c.cyan(col)} [${cur}/${total}] ${file} `);
19
+ };
20
+
21
+ const docsPlugin = findDocsPlugin(brain);
22
+ if (!docsPlugin) { console.log(c.red(' Docs plugin not loaded. Install @brainbank/docs.')); process.exit(1); }
23
+
24
+ const results = await docsPlugin.indexDocs(opts);
25
+
26
+ console.log('\n');
27
+ for (const [name, stat] of Object.entries(results) as [string, { indexed: number; skipped: number; removed: number; chunks: number }][]) {
28
+ const removedStr = stat.removed > 0 ? `, ${c.red(String(stat.removed) + ' removed')}` : '';
29
+ console.log(` ${c.green(name)}: ${stat.indexed} indexed, ${stat.skipped} skipped${removedStr}, ${stat.chunks} chunks`);
30
+ }
31
+
32
+ brain.close();
33
+ }
34
+
35
+ export async function cmdDocSearch(): Promise<void> {
36
+ const query = stripFlags(args).slice(1).join(' ');
37
+ if (!query) {
38
+ console.log(c.red('Usage: brainbank dsearch <query>'));
39
+ process.exit(1);
40
+ }
41
+
42
+ const brain = await createBrain();
43
+ const collection = getFlag('collection');
44
+ const k = parseInt(getFlag('k') || '8', 10);
45
+
46
+ console.log(c.bold(`\n━━━ BrainBank Doc Search: "${query}" ━━━\n`));
47
+
48
+ const docsPlugin = findDocsPlugin(brain);
49
+ if (!docsPlugin) {
50
+ console.log(c.red('Docs plugin not loaded. Install @brainbank/docs.'));
51
+ process.exit(1);
52
+ }
53
+ const results = await docsPlugin.search(query, { collection: collection ?? undefined, k });
54
+
55
+ if (results.length === 0) {
56
+ console.log(c.yellow(' No results found.'));
57
+ brain.close();
58
+ return;
59
+ }
60
+
61
+ for (const r of results) {
62
+ const score = Math.round(r.score * 100);
63
+ const ctx = r.context ? ` — ${c.dim(r.context)}` : '';
64
+ console.log(`${c.magenta(`[DOC ${score}%]`)} ${c.bold(r.filePath!)} [${r.type === 'document' ? r.metadata.collection ?? '' : ''}]${ctx}`);
65
+ const preview = r.content.split('\n').slice(0, 4).join('\n');
66
+ console.log(c.dim(preview));
67
+ console.log('');
68
+ }
69
+
70
+ brain.close();
71
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * brainbank files <path|glob> [...paths] [--lines]
3
+ *
4
+ * Fetch full file contents from the index.
5
+ * Use after `brainbank context` to view complete files identified by search.
6
+ */
7
+
8
+ import { c, args, getFlag } from '@/cli/utils.ts';
9
+ import { createBrain } from '@/cli/factory/index.ts';
10
+
11
+ export async function cmdFiles(): Promise<void> {
12
+ // Collect positional args (file patterns) — skip 'files' command itself
13
+ const patterns: string[] = [];
14
+ const showLines = args.includes('--lines');
15
+
16
+ for (let i = 1; i < args.length; i++) {
17
+ if (args[i].startsWith('--')) {
18
+ // Skip --lines and --repo <value>
19
+ if (args[i] === '--repo') {
20
+ i++; // skip value
21
+ }
22
+ continue;
23
+ }
24
+ patterns.push(args[i]);
25
+ }
26
+
27
+ if (patterns.length === 0) {
28
+ console.log(c.red('Usage: brainbank files <path|glob> [...paths] [--lines]'));
29
+ console.log(c.dim(' Exact: brainbank files src/auth/login.ts'));
30
+ console.log(c.dim(' Directory: brainbank files src/graph/'));
31
+ console.log(c.dim(' Glob: brainbank files "src/**/*.service.ts"'));
32
+ console.log(c.dim(' Fuzzy: brainbank files plugin.ts'));
33
+ console.log(c.dim(' Lines: brainbank files src/plugin.ts --lines'));
34
+ process.exit(1);
35
+ }
36
+
37
+ const brain = await createBrain();
38
+ await brain.initialize();
39
+ const results = brain.resolveFiles(patterns);
40
+
41
+ if (results.length === 0) {
42
+ console.log(c.yellow('No matching files found in the index.'));
43
+ console.log(c.dim('Run `brainbank index` first to index your codebase.'));
44
+ brain.close();
45
+ return;
46
+ }
47
+
48
+ // Format output
49
+ for (const r of results) {
50
+ const meta = r.metadata as Record<string, unknown>;
51
+ const startLine = (meta.startLine as number) ?? 1;
52
+
53
+ console.log(c.bold(`\n── ${r.filePath} ──\n`));
54
+
55
+ if (showLines) {
56
+ const codeLines = r.content.split('\n');
57
+ const pad = String(startLine + codeLines.length - 1).length;
58
+ for (let i = 0; i < codeLines.length; i++) {
59
+ const lineNum = c.dim(`${String(startLine + i).padStart(pad)}|`);
60
+ console.log(`${lineNum} ${codeLines[i]}`);
61
+ }
62
+ } else {
63
+ console.log(r.content);
64
+ }
65
+ }
66
+
67
+ console.log(c.dim(`\n${results.length} file(s) resolved.`));
68
+ brain.close();
69
+ }
@@ -0,0 +1,82 @@
1
+ /** brainbank help — Show CLI usage. */
2
+
3
+ import { c } from '@/cli/utils.ts';
4
+
5
+ export function showHelp(): void {
6
+ console.log(c.bold('\n━━━ BrainBank — Semantic Knowledge Bank ━━━\n'));
7
+ console.log(c.bold('Indexing:'));
8
+ console.log(` ${c.cyan('index')} ${c.dim('(i)')} [path] Index code + git history`);
9
+ console.log(` ${c.cyan('collection add')} <path> --name Add a document collection`);
10
+ console.log(` ${c.cyan('collection list')} List collections`);
11
+ console.log(` ${c.cyan('collection remove')} <name> Remove a collection`);
12
+ console.log(` ${c.cyan('docs')} [--collection <name>] Index document collections`);
13
+ console.log('');
14
+ console.log(c.bold('Search:'));
15
+ console.log(` ${c.cyan('search')} <query> Semantic search (vector)`);
16
+ console.log(` ${c.cyan('hsearch')} <query> Hybrid search (${c.bold('best quality')})`);
17
+ console.log(` ${c.cyan('ksearch')} <query> Keyword search (BM25, instant)`);
18
+ console.log(` ${c.cyan('dsearch')} <query> Document search`);
19
+ console.log(c.dim(' All accept --repo <path> --path <dir> --<source> <n>'));
20
+ console.log('');
21
+ console.log(c.bold('Query:'));
22
+ console.log(` ${c.cyan('query')} ${c.dim('(q)')} <task> Get AI-pruned context for a task`);
23
+ console.log(` ${c.cyan('context')} <task> ${c.dim('(deprecated → use query)')}`);
24
+ console.log(` ${c.cyan('context add')} <col> <path> <desc> Add context metadata`);
25
+ console.log(` ${c.cyan('context list')} List all context metadata`);
26
+ console.log(` ${c.cyan('files')} <path|glob> [...] [--lines] View full indexed files directly`);
27
+ console.log('');
28
+ console.log(c.bold('KV Store:'));
29
+ console.log(` ${c.cyan('kv add')} <coll> <content> Add item to a collection`);
30
+ console.log(` ${c.cyan('kv search')} <coll> <query> Search a collection`);
31
+ console.log(` ${c.cyan('kv list')} [coll] List collections or items`);
32
+ console.log(` ${c.cyan('kv trim')} <coll> --keep <n> Keep only N most recent`);
33
+ console.log(` ${c.cyan('kv clear')} <coll> Clear all items`);
34
+ console.log('');
35
+ console.log(c.bold('Utility:'));
36
+ console.log(` ${c.cyan('stats')} Show index statistics`);
37
+ console.log(` ${c.cyan('reembed')} Re-embed all vectors`);
38
+ console.log(` ${c.cyan('reindex')} [path] Nuke data + re-index from scratch`);
39
+ console.log(` ${c.cyan('watch')} Watch files, auto-re-index`);
40
+ console.log(` ${c.cyan('mcp')} Start MCP server (stdio)`);
41
+ console.log(` ${c.cyan('mcp:export')} [target] Export MCP config (antigravity)`);
42
+ console.log(` ${c.cyan('daemon')} Start HTTP daemon (foreground)`);
43
+ console.log(` ${c.cyan('daemon start')} Start HTTP daemon (background)`);
44
+ console.log(` ${c.cyan('daemon stop')} Stop background daemon`);
45
+ console.log(` ${c.cyan('daemon restart')} Restart background daemon`);
46
+ console.log(` ${c.cyan('status')} Show daemon status`);
47
+ console.log(` ${c.cyan('--version')} ${c.dim('(-v)')} Show version`);
48
+ console.log('');
49
+ console.log(c.bold('Options:'));
50
+ console.log(` ${c.dim('--repo <path>')} Repository path (default: .)`);
51
+ console.log(` ${c.dim('--force')} Force re-index all files`);
52
+ console.log(` ${c.dim('--depth <n>')} Git history depth (default: 500)`);
53
+ console.log(` ${c.dim('--collection <name>')} Filter by collection`);
54
+ console.log(` ${c.dim('--pattern <glob>')} Collection glob (default: **/*.md)`);
55
+ console.log(` ${c.dim('--context <desc>')} General task context for pruner (inline or @file)`);
56
+ console.log(` ${c.dim('--pruner <desc>')} Specific pruning focus (inline or @file)`);
57
+ console.log(` ${c.dim('--<source> <n>')} Source filter: max results from <source> (0 = skip)`);
58
+ console.log(` ${c.dim('--path <dir>')} Filter context results to files under this path prefix`);
59
+ console.log(` ${c.dim('--ignore <globs>')} Ignore glob patterns for code indexing (comma-separated)`);
60
+ console.log(` ${c.dim('--include <globs>')} Include only these paths for code indexing (comma-separated)`);
61
+ console.log(` ${c.dim('--yes / -y')} Skip interactive prompt (auto-select all available)`);
62
+ console.log(` ${c.dim('--setup')} Re-run interactive setup (modules, folders, config)`);
63
+ console.log(` ${c.dim('--port <n>')} HTTP daemon port (default: 8181)`);
64
+ console.log('');
65
+ console.log(c.bold('Examples:'));
66
+ console.log(c.dim(' brainbank index .'));
67
+ console.log(c.dim(' brainbank index . --ignore "sdk/**,vendor/**"'));
68
+ console.log(c.dim(' brainbank index . --include "src/**,lib/**"'));
69
+ console.log(c.dim(' brainbank kv add errors "Fixed null pointer in api.ts"'));
70
+ console.log(c.dim(' brainbank kv search errors "null pointer"'));
71
+ console.log(c.dim(' brainbank kv list'));
72
+ console.log(c.dim(' brainbank hsearch "authentication middleware"'));
73
+ console.log(c.dim(' brainbank hsearch "auth" --code 0 --git 10 # git only'));
74
+ console.log(c.dim(' brainbank search "handler" --git 0 # code only'));
75
+ console.log(c.dim(' brainbank hsearch "api" --docs 10 --code 0 --git 0 # docs only'));
76
+ console.log(c.dim(' brainbank query "auth flow" | pbcopy # → clipboard'));
77
+ console.log(c.dim(' brainbank query "auth" --context @issue.md # with task context'));
78
+ console.log(c.dim(' brainbank query "auth" --pruner "JWT refresh" # focused pruning'));
79
+ console.log(c.dim(' brainbank daemon start # background HTTP'));
80
+ console.log(c.dim(' brainbank mcp # MCP stdio'));
81
+ console.log(c.dim(' brainbank mcp:export antigravity # export MCP config'));
82
+ }