brainbank 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-WR4WXKJT.js → chunk-4DM3XWO6.js} +9 -1
- package/dist/{chunk-WR4WXKJT.js.map → chunk-4DM3XWO6.js.map} +1 -1
- package/dist/{chunk-V4UJKXPK.js → chunk-FEAMUZGJ.js} +7 -2
- package/dist/{chunk-V4UJKXPK.js.map → chunk-FEAMUZGJ.js.map} +1 -1
- package/dist/{chunk-FJJY4H2Y.js → chunk-OPQ3ZIPV.js} +2 -2
- package/dist/{chunk-F6SJ3U4H.js → chunk-T2VXF5S5.js} +3 -7
- package/dist/chunk-T2VXF5S5.js.map +1 -0
- package/dist/{chunk-6MFTQV3O.js → chunk-ZJ5LLMGM.js} +35 -3
- package/dist/chunk-ZJ5LLMGM.js.map +1 -0
- package/dist/cli.js +32 -9
- package/dist/cli.js.map +1 -1
- package/dist/code.js +1 -1
- package/dist/docs.js +1 -1
- package/dist/index.js +5 -5
- package/dist/notes.js +2 -2
- package/package.json +2 -2
- package/dist/chunk-6MFTQV3O.js.map +0 -1
- package/dist/chunk-F6SJ3U4H.js.map +0 -1
- /package/dist/{chunk-FJJY4H2Y.js.map → chunk-OPQ3ZIPV.js.map} +0 -0
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/utils.ts","../src/cli/commands/index-cmd.ts","../src/cli/factory.ts","../src/cli/commands/collection.ts","../src/cli/commands/kv.ts","../src/cli/commands/docs.ts","../src/cli/commands/search.ts","../src/cli/commands/context.ts","../src/cli/commands/system.ts","../src/cli/index.ts"],"sourcesContent":["/**\n * BrainBank CLI — Shared Utilities\n *\n * Colors, argument parsing, and result formatting.\n * No BrainBank imports — pure Node.js / terminal helpers.\n */\n\n// ── Colors ──────────────────────────────────────────\n\nexport const c = {\n green: (s: string) => `\\x1b[32m${s}\\x1b[0m`,\n red: (s: string) => `\\x1b[31m${s}\\x1b[0m`,\n yellow: (s: string) => `\\x1b[33m${s}\\x1b[0m`,\n cyan: (s: string) => `\\x1b[36m${s}\\x1b[0m`,\n dim: (s: string) => `\\x1b[2m${s}\\x1b[0m`,\n bold: (s: string) => `\\x1b[1m${s}\\x1b[0m`,\n magenta: (s: string) => `\\x1b[35m${s}\\x1b[0m`,\n};\n\n// ── Argument Parsing ────────────────────────────────\n\n/** Raw argv, sliced past the Node binary and script path. */\nexport const args = process.argv.slice(2);\n\nexport function getFlag(name: string): string | undefined {\n const idx = args.indexOf(`--${name}`);\n return idx >= 0 ? args[idx + 1] : undefined;\n}\n\nexport function hasFlag(name: string): boolean {\n return args.includes(`--${name}`);\n}\n\n// ── Result Printer ──────────────────────────────────\n\nexport function printResults(results: any[]): void {\n if (results.length === 0) {\n console.log(c.yellow(' No results found.'));\n return;\n }\n\n for (const r of results) {\n const score = Math.round(r.score * 100);\n\n if (r.type === 'code') {\n const m = r.metadata;\n console.log(\n `${c.green(`[CODE ${score}%]`)} ${c.bold(r.filePath!)} — ` +\n `${m.name || m.chunkType} ${c.dim(`L${m.startLine}-${m.endLine}`)}`,\n );\n console.log(c.dim(r.content.split('\\n').slice(0, 5).join('\\n')));\n console.log('');\n } else if (r.type === 'commit') {\n const m = r.metadata;\n console.log(\n `${c.cyan(`[COMMIT ${score}%]`)} ${c.bold(m.shortHash)} ` +\n `${r.content} ${c.dim(`(${m.author})`)}`,\n );\n if (m.files?.length) console.log(c.dim(` Files: ${m.files.slice(0, 4).join(', ')}`));\n console.log('');\n } else if (r.type === 'document') {\n const ctx = r.context ? ` — ${c.dim(r.context)}` : '';\n console.log(\n `${c.magenta(`[DOC ${score}%]`)} ${c.bold(r.filePath!)} ` +\n `[${r.metadata.collection}]${ctx}`,\n );\n console.log(c.dim(r.content.split('\\n').slice(0, 4).join('\\n')));\n console.log('');\n }\n }\n}\n","/**\n * brainbank index [path] — Index code + git + docs\n */\n\nimport * as path from 'node:path';\nimport { c, args, getFlag, hasFlag } from '../utils.ts';\nimport { createBrain } from '../factory.ts';\n\nexport async function cmdIndex(): Promise<void> {\n const repoPath = args[1] || '.';\n const force = hasFlag('force');\n const depth = parseInt(getFlag('depth') || '500', 10);\n const onlyRaw = getFlag('only');\n const docsPath = getFlag('docs');\n const modules = onlyRaw\n ? onlyRaw.split(',').map(s => s.trim()) as ('code' | 'git' | 'docs')[]\n : undefined;\n\n // If --docs is passed, auto-include 'docs' in modules\n if (docsPath && modules && !modules.includes('docs')) {\n modules.push('docs');\n }\n\n console.log(c.bold('\\n━━━ BrainBank Index ━━━'));\n console.log(c.dim(` Repo: ${repoPath}`));\n console.log(c.dim(` Force: ${force}`));\n console.log(c.dim(` Git depth: ${depth}`));\n if (modules) console.log(c.dim(` Modules: ${modules.join(', ')}`));\n if (docsPath) console.log(c.dim(` Docs path: ${docsPath}`));\n\n const brain = await createBrain(repoPath);\n\n // Auto-register docs collection from --docs path\n if (docsPath) {\n const absDocsPath = path.resolve(docsPath);\n const collName = path.basename(absDocsPath);\n try {\n await brain.addCollection({\n name: collName,\n path: absDocsPath,\n pattern: '**/*.md',\n ignore: ['deprecated/**', 'node_modules/**'],\n });\n console.log(c.dim(` Registered docs collection: ${collName}`));\n } catch {\n console.log(c.yellow(` Warning: docs module not loaded, skipping --docs`));\n }\n }\n\n const result = await brain.index({\n modules,\n forceReindex: force,\n gitDepth: depth,\n onProgress: (stage, msg) => {\n process.stdout.write(`\\r ${c.cyan(stage.toUpperCase())} ${msg} `);\n },\n });\n\n console.log('\\n');\n if (result.code) {\n console.log(` ${c.green('Code')}: ${result.code.indexed} indexed, ${result.code.skipped} skipped, ${result.code.chunks ?? 0} chunks`);\n }\n if (result.git) {\n console.log(` ${c.green('Git')}: ${result.git.indexed} indexed, ${result.git.skipped} skipped`);\n }\n if (result.docs) {\n for (const [name, stat] of Object.entries(result.docs)) {\n console.log(` ${c.green('Docs')}: [${name}] ${stat.indexed} indexed, ${stat.skipped} skipped, ${stat.chunks} chunks`);\n }\n }\n\n const stats = brain.stats();\n console.log(`\\n ${c.bold('Totals')}:`);\n if (stats.code) console.log(` Code chunks: ${stats.code.chunks}`);\n if (stats.git) console.log(` Git commits: ${stats.git.commits}`);\n if (stats.git) console.log(` Co-edit pairs: ${stats.git.coEdits}`);\n if (stats.documents) console.log(` Documents: ${stats.documents.documents}`);\n\n brain.close();\n}\n","/**\n * BrainBank CLI — Brain Factory\n *\n * Creates a configured BrainBank instance with built-in indexers,\n * auto-discovered indexers, and config file support.\n */\n\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { BrainBank } from '../app/brainbank.ts';\nimport { code } from '../indexers/code/code-plugin.ts';\nimport { git } from '../indexers/git/git-plugin.ts';\nimport { docs } from '../indexers/docs/docs-plugin.ts';\nimport type { Indexer } from '../indexers/base.ts';\nimport { c, getFlag } from './utils.ts';\n\n// ── Types ───────────────────────────────────────────\n\ninterface BrainBankCliConfig {\n /** Custom indexers to register alongside built-in ones. */\n indexers?: Indexer[];\n /** Override which built-in indexers to load. Default: ['code', 'git', 'docs'] */\n builtins?: ('code' | 'git' | 'docs')[];\n /** BrainBank constructor options. */\n brainbank?: Record<string, any>;\n}\n\nconst CONFIG_NAMES = ['config.ts', 'config.js', 'config.mjs'];\nconst INDEXER_EXTENSIONS = ['.ts', '.js', '.mjs'];\n\n// ── Caches ──────────────────────────────────────────\n\nlet _configCache: BrainBankCliConfig | null | undefined = undefined;\nlet _folderIndexersCache: Indexer[] | undefined = undefined;\n\n// ── Config Loader ───────────────────────────────────\n\n/** Load .brainbank/config.ts if present. */\nasync function loadConfig(): Promise<BrainBankCliConfig | null> {\n if (_configCache !== undefined) return _configCache;\n\n const repoPath = getFlag('repo') ?? '.';\n const brainbankDir = path.resolve(repoPath, '.brainbank');\n\n for (const name of CONFIG_NAMES) {\n const configPath = path.join(brainbankDir, name);\n if (fs.existsSync(configPath)) {\n try {\n const mod = await import(configPath);\n _configCache = (mod.default ?? mod) as BrainBankCliConfig;\n return _configCache;\n } catch (err: any) {\n console.error(c.red(`Error loading .brainbank/${name}: ${err.message}`));\n process.exit(1);\n }\n }\n }\n\n _configCache = null;\n return null;\n}\n\n// ── Indexer Discovery ───────────────────────────────\n\n/** Auto-discover indexers from .brainbank/indexers/ folder. */\nasync function discoverFolderIndexers(): Promise<Indexer[]> {\n if (_folderIndexersCache !== undefined) return _folderIndexersCache;\n\n const repoPath = getFlag('repo') ?? '.';\n const indexersDir = path.resolve(repoPath, '.brainbank', 'indexers');\n\n if (!fs.existsSync(indexersDir)) {\n _folderIndexersCache = [];\n return [];\n }\n\n const files = fs.readdirSync(indexersDir)\n .filter(f => INDEXER_EXTENSIONS.some(ext => f.endsWith(ext)))\n .sort();\n\n const indexers: Indexer[] = [];\n\n for (const file of files) {\n const filePath = path.join(indexersDir, file);\n try {\n const mod = await import(filePath);\n const indexer = mod.default ?? mod;\n\n if (indexer && typeof indexer === 'object' && indexer.name) {\n indexers.push(indexer as Indexer);\n } else {\n console.error(c.yellow(`⚠ ${file}: must export a default Indexer with a 'name' property, skipping`));\n }\n } catch (err: any) {\n console.error(c.red(`Error loading indexer ${file}: ${err.message}`));\n }\n }\n\n _folderIndexersCache = indexers;\n return indexers;\n}\n\n// ── Multi-repo Detection ────────────────────────────\n\n/** Detect subdirectories that have their own .git repo. */\nfunction detectGitSubdirs(parentPath: string): { name: string; path: string }[] {\n try {\n const entries = fs.readdirSync(parentPath, { withFileTypes: true });\n return entries\n .filter(e =>\n e.isDirectory() &&\n !e.name.startsWith('.') &&\n !e.name.startsWith('node_modules') &&\n fs.existsSync(path.join(parentPath, e.name, '.git')),\n )\n .map(e => ({ name: e.name, path: path.join(parentPath, e.name) }));\n } catch {\n return [];\n }\n}\n\n// ── Factory ─────────────────────────────────────────\n\n/** Create a BrainBank with built-in + discovered + config indexers. */\nexport async function createBrain(repoPath?: string): Promise<BrainBank> {\n const rp = repoPath ?? getFlag('repo') ?? '.';\n const config = await loadConfig();\n const folderIndexers = await discoverFolderIndexers();\n\n const brainOpts: Record<string, any> = { repoPath: rp, ...(config?.brainbank ?? {}) };\n\n // Optional Qwen3 reranker via --reranker qwen3\n const rerankerFlag = getFlag('reranker');\n if (rerankerFlag === 'qwen3') {\n const { Qwen3Reranker } = await import('@brainbank/reranker');\n brainOpts.reranker = new Qwen3Reranker();\n }\n\n // Embedding provider via BRAINBANK_EMBEDDING env (default: local WASM)\n const embeddingEnv = process.env.BRAINBANK_EMBEDDING;\n if (embeddingEnv === 'openai') {\n const { OpenAIEmbedding } = await import('../providers/embeddings/openai.ts');\n const provider = new OpenAIEmbedding();\n brainOpts.embeddingProvider = provider;\n brainOpts.embeddingDims = provider.dims;\n }\n\n const brain = new BrainBank(brainOpts);\n\n // 1. Built-in indexers (default: all three)\n const builtins = config?.builtins ?? ['code', 'git', 'docs'];\n\n // Multi-repo detection: check if repoPath has no .git but subdirs do\n const resolvedRp = path.resolve(rp);\n const hasRootGit = fs.existsSync(path.join(resolvedRp, '.git'));\n const gitSubdirs = !hasRootGit ? detectGitSubdirs(resolvedRp) : [];\n\n if (gitSubdirs.length > 0 && (builtins.includes('code') || builtins.includes('git'))) {\n // Multi-repo mode: create namespaced indexers for each subdir\n console.log(c.cyan(` Multi-repo: found ${gitSubdirs.length} git repos: ${gitSubdirs.map(d => d.name).join(', ')}`));\n for (const sub of gitSubdirs) {\n if (builtins.includes('code')) {\n brain.use(code({ repoPath: sub.path, name: `code:${sub.name}` }));\n }\n if (builtins.includes('git')) {\n brain.use(git({ repoPath: sub.path, name: `git:${sub.name}` }));\n }\n }\n } else {\n // Single-repo mode (standard)\n if (builtins.includes('code')) brain.use(code({ repoPath: rp }));\n if (builtins.includes('git')) brain.use(git());\n }\n\n if (builtins.includes('docs')) brain.use(docs());\n\n // 2. Auto-discovered from .brainbank/indexers/\n for (const indexer of folderIndexers) {\n brain.use(indexer);\n }\n\n // 3. Indexers from config file\n if (config?.indexers) {\n for (const indexer of config.indexers) {\n brain.use(indexer);\n }\n }\n\n return brain;\n}\n","/**\n * brainbank collection add|list|remove — Document collection management\n */\n\nimport { c, args, getFlag } from '../utils.ts';\nimport { createBrain } from '../factory.ts';\n\nexport async function cmdCollection(): Promise<void> {\n const sub = args[1];\n\n if (sub === 'add') {\n const path = args[2];\n const name = getFlag('name');\n const pattern = getFlag('pattern') ?? '**/*.md';\n const context = getFlag('context');\n const ignoreRaw = getFlag('ignore');\n\n if (!path || !name) {\n console.log(c.red('Usage: brainbank collection add <path> --name <name> [--pattern \"**/*.md\"] [--ignore \"glob\"] [--context \"description\"]'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.addCollection({\n name,\n path,\n pattern,\n ignore: ignoreRaw ? ignoreRaw.split(',') : [],\n context: context ?? undefined,\n });\n console.log(c.green(`✓ Collection '${name}' added: ${path} (${pattern})`));\n if (context) console.log(c.dim(` Context: ${context}`));\n brain.close();\n return;\n }\n\n if (sub === 'list') {\n const brain = await createBrain();\n await brain.initialize();\n const collections = brain.listCollections();\n if (collections.length === 0) {\n console.log(c.yellow(' No collections registered.'));\n } else {\n console.log(c.bold('\\n━━━ Collections ━━━\\n'));\n for (const col of collections) {\n console.log(` ${c.cyan(col.name)} ${c.dim('→')} ${col.path}`);\n console.log(` Pattern: ${col.pattern ?? '**/*.md'}`);\n if (col.context) console.log(` Context: ${c.dim(col.context)}`);\n }\n }\n brain.close();\n return;\n }\n\n if (sub === 'remove') {\n const name = args[2];\n if (!name) {\n console.log(c.red('Usage: brainbank collection remove <name>'));\n process.exit(1);\n }\n const brain = await createBrain();\n await brain.removeCollection(name);\n console.log(c.green(`✓ Collection '${name}' removed.`));\n brain.close();\n return;\n }\n\n console.log(c.red('Usage: brainbank collection <add|list|remove>'));\n process.exit(1);\n}\n","/**\n * brainbank kv add|search|list|trim|clear — Dynamic KV collection management\n */\n\nimport { c, args, getFlag } from '../utils.ts';\nimport { createBrain } from '../factory.ts';\n\nexport async function cmdKv(): Promise<void> {\n const sub = args[1];\n\n // ── add ─────────────────────────────────────────\n if (sub === 'add') {\n const collName = args[2];\n const content = args.slice(3).filter(a => !a.startsWith('--')).join(' ');\n const metaRaw = getFlag('meta');\n\n if (!collName || !content) {\n console.log(c.red(\"Usage: brainbank kv add <collection> <content> [--meta '{\\\"key\\\":\\\"val\\\"}']\"));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const meta = metaRaw ? JSON.parse(metaRaw) : {};\n const id = await coll.add(content, meta);\n console.log(c.green(`✓ Added item #${id} to '${collName}'`));\n brain.close();\n return;\n }\n\n // ── search ──────────────────────────────────────\n if (sub === 'search') {\n const collName = args[2];\n const query = args.slice(3).filter(a => !a.startsWith('--')).join(' ');\n const k = parseInt(getFlag('k') || '5', 10);\n const mode = (getFlag('mode') as any) || 'hybrid';\n\n if (!collName || !query) {\n console.log(c.red('Usage: brainbank kv search <collection> <query> [--k 5] [--mode hybrid|keyword|vector]'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const results = await coll.search(query, { k, mode });\n\n if (results.length === 0) {\n console.log(c.yellow(' No results found.'));\n } else {\n console.log(c.bold(`\\n━━━ ${collName}: \"${query}\" ━━━\\n`));\n for (const r of results) {\n const score = Math.round((r.score ?? 0) * 100);\n console.log(` ${c.cyan(`[${score}%]`)} ${r.content}`);\n if (Object.keys(r.metadata).length > 0) {\n console.log(` ${c.dim(JSON.stringify(r.metadata))}`);\n }\n }\n }\n brain.close();\n return;\n }\n\n // ── list ────────────────────────────────────────\n if (sub === 'list') {\n const collName = args[2];\n const limit = parseInt(getFlag('limit') || '20', 10);\n\n if (!collName) {\n const brain = await createBrain();\n await brain.initialize();\n const names = brain.listCollectionNames();\n if (names.length === 0) {\n console.log(c.yellow(' No KV collections found.'));\n } else {\n console.log(c.bold('\\n━━━ KV Collections ━━━\\n'));\n for (const n of names) {\n const coll = brain.collection(n);\n console.log(` ${c.cyan(n)} — ${coll.count()} items`);\n }\n }\n brain.close();\n return;\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const items = coll.list({ limit });\n if (items.length === 0) {\n console.log(c.yellow(` Collection '${collName}' is empty.`));\n } else {\n console.log(c.bold(`\\n━━━ ${collName} (${coll.count()} items) ━━━\\n`));\n for (const item of items) {\n const age = Math.round((Date.now() / 1000 - item.createdAt) / 60);\n console.log(` #${item.id} ${c.dim(`(${age}m ago)`)} ${item.content.slice(0, 80)}`);\n }\n }\n brain.close();\n return;\n }\n\n // ── trim ────────────────────────────────────────\n if (sub === 'trim') {\n const collName = args[2];\n const keep = parseInt(getFlag('keep') || '0', 10);\n\n if (!collName || keep <= 0) {\n console.log(c.red('Usage: brainbank kv trim <collection> --keep <n>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const result = await coll.trim({ keep });\n console.log(c.green(`✓ Trimmed ${result.removed} items from '${collName}' (kept ${keep})`));\n brain.close();\n return;\n }\n\n // ── clear ───────────────────────────────────────\n if (sub === 'clear') {\n const collName = args[2];\n if (!collName) {\n console.log(c.red('Usage: brainbank kv clear <collection>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const before = coll.count();\n coll.clear();\n console.log(c.green(`✓ Cleared ${before} items from '${collName}'`));\n brain.close();\n return;\n }\n\n console.log(c.red('Usage: brainbank kv <add|search|list|trim|clear>'));\n process.exit(1);\n}\n","/**\n * brainbank docs — Index document collections\n * brainbank dsearch — Search documents only\n */\n\nimport { c, args, getFlag } from '../utils.ts';\nimport { createBrain } from '../factory.ts';\n\nexport async function cmdDocs(): Promise<void> {\n const collection = getFlag('collection');\n const brain = await createBrain();\n\n console.log(c.bold('\\n━━━ BrainBank Docs Index ━━━\\n'));\n\n const opts: { collections?: string[]; onProgress?: any } = {};\n if (collection) opts.collections = [collection];\n opts.onProgress = (col: string, file: string, cur: number, total: number) => {\n process.stdout.write(`\\r ${c.cyan(col)} [${cur}/${total}] ${file} `);\n };\n\n const results = await brain.indexDocs(opts);\n\n console.log('\\n');\n for (const [name, stat] of Object.entries(results)) {\n console.log(` ${c.green(name)}: ${stat.indexed} indexed, ${stat.skipped} skipped, ${stat.chunks} chunks`);\n }\n\n brain.close();\n}\n\nexport async function cmdDocSearch(): Promise<void> {\n const query = args.slice(1).filter(a => !a.startsWith('--')).join(' ');\n if (!query) {\n console.log(c.red('Usage: brainbank dsearch <query>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n const collection = getFlag('collection');\n const k = parseInt(getFlag('k') || '8', 10);\n\n console.log(c.bold(`\\n━━━ BrainBank Doc Search: \"${query}\" ━━━\\n`));\n\n const results = await brain.searchDocs(query, { collection: collection ?? undefined, k });\n\n if (results.length === 0) {\n console.log(c.yellow(' No results found.'));\n brain.close();\n return;\n }\n\n for (const r of results) {\n const score = Math.round(r.score * 100);\n const ctx = r.context ? ` — ${c.dim(r.context)}` : '';\n console.log(`${c.magenta(`[DOC ${score}%]`)} ${c.bold(r.filePath!)} [${(r.metadata as any).collection}]${ctx}`);\n const preview = r.content.split('\\n').slice(0, 4).join('\\n');\n console.log(c.dim(preview));\n console.log('');\n }\n\n brain.close();\n}\n","/**\n * brainbank search — Semantic search (vector)\n * brainbank hsearch — Hybrid search (vector + BM25)\n * brainbank ksearch — Keyword search (BM25)\n */\n\nimport { c, args, printResults } from '../utils.ts';\nimport { createBrain } from '../factory.ts';\n\nexport async function cmdSearch(): Promise<void> {\n const query = args.slice(1).join(' ');\n if (!query) {\n console.log(c.red('Usage: brainbank search <query>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n console.log(c.bold(`\\n━━━ BrainBank Search: \"${query}\" ━━━\\n`));\n\n const results = await brain.search(query);\n printResults(results);\n brain.close();\n}\n\nexport async function cmdHybridSearch(): Promise<void> {\n const query = args.slice(1).filter(a => !a.startsWith('--')).join(' ');\n if (!query) {\n console.log(c.red('Usage: brainbank hsearch <query>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n console.log(c.bold(`\\n━━━ BrainBank Hybrid Search: \"${query}\" ━━━`));\n console.log(c.dim(` Mode: vector + BM25 → Reciprocal Rank Fusion\\n`));\n\n const results = await brain.hybridSearch(query);\n printResults(results);\n brain.close();\n}\n\nexport async function cmdKeywordSearch(): Promise<void> {\n const query = args.slice(1).filter(a => !a.startsWith('--')).join(' ');\n if (!query) {\n console.log(c.red('Usage: brainbank ksearch <query>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n console.log(c.bold(`\\n━━━ BrainBank Keyword Search: \"${query}\" ━━━`));\n console.log(c.dim(` Mode: BM25 full-text (instant)\\n`));\n\n const results = brain.searchBM25(query);\n printResults(results);\n brain.close();\n}\n","/**\n * brainbank context <task> — Get formatted context for a task\n * brainbank context add <collection> <path> <description>\n * brainbank context list\n */\n\nimport { c, args } from '../utils.ts';\nimport { createBrain } from '../factory.ts';\n\nexport async function cmdContext(): Promise<void> {\n const sub = args[1];\n\n // brainbank context add <collection> <path> <description>\n if (sub === 'add') {\n const collection = args[2];\n const path = args[3];\n const desc = args.slice(4).join(' ');\n\n if (!collection || !path || !desc) {\n console.log(c.red('Usage: brainbank context add <collection> <path> <description>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n brain.addContext(collection, path, desc);\n console.log(c.green(`✓ Context added: ${collection}:${path} → \"${desc}\"`));\n brain.close();\n return;\n }\n\n // brainbank context list\n if (sub === 'list') {\n const brain = await createBrain();\n await brain.initialize();\n const contexts = brain.listContexts();\n if (contexts.length === 0) {\n console.log(c.yellow(' No contexts configured.'));\n } else {\n console.log(c.bold('\\n━━━ Contexts ━━━\\n'));\n for (const ctx of contexts) {\n console.log(` ${c.cyan(ctx.collection)}:${ctx.path} → ${c.dim(ctx.context)}`);\n }\n }\n brain.close();\n return;\n }\n\n // brainbank context <task> — get formatted context\n const task = args.slice(1).join(' ');\n if (!task) {\n console.log(c.red('Usage: brainbank context <task description>'));\n console.log(c.dim(' brainbank context add <collection> <path> <description>'));\n console.log(c.dim(' brainbank context list'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n const context = await brain.getContext(task);\n console.log(context);\n brain.close();\n}\n","/**\n * brainbank stats — Show index statistics\n * brainbank reembed — Re-embed all vectors\n * brainbank watch — Watch for file changes\n * brainbank serve — Start MCP server\n */\n\nimport { c } from '../utils.ts';\nimport { createBrain } from '../factory.ts';\n\n// ── Stats ───────────────────────────────────────────\n\nexport async function cmdStats(): Promise<void> {\n const brain = await createBrain();\n await brain.initialize();\n\n const s = brain.stats();\n\n console.log(c.bold('\\n━━━ BrainBank Stats ━━━\\n'));\n console.log(` ${c.cyan('Indexers')}: ${brain.indexers.join(', ')}\\n`);\n\n if (s.code) {\n console.log(` ${c.cyan('Code')}`);\n console.log(` Files indexed: ${s.code.files}`);\n console.log(` Code chunks: ${s.code.chunks}`);\n console.log(` HNSW vectors: ${s.code.hnswSize}`);\n console.log('');\n }\n\n if (s.git) {\n console.log(` ${c.cyan('Git History')}`);\n console.log(` Commits: ${s.git.commits}`);\n console.log(` Files tracked: ${s.git.filesTracked}`);\n console.log(` Co-edit pairs: ${s.git.coEdits}`);\n console.log(` HNSW vectors: ${s.git.hnswSize}`);\n console.log('');\n }\n\n if (s.documents) {\n console.log(` ${c.cyan('Documents')}`);\n console.log(` Collections: ${s.documents.collections}`);\n console.log(` Documents: ${s.documents.documents}`);\n console.log(` Chunks: ${s.documents.chunks}`);\n console.log(` HNSW vectors: ${s.documents.hnswSize}`);\n console.log('');\n }\n\n // KV collections\n const kvNames = brain.listCollectionNames();\n if (kvNames.length > 0) {\n console.log(` ${c.cyan('KV Collections')}`);\n for (const name of kvNames) {\n const coll = brain.collection(name);\n console.log(` ${name}: ${coll.count()} items`);\n }\n console.log('');\n }\n\n brain.close();\n}\n\n// ── Re-embed ────────────────────────────────────────\n\nexport async function cmdReembed(): Promise<void> {\n const brain = await createBrain();\n await brain.initialize();\n\n console.log(c.bold('\\n━━━ BrainBank Re-embed ━━━\\n'));\n console.log(c.dim(' Regenerating vectors with current embedding provider...'));\n console.log(c.dim(' Text, FTS, and metadata remain unchanged.\\n'));\n\n const result = await brain.reembed({\n onProgress: (table, current, total) => {\n process.stdout.write(`\\r ${c.cyan(table.padEnd(8))} ${current}/${total}`);\n },\n });\n\n console.log('\\n');\n if (result.code > 0) console.log(` ${c.green('✓')} Code: ${result.code} vectors`);\n if (result.git > 0) console.log(` ${c.green('✓')} Git: ${result.git} vectors`);\n if (result.docs > 0) console.log(` ${c.green('✓')} Docs: ${result.docs} vectors`);\n if (result.kv > 0) console.log(` ${c.green('✓')} KV: ${result.kv} vectors`);\n if (result.notes > 0) console.log(` ${c.green('✓')} Notes: ${result.notes} vectors`);\n if (result.memory > 0) console.log(` ${c.green('✓')} Memory: ${result.memory} vectors`);\n console.log(`\\n ${c.bold('Total')}: ${result.total} vectors regenerated\\n`);\n\n brain.close();\n}\n\n// ── Watch ───────────────────────────────────────────\n\nexport async function cmdWatch(): Promise<void> {\n const brain = await createBrain();\n await brain.initialize();\n\n console.log(c.bold('\\n━━━ BrainBank Watch ━━━\\n'));\n console.log(c.dim(` Watching ${brain.config.repoPath} for changes...`));\n console.log(c.dim(' Press Ctrl+C to stop.\\n'));\n\n const watcher = brain.watch({\n debounceMs: 2000,\n onIndex: (file, indexer) => {\n const ts = new Date().toLocaleTimeString();\n console.log(` ${c.dim(ts)} ${c.green('✓')} ${c.cyan(indexer)}: ${file}`);\n },\n onError: (err) => {\n console.error(` ${c.red('✗')} ${err.message}`);\n },\n });\n\n // Keep process alive, clean up on Ctrl+C\n process.on('SIGINT', () => {\n console.log(c.dim('\\n Stopping watcher...'));\n watcher.close();\n brain.close();\n process.exit(0);\n });\n\n await new Promise(() => {});\n}\n\n// ── Serve ───────────────────────────────────────────\n\nexport async function cmdServe(): Promise<void> {\n await import('@brainbank/mcp');\n}\n\n// ── Help ────────────────────────────────────────────\n\nexport function showHelp(): void {\n console.log(c.bold('\\n━━━ BrainBank — Semantic Knowledge Bank ━━━\\n'));\n console.log(c.bold('Indexing:'));\n console.log(` ${c.cyan('index')} [path] Index code + git history`);\n console.log(` ${c.cyan('collection add')} <path> --name Add a document collection`);\n console.log(` ${c.cyan('collection list')} List collections`);\n console.log(` ${c.cyan('collection remove')} <name> Remove a collection`);\n console.log(` ${c.cyan('docs')} [--collection <name>] Index document collections`);\n console.log('');\n console.log(c.bold('Search:'));\n console.log(` ${c.cyan('search')} <query> Semantic search (vector)`);\n console.log(` ${c.cyan('hsearch')} <query> Hybrid search (${c.bold('best quality')})`);\n console.log(` ${c.cyan('ksearch')} <query> Keyword search (BM25, instant)`);\n console.log(` ${c.cyan('dsearch')} <query> Document search`);\n console.log('');\n console.log(c.bold('Context:'));\n console.log(` ${c.cyan('context')} <task> Get formatted context for a task`);\n console.log(` ${c.cyan('context add')} <col> <path> <desc> Add context metadata`);\n console.log(` ${c.cyan('context list')} List all context metadata`);\n console.log('');\n console.log(c.bold('KV Store:'));\n console.log(` ${c.cyan('kv add')} <coll> <content> Add item to a collection`);\n console.log(` ${c.cyan('kv search')} <coll> <query> Search a collection`);\n console.log(` ${c.cyan('kv list')} [coll] List collections or items`);\n console.log(` ${c.cyan('kv trim')} <coll> --keep <n> Keep only N most recent`);\n console.log(` ${c.cyan('kv clear')} <coll> Clear all items`);\n console.log('');\n console.log(c.bold('Utility:'));\n console.log(` ${c.cyan('stats')} Show index statistics`);\n console.log(` ${c.cyan('reembed')} Re-embed all vectors`);\n console.log(` ${c.cyan('watch')} Watch files, auto-re-index`);\n console.log(` ${c.cyan('serve')} Start MCP server (stdio)`);\n console.log('');\n console.log(c.bold('Options:'));\n console.log(` ${c.dim('--repo <path>')} Repository path (default: .)`);\n console.log(` ${c.dim('--force')} Force re-index all files`);\n console.log(` ${c.dim('--depth <n>')} Git history depth (default: 500)`);\n console.log(` ${c.dim('--collection <name>')} Filter by collection`);\n console.log(` ${c.dim('--pattern <glob>')} Collection glob (default: **/*.md)`);\n console.log(` ${c.dim('--context <desc>')} Context description`);\n console.log(` ${c.dim('--reranker <name>')} Reranker to use (qwen3)`);\n console.log('');\n console.log(c.bold('Examples:'));\n console.log(c.dim(' brainbank index .'));\n console.log(c.dim(' brainbank kv add errors \"Fixed null pointer in api.ts\"'));\n console.log(c.dim(' brainbank kv search errors \"null pointer\"'));\n console.log(c.dim(' brainbank kv list'));\n console.log(c.dim(' brainbank hsearch \"authentication middleware\"'));\n console.log(c.dim(' brainbank context \"add rate limiting to the API\"'));\n console.log(c.dim(' brainbank serve'));\n}\n","#!/usr/bin/env node\n\n/**\n * BrainBank — CLI Entry Point\n *\n * Dispatcher that routes commands to their handler modules.\n */\n\nimport { args, c } from './utils.ts';\nimport { cmdIndex } from './commands/index-cmd.ts';\nimport { cmdCollection } from './commands/collection.ts';\nimport { cmdKv } from './commands/kv.ts';\nimport { cmdDocs, cmdDocSearch } from './commands/docs.ts';\nimport { cmdSearch, cmdHybridSearch, cmdKeywordSearch } from './commands/search.ts';\nimport { cmdContext } from './commands/context.ts';\nimport { cmdStats, cmdReembed, cmdWatch, cmdServe, showHelp } from './commands/system.ts';\n\nconst command = args[0];\n\nasync function main(): Promise<void> {\n switch (command) {\n case 'index': return cmdIndex();\n case 'collection': return cmdCollection();\n case 'kv': return cmdKv();\n case 'docs': return cmdDocs();\n case 'dsearch': return cmdDocSearch();\n case 'search': return cmdSearch();\n case 'hsearch': return cmdHybridSearch();\n case 'ksearch': return cmdKeywordSearch();\n case 'context': return cmdContext();\n case 'stats': return cmdStats();\n case 'reembed': return cmdReembed();\n case 'watch': return cmdWatch();\n case 'serve': return cmdServe();\n case 'help':\n case '--help':\n case '-h':\n showHelp();\n break;\n default:\n if (command) console.log(c.red(`Unknown command: ${command}\\n`));\n showHelp();\n process.exit(command ? 1 : 0);\n }\n}\n\nmain().catch(err => {\n console.error(c.red(`Error: ${err.message}`));\n if (process.env.BRAINBANK_DEBUG) console.error(err.stack);\n process.exit(1);\n});\n"],"mappings":"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","names":["path","path","brain","coll","path","brain"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/utils.ts","../src/cli/commands/index-cmd.ts","../src/cli/factory.ts","../src/cli/commands/collection.ts","../src/cli/commands/kv.ts","../src/cli/commands/docs.ts","../src/cli/commands/search.ts","../src/cli/commands/context.ts","../src/cli/commands/system.ts","../src/cli/index.ts"],"sourcesContent":["/**\n * BrainBank CLI — Shared Utilities\n *\n * Colors, argument parsing, and result formatting.\n * No BrainBank imports — pure Node.js / terminal helpers.\n */\n\n// ── Colors ──────────────────────────────────────────\n\nexport const c = {\n green: (s: string) => `\\x1b[32m${s}\\x1b[0m`,\n red: (s: string) => `\\x1b[31m${s}\\x1b[0m`,\n yellow: (s: string) => `\\x1b[33m${s}\\x1b[0m`,\n cyan: (s: string) => `\\x1b[36m${s}\\x1b[0m`,\n dim: (s: string) => `\\x1b[2m${s}\\x1b[0m`,\n bold: (s: string) => `\\x1b[1m${s}\\x1b[0m`,\n magenta: (s: string) => `\\x1b[35m${s}\\x1b[0m`,\n};\n\n// ── Argument Parsing ────────────────────────────────\n\n/** Raw argv, sliced past the Node binary and script path. */\nexport const args = process.argv.slice(2);\n\nexport function getFlag(name: string): string | undefined {\n const idx = args.indexOf(`--${name}`);\n return idx >= 0 ? args[idx + 1] : undefined;\n}\n\nexport function hasFlag(name: string): boolean {\n return args.includes(`--${name}`);\n}\n\n/** Known flags that take a value (--flag <value>). */\nconst VALUE_FLAGS = new Set([\n 'repo', 'depth', 'collection', 'pattern', 'context', 'name',\n 'keep', 'reranker',\n]);\n\n/**\n * Strip all --flags AND their values from an argv slice.\n * Returns only positional arguments.\n *\n * stripFlags(['ksearch', 'auth', '--repo', '/path'])\n * → ['ksearch', 'auth']\n */\nexport function stripFlags(argv: string[]): string[] {\n const result: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n if (argv[i].startsWith('--')) {\n const name = argv[i].slice(2);\n if (VALUE_FLAGS.has(name)) i++; // skip next (the value)\n continue;\n }\n result.push(argv[i]);\n }\n return result;\n}\n\n// ── Result Printer ──────────────────────────────────\n\nexport function printResults(results: any[]): void {\n if (results.length === 0) {\n console.log(c.yellow(' No results found.'));\n return;\n }\n\n for (const r of results) {\n const score = Math.round(r.score * 100);\n\n if (r.type === 'code') {\n const m = r.metadata;\n console.log(\n `${c.green(`[CODE ${score}%]`)} ${c.bold(r.filePath!)} — ` +\n `${m.name || m.chunkType} ${c.dim(`L${m.startLine}-${m.endLine}`)}`,\n );\n console.log(c.dim(r.content.split('\\n').slice(0, 5).join('\\n')));\n console.log('');\n } else if (r.type === 'commit') {\n const m = r.metadata;\n console.log(\n `${c.cyan(`[COMMIT ${score}%]`)} ${c.bold(m.shortHash)} ` +\n `${r.content} ${c.dim(`(${m.author})`)}`,\n );\n if (m.files?.length) console.log(c.dim(` Files: ${m.files.slice(0, 4).join(', ')}`));\n console.log('');\n } else if (r.type === 'document') {\n const ctx = r.context ? ` — ${c.dim(r.context)}` : '';\n console.log(\n `${c.magenta(`[DOC ${score}%]`)} ${c.bold(r.filePath!)} ` +\n `[${r.metadata.collection}]${ctx}`,\n );\n console.log(c.dim(r.content.split('\\n').slice(0, 4).join('\\n')));\n console.log('');\n }\n }\n}\n","/**\n * brainbank index [path] — Index code + git + docs\n */\n\nimport * as path from 'node:path';\nimport { c, args, getFlag, hasFlag } from '../utils.ts';\nimport { createBrain } from '../factory.ts';\n\nexport async function cmdIndex(): Promise<void> {\n const repoPath = args[1] || '.';\n const force = hasFlag('force');\n const depth = parseInt(getFlag('depth') || '500', 10);\n const onlyRaw = getFlag('only');\n const docsPath = getFlag('docs');\n const modules = onlyRaw\n ? onlyRaw.split(',').map(s => s.trim()) as ('code' | 'git' | 'docs')[]\n : undefined;\n\n // If --docs is passed, auto-include 'docs' in modules\n if (docsPath && modules && !modules.includes('docs')) {\n modules.push('docs');\n }\n\n console.log(c.bold('\\n━━━ BrainBank Index ━━━'));\n console.log(c.dim(` Repo: ${repoPath}`));\n console.log(c.dim(` Force: ${force}`));\n console.log(c.dim(` Git depth: ${depth}`));\n if (modules) console.log(c.dim(` Modules: ${modules.join(', ')}`));\n if (docsPath) console.log(c.dim(` Docs path: ${docsPath}`));\n\n const brain = await createBrain(repoPath);\n\n // Auto-register docs collection from --docs path\n if (docsPath) {\n const absDocsPath = path.resolve(docsPath);\n const collName = path.basename(absDocsPath);\n try {\n await brain.addCollection({\n name: collName,\n path: absDocsPath,\n pattern: '**/*.md',\n ignore: ['deprecated/**', 'node_modules/**'],\n });\n console.log(c.dim(` Registered docs collection: ${collName}`));\n } catch {\n console.log(c.yellow(` Warning: docs module not loaded, skipping --docs`));\n }\n }\n\n const result = await brain.index({\n modules,\n forceReindex: force,\n gitDepth: depth,\n onProgress: (stage, msg) => {\n process.stdout.write(`\\r ${c.cyan(stage.toUpperCase())} ${msg} `);\n },\n });\n\n console.log('\\n');\n if (result.code) {\n console.log(` ${c.green('Code')}: ${result.code.indexed} indexed, ${result.code.skipped} skipped, ${result.code.chunks ?? 0} chunks`);\n }\n if (result.git) {\n console.log(` ${c.green('Git')}: ${result.git.indexed} indexed, ${result.git.skipped} skipped`);\n }\n if (result.docs) {\n for (const [name, stat] of Object.entries(result.docs)) {\n console.log(` ${c.green('Docs')}: [${name}] ${stat.indexed} indexed, ${stat.skipped} skipped, ${stat.chunks} chunks`);\n }\n }\n\n const stats = brain.stats();\n console.log(`\\n ${c.bold('Totals')}:`);\n if (stats.code) console.log(` Code chunks: ${stats.code.chunks}`);\n if (stats.git) console.log(` Git commits: ${stats.git.commits}`);\n if (stats.git) console.log(` Co-edit pairs: ${stats.git.coEdits}`);\n if (stats.documents) console.log(` Documents: ${stats.documents.documents}`);\n\n brain.close();\n}\n","/**\n * BrainBank CLI — Brain Factory\n *\n * Creates a configured BrainBank instance with built-in indexers,\n * auto-discovered indexers, and config file support.\n */\n\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { BrainBank } from '../app/brainbank.ts';\nimport { code } from '../indexers/code/code-plugin.ts';\nimport { git } from '../indexers/git/git-plugin.ts';\nimport { docs } from '../indexers/docs/docs-plugin.ts';\nimport type { Indexer } from '../indexers/base.ts';\nimport { c, getFlag } from './utils.ts';\n\n// ── Types ───────────────────────────────────────────\n\ninterface BrainBankCliConfig {\n /** Custom indexers to register alongside built-in ones. */\n indexers?: Indexer[];\n /** Override which built-in indexers to load. Default: ['code', 'git', 'docs'] */\n builtins?: ('code' | 'git' | 'docs')[];\n /** BrainBank constructor options. */\n brainbank?: Record<string, any>;\n}\n\nconst CONFIG_NAMES = ['config.ts', 'config.js', 'config.mjs'];\nconst INDEXER_EXTENSIONS = ['.ts', '.js', '.mjs'];\n\n// ── Caches ──────────────────────────────────────────\n\nlet _configCache: BrainBankCliConfig | null | undefined = undefined;\nlet _folderIndexersCache: Indexer[] | undefined = undefined;\n\n// ── Config Loader ───────────────────────────────────\n\n/** Load .brainbank/config.ts if present. */\nasync function loadConfig(): Promise<BrainBankCliConfig | null> {\n if (_configCache !== undefined) return _configCache;\n\n const repoPath = getFlag('repo') ?? '.';\n const brainbankDir = path.resolve(repoPath, '.brainbank');\n\n for (const name of CONFIG_NAMES) {\n const configPath = path.join(brainbankDir, name);\n if (fs.existsSync(configPath)) {\n try {\n const mod = await import(configPath);\n _configCache = (mod.default ?? mod) as BrainBankCliConfig;\n return _configCache;\n } catch (err: any) {\n console.error(c.red(`Error loading .brainbank/${name}: ${err.message}`));\n process.exit(1);\n }\n }\n }\n\n _configCache = null;\n return null;\n}\n\n// ── Indexer Discovery ───────────────────────────────\n\n/** Auto-discover indexers from .brainbank/indexers/ folder. */\nasync function discoverFolderIndexers(): Promise<Indexer[]> {\n if (_folderIndexersCache !== undefined) return _folderIndexersCache;\n\n const repoPath = getFlag('repo') ?? '.';\n const indexersDir = path.resolve(repoPath, '.brainbank', 'indexers');\n\n if (!fs.existsSync(indexersDir)) {\n _folderIndexersCache = [];\n return [];\n }\n\n const files = fs.readdirSync(indexersDir)\n .filter(f => INDEXER_EXTENSIONS.some(ext => f.endsWith(ext)))\n .sort();\n\n const indexers: Indexer[] = [];\n\n for (const file of files) {\n const filePath = path.join(indexersDir, file);\n try {\n const mod = await import(filePath);\n const indexer = mod.default ?? mod;\n\n if (indexer && typeof indexer === 'object' && indexer.name) {\n indexers.push(indexer as Indexer);\n } else {\n console.error(c.yellow(`⚠ ${file}: must export a default Indexer with a 'name' property, skipping`));\n }\n } catch (err: any) {\n console.error(c.red(`Error loading indexer ${file}: ${err.message}`));\n }\n }\n\n _folderIndexersCache = indexers;\n return indexers;\n}\n\n// ── Multi-repo Detection ────────────────────────────\n\n/** Detect subdirectories that have their own .git repo. */\nfunction detectGitSubdirs(parentPath: string): { name: string; path: string }[] {\n try {\n const entries = fs.readdirSync(parentPath, { withFileTypes: true });\n return entries\n .filter(e =>\n e.isDirectory() &&\n !e.name.startsWith('.') &&\n !e.name.startsWith('node_modules') &&\n fs.existsSync(path.join(parentPath, e.name, '.git')),\n )\n .map(e => ({ name: e.name, path: path.join(parentPath, e.name) }));\n } catch {\n return [];\n }\n}\n\n// ── Factory ─────────────────────────────────────────\n\n/** Create a BrainBank with built-in + discovered + config indexers. */\nexport async function createBrain(repoPath?: string): Promise<BrainBank> {\n const rp = repoPath ?? getFlag('repo') ?? '.';\n const config = await loadConfig();\n const folderIndexers = await discoverFolderIndexers();\n\n const brainOpts: Record<string, any> = { repoPath: rp, ...(config?.brainbank ?? {}) };\n\n // Optional Qwen3 reranker via --reranker qwen3\n const rerankerFlag = getFlag('reranker');\n if (rerankerFlag === 'qwen3') {\n const { Qwen3Reranker } = await import('@brainbank/reranker');\n brainOpts.reranker = new Qwen3Reranker();\n }\n\n // Embedding provider via BRAINBANK_EMBEDDING env (default: local WASM)\n const embeddingEnv = process.env.BRAINBANK_EMBEDDING;\n if (embeddingEnv === 'openai') {\n const { OpenAIEmbedding } = await import('../providers/embeddings/openai.ts');\n const provider = new OpenAIEmbedding();\n brainOpts.embeddingProvider = provider;\n brainOpts.embeddingDims = provider.dims;\n }\n\n const brain = new BrainBank(brainOpts);\n\n // 1. Built-in indexers (default: all three)\n const builtins = config?.builtins ?? ['code', 'git', 'docs'];\n\n // Multi-repo detection: check if repoPath has no .git but subdirs do\n const resolvedRp = path.resolve(rp);\n const hasRootGit = fs.existsSync(path.join(resolvedRp, '.git'));\n const gitSubdirs = !hasRootGit ? detectGitSubdirs(resolvedRp) : [];\n\n if (gitSubdirs.length > 0 && (builtins.includes('code') || builtins.includes('git'))) {\n // Multi-repo mode: create namespaced indexers for each subdir\n console.log(c.cyan(` Multi-repo: found ${gitSubdirs.length} git repos: ${gitSubdirs.map(d => d.name).join(', ')}`));\n for (const sub of gitSubdirs) {\n if (builtins.includes('code')) {\n brain.use(code({ repoPath: sub.path, name: `code:${sub.name}` }));\n }\n if (builtins.includes('git')) {\n brain.use(git({ repoPath: sub.path, name: `git:${sub.name}` }));\n }\n }\n } else {\n // Single-repo mode (standard)\n if (builtins.includes('code')) brain.use(code({ repoPath: rp }));\n if (builtins.includes('git')) brain.use(git());\n }\n\n if (builtins.includes('docs')) brain.use(docs());\n\n // 2. Auto-discovered from .brainbank/indexers/\n for (const indexer of folderIndexers) {\n brain.use(indexer);\n }\n\n // 3. Indexers from config file\n if (config?.indexers) {\n for (const indexer of config.indexers) {\n brain.use(indexer);\n }\n }\n\n return brain;\n}\n","/**\n * brainbank collection add|list|remove — Document collection management\n */\n\nimport { c, args, getFlag } from '../utils.ts';\nimport { createBrain } from '../factory.ts';\n\nexport async function cmdCollection(): Promise<void> {\n const sub = args[1];\n\n if (sub === 'add') {\n const path = args[2];\n const name = getFlag('name');\n const pattern = getFlag('pattern') ?? '**/*.md';\n const context = getFlag('context');\n const ignoreRaw = getFlag('ignore');\n\n if (!path || !name) {\n console.log(c.red('Usage: brainbank collection add <path> --name <name> [--pattern \"**/*.md\"] [--ignore \"glob\"] [--context \"description\"]'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.addCollection({\n name,\n path,\n pattern,\n ignore: ignoreRaw ? ignoreRaw.split(',') : [],\n context: context ?? undefined,\n });\n console.log(c.green(`✓ Collection '${name}' added: ${path} (${pattern})`));\n if (context) console.log(c.dim(` Context: ${context}`));\n brain.close();\n return;\n }\n\n if (sub === 'list') {\n const brain = await createBrain();\n await brain.initialize();\n const collections = brain.listCollections();\n if (collections.length === 0) {\n console.log(c.yellow(' No collections registered.'));\n } else {\n console.log(c.bold('\\n━━━ Collections ━━━\\n'));\n for (const col of collections) {\n console.log(` ${c.cyan(col.name)} ${c.dim('→')} ${col.path}`);\n console.log(` Pattern: ${col.pattern ?? '**/*.md'}`);\n if (col.context) console.log(` Context: ${c.dim(col.context)}`);\n }\n }\n brain.close();\n return;\n }\n\n if (sub === 'remove') {\n const name = args[2];\n if (!name) {\n console.log(c.red('Usage: brainbank collection remove <name>'));\n process.exit(1);\n }\n const brain = await createBrain();\n await brain.removeCollection(name);\n console.log(c.green(`✓ Collection '${name}' removed.`));\n brain.close();\n return;\n }\n\n console.log(c.red('Usage: brainbank collection <add|list|remove>'));\n process.exit(1);\n}\n","/**\n * brainbank kv add|search|list|trim|clear — Dynamic KV collection management\n */\n\nimport { c, args, getFlag } from '../utils.ts';\nimport { createBrain } from '../factory.ts';\n\nexport async function cmdKv(): Promise<void> {\n const sub = args[1];\n\n // ── add ─────────────────────────────────────────\n if (sub === 'add') {\n const collName = args[2];\n const content = args.slice(3).filter(a => !a.startsWith('--')).join(' ');\n const metaRaw = getFlag('meta');\n\n if (!collName || !content) {\n console.log(c.red(\"Usage: brainbank kv add <collection> <content> [--meta '{\\\"key\\\":\\\"val\\\"}']\"));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const meta = metaRaw ? JSON.parse(metaRaw) : {};\n const id = await coll.add(content, meta);\n console.log(c.green(`✓ Added item #${id} to '${collName}'`));\n brain.close();\n return;\n }\n\n // ── search ──────────────────────────────────────\n if (sub === 'search') {\n const collName = args[2];\n const query = args.slice(3).filter(a => !a.startsWith('--')).join(' ');\n const k = parseInt(getFlag('k') || '5', 10);\n const mode = (getFlag('mode') as any) || 'hybrid';\n\n if (!collName || !query) {\n console.log(c.red('Usage: brainbank kv search <collection> <query> [--k 5] [--mode hybrid|keyword|vector]'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const results = await coll.search(query, { k, mode });\n\n if (results.length === 0) {\n console.log(c.yellow(' No results found.'));\n } else {\n console.log(c.bold(`\\n━━━ ${collName}: \"${query}\" ━━━\\n`));\n for (const r of results) {\n const score = Math.round((r.score ?? 0) * 100);\n console.log(` ${c.cyan(`[${score}%]`)} ${r.content}`);\n if (Object.keys(r.metadata).length > 0) {\n console.log(` ${c.dim(JSON.stringify(r.metadata))}`);\n }\n }\n }\n brain.close();\n return;\n }\n\n // ── list ────────────────────────────────────────\n if (sub === 'list') {\n const collName = args[2];\n const limit = parseInt(getFlag('limit') || '20', 10);\n\n if (!collName) {\n const brain = await createBrain();\n await brain.initialize();\n const names = brain.listCollectionNames();\n if (names.length === 0) {\n console.log(c.yellow(' No KV collections found.'));\n } else {\n console.log(c.bold('\\n━━━ KV Collections ━━━\\n'));\n for (const n of names) {\n const coll = brain.collection(n);\n console.log(` ${c.cyan(n)} — ${coll.count()} items`);\n }\n }\n brain.close();\n return;\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const items = coll.list({ limit });\n if (items.length === 0) {\n console.log(c.yellow(` Collection '${collName}' is empty.`));\n } else {\n console.log(c.bold(`\\n━━━ ${collName} (${coll.count()} items) ━━━\\n`));\n for (const item of items) {\n const age = Math.round((Date.now() / 1000 - item.createdAt) / 60);\n console.log(` #${item.id} ${c.dim(`(${age}m ago)`)} ${item.content.slice(0, 80)}`);\n }\n }\n brain.close();\n return;\n }\n\n // ── trim ────────────────────────────────────────\n if (sub === 'trim') {\n const collName = args[2];\n const keep = parseInt(getFlag('keep') || '0', 10);\n\n if (!collName || keep <= 0) {\n console.log(c.red('Usage: brainbank kv trim <collection> --keep <n>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const result = await coll.trim({ keep });\n console.log(c.green(`✓ Trimmed ${result.removed} items from '${collName}' (kept ${keep})`));\n brain.close();\n return;\n }\n\n // ── clear ───────────────────────────────────────\n if (sub === 'clear') {\n const collName = args[2];\n if (!collName) {\n console.log(c.red('Usage: brainbank kv clear <collection>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n const coll = brain.collection(collName);\n const before = coll.count();\n coll.clear();\n console.log(c.green(`✓ Cleared ${before} items from '${collName}'`));\n brain.close();\n return;\n }\n\n console.log(c.red('Usage: brainbank kv <add|search|list|trim|clear>'));\n process.exit(1);\n}\n","/**\n * brainbank docs — Index document collections\n * brainbank dsearch — Search documents only\n */\n\nimport { c, args, getFlag, stripFlags } from '../utils.ts';\nimport { createBrain } from '../factory.ts';\n\nexport async function cmdDocs(): Promise<void> {\n const collection = getFlag('collection');\n const brain = await createBrain();\n\n console.log(c.bold('\\n━━━ BrainBank Docs Index ━━━\\n'));\n\n const opts: { collections?: string[]; onProgress?: any } = {};\n if (collection) opts.collections = [collection];\n opts.onProgress = (col: string, file: string, cur: number, total: number) => {\n process.stdout.write(`\\r ${c.cyan(col)} [${cur}/${total}] ${file} `);\n };\n\n const results = await brain.indexDocs(opts);\n\n console.log('\\n');\n for (const [name, stat] of Object.entries(results)) {\n console.log(` ${c.green(name)}: ${stat.indexed} indexed, ${stat.skipped} skipped, ${stat.chunks} chunks`);\n }\n\n brain.close();\n}\n\nexport async function cmdDocSearch(): Promise<void> {\n const query = stripFlags(args).slice(1).join(' ');\n if (!query) {\n console.log(c.red('Usage: brainbank dsearch <query>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n const collection = getFlag('collection');\n const k = parseInt(getFlag('k') || '8', 10);\n\n console.log(c.bold(`\\n━━━ BrainBank Doc Search: \"${query}\" ━━━\\n`));\n\n const results = await brain.searchDocs(query, { collection: collection ?? undefined, k });\n\n if (results.length === 0) {\n console.log(c.yellow(' No results found.'));\n brain.close();\n return;\n }\n\n for (const r of results) {\n const score = Math.round(r.score * 100);\n const ctx = r.context ? ` — ${c.dim(r.context)}` : '';\n console.log(`${c.magenta(`[DOC ${score}%]`)} ${c.bold(r.filePath!)} [${(r.metadata as any).collection}]${ctx}`);\n const preview = r.content.split('\\n').slice(0, 4).join('\\n');\n console.log(c.dim(preview));\n console.log('');\n }\n\n brain.close();\n}\n","/**\n * brainbank search — Semantic search (vector)\n * brainbank hsearch — Hybrid search (vector + BM25)\n * brainbank ksearch — Keyword search (BM25)\n */\n\nimport { c, args, stripFlags, printResults } from '../utils.ts';\nimport { createBrain } from '../factory.ts';\n\nexport async function cmdSearch(): Promise<void> {\n const query = stripFlags(args).slice(1).join(' ');\n if (!query) {\n console.log(c.red('Usage: brainbank search <query>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n console.log(c.bold(`\\n━━━ BrainBank Search: \"${query}\" ━━━\\n`));\n\n const results = await brain.search(query);\n printResults(results);\n brain.close();\n}\n\nexport async function cmdHybridSearch(): Promise<void> {\n const query = stripFlags(args).slice(1).join(' ');\n if (!query) {\n console.log(c.red('Usage: brainbank hsearch <query>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n console.log(c.bold(`\\n━━━ BrainBank Hybrid Search: \"${query}\" ━━━`));\n console.log(c.dim(` Mode: vector + BM25 → Reciprocal Rank Fusion\\n`));\n\n const results = await brain.hybridSearch(query);\n printResults(results);\n brain.close();\n}\n\nexport async function cmdKeywordSearch(): Promise<void> {\n const query = stripFlags(args).slice(1).join(' ');\n if (!query) {\n console.log(c.red('Usage: brainbank ksearch <query>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n console.log(c.bold(`\\n━━━ BrainBank Keyword Search: \"${query}\" ━━━`));\n console.log(c.dim(` Mode: BM25 full-text (instant)\\n`));\n\n const results = brain.searchBM25(query);\n printResults(results);\n brain.close();\n}\n","/**\n * brainbank context <task> — Get formatted context for a task\n * brainbank context add <collection> <path> <description>\n * brainbank context list\n */\n\nimport { c, args, stripFlags } from '../utils.ts';\nimport { createBrain } from '../factory.ts';\n\nexport async function cmdContext(): Promise<void> {\n const sub = args[1];\n\n // brainbank context add <collection> <path> <description>\n if (sub === 'add') {\n const collection = args[2];\n const path = args[3];\n const desc = args.slice(4).join(' ');\n\n if (!collection || !path || !desc) {\n console.log(c.red('Usage: brainbank context add <collection> <path> <description>'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n await brain.initialize();\n brain.addContext(collection, path, desc);\n console.log(c.green(`✓ Context added: ${collection}:${path} → \"${desc}\"`));\n brain.close();\n return;\n }\n\n // brainbank context list\n if (sub === 'list') {\n const brain = await createBrain();\n await brain.initialize();\n const contexts = brain.listContexts();\n if (contexts.length === 0) {\n console.log(c.yellow(' No contexts configured.'));\n } else {\n console.log(c.bold('\\n━━━ Contexts ━━━\\n'));\n for (const ctx of contexts) {\n console.log(` ${c.cyan(ctx.collection)}:${ctx.path} → ${c.dim(ctx.context)}`);\n }\n }\n brain.close();\n return;\n }\n\n // brainbank context <task> — get formatted context\n const task = stripFlags(args).slice(1).join(' ');\n if (!task) {\n console.log(c.red('Usage: brainbank context <task description>'));\n console.log(c.dim(' brainbank context add <collection> <path> <description>'));\n console.log(c.dim(' brainbank context list'));\n process.exit(1);\n }\n\n const brain = await createBrain();\n const context = await brain.getContext(task);\n console.log(context);\n brain.close();\n}\n","/**\n * brainbank stats — Show index statistics\n * brainbank reembed — Re-embed all vectors\n * brainbank watch — Watch for file changes\n * brainbank serve — Start MCP server\n */\n\nimport { c } from '../utils.ts';\nimport { createBrain } from '../factory.ts';\n\n// ── Stats ───────────────────────────────────────────\n\nexport async function cmdStats(): Promise<void> {\n const brain = await createBrain();\n await brain.initialize();\n\n const s = brain.stats();\n\n console.log(c.bold('\\n━━━ BrainBank Stats ━━━\\n'));\n console.log(` ${c.cyan('Indexers')}: ${brain.indexers.join(', ')}\\n`);\n\n if (s.code) {\n console.log(` ${c.cyan('Code')}`);\n console.log(` Files indexed: ${s.code.files}`);\n console.log(` Code chunks: ${s.code.chunks}`);\n console.log(` HNSW vectors: ${s.code.hnswSize}`);\n console.log('');\n }\n\n if (s.git) {\n console.log(` ${c.cyan('Git History')}`);\n console.log(` Commits: ${s.git.commits}`);\n console.log(` Files tracked: ${s.git.filesTracked}`);\n console.log(` Co-edit pairs: ${s.git.coEdits}`);\n console.log(` HNSW vectors: ${s.git.hnswSize}`);\n console.log('');\n }\n\n if (s.documents) {\n console.log(` ${c.cyan('Documents')}`);\n console.log(` Collections: ${s.documents.collections}`);\n console.log(` Documents: ${s.documents.documents}`);\n console.log(` Chunks: ${s.documents.chunks}`);\n console.log(` HNSW vectors: ${s.documents.hnswSize}`);\n console.log('');\n }\n\n // KV collections\n const kvNames = brain.listCollectionNames();\n if (kvNames.length > 0) {\n console.log(` ${c.cyan('KV Collections')}`);\n for (const name of kvNames) {\n const coll = brain.collection(name);\n console.log(` ${name}: ${coll.count()} items`);\n }\n console.log('');\n }\n\n brain.close();\n}\n\n// ── Re-embed ────────────────────────────────────────\n\nexport async function cmdReembed(): Promise<void> {\n const brain = await createBrain();\n await brain.initialize();\n\n console.log(c.bold('\\n━━━ BrainBank Re-embed ━━━\\n'));\n console.log(c.dim(' Regenerating vectors with current embedding provider...'));\n console.log(c.dim(' Text, FTS, and metadata remain unchanged.\\n'));\n\n const result = await brain.reembed({\n onProgress: (table, current, total) => {\n process.stdout.write(`\\r ${c.cyan(table.padEnd(8))} ${current}/${total}`);\n },\n });\n\n console.log('\\n');\n if (result.code > 0) console.log(` ${c.green('✓')} Code: ${result.code} vectors`);\n if (result.git > 0) console.log(` ${c.green('✓')} Git: ${result.git} vectors`);\n if (result.docs > 0) console.log(` ${c.green('✓')} Docs: ${result.docs} vectors`);\n if (result.kv > 0) console.log(` ${c.green('✓')} KV: ${result.kv} vectors`);\n if (result.notes > 0) console.log(` ${c.green('✓')} Notes: ${result.notes} vectors`);\n if (result.memory > 0) console.log(` ${c.green('✓')} Memory: ${result.memory} vectors`);\n console.log(`\\n ${c.bold('Total')}: ${result.total} vectors regenerated\\n`);\n\n brain.close();\n}\n\n// ── Watch ───────────────────────────────────────────\n\nexport async function cmdWatch(): Promise<void> {\n const brain = await createBrain();\n await brain.initialize();\n\n console.log(c.bold('\\n━━━ BrainBank Watch ━━━\\n'));\n console.log(c.dim(` Watching ${brain.config.repoPath} for changes...`));\n console.log(c.dim(' Press Ctrl+C to stop.\\n'));\n\n const watcher = brain.watch({\n debounceMs: 2000,\n onIndex: (file, indexer) => {\n const ts = new Date().toLocaleTimeString();\n console.log(` ${c.dim(ts)} ${c.green('✓')} ${c.cyan(indexer)}: ${file}`);\n },\n onError: (err) => {\n console.error(` ${c.red('✗')} ${err.message}`);\n },\n });\n\n // Keep process alive, clean up on Ctrl+C\n process.on('SIGINT', () => {\n console.log(c.dim('\\n Stopping watcher...'));\n watcher.close();\n brain.close();\n process.exit(0);\n });\n\n await new Promise(() => {});\n}\n\n// ── Serve ───────────────────────────────────────────\n\nexport async function cmdServe(): Promise<void> {\n await import('@brainbank/mcp');\n}\n\n// ── Help ────────────────────────────────────────────\n\nexport function showHelp(): void {\n console.log(c.bold('\\n━━━ BrainBank — Semantic Knowledge Bank ━━━\\n'));\n console.log(c.bold('Indexing:'));\n console.log(` ${c.cyan('index')} [path] Index code + git history`);\n console.log(` ${c.cyan('collection add')} <path> --name Add a document collection`);\n console.log(` ${c.cyan('collection list')} List collections`);\n console.log(` ${c.cyan('collection remove')} <name> Remove a collection`);\n console.log(` ${c.cyan('docs')} [--collection <name>] Index document collections`);\n console.log('');\n console.log(c.bold('Search:'));\n console.log(` ${c.cyan('search')} <query> Semantic search (vector)`);\n console.log(` ${c.cyan('hsearch')} <query> Hybrid search (${c.bold('best quality')})`);\n console.log(` ${c.cyan('ksearch')} <query> Keyword search (BM25, instant)`);\n console.log(` ${c.cyan('dsearch')} <query> Document search`);\n console.log('');\n console.log(c.bold('Context:'));\n console.log(` ${c.cyan('context')} <task> Get formatted context for a task`);\n console.log(` ${c.cyan('context add')} <col> <path> <desc> Add context metadata`);\n console.log(` ${c.cyan('context list')} List all context metadata`);\n console.log('');\n console.log(c.bold('KV Store:'));\n console.log(` ${c.cyan('kv add')} <coll> <content> Add item to a collection`);\n console.log(` ${c.cyan('kv search')} <coll> <query> Search a collection`);\n console.log(` ${c.cyan('kv list')} [coll] List collections or items`);\n console.log(` ${c.cyan('kv trim')} <coll> --keep <n> Keep only N most recent`);\n console.log(` ${c.cyan('kv clear')} <coll> Clear all items`);\n console.log('');\n console.log(c.bold('Utility:'));\n console.log(` ${c.cyan('stats')} Show index statistics`);\n console.log(` ${c.cyan('reembed')} Re-embed all vectors`);\n console.log(` ${c.cyan('watch')} Watch files, auto-re-index`);\n console.log(` ${c.cyan('serve')} Start MCP server (stdio)`);\n console.log('');\n console.log(c.bold('Options:'));\n console.log(` ${c.dim('--repo <path>')} Repository path (default: .)`);\n console.log(` ${c.dim('--force')} Force re-index all files`);\n console.log(` ${c.dim('--depth <n>')} Git history depth (default: 500)`);\n console.log(` ${c.dim('--collection <name>')} Filter by collection`);\n console.log(` ${c.dim('--pattern <glob>')} Collection glob (default: **/*.md)`);\n console.log(` ${c.dim('--context <desc>')} Context description`);\n console.log(` ${c.dim('--reranker <name>')} Reranker to use (qwen3)`);\n console.log('');\n console.log(c.bold('Examples:'));\n console.log(c.dim(' brainbank index .'));\n console.log(c.dim(' brainbank kv add errors \"Fixed null pointer in api.ts\"'));\n console.log(c.dim(' brainbank kv search errors \"null pointer\"'));\n console.log(c.dim(' brainbank kv list'));\n console.log(c.dim(' brainbank hsearch \"authentication middleware\"'));\n console.log(c.dim(' brainbank context \"add rate limiting to the API\"'));\n console.log(c.dim(' brainbank serve'));\n}\n","#!/usr/bin/env node\n\n/**\n * BrainBank — CLI Entry Point\n *\n * Dispatcher that routes commands to their handler modules.\n */\n\nimport { args, c } from './utils.ts';\nimport { cmdIndex } from './commands/index-cmd.ts';\nimport { cmdCollection } from './commands/collection.ts';\nimport { cmdKv } from './commands/kv.ts';\nimport { cmdDocs, cmdDocSearch } from './commands/docs.ts';\nimport { cmdSearch, cmdHybridSearch, cmdKeywordSearch } from './commands/search.ts';\nimport { cmdContext } from './commands/context.ts';\nimport { cmdStats, cmdReembed, cmdWatch, cmdServe, showHelp } from './commands/system.ts';\n\nconst command = args[0];\n\nasync function main(): Promise<void> {\n switch (command) {\n case 'index': return cmdIndex();\n case 'collection': return cmdCollection();\n case 'kv': return cmdKv();\n case 'docs': return cmdDocs();\n case 'dsearch': return cmdDocSearch();\n case 'search': return cmdSearch();\n case 'hsearch': return cmdHybridSearch();\n case 'ksearch': return cmdKeywordSearch();\n case 'context': return cmdContext();\n case 'stats': return cmdStats();\n case 'reembed': return cmdReembed();\n case 'watch': return cmdWatch();\n case 'serve': return cmdServe();\n case 'help':\n case '--help':\n case '-h':\n showHelp();\n break;\n default:\n if (command) console.log(c.red(`Unknown command: ${command}\\n`));\n showHelp();\n process.exit(command ? 1 : 0);\n }\n}\n\nmain().catch(err => {\n console.error(c.red(`Error: ${err.message}`));\n if (process.env.BRAINBANK_DEBUG) console.error(err.stack);\n process.exit(1);\n});\n"],"mappings":"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","names":["path","path","brain","coll","path","brain"]}
|
package/dist/code.js
CHANGED
package/dist/docs.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
NoteStore
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-OPQ3ZIPV.js";
|
|
4
4
|
import {
|
|
5
5
|
Consolidator,
|
|
6
6
|
PatternStore
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
MultiIndexSearch,
|
|
17
17
|
resolveConfig,
|
|
18
18
|
searchMMR
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-ZJ5LLMGM.js";
|
|
20
20
|
import {
|
|
21
21
|
CodeChunker,
|
|
22
22
|
CodeIndexer,
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
code,
|
|
26
26
|
getLanguage,
|
|
27
27
|
isSupported
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-4DM3XWO6.js";
|
|
29
29
|
import {
|
|
30
30
|
CoEditAnalyzer,
|
|
31
31
|
GitIndexer,
|
|
@@ -34,10 +34,10 @@ import {
|
|
|
34
34
|
import {
|
|
35
35
|
DocsIndexer,
|
|
36
36
|
docs
|
|
37
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-T2VXF5S5.js";
|
|
38
38
|
import {
|
|
39
39
|
reciprocalRankFusion
|
|
40
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-FEAMUZGJ.js";
|
|
41
41
|
import {
|
|
42
42
|
cosineSimilarity,
|
|
43
43
|
normalize
|
package/dist/notes.js
CHANGED
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "brainbank",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Pluggable semantic memory for AI agents — hybrid search (vector + BM25) in a single SQLite file. Built-in code, git, and docs indexers. Bring your own.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"bin": {
|
|
9
|
-
"brainbank": "./dist/cli
|
|
9
|
+
"brainbank": "./dist/cli.js"
|
|
10
10
|
},
|
|
11
11
|
"exports": {
|
|
12
12
|
".": {
|