bilmem 0.1.0 → 0.2.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.
- package/README.md +163 -20
- package/dist/{canonical-CglQQ0xc.d.ts → canonical-JS6HUWGc.d.ts} +24 -1
- package/dist/cli/index.js +1433 -200
- package/dist/cli/index.js.map +1 -1
- package/dist/core/index.d.ts +52 -5
- package/dist/core/index.js +623 -1
- package/dist/core/index.js.map +1 -1
- package/dist/{filesystem-B3qAej0l.d.ts → filesystem-CrAkhr85.d.ts} +1 -1
- package/dist/index.d.ts +15 -9
- package/dist/index.js +1451 -303
- package/dist/index.js.map +1 -1
- package/dist/install/index.d.ts +59 -3
- package/dist/install/index.js +1245 -111
- package/dist/install/index.js.map +1 -1
- package/dist/jev/index.d.ts +1 -1
- package/dist/mcp/index.d.ts +12 -1
- package/dist/mcp/index.js +846 -97
- package/dist/mcp/index.js.map +1 -1
- package/dist/rules/index.d.ts +2 -2
- package/dist/rules/index.js.map +1 -1
- package/dist/scanner/index.d.ts +2 -2
- package/dist/scanner/index.js +6 -1
- package/dist/scanner/index.js.map +1 -1
- package/dist/search/index.d.ts +1 -1
- package/dist/stats/index.d.ts +3 -3
- package/dist/stats/index.js +45 -1
- package/dist/stats/index.js.map +1 -1
- package/dist/storage/index.d.ts +3 -3
- package/dist/storage/index.js +6 -1
- package/dist/storage/index.js.map +1 -1
- package/dist/{types-Nxq5Gzay.d.ts → types-DNlvHsj9.d.ts} +120 -3
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/install/index.ts","../../src/storage/canonical.ts","../../src/rules/loader.ts","../../src/stats/events.ts","../../src/install/adapters/cursor.ts","../../src/install/adapters/base.ts","../../src/install/atomic.ts","../../src/install/instructions.ts","../../src/install/ownership.ts","../../src/install/adapters/claude.ts","../../src/install/adapters/codex.ts","../../src/install/adapters/gemini.ts","../../src/install/registry.ts","../../src/install/doctor.ts","../../src/mcp/server.ts","../../src/search/indexer.ts","../../src/jev/scorer.ts","../../src/jev/matcher.ts","../../src/search/retriever.ts","../../src/jev/explanation.ts","../../src/core/resolver.ts","../../src/core/knowledge.ts","../../src/core/quarantine.ts","../../src/core/unknown.ts","../../src/core/outcome.ts","../../src/core/learn.ts","../../src/scanner/engine.ts","../../src/core/relations.ts","../../src/scanner/filesystem.ts","../../src/scanner/markdown.ts","../../src/scanner/git.ts","../../src/scanner/source.ts","../../src/rules/evaluator.ts","../../src/stats/aggregator.ts","../../src/stats/filter.ts","../../src/stats/index.ts","../../src/install/format.ts"],"sourcesContent":["import * as path from 'node:path';\nimport * as readline from 'node:readline/promises';\nimport { Storage } from '../storage/canonical.js';\nimport type {\n AgentInstaller,\n InstallContext,\n InstallOptions,\n InstallResult,\n InstallScope,\n UninstallOptions,\n UninstallResult,\n DoctorReport,\n DoctorFixResult\n} from './types.js';\nimport { getAllAdapters, getAdapter, detectAgents } from './registry.js';\nimport { runDoctor, runDoctorFix } from './doctor.js';\nimport { CURRENT_INTEGRATION_VERSION } from './instructions.js';\n\nexport * from './types.js';\nexport * from './instructions.js';\nexport * from './atomic.js';\nexport * from './ownership.js';\nexport * from './registry.js';\nexport * from './doctor.js';\nexport * from './format.js';\n\nexport interface CliInstallOptions {\n detected?: boolean;\n all?: boolean;\n yes?: boolean;\n global?: boolean;\n dryRun?: boolean;\n force?: boolean;\n projectDir?: string;\n globalDir?: string;\n bilmemCommand?: string;\n bilmemArgs?: string[];\n}\n\nexport interface CliUninstallOptions {\n global?: boolean;\n dryRun?: boolean;\n projectDir?: string;\n globalDir?: string;\n}\n\nexport interface CliDoctorOptions {\n fix?: boolean;\n dryRun?: boolean;\n global?: boolean;\n projectDir?: string;\n globalDir?: string;\n}\n\n/**\n * Creates an InstallContext from CLI arguments.\n */\nexport function createInstallContext(options: {\n scope?: InstallScope;\n global?: boolean;\n projectDir?: string;\n globalDir?: string;\n bilmemCommand?: string;\n bilmemArgs?: string[];\n}): InstallContext {\n const projectDir = path.resolve(options.projectDir || process.cwd());\n const scope: InstallScope = options.global || options.scope === 'global' ? 'global' : 'project';\n return {\n projectDir,\n globalDir: options.globalDir,\n scope,\n bilmemCommand: options.bilmemCommand || 'bilmem',\n bilmemArgs: options.bilmemArgs || ['mcp'],\n storage: new Storage(projectDir)\n };\n}\n\n/**\n * Main handler for `bilmem install [target]`.\n */\nexport async function handleInstallCommand(\n target?: string,\n options: CliInstallOptions = {}\n): Promise<{ success: boolean; results: InstallResult[]; message?: string }> {\n const context = createInstallContext(options);\n const installOptions: InstallOptions = {\n scope: context.scope,\n dryRun: options.dryRun,\n force: options.force\n };\n\n // 1. Explicit target provided (e.g. bilmem install cursor)\n if (target) {\n const adapter = getAdapter(target);\n if (!adapter) {\n const valid = getAllAdapters()\n .map((a) => a.id)\n .join(', ');\n throw new Error(`Unknown agent/editor target \"${target}\". Supported targets: ${valid}`);\n }\n\n const result = await adapter.install(context, installOptions);\n return {\n success: result.success,\n results: [result]\n };\n }\n\n // 2. Target not provided: detection phase\n const allDetected = await detectAgents(context);\n\n if (options.all) {\n // Attempt installation for every supported integration\n const results: InstallResult[] = [];\n for (const item of allDetected) {\n if (!item.detection.detected) {\n results.push({\n id: item.adapter.id,\n name: item.adapter.name,\n success: true,\n scope: context.scope,\n mcpChanged: false,\n instructionChanged: false,\n projectInitialized: false,\n dryRun: options.dryRun,\n actionsTaken: ['Not detected — skipped']\n });\n continue;\n }\n const res = await item.adapter.install(context, installOptions);\n results.push(res);\n }\n return { success: true, results };\n }\n\n const detectedAdapters = allDetected.filter((d) => d.detection.detected).map((d) => d.adapter);\n\n if (detectedAdapters.length === 0) {\n return {\n success: true,\n results: [],\n message: 'No supported agents or editors detected in this project or environment.'\n };\n }\n\n // If --detected or --yes or non-interactive environment, proceed without prompt\n let shouldProceed = Boolean(options.detected || options.yes);\n\n if (!shouldProceed) {\n if (process.stdin.isTTY) {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n try {\n console.log('Detected agents:\\n');\n for (const item of allDetected) {\n const mark = item.detection.detected ? '✓' : '○';\n console.log(` ${mark} ${item.adapter.name}`);\n }\n console.log('');\n const answer = await rl.question('Install Bilmem into detected agents? [Y/n] ');\n const trimmed = answer.trim().toLowerCase();\n shouldProceed = trimmed === '' || trimmed === 'y' || trimmed === 'yes';\n } finally {\n rl.close();\n }\n } else {\n // Non-interactive without --yes: default to proceed if --detected or non-interactive\n shouldProceed = true;\n }\n }\n\n if (!shouldProceed) {\n return {\n success: true,\n results: [],\n message: 'Installation aborted by user.'\n };\n }\n\n const results: InstallResult[] = [];\n for (const adapter of detectedAdapters) {\n const res = await adapter.install(context, installOptions);\n results.push(res);\n }\n\n return { success: true, results };\n}\n\n/**\n * Main handler for `bilmem uninstall <target>`.\n */\nexport async function handleUninstallCommand(\n target: string,\n options: CliUninstallOptions = {}\n): Promise<{ success: boolean; result: UninstallResult }> {\n const context = createInstallContext(options);\n const adapter = getAdapter(target);\n if (!adapter) {\n const valid = getAllAdapters()\n .map((a) => a.id)\n .join(', ');\n throw new Error(`Unknown agent/editor target \"${target}\". Supported targets: ${valid}`);\n }\n\n const uninstallOptions: UninstallOptions = {\n scope: context.scope,\n dryRun: options.dryRun\n };\n\n const result = await adapter.uninstall(context, uninstallOptions);\n return { success: result.success, result };\n}\n\n/**\n * Main handler for `bilmem doctor`.\n */\nexport async function handleDoctorCommand(\n options: CliDoctorOptions = {}\n): Promise<{ report: DoctorReport; fixed?: DoctorFixResult }> {\n const context = createInstallContext(options);\n\n if (options.fix) {\n const fixed = await runDoctorFix(context, options.dryRun ?? false);\n const report = await runDoctor(context);\n return { report, fixed };\n }\n\n const report = await runDoctor(context);\n return { report };\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n Knowledge,\n Evidence,\n Observation,\n UnknownRecord,\n OutcomeRecord,\n EvidenceRelation,\n BilmemConfig,\n BilmemMetrics,\n RuleSet,\n RuleDefinition,\n RevisionSnapshot,\n KnowledgeDiff,\n InvestigationReceipt\n} from '../core/types.js';\nimport type { KnowledgeStoreProvider } from '../search/retriever.js';\nimport {\n loadRuleSetFile,\n stringifyRuleSetYaml,\n findRuleFiles\n} from '../rules/loader.js';\nimport type { MetricEvent } from '../stats/types.js';\nimport { readMetricEvents, resetMetricEvents } from '../stats/events.js';\n\nexport function sanitizeFileName(id: string): string {\n return encodeURIComponent(id).replace(/%/g, '_');\n}\n\nexport function desanitizeFileName(name: string): string {\n try {\n return decodeURIComponent(name.replace(/_/g, '%'));\n } catch {\n return name;\n }\n}\n\nexport class Storage implements KnowledgeStoreProvider {\n private baseDir: string;\n private knowledgeDir: string;\n private evidenceDir: string;\n private observationDir: string;\n private unknownDir: string;\n private rulesDir: string;\n private configFile: string;\n private relationsFile: string;\n private outcomesFile: string;\n private metricsFile: string;\n private revisionsFile: string;\n private knowledgeJsonlFile: string;\n private evidenceJsonlFile: string;\n private observationJsonlFile: string;\n private unknownsJsonlFile: string;\n private receiptsDir: string;\n private receiptsJsonlFile: string;\n private eventsFile: string;\n\n constructor(rootDir: string = process.cwd()) {\n this.baseDir = path.resolve(rootDir, '.bilmem');\n this.knowledgeDir = path.join(this.baseDir, 'knowledge');\n this.evidenceDir = path.join(this.baseDir, 'evidence');\n this.observationDir = path.join(this.baseDir, 'observations');\n this.unknownDir = path.join(this.baseDir, 'unknowns');\n this.rulesDir = path.join(this.baseDir, 'rules');\n this.receiptsDir = path.join(this.baseDir, 'receipts');\n this.configFile = path.join(this.baseDir, 'config.json');\n this.relationsFile = path.join(this.baseDir, 'relations.json');\n this.outcomesFile = path.join(this.baseDir, 'outcomes.jsonl');\n this.metricsFile = path.join(this.baseDir, 'metrics.json');\n this.revisionsFile = path.join(this.baseDir, 'revisions.jsonl');\n this.knowledgeJsonlFile = path.join(this.baseDir, 'knowledge.jsonl');\n this.evidenceJsonlFile = path.join(this.baseDir, 'evidence.jsonl');\n this.observationJsonlFile = path.join(this.baseDir, 'observations.jsonl');\n this.unknownsJsonlFile = path.join(this.baseDir, 'unknowns.jsonl');\n this.receiptsJsonlFile = path.join(this.baseDir, 'receipts.jsonl');\n this.eventsFile = path.join(this.baseDir, 'events.jsonl');\n }\n\n getBaseDir(): string {\n return this.baseDir;\n }\n\n async isInitialized(): Promise<boolean> {\n try {\n await fs.access(this.configFile);\n return true;\n } catch {\n return false;\n }\n }\n\n async init(options: { projectName?: string; defaultScope?: string } = {}): Promise<BilmemConfig> {\n await fs.mkdir(this.knowledgeDir, { recursive: true });\n await fs.mkdir(this.evidenceDir, { recursive: true });\n await fs.mkdir(this.observationDir, { recursive: true });\n await fs.mkdir(this.unknownDir, { recursive: true });\n await fs.mkdir(this.rulesDir, { recursive: true });\n await fs.mkdir(this.receiptsDir, { recursive: true });\n\n let config: BilmemConfig;\n if (await this.isInitialized()) {\n config = await this.getConfig();\n } else {\n config = {\n schemaVersion: 1,\n projectName: options.projectName ?? path.basename(path.dirname(this.baseDir)) ?? 'project',\n defaultScope: options.defaultScope ?? 'project',\n dataDir: this.baseDir\n };\n await this.saveConfig(config);\n }\n\n // Initialize relations & metrics if missing\n try {\n await fs.access(this.relationsFile);\n } catch {\n await fs.writeFile(this.relationsFile, JSON.stringify([], null, 2), 'utf-8');\n }\n\n try {\n await fs.access(this.metricsFile);\n } catch {\n const defaultMetrics: BilmemMetrics = {\n knowledgeHits: 0,\n knowledgeMisses: 0,\n knowledgeReused: 0,\n unknownsResolved: 0,\n repeatedInvestigationsPrevented: 0,\n candidateKnowledgeMerged: 0,\n staleKnowledgeDetected: 0,\n contradictionsDetected: 0,\n knowledgePromoted: 0,\n knowledgeSuperseded: 0\n };\n await fs.writeFile(this.metricsFile, JSON.stringify(defaultMetrics, null, 2), 'utf-8');\n }\n\n return config;\n }\n\n // --- Config ---\n\n async getConfig(): Promise<BilmemConfig> {\n const raw = await fs.readFile(this.configFile, 'utf-8');\n return JSON.parse(raw) as BilmemConfig;\n }\n\n async saveConfig(config: BilmemConfig): Promise<void> {\n await fs.writeFile(this.configFile, JSON.stringify(config, null, 2), 'utf-8');\n }\n\n async updateConfig(updates: Partial<BilmemConfig>): Promise<BilmemConfig> {\n const current = await this.getConfig();\n const updated = { ...current, ...updates };\n await this.saveConfig(updated);\n return updated;\n }\n\n // --- Knowledge ---\n\n async saveKnowledge(knowledge: Knowledge): Promise<void> {\n await fs.mkdir(this.knowledgeDir, { recursive: true });\n const filename = `${sanitizeFileName(knowledge.id)}.json`;\n const filePath = path.join(this.knowledgeDir, filename);\n await fs.writeFile(filePath, JSON.stringify(knowledge, null, 2), 'utf-8');\n await fs.appendFile(this.knowledgeJsonlFile, JSON.stringify(knowledge) + '\\n', 'utf-8');\n }\n\n async getKnowledge(id: string): Promise<Knowledge | undefined> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.knowledgeDir, filename);\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(raw) as Knowledge;\n } catch {\n return undefined;\n }\n }\n\n async getAllKnowledge(): Promise<Knowledge[]> {\n try {\n const files = await fs.readdir(this.knowledgeDir);\n const items: Knowledge[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const raw = await fs.readFile(path.join(this.knowledgeDir, file), 'utf-8');\n try {\n items.push(JSON.parse(raw));\n } catch {\n // Ignore corrupt file\n }\n }\n return items;\n } catch {\n return [];\n }\n }\n\n async deleteKnowledge(id: string): Promise<boolean> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.knowledgeDir, filename);\n try {\n await fs.unlink(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n // --- Evidence ---\n\n async saveEvidence(evidence: Evidence): Promise<void> {\n await fs.mkdir(this.evidenceDir, { recursive: true });\n const filename = `${sanitizeFileName(evidence.id)}.json`;\n const filePath = path.join(this.evidenceDir, filename);\n await fs.writeFile(filePath, JSON.stringify(evidence, null, 2), 'utf-8');\n await fs.appendFile(this.evidenceJsonlFile, JSON.stringify(evidence) + '\\n', 'utf-8');\n }\n\n async getEvidence(id: string): Promise<Evidence | undefined> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.evidenceDir, filename);\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(raw) as Evidence;\n } catch {\n return undefined;\n }\n }\n\n async getAllEvidence(): Promise<Evidence[]> {\n try {\n const files = await fs.readdir(this.evidenceDir);\n const items: Evidence[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const raw = await fs.readFile(path.join(this.evidenceDir, file), 'utf-8');\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n return items;\n } catch {\n return [];\n }\n }\n\n // --- Observations ---\n\n async saveObservation(obs: Observation): Promise<void> {\n await fs.mkdir(this.observationDir, { recursive: true });\n const filename = `${sanitizeFileName(obs.id)}.json`;\n const filePath = path.join(this.observationDir, filename);\n await fs.writeFile(filePath, JSON.stringify(obs, null, 2), 'utf-8');\n await fs.appendFile(this.observationJsonlFile, JSON.stringify(obs) + '\\n', 'utf-8');\n }\n\n async getObservation(id: string): Promise<Observation | undefined> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.observationDir, filename);\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(raw) as Observation;\n } catch {\n return undefined;\n }\n }\n\n async getAllObservations(): Promise<Observation[]> {\n try {\n const files = await fs.readdir(this.observationDir);\n const items: Observation[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const raw = await fs.readFile(path.join(this.observationDir, file), 'utf-8');\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n return items;\n } catch {\n return [];\n }\n }\n\n async deleteObservation(id: string): Promise<boolean> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.observationDir, filename);\n try {\n await fs.unlink(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n // --- Unknowns ---\n\n async saveUnknown(record: UnknownRecord): Promise<void> {\n await fs.mkdir(this.unknownDir, { recursive: true });\n const filename = `${sanitizeFileName(record.id)}.json`;\n const filePath = path.join(this.unknownDir, filename);\n await fs.writeFile(filePath, JSON.stringify(record, null, 2), 'utf-8');\n await fs.appendFile(this.unknownsJsonlFile, JSON.stringify(record) + '\\n', 'utf-8');\n }\n\n async getUnknown(id: string): Promise<UnknownRecord | undefined> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.unknownDir, filename);\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(raw) as UnknownRecord;\n } catch {\n return undefined;\n }\n }\n\n async getAllUnknowns(): Promise<UnknownRecord[]> {\n try {\n const files = await fs.readdir(this.unknownDir);\n const items: UnknownRecord[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const raw = await fs.readFile(path.join(this.unknownDir, file), 'utf-8');\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n return items;\n } catch {\n return [];\n }\n }\n\n async deleteUnknown(id: string): Promise<boolean> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.unknownDir, filename);\n try {\n await fs.unlink(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n // --- Outcomes (Append-oriented log) ---\n\n async appendOutcome(outcome: OutcomeRecord): Promise<void> {\n const line = JSON.stringify(outcome) + '\\n';\n await fs.appendFile(this.outcomesFile, line, 'utf-8');\n if (outcome.knowledgeId) {\n await this.appendMetricEvent({\n type: 'outcome',\n knowledgeId: outcome.knowledgeId,\n result: outcome.result,\n timestamp: Date.now()\n });\n if (outcome.result === 'success') {\n await this.appendMetricEvent({\n type: 'question_resolved',\n questionId: outcome.knowledgeId,\n timestamp: Date.now()\n });\n }\n }\n }\n\n async getAllOutcomes(): Promise<OutcomeRecord[]> {\n try {\n const raw = await fs.readFile(this.outcomesFile, 'utf-8');\n const lines = raw.split('\\n').filter((l) => l.trim().length > 0);\n return lines.map((l) => JSON.parse(l));\n } catch {\n return [];\n }\n }\n\n // --- Metric Events (Append-only local log) ---\n\n async appendMetricEvent(event: MetricEvent): Promise<void> {\n try {\n await fs.mkdir(this.baseDir, { recursive: true });\n await fs.appendFile(this.eventsFile, JSON.stringify(event) + '\\n', 'utf-8');\n } catch {\n // non-fatal\n }\n }\n\n async getMetricEvents(filter?: { sinceTimestamp?: number; knowledgeId?: string }): Promise<MetricEvent[]> {\n return readMetricEvents(path.dirname(this.baseDir), filter);\n }\n\n async resetMetricEvents(): Promise<void> {\n return resetMetricEvents(path.dirname(this.baseDir));\n }\n\n // --- Investigation Receipts ---\n\n async saveReceipt(receipt: InvestigationReceipt): Promise<void> {\n await fs.mkdir(this.receiptsDir, { recursive: true });\n const filename = `${sanitizeFileName(receipt.id)}.json`;\n const filePath = path.join(this.receiptsDir, filename);\n await fs.writeFile(filePath, JSON.stringify(receipt, null, 2), 'utf-8');\n await fs.appendFile(this.receiptsJsonlFile, JSON.stringify(receipt) + '\\n', 'utf-8');\n }\n\n async getReceipt(id: string): Promise<InvestigationReceipt | undefined> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.receiptsDir, filename);\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(raw) as InvestigationReceipt;\n } catch {\n return undefined;\n }\n }\n\n async getAllReceipts(): Promise<InvestigationReceipt[]> {\n try {\n const files = await fs.readdir(this.receiptsDir);\n const items: InvestigationReceipt[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const raw = await fs.readFile(path.join(this.receiptsDir, file), 'utf-8');\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n return items;\n } catch {\n return [];\n }\n }\n\n // --- Relations ---\n\n async getRelations(): Promise<EvidenceRelation[]> {\n try {\n const raw = await fs.readFile(this.relationsFile, 'utf-8');\n return JSON.parse(raw) as EvidenceRelation[];\n } catch {\n return [];\n }\n }\n\n async saveRelations(relations: EvidenceRelation[]): Promise<void> {\n await fs.writeFile(this.relationsFile, JSON.stringify(relations, null, 2), 'utf-8');\n }\n\n // --- Metrics ---\n\n async getMetrics(): Promise<BilmemMetrics> {\n try {\n const raw = await fs.readFile(this.metricsFile, 'utf-8');\n return JSON.parse(raw) as BilmemMetrics;\n } catch {\n return {\n knowledgeHits: 0,\n knowledgeMisses: 0,\n knowledgeReused: 0,\n unknownsResolved: 0,\n repeatedInvestigationsPrevented: 0,\n candidateKnowledgeMerged: 0,\n staleKnowledgeDetected: 0,\n contradictionsDetected: 0,\n knowledgePromoted: 0,\n knowledgeSuperseded: 0\n };\n }\n }\n\n async saveMetrics(metrics: BilmemMetrics): Promise<void> {\n await fs.writeFile(this.metricsFile, JSON.stringify(metrics, null, 2), 'utf-8');\n }\n\n // --- Rules ---\n\n getRulesDir(): string {\n return this.rulesDir;\n }\n\n async loadRuleSets(): Promise<RuleSet[]> {\n const files = await findRuleFiles(path.dirname(this.baseDir), this.rulesDir);\n const sets: RuleSet[] = [];\n for (const f of files) {\n try {\n sets.push(await loadRuleSetFile(f));\n } catch {}\n }\n return sets;\n }\n\n async saveRuleSet(ruleSet: RuleSet, fileName: string = 'default.yml'): Promise<string> {\n await fs.mkdir(this.rulesDir, { recursive: true });\n const cleanName = fileName.endsWith('.yml') || fileName.endsWith('.yaml') ? fileName : `${fileName}.yml`;\n const targetPath = path.join(this.rulesDir, cleanName);\n const yaml = stringifyRuleSetYaml(ruleSet);\n await fs.writeFile(targetPath, yaml, 'utf-8');\n return targetPath;\n }\n\n async addRule(rule: RuleDefinition, fileName: string = 'default.yml'): Promise<string> {\n await fs.mkdir(this.rulesDir, { recursive: true });\n const cleanName = fileName.endsWith('.yml') || fileName.endsWith('.yaml') ? fileName : `${fileName}.yml`;\n const targetPath = path.join(this.rulesDir, cleanName);\n\n let existingSet: RuleSet;\n try {\n existingSet = await loadRuleSetFile(targetPath);\n } catch {\n existingSet = {\n name: path.basename(cleanName, path.extname(cleanName)),\n rules: []\n };\n }\n\n const existingIdx = existingSet.rules.findIndex((r) => r.id === rule.id);\n if (existingIdx >= 0) {\n existingSet.rules[existingIdx] = rule;\n } else {\n existingSet.rules.push(rule);\n }\n\n const yaml = stringifyRuleSetYaml(existingSet);\n await fs.writeFile(targetPath, yaml, 'utf-8');\n return targetPath;\n }\n\n // --- Revisions & Incremental Learning Diff ---\n\n async appendRevision(snapshot: RevisionSnapshot): Promise<void> {\n const line = JSON.stringify(snapshot) + '\\n';\n await fs.appendFile(this.revisionsFile, line, 'utf-8');\n }\n\n async getRevisions(): Promise<RevisionSnapshot[]> {\n try {\n const raw = await fs.readFile(this.revisionsFile, 'utf-8');\n const lines = raw.split('\\n').filter((l) => l.trim().length > 0);\n return lines.map((l) => JSON.parse(l));\n } catch {\n return [];\n }\n }\n\n async getLatestRevision(): Promise<RevisionSnapshot | undefined> {\n const revs = await this.getRevisions();\n return revs.length > 0 ? revs[revs.length - 1] : undefined;\n }\n\n async getDiff(sinceRef?: string): Promise<KnowledgeDiff> {\n const revisions = await this.getRevisions();\n let baselineSnapshot: RevisionSnapshot | undefined;\n let targetSnapshot: RevisionSnapshot | undefined;\n\n if (sinceRef && sinceRef.includes('..')) {\n const [startRef, endRef] = sinceRef.split('..').map((s) => s.trim().toLowerCase());\n baselineSnapshot = revisions.find(\n (r) =>\n r.id.toLowerCase() === startRef ||\n r.commit?.toLowerCase() === startRef ||\n r.commit?.toLowerCase().startsWith(startRef) ||\n r.id.toLowerCase().startsWith(startRef)\n );\n targetSnapshot = revisions.find(\n (r) =>\n r.id.toLowerCase() === endRef ||\n r.commit?.toLowerCase() === endRef ||\n r.commit?.toLowerCase().startsWith(endRef) ||\n r.id.toLowerCase().startsWith(endRef)\n );\n } else if (sinceRef) {\n const cleanRef = sinceRef.trim().toLowerCase();\n baselineSnapshot = revisions.find(\n (r) =>\n r.id.toLowerCase() === cleanRef ||\n r.commit?.toLowerCase() === cleanRef ||\n r.commit?.toLowerCase().startsWith(cleanRef) ||\n r.id.toLowerCase().startsWith(cleanRef)\n );\n } else {\n // If no ref provided, compare against the snapshot before the latest (if available)\n if (revisions.length >= 2) {\n baselineSnapshot = revisions[revisions.length - 2];\n } else if (revisions.length === 1) {\n baselineSnapshot = revisions[0];\n }\n }\n\n const baselineTimestamp = baselineSnapshot?.timestamp ?? '1970-01-01T00:00:00.000Z';\n const baselineTime = new Date(baselineTimestamp).getTime();\n const targetTime = targetSnapshot ? new Date(targetSnapshot.timestamp).getTime() : Date.now();\n\n const inWindow = (time: number) => time >= baselineTime && time <= targetTime;\n\n const allObservations = await this.getAllObservations();\n const allKnowledge = await this.getAllKnowledge();\n const allUnknowns = await this.getAllUnknowns();\n\n let observationsAdded = 0;\n for (const obs of allObservations) {\n const obsTime = new Date(obs.recordedAt || obs.provenance?.timestamp || 0).getTime();\n if (inWindow(obsTime)) {\n observationsAdded++;\n }\n }\n\n let candidatesAdded = 0;\n let strengthenedCount = 0;\n let revisedCount = 0;\n let contradictionCount = 0;\n let invalidatedCount = 0;\n let needsRevalidationCount = 0;\n\n const strengthened: string[] = [];\n const revised: string[] = [];\n const contradictions: string[] = [];\n const invalidated: string[] = [];\n const needsRevalidation: string[] = [];\n\n for (const k of allKnowledge) {\n const createdTime = new Date(k.createdAt).getTime();\n const updatedTime = new Date(k.updatedAt).getTime();\n\n if ((k.status === 'invalid' || k.status === 'invalidated') && inWindow(updatedTime)) {\n invalidatedCount++;\n invalidated.push(k.id);\n continue;\n }\n\n if (k.status === 'contradicted' && inWindow(updatedTime)) {\n contradictionCount++;\n contradictions.push(k.id);\n continue;\n }\n\n if ((k.status === 'needs_revalidation' || k.status === 'stale') && inWindow(updatedTime)) {\n needsRevalidationCount++;\n needsRevalidation.push(k.id);\n continue;\n }\n\n if (inWindow(createdTime)) {\n // Newly added knowledge candidate in this window\n candidatesAdded++;\n } else if (inWindow(updatedTime)) {\n // Pre-existing knowledge revised or strengthened\n if (k.metrics.support_count > 1 || k.confidence >= 0.85 || k.metrics.successful_outcomes > 0) {\n strengthenedCount++;\n strengthened.push(k.id);\n } else {\n revisedCount++;\n revised.push(k.id);\n }\n }\n }\n\n let unknownsCount = 0;\n const unknownsList: string[] = [];\n for (const u of allUnknowns) {\n const uTime = new Date(u.createdAt || u.updatedAt || 0).getTime();\n if (inWindow(uTime)) {\n unknownsCount++;\n unknownsList.push(u.id);\n }\n }\n\n const refLabel = sinceRef ?? (baselineSnapshot ? (baselineSnapshot.commit?.slice(0, 7) || baselineSnapshot.id.slice(0, 7)) : undefined);\n\n return {\n sinceRef: refLabel,\n observationsAdded,\n candidatesAdded,\n strengthenedCount,\n revisedCount,\n contradictionCount,\n unknownsCount,\n needsRevalidationCount,\n invalidatedCount,\n details: {\n strengthened,\n revised,\n contradictions,\n unknowns: unknownsList,\n needsRevalidation,\n invalidated\n }\n };\n }\n}\n\nexport function formatKnowledgeDiff(diff: KnowledgeDiff): string {\n const header = diff.sinceRef ? `Since ${diff.sinceRef}:` : 'Recent knowledge changes:';\n const lines = [\n header,\n '',\n `+ ${diff.observationsAdded} observations`,\n `+ ${diff.candidatesAdded} candidates`,\n `↑ ${diff.strengthenedCount} knowledge strengthened`,\n `~ ${diff.revisedCount} knowledge revised`,\n `! ${diff.contradictionCount} contradiction${diff.contradictionCount === 1 ? '' : 's'}`,\n `? ${diff.unknownsCount ?? 0} unknowns`,\n `× ${diff.needsRevalidationCount ?? 0} knowledge needs revalidation`,\n `- ${diff.invalidatedCount} invalidated`\n ];\n return lines.join('\\n');\n}\n\nexport { Storage as CanonicalStorage };\n\n","import YAML from 'yaml';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { RuleDefinition, RuleSet, KnowledgeType } from '../core/types.js';\n\nexport interface RuleValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Validates whether an object conforms to the RuleDefinition specification.\n */\nexport function validateRuleDefinition(rule: unknown, index: number = 0): string[] {\n const errors: string[] = [];\n if (!rule || typeof rule !== 'object') {\n errors.push(`Rule at index ${index} must be an object.`);\n return errors;\n }\n\n const r = rule as Partial<RuleDefinition>;\n if (!r.id || typeof r.id !== 'string' || !r.id.trim()) {\n errors.push(`Rule at index ${index} requires a non-empty string 'id'.`);\n }\n\n if (!r.statement || typeof r.statement !== 'string' || !r.statement.trim()) {\n errors.push(`Rule '${r.id || index}' requires a non-empty string 'statement'.`);\n }\n\n if (r.type) {\n const validTypes: KnowledgeType[] = [\n 'rule',\n 'convention',\n 'decision',\n 'lesson',\n 'architecture',\n 'fact'\n ];\n if (!validTypes.includes(r.type)) {\n errors.push(`Rule '${r.id || index}' has invalid type '${r.type}'. Allowed: ${validTypes.join(', ')}.`);\n }\n }\n\n if (r.confidence !== undefined) {\n if (typeof r.confidence !== 'number' || r.confidence < 0 || r.confidence > 1) {\n errors.push(`Rule '${r.id || index}' confidence must be a number between 0.0 and 1.0.`);\n }\n }\n\n if (r.positive !== undefined && !Array.isArray(r.positive)) {\n errors.push(`Rule '${r.id || index}' positive cues must be an array of strings.`);\n }\n\n if (r.negative !== undefined && !Array.isArray(r.negative)) {\n errors.push(`Rule '${r.id || index}' negative cues must be an array of strings.`);\n }\n\n return errors;\n}\n\n/**\n * Validates a RuleSet structure.\n */\nexport function validateRuleSet(data: unknown): RuleValidationResult {\n const errors: string[] = [];\n if (!data || typeof data !== 'object') {\n return { valid: false, errors: ['RuleSet content must be an object or an array of rules.'] };\n }\n\n let rules: unknown[] = [];\n if (Array.isArray(data)) {\n rules = data;\n } else if ('rules' in data && Array.isArray((data as any).rules)) {\n rules = (data as any).rules;\n } else if ('id' in data && 'statement' in data) {\n rules = [data];\n } else {\n return { valid: false, errors: ['RuleSet must contain a \"rules\" array or be a list of rule definitions.'] };\n }\n\n if (rules.length === 0) {\n errors.push('RuleSet contains no rules.');\n }\n\n rules.forEach((rule, idx) => {\n errors.push(...validateRuleDefinition(rule, idx));\n });\n\n return {\n valid: errors.length === 0,\n errors\n };\n}\n\n/**\n * Parses a YAML string into a normalized RuleSet.\n */\nexport function parseRuleSetYaml(content: string, sourcePath: string = 'inline.yml'): RuleSet {\n let parsed: unknown;\n try {\n parsed = YAML.parse(content);\n } catch (err: any) {\n throw new Error(`YAML syntax error in ${sourcePath}: ${err.message}`);\n }\n\n const validation = validateRuleSet(parsed);\n if (!validation.valid) {\n throw new Error(`Invalid RuleSet in ${sourcePath}:\\n- ${validation.errors.join('\\n- ')}`);\n }\n\n if (Array.isArray(parsed)) {\n return {\n name: path.basename(sourcePath, path.extname(sourcePath)),\n rules: parsed as RuleDefinition[]\n };\n }\n\n if ('id' in (parsed as any) && 'statement' in (parsed as any) && !('rules' in (parsed as any))) {\n return {\n name: (parsed as any).id,\n rules: [parsed as RuleDefinition]\n };\n }\n\n const set = parsed as RuleSet;\n return {\n name: set.name ?? path.basename(sourcePath, path.extname(sourcePath)),\n version: set.version ?? 1,\n scope: set.scope ?? 'project',\n description: set.description,\n rules: set.rules\n };\n}\n\n/**\n * Formats a RuleSet into clean, Git-friendly YAML.\n */\nexport function stringifyRuleSetYaml(ruleSet: RuleSet): string {\n const payload: Record<string, unknown> = {};\n if (ruleSet.name) payload.name = ruleSet.name;\n if (ruleSet.version !== undefined) payload.version = ruleSet.version;\n if (ruleSet.scope) payload.scope = ruleSet.scope;\n if (ruleSet.description) payload.description = ruleSet.description;\n\n payload.rules = ruleSet.rules.map((r) => {\n const ruleObj: Record<string, unknown> = {\n id: r.id\n };\n if (r.name) ruleObj.name = r.name;\n ruleObj.statement = r.statement;\n if (r.type && r.type !== 'rule') ruleObj.type = r.type;\n if (r.confidence !== undefined && r.confidence !== 0.95) ruleObj.confidence = r.confidence;\n if (r.scope && r.scope !== 'project') ruleObj.scope = r.scope;\n if (r.positive && r.positive.length > 0) ruleObj.positive = r.positive;\n if (r.negative && r.negative.length > 0) ruleObj.negative = r.negative;\n if (r.tags && r.tags.length > 0) ruleObj.tags = r.tags;\n if (r.when && Object.keys(r.when).length > 0) ruleObj.when = r.when;\n if (r.details && Object.keys(r.details).length > 0) ruleObj.details = r.details;\n return ruleObj;\n });\n\n return YAML.stringify(payload, { indent: 2, lineWidth: 100 });\n}\n\n/**\n * Reads and parses a single YAML rule file.\n */\nexport async function loadRuleSetFile(filePath: string): Promise<RuleSet> {\n const content = await fs.readFile(filePath, 'utf-8');\n return parseRuleSetYaml(content, filePath);\n}\n\n/**\n * Finds all rule YAML files in standard bilmem locations.\n */\nexport async function findRuleFiles(rootDir: string, storageRulesDir?: string): Promise<string[]> {\n const candidates: string[] = [];\n\n // 1. Storage rules directory: .bilmem/rules/*.yml, *.yaml\n const rulesDir = storageRulesDir || path.resolve(rootDir, '.bilmem', 'rules');\n try {\n const entries = await fs.readdir(rulesDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && (entry.name.endsWith('.yml') || entry.name.endsWith('.yaml'))) {\n candidates.push(path.join(rulesDir, entry.name));\n }\n }\n } catch {\n // Directory might not exist yet\n }\n\n // 2. Storage root: .bilmem/rules.yml, .bilmem/rules.yaml\n for (const name of ['rules.yml', 'rules.yaml']) {\n const p = path.resolve(rootDir, '.bilmem', name);\n try {\n const st = await fs.stat(p);\n if (st.isFile()) candidates.push(p);\n } catch {}\n }\n\n // 3. Project root: rules.yml, rules.yaml, bilmem.rules.yml, bilmem.rules.yaml\n for (const name of ['bilmem.rules.yml', 'bilmem.rules.yaml', 'rules.yml', 'rules.yaml']) {\n const p = path.resolve(rootDir, name);\n try {\n const st = await fs.stat(p);\n if (st.isFile()) candidates.push(p);\n } catch {}\n }\n\n // Deduplicate canonical paths\n return Array.from(new Set(candidates));\n}\n\n/**\n * Loads and combines all rule sets discovered in project and storage.\n */\nexport async function loadAllProjectRuleSets(\n rootDir: string,\n storageRulesDir?: string\n): Promise<{ ruleSets: RuleSet[]; sourceFiles: string[] }> {\n const files = await findRuleFiles(rootDir, storageRulesDir);\n const ruleSets: RuleSet[] = [];\n const loadedFiles: string[] = [];\n\n for (const file of files) {\n try {\n const set = await loadRuleSetFile(file);\n ruleSets.push(set);\n loadedFiles.push(file);\n } catch (err: any) {\n // Log or keep error context without failing the entire scan\n console.warn(`[bilmem] Warning: Failed to load rule set from ${file}: ${err.message}`);\n }\n }\n\n return { ruleSets, sourceFiles: loadedFiles };\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { MetricEvent } from './types.js';\n\nexport function getEventsFilePath(rootDir: string): string {\n return path.join(rootDir, '.bilmem', 'events.jsonl');\n}\n\n/**\n * Appends a metric event to .bilmem/events.jsonl.\n * Fire-and-forget safe: will not crash caller if filesystem error occurs.\n */\nexport async function appendMetricEvent(\n rootDir: string,\n event: MetricEvent\n): Promise<void> {\n const filePath = getEventsFilePath(rootDir);\n try {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n const line = JSON.stringify(event) + '\\n';\n await fs.appendFile(filePath, line, 'utf-8');\n } catch {\n // Non-fatal logging failure: core operations must never fail due to metric tracking\n }\n}\n\n/**\n * Reads all metric events from .bilmem/events.jsonl with resilience against\n * corrupted tails, empty lines, and malformed entries.\n */\nexport async function readMetricEvents(\n rootDir: string,\n filter?: { sinceTimestamp?: number; knowledgeId?: string }\n): Promise<MetricEvent[]> {\n const filePath = getEventsFilePath(rootDir);\n let raw: string;\n try {\n raw = await fs.readFile(filePath, 'utf-8');\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n return [];\n }\n return [];\n }\n\n const lines = raw.split('\\n');\n const events: MetricEvent[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const parsed = JSON.parse(trimmed) as MetricEvent;\n if (!parsed || typeof parsed !== 'object' || typeof parsed.type !== 'string') {\n continue;\n }\n if (typeof parsed.timestamp !== 'number') {\n continue;\n }\n\n if (filter?.sinceTimestamp !== undefined && parsed.timestamp < filter.sinceTimestamp) {\n continue;\n }\n\n if (filter?.knowledgeId !== undefined) {\n const kid = (parsed as { knowledgeId?: string }).knowledgeId;\n if (kid !== filter.knowledgeId) {\n continue;\n }\n }\n\n events.push(parsed);\n } catch {\n // Gracefully ignore corrupted line / partial write\n continue;\n }\n }\n\n return events;\n}\n\n/**\n * Safely resets only the metric events log.\n * Preserves all knowledge, evidence, unknowns, rules, and receipts.\n */\nexport async function resetMetricEvents(rootDir: string): Promise<void> {\n const filePath = getEventsFilePath(rootDir);\n try {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, '', 'utf-8');\n } catch (err: any) {\n if (err.code !== 'ENOENT') throw err;\n }\n}\n","import * as path from 'node:path';\nimport * as os from 'node:os';\nimport { BaseAgentAdapter } from './base.js';\nimport type { InstallContext, DetectionResult } from '../types.js';\nimport { pathExists, isExecutableInPath } from '../atomic.js';\n\nexport class CursorAdapter extends BaseAgentAdapter {\n readonly id = 'cursor';\n readonly name = 'Cursor';\n\n resolveConfigPath(context: InstallContext): string {\n if (context.scope === 'project') {\n return path.join(context.projectDir, '.cursor', 'mcp.json');\n }\n const home = context.globalDir || os.homedir();\n return path.join(home, '.cursor', 'mcp.json');\n }\n\n resolveInstructionPath(context: InstallContext): string {\n if (context.scope === 'project') {\n return path.join(context.projectDir, '.cursorrules');\n }\n const home = context.globalDir || os.homedir();\n return path.join(home, '.cursorrules');\n }\n\n async detect(context: InstallContext): Promise<DetectionResult> {\n const reasons: string[] = [];\n\n // Project-level signals\n const dotCursor = path.join(context.projectDir, '.cursor');\n const dotCursorrules = path.join(context.projectDir, '.cursorrules');\n const mcpConfig = path.join(context.projectDir, '.cursor', 'mcp.json');\n\n const hasDotCursor = await pathExists(dotCursor);\n const hasCursorrules = await pathExists(dotCursorrules);\n const hasMcp = await pathExists(mcpConfig);\n\n if (hasDotCursor) reasons.push('Found .cursor/ directory');\n if (hasCursorrules) reasons.push('Found .cursorrules file');\n if (hasMcp) reasons.push('Found .cursor/mcp.json file');\n\n // Global / system signals\n const globalHome = context.globalDir || os.homedir();\n const globalCursor = path.join(globalHome, '.cursor');\n const hasGlobalCursor = await pathExists(globalCursor);\n if (hasGlobalCursor) reasons.push(`Found global directory at ${globalCursor}`);\n\n const hasExecutable = await isExecutableInPath('cursor');\n if (hasExecutable) reasons.push('Found \"cursor\" command in PATH');\n\n const detected = reasons.length > 0;\n const confidence =\n hasDotCursor || hasCursorrules || hasMcp\n ? 'high'\n : hasGlobalCursor || hasExecutable\n ? 'medium'\n : 'low';\n\n return {\n detected,\n confidence: detected ? confidence : 'low',\n reasons,\n supportedScopes: this.supportedScopes\n };\n }\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { Storage } from '../../storage/canonical.js';\nimport type {\n AgentInstaller,\n InstallContext,\n InstallOptions,\n InstallResult,\n InstallScope,\n InstallState,\n UninstallOptions,\n UninstallResult,\n VerifyResult,\n DetectionResult\n} from '../types.js';\nimport {\n safeReadJson,\n updateMcpJsonConfig,\n removeMcpJsonConfig,\n updateMarkdownInstructionFile,\n removeMarkdownInstructionFile,\n isExecutableInPath\n} from '../atomic.js';\nimport {\n CURRENT_INTEGRATION_VERSION,\n extractInstructionVersion,\n hasBilmemInstruction,\n getAgentInstructionText\n} from '../instructions.js';\nimport { recordIntegration, removeIntegration } from '../ownership.js';\n\nexport abstract class BaseAgentAdapter implements AgentInstaller {\n abstract readonly id: string;\n abstract readonly name: string;\n readonly supportedScopes: InstallScope[] = ['project', 'global'];\n\n abstract resolveConfigPath(context: InstallContext): string;\n abstract resolveInstructionPath(context: InstallContext): string;\n abstract detect(context: InstallContext): Promise<DetectionResult>;\n\n async inspect(context: InstallContext): Promise<InstallState> {\n const configPath = this.resolveConfigPath(context);\n const instructionPath = this.resolveInstructionPath(context);\n const detection = await this.detect(context);\n\n // Inspect MCP configuration\n const read = await safeReadJson(configPath);\n let mcpConfigured = false;\n let mcpCommandMatches = false;\n\n const targetCommand = context.bilmemCommand || 'bilmem';\n const targetArgs = context.bilmemArgs || ['mcp'];\n\n if (read.exists && !read.error && read.data?.mcpServers?.bilmem) {\n mcpConfigured = true;\n const b = read.data.mcpServers.bilmem;\n mcpCommandMatches =\n b.command === targetCommand &&\n Array.isArray(b.args) &&\n b.args.length === targetArgs.length &&\n b.args.every((v: unknown, i: number) => v === targetArgs[i]);\n }\n\n // Inspect instruction file\n let instructionInstalled = false;\n let instructionVersion: number | undefined;\n\n try {\n const content = await fs.readFile(instructionPath, 'utf-8');\n instructionInstalled = hasBilmemInstruction(content);\n const extracted = extractInstructionVersion(content);\n if (extracted !== null) {\n instructionVersion = extracted;\n }\n } catch {\n // file does not exist\n }\n\n return {\n id: this.id,\n name: this.name,\n detected: detection.detected,\n scope: context.scope,\n mcpConfigured,\n mcpCommandMatches,\n instructionInstalled,\n instructionVersion,\n currentInstructionVersion: CURRENT_INTEGRATION_VERSION,\n configPath,\n instructionPath,\n details: {\n rawConfigExisted: read.exists,\n configError: read.error\n }\n };\n }\n\n async install(context: InstallContext, options: InstallOptions): Promise<InstallResult> {\n if (!this.supportedScopes.includes(options.scope)) {\n throw new Error(`${this.name} does not support ${options.scope} scope.`);\n }\n\n const configPath = this.resolveConfigPath(context);\n const instructionPath = this.resolveInstructionPath(context);\n const actionsTaken: string[] = [];\n const warnings: string[] = [];\n\n // 1. Ensure project-local .bilmem is initialized when in project scope\n let projectInitialized = false;\n if (context.scope === 'project') {\n const storage = context.storage || new Storage(context.projectDir);\n if (!(await storage.isInitialized())) {\n if (!options.dryRun) {\n await storage.init({ projectName: path.basename(context.projectDir) });\n }\n projectInitialized = true;\n actionsTaken.push('Initialized .bilmem/ storage');\n }\n }\n\n // 2. Safe MCP JSON update\n const targetCommand = context.bilmemCommand || 'bilmem';\n const targetArgs = context.bilmemArgs || ['mcp'];\n const mcpRes = await updateMcpJsonConfig(\n configPath,\n targetCommand,\n targetArgs,\n options.dryRun ?? false\n );\n\n if (mcpRes.changed) {\n actionsTaken.push(`Configured Bilmem MCP server (${targetCommand} ${targetArgs.join(' ')}) in ${configPath}`);\n }\n\n // 3. Safe Markdown instruction update\n const instRes = await updateMarkdownInstructionFile(\n instructionPath,\n getAgentInstructionText(CURRENT_INTEGRATION_VERSION),\n options.dryRun ?? false\n );\n\n if (instRes.changed) {\n actionsTaken.push(`Installed/updated agent instruction block in ${instructionPath}`);\n }\n\n // 4. Ownership metadata\n if (context.scope === 'project') {\n await recordIntegration(\n context.projectDir,\n this.id,\n {\n scope: options.scope,\n mcp: true,\n mcpConfigPath: path.relative(context.projectDir, configPath),\n instructions: true,\n instructionPath: path.relative(context.projectDir, instructionPath),\n version: CURRENT_INTEGRATION_VERSION,\n installedAt: new Date().toISOString()\n },\n options.dryRun ?? false\n );\n }\n\n // 5. Check executable availability in PATH\n const resolvable = await isExecutableInPath(targetCommand);\n if (!resolvable && !options.dryRun) {\n warnings.push(`Executable \"${targetCommand}\" is not in system PATH. Ensure it can be run by ${this.name}.`);\n }\n\n const changesMade = mcpRes.changed || instRes.changed || projectInitialized;\n if (!changesMade) {\n actionsTaken.push('Already up to date');\n }\n\n return {\n id: this.id,\n name: this.name,\n success: true,\n scope: options.scope,\n mcpChanged: mcpRes.changed,\n instructionChanged: instRes.changed,\n projectInitialized,\n dryRun: options.dryRun,\n actionsTaken,\n warnings: warnings.length > 0 ? warnings : undefined,\n message: changesMade\n ? `Successfully installed Bilmem for ${this.name}`\n : `Bilmem is already configured for ${this.name}`\n };\n }\n\n async uninstall(context: InstallContext, options: UninstallOptions): Promise<UninstallResult> {\n const configPath = this.resolveConfigPath(context);\n const instructionPath = this.resolveInstructionPath(context);\n const actionsTaken: string[] = [];\n\n // 1. Remove MCP entry\n const mcpRes = await removeMcpJsonConfig(configPath, options.dryRun ?? false);\n if (mcpRes.removed) {\n actionsTaken.push(`Removed Bilmem MCP registration from ${configPath}`);\n }\n\n // 2. Remove instruction block\n const instRes = await removeMarkdownInstructionFile(instructionPath, options.dryRun ?? false);\n if (instRes.removed) {\n actionsTaken.push(`Removed Bilmem instruction block from ${instructionPath}`);\n }\n\n // 3. Clean ownership metadata\n if (context.scope === 'project') {\n await removeIntegration(context.projectDir, this.id, options.dryRun ?? false);\n }\n\n const anyRemoved = mcpRes.removed || instRes.removed;\n if (!anyRemoved) {\n actionsTaken.push('No Bilmem configuration found to remove');\n }\n\n return {\n id: this.id,\n name: this.name,\n success: true,\n scope: options.scope,\n mcpRemoved: mcpRes.removed,\n instructionRemoved: instRes.removed,\n dryRun: options.dryRun,\n actionsTaken,\n message: anyRemoved\n ? `Successfully uninstalled Bilmem from ${this.name}`\n : `No Bilmem configuration found for ${this.name}`\n };\n }\n\n async verify(context: InstallContext): Promise<VerifyResult> {\n const state = await this.inspect(context);\n const issues: string[] = [];\n const recommendations: string[] = [];\n\n let mcpValid = false;\n let instructionValid = false;\n\n if (!state.mcpConfigured) {\n issues.push(`MCP server \"bilmem\" is not configured in ${state.configPath}`);\n recommendations.push(`Run \"bilmem install ${this.id}\" to configure MCP`);\n } else if (!state.mcpCommandMatches) {\n issues.push(`MCP server \"bilmem\" has outdated command in ${state.configPath}`);\n recommendations.push(`Run \"bilmem doctor --fix\" to update MCP configuration`);\n } else {\n mcpValid = true;\n }\n\n if (!state.instructionInstalled) {\n issues.push(`Agent instructions missing from ${state.instructionPath}`);\n recommendations.push(`Run \"bilmem install ${this.id}\" to install instructions`);\n } else if (state.instructionVersion !== CURRENT_INTEGRATION_VERSION) {\n issues.push(\n `Agent instructions version (${state.instructionVersion || 'legacy'}) is outdated (current: ${CURRENT_INTEGRATION_VERSION})`\n );\n recommendations.push(`Run \"bilmem doctor --fix\" to update instructions`);\n } else {\n instructionValid = true;\n }\n\n const targetCommand = context.bilmemCommand || 'bilmem';\n const commandResolvable = await isExecutableInPath(targetCommand);\n if (!commandResolvable) {\n issues.push(`Command \"${targetCommand}\" is not found in PATH`);\n recommendations.push(`Ensure \"${targetCommand}\" is installed globally or in your PATH`);\n }\n\n const valid = mcpValid && instructionValid && commandResolvable;\n\n return {\n valid,\n mcpValid,\n instructionValid,\n commandResolvable,\n issues,\n recommendations\n };\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { BILMEM_START_MARKER, BILMEM_END_MARKER, getAgentInstructionText } from './instructions.js';\n\nexport interface JsonReadResult {\n exists: boolean;\n data?: any;\n raw?: string;\n error?: string;\n}\n\n/**\n * Atomically writes content to a file via a temporary file and rename.\n */\nexport async function writeAtomic(filePath: string, content: string): Promise<void> {\n const dir = path.dirname(filePath);\n await fs.mkdir(dir, { recursive: true });\n\n const tmpPath = `${filePath}.tmp.${Date.now()}.${Math.random().toString(36).slice(2, 8)}`;\n try {\n await fs.writeFile(tmpPath, content, 'utf-8');\n await fs.rename(tmpPath, filePath);\n } catch (err) {\n try {\n await fs.unlink(tmpPath);\n } catch {\n // ignore cleanup errors\n }\n throw err;\n }\n}\n\n/**\n * Safely reads and parses a JSON file without throwing on missing file.\n * Returns error string if JSON syntax is malformed.\n */\nexport async function safeReadJson(filePath: string): Promise<JsonReadResult> {\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n try {\n const data = JSON.parse(raw);\n return { exists: true, data, raw };\n } catch (parseErr: any) {\n return { exists: true, raw, error: parseErr.message };\n }\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n return { exists: false };\n }\n return { exists: true, error: err.message };\n }\n}\n\n/**\n * Safely updates an MCP JSON configuration file by adding/updating the \"bilmem\" entry\n * under \"mcpServers\", preserving all existing top-level keys and other MCP servers.\n */\nexport async function updateMcpJsonConfig(\n filePath: string,\n bilmemCommand: string = 'bilmem',\n bilmemArgs: string[] = ['mcp'],\n dryRun: boolean = false\n): Promise<{ changed: boolean; created: boolean; originalExisted: boolean }> {\n const read = await safeReadJson(filePath);\n\n if (read.error) {\n throw new Error(`Configuration at ${filePath} is invalid JSON: ${read.error}. No changes were made.`);\n }\n\n let configObj: Record<string, any>;\n let created = false;\n\n if (!read.exists) {\n configObj = {\n mcpServers: {\n bilmem: {\n command: bilmemCommand,\n args: [...bilmemArgs]\n }\n }\n };\n created = true;\n if (!dryRun) {\n await writeAtomic(filePath, JSON.stringify(configObj, null, 2) + '\\n');\n }\n return { changed: true, created: true, originalExisted: false };\n }\n\n configObj = typeof read.data === 'object' && read.data !== null ? { ...read.data } : {};\n if (!configObj.mcpServers || typeof configObj.mcpServers !== 'object') {\n configObj.mcpServers = {};\n }\n\n const existingEntry = configObj.mcpServers.bilmem;\n const targetEntry = {\n command: bilmemCommand,\n args: [...bilmemArgs]\n };\n\n const isCurrent =\n existingEntry &&\n existingEntry.command === targetEntry.command &&\n Array.isArray(existingEntry.args) &&\n existingEntry.args.length === targetEntry.args.length &&\n existingEntry.args.every((val: unknown, idx: number) => val === targetEntry.args[idx]);\n\n if (isCurrent) {\n return { changed: false, created: false, originalExisted: true };\n }\n\n configObj.mcpServers = {\n ...configObj.mcpServers,\n bilmem: targetEntry\n };\n\n if (!dryRun) {\n await writeAtomic(filePath, JSON.stringify(configObj, null, 2) + '\\n');\n }\n\n return { changed: true, created: false, originalExisted: true };\n}\n\n/**\n * Safely removes the \"bilmem\" entry from an MCP JSON configuration file,\n * preserving all other settings and servers.\n */\nexport async function removeMcpJsonConfig(\n filePath: string,\n dryRun: boolean = false\n): Promise<{ removed: boolean; fileDeleted: boolean }> {\n const read = await safeReadJson(filePath);\n if (!read.exists) {\n return { removed: false, fileDeleted: false };\n }\n\n if (read.error) {\n throw new Error(`Configuration at ${filePath} is invalid JSON: ${read.error}. No changes were made.`);\n }\n\n const configObj = typeof read.data === 'object' && read.data !== null ? { ...read.data } : {};\n if (!configObj.mcpServers || !configObj.mcpServers.bilmem) {\n return { removed: false, fileDeleted: false };\n }\n\n delete configObj.mcpServers.bilmem;\n\n if (!dryRun) {\n await writeAtomic(filePath, JSON.stringify(configObj, null, 2) + '\\n');\n }\n\n return { removed: true, fileDeleted: false };\n}\n\n/**\n * Safely inserts or updates the managed Bilmem instruction block in a markdown file.\n * Preserves all surrounding content.\n */\nexport async function updateMarkdownInstructionFile(\n filePath: string,\n desiredBlock: string = getAgentInstructionText(),\n dryRun: boolean = false\n): Promise<{ changed: boolean; created: boolean; originalExisted: boolean }> {\n let existingContent = '';\n let exists = false;\n\n try {\n existingContent = await fs.readFile(filePath, 'utf-8');\n exists = true;\n } catch (err: any) {\n if (err.code !== 'ENOENT') throw err;\n }\n\n if (!exists) {\n if (!dryRun) {\n await writeAtomic(filePath, desiredBlock + '\\n');\n }\n return { changed: true, created: true, originalExisted: false };\n }\n\n const markerRegex = /<!--\\s*bilmem:start\\s*-->[\\s\\S]*?<!--\\s*bilmem:end\\s*-->/;\n const match = existingContent.match(markerRegex);\n\n if (match) {\n if (match[0].trim() === desiredBlock.trim()) {\n return { changed: false, created: false, originalExisted: true };\n }\n const updated = existingContent.replace(markerRegex, desiredBlock);\n if (!dryRun) {\n await writeAtomic(filePath, updated);\n }\n return { changed: true, created: false, originalExisted: true };\n }\n\n // Not yet present in existing file: append cleanly\n const trimmed = existingContent.trimEnd();\n const separator = trimmed.length > 0 ? '\\n\\n' : '';\n const updated = `${trimmed}${separator}${desiredBlock}\\n`;\n\n if (!dryRun) {\n await writeAtomic(filePath, updated);\n }\n\n return { changed: true, created: false, originalExisted: true };\n}\n\n/**\n * Safely removes only the managed Bilmem instruction block from a markdown file.\n * Preserves all surrounding user content. If the file contains only the Bilmem block,\n * removes the file.\n */\nexport async function removeMarkdownInstructionFile(\n filePath: string,\n dryRun: boolean = false\n): Promise<{ removed: boolean; fileDeleted: boolean }> {\n let content = '';\n try {\n content = await fs.readFile(filePath, 'utf-8');\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n return { removed: false, fileDeleted: false };\n }\n throw err;\n }\n\n const markerRegex = /<!--\\s*bilmem:start\\s*-->[\\s\\S]*?<!--\\s*bilmem:end\\s*-->\\n?/;\n if (!markerRegex.test(content)) {\n return { removed: false, fileDeleted: false };\n }\n\n const stripped = content.replace(markerRegex, '').trim();\n\n if (stripped.length === 0) {\n // Only contained bilmem instructions; safely delete the empty file\n if (!dryRun) {\n try {\n await fs.unlink(filePath);\n } catch {\n // ignore if already deleted\n }\n }\n return { removed: true, fileDeleted: true };\n }\n\n // User had other instructions; write back their content without bilmem block\n if (!dryRun) {\n await writeAtomic(filePath, stripped + '\\n');\n }\n\n return { removed: true, fileDeleted: false };\n}\n\n/**\n * Checks if a file or directory exists.\n */\nexport async function pathExists(p: string): Promise<boolean> {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Fast cross-platform check whether a command executable is available in PATH.\n */\nexport async function isExecutableInPath(command: string): Promise<boolean> {\n const envPath = process.env.PATH;\n if (!envPath) return false;\n\n const dirs = envPath.split(path.delimiter);\n for (const dir of dirs) {\n if (!dir) continue;\n const fullPath = path.join(dir, command);\n try {\n await fs.access(fullPath, fs.constants.X_OK);\n return true;\n } catch {\n // continue search\n }\n }\n return false;\n}\n","export const CURRENT_INTEGRATION_VERSION = 1;\n\nexport const BILMEM_START_MARKER = '<!-- bilmem:start -->';\nexport const BILMEM_END_MARKER = '<!-- bilmem:end -->';\n\n/**\n * Returns the minimal, token-efficient agent instruction snippet.\n */\nexport function getAgentInstructionText(version: number = CURRENT_INTEGRATION_VERSION): string {\n return `${BILMEM_START_MARKER}\n<!-- bilmem-version: ${version} -->\n## Bilmem Knowledge Runtime\nBilmem is available through MCP.\n\nUse \\`bilmem_resolve\\` when:\n- uncertain about project-specific behavior,\n- multiple plausible approaches exist,\n- existing knowledge may not apply,\n- you are about to perform a broad investigation.\n\nUse \\`bilmem_observe\\` when important new evidence is discovered.\n\nUse \\`bilmem_learn\\` after resolving a meaningful problem or receiving an important user correction.\n\nDo not query Bilmem before every action.\n${BILMEM_END_MARKER}`;\n}\n\n/**\n * Extracts the installed integration version from markdown content, or null if none.\n */\nexport function extractInstructionVersion(content: string): number | null {\n const match = content.match(/<!--\\s*bilmem-version:\\s*(\\d+)\\s*-->/);\n if (match && match[1]) {\n return parseInt(match[1], 10);\n }\n return null;\n}\n\n/**\n * Checks whether content contains a managed Bilmem instruction block.\n */\nexport function hasBilmemInstruction(content: string): boolean {\n return content.includes(BILMEM_START_MARKER) && content.includes(BILMEM_END_MARKER);\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { safeReadJson, writeAtomic } from './atomic.js';\nimport type { IntegrationsMetadata, IntegrationRecord } from './types.js';\n\nexport function getIntegrationsFilePath(rootDir: string): string {\n return path.join(rootDir, '.bilmem', 'integrations.json');\n}\n\n/**\n * Loads the current integrations metadata from .bilmem/integrations.json.\n */\nexport async function loadIntegrationsMetadata(rootDir: string): Promise<IntegrationsMetadata> {\n const metaPath = getIntegrationsFilePath(rootDir);\n const read = await safeReadJson(metaPath);\n if (read.exists && read.data && typeof read.data === 'object') {\n return {\n version: typeof read.data.version === 'number' ? read.data.version : 1,\n integrations: typeof read.data.integrations === 'object' && read.data.integrations !== null\n ? read.data.integrations\n : {}\n };\n }\n return {\n version: 1,\n integrations: {}\n };\n}\n\n/**\n * Saves integrations metadata to .bilmem/integrations.json.\n */\nexport async function saveIntegrationsMetadata(\n rootDir: string,\n meta: IntegrationsMetadata,\n dryRun: boolean = false\n): Promise<void> {\n if (dryRun) return;\n const metaPath = getIntegrationsFilePath(rootDir);\n const content = JSON.stringify(meta, null, 2) + '\\n';\n await writeAtomic(metaPath, content);\n}\n\n/**\n * Records or updates an agent integration in .bilmem/integrations.json.\n */\nexport async function recordIntegration(\n rootDir: string,\n agentId: string,\n record: IntegrationRecord,\n dryRun: boolean = false\n): Promise<void> {\n const meta = await loadIntegrationsMetadata(rootDir);\n const existing = meta.integrations[agentId];\n meta.integrations[agentId] = {\n ...record,\n installedAt: existing?.installedAt || record.installedAt,\n updatedAt: new Date().toISOString()\n };\n await saveIntegrationsMetadata(rootDir, meta, dryRun);\n}\n\n/**\n * Removes an agent integration record from .bilmem/integrations.json.\n */\nexport async function removeIntegration(\n rootDir: string,\n agentId: string,\n dryRun: boolean = false\n): Promise<void> {\n const meta = await loadIntegrationsMetadata(rootDir);\n if (meta.integrations[agentId]) {\n delete meta.integrations[agentId];\n await saveIntegrationsMetadata(rootDir, meta, dryRun);\n }\n}\n\n/**\n * Retrieves the integration record for a specific agent.\n */\nexport async function getIntegrationRecord(\n rootDir: string,\n agentId: string\n): Promise<IntegrationRecord | undefined> {\n const meta = await loadIntegrationsMetadata(rootDir);\n return meta.integrations[agentId];\n}\n","import * as path from 'node:path';\nimport * as os from 'node:os';\nimport { BaseAgentAdapter } from './base.js';\nimport type { InstallContext, DetectionResult } from '../types.js';\nimport { pathExists, isExecutableInPath } from '../atomic.js';\n\nexport class ClaudeAdapter extends BaseAgentAdapter {\n readonly id = 'claude';\n readonly name = 'Claude Code';\n\n resolveConfigPath(context: InstallContext): string {\n if (context.scope === 'project') {\n return path.join(context.projectDir, '.claude', 'mcp.json');\n }\n const home = context.globalDir || os.homedir();\n return path.join(home, '.claude', 'mcp.json');\n }\n\n resolveInstructionPath(context: InstallContext): string {\n if (context.scope === 'project') {\n return path.join(context.projectDir, 'CLAUDE.md');\n }\n const home = context.globalDir || os.homedir();\n return path.join(home, '.claude', 'CLAUDE.md');\n }\n\n async detect(context: InstallContext): Promise<DetectionResult> {\n const reasons: string[] = [];\n\n // Project-level signals\n const dotClaude = path.join(context.projectDir, '.claude');\n const claudeMd = path.join(context.projectDir, 'CLAUDE.md');\n const claudeJson = path.join(context.projectDir, 'claude.json');\n const mcpConfig = path.join(context.projectDir, '.claude', 'mcp.json');\n\n const hasDotClaude = await pathExists(dotClaude);\n const hasClaudeMd = await pathExists(claudeMd);\n const hasClaudeJson = await pathExists(claudeJson);\n const hasMcp = await pathExists(mcpConfig);\n\n if (hasDotClaude) reasons.push('Found .claude/ directory');\n if (hasClaudeMd) reasons.push('Found CLAUDE.md file');\n if (hasClaudeJson) reasons.push('Found claude.json file');\n if (hasMcp) reasons.push('Found .claude/mcp.json file');\n\n // Global / system signals\n const globalHome = context.globalDir || os.homedir();\n const globalClaude = path.join(globalHome, '.claude');\n const hasGlobalClaude = await pathExists(globalClaude);\n if (hasGlobalClaude) reasons.push(`Found global directory at ${globalClaude}`);\n\n const hasExecutable = await isExecutableInPath('claude');\n if (hasExecutable) reasons.push('Found \"claude\" command in PATH');\n\n const detected = reasons.length > 0;\n const confidence =\n hasDotClaude || hasClaudeMd || hasClaudeJson || hasMcp\n ? 'high'\n : hasGlobalClaude || hasExecutable\n ? 'medium'\n : 'low';\n\n return {\n detected,\n confidence: detected ? confidence : 'low',\n reasons,\n supportedScopes: this.supportedScopes\n };\n }\n}\n","import * as path from 'node:path';\nimport * as os from 'node:os';\nimport { BaseAgentAdapter } from './base.js';\nimport type { InstallContext, DetectionResult } from '../types.js';\nimport { pathExists, isExecutableInPath } from '../atomic.js';\n\nexport class CodexAdapter extends BaseAgentAdapter {\n readonly id = 'codex';\n readonly name = 'Codex';\n\n resolveConfigPath(context: InstallContext): string {\n if (context.scope === 'project') {\n return path.join(context.projectDir, '.codex', 'mcp.json');\n }\n const home = context.globalDir || os.homedir();\n return path.join(home, '.codex', 'mcp.json');\n }\n\n resolveInstructionPath(context: InstallContext): string {\n if (context.scope === 'project') {\n return path.join(context.projectDir, 'CODEX.md');\n }\n const home = context.globalDir || os.homedir();\n return path.join(home, '.codex', 'instructions.md');\n }\n\n async detect(context: InstallContext): Promise<DetectionResult> {\n const reasons: string[] = [];\n\n // Project-level signals\n const dotCodex = path.join(context.projectDir, '.codex');\n const codexMd = path.join(context.projectDir, 'CODEX.md');\n const codexJson = path.join(context.projectDir, 'codex.json');\n const mcpConfig = path.join(context.projectDir, '.codex', 'mcp.json');\n\n const hasDotCodex = await pathExists(dotCodex);\n const hasCodexMd = await pathExists(codexMd);\n const hasCodexJson = await pathExists(codexJson);\n const hasMcp = await pathExists(mcpConfig);\n\n if (hasDotCodex) reasons.push('Found .codex/ directory');\n if (hasCodexMd) reasons.push('Found CODEX.md file');\n if (hasCodexJson) reasons.push('Found codex.json file');\n if (hasMcp) reasons.push('Found .codex/mcp.json file');\n\n // Global / system signals\n const globalHome = context.globalDir || os.homedir();\n const globalCodex = path.join(globalHome, '.codex');\n const hasGlobalCodex = await pathExists(globalCodex);\n if (hasGlobalCodex) reasons.push(`Found global directory at ${globalCodex}`);\n\n const hasExecutable = await isExecutableInPath('codex');\n if (hasExecutable) reasons.push('Found \"codex\" command in PATH');\n\n const detected = reasons.length > 0;\n const confidence =\n hasDotCodex || hasCodexMd || hasCodexJson || hasMcp\n ? 'high'\n : hasGlobalCodex || hasExecutable\n ? 'medium'\n : 'low';\n\n return {\n detected,\n confidence: detected ? confidence : 'low',\n reasons,\n supportedScopes: this.supportedScopes\n };\n }\n}\n","import * as path from 'node:path';\nimport * as os from 'node:os';\nimport { BaseAgentAdapter } from './base.js';\nimport type { InstallContext, DetectionResult } from '../types.js';\nimport { pathExists, isExecutableInPath } from '../atomic.js';\n\nexport class GeminiAdapter extends BaseAgentAdapter {\n readonly id = 'gemini';\n readonly name = 'Gemini CLI';\n\n resolveConfigPath(context: InstallContext): string {\n if (context.scope === 'project') {\n return path.join(context.projectDir, '.gemini', 'settings.json');\n }\n const home = context.globalDir || os.homedir();\n return path.join(home, '.gemini', 'settings.json');\n }\n\n resolveInstructionPath(context: InstallContext): string {\n if (context.scope === 'project') {\n return path.join(context.projectDir, 'GEMINI.md');\n }\n const home = context.globalDir || os.homedir();\n return path.join(home, '.gemini', 'GEMINI.md');\n }\n\n async detect(context: InstallContext): Promise<DetectionResult> {\n const reasons: string[] = [];\n\n // Project-level signals\n const dotGemini = path.join(context.projectDir, '.gemini');\n const geminiMd = path.join(context.projectDir, 'GEMINI.md');\n const geminiJson = path.join(context.projectDir, 'gemini.json');\n const settingsJson = path.join(context.projectDir, '.gemini', 'settings.json');\n\n const hasDotGemini = await pathExists(dotGemini);\n const hasGeminiMd = await pathExists(geminiMd);\n const hasGeminiJson = await pathExists(geminiJson);\n const hasSettingsJson = await pathExists(settingsJson);\n\n if (hasDotGemini) reasons.push('Found .gemini/ directory');\n if (hasGeminiMd) reasons.push('Found GEMINI.md file');\n if (hasGeminiJson) reasons.push('Found gemini.json file');\n if (hasSettingsJson) reasons.push('Found .gemini/settings.json file');\n\n // Global / system signals\n const globalHome = context.globalDir || os.homedir();\n const globalGemini = path.join(globalHome, '.gemini');\n const hasGlobalGemini = await pathExists(globalGemini);\n if (hasGlobalGemini) reasons.push(`Found global directory at ${globalGemini}`);\n\n const hasExecutable = await isExecutableInPath('gemini');\n if (hasExecutable) reasons.push('Found \"gemini\" command in PATH');\n\n const detected = reasons.length > 0;\n const confidence =\n hasDotGemini || hasGeminiMd || hasGeminiJson || hasSettingsJson\n ? 'high'\n : hasGlobalGemini || hasExecutable\n ? 'medium'\n : 'low';\n\n return {\n detected,\n confidence: detected ? confidence : 'low',\n reasons,\n supportedScopes: this.supportedScopes\n };\n }\n}\n","import type { AgentInstaller, InstallContext, DetectionResult } from './types.js';\nimport { CursorAdapter } from './adapters/cursor.js';\nimport { ClaudeAdapter } from './adapters/claude.js';\nimport { CodexAdapter } from './adapters/codex.js';\nimport { GeminiAdapter } from './adapters/gemini.js';\n\nexport { CursorAdapter } from './adapters/cursor.js';\nexport { ClaudeAdapter } from './adapters/claude.js';\nexport { CodexAdapter } from './adapters/codex.js';\nexport { GeminiAdapter } from './adapters/gemini.js';\nexport { BaseAgentAdapter } from './adapters/base.js';\n\nconst adapters: AgentInstaller[] = [\n new CursorAdapter(),\n new ClaudeAdapter(),\n new CodexAdapter(),\n new GeminiAdapter()\n];\n\nexport function getAllAdapters(): AgentInstaller[] {\n return [...adapters];\n}\n\nexport function getAdapter(id: string): AgentInstaller | undefined {\n const normalized = id.toLowerCase().trim();\n return adapters.find((a) => a.id.toLowerCase() === normalized);\n}\n\nexport interface DetectedAgent {\n adapter: AgentInstaller;\n detection: DetectionResult;\n}\n\n/**\n * Runs detection across all registered adapters deterministically and cheaply.\n */\nexport async function detectAgents(context: InstallContext): Promise<DetectedAgent[]> {\n const results = await Promise.all(\n adapters.map(async (adapter) => {\n const detection = await adapter.detect(context);\n return { adapter, detection };\n })\n );\n return results;\n}\n","import * as path from 'node:path';\nimport { Storage } from '../storage/canonical.js';\nimport { createBilmemMcpApp } from '../mcp/server.js';\nimport { getAllAdapters } from './registry.js';\nimport type {\n InstallContext,\n DoctorReport,\n DoctorFixResult,\n CoreDoctorReport,\n AgentDoctorReport\n} from './types.js';\nimport { CURRENT_INTEGRATION_VERSION } from './instructions.js';\nimport { isExecutableInPath } from './atomic.js';\n\nexport async function runDoctor(context: InstallContext): Promise<DoctorReport> {\n const storage = context.storage || new Storage(context.projectDir);\n let isInit = false;\n let knowledgeCount = 0;\n\n try {\n isInit = await storage.isInitialized();\n if (isInit) {\n const items = await storage.getAllKnowledge();\n knowledgeCount = items.length;\n }\n } catch {\n // ignore\n }\n\n // Core checks\n let mcpRuntimeStatus: 'ok' | 'warning' | 'error' = 'ok';\n let mcpRuntimeDetails: string | undefined;\n try {\n const app = createBilmemMcpApp({ rootDir: context.projectDir });\n if (!app) {\n mcpRuntimeStatus = 'error';\n mcpRuntimeDetails = 'Failed to instantiate McpApp';\n }\n } catch (err: any) {\n mcpRuntimeStatus = 'error';\n mcpRuntimeDetails = err.message;\n }\n\n const core: CoreDoctorReport = {\n storage: {\n initialized: isInit,\n path: storage.getBaseDir(),\n status: isInit ? 'ok' : 'warning',\n details: isInit ? undefined : 'Storage not initialized in current project (.bilmem/)'\n },\n knowledge: {\n count: knowledgeCount,\n status: 'ok',\n details: `${knowledgeCount} knowledge item(s)`\n },\n searchIndex: {\n status: isInit ? 'ok' : 'warning',\n details: isInit ? 'Search index ready' : 'Requires project initialization'\n },\n mcpRuntime: {\n status: mcpRuntimeStatus,\n details: mcpRuntimeDetails || 'mcponce runtime ready'\n }\n };\n\n // Agent checks\n const targetCommand = context.bilmemCommand || 'bilmem';\n const commandResolvable = await isExecutableInPath(targetCommand);\n\n const agents: AgentDoctorReport[] = [];\n let issuesCount = 0;\n let canFix = false;\n\n const adapters = getAllAdapters();\n for (const adapter of adapters) {\n const state = await adapter.inspect(context);\n\n let mcpStatus: 'ok' | 'missing' | 'outdated' | 'error' = 'missing';\n let mcpDetails: string | undefined;\n\n if (state.details?.configError) {\n mcpStatus = 'error';\n mcpDetails = `Invalid JSON: ${state.details.configError}`;\n issuesCount++;\n } else if (state.mcpConfigured && state.mcpCommandMatches) {\n mcpStatus = 'ok';\n } else if (state.mcpConfigured && !state.mcpCommandMatches) {\n mcpStatus = 'outdated';\n mcpDetails = 'Configured command does not match expected bilmem mcp';\n issuesCount++;\n canFix = true;\n } else {\n mcpStatus = 'missing';\n if (state.detected) {\n issuesCount++;\n canFix = true;\n }\n }\n\n let instStatus: 'ok' | 'missing' | 'outdated' | 'none' = 'none';\n let instDetails: string | undefined;\n\n if (state.instructionInstalled) {\n if (state.instructionVersion === CURRENT_INTEGRATION_VERSION) {\n instStatus = 'ok';\n } else {\n instStatus = 'outdated';\n instDetails = `Version ${state.instructionVersion || 'legacy'} (current: ${CURRENT_INTEGRATION_VERSION})`;\n issuesCount++;\n canFix = true;\n }\n } else {\n instStatus = 'missing';\n if (state.detected) {\n issuesCount++;\n canFix = true;\n }\n }\n\n let cmdStatus: 'ok' | 'warning' | 'error' = 'ok';\n let cmdDetails: string | undefined;\n if (!commandResolvable) {\n cmdStatus = 'warning';\n cmdDetails = `\"${targetCommand}\" is not in PATH`;\n }\n\n agents.push({\n id: adapter.id,\n name: adapter.name,\n detected: state.detected,\n scope: context.scope,\n mcp: { status: mcpStatus, details: mcpDetails },\n instructions: { status: instStatus, details: instDetails },\n command: { status: cmdStatus, details: cmdDetails },\n configPath: state.configPath,\n instructionPath: state.instructionPath\n });\n }\n\n if (!core.storage.initialized) {\n issuesCount++;\n canFix = true;\n }\n\n return {\n core,\n agents,\n issuesCount,\n canFix\n };\n}\n\nexport async function runDoctorFix(\n context: InstallContext,\n dryRun: boolean = false\n): Promise<DoctorFixResult> {\n const storage = context.storage || new Storage(context.projectDir);\n const coreFixed: string[] = [];\n const agentsFixed: Record<string, string[]> = {};\n\n // Fix core if needed\n if (!(await storage.isInitialized())) {\n if (!dryRun) {\n await storage.init({ projectName: path.basename(context.projectDir) });\n }\n coreFixed.push('Initialized .bilmem/ storage repository');\n }\n\n const adapters = getAllAdapters();\n for (const adapter of adapters) {\n const state = await adapter.inspect(context);\n\n // Only fix detected agents or agents that already have partial bilmem configuration\n const shouldFix =\n state.detected || state.mcpConfigured || state.instructionInstalled;\n\n if (!shouldFix) continue;\n\n const needsMcpFix = !state.mcpConfigured || !state.mcpCommandMatches;\n const needsInstFix =\n !state.instructionInstalled ||\n state.instructionVersion !== CURRENT_INTEGRATION_VERSION;\n\n if (needsMcpFix || needsInstFix) {\n const fixResult = await adapter.install(context, {\n scope: context.scope,\n dryRun\n });\n\n if (fixResult.actionsTaken.length > 0) {\n agentsFixed[adapter.name] = fixResult.actionsTaken.filter(\n (a) => a !== 'Already up to date'\n );\n }\n }\n }\n\n return {\n coreFixed,\n agentsFixed,\n dryRun\n };\n}\n","import { McpApp, z } from 'mcponce';\nimport * as path from 'node:path';\nimport { Storage } from '../storage/canonical.js';\nimport { SearchIndex } from '../search/indexer.js';\nimport { Retriever } from '../search/retriever.js';\nimport { formatWhyExplanation, formatWhyHistory } from '../jev/explanation.js';\nimport { resolveEpistemicQuery } from '../core/resolver.js';\nimport { createObservation, createEvidence, reconcileKnowledge, applyReconciliation } from '../core/knowledge.js';\nimport { createUnknown, hasBeenInvestigated } from '../core/unknown.js';\nimport { createOutcome, applyOutcomeToKnowledge } from '../core/outcome.js';\nimport { distillTrajectory, learnFromTrajectory, processUserCorrection } from '../core/learn.js';\nimport { scanRepository } from '../scanner/engine.js';\nimport { runStats } from '../stats/index.js';\nimport type { TaskTrajectory, OutcomeType } from '../core/types.js';\n\nexport interface CreateMcpAppOptions {\n rootDir?: string;\n name?: string;\n version?: string;\n}\n\n/**\n * Creates the official McpApp for bilmem using mcponce.\n */\nexport function createBilmemMcpApp(options: CreateMcpAppOptions = {}): McpApp {\n const rootDir = options.rootDir ? path.resolve(options.rootDir) : process.cwd();\n const storage = new Storage(rootDir);\n const index = new SearchIndex();\n let initialized = false;\n\n async function ensureInitialized() {\n if (!initialized) {\n await storage.init();\n const all = await storage.getAllKnowledge();\n await index.buildIndex(all);\n initialized = true;\n }\n }\n\n const app = new McpApp({\n name: options.name ?? 'bilmem',\n version: options.version ?? '0.1.0'\n });\n\n // Tool: bilmem_resolve (Primary epistemic runtime operation)\n app.tool({\n name: 'bilmem_resolve',\n description: 'Determine if enough is known to answer or act, what contextually does not apply, what is missing, and the cheapest next step to resolve uncertainty.',\n inputSchema: {\n question: z.string().describe('The question, goal, or uncertainty to resolve'),\n positive: z.array(z.string()).optional().describe('Applicable context cues (e.g. server-session, node, postgres)'),\n negative: z.array(z.string()).optional().describe('Inapplicable context cues (e.g. stateless-jwt, browser, sqlite)'),\n scope: z.string().optional().describe('Scope: project, global, or branch:xxx'),\n maxDepth: z.number().optional().describe('Max candidates to inspect (default: 5)')\n },\n handler: async (args) => {\n await ensureInitialized();\n const retriever = new Retriever(index, storage);\n const res = await resolveEpistemicQuery(\n {\n question: args.question,\n positive: args.positive,\n negative: args.negative,\n scope: args.scope,\n maxDepth: args.maxDepth\n },\n storage,\n retriever\n );\n\n return {\n state: res.state,\n known: res.known.map((k) => k.statement || k.id),\n missing: res.missing,\n rejected: res.rejected.map((r) => ({\n id: r.id,\n reason: r.reason\n })),\n checked: res.checked,\n next: res.next,\n fallback: res.fallback\n };\n }\n });\n\n // Tool 1: bilmem_lookup\n app.tool({\n name: 'bilmem_lookup',\n description: 'Lookup reusable knowledge, conventions, and lessons using JEV contextual reranking. Returns compact, highly applicable knowledge units.',\n inputSchema: {\n query: z.string().optional().describe('Query text, intent keywords, or problem description'),\n positive: z.array(z.string()).optional().describe('Contextual positive cues (e.g. node, esm, server-session)'),\n negative: z.array(z.string()).optional().describe('Contextual negative cues (e.g. commonjs, browser)'),\n scope: z.string().optional().describe('Scope: project, global, branch:xxx (defaults to project)'),\n limit: z.number().optional().describe('Maximum number of results to return (default 5)')\n },\n handler: async (args) => {\n await ensureInitialized();\n const retriever = new Retriever(index, storage);\n const results = await retriever.lookup({\n query: args.query,\n positive: args.positive,\n negative: args.negative,\n scope: args.scope,\n limit: args.limit ?? 5\n });\n\n return {\n resultsCount: results.length,\n results: results.map((r) => ({\n id: r.knowledge.id,\n status: r.status,\n score: r.score,\n statement: r.knowledge.statement,\n confidence: r.knowledge.confidence,\n positiveMatches: r.explanation.positiveMatches,\n negativeConflicts: r.explanation.negativeConflicts,\n evidence: r.knowledge.evidence.slice(0, 3)\n }))\n };\n }\n });\n\n // Tool 2: bilmem_observe\n app.tool({\n name: 'bilmem_observe',\n description: 'Record a new observation from code, git, test execution, or environment. Preserves provenance.',\n inputSchema: {\n claim: z.string().describe('What was observed'),\n source: z.string().describe('Source identifier (e.g. file:src/auth.ts#L42, git:commit:81ac23, user:correction)'),\n confidence: z.number().optional().describe('Confidence 0.0 - 1.0 (default: 0.85)'),\n positive: z.array(z.string()).optional().describe('Positive context cues'),\n negative: z.array(z.string()).optional().describe('Negative context cues'),\n details: z.record(z.any()).optional().describe('Optional structured metadata')\n },\n handler: async (args) => {\n await ensureInitialized();\n const obs = createObservation({\n source: args.source,\n claim: args.claim,\n provenance: {\n type: args.source.startsWith('git:') ? 'git' : args.source.startsWith('user:') ? 'user' : 'code',\n path: args.source,\n timestamp: new Date().toISOString()\n },\n confidence: args.confidence ?? 0.85,\n positive: args.positive,\n negative: args.negative,\n details: args.details\n });\n\n await storage.saveObservation(obs);\n const evidence = createEvidence(obs, 'supports');\n await storage.saveEvidence(evidence);\n\n // Reconcile into knowledge\n const existing = await storage.getAllKnowledge();\n const rec = reconcileKnowledge(\n {\n statement: obs.claim,\n positive: obs.positive,\n negative: obs.negative,\n confidence: obs.confidence,\n evidence: [evidence.id, obs.source]\n },\n existing\n );\n\n const { updatedKnowledge, action } = applyReconciliation(\n rec,\n {\n statement: obs.claim,\n positive: obs.positive,\n negative: obs.negative,\n confidence: obs.confidence,\n evidence: [evidence.id, obs.source]\n },\n existing,\n storage\n );\n\n await storage.saveKnowledge(updatedKnowledge);\n await index.upsert(updatedKnowledge);\n\n return {\n observationId: obs.id,\n evidenceId: evidence.id,\n knowledgeId: updatedKnowledge.id,\n reconciliationAction: action,\n reason: rec.reason\n };\n }\n });\n\n // Tool 3: bilmem_learn\n app.tool({\n name: 'bilmem_learn',\n description: 'Learn from a completed task trajectory or explicit user correction. Converts experiences into refined, reusable lessons.',\n inputSchema: {\n goal: z.string().describe('The task or goal that was pursued'),\n taskId: z.string().optional().describe('Task identifier'),\n outcome: z.enum(['success', 'failure', 'reverted', 'neutral']).describe('Outcome of the task'),\n events: z.array(z.object({\n type: z.enum(['search', 'read', 'hypothesis', 'attempt', 'edit', 'test', 'failure', 'revert', 'success', 'ask_user', 'user_correction']),\n description: z.string(),\n path: z.string().optional()\n })).optional().describe('Events that occurred during task execution'),\n userCorrection: z.object({\n topic: z.string(),\n incorrectAssumption: z.string(),\n correctFact: z.string()\n }).optional().describe('Explicit user correction, if any occurred')\n },\n handler: async (args) => {\n await ensureInitialized();\n\n // Case A: User Correction\n if (args.userCorrection) {\n const { observation, knowledge } = processUserCorrection(args.userCorrection);\n await storage.saveObservation(observation);\n await storage.saveEvidence(createEvidence(observation, 'supports'));\n\n const existing = await storage.getAllKnowledge();\n const rec = reconcileKnowledge(knowledge, existing);\n const { updatedKnowledge } = applyReconciliation(rec, knowledge, existing, storage);\n\n await storage.saveKnowledge(updatedKnowledge);\n await index.upsert(updatedKnowledge);\n\n return {\n type: 'user_correction',\n knowledgeId: updatedKnowledge.id,\n statement: updatedKnowledge.statement,\n confidence: updatedKnowledge.confidence\n };\n }\n\n // Case B: Task Trajectory\n if (args.events && args.events.length > 0) {\n const trajectory: TaskTrajectory = {\n taskId: args.taskId ?? `task_${Date.now()}`,\n goal: args.goal,\n events: args.events,\n startedAt: new Date().toISOString(),\n finalOutcome: args.outcome as OutcomeType\n };\n\n const existing = await storage.getAllKnowledge();\n const learningResult = learnFromTrajectory(trajectory, existing);\n\n for (const obs of learningResult.observations) {\n await storage.saveObservation(obs);\n }\n for (const ev of learningResult.evidence) {\n await storage.saveEvidence(ev);\n }\n\n let updatedKnowledge: any;\n let action: any = 'NEW';\n for (const item of learningResult.reconciliations) {\n if (item.appliedKnowledge) {\n await storage.saveKnowledge(item.appliedKnowledge);\n await index.upsert(item.appliedKnowledge);\n updatedKnowledge = item.appliedKnowledge;\n action = item.action;\n }\n }\n\n if (updatedKnowledge) {\n // Record outcome\n const out = createOutcome({\n knowledgeId: updatedKnowledge.id,\n taskId: trajectory.taskId,\n result: args.outcome as OutcomeType,\n context: { positive: updatedKnowledge.positive, negative: updatedKnowledge.negative }\n });\n await storage.appendOutcome(out);\n applyOutcomeToKnowledge(updatedKnowledge, out);\n await storage.saveKnowledge(updatedKnowledge);\n\n return {\n type: 'trajectory_lesson',\n action,\n knowledgeId: updatedKnowledge.id,\n statement: updatedKnowledge.statement,\n confidence: updatedKnowledge.confidence,\n positive: updatedKnowledge.positive,\n negative: updatedKnowledge.negative\n };\n }\n }\n\n return {\n type: 'recorded_outcome',\n status: 'Recorded outcome without new lesson extraction'\n };\n }\n });\n\n // Tool 4: bilmem_explain\n app.tool({\n name: 'bilmem_explain',\n description: 'Explain why a knowledge ID exists: statement, evidence provenance, confidence, support/contradiction history, and applicable context.',\n inputSchema: {\n id: z.string().describe('The knowledge ID to explain'),\n history: z.boolean().optional().describe('Whether to format lifecycle transition history (--history)')\n },\n handler: async (args) => {\n await ensureInitialized();\n const k = await storage.getKnowledge(args.id);\n if (!k) {\n return { error: `Knowledge not found: \"${args.id}\"` };\n }\n\n if (args.history) {\n const historyText = formatWhyHistory(k);\n return {\n id: k.id,\n stage: k.stage,\n status: k.status,\n history: k.history,\n formattedExplanation: historyText\n };\n }\n\n const explanationText = formatWhyExplanation(k);\n return {\n id: k.id,\n statement: k.statement,\n confidence: k.confidence,\n stage: k.stage,\n status: k.status,\n scope: k.scope,\n evidence: k.evidence,\n metrics: k.metrics,\n positive: k.positive,\n negative: k.negative,\n formattedExplanation: explanationText\n };\n }\n });\n\n // Tool 5: bilmem_unknown\n app.tool({\n name: 'bilmem_unknown',\n description: 'Query or record first-class unknowns (NOT_OBSERVED, INSUFFICIENT_EVIDENCE, CONFLICTING_EVIDENCE, UNRESOLVABLE_LOCALLY) to prevent repeating useless investigations.',\n inputSchema: {\n action: z.enum(['query', 'check', 'record', 'resolve']).describe('Action to perform'),\n id: z.string().optional().describe('Unknown ID or query subject'),\n reason: z.enum(['NOT_OBSERVED', 'INSUFFICIENT_EVIDENCE', 'CONFLICTING_EVIDENCE', 'STALE', 'UNRESOLVABLE_LOCALLY']).optional(),\n statement: z.string().optional().describe('Description of the unknown'),\n checked: z.array(z.string()).optional().describe('Paths or files already checked'),\n question: z.string().optional().describe('Clarifying question for the user or next agent')\n },\n handler: async (args) => {\n await ensureInitialized();\n\n if (args.action === 'query') {\n const list = await storage.getAllUnknowns();\n return {\n count: list.length,\n unknowns: list\n };\n }\n\n if (args.action === 'check') {\n const list = await storage.getAllUnknowns();\n const checkResult = hasBeenInvestigated(list, args.id || '');\n return checkResult;\n }\n\n if (args.action === 'record') {\n if (!args.id) throw new Error('ID is required to record an unknown');\n const record = createUnknown({\n id: args.id,\n state: 'UNKNOWN',\n reason: args.reason ?? 'UNRESOLVABLE_LOCALLY',\n statement: args.statement,\n checked: args.checked ?? [],\n next: args.question ? { type: 'ask', question: args.question } : undefined\n });\n await storage.saveUnknown(record);\n return { success: true, recorded: record };\n }\n\n if (args.action === 'resolve') {\n if (!args.id) throw new Error('ID is required to resolve an unknown');\n const deleted = await storage.deleteUnknown(args.id);\n return { success: deleted, resolvedId: args.id };\n }\n\n return { error: 'Unknown action' };\n }\n });\n\n // Tool 6: bilmem_scan\n app.tool({\n name: 'bilmem_scan',\n description: 'Trigger a language-independent scan of the repository filesystem, markdown documentation, and git history.',\n inputSchema: {\n path: z.string().optional().describe('Root directory to scan (defaults to project root)'),\n incremental: z.boolean().optional().describe('Whether to scan incrementally from last scanned git commit')\n },\n handler: async (args) => {\n const targetDir = args.path ? path.resolve(args.path) : rootDir;\n const report = await scanRepository(targetDir, {\n incremental: args.incremental ?? false\n });\n\n // Refresh memory index\n const all = await storage.getAllKnowledge();\n await index.buildIndex(all);\n\n return report;\n }\n });\n\n // Tool 7: bilmem_stats\n app.tool({\n name: 'bilmem_stats',\n description: 'Inspect local-first statistics, knowledge health, and effectiveness metrics (measuring reuse, investigation avoidance, and JEV accuracy). Read-only.',\n inputSchema: {\n since: z.string().optional().describe('Time window (e.g. 24h, 7d, 30d) or Git revision (e.g. HEAD~20, commit-sha)'),\n knowledgeId: z.string().optional().describe('Specific knowledge ID to inspect single-item lifecycle and diagnostics')\n },\n handler: async (args) => {\n await ensureInitialized();\n const res = await runStats({\n rootDir,\n since: args.since,\n knowledgeId: args.knowledgeId\n });\n\n if (res.knowledgeReport) {\n return res.knowledgeReport;\n }\n return res.report;\n }\n });\n\n return app;\n}\n","import { create, insert, remove, search, type AnyOrama } from '@orama/orama';\nimport type { Knowledge } from '../core/types.js';\n\n/**\n * Rebuildable in-memory search index powered by Orama.\n * Note: Orama is strictly a candidate retrieval cache, NEVER the canonical source of truth.\n */\nexport class SearchIndex {\n private db: AnyOrama | null = null;\n private idToDocId = new Map<string, string>();\n\n async init(): Promise<void> {\n this.db = await create({\n schema: {\n id: 'string',\n statement: 'string',\n type: 'string',\n scope: 'string',\n status: 'string',\n positive: 'string[]',\n negative: 'string[]',\n tags: 'string[]'\n }\n });\n this.idToDocId.clear();\n }\n\n async buildIndex(knowledgeList: Knowledge[]): Promise<void> {\n await this.init();\n for (const item of knowledgeList) {\n await this.upsert(item);\n }\n }\n\n async upsert(item: Knowledge): Promise<void> {\n if (!this.db) {\n await this.init();\n }\n\n // If already in index, remove first\n const existingDocId = this.idToDocId.get(item.id);\n if (existingDocId) {\n try {\n await remove(this.db!, existingDocId);\n } catch {\n // Ignore if already deleted\n }\n this.idToDocId.delete(item.id);\n }\n\n const docId = await insert(this.db!, {\n id: item.id,\n statement: item.statement,\n type: item.type,\n scope: item.scope,\n status: item.status,\n positive: item.positive,\n negative: item.negative,\n tags: item.tags ?? []\n });\n\n this.idToDocId.set(item.id, docId);\n }\n\n async delete(id: string): Promise<void> {\n if (!this.db) return;\n const docId = this.idToDocId.get(id);\n if (docId) {\n try {\n await remove(this.db, docId);\n } catch {\n // Ignore\n }\n this.idToDocId.delete(id);\n }\n }\n\n async searchCandidates(term: string, limit = 25): Promise<string[]> {\n if (!this.db) {\n return [];\n }\n\n const cleanTerm = term.trim();\n if (!cleanTerm) {\n return Array.from(this.idToDocId.keys()).slice(0, limit);\n }\n\n try {\n const results = await search(this.db, {\n term: cleanTerm,\n limit,\n threshold: 0.2\n });\n\n return results.hits.map((h) => (h.document as any).id as string);\n } catch {\n // Fallback: term might contain special characters or fail tokenization\n return Array.from(this.idToDocId.keys()).slice(0, limit);\n }\n }\n\n size(): number {\n return this.idToDocId.size;\n }\n}\n\nexport { SearchIndex as OramaIndex };\n\n","import type {\n Knowledge,\n JevMatchStatus,\n JevExplanation,\n JevResult,\n Scope\n} from '../core/types.js';\n\nexport interface QueryContext {\n query?: string;\n positive?: string[];\n negative?: string[];\n scope?: Scope;\n}\n\nconst statementTokenCache = new WeakMap<Knowledge, Set<string>>();\n\nfunction extractTokens(text?: string): Set<string> {\n if (!text) return new Set();\n return new Set(\n text\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2)\n );\n}\n\nfunction getKnowledgeStatementTokens(k: Knowledge): Set<string> {\n let tokens = statementTokenCache.get(k);\n if (!tokens) {\n tokens = extractTokens(k.statement);\n statementTokenCache.set(k, tokens);\n }\n return tokens;\n}\n\n/**\n * Evaluates JEV-style positive and negative contextual proximity for a knowledge unit.\n */\nexport function evaluateJev(\n knowledge: Knowledge,\n context: QueryContext\n): JevResult {\n const queryTokens = extractTokens(context.query);\n const contextPos = new Set((context.positive ?? []).map((p) => p.trim().toLowerCase()));\n const contextNeg = new Set((context.negative ?? []).map((n) => n.trim().toLowerCase()));\n\n const knowPos = new Set((knowledge.positive ?? []).map((p) => p.trim().toLowerCase()));\n const knowNeg = new Set((knowledge.negative ?? []).map((n) => n.trim().toLowerCase()));\n\n // 1. Negative Conflict Detection\n const negativeConflicts: string[] = [];\n\n // Knowledge forbids something present in positive context\n for (const n of knowNeg) {\n if (contextPos.has(n) || queryTokens.has(n)) {\n negativeConflicts.push(`Knowledge forbids \"${n}\", which was present in context`);\n }\n }\n\n // Context forbids something present in knowledge\n for (const p of knowPos) {\n if (contextNeg.has(p)) {\n negativeConflicts.push(`Context forbids \"${p}\", which is required by knowledge`);\n }\n }\n\n // 2. Positive Matches\n const positiveMatches: string[] = [];\n\n // Direct cue overlap\n for (const p of knowPos) {\n if (contextPos.has(p)) {\n positiveMatches.push(`Context cue: ${p}`);\n } else {\n // Check if any query token matches or stems into cue\n for (const q of queryTokens) {\n if (p === q || p.startsWith(q) || q.startsWith(p)) {\n positiveMatches.push(`Query term match: ${p}`);\n break;\n }\n }\n }\n }\n\n // Statement query token overlap\n const stmtTokens = getKnowledgeStatementTokens(knowledge);\n let queryOverlapCount = 0;\n for (const q of queryTokens) {\n let matched = false;\n for (const st of stmtTokens) {\n if (q === st || q.startsWith(st) || st.startsWith(q)) {\n matched = true;\n break;\n }\n }\n if (matched) {\n queryOverlapCount++;\n positiveMatches.push(`Statement term: ${q}`);\n }\n }\n\n // 3. Positive Score Calculation\n const totalCues = Math.max(1, knowPos.size);\n const matchedCuesCount = positiveMatches.filter((m) => m.startsWith('Context cue') || m.startsWith('Query term')).length;\n const cueMatchRatio = matchedCuesCount / totalCues;\n const tokenOverlapScore = queryTokens.size > 0 ? queryOverlapCount / Math.max(1, queryTokens.size) : 0;\n const rawPositiveScore = 0.65 * cueMatchRatio + 0.35 * tokenOverlapScore;\n\n // 4. Scope Alignment\n let scopeMultiplier = 1.0;\n const targetScope = (context.scope ?? 'project').toLowerCase();\n const knowScope = (knowledge.scope ?? 'project').toLowerCase();\n\n if (targetScope === knowScope) {\n scopeMultiplier = 1.0;\n } else if (knowScope === 'global' || targetScope.startsWith(knowScope)) {\n scopeMultiplier = 0.85;\n } else if (knowScope === 'project' && targetScope.startsWith('branch:')) {\n scopeMultiplier = 0.90;\n } else {\n // Mismatched scopes\n scopeMultiplier = 0.30;\n }\n\n // 5. Confidence and Evidence Ratio\n const m = knowledge.metrics;\n const evRatio = (m.support_count + 1) / (m.support_count + 2 * m.contradiction_count + 1);\n const confidenceFactor = knowledge.confidence * evRatio;\n\n // 6. Outcome Boost / Penalty\n let outcomeAdjustment = 0;\n if (m.successful_outcomes > 0) {\n outcomeAdjustment += Math.min(0.10, m.successful_outcomes * 0.03);\n }\n if (m.failed_outcomes > 0) {\n outcomeAdjustment -= Math.min(0.20, m.failed_outcomes * 0.05);\n }\n\n // 7. Base Combined Score\n let score = (rawPositiveScore * 0.45 + confidenceFactor * 0.40 + outcomeAdjustment) * scopeMultiplier;\n\n // Stale or Contradicted Status Penalty\n if (knowledge.status === 'stale') {\n score *= 0.6;\n } else if (knowledge.status === 'contradicted') {\n score *= 0.3;\n } else if (knowledge.status === 'invalid' || knowledge.status === 'superseded') {\n score *= 0.1;\n }\n\n // 8. Negative Conflict Penalty & Decision\n let status: JevMatchStatus = 'POSSIBLE';\n const reasons: string[] = [];\n\n if (negativeConflicts.length > 0) {\n // Severe penalty for negative conflicts\n score = Math.max(0.01, score * 0.2);\n status = 'REJECT';\n reasons.push(`Rejected due to ${negativeConflicts.length} negative contextual conflicts.`);\n } else if (score >= 0.45 && positiveMatches.length > 0) {\n status = 'MATCH';\n reasons.push(`Strong contextual match with ${positiveMatches.length} matching signals.`);\n } else if (score >= 0.25) {\n status = 'POSSIBLE';\n reasons.push(`Potential match; partial contextual overlap.`);\n } else {\n status = 'REJECT';\n reasons.push(`Insufficient contextual match score (${score.toFixed(2)} < 0.25).`);\n }\n\n const finalScore = Math.round(Math.min(1.0, Math.max(0.0, score)) * 100) / 100;\n\n const explanation: JevExplanation = {\n positiveMatches,\n negativeConflicts,\n score: finalScore,\n confidence: knowledge.confidence,\n status,\n reasons\n };\n\n return {\n knowledge,\n status,\n score: finalScore,\n explanation\n };\n}\n","import type { Knowledge, JevResult } from '../core/types.js';\nimport { evaluateJev, type QueryContext } from './scorer.js';\n\n/**\n * Re-ranks a small set of candidate knowledge units using JEV contextual evaluation.\n */\nexport function rerankCandidates(\n candidates: Knowledge[],\n context: QueryContext\n): JevResult[] {\n const results: JevResult[] = [];\n\n for (const candidate of candidates) {\n const res = evaluateJev(candidate, context);\n results.push(res);\n }\n\n // Sort: MATCH first, then POSSIBLE, then REJECT; within each group, highest score first\n const statusPriority: Record<string, number> = {\n MATCH: 3,\n POSSIBLE: 2,\n REJECT: 1\n };\n\n results.sort((a, b) => {\n const prioDiff = (statusPriority[b.status] ?? 0) - (statusPriority[a.status] ?? 0);\n if (prioDiff !== 0) return prioDiff;\n const scoreDiff = b.score - a.score;\n if (Math.abs(scoreDiff) > 0.001) return scoreDiff;\n return b.knowledge.confidence - a.knowledge.confidence;\n });\n\n return results;\n}\n","import type { Knowledge, JevResult, Scope } from '../core/types.js';\nimport { rerankCandidates } from '../jev/matcher.js';\nimport type { QueryContext } from '../jev/scorer.js';\nimport type { SearchIndex } from './indexer.js';\n\nexport interface LookupOptions {\n query?: string;\n positive?: string[];\n negative?: string[];\n scope?: Scope;\n limit?: number;\n includeRejected?: boolean;\n}\n\nexport interface KnowledgeStoreProvider {\n getKnowledge(id: string): Promise<Knowledge | undefined>;\n getAllKnowledge(): Promise<Knowledge[]>;\n}\n\nexport class Retriever {\n constructor(\n private index: SearchIndex,\n private store: KnowledgeStoreProvider\n ) {}\n\n /**\n * Executes the full Bilmem retrieval pipeline:\n * 1. Query / Context\n * 2. Candidate retrieval (small candidate set)\n * 3. JEV contextual reranking\n * 4. MATCH / POSSIBLE / REJECT classification with explanations\n */\n async lookup(options: LookupOptions = {}): Promise<JevResult[]> {\n const limit = options.limit ?? 5;\n const query = options.query?.trim() ?? '';\n const positive = options.positive ?? [];\n const negative = options.negative ?? [];\n const scope = options.scope ?? 'project';\n\n const searchTerms: string[] = [];\n if (query) searchTerms.push(query);\n if (positive.length > 0) searchTerms.push(...positive.slice(0, 3));\n\n const searchTerm = searchTerms.join(' ').trim();\n\n // 1. Retrieve Candidate IDs from Orama\n let candidateIds = await this.index.searchCandidates(searchTerm, 30);\n\n // If no candidate found via search or empty term, get active items from store\n let candidates: Knowledge[] = [];\n if (candidateIds.length === 0) {\n const all = await this.store.getAllKnowledge();\n candidates = all.filter((k) => k.status !== 'invalid' && k.status !== 'superseded');\n } else {\n for (const id of candidateIds) {\n const item = await this.store.getKnowledge(id);\n if (item && item.status !== 'invalid' && item.status !== 'superseded') {\n candidates.push(item);\n }\n }\n\n // If candidates are very few (< 5), broaden candidate pool with active knowledge\n if (candidates.length < 5) {\n const all = await this.store.getAllKnowledge();\n for (const k of all) {\n if (!candidateIds.includes(k.id) && k.status !== 'invalid' && k.status !== 'superseded') {\n candidates.push(k);\n if (candidates.length >= 20) break;\n }\n }\n }\n }\n\n // 2. JEV Reranking on Candidates\n const queryContext: QueryContext = {\n query,\n positive,\n negative,\n scope\n };\n\n const reranked = rerankCandidates(candidates, queryContext);\n\n // 3. Filter by includeRejected and limit\n const filtered = options.includeRejected\n ? reranked\n : reranked.filter((r) => r.status !== 'REJECT');\n\n return filtered.slice(0, limit);\n }\n}\n\nexport { Retriever as BilmemRetriever };\n\n","import type { JevResult, Knowledge } from '../core/types.js';\n\n/**\n * Formats a JevResult into a clear, inspectable explanation string.\n */\nexport function formatJevExplanation(result: JevResult): string {\n const k = result.knowledge;\n const exp = result.explanation;\n\n const lines: string[] = [\n `${exp.status}: ${k.id} (Score: ${exp.score.toFixed(2)})`,\n ''\n ];\n\n lines.push('positive:');\n if (exp.positiveMatches.length > 0) {\n for (const p of exp.positiveMatches) {\n lines.push(` + ${p}`);\n }\n } else {\n lines.push(' none');\n }\n\n lines.push('');\n lines.push('negative conflicts:');\n if (exp.negativeConflicts.length > 0) {\n for (const n of exp.negativeConflicts) {\n lines.push(` - ${n}`);\n }\n } else {\n lines.push(' none');\n }\n\n lines.push('');\n lines.push(`confidence:`);\n lines.push(` ${k.confidence.toFixed(2)}`);\n\n if (exp.reasons.length > 0) {\n lines.push('');\n lines.push(`rationale:`);\n for (const r of exp.reasons) {\n lines.push(` • ${r}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Formats full \"bilmem why <id>\" detailed output.\n */\nexport function formatWhyExplanation(knowledge: Knowledge): string {\n const lines: string[] = [\n `${knowledge.id}`,\n '',\n 'Statement:',\n knowledge.statement,\n '',\n 'Evidence:'\n ];\n\n if (knowledge.evidence.length > 0) {\n for (const e of knowledge.evidence) {\n lines.push(`- ${e}`);\n }\n } else {\n lines.push('- (No direct source references recorded)');\n }\n\n lines.push('');\n lines.push(`Supports: ${knowledge.metrics.support_count}`);\n lines.push(`Contradictions: ${knowledge.metrics.contradiction_count}`);\n lines.push(`Outcomes: ${knowledge.metrics.successful_outcomes} success, ${knowledge.metrics.failed_outcomes} failed`);\n lines.push(`Confidence: ${knowledge.confidence.toFixed(2)}`);\n lines.push(`Scope: ${knowledge.scope}`);\n lines.push(`Status: ${knowledge.status}`);\n\n if (knowledge.positive.length > 0) {\n lines.push('');\n lines.push('Applicable because (positive cues):');\n for (const p of knowledge.positive) {\n lines.push(`+ ${p}`);\n }\n }\n\n if (knowledge.negative.length > 0) {\n lines.push('');\n lines.push('Rejected contexts (negative cues):');\n for (const n of knowledge.negative) {\n lines.push(`- ${n}`);\n }\n }\n\n if (knowledge.relations.length > 0) {\n lines.push('');\n lines.push('Relations:');\n for (const r of knowledge.relations) {\n lines.push(`~ ${r}`);\n }\n }\n\n if (knowledge.temporal?.revision) {\n lines.push('');\n lines.push(`Revision: ${knowledge.temporal.revision}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Formats lifecycle history for \"bilmem why <id> --history\".\n */\nexport function formatWhyHistory(knowledge: Knowledge): string {\n const lines: string[] = [knowledge.id, ''];\n\n if (!knowledge.history || knowledge.history.length === 0) {\n const date = knowledge.createdAt ? knowledge.createdAt.split('T')[0] : 'unknown';\n const stageOrStatus = (knowledge.stage || knowledge.status).toUpperCase();\n lines.push(date);\n lines.push(stageOrStatus);\n lines.push(knowledge.statement);\n return lines.join('\\n');\n }\n\n for (let i = 0; i < knowledge.history.length; i++) {\n const entry = knowledge.history[i];\n const date = entry.timestamp ? entry.timestamp.split('T')[0] : 'unknown';\n const stageOrStatus = (entry.stage || entry.status).toUpperCase();\n lines.push(date);\n lines.push(stageOrStatus);\n lines.push(entry.reason || entry.source || 'Updated');\n if (i < knowledge.history.length - 1) {\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n}\n","import type {\n Knowledge,\n InvestigationReceipt,\n ResolutionResult,\n ResolutionState,\n ResolutionReason,\n ResolveOptions,\n NextEvidenceAction,\n ActionType,\n Scope,\n JevResult\n} from './types.js';\nimport { rerankCandidates } from '../jev/index.js';\nimport { SearchIndex } from '../search/indexer.js';\nimport { Retriever } from '../search/retriever.js';\nimport type { Storage } from '../storage/canonical.js';\n\n/**\n * Relative cost table for evidence-gathering actions.\n * Smallest action likely to resolve uncertainty is preferred.\n */\nexport const RELATIVE_COSTS: Record<ActionType, number> = {\n USE_KNOWLEDGE: 1,\n INSPECT_TEST: 2,\n INSPECT_FILE: 2,\n INSPECT_SYMBOL: 2.5,\n CHECK_DOCUMENTATION: 2.5,\n CHECK_GIT: 3,\n SEARCH_REPOSITORY: 4,\n ASK_USER: 3.5, // Context-dependent; cheaper than broad scan when specifically targeted\n STOP: 1\n};\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2);\n}\n\n/**\n * Core Epistemic Resolver:\n * Answers: \"Do I know enough to act, what do I know does not apply,\n * what am I missing, and what is the cheapest next step to resolve the uncertainty?\"\n */\nexport async function resolveEpistemicQuery(\n options: ResolveOptions,\n storage: Storage,\n retriever?: Retriever | SearchIndex\n): Promise<ResolutionResult> {\n const question = options.question.trim();\n const positive = (options.positive ?? []).map((p) => p.trim().toLowerCase());\n const negative = (options.negative ?? []).map((n) => n.trim().toLowerCase());\n const scope = options.scope ?? 'project';\n\n // 1. Context Extraction: extract keywords from the question + explicit cues\n const queryTokens = tokenize(question);\n const contextualCues = Array.from(new Set([...positive, ...queryTokens]));\n\n // 2. Candidate Retrieval & 3. JEV Applicability Filtering\n const allKnowledge = await storage.getAllKnowledge();\n let jevResults: JevResult[];\n\n if (retriever instanceof Retriever) {\n jevResults = await retriever.lookup({\n query: question,\n positive: options.positive,\n negative: options.negative,\n scope,\n limit: options.limit ?? 25,\n includeRejected: true\n });\n } else {\n let candidatePool: Knowledge[] = [];\n if (retriever instanceof SearchIndex) {\n const queryTerm = queryTokens.slice(0, 5).join(' ');\n const ids = await retriever.searchCandidates(queryTerm, 30);\n for (const id of ids) {\n const item = await storage.getKnowledge(id);\n if (item) candidatePool.push(item);\n }\n }\n if (candidatePool.length === 0) {\n candidatePool = allKnowledge;\n }\n for (const k of allKnowledge) {\n if (!candidatePool.some((c) => c.id === k.id) && k.positive.some((p) => contextualCues.includes(p))) {\n candidatePool.push(k);\n }\n }\n jevResults = rerankCandidates(candidatePool, {\n positive: options.positive,\n negative: options.negative,\n scope\n });\n }\n\n const matchingItems: Knowledge[] = [];\n const rejectedItems: Array<{ id: string; reason: string }> = [];\n\n for (const res of jevResults) {\n let jevReason = 'INSUFFICIENT_CONTEXT';\n if (res.explanation.negativeConflicts.length > 0) {\n jevReason = 'HARD_NEGATIVE';\n } else if (res.explanation.reasons.some((r) => r.toLowerCase().includes('scope'))) {\n jevReason = 'SCOPE_MISMATCH';\n } else if (res.knowledge.status === 'stale' || res.knowledge.status === 'needs_revalidation') {\n jevReason = 'STALE_KNOWLEDGE';\n }\n\n await storage.appendMetricEvent({\n type: 'jev_result',\n knowledgeId: res.knowledge.id,\n result: res.status,\n reason: jevReason,\n timestamp: Date.now()\n });\n\n if (jevReason === 'HARD_NEGATIVE') {\n await storage.appendMetricEvent({\n type: 'jev_hard_negative',\n knowledgeId: res.knowledge.id,\n timestamp: Date.now()\n });\n }\n\n if (res.status === 'REJECT') {\n const conflictMsg = res.explanation.negativeConflicts.length > 0\n ? `${res.explanation.negativeConflicts.join(', ')} conflicts with current context`\n : (res.explanation.reasons[0] || 'Context mismatch');\n rejectedItems.push({\n id: res.knowledge.id,\n reason: conflictMsg\n });\n } else if (res.status === 'MATCH' || res.status === 'POSSIBLE') {\n matchingItems.push(res.knowledge);\n }\n }\n\n // 4. Retrieve Past Investigation Receipts to Avoid Redundant Work\n const receipts = await storage.getAllReceipts();\n const previouslyChecked = new Set<string>();\n const previouslyRejectedTargets = new Map<string, string>();\n\n // Find receipts relating to this question or overlapping context\n for (const r of receipts) {\n const qOverlap = tokenize(r.question).filter((t) => queryTokens.includes(t));\n if (qOverlap.length >= 2 || (r.positive && r.positive.some((p) => contextualCues.includes(p)))) {\n await storage.appendMetricEvent({\n type: 'investigation_reused',\n investigationId: r.id,\n timestamp: Date.now()\n });\n for (const c of r.checked) {\n previouslyChecked.add(c);\n }\n for (const rej of r.rejected) {\n previouslyRejectedTargets.set(rej.target, rej.reason);\n }\n }\n }\n\n // Add paths from existing evidence of matching items to checked list\n for (const m of matchingItems) {\n for (const ev of m.evidence) {\n previouslyChecked.add(ev.replace(/^(code|file|test|doc):/, ''));\n }\n if (m.depends_on) {\n for (const dep of m.depends_on) {\n previouslyChecked.add(dep.replace(/^(code|file|test|doc):/, ''));\n }\n }\n }\n\n // 5. Evidence & Staleness Evaluation\n const staleCandidates = matchingItems.filter((k) => k.status === 'needs_revalidation' || k.status === 'stale');\n const contradictedCandidates = matchingItems.filter((k) => k.status === 'contradicted');\n const activeCandidates = matchingItems.filter(\n (k) =>\n (k.status === 'active' || k.stage === 'active' || k.stage === 'probation') &&\n k.status !== 'needs_revalidation' &&\n k.status !== 'stale' &&\n k.status !== 'contradicted' &&\n k.status !== 'invalid' &&\n k.status !== 'superseded'\n );\n\n // 6. Question Memory: Check if a learned QUESTION exists for this uncertainty pattern\n const questionKnowledge = allKnowledge.filter((k) => k.type === 'question');\n let learnedQuestionToAsk: { question: string; targetTopic: string; reason: string } | undefined;\n\n for (const qk of questionKnowledge) {\n const matchesCues = qk.positive.some((p) => contextualCues.includes(p));\n const conflicts = qk.negative.some((n) => negative.includes(n));\n if (matchesCues && !conflicts && qk.question) {\n learnedQuestionToAsk = {\n question: qk.question,\n targetTopic: qk.resolves?.[0] || 'uncertainty',\n reason: `Learned question for [${qk.positive.join(', ')}] uncertainty`\n };\n break;\n }\n }\n\n // 7. Missing Aspects / Gap Analysis\n const coveredTokens = new Set<string>();\n for (const k of activeCandidates) {\n for (const t of tokenize(k.statement)) coveredTokens.add(t);\n for (const p of k.positive) coveredTokens.add(p);\n }\n\n const missingAspects: string[] = [];\n for (const qt of queryTokens) {\n if (!['how', 'what', 'why', 'when', 'where', 'are', 'the', 'for', 'with', 'does', 'from'].includes(qt)) {\n if (!coveredTokens.has(qt)) {\n missingAspects.push(qt);\n }\n }\n }\n\n // 8. Determine Resolution State\n let state: ResolutionState = 'UNKNOWN';\n let reason: ResolutionReason | undefined;\n\n if (activeCandidates.length === 0 && staleCandidates.length > 0) {\n state = 'STALE';\n reason = 'STALE_EVIDENCE';\n } else if (activeCandidates.length === 0 && contradictedCandidates.length > 0) {\n state = 'CONFLICTED';\n reason = 'CONFLICTING_EVIDENCE';\n } else if (activeCandidates.length === 0) {\n state = 'UNKNOWN';\n reason = rejectedItems.length > 0 && matchingItems.length === 0 ? 'CONTEXT_MISMATCH' : 'NOT_OBSERVED';\n } else if (missingAspects.length === 0 && activeCandidates.some((k) => k.confidence >= 0.85)) {\n state = 'KNOWN';\n } else {\n state = 'PARTIALLY_KNOWN';\n reason = 'INSUFFICIENT_EVIDENCE';\n }\n\n // 9. Deterministic Next Evidence Action Planner\n const checkedArray = Array.from(previouslyChecked);\n let nextAction: NextEvidenceAction | undefined;\n let fallback: ResolutionResult['fallback'];\n\n if (state === 'KNOWN') {\n nextAction = {\n type: 'USE_KNOWLEDGE',\n target: activeCandidates[0].id,\n reason: `Sufficient high-confidence knowledge available (${activeCandidates[0].id})`,\n relativeCost: RELATIVE_COSTS.USE_KNOWLEDGE,\n expectedInfoGain: 0.95\n };\n } else if (state === 'CONFLICTED') {\n nextAction = {\n type: 'ASK_USER',\n reason: 'Opposing credible knowledge requires contextual disambiguation',\n relativeCost: RELATIVE_COSTS.ASK_USER,\n expectedInfoGain: 0.9\n };\n fallback = {\n type: 'ask',\n question: `Conflicting conventions exist for \"${question}\". Which context applies?`\n };\n } else if (state === 'STALE') {\n const staleItem = staleCandidates[0];\n const targetSource = staleItem.depends_on?.[0] || staleItem.evidence[0] || 'source';\n nextAction = {\n type: 'INSPECT_FILE',\n target: targetSource.replace(/^(code|file|test|doc):/, ''),\n reason: `Revalidate stale knowledge (${staleItem.id}) whose dependencies changed`,\n relativeCost: RELATIVE_COSTS.INSPECT_FILE,\n expectedInfoGain: 0.85\n };\n } else {\n // PARTIALLY_KNOWN or UNKNOWN: find cheapest untried action\n // Candidate actions ranked by expected information gain / relative cost\n\n // Priority 1: Learned Question from Question Memory (if high expected value)\n if (learnedQuestionToAsk) {\n nextAction = {\n type: 'ASK_USER',\n reason: learnedQuestionToAsk.reason,\n relativeCost: RELATIVE_COSTS.ASK_USER,\n expectedInfoGain: 0.9\n };\n fallback = {\n type: 'ask',\n question: learnedQuestionToAsk.question\n };\n } else {\n // Priority 2: Check candidate test or file evidence not yet inspected\n const testCandidates = [\n `tests/${queryTokens[0] || 'module'}.test.ts`,\n `test/${queryTokens[0] || 'module'}.test.ts`,\n `tests/session-refresh.test.ts`\n ];\n\n const uninspectedTest = testCandidates.find(\n (t) => !previouslyChecked.has(t) && !previouslyRejectedTargets.has(t)\n );\n\n const fileCandidates = [\n `src/${queryTokens[0] || 'auth'}/${queryTokens[1] || 'index'}.ts`,\n `src/${queryTokens[0] || 'index'}.ts`\n ];\n\n const uninspectedFile = fileCandidates.find(\n (f) => !previouslyChecked.has(f) && !previouslyRejectedTargets.has(f)\n );\n\n for (const t of testCandidates) {\n if (previouslyChecked.has(t)) {\n await storage.appendMetricEvent({\n type: 'source_read_avoided',\n source: t,\n timestamp: Date.now()\n });\n }\n }\n for (const f of fileCandidates) {\n if (previouslyChecked.has(f)) {\n await storage.appendMetricEvent({\n type: 'source_read_avoided',\n source: f,\n timestamp: Date.now()\n });\n }\n }\n\n if (uninspectedTest && missingAspects.some((m) => m.includes('order') || m.includes('test') || m.includes('behavior'))) {\n nextAction = {\n type: 'INSPECT_TEST',\n target: uninspectedTest,\n reason: `Targeted test inspection for unconfirmed aspect: ${missingAspects.join(', ')}`,\n relativeCost: RELATIVE_COSTS.INSPECT_TEST,\n expectedInfoGain: 0.8\n };\n } else if (uninspectedFile) {\n nextAction = {\n type: 'INSPECT_FILE',\n target: uninspectedFile,\n reason: `Direct source inspection for missing context: ${missingAspects.join(', ')}`,\n relativeCost: RELATIVE_COSTS.INSPECT_FILE,\n expectedInfoGain: 0.75\n };\n } else {\n // Fallback to targeted symbol/repository search\n nextAction = {\n type: 'SEARCH_REPOSITORY',\n target: missingAspects.slice(0, 3).join(' ') || question,\n reason: `Targeted search for unobserved aspects: ${missingAspects.join(', ')}`,\n relativeCost: RELATIVE_COSTS.SEARCH_REPOSITORY,\n expectedInfoGain: 0.6\n };\n }\n\n fallback = {\n type: 'ask',\n question: `Could you clarify: ${question}? (Missing: ${missingAspects.join(', ') || 'specifics'})`\n };\n }\n }\n\n // Record Metric Events\n if (state === 'KNOWN' || (nextAction && nextAction.type !== 'SEARCH_REPOSITORY' && nextAction.type !== 'STOP')) {\n await storage.appendMetricEvent({\n type: 'broad_search_avoided',\n targetAction: nextAction?.type,\n timestamp: Date.now()\n });\n }\n\n for (const k of activeCandidates) {\n await storage.appendMetricEvent({\n type: 'knowledge_reused',\n knowledgeId: k.id,\n timestamp: Date.now()\n });\n }\n\n if (learnedQuestionToAsk || fallback?.type === 'ask') {\n await storage.appendMetricEvent({\n type: 'question_suggested',\n question: learnedQuestionToAsk?.question || fallback?.question,\n timestamp: Date.now()\n });\n }\n\n await storage.appendMetricEvent({\n type: 'resolve',\n state,\n action: nextAction?.type,\n question,\n timestamp: Date.now()\n });\n\n // 10. Record Investigation Receipt\n const receiptId = `receipt_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`;\n const receipt: InvestigationReceipt = {\n id: receiptId,\n question,\n checked: checkedArray,\n findings: activeCandidates.map((c) => c.statement),\n rejected: rejectedItems.map((r) => ({ target: r.id, reason: r.reason })),\n missing: missingAspects,\n next: nextAction,\n status: state === 'KNOWN' ? 'resolved' : 'unresolved',\n timestamp: new Date().toISOString(),\n positive,\n negative\n };\n\n await storage.saveReceipt(receipt);\n\n return {\n state,\n reason,\n known: activeCandidates.map((k) => ({\n id: k.id,\n statement: k.statement,\n confidence: k.confidenceTier ?? k.confidence,\n confidenceTier: k.confidenceTier,\n stage: k.stage\n })),\n applicable: positive.length > 0 ? positive : contextualCues.slice(0, 5),\n rejected: rejectedItems,\n missing: missingAspects,\n checked: checkedArray,\n next: nextAction,\n fallback,\n receiptId\n };\n}\n","import { createHash } from 'node:crypto';\nimport type {\n Knowledge,\n KnowledgeType,\n KnowledgeStatus,\n KnowledgeStage,\n KnowledgeHistoryEntry,\n KnowledgeOutcomesSummary,\n Scope,\n Observation,\n Evidence,\n Provenance,\n ReconciliationResult,\n ReconciliationAction,\n ConfidenceTier\n} from './types.js';\nimport { determineInitialStage, calculateKnowledgeValue, evaluatePromotion } from './quarantine.js';\nimport type { MetricEvent } from '../stats/types.js';\n\n/**\n * Deterministic mapping between confidence tiers and normalized float scores.\n * Replaces arbitrary precision floats with explainable thresholds.\n */\nexport function tierToConfidence(tier: ConfidenceTier): number {\n switch (tier) {\n case 'low':\n return 0.50;\n case 'medium':\n return 0.75;\n case 'high':\n return 0.95;\n }\n}\n\nexport function confidenceToTier(score: number): ConfidenceTier {\n if (score >= 0.85) return 'high';\n if (score >= 0.65) return 'medium';\n return 'low';\n}\n\nexport function hashString(input: string): string {\n return createHash('sha256').update(input.trim().toLowerCase()).digest('hex').slice(0, 16);\n}\n\nexport function createObservation(params: {\n source: string;\n claim: string;\n provenance?: Provenance;\n confidence?: number;\n positive?: string[];\n negative?: string[];\n details?: Record<string, unknown>;\n}): Observation {\n const provenance: Provenance = params.provenance ?? {\n type: 'file',\n path: params.source,\n timestamp: new Date().toISOString()\n };\n const contentForHash = `${params.source}:${params.claim}:${provenance.commit || provenance.timestamp || Date.now()}`;\n const id = `obs_${hashString(contentForHash)}`;\n\n return {\n id,\n source: params.source,\n claim: params.claim.trim(),\n provenance,\n confidence: Math.min(1.0, Math.max(0.0, params.confidence ?? 0.8)),\n positive: Array.from(new Set(params.positive?.map((p) => p.trim().toLowerCase()) ?? [])),\n negative: Array.from(new Set(params.negative?.map((n) => n.trim().toLowerCase()) ?? [])),\n details: params.details,\n recordedAt: new Date().toISOString()\n };\n}\n\n/**\n * Creates or consolidates evidence based on underlying source.\n * Crucial constraint: Multiple agents reading the same source must NOT count as independent evidence.\n */\nexport function createEvidence(\n observation: Observation,\n type: 'supports' | 'contradicts' | 'observes' = 'supports'\n): Evidence {\n const sourceHash = hashString(observation.source);\n const id = `evi_${sourceHash}`;\n\n return {\n id,\n source: observation.source,\n sourceHash,\n observationIds: [observation.id],\n type,\n claim: observation.claim,\n provenance: observation.provenance,\n weight: 1.0,\n firstObservedAt: observation.recordedAt,\n lastObservedAt: observation.recordedAt\n };\n}\n\nexport function createKnowledge(params: {\n id: string;\n type?: KnowledgeType;\n status?: KnowledgeStatus;\n stage?: KnowledgeStage;\n statement: string;\n positive?: string[];\n negative?: string[];\n relations?: string[];\n depends_on?: string[];\n resolves?: string[];\n question?: string;\n confidence?: number;\n confidenceTier?: ConfidenceTier;\n evidence?: string[];\n scope?: Scope;\n tags?: string[];\n history?: KnowledgeHistoryEntry[];\n outcomesSummary?: KnowledgeOutcomesSummary;\n}): Knowledge {\n const now = new Date().toISOString();\n const confidenceTier =\n params.confidenceTier ??\n (params.confidence !== undefined ? confidenceToTier(params.confidence) : undefined);\n const confidence =\n params.confidence !== undefined\n ? params.confidence\n : (confidenceTier ? tierToConfidence(confidenceTier) : 0.85);\n\n const dependsOn = new Set<string>(params.depends_on ?? []);\n if (params.evidence) {\n for (const ev of params.evidence) {\n if (ev.startsWith('file:') || ev.startsWith('test:') || ev.startsWith('code:')) {\n dependsOn.add(ev);\n } else if (ev.includes('/') || ev.endsWith('.json') || ev.endsWith('.yaml') || ev.endsWith('.yml')) {\n dependsOn.add(`file:${ev}`);\n }\n }\n }\n\n const initialStage = params.stage ?? determineInitialStage({\n type: params.type ?? 'lesson',\n evidence: params.evidence ?? [],\n confidence\n });\n\n const status = params.status ?? (initialStage === 'candidate' ? 'candidate' : 'active');\n\n const history: KnowledgeHistoryEntry[] = params.history ?? [\n {\n timestamp: now,\n stage: initialStage,\n status,\n reason: `Initial knowledge recorded (${params.type ?? 'lesson'})`,\n source: params.evidence?.[0]\n }\n ];\n\n const knowledgeItem: Knowledge = {\n id: params.id.trim(),\n type: params.type ?? 'lesson',\n status,\n stage: initialStage,\n statement: params.statement.trim(),\n positive: Array.from(new Set(params.positive?.map((p) => p.trim().toLowerCase()) ?? [])),\n negative: Array.from(new Set(params.negative?.map((n) => n.trim().toLowerCase()) ?? [])),\n relations: Array.from(new Set(params.relations?.map((r) => r.trim()) ?? [])),\n depends_on: Array.from(dependsOn),\n resolves: params.resolves ? Array.from(new Set(params.resolves.map((r) => r.trim()))) : undefined,\n question: params.question?.trim(),\n confidence: Math.min(1.0, Math.max(0.0, confidence)),\n confidenceTier,\n evidence: Array.from(new Set(params.evidence ?? [])),\n scope: params.scope ?? 'project',\n tags: Array.from(new Set(params.tags?.map((t) => t.trim().toLowerCase()) ?? [])),\n temporal: {\n revision: 1\n },\n metrics: {\n reuse_count: 0,\n support_count: 1,\n contradiction_count: 0,\n successful_outcomes: 0,\n failed_outcomes: 0\n },\n outcomesSummary: params.outcomesSummary ?? {\n applied: 0,\n successful: 0,\n misleading: 0,\n neutral: 0\n },\n history,\n value: 0,\n createdAt: now,\n updatedAt: now\n };\n\n knowledgeItem.value = calculateKnowledgeValue(knowledgeItem);\n return knowledgeItem;\n}\n\n/**\n * Calculate effective confidence combining evidence ratio and outcome history.\n */\nexport function calculateEffectiveConfidence(knowledge: Knowledge): number {\n const m = knowledge.metrics;\n const base = knowledge.confidence;\n\n // Evidence ratio dampening: heavily penalizes contradictions\n const evRatio = (m.support_count + 1) / (m.support_count + 3 * m.contradiction_count + 1);\n\n const totalOutcomes = m.successful_outcomes + m.failed_outcomes;\n let outRatio = 1.0;\n let evWeight = 0.6;\n let outWeight = 0.4;\n\n if (totalOutcomes === 0) {\n evWeight = 0.85;\n outWeight = 0.15;\n } else {\n outRatio = (m.successful_outcomes + 1) / (totalOutcomes + 1);\n }\n\n const effective = base * (evWeight * evRatio + outWeight * outRatio);\n return Math.round(Math.min(1.0, Math.max(0.05, effective)) * 100) / 100;\n}\n\nconst knowledgeTokenCache = new WeakMap<Knowledge, Set<string>>();\n\n/**\n * Tokenize string into lowercase terms for lexical similarity comparison.\n */\nfunction tokenize(text: string): Set<string> {\n return new Set(\n text\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2)\n );\n}\n\nfunction getCachedTokens(k: Knowledge): Set<string> {\n let tokens = knowledgeTokenCache.get(k);\n if (!tokens) {\n tokens = tokenize(k.statement);\n knowledgeTokenCache.set(k, tokens);\n }\n return tokens;\n}\n\nfunction jaccardSimilarity(setA: Set<string>, setB: Set<string>): number {\n if (setA.size === 0 && setB.size === 0) return 1.0;\n let intersection = 0;\n for (const item of setA) {\n if (setB.has(item)) intersection++;\n }\n const union = setA.size + setB.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n\n/**\n * Known polar antonym word pairs.\n */\nconst POLAR_ANTONYMS: Array<[string, string]> = [\n ['enabled', 'disabled'],\n ['enable', 'disable'],\n ['active', 'inactive'],\n ['true', 'false'],\n ['on', 'off'],\n ['yes', 'no'],\n ['allowed', 'disallowed'],\n ['allowed', 'prohibited'],\n ['allowed', 'forbidden'],\n ['permit', 'deny'],\n ['allow', 'forbid'],\n ['allow', 'prohibit'],\n ['always', 'never'],\n ['should', 'should not'],\n ['must', 'must not'],\n ['required', 'optional'],\n ['required', 'forbidden'],\n ['valid', 'invalid'],\n ['safe', 'unsafe'],\n ['sync', 'async'],\n ['synchronous', 'asynchronous'],\n ['public', 'private']\n];\n\nconst NEGATION_PATTERNS = [\n /\\bnot\\b/i,\n /\\bnever\\b/i,\n /\\bno\\b/i,\n /\\bcannot\\b/i,\n /\\bwithout\\b/i,\n /\\bdisallow\\b/i,\n /\\bforbid\\b/i,\n /\\bprohibit\\b/i,\n /\\bavoid\\b/i\n];\n\n/**\n * Checks if two statements express opposite polarity or semantic contradiction.\n * Essential rule: High lexical similarity does NOT imply MERGE.\n * \"cache enabled in production\" vs \"cache disabled in production\" have opposite polarity.\n */\nexport function detectPolarContradiction(\n stmtA: string,\n stmtB: string\n): { contradicted: boolean; reason?: string } {\n const lowerA = stmtA.toLowerCase();\n const lowerB = stmtB.toLowerCase();\n\n // 1. Check known antonym pairs\n for (const [pos, neg] of POLAR_ANTONYMS) {\n const aHasPos = new RegExp(`\\\\b${pos}\\\\b`, 'i').test(lowerA);\n const aHasNeg = new RegExp(`\\\\b${neg}\\\\b`, 'i').test(lowerA);\n const bHasPos = new RegExp(`\\\\b${pos}\\\\b`, 'i').test(lowerB);\n const bHasNeg = new RegExp(`\\\\b${neg}\\\\b`, 'i').test(lowerB);\n\n if ((aHasPos && bHasNeg) || (aHasNeg && bHasPos)) {\n return {\n contradicted: true,\n reason: `Polar opposite terms detected: '${pos}' vs '${neg}'`\n };\n }\n }\n\n // 2. Check asymmetric negation (one statement has negation, the other does not)\n const aHasNegation = NEGATION_PATTERNS.some((p) => p.test(lowerA));\n const bHasNegation = NEGATION_PATTERNS.some((p) => p.test(lowerB));\n\n if (aHasNegation !== bHasNegation) {\n return {\n contradicted: true,\n reason: 'Asymmetric negation detected (one statement asserts, the other negates)'\n };\n }\n\n return { contradicted: false };\n}\n\n/**\n * Reconcile an incoming candidate lesson with existing knowledge.\n * Classifies the action as: NEW, MERGE, UPDATE, SUPPORT, CONTRADICT, SPECIALIZE, GENERALIZE, IGNORE.\n */\nexport function reconcileKnowledge(\n candidate: Partial<Knowledge> & { statement: string },\n existingList: Knowledge[]\n): ReconciliationResult {\n const candidateId = candidate.id?.trim();\n const candidateStmt = candidate.statement.trim();\n const candidateTokens = tokenize(candidateStmt);\n const candidatePos = new Set((candidate.positive ?? []).map((p) => p.trim().toLowerCase()));\n\n // 1. Direct ID match\n if (candidateId) {\n const directMatch = existingList.find((k) => k.id === candidateId);\n if (directMatch) {\n // Check for exact identical statement\n if (directMatch.statement.trim().toLowerCase() === candidateStmt.toLowerCase()) {\n // If evidence is identical and cues are identical, IGNORE to avoid duplicate bloat\n const hasNewEvidence = (candidate.evidence ?? []).some((e) => !directMatch.evidence.includes(e));\n if (!hasNewEvidence) {\n return {\n action: 'IGNORE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Identical statement and evidence already recorded'\n };\n }\n\n return {\n action: 'SUPPORT',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Confirms existing knowledge with new evidence source'\n };\n }\n\n // Check if candidate contradicts existing statement (e.g. contains negation or opposing cues)\n const opposingPositive = (candidate.negative ?? []).some((n) => directMatch.positive.includes(n));\n const opposingNegative = (candidate.positive ?? []).some((p) => directMatch.negative.includes(p));\n const polarCheck = detectPolarContradiction(candidateStmt, directMatch.statement);\n\n if (opposingPositive || opposingNegative || polarCheck.contradicted) {\n // Check if contexts differ (e.g. dev vs prod) -> SPECIALIZE\n const distinctCues = Array.from(candidatePos).filter((c) => !directMatch.positive.includes(c));\n const mentionsEnvA = /(development|dev|local|staging|test)/i.test(candidateStmt);\n const mentionsEnvB = /(production|prod)/i.test(directMatch.statement);\n const mentionsEnvBDev = /(development|dev|local|staging|test)/i.test(directMatch.statement);\n const mentionsEnvAProd = /(production|prod)/i.test(candidateStmt);\n\n if (distinctCues.length > 0 || (mentionsEnvA && mentionsEnvB) || (mentionsEnvBDev && mentionsEnvAProd)) {\n return {\n action: 'SPECIALIZE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: `Conflicting claim applies under specialized context cues: [${distinctCues.join(', ')}] (${polarCheck.reason || 'opposing polarity'})`\n };\n }\n\n return {\n action: 'CONTRADICT',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: `Contradicts existing statement (${polarCheck.reason || 'opposing polarity'}) for ID \"${directMatch.id}\"`\n };\n }\n\n return {\n action: 'UPDATE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Refines or updates existing knowledge statement'\n };\n }\n }\n\n // 2. Search for nearby existing knowledge by statement similarity and contextual overlap\n let bestMatch: Knowledge | null = null;\n let bestSim = 0;\n let bestPolarCheck: { contradicted: boolean; reason?: string } = { contradicted: false };\n\n for (const existing of existingList) {\n const existingTokens = getCachedTokens(existing);\n const sim = jaccardSimilarity(candidateTokens, existingTokens);\n\n // Explicit polar contradiction check: opposing polar assertions on same topic\n const polarCheck = detectPolarContradiction(candidateStmt, existing.statement);\n if (polarCheck.contradicted) {\n let sharedCount = 0;\n for (const t of candidateTokens) {\n if (existingTokens.has(t)) sharedCount++;\n }\n const sharedCues = (candidate.positive ?? []).filter((p) => existing.positive.includes(p));\n if (sharedCount >= 2 || (sharedCues.length >= 1 && sim >= 0.35) || sim >= 0.40) {\n bestMatch = existing;\n bestSim = Math.max(sim, 0.85);\n bestPolarCheck = polarCheck;\n break;\n }\n }\n\n if (sim > bestSim) {\n bestSim = sim;\n bestMatch = existing;\n bestPolarCheck = polarCheck;\n }\n }\n\n if (bestMatch && bestSim >= 0.70) {\n // CRITICAL: First evaluate contradiction and polar polarity BEFORE any merge decision!\n const polarCheck = bestPolarCheck.contradicted\n ? bestPolarCheck\n : detectPolarContradiction(candidateStmt, bestMatch.statement);\n const hasOpposingCues =\n (candidate.negative ?? []).some((n) => bestMatch!.positive.includes(n)) ||\n (candidate.positive ?? []).some((p) => bestMatch!.negative.includes(p));\n\n if (polarCheck.contradicted || hasOpposingCues) {\n // Check if contexts differ (e.g. dev vs prod) -> SPECIALIZE\n const distinctCues = Array.from(candidatePos).filter((c) => !bestMatch!.positive.includes(c));\n const mentionsEnvA = /(development|dev|local|staging|test)/i.test(candidateStmt);\n const mentionsEnvB = /(production|prod)/i.test(bestMatch.statement);\n const mentionsEnvBDev = /(development|dev|local|staging|test)/i.test(bestMatch.statement);\n const mentionsEnvAProd = /(production|prod)/i.test(candidateStmt);\n\n if (distinctCues.length > 0 || (mentionsEnvA && mentionsEnvB) || (mentionsEnvBDev && mentionsEnvAProd)) {\n return {\n action: 'SPECIALIZE',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `High textual similarity (${Math.round(bestSim * 100)}%) with polar distinction across contexts (${polarCheck.reason || 'opposing cues'})`,\n score: bestSim\n };\n }\n\n return {\n action: 'CONTRADICT',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Contradicting statement (${polarCheck.reason || 'opposing cues'}) despite high textual similarity (${Math.round(bestSim * 100)}%)`,\n score: bestSim\n };\n }\n\n // Only if polarity is compatible and similarity is nearly identical:\n if (bestSim >= 0.90) {\n return {\n action: 'MERGE',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Nearly identical statement (${Math.round(bestSim * 100)}% match) with compatible polarity; merging cues and evidence`,\n score: bestSim\n };\n }\n\n return {\n action: 'SUPPORT',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Supports existing knowledge (${Math.round(bestSim * 100)}% similarity) with compatible polarity`,\n score: bestSim\n };\n }\n\n // 3. Fallback: completely new knowledge\n return {\n action: 'NEW',\n reason: 'No conflicting or matching knowledge found; creating new knowledge entry'\n };\n}\n\n/**\n * Apply reconciliation to knowledge base.\n */\nexport function applyReconciliation(\n reconciliation: ReconciliationResult,\n candidate: Partial<Knowledge> & { statement: string },\n existingList: Knowledge[],\n storage?: { appendMetricEvent(event: MetricEvent): Promise<void> }\n): { updatedKnowledge: Knowledge; action: ReconciliationAction; createdId: string } {\n const now = new Date().toISOString();\n\n switch (reconciliation.action) {\n case 'SUPPORT': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.support_count++;\n target.metrics.last_used = now;\n storage?.appendMetricEvent({\n type: 'knowledge_strengthened',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n\n // Add new evidence refs\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) {\n target.evidence.push(e);\n }\n }\n }\n\n // Merge positive/negative cues if any new\n if (candidate.positive) {\n for (const p of candidate.positive) {\n const lp = p.trim().toLowerCase();\n if (!target.positive.includes(lp)) target.positive.push(lp);\n }\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n\n const promotion = evaluatePromotion(target);\n if (promotion.promoted && promotion.newStage) {\n target.stage = promotion.newStage;\n if (target.stage === 'active' && target.status === 'candidate') {\n target.status = 'active';\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: promotion.reason || `Promoted to ${target.stage}`,\n source: candidate.evidence?.[0]\n });\n } else {\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Confirmed with supporting evidence',\n source: candidate.evidence?.[0]\n });\n }\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n return { updatedKnowledge: target, action: 'SUPPORT', createdId: target.id };\n }\n\n case 'MERGE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.support_count++;\n target.metrics.last_used = now;\n storage?.appendMetricEvent({\n type: 'knowledge_merged',\n knowledgeId: target.id,\n targetId: reconciliation.targetId,\n timestamp: Date.now()\n });\n\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) target.evidence.push(e);\n }\n }\n\n if (candidate.positive) {\n for (const p of candidate.positive) {\n const lp = p.trim().toLowerCase();\n if (!target.positive.includes(lp)) target.positive.push(lp);\n }\n }\n\n if (candidate.negative) {\n for (const n of candidate.negative) {\n const ln = n.trim().toLowerCase();\n if (!target.negative.includes(ln)) target.negative.push(ln);\n }\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n\n const promotion = evaluatePromotion(target);\n if (promotion.promoted && promotion.newStage) {\n target.stage = promotion.newStage;\n if (target.stage === 'active' && target.status === 'candidate') {\n target.status = 'active';\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: promotion.reason || `Promoted to ${target.stage}`,\n source: candidate.evidence?.[0]\n });\n } else {\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Merged with compatible knowledge candidate',\n source: candidate.evidence?.[0]\n });\n }\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n return { updatedKnowledge: target, action: 'MERGE', createdId: target.id };\n }\n\n case 'UPDATE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.statement = candidate.statement;\n if (candidate.type) target.type = candidate.type;\n if (candidate.positive) {\n target.positive = Array.from(new Set([...target.positive, ...candidate.positive.map((p) => p.toLowerCase())]));\n }\n if (candidate.negative) {\n target.negative = Array.from(new Set([...target.negative, ...candidate.negative.map((n) => n.toLowerCase())]));\n }\n if (candidate.evidence) {\n target.evidence = Array.from(new Set([...target.evidence, ...candidate.evidence]));\n }\n\n target.temporal = {\n revision: (target.temporal?.revision ?? 1) + 1,\n valid_from: { timestamp: now }\n };\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Updated statement and context',\n source: candidate.evidence?.[0]\n });\n\n target.updatedAt = now;\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n storage?.appendMetricEvent({\n type: 'knowledge_strengthened',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'UPDATE', createdId: target.id };\n }\n\n case 'CONTRADICT': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.contradiction_count++;\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) target.evidence.push(e);\n }\n }\n\n if (target.metrics.contradiction_count > target.metrics.support_count) {\n target.status = 'contradicted';\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Contradicted by opposing claim',\n source: candidate.evidence?.[0]\n });\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n storage?.appendMetricEvent({\n type: 'contradiction_detected',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'CONTRADICT', createdId: target.id };\n }\n\n case 'SPECIALIZE': {\n // Create specialized branch\n const parent = existingList.find((k) => k.id === reconciliation.targetId);\n const subContext = candidate.positive?.[0] || 'specialized';\n const newId =\n candidate.id && candidate.id !== parent?.id\n ? candidate.id\n : `${parent ? parent.id : 'knowledge'}.${subContext}`;\n\n const created = createKnowledge({\n id: newId,\n type: candidate.type ?? parent?.type ?? 'lesson',\n statement: candidate.statement,\n positive: candidate.positive ?? [],\n negative: candidate.negative ?? [],\n relations: parent ? [parent.id, ...(candidate.relations ?? [])] : (candidate.relations ?? []),\n confidence: candidate.confidence ?? 0.85,\n evidence: candidate.evidence ?? [],\n scope: candidate.scope ?? parent?.scope ?? 'project',\n tags: candidate.tags ?? parent?.tags ?? []\n });\n\n if (parent) {\n if (!parent.relations.includes(newId)) {\n parent.relations.push(newId);\n }\n if (!parent.history) {\n parent.history = [\n {\n timestamp: parent.createdAt || now,\n stage: parent.stage,\n status: parent.status,\n reason: 'Initial knowledge recorded'\n }\n ];\n }\n parent.history.push({\n timestamp: now,\n stage: parent.stage,\n status: parent.status,\n reason: `Specialized into contextual branch ${newId}`\n });\n }\n\n storage?.appendMetricEvent({\n type: 'knowledge_specialized',\n knowledgeId: created.id,\n timestamp: Date.now()\n });\n\n return { updatedKnowledge: created, action: 'SPECIALIZE', createdId: created.id };\n }\n\n case 'IGNORE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n storage?.appendMetricEvent({\n type: 'duplicate_ignored',\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'IGNORE', createdId: target.id };\n }\n\n case 'NEW':\n default: {\n const newId = candidate.id || `kn_${hashString(candidate.statement)}`;\n const created = createKnowledge({\n id: newId,\n type: candidate.type,\n statement: candidate.statement,\n positive: candidate.positive,\n negative: candidate.negative,\n relations: candidate.relations,\n confidence: candidate.confidence,\n evidence: candidate.evidence,\n scope: candidate.scope,\n tags: candidate.tags\n });\n storage?.appendMetricEvent({\n type: 'knowledge_created',\n knowledgeId: created.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: created, action: 'NEW', createdId: created.id };\n }\n }\n}\n","import type {\n Knowledge,\n KnowledgeStage,\n OutcomeRecord,\n KnowledgeBudgetConfig\n} from './types.js';\n\n/**\n * Determines initial quarantine stage for a new knowledge item.\n * Deterministic facts (e.g. compiler config, explicit package manifests) skip probation directly to 'active'.\n * Speculative lessons, heuristics, and inferences start in 'candidate' stage.\n */\nexport function determineInitialStage(knowledge: Partial<Knowledge>): KnowledgeStage {\n if (\n knowledge.type === 'fact' ||\n knowledge.type === 'architecture' ||\n knowledge.confidenceTier === 'high' ||\n (knowledge.confidence !== undefined && knowledge.confidence >= 0.85)\n ) {\n return 'active';\n }\n if (\n knowledge.type === 'rule' &&\n ((knowledge.evidence?.length ?? 0) >= 2 || (knowledge.confidence !== undefined && knowledge.confidence >= 0.75))\n ) {\n return 'probation';\n }\n if (knowledge.confidence !== undefined && knowledge.confidence >= 0.70) {\n return 'probation';\n }\n return 'candidate';\n}\n\n/**\n * Evaluates whether a knowledge item qualifies for promotion along the quarantine ladder:\n * CANDIDATE -> PROBATION -> ACTIVE\n */\nexport function evaluatePromotion(knowledge: Knowledge): {\n promoted: boolean;\n newStage: KnowledgeStage;\n reason?: string;\n} {\n const stage = knowledge.stage ?? 'candidate';\n const supportCount = knowledge.metrics.support_count;\n const reuseCount = knowledge.metrics.reuse_count;\n const successCount = Math.max(knowledge.outcomesSummary?.successful ?? 0, knowledge.metrics.successful_outcomes ?? 0);\n const misleadingCount = Math.max(knowledge.outcomesSummary?.misleading ?? 0, knowledge.metrics.failed_outcomes ?? 0);\n\n if (stage === 'candidate') {\n // Promote to probation if supported by 2+ independent sources or high confidence evidence\n if (supportCount >= 2 || (knowledge.evidence && knowledge.evidence.length >= 2) || knowledge.confidence >= 0.85) {\n return {\n promoted: true,\n newStage: 'probation',\n reason: `Supported by ${supportCount} sources / ${knowledge.evidence.length} evidence nodes`\n };\n }\n } else if (stage === 'probation') {\n // Promote to active if successfully reused or confirmed by positive task outcome without misleading outcomes\n if ((successCount > 0 && misleadingCount === 0) || (reuseCount >= 2 && misleadingCount === 0)) {\n return {\n promoted: true,\n newStage: 'active',\n reason: `Verified by ${successCount} successful task outcomes and ${reuseCount} reuses`\n };\n }\n }\n\n return { promoted: false, newStage: stage };\n}\n\n/**\n * Calculates deterministic knowledge value metric.\n * Combines reuse frequency, evidence backing, successful task outcomes, and penalizes misleading outcomes.\n * Used during compaction and knowledge budget management.\n */\nexport function calculateKnowledgeValue(knowledge: Knowledge): number {\n const reuse = knowledge.metrics.reuse_count;\n const success = knowledge.outcomesSummary?.successful ?? knowledge.metrics.successful_outcomes;\n const misleading = knowledge.outcomesSummary?.misleading ?? knowledge.metrics.failed_outcomes;\n const evidenceCount = Math.min(knowledge.evidence.length, 6);\n const confidence = knowledge.confidence;\n\n let value = (reuse * 2.5) + (success * 4.0) + (evidenceCount * 1.5) + (confidence * 2.0) - (misleading * 5.0);\n\n if (knowledge.status === 'active') value += 5.0;\n if (knowledge.status === 'needs_revalidation') value -= 3.0;\n if (knowledge.status === 'contradicted') value -= 8.0;\n if (knowledge.status === 'stale') value -= 4.0;\n if (knowledge.stage === 'active') value += 3.0;\n if (knowledge.stage === 'candidate') value -= 1.0;\n\n return Math.round(value * 10) / 10;\n}\n\n/**\n * Applies a task outcome record to a knowledge item:\n * Updates outcome telemetry, recalculates value, and triggers promotion or demotion.\n */\nexport function recordOutcomeOnKnowledge(\n knowledge: Knowledge,\n outcome: OutcomeRecord\n): { updatedKnowledge: Knowledge; actionTaken?: string } {\n const now = new Date().toISOString();\n const summary = knowledge.outcomesSummary ?? {\n applied: 0,\n successful: 0,\n misleading: 0,\n neutral: 0\n };\n\n summary.applied++;\n let actionTaken: string | undefined;\n\n if (outcome.result === 'success') {\n summary.successful++;\n knowledge.metrics.successful_outcomes++;\n knowledge.metrics.reuse_count++;\n // Check if probation item qualifies for promotion\n const promo = evaluatePromotion({ ...knowledge, outcomesSummary: summary });\n if (promo.promoted) {\n knowledge.stage = promo.newStage;\n actionTaken = `Promoted to ${promo.newStage} (${promo.reason})`;\n const history = knowledge.history ?? [];\n history.push({\n timestamp: now,\n status: knowledge.status,\n action: 'promote',\n reason: promo.reason\n });\n knowledge.history = history;\n }\n } else if (outcome.result === 'failure' || outcome.result === 'reverted') {\n summary.misleading++;\n knowledge.metrics.failed_outcomes++;\n // Demote or mark needs_revalidation if misleading outcomes dominate\n if (summary.misleading >= 2 && summary.misleading > summary.successful) {\n knowledge.status = 'needs_revalidation';\n actionTaken = `Marked needs_revalidation: ${summary.misleading} misleading outcomes recorded`;\n const history = knowledge.history ?? [];\n history.push({\n timestamp: now,\n status: 'needs_revalidation',\n action: 'demote',\n reason: actionTaken\n });\n knowledge.history = history;\n }\n } else {\n summary.neutral++;\n }\n\n knowledge.outcomesSummary = summary;\n knowledge.value = calculateKnowledgeValue(knowledge);\n knowledge.updatedAt = now;\n\n return { updatedKnowledge: knowledge, actionTaken };\n}\n\n/**\n * Enforces knowledge budget without arbitrarily deleting provenance.\n * When active knowledge exceeds budget, demotes lowest-value items to probation/candidate.\n */\nexport function enforceKnowledgeBudget(\n knowledgeList: Knowledge[],\n budget?: KnowledgeBudgetConfig\n): { modifiedList: Knowledge[]; demotedCount: number } {\n if (!budget || !budget.active || budget.active <= 0) {\n return { modifiedList: knowledgeList, demotedCount: 0 };\n }\n\n const activeItems = knowledgeList.filter((k) => k.status === 'active' && k.stage === 'active');\n if (activeItems.length <= budget.active) {\n return { modifiedList: knowledgeList, demotedCount: 0 };\n }\n\n // Sort active items by value ascending (lowest value first)\n activeItems.sort((a, b) => calculateKnowledgeValue(a) - calculateKnowledgeValue(b));\n\n const excessCount = activeItems.length - budget.active;\n const toDemote = new Set(activeItems.slice(0, excessCount).map((k) => k.id));\n const now = new Date().toISOString();\n\n const modifiedList = knowledgeList.map((k) => {\n if (toDemote.has(k.id)) {\n const history = k.history ?? [];\n k.stage = 'probation';\n k.status = 'probation';\n k.updatedAt = now;\n k.history = [\n ...history,\n {\n timestamp: now,\n stage: 'probation',\n status: 'probation',\n action: 'budget_demotion',\n reason: `Active items exceeded budget (${budget.active}). Demoted to probation based on knowledge value.`\n }\n ];\n return k;\n }\n return k;\n });\n\n return { modifiedList, demotedCount: excessCount };\n}\n","import type {\n UnknownRecord,\n UnknownState,\n UnknownReason,\n UnknownNextAction,\n Scope\n} from './types.js';\n\nexport function createUnknown(params: {\n id: string;\n state?: UnknownState;\n reason?: UnknownReason;\n statement?: string;\n checked?: string[];\n next?: UnknownNextAction;\n scope?: Scope;\n}): UnknownRecord {\n const now = new Date().toISOString();\n return {\n id: params.id.trim(),\n state: params.state ?? 'UNKNOWN',\n reason: params.reason ?? 'NOT_OBSERVED',\n statement: params.statement?.trim(),\n checked: Array.from(new Set(params.checked?.map((c) => c.trim()) ?? [])),\n next: params.next,\n scope: params.scope ?? 'project',\n createdAt: now,\n updatedAt: now\n };\n}\n\n/**\n * Checks if a specific path or query was already investigated,\n * helping agents avoid repeating useless investigations.\n */\nexport function hasBeenInvestigated(\n unknowns: UnknownRecord[],\n target: string\n): { investigated: boolean; record?: UnknownRecord; reason?: string } {\n const normalizedTarget = target.trim().toLowerCase();\n\n for (const record of unknowns) {\n if (record.id.toLowerCase() === normalizedTarget) {\n return { investigated: true, record, reason: record.reason };\n }\n\n const checkedMatch = record.checked.some((c) => {\n const nc = c.toLowerCase();\n return nc === normalizedTarget || normalizedTarget.startsWith(nc.replace('/**', ''));\n });\n\n if (checkedMatch) {\n return { investigated: true, record, reason: record.reason };\n }\n }\n\n return { investigated: false };\n}\n\n/**\n * Update an existing unknown with new checked paths or update its state when partially known or resolved.\n */\nexport function updateUnknown(\n record: UnknownRecord,\n updates: {\n state?: UnknownState;\n reason?: UnknownReason;\n statement?: string;\n addChecked?: string[];\n next?: UnknownNextAction;\n }\n): UnknownRecord {\n const checked = new Set(record.checked);\n if (updates.addChecked) {\n for (const c of updates.addChecked) {\n checked.add(c.trim());\n }\n }\n\n return {\n ...record,\n state: updates.state ?? record.state,\n reason: updates.reason ?? record.reason,\n statement: updates.statement !== undefined ? updates.statement : record.statement,\n checked: Array.from(checked),\n next: updates.next !== undefined ? updates.next : record.next,\n updatedAt: new Date().toISOString()\n };\n}\n","import { hashString, calculateEffectiveConfidence } from './knowledge.js';\nimport type {\n OutcomeRecord,\n OutcomeType,\n Knowledge,\n BilmemMetrics\n} from './types.js';\n\nexport function createOutcome(params: {\n knowledgeId?: string;\n taskId?: string;\n result: OutcomeType;\n context?: {\n positive?: string[];\n negative?: string[];\n };\n feedback?: string;\n}): OutcomeRecord {\n const content = `${params.knowledgeId || 'none'}:${params.result}:${Date.now()}`;\n return {\n id: `out_${hashString(content)}`,\n knowledgeId: params.knowledgeId,\n taskId: params.taskId,\n result: params.result,\n context: params.context,\n feedback: params.feedback,\n timestamp: new Date().toISOString()\n };\n}\n\n/**\n * Apply outcome to a knowledge unit and recalculate its confidence.\n */\nexport function applyOutcomeToKnowledge(\n knowledge: Knowledge,\n outcome: OutcomeRecord\n): Knowledge {\n const now = new Date().toISOString();\n knowledge.metrics.reuse_count++;\n knowledge.metrics.last_used = now;\n\n if (outcome.result === 'success') {\n knowledge.metrics.successful_outcomes++;\n } else if (outcome.result === 'failure' || outcome.result === 'reverted') {\n knowledge.metrics.failed_outcomes++;\n }\n\n // Recalculate effective confidence\n knowledge.confidence = calculateEffectiveConfidence(knowledge);\n knowledge.updatedAt = now;\n return knowledge;\n}\n\nexport class MetricsTracker {\n private metrics: BilmemMetrics = {\n knowledgeHits: 0,\n knowledgeMisses: 0,\n knowledgeReused: 0,\n unknownsResolved: 0,\n repeatedInvestigationsPrevented: 0,\n candidateKnowledgeMerged: 0,\n staleKnowledgeDetected: 0,\n contradictionsDetected: 0,\n knowledgePromoted: 0,\n knowledgeSuperseded: 0\n };\n\n constructor(initial?: Partial<BilmemMetrics>) {\n if (initial) {\n this.metrics = { ...this.metrics, ...initial };\n }\n }\n\n recordHit(): void {\n this.metrics.knowledgeHits++;\n }\n\n recordMiss(): void {\n this.metrics.knowledgeMisses++;\n }\n\n recordReused(): void {\n this.metrics.knowledgeReused++;\n }\n\n recordUnknownResolved(): void {\n this.metrics.unknownsResolved++;\n }\n\n recordInvestigationPrevented(): void {\n this.metrics.repeatedInvestigationsPrevented++;\n }\n\n recordCandidateMerged(): void {\n this.metrics.candidateKnowledgeMerged++;\n }\n\n recordStaleDetected(): void {\n this.metrics.staleKnowledgeDetected++;\n }\n\n recordContradiction(): void {\n this.metrics.contradictionsDetected++;\n }\n\n recordPromoted(): void {\n this.metrics.knowledgePromoted++;\n }\n\n recordSuperseded(): void {\n this.metrics.knowledgeSuperseded++;\n }\n\n getMetrics(): BilmemMetrics {\n return { ...this.metrics };\n }\n\n toJSON(): BilmemMetrics {\n return this.metrics;\n }\n}\n","import { createHash } from 'node:crypto';\nimport type {\n TaskTrajectory,\n Knowledge,\n Observation,\n Evidence,\n Provenance,\n ReconciliationResult,\n ReconciliationAction\n} from './types.js';\nimport {\n createObservation,\n createEvidence,\n createKnowledge,\n reconcileKnowledge,\n applyReconciliation\n} from './knowledge.js';\n\nexport interface DistilledLesson {\n id: string;\n statement: string;\n positive: string[];\n negative: string[];\n confidence: number;\n evidence: string[];\n tags: string[];\n reasoning: string;\n}\n\nexport interface TrajectoryLearningResult {\n taskId: string;\n observations: Observation[];\n evidence: Evidence[];\n candidateLessons: Array<Partial<Knowledge> & { statement: string }>;\n reconciliations: Array<{\n candidate: Partial<Knowledge> & { statement: string };\n result: ReconciliationResult;\n appliedKnowledge?: Knowledge;\n action: ReconciliationAction;\n }>;\n dryRun: boolean;\n}\n\n/**\n * Distill a task trajectory into a compact, reusable candidate lesson.\n * Avoids dumping raw trajectories into permanent memory;\n * extracts only the crystallized insight (what worked, what failed, negative patterns).\n */\nexport function distillTrajectory(trajectory: TaskTrajectory): DistilledLesson | null {\n const events = trajectory.events || [];\n if (events.length === 0) return null;\n\n const failures = events.filter((e) => e.type === 'failure' || e.type === 'revert');\n const successes = events.filter((e) => e.type === 'success');\n const corrections = events.filter((e) => e.type === 'user_correction');\n\n // If nothing succeeded or no significant signal, do not create spurious memory\n if (successes.length === 0 && corrections.length === 0 && failures.length === 0) {\n return null;\n }\n\n const positiveSignals = new Set<string>();\n const negativeSignals = new Set<string>();\n const tags = new Set<string>(['lesson', 'trajectory']);\n\n // Extract negative signals from failures and rejected hypotheses\n for (const f of failures) {\n negativeSignals.add(f.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n if (f.path) negativeSignals.add(f.path.toLowerCase());\n }\n\n // Extract positive signals from successful attempts & goal\n for (const s of successes) {\n positiveSignals.add(s.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n if (s.path) positiveSignals.add(s.path.toLowerCase());\n }\n\n // Extract from user corrections\n for (const c of corrections) {\n positiveSignals.add(c.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n tags.add('user-correction');\n }\n\n // Extract tokens from goal\n const goalTokens = trajectory.goal\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((w) => w.length > 3);\n for (const t of goalTokens) {\n positiveSignals.add(t);\n }\n\n // Compose statement\n let statement = '';\n let reasoning = '';\n\n if (corrections.length > 0) {\n const lastCorr = corrections[corrections.length - 1];\n statement = `Corrected approach for \"${trajectory.goal}\": ${lastCorr.description}`;\n reasoning = `Based on user correction during task ${trajectory.taskId}`;\n } else if (successes.length > 0) {\n const lastSuccess = successes[successes.length - 1];\n if (failures.length > 0) {\n const firstFailure = failures[0];\n statement = `When addressing \"${trajectory.goal}\": prefer ${lastSuccess.description} over ${firstFailure.description}`;\n reasoning = `Initial attempt (${firstFailure.description}) failed/reverted; resolved by ${lastSuccess.description}`;\n } else {\n statement = `Effective pattern for \"${trajectory.goal}\": ${lastSuccess.description}`;\n reasoning = `Directly succeeded in task ${trajectory.taskId}`;\n }\n } else if (failures.length > 0) {\n const failureList = failures.map((f) => f.description).join(', ');\n statement = `Avoid for \"${trajectory.goal}\": approaches [${failureList}] failed`;\n reasoning = `Recorded ${failures.length} failed attempts in task ${trajectory.taskId}`;\n }\n\n const hash = createHash('sha256')\n .update(`${trajectory.goal}:${statement}`)\n .digest('hex')\n .slice(0, 12);\n const id = `lesson.${trajectory.taskId || hash}`;\n\n return {\n id,\n statement,\n positive: Array.from(positiveSignals).slice(0, 8),\n negative: Array.from(negativeSignals).slice(0, 8),\n confidence: corrections.length > 0 ? 0.95 : successes.length > 0 ? 0.85 : 0.65,\n evidence: [`trajectory:${trajectory.taskId}`],\n tags: Array.from(tags),\n reasoning\n };\n}\n\n/**\n * Executes the complete staged trajectory learning pipeline:\n * trajectory → observations → candidate lessons → reconcile → knowledge\n *\n * Honors the \"Memory should grow by refinement, not accumulation\" principle.\n * Raw trajectory is never dumped directly to knowledge.\n */\nexport function learnFromTrajectory(\n trajectory: TaskTrajectory,\n existingKnowledge: Knowledge[] = [],\n options: { dryRun?: boolean; storage?: { appendMetricEvent(event: any): Promise<void> } } = {}\n): TrajectoryLearningResult {\n const dryRun = options.dryRun ?? false;\n const storage = options.storage;\n const now = new Date().toISOString();\n const taskId = trajectory.taskId || `task_${Date.now()}`;\n const events = trajectory.events || [];\n\n // Step 1: Trajectory -> Observations\n const observations: Observation[] = [];\n events.forEach((event, idx) => {\n let obsType: Provenance['type'] = 'agent';\n let confidence = 0.75;\n const positive: string[] = [taskId, event.type];\n const negative: string[] = [];\n\n if (event.type === 'user_correction') {\n obsType = 'user';\n confidence = 0.98;\n } else if (event.type === 'failure' || event.type === 'revert') {\n obsType = 'test';\n confidence = 0.95;\n negative.push(event.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n } else if (event.type === 'success') {\n obsType = 'agent';\n confidence = 0.95;\n positive.push(event.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n } else if (event.type === 'hypothesis') {\n confidence = 0.50; // Inferred / speculative\n }\n\n if (event.path) positive.push(event.path.toLowerCase());\n\n observations.push(\n createObservation({\n source: `trajectory:${taskId}:${event.type}:${idx}`,\n claim: `[${event.type.toUpperCase()}] ${event.description}`,\n provenance: {\n type: obsType,\n path: event.path,\n timestamp: event.timestamp || now\n },\n confidence,\n positive,\n negative: negative.length > 0 ? negative : undefined,\n details: { taskId, eventIndex: idx, eventType: event.type, ...(event.data || {}) }\n })\n );\n });\n\n // Step 2: Observations -> Evidence Nodes\n const evidence: Evidence[] = observations.map((obs) => {\n const isFailure = obs.claim.startsWith('[FAILURE]') || obs.claim.startsWith('[REVERT]');\n return createEvidence(obs, isFailure ? 'contradicts' : 'supports');\n });\n\n // Step 3: Evidence -> Candidate Lessons\n const distilled = distillTrajectory(trajectory);\n const candidateLessons: Array<Partial<Knowledge> & { statement: string }> = [];\n\n if (distilled) {\n // Attach observation IDs as evidence backing\n candidateLessons.push({\n id: distilled.id,\n type: 'lesson',\n statement: distilled.statement,\n positive: distilled.positive,\n negative: distilled.negative,\n confidence: distilled.confidence,\n evidence: evidence.map((e) => e.source),\n tags: distilled.tags,\n scope: 'project'\n });\n }\n\n // Step 4: Candidate Lessons -> Reconcile\n const reconciliations: TrajectoryLearningResult['reconciliations'] = [];\n const currentKnowledgeList = [...existingKnowledge];\n\n for (const candidate of candidateLessons) {\n const recResult = reconcileKnowledge(candidate, currentKnowledgeList);\n\n if (dryRun) {\n reconciliations.push({\n candidate,\n result: recResult,\n action: recResult.action\n });\n } else {\n const { updatedKnowledge, action } = applyReconciliation(\n recResult,\n candidate,\n currentKnowledgeList,\n storage\n );\n reconciliations.push({\n candidate,\n result: recResult,\n appliedKnowledge: updatedKnowledge,\n action\n });\n }\n }\n\n return {\n taskId,\n observations,\n evidence,\n candidateLessons,\n reconciliations,\n dryRun\n };\n}\n\n/**\n * Handle explicit user correction as high-quality evidence.\n * Prevents future agents from repeatedly making the same invalid assumption.\n */\nexport function processUserCorrection(params: {\n topic: string;\n incorrectAssumption: string;\n correctFact: string;\n context?: string[];\n author?: string;\n}): {\n observation: Observation;\n knowledge: Knowledge;\n} {\n const now = new Date().toISOString();\n const prov: Provenance = {\n type: 'user',\n timestamp: now,\n ...(params.author ? { author: params.author } : {})\n };\n\n const claim = `User correction on ${params.topic}: ${params.correctFact} (supersedes assumption: ${params.incorrectAssumption})`;\n\n const observation = createObservation({\n source: `user:correction:${params.topic.toLowerCase()}`,\n claim,\n provenance: prov,\n confidence: 1.0,\n positive: [params.topic.toLowerCase(), ...(params.context ?? [])],\n negative: [params.incorrectAssumption.toLowerCase()]\n });\n\n const evidence = createEvidence(observation, 'supports');\n\n const knowledge = createKnowledge({\n id: `correction.${params.topic.toLowerCase().replace(/[^a-z0-9_-]/g, '.')}`,\n type: 'rule',\n status: 'active',\n statement: params.correctFact,\n positive: [params.topic.toLowerCase(), ...(params.context ?? [])],\n negative: [params.incorrectAssumption.toLowerCase()],\n confidence: 1.0,\n confidenceTier: 'high',\n evidence: [evidence.id, observation.source],\n tags: ['user-correction', params.topic.toLowerCase()]\n });\n\n return { observation, knowledge };\n}\n","import * as path from 'node:path';\nimport type {\n Observation,\n Evidence,\n EvidenceRelation,\n Knowledge,\n UnknownRecord\n} from '../core/types.js';\nimport { createEvidence, createKnowledge, reconcileKnowledge, applyReconciliation } from '../core/knowledge.js';\nimport { createUnknown } from '../core/unknown.js';\nimport { EvidenceGraph } from '../core/relations.js';\nimport { Storage } from '../storage/canonical.js';\nimport { SearchIndex } from '../search/indexer.js';\nimport { walkDirectory, analyzeProjectStructure, ProjectContext, type ScannedFileInfo } from './filesystem.js';\nimport { parseMarkdownFile } from './markdown.js';\nimport { scanGitHistory } from './git.js';\nimport { analyzeSourceFile, isSourceFile } from './source.js';\nimport { loadAllProjectRuleSets } from '../rules/loader.js';\nimport { evaluateRule, ruleToObservation, ruleToCandidateLesson } from '../rules/evaluator.js';\n\nexport interface ScanOptions {\n incremental?: boolean;\n maxCommits?: number;\n dryRun?: boolean;\n}\n\nexport interface ScanReport {\n filesScanned: number;\n observationsCreated: number;\n evidenceCreated: number;\n knowledgeCreated: number;\n knowledgeUpdated: number;\n unknownsCount: number;\n gitCommitsScanned: number;\n headCommit?: string;\n incremental: boolean;\n dryRun: boolean;\n plannedActions?: string[];\n}\n\n/**\n * Executes a comprehensive, conservative repository scan:\n * Sources -> Observations -> Evidence Graph -> Explicit Rule/ADR Candidates -> Reconcile -> Knowledge\n *\n * Core philosophy: Deterministik scan'in esas çıktısı observation/evidence'tır.\n * Scan her şeyden zoraki knowledge üretmez. Semantik olarak kesin olmayan sinyaller\n * gözlem ve kanıt olarak kalır (\"ederinden fazlasını vaat etmeme\").\n */\nexport async function scanRepository(\n rootDir: string = process.cwd(),\n options: ScanOptions = {}\n): Promise<ScanReport> {\n const storage = new Storage(rootDir);\n const dryRun = options.dryRun ?? false;\n const plannedActions: string[] = [];\n\n const config = dryRun ? (await storage.isInitialized() ? await storage.getConfig() : {\n schemaVersion: 1,\n projectName: path.basename(rootDir),\n defaultScope: 'project' as const,\n dataDir: path.join(rootDir, '.bilmem')\n }) : await storage.init();\n\n const incremental = options.incremental ?? false;\n const lastScanCommit = incremental ? config.lastScanCommit : undefined;\n\n // 1. Filesystem Scan\n const scannedFiles = await walkDirectory(rootDir);\n const fsObs = await analyzeProjectStructure(scannedFiles, rootDir);\n const projectContext = new ProjectContext(scannedFiles, rootDir);\n\n // 1.5. Declarative YAML Rule Sets Scan (.bilmem/rules/*.yml, bilmem.rules.yml, rules.yml)\n const ruleObs: Observation[] = [];\n const ruleCandidateLessons: Array<Partial<Knowledge> & { statement: string }> = [];\n const { ruleSets, sourceFiles } = await loadAllProjectRuleSets(rootDir, storage.getRulesDir());\n\n for (let idx = 0; idx < ruleSets.length; idx++) {\n const set = ruleSets[idx];\n const sourceFile = sourceFiles[idx] || 'rules.yml';\n for (const rule of set.rules) {\n const evalResult = await evaluateRule(rule, projectContext);\n if (evalResult.matched) {\n const obs = ruleToObservation(rule, evalResult, sourceFile);\n ruleObs.push(obs);\n ruleCandidateLessons.push(ruleToCandidateLesson(rule, evalResult, obs.source));\n }\n }\n }\n\n const mdObs: Observation[] = [];\n const srcObs: Observation[] = [];\n const relations: EvidenceRelation[] = [];\n\n for (const file of scannedFiles) {\n if (file.ext === '.md') {\n const res = await parseMarkdownFile(file.path, file.relativePath);\n mdObs.push(...res.observations);\n if (res.relations && res.relations.length > 0) {\n relations.push(...res.relations);\n }\n } else if (isSourceFile(file.ext)) {\n const res = await analyzeSourceFile(file.path, file.relativePath);\n srcObs.push(...res.observations);\n relations.push(...res.relations);\n }\n }\n\n // 2. Git History Scan\n const gitResult = await scanGitHistory(rootDir, {\n lastScanCommit,\n maxCommits: options.maxCommits ?? 100\n });\n relations.push(...gitResult.relations);\n\n // 3. Collect All Observations and Build Evidence Graph\n const allObs: Observation[] = [...fsObs, ...ruleObs, ...mdObs, ...srcObs, ...gitResult.observations];\n\n if (!dryRun) {\n for (const obs of allObs) {\n await storage.saveObservation(obs);\n }\n\n const graph = new EvidenceGraph(await storage.getRelations());\n for (const r of relations) {\n graph.addRelation(r);\n }\n await storage.saveRelations(graph.getAllRelations());\n } else {\n plannedActions.push(`Would persist ${allObs.length} observations`);\n plannedActions.push(`Would record ${relations.length} evidence relations`);\n }\n\n // 4. Create Evidence Nodes\n const evidenceNodes: Evidence[] = [];\n for (const obs of allObs) {\n const ev = createEvidence(obs, 'supports');\n if (!dryRun) {\n await storage.saveEvidence(ev);\n }\n evidenceNodes.push(ev);\n }\n if (dryRun) {\n plannedActions.push(`Would create ${evidenceNodes.length} evidence nodes`);\n }\n\n // 5. Conservative Knowledge Extraction\n // Primary output of scan is Observation/Evidence. Only verified, high-confidence\n // rule sets and explicit ADR decisions become candidate lessons for reconciliation.\n const candidateLessons: Array<Partial<Knowledge> & { statement: string }> = [\n ...ruleCandidateLessons\n ];\n\n // A. From explicit Markdown ADRs with decisions or documented warnings\n for (const o of mdObs) {\n if (o.source.includes(':adr') || o.claim.startsWith('[WARNING]') || o.claim.startsWith('[CAUTION]')) {\n const id = `decision.${path.basename(o.provenance.path || 'doc', '.md')}.${o.provenance.line || 'adr'}`;\n candidateLessons.push({\n id,\n type: 'decision',\n statement: o.claim,\n positive: o.positive ?? [],\n negative: o.negative ?? [],\n confidence: o.confidence,\n evidence: [o.source],\n scope: 'project'\n });\n }\n }\n\n // B. From Git Reverts (verified failure lesson)\n for (const o of gitResult.observations) {\n if (o.positive?.includes('revert')) {\n candidateLessons.push({\n id: `git.lesson.${o.provenance.commit || 'revert'}`,\n type: 'lesson',\n statement: `Caution: ${o.claim}`,\n positive: o.positive,\n negative: ['untested-assumption'],\n confidence: o.confidence,\n evidence: [o.source],\n scope: 'project'\n });\n }\n }\n\n // 6. Check for Unknowns (e.g. database migration, deployment pipeline)\n const relPaths = new Set(scannedFiles.map((f) => f.relativePath.toLowerCase()));\n const hasMigrations = Array.from(relPaths).some((p) => p.includes('migration') || p.includes('migrate'));\n const hasDb = Array.from(relPaths).some((p) => p.includes('db') || p.includes('database') || p.includes('sql'));\n let unknownCount = 0;\n\n if (hasDb && !hasMigrations) {\n unknownCount++;\n const unknownRec = createUnknown({\n id: 'project.database.migration',\n state: 'UNKNOWN',\n reason: 'UNRESOLVABLE_LOCALLY',\n statement: 'Database directory exists, but no explicit migration tool or folder was found locally.',\n checked: ['package.json', 'src/db/**', 'scripts/**'],\n next: {\n type: 'ask',\n question: 'How are database migrations performed in this project?'\n },\n scope: 'project'\n });\n if (!dryRun) {\n await storage.saveUnknown(unknownRec);\n } else {\n plannedActions.push(`Would register unknown: \"${unknownRec.statement}\"`);\n }\n }\n\n // 7. Reconciliation with Canonical Knowledge Base\n const existingKnowledge = await storage.getAllKnowledge();\n let createdCount = 0;\n let updatedCount = 0;\n\n for (const cand of candidateLessons) {\n const rec = reconcileKnowledge(cand, existingKnowledge);\n if (!dryRun) {\n const { updatedKnowledge, action } = applyReconciliation(rec, cand, existingKnowledge, storage);\n await storage.saveKnowledge(updatedKnowledge);\n\n if (action === 'NEW' || action === 'SPECIALIZE') {\n createdCount++;\n existingKnowledge.push(updatedKnowledge);\n } else if (action === 'SUPPORT' || action === 'UPDATE' || action === 'MERGE' || action === 'CONTRADICT') {\n updatedCount++;\n }\n } else {\n plannedActions.push(`Would reconcile [${rec.action}]: \"${cand.statement}\" (${rec.reason})`);\n if (rec.action === 'NEW' || rec.action === 'SPECIALIZE') {\n createdCount++;\n } else if (rec.action !== 'IGNORE') {\n updatedCount++;\n }\n }\n }\n\n if (!dryRun) {\n // 8. Rebuild Search Index\n const index = new SearchIndex();\n await index.buildIndex(existingKnowledge);\n\n // 9. Update Config with Last Scan Commit\n await storage.updateConfig({\n lastScanCommit: gitResult.headCommit ?? config.lastScanCommit,\n lastScanTimestamp: new Date().toISOString()\n });\n\n // 10. Record Revision Snapshot for Incremental Diff\n await storage.appendRevision({\n id: `rev_${Date.now().toString(36)}`,\n commit: gitResult.headCommit,\n timestamp: new Date().toISOString(),\n action: 'scan',\n observationCount: allObs.length,\n evidenceCount: evidenceNodes.length,\n knowledgeCount: existingKnowledge.length,\n activeCount: existingKnowledge.filter((k) => k.status === 'active').length,\n contradictedCount: existingKnowledge.filter((k) => k.status === 'contradicted').length,\n staleCount: existingKnowledge.filter((k) => k.status === 'stale').length,\n changesSummary: `Scanned ${scannedFiles.length} files: +${allObs.length} obs, +${createdCount} candidates, ~${updatedCount} updated.`\n });\n }\n\n const unknowns = dryRun ? [] : await storage.getAllUnknowns();\n\n return {\n filesScanned: scannedFiles.length,\n observationsCreated: allObs.length,\n evidenceCreated: evidenceNodes.length,\n knowledgeCreated: createdCount,\n knowledgeUpdated: updatedCount,\n unknownsCount: dryRun ? unknownCount : unknowns.length,\n gitCommitsScanned: gitResult.commitsScanned,\n headCommit: gitResult.headCommit,\n incremental,\n dryRun,\n plannedActions: dryRun ? plannedActions : undefined\n };\n}\n","import type { EvidenceRelation, RelationType } from './types.js';\n\n/**\n * Lightweight, in-memory graph structure for managing relations between\n * files, observations, evidence, and knowledge nodes.\n */\nexport class EvidenceGraph {\n private fromMap = new Map<string, EvidenceRelation[]>();\n private toMap = new Map<string, EvidenceRelation[]>();\n\n constructor(relations: EvidenceRelation[] = []) {\n for (const rel of relations) {\n this.addRelation(rel);\n }\n }\n\n addRelation(relation: EvidenceRelation): void {\n if (!relation || !relation.from || !relation.to || !relation.type) {\n return;\n }\n\n // Prevent identical duplicate edges\n const existing = this.getRelationsBetween(relation.from, relation.to);\n const dup = existing.find((r) => r.type === relation.type);\n if (dup) {\n // If weight differs, increase weight\n dup.weight = (dup.weight ?? 1) + (relation.weight ?? 1);\n return;\n }\n\n const fromList = this.fromMap.get(relation.from) ?? [];\n fromList.push(relation);\n this.fromMap.set(relation.from, fromList);\n\n const toList = this.toMap.get(relation.to) ?? [];\n toList.push(relation);\n this.toMap.set(relation.to, toList);\n }\n\n getRelationsFrom(fromId: string): EvidenceRelation[] {\n return this.fromMap.get(fromId) ?? [];\n }\n\n getRelationsTo(toId: string): EvidenceRelation[] {\n return this.toMap.get(toId) ?? [];\n }\n\n getRelationsBetween(fromId: string, toId: string): EvidenceRelation[] {\n const fromList = this.fromMap.get(fromId);\n if (!fromList) return [];\n return fromList.filter((r) => r.to === toId);\n }\n\n getAllRelations(): EvidenceRelation[] {\n const all: EvidenceRelation[] = [];\n for (const list of this.fromMap.values()) {\n all.push(...list);\n }\n return all;\n }\n\n findCoChanged(file: string, threshold = 1): Array<{ file: string; weight: number }> {\n const relations = this.getRelationsFrom(file).filter((r) => r.type === 'CO_CHANGED');\n const result: Array<{ file: string; weight: number }> = [];\n\n for (const rel of relations) {\n const w = rel.weight ?? 1;\n if (w >= threshold) {\n result.push({ file: rel.to, weight: w });\n }\n }\n\n return result.sort((a, b) => b.weight - a.weight);\n }\n\n findConnected(id: string, maxDepth = 2): string[] {\n const visited = new Set<string>();\n const queue: Array<{ node: string; depth: number }> = [{ node: id, depth: 0 }];\n\n while (queue.length > 0) {\n const { node, depth } = queue.shift()!;\n if (visited.has(node)) continue;\n visited.add(node);\n\n if (depth < maxDepth) {\n const outRels = this.getRelationsFrom(node);\n for (const r of outRels) {\n if (!visited.has(r.to)) {\n queue.push({ node: r.to, depth: depth + 1 });\n }\n }\n const inRels = this.getRelationsTo(node);\n for (const r of inRels) {\n if (!visited.has(r.from)) {\n queue.push({ node: r.from, depth: depth + 1 });\n }\n }\n }\n }\n\n visited.delete(id);\n return Array.from(visited);\n }\n\n toJSON(): EvidenceRelation[] {\n return this.getAllRelations();\n }\n\n static fromJSON(relations: EvidenceRelation[]): EvidenceGraph {\n return new EvidenceGraph(relations);\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Observation } from '../core/types.js';\nimport { createObservation } from '../core/knowledge.js';\n\nexport interface ScannedFileInfo {\n path: string;\n relativePath: string;\n name: string;\n ext: string;\n size: number;\n mtimeMs?: number;\n isDirectory?: boolean;\n}\n\nexport interface WalkOptions {\n maxDepth?: number;\n maxFiles?: number;\n ignoredDirs?: Set<string> | string[];\n includeHidden?: boolean;\n readGitignore?: boolean;\n filter?: (entry: ScannedFileInfo) => boolean;\n}\n\nconst DEFAULT_IGNORED_DIRS = new Set([\n '.git',\n '.bilmem',\n 'node_modules',\n 'dist',\n 'build',\n 'target',\n 'vendor',\n '.cache',\n '.idea',\n '.vscode',\n 'coverage',\n '.next',\n '.nuxt',\n '.turbo',\n '.output',\n 'tmp',\n 'temp'\n]);\n\n/**\n * Normalizes relative path to use standard forward slashes.\n */\nfunction normalizeRelPath(rel: string): string {\n return rel.split(path.sep).join('/');\n}\n\n/**\n * Basic gitignore parser: extracts ignore patterns from .gitignore file.\n */\nasync function loadGitignorePatterns(rootDir: string): Promise<RegExp[]> {\n try {\n const gitignorePath = path.join(rootDir, '.gitignore');\n const content = await fs.readFile(gitignorePath, 'utf-8');\n const regexes: RegExp[] = [];\n\n for (const rawLine of content.split('\\n')) {\n const line = rawLine.trim();\n if (!line || line.startsWith('#')) continue;\n\n // Clean glob pattern\n let pattern = line.replace(/^\\//, '').replace(/\\/$/, '');\n if (!pattern) continue;\n\n // Escape special regex chars except * and ?\n pattern = pattern.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&');\n pattern = pattern.replace(/\\*\\*/g, '.*');\n pattern = pattern.replace(/\\*/g, '[^/]*');\n pattern = pattern.replace(/\\?/g, '[^/]');\n\n try {\n regexes.push(new RegExp(`(^|/)${pattern}($|/)`));\n } catch {\n // Skip invalid pattern\n }\n }\n return regexes;\n } catch {\n return [];\n }\n}\n\n/**\n * High-performance, depth-controlled recursive directory walker.\n * Respects default ignores, .gitignore patterns, symlink circularity, and file limits.\n */\nexport async function walkDirectory(\n dir: string,\n optionsOrRoot?: string | WalkOptions,\n legacyFileList?: ScannedFileInfo[]\n): Promise<ScannedFileInfo[]> {\n let root: string;\n let options: WalkOptions;\n\n if (typeof optionsOrRoot === 'string') {\n root = optionsOrRoot;\n options = {};\n } else {\n options = optionsOrRoot ?? {};\n root = dir;\n }\n\n const fileList: ScannedFileInfo[] = legacyFileList ?? [];\n const maxDepth = options.maxDepth ?? 15;\n const maxFiles = options.maxFiles ?? 25000;\n const includeHidden = options.includeHidden ?? false;\n\n const ignoredDirs = new Set(DEFAULT_IGNORED_DIRS);\n if (options.ignoredDirs) {\n for (const d of options.ignoredDirs) {\n ignoredDirs.add(d.toLowerCase());\n }\n }\n\n const gitignoreRules = options.readGitignore !== false\n ? await loadGitignorePatterns(root)\n : [];\n\n const visitedRealPaths = new Set<string>();\n\n async function walk(currentDir: string, currentDepth: number): Promise<void> {\n if (currentDepth > maxDepth || fileList.length >= maxFiles) {\n return;\n }\n\n try {\n const real = await fs.realpath(currentDir);\n if (visitedRealPaths.has(real)) {\n return; // Circular symlink prevention\n }\n visitedRealPaths.add(real);\n } catch {\n return;\n }\n\n let entries;\n try {\n entries = await fs.readdir(currentDir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (fileList.length >= maxFiles) break;\n\n const fullPath = path.join(currentDir, entry.name);\n const rawRelPath = path.relative(root, fullPath);\n const relPath = normalizeRelPath(rawRelPath);\n const lowerName = entry.name.toLowerCase();\n\n // Check gitignore rules\n if (gitignoreRules.some((rule) => rule.test(relPath))) {\n continue;\n }\n\n if (entry.isDirectory()) {\n if (ignoredDirs.has(lowerName)) continue;\n // Don't skip .github even if hidden is disabled\n if (!includeHidden && entry.name.startsWith('.') && lowerName !== '.github') {\n continue;\n }\n await walk(fullPath, currentDepth + 1);\n } else if (entry.isFile()) {\n if (!includeHidden && entry.name.startsWith('.') && lowerName !== '.env.example') {\n // Skip dotfiles unless explicitly requested\n continue;\n }\n\n const ext = path.extname(entry.name).toLowerCase();\n try {\n const stat = await fs.stat(fullPath);\n const fileInfo: ScannedFileInfo = {\n path: fullPath,\n relativePath: relPath,\n name: entry.name,\n ext,\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n isDirectory: false\n };\n\n if (!options.filter || options.filter(fileInfo)) {\n fileList.push(fileInfo);\n }\n } catch {\n // Ignore unreadable file\n }\n }\n }\n }\n\n await walk(dir, 0);\n return fileList;\n}\n\n// --- Extensible Project Context ---\n\n/**\n * Queryable project context providing cached text and JSON reads for detectors.\n */\nexport class ProjectContext {\n readonly rootDir: string;\n readonly files: ScannedFileInfo[];\n private relPathSet: Set<string>;\n private fileNameSet: Set<string>;\n private textCache = new Map<string, string | null>();\n private jsonCache = new Map<string, unknown | null>();\n\n constructor(files: ScannedFileInfo[], rootDir: string) {\n this.rootDir = rootDir;\n this.files = files;\n this.relPathSet = new Set(files.map((f) => f.relativePath.toLowerCase()));\n this.fileNameSet = new Set(files.map((f) => f.name.toLowerCase()));\n }\n\n hasFile(nameOrRelPath: string): boolean {\n const lower = normalizeRelPath(nameOrRelPath).toLowerCase();\n return this.fileNameSet.has(lower) || this.relPathSet.has(lower);\n }\n\n hasDirectory(dirNameOrRelPath: string): boolean {\n const prefix = normalizeRelPath(dirNameOrRelPath).toLowerCase().replace(/\\/$/, '') + '/';\n return Array.from(this.relPathSet).some((p) => p.startsWith(prefix));\n }\n\n findFiles(predicate: (file: ScannedFileInfo) => boolean): ScannedFileInfo[] {\n return this.files.filter(predicate);\n }\n\n async readText(relativePath: string, maxBytes: number = 64 * 1024): Promise<string | null> {\n const key = normalizeRelPath(relativePath).toLowerCase();\n if (this.textCache.has(key)) {\n return this.textCache.get(key)!;\n }\n\n const fullPath = path.resolve(this.rootDir, relativePath);\n try {\n const handle = await fs.open(fullPath, 'r');\n const buffer = Buffer.alloc(maxBytes);\n const { bytesRead } = await handle.read(buffer, 0, maxBytes, 0);\n await handle.close();\n const content = buffer.toString('utf-8', 0, bytesRead);\n this.textCache.set(key, content);\n return content;\n } catch {\n this.textCache.set(key, null);\n return null;\n }\n }\n\n async readJson<T = any>(relativePath: string): Promise<T | null> {\n const key = normalizeRelPath(relativePath).toLowerCase();\n if (this.jsonCache.has(key)) {\n return this.jsonCache.get(key) as T | null;\n }\n\n const text = await this.readText(relativePath);\n if (!text) {\n this.jsonCache.set(key, null);\n return null;\n }\n\n try {\n const parsed = JSON.parse(text) as T;\n this.jsonCache.set(key, parsed);\n return parsed;\n } catch {\n this.jsonCache.set(key, null);\n return null;\n }\n }\n}\n\n// --- Extensible Convention Detector Engine ---\n\nexport type DetectorCategory =\n | 'runtime'\n | 'language'\n | 'package-manager'\n | 'framework'\n | 'testing'\n | 'database'\n | 'tooling'\n | 'ci-cd'\n | 'monorepo'\n | 'documentation'\n | 'architecture';\n\nexport interface ConventionDetector {\n id: string;\n name: string;\n category: DetectorCategory;\n description?: string;\n detect(ctx: ProjectContext): Promise<Observation | Observation[] | null> | Observation | Observation[] | null;\n}\n\nexport class ConventionRegistry {\n private detectors = new Map<string, ConventionDetector>();\n\n register(detector: ConventionDetector): this {\n this.detectors.set(detector.id, detector);\n return this;\n }\n\n unregister(id: string): boolean {\n return this.detectors.delete(id);\n }\n\n get(id: string): ConventionDetector | undefined {\n return this.detectors.get(id);\n }\n\n list(): ConventionDetector[] {\n return Array.from(this.detectors.values());\n }\n\n async run(ctx: ProjectContext): Promise<Observation[]> {\n const observations: Observation[] = [];\n for (const detector of this.detectors.values()) {\n try {\n const result = await detector.detect(ctx);\n if (result) {\n if (Array.isArray(result)) {\n observations.push(...result);\n } else {\n observations.push(result);\n }\n }\n } catch {\n // Individual detector failures do not abort scanning\n }\n }\n return observations;\n }\n}\n\n// --- Built-in Pluggable Detectors ---\n\nexport const BUILTIN_DETECTORS: ConventionDetector[] = [\n // 1. Node.js & package.json\n {\n id: 'node-manifest',\n name: 'Node.js Manifest Detector',\n category: 'runtime',\n async detect(ctx) {\n if (!ctx.hasFile('package.json')) return null;\n\n const pkg = await ctx.readJson<{\n name?: string;\n version?: string;\n type?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n }>('package.json');\n\n const now = new Date().toISOString();\n const scripts = pkg?.scripts ? Object.keys(pkg.scripts) : [];\n const isEsm = pkg?.type === 'module';\n\n const scriptSummary = scripts.length > 0 ? ` with scripts: ${scripts.slice(0, 5).join(', ')}` : '';\n const moduleType = isEsm ? ' (ESM module)' : ' (CommonJS)';\n\n return createObservation({\n source: 'filesystem:package.json',\n claim: `Project utilizes Node.js ecosystem with package.json manifest${moduleType}${scriptSummary}`,\n provenance: { type: 'file', path: 'package.json', timestamp: now },\n confidence: 0.99,\n positive: ['node', 'npm', 'javascript', isEsm ? 'esm' : 'cjs', ...(pkg?.name ? [pkg.name.toLowerCase()] : [])],\n details: {\n ecosystem: 'node',\n name: pkg?.name,\n version: pkg?.version,\n type: pkg?.type,\n scripts\n }\n });\n }\n },\n\n // 2. Package Manager\n {\n id: 'package-manager',\n name: 'Package Manager Detector',\n category: 'package-manager',\n detect(ctx) {\n const now = new Date().toISOString();\n if (ctx.hasFile('pnpm-lock.yaml')) {\n return createObservation({\n source: 'filesystem:pnpm-lock.yaml',\n claim: 'Project utilizes pnpm as the package manager',\n provenance: { type: 'file', path: 'pnpm-lock.yaml', timestamp: now },\n confidence: 0.99,\n positive: ['pnpm', 'package-manager', 'node']\n });\n }\n if (ctx.hasFile('bun.lockb') || ctx.hasFile('bun.lock')) {\n return createObservation({\n source: 'filesystem:bun.lock',\n claim: 'Project utilizes Bun runtime and package manager',\n provenance: { type: 'file', path: 'bun.lock', timestamp: now },\n confidence: 0.99,\n positive: ['bun', 'package-manager']\n });\n }\n if (ctx.hasFile('yarn.lock')) {\n return createObservation({\n source: 'filesystem:yarn.lock',\n claim: 'Project utilizes Yarn package manager',\n provenance: { type: 'file', path: 'yarn.lock', timestamp: now },\n confidence: 0.99,\n positive: ['yarn', 'package-manager', 'node']\n });\n }\n if (ctx.hasFile('package-lock.json')) {\n return createObservation({\n source: 'filesystem:package-lock.json',\n claim: 'Project utilizes npm as package manager with package-lock.json',\n provenance: { type: 'file', path: 'package-lock.json', timestamp: now },\n confidence: 0.95,\n positive: ['npm', 'package-manager', 'node']\n });\n }\n return null;\n }\n },\n\n // 3. TypeScript Configuration\n {\n id: 'typescript-config',\n name: 'TypeScript Compiler Detector',\n category: 'language',\n async detect(ctx) {\n if (!ctx.hasFile('tsconfig.json')) return null;\n\n const tsconfig = await ctx.readJson<{\n compilerOptions?: {\n target?: string;\n module?: string;\n strict?: boolean;\n jsx?: string;\n };\n }>('tsconfig.json');\n\n const now = new Date().toISOString();\n const opts = tsconfig?.compilerOptions;\n const targetStr = opts?.target ? ` target ${opts.target}` : '';\n const strictStr = opts?.strict ? ' with strict mode' : '';\n\n return createObservation({\n source: 'filesystem:tsconfig.json',\n claim: `Project is configured for TypeScript compilation${targetStr}${strictStr}`,\n provenance: { type: 'file', path: 'tsconfig.json', timestamp: now },\n confidence: 0.99,\n positive: ['typescript', 'ts', ...(opts?.target ? [opts.target.toLowerCase()] : [])],\n details: { language: 'typescript', target: opts?.target, strict: opts?.strict }\n });\n }\n },\n\n // 4. Rust & Cargo\n {\n id: 'rust-cargo',\n name: 'Rust & Cargo Detector',\n category: 'language',\n async detect(ctx) {\n if (!ctx.hasFile('cargo.toml')) return null;\n const now = new Date().toISOString();\n const cargoText = await ctx.readText('Cargo.toml');\n const isWorkspace = cargoText?.includes('[workspace]') ?? false;\n const claim = isWorkspace\n ? 'Project utilizes Rust with Cargo workspace configuration'\n : 'Project utilizes Rust and Cargo';\n\n return createObservation({\n source: 'filesystem:cargo.toml',\n claim,\n provenance: { type: 'file', path: 'Cargo.toml', timestamp: now },\n confidence: 0.99,\n positive: ['rust', 'cargo', ...(isWorkspace ? ['workspace'] : [])],\n details: { ecosystem: 'rust', isWorkspace }\n });\n }\n },\n\n // 5. Go Modules\n {\n id: 'go-module',\n name: 'Go Modules Detector',\n category: 'language',\n async detect(ctx) {\n if (!ctx.hasFile('go.mod')) return null;\n const now = new Date().toISOString();\n const goModText = await ctx.readText('go.mod');\n const modMatch = goModText?.match(/^module\\s+([^\\s]+)/m);\n const modName = modMatch ? ` (${modMatch[1]})` : '';\n\n return createObservation({\n source: 'filesystem:go.mod',\n claim: `Project utilizes Go modules${modName}`,\n provenance: { type: 'file', path: 'go.mod', timestamp: now },\n confidence: 0.99,\n positive: ['go', 'golang'],\n details: { ecosystem: 'go', module: modMatch ? modMatch[1] : undefined }\n });\n }\n },\n\n // 6. Python Environment\n {\n id: 'python-project',\n name: 'Python Environment Detector',\n category: 'language',\n detect(ctx) {\n const hasPyproject = ctx.hasFile('pyproject.toml');\n const hasReqs = ctx.hasFile('requirements.txt');\n const hasPipfile = ctx.hasFile('pipfile');\n const hasUvLock = ctx.hasFile('uv.lock');\n const hasPoetry = ctx.hasFile('poetry.lock');\n\n if (!hasPyproject && !hasReqs && !hasPipfile && !hasUvLock && !hasPoetry) {\n return null;\n }\n\n const now = new Date().toISOString();\n const tools: string[] = [];\n if (hasUvLock) tools.push('uv');\n if (hasPoetry) tools.push('poetry');\n if (hasPyproject) tools.push('pyproject.toml');\n if (hasReqs) tools.push('requirements.txt');\n\n return createObservation({\n source: 'filesystem:python',\n claim: `Project contains Python dependencies (${tools.join(', ')})`,\n provenance: {\n type: 'file',\n path: hasPyproject ? 'pyproject.toml' : hasReqs ? 'requirements.txt' : 'uv.lock',\n timestamp: now\n },\n confidence: 0.95,\n positive: ['python', 'py', ...tools],\n details: { ecosystem: 'python', tools }\n });\n }\n },\n\n // 7. Monorepo & Workspaces\n {\n id: 'monorepo',\n name: 'Monorepo Workspace Detector',\n category: 'monorepo',\n detect(ctx) {\n const hasTurbo = ctx.hasFile('turbo.json');\n const hasNx = ctx.hasFile('nx.json');\n const hasPnpmWs = ctx.hasFile('pnpm-workspace.yaml');\n const hasLerna = ctx.hasFile('lerna.json');\n\n if (!hasTurbo && !hasNx && !hasPnpmWs && !hasLerna) {\n return null;\n }\n\n const now = new Date().toISOString();\n const tools: string[] = [];\n if (hasTurbo) tools.push('turborepo');\n if (hasNx) tools.push('nx');\n if (hasPnpmWs) tools.push('pnpm-workspaces');\n if (hasLerna) tools.push('lerna');\n\n return createObservation({\n source: 'filesystem:monorepo',\n claim: `Project is structured as a monorepo workspace managed by ${tools.join(', ')}`,\n provenance: { type: 'file', path: hasTurbo ? 'turbo.json' : hasPnpmWs ? 'pnpm-workspace.yaml' : 'nx.json', timestamp: now },\n confidence: 0.95,\n positive: ['monorepo', 'workspace', ...tools]\n });\n }\n },\n\n // 8. Testing Suites\n {\n id: 'testing-suite',\n name: 'Testing Suite & Framework Detector',\n category: 'testing',\n detect(ctx) {\n const now = new Date().toISOString();\n const hasVitest = ctx.hasFile('vitest.config.ts') || ctx.hasFile('vitest.config.js') || ctx.hasFile('vitest.config.mts');\n const hasJest = ctx.hasFile('jest.config.js') || ctx.hasFile('jest.config.ts');\n const hasPlaywright = ctx.hasFile('playwright.config.ts') || ctx.hasFile('playwright.config.js');\n const hasPytest = ctx.hasFile('pytest.ini') || ctx.hasFile('conftest.py');\n\n const testFiles = ctx.findFiles(\n (f) =>\n f.relativePath.includes('test') ||\n f.relativePath.includes('spec') ||\n f.name.endsWith('.test.ts') ||\n f.name.endsWith('.spec.ts') ||\n f.name.endsWith('.test.js') ||\n f.name.endsWith('_test.go') ||\n f.name.startsWith('test_')\n );\n\n if (!hasVitest && !hasJest && !hasPlaywright && !hasPytest && testFiles.length === 0) {\n return null;\n }\n\n const frameworks: string[] = [];\n if (hasVitest) frameworks.push('Vitest');\n if (hasJest) frameworks.push('Jest');\n if (hasPlaywright) frameworks.push('Playwright');\n if (hasPytest) frameworks.push('Pytest');\n\n const fwStr = frameworks.length > 0 ? ` (${frameworks.join(', ')})` : '';\n\n return createObservation({\n source: 'filesystem:tests',\n claim: `Project includes automated test suite${fwStr} with ${testFiles.length} test files detected`,\n provenance: { type: 'file', path: 'test', timestamp: now },\n confidence: 0.95,\n positive: ['tests', 'testing', 'qa', ...frameworks.map((f) => f.toLowerCase())],\n details: { testFilesCount: testFiles.length, frameworks }\n });\n }\n },\n\n // 9. Database & ORM\n {\n id: 'database-orm',\n name: 'Database & Schema Detector',\n category: 'database',\n detect(ctx) {\n const now = new Date().toISOString();\n const hasPrisma = ctx.hasFile('schema.prisma') || ctx.hasDirectory('prisma');\n const hasDrizzle = ctx.hasFile('drizzle.config.ts') || ctx.hasFile('drizzle.config.js');\n const hasMigrations = ctx.hasDirectory('migrations') || ctx.hasDirectory('db/migrations');\n\n if (!hasPrisma && !hasDrizzle && !hasMigrations) {\n return null;\n }\n\n const tools: string[] = [];\n if (hasPrisma) tools.push('Prisma');\n if (hasDrizzle) tools.push('Drizzle');\n if (hasMigrations) tools.push('SQL Migrations');\n\n return createObservation({\n source: 'filesystem:database',\n claim: `Project includes database schema and migration tooling: ${tools.join(', ')}`,\n provenance: { type: 'file', path: hasPrisma ? 'prisma/schema.prisma' : 'migrations', timestamp: now },\n confidence: 0.92,\n positive: ['database', 'orm', 'migrations', ...tools.map((t) => t.toLowerCase())]\n });\n }\n },\n\n // 10. Container & DevOps\n {\n id: 'container-devops',\n name: 'Container & Docker Detector',\n category: 'tooling',\n detect(ctx) {\n const now = new Date().toISOString();\n const hasDockerfile = ctx.hasFile('dockerfile');\n const hasCompose = ctx.hasFile('docker-compose.yml') || ctx.hasFile('compose.yaml') || ctx.hasFile('docker-compose.yaml');\n\n if (!hasDockerfile && !hasCompose) return null;\n\n return createObservation({\n source: 'filesystem:docker',\n claim: 'Project includes Docker container configuration',\n provenance: { type: 'file', path: hasDockerfile ? 'Dockerfile' : 'docker-compose.yml', timestamp: now },\n confidence: 0.95,\n positive: ['docker', 'containers', 'devops']\n });\n }\n },\n\n // 11. CI/CD Workflows\n {\n id: 'ci-cd',\n name: 'CI/CD Workflow Detector',\n category: 'ci-cd',\n detect(ctx) {\n const now = new Date().toISOString();\n const ghWorkflows = ctx.findFiles((f) => f.relativePath.startsWith('.github/workflows/'));\n const hasGitlab = ctx.hasFile('.gitlab-ci.yml');\n\n if (ghWorkflows.length === 0 && !hasGitlab) return null;\n\n const claim = ghWorkflows.length > 0\n ? `Project configures GitHub Actions CI/CD workflows (${ghWorkflows.length} workflow files)`\n : 'Project configures GitLab CI pipeline';\n\n return createObservation({\n source: 'filesystem:ci',\n claim,\n provenance: { type: 'file', path: ghWorkflows.length > 0 ? '.github/workflows' : '.gitlab-ci.yml', timestamp: now },\n confidence: 0.95,\n positive: ['ci', 'github-actions', 'automation']\n });\n }\n },\n\n // 12. Documentation\n {\n id: 'documentation',\n name: 'Project Documentation Detector',\n category: 'documentation',\n detect(ctx) {\n const now = new Date().toISOString();\n const hasReadme = ctx.hasFile('readme.md');\n const hasDocs = ctx.hasDirectory('docs');\n const hasContributing = ctx.hasFile('contributing.md');\n\n if (!hasReadme && !hasDocs && !hasContributing) return null;\n\n return createObservation({\n source: 'filesystem:readme.md',\n claim: 'Root README.md is present for project documentation',\n provenance: { type: 'file', path: 'README.md', timestamp: now },\n confidence: 0.95,\n positive: ['documentation', 'readme']\n });\n }\n },\n\n // 13. Architecture & Code Layout\n {\n id: 'code-layout',\n name: 'Architecture & Layout Pattern Detector',\n category: 'architecture',\n detect(ctx) {\n const now = new Date().toISOString();\n const isCleanArch =\n (ctx.hasDirectory('src/domain') || ctx.hasDirectory('domain')) &&\n (ctx.hasDirectory('src/application') || ctx.hasDirectory('application'));\n\n if (isCleanArch) {\n return createObservation({\n source: 'filesystem:architecture',\n claim: 'Project follows Clean / Hexagonal Architecture layout (domain, application, infrastructure)',\n provenance: { type: 'file', path: 'src', timestamp: now },\n confidence: 0.88,\n positive: ['clean-architecture', 'domain-driven', 'hexagonal']\n });\n }\n\n const isFeatureSliced = ctx.hasDirectory('src/features') || ctx.hasDirectory('src/modules');\n if (isFeatureSliced) {\n return createObservation({\n source: 'filesystem:architecture',\n claim: 'Project follows Feature-sliced or modular directory architecture',\n provenance: { type: 'file', path: 'src', timestamp: now },\n confidence: 0.85,\n positive: ['feature-sliced', 'modular-architecture']\n });\n }\n\n return null;\n }\n }\n];\n\n// --- Default Global Registry ---\n\nexport const defaultRegistry = new ConventionRegistry();\nfor (const detector of BUILTIN_DETECTORS) {\n defaultRegistry.register(detector);\n}\n\n/**\n * Convenience helper to register a new convention detector globally.\n */\nexport function registerConventionDetector(detector: ConventionDetector): void {\n defaultRegistry.register(detector);\n}\n\n/**\n * Analyzes project structure using extensible convention detectors.\n */\nexport async function analyzeProjectStructure(\n files: ScannedFileInfo[],\n rootDir: string,\n registry: ConventionRegistry = defaultRegistry\n): Promise<Observation[]> {\n const ctx = new ProjectContext(files, rootDir);\n return registry.run(ctx);\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport YAML from 'yaml';\nimport type { Observation, EvidenceRelation } from '../core/types.js';\nimport { createObservation } from '../core/knowledge.js';\n\nexport interface MarkdownEvidenceResult {\n observations: Observation[];\n relations?: EvidenceRelation[];\n}\n\nexport interface MarkdownHeading {\n level: number;\n text: string;\n line: number;\n}\n\nexport interface MarkdownAlert {\n type: 'WARNING' | 'CAUTION' | 'IMPORTANT' | 'NOTE' | 'TIP';\n body: string;\n line: number;\n heading?: string;\n}\n\nexport interface MarkdownCodeBlock {\n language: string;\n code: string;\n startLine: number;\n endLine: number;\n heading?: string;\n}\n\nexport interface MarkdownTable {\n headers: string[];\n rows: string[][];\n line: number;\n heading?: string;\n}\n\nexport interface MarkdownTaskItem {\n completed: boolean;\n text: string;\n line: number;\n heading?: string;\n}\n\nexport interface MarkdownLink {\n text: string;\n target: string;\n line: number;\n}\n\nexport interface MarkdownSection {\n heading: MarkdownHeading;\n content: string;\n lines: string[];\n startLine: number;\n endLine: number;\n}\n\nexport interface MarkdownDocument {\n filePath: string;\n relativePath: string;\n baseName: string;\n raw: string;\n lines: string[];\n frontmatter: Record<string, unknown>;\n headings: MarkdownHeading[];\n sections: MarkdownSection[];\n alerts: MarkdownAlert[];\n codeBlocks: MarkdownCodeBlock[];\n tables: MarkdownTable[];\n taskItems: MarkdownTaskItem[];\n links: MarkdownLink[];\n prohibitions: { rule: string; line: number; heading?: string }[];\n}\n\nexport interface MarkdownExtractorResult {\n observations: Observation[];\n relations?: EvidenceRelation[];\n}\n\nexport interface MarkdownExtractor {\n id: string;\n name: string;\n description?: string;\n extract(doc: MarkdownDocument): MarkdownExtractorResult | Promise<MarkdownExtractorResult>;\n}\n\n// --- Markdown Parser to Structured Document Model ---\n\nexport function parseMarkdownDocument(\n content: string,\n filePath: string,\n relativePath: string\n): MarkdownDocument {\n const lines = content.split('\\n');\n const baseName = path.basename(relativePath, '.md').toLowerCase();\n let frontmatter: Record<string, unknown> = {};\n\n const headings: MarkdownHeading[] = [];\n const alerts: MarkdownAlert[] = [];\n const codeBlocks: MarkdownCodeBlock[] = [];\n const tables: MarkdownTable[] = [];\n const taskItems: MarkdownTaskItem[] = [];\n const links: MarkdownLink[] = [];\n const prohibitions: { rule: string; line: number; heading?: string }[] = [];\n\n let currentHeadingText = '';\n let inCodeBlock = false;\n let codeBlockLang = '';\n let codeBlockLines: string[] = [];\n let codeBlockStart = 0;\n\n let inTable = false;\n let tableHeaders: string[] = [];\n let tableRows: string[][] = [];\n let tableStartLine = 0;\n\n let inFrontmatter = false;\n let frontmatterLines: string[] = [];\n let bodyStartIndex = 0;\n\n // 1. Extract Frontmatter if present\n if (lines.length > 0 && lines[0].trim() === '---') {\n inFrontmatter = true;\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].trim() === '---') {\n inFrontmatter = false;\n bodyStartIndex = i + 1;\n try {\n const yamlText = frontmatterLines.join('\\n');\n const parsed = YAML.parse(yamlText);\n if (parsed && typeof parsed === 'object') {\n frontmatter = parsed as Record<string, unknown>;\n }\n } catch {\n // Ignore invalid frontmatter YAML\n }\n break;\n }\n frontmatterLines.push(lines[i]);\n }\n }\n\n // Helper to commit active table\n function commitTable() {\n if (inTable && tableHeaders.length > 0) {\n tables.push({\n headers: tableHeaders,\n rows: tableRows,\n line: tableStartLine,\n heading: currentHeadingText || undefined\n });\n inTable = false;\n tableHeaders = [];\n tableRows = [];\n }\n }\n\n // 2. Parse Document Body\n for (let i = bodyStartIndex; i < lines.length; i++) {\n const rawLine = lines[i];\n const line = rawLine.trim();\n\n // Code block fencing\n const codeMatch = line.match(/^```([a-zA-Z0-9_-]*)/);\n if (codeMatch) {\n if (!inCodeBlock) {\n commitTable();\n inCodeBlock = true;\n codeBlockLang = codeMatch[1] || '';\n codeBlockLines = [];\n codeBlockStart = i + 1;\n } else {\n inCodeBlock = false;\n codeBlocks.push({\n language: codeBlockLang,\n code: codeBlockLines.join('\\n'),\n startLine: codeBlockStart,\n endLine: i + 1,\n heading: currentHeadingText || undefined\n });\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeBlockLines.push(rawLine);\n continue;\n }\n\n // Table parsing\n if (line.startsWith('|') && line.endsWith('|')) {\n const cells = line\n .split('|')\n .slice(1, -1)\n .map((c) => c.trim());\n\n // Check if delimiter row (| --- | --- |)\n const isDelimiter = cells.every((c) => /^:?-+:?$/.test(c));\n\n if (!inTable) {\n commitTable();\n inTable = true;\n tableHeaders = cells;\n tableRows = [];\n tableStartLine = i + 1;\n } else if (!isDelimiter) {\n tableRows.push(cells);\n }\n continue;\n } else {\n commitTable();\n }\n\n // Headings (e.g. # Title, ## Section)\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n if (headingMatch) {\n const level = headingMatch[1].length;\n currentHeadingText = headingMatch[2].trim();\n headings.push({\n level,\n text: currentHeadingText,\n line: i + 1\n });\n continue;\n }\n\n // GitHub-style alerts: > [!WARNING], > [!CAUTION], > [!IMPORTANT], > [!NOTE], > [!TIP]\n const alertMatch = line.match(/^>\\s*\\[!(WARNING|CAUTION|IMPORTANT|NOTE|TIP)\\]/i);\n if (alertMatch) {\n const alertStartLine = i + 1;\n const alertType = alertMatch[1].toUpperCase() as MarkdownAlert['type'];\n const alertLines: string[] = [];\n let j = i + 1;\n while (j < lines.length && lines[j].trim().startsWith('>')) {\n alertLines.push(lines[j].trim().replace(/^>\\s*/, ''));\n j++;\n }\n i = j - 1;\n\n alerts.push({\n type: alertType,\n body: alertLines.join(' ').trim(),\n line: alertStartLine,\n heading: currentHeadingText || undefined\n });\n continue;\n }\n\n // Task Items: - [ ] Open or - [x] Completed\n const taskMatch = line.match(/^[-*]\\s*\\[([ xX])\\]\\s*(.+)$/);\n if (taskMatch) {\n const completed = taskMatch[1].toLowerCase() === 'x';\n const text = taskMatch[2].trim();\n taskItems.push({\n completed,\n text,\n line: i + 1,\n heading: currentHeadingText || undefined\n });\n continue;\n }\n\n // Markdown Links: [text](target)\n const linkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n let match: RegExpExecArray | null;\n while ((match = linkRegex.exec(line)) !== null) {\n const linkText = match[1].trim();\n const linkTarget = match[2].trim();\n if (!linkTarget.startsWith('#')) {\n links.push({\n text: linkText,\n target: linkTarget,\n line: i + 1\n });\n }\n }\n\n // Explicit Prohibitions & Constraints (\"Never\", \"Do not\", \"Must not\", \"Avoid\")\n const prohibMatch = line.match(/\\b(Never|Must not|Do not|Cannot|Avoid)\\s+([^.!?]+[.!?]?)/i);\n if (prohibMatch && !line.startsWith('>')) {\n prohibitions.push({\n rule: `${prohibMatch[1]} ${prohibMatch[2].trim()}`,\n line: i + 1,\n heading: currentHeadingText || undefined\n });\n }\n }\n\n commitTable();\n\n // 3. Build Hierarchical Sections\n const sections: MarkdownSection[] = [];\n for (let idx = 0; idx < headings.length; idx++) {\n const h = headings[idx];\n const nextH = headings[idx + 1];\n const startLine = h.line;\n const endLine = nextH ? nextH.line - 1 : lines.length;\n const secLines = lines.slice(startLine - 1, endLine);\n\n sections.push({\n heading: h,\n content: secLines.join('\\n').trim(),\n lines: secLines,\n startLine,\n endLine\n });\n }\n\n return {\n filePath,\n relativePath,\n baseName,\n raw: content,\n lines,\n frontmatter,\n headings,\n sections,\n alerts,\n codeBlocks,\n tables,\n taskItems,\n links,\n prohibitions\n };\n}\n\n// --- Built-in Markdown Extractors ---\n\nexport const BUILTIN_MARKDOWN_EXTRACTORS: MarkdownExtractor[] = [\n // 1. Frontmatter Extractor\n {\n id: 'frontmatter',\n name: 'YAML Frontmatter Extractor',\n extract(doc) {\n const observations: Observation[] = [];\n const now = new Date().toISOString();\n const fm = doc.frontmatter;\n\n for (const [key, val] of Object.entries(fm)) {\n if (!val || typeof val === 'object' && !Array.isArray(val)) continue;\n const valStr = Array.isArray(val) ? val.join(', ') : String(val);\n const lowerKey = key.toLowerCase();\n\n observations.push(\n createObservation({\n source: `doc:${doc.relativePath}:frontmatter:${lowerKey}`,\n claim: `Document metadata (${lowerKey}): ${valStr}`,\n provenance: { type: 'doc', path: doc.relativePath, line: 1, timestamp: now },\n confidence: 0.92,\n positive: [doc.baseName, lowerKey, ...(Array.isArray(val) ? val.map(String) : [])],\n details: { frontmatterKey: lowerKey, value: val }\n })\n );\n }\n return { observations };\n }\n },\n\n // 2. GitHub Alerts Extractor (> [!WARNING], etc.)\n {\n id: 'github-alerts',\n name: 'GitHub Callouts & Alerts Extractor',\n extract(doc) {\n const observations: Observation[] = [];\n const now = new Date().toISOString();\n\n for (const alert of doc.alerts) {\n if (!alert.body) continue;\n const isCritical = alert.type === 'WARNING' || alert.type === 'CAUTION';\n observations.push(\n createObservation({\n source: `doc:${doc.relativePath}#L${alert.line}`,\n claim: `[${alert.type}] ${alert.body}`,\n provenance: { type: 'doc', path: doc.relativePath, line: alert.line, timestamp: now },\n confidence: isCritical ? 0.96 : 0.88,\n positive: [doc.baseName, alert.type.toLowerCase(), ...(alert.heading ? [alert.heading.toLowerCase()] : [])],\n details: { alertType: alert.type, heading: alert.heading, line: alert.line }\n })\n );\n }\n return { observations };\n }\n },\n\n // 3. ADR & Architectural Decisions Extractor\n {\n id: 'adr-decisions',\n name: 'Architecture Decision Record (ADR/MADR) Extractor',\n extract(doc) {\n const observations: Observation[] = [];\n const now = new Date().toISOString();\n\n let hasContext = false;\n let decision = '';\n let status = '';\n let adrLine = 1;\n\n for (const sec of doc.sections) {\n const lowerHead = sec.heading.text.toLowerCase();\n if (lowerHead.includes('context')) {\n hasContext = true;\n }\n\n if (lowerHead.includes('decision') && !lowerHead.includes('options')) {\n for (const line of sec.lines) {\n const clean = line.replace(/^#{1,6}\\s+/, '').trim();\n if (clean && clean.length > 5 && !clean.toLowerCase().includes('decision')) {\n decision = clean;\n adrLine = sec.heading.line;\n break;\n }\n }\n }\n\n if (lowerHead.includes('status')) {\n for (const line of sec.lines) {\n const clean = line.replace(/^#{1,6}\\s+/, '').trim();\n if (clean && clean.length > 2 && !clean.toLowerCase().includes('status')) {\n status = clean;\n break;\n }\n }\n }\n }\n\n if (hasContext && decision) {\n observations.push(\n createObservation({\n source: `doc:${doc.relativePath}:adr#L${adrLine}`,\n claim: `Architectural Decision in ${doc.relativePath}: ${decision}`,\n provenance: { type: 'doc', path: doc.relativePath, line: adrLine, timestamp: now },\n confidence: 0.95,\n positive: ['adr', 'architecture', 'decision', doc.baseName],\n details: { status: status || 'Accepted', decision }\n })\n );\n }\n\n return { observations };\n }\n },\n\n // 4. Task Lists Extractor (- [ ] and - [x])\n {\n id: 'task-items',\n name: 'Task Items & TODOs Extractor',\n extract(doc) {\n const observations: Observation[] = [];\n const now = new Date().toISOString();\n\n for (const item of doc.taskItems) {\n const tag = item.completed ? 'DONE' : 'TODO';\n observations.push(\n createObservation({\n source: `doc:${doc.relativePath}#L${item.line}:todo`,\n claim: `[${tag}] ${item.text}`,\n provenance: { type: 'doc', path: doc.relativePath, line: item.line, timestamp: now },\n confidence: item.completed ? 0.70 : 0.82,\n positive: ['todo', doc.baseName, ...(item.heading ? [item.heading.toLowerCase()] : [])],\n details: { completed: item.completed, heading: item.heading, line: item.line }\n })\n );\n }\n return { observations };\n }\n },\n\n // 5. Code Block Commands & Configurations\n {\n id: 'code-blocks',\n name: 'Code Block Commands Extractor',\n extract(doc) {\n const observations: Observation[] = [];\n const now = new Date().toISOString();\n\n for (const cb of doc.codeBlocks) {\n const lang = cb.language.toLowerCase();\n if (lang === 'bash' || lang === 'sh' || lang === 'shell' || lang === 'zsh') {\n const lines = cb.code.split('\\n').map((l) => l.trim()).filter((l) => l && !l.startsWith('#'));\n for (const line of lines.slice(0, 3)) {\n if (/^(npm|pnpm|yarn|bun|cargo|go|docker|make|npx)\\b/.test(line)) {\n observations.push(\n createObservation({\n source: `doc:${doc.relativePath}#L${cb.startLine}:cli`,\n claim: `Documented CLI command in ${doc.baseName}: ${line}`,\n provenance: { type: 'doc', path: doc.relativePath, line: cb.startLine, timestamp: now },\n confidence: 0.88,\n positive: ['command', 'cli', doc.baseName],\n details: { command: line, language: lang }\n })\n );\n }\n }\n }\n }\n return { observations };\n }\n },\n\n // 6. Markdown Tables (Configurations & Environment Variables)\n {\n id: 'markdown-tables',\n name: 'Markdown Table Key-Value Extractor',\n extract(doc) {\n const observations: Observation[] = [];\n const now = new Date().toISOString();\n\n for (const table of doc.tables) {\n if (table.headers.length < 2 || table.rows.length === 0) continue;\n const lowerHeaders = table.headers.map((h) => h.toLowerCase());\n\n // Check if table contains key-value configurations, env vars, options, or flags\n const isConfigTable = lowerHeaders.some(\n (h) =>\n h.includes('variable') ||\n h.includes('env') ||\n h.includes('setting') ||\n h.includes('option') ||\n h.includes('command') ||\n h.includes('param') ||\n h.includes('flag') ||\n h.includes('property') ||\n h.includes('key') ||\n h.includes('config')\n );\n\n if (isConfigTable) {\n for (const row of table.rows.slice(0, 10)) {\n const key = row[0];\n const val = row[1];\n const desc = row[2] ? ` (${row[2]})` : '';\n if (key && val) {\n observations.push(\n createObservation({\n source: `doc:${doc.relativePath}#L${table.line}:table:${key}`,\n claim: `Configuration in ${doc.baseName}: ${key} = ${val}${desc}`,\n provenance: { type: 'doc', path: doc.relativePath, line: table.line, timestamp: now },\n confidence: 0.88,\n positive: ['config', key.toLowerCase(), doc.baseName],\n details: { key, value: val, heading: table.heading }\n })\n );\n }\n }\n }\n }\n return { observations };\n }\n },\n\n // 7. Normative Rules & Prohibitions (\"Never\", \"Do not\", \"Must not\")\n {\n id: 'rules-and-prohibitions',\n name: 'Normative Rules & Prohibitions Extractor',\n extract(doc) {\n const observations: Observation[] = [];\n const now = new Date().toISOString();\n\n for (const p of doc.prohibitions) {\n observations.push(\n createObservation({\n source: `doc:${doc.relativePath}#L${p.line}:rule`,\n claim: `[RULE] in ${doc.baseName}: ${p.rule}`,\n provenance: { type: 'doc', path: doc.relativePath, line: p.line, timestamp: now },\n confidence: 0.90,\n positive: ['rule', 'constraint', doc.baseName],\n details: { rule: p.rule, heading: p.heading, line: p.line }\n })\n );\n }\n return { observations };\n }\n },\n\n // 8. Cross-Reference File Links\n {\n id: 'file-links',\n name: 'Cross-Reference File Links Extractor',\n extract(doc) {\n const relations: EvidenceRelation[] = [];\n\n for (const link of doc.links) {\n const target = link.target;\n // Check relative file links (ignore web urls and anchors)\n if (\n !target.startsWith('http://') &&\n !target.startsWith('https://') &&\n !target.startsWith('mailto:') &&\n (target.startsWith('.') || target.includes('/') || /\\.(md|ts|js|json|ya?ml|toml|rs|go|py)$/i.test(target))\n ) {\n const rawTarget = target.split('#')[0].split('?')[0].trim();\n if (rawTarget) {\n const dir = path.dirname(doc.relativePath);\n const resolved =\n dir === '.' || path.isAbsolute(rawTarget)\n ? rawTarget.replace(/^\\.\\//, '')\n : path.normalize(path.join(dir, rawTarget));\n relations.push({\n from: doc.relativePath,\n to: resolved,\n type: 'DOCUMENTS'\n });\n }\n }\n }\n return { observations: [], relations };\n }\n }\n];\n\n// --- Pluggable Markdown Registry ---\n\nexport class MarkdownRegistry {\n private extractors = new Map<string, MarkdownExtractor>();\n\n register(extractor: MarkdownExtractor): this {\n this.extractors.set(extractor.id, extractor);\n return this;\n }\n\n unregister(id: string): boolean {\n return this.extractors.delete(id);\n }\n\n get(id: string): MarkdownExtractor | undefined {\n return this.extractors.get(id);\n }\n\n list(): MarkdownExtractor[] {\n return Array.from(this.extractors.values());\n }\n\n async run(doc: MarkdownDocument): Promise<MarkdownEvidenceResult> {\n const observations: Observation[] = [];\n const relations: EvidenceRelation[] = [];\n\n for (const extractor of this.extractors.values()) {\n try {\n const result = await extractor.extract(doc);\n if (result.observations && result.observations.length > 0) {\n observations.push(...result.observations);\n }\n if (result.relations && result.relations.length > 0) {\n relations.push(...result.relations);\n }\n } catch {\n // Individual extractor failure does not abort scan\n }\n }\n\n return { observations, relations };\n }\n}\n\nexport const defaultMarkdownRegistry = new MarkdownRegistry();\nfor (const ext of BUILTIN_MARKDOWN_EXTRACTORS) {\n defaultMarkdownRegistry.register(ext);\n}\n\n/**\n * Convenience helper to register a new Markdown extractor globally.\n */\nexport function registerMarkdownExtractor(extractor: MarkdownExtractor): void {\n defaultMarkdownRegistry.register(extractor);\n}\n\n/**\n * Parses markdown files into structured evidence without dumping entire documents.\n * Extracts: Frontmatter, ADRs, GitHub alerts, code blocks, tables, task lists, and cross-references.\n */\nexport async function parseMarkdownFile(\n filePath: string,\n relativePath: string,\n registry: MarkdownRegistry = defaultMarkdownRegistry\n): Promise<MarkdownEvidenceResult> {\n let content = '';\n try {\n content = await fs.readFile(filePath, 'utf-8');\n } catch {\n return { observations: [], relations: [] };\n }\n\n const doc = parseMarkdownDocument(content, filePath, relativePath);\n return registry.run(doc);\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { Observation, EvidenceRelation } from '../core/types.js';\nimport { createObservation } from '../core/knowledge.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface GitCommit {\n hash: string;\n author: string;\n date: string;\n subject: string;\n files: string[];\n isMerge: boolean;\n}\n\nexport interface GitScanResult {\n isGitRepo: boolean;\n headCommit?: string;\n commitsScanned: number;\n observations: Observation[];\n relations: EvidenceRelation[];\n}\n\nasync function runGit(args: string[], cwd: string): Promise<string> {\n const { stdout } = await execFileAsync('git', args, {\n cwd,\n maxBuffer: 10 * 1024 * 1024\n });\n return stdout.trim();\n}\n\n/**\n * Checks if directory is inside a valid git repository.\n */\nexport async function isGitRepository(cwd: string): Promise<boolean> {\n try {\n const res = await runGit(['rev-parse', '--is-inside-work-tree'], cwd);\n return res === 'true';\n } catch {\n return false;\n }\n}\n\n/**\n * Inspects Git history for lessons, reverts, hotfixes, and co-changing file relationships.\n * Supports incremental scanning via lastScanCommit.\n */\nexport async function scanGitHistory(\n cwd: string,\n options: { lastScanCommit?: string; maxCommits?: number } = {}\n): Promise<GitScanResult> {\n const isRepo = await isGitRepository(cwd);\n if (!isRepo) {\n return {\n isGitRepo: false,\n commitsScanned: 0,\n observations: [],\n relations: []\n };\n }\n\n let headCommit = '';\n try {\n headCommit = await runGit(['rev-parse', 'HEAD'], cwd);\n } catch {\n // Empty repo with no commits yet\n return {\n isGitRepo: true,\n commitsScanned: 0,\n observations: [],\n relations: []\n };\n }\n\n // Determine git range\n let revisionRange: string[] = [];\n if (options.lastScanCommit && options.lastScanCommit !== headCommit) {\n try {\n // Verify lastScanCommit exists in history\n await runGit(['cat-file', '-e', `${options.lastScanCommit}^{commit}`], cwd);\n revisionRange = [`${options.lastScanCommit}..HEAD`];\n } catch {\n // Commit no longer reachable (e.g. rebased/force-pushed), fallback to recent HEAD\n revisionRange = ['-n', String(options.maxCommits ?? 100), 'HEAD'];\n }\n } else {\n revisionRange = ['-n', String(options.maxCommits ?? 100), 'HEAD'];\n }\n\n const logArgs = [\n 'log',\n ...revisionRange,\n '--name-only',\n '--pretty=format:COMMIT:%H|%an|%aI|%s'\n ];\n\n let rawLog = '';\n try {\n rawLog = await runGit(logArgs, cwd);\n } catch {\n return {\n isGitRepo: true,\n headCommit,\n commitsScanned: 0,\n observations: [],\n relations: []\n };\n }\n\n const commits: GitCommit[] = [];\n const lines = rawLog.split('\\n');\n let currentCommit: GitCommit | null = null;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n if (trimmed.startsWith('COMMIT:')) {\n if (currentCommit) commits.push(currentCommit);\n\n const parts = trimmed.substring('COMMIT:'.length).split('|');\n currentCommit = {\n hash: parts[0] || '',\n author: parts[1] || '',\n date: parts[2] || '',\n subject: parts.slice(3).join('|'),\n files: [],\n isMerge: false\n };\n } else if (currentCommit) {\n currentCommit.files.push(trimmed);\n }\n }\n if (currentCommit) commits.push(currentCommit);\n\n const observations: Observation[] = [];\n const relations: EvidenceRelation[] = [];\n const coChangeMap = new Map<string, number>();\n const fileFixCount = new Map<string, number>();\n\n // 1. Analyze commits\n for (const commit of commits) {\n // Avoid treating huge merge commits (> 15 files) as strong co-change evidence\n if (commit.files.length > 15) {\n commit.isMerge = true;\n continue;\n }\n\n const lowerSubject = commit.subject.toLowerCase();\n const isRevert = lowerSubject.startsWith('revert') || lowerSubject.includes('reverting');\n const isFix =\n lowerSubject.startsWith('fix') ||\n lowerSubject.startsWith('hotfix') ||\n lowerSubject.startsWith('bugfix') ||\n lowerSubject.includes('fix:');\n\n // Pattern 1: Change -> Revert\n if (isRevert && commit.files.length > 0) {\n observations.push(\n createObservation({\n source: `git:${commit.hash}`,\n claim: `Revert recorded in git: \"${commit.subject}\" affecting [${commit.files.slice(0, 5).join(', ')}]`,\n provenance: {\n type: 'git',\n commit: commit.hash,\n author: commit.author,\n timestamp: commit.date\n },\n confidence: 0.95,\n positive: ['revert', ...commit.files.map((f) => f.split('/').pop()?.toLowerCase() || f)],\n negative: ['fragile-change'],\n details: { commit: commit.hash, files: commit.files }\n })\n );\n }\n\n // Pattern 2: Bugfix -> Test Added\n if (isFix && commit.files.length > 1) {\n const testFiles = commit.files.filter((f) => f.includes('test') || f.includes('spec'));\n const srcFiles = commit.files.filter((f) => !f.includes('test') && !f.includes('spec'));\n\n if (testFiles.length > 0 && srcFiles.length > 0) {\n observations.push(\n createObservation({\n source: `git:${commit.hash}:bugfix-test`,\n claim: `Bugfix \"${commit.subject}\" included test verification in ${testFiles.join(', ')}`,\n provenance: {\n type: 'git',\n commit: commit.hash,\n author: commit.author,\n timestamp: commit.date\n },\n confidence: 0.92,\n positive: ['bugfix', 'test-added', ...srcFiles.map((f) => f.split('/').pop()?.toLowerCase() || f)],\n details: { srcFiles, testFiles }\n })\n );\n }\n }\n\n // Count fix occurrences per file for hotspot detection\n if (isFix) {\n for (const file of commit.files) {\n fileFixCount.set(file, (fileFixCount.get(file) ?? 0) + 1);\n }\n }\n\n // Track co-changes for pairs\n if (commit.files.length >= 2 && commit.files.length <= 8) {\n for (let i = 0; i < commit.files.length; i++) {\n for (let j = i + 1; j < commit.files.length; j++) {\n const a = commit.files[i];\n const b = commit.files[j];\n const key = a < b ? `${a} <-> ${b}` : `${b} <-> ${a}`;\n coChangeMap.set(key, (coChangeMap.get(key) ?? 0) + 1);\n }\n }\n }\n }\n\n // Pattern 3: Repeated Fixes Hotspot\n for (const [file, count] of fileFixCount.entries()) {\n if (count >= 3) {\n observations.push(\n createObservation({\n source: `git:hotspot:${file}`,\n claim: `Fragile hotspot: \"${file}\" required ${count} fixes in recent history`,\n provenance: { type: 'git', path: file, timestamp: new Date().toISOString() },\n confidence: 0.88,\n positive: ['hotspot', 'fragile', file.split('/').pop()?.toLowerCase() || file],\n details: { fixCount: count }\n })\n );\n }\n }\n\n // Co-change edges with weight >= 2\n for (const [key, count] of coChangeMap.entries()) {\n if (count >= 2) {\n const [from, to] = key.split(' <-> ');\n relations.push({\n from,\n to,\n type: 'CO_CHANGED',\n weight: count\n });\n relations.push({\n from: to,\n to: from,\n type: 'CO_CHANGED',\n weight: count\n });\n }\n }\n\n return {\n isGitRepo: true,\n headCommit,\n commitsScanned: commits.length,\n observations,\n relations\n };\n}\n","import * as fs from 'node:fs/promises';\nimport * as fsSync from 'node:fs';\nimport * as path from 'node:path';\nimport { createRequire } from 'node:module';\nimport Parser from 'web-tree-sitter';\nimport type { Observation, EvidenceRelation } from '../core/types.js';\nimport { createObservation } from '../core/knowledge.js';\n\nexport interface SourceScanResult {\n observations: Observation[];\n relations: EvidenceRelation[];\n}\n\nconst SOURCE_EXTENSIONS = new Set([\n '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',\n '.py', '.go', '.rs', '.java', '.c', '.cpp',\n '.h', '.hpp', '.rb', '.php', '.cs', '.swift',\n '.kt', '.scala', '.sh', '.bash', '.zsh', '.sql'\n]);\n\nexport function isSourceFile(ext: string): boolean {\n return SOURCE_EXTENSIONS.has(ext.toLowerCase());\n}\n\nconst EXT_TO_WASM: Record<string, string> = {\n '.ts': 'tree-sitter-typescript.wasm',\n '.mts': 'tree-sitter-typescript.wasm',\n '.cts': 'tree-sitter-typescript.wasm',\n '.tsx': 'tree-sitter-tsx.wasm',\n '.js': 'tree-sitter-javascript.wasm',\n '.mjs': 'tree-sitter-javascript.wasm',\n '.cjs': 'tree-sitter-javascript.wasm',\n '.jsx': 'tree-sitter-javascript.wasm',\n '.py': 'tree-sitter-python.wasm',\n '.go': 'tree-sitter-go.wasm',\n '.rs': 'tree-sitter-rust.wasm'\n};\n\n// Tree-sitter WASM Directory Resolution & Parser Cache\nlet wasmBaseDir: string | null = null;\nlet parserInitialized = false;\nlet parserInstance: Parser | null = null;\nconst languageCache = new Map<string, Parser.Language>();\n\nfunction getWasmDir(): string | null {\n if (wasmBaseDir) return wasmBaseDir;\n try {\n const req = createRequire(import.meta.url);\n const pkgJson = req.resolve('tree-sitter-wasms/package.json');\n const outDir = path.join(path.dirname(pkgJson), 'out');\n if (fsSync.existsSync(outDir)) {\n wasmBaseDir = outDir;\n return wasmBaseDir;\n }\n } catch {\n // Fallback to relative candidate paths\n }\n\n const candidateDirs = [\n path.resolve(process.cwd(), 'node_modules/tree-sitter-wasms/out'),\n path.resolve(process.cwd(), '../node_modules/tree-sitter-wasms/out')\n ];\n\n for (const dir of candidateDirs) {\n if (fsSync.existsSync(dir)) {\n wasmBaseDir = dir;\n return wasmBaseDir;\n }\n }\n\n return null;\n}\n\nasync function getParserForWasm(wasmName: string): Promise<Parser | null> {\n const wasmDir = getWasmDir();\n if (!wasmDir) return null;\n\n const wasmPath = path.join(wasmDir, wasmName);\n if (!fsSync.existsSync(wasmPath)) return null;\n\n try {\n if (!parserInitialized) {\n await Parser.init();\n parserInitialized = true;\n }\n\n if (!parserInstance) {\n parserInstance = new Parser();\n }\n\n let lang = languageCache.get(wasmName);\n if (!lang) {\n lang = await Parser.Language.load(wasmPath);\n languageCache.set(wasmName, lang);\n }\n\n parserInstance.setLanguage(lang);\n return parserInstance;\n } catch {\n return null;\n }\n}\n\nfunction cleanQuote(str: string): string {\n return str.replace(/^['\"`]|['\"`]$/g, '').trim();\n}\n\nfunction getEnclosingScope(node: Parser.SyntaxNode): string | undefined {\n let curr = node.parent;\n const parts: string[] = [];\n while (curr) {\n if (\n curr.type === 'class_declaration' ||\n curr.type === 'class_definition' ||\n curr.type === 'function_declaration' ||\n curr.type === 'function_definition' ||\n curr.type === 'method_definition' ||\n curr.type === 'interface_declaration' ||\n curr.type === 'struct_item' ||\n curr.type === 'impl_item'\n ) {\n const name = curr.childForFieldName('name')?.text;\n if (name) parts.unshift(name);\n }\n curr = curr.parent;\n }\n return parts.length > 0 ? parts.join('.') : undefined;\n}\n\nfunction extractCommentObservation(\n node: Parser.SyntaxNode,\n relativePath: string,\n baseName: string,\n now: string\n): Observation | null {\n const text = node.text;\n const match = text.match(/\\b(TODO|FIXME|HACK|DEPRECATED|WARN|NOTE|BUG)\\b:?\\s*(.*)$/i);\n if (!match) return null;\n\n const tag = match[1].toUpperCase();\n const commentText = match[2].trim() || 'Unspecified';\n const scope = getEnclosingScope(node);\n const line = node.startPosition.row + 1;\n const scopePrefix = scope ? ` in ${scope}` : '';\n\n const positive = [tag.toLowerCase(), baseName.toLowerCase()];\n if (scope) {\n for (const part of scope.split('.')) {\n if (part) positive.push(part.toLowerCase());\n }\n }\n\n const confidence = tag === 'DEPRECATED' || tag === 'FIXME' || tag === 'BUG' ? 0.90 : 0.80;\n\n return createObservation({\n source: `code:${relativePath}#L${line}`,\n claim: `[${tag}${scopePrefix}] in ${baseName}: ${commentText}`,\n provenance: { type: 'code', path: relativePath, line, timestamp: now },\n confidence,\n positive,\n details: { tag, text: commentText, scope, line }\n });\n}\n\n// --- AST Extractors ---\n\nfunction extractFromTsJs(\n root: Parser.SyntaxNode,\n relativePath: string,\n baseName: string,\n now: string,\n observations: Observation[],\n relations: EvidenceRelation[]\n) {\n function walk(node: Parser.SyntaxNode) {\n // 1. Imports\n if (node.type === 'import_statement') {\n const source = node.childForFieldName('source');\n if (source) {\n const target = cleanQuote(source.text);\n relations.push({ from: relativePath, to: target, type: 'IMPORTS' });\n }\n }\n\n // 2. Call expression (require / dynamic import)\n if (node.type === 'call_expression') {\n const fn = node.childForFieldName('function');\n if (fn && (fn.text === 'require' || fn.text === 'import')) {\n const args = node.childForFieldName('arguments');\n if (args && args.namedChildCount > 0) {\n const firstArg = args.namedChild(0);\n if (firstArg && (firstArg.type === 'string' || firstArg.type === 'template_string')) {\n const target = cleanQuote(firstArg.text);\n if (target) {\n relations.push({ from: relativePath, to: target, type: 'IMPORTS' });\n }\n }\n }\n }\n }\n\n // 3. Export statements (definitions & re-exports)\n if (node.type === 'export_statement') {\n const source = node.childForFieldName('source');\n if (source) {\n const target = cleanQuote(source.text);\n relations.push({ from: relativePath, to: target, type: 'IMPORTS' });\n }\n\n for (let i = 0; i < node.namedChildCount; i++) {\n const child = node.namedChild(i);\n if (!child) continue;\n\n if (\n child.type === 'function_declaration' ||\n child.type === 'class_declaration' ||\n child.type === 'interface_declaration' ||\n child.type === 'type_alias_declaration' ||\n child.type === 'enum_declaration'\n ) {\n const name = child.childForFieldName('name')?.text;\n const kind = child.type.replace('_declaration', '');\n const line = child.startPosition.row + 1;\n if (name) {\n observations.push(\n createObservation({\n source: `code:${relativePath}#L${line}`,\n claim: `[export ${kind}] ${name} in ${baseName}`,\n provenance: { type: 'code', path: relativePath, line, timestamp: now },\n confidence: 0.85,\n positive: [name.toLowerCase(), kind, baseName.toLowerCase()],\n details: { kind, name, exported: true, line }\n })\n );\n relations.push({\n from: relativePath,\n to: `${relativePath}#${name}`,\n type: 'DEFINES'\n });\n }\n } else if (child.type === 'lexical_declaration') {\n for (let j = 0; j < child.namedChildCount; j++) {\n const decl = child.namedChild(j);\n if (decl && decl.type === 'variable_declarator') {\n const name = decl.childForFieldName('name')?.text;\n const line = decl.startPosition.row + 1;\n if (name) {\n observations.push(\n createObservation({\n source: `code:${relativePath}#L${line}`,\n claim: `[export const] ${name} in ${baseName}`,\n provenance: { type: 'code', path: relativePath, line, timestamp: now },\n confidence: 0.80,\n positive: [name.toLowerCase(), 'const', baseName.toLowerCase()],\n details: { kind: 'const', name, exported: true, line }\n })\n );\n relations.push({\n from: relativePath,\n to: `${relativePath}#${name}`,\n type: 'DEFINES'\n });\n }\n }\n }\n }\n }\n }\n\n // 4. Actionable Comments\n if (node.type === 'comment') {\n const obs = extractCommentObservation(node, relativePath, baseName, now);\n if (obs) observations.push(obs);\n }\n\n // Traverse children\n for (let i = 0; i < node.childCount; i++) {\n const ch = node.child(i);\n if (ch) walk(ch);\n }\n }\n\n walk(root);\n}\n\nfunction extractFromPython(\n root: Parser.SyntaxNode,\n relativePath: string,\n baseName: string,\n now: string,\n observations: Observation[],\n relations: EvidenceRelation[]\n) {\n function walk(node: Parser.SyntaxNode) {\n if (node.type === 'import_statement') {\n for (let i = 0; i < node.namedChildCount; i++) {\n const child = node.namedChild(i);\n if (child && (child.type === 'dotted_name' || child.type === 'aliased_import')) {\n const target = child.type === 'aliased_import' ? child.childForFieldName('name')?.text : child.text;\n if (target) {\n relations.push({ from: relativePath, to: target, type: 'IMPORTS' });\n }\n }\n }\n }\n\n if (node.type === 'import_from_statement') {\n const moduleName = node.childForFieldName('module_name')?.text;\n if (moduleName) {\n relations.push({ from: relativePath, to: moduleName, type: 'IMPORTS' });\n }\n }\n\n if (node.type === 'class_definition' || node.type === 'function_definition') {\n const name = node.childForFieldName('name')?.text;\n const kind = node.type === 'class_definition' ? 'class' : 'def';\n const line = node.startPosition.row + 1;\n if (name && (node.parent?.type === 'module' || node.type === 'class_definition')) {\n observations.push(\n createObservation({\n source: `code:${relativePath}#L${line}`,\n claim: `[${kind}] ${name} in ${baseName}`,\n provenance: { type: 'code', path: relativePath, line, timestamp: now },\n confidence: 0.85,\n positive: [name.toLowerCase(), kind, baseName.toLowerCase()],\n details: { kind, name, line }\n })\n );\n relations.push({\n from: relativePath,\n to: `${relativePath}#${name}`,\n type: 'DEFINES'\n });\n }\n }\n\n if (node.type === 'comment') {\n const obs = extractCommentObservation(node, relativePath, baseName, now);\n if (obs) observations.push(obs);\n }\n\n for (let i = 0; i < node.childCount; i++) {\n const ch = node.child(i);\n if (ch) walk(ch);\n }\n }\n\n walk(root);\n}\n\nfunction extractFromGo(\n root: Parser.SyntaxNode,\n relativePath: string,\n baseName: string,\n now: string,\n observations: Observation[],\n relations: EvidenceRelation[]\n) {\n function walk(node: Parser.SyntaxNode) {\n if (node.type === 'import_spec') {\n const pathNode = node.childForFieldName('path');\n if (pathNode) {\n const target = cleanQuote(pathNode.text);\n relations.push({ from: relativePath, to: target, type: 'IMPORTS' });\n }\n }\n\n if (node.type === 'function_declaration' || node.type === 'method_declaration') {\n const name = node.childForFieldName('name')?.text;\n const line = node.startPosition.row + 1;\n if (name) {\n observations.push(\n createObservation({\n source: `code:${relativePath}#L${line}`,\n claim: `[func] ${name} in ${baseName}`,\n provenance: { type: 'code', path: relativePath, line, timestamp: now },\n confidence: 0.85,\n positive: [name.toLowerCase(), 'func', baseName.toLowerCase()],\n details: { kind: 'func', name, line }\n })\n );\n relations.push({\n from: relativePath,\n to: `${relativePath}#${name}`,\n type: 'DEFINES'\n });\n }\n }\n\n if (node.type === 'type_spec') {\n const name = node.childForFieldName('name')?.text;\n const line = node.startPosition.row + 1;\n if (name) {\n observations.push(\n createObservation({\n source: `code:${relativePath}#L${line}`,\n claim: `[type] ${name} in ${baseName}`,\n provenance: { type: 'code', path: relativePath, line, timestamp: now },\n confidence: 0.85,\n positive: [name.toLowerCase(), 'type', baseName.toLowerCase()],\n details: { kind: 'type', name, line }\n })\n );\n relations.push({\n from: relativePath,\n to: `${relativePath}#${name}`,\n type: 'DEFINES'\n });\n }\n }\n\n if (node.type === 'comment') {\n const obs = extractCommentObservation(node, relativePath, baseName, now);\n if (obs) observations.push(obs);\n }\n\n for (let i = 0; i < node.childCount; i++) {\n const ch = node.child(i);\n if (ch) walk(ch);\n }\n }\n\n walk(root);\n}\n\nfunction extractFromRust(\n root: Parser.SyntaxNode,\n relativePath: string,\n baseName: string,\n now: string,\n observations: Observation[],\n relations: EvidenceRelation[]\n) {\n function walk(node: Parser.SyntaxNode) {\n if (node.type === 'use_declaration') {\n const text = node.text.replace(/^use\\s+/, '').replace(/;$/, '').trim();\n const rootCrate = text.split('::')[0];\n if (rootCrate) {\n relations.push({ from: relativePath, to: rootCrate, type: 'IMPORTS' });\n }\n }\n\n if (\n node.type === 'function_item' ||\n node.type === 'struct_item' ||\n node.type === 'enum_item' ||\n node.type === 'trait_item'\n ) {\n const name = node.childForFieldName('name')?.text;\n const kind = node.type.replace('_item', '');\n const line = node.startPosition.row + 1;\n if (name) {\n observations.push(\n createObservation({\n source: `code:${relativePath}#L${line}`,\n claim: `[${kind}] ${name} in ${baseName}`,\n provenance: { type: 'code', path: relativePath, line, timestamp: now },\n confidence: 0.85,\n positive: [name.toLowerCase(), kind, baseName.toLowerCase()],\n details: { kind, name, line }\n })\n );\n relations.push({\n from: relativePath,\n to: `${relativePath}#${name}`,\n type: 'DEFINES'\n });\n }\n }\n\n if (node.type === 'line_comment' || node.type === 'block_comment') {\n const obs = extractCommentObservation(node, relativePath, baseName, now);\n if (obs) observations.push(obs);\n }\n\n for (let i = 0; i < node.childCount; i++) {\n const ch = node.child(i);\n if (ch) walk(ch);\n }\n }\n\n walk(root);\n}\n\n// --- Fallback Lexical Analyzer ---\n\nfunction analyzeSourceLexical(\n content: string,\n relativePath: string,\n baseName: string,\n now: string\n): SourceScanResult {\n const observations: Observation[] = [];\n const relations: EvidenceRelation[] = [];\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (!line) continue;\n\n // 1. Imports (TS/JS, Python, Go, Rust, C/C++)\n const jsImportMatch = line.match(/(?:import\\s+.*?\\s+from\\s+['\"]([^'\"]+)['\"]|require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\))/);\n if (jsImportMatch) {\n const target = jsImportMatch[1] || jsImportMatch[2];\n relations.push({ from: relativePath, to: target, type: 'IMPORTS' });\n }\n\n const pyImportMatch = line.match(/^(?:from\\s+([a-zA-Z0-9_.]+)\\s+import|import\\s+([a-zA-Z0-9_.]+))/);\n if (pyImportMatch && relativePath.endsWith('.py')) {\n const target = pyImportMatch[1] || pyImportMatch[2];\n relations.push({ from: relativePath, to: target, type: 'IMPORTS' });\n }\n\n const rustUseMatch = line.match(/^use\\s+([a-zA-Z0-9_]+)::/);\n if (rustUseMatch && relativePath.endsWith('.rs')) {\n relations.push({ from: relativePath, to: rustUseMatch[1], type: 'IMPORTS' });\n }\n\n const goImportMatch = line.match(/^import\\s+[\"']([^\"']+)[\"']/);\n if (goImportMatch && relativePath.endsWith('.go')) {\n relations.push({ from: relativePath, to: goImportMatch[1], type: 'IMPORTS' });\n }\n\n // 2. Actionable Code Comments\n const commentMatch = line.match(/\\b(TODO|FIXME|HACK|DEPRECATED|WARN|NOTE|BUG)\\b:?\\s*(.*)$/i);\n if (commentMatch) {\n const tag = commentMatch[1].toUpperCase();\n const text = commentMatch[2].trim() || 'Unspecified';\n const confidence = tag === 'DEPRECATED' || tag === 'FIXME' || tag === 'BUG' ? 0.90 : 0.80;\n observations.push(\n createObservation({\n source: `code:${relativePath}#L${i + 1}`,\n claim: `[${tag}] in ${baseName}: ${text}`,\n provenance: { type: 'code', path: relativePath, line: i + 1, timestamp: now },\n confidence,\n positive: [tag.toLowerCase(), baseName.toLowerCase()],\n details: { tag, text, line: i + 1 }\n })\n );\n }\n }\n\n return { observations, relations };\n}\n\n/**\n * High-performance source code analyzer powered by web-tree-sitter (WASM)\n * with robust lexical fallback. Extracts AST symbols, imports, definitions,\n * and scoped actionable comments without requiring language toolchains.\n */\nexport async function analyzeSourceFile(\n filePath: string,\n relativePath: string\n): Promise<SourceScanResult> {\n const observations: Observation[] = [];\n const relations: EvidenceRelation[] = [];\n\n let content = '';\n try {\n content = await fs.readFile(filePath, 'utf-8');\n } catch {\n return { observations, relations };\n }\n\n // Skip very large generated files (> 500KB)\n if (content.length > 500 * 1024) {\n return { observations, relations };\n }\n\n const now = new Date().toISOString();\n const baseName = path.basename(relativePath);\n const ext = path.extname(relativePath).toLowerCase();\n const wasmName = EXT_TO_WASM[ext];\n\n // Try Tree-sitter AST extraction if language is supported\n if (wasmName) {\n try {\n const parser = await getParserForWasm(wasmName);\n if (parser) {\n const tree = parser.parse(content);\n const root = tree.rootNode;\n\n if (ext === '.ts' || ext === '.mts' || ext === '.cts' || ext === '.tsx' || ext === '.js' || ext === '.jsx' || ext === '.mjs' || ext === '.cjs') {\n extractFromTsJs(root, relativePath, baseName, now, observations, relations);\n } else if (ext === '.py') {\n extractFromPython(root, relativePath, baseName, now, observations, relations);\n } else if (ext === '.go') {\n extractFromGo(root, relativePath, baseName, now, observations, relations);\n } else if (ext === '.rs') {\n extractFromRust(root, relativePath, baseName, now, observations, relations);\n }\n\n return { observations, relations };\n }\n } catch {\n // Tree-sitter failed; fall back to lexical\n }\n }\n\n return analyzeSourceLexical(content, relativePath, baseName, now);\n}\n","import type {\n RuleDefinition,\n RuleSet,\n EvaluatedRule,\n Observation,\n Knowledge\n} from '../core/types.js';\nimport { createObservation } from '../core/knowledge.js';\nimport type { ProjectContext } from '../scanner/filesystem.js';\n\n/**\n * Converts a simple glob-like pattern (e.g. *.sh, src/**\\/*.ts) into a regular expression.\n */\nfunction globToRegex(glob: string): RegExp {\n let pattern = glob.trim().replace(/^\\//, '').replace(/\\/$/, '');\n pattern = pattern.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&');\n pattern = pattern.replace(/\\*\\*/g, '.*');\n pattern = pattern.replace(/\\*/g, '[^/]*');\n pattern = pattern.replace(/\\?/g, '[^/]');\n return new RegExp(`(^|/)${pattern}$`, 'i');\n}\n\n/**\n * Evaluates a single rule condition against the project context.\n */\nexport async function evaluateRule(\n rule: RuleDefinition,\n context: ProjectContext\n): Promise<EvaluatedRule> {\n const cond = rule.when;\n\n // Unconditional rules are always matched\n if (!cond || Object.keys(cond).length === 0) {\n return {\n rule,\n matched: true,\n reason: 'Always active project rule'\n };\n }\n\n const matchedFiles: string[] = [];\n\n // 1. Check has_file condition\n if (cond.has_file) {\n const files = Array.isArray(cond.has_file) ? cond.has_file : [cond.has_file];\n for (const f of files) {\n if (!context.hasFile(f)) {\n return {\n rule,\n matched: false,\n reason: `Required file '${f}' not found in project`\n };\n }\n matchedFiles.push(f);\n }\n }\n\n // 2. Check missing_file condition\n if (cond.missing_file) {\n const files = Array.isArray(cond.missing_file) ? cond.missing_file : [cond.missing_file];\n for (const f of files) {\n if (context.hasFile(f)) {\n return {\n rule,\n matched: false,\n reason: `Prohibited file '${f}' is present in project`\n };\n }\n }\n }\n\n // 3. Check any_file condition\n if (cond.any_file && cond.any_file.length > 0) {\n let anyFound = false;\n for (const f of cond.any_file) {\n if (context.hasFile(f)) {\n anyFound = true;\n matchedFiles.push(f);\n break;\n }\n }\n if (!anyFound) {\n return {\n rule,\n matched: false,\n reason: `None of the expected files were found: ${cond.any_file.join(', ')}`\n };\n }\n }\n\n // 4. Check file_pattern condition\n if (cond.file_pattern) {\n const regex = globToRegex(cond.file_pattern);\n const matches = context.files.filter(\n (f) => regex.test(f.relativePath) || regex.test(f.name)\n );\n if (matches.length === 0) {\n return {\n rule,\n matched: false,\n reason: `No files matched pattern '${cond.file_pattern}'`\n };\n }\n matchedFiles.push(...matches.slice(0, 5).map((m) => m.relativePath));\n }\n\n // 5. Check content_match condition\n if (cond.content_match) {\n const { files: targetFile, pattern } = cond.content_match;\n const regex = new RegExp(pattern, 'm');\n\n if (targetFile) {\n const content = await context.readText(targetFile);\n if (!content || !regex.test(content)) {\n return {\n rule,\n matched: false,\n reason: `Pattern '${pattern}' was not found in file '${targetFile}'`\n };\n }\n matchedFiles.push(targetFile);\n } else {\n // If no specific file target, search across top candidate files\n let contentFound = false;\n for (const file of context.files.slice(0, 20)) {\n const content = await context.readText(file.relativePath);\n if (content && regex.test(content)) {\n contentFound = true;\n matchedFiles.push(file.relativePath);\n break;\n }\n }\n if (!contentFound) {\n return {\n rule,\n matched: false,\n reason: `Pattern '${pattern}' was not found in project files`\n };\n }\n }\n }\n\n return {\n rule,\n matched: true,\n reason: 'Rule condition matched repository structure',\n matchedFiles: matchedFiles.length > 0 ? Array.from(new Set(matchedFiles)) : undefined\n };\n}\n\n/**\n * Evaluates all rules within a RuleSet against the project context.\n */\nexport async function evaluateRuleSet(\n ruleSet: RuleSet,\n context: ProjectContext\n): Promise<EvaluatedRule[]> {\n const results: EvaluatedRule[] = [];\n for (const rule of ruleSet.rules) {\n results.push(await evaluateRule(rule, context));\n }\n return results;\n}\n\n/**\n * Converts a matched rule into a standard Observation.\n */\nexport function ruleToObservation(\n rule: RuleDefinition,\n evaluated: EvaluatedRule,\n sourceFile: string\n): Observation {\n const now = new Date().toISOString();\n const ruleType = rule.type ?? 'rule';\n\n const positive = [\n ...(rule.positive ?? []),\n rule.id,\n ruleType,\n ...(rule.tags ?? [])\n ];\n\n return createObservation({\n source: `rule:${rule.id}`,\n claim: rule.statement,\n confidence: rule.confidence ?? 0.95,\n provenance: {\n type: 'file',\n path: sourceFile,\n timestamp: now\n },\n positive: Array.from(new Set(positive)),\n negative: rule.negative ? [...rule.negative] : [],\n details: {\n ruleId: rule.id,\n ruleName: rule.name,\n ruleType,\n matchedReason: evaluated.reason,\n matchedFiles: evaluated.matchedFiles,\n scope: rule.scope ?? 'project',\n ...(rule.details ?? {})\n }\n });\n}\n\n/**\n * Converts a matched rule into a candidate Knowledge item.\n */\nexport function ruleToCandidateLesson(\n rule: RuleDefinition,\n evaluated: EvaluatedRule,\n obsSource: string\n): Partial<Knowledge> & { statement: string } {\n const ruleType = rule.type ?? 'rule';\n const positive = [\n ...(rule.positive ?? []),\n rule.id,\n ruleType,\n ...(rule.tags ?? [])\n ];\n\n return {\n id: `rule.${rule.id}`,\n type: ruleType,\n statement: rule.statement,\n positive: Array.from(new Set(positive)),\n negative: rule.negative ? [...rule.negative] : [],\n confidence: rule.confidence ?? 0.95,\n evidence: [obsSource],\n scope: rule.scope ?? 'project',\n tags: rule.tags ? [...rule.tags] : []\n };\n}\n","import type { Storage } from '../storage/canonical.js';\nimport type { Knowledge, KnowledgeStatus } from '../core/types.js';\nimport type {\n MetricEvent,\n StatsReport,\n KnowledgeStatsReport,\n KnowledgeHealthCategory,\n EffectivenessRatio\n} from './types.js';\n\nfunction formatPercentage(ratio?: number): string {\n if (ratio === undefined || isNaN(ratio)) {\n return '—';\n }\n return `${(ratio * 100).toFixed(1)}%`;\n}\n\nfunction formatRelativeTime(dateStr?: string | number): string | undefined {\n if (!dateStr) return undefined;\n const ts = typeof dateStr === 'number' ? dateStr : Date.parse(dateStr);\n if (isNaN(ts)) return undefined;\n\n const diffMs = Date.now() - ts;\n const diffSec = Math.floor(diffMs / 1000);\n if (diffSec < 60) return `${diffSec}s ago`;\n const diffMin = Math.floor(diffSec / 60);\n if (diffMin < 60) return `${diffMin}m ago`;\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return `${diffHr}h ago`;\n const diffDays = Math.floor(diffHr / 24);\n return `${diffDays}d ago`;\n}\n\nexport function classifyKnowledgeHealth(\n knowledge: Knowledge,\n knowledgeEvents: MetricEvent[],\n independentSourcesCount: number\n): { category: KnowledgeHealthCategory; reason: string } {\n // 1. Needs Revalidation\n if (knowledge.status === 'needs_revalidation' || knowledge.status === 'stale') {\n return {\n category: 'NEEDS_REVALIDATION',\n reason: 'Underlying source or dependency changed since last validation'\n };\n }\n\n // 2. Frequently Misleading\n const outcomes = knowledgeEvents.filter((e) => e.type === 'outcome') as Array<\n MetricEvent & { type: 'outcome' }\n >;\n const misleadingCount = outcomes.filter(\n (o) => o.result === 'failure' || o.result === 'reverted' || (o as any).result === 'misleading'\n ).length + (knowledge.outcomesSummary?.misleading ?? 0);\n const successCount = outcomes.filter((o) => o.result === 'success').length +\n (knowledge.metrics.successful_outcomes ?? 0);\n\n if (misleadingCount > 0 && misleadingCount >= successCount) {\n return {\n category: 'FREQUENTLY_MISLEADING',\n reason: `${misleadingCount} negative or misleading outcome(s) recorded`\n };\n }\n\n // 3. Frequently Rejected by JEV\n const jevEvents = knowledgeEvents.filter((e) => e.type === 'jev_result') as Array<\n MetricEvent & { type: 'jev_result' }\n >;\n const rejectCount = jevEvents.filter((j) => j.result === 'REJECT').length;\n if (jevEvents.length >= 3 && rejectCount / jevEvents.length >= 0.7) {\n return {\n category: 'FREQUENTLY_REJECTED',\n reason: `Rejected in ${rejectCount} of ${jevEvents.length} JEV evaluations`\n };\n }\n\n // 4. Low Evidence\n if (independentSourcesCount < 2 && knowledge.confidence < 0.75) {\n return {\n category: 'LOW_EVIDENCE',\n reason: `Only ${independentSourcesCount} independent source(s) and confidence < 0.75`\n };\n }\n\n // 5. Unused\n const reuseCount =\n knowledge.metrics.reuse_count +\n knowledgeEvents.filter((e) => e.type === 'knowledge_reused').length;\n const createdAtMs = Date.parse(knowledge.createdAt);\n const ageHours = !isNaN(createdAtMs) ? (Date.now() - createdAtMs) / (1000 * 3600) : 0;\n if (reuseCount === 0 && ageHours > 1) {\n return {\n category: 'UNUSED',\n reason: 'No reuse recorded since creation'\n };\n }\n\n // 6. Healthy\n return {\n category: 'HEALTHY',\n reason: 'Active with verified evidence and clean outcome history'\n };\n}\n\nexport async function computeStats(\n storage: Storage,\n events: MetricEvent[],\n options?: { since?: string; sinceTimestamp?: number }\n): Promise<StatsReport> {\n // 1. Current State Metrics (read directly from current Bilmem state, never drift)\n const allKnowledge = await storage.getAllKnowledge();\n const allUnknowns = await storage.getAllUnknowns();\n\n let active = 0;\n let candidates = 0;\n let conflicted = 0;\n let needsRevalidation = 0;\n let stale = 0;\n\n for (const k of allKnowledge) {\n if (k.status === 'active') active++;\n else if (k.status === 'candidate' || k.stage === 'candidate') candidates++;\n else if (k.status === 'contradicted') conflicted++;\n else if (k.status === 'needs_revalidation') needsRevalidation++;\n else if (k.status === 'stale') stale++;\n }\n\n // 2. Activity Metrics (aggregated from events)\n const learning = {\n observations: 0,\n new: 0,\n merged: 0,\n strengthened: 0,\n specialized: 0,\n superseded: 0,\n contradictions: 0,\n ignoredDuplicates: 0\n };\n\n const resolution = {\n resolveCalls: 0,\n known: 0,\n partiallyKnown: 0,\n unknown: 0,\n conflicted: 0,\n stale: 0\n };\n\n const investigation = {\n repeatedChecksAvoided: 0,\n knowledgeReused: 0,\n questionsSuggested: 0,\n questionsResolved: 0,\n broadSearchesAvoided: 0,\n sourceReadsAvoided: 0,\n investigationsReused: 0\n };\n\n const jev = {\n candidates: 0,\n match: 0,\n possible: 0,\n rejected: 0,\n hardNegativeRejects: 0,\n reasons: {\n hardNegative: 0,\n scopeMismatch: 0,\n insufficientContext: 0,\n staleKnowledge: 0\n }\n };\n\n const actions: Record<string, number> = {};\n\n for (const e of events) {\n switch (e.type) {\n case 'knowledge_created':\n learning.new++;\n break;\n case 'knowledge_merged':\n learning.merged++;\n break;\n case 'knowledge_strengthened':\n learning.strengthened++;\n break;\n case 'knowledge_specialized':\n learning.specialized++;\n break;\n case 'knowledge_superseded':\n learning.superseded++;\n break;\n case 'contradiction_detected':\n learning.contradictions++;\n break;\n case 'duplicate_ignored':\n learning.ignoredDuplicates++;\n break;\n\n case 'resolve':\n resolution.resolveCalls++;\n if (e.state === 'KNOWN') resolution.known++;\n else if (e.state === 'PARTIALLY_KNOWN') resolution.partiallyKnown++;\n else if (e.state === 'UNKNOWN') resolution.unknown++;\n else if (e.state === 'CONFLICTED') resolution.conflicted++;\n else if (e.state === 'STALE') resolution.stale++;\n\n if (e.action) {\n actions[e.action] = (actions[e.action] ?? 0) + 1;\n }\n break;\n\n case 'knowledge_reused':\n investigation.knowledgeReused++;\n break;\n case 'question_suggested':\n investigation.questionsSuggested++;\n break;\n case 'question_resolved':\n investigation.questionsResolved++;\n break;\n case 'broad_search_avoided':\n investigation.broadSearchesAvoided++;\n break;\n case 'source_read_avoided':\n investigation.sourceReadsAvoided++;\n investigation.repeatedChecksAvoided++;\n break;\n case 'investigation_reused':\n investigation.investigationsReused++;\n investigation.repeatedChecksAvoided++;\n break;\n\n case 'jev_result':\n jev.candidates++;\n if (e.result === 'MATCH') jev.match++;\n else if (e.result === 'POSSIBLE') jev.possible++;\n else if (e.result === 'REJECT') {\n jev.rejected++;\n const reason = String(e.reason || '').toUpperCase();\n if (reason.includes('HARD_NEGATIVE') || reason.includes('FORBIDS')) {\n jev.hardNegativeRejects++;\n jev.reasons.hardNegative++;\n } else if (reason.includes('SCOPE')) {\n jev.reasons.scopeMismatch++;\n } else if (reason.includes('STALE')) {\n jev.reasons.staleKnowledge++;\n } else {\n jev.reasons.insufficientContext++;\n }\n }\n break;\n\n case 'jev_hard_negative':\n // Counted if not already accounted for\n break;\n }\n }\n\n // Count total observations from storage\n try {\n const allObs = await storage.getAllObservations();\n learning.observations = allObs.length;\n } catch {\n learning.observations = 0;\n }\n\n // 3. Effectiveness Ratios\n // Knowledge reuse rate: resolve operations that reused existing applicable knowledge / all resolve operations\n const reuseRatio =\n resolution.resolveCalls > 0\n ? Math.min(1.0, (resolution.known + Math.min(resolution.partiallyKnown, investigation.knowledgeReused)) / resolution.resolveCalls)\n : undefined;\n\n const knowledgeReuseRate: EffectivenessRatio = {\n value: reuseRatio,\n formatted: reuseRatio !== undefined ? formatPercentage(reuseRatio) : '— (Not enough observations)',\n formula: 'resolve operations that reused existing applicable knowledge / all resolve operations'\n };\n\n // Resolve success rate: (KNOWN + successfully resolved PARTIALLY_KNOWN) / all completed resolve attempts\n const resolveSuccessRatio =\n resolution.resolveCalls > 0\n ? Math.min(1.0, (resolution.known + investigation.questionsResolved) / resolution.resolveCalls)\n : undefined;\n\n const resolveSuccessRate: EffectivenessRatio = {\n value: resolveSuccessRatio,\n formatted: resolveSuccessRatio !== undefined ? formatPercentage(resolveSuccessRatio) : '— (Not enough observations)',\n formula: '(KNOWN + successfully resolved PARTIALLY_KNOWN) / all completed resolve attempts'\n };\n\n // Question resolution rate: questions resolved / questions suggested\n const questionRatio =\n investigation.questionsSuggested > 0\n ? Math.min(1.0, investigation.questionsResolved / investigation.questionsSuggested)\n : undefined;\n\n const questionResolutionRate: EffectivenessRatio = {\n value: questionRatio,\n formatted: questionRatio !== undefined ? formatPercentage(questionRatio) : '— (Not enough observations)',\n formula: 'questions resolved / questions suggested'\n };\n\n // JEV rejection rate: JEV rejected candidates / all JEV candidates evaluated\n const jevRatio =\n jev.candidates > 0\n ? jev.rejected / jev.candidates\n : undefined;\n\n const jevRejectionRate: EffectivenessRatio = {\n value: jevRatio,\n formatted: jevRatio !== undefined ? formatPercentage(jevRatio) : '— (Not enough observations)',\n formula: 'JEV rejected candidates / all JEV candidates evaluated'\n };\n\n // 4. Knowledge Health Distribution\n const health = {\n healthy: 0,\n needsRevalidation: 0,\n lowEvidence: 0,\n frequentlyRejected: 0,\n frequentlyMisleading: 0,\n unused: 0\n };\n\n const eventsByKnowledge = new Map<string, MetricEvent[]>();\n for (const e of events) {\n const kid = (e as { knowledgeId?: string }).knowledgeId;\n if (kid) {\n const list = eventsByKnowledge.get(kid) || [];\n list.push(e);\n eventsByKnowledge.set(kid, list);\n }\n }\n\n for (const k of allKnowledge) {\n const kEvents = eventsByKnowledge.get(k.id) || [];\n const uniqueSources = new Set(k.evidence.map((ev) => ev.replace(/^(code|file|test|doc):/, '')));\n const { category } = classifyKnowledgeHealth(k, kEvents, uniqueSources.size);\n\n switch (category) {\n case 'HEALTHY':\n health.healthy++;\n break;\n case 'NEEDS_REVALIDATION':\n health.needsRevalidation++;\n break;\n case 'LOW_EVIDENCE':\n health.lowEvidence++;\n break;\n case 'FREQUENTLY_REJECTED':\n health.frequentlyRejected++;\n break;\n case 'FREQUENTLY_MISLEADING':\n health.frequentlyMisleading++;\n break;\n case 'UNUSED':\n health.unused++;\n break;\n }\n }\n\n return {\n since: options?.since,\n sinceTimestamp: options?.sinceTimestamp,\n knowledge: {\n active,\n candidates,\n unknown: allUnknowns.length,\n conflicted,\n needsRevalidation,\n stale,\n total: allKnowledge.length\n },\n learning,\n resolution,\n investigation,\n jev,\n actions,\n effectiveness: {\n knowledgeReuseRate,\n resolveSuccessRate,\n questionResolutionRate,\n jevRejectionRate\n },\n health\n };\n}\n\nexport async function computeKnowledgeStats(\n storage: Storage,\n knowledgeId: string,\n events: MetricEvent[]\n): Promise<KnowledgeStatsReport | undefined> {\n const knowledge = await storage.getKnowledge(knowledgeId);\n if (!knowledge) {\n return undefined;\n }\n\n const kEvents = events.filter((e) => (e as { knowledgeId?: string }).knowledgeId === knowledgeId);\n\n // Usage & Outcomes\n const outcomes = kEvents.filter((e) => e.type === 'outcome') as Array<\n MetricEvent & { type: 'outcome' }\n >;\n const successfulOutcomes =\n knowledge.metrics.successful_outcomes +\n outcomes.filter((o) => o.result === 'success').length;\n const neutralOutcomes =\n (knowledge.outcomesSummary?.neutral ?? 0) +\n outcomes.filter((o) => o.result === 'neutral').length;\n const misleadingOutcomes =\n (knowledge.outcomesSummary?.misleading ?? 0) +\n outcomes.filter((o) => (o as any).result === 'misleading').length;\n const failedOutcomes =\n knowledge.metrics.failed_outcomes +\n outcomes.filter((o) => o.result === 'failure' || o.result === 'reverted').length;\n\n const used =\n knowledge.metrics.reuse_count +\n kEvents.filter((e) => e.type === 'knowledge_reused').length;\n\n // JEV stats\n const jevEvents = kEvents.filter((e) => e.type === 'jev_result') as Array<\n MetricEvent & { type: 'jev_result' }\n >;\n const jevMatch = jevEvents.filter((j) => j.result === 'MATCH').length;\n const jevPossible = jevEvents.filter((j) => j.result === 'POSSIBLE').length;\n const jevRejected = jevEvents.filter((j) => j.result === 'REJECT').length;\n const jevHardNegativeRejects = jevEvents.filter(\n (j) => String(j.reason || '').toUpperCase().includes('HARD_NEGATIVE')\n ).length + kEvents.filter((e) => e.type === 'jev_hard_negative').length;\n\n // Evidence\n const uniqueSources = new Set(knowledge.evidence.map((ev) => ev.replace(/^(code|file|test|doc):/, '')));\n\n // Lifecycle\n const revisions = knowledge.temporal?.revision || knowledge.history?.length || 1;\n const strengthened =\n knowledge.metrics.support_count +\n kEvents.filter((e) => e.type === 'knowledge_strengthened').length;\n const contradictions =\n knowledge.metrics.contradiction_count +\n kEvents.filter((e) => e.type === 'contradiction_detected').length;\n\n const lastUsedStr = formatRelativeTime(knowledge.metrics.last_used);\n const lastValidatedStr = formatRelativeTime(knowledge.updatedAt);\n\n const { category: healthCategory, reason: healthReason } = classifyKnowledgeHealth(\n knowledge,\n kEvents,\n uniqueSources.size\n );\n\n return {\n id: knowledge.id,\n status: knowledge.status,\n stage: knowledge.stage,\n statement: knowledge.statement,\n usage: {\n used,\n successfulOutcomes,\n neutralOutcomes,\n misleadingOutcomes,\n failedOutcomes\n },\n jev: {\n match: jevMatch,\n possible: jevPossible,\n rejected: jevRejected,\n hardNegativeRejects: jevHardNegativeRejects\n },\n evidence: {\n sources: knowledge.evidence.length,\n independentSources: uniqueSources.size,\n sourcesList: knowledge.evidence\n },\n lifecycle: {\n revisions,\n strengthened,\n contradictions,\n lastUsed: lastUsedStr,\n lastValidated: lastValidatedStr,\n health: healthCategory,\n healthReason\n }\n };\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Resolves a --since argument into a numeric unix timestamp in milliseconds.\n * Supports relative duration (e.g. 24h, 7d, 30d) or Git revision (e.g. HEAD~20, commit SHA).\n */\nexport async function resolveSinceTimestamp(\n since: string,\n projectDir: string = process.cwd()\n): Promise<number> {\n const trimmed = since.trim();\n\n // 1. Duration format: e.g. 24h, 7d, 30d, 2w\n const durationMatch = trimmed.match(/^(\\d+)\\s*([smhdw])$/i);\n if (durationMatch) {\n const value = parseInt(durationMatch[1], 10);\n const unit = durationMatch[2].toLowerCase();\n let ms = 0;\n switch (unit) {\n case 's':\n ms = value * 1000;\n break;\n case 'm':\n ms = value * 60 * 1000;\n break;\n case 'h':\n ms = value * 3600 * 1000;\n break;\n case 'd':\n ms = value * 86400 * 1000;\n break;\n case 'w':\n ms = value * 7 * 86400 * 1000;\n break;\n }\n return Date.now() - ms;\n }\n\n // 2. ISO timestamp format: e.g. 2026-09-01T00:00:00Z\n const parsedDate = Date.parse(trimmed);\n if (!isNaN(parsedDate) && trimmed.includes('-')) {\n return parsedDate;\n }\n\n // 3. Git revision format: e.g. HEAD~20, 81ac23, main\n try {\n const { stdout } = await execFileAsync(\n 'git',\n ['log', '-1', '--format=%ct', trimmed],\n { cwd: projectDir }\n );\n const epochSec = parseInt(stdout.trim(), 10);\n if (!isNaN(epochSec) && epochSec > 0) {\n return epochSec * 1000;\n }\n throw new Error(`Invalid git output: ${stdout}`);\n } catch {\n throw new Error(`Unable to resolve Git revision: ${trimmed}`);\n }\n}\n","import { Storage } from '../storage/canonical.js';\nimport type { StatsReport, KnowledgeStatsReport } from './types.js';\nimport { readMetricEvents, resetMetricEvents } from './events.js';\nimport { computeStats, computeKnowledgeStats } from './aggregator.js';\nimport { resolveSinceTimestamp } from './filter.js';\n\nexport * from './types.js';\nexport * from './events.js';\nexport * from './aggregator.js';\nexport * from './filter.js';\nexport * from './format.js';\n\nexport interface RunStatsOptions {\n rootDir?: string;\n since?: string;\n knowledgeId?: string;\n reset?: boolean;\n}\n\n/**\n * High-level stats runner for CLI and programmatic API.\n */\nexport async function runStats(\n options: RunStatsOptions = {}\n): Promise<{\n report?: StatsReport;\n knowledgeReport?: KnowledgeStatsReport;\n reset?: boolean;\n}> {\n const rootDir = options.rootDir || process.cwd();\n const storage = new Storage(rootDir);\n\n // If reset requested:\n if (options.reset) {\n await resetMetricEvents(rootDir);\n return { reset: true };\n }\n\n let sinceTimestamp: number | undefined;\n if (options.since) {\n sinceTimestamp = await resolveSinceTimestamp(options.since, rootDir);\n }\n\n const events = await readMetricEvents(rootDir, {\n sinceTimestamp,\n knowledgeId: options.knowledgeId\n });\n\n if (options.knowledgeId) {\n const knowledgeReport = await computeKnowledgeStats(storage, options.knowledgeId, events);\n return { knowledgeReport };\n }\n\n const report = await computeStats(storage, events, {\n since: options.since,\n sinceTimestamp\n });\n\n return { report };\n}\n","import type {\n InstallResult,\n UninstallResult,\n DoctorReport,\n DoctorFixResult,\n InstallScope\n} from './types.js';\n\nexport function formatInstallResult(\n results: InstallResult[],\n scope: InstallScope,\n projectDir: string,\n dryRun?: boolean\n): string {\n const lines: string[] = [];\n\n if (results.length === 0) {\n return 'No agents installed.';\n }\n\n lines.push(`Scope:\\n ${scope}\\n`);\n if (scope === 'project') {\n lines.push(`Project:\\n ${projectDir}\\n`);\n }\n\n for (const res of results) {\n lines.push(`${res.name}`);\n if (res.actionsTaken.length > 0) {\n for (const action of res.actionsTaken) {\n if (action === 'Already up to date' || action.includes('already')) {\n lines.push(` ✓ ${action}`);\n } else if (action.startsWith('Not detected')) {\n lines.push(` ○ ${action}`);\n } else {\n lines.push(` ✓ ${action}`);\n }\n }\n }\n\n if (res.warnings && res.warnings.length > 0) {\n for (const w of res.warnings) {\n lines.push(` ! ${w}`);\n }\n }\n lines.push('');\n }\n\n if (dryRun) {\n lines.push('Dry run: No files were changed.');\n } else {\n const totalInstalled = results.filter(\n (r) => r.mcpChanged || r.instructionChanged || r.projectInitialized\n ).length;\n if (totalInstalled > 0) {\n lines.push(`${totalInstalled} integration(s) configured successfully.`);\n } else {\n lines.push('No changes required.');\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function formatUninstallResult(\n result: UninstallResult,\n dryRun?: boolean\n): string {\n const lines: string[] = [];\n lines.push(`${result.name}`);\n for (const action of result.actionsTaken) {\n lines.push(` ✓ ${action}`);\n }\n if (result.warnings && result.warnings.length > 0) {\n for (const w of result.warnings) {\n lines.push(` ! ${w}`);\n }\n }\n lines.push('');\n if (dryRun) {\n lines.push('Dry run: No files were changed.');\n } else {\n lines.push(result.message || 'Uninstall complete.');\n }\n return lines.join('\\n');\n}\n\nexport function formatDoctorReport(report: DoctorReport): string {\n const lines: string[] = [];\n lines.push('Bilmem System Diagnostics\\n');\n\n lines.push('Core');\n const s = report.core.storage;\n lines.push(` Storage ${s.status === 'ok' ? '✓' : '!'}${s.details ? ` (${s.details})` : ''}`);\n\n const k = report.core.knowledge;\n lines.push(` Knowledge ${k.status === 'ok' ? '✓' : '!'}${k.details ? ` (${k.details})` : ''}`);\n\n const idx = report.core.searchIndex;\n lines.push(` Search index ${idx.status === 'ok' ? '✓' : '!'}${idx.details ? ` (${idx.details})` : ''}`);\n\n const m = report.core.mcpRuntime;\n lines.push(` MCP runtime ${m.status === 'ok' ? '✓' : '!'}${m.details ? ` (${m.details})` : ''}`);\n lines.push('');\n\n for (const agent of report.agents) {\n lines.push(`${agent.name}`);\n lines.push(` Detected ${agent.detected ? '✓' : '○'}`);\n if (agent.detected || agent.mcp.status !== 'missing' || agent.instructions.status !== 'none') {\n const mcpMark = agent.mcp.status === 'ok' ? '✓' : agent.mcp.status === 'outdated' ? '!' : '✗';\n lines.push(` MCP ${mcpMark}${agent.mcp.details ? ` (${agent.mcp.details})` : ''}`);\n\n const instMark =\n agent.instructions.status === 'ok'\n ? '✓'\n : agent.instructions.status === 'outdated'\n ? '!'\n : agent.instructions.status === 'missing'\n ? '✗'\n : '○';\n lines.push(` Instructions ${instMark}${agent.instructions.details ? ` (${agent.instructions.details})` : ''}`);\n\n const cmdMark = agent.command.status === 'ok' ? '✓' : '!';\n lines.push(` Connection ${cmdMark}${agent.command.details ? ` (${agent.command.details})` : ''}`);\n }\n lines.push('');\n }\n\n if (report.issuesCount > 0 && report.canFix) {\n lines.push(`Found ${report.issuesCount} fixable issue(s). Run \"bilmem doctor --fix\" to repair.`);\n } else if (report.issuesCount === 0) {\n lines.push('All systems and detected integrations are healthy.');\n }\n\n return lines.join('\\n');\n}\n\nexport function formatDoctorFixResult(fixed: DoctorFixResult): string {\n const lines: string[] = [];\n lines.push('Bilmem Repair Results\\n');\n\n if (fixed.coreFixed.length > 0) {\n lines.push('Core');\n for (const item of fixed.coreFixed) {\n lines.push(` ✓ ${item}`);\n }\n lines.push('');\n }\n\n const agentNames = Object.keys(fixed.agentsFixed);\n if (agentNames.length > 0) {\n for (const name of agentNames) {\n lines.push(name);\n for (const item of fixed.agentsFixed[name]) {\n lines.push(` ✓ ${item}`);\n }\n lines.push('');\n }\n }\n\n if (fixed.coreFixed.length === 0 && agentNames.length === 0) {\n lines.push('No repair actions were needed.');\n } else if (fixed.dryRun) {\n lines.push('Dry run: No files were changed.');\n } else {\n lines.push('Repair complete.');\n }\n\n return lines.join('\\n');\n}\n"],"mappings":"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","names":["path","fs","path","fs","path","path","path","fs","fs","path","updated","path","path","os","path","os","path","os","path","path","m","tokenize","createHash","createHash","path","fs","path","stat","fs","path","YAML","YAML","fs","path","execFile","promisify","execFileAsync","adapters","results","report"]}
|
|
1
|
+
{"version":3,"sources":["../../src/install/index.ts","../../src/storage/canonical.ts","../../src/rules/loader.ts","../../src/stats/events.ts","../../src/install/adapters/cursor.ts","../../src/install/adapters/base.ts","../../src/install/atomic.ts","../../src/install/instructions.ts","../../src/install/ownership.ts","../../src/install/adapters/claude.ts","../../src/install/adapters/codex.ts","../../src/install/adapters/gemini.ts","../../src/install/adapters/antigravity.ts","../../src/install/registry.ts","../../src/install/doctor.ts","../../src/mcp/server.ts","../../src/search/indexer.ts","../../src/jev/scorer.ts","../../src/jev/matcher.ts","../../src/search/retriever.ts","../../src/jev/explanation.ts","../../src/core/resolver.ts","../../src/core/preflight.ts","../../src/core/dependencies.ts","../../src/core/knowledge.ts","../../src/core/quarantine.ts","../../src/core/unknown.ts","../../src/core/outcome.ts","../../src/core/learn.ts","../../src/scanner/engine.ts","../../src/core/relations.ts","../../src/scanner/filesystem.ts","../../src/scanner/markdown.ts","../../src/scanner/git.ts","../../src/scanner/source.ts","../../src/rules/evaluator.ts","../../src/stats/aggregator.ts","../../src/stats/filter.ts","../../src/stats/index.ts","../../src/install/format.ts"],"sourcesContent":["import * as path from 'node:path';\nimport * as readline from 'node:readline/promises';\nimport { Storage } from '../storage/canonical.js';\nimport type {\n AgentInstaller,\n InstallContext,\n InstallOptions,\n InstallResult,\n InstallScope,\n UninstallOptions,\n UninstallResult,\n DoctorReport,\n DoctorFixResult\n} from './types.js';\nimport { getAllAdapters, getAdapter, detectAgents } from './registry.js';\nimport { runDoctor, runDoctorFix } from './doctor.js';\nimport { CURRENT_INTEGRATION_VERSION } from './instructions.js';\n\nexport * from './types.js';\nexport * from './instructions.js';\nexport * from './atomic.js';\nexport * from './ownership.js';\nexport * from './registry.js';\nexport * from './doctor.js';\nexport * from './format.js';\n\nexport interface CliInstallOptions {\n detected?: boolean;\n all?: boolean;\n yes?: boolean;\n global?: boolean;\n dryRun?: boolean;\n force?: boolean;\n projectDir?: string;\n globalDir?: string;\n bilmemCommand?: string;\n bilmemArgs?: string[];\n}\n\nexport interface CliUninstallOptions {\n global?: boolean;\n dryRun?: boolean;\n projectDir?: string;\n globalDir?: string;\n}\n\nexport interface CliDoctorOptions {\n fix?: boolean;\n dryRun?: boolean;\n global?: boolean;\n projectDir?: string;\n globalDir?: string;\n}\n\n/**\n * Creates an InstallContext from CLI arguments.\n */\nexport function createInstallContext(options: {\n scope?: InstallScope;\n global?: boolean;\n projectDir?: string;\n globalDir?: string;\n bilmemCommand?: string;\n bilmemArgs?: string[];\n}): InstallContext {\n const projectDir = path.resolve(options.projectDir || process.cwd());\n const scope: InstallScope = options.global || options.scope === 'global' ? 'global' : 'project';\n return {\n projectDir,\n globalDir: options.globalDir,\n scope,\n bilmemCommand: options.bilmemCommand || 'bilmem',\n bilmemArgs: options.bilmemArgs || ['mcp'],\n storage: new Storage(projectDir)\n };\n}\n\n/**\n * Main handler for `bilmem install [target]`.\n */\nexport async function handleInstallCommand(\n target?: string,\n options: CliInstallOptions = {}\n): Promise<{ success: boolean; results: InstallResult[]; message?: string }> {\n const context = createInstallContext(options);\n const installOptions: InstallOptions = {\n scope: context.scope,\n dryRun: options.dryRun,\n force: options.force\n };\n\n // 1. Explicit target provided (e.g. bilmem install cursor)\n if (target) {\n const adapter = getAdapter(target);\n if (!adapter) {\n const valid = [...getAllAdapters().map((a) => a.id), 'gemini'].join(', ');\n throw new Error(`Unknown agent/editor target \"${target}\". Supported targets: ${valid}`);\n }\n\n const result = await adapter.install(context, installOptions);\n return {\n success: result.success,\n results: [result]\n };\n }\n\n // 2. Target not provided: detection phase\n const allDetected = await detectAgents(context);\n\n if (options.all) {\n // Attempt installation for every supported integration\n const results: InstallResult[] = [];\n for (const item of allDetected) {\n if (!item.detection.detected) {\n results.push({\n id: item.adapter.id,\n name: item.adapter.name,\n success: true,\n scope: context.scope,\n mcpChanged: false,\n instructionChanged: false,\n projectInitialized: false,\n dryRun: options.dryRun,\n actionsTaken: ['Not detected — skipped']\n });\n continue;\n }\n const res = await item.adapter.install(context, installOptions);\n results.push(res);\n }\n return { success: true, results };\n }\n\n const detectedAdapters = allDetected.filter((d) => d.detection.detected).map((d) => d.adapter);\n\n if (detectedAdapters.length === 0) {\n return {\n success: true,\n results: [],\n message: 'No supported agents or editors detected in this project or environment.'\n };\n }\n\n // If --detected or --yes or non-interactive environment, proceed without prompt\n let shouldProceed = Boolean(options.detected || options.yes);\n\n if (!shouldProceed) {\n if (process.stdin.isTTY) {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n try {\n console.log('Detected agents:\\n');\n for (const item of allDetected) {\n const mark = item.detection.detected ? '✓' : '○';\n console.log(` ${mark} ${item.adapter.name}`);\n }\n console.log('');\n const answer = await rl.question('Install Bilmem into detected agents? [Y/n] ');\n const trimmed = answer.trim().toLowerCase();\n shouldProceed = trimmed === '' || trimmed === 'y' || trimmed === 'yes';\n } finally {\n rl.close();\n }\n } else {\n // Non-interactive without --yes: default to proceed if --detected or non-interactive\n shouldProceed = true;\n }\n }\n\n if (!shouldProceed) {\n return {\n success: true,\n results: [],\n message: 'Installation aborted by user.'\n };\n }\n\n const results: InstallResult[] = [];\n for (const adapter of detectedAdapters) {\n const res = await adapter.install(context, installOptions);\n results.push(res);\n }\n\n return { success: true, results };\n}\n\n/**\n * Main handler for `bilmem uninstall <target>`.\n */\nexport async function handleUninstallCommand(\n target: string,\n options: CliUninstallOptions = {}\n): Promise<{ success: boolean; result: UninstallResult }> {\n const context = createInstallContext(options);\n const adapter = getAdapter(target);\n if (!adapter) {\n const valid = [...getAllAdapters().map((a) => a.id), 'gemini'].join(', ');\n throw new Error(`Unknown agent/editor target \"${target}\". Supported targets: ${valid}`);\n }\n\n const uninstallOptions: UninstallOptions = {\n scope: context.scope,\n dryRun: options.dryRun\n };\n\n const result = await adapter.uninstall(context, uninstallOptions);\n return { success: result.success, result };\n}\n\n/**\n * Main handler for `bilmem doctor`.\n */\nexport async function handleDoctorCommand(\n options: CliDoctorOptions = {}\n): Promise<{ report: DoctorReport; fixed?: DoctorFixResult }> {\n const context = createInstallContext(options);\n\n if (options.fix) {\n const fixed = await runDoctorFix(context, options.dryRun ?? false);\n const report = await runDoctor(context);\n return { report, fixed };\n }\n\n const report = await runDoctor(context);\n return { report };\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n Knowledge,\n Evidence,\n Observation,\n UnknownRecord,\n OutcomeRecord,\n EvidenceRelation,\n BilmemConfig,\n BilmemMetrics,\n RuleSet,\n RuleDefinition,\n RevisionSnapshot,\n KnowledgeDiff,\n InvestigationReceipt\n} from '../core/types.js';\nimport type { KnowledgeStoreProvider } from '../search/retriever.js';\nimport {\n loadRuleSetFile,\n stringifyRuleSetYaml,\n findRuleFiles\n} from '../rules/loader.js';\nimport type { MetricEvent } from '../stats/types.js';\nimport { readMetricEvents, resetMetricEvents } from '../stats/events.js';\n\nexport function sanitizeFileName(id: string): string {\n return encodeURIComponent(id).replace(/%/g, '_');\n}\n\nexport function desanitizeFileName(name: string): string {\n try {\n return decodeURIComponent(name.replace(/_/g, '%'));\n } catch {\n return name;\n }\n}\n\nexport class Storage implements KnowledgeStoreProvider {\n private baseDir: string;\n private knowledgeDir: string;\n private evidenceDir: string;\n private observationDir: string;\n private unknownDir: string;\n private rulesDir: string;\n private configFile: string;\n private relationsFile: string;\n private outcomesFile: string;\n private metricsFile: string;\n private revisionsFile: string;\n private knowledgeJsonlFile: string;\n private evidenceJsonlFile: string;\n private observationJsonlFile: string;\n private unknownsJsonlFile: string;\n private receiptsDir: string;\n private receiptsJsonlFile: string;\n private eventsFile: string;\n\n constructor(rootDir: string = process.cwd()) {\n this.baseDir = path.resolve(rootDir, '.bilmem');\n this.knowledgeDir = path.join(this.baseDir, 'knowledge');\n this.evidenceDir = path.join(this.baseDir, 'evidence');\n this.observationDir = path.join(this.baseDir, 'observations');\n this.unknownDir = path.join(this.baseDir, 'unknowns');\n this.rulesDir = path.join(this.baseDir, 'rules');\n this.receiptsDir = path.join(this.baseDir, 'receipts');\n this.configFile = path.join(this.baseDir, 'config.json');\n this.relationsFile = path.join(this.baseDir, 'relations.json');\n this.outcomesFile = path.join(this.baseDir, 'outcomes.jsonl');\n this.metricsFile = path.join(this.baseDir, 'metrics.json');\n this.revisionsFile = path.join(this.baseDir, 'revisions.jsonl');\n this.knowledgeJsonlFile = path.join(this.baseDir, 'knowledge.jsonl');\n this.evidenceJsonlFile = path.join(this.baseDir, 'evidence.jsonl');\n this.observationJsonlFile = path.join(this.baseDir, 'observations.jsonl');\n this.unknownsJsonlFile = path.join(this.baseDir, 'unknowns.jsonl');\n this.receiptsJsonlFile = path.join(this.baseDir, 'receipts.jsonl');\n this.eventsFile = path.join(this.baseDir, 'events.jsonl');\n }\n\n getBaseDir(): string {\n return this.baseDir;\n }\n\n async isInitialized(): Promise<boolean> {\n try {\n await fs.access(this.configFile);\n return true;\n } catch {\n return false;\n }\n }\n\n async init(options: { projectName?: string; defaultScope?: string } = {}): Promise<BilmemConfig> {\n await fs.mkdir(this.knowledgeDir, { recursive: true });\n await fs.mkdir(this.evidenceDir, { recursive: true });\n await fs.mkdir(this.observationDir, { recursive: true });\n await fs.mkdir(this.unknownDir, { recursive: true });\n await fs.mkdir(this.rulesDir, { recursive: true });\n await fs.mkdir(this.receiptsDir, { recursive: true });\n\n let config: BilmemConfig;\n if (await this.isInitialized()) {\n config = await this.getConfig();\n } else {\n config = {\n schemaVersion: 1,\n projectName: options.projectName ?? path.basename(path.dirname(this.baseDir)) ?? 'project',\n defaultScope: options.defaultScope ?? 'project',\n dataDir: this.baseDir\n };\n await this.saveConfig(config);\n }\n\n // Initialize relations & metrics if missing\n try {\n await fs.access(this.relationsFile);\n } catch {\n await fs.writeFile(this.relationsFile, JSON.stringify([], null, 2), 'utf-8');\n }\n\n try {\n await fs.access(this.metricsFile);\n } catch {\n const defaultMetrics: BilmemMetrics = {\n knowledgeHits: 0,\n knowledgeMisses: 0,\n knowledgeReused: 0,\n unknownsResolved: 0,\n repeatedInvestigationsPrevented: 0,\n candidateKnowledgeMerged: 0,\n staleKnowledgeDetected: 0,\n contradictionsDetected: 0,\n knowledgePromoted: 0,\n knowledgeSuperseded: 0\n };\n await fs.writeFile(this.metricsFile, JSON.stringify(defaultMetrics, null, 2), 'utf-8');\n }\n\n return config;\n }\n\n // --- Config ---\n\n async getConfig(): Promise<BilmemConfig> {\n const raw = await fs.readFile(this.configFile, 'utf-8');\n return JSON.parse(raw) as BilmemConfig;\n }\n\n async saveConfig(config: BilmemConfig): Promise<void> {\n await fs.writeFile(this.configFile, JSON.stringify(config, null, 2), 'utf-8');\n }\n\n async updateConfig(updates: Partial<BilmemConfig>): Promise<BilmemConfig> {\n const current = await this.getConfig();\n const updated = { ...current, ...updates };\n await this.saveConfig(updated);\n return updated;\n }\n\n // --- Knowledge ---\n\n async saveKnowledge(knowledge: Knowledge): Promise<void> {\n await fs.mkdir(this.knowledgeDir, { recursive: true });\n const filename = `${sanitizeFileName(knowledge.id)}.json`;\n const filePath = path.join(this.knowledgeDir, filename);\n await fs.writeFile(filePath, JSON.stringify(knowledge, null, 2), 'utf-8');\n await fs.appendFile(this.knowledgeJsonlFile, JSON.stringify(knowledge) + '\\n', 'utf-8');\n }\n\n async getKnowledge(id: string): Promise<Knowledge | undefined> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.knowledgeDir, filename);\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(raw) as Knowledge;\n } catch {\n return undefined;\n }\n }\n\n async getAllKnowledge(): Promise<Knowledge[]> {\n try {\n const files = await fs.readdir(this.knowledgeDir);\n const items: Knowledge[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const raw = await fs.readFile(path.join(this.knowledgeDir, file), 'utf-8');\n try {\n items.push(JSON.parse(raw));\n } catch {\n // Ignore corrupt file\n }\n }\n return items;\n } catch {\n return [];\n }\n }\n\n async deleteKnowledge(id: string): Promise<boolean> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.knowledgeDir, filename);\n try {\n await fs.unlink(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n // --- Evidence ---\n\n async saveEvidence(evidence: Evidence): Promise<void> {\n await fs.mkdir(this.evidenceDir, { recursive: true });\n const filename = `${sanitizeFileName(evidence.id)}.json`;\n const filePath = path.join(this.evidenceDir, filename);\n await fs.writeFile(filePath, JSON.stringify(evidence, null, 2), 'utf-8');\n await fs.appendFile(this.evidenceJsonlFile, JSON.stringify(evidence) + '\\n', 'utf-8');\n }\n\n async getEvidence(id: string): Promise<Evidence | undefined> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.evidenceDir, filename);\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(raw) as Evidence;\n } catch {\n return undefined;\n }\n }\n\n async getAllEvidence(): Promise<Evidence[]> {\n try {\n const files = await fs.readdir(this.evidenceDir);\n const items: Evidence[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const raw = await fs.readFile(path.join(this.evidenceDir, file), 'utf-8');\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n return items;\n } catch {\n return [];\n }\n }\n\n // --- Observations ---\n\n async saveObservation(obs: Observation): Promise<void> {\n await fs.mkdir(this.observationDir, { recursive: true });\n const filename = `${sanitizeFileName(obs.id)}.json`;\n const filePath = path.join(this.observationDir, filename);\n await fs.writeFile(filePath, JSON.stringify(obs, null, 2), 'utf-8');\n await fs.appendFile(this.observationJsonlFile, JSON.stringify(obs) + '\\n', 'utf-8');\n }\n\n async getObservation(id: string): Promise<Observation | undefined> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.observationDir, filename);\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(raw) as Observation;\n } catch {\n return undefined;\n }\n }\n\n async getAllObservations(): Promise<Observation[]> {\n try {\n const files = await fs.readdir(this.observationDir);\n const items: Observation[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const raw = await fs.readFile(path.join(this.observationDir, file), 'utf-8');\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n return items;\n } catch {\n return [];\n }\n }\n\n async deleteObservation(id: string): Promise<boolean> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.observationDir, filename);\n try {\n await fs.unlink(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n // --- Unknowns ---\n\n async saveUnknown(record: UnknownRecord): Promise<void> {\n await fs.mkdir(this.unknownDir, { recursive: true });\n const filename = `${sanitizeFileName(record.id)}.json`;\n const filePath = path.join(this.unknownDir, filename);\n await fs.writeFile(filePath, JSON.stringify(record, null, 2), 'utf-8');\n await fs.appendFile(this.unknownsJsonlFile, JSON.stringify(record) + '\\n', 'utf-8');\n }\n\n async getUnknown(id: string): Promise<UnknownRecord | undefined> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.unknownDir, filename);\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(raw) as UnknownRecord;\n } catch {\n return undefined;\n }\n }\n\n async getAllUnknowns(): Promise<UnknownRecord[]> {\n try {\n const files = await fs.readdir(this.unknownDir);\n const items: UnknownRecord[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const raw = await fs.readFile(path.join(this.unknownDir, file), 'utf-8');\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n return items;\n } catch {\n return [];\n }\n }\n\n async deleteUnknown(id: string): Promise<boolean> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.unknownDir, filename);\n try {\n await fs.unlink(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n // --- Outcomes (Append-oriented log) ---\n\n async appendOutcome(outcome: OutcomeRecord): Promise<void> {\n const line = JSON.stringify(outcome) + '\\n';\n await fs.appendFile(this.outcomesFile, line, 'utf-8');\n if (outcome.knowledgeId) {\n await this.appendMetricEvent({\n type: 'outcome',\n knowledgeId: outcome.knowledgeId,\n result: outcome.result,\n timestamp: Date.now()\n });\n if (outcome.result === 'success') {\n await this.appendMetricEvent({\n type: 'question_resolved',\n questionId: outcome.knowledgeId,\n timestamp: Date.now()\n });\n }\n }\n }\n\n async getAllOutcomes(): Promise<OutcomeRecord[]> {\n try {\n const raw = await fs.readFile(this.outcomesFile, 'utf-8');\n const lines = raw.split('\\n').filter((l) => l.trim().length > 0);\n return lines.map((l) => JSON.parse(l));\n } catch {\n return [];\n }\n }\n\n // --- Metric Events (Append-only local log) ---\n\n async appendMetricEvent(event: MetricEvent): Promise<void> {\n try {\n await fs.mkdir(this.baseDir, { recursive: true });\n await fs.appendFile(this.eventsFile, JSON.stringify(event) + '\\n', 'utf-8');\n } catch {\n // non-fatal\n }\n }\n\n async getMetricEvents(filter?: { sinceTimestamp?: number; knowledgeId?: string }): Promise<MetricEvent[]> {\n return readMetricEvents(path.dirname(this.baseDir), filter);\n }\n\n async resetMetricEvents(): Promise<void> {\n return resetMetricEvents(path.dirname(this.baseDir));\n }\n\n // --- Investigation Receipts ---\n\n async saveReceipt(receipt: InvestigationReceipt): Promise<void> {\n await fs.mkdir(this.receiptsDir, { recursive: true });\n const filename = `${sanitizeFileName(receipt.id)}.json`;\n const filePath = path.join(this.receiptsDir, filename);\n await fs.writeFile(filePath, JSON.stringify(receipt, null, 2), 'utf-8');\n await fs.appendFile(this.receiptsJsonlFile, JSON.stringify(receipt) + '\\n', 'utf-8');\n }\n\n async getReceipt(id: string): Promise<InvestigationReceipt | undefined> {\n const filename = `${sanitizeFileName(id)}.json`;\n const filePath = path.join(this.receiptsDir, filename);\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n return JSON.parse(raw) as InvestigationReceipt;\n } catch {\n return undefined;\n }\n }\n\n async getAllReceipts(): Promise<InvestigationReceipt[]> {\n try {\n const files = await fs.readdir(this.receiptsDir);\n const items: InvestigationReceipt[] = [];\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n const raw = await fs.readFile(path.join(this.receiptsDir, file), 'utf-8');\n try {\n items.push(JSON.parse(raw));\n } catch {}\n }\n return items;\n } catch {\n return [];\n }\n }\n\n // --- Relations ---\n\n async getRelations(): Promise<EvidenceRelation[]> {\n try {\n const raw = await fs.readFile(this.relationsFile, 'utf-8');\n return JSON.parse(raw) as EvidenceRelation[];\n } catch {\n return [];\n }\n }\n\n async saveRelations(relations: EvidenceRelation[]): Promise<void> {\n await fs.writeFile(this.relationsFile, JSON.stringify(relations, null, 2), 'utf-8');\n }\n\n // --- Metrics ---\n\n async getMetrics(): Promise<BilmemMetrics> {\n try {\n const raw = await fs.readFile(this.metricsFile, 'utf-8');\n return JSON.parse(raw) as BilmemMetrics;\n } catch {\n return {\n knowledgeHits: 0,\n knowledgeMisses: 0,\n knowledgeReused: 0,\n unknownsResolved: 0,\n repeatedInvestigationsPrevented: 0,\n candidateKnowledgeMerged: 0,\n staleKnowledgeDetected: 0,\n contradictionsDetected: 0,\n knowledgePromoted: 0,\n knowledgeSuperseded: 0\n };\n }\n }\n\n async saveMetrics(metrics: BilmemMetrics): Promise<void> {\n await fs.writeFile(this.metricsFile, JSON.stringify(metrics, null, 2), 'utf-8');\n }\n\n // --- Rules ---\n\n getRulesDir(): string {\n return this.rulesDir;\n }\n\n async loadRuleSets(): Promise<RuleSet[]> {\n const files = await findRuleFiles(path.dirname(this.baseDir), this.rulesDir);\n const sets: RuleSet[] = [];\n for (const f of files) {\n try {\n sets.push(await loadRuleSetFile(f));\n } catch {}\n }\n return sets;\n }\n\n async saveRuleSet(ruleSet: RuleSet, fileName: string = 'default.yml'): Promise<string> {\n await fs.mkdir(this.rulesDir, { recursive: true });\n const cleanName = fileName.endsWith('.yml') || fileName.endsWith('.yaml') ? fileName : `${fileName}.yml`;\n const targetPath = path.join(this.rulesDir, cleanName);\n const yaml = stringifyRuleSetYaml(ruleSet);\n await fs.writeFile(targetPath, yaml, 'utf-8');\n return targetPath;\n }\n\n async addRule(rule: RuleDefinition, fileName: string = 'default.yml'): Promise<string> {\n await fs.mkdir(this.rulesDir, { recursive: true });\n const cleanName = fileName.endsWith('.yml') || fileName.endsWith('.yaml') ? fileName : `${fileName}.yml`;\n const targetPath = path.join(this.rulesDir, cleanName);\n\n let existingSet: RuleSet;\n try {\n existingSet = await loadRuleSetFile(targetPath);\n } catch {\n existingSet = {\n name: path.basename(cleanName, path.extname(cleanName)),\n rules: []\n };\n }\n\n const existingIdx = existingSet.rules.findIndex((r) => r.id === rule.id);\n if (existingIdx >= 0) {\n existingSet.rules[existingIdx] = rule;\n } else {\n existingSet.rules.push(rule);\n }\n\n const yaml = stringifyRuleSetYaml(existingSet);\n await fs.writeFile(targetPath, yaml, 'utf-8');\n return targetPath;\n }\n\n // --- Revisions & Incremental Learning Diff ---\n\n async appendRevision(snapshot: RevisionSnapshot): Promise<void> {\n const line = JSON.stringify(snapshot) + '\\n';\n await fs.appendFile(this.revisionsFile, line, 'utf-8');\n }\n\n async getRevisions(): Promise<RevisionSnapshot[]> {\n try {\n const raw = await fs.readFile(this.revisionsFile, 'utf-8');\n const lines = raw.split('\\n').filter((l) => l.trim().length > 0);\n return lines.map((l) => JSON.parse(l));\n } catch {\n return [];\n }\n }\n\n async getLatestRevision(): Promise<RevisionSnapshot | undefined> {\n const revs = await this.getRevisions();\n return revs.length > 0 ? revs[revs.length - 1] : undefined;\n }\n\n async getDiff(sinceRef?: string): Promise<KnowledgeDiff> {\n const revisions = await this.getRevisions();\n let baselineSnapshot: RevisionSnapshot | undefined;\n let targetSnapshot: RevisionSnapshot | undefined;\n\n if (sinceRef && sinceRef.includes('..')) {\n const [startRef, endRef] = sinceRef.split('..').map((s) => s.trim().toLowerCase());\n baselineSnapshot = revisions.find(\n (r) =>\n r.id.toLowerCase() === startRef ||\n r.commit?.toLowerCase() === startRef ||\n r.commit?.toLowerCase().startsWith(startRef) ||\n r.id.toLowerCase().startsWith(startRef)\n );\n targetSnapshot = revisions.find(\n (r) =>\n r.id.toLowerCase() === endRef ||\n r.commit?.toLowerCase() === endRef ||\n r.commit?.toLowerCase().startsWith(endRef) ||\n r.id.toLowerCase().startsWith(endRef)\n );\n } else if (sinceRef) {\n const cleanRef = sinceRef.trim().toLowerCase();\n baselineSnapshot = revisions.find(\n (r) =>\n r.id.toLowerCase() === cleanRef ||\n r.commit?.toLowerCase() === cleanRef ||\n r.commit?.toLowerCase().startsWith(cleanRef) ||\n r.id.toLowerCase().startsWith(cleanRef)\n );\n } else {\n // If no ref provided, compare against the snapshot before the latest (if available)\n if (revisions.length >= 2) {\n baselineSnapshot = revisions[revisions.length - 2];\n } else if (revisions.length === 1) {\n baselineSnapshot = revisions[0];\n }\n }\n\n const baselineTimestamp = baselineSnapshot?.timestamp ?? '1970-01-01T00:00:00.000Z';\n const baselineTime = new Date(baselineTimestamp).getTime();\n const targetTime = targetSnapshot ? new Date(targetSnapshot.timestamp).getTime() : Date.now();\n\n const inWindow = (time: number) => time >= baselineTime && time <= targetTime;\n\n const allObservations = await this.getAllObservations();\n const allKnowledge = await this.getAllKnowledge();\n const allUnknowns = await this.getAllUnknowns();\n\n let observationsAdded = 0;\n for (const obs of allObservations) {\n const obsTime = new Date(obs.recordedAt || obs.provenance?.timestamp || 0).getTime();\n if (inWindow(obsTime)) {\n observationsAdded++;\n }\n }\n\n let candidatesAdded = 0;\n let strengthenedCount = 0;\n let revisedCount = 0;\n let contradictionCount = 0;\n let invalidatedCount = 0;\n let needsRevalidationCount = 0;\n\n const strengthened: string[] = [];\n const revised: string[] = [];\n const contradictions: string[] = [];\n const invalidated: string[] = [];\n const needsRevalidation: string[] = [];\n\n for (const k of allKnowledge) {\n const createdTime = new Date(k.createdAt).getTime();\n const updatedTime = new Date(k.updatedAt).getTime();\n\n if ((k.status === 'invalid' || k.status === 'invalidated') && inWindow(updatedTime)) {\n invalidatedCount++;\n invalidated.push(k.id);\n continue;\n }\n\n if (k.status === 'contradicted' && inWindow(updatedTime)) {\n contradictionCount++;\n contradictions.push(k.id);\n continue;\n }\n\n if ((k.status === 'needs_revalidation' || k.status === 'stale') && inWindow(updatedTime)) {\n needsRevalidationCount++;\n needsRevalidation.push(k.id);\n continue;\n }\n\n if (inWindow(createdTime)) {\n // Newly added knowledge candidate in this window\n candidatesAdded++;\n } else if (inWindow(updatedTime)) {\n // Pre-existing knowledge revised or strengthened\n if (k.metrics.support_count > 1 || k.confidence >= 0.85 || k.metrics.successful_outcomes > 0) {\n strengthenedCount++;\n strengthened.push(k.id);\n } else {\n revisedCount++;\n revised.push(k.id);\n }\n }\n }\n\n let unknownsCount = 0;\n const unknownsList: string[] = [];\n for (const u of allUnknowns) {\n const uTime = new Date(u.createdAt || u.updatedAt || 0).getTime();\n if (inWindow(uTime)) {\n unknownsCount++;\n unknownsList.push(u.id);\n }\n }\n\n const refLabel = sinceRef ?? (baselineSnapshot ? (baselineSnapshot.commit?.slice(0, 7) || baselineSnapshot.id.slice(0, 7)) : undefined);\n\n return {\n sinceRef: refLabel,\n observationsAdded,\n candidatesAdded,\n strengthenedCount,\n revisedCount,\n contradictionCount,\n unknownsCount,\n needsRevalidationCount,\n invalidatedCount,\n details: {\n strengthened,\n revised,\n contradictions,\n unknowns: unknownsList,\n needsRevalidation,\n invalidated\n }\n };\n }\n}\n\nexport function formatKnowledgeDiff(diff: KnowledgeDiff): string {\n const header = diff.sinceRef ? `Since ${diff.sinceRef}:` : 'Recent knowledge changes:';\n const lines = [\n header,\n '',\n `+ ${diff.observationsAdded} observations`,\n `+ ${diff.candidatesAdded} candidates`,\n `↑ ${diff.strengthenedCount} knowledge strengthened`,\n `~ ${diff.revisedCount} knowledge revised`,\n `! ${diff.contradictionCount} contradiction${diff.contradictionCount === 1 ? '' : 's'}`,\n `? ${diff.unknownsCount ?? 0} unknowns`,\n `× ${diff.needsRevalidationCount ?? 0} knowledge needs revalidation`,\n `- ${diff.invalidatedCount} invalidated`\n ];\n return lines.join('\\n');\n}\n\nexport { Storage as CanonicalStorage };\n\n","import YAML from 'yaml';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { RuleDefinition, RuleSet, KnowledgeType } from '../core/types.js';\n\nexport interface RuleValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Validates whether an object conforms to the RuleDefinition specification.\n */\nexport function validateRuleDefinition(rule: unknown, index: number = 0): string[] {\n const errors: string[] = [];\n if (!rule || typeof rule !== 'object') {\n errors.push(`Rule at index ${index} must be an object.`);\n return errors;\n }\n\n const r = rule as Partial<RuleDefinition>;\n if (!r.id || typeof r.id !== 'string' || !r.id.trim()) {\n errors.push(`Rule at index ${index} requires a non-empty string 'id'.`);\n }\n\n if (!r.statement || typeof r.statement !== 'string' || !r.statement.trim()) {\n errors.push(`Rule '${r.id || index}' requires a non-empty string 'statement'.`);\n }\n\n if (r.type) {\n const validTypes: KnowledgeType[] = [\n 'rule',\n 'convention',\n 'decision',\n 'lesson',\n 'architecture',\n 'fact'\n ];\n if (!validTypes.includes(r.type)) {\n errors.push(`Rule '${r.id || index}' has invalid type '${r.type}'. Allowed: ${validTypes.join(', ')}.`);\n }\n }\n\n if (r.confidence !== undefined) {\n if (typeof r.confidence !== 'number' || r.confidence < 0 || r.confidence > 1) {\n errors.push(`Rule '${r.id || index}' confidence must be a number between 0.0 and 1.0.`);\n }\n }\n\n if (r.positive !== undefined && !Array.isArray(r.positive)) {\n errors.push(`Rule '${r.id || index}' positive cues must be an array of strings.`);\n }\n\n if (r.negative !== undefined && !Array.isArray(r.negative)) {\n errors.push(`Rule '${r.id || index}' negative cues must be an array of strings.`);\n }\n\n return errors;\n}\n\n/**\n * Validates a RuleSet structure.\n */\nexport function validateRuleSet(data: unknown): RuleValidationResult {\n const errors: string[] = [];\n if (!data || typeof data !== 'object') {\n return { valid: false, errors: ['RuleSet content must be an object or an array of rules.'] };\n }\n\n let rules: unknown[] = [];\n if (Array.isArray(data)) {\n rules = data;\n } else if ('rules' in data && Array.isArray((data as any).rules)) {\n rules = (data as any).rules;\n } else if ('id' in data && 'statement' in data) {\n rules = [data];\n } else {\n return { valid: false, errors: ['RuleSet must contain a \"rules\" array or be a list of rule definitions.'] };\n }\n\n if (rules.length === 0) {\n errors.push('RuleSet contains no rules.');\n }\n\n rules.forEach((rule, idx) => {\n errors.push(...validateRuleDefinition(rule, idx));\n });\n\n return {\n valid: errors.length === 0,\n errors\n };\n}\n\n/**\n * Parses a YAML string into a normalized RuleSet.\n */\nexport function parseRuleSetYaml(content: string, sourcePath: string = 'inline.yml'): RuleSet {\n let parsed: unknown;\n try {\n parsed = YAML.parse(content);\n } catch (err: any) {\n throw new Error(`YAML syntax error in ${sourcePath}: ${err.message}`);\n }\n\n const validation = validateRuleSet(parsed);\n if (!validation.valid) {\n throw new Error(`Invalid RuleSet in ${sourcePath}:\\n- ${validation.errors.join('\\n- ')}`);\n }\n\n if (Array.isArray(parsed)) {\n return {\n name: path.basename(sourcePath, path.extname(sourcePath)),\n rules: parsed as RuleDefinition[]\n };\n }\n\n if ('id' in (parsed as any) && 'statement' in (parsed as any) && !('rules' in (parsed as any))) {\n return {\n name: (parsed as any).id,\n rules: [parsed as RuleDefinition]\n };\n }\n\n const set = parsed as RuleSet;\n return {\n name: set.name ?? path.basename(sourcePath, path.extname(sourcePath)),\n version: set.version ?? 1,\n scope: set.scope ?? 'project',\n description: set.description,\n rules: set.rules\n };\n}\n\n/**\n * Formats a RuleSet into clean, Git-friendly YAML.\n */\nexport function stringifyRuleSetYaml(ruleSet: RuleSet): string {\n const payload: Record<string, unknown> = {};\n if (ruleSet.name) payload.name = ruleSet.name;\n if (ruleSet.version !== undefined) payload.version = ruleSet.version;\n if (ruleSet.scope) payload.scope = ruleSet.scope;\n if (ruleSet.description) payload.description = ruleSet.description;\n\n payload.rules = ruleSet.rules.map((r) => {\n const ruleObj: Record<string, unknown> = {\n id: r.id\n };\n if (r.name) ruleObj.name = r.name;\n ruleObj.statement = r.statement;\n if (r.type && r.type !== 'rule') ruleObj.type = r.type;\n if (r.confidence !== undefined && r.confidence !== 0.95) ruleObj.confidence = r.confidence;\n if (r.scope && r.scope !== 'project') ruleObj.scope = r.scope;\n if (r.positive && r.positive.length > 0) ruleObj.positive = r.positive;\n if (r.negative && r.negative.length > 0) ruleObj.negative = r.negative;\n if (r.tags && r.tags.length > 0) ruleObj.tags = r.tags;\n if (r.when && Object.keys(r.when).length > 0) ruleObj.when = r.when;\n if (r.details && Object.keys(r.details).length > 0) ruleObj.details = r.details;\n return ruleObj;\n });\n\n return YAML.stringify(payload, { indent: 2, lineWidth: 100 });\n}\n\n/**\n * Reads and parses a single YAML rule file.\n */\nexport async function loadRuleSetFile(filePath: string): Promise<RuleSet> {\n const content = await fs.readFile(filePath, 'utf-8');\n return parseRuleSetYaml(content, filePath);\n}\n\n/**\n * Finds all rule YAML files in standard bilmem locations.\n */\nexport async function findRuleFiles(rootDir: string, storageRulesDir?: string): Promise<string[]> {\n const candidates: string[] = [];\n\n // 1. Storage rules directory: .bilmem/rules/*.yml, *.yaml\n const rulesDir = storageRulesDir || path.resolve(rootDir, '.bilmem', 'rules');\n try {\n const entries = await fs.readdir(rulesDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && (entry.name.endsWith('.yml') || entry.name.endsWith('.yaml'))) {\n candidates.push(path.join(rulesDir, entry.name));\n }\n }\n } catch {\n // Directory might not exist yet\n }\n\n // 2. Storage root: .bilmem/rules.yml, .bilmem/rules.yaml\n for (const name of ['rules.yml', 'rules.yaml']) {\n const p = path.resolve(rootDir, '.bilmem', name);\n try {\n const st = await fs.stat(p);\n if (st.isFile()) candidates.push(p);\n } catch {}\n }\n\n // 3. Project root: rules.yml, rules.yaml, bilmem.rules.yml, bilmem.rules.yaml\n for (const name of ['bilmem.rules.yml', 'bilmem.rules.yaml', 'rules.yml', 'rules.yaml']) {\n const p = path.resolve(rootDir, name);\n try {\n const st = await fs.stat(p);\n if (st.isFile()) candidates.push(p);\n } catch {}\n }\n\n // Deduplicate canonical paths\n return Array.from(new Set(candidates));\n}\n\n/**\n * Loads and combines all rule sets discovered in project and storage.\n */\nexport async function loadAllProjectRuleSets(\n rootDir: string,\n storageRulesDir?: string\n): Promise<{ ruleSets: RuleSet[]; sourceFiles: string[] }> {\n const files = await findRuleFiles(rootDir, storageRulesDir);\n const ruleSets: RuleSet[] = [];\n const loadedFiles: string[] = [];\n\n for (const file of files) {\n try {\n const set = await loadRuleSetFile(file);\n ruleSets.push(set);\n loadedFiles.push(file);\n } catch (err: any) {\n // Log or keep error context without failing the entire scan\n console.warn(`[bilmem] Warning: Failed to load rule set from ${file}: ${err.message}`);\n }\n }\n\n return { ruleSets, sourceFiles: loadedFiles };\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { MetricEvent } from './types.js';\n\nexport function getEventsFilePath(rootDir: string): string {\n return path.join(rootDir, '.bilmem', 'events.jsonl');\n}\n\n/**\n * Appends a metric event to .bilmem/events.jsonl.\n * Fire-and-forget safe: will not crash caller if filesystem error occurs.\n */\nexport async function appendMetricEvent(\n rootDir: string,\n event: MetricEvent\n): Promise<void> {\n const filePath = getEventsFilePath(rootDir);\n try {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n const line = JSON.stringify(event) + '\\n';\n await fs.appendFile(filePath, line, 'utf-8');\n } catch {\n // Non-fatal logging failure: core operations must never fail due to metric tracking\n }\n}\n\n/**\n * Reads all metric events from .bilmem/events.jsonl with resilience against\n * corrupted tails, empty lines, and malformed entries.\n */\nexport async function readMetricEvents(\n rootDir: string,\n filter?: { sinceTimestamp?: number; knowledgeId?: string }\n): Promise<MetricEvent[]> {\n const filePath = getEventsFilePath(rootDir);\n let raw: string;\n try {\n raw = await fs.readFile(filePath, 'utf-8');\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n return [];\n }\n return [];\n }\n\n const lines = raw.split('\\n');\n const events: MetricEvent[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n try {\n const parsed = JSON.parse(trimmed) as MetricEvent;\n if (!parsed || typeof parsed !== 'object' || typeof parsed.type !== 'string') {\n continue;\n }\n if (typeof parsed.timestamp !== 'number') {\n continue;\n }\n\n if (filter?.sinceTimestamp !== undefined && parsed.timestamp < filter.sinceTimestamp) {\n continue;\n }\n\n if (filter?.knowledgeId !== undefined) {\n const kid = (parsed as { knowledgeId?: string }).knowledgeId;\n if (kid !== filter.knowledgeId) {\n continue;\n }\n }\n\n events.push(parsed);\n } catch {\n // Gracefully ignore corrupted line / partial write\n continue;\n }\n }\n\n return events;\n}\n\n/**\n * Safely resets only the metric events log.\n * Preserves all knowledge, evidence, unknowns, rules, and receipts.\n */\nexport async function resetMetricEvents(rootDir: string): Promise<void> {\n const filePath = getEventsFilePath(rootDir);\n try {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, '', 'utf-8');\n } catch (err: any) {\n if (err.code !== 'ENOENT') throw err;\n }\n}\n","import * as path from 'node:path';\nimport * as os from 'node:os';\nimport { BaseAgentAdapter } from './base.js';\nimport type { InstallContext, DetectionResult } from '../types.js';\nimport { pathExists, isExecutableInPath } from '../atomic.js';\n\nexport class CursorAdapter extends BaseAgentAdapter {\n readonly id = 'cursor';\n readonly name = 'Cursor';\n\n resolveConfigPath(context: InstallContext): string {\n if (context.scope === 'project') {\n return path.join(context.projectDir, '.cursor', 'mcp.json');\n }\n const home = context.globalDir || os.homedir();\n return path.join(home, '.cursor', 'mcp.json');\n }\n\n resolveInstructionPath(context: InstallContext): string {\n if (context.scope === 'project') {\n return path.join(context.projectDir, '.cursorrules');\n }\n const home = context.globalDir || os.homedir();\n return path.join(home, '.cursorrules');\n }\n\n async detect(context: InstallContext): Promise<DetectionResult> {\n const reasons: string[] = [];\n\n // Project-level signals\n const dotCursor = path.join(context.projectDir, '.cursor');\n const dotCursorrules = path.join(context.projectDir, '.cursorrules');\n const mcpConfig = path.join(context.projectDir, '.cursor', 'mcp.json');\n\n const hasDotCursor = await pathExists(dotCursor);\n const hasCursorrules = await pathExists(dotCursorrules);\n const hasMcp = await pathExists(mcpConfig);\n\n if (hasDotCursor) reasons.push('Found .cursor/ directory');\n if (hasCursorrules) reasons.push('Found .cursorrules file');\n if (hasMcp) reasons.push('Found .cursor/mcp.json file');\n\n // Global / system signals\n const globalHome = context.globalDir || os.homedir();\n const globalCursor = path.join(globalHome, '.cursor');\n const hasGlobalCursor = await pathExists(globalCursor);\n if (hasGlobalCursor) reasons.push(`Found global directory at ${globalCursor}`);\n\n const hasExecutable = await isExecutableInPath('cursor');\n if (hasExecutable) reasons.push('Found \"cursor\" command in PATH');\n\n const detected = reasons.length > 0;\n const confidence =\n hasDotCursor || hasCursorrules || hasMcp\n ? 'high'\n : hasGlobalCursor || hasExecutable\n ? 'medium'\n : 'low';\n\n return {\n detected,\n confidence: detected ? confidence : 'low',\n reasons,\n supportedScopes: this.supportedScopes\n };\n }\n}\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { Storage } from '../../storage/canonical.js';\nimport type {\n AgentInstaller,\n InstallContext,\n InstallOptions,\n InstallResult,\n InstallScope,\n InstallState,\n UninstallOptions,\n UninstallResult,\n VerifyResult,\n DetectionResult\n} from '../types.js';\nimport {\n safeReadJson,\n updateMcpJsonConfig,\n removeMcpJsonConfig,\n updateMarkdownInstructionFile,\n removeMarkdownInstructionFile,\n updateSkillFile,\n removeSkillFile,\n isExecutableInPath\n} from '../atomic.js';\nimport {\n CURRENT_INTEGRATION_VERSION,\n extractInstructionVersion,\n hasBilmemInstruction,\n getAgentInstructionText,\n getBilmemSkillContent,\n hasBilmemSkill,\n extractSkillVersion\n} from '../instructions.js';\nimport { recordIntegration, removeIntegration } from '../ownership.js';\n\nexport abstract class BaseAgentAdapter implements AgentInstaller {\n abstract readonly id: string;\n abstract readonly name: string;\n readonly aliases?: string[];\n readonly supportedScopes: InstallScope[] = ['project', 'global'];\n\n abstract resolveConfigPath(context: InstallContext): string;\n abstract resolveInstructionPath(context: InstallContext): string;\n resolveSkillPath?(context: InstallContext): string | undefined;\n abstract detect(context: InstallContext): Promise<DetectionResult>;\n\n async inspect(context: InstallContext): Promise<InstallState> {\n const configPath = this.resolveConfigPath(context);\n const instructionPath = this.resolveInstructionPath(context);\n const detection = await this.detect(context);\n\n // Inspect MCP configuration\n const read = await safeReadJson(configPath);\n let mcpConfigured = false;\n let mcpCommandMatches = false;\n\n const targetCommand = context.bilmemCommand || 'bilmem';\n const targetArgs = context.bilmemArgs || ['mcp'];\n\n if (read.exists && !read.error && read.data?.mcpServers?.bilmem) {\n mcpConfigured = true;\n const b = read.data.mcpServers.bilmem;\n const targetMatch =\n b.command === targetCommand &&\n Array.isArray(b.args) &&\n b.args.length === targetArgs.length &&\n b.args.every((v: unknown, i: number) => v === targetArgs[i]);\n\n const wrapperMatch =\n Array.isArray(b.args) &&\n b.args.some((arg: unknown) => typeof arg === 'string' && arg.includes('bilmem'));\n\n mcpCommandMatches = Boolean(targetMatch || wrapperMatch);\n }\n\n // Inspect instruction file\n let instructionInstalled = false;\n let instructionVersion: number | undefined;\n\n try {\n const content = await fs.readFile(instructionPath, 'utf-8');\n instructionInstalled = hasBilmemInstruction(content);\n const extracted = extractInstructionVersion(content);\n if (extracted !== null) {\n instructionVersion = extracted;\n }\n } catch {\n // file does not exist\n }\n\n // Inspect skill file if supported\n let skillInstalled = false;\n let skillVersion: number | undefined;\n const skillPath = this.resolveSkillPath ? this.resolveSkillPath(context) : undefined;\n\n if (skillPath) {\n try {\n const skillContent = await fs.readFile(skillPath, 'utf-8');\n skillInstalled = hasBilmemSkill(skillContent);\n const extracted = extractSkillVersion(skillContent);\n if (extracted !== null) {\n skillVersion = extracted;\n }\n } catch {\n // file does not exist\n }\n }\n\n return {\n id: this.id,\n name: this.name,\n detected: detection.detected,\n scope: context.scope,\n mcpConfigured,\n mcpCommandMatches,\n instructionInstalled,\n instructionVersion,\n skillInstalled: skillPath ? skillInstalled : undefined,\n skillVersion: skillPath ? skillVersion : undefined,\n currentInstructionVersion: CURRENT_INTEGRATION_VERSION,\n configPath,\n instructionPath,\n skillPath,\n details: {\n rawConfigExisted: read.exists,\n configError: read.error\n }\n };\n }\n\n async install(context: InstallContext, options: InstallOptions): Promise<InstallResult> {\n if (!this.supportedScopes.includes(options.scope)) {\n throw new Error(`${this.name} does not support ${options.scope} scope.`);\n }\n\n const configPath = this.resolveConfigPath(context);\n const instructionPath = this.resolveInstructionPath(context);\n const actionsTaken: string[] = [];\n const warnings: string[] = [];\n\n // 1. Ensure project-local .bilmem is initialized when in project scope\n let projectInitialized = false;\n if (context.scope === 'project') {\n const storage = context.storage || new Storage(context.projectDir);\n if (!(await storage.isInitialized())) {\n if (!options.dryRun) {\n await storage.init({ projectName: path.basename(context.projectDir) });\n }\n projectInitialized = true;\n actionsTaken.push('Initialized .bilmem/ storage');\n }\n }\n\n // 2. Safe MCP JSON update\n const targetCommand = context.bilmemCommand || 'bilmem';\n const targetArgs = context.bilmemArgs || ['mcp'];\n const mcpRes = await updateMcpJsonConfig(\n configPath,\n targetCommand,\n targetArgs,\n options.dryRun ?? false\n );\n\n if (mcpRes.changed) {\n actionsTaken.push(`Configured Bilmem MCP server (${targetCommand} ${targetArgs.join(' ')}) in ${configPath}`);\n }\n\n // 3. Safe Markdown instruction update\n const instRes = await updateMarkdownInstructionFile(\n instructionPath,\n getAgentInstructionText(CURRENT_INTEGRATION_VERSION),\n options.dryRun ?? false\n );\n\n if (instRes.changed) {\n actionsTaken.push(`Installed/updated agent instruction block in ${instructionPath}`);\n }\n\n // 3b. Safe Skill file update if supported\n let skillChanged = false;\n const skillPath = this.resolveSkillPath ? this.resolveSkillPath(context) : undefined;\n if (skillPath) {\n const skillRes = await updateSkillFile(\n skillPath,\n getBilmemSkillContent(CURRENT_INTEGRATION_VERSION),\n options.dryRun ?? false\n );\n skillChanged = skillRes.changed;\n if (skillRes.changed) {\n actionsTaken.push(`Installed/updated Antigravity skill in ${skillPath}`);\n }\n }\n\n // 4. Ownership metadata\n if (context.scope === 'project') {\n await recordIntegration(\n context.projectDir,\n this.id,\n {\n scope: options.scope,\n mcp: true,\n mcpConfigPath: path.relative(context.projectDir, configPath),\n instructions: true,\n instructionPath: path.relative(context.projectDir, instructionPath),\n skill: skillPath ? true : undefined,\n skillPath: skillPath ? path.relative(context.projectDir, skillPath) : undefined,\n version: CURRENT_INTEGRATION_VERSION,\n installedAt: new Date().toISOString()\n },\n options.dryRun ?? false\n );\n }\n\n // 5. Check executable availability in PATH\n const resolvable = await isExecutableInPath(targetCommand);\n if (!resolvable && !options.dryRun) {\n warnings.push(`Executable \"${targetCommand}\" is not in system PATH. Ensure it can be run by ${this.name}.`);\n }\n\n const changesMade = mcpRes.changed || instRes.changed || skillChanged || projectInitialized;\n if (!changesMade) {\n actionsTaken.push('Already up to date');\n }\n\n return {\n id: this.id,\n name: this.name,\n success: true,\n scope: options.scope,\n mcpChanged: mcpRes.changed,\n instructionChanged: instRes.changed,\n skillChanged,\n skillPath,\n projectInitialized,\n dryRun: options.dryRun,\n actionsTaken,\n warnings: warnings.length > 0 ? warnings : undefined,\n message: changesMade\n ? `Successfully installed Bilmem for ${this.name}`\n : `Bilmem is already configured for ${this.name}`\n };\n }\n\n async uninstall(context: InstallContext, options: UninstallOptions): Promise<UninstallResult> {\n const configPath = this.resolveConfigPath(context);\n const instructionPath = this.resolveInstructionPath(context);\n const actionsTaken: string[] = [];\n\n // 1. Remove MCP entry\n const mcpRes = await removeMcpJsonConfig(configPath, options.dryRun ?? false);\n if (mcpRes.removed) {\n actionsTaken.push(`Removed Bilmem MCP registration from ${configPath}`);\n }\n\n // 2. Remove instruction block\n const instRes = await removeMarkdownInstructionFile(instructionPath, options.dryRun ?? false);\n if (instRes.removed) {\n actionsTaken.push(`Removed Bilmem instruction block from ${instructionPath}`);\n }\n\n // 2b. Remove skill file if supported\n let skillRemoved = false;\n const skillPath = this.resolveSkillPath ? this.resolveSkillPath(context) : undefined;\n if (skillPath) {\n const skillRes = await removeSkillFile(skillPath, options.dryRun ?? false);\n skillRemoved = skillRes.removed;\n if (skillRes.removed) {\n actionsTaken.push(`Removed Antigravity skill from ${skillPath}`);\n }\n }\n\n // 3. Clean ownership metadata\n if (context.scope === 'project') {\n await removeIntegration(context.projectDir, this.id, options.dryRun ?? false);\n }\n\n const anyRemoved = mcpRes.removed || instRes.removed || skillRemoved;\n if (!anyRemoved) {\n actionsTaken.push('No Bilmem configuration found to remove');\n }\n\n return {\n id: this.id,\n name: this.name,\n success: true,\n scope: options.scope,\n mcpRemoved: mcpRes.removed,\n instructionRemoved: instRes.removed,\n skillRemoved,\n skillPath,\n dryRun: options.dryRun,\n actionsTaken,\n message: anyRemoved\n ? `Successfully uninstalled Bilmem from ${this.name}`\n : `No Bilmem configuration found for ${this.name}`\n };\n }\n\n async verify(context: InstallContext): Promise<VerifyResult> {\n const state = await this.inspect(context);\n const issues: string[] = [];\n const recommendations: string[] = [];\n\n let mcpValid = false;\n let instructionValid = false;\n let skillValid = true;\n\n if (!state.mcpConfigured) {\n issues.push(`MCP server \"bilmem\" is not configured in ${state.configPath}`);\n recommendations.push(`Run \"bilmem install ${this.id}\" to configure MCP`);\n } else if (!state.mcpCommandMatches) {\n issues.push(`MCP server \"bilmem\" has outdated command in ${state.configPath}`);\n recommendations.push(`Run \"bilmem doctor --fix\" to update MCP configuration`);\n } else {\n mcpValid = true;\n }\n\n if (!state.instructionInstalled) {\n issues.push(`Agent instructions missing from ${state.instructionPath}`);\n recommendations.push(`Run \"bilmem install ${this.id}\" to install instructions`);\n } else if (state.instructionVersion !== CURRENT_INTEGRATION_VERSION) {\n issues.push(\n `Agent instructions version (${state.instructionVersion || 'legacy'}) is outdated (current: ${CURRENT_INTEGRATION_VERSION})`\n );\n recommendations.push(`Run \"bilmem doctor --fix\" to update instructions`);\n } else {\n instructionValid = true;\n }\n\n if (state.skillPath) {\n if (!state.skillInstalled) {\n skillValid = false;\n issues.push(`Skill file missing from ${state.skillPath}`);\n recommendations.push(`Run \"bilmem install ${this.id}\" to install the skill`);\n } else if (state.skillVersion !== CURRENT_INTEGRATION_VERSION) {\n skillValid = false;\n issues.push(\n `Skill file version (${state.skillVersion || 'legacy'}) is outdated (current: ${CURRENT_INTEGRATION_VERSION})`\n );\n recommendations.push(`Run \"bilmem doctor --fix\" to update the skill`);\n }\n }\n\n const targetCommand = context.bilmemCommand || 'bilmem';\n const commandResolvable = await isExecutableInPath(targetCommand);\n if (!commandResolvable) {\n issues.push(`Command \"${targetCommand}\" is not found in PATH`);\n recommendations.push(`Ensure \"${targetCommand}\" is installed globally or in your PATH`);\n }\n\n const valid = mcpValid && instructionValid && skillValid && commandResolvable;\n\n return {\n valid,\n mcpValid,\n instructionValid,\n skillValid,\n commandResolvable,\n issues,\n recommendations\n };\n }\n}\n\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { BILMEM_START_MARKER, BILMEM_END_MARKER, getAgentInstructionText } from './instructions.js';\n\nexport interface JsonReadResult {\n exists: boolean;\n data?: any;\n raw?: string;\n error?: string;\n}\n\n/**\n * Atomically writes content to a file via a temporary file and rename.\n */\nexport async function writeAtomic(filePath: string, content: string): Promise<void> {\n const dir = path.dirname(filePath);\n await fs.mkdir(dir, { recursive: true });\n\n const tmpPath = `${filePath}.tmp.${Date.now()}.${Math.random().toString(36).slice(2, 8)}`;\n try {\n await fs.writeFile(tmpPath, content, 'utf-8');\n await fs.rename(tmpPath, filePath);\n } catch (err) {\n try {\n await fs.unlink(tmpPath);\n } catch {\n // ignore cleanup errors\n }\n throw err;\n }\n}\n\n/**\n * Safely reads and parses a JSON file without throwing on missing file.\n * Returns error string if JSON syntax is malformed.\n */\nexport async function safeReadJson(filePath: string): Promise<JsonReadResult> {\n try {\n const raw = await fs.readFile(filePath, 'utf-8');\n try {\n const data = JSON.parse(raw);\n return { exists: true, data, raw };\n } catch (parseErr: any) {\n return { exists: true, raw, error: parseErr.message };\n }\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n return { exists: false };\n }\n return { exists: true, error: err.message };\n }\n}\n\n/**\n * Safely updates an MCP JSON configuration file by adding/updating the \"bilmem\" entry\n * under \"mcpServers\", preserving all existing top-level keys and other MCP servers.\n */\nexport async function updateMcpJsonConfig(\n filePath: string,\n bilmemCommand: string = 'bilmem',\n bilmemArgs: string[] = ['mcp'],\n dryRun: boolean = false\n): Promise<{ changed: boolean; created: boolean; originalExisted: boolean }> {\n const read = await safeReadJson(filePath);\n\n if (read.error) {\n throw new Error(`Configuration at ${filePath} is invalid JSON: ${read.error}. No changes were made.`);\n }\n\n let configObj: Record<string, any>;\n let created = false;\n\n if (!read.exists) {\n configObj = {\n mcpServers: {\n bilmem: {\n command: bilmemCommand,\n args: [...bilmemArgs]\n }\n }\n };\n created = true;\n if (!dryRun) {\n await writeAtomic(filePath, JSON.stringify(configObj, null, 2) + '\\n');\n }\n return { changed: true, created: true, originalExisted: false };\n }\n\n configObj = typeof read.data === 'object' && read.data !== null ? { ...read.data } : {};\n if (!configObj.mcpServers || typeof configObj.mcpServers !== 'object') {\n configObj.mcpServers = {};\n }\n\n const existingEntry = configObj.mcpServers.bilmem;\n const targetEntry = {\n command: bilmemCommand,\n args: [...bilmemArgs]\n };\n\n const isCurrent =\n existingEntry &&\n existingEntry.command === targetEntry.command &&\n Array.isArray(existingEntry.args) &&\n existingEntry.args.length === targetEntry.args.length &&\n existingEntry.args.every((val: unknown, idx: number) => val === targetEntry.args[idx]);\n\n if (isCurrent) {\n return { changed: false, created: false, originalExisted: true };\n }\n\n configObj.mcpServers = {\n ...configObj.mcpServers,\n bilmem: targetEntry\n };\n\n if (!dryRun) {\n await writeAtomic(filePath, JSON.stringify(configObj, null, 2) + '\\n');\n }\n\n return { changed: true, created: false, originalExisted: true };\n}\n\n/**\n * Safely removes the \"bilmem\" entry from an MCP JSON configuration file,\n * preserving all other settings and servers.\n */\nexport async function removeMcpJsonConfig(\n filePath: string,\n dryRun: boolean = false\n): Promise<{ removed: boolean; fileDeleted: boolean }> {\n const read = await safeReadJson(filePath);\n if (!read.exists) {\n return { removed: false, fileDeleted: false };\n }\n\n if (read.error) {\n throw new Error(`Configuration at ${filePath} is invalid JSON: ${read.error}. No changes were made.`);\n }\n\n const configObj = typeof read.data === 'object' && read.data !== null ? { ...read.data } : {};\n if (!configObj.mcpServers || !configObj.mcpServers.bilmem) {\n return { removed: false, fileDeleted: false };\n }\n\n delete configObj.mcpServers.bilmem;\n\n if (!dryRun) {\n await writeAtomic(filePath, JSON.stringify(configObj, null, 2) + '\\n');\n }\n\n return { removed: true, fileDeleted: false };\n}\n\n/**\n * Safely inserts or updates the managed Bilmem instruction block in a markdown file.\n * Preserves all surrounding content.\n */\nexport async function updateMarkdownInstructionFile(\n filePath: string,\n desiredBlock: string = getAgentInstructionText(),\n dryRun: boolean = false\n): Promise<{ changed: boolean; created: boolean; originalExisted: boolean }> {\n let existingContent = '';\n let exists = false;\n\n try {\n existingContent = await fs.readFile(filePath, 'utf-8');\n exists = true;\n } catch (err: any) {\n if (err.code !== 'ENOENT') throw err;\n }\n\n if (!exists) {\n if (!dryRun) {\n await writeAtomic(filePath, desiredBlock + '\\n');\n }\n return { changed: true, created: true, originalExisted: false };\n }\n\n const markerRegex = /<!--\\s*bilmem:start\\s*-->[\\s\\S]*?<!--\\s*bilmem:end\\s*-->/;\n const match = existingContent.match(markerRegex);\n\n if (match) {\n if (match[0].trim() === desiredBlock.trim()) {\n return { changed: false, created: false, originalExisted: true };\n }\n const updated = existingContent.replace(markerRegex, desiredBlock);\n if (!dryRun) {\n await writeAtomic(filePath, updated);\n }\n return { changed: true, created: false, originalExisted: true };\n }\n\n // Not yet present in existing file: append cleanly\n const trimmed = existingContent.trimEnd();\n const separator = trimmed.length > 0 ? '\\n\\n' : '';\n const updated = `${trimmed}${separator}${desiredBlock}\\n`;\n\n if (!dryRun) {\n await writeAtomic(filePath, updated);\n }\n\n return { changed: true, created: false, originalExisted: true };\n}\n\n/**\n * Safely removes only the managed Bilmem instruction block from a markdown file.\n * Preserves all surrounding user content. If the file contains only the Bilmem block,\n * removes the file.\n */\nexport async function removeMarkdownInstructionFile(\n filePath: string,\n dryRun: boolean = false\n): Promise<{ removed: boolean; fileDeleted: boolean }> {\n let content = '';\n try {\n content = await fs.readFile(filePath, 'utf-8');\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n return { removed: false, fileDeleted: false };\n }\n throw err;\n }\n\n const markerRegex = /<!--\\s*bilmem:start\\s*-->[\\s\\S]*?<!--\\s*bilmem:end\\s*-->\\n?/;\n if (!markerRegex.test(content)) {\n return { removed: false, fileDeleted: false };\n }\n\n const stripped = content.replace(markerRegex, '').trim();\n\n if (stripped.length === 0) {\n // Only contained bilmem instructions; safely delete the empty file\n if (!dryRun) {\n try {\n await fs.unlink(filePath);\n } catch {\n // ignore if already deleted\n }\n }\n return { removed: true, fileDeleted: true };\n }\n\n // User had other instructions; write back their content without bilmem block\n if (!dryRun) {\n await writeAtomic(filePath, stripped + '\\n');\n }\n\n return { removed: true, fileDeleted: false };\n}\n\n/**\n * Checks if a file or directory exists.\n */\nexport async function pathExists(p: string): Promise<boolean> {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Safely writes or updates an Antigravity SKILL.md file.\n * Preserves the file if content has not changed.\n */\nexport async function updateSkillFile(\n filePath: string,\n content: string,\n dryRun: boolean = false\n): Promise<{ changed: boolean; created: boolean; originalExisted: boolean }> {\n let existingContent = '';\n let exists = false;\n\n try {\n existingContent = await fs.readFile(filePath, 'utf-8');\n exists = true;\n } catch (err: any) {\n if (err.code !== 'ENOENT') throw err;\n }\n\n if (exists && existingContent.trim() === content.trim()) {\n return { changed: false, created: false, originalExisted: true };\n }\n\n if (!dryRun) {\n await writeAtomic(filePath, content.trimEnd() + '\\n');\n }\n\n return { changed: true, created: !exists, originalExisted: exists };\n}\n\n/**\n * Safely removes a skill file and cleans up parent directory if empty.\n */\nexport async function removeSkillFile(\n filePath: string,\n dryRun: boolean = false\n): Promise<{ removed: boolean; fileDeleted: boolean }> {\n try {\n await fs.access(filePath);\n } catch {\n return { removed: false, fileDeleted: false };\n }\n\n if (!dryRun) {\n try {\n await fs.unlink(filePath);\n // Try to clean up parent directory (e.g. skills/bilmem) if empty\n const parentDir = path.dirname(filePath);\n const remaining = await fs.readdir(parentDir);\n if (remaining.length === 0) {\n await fs.rmdir(parentDir);\n }\n } catch {\n // ignore cleanup errors\n }\n }\n\n return { removed: true, fileDeleted: true };\n}\n\n/**\n * Fast cross-platform check whether a command executable is available in PATH.\n */\nexport async function isExecutableInPath(command: string): Promise<boolean> {\n const envPath = process.env.PATH;\n if (!envPath) return false;\n\n const dirs = envPath.split(path.delimiter);\n for (const dir of dirs) {\n if (!dir) continue;\n const fullPath = path.join(dir, command);\n try {\n await fs.access(fullPath, fs.constants.X_OK);\n return true;\n } catch {\n // continue search\n }\n }\n return false;\n}\n\n","export const CURRENT_INTEGRATION_VERSION = 1;\n\nexport const BILMEM_START_MARKER = '<!-- bilmem:start -->';\nexport const BILMEM_END_MARKER = '<!-- bilmem:end -->';\n\n/**\n * Returns the minimal, token-efficient agent instruction snippet.\n */\nexport function getAgentInstructionText(version: number = CURRENT_INTEGRATION_VERSION): string {\n return `${BILMEM_START_MARKER}\n<!-- bilmem-version: ${version} -->\n## Bilmem Knowledge Runtime\nBilmem is available through MCP.\n\nBefore substantial implementation work, use \\`bilmem_preflight\\` to surface existing constraints, relevant lessons, stale knowledge, and important unknowns. Do not run it for trivial edits or typo fixes.\n\nUse \\`bilmem_resolve\\` when:\n- uncertain about project-specific behavior,\n- multiple plausible approaches exist,\n- existing knowledge may not apply,\n- you are about to perform a broad investigation.\n\nUse \\`bilmem_observe\\` when important new evidence is discovered.\n\nUse \\`bilmem_learn\\` after resolving a meaningful problem or receiving an important user correction.\n\nDo not query Bilmem before every action.\n${BILMEM_END_MARKER}`;\n}\n\n/**\n * Extracts the installed integration version from markdown content, or null if none.\n */\nexport function extractInstructionVersion(content: string): number | null {\n const match = content.match(/<!--\\s*bilmem-version:\\s*(\\d+)\\s*-->/);\n if (match && match[1]) {\n return parseInt(match[1], 10);\n }\n return null;\n}\n\n/**\n * Checks whether content contains a managed Bilmem instruction block.\n */\nexport function hasBilmemInstruction(content: string): boolean {\n return content.includes(BILMEM_START_MARKER) && content.includes(BILMEM_END_MARKER);\n}\n\n/**\n * Returns the complete, well-formed Antigravity SKILL.md content with YAML frontmatter.\n */\nexport function getBilmemSkillContent(version: number = CURRENT_INTEGRATION_VERSION): string {\n return `---\nname: bilmem\ndescription: >-\n Epistemic runtime and project knowledge engine. Use when you need to inspect existing constraints or lessons before starting work (bilmem_preflight), resolve epistemic uncertainty or architectural decisions (bilmem_resolve), query verified knowledge (bilmem_lookup), record new observations (bilmem_observe), extract lessons from trajectories (bilmem_learn), track unknowns (bilmem_unknown), or check knowledge reuse and effectiveness (bilmem_stats).\n---\n<!-- bilmem-version: ${version} -->\n\n# Bilmem Epistemic Knowledge Runtime\n\nBilmem is an epistemic knowledge engine designed to answer:\n> **Do I know enough to act, what do I know does not apply, what am I missing, and what is the cheapest next step to resolve uncertainty?**\n\nUnlike traditional code graphs or vector memory, Bilmem focuses on verified facts, contextual applicability (via JEV positive/negative cues), staged learning from trajectories, and tracking unknowns as first-class citizens.\n\n---\n\n## ⚡ Core Epistemic Commitments\n\n1. **Cheaper than not knowing:** Querying Bilmem or resolving uncertainty is significantly cheaper than re-investigating, guessing, or recovering from incorrect architectural assumptions.\n2. **Never guess project invariants:** If uncertain whether caching is enabled in production, how auth tokens rotate, or why a specific pattern exists, resolve it through Bilmem instead of guessing.\n3. **No queries on trivial edits:** Do not query Bilmem for simple typo fixes, formatting, or obvious local syntax changes.\n4. **Receipts & Honest Confidence:** Bilmem uses explainable confidence tiers (\\`low\\`, \\`medium\\`, \\`high\\`) and returns receipts explaining why knowledge was accepted or rejected.\n\n---\n\n## 🚀 Progressive Disclosure: Tool Runbook\n\n> [!TIP]\n> **Project Directory Target (\\`path\\` parameter)**:\n> In global MCP environments or multi-workspace IDEs, always pass the \\`\"path\"\\` parameter with your project root (e.g. \\`\"path\": \"/path/to/project\"\\` or active workspace directory) to target the proper repository and prevent root filesystem permission issues.\n\n### 1. Before Substantial Implementation: \\`bilmem_preflight\\`\nRun \\`bilmem_preflight\\` with your proposed goal before modifying architecture, core logic, or adding features:\n\\`\\`\\`json\n{\n \"path\": \"/path/to/project\",\n \"goal\": \"Add OAuth login with Google\",\n \"positive\": [\"auth\", \"oauth\", \"session\"],\n \"negative\": [\"stateless-jwt\"]\n}\n\\`\\`\\`\n**Returns:**\n- Applicable verified constraints & architectural rules.\n- Relevant lessons from past implementations or regressions.\n- Past failures in similar domains.\n- Blocking unknowns that must be investigated first.\n- Stale dependencies that need review.\n- Next recommended investigation actions.\n\n### 2. When Uncertain or Resolving Contradictions: \\`bilmem_resolve\\`\nUse \\`bilmem_resolve\\` when encountering ambiguous codebase behavior, multiple plausible paths, or conflicting assumptions:\n\\`\\`\\`json\n{\n \"path\": \"/path/to/project\",\n \"question\": \"How are user sessions renewed and validated?\",\n \"positive\": [\"server-session\", \"postgres\", \"redis\"],\n \"negative\": [\"client-cookie-only\"]\n}\n\\`\\`\\`\n**Returns:**\n- \\`state\\`: \\`resolved\\` (sufficient facts known), \\`needs_investigation\\`, or \\`contradiction\\`.\n- \\`known\\`: Verified statements applicable to the current context.\n- \\`rejected\\`: Inapplicable knowledge units filtered out by negative cues.\n- \\`missing\\`: Critical gaps that need observation before proceeding.\n- \\`next\\`: The cheapest concrete investigation step.\n\n### 3. Exact Knowledge Retrieval: \\`bilmem_lookup\\`\nQuickly look up specific conventions, lessons, or rules:\n\\`\\`\\`json\n{\n \"path\": \"/path/to/project\",\n \"query\": \"session timeout configuration\",\n \"limit\": 5\n}\n\\`\\`\\`\n\n### 4. Recording Fresh Discoveries: \\`bilmem_observe\\`\nRecord verified discoveries, configuration invariants, or environment realities:\n\\`\\`\\`json\n{\n \"path\": \"/path/to/project\",\n \"claim\": \"Production session cookies require SameSite=Strict and Secure flags\",\n \"source\": \"file:src/auth/session.ts#L42\",\n \"positive\": [\"production\", \"cookie\", \"auth\"],\n \"negative\": [\"development\"]\n}\n\\`\\`\\`\n\n### 5. Learning from Corrections & Trajectories: \\`bilmem_learn\\`\nAfter resolving a difficult bug, fixing a regression, or receiving a critical user correction, distill the trajectory:\n\\`\\`\\`json\n{\n \"path\": \"/path/to/project\",\n \"goal\": \"Fix refresh token rotation loop\",\n \"outcome\": \"success\",\n \"userCorrection\": {\n \"topic\": \"session-auth\",\n \"incorrectAssumption\": \"Token refresh does not require a concurrent mutex\",\n \"correctFact\": \"Token refresh requires a concurrency mutex to avoid 401 race conditions\"\n }\n}\n\\`\\`\\`\nBilmem runs staged reconciliation: extracts observations, creates candidate lessons, evaluates polar contradictions, and reconciles into durable knowledge.\n\n### 6. Recording Known Unknowns: \\`bilmem_unknown\\`\nWhen you realize critical context is missing, record an unknown instead of making a silent assumption:\n\\`\\`\\`json\n{\n \"path\": \"/path/to/project\",\n \"action\": \"record\",\n \"id\": \"staging.redis-cache\",\n \"question\": \"Does the staging database share the Redis cache cluster with production?\"\n}\n\\`\\`\\`\n\n### 7. Auditing Effectiveness & Reuse: \\`bilmem_stats\\`\nVerify how well Bilmem is reducing repeated investigation:\n\\`\\`\\`json\n{\n \"path\": \"/path/to/project\",\n \"since\": \"7d\"\n}\n\\`\\`\\`\n\n---\n\n## 💻 CLI Quick Reference\n\nAll tools are also available directly on the command line:\n\n| Command | Purpose |\n| :--- | :--- |\n| \\`bilmem preflight \"<goal>\"\\` | Pre-implementation readiness & constraint analysis |\n| \\`bilmem resolve \"<question>\"\\` | Epistemic resolution with context cues & receipts |\n| \\`bilmem lookup \"<query>\"\\` | Fast contextual lookup of verified knowledge |\n| \\`bilmem observe \"<claim>\" --source <src>\\` | Record verified evidence or invariant |\n| \\`bilmem learn --trajectory \"<text>\"\\` | Reconcile candidate lessons into knowledge |\n| \\`bilmem scan [--dry-run]\\` | Conservative filesystem & convention discovery |\n| \\`bilmem stats [--since 7d]\\` | Measure knowledge reuse and effectiveness |\n| \\`bilmem doctor [--fix]\\` | Verify and repair integrations and storage |\n`;\n}\n\n/**\n * Checks whether content contains a valid Bilmem skill definition.\n */\nexport function hasBilmemSkill(content: string): boolean {\n return content.includes('name: bilmem') && content.includes('---');\n}\n\n/**\n * Extracts the installed skill version from markdown content, or null if none.\n */\nexport function extractSkillVersion(content: string): number | null {\n const match = content.match(/<!--\\s*bilmem-version:\\s*(\\d+)\\s*-->/);\n if (match && match[1]) {\n return parseInt(match[1], 10);\n }\n return null;\n}\n\n","import * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { safeReadJson, writeAtomic } from './atomic.js';\nimport type { IntegrationsMetadata, IntegrationRecord } from './types.js';\n\nexport function getIntegrationsFilePath(rootDir: string): string {\n return path.join(rootDir, '.bilmem', 'integrations.json');\n}\n\n/**\n * Loads the current integrations metadata from .bilmem/integrations.json.\n */\nexport async function loadIntegrationsMetadata(rootDir: string): Promise<IntegrationsMetadata> {\n const metaPath = getIntegrationsFilePath(rootDir);\n const read = await safeReadJson(metaPath);\n if (read.exists && read.data && typeof read.data === 'object') {\n return {\n version: typeof read.data.version === 'number' ? read.data.version : 1,\n integrations: typeof read.data.integrations === 'object' && read.data.integrations !== null\n ? read.data.integrations\n : {}\n };\n }\n return {\n version: 1,\n integrations: {}\n };\n}\n\n/**\n * Saves integrations metadata to .bilmem/integrations.json.\n */\nexport async function saveIntegrationsMetadata(\n rootDir: string,\n meta: IntegrationsMetadata,\n dryRun: boolean = false\n): Promise<void> {\n if (dryRun) return;\n const metaPath = getIntegrationsFilePath(rootDir);\n const content = JSON.stringify(meta, null, 2) + '\\n';\n await writeAtomic(metaPath, content);\n}\n\n/**\n * Records or updates an agent integration in .bilmem/integrations.json.\n */\nexport async function recordIntegration(\n rootDir: string,\n agentId: string,\n record: IntegrationRecord,\n dryRun: boolean = false\n): Promise<void> {\n const meta = await loadIntegrationsMetadata(rootDir);\n const existing = meta.integrations[agentId];\n meta.integrations[agentId] = {\n ...record,\n installedAt: existing?.installedAt || record.installedAt,\n updatedAt: new Date().toISOString()\n };\n await saveIntegrationsMetadata(rootDir, meta, dryRun);\n}\n\n/**\n * Removes an agent integration record from .bilmem/integrations.json.\n */\nexport async function removeIntegration(\n rootDir: string,\n agentId: string,\n dryRun: boolean = false\n): Promise<void> {\n const meta = await loadIntegrationsMetadata(rootDir);\n if (meta.integrations[agentId]) {\n delete meta.integrations[agentId];\n await saveIntegrationsMetadata(rootDir, meta, dryRun);\n }\n}\n\n/**\n * Retrieves the integration record for a specific agent.\n */\nexport async function getIntegrationRecord(\n rootDir: string,\n agentId: string\n): Promise<IntegrationRecord | undefined> {\n const meta = await loadIntegrationsMetadata(rootDir);\n return meta.integrations[agentId];\n}\n","import * as path from 'node:path';\nimport * as os from 'node:os';\nimport { BaseAgentAdapter } from './base.js';\nimport type { InstallContext, DetectionResult } from '../types.js';\nimport { pathExists, isExecutableInPath } from '../atomic.js';\n\nexport class ClaudeAdapter extends BaseAgentAdapter {\n readonly id = 'claude';\n readonly name = 'Claude Code';\n\n resolveConfigPath(context: InstallContext): string {\n if (context.scope === 'project') {\n return path.join(context.projectDir, '.claude', 'mcp.json');\n }\n const home = context.globalDir || os.homedir();\n return path.join(home, '.claude', 'mcp.json');\n }\n\n resolveInstructionPath(context: InstallContext): string {\n if (context.scope === 'project') {\n return path.join(context.projectDir, 'CLAUDE.md');\n }\n const home = context.globalDir || os.homedir();\n return path.join(home, '.claude', 'CLAUDE.md');\n }\n\n async detect(context: InstallContext): Promise<DetectionResult> {\n const reasons: string[] = [];\n\n // Project-level signals\n const dotClaude = path.join(context.projectDir, '.claude');\n const claudeMd = path.join(context.projectDir, 'CLAUDE.md');\n const claudeJson = path.join(context.projectDir, 'claude.json');\n const mcpConfig = path.join(context.projectDir, '.claude', 'mcp.json');\n\n const hasDotClaude = await pathExists(dotClaude);\n const hasClaudeMd = await pathExists(claudeMd);\n const hasClaudeJson = await pathExists(claudeJson);\n const hasMcp = await pathExists(mcpConfig);\n\n if (hasDotClaude) reasons.push('Found .claude/ directory');\n if (hasClaudeMd) reasons.push('Found CLAUDE.md file');\n if (hasClaudeJson) reasons.push('Found claude.json file');\n if (hasMcp) reasons.push('Found .claude/mcp.json file');\n\n // Global / system signals\n const globalHome = context.globalDir || os.homedir();\n const globalClaude = path.join(globalHome, '.claude');\n const hasGlobalClaude = await pathExists(globalClaude);\n if (hasGlobalClaude) reasons.push(`Found global directory at ${globalClaude}`);\n\n const hasExecutable = await isExecutableInPath('claude');\n if (hasExecutable) reasons.push('Found \"claude\" command in PATH');\n\n const detected = reasons.length > 0;\n const confidence =\n hasDotClaude || hasClaudeMd || hasClaudeJson || hasMcp\n ? 'high'\n : hasGlobalClaude || hasExecutable\n ? 'medium'\n : 'low';\n\n return {\n detected,\n confidence: detected ? confidence : 'low',\n reasons,\n supportedScopes: this.supportedScopes\n };\n }\n}\n","import * as path from 'node:path';\nimport * as os from 'node:os';\nimport { BaseAgentAdapter } from './base.js';\nimport type { InstallContext, DetectionResult } from '../types.js';\nimport { pathExists, isExecutableInPath } from '../atomic.js';\n\nexport class CodexAdapter extends BaseAgentAdapter {\n readonly id = 'codex';\n readonly name = 'Codex';\n\n resolveConfigPath(context: InstallContext): string {\n if (context.scope === 'project') {\n return path.join(context.projectDir, '.codex', 'mcp.json');\n }\n const home = context.globalDir || os.homedir();\n return path.join(home, '.codex', 'mcp.json');\n }\n\n resolveInstructionPath(context: InstallContext): string {\n if (context.scope === 'project') {\n return path.join(context.projectDir, 'CODEX.md');\n }\n const home = context.globalDir || os.homedir();\n return path.join(home, '.codex', 'instructions.md');\n }\n\n async detect(context: InstallContext): Promise<DetectionResult> {\n const reasons: string[] = [];\n\n // Project-level signals\n const dotCodex = path.join(context.projectDir, '.codex');\n const codexMd = path.join(context.projectDir, 'CODEX.md');\n const codexJson = path.join(context.projectDir, 'codex.json');\n const mcpConfig = path.join(context.projectDir, '.codex', 'mcp.json');\n\n const hasDotCodex = await pathExists(dotCodex);\n const hasCodexMd = await pathExists(codexMd);\n const hasCodexJson = await pathExists(codexJson);\n const hasMcp = await pathExists(mcpConfig);\n\n if (hasDotCodex) reasons.push('Found .codex/ directory');\n if (hasCodexMd) reasons.push('Found CODEX.md file');\n if (hasCodexJson) reasons.push('Found codex.json file');\n if (hasMcp) reasons.push('Found .codex/mcp.json file');\n\n // Global / system signals\n const globalHome = context.globalDir || os.homedir();\n const globalCodex = path.join(globalHome, '.codex');\n const hasGlobalCodex = await pathExists(globalCodex);\n if (hasGlobalCodex) reasons.push(`Found global directory at ${globalCodex}`);\n\n const hasExecutable = await isExecutableInPath('codex');\n if (hasExecutable) reasons.push('Found \"codex\" command in PATH');\n\n const detected = reasons.length > 0;\n const confidence =\n hasDotCodex || hasCodexMd || hasCodexJson || hasMcp\n ? 'high'\n : hasGlobalCodex || hasExecutable\n ? 'medium'\n : 'low';\n\n return {\n detected,\n confidence: detected ? confidence : 'low',\n reasons,\n supportedScopes: this.supportedScopes\n };\n }\n}\n","import * as path from 'node:path';\nimport * as os from 'node:os';\nimport { BaseAgentAdapter } from './base.js';\nimport type { InstallContext, DetectionResult } from '../types.js';\nimport { pathExists, isExecutableInPath } from '../atomic.js';\n\nexport class GeminiAdapter extends BaseAgentAdapter {\n readonly id = 'gemini';\n readonly name = 'Gemini CLI';\n\n resolveConfigPath(context: InstallContext): string {\n if (context.scope === 'project') {\n return path.join(context.projectDir, '.gemini', 'settings.json');\n }\n const home = context.globalDir || os.homedir();\n return path.join(home, '.gemini', 'settings.json');\n }\n\n resolveInstructionPath(context: InstallContext): string {\n if (context.scope === 'project') {\n return path.join(context.projectDir, 'GEMINI.md');\n }\n const home = context.globalDir || os.homedir();\n return path.join(home, '.gemini', 'GEMINI.md');\n }\n\n async detect(context: InstallContext): Promise<DetectionResult> {\n const reasons: string[] = [];\n\n // Project-level signals\n const dotGemini = path.join(context.projectDir, '.gemini');\n const geminiMd = path.join(context.projectDir, 'GEMINI.md');\n const geminiJson = path.join(context.projectDir, 'gemini.json');\n const settingsJson = path.join(context.projectDir, '.gemini', 'settings.json');\n\n const hasDotGemini = await pathExists(dotGemini);\n const hasGeminiMd = await pathExists(geminiMd);\n const hasGeminiJson = await pathExists(geminiJson);\n const hasSettingsJson = await pathExists(settingsJson);\n\n if (hasDotGemini) reasons.push('Found .gemini/ directory');\n if (hasGeminiMd) reasons.push('Found GEMINI.md file');\n if (hasGeminiJson) reasons.push('Found gemini.json file');\n if (hasSettingsJson) reasons.push('Found .gemini/settings.json file');\n\n // Global / system signals\n const globalHome = context.globalDir || os.homedir();\n const globalGemini = path.join(globalHome, '.gemini');\n const hasGlobalGemini = await pathExists(globalGemini);\n if (hasGlobalGemini) reasons.push(`Found global directory at ${globalGemini}`);\n\n const hasExecutable = await isExecutableInPath('gemini');\n if (hasExecutable) reasons.push('Found \"gemini\" command in PATH');\n\n const detected = reasons.length > 0;\n const confidence =\n hasDotGemini || hasGeminiMd || hasGeminiJson || hasSettingsJson\n ? 'high'\n : hasGlobalGemini || hasExecutable\n ? 'medium'\n : 'low';\n\n return {\n detected,\n confidence: detected ? confidence : 'low',\n reasons,\n supportedScopes: this.supportedScopes\n };\n }\n}\n","import * as path from 'node:path';\nimport * as os from 'node:os';\nimport * as fs from 'node:fs';\nimport { BaseAgentAdapter } from './base.js';\nimport type { InstallContext, DetectionResult } from '../types.js';\nimport { pathExists, isExecutableInPath } from '../atomic.js';\n\nexport function resolveAntigravityGlobalDir(context: InstallContext): string {\n const home = context.globalDir || os.homedir();\n if (path.basename(home) === 'config' && path.basename(path.dirname(home)) === '.gemini') {\n return home;\n }\n return path.join(home, '.gemini', 'config');\n}\n\nexport class AntigravityAdapter extends BaseAgentAdapter {\n readonly id = 'antigravity';\n readonly name = 'Antigravity';\n\n resolveConfigPath(context: InstallContext): string {\n if (context.scope === 'project') {\n const rootMcp = path.join(context.projectDir, 'mcp_config.json');\n if (fs.existsSync(rootMcp)) {\n return rootMcp;\n }\n return path.join(context.projectDir, '.agents', 'mcp_config.json');\n }\n const globalRoot = resolveAntigravityGlobalDir(context);\n return path.join(globalRoot, 'mcp_config.json');\n }\n\n resolveSkillPath(context: InstallContext): string {\n if (context.scope === 'project') {\n return path.join(context.projectDir, '.agents', 'skills', 'bilmem', 'SKILL.md');\n }\n const globalRoot = resolveAntigravityGlobalDir(context);\n return path.join(globalRoot, 'skills', 'bilmem', 'SKILL.md');\n }\n\n resolveInstructionPath(context: InstallContext): string {\n if (context.scope === 'project') {\n const geminiMd = path.join(context.projectDir, 'GEMINI.md');\n const agentsMd = path.join(context.projectDir, 'AGENTS.md');\n const rulesBilmem = path.join(context.projectDir, '.agents', 'rules', 'bilmem.md');\n if (fs.existsSync(rulesBilmem)) {\n return rulesBilmem;\n }\n if (fs.existsSync(geminiMd)) {\n return geminiMd;\n }\n if (fs.existsSync(agentsMd)) {\n return agentsMd;\n }\n return path.join(context.projectDir, '.agents', 'rules', 'bilmem.md');\n }\n const globalRoot = resolveAntigravityGlobalDir(context);\n return path.join(globalRoot, 'rules', 'bilmem.md');\n }\n\n async detect(context: InstallContext): Promise<DetectionResult> {\n const reasons: string[] = [];\n\n // Project-level signals\n const dotAgents = path.join(context.projectDir, '.agents');\n const skillsDir = path.join(context.projectDir, '.agents', 'skills');\n const agentsMcp = path.join(context.projectDir, '.agents', 'mcp_config.json');\n const rootMcp = path.join(context.projectDir, 'mcp_config.json');\n const geminiMd = path.join(context.projectDir, 'GEMINI.md');\n const agentsMd = path.join(context.projectDir, 'AGENTS.md');\n\n const hasDotAgents = await pathExists(dotAgents);\n const hasSkillsDir = await pathExists(skillsDir);\n const hasAgentsMcp = await pathExists(agentsMcp);\n const hasRootMcp = await pathExists(rootMcp);\n const hasGeminiMd = await pathExists(geminiMd);\n const hasAgentsMd = await pathExists(agentsMd);\n\n if (hasDotAgents) reasons.push('Found .agents/ directory');\n if (hasSkillsDir) reasons.push('Found .agents/skills/ directory');\n if (hasAgentsMcp) reasons.push('Found .agents/mcp_config.json');\n if (hasRootMcp) reasons.push('Found mcp_config.json file');\n if (hasGeminiMd) reasons.push('Found GEMINI.md rule file');\n if (hasAgentsMd) reasons.push('Found AGENTS.md rule file');\n\n // Global / system signals\n const home = context.globalDir || os.homedir();\n const globalConfig = resolveAntigravityGlobalDir(context);\n const globalIde = path.join(home, '.gemini', 'antigravity-ide');\n const globalCli = path.join(home, '.gemini', 'antigravity-cli');\n const globalAgy = path.join(home, '.gemini', 'antigravity');\n\n const hasGlobalConfig = await pathExists(globalConfig);\n const hasGlobalIde = await pathExists(globalIde);\n const hasGlobalCli = await pathExists(globalCli);\n const hasGlobalAgy = await pathExists(globalAgy);\n\n if (hasGlobalConfig) reasons.push(`Found Antigravity global config at ${globalConfig}`);\n if (hasGlobalIde) reasons.push(`Found Antigravity IDE at ${globalIde}`);\n if (hasGlobalCli) reasons.push(`Found Antigravity CLI at ${globalCli}`);\n if (hasGlobalAgy) reasons.push(`Found Antigravity directory at ${globalAgy}`);\n\n const hasAgyExec = await isExecutableInPath('agy');\n if (hasAgyExec) reasons.push('Found \"agy\" command in PATH');\n\n const detected = reasons.length > 0;\n const confidence =\n hasDotAgents || hasSkillsDir || hasAgentsMcp || hasRootMcp || hasGeminiMd || hasAgentsMd\n ? 'high'\n : hasGlobalConfig || hasGlobalIde || hasGlobalCli || hasGlobalAgy || hasAgyExec\n ? 'medium'\n : 'low';\n\n return {\n detected,\n confidence: detected ? confidence : 'low',\n reasons,\n supportedScopes: this.supportedScopes\n };\n }\n}\n","import type { AgentInstaller, InstallContext, DetectionResult } from './types.js';\nimport { CursorAdapter } from './adapters/cursor.js';\nimport { ClaudeAdapter } from './adapters/claude.js';\nimport { CodexAdapter } from './adapters/codex.js';\nimport { GeminiAdapter } from './adapters/gemini.js';\nimport { AntigravityAdapter } from './adapters/antigravity.js';\n\nexport { CursorAdapter } from './adapters/cursor.js';\nexport { ClaudeAdapter } from './adapters/claude.js';\nexport { CodexAdapter } from './adapters/codex.js';\nexport { GeminiAdapter } from './adapters/gemini.js';\nexport { AntigravityAdapter } from './adapters/antigravity.js';\nexport { BaseAgentAdapter } from './adapters/base.js';\n\nconst adapters: AgentInstaller[] = [\n new CursorAdapter(),\n new ClaudeAdapter(),\n new CodexAdapter(),\n new GeminiAdapter(),\n new AntigravityAdapter()\n];\n\nexport function getAllAdapters(): AgentInstaller[] {\n return [...adapters];\n}\n\nexport function getAdapter(id: string): AgentInstaller | undefined {\n const normalized = id.toLowerCase().trim();\n return adapters.find((a) => a.id.toLowerCase() === normalized);\n}\n\nexport interface DetectedAgent {\n adapter: AgentInstaller;\n detection: DetectionResult;\n}\n\n/**\n * Runs detection across all registered adapters deterministically and cheaply.\n */\nexport async function detectAgents(context: InstallContext): Promise<DetectedAgent[]> {\n const results = await Promise.all(\n adapters.map(async (adapter) => {\n const detection = await adapter.detect(context);\n return { adapter, detection };\n })\n );\n return results;\n}\n","import * as path from 'node:path';\nimport { Storage } from '../storage/canonical.js';\nimport { createBilmemMcpApp } from '../mcp/server.js';\nimport { getAllAdapters } from './registry.js';\nimport type {\n InstallContext,\n DoctorReport,\n DoctorFixResult,\n CoreDoctorReport,\n AgentDoctorReport\n} from './types.js';\nimport { CURRENT_INTEGRATION_VERSION } from './instructions.js';\nimport { isExecutableInPath } from './atomic.js';\n\nexport async function runDoctor(context: InstallContext): Promise<DoctorReport> {\n const storage = context.storage || new Storage(context.projectDir);\n let isInit = false;\n let knowledgeCount = 0;\n\n try {\n isInit = await storage.isInitialized();\n if (isInit) {\n const items = await storage.getAllKnowledge();\n knowledgeCount = items.length;\n }\n } catch {\n // ignore\n }\n\n // Core checks\n let mcpRuntimeStatus: 'ok' | 'warning' | 'error' = 'ok';\n let mcpRuntimeDetails: string | undefined;\n try {\n const app = createBilmemMcpApp({ rootDir: context.projectDir });\n if (!app) {\n mcpRuntimeStatus = 'error';\n mcpRuntimeDetails = 'Failed to instantiate McpApp';\n }\n } catch (err: any) {\n mcpRuntimeStatus = 'error';\n mcpRuntimeDetails = err.message;\n }\n\n const core: CoreDoctorReport = {\n storage: {\n initialized: isInit,\n path: storage.getBaseDir(),\n status: isInit ? 'ok' : 'warning',\n details: isInit ? undefined : 'Storage not initialized in current project (.bilmem/)'\n },\n knowledge: {\n count: knowledgeCount,\n status: 'ok',\n details: `${knowledgeCount} knowledge item(s)`\n },\n searchIndex: {\n status: isInit ? 'ok' : 'warning',\n details: isInit ? 'Search index ready' : 'Requires project initialization'\n },\n mcpRuntime: {\n status: mcpRuntimeStatus,\n details: mcpRuntimeDetails || 'mcponce runtime ready'\n }\n };\n\n // Agent checks\n const targetCommand = context.bilmemCommand || 'bilmem';\n const commandResolvable = await isExecutableInPath(targetCommand);\n\n const agents: AgentDoctorReport[] = [];\n let issuesCount = 0;\n let canFix = false;\n\n const adapters = getAllAdapters();\n for (const adapter of adapters) {\n const state = await adapter.inspect(context);\n\n let mcpStatus: 'ok' | 'missing' | 'outdated' | 'error' = 'missing';\n let mcpDetails: string | undefined;\n\n if (state.details?.configError) {\n mcpStatus = 'error';\n mcpDetails = `Invalid JSON: ${state.details.configError}`;\n issuesCount++;\n } else if (state.mcpConfigured && state.mcpCommandMatches) {\n mcpStatus = 'ok';\n } else if (state.mcpConfigured && !state.mcpCommandMatches) {\n mcpStatus = 'outdated';\n mcpDetails = 'Configured command does not match expected bilmem mcp';\n issuesCount++;\n canFix = true;\n } else {\n mcpStatus = 'missing';\n if (state.detected) {\n issuesCount++;\n canFix = true;\n }\n }\n\n let instStatus: 'ok' | 'missing' | 'outdated' | 'none' = 'none';\n let instDetails: string | undefined;\n\n if (state.instructionInstalled) {\n if (state.instructionVersion === CURRENT_INTEGRATION_VERSION) {\n instStatus = 'ok';\n } else {\n instStatus = 'outdated';\n instDetails = `Version ${state.instructionVersion || 'legacy'} (current: ${CURRENT_INTEGRATION_VERSION})`;\n issuesCount++;\n canFix = true;\n }\n } else {\n instStatus = 'missing';\n if (state.detected) {\n issuesCount++;\n canFix = true;\n }\n }\n\n let skillStatus: 'ok' | 'missing' | 'outdated' | 'none' = 'none';\n let skillDetails: string | undefined;\n\n if (state.skillPath) {\n if (state.skillInstalled) {\n if (state.skillVersion === CURRENT_INTEGRATION_VERSION) {\n skillStatus = 'ok';\n } else {\n skillStatus = 'outdated';\n skillDetails = `Version ${state.skillVersion || 'legacy'} (current: ${CURRENT_INTEGRATION_VERSION})`;\n issuesCount++;\n canFix = true;\n }\n } else {\n skillStatus = 'missing';\n if (state.detected) {\n issuesCount++;\n canFix = true;\n }\n }\n }\n\n let cmdStatus: 'ok' | 'warning' | 'error' = 'ok';\n let cmdDetails: string | undefined;\n if (!commandResolvable) {\n cmdStatus = 'warning';\n cmdDetails = `\"${targetCommand}\" is not in PATH`;\n }\n\n agents.push({\n id: adapter.id,\n name: adapter.name,\n detected: state.detected,\n scope: context.scope,\n mcp: { status: mcpStatus, details: mcpDetails },\n instructions: { status: instStatus, details: instDetails },\n skill: state.skillPath ? { status: skillStatus, details: skillDetails } : undefined,\n command: { status: cmdStatus, details: cmdDetails },\n configPath: state.configPath,\n instructionPath: state.instructionPath,\n skillPath: state.skillPath\n });\n }\n\n if (!core.storage.initialized) {\n issuesCount++;\n canFix = true;\n }\n\n return {\n core,\n agents,\n issuesCount,\n canFix\n };\n}\n\nexport async function runDoctorFix(\n context: InstallContext,\n dryRun: boolean = false\n): Promise<DoctorFixResult> {\n const storage = context.storage || new Storage(context.projectDir);\n const coreFixed: string[] = [];\n const agentsFixed: Record<string, string[]> = {};\n\n // Fix core if needed\n if (!(await storage.isInitialized())) {\n if (!dryRun) {\n await storage.init({ projectName: path.basename(context.projectDir) });\n }\n coreFixed.push('Initialized .bilmem/ storage repository');\n }\n\n const adapters = getAllAdapters();\n for (const adapter of adapters) {\n const state = await adapter.inspect(context);\n\n // Only fix detected agents or agents that already have partial bilmem configuration\n const shouldFix =\n state.detected ||\n state.mcpConfigured ||\n state.instructionInstalled ||\n Boolean(state.skillInstalled);\n\n if (!shouldFix) continue;\n\n const needsMcpFix = !state.mcpConfigured || !state.mcpCommandMatches;\n const needsInstFix =\n !state.instructionInstalled ||\n state.instructionVersion !== CURRENT_INTEGRATION_VERSION;\n const needsSkillFix =\n Boolean(state.skillPath) &&\n (!state.skillInstalled || state.skillVersion !== CURRENT_INTEGRATION_VERSION);\n\n if (needsMcpFix || needsInstFix || needsSkillFix) {\n const fixResult = await adapter.install(context, {\n scope: context.scope,\n dryRun\n });\n\n if (fixResult.actionsTaken.length > 0) {\n agentsFixed[adapter.name] = fixResult.actionsTaken.filter(\n (a) => a !== 'Already up to date'\n );\n }\n }\n }\n\n return {\n coreFixed,\n agentsFixed,\n dryRun\n };\n}\n\n","import { McpApp, z } from 'mcponce';\nimport * as path from 'node:path';\nimport { Storage } from '../storage/canonical.js';\nimport { SearchIndex } from '../search/indexer.js';\nimport { Retriever } from '../search/retriever.js';\nimport { formatWhyExplanation, formatWhyHistory } from '../jev/explanation.js';\nimport { resolveEpistemicQuery } from '../core/resolver.js';\nimport { executePreflight } from '../core/preflight.js';\nimport { createObservation, createEvidence, reconcileKnowledge, applyReconciliation } from '../core/knowledge.js';\nimport { createUnknown, hasBeenInvestigated } from '../core/unknown.js';\nimport { createOutcome, applyOutcomeToKnowledge } from '../core/outcome.js';\nimport { distillTrajectory, learnFromTrajectory, processUserCorrection } from '../core/learn.js';\nimport { scanRepository } from '../scanner/engine.js';\nimport { runStats } from '../stats/index.js';\nimport type { TaskTrajectory, OutcomeType } from '../core/types.js';\n\nexport interface CreateMcpAppOptions {\n rootDir?: string;\n name?: string;\n version?: string;\n}\n\nexport interface McpProjectContext {\n rootDir: string;\n storage: Storage;\n index: SearchIndex;\n initialized: boolean;\n}\n\n/**\n * Creates the official McpApp for bilmem using mcponce.\n * Supports multi-project isolation and dynamic path resolution so that global\n * MCP processes (e.g. spawned from root '/') target the correct workspace.\n */\nexport function createBilmemMcpApp(options: CreateMcpAppOptions = {}): McpApp {\n const contexts = new Map<string, McpProjectContext>();\n let lastActiveDir: string | null = options.rootDir ? path.resolve(options.rootDir) : null;\n\n function isSystemRoot(dir: string): boolean {\n const resolved = path.resolve(dir);\n return resolved === '/' || path.parse(resolved).root === resolved;\n }\n\n function resolveTargetDir(requestedPath?: string): string {\n if (requestedPath && requestedPath.trim()) {\n const resolved = path.resolve(requestedPath.trim());\n lastActiveDir = resolved;\n return resolved;\n }\n\n if (lastActiveDir) {\n return lastActiveDir;\n }\n\n if (process.env.BILMEM_PROJECT_DIR) {\n const envDir = path.resolve(process.env.BILMEM_PROJECT_DIR);\n lastActiveDir = envDir;\n return envDir;\n }\n\n const cwd = process.cwd();\n if (cwd && !isSystemRoot(cwd)) {\n lastActiveDir = cwd;\n return cwd;\n }\n\n throw new Error(\n `No project directory specified and the MCP server was started in system root ('/'). ` +\n `Please provide the 'path' parameter in your tool call (e.g. { path: \"/path/to/project\", ... }).`\n );\n }\n\n async function getProjectContext(requestedPath?: string): Promise<McpProjectContext> {\n const targetDir = resolveTargetDir(requestedPath);\n let ctx = contexts.get(targetDir);\n if (!ctx) {\n const storage = new Storage(targetDir);\n const index = new SearchIndex();\n ctx = {\n rootDir: targetDir,\n storage,\n index,\n initialized: false\n };\n contexts.set(targetDir, ctx);\n }\n\n if (!ctx.initialized) {\n await ctx.storage.init();\n const all = await ctx.storage.getAllKnowledge();\n await ctx.index.buildIndex(all);\n ctx.initialized = true;\n }\n\n return ctx;\n }\n\n const app = new McpApp({\n name: options.name ?? 'bilmem',\n version: options.version ?? '0.1.0'\n });\n\n // Tool: bilmem_resolve (Primary epistemic runtime operation)\n app.tool({\n name: 'bilmem_resolve',\n description: 'Determine if enough is known to answer or act, what contextually does not apply, what is missing, and the cheapest next step to resolve uncertainty.',\n inputSchema: {\n path: z.string().optional().describe('Project root directory (defaults to active workspace or current working directory)'),\n question: z.string().describe('The question, goal, or uncertainty to resolve'),\n positive: z.array(z.string()).optional().describe('Applicable context cues (e.g. server-session, node, postgres)'),\n negative: z.array(z.string()).optional().describe('Inapplicable context cues (e.g. stateless-jwt, browser, sqlite)'),\n scope: z.string().optional().describe('Scope: project, global, or branch:xxx'),\n maxDepth: z.number().optional().describe('Max candidates to inspect (default: 5)')\n },\n handler: async (args) => {\n const ctx = await getProjectContext(args.path);\n const retriever = new Retriever(ctx.index, ctx.storage);\n const res = await resolveEpistemicQuery(\n {\n question: args.question,\n positive: args.positive,\n negative: args.negative,\n scope: args.scope,\n maxDepth: args.maxDepth\n },\n ctx.storage,\n retriever\n );\n\n return {\n state: res.state,\n known: res.known.map((k) => k.statement || k.id),\n missing: res.missing,\n rejected: res.rejected.map((r) => ({\n id: r.id,\n reason: r.reason\n })),\n checked: res.checked,\n next: res.next,\n fallback: res.fallback\n };\n }\n });\n\n // Tool: bilmem_preflight (Pre-implementation readiness and gap analysis)\n app.tool({\n name: 'bilmem_preflight',\n description: 'Determine what must be known before beginning a proposed goal (surfaces constraints, relevant lessons, past failures, stale knowledge, and blocking unknowns).',\n inputSchema: {\n path: z.string().optional().describe('Project root directory (defaults to active workspace or current working directory)'),\n goal: z.string().describe('The proposed goal, feature, or work to analyze before implementation'),\n positive: z.array(z.string()).optional().describe('Applicable context cues (e.g. authentication, postgres)'),\n negative: z.array(z.string()).optional().describe('Inapplicable context cues (e.g. browser, sqlite)'),\n deep: z.boolean().optional().describe('Check targeted git diff / unindexed files for staleness')\n },\n handler: async (args) => {\n const ctx = await getProjectContext(args.path);\n const retriever = new Retriever(ctx.index, ctx.storage);\n const res = await executePreflight(\n {\n goal: args.goal,\n positive: args.positive,\n negative: args.negative,\n deep: args.deep\n },\n ctx.storage,\n retriever,\n ctx.index\n );\n\n // Return compact summary to save context\n return {\n goal: res.goal,\n readiness: res.readiness,\n known: res.known.slice(0, 5).map((k) => k.statement),\n constraints: res.constraints.map((c) => c.statement),\n lessons: res.lessons.slice(0, 5).map((l) => l.statement),\n pastFailures: res.past_failures.slice(0, 5).map((f) => f.statement),\n blockingUnknowns: res.unknowns.filter((u) => u.blocking).map((u) => u.question || u.statement || u.id),\n stale: res.stale.map((s) => s.id),\n questions: res.questions.slice(0, 5).map((q) => q.question),\n next: res.next.slice(0, 3).map((n) => ({\n type: n.type,\n target: n.target,\n reason: n.reason\n }))\n };\n }\n });\n\n // Tool 1: bilmem_lookup\n app.tool({\n name: 'bilmem_lookup',\n description: 'Lookup reusable knowledge, conventions, and lessons using JEV contextual reranking. Returns compact, highly applicable knowledge units.',\n inputSchema: {\n path: z.string().optional().describe('Project root directory (defaults to active workspace or current working directory)'),\n query: z.string().optional().describe('Query text, intent keywords, or problem description'),\n positive: z.array(z.string()).optional().describe('Contextual positive cues (e.g. node, esm, server-session)'),\n negative: z.array(z.string()).optional().describe('Contextual negative cues (e.g. commonjs, browser)'),\n scope: z.string().optional().describe('Scope: project, global, branch:xxx (defaults to project)'),\n limit: z.number().optional().describe('Maximum number of results to return (default 5)')\n },\n handler: async (args) => {\n const ctx = await getProjectContext(args.path);\n const retriever = new Retriever(ctx.index, ctx.storage);\n const results = await retriever.lookup({\n query: args.query,\n positive: args.positive,\n negative: args.negative,\n scope: args.scope,\n limit: args.limit ?? 5\n });\n\n return {\n resultsCount: results.length,\n results: results.map((r) => ({\n id: r.knowledge.id,\n status: r.status,\n score: r.score,\n statement: r.knowledge.statement,\n confidence: r.knowledge.confidence,\n positiveMatches: r.explanation.positiveMatches,\n negativeConflicts: r.explanation.negativeConflicts,\n evidence: r.knowledge.evidence.slice(0, 3)\n }))\n };\n }\n });\n\n // Tool 2: bilmem_observe\n app.tool({\n name: 'bilmem_observe',\n description: 'Record a new observation from code, git, test execution, or environment. Preserves provenance.',\n inputSchema: {\n path: z.string().optional().describe('Project root directory (defaults to active workspace or current working directory)'),\n claim: z.string().describe('What was observed'),\n source: z.string().describe('Source identifier (e.g. file:src/auth.ts#L42, git:commit:81ac23, user:correction)'),\n confidence: z.number().optional().describe('Confidence 0.0 - 1.0 (default: 0.85)'),\n positive: z.array(z.string()).optional().describe('Positive context cues'),\n negative: z.array(z.string()).optional().describe('Negative context cues'),\n details: z.record(z.any()).optional().describe('Optional structured metadata')\n },\n handler: async (args) => {\n const ctx = await getProjectContext(args.path);\n const obs = createObservation({\n source: args.source,\n claim: args.claim,\n provenance: {\n type: args.source.startsWith('git:') ? 'git' : args.source.startsWith('user:') ? 'user' : 'code',\n path: args.source,\n timestamp: new Date().toISOString()\n },\n confidence: args.confidence ?? 0.85,\n positive: args.positive,\n negative: args.negative,\n details: args.details\n });\n\n await ctx.storage.saveObservation(obs);\n const evidence = createEvidence(obs, 'supports');\n await ctx.storage.saveEvidence(evidence);\n\n // Reconcile into knowledge\n const existing = await ctx.storage.getAllKnowledge();\n const rec = reconcileKnowledge(\n {\n statement: obs.claim,\n positive: obs.positive,\n negative: obs.negative,\n confidence: obs.confidence,\n evidence: [evidence.id, obs.source]\n },\n existing\n );\n\n const { updatedKnowledge, action } = applyReconciliation(\n rec,\n {\n statement: obs.claim,\n positive: obs.positive,\n negative: obs.negative,\n confidence: obs.confidence,\n evidence: [evidence.id, obs.source]\n },\n existing,\n ctx.storage\n );\n\n await ctx.storage.saveKnowledge(updatedKnowledge);\n await ctx.index.upsert(updatedKnowledge);\n\n return {\n observationId: obs.id,\n evidenceId: evidence.id,\n knowledgeId: updatedKnowledge.id,\n reconciliationAction: action,\n reason: rec.reason\n };\n }\n });\n\n // Tool 3: bilmem_learn\n app.tool({\n name: 'bilmem_learn',\n description: 'Learn from a completed task trajectory or explicit user correction. Converts experiences into refined, reusable lessons.',\n inputSchema: {\n path: z.string().optional().describe('Project root directory (defaults to active workspace or current working directory)'),\n goal: z.string().describe('The task or goal that was pursued'),\n taskId: z.string().optional().describe('Task identifier'),\n outcome: z.enum(['success', 'failure', 'reverted', 'neutral']).describe('Outcome of the task'),\n events: z.array(z.object({\n type: z.enum(['search', 'read', 'hypothesis', 'attempt', 'edit', 'test', 'failure', 'revert', 'success', 'ask_user', 'user_correction']),\n description: z.string(),\n path: z.string().optional()\n })).optional().describe('Events that occurred during task execution'),\n userCorrection: z.object({\n topic: z.string(),\n incorrectAssumption: z.string(),\n correctFact: z.string()\n }).optional().describe('Explicit user correction, if any occurred')\n },\n handler: async (args) => {\n const ctx = await getProjectContext(args.path);\n\n // Case A: User Correction\n if (args.userCorrection) {\n const { observation, knowledge } = processUserCorrection(args.userCorrection);\n await ctx.storage.saveObservation(observation);\n await ctx.storage.saveEvidence(createEvidence(observation, 'supports'));\n\n const existing = await ctx.storage.getAllKnowledge();\n const rec = reconcileKnowledge(knowledge, existing);\n const { updatedKnowledge } = applyReconciliation(rec, knowledge, existing, ctx.storage);\n\n await ctx.storage.saveKnowledge(updatedKnowledge);\n await ctx.index.upsert(updatedKnowledge);\n\n return {\n type: 'user_correction',\n knowledgeId: updatedKnowledge.id,\n statement: updatedKnowledge.statement,\n confidence: updatedKnowledge.confidence\n };\n }\n\n // Case B: Task Trajectory\n if (args.events && args.events.length > 0) {\n const trajectory: TaskTrajectory = {\n taskId: args.taskId ?? `task_${Date.now()}`,\n goal: args.goal,\n events: args.events,\n startedAt: new Date().toISOString(),\n finalOutcome: args.outcome as OutcomeType\n };\n\n const existing = await ctx.storage.getAllKnowledge();\n const learningResult = learnFromTrajectory(trajectory, existing);\n\n for (const obs of learningResult.observations) {\n await ctx.storage.saveObservation(obs);\n }\n for (const ev of learningResult.evidence) {\n await ctx.storage.saveEvidence(ev);\n }\n\n let updatedKnowledge: any;\n let action: any = 'NEW';\n for (const item of learningResult.reconciliations) {\n if (item.appliedKnowledge) {\n await ctx.storage.saveKnowledge(item.appliedKnowledge);\n await ctx.index.upsert(item.appliedKnowledge);\n updatedKnowledge = item.appliedKnowledge;\n action = item.action;\n }\n }\n\n if (updatedKnowledge) {\n // Record outcome\n const out = createOutcome({\n knowledgeId: updatedKnowledge.id,\n taskId: trajectory.taskId,\n result: args.outcome as OutcomeType,\n context: { positive: updatedKnowledge.positive, negative: updatedKnowledge.negative }\n });\n await ctx.storage.appendOutcome(out);\n applyOutcomeToKnowledge(updatedKnowledge, out);\n await ctx.storage.saveKnowledge(updatedKnowledge);\n\n return {\n type: 'trajectory_lesson',\n action,\n knowledgeId: updatedKnowledge.id,\n statement: updatedKnowledge.statement,\n confidence: updatedKnowledge.confidence,\n positive: updatedKnowledge.positive,\n negative: updatedKnowledge.negative\n };\n }\n }\n\n return {\n type: 'recorded_outcome',\n status: 'Recorded outcome without new lesson extraction'\n };\n }\n });\n\n // Tool 4: bilmem_explain\n app.tool({\n name: 'bilmem_explain',\n description: 'Explain why a knowledge ID exists: statement, evidence provenance, confidence, support/contradiction history, and applicable context.',\n inputSchema: {\n path: z.string().optional().describe('Project root directory (defaults to active workspace or current working directory)'),\n id: z.string().describe('The knowledge ID to explain'),\n history: z.boolean().optional().describe('Whether to format lifecycle transition history (--history)')\n },\n handler: async (args) => {\n const ctx = await getProjectContext(args.path);\n const k = await ctx.storage.getKnowledge(args.id);\n if (!k) {\n return { error: `Knowledge not found: \"${args.id}\"` };\n }\n\n if (args.history) {\n const historyText = formatWhyHistory(k);\n return {\n id: k.id,\n stage: k.stage,\n status: k.status,\n history: k.history,\n formattedExplanation: historyText\n };\n }\n\n const explanationText = formatWhyExplanation(k);\n return {\n id: k.id,\n statement: k.statement,\n confidence: k.confidence,\n stage: k.stage,\n status: k.status,\n scope: k.scope,\n evidence: k.evidence,\n metrics: k.metrics,\n positive: k.positive,\n negative: k.negative,\n formattedExplanation: explanationText\n };\n }\n });\n\n // Tool 5: bilmem_unknown\n app.tool({\n name: 'bilmem_unknown',\n description: 'Query or record first-class unknowns (NOT_OBSERVED, INSUFFICIENT_EVIDENCE, CONFLICTING_EVIDENCE, UNRESOLVABLE_LOCALLY) to prevent repeating useless investigations.',\n inputSchema: {\n path: z.string().optional().describe('Project root directory (defaults to active workspace or current working directory)'),\n action: z.enum(['query', 'check', 'record', 'resolve']).describe('Action to perform'),\n id: z.string().optional().describe('Unknown ID or query subject'),\n reason: z.enum(['NOT_OBSERVED', 'INSUFFICIENT_EVIDENCE', 'CONFLICTING_EVIDENCE', 'STALE', 'UNRESOLVABLE_LOCALLY']).optional(),\n statement: z.string().optional().describe('Description of the unknown'),\n checked: z.array(z.string()).optional().describe('Paths or files already checked'),\n question: z.string().optional().describe('Clarifying question for the user or next agent')\n },\n handler: async (args) => {\n const ctx = await getProjectContext(args.path);\n\n if (args.action === 'query') {\n const list = await ctx.storage.getAllUnknowns();\n return {\n count: list.length,\n unknowns: list\n };\n }\n\n if (args.action === 'check') {\n const list = await ctx.storage.getAllUnknowns();\n const checkResult = hasBeenInvestigated(list, args.id || '');\n return checkResult;\n }\n\n if (args.action === 'record') {\n if (!args.id) throw new Error('ID is required to record an unknown');\n const record = createUnknown({\n id: args.id,\n state: 'UNKNOWN',\n reason: args.reason ?? 'UNRESOLVABLE_LOCALLY',\n statement: args.statement,\n checked: args.checked ?? [],\n next: args.question ? { type: 'ask', question: args.question } : undefined\n });\n await ctx.storage.saveUnknown(record);\n return { success: true, recorded: record };\n }\n\n if (args.action === 'resolve') {\n if (!args.id) throw new Error('ID is required to resolve an unknown');\n const deleted = await ctx.storage.deleteUnknown(args.id);\n return { success: deleted, resolvedId: args.id };\n }\n\n return { error: 'Unknown action' };\n }\n });\n\n // Tool 6: bilmem_scan\n app.tool({\n name: 'bilmem_scan',\n description: 'Trigger a language-independent scan of the repository filesystem, markdown documentation, and git history.',\n inputSchema: {\n path: z.string().optional().describe('Project root directory to scan (defaults to active workspace or current working directory)'),\n incremental: z.boolean().optional().describe('Whether to scan incrementally from last scanned git commit')\n },\n handler: async (args) => {\n const ctx = await getProjectContext(args.path);\n const report = await scanRepository(ctx.rootDir, {\n incremental: args.incremental ?? false\n });\n\n // Refresh memory index for this project\n const all = await ctx.storage.getAllKnowledge();\n await ctx.index.buildIndex(all);\n\n return report;\n }\n });\n\n // Tool 7: bilmem_stats\n app.tool({\n name: 'bilmem_stats',\n description: 'Inspect local-first statistics, knowledge health, and effectiveness metrics (measuring reuse, investigation avoidance, and JEV accuracy). Read-only.',\n inputSchema: {\n path: z.string().optional().describe('Project root directory (defaults to active workspace or current working directory)'),\n since: z.string().optional().describe('Time window (e.g. 24h, 7d, 30d) or Git revision (e.g. HEAD~20, commit-sha)'),\n knowledgeId: z.string().optional().describe('Specific knowledge ID to inspect single-item lifecycle and diagnostics')\n },\n handler: async (args) => {\n const ctx = await getProjectContext(args.path);\n const res = await runStats({\n rootDir: ctx.rootDir,\n since: args.since,\n knowledgeId: args.knowledgeId\n });\n\n if (res.knowledgeReport) {\n return res.knowledgeReport;\n }\n return res.report;\n }\n });\n\n return app;\n}\n","import { create, insert, remove, search, type AnyOrama } from '@orama/orama';\nimport type { Knowledge } from '../core/types.js';\n\n/**\n * Rebuildable in-memory search index powered by Orama.\n * Note: Orama is strictly a candidate retrieval cache, NEVER the canonical source of truth.\n */\nexport class SearchIndex {\n private db: AnyOrama | null = null;\n private idToDocId = new Map<string, string>();\n\n async init(): Promise<void> {\n this.db = await create({\n schema: {\n id: 'string',\n statement: 'string',\n type: 'string',\n scope: 'string',\n status: 'string',\n positive: 'string[]',\n negative: 'string[]',\n tags: 'string[]'\n }\n });\n this.idToDocId.clear();\n }\n\n async buildIndex(knowledgeList: Knowledge[]): Promise<void> {\n await this.init();\n for (const item of knowledgeList) {\n await this.upsert(item);\n }\n }\n\n async upsert(item: Knowledge): Promise<void> {\n if (!this.db) {\n await this.init();\n }\n\n // If already in index, remove first\n const existingDocId = this.idToDocId.get(item.id);\n if (existingDocId) {\n try {\n await remove(this.db!, existingDocId);\n } catch {\n // Ignore if already deleted\n }\n this.idToDocId.delete(item.id);\n }\n\n const docId = await insert(this.db!, {\n id: item.id,\n statement: item.statement,\n type: item.type,\n scope: item.scope,\n status: item.status,\n positive: item.positive,\n negative: item.negative,\n tags: item.tags ?? []\n });\n\n this.idToDocId.set(item.id, docId);\n }\n\n async delete(id: string): Promise<void> {\n if (!this.db) return;\n const docId = this.idToDocId.get(id);\n if (docId) {\n try {\n await remove(this.db, docId);\n } catch {\n // Ignore\n }\n this.idToDocId.delete(id);\n }\n }\n\n async searchCandidates(term: string, limit = 25): Promise<string[]> {\n if (!this.db) {\n return [];\n }\n\n const cleanTerm = term.trim();\n if (!cleanTerm) {\n return Array.from(this.idToDocId.keys()).slice(0, limit);\n }\n\n try {\n const results = await search(this.db, {\n term: cleanTerm,\n limit,\n threshold: 0.2\n });\n\n return results.hits.map((h) => (h.document as any).id as string);\n } catch {\n // Fallback: term might contain special characters or fail tokenization\n return Array.from(this.idToDocId.keys()).slice(0, limit);\n }\n }\n\n size(): number {\n return this.idToDocId.size;\n }\n}\n\nexport { SearchIndex as OramaIndex };\n\n","import type {\n Knowledge,\n JevMatchStatus,\n JevExplanation,\n JevResult,\n Scope\n} from '../core/types.js';\n\nexport interface QueryContext {\n query?: string;\n positive?: string[];\n negative?: string[];\n scope?: Scope;\n}\n\nconst statementTokenCache = new WeakMap<Knowledge, Set<string>>();\n\nfunction extractTokens(text?: string): Set<string> {\n if (!text) return new Set();\n return new Set(\n text\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2)\n );\n}\n\nfunction getKnowledgeStatementTokens(k: Knowledge): Set<string> {\n let tokens = statementTokenCache.get(k);\n if (!tokens) {\n tokens = extractTokens(k.statement);\n statementTokenCache.set(k, tokens);\n }\n return tokens;\n}\n\n/**\n * Evaluates JEV-style positive and negative contextual proximity for a knowledge unit.\n */\nexport function evaluateJev(\n knowledge: Knowledge,\n context: QueryContext\n): JevResult {\n const queryTokens = extractTokens(context.query);\n const contextPos = new Set((context.positive ?? []).map((p) => p.trim().toLowerCase()));\n const contextNeg = new Set((context.negative ?? []).map((n) => n.trim().toLowerCase()));\n\n const knowPos = new Set((knowledge.positive ?? []).map((p) => p.trim().toLowerCase()));\n const knowNeg = new Set((knowledge.negative ?? []).map((n) => n.trim().toLowerCase()));\n\n // 1. Negative Conflict Detection\n const negativeConflicts: string[] = [];\n\n // Knowledge forbids something present in positive context\n for (const n of knowNeg) {\n if (contextPos.has(n) || queryTokens.has(n)) {\n negativeConflicts.push(`Knowledge forbids \"${n}\", which was present in context`);\n }\n }\n\n // Context forbids something present in knowledge\n for (const p of knowPos) {\n if (contextNeg.has(p)) {\n negativeConflicts.push(`Context forbids \"${p}\", which is required by knowledge`);\n }\n }\n\n // 2. Positive Matches\n const positiveMatches: string[] = [];\n\n // Direct cue overlap\n for (const p of knowPos) {\n if (contextPos.has(p)) {\n positiveMatches.push(`Context cue: ${p}`);\n } else {\n // Check if any query token matches or stems into cue\n for (const q of queryTokens) {\n if (p === q || p.startsWith(q) || q.startsWith(p)) {\n positiveMatches.push(`Query term match: ${p}`);\n break;\n }\n }\n }\n }\n\n // Statement query token overlap\n const stmtTokens = getKnowledgeStatementTokens(knowledge);\n let queryOverlapCount = 0;\n for (const q of queryTokens) {\n let matched = false;\n for (const st of stmtTokens) {\n if (q === st || q.startsWith(st) || st.startsWith(q)) {\n matched = true;\n break;\n }\n }\n if (matched) {\n queryOverlapCount++;\n positiveMatches.push(`Statement term: ${q}`);\n }\n }\n\n // 3. Positive Score Calculation\n const totalCues = Math.max(1, knowPos.size);\n const matchedCuesCount = positiveMatches.filter((m) => m.startsWith('Context cue') || m.startsWith('Query term')).length;\n const cueMatchRatio = matchedCuesCount / totalCues;\n const tokenOverlapScore = queryTokens.size > 0 ? queryOverlapCount / Math.max(1, queryTokens.size) : 0;\n const rawPositiveScore = 0.65 * cueMatchRatio + 0.35 * tokenOverlapScore;\n\n // 4. Scope Alignment\n let scopeMultiplier = 1.0;\n const targetScope = (context.scope ?? 'project').toLowerCase();\n const knowScope = (knowledge.scope ?? 'project').toLowerCase();\n\n if (targetScope === knowScope) {\n scopeMultiplier = 1.0;\n } else if (knowScope === 'global' || targetScope.startsWith(knowScope)) {\n scopeMultiplier = 0.85;\n } else if (knowScope === 'project' && targetScope.startsWith('branch:')) {\n scopeMultiplier = 0.90;\n } else {\n // Mismatched scopes\n scopeMultiplier = 0.30;\n }\n\n // 5. Confidence and Evidence Ratio\n const m = knowledge.metrics;\n const evRatio = (m.support_count + 1) / (m.support_count + 2 * m.contradiction_count + 1);\n const confidenceFactor = knowledge.confidence * evRatio;\n\n // 6. Outcome Boost / Penalty\n let outcomeAdjustment = 0;\n if (m.successful_outcomes > 0) {\n outcomeAdjustment += Math.min(0.10, m.successful_outcomes * 0.03);\n }\n if (m.failed_outcomes > 0) {\n outcomeAdjustment -= Math.min(0.20, m.failed_outcomes * 0.05);\n }\n\n // 7. Base Combined Score\n let score = (rawPositiveScore * 0.45 + confidenceFactor * 0.40 + outcomeAdjustment) * scopeMultiplier;\n\n // Stale or Contradicted Status Penalty\n if (knowledge.status === 'stale') {\n score *= 0.6;\n } else if (knowledge.status === 'contradicted') {\n score *= 0.3;\n } else if (knowledge.status === 'invalid' || knowledge.status === 'superseded') {\n score *= 0.1;\n }\n\n // 8. Negative Conflict Penalty & Decision\n let status: JevMatchStatus = 'POSSIBLE';\n const reasons: string[] = [];\n\n if (negativeConflicts.length > 0) {\n // Severe penalty for negative conflicts\n score = Math.max(0.01, score * 0.2);\n status = 'REJECT';\n reasons.push(`Rejected due to ${negativeConflicts.length} negative contextual conflicts.`);\n } else if (score >= 0.45 && positiveMatches.length > 0) {\n status = 'MATCH';\n reasons.push(`Strong contextual match with ${positiveMatches.length} matching signals.`);\n } else if (score >= 0.25) {\n status = 'POSSIBLE';\n reasons.push(`Potential match; partial contextual overlap.`);\n } else {\n status = 'REJECT';\n reasons.push(`Insufficient contextual match score (${score.toFixed(2)} < 0.25).`);\n }\n\n const finalScore = Math.round(Math.min(1.0, Math.max(0.0, score)) * 100) / 100;\n\n const explanation: JevExplanation = {\n positiveMatches,\n negativeConflicts,\n score: finalScore,\n confidence: knowledge.confidence,\n status,\n reasons\n };\n\n return {\n knowledge,\n status,\n score: finalScore,\n explanation\n };\n}\n","import type { Knowledge, JevResult } from '../core/types.js';\nimport { evaluateJev, type QueryContext } from './scorer.js';\n\n/**\n * Re-ranks a small set of candidate knowledge units using JEV contextual evaluation.\n */\nexport function rerankCandidates(\n candidates: Knowledge[],\n context: QueryContext\n): JevResult[] {\n const results: JevResult[] = [];\n\n for (const candidate of candidates) {\n const res = evaluateJev(candidate, context);\n results.push(res);\n }\n\n // Sort: MATCH first, then POSSIBLE, then REJECT; within each group, highest score first\n const statusPriority: Record<string, number> = {\n MATCH: 3,\n POSSIBLE: 2,\n REJECT: 1\n };\n\n results.sort((a, b) => {\n const prioDiff = (statusPriority[b.status] ?? 0) - (statusPriority[a.status] ?? 0);\n if (prioDiff !== 0) return prioDiff;\n const scoreDiff = b.score - a.score;\n if (Math.abs(scoreDiff) > 0.001) return scoreDiff;\n return b.knowledge.confidence - a.knowledge.confidence;\n });\n\n return results;\n}\n","import type { Knowledge, JevResult, Scope } from '../core/types.js';\nimport { rerankCandidates } from '../jev/matcher.js';\nimport type { QueryContext } from '../jev/scorer.js';\nimport type { SearchIndex } from './indexer.js';\n\nexport interface LookupOptions {\n query?: string;\n positive?: string[];\n negative?: string[];\n scope?: Scope;\n limit?: number;\n includeRejected?: boolean;\n}\n\nexport interface KnowledgeStoreProvider {\n getKnowledge(id: string): Promise<Knowledge | undefined>;\n getAllKnowledge(): Promise<Knowledge[]>;\n}\n\nexport class Retriever {\n constructor(\n private index: SearchIndex,\n private store: KnowledgeStoreProvider\n ) {}\n\n /**\n * Executes the full Bilmem retrieval pipeline:\n * 1. Query / Context\n * 2. Candidate retrieval (small candidate set)\n * 3. JEV contextual reranking\n * 4. MATCH / POSSIBLE / REJECT classification with explanations\n */\n async lookup(options: LookupOptions = {}): Promise<JevResult[]> {\n const limit = options.limit ?? 5;\n const query = options.query?.trim() ?? '';\n const positive = options.positive ?? [];\n const negative = options.negative ?? [];\n const scope = options.scope ?? 'project';\n\n const searchTerms: string[] = [];\n if (query) searchTerms.push(query);\n if (positive.length > 0) searchTerms.push(...positive.slice(0, 3));\n\n const searchTerm = searchTerms.join(' ').trim();\n\n // 1. Retrieve Candidate IDs from Orama\n let candidateIds = await this.index.searchCandidates(searchTerm, 30);\n\n // If no candidate found via search or empty term, get active items from store\n let candidates: Knowledge[] = [];\n if (candidateIds.length === 0) {\n const all = await this.store.getAllKnowledge();\n candidates = all.filter((k) => k.status !== 'invalid' && k.status !== 'superseded');\n } else {\n for (const id of candidateIds) {\n const item = await this.store.getKnowledge(id);\n if (item && item.status !== 'invalid' && item.status !== 'superseded') {\n candidates.push(item);\n }\n }\n\n // If candidates are very few (< 5), broaden candidate pool with active knowledge\n if (candidates.length < 5) {\n const all = await this.store.getAllKnowledge();\n for (const k of all) {\n if (!candidateIds.includes(k.id) && k.status !== 'invalid' && k.status !== 'superseded') {\n candidates.push(k);\n if (candidates.length >= 20) break;\n }\n }\n }\n }\n\n // 2. JEV Reranking on Candidates\n const queryContext: QueryContext = {\n query,\n positive,\n negative,\n scope\n };\n\n const reranked = rerankCandidates(candidates, queryContext);\n\n // 3. Filter by includeRejected and limit\n const filtered = options.includeRejected\n ? reranked\n : reranked.filter((r) => r.status !== 'REJECT');\n\n return filtered.slice(0, limit);\n }\n}\n\nexport { Retriever as BilmemRetriever };\n\n","import type { JevResult, Knowledge } from '../core/types.js';\n\n/**\n * Formats a JevResult into a clear, inspectable explanation string.\n */\nexport function formatJevExplanation(result: JevResult): string {\n const k = result.knowledge;\n const exp = result.explanation;\n\n const lines: string[] = [\n `${exp.status}: ${k.id} (Score: ${exp.score.toFixed(2)})`,\n ''\n ];\n\n lines.push('positive:');\n if (exp.positiveMatches.length > 0) {\n for (const p of exp.positiveMatches) {\n lines.push(` + ${p}`);\n }\n } else {\n lines.push(' none');\n }\n\n lines.push('');\n lines.push('negative conflicts:');\n if (exp.negativeConflicts.length > 0) {\n for (const n of exp.negativeConflicts) {\n lines.push(` - ${n}`);\n }\n } else {\n lines.push(' none');\n }\n\n lines.push('');\n lines.push(`confidence:`);\n lines.push(` ${k.confidence.toFixed(2)}`);\n\n if (exp.reasons.length > 0) {\n lines.push('');\n lines.push(`rationale:`);\n for (const r of exp.reasons) {\n lines.push(` • ${r}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Formats full \"bilmem why <id>\" detailed output.\n */\nexport function formatWhyExplanation(knowledge: Knowledge): string {\n const lines: string[] = [\n `${knowledge.id}`,\n '',\n 'Statement:',\n knowledge.statement,\n '',\n 'Evidence:'\n ];\n\n if (knowledge.evidence.length > 0) {\n for (const e of knowledge.evidence) {\n lines.push(`- ${e}`);\n }\n } else {\n lines.push('- (No direct source references recorded)');\n }\n\n lines.push('');\n lines.push(`Supports: ${knowledge.metrics.support_count}`);\n lines.push(`Contradictions: ${knowledge.metrics.contradiction_count}`);\n lines.push(`Outcomes: ${knowledge.metrics.successful_outcomes} success, ${knowledge.metrics.failed_outcomes} failed`);\n lines.push(`Confidence: ${knowledge.confidence.toFixed(2)}`);\n lines.push(`Scope: ${knowledge.scope}`);\n lines.push(`Status: ${knowledge.status}`);\n\n if (knowledge.positive.length > 0) {\n lines.push('');\n lines.push('Applicable because (positive cues):');\n for (const p of knowledge.positive) {\n lines.push(`+ ${p}`);\n }\n }\n\n if (knowledge.negative.length > 0) {\n lines.push('');\n lines.push('Rejected contexts (negative cues):');\n for (const n of knowledge.negative) {\n lines.push(`- ${n}`);\n }\n }\n\n if (knowledge.relations.length > 0) {\n lines.push('');\n lines.push('Relations:');\n for (const r of knowledge.relations) {\n lines.push(`~ ${r}`);\n }\n }\n\n if (knowledge.temporal?.revision) {\n lines.push('');\n lines.push(`Revision: ${knowledge.temporal.revision}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Formats lifecycle history for \"bilmem why <id> --history\".\n */\nexport function formatWhyHistory(knowledge: Knowledge): string {\n const lines: string[] = [knowledge.id, ''];\n\n if (!knowledge.history || knowledge.history.length === 0) {\n const date = knowledge.createdAt ? knowledge.createdAt.split('T')[0] : 'unknown';\n const stageOrStatus = (knowledge.stage || knowledge.status).toUpperCase();\n lines.push(date);\n lines.push(stageOrStatus);\n lines.push(knowledge.statement);\n return lines.join('\\n');\n }\n\n for (let i = 0; i < knowledge.history.length; i++) {\n const entry = knowledge.history[i];\n const date = entry.timestamp ? entry.timestamp.split('T')[0] : 'unknown';\n const stageOrStatus = (entry.stage || entry.status).toUpperCase();\n lines.push(date);\n lines.push(stageOrStatus);\n lines.push(entry.reason || entry.source || 'Updated');\n if (i < knowledge.history.length - 1) {\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n}\n","import type {\n Knowledge,\n InvestigationReceipt,\n ResolutionResult,\n ResolutionState,\n ResolutionReason,\n ResolveOptions,\n NextEvidenceAction,\n ActionType,\n Scope,\n JevResult\n} from './types.js';\nimport { rerankCandidates } from '../jev/index.js';\nimport { SearchIndex } from '../search/indexer.js';\nimport { Retriever } from '../search/retriever.js';\nimport type { Storage } from '../storage/canonical.js';\n\n/**\n * Relative cost table for evidence-gathering actions.\n * Smallest action likely to resolve uncertainty is preferred.\n */\nexport const RELATIVE_COSTS: Record<ActionType, number> = {\n USE_KNOWLEDGE: 1,\n REVALIDATE: 2,\n INSPECT_TEST: 2,\n INSPECT_FILE: 2,\n INSPECT_SYMBOL: 2.5,\n CHECK_DOCUMENTATION: 2.5,\n CHECK_GIT: 3,\n SEARCH_REPOSITORY: 4,\n ASK_USER: 3.5, // Context-dependent; cheaper than broad scan when specifically targeted\n STOP: 1\n};\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2);\n}\n\n/**\n * Core Epistemic Resolver:\n * Answers: \"Do I know enough to act, what do I know does not apply,\n * what am I missing, and what is the cheapest next step to resolve the uncertainty?\"\n */\nexport async function resolveEpistemicQuery(\n options: ResolveOptions,\n storage: Storage,\n retriever?: Retriever | SearchIndex\n): Promise<ResolutionResult> {\n const question = options.question.trim();\n const positive = (options.positive ?? []).map((p) => p.trim().toLowerCase());\n const negative = (options.negative ?? []).map((n) => n.trim().toLowerCase());\n const scope = options.scope ?? 'project';\n\n // 1. Context Extraction: extract keywords from the question + explicit cues\n const queryTokens = tokenize(question);\n const contextualCues = Array.from(new Set([...positive, ...queryTokens]));\n\n // 2. Candidate Retrieval & 3. JEV Applicability Filtering\n const allKnowledge = await storage.getAllKnowledge();\n let jevResults: JevResult[];\n\n if (retriever instanceof Retriever) {\n jevResults = await retriever.lookup({\n query: question,\n positive: options.positive,\n negative: options.negative,\n scope,\n limit: options.limit ?? 25,\n includeRejected: true\n });\n } else {\n let candidatePool: Knowledge[] = [];\n if (retriever instanceof SearchIndex) {\n const queryTerm = queryTokens.slice(0, 5).join(' ');\n const ids = await retriever.searchCandidates(queryTerm, 30);\n for (const id of ids) {\n const item = await storage.getKnowledge(id);\n if (item) candidatePool.push(item);\n }\n }\n if (candidatePool.length === 0) {\n candidatePool = allKnowledge;\n }\n for (const k of allKnowledge) {\n if (!candidatePool.some((c) => c.id === k.id) && k.positive.some((p) => contextualCues.includes(p))) {\n candidatePool.push(k);\n }\n }\n jevResults = rerankCandidates(candidatePool, {\n positive: options.positive,\n negative: options.negative,\n scope\n });\n }\n\n const matchingItems: Knowledge[] = [];\n const rejectedItems: Array<{ id: string; reason: string }> = [];\n\n for (const res of jevResults) {\n let jevReason = 'INSUFFICIENT_CONTEXT';\n if (res.explanation.negativeConflicts.length > 0) {\n jevReason = 'HARD_NEGATIVE';\n } else if (res.explanation.reasons.some((r) => r.toLowerCase().includes('scope'))) {\n jevReason = 'SCOPE_MISMATCH';\n } else if (res.knowledge.status === 'stale' || res.knowledge.status === 'needs_revalidation') {\n jevReason = 'STALE_KNOWLEDGE';\n }\n\n await storage.appendMetricEvent({\n type: 'jev_result',\n knowledgeId: res.knowledge.id,\n result: res.status,\n reason: jevReason,\n timestamp: Date.now()\n });\n\n if (jevReason === 'HARD_NEGATIVE') {\n await storage.appendMetricEvent({\n type: 'jev_hard_negative',\n knowledgeId: res.knowledge.id,\n timestamp: Date.now()\n });\n }\n\n if (res.status === 'REJECT') {\n const conflictMsg = res.explanation.negativeConflicts.length > 0\n ? `${res.explanation.negativeConflicts.join(', ')} conflicts with current context`\n : (res.explanation.reasons[0] || 'Context mismatch');\n rejectedItems.push({\n id: res.knowledge.id,\n reason: conflictMsg\n });\n } else if (res.status === 'MATCH' || res.status === 'POSSIBLE') {\n matchingItems.push(res.knowledge);\n }\n }\n\n // 4. Retrieve Past Investigation Receipts to Avoid Redundant Work\n const receipts = await storage.getAllReceipts();\n const previouslyChecked = new Set<string>();\n const previouslyRejectedTargets = new Map<string, string>();\n\n // Find receipts relating to this question or overlapping context\n for (const r of receipts) {\n const qOverlap = tokenize(r.question).filter((t) => queryTokens.includes(t));\n if (qOverlap.length >= 2 || (r.positive && r.positive.some((p) => contextualCues.includes(p)))) {\n await storage.appendMetricEvent({\n type: 'investigation_reused',\n investigationId: r.id,\n timestamp: Date.now()\n });\n for (const c of r.checked) {\n previouslyChecked.add(c);\n }\n for (const rej of r.rejected) {\n previouslyRejectedTargets.set(rej.target, rej.reason);\n }\n }\n }\n\n // Add paths from existing evidence of matching items to checked list\n for (const m of matchingItems) {\n for (const ev of m.evidence) {\n previouslyChecked.add(ev.replace(/^(code|file|test|doc):/, ''));\n }\n if (m.depends_on) {\n for (const dep of m.depends_on) {\n previouslyChecked.add(dep.replace(/^(code|file|test|doc):/, ''));\n }\n }\n }\n\n // 5. Evidence & Staleness Evaluation\n const staleCandidates = matchingItems.filter((k) => k.status === 'needs_revalidation' || k.status === 'stale');\n const contradictedCandidates = matchingItems.filter((k) => k.status === 'contradicted');\n const activeCandidates = matchingItems.filter(\n (k) =>\n (k.status === 'active' || k.stage === 'active' || k.stage === 'probation') &&\n k.status !== 'needs_revalidation' &&\n k.status !== 'stale' &&\n k.status !== 'contradicted' &&\n k.status !== 'invalid' &&\n k.status !== 'superseded'\n );\n\n // 6. Question Memory: Check if a learned QUESTION exists for this uncertainty pattern\n const questionKnowledge = allKnowledge.filter((k) => k.type === 'question');\n let learnedQuestionToAsk: { question: string; targetTopic: string; reason: string } | undefined;\n\n for (const qk of questionKnowledge) {\n const matchesCues = qk.positive.some((p) => contextualCues.includes(p));\n const conflicts = qk.negative.some((n) => negative.includes(n));\n if (matchesCues && !conflicts && qk.question) {\n learnedQuestionToAsk = {\n question: qk.question,\n targetTopic: qk.resolves?.[0] || 'uncertainty',\n reason: `Learned question for [${qk.positive.join(', ')}] uncertainty`\n };\n break;\n }\n }\n\n // 7. Missing Aspects / Gap Analysis\n const coveredTokens = new Set<string>();\n for (const k of activeCandidates) {\n for (const t of tokenize(k.statement)) coveredTokens.add(t);\n for (const p of k.positive) coveredTokens.add(p);\n }\n\n const missingAspects: string[] = [];\n for (const qt of queryTokens) {\n if (!['how', 'what', 'why', 'when', 'where', 'are', 'the', 'for', 'with', 'does', 'from'].includes(qt)) {\n if (!coveredTokens.has(qt)) {\n missingAspects.push(qt);\n }\n }\n }\n\n // 8. Determine Resolution State\n let state: ResolutionState = 'UNKNOWN';\n let reason: ResolutionReason | undefined;\n\n if (activeCandidates.length === 0 && staleCandidates.length > 0) {\n state = 'STALE';\n reason = 'STALE_EVIDENCE';\n } else if (activeCandidates.length === 0 && contradictedCandidates.length > 0) {\n state = 'CONFLICTED';\n reason = 'CONFLICTING_EVIDENCE';\n } else if (activeCandidates.length === 0) {\n state = 'UNKNOWN';\n reason = rejectedItems.length > 0 && matchingItems.length === 0 ? 'CONTEXT_MISMATCH' : 'NOT_OBSERVED';\n } else if (missingAspects.length === 0 && activeCandidates.some((k) => k.confidence >= 0.85)) {\n state = 'KNOWN';\n } else {\n state = 'PARTIALLY_KNOWN';\n reason = 'INSUFFICIENT_EVIDENCE';\n }\n\n // 9. Deterministic Next Evidence Action Planner\n const checkedArray = Array.from(previouslyChecked);\n let nextAction: NextEvidenceAction | undefined;\n let fallback: ResolutionResult['fallback'];\n\n if (state === 'KNOWN') {\n nextAction = {\n type: 'USE_KNOWLEDGE',\n target: activeCandidates[0].id,\n reason: `Sufficient high-confidence knowledge available (${activeCandidates[0].id})`,\n relativeCost: RELATIVE_COSTS.USE_KNOWLEDGE,\n expectedInfoGain: 0.95\n };\n } else if (state === 'CONFLICTED') {\n nextAction = {\n type: 'ASK_USER',\n reason: 'Opposing credible knowledge requires contextual disambiguation',\n relativeCost: RELATIVE_COSTS.ASK_USER,\n expectedInfoGain: 0.9\n };\n fallback = {\n type: 'ask',\n question: `Conflicting conventions exist for \"${question}\". Which context applies?`\n };\n } else if (state === 'STALE') {\n const staleItem = staleCandidates[0];\n const targetSource = staleItem.depends_on?.[0] || staleItem.evidence[0] || 'source';\n nextAction = {\n type: 'INSPECT_FILE',\n target: targetSource.replace(/^(code|file|test|doc):/, ''),\n reason: `Revalidate stale knowledge (${staleItem.id}) whose dependencies changed`,\n relativeCost: RELATIVE_COSTS.INSPECT_FILE,\n expectedInfoGain: 0.85\n };\n } else {\n // PARTIALLY_KNOWN or UNKNOWN: find cheapest untried action\n // Candidate actions ranked by expected information gain / relative cost\n\n // Priority 1: Learned Question from Question Memory (if high expected value)\n if (learnedQuestionToAsk) {\n nextAction = {\n type: 'ASK_USER',\n reason: learnedQuestionToAsk.reason,\n relativeCost: RELATIVE_COSTS.ASK_USER,\n expectedInfoGain: 0.9\n };\n fallback = {\n type: 'ask',\n question: learnedQuestionToAsk.question\n };\n } else {\n // Priority 2: Check candidate test or file evidence not yet inspected\n const testCandidates = [\n `tests/${queryTokens[0] || 'module'}.test.ts`,\n `test/${queryTokens[0] || 'module'}.test.ts`,\n `tests/session-refresh.test.ts`\n ];\n\n const uninspectedTest = testCandidates.find(\n (t) => !previouslyChecked.has(t) && !previouslyRejectedTargets.has(t)\n );\n\n const fileCandidates = [\n `src/${queryTokens[0] || 'auth'}/${queryTokens[1] || 'index'}.ts`,\n `src/${queryTokens[0] || 'index'}.ts`\n ];\n\n const uninspectedFile = fileCandidates.find(\n (f) => !previouslyChecked.has(f) && !previouslyRejectedTargets.has(f)\n );\n\n for (const t of testCandidates) {\n if (previouslyChecked.has(t)) {\n await storage.appendMetricEvent({\n type: 'source_read_avoided',\n source: t,\n timestamp: Date.now()\n });\n }\n }\n for (const f of fileCandidates) {\n if (previouslyChecked.has(f)) {\n await storage.appendMetricEvent({\n type: 'source_read_avoided',\n source: f,\n timestamp: Date.now()\n });\n }\n }\n\n if (uninspectedTest && missingAspects.some((m) => m.includes('order') || m.includes('test') || m.includes('behavior'))) {\n nextAction = {\n type: 'INSPECT_TEST',\n target: uninspectedTest,\n reason: `Targeted test inspection for unconfirmed aspect: ${missingAspects.join(', ')}`,\n relativeCost: RELATIVE_COSTS.INSPECT_TEST,\n expectedInfoGain: 0.8\n };\n } else if (uninspectedFile) {\n nextAction = {\n type: 'INSPECT_FILE',\n target: uninspectedFile,\n reason: `Direct source inspection for missing context: ${missingAspects.join(', ')}`,\n relativeCost: RELATIVE_COSTS.INSPECT_FILE,\n expectedInfoGain: 0.75\n };\n } else {\n // Fallback to targeted symbol/repository search\n nextAction = {\n type: 'SEARCH_REPOSITORY',\n target: missingAspects.slice(0, 3).join(' ') || question,\n reason: `Targeted search for unobserved aspects: ${missingAspects.join(', ')}`,\n relativeCost: RELATIVE_COSTS.SEARCH_REPOSITORY,\n expectedInfoGain: 0.6\n };\n }\n\n fallback = {\n type: 'ask',\n question: `Could you clarify: ${question}? (Missing: ${missingAspects.join(', ') || 'specifics'})`\n };\n }\n }\n\n // Record Metric Events\n if (state === 'KNOWN' || (nextAction && nextAction.type !== 'SEARCH_REPOSITORY' && nextAction.type !== 'STOP')) {\n await storage.appendMetricEvent({\n type: 'broad_search_avoided',\n targetAction: nextAction?.type,\n timestamp: Date.now()\n });\n }\n\n for (const k of activeCandidates) {\n await storage.appendMetricEvent({\n type: 'knowledge_reused',\n knowledgeId: k.id,\n timestamp: Date.now()\n });\n }\n\n if (learnedQuestionToAsk || fallback?.type === 'ask') {\n await storage.appendMetricEvent({\n type: 'question_suggested',\n question: learnedQuestionToAsk?.question || fallback?.question,\n timestamp: Date.now()\n });\n }\n\n await storage.appendMetricEvent({\n type: 'resolve',\n state,\n action: nextAction?.type,\n question,\n timestamp: Date.now()\n });\n\n // 10. Record Investigation Receipt\n const receiptId = `receipt_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`;\n const receipt: InvestigationReceipt = {\n id: receiptId,\n question,\n checked: checkedArray,\n findings: activeCandidates.map((c) => c.statement),\n rejected: rejectedItems.map((r) => ({ target: r.id, reason: r.reason })),\n missing: missingAspects,\n next: nextAction,\n status: state === 'KNOWN' ? 'resolved' : 'unresolved',\n timestamp: new Date().toISOString(),\n positive,\n negative\n };\n\n await storage.saveReceipt(receipt);\n\n return {\n state,\n reason,\n known: activeCandidates.map((k) => ({\n id: k.id,\n statement: k.statement,\n confidence: k.confidenceTier ?? k.confidence,\n confidenceTier: k.confidenceTier,\n stage: k.stage\n })),\n applicable: positive.length > 0 ? positive : contextualCues.slice(0, 5),\n rejected: rejectedItems,\n missing: missingAspects,\n checked: checkedArray,\n next: nextAction,\n fallback,\n receiptId\n };\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport YAML from 'yaml';\nimport type { Storage } from '../storage/canonical.js';\nimport type { SearchIndex } from '../search/indexer.js';\nimport { Retriever } from '../search/retriever.js';\nimport { rerankCandidates } from '../jev/matcher.js';\nimport { checkKnowledgeListStaleness } from './dependencies.js';\nimport type {\n Knowledge,\n UnknownRecord,\n InvestigationReceipt,\n NextEvidenceAction,\n PreflightOptions,\n PreflightResult,\n PreflightConstraint,\n PreflightLesson,\n PreflightFailure,\n PreflightUnknown,\n PreflightStale,\n PreflightMissing,\n PreflightQuestion,\n PreflightAlreadyInvestigated,\n ReadinessStatus,\n UnknownClassification\n} from './types.js';\n\nconst execFileAsync = promisify(execFile);\n\nconst STOP_WORDS = new Set([\n 'add', 'implement', 'create', 'support', 'with', 'the', 'a', 'an', 'for', 'in',\n 'to', 'and', 'of', 'on', 'from', 'using', 'via', 'into', 'by', 'our', 'new',\n 'use', 'make', 'allow', 'enable', 'provide', 'setup', 'set'\n]);\n\nconst DOMAIN_KEYWORDS: Record<string, string[]> = {\n authentication: ['auth', 'oauth', 'login', 'logout', 'session', 'jwt', 'token', 'credential', 'sso', 'password'],\n session: ['session', 'cookie', 'cookies', 'expiry', 'refresh', 'token'],\n 'user-identity': ['user', 'account', 'profile', 'identity', 'member', 'role', 'permission'],\n database: ['db', 'database', 'sql', 'postgres', 'sqlite', 'migration', 'schema', 'table', 'query'],\n storage: ['storage', 's3', 'bucket', 'file', 'upload', 'disk', 'blob'],\n api: ['api', 'endpoint', 'http', 'rest', 'route', 'controller', 'middleware', 'graphql'],\n caching: ['cache', 'redis', 'memcached', 'ttl', 'invalidation'],\n billing: ['payment', 'stripe', 'checkout', 'billing', 'subscription', 'invoice', 'credit'],\n 'data-processing': ['import', 'export', 'csv', 'bulk', 'batch', 'stream', 'pipeline']\n};\n\nexport function tokenizeGoal(goal: string): string[] {\n return goal\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2 && !STOP_WORDS.has(t));\n}\n\nexport function inferLikelyDomains(tokens: string[], knowledgeTags: string[]): string[] {\n const domains = new Set<string>();\n\n for (const token of tokens) {\n for (const [domain, keywords] of Object.entries(DOMAIN_KEYWORDS)) {\n if (keywords.includes(token) || token.includes(domain)) {\n domains.add(domain);\n }\n }\n }\n\n for (const tag of knowledgeTags) {\n const norm = tag.toLowerCase().trim();\n if (DOMAIN_KEYWORDS[norm]) {\n domains.add(norm);\n }\n }\n\n return Array.from(domains);\n}\n\n/**\n * Classifies an unknown into BLOCKING, IMPORTANT, or NON_BLOCKING.\n * When uncertain, prefers IMPORTANT rather than falsely declaring blocking.\n */\nexport function classifyUnknown(\n unknown: {\n id: string;\n statement?: string;\n reason?: string;\n question?: string;\n next?: { type: string; question?: string; target?: string };\n blocking?: boolean;\n },\n goalTokens: string[],\n domainCues: string[]\n): {\n classification: UnknownClassification;\n isDecision: boolean;\n reason: string;\n} {\n const text = `${unknown.id} ${unknown.statement || ''} ${unknown.question || unknown.next?.question || ''}`.toLowerCase();\n\n // Explicit flag check first\n if (unknown.blocking === true) {\n const isDecision = /\\b(should|whether|how to handle|what happens when|policy|strategy|linking|collision|merge|choice)\\b/i.test(text);\n return {\n classification: 'BLOCKING',\n isDecision: isDecision || true,\n reason: unknown.reason || 'Blocking unknown identified for this goal'\n };\n }\n\n if (unknown.blocking === false) {\n const isDecision = /\\b(should|whether|how to handle|what happens when|policy|strategy|choice)\\b/i.test(text);\n return {\n classification: 'NON_BLOCKING',\n isDecision,\n reason: 'Operational or instrumentation detail not blocking core functionality'\n };\n }\n\n // 1. Non-blocking: operational details\n const isNonBlocking = /\\b(analytics|telemetry|metric|event name|logging level|log format|button color|styling|theme)\\b/i.test(text);\n if (isNonBlocking) {\n return {\n classification: 'NON_BLOCKING',\n isDecision: /\\b(should|which name|choice)\\b/i.test(text),\n reason: 'Operational or instrumentation detail not blocking core functionality'\n };\n }\n\n // 2. Decision check: questions involving choices/policies\n const isDecision = /\\b(should|whether|how to handle|what happens when|policy|strategy|linking|collision|merge)\\b/i.test(text);\n\n // 3. Blocking: core architectural / entity linking / protocol / security ambiguity\n const isBlockingCandidate = /\\b(link|linking|collision|duplicate|merge|security|permission|storage-engine|protocol|auth-flow|credentials)\\b/i.test(text);\n const overlapsGoal = goalTokens.some((t) => text.includes(t)) || domainCues.some((d) => text.includes(d));\n\n if (isBlockingCandidate && (overlapsGoal || unknown.reason === 'UNRESOLVABLE_LOCALLY')) {\n return {\n classification: 'BLOCKING',\n isDecision: true,\n reason: 'Unresolved architectural or behavioral decision critical to goal implementation'\n };\n }\n\n // Default: IMPORTANT\n return {\n classification: 'IMPORTANT',\n isDecision,\n reason: isDecision ? 'Product or behavior decision requiring attention' : 'Important implementation detail'\n };\n}\n\n/**\n * Prioritizes and consolidates questions using question memory and expected value.\n */\nexport function prioritizeQuestions(\n rawQuestions: Array<{ question: string; reason: string; targetTopic?: string; isBlocking?: boolean; outcomeScore?: number }>,\n blockingUnknowns: PreflightUnknown[]\n): PreflightQuestion[] {\n const consolidated = new Map<string, PreflightQuestion>();\n\n for (const rq of rawQuestions) {\n const qText = rq.question.trim();\n if (!qText) continue;\n\n // Normalize topic for consolidation\n const topic = rq.targetTopic || qText.toLowerCase().replace(/[^a-z0-9]/g, ' ').slice(0, 30);\n \n // Heuristic: expected resolution value / interaction cost\n let expectedResolutionValue = 1.0;\n if (rq.isBlocking) expectedResolutionValue += 2.0;\n if (rq.outcomeScore && rq.outcomeScore > 0) expectedResolutionValue += 1.0;\n if (rq.outcomeScore && rq.outcomeScore < 0) expectedResolutionValue -= 0.5;\n\n const interactionCost = 1.0;\n const priorityScore = Math.max(0.1, expectedResolutionValue) / interactionCost;\n\n const existing = consolidated.get(topic);\n if (!existing || (priorityScore > (existing.priorityScore ?? 0))) {\n consolidated.set(topic, {\n question: qText,\n reason: rq.reason,\n targetTopic: rq.targetTopic,\n expectedResolutionValue,\n interactionCost,\n priorityScore\n });\n }\n }\n\n return Array.from(consolidated.values()).sort((a, b) => (b.priorityScore ?? 0) - (a.priorityScore ?? 0));\n}\n\n/**\n * Executes Preflight Pipeline for a given goal.\n * Answers: \"What must I know before I start this work?\"\n */\nexport async function executePreflight(\n options: PreflightOptions,\n storage: Storage,\n retriever?: Retriever,\n index?: SearchIndex\n): Promise<PreflightResult> {\n const goal = options.goal.trim();\n const explicitPositive = (options.positive ?? []).map((p) => p.trim().toLowerCase());\n const negative = (options.negative ?? []).map((n) => n.trim().toLowerCase());\n const scope = options.scope ?? 'project';\n\n // 1. Goal Context Extraction\n const goalTokens = tokenizeGoal(goal);\n const allKnowledge = await storage.getAllKnowledge();\n const allTags = allKnowledge.flatMap((k) => k.tags ?? []);\n const likelyDomains = inferLikelyDomains(goalTokens, allTags);\n const contextualPositive = Array.from(new Set([...explicitPositive, ...likelyDomains, ...goalTokens]));\n\n // 2. Candidate Retrieval & JEV Applicability Filtering\n let candidatePool: Knowledge[] = [];\n\n if (retriever) {\n const jevCandidates = await retriever.lookup({\n query: goal,\n positive: contextualPositive,\n negative,\n scope,\n limit: options.maxCandidates ?? 25,\n includeRejected: true\n });\n for (const r of jevCandidates) {\n if (r.knowledge) candidatePool.push(r.knowledge);\n }\n }\n\n // Broaden candidate pool if needed\n if (candidatePool.length === 0) {\n candidatePool = allKnowledge.filter((k) => k.status !== 'invalid' && k.status !== 'superseded');\n } else {\n for (const k of allKnowledge) {\n if (!candidatePool.some((c) => c.id === k.id) && k.status !== 'invalid' && k.status !== 'superseded') {\n const matchesToken = goalTokens.some((t) => k.id.toLowerCase().includes(t) || k.statement.toLowerCase().includes(t));\n const matchesCues = k.positive.some((p) => contextualPositive.includes(p));\n if (matchesToken || matchesCues) {\n candidatePool.push(k);\n }\n }\n }\n }\n\n // Evaluate candidate pool with JEV\n const jevResults = rerankCandidates(candidatePool, {\n query: goal,\n positive: contextualPositive,\n negative,\n scope\n });\n\n const matchingItems: Knowledge[] = [];\n const rejectedItems: Array<{ id: string; reason: string }> = [];\n\n for (const res of jevResults) {\n if (res.status === 'REJECT') {\n const reason = res.explanation.negativeConflicts.length > 0\n ? `Inapplicable: ${res.explanation.negativeConflicts.join(', ')} conflicts with current context`\n : (res.explanation.reasons[0] || 'Context mismatch');\n rejectedItems.push({ id: res.knowledge.id, reason });\n } else {\n matchingItems.push(res.knowledge);\n }\n }\n\n // 3. Deep Preflight: Optional targeted file/git staleness check\n if (options.deep) {\n try {\n const { stdout: diffOutput } = await execFileAsync(\n 'git',\n ['diff', '--name-only', 'HEAD~1'],\n { cwd: storage.getBaseDir() ? path.dirname(storage.getBaseDir()) : process.cwd() }\n );\n const changedFiles = diffOutput.split('\\n').map((f) => f.trim()).filter(Boolean);\n if (changedFiles.length > 0) {\n const staleness = checkKnowledgeListStaleness(matchingItems, changedFiles);\n for (const affected of staleness.affectedKnowledge) {\n const matchIdx = matchingItems.findIndex((m) => m.id === affected.id);\n if (matchIdx >= 0) {\n matchingItems[matchIdx] = affected;\n }\n }\n }\n } catch {\n // Git command failed or not a repo; non-fatal\n }\n }\n\n // 4. Categorize Matching Knowledge into Constraints, Lessons, Past Failures, Stale, Known\n const constraints: PreflightConstraint[] = [];\n const lessons: PreflightLesson[] = [];\n const pastFailures: PreflightFailure[] = [];\n const stale: PreflightStale[] = [];\n const known: PreflightResult['known'] = [];\n let conflictedCount = 0;\n\n const CONSTRAINT_PATTERN = /\\b(must|must not|never|only|cannot|require|required|boundary|strictly|prohibited|forbidden)\\b/i;\n const FAILURE_PATTERN = /(fail|bug|error|crash|duplicate write|race condition|pressure|leak|revert|timeout)/i;\n\n const rootDir = storage.getBaseDir() ? path.dirname(storage.getBaseDir()) : process.cwd();\n\n for (const k of matchingItems) {\n // Check conflicted\n const matchesContradiction =\n k.status === 'contradicted' ||\n (k.contradicts && k.contradicts.some((cid) => matchingItems.some((m) => m.id === cid)));\n if (matchesContradiction) {\n conflictedCount++;\n }\n\n // Check stale\n let isStale = k.status === 'needs_revalidation' || k.status === 'stale';\n let staleReason = k.history?.[k.history.length - 1]?.reason || 'Supporting source changed after last validation';\n const changedDeps: string[] = [];\n\n const candidateDeps = [...(k.depends_on ?? []), ...(k.evidence ?? [])];\n const timestampStr = (k as any).updated_at ?? k.updatedAt ?? k.createdAt;\n const knowledgeTime = new Date(timestampStr).getTime();\n\n for (const dep of candidateDeps) {\n const cleanPath = dep.replace(/^(file|code|test|doc):/, '').trim();\n if (!cleanPath) continue;\n const absPath = path.isAbsolute(cleanPath) ? cleanPath : path.resolve(rootDir, cleanPath);\n try {\n const stat = await fs.stat(absPath);\n if (stat.mtimeMs > knowledgeTime + 500) {\n isStale = true;\n changedDeps.push(cleanPath);\n staleReason = `Supporting source changed after last validation (${cleanPath})`;\n }\n } catch {\n // File doesn't exist on disk, ignore\n }\n }\n\n if (isStale) {\n stale.push({\n id: k.id,\n statement: k.statement,\n reason: staleReason,\n changedSources: changedDeps.length > 0 ? changedDeps : k.depends_on\n });\n continue;\n }\n\n // Check constraints\n const isConstraint =\n k.type === 'rule' ||\n k.type === 'decision' ||\n k.type === 'convention' ||\n CONSTRAINT_PATTERN.test(k.statement);\n\n if (isConstraint) {\n constraints.push({\n id: k.id,\n statement: k.statement,\n type: k.type,\n confidence: k.confidence,\n confidenceTier: k.confidenceTier,\n source: k.evidence?.[0]\n });\n continue;\n }\n\n // Check past failures\n const isFailure =\n k.type === 'failure' ||\n k.statement.startsWith('[FAILURE]') ||\n k.statement.startsWith('[REVERT]') ||\n FAILURE_PATTERN.test(k.statement) ||\n k.metrics.failed_outcomes > 0;\n\n if (isFailure) {\n pastFailures.push({\n id: k.id,\n statement: k.statement,\n context: k.context || {\n positive: k.positive,\n negative: k.negative\n },\n failure: k.statement,\n lesson: k.lesson || (k as any).reasoning || k.resolves?.[0],\n evidence: k.evidence\n });\n continue;\n }\n\n // Check lessons: explicit lesson or lesson in statement/id/tags\n const isLesson =\n (k.type === 'lesson' && (k.id.includes('lesson') || k.tags?.includes('lesson') || k.statement.toLowerCase().includes('lesson'))) ||\n k.statement.toLowerCase().startsWith('lesson:') ||\n k.statement.toLowerCase().includes('lesson:');\n\n if (isLesson) {\n lessons.push({\n id: k.id,\n statement: k.statement,\n confidence: k.confidence,\n domain: k.tags?.[0],\n evidence: k.evidence\n });\n continue;\n }\n\n // General Known\n if (k.status === 'active' || k.stage === 'active' || k.stage === 'probation' || !k.status) {\n known.push({\n id: k.id,\n statement: k.statement,\n confidence: k.confidence,\n confidenceTier: k.confidenceTier,\n stage: k.stage\n });\n }\n }\n\n // 5. Existing Unknowns & Classification\n const unknownsFromStorage = await storage.getAllUnknowns();\n const unknownKnowledge = allKnowledge.filter((k) => k.type === 'unknown');\n\n const unifiedUnknowns: Array<{\n id: string;\n statement: string;\n reason?: string;\n question?: string;\n next?: { type: string; question?: string; target?: string };\n blocking?: boolean;\n positive?: string[];\n negative?: string[];\n checked?: string[];\n }> = [];\n\n const seenUnknownIds = new Set<string>();\n\n for (const u of unknownsFromStorage) {\n seenUnknownIds.add(u.id);\n unifiedUnknowns.push({\n id: u.id,\n statement: u.statement || u.id,\n reason: u.reason,\n question: u.question || u.next?.question,\n next: u.next,\n blocking: (u as any).blocking,\n positive: (u as any).positive,\n negative: (u as any).negative,\n checked: u.checked\n });\n }\n\n for (const k of unknownKnowledge) {\n if (!seenUnknownIds.has(k.id)) {\n seenUnknownIds.add(k.id);\n unifiedUnknowns.push({\n id: k.id,\n statement: k.statement,\n reason: k.history?.[0]?.reason,\n question: k.question || (k.statement.includes('?') ? k.statement : undefined),\n next: {\n type: 'ask',\n target: k.id,\n question: k.question || k.statement\n },\n blocking: k.blocking,\n positive: k.positive,\n negative: k.negative,\n checked: k.depends_on || k.evidence\n });\n }\n }\n\n const unknowns: PreflightUnknown[] = [];\n const missing: PreflightMissing[] = [];\n const rawQuestions: Array<{ question: string; reason: string; targetTopic?: string; isBlocking?: boolean; outcomeScore?: number }> = [];\n\n for (const u of unifiedUnknowns) {\n const text = `${u.id} ${u.statement || ''} ${u.question || ''}`.toLowerCase();\n const overlaps =\n goalTokens.some((t) => text.includes(t)) ||\n likelyDomains.some((d) => text.includes(d)) ||\n (u.positive && u.positive.some((p) => contextualPositive.includes(p)));\n\n // Negative filtering: if negative cues match\n if (u.negative && u.negative.some((n) => contextualPositive.includes(n))) {\n continue;\n }\n\n if (overlaps) {\n const { classification, isDecision, reason } = classifyUnknown(u, goalTokens, likelyDomains);\n const isBlocking = classification === 'BLOCKING';\n\n unknowns.push({\n id: u.id,\n statement: u.statement,\n question: u.question || u.statement,\n classification,\n blocking: isBlocking,\n reason\n });\n\n if (isDecision) {\n missing.push({\n type: 'decision',\n subject: u.id,\n question: u.question || u.statement,\n reason\n });\n } else {\n missing.push({\n type: 'evidence',\n subject: u.id,\n question: u.question || u.statement,\n reason\n });\n }\n\n const qText = u.question || (u.statement && u.statement.includes('?') ? u.statement : undefined);\n if (qText) {\n rawQuestions.push({\n question: qText,\n reason: `Unknown: ${u.id} (${reason})`,\n targetTopic: u.id,\n isBlocking\n });\n }\n }\n }\n\n // Question memory: search for learned questions\n const questionKnowledge = allKnowledge.filter((k) => k.type === 'question');\n for (const qk of questionKnowledge) {\n const matchesCues = qk.positive.some((p) => contextualPositive.includes(p));\n const conflicts = qk.negative.some((n) => negative.includes(n));\n if (matchesCues && !conflicts && qk.question) {\n rawQuestions.push({\n question: qk.question,\n reason: `Learned question for [${qk.positive.join(', ')}] uncertainty`,\n targetTopic: qk.resolves?.[0] || qk.id,\n outcomeScore: (qk.metrics?.successful_outcomes ?? 0) - (qk.metrics?.failed_outcomes ?? 0)\n });\n }\n }\n\n // 6. Prioritize & Consolidate Questions\n const questions = prioritizeQuestions(rawQuestions, unknowns);\n\n // 7. Avoid Repeated Investigation via Investigation Receipts\n const receipts = await storage.getAllReceipts();\n const alreadyInvestigated: PreflightAlreadyInvestigated[] = [];\n const investigatedSources = new Set<string>();\n\n for (const r of receipts) {\n const qTokens = r.question.toLowerCase().split(/\\s+/).filter(Boolean);\n const overlapsGoal = qTokens.some((t) => goalTokens.includes(t));\n const overlapsCues = r.positive && r.positive.some((p) => contextualPositive.includes(p));\n\n if (overlapsGoal || overlapsCues) {\n for (const checked of r.checked) {\n investigatedSources.add(checked.toLowerCase());\n alreadyInvestigated.push({\n source: checked,\n result: r.findings[0] || (r.rejected[0]?.reason) || 'Did not establish requested behavior',\n nextSuggestion: 'ASK_USER'\n });\n }\n }\n }\n\n // 8. Determine Readiness\n let readiness: ReadinessStatus = 'READY';\n\n const totalRelevantKnowledge = known.length + constraints.length + lessons.length + pastFailures.length + stale.length;\n const hasBlockingUnknown = unknowns.some((u) => u.blocking);\n const hasMissingDecision = missing.some((m) => m.type === 'decision');\n\n if (totalRelevantKnowledge === 0 && unknowns.length === 0) {\n readiness = 'INSUFFICIENT_KNOWLEDGE';\n } else if (conflictedCount > 0) {\n readiness = 'CONFLICTED';\n } else if (hasBlockingUnknown || hasMissingDecision) {\n readiness = 'NEEDS_CLARIFICATION';\n } else if (stale.length > 0) {\n readiness = 'NEEDS_REVALIDATION';\n } else {\n readiness = 'READY';\n }\n\n // 9. Cheapest Next Pre-Implementation Actions\n const next: NextEvidenceAction[] = [];\n\n // If decisions needed -> ASK_USER\n for (const m of missing) {\n if (m.type === 'decision') {\n next.push({\n type: 'ASK_USER',\n target: m.subject,\n reason: m.question || m.reason,\n relativeCost: 1.0,\n expectedInfoGain: 0.95\n });\n }\n }\n\n // If stale items -> REVALIDATE\n for (const s of stale) {\n next.push({\n type: 'REVALIDATE',\n target: s.id,\n reason: s.reason,\n relativeCost: 2.0,\n expectedInfoGain: 0.85\n });\n }\n\n // If missing evidence\n for (const m of missing) {\n if (m.type === 'evidence') {\n const wasChecked =\n investigatedSources.has(m.subject.toLowerCase()) ||\n alreadyInvestigated.length > 0;\n\n if (wasChecked) {\n if (!next.some((n) => n.type === 'ASK_USER')) {\n next.push({\n type: 'ASK_USER',\n target: m.subject,\n reason: `Already investigated (${Array.from(investigatedSources).join(', ')}); did not establish requested behavior. Clarification required.`,\n relativeCost: 1.0,\n expectedInfoGain: 0.9\n });\n }\n } else {\n const isFilePath = m.subject.includes('/') || m.subject.includes('.');\n next.push({\n type: isFilePath ? 'INSPECT_FILE' : 'SEARCH_REPOSITORY',\n target: m.subject,\n reason: m.reason,\n relativeCost: isFilePath ? 2.0 : 2.5,\n expectedInfoGain: 0.8\n });\n }\n }\n }\n\n // If already investigated but no ASK_USER yet, add it\n if (alreadyInvestigated.length > 0 && !next.some((n) => n.type === 'ASK_USER')) {\n next.push({\n type: 'ASK_USER',\n target: alreadyInvestigated[0].source,\n reason: `Already investigated ${alreadyInvestigated[0].source}; clarification required`,\n relativeCost: 1.0,\n expectedInfoGain: 0.9\n });\n }\n\n // If ready and no gaps -> USE_KNOWLEDGE\n if (next.length === 0 && known.length > 0) {\n next.push({\n type: 'USE_KNOWLEDGE',\n target: known[0].id,\n reason: 'Proceed with implementation using verified knowledge and constraints',\n relativeCost: 1.0,\n expectedInfoGain: 1.0\n });\n }\n\n // 10. Knowledge Impact\n const knowledgeImpact = {\n relevantKnowledge: totalRelevantKnowledge,\n validated: known.filter((k) => k.confidenceTier === 'high').length + constraints.length,\n needsRevalidation: stale.length,\n conflicted: conflictedCount,\n blockingUnknowns: unknowns.filter((u) => u.blocking).length,\n relevantFailures: pastFailures.length\n };\n\n // 11. Similar Previous Work\n const similarWork: PreflightResult['similar_work'] = [];\n for (const l of lessons) {\n similarWork.push({\n topic: l.domain || l.id,\n lesson: l.statement\n });\n }\n for (const f of pastFailures) {\n similarWork.push({\n topic: f.id,\n failure: f.statement\n });\n }\n\n // 12. Record Preflight Metric Event\n await storage.appendMetricEvent({\n type: 'preflight',\n goal,\n readiness,\n blockingUnknownsCount: knowledgeImpact.blockingUnknowns,\n staleKnowledgeCount: stale.length,\n pastFailuresCount: pastFailures.length,\n questionsCount: questions.length,\n repeatedChecksAvoidedCount: alreadyInvestigated.length,\n timestamp: Date.now()\n });\n\n return {\n goal,\n readiness,\n known,\n constraints,\n lessons,\n past_failures: pastFailures,\n unknowns,\n stale,\n missing,\n questions,\n likely_domains: likelyDomains,\n similar_work: similarWork.length > 0 ? similarWork.slice(0, 5) : undefined,\n already_investigated: alreadyInvestigated.length > 0 ? alreadyInvestigated : undefined,\n knowledge_impact: knowledgeImpact,\n next\n };\n}\n\n/**\n * Formats a PreflightResult into human-readable YAML matching the Section 4 specification.\n */\nexport function formatPreflightReport(result: PreflightResult): string {\n const plainObject: Record<string, any> = {\n goal: result.goal,\n readiness: result.readiness\n };\n\n if (result.known.length > 0) {\n plainObject.known = result.known.map((k) => ({\n id: k.id,\n statement: k.statement,\n confidence: k.confidenceTier || (typeof k.confidence === 'number' ? (k.confidence >= 0.9 ? 'high' : k.confidence >= 0.7 ? 'medium' : 'low') : k.confidence)\n }));\n }\n\n if (result.constraints.length > 0) {\n plainObject.constraints = result.constraints.map((c) => ({\n id: c.id,\n statement: c.statement\n }));\n }\n\n if (result.lessons.length > 0) {\n plainObject.lessons = result.lessons.map((l) => ({\n id: l.id,\n statement: l.statement\n }));\n }\n\n if (result.past_failures.length > 0) {\n plainObject.past_failures = result.past_failures.map((f) => ({\n id: f.id,\n statement: f.statement\n }));\n }\n\n if (result.unknowns.length > 0) {\n plainObject.unknowns = result.unknowns.map((u) => ({\n id: u.id,\n question: u.question || u.statement,\n blocking: u.blocking\n }));\n }\n\n if (result.stale.length > 0) {\n plainObject.stale = result.stale.map((s) => ({\n id: s.id,\n reason: s.reason\n }));\n }\n\n if (result.questions.length > 0) {\n plainObject.questions = result.questions.map((q) => ({\n question: q.question,\n reason: q.reason\n }));\n }\n\n if (result.likely_domains.length > 0) {\n plainObject.likely_domains = result.likely_domains;\n }\n\n if (result.already_investigated && result.already_investigated.length > 0) {\n plainObject.already_investigated = result.already_investigated;\n }\n\n if (result.next.length > 0) {\n plainObject.next = result.next.map((n) => ({\n type: n.type,\n target: n.target,\n reason: n.reason\n }));\n }\n\n return YAML.stringify(plainObject);\n}\n","import type { Knowledge, KnowledgeStatus } from './types.js';\n\nexport interface SourceDependencyIndex {\n // source key (e.g. \"src/auth/session.ts\", \"file:src/auth/session.ts\") -> Set of knowledge IDs\n sourceToKnowledge: Map<string, Set<string>>;\n}\n\nexport function normalizeSourceKey(source: string): string {\n return source.replace(/^(file|code|test|doc):/, '').trim().toLowerCase();\n}\n\n/**\n * Builds a reverse index mapping source paths / files to the knowledge IDs that depend on them.\n */\nexport function buildDependencyIndex(knowledgeList: Knowledge[]): SourceDependencyIndex {\n const sourceToKnowledge = new Map<string, Set<string>>();\n\n for (const k of knowledgeList) {\n const allDependencies = new Set<string>();\n\n // Explicit depends_on\n if (k.depends_on) {\n for (const d of k.depends_on) {\n allDependencies.add(normalizeSourceKey(d));\n }\n }\n\n // Implicit evidence references\n if (k.evidence) {\n for (const ev of k.evidence) {\n allDependencies.add(normalizeSourceKey(ev));\n }\n }\n\n for (const dep of allDependencies) {\n if (!dep) continue;\n let set = sourceToKnowledge.get(dep);\n if (!set) {\n set = new Set<string>();\n sourceToKnowledge.set(dep, set);\n }\n set.add(k.id);\n }\n }\n\n return { sourceToKnowledge };\n}\n\nexport interface StalenessCheckResult {\n knowledgeId: string;\n affected: boolean;\n status: KnowledgeStatus;\n changedSources: string[];\n unchangedSources: string[];\n reason?: string;\n}\n\n/**\n * Checks a knowledge item against a list of changed file paths / sources.\n * If any supporting dependency changed, marks as 'needs_revalidation'.\n */\nexport function checkKnowledgeStaleness(\n knowledge: Knowledge,\n changedSources: string[]\n): StalenessCheckResult {\n const normChanged = new Set(changedSources.map(normalizeSourceKey));\n const allDeps = [\n ...(knowledge.depends_on ?? []).map(normalizeSourceKey),\n ...knowledge.evidence.map(normalizeSourceKey)\n ];\n\n const changed: string[] = [];\n const unchanged: string[] = [];\n\n for (const dep of allDeps) {\n if (!dep) continue;\n // Check direct match or path containment\n const isChanged = normChanged.has(dep) || Array.from(normChanged).some((c) => dep.includes(c) || c.includes(dep));\n if (isChanged) {\n changed.push(dep);\n } else {\n unchanged.push(dep);\n }\n }\n\n if (changed.length > 0) {\n const reason = `Supporting dependency changed: ${changed.join(', ')}. Unchanged evidence: ${unchanged.join(', ') || 'none'}`;\n return {\n knowledgeId: knowledge.id,\n affected: true,\n status: 'needs_revalidation',\n changedSources: changed,\n unchangedSources: unchanged,\n reason\n };\n }\n\n return {\n knowledgeId: knowledge.id,\n affected: false,\n status: knowledge.status,\n changedSources: [],\n unchangedSources: allDeps\n };\n}\n\n/**\n * Marks knowledge units as 'needs_revalidation' when their underlying dependencies change,\n * preserving transparent history and reasons without deleting the knowledge.\n */\nexport function markStaleKnowledge(\n knowledgeList: Knowledge[],\n changedSources: string[]\n): { updatedKnowledge: Knowledge[]; affectedCount: number } {\n const now = new Date().toISOString();\n let affectedCount = 0;\n const updatedKnowledge: Knowledge[] = [];\n\n for (const k of knowledgeList) {\n if (k.status === 'superseded' || k.status === 'invalid' || k.status === 'invalidated') {\n updatedKnowledge.push(k);\n continue;\n }\n\n const res = checkKnowledgeStaleness(k, changedSources);\n if (res.affected) {\n affectedCount++;\n const history = k.history ?? [];\n const updated: Knowledge = {\n ...k,\n status: 'needs_revalidation',\n updatedAt: now,\n history: [\n ...history,\n {\n timestamp: now,\n status: 'needs_revalidation',\n action: 'source_changed',\n reason: res.reason\n }\n ]\n };\n updatedKnowledge.push(updated);\n } else {\n updatedKnowledge.push(k);\n }\n }\n\n return { updatedKnowledge, affectedCount };\n}\n\n/**\n * Checks a list of knowledge units against changed sources and returns the affected items.\n */\nexport function checkKnowledgeListStaleness(\n knowledgeList: Knowledge[],\n changedSources: string[]\n): {\n affectedKnowledge: Knowledge[];\n updatedKnowledge: Knowledge[];\n affectedCount: number;\n} {\n const { updatedKnowledge, affectedCount } = markStaleKnowledge(knowledgeList, changedSources);\n const affectedKnowledge = updatedKnowledge.filter((k) => k.status === 'needs_revalidation');\n return { affectedKnowledge, updatedKnowledge, affectedCount };\n}\n","import { createHash } from 'node:crypto';\nimport type {\n Knowledge,\n KnowledgeType,\n KnowledgeStatus,\n KnowledgeStage,\n KnowledgeHistoryEntry,\n KnowledgeOutcomesSummary,\n Scope,\n Observation,\n Evidence,\n Provenance,\n ReconciliationResult,\n ReconciliationAction,\n ConfidenceTier\n} from './types.js';\nimport { determineInitialStage, calculateKnowledgeValue, evaluatePromotion } from './quarantine.js';\nimport type { MetricEvent } from '../stats/types.js';\n\n/**\n * Deterministic mapping between confidence tiers and normalized float scores.\n * Replaces arbitrary precision floats with explainable thresholds.\n */\nexport function tierToConfidence(tier: ConfidenceTier): number {\n switch (tier) {\n case 'low':\n return 0.50;\n case 'medium':\n return 0.75;\n case 'high':\n return 0.95;\n }\n}\n\nexport function confidenceToTier(score: number): ConfidenceTier {\n if (score >= 0.85) return 'high';\n if (score >= 0.65) return 'medium';\n return 'low';\n}\n\nexport function hashString(input: string): string {\n return createHash('sha256').update(input.trim().toLowerCase()).digest('hex').slice(0, 16);\n}\n\nexport function createObservation(params: {\n source: string;\n claim: string;\n provenance?: Provenance;\n confidence?: number;\n positive?: string[];\n negative?: string[];\n details?: Record<string, unknown>;\n}): Observation {\n const provenance: Provenance = params.provenance ?? {\n type: 'file',\n path: params.source,\n timestamp: new Date().toISOString()\n };\n const contentForHash = `${params.source}:${params.claim}:${provenance.commit || provenance.timestamp || Date.now()}`;\n const id = `obs_${hashString(contentForHash)}`;\n\n return {\n id,\n source: params.source,\n claim: params.claim.trim(),\n provenance,\n confidence: Math.min(1.0, Math.max(0.0, params.confidence ?? 0.8)),\n positive: Array.from(new Set(params.positive?.map((p) => p.trim().toLowerCase()) ?? [])),\n negative: Array.from(new Set(params.negative?.map((n) => n.trim().toLowerCase()) ?? [])),\n details: params.details,\n recordedAt: new Date().toISOString()\n };\n}\n\n/**\n * Creates or consolidates evidence based on underlying source.\n * Crucial constraint: Multiple agents reading the same source must NOT count as independent evidence.\n */\nexport function createEvidence(\n observation: Observation,\n type: 'supports' | 'contradicts' | 'observes' = 'supports'\n): Evidence {\n const sourceHash = hashString(observation.source);\n const id = `evi_${sourceHash}`;\n\n return {\n id,\n source: observation.source,\n sourceHash,\n observationIds: [observation.id],\n type,\n claim: observation.claim,\n provenance: observation.provenance,\n weight: 1.0,\n firstObservedAt: observation.recordedAt,\n lastObservedAt: observation.recordedAt\n };\n}\n\nexport function createKnowledge(params: {\n id: string;\n type?: KnowledgeType;\n status?: KnowledgeStatus;\n stage?: KnowledgeStage;\n statement?: string;\n positive?: string[];\n negative?: string[];\n relations?: string[];\n depends_on?: string[];\n resolves?: string[];\n question?: string;\n confidence?: number;\n confidenceTier?: ConfidenceTier;\n evidence?: string[];\n scope?: Scope;\n tags?: string[];\n history?: KnowledgeHistoryEntry[];\n outcomesSummary?: KnowledgeOutcomesSummary;\n lesson?: string;\n failure_details?: Record<string, unknown>;\n context?: Record<string, unknown>;\n contradicts?: string[];\n blocking?: boolean;\n}): Knowledge {\n const now = new Date().toISOString();\n const confidenceTier =\n params.confidenceTier ??\n (params.confidence !== undefined ? confidenceToTier(params.confidence) : undefined);\n const confidence =\n params.confidence !== undefined\n ? params.confidence\n : (confidenceTier ? tierToConfidence(confidenceTier) : 0.85);\n\n const dependsOn = new Set<string>(params.depends_on ?? []);\n if (params.evidence) {\n for (const ev of params.evidence) {\n if (ev.startsWith('file:') || ev.startsWith('test:') || ev.startsWith('code:')) {\n dependsOn.add(ev);\n } else if (ev.includes('/') || ev.endsWith('.json') || ev.endsWith('.yaml') || ev.endsWith('.yml')) {\n dependsOn.add(`file:${ev}`);\n }\n }\n }\n\n const initialStage = params.stage ?? determineInitialStage({\n type: params.type ?? 'lesson',\n evidence: params.evidence ?? [],\n confidence\n });\n\n const status = params.status ?? (initialStage === 'candidate' ? 'candidate' : 'active');\n\n const history: KnowledgeHistoryEntry[] = params.history ?? [\n {\n timestamp: now,\n stage: initialStage,\n status,\n reason: `Initial knowledge recorded (${params.type ?? 'lesson'})`,\n source: params.evidence?.[0]\n }\n ];\n\n const knowledgeItem: Knowledge = {\n id: params.id.trim(),\n type: params.type ?? 'lesson',\n status,\n stage: initialStage,\n statement: (params.statement ?? params.question ?? params.id).trim(),\n positive: Array.from(new Set(params.positive?.map((p) => p.trim().toLowerCase()) ?? [])),\n negative: Array.from(new Set(params.negative?.map((n) => n.trim().toLowerCase()) ?? [])),\n relations: Array.from(new Set(params.relations?.map((r) => r.trim()) ?? [])),\n depends_on: Array.from(dependsOn),\n resolves: params.resolves ? Array.from(new Set(params.resolves.map((r) => r.trim()))) : undefined,\n question: params.question?.trim(),\n confidence: Math.min(1.0, Math.max(0.0, confidence)),\n confidenceTier,\n evidence: Array.from(new Set(params.evidence ?? [])),\n scope: params.scope ?? 'project',\n tags: Array.from(new Set(params.tags?.map((t) => t.trim().toLowerCase()) ?? [])),\n temporal: {\n revision: 1\n },\n metrics: {\n reuse_count: 0,\n support_count: 1,\n contradiction_count: 0,\n successful_outcomes: 0,\n failed_outcomes: 0\n },\n outcomesSummary: params.outcomesSummary ?? {\n applied: 0,\n successful: 0,\n misleading: 0,\n neutral: 0\n },\n history,\n value: 0,\n lesson: params.lesson,\n failure_details: params.failure_details,\n context: params.context,\n contradicts: params.contradicts ? Array.from(new Set(params.contradicts)) : undefined,\n blocking: params.blocking,\n createdAt: now,\n updatedAt: now\n };\n\n knowledgeItem.value = calculateKnowledgeValue(knowledgeItem);\n return knowledgeItem;\n}\n\n/**\n * Calculate effective confidence combining evidence ratio and outcome history.\n */\nexport function calculateEffectiveConfidence(knowledge: Knowledge): number {\n const m = knowledge.metrics;\n const base = knowledge.confidence;\n\n // Evidence ratio dampening: heavily penalizes contradictions\n const evRatio = (m.support_count + 1) / (m.support_count + 3 * m.contradiction_count + 1);\n\n const totalOutcomes = m.successful_outcomes + m.failed_outcomes;\n let outRatio = 1.0;\n let evWeight = 0.6;\n let outWeight = 0.4;\n\n if (totalOutcomes === 0) {\n evWeight = 0.85;\n outWeight = 0.15;\n } else {\n outRatio = (m.successful_outcomes + 1) / (totalOutcomes + 1);\n }\n\n const effective = base * (evWeight * evRatio + outWeight * outRatio);\n return Math.round(Math.min(1.0, Math.max(0.05, effective)) * 100) / 100;\n}\n\nconst knowledgeTokenCache = new WeakMap<Knowledge, Set<string>>();\n\n/**\n * Tokenize string into lowercase terms for lexical similarity comparison.\n */\nfunction tokenize(text: string): Set<string> {\n return new Set(\n text\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2)\n );\n}\n\nfunction getCachedTokens(k: Knowledge): Set<string> {\n let tokens = knowledgeTokenCache.get(k);\n if (!tokens) {\n tokens = tokenize(k.statement);\n knowledgeTokenCache.set(k, tokens);\n }\n return tokens;\n}\n\nfunction jaccardSimilarity(setA: Set<string>, setB: Set<string>): number {\n if (setA.size === 0 && setB.size === 0) return 1.0;\n let intersection = 0;\n for (const item of setA) {\n if (setB.has(item)) intersection++;\n }\n const union = setA.size + setB.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n\n/**\n * Known polar antonym word pairs.\n */\nconst POLAR_ANTONYMS: Array<[string, string]> = [\n ['enabled', 'disabled'],\n ['enable', 'disable'],\n ['active', 'inactive'],\n ['true', 'false'],\n ['on', 'off'],\n ['yes', 'no'],\n ['allowed', 'disallowed'],\n ['allowed', 'prohibited'],\n ['allowed', 'forbidden'],\n ['permit', 'deny'],\n ['allow', 'forbid'],\n ['allow', 'prohibit'],\n ['always', 'never'],\n ['should', 'should not'],\n ['must', 'must not'],\n ['required', 'optional'],\n ['required', 'forbidden'],\n ['valid', 'invalid'],\n ['safe', 'unsafe'],\n ['sync', 'async'],\n ['synchronous', 'asynchronous'],\n ['public', 'private']\n];\n\nconst NEGATION_PATTERNS = [\n /\\bnot\\b/i,\n /\\bnever\\b/i,\n /\\bno\\b/i,\n /\\bcannot\\b/i,\n /\\bwithout\\b/i,\n /\\bdisallow\\b/i,\n /\\bforbid\\b/i,\n /\\bprohibit\\b/i,\n /\\bavoid\\b/i\n];\n\n/**\n * Checks if two statements express opposite polarity or semantic contradiction.\n * Essential rule: High lexical similarity does NOT imply MERGE.\n * \"cache enabled in production\" vs \"cache disabled in production\" have opposite polarity.\n */\nexport function detectPolarContradiction(\n stmtA: string,\n stmtB: string\n): { contradicted: boolean; reason?: string } {\n const lowerA = stmtA.toLowerCase();\n const lowerB = stmtB.toLowerCase();\n\n // 1. Check known antonym pairs\n for (const [pos, neg] of POLAR_ANTONYMS) {\n const aHasPos = new RegExp(`\\\\b${pos}\\\\b`, 'i').test(lowerA);\n const aHasNeg = new RegExp(`\\\\b${neg}\\\\b`, 'i').test(lowerA);\n const bHasPos = new RegExp(`\\\\b${pos}\\\\b`, 'i').test(lowerB);\n const bHasNeg = new RegExp(`\\\\b${neg}\\\\b`, 'i').test(lowerB);\n\n if ((aHasPos && bHasNeg) || (aHasNeg && bHasPos)) {\n return {\n contradicted: true,\n reason: `Polar opposite terms detected: '${pos}' vs '${neg}'`\n };\n }\n }\n\n // 2. Check asymmetric negation (one statement has negation, the other does not)\n const aHasNegation = NEGATION_PATTERNS.some((p) => p.test(lowerA));\n const bHasNegation = NEGATION_PATTERNS.some((p) => p.test(lowerB));\n\n if (aHasNegation !== bHasNegation) {\n return {\n contradicted: true,\n reason: 'Asymmetric negation detected (one statement asserts, the other negates)'\n };\n }\n\n return { contradicted: false };\n}\n\n/**\n * Reconcile an incoming candidate lesson with existing knowledge.\n * Classifies the action as: NEW, MERGE, UPDATE, SUPPORT, CONTRADICT, SPECIALIZE, GENERALIZE, IGNORE.\n */\nexport function reconcileKnowledge(\n candidate: Partial<Knowledge> & { statement: string },\n existingList: Knowledge[]\n): ReconciliationResult {\n const candidateId = candidate.id?.trim();\n const candidateStmt = candidate.statement.trim();\n const candidateTokens = tokenize(candidateStmt);\n const candidatePos = new Set((candidate.positive ?? []).map((p) => p.trim().toLowerCase()));\n\n // 1. Direct ID match\n if (candidateId) {\n const directMatch = existingList.find((k) => k.id === candidateId);\n if (directMatch) {\n // Check for exact identical statement\n if (directMatch.statement.trim().toLowerCase() === candidateStmt.toLowerCase()) {\n // If evidence is identical and cues are identical, IGNORE to avoid duplicate bloat\n const hasNewEvidence = (candidate.evidence ?? []).some((e) => !directMatch.evidence.includes(e));\n if (!hasNewEvidence) {\n return {\n action: 'IGNORE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Identical statement and evidence already recorded'\n };\n }\n\n return {\n action: 'SUPPORT',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Confirms existing knowledge with new evidence source'\n };\n }\n\n // Check if candidate contradicts existing statement (e.g. contains negation or opposing cues)\n const opposingPositive = (candidate.negative ?? []).some((n) => directMatch.positive.includes(n));\n const opposingNegative = (candidate.positive ?? []).some((p) => directMatch.negative.includes(p));\n const polarCheck = detectPolarContradiction(candidateStmt, directMatch.statement);\n\n if (opposingPositive || opposingNegative || polarCheck.contradicted) {\n // Check if contexts differ (e.g. dev vs prod) -> SPECIALIZE\n const distinctCues = Array.from(candidatePos).filter((c) => !directMatch.positive.includes(c));\n const mentionsEnvA = /(development|dev|local|staging|test)/i.test(candidateStmt);\n const mentionsEnvB = /(production|prod)/i.test(directMatch.statement);\n const mentionsEnvBDev = /(development|dev|local|staging|test)/i.test(directMatch.statement);\n const mentionsEnvAProd = /(production|prod)/i.test(candidateStmt);\n\n if (distinctCues.length > 0 || (mentionsEnvA && mentionsEnvB) || (mentionsEnvBDev && mentionsEnvAProd)) {\n return {\n action: 'SPECIALIZE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: `Conflicting claim applies under specialized context cues: [${distinctCues.join(', ')}] (${polarCheck.reason || 'opposing polarity'})`\n };\n }\n\n return {\n action: 'CONTRADICT',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: `Contradicts existing statement (${polarCheck.reason || 'opposing polarity'}) for ID \"${directMatch.id}\"`\n };\n }\n\n return {\n action: 'UPDATE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Refines or updates existing knowledge statement'\n };\n }\n }\n\n // 2. Search for nearby existing knowledge by statement similarity and contextual overlap\n let bestMatch: Knowledge | null = null;\n let bestSim = 0;\n let bestPolarCheck: { contradicted: boolean; reason?: string } = { contradicted: false };\n\n for (const existing of existingList) {\n const existingTokens = getCachedTokens(existing);\n const sim = jaccardSimilarity(candidateTokens, existingTokens);\n\n // Explicit polar contradiction check: opposing polar assertions on same topic\n const polarCheck = detectPolarContradiction(candidateStmt, existing.statement);\n if (polarCheck.contradicted) {\n let sharedCount = 0;\n for (const t of candidateTokens) {\n if (existingTokens.has(t)) sharedCount++;\n }\n const sharedCues = (candidate.positive ?? []).filter((p) => existing.positive.includes(p));\n if (sharedCount >= 2 || (sharedCues.length >= 1 && sim >= 0.35) || sim >= 0.40) {\n bestMatch = existing;\n bestSim = Math.max(sim, 0.85);\n bestPolarCheck = polarCheck;\n break;\n }\n }\n\n if (sim > bestSim) {\n bestSim = sim;\n bestMatch = existing;\n bestPolarCheck = polarCheck;\n }\n }\n\n if (bestMatch && bestSim >= 0.70) {\n // CRITICAL: First evaluate contradiction and polar polarity BEFORE any merge decision!\n const polarCheck = bestPolarCheck.contradicted\n ? bestPolarCheck\n : detectPolarContradiction(candidateStmt, bestMatch.statement);\n const hasOpposingCues =\n (candidate.negative ?? []).some((n) => bestMatch!.positive.includes(n)) ||\n (candidate.positive ?? []).some((p) => bestMatch!.negative.includes(p));\n\n if (polarCheck.contradicted || hasOpposingCues) {\n // Check if contexts differ (e.g. dev vs prod) -> SPECIALIZE\n const distinctCues = Array.from(candidatePos).filter((c) => !bestMatch!.positive.includes(c));\n const mentionsEnvA = /(development|dev|local|staging|test)/i.test(candidateStmt);\n const mentionsEnvB = /(production|prod)/i.test(bestMatch.statement);\n const mentionsEnvBDev = /(development|dev|local|staging|test)/i.test(bestMatch.statement);\n const mentionsEnvAProd = /(production|prod)/i.test(candidateStmt);\n\n if (distinctCues.length > 0 || (mentionsEnvA && mentionsEnvB) || (mentionsEnvBDev && mentionsEnvAProd)) {\n return {\n action: 'SPECIALIZE',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `High textual similarity (${Math.round(bestSim * 100)}%) with polar distinction across contexts (${polarCheck.reason || 'opposing cues'})`,\n score: bestSim\n };\n }\n\n return {\n action: 'CONTRADICT',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Contradicting statement (${polarCheck.reason || 'opposing cues'}) despite high textual similarity (${Math.round(bestSim * 100)}%)`,\n score: bestSim\n };\n }\n\n // Only if polarity is compatible and similarity is nearly identical:\n if (bestSim >= 0.90) {\n return {\n action: 'MERGE',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Nearly identical statement (${Math.round(bestSim * 100)}% match) with compatible polarity; merging cues and evidence`,\n score: bestSim\n };\n }\n\n return {\n action: 'SUPPORT',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Supports existing knowledge (${Math.round(bestSim * 100)}% similarity) with compatible polarity`,\n score: bestSim\n };\n }\n\n // 3. Fallback: completely new knowledge\n return {\n action: 'NEW',\n reason: 'No conflicting or matching knowledge found; creating new knowledge entry'\n };\n}\n\n/**\n * Apply reconciliation to knowledge base.\n */\nexport function applyReconciliation(\n reconciliation: ReconciliationResult,\n candidate: Partial<Knowledge> & { statement: string },\n existingList: Knowledge[],\n storage?: { appendMetricEvent(event: MetricEvent): Promise<void> }\n): { updatedKnowledge: Knowledge; action: ReconciliationAction; createdId: string } {\n const now = new Date().toISOString();\n\n switch (reconciliation.action) {\n case 'SUPPORT': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.support_count++;\n target.metrics.last_used = now;\n storage?.appendMetricEvent({\n type: 'knowledge_strengthened',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n\n // Add new evidence refs\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) {\n target.evidence.push(e);\n }\n }\n }\n\n // Merge positive/negative cues if any new\n if (candidate.positive) {\n for (const p of candidate.positive) {\n const lp = p.trim().toLowerCase();\n if (!target.positive.includes(lp)) target.positive.push(lp);\n }\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n\n const promotion = evaluatePromotion(target);\n if (promotion.promoted && promotion.newStage) {\n target.stage = promotion.newStage;\n if (target.stage === 'active' && target.status === 'candidate') {\n target.status = 'active';\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: promotion.reason || `Promoted to ${target.stage}`,\n source: candidate.evidence?.[0]\n });\n } else {\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Confirmed with supporting evidence',\n source: candidate.evidence?.[0]\n });\n }\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n return { updatedKnowledge: target, action: 'SUPPORT', createdId: target.id };\n }\n\n case 'MERGE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.support_count++;\n target.metrics.last_used = now;\n storage?.appendMetricEvent({\n type: 'knowledge_merged',\n knowledgeId: target.id,\n targetId: reconciliation.targetId,\n timestamp: Date.now()\n });\n\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) target.evidence.push(e);\n }\n }\n\n if (candidate.positive) {\n for (const p of candidate.positive) {\n const lp = p.trim().toLowerCase();\n if (!target.positive.includes(lp)) target.positive.push(lp);\n }\n }\n\n if (candidate.negative) {\n for (const n of candidate.negative) {\n const ln = n.trim().toLowerCase();\n if (!target.negative.includes(ln)) target.negative.push(ln);\n }\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n\n const promotion = evaluatePromotion(target);\n if (promotion.promoted && promotion.newStage) {\n target.stage = promotion.newStage;\n if (target.stage === 'active' && target.status === 'candidate') {\n target.status = 'active';\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: promotion.reason || `Promoted to ${target.stage}`,\n source: candidate.evidence?.[0]\n });\n } else {\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Merged with compatible knowledge candidate',\n source: candidate.evidence?.[0]\n });\n }\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n return { updatedKnowledge: target, action: 'MERGE', createdId: target.id };\n }\n\n case 'UPDATE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.statement = candidate.statement;\n if (candidate.type) target.type = candidate.type;\n if (candidate.positive) {\n target.positive = Array.from(new Set([...target.positive, ...candidate.positive.map((p) => p.toLowerCase())]));\n }\n if (candidate.negative) {\n target.negative = Array.from(new Set([...target.negative, ...candidate.negative.map((n) => n.toLowerCase())]));\n }\n if (candidate.evidence) {\n target.evidence = Array.from(new Set([...target.evidence, ...candidate.evidence]));\n }\n\n target.temporal = {\n revision: (target.temporal?.revision ?? 1) + 1,\n valid_from: { timestamp: now }\n };\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Updated statement and context',\n source: candidate.evidence?.[0]\n });\n\n target.updatedAt = now;\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n storage?.appendMetricEvent({\n type: 'knowledge_strengthened',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'UPDATE', createdId: target.id };\n }\n\n case 'CONTRADICT': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.contradiction_count++;\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) target.evidence.push(e);\n }\n }\n\n if (target.metrics.contradiction_count > target.metrics.support_count) {\n target.status = 'contradicted';\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Contradicted by opposing claim',\n source: candidate.evidence?.[0]\n });\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n storage?.appendMetricEvent({\n type: 'contradiction_detected',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'CONTRADICT', createdId: target.id };\n }\n\n case 'SPECIALIZE': {\n // Create specialized branch\n const parent = existingList.find((k) => k.id === reconciliation.targetId);\n const subContext = candidate.positive?.[0] || 'specialized';\n const newId =\n candidate.id && candidate.id !== parent?.id\n ? candidate.id\n : `${parent ? parent.id : 'knowledge'}.${subContext}`;\n\n const created = createKnowledge({\n id: newId,\n type: candidate.type ?? parent?.type ?? 'lesson',\n statement: candidate.statement,\n positive: candidate.positive ?? [],\n negative: candidate.negative ?? [],\n relations: parent ? [parent.id, ...(candidate.relations ?? [])] : (candidate.relations ?? []),\n confidence: candidate.confidence ?? 0.85,\n evidence: candidate.evidence ?? [],\n scope: candidate.scope ?? parent?.scope ?? 'project',\n tags: candidate.tags ?? parent?.tags ?? []\n });\n\n if (parent) {\n if (!parent.relations.includes(newId)) {\n parent.relations.push(newId);\n }\n if (!parent.history) {\n parent.history = [\n {\n timestamp: parent.createdAt || now,\n stage: parent.stage,\n status: parent.status,\n reason: 'Initial knowledge recorded'\n }\n ];\n }\n parent.history.push({\n timestamp: now,\n stage: parent.stage,\n status: parent.status,\n reason: `Specialized into contextual branch ${newId}`\n });\n }\n\n storage?.appendMetricEvent({\n type: 'knowledge_specialized',\n knowledgeId: created.id,\n timestamp: Date.now()\n });\n\n return { updatedKnowledge: created, action: 'SPECIALIZE', createdId: created.id };\n }\n\n case 'IGNORE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n storage?.appendMetricEvent({\n type: 'duplicate_ignored',\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'IGNORE', createdId: target.id };\n }\n\n case 'NEW':\n default: {\n const newId = candidate.id || `kn_${hashString(candidate.statement)}`;\n const created = createKnowledge({\n id: newId,\n type: candidate.type,\n statement: candidate.statement,\n positive: candidate.positive,\n negative: candidate.negative,\n relations: candidate.relations,\n confidence: candidate.confidence,\n evidence: candidate.evidence,\n scope: candidate.scope,\n tags: candidate.tags\n });\n storage?.appendMetricEvent({\n type: 'knowledge_created',\n knowledgeId: created.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: created, action: 'NEW', createdId: created.id };\n }\n }\n}\n","import type {\n Knowledge,\n KnowledgeStage,\n OutcomeRecord,\n KnowledgeBudgetConfig\n} from './types.js';\n\n/**\n * Determines initial quarantine stage for a new knowledge item.\n * Deterministic facts (e.g. compiler config, explicit package manifests) skip probation directly to 'active'.\n * Speculative lessons, heuristics, and inferences start in 'candidate' stage.\n */\nexport function determineInitialStage(knowledge: Partial<Knowledge>): KnowledgeStage {\n if (\n knowledge.type === 'fact' ||\n knowledge.type === 'architecture' ||\n knowledge.confidenceTier === 'high' ||\n (knowledge.confidence !== undefined && knowledge.confidence >= 0.85)\n ) {\n return 'active';\n }\n if (\n knowledge.type === 'rule' &&\n ((knowledge.evidence?.length ?? 0) >= 2 || (knowledge.confidence !== undefined && knowledge.confidence >= 0.75))\n ) {\n return 'probation';\n }\n if (knowledge.confidence !== undefined && knowledge.confidence >= 0.70) {\n return 'probation';\n }\n return 'candidate';\n}\n\n/**\n * Evaluates whether a knowledge item qualifies for promotion along the quarantine ladder:\n * CANDIDATE -> PROBATION -> ACTIVE\n */\nexport function evaluatePromotion(knowledge: Knowledge): {\n promoted: boolean;\n newStage: KnowledgeStage;\n reason?: string;\n} {\n const stage = knowledge.stage ?? 'candidate';\n const supportCount = knowledge.metrics.support_count;\n const reuseCount = knowledge.metrics.reuse_count;\n const successCount = Math.max(knowledge.outcomesSummary?.successful ?? 0, knowledge.metrics.successful_outcomes ?? 0);\n const misleadingCount = Math.max(knowledge.outcomesSummary?.misleading ?? 0, knowledge.metrics.failed_outcomes ?? 0);\n\n if (stage === 'candidate') {\n // Promote to probation if supported by 2+ independent sources or high confidence evidence\n if (supportCount >= 2 || (knowledge.evidence && knowledge.evidence.length >= 2) || knowledge.confidence >= 0.85) {\n return {\n promoted: true,\n newStage: 'probation',\n reason: `Supported by ${supportCount} sources / ${knowledge.evidence.length} evidence nodes`\n };\n }\n } else if (stage === 'probation') {\n // Promote to active if successfully reused or confirmed by positive task outcome without misleading outcomes\n if ((successCount > 0 && misleadingCount === 0) || (reuseCount >= 2 && misleadingCount === 0)) {\n return {\n promoted: true,\n newStage: 'active',\n reason: `Verified by ${successCount} successful task outcomes and ${reuseCount} reuses`\n };\n }\n }\n\n return { promoted: false, newStage: stage };\n}\n\n/**\n * Calculates deterministic knowledge value metric.\n * Combines reuse frequency, evidence backing, successful task outcomes, and penalizes misleading outcomes.\n * Used during compaction and knowledge budget management.\n */\nexport function calculateKnowledgeValue(knowledge: Knowledge): number {\n const reuse = knowledge.metrics.reuse_count;\n const success = knowledge.outcomesSummary?.successful ?? knowledge.metrics.successful_outcomes;\n const misleading = knowledge.outcomesSummary?.misleading ?? knowledge.metrics.failed_outcomes;\n const evidenceCount = Math.min(knowledge.evidence.length, 6);\n const confidence = knowledge.confidence;\n\n let value = (reuse * 2.5) + (success * 4.0) + (evidenceCount * 1.5) + (confidence * 2.0) - (misleading * 5.0);\n\n if (knowledge.status === 'active') value += 5.0;\n if (knowledge.status === 'needs_revalidation') value -= 3.0;\n if (knowledge.status === 'contradicted') value -= 8.0;\n if (knowledge.status === 'stale') value -= 4.0;\n if (knowledge.stage === 'active') value += 3.0;\n if (knowledge.stage === 'candidate') value -= 1.0;\n\n return Math.round(value * 10) / 10;\n}\n\n/**\n * Applies a task outcome record to a knowledge item:\n * Updates outcome telemetry, recalculates value, and triggers promotion or demotion.\n */\nexport function recordOutcomeOnKnowledge(\n knowledge: Knowledge,\n outcome: OutcomeRecord\n): { updatedKnowledge: Knowledge; actionTaken?: string } {\n const now = new Date().toISOString();\n const summary = knowledge.outcomesSummary ?? {\n applied: 0,\n successful: 0,\n misleading: 0,\n neutral: 0\n };\n\n summary.applied++;\n let actionTaken: string | undefined;\n\n if (outcome.result === 'success') {\n summary.successful++;\n knowledge.metrics.successful_outcomes++;\n knowledge.metrics.reuse_count++;\n // Check if probation item qualifies for promotion\n const promo = evaluatePromotion({ ...knowledge, outcomesSummary: summary });\n if (promo.promoted) {\n knowledge.stage = promo.newStage;\n actionTaken = `Promoted to ${promo.newStage} (${promo.reason})`;\n const history = knowledge.history ?? [];\n history.push({\n timestamp: now,\n status: knowledge.status,\n action: 'promote',\n reason: promo.reason\n });\n knowledge.history = history;\n }\n } else if (outcome.result === 'failure' || outcome.result === 'reverted') {\n summary.misleading++;\n knowledge.metrics.failed_outcomes++;\n // Demote or mark needs_revalidation if misleading outcomes dominate\n if (summary.misleading >= 2 && summary.misleading > summary.successful) {\n knowledge.status = 'needs_revalidation';\n actionTaken = `Marked needs_revalidation: ${summary.misleading} misleading outcomes recorded`;\n const history = knowledge.history ?? [];\n history.push({\n timestamp: now,\n status: 'needs_revalidation',\n action: 'demote',\n reason: actionTaken\n });\n knowledge.history = history;\n }\n } else {\n summary.neutral++;\n }\n\n knowledge.outcomesSummary = summary;\n knowledge.value = calculateKnowledgeValue(knowledge);\n knowledge.updatedAt = now;\n\n return { updatedKnowledge: knowledge, actionTaken };\n}\n\n/**\n * Enforces knowledge budget without arbitrarily deleting provenance.\n * When active knowledge exceeds budget, demotes lowest-value items to probation/candidate.\n */\nexport function enforceKnowledgeBudget(\n knowledgeList: Knowledge[],\n budget?: KnowledgeBudgetConfig\n): { modifiedList: Knowledge[]; demotedCount: number } {\n if (!budget || !budget.active || budget.active <= 0) {\n return { modifiedList: knowledgeList, demotedCount: 0 };\n }\n\n const activeItems = knowledgeList.filter((k) => k.status === 'active' && k.stage === 'active');\n if (activeItems.length <= budget.active) {\n return { modifiedList: knowledgeList, demotedCount: 0 };\n }\n\n // Sort active items by value ascending (lowest value first)\n activeItems.sort((a, b) => calculateKnowledgeValue(a) - calculateKnowledgeValue(b));\n\n const excessCount = activeItems.length - budget.active;\n const toDemote = new Set(activeItems.slice(0, excessCount).map((k) => k.id));\n const now = new Date().toISOString();\n\n const modifiedList = knowledgeList.map((k) => {\n if (toDemote.has(k.id)) {\n const history = k.history ?? [];\n k.stage = 'probation';\n k.status = 'probation';\n k.updatedAt = now;\n k.history = [\n ...history,\n {\n timestamp: now,\n stage: 'probation',\n status: 'probation',\n action: 'budget_demotion',\n reason: `Active items exceeded budget (${budget.active}). Demoted to probation based on knowledge value.`\n }\n ];\n return k;\n }\n return k;\n });\n\n return { modifiedList, demotedCount: excessCount };\n}\n","import type {\n UnknownRecord,\n UnknownState,\n UnknownReason,\n UnknownNextAction,\n Scope\n} from './types.js';\n\nexport function createUnknown(params: {\n id: string;\n state?: UnknownState;\n reason?: UnknownReason;\n statement?: string;\n checked?: string[];\n next?: UnknownNextAction;\n scope?: Scope;\n}): UnknownRecord {\n const now = new Date().toISOString();\n return {\n id: params.id.trim(),\n state: params.state ?? 'UNKNOWN',\n reason: params.reason ?? 'NOT_OBSERVED',\n statement: params.statement?.trim(),\n checked: Array.from(new Set(params.checked?.map((c) => c.trim()) ?? [])),\n next: params.next,\n scope: params.scope ?? 'project',\n createdAt: now,\n updatedAt: now\n };\n}\n\n/**\n * Checks if a specific path or query was already investigated,\n * helping agents avoid repeating useless investigations.\n */\nexport function hasBeenInvestigated(\n unknowns: UnknownRecord[],\n target: string\n): { investigated: boolean; record?: UnknownRecord; reason?: string } {\n const normalizedTarget = target.trim().toLowerCase();\n\n for (const record of unknowns) {\n if (record.id.toLowerCase() === normalizedTarget) {\n return { investigated: true, record, reason: record.reason };\n }\n\n const checkedMatch = record.checked.some((c) => {\n const nc = c.toLowerCase();\n return nc === normalizedTarget || normalizedTarget.startsWith(nc.replace('/**', ''));\n });\n\n if (checkedMatch) {\n return { investigated: true, record, reason: record.reason };\n }\n }\n\n return { investigated: false };\n}\n\n/**\n * Update an existing unknown with new checked paths or update its state when partially known or resolved.\n */\nexport function updateUnknown(\n record: UnknownRecord,\n updates: {\n state?: UnknownState;\n reason?: UnknownReason;\n statement?: string;\n addChecked?: string[];\n next?: UnknownNextAction;\n }\n): UnknownRecord {\n const checked = new Set(record.checked);\n if (updates.addChecked) {\n for (const c of updates.addChecked) {\n checked.add(c.trim());\n }\n }\n\n return {\n ...record,\n state: updates.state ?? record.state,\n reason: updates.reason ?? record.reason,\n statement: updates.statement !== undefined ? updates.statement : record.statement,\n checked: Array.from(checked),\n next: updates.next !== undefined ? updates.next : record.next,\n updatedAt: new Date().toISOString()\n };\n}\n","import { hashString, calculateEffectiveConfidence } from './knowledge.js';\nimport type {\n OutcomeRecord,\n OutcomeType,\n Knowledge,\n BilmemMetrics\n} from './types.js';\n\nexport function createOutcome(params: {\n knowledgeId?: string;\n taskId?: string;\n result: OutcomeType;\n context?: {\n positive?: string[];\n negative?: string[];\n };\n feedback?: string;\n}): OutcomeRecord {\n const content = `${params.knowledgeId || 'none'}:${params.result}:${Date.now()}`;\n return {\n id: `out_${hashString(content)}`,\n knowledgeId: params.knowledgeId,\n taskId: params.taskId,\n result: params.result,\n context: params.context,\n feedback: params.feedback,\n timestamp: new Date().toISOString()\n };\n}\n\n/**\n * Apply outcome to a knowledge unit and recalculate its confidence.\n */\nexport function applyOutcomeToKnowledge(\n knowledge: Knowledge,\n outcome: OutcomeRecord\n): Knowledge {\n const now = new Date().toISOString();\n knowledge.metrics.reuse_count++;\n knowledge.metrics.last_used = now;\n\n if (outcome.result === 'success') {\n knowledge.metrics.successful_outcomes++;\n } else if (outcome.result === 'failure' || outcome.result === 'reverted') {\n knowledge.metrics.failed_outcomes++;\n }\n\n // Recalculate effective confidence\n knowledge.confidence = calculateEffectiveConfidence(knowledge);\n knowledge.updatedAt = now;\n return knowledge;\n}\n\nexport class MetricsTracker {\n private metrics: BilmemMetrics = {\n knowledgeHits: 0,\n knowledgeMisses: 0,\n knowledgeReused: 0,\n unknownsResolved: 0,\n repeatedInvestigationsPrevented: 0,\n candidateKnowledgeMerged: 0,\n staleKnowledgeDetected: 0,\n contradictionsDetected: 0,\n knowledgePromoted: 0,\n knowledgeSuperseded: 0\n };\n\n constructor(initial?: Partial<BilmemMetrics>) {\n if (initial) {\n this.metrics = { ...this.metrics, ...initial };\n }\n }\n\n recordHit(): void {\n this.metrics.knowledgeHits++;\n }\n\n recordMiss(): void {\n this.metrics.knowledgeMisses++;\n }\n\n recordReused(): void {\n this.metrics.knowledgeReused++;\n }\n\n recordUnknownResolved(): void {\n this.metrics.unknownsResolved++;\n }\n\n recordInvestigationPrevented(): void {\n this.metrics.repeatedInvestigationsPrevented++;\n }\n\n recordCandidateMerged(): void {\n this.metrics.candidateKnowledgeMerged++;\n }\n\n recordStaleDetected(): void {\n this.metrics.staleKnowledgeDetected++;\n }\n\n recordContradiction(): void {\n this.metrics.contradictionsDetected++;\n }\n\n recordPromoted(): void {\n this.metrics.knowledgePromoted++;\n }\n\n recordSuperseded(): void {\n this.metrics.knowledgeSuperseded++;\n }\n\n getMetrics(): BilmemMetrics {\n return { ...this.metrics };\n }\n\n toJSON(): BilmemMetrics {\n return this.metrics;\n }\n}\n","import { createHash } from 'node:crypto';\nimport type {\n TaskTrajectory,\n Knowledge,\n Observation,\n Evidence,\n Provenance,\n ReconciliationResult,\n ReconciliationAction\n} from './types.js';\nimport {\n createObservation,\n createEvidence,\n createKnowledge,\n reconcileKnowledge,\n applyReconciliation\n} from './knowledge.js';\n\nexport interface DistilledLesson {\n id: string;\n statement: string;\n positive: string[];\n negative: string[];\n confidence: number;\n evidence: string[];\n tags: string[];\n reasoning: string;\n}\n\nexport interface TrajectoryLearningResult {\n taskId: string;\n observations: Observation[];\n evidence: Evidence[];\n candidateLessons: Array<Partial<Knowledge> & { statement: string }>;\n reconciliations: Array<{\n candidate: Partial<Knowledge> & { statement: string };\n result: ReconciliationResult;\n appliedKnowledge?: Knowledge;\n action: ReconciliationAction;\n }>;\n dryRun: boolean;\n}\n\n/**\n * Distill a task trajectory into a compact, reusable candidate lesson.\n * Avoids dumping raw trajectories into permanent memory;\n * extracts only the crystallized insight (what worked, what failed, negative patterns).\n */\nexport function distillTrajectory(trajectory: TaskTrajectory): DistilledLesson | null {\n const events = trajectory.events || [];\n if (events.length === 0) return null;\n\n const failures = events.filter((e) => e.type === 'failure' || e.type === 'revert');\n const successes = events.filter((e) => e.type === 'success');\n const corrections = events.filter((e) => e.type === 'user_correction');\n\n // If nothing succeeded or no significant signal, do not create spurious memory\n if (successes.length === 0 && corrections.length === 0 && failures.length === 0) {\n return null;\n }\n\n const positiveSignals = new Set<string>();\n const negativeSignals = new Set<string>();\n const tags = new Set<string>(['lesson', 'trajectory']);\n\n // Extract negative signals from failures and rejected hypotheses\n for (const f of failures) {\n negativeSignals.add(f.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n if (f.path) negativeSignals.add(f.path.toLowerCase());\n }\n\n // Extract positive signals from successful attempts & goal\n for (const s of successes) {\n positiveSignals.add(s.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n if (s.path) positiveSignals.add(s.path.toLowerCase());\n }\n\n // Extract from user corrections\n for (const c of corrections) {\n positiveSignals.add(c.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n tags.add('user-correction');\n }\n\n // Extract tokens from goal\n const goalTokens = trajectory.goal\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((w) => w.length > 3);\n for (const t of goalTokens) {\n positiveSignals.add(t);\n }\n\n // Compose statement\n let statement = '';\n let reasoning = '';\n\n if (corrections.length > 0) {\n const lastCorr = corrections[corrections.length - 1];\n statement = `Corrected approach for \"${trajectory.goal}\": ${lastCorr.description}`;\n reasoning = `Based on user correction during task ${trajectory.taskId}`;\n } else if (successes.length > 0) {\n const lastSuccess = successes[successes.length - 1];\n if (failures.length > 0) {\n const firstFailure = failures[0];\n statement = `When addressing \"${trajectory.goal}\": prefer ${lastSuccess.description} over ${firstFailure.description}`;\n reasoning = `Initial attempt (${firstFailure.description}) failed/reverted; resolved by ${lastSuccess.description}`;\n } else {\n statement = `Effective pattern for \"${trajectory.goal}\": ${lastSuccess.description}`;\n reasoning = `Directly succeeded in task ${trajectory.taskId}`;\n }\n } else if (failures.length > 0) {\n const failureList = failures.map((f) => f.description).join(', ');\n statement = `Avoid for \"${trajectory.goal}\": approaches [${failureList}] failed`;\n reasoning = `Recorded ${failures.length} failed attempts in task ${trajectory.taskId}`;\n }\n\n const hash = createHash('sha256')\n .update(`${trajectory.goal}:${statement}`)\n .digest('hex')\n .slice(0, 12);\n const id = `lesson.${trajectory.taskId || hash}`;\n\n return {\n id,\n statement,\n positive: Array.from(positiveSignals).slice(0, 8),\n negative: Array.from(negativeSignals).slice(0, 8),\n confidence: corrections.length > 0 ? 0.95 : successes.length > 0 ? 0.85 : 0.65,\n evidence: [`trajectory:${trajectory.taskId}`],\n tags: Array.from(tags),\n reasoning\n };\n}\n\n/**\n * Executes the complete staged trajectory learning pipeline:\n * trajectory → observations → candidate lessons → reconcile → knowledge\n *\n * Honors the \"Memory should grow by refinement, not accumulation\" principle.\n * Raw trajectory is never dumped directly to knowledge.\n */\nexport function learnFromTrajectory(\n trajectory: TaskTrajectory,\n existingKnowledge: Knowledge[] = [],\n options: { dryRun?: boolean; storage?: { appendMetricEvent(event: any): Promise<void> } } = {}\n): TrajectoryLearningResult {\n const dryRun = options.dryRun ?? false;\n const storage = options.storage;\n const now = new Date().toISOString();\n const taskId = trajectory.taskId || `task_${Date.now()}`;\n const events = trajectory.events || [];\n\n // Step 1: Trajectory -> Observations\n const observations: Observation[] = [];\n events.forEach((event, idx) => {\n let obsType: Provenance['type'] = 'agent';\n let confidence = 0.75;\n const positive: string[] = [taskId, event.type];\n const negative: string[] = [];\n\n if (event.type === 'user_correction') {\n obsType = 'user';\n confidence = 0.98;\n } else if (event.type === 'failure' || event.type === 'revert') {\n obsType = 'test';\n confidence = 0.95;\n negative.push(event.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n } else if (event.type === 'success') {\n obsType = 'agent';\n confidence = 0.95;\n positive.push(event.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n } else if (event.type === 'hypothesis') {\n confidence = 0.50; // Inferred / speculative\n }\n\n if (event.path) positive.push(event.path.toLowerCase());\n\n observations.push(\n createObservation({\n source: `trajectory:${taskId}:${event.type}:${idx}`,\n claim: `[${event.type.toUpperCase()}] ${event.description}`,\n provenance: {\n type: obsType,\n path: event.path,\n timestamp: event.timestamp || now\n },\n confidence,\n positive,\n negative: negative.length > 0 ? negative : undefined,\n details: { taskId, eventIndex: idx, eventType: event.type, ...(event.data || {}) }\n })\n );\n });\n\n // Step 2: Observations -> Evidence Nodes\n const evidence: Evidence[] = observations.map((obs) => {\n const isFailure = obs.claim.startsWith('[FAILURE]') || obs.claim.startsWith('[REVERT]');\n return createEvidence(obs, isFailure ? 'contradicts' : 'supports');\n });\n\n // Step 3: Evidence -> Candidate Lessons\n const distilled = distillTrajectory(trajectory);\n const candidateLessons: Array<Partial<Knowledge> & { statement: string }> = [];\n\n if (distilled) {\n // Attach observation IDs as evidence backing\n candidateLessons.push({\n id: distilled.id,\n type: 'lesson',\n statement: distilled.statement,\n positive: distilled.positive,\n negative: distilled.negative,\n confidence: distilled.confidence,\n evidence: evidence.map((e) => e.source),\n tags: distilled.tags,\n scope: 'project'\n });\n }\n\n // Step 4: Candidate Lessons -> Reconcile\n const reconciliations: TrajectoryLearningResult['reconciliations'] = [];\n const currentKnowledgeList = [...existingKnowledge];\n\n for (const candidate of candidateLessons) {\n const recResult = reconcileKnowledge(candidate, currentKnowledgeList);\n\n if (dryRun) {\n reconciliations.push({\n candidate,\n result: recResult,\n action: recResult.action\n });\n } else {\n const { updatedKnowledge, action } = applyReconciliation(\n recResult,\n candidate,\n currentKnowledgeList,\n storage\n );\n reconciliations.push({\n candidate,\n result: recResult,\n appliedKnowledge: updatedKnowledge,\n action\n });\n }\n }\n\n return {\n taskId,\n observations,\n evidence,\n candidateLessons,\n reconciliations,\n dryRun\n };\n}\n\n/**\n * Handle explicit user correction as high-quality evidence.\n * Prevents future agents from repeatedly making the same invalid assumption.\n */\nexport function processUserCorrection(params: {\n topic: string;\n incorrectAssumption: string;\n correctFact: string;\n context?: string[];\n author?: string;\n}): {\n observation: Observation;\n knowledge: Knowledge;\n} {\n const now = new Date().toISOString();\n const prov: Provenance = {\n type: 'user',\n timestamp: now,\n ...(params.author ? { author: params.author } : {})\n };\n\n const claim = `User correction on ${params.topic}: ${params.correctFact} (supersedes assumption: ${params.incorrectAssumption})`;\n\n const observation = createObservation({\n source: `user:correction:${params.topic.toLowerCase()}`,\n claim,\n provenance: prov,\n confidence: 1.0,\n positive: [params.topic.toLowerCase(), ...(params.context ?? [])],\n negative: [params.incorrectAssumption.toLowerCase()]\n });\n\n const evidence = createEvidence(observation, 'supports');\n\n const knowledge = createKnowledge({\n id: `correction.${params.topic.toLowerCase().replace(/[^a-z0-9_-]/g, '.')}`,\n type: 'rule',\n status: 'active',\n statement: params.correctFact,\n positive: [params.topic.toLowerCase(), ...(params.context ?? [])],\n negative: [params.incorrectAssumption.toLowerCase()],\n confidence: 1.0,\n confidenceTier: 'high',\n evidence: [evidence.id, observation.source],\n tags: ['user-correction', params.topic.toLowerCase()]\n });\n\n return { observation, knowledge };\n}\n","import * as path from 'node:path';\nimport type {\n Observation,\n Evidence,\n EvidenceRelation,\n Knowledge,\n UnknownRecord\n} from '../core/types.js';\nimport { createEvidence, createKnowledge, reconcileKnowledge, applyReconciliation } from '../core/knowledge.js';\nimport { createUnknown } from '../core/unknown.js';\nimport { EvidenceGraph } from '../core/relations.js';\nimport { Storage } from '../storage/canonical.js';\nimport { SearchIndex } from '../search/indexer.js';\nimport { walkDirectory, analyzeProjectStructure, ProjectContext, type ScannedFileInfo } from './filesystem.js';\nimport { parseMarkdownFile } from './markdown.js';\nimport { scanGitHistory } from './git.js';\nimport { analyzeSourceFile, isSourceFile } from './source.js';\nimport { loadAllProjectRuleSets } from '../rules/loader.js';\nimport { evaluateRule, ruleToObservation, ruleToCandidateLesson } from '../rules/evaluator.js';\n\nexport interface ScanOptions {\n incremental?: boolean;\n maxCommits?: number;\n dryRun?: boolean;\n}\n\nexport interface ScanReport {\n filesScanned: number;\n observationsCreated: number;\n evidenceCreated: number;\n knowledgeCreated: number;\n knowledgeUpdated: number;\n unknownsCount: number;\n gitCommitsScanned: number;\n headCommit?: string;\n incremental: boolean;\n dryRun: boolean;\n plannedActions?: string[];\n}\n\n/**\n * Executes a comprehensive, conservative repository scan:\n * Sources -> Observations -> Evidence Graph -> Explicit Rule/ADR Candidates -> Reconcile -> Knowledge\n *\n * Core philosophy: Deterministik scan'in esas çıktısı observation/evidence'tır.\n * Scan her şeyden zoraki knowledge üretmez. Semantik olarak kesin olmayan sinyaller\n * gözlem ve kanıt olarak kalır (\"ederinden fazlasını vaat etmeme\").\n */\nexport async function scanRepository(\n rootDir: string = process.cwd(),\n options: ScanOptions = {}\n): Promise<ScanReport> {\n const storage = new Storage(rootDir);\n const dryRun = options.dryRun ?? false;\n const plannedActions: string[] = [];\n\n const config = dryRun ? (await storage.isInitialized() ? await storage.getConfig() : {\n schemaVersion: 1,\n projectName: path.basename(rootDir),\n defaultScope: 'project' as const,\n dataDir: path.join(rootDir, '.bilmem')\n }) : await storage.init();\n\n const incremental = options.incremental ?? false;\n const lastScanCommit = incremental ? config.lastScanCommit : undefined;\n\n // 1. Filesystem Scan\n const scannedFiles = await walkDirectory(rootDir);\n const fsObs = await analyzeProjectStructure(scannedFiles, rootDir);\n const projectContext = new ProjectContext(scannedFiles, rootDir);\n\n // 1.5. Declarative YAML Rule Sets Scan (.bilmem/rules/*.yml, bilmem.rules.yml, rules.yml)\n const ruleObs: Observation[] = [];\n const ruleCandidateLessons: Array<Partial<Knowledge> & { statement: string }> = [];\n const { ruleSets, sourceFiles } = await loadAllProjectRuleSets(rootDir, storage.getRulesDir());\n\n for (let idx = 0; idx < ruleSets.length; idx++) {\n const set = ruleSets[idx];\n const sourceFile = sourceFiles[idx] || 'rules.yml';\n for (const rule of set.rules) {\n const evalResult = await evaluateRule(rule, projectContext);\n if (evalResult.matched) {\n const obs = ruleToObservation(rule, evalResult, sourceFile);\n ruleObs.push(obs);\n ruleCandidateLessons.push(ruleToCandidateLesson(rule, evalResult, obs.source));\n }\n }\n }\n\n const mdObs: Observation[] = [];\n const srcObs: Observation[] = [];\n const relations: EvidenceRelation[] = [];\n\n for (const file of scannedFiles) {\n if (file.ext === '.md') {\n const res = await parseMarkdownFile(file.path, file.relativePath);\n mdObs.push(...res.observations);\n if (res.relations && res.relations.length > 0) {\n relations.push(...res.relations);\n }\n } else if (isSourceFile(file.ext)) {\n const res = await analyzeSourceFile(file.path, file.relativePath);\n srcObs.push(...res.observations);\n relations.push(...res.relations);\n }\n }\n\n // 2. Git History Scan\n const gitResult = await scanGitHistory(rootDir, {\n lastScanCommit,\n maxCommits: options.maxCommits ?? 100\n });\n relations.push(...gitResult.relations);\n\n // 3. Collect All Observations and Build Evidence Graph\n const allObs: Observation[] = [...fsObs, ...ruleObs, ...mdObs, ...srcObs, ...gitResult.observations];\n\n if (!dryRun) {\n for (const obs of allObs) {\n await storage.saveObservation(obs);\n }\n\n const graph = new EvidenceGraph(await storage.getRelations());\n for (const r of relations) {\n graph.addRelation(r);\n }\n await storage.saveRelations(graph.getAllRelations());\n } else {\n plannedActions.push(`Would persist ${allObs.length} observations`);\n plannedActions.push(`Would record ${relations.length} evidence relations`);\n }\n\n // 4. Create Evidence Nodes\n const evidenceNodes: Evidence[] = [];\n for (const obs of allObs) {\n const ev = createEvidence(obs, 'supports');\n if (!dryRun) {\n await storage.saveEvidence(ev);\n }\n evidenceNodes.push(ev);\n }\n if (dryRun) {\n plannedActions.push(`Would create ${evidenceNodes.length} evidence nodes`);\n }\n\n // 5. Conservative Knowledge Extraction\n // Primary output of scan is Observation/Evidence. Only verified, high-confidence\n // rule sets and explicit ADR decisions become candidate lessons for reconciliation.\n const candidateLessons: Array<Partial<Knowledge> & { statement: string }> = [\n ...ruleCandidateLessons\n ];\n\n // A. From explicit Markdown ADRs with decisions or documented warnings\n for (const o of mdObs) {\n if (o.source.includes(':adr') || o.claim.startsWith('[WARNING]') || o.claim.startsWith('[CAUTION]')) {\n const id = `decision.${path.basename(o.provenance.path || 'doc', '.md')}.${o.provenance.line || 'adr'}`;\n candidateLessons.push({\n id,\n type: 'decision',\n statement: o.claim,\n positive: o.positive ?? [],\n negative: o.negative ?? [],\n confidence: o.confidence,\n evidence: [o.source],\n scope: 'project'\n });\n }\n }\n\n // B. From Git Reverts (verified failure lesson)\n for (const o of gitResult.observations) {\n if (o.positive?.includes('revert')) {\n candidateLessons.push({\n id: `git.lesson.${o.provenance.commit || 'revert'}`,\n type: 'lesson',\n statement: `Caution: ${o.claim}`,\n positive: o.positive,\n negative: ['untested-assumption'],\n confidence: o.confidence,\n evidence: [o.source],\n scope: 'project'\n });\n }\n }\n\n // 6. Check for Unknowns (e.g. database migration, deployment pipeline)\n const relPaths = new Set(scannedFiles.map((f) => f.relativePath.toLowerCase()));\n const hasMigrations = Array.from(relPaths).some((p) => p.includes('migration') || p.includes('migrate'));\n const hasDb = Array.from(relPaths).some((p) => p.includes('db') || p.includes('database') || p.includes('sql'));\n let unknownCount = 0;\n\n if (hasDb && !hasMigrations) {\n unknownCount++;\n const unknownRec = createUnknown({\n id: 'project.database.migration',\n state: 'UNKNOWN',\n reason: 'UNRESOLVABLE_LOCALLY',\n statement: 'Database directory exists, but no explicit migration tool or folder was found locally.',\n checked: ['package.json', 'src/db/**', 'scripts/**'],\n next: {\n type: 'ask',\n question: 'How are database migrations performed in this project?'\n },\n scope: 'project'\n });\n if (!dryRun) {\n await storage.saveUnknown(unknownRec);\n } else {\n plannedActions.push(`Would register unknown: \"${unknownRec.statement}\"`);\n }\n }\n\n // 7. Reconciliation with Canonical Knowledge Base\n const existingKnowledge = await storage.getAllKnowledge();\n let createdCount = 0;\n let updatedCount = 0;\n\n for (const cand of candidateLessons) {\n const rec = reconcileKnowledge(cand, existingKnowledge);\n if (!dryRun) {\n const { updatedKnowledge, action } = applyReconciliation(rec, cand, existingKnowledge, storage);\n await storage.saveKnowledge(updatedKnowledge);\n\n if (action === 'NEW' || action === 'SPECIALIZE') {\n createdCount++;\n existingKnowledge.push(updatedKnowledge);\n } else if (action === 'SUPPORT' || action === 'UPDATE' || action === 'MERGE' || action === 'CONTRADICT') {\n updatedCount++;\n }\n } else {\n plannedActions.push(`Would reconcile [${rec.action}]: \"${cand.statement}\" (${rec.reason})`);\n if (rec.action === 'NEW' || rec.action === 'SPECIALIZE') {\n createdCount++;\n } else if (rec.action !== 'IGNORE') {\n updatedCount++;\n }\n }\n }\n\n if (!dryRun) {\n // 8. Rebuild Search Index\n const index = new SearchIndex();\n await index.buildIndex(existingKnowledge);\n\n // 9. Update Config with Last Scan Commit\n await storage.updateConfig({\n lastScanCommit: gitResult.headCommit ?? config.lastScanCommit,\n lastScanTimestamp: new Date().toISOString()\n });\n\n // 10. Record Revision Snapshot for Incremental Diff\n await storage.appendRevision({\n id: `rev_${Date.now().toString(36)}`,\n commit: gitResult.headCommit,\n timestamp: new Date().toISOString(),\n action: 'scan',\n observationCount: allObs.length,\n evidenceCount: evidenceNodes.length,\n knowledgeCount: existingKnowledge.length,\n activeCount: existingKnowledge.filter((k) => k.status === 'active').length,\n contradictedCount: existingKnowledge.filter((k) => k.status === 'contradicted').length,\n staleCount: existingKnowledge.filter((k) => k.status === 'stale').length,\n changesSummary: `Scanned ${scannedFiles.length} files: +${allObs.length} obs, +${createdCount} candidates, ~${updatedCount} updated.`\n });\n }\n\n const unknowns = dryRun ? [] : await storage.getAllUnknowns();\n\n return {\n filesScanned: scannedFiles.length,\n observationsCreated: allObs.length,\n evidenceCreated: evidenceNodes.length,\n knowledgeCreated: createdCount,\n knowledgeUpdated: updatedCount,\n unknownsCount: dryRun ? unknownCount : unknowns.length,\n gitCommitsScanned: gitResult.commitsScanned,\n headCommit: gitResult.headCommit,\n incremental,\n dryRun,\n plannedActions: dryRun ? plannedActions : undefined\n };\n}\n","import type { EvidenceRelation, RelationType } from './types.js';\n\n/**\n * Lightweight, in-memory graph structure for managing relations between\n * files, observations, evidence, and knowledge nodes.\n */\nexport class EvidenceGraph {\n private fromMap = new Map<string, EvidenceRelation[]>();\n private toMap = new Map<string, EvidenceRelation[]>();\n\n constructor(relations: EvidenceRelation[] = []) {\n for (const rel of relations) {\n this.addRelation(rel);\n }\n }\n\n addRelation(relation: EvidenceRelation): void {\n if (!relation || !relation.from || !relation.to || !relation.type) {\n return;\n }\n\n // Prevent identical duplicate edges\n const existing = this.getRelationsBetween(relation.from, relation.to);\n const dup = existing.find((r) => r.type === relation.type);\n if (dup) {\n // If weight differs, increase weight\n dup.weight = (dup.weight ?? 1) + (relation.weight ?? 1);\n return;\n }\n\n const fromList = this.fromMap.get(relation.from) ?? [];\n fromList.push(relation);\n this.fromMap.set(relation.from, fromList);\n\n const toList = this.toMap.get(relation.to) ?? [];\n toList.push(relation);\n this.toMap.set(relation.to, toList);\n }\n\n getRelationsFrom(fromId: string): EvidenceRelation[] {\n return this.fromMap.get(fromId) ?? [];\n }\n\n getRelationsTo(toId: string): EvidenceRelation[] {\n return this.toMap.get(toId) ?? [];\n }\n\n getRelationsBetween(fromId: string, toId: string): EvidenceRelation[] {\n const fromList = this.fromMap.get(fromId);\n if (!fromList) return [];\n return fromList.filter((r) => r.to === toId);\n }\n\n getAllRelations(): EvidenceRelation[] {\n const all: EvidenceRelation[] = [];\n for (const list of this.fromMap.values()) {\n all.push(...list);\n }\n return all;\n }\n\n findCoChanged(file: string, threshold = 1): Array<{ file: string; weight: number }> {\n const relations = this.getRelationsFrom(file).filter((r) => r.type === 'CO_CHANGED');\n const result: Array<{ file: string; weight: number }> = [];\n\n for (const rel of relations) {\n const w = rel.weight ?? 1;\n if (w >= threshold) {\n result.push({ file: rel.to, weight: w });\n }\n }\n\n return result.sort((a, b) => b.weight - a.weight);\n }\n\n findConnected(id: string, maxDepth = 2): string[] {\n const visited = new Set<string>();\n const queue: Array<{ node: string; depth: number }> = [{ node: id, depth: 0 }];\n\n while (queue.length > 0) {\n const { node, depth } = queue.shift()!;\n if (visited.has(node)) continue;\n visited.add(node);\n\n if (depth < maxDepth) {\n const outRels = this.getRelationsFrom(node);\n for (const r of outRels) {\n if (!visited.has(r.to)) {\n queue.push({ node: r.to, depth: depth + 1 });\n }\n }\n const inRels = this.getRelationsTo(node);\n for (const r of inRels) {\n if (!visited.has(r.from)) {\n queue.push({ node: r.from, depth: depth + 1 });\n }\n }\n }\n }\n\n visited.delete(id);\n return Array.from(visited);\n }\n\n toJSON(): EvidenceRelation[] {\n return this.getAllRelations();\n }\n\n static fromJSON(relations: EvidenceRelation[]): EvidenceGraph {\n return new EvidenceGraph(relations);\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Observation } from '../core/types.js';\nimport { createObservation } from '../core/knowledge.js';\n\nexport interface ScannedFileInfo {\n path: string;\n relativePath: string;\n name: string;\n ext: string;\n size: number;\n mtimeMs?: number;\n isDirectory?: boolean;\n}\n\nexport interface WalkOptions {\n maxDepth?: number;\n maxFiles?: number;\n ignoredDirs?: Set<string> | string[];\n includeHidden?: boolean;\n readGitignore?: boolean;\n filter?: (entry: ScannedFileInfo) => boolean;\n}\n\nconst DEFAULT_IGNORED_DIRS = new Set([\n '.git',\n '.bilmem',\n 'node_modules',\n 'dist',\n 'build',\n 'target',\n 'vendor',\n '.cache',\n '.idea',\n '.vscode',\n 'coverage',\n '.next',\n '.nuxt',\n '.turbo',\n '.output',\n 'tmp',\n 'temp'\n]);\n\n/**\n * Normalizes relative path to use standard forward slashes.\n */\nfunction normalizeRelPath(rel: string): string {\n return rel.split(path.sep).join('/');\n}\n\n/**\n * Basic gitignore parser: extracts ignore patterns from .gitignore file.\n */\nasync function loadGitignorePatterns(rootDir: string): Promise<RegExp[]> {\n try {\n const gitignorePath = path.join(rootDir, '.gitignore');\n const content = await fs.readFile(gitignorePath, 'utf-8');\n const regexes: RegExp[] = [];\n\n for (const rawLine of content.split('\\n')) {\n const line = rawLine.trim();\n if (!line || line.startsWith('#')) continue;\n\n // Clean glob pattern\n let pattern = line.replace(/^\\//, '').replace(/\\/$/, '');\n if (!pattern) continue;\n\n // Escape special regex chars except * and ?\n pattern = pattern.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&');\n pattern = pattern.replace(/\\*\\*/g, '.*');\n pattern = pattern.replace(/\\*/g, '[^/]*');\n pattern = pattern.replace(/\\?/g, '[^/]');\n\n try {\n regexes.push(new RegExp(`(^|/)${pattern}($|/)`));\n } catch {\n // Skip invalid pattern\n }\n }\n return regexes;\n } catch {\n return [];\n }\n}\n\n/**\n * High-performance, depth-controlled recursive directory walker.\n * Respects default ignores, .gitignore patterns, symlink circularity, and file limits.\n */\nexport async function walkDirectory(\n dir: string,\n optionsOrRoot?: string | WalkOptions,\n legacyFileList?: ScannedFileInfo[]\n): Promise<ScannedFileInfo[]> {\n let root: string;\n let options: WalkOptions;\n\n if (typeof optionsOrRoot === 'string') {\n root = optionsOrRoot;\n options = {};\n } else {\n options = optionsOrRoot ?? {};\n root = dir;\n }\n\n const fileList: ScannedFileInfo[] = legacyFileList ?? [];\n const maxDepth = options.maxDepth ?? 15;\n const maxFiles = options.maxFiles ?? 25000;\n const includeHidden = options.includeHidden ?? false;\n\n const ignoredDirs = new Set(DEFAULT_IGNORED_DIRS);\n if (options.ignoredDirs) {\n for (const d of options.ignoredDirs) {\n ignoredDirs.add(d.toLowerCase());\n }\n }\n\n const gitignoreRules = options.readGitignore !== false\n ? await loadGitignorePatterns(root)\n : [];\n\n const visitedRealPaths = new Set<string>();\n\n async function walk(currentDir: string, currentDepth: number): Promise<void> {\n if (currentDepth > maxDepth || fileList.length >= maxFiles) {\n return;\n }\n\n try {\n const real = await fs.realpath(currentDir);\n if (visitedRealPaths.has(real)) {\n return; // Circular symlink prevention\n }\n visitedRealPaths.add(real);\n } catch {\n return;\n }\n\n let entries;\n try {\n entries = await fs.readdir(currentDir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (fileList.length >= maxFiles) break;\n\n const fullPath = path.join(currentDir, entry.name);\n const rawRelPath = path.relative(root, fullPath);\n const relPath = normalizeRelPath(rawRelPath);\n const lowerName = entry.name.toLowerCase();\n\n // Check gitignore rules\n if (gitignoreRules.some((rule) => rule.test(relPath))) {\n continue;\n }\n\n if (entry.isDirectory()) {\n if (ignoredDirs.has(lowerName)) continue;\n // Don't skip .github even if hidden is disabled\n if (!includeHidden && entry.name.startsWith('.') && lowerName !== '.github') {\n continue;\n }\n await walk(fullPath, currentDepth + 1);\n } else if (entry.isFile()) {\n if (!includeHidden && entry.name.startsWith('.') && lowerName !== '.env.example') {\n // Skip dotfiles unless explicitly requested\n continue;\n }\n\n const ext = path.extname(entry.name).toLowerCase();\n try {\n const stat = await fs.stat(fullPath);\n const fileInfo: ScannedFileInfo = {\n path: fullPath,\n relativePath: relPath,\n name: entry.name,\n ext,\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n isDirectory: false\n };\n\n if (!options.filter || options.filter(fileInfo)) {\n fileList.push(fileInfo);\n }\n } catch {\n // Ignore unreadable file\n }\n }\n }\n }\n\n await walk(dir, 0);\n return fileList;\n}\n\n// --- Extensible Project Context ---\n\n/**\n * Queryable project context providing cached text and JSON reads for detectors.\n */\nexport class ProjectContext {\n readonly rootDir: string;\n readonly files: ScannedFileInfo[];\n private relPathSet: Set<string>;\n private fileNameSet: Set<string>;\n private textCache = new Map<string, string | null>();\n private jsonCache = new Map<string, unknown | null>();\n\n constructor(files: ScannedFileInfo[], rootDir: string) {\n this.rootDir = rootDir;\n this.files = files;\n this.relPathSet = new Set(files.map((f) => f.relativePath.toLowerCase()));\n this.fileNameSet = new Set(files.map((f) => f.name.toLowerCase()));\n }\n\n hasFile(nameOrRelPath: string): boolean {\n const lower = normalizeRelPath(nameOrRelPath).toLowerCase();\n return this.fileNameSet.has(lower) || this.relPathSet.has(lower);\n }\n\n hasDirectory(dirNameOrRelPath: string): boolean {\n const prefix = normalizeRelPath(dirNameOrRelPath).toLowerCase().replace(/\\/$/, '') + '/';\n return Array.from(this.relPathSet).some((p) => p.startsWith(prefix));\n }\n\n findFiles(predicate: (file: ScannedFileInfo) => boolean): ScannedFileInfo[] {\n return this.files.filter(predicate);\n }\n\n async readText(relativePath: string, maxBytes: number = 64 * 1024): Promise<string | null> {\n const key = normalizeRelPath(relativePath).toLowerCase();\n if (this.textCache.has(key)) {\n return this.textCache.get(key)!;\n }\n\n const fullPath = path.resolve(this.rootDir, relativePath);\n try {\n const handle = await fs.open(fullPath, 'r');\n const buffer = Buffer.alloc(maxBytes);\n const { bytesRead } = await handle.read(buffer, 0, maxBytes, 0);\n await handle.close();\n const content = buffer.toString('utf-8', 0, bytesRead);\n this.textCache.set(key, content);\n return content;\n } catch {\n this.textCache.set(key, null);\n return null;\n }\n }\n\n async readJson<T = any>(relativePath: string): Promise<T | null> {\n const key = normalizeRelPath(relativePath).toLowerCase();\n if (this.jsonCache.has(key)) {\n return this.jsonCache.get(key) as T | null;\n }\n\n const text = await this.readText(relativePath);\n if (!text) {\n this.jsonCache.set(key, null);\n return null;\n }\n\n try {\n const parsed = JSON.parse(text) as T;\n this.jsonCache.set(key, parsed);\n return parsed;\n } catch {\n this.jsonCache.set(key, null);\n return null;\n }\n }\n}\n\n// --- Extensible Convention Detector Engine ---\n\nexport type DetectorCategory =\n | 'runtime'\n | 'language'\n | 'package-manager'\n | 'framework'\n | 'testing'\n | 'database'\n | 'tooling'\n | 'ci-cd'\n | 'monorepo'\n | 'documentation'\n | 'architecture';\n\nexport interface ConventionDetector {\n id: string;\n name: string;\n category: DetectorCategory;\n description?: string;\n detect(ctx: ProjectContext): Promise<Observation | Observation[] | null> | Observation | Observation[] | null;\n}\n\nexport class ConventionRegistry {\n private detectors = new Map<string, ConventionDetector>();\n\n register(detector: ConventionDetector): this {\n this.detectors.set(detector.id, detector);\n return this;\n }\n\n unregister(id: string): boolean {\n return this.detectors.delete(id);\n }\n\n get(id: string): ConventionDetector | undefined {\n return this.detectors.get(id);\n }\n\n list(): ConventionDetector[] {\n return Array.from(this.detectors.values());\n }\n\n async run(ctx: ProjectContext): Promise<Observation[]> {\n const observations: Observation[] = [];\n for (const detector of this.detectors.values()) {\n try {\n const result = await detector.detect(ctx);\n if (result) {\n if (Array.isArray(result)) {\n observations.push(...result);\n } else {\n observations.push(result);\n }\n }\n } catch {\n // Individual detector failures do not abort scanning\n }\n }\n return observations;\n }\n}\n\n// --- Built-in Pluggable Detectors ---\n\nexport const BUILTIN_DETECTORS: ConventionDetector[] = [\n // 1. Node.js & package.json\n {\n id: 'node-manifest',\n name: 'Node.js Manifest Detector',\n category: 'runtime',\n async detect(ctx) {\n if (!ctx.hasFile('package.json')) return null;\n\n const pkg = await ctx.readJson<{\n name?: string;\n version?: string;\n type?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n }>('package.json');\n\n const now = new Date().toISOString();\n const scripts = pkg?.scripts ? Object.keys(pkg.scripts) : [];\n const isEsm = pkg?.type === 'module';\n\n const scriptSummary = scripts.length > 0 ? ` with scripts: ${scripts.slice(0, 5).join(', ')}` : '';\n const moduleType = isEsm ? ' (ESM module)' : ' (CommonJS)';\n\n return createObservation({\n source: 'filesystem:package.json',\n claim: `Project utilizes Node.js ecosystem with package.json manifest${moduleType}${scriptSummary}`,\n provenance: { type: 'file', path: 'package.json', timestamp: now },\n confidence: 0.99,\n positive: ['node', 'npm', 'javascript', isEsm ? 'esm' : 'cjs', ...(pkg?.name ? [pkg.name.toLowerCase()] : [])],\n details: {\n ecosystem: 'node',\n name: pkg?.name,\n version: pkg?.version,\n type: pkg?.type,\n scripts\n }\n });\n }\n },\n\n // 2. Package Manager\n {\n id: 'package-manager',\n name: 'Package Manager Detector',\n category: 'package-manager',\n detect(ctx) {\n const now = new Date().toISOString();\n if (ctx.hasFile('pnpm-lock.yaml')) {\n return createObservation({\n source: 'filesystem:pnpm-lock.yaml',\n claim: 'Project utilizes pnpm as the package manager',\n provenance: { type: 'file', path: 'pnpm-lock.yaml', timestamp: now },\n confidence: 0.99,\n positive: ['pnpm', 'package-manager', 'node']\n });\n }\n if (ctx.hasFile('bun.lockb') || ctx.hasFile('bun.lock')) {\n return createObservation({\n source: 'filesystem:bun.lock',\n claim: 'Project utilizes Bun runtime and package manager',\n provenance: { type: 'file', path: 'bun.lock', timestamp: now },\n confidence: 0.99,\n positive: ['bun', 'package-manager']\n });\n }\n if (ctx.hasFile('yarn.lock')) {\n return createObservation({\n source: 'filesystem:yarn.lock',\n claim: 'Project utilizes Yarn package manager',\n provenance: { type: 'file', path: 'yarn.lock', timestamp: now },\n confidence: 0.99,\n positive: ['yarn', 'package-manager', 'node']\n });\n }\n if (ctx.hasFile('package-lock.json')) {\n return createObservation({\n source: 'filesystem:package-lock.json',\n claim: 'Project utilizes npm as package manager with package-lock.json',\n provenance: { type: 'file', path: 'package-lock.json', timestamp: now },\n confidence: 0.95,\n positive: ['npm', 'package-manager', 'node']\n });\n }\n return null;\n }\n },\n\n // 3. TypeScript Configuration\n {\n id: 'typescript-config',\n name: 'TypeScript Compiler Detector',\n category: 'language',\n async detect(ctx) {\n if (!ctx.hasFile('tsconfig.json')) return null;\n\n const tsconfig = await ctx.readJson<{\n compilerOptions?: {\n target?: string;\n module?: string;\n strict?: boolean;\n jsx?: string;\n };\n }>('tsconfig.json');\n\n const now = new Date().toISOString();\n const opts = tsconfig?.compilerOptions;\n const targetStr = opts?.target ? ` target ${opts.target}` : '';\n const strictStr = opts?.strict ? ' with strict mode' : '';\n\n return createObservation({\n source: 'filesystem:tsconfig.json',\n claim: `Project is configured for TypeScript compilation${targetStr}${strictStr}`,\n provenance: { type: 'file', path: 'tsconfig.json', timestamp: now },\n confidence: 0.99,\n positive: ['typescript', 'ts', ...(opts?.target ? [opts.target.toLowerCase()] : [])],\n details: { language: 'typescript', target: opts?.target, strict: opts?.strict }\n });\n }\n },\n\n // 4. Rust & Cargo\n {\n id: 'rust-cargo',\n name: 'Rust & Cargo Detector',\n category: 'language',\n async detect(ctx) {\n if (!ctx.hasFile('cargo.toml')) return null;\n const now = new Date().toISOString();\n const cargoText = await ctx.readText('Cargo.toml');\n const isWorkspace = cargoText?.includes('[workspace]') ?? false;\n const claim = isWorkspace\n ? 'Project utilizes Rust with Cargo workspace configuration'\n : 'Project utilizes Rust and Cargo';\n\n return createObservation({\n source: 'filesystem:cargo.toml',\n claim,\n provenance: { type: 'file', path: 'Cargo.toml', timestamp: now },\n confidence: 0.99,\n positive: ['rust', 'cargo', ...(isWorkspace ? ['workspace'] : [])],\n details: { ecosystem: 'rust', isWorkspace }\n });\n }\n },\n\n // 5. Go Modules\n {\n id: 'go-module',\n name: 'Go Modules Detector',\n category: 'language',\n async detect(ctx) {\n if (!ctx.hasFile('go.mod')) return null;\n const now = new Date().toISOString();\n const goModText = await ctx.readText('go.mod');\n const modMatch = goModText?.match(/^module\\s+([^\\s]+)/m);\n const modName = modMatch ? ` (${modMatch[1]})` : '';\n\n return createObservation({\n source: 'filesystem:go.mod',\n claim: `Project utilizes Go modules${modName}`,\n provenance: { type: 'file', path: 'go.mod', timestamp: now },\n confidence: 0.99,\n positive: ['go', 'golang'],\n details: { ecosystem: 'go', module: modMatch ? modMatch[1] : undefined }\n });\n }\n },\n\n // 6. Python Environment\n {\n id: 'python-project',\n name: 'Python Environment Detector',\n category: 'language',\n detect(ctx) {\n const hasPyproject = ctx.hasFile('pyproject.toml');\n const hasReqs = ctx.hasFile('requirements.txt');\n const hasPipfile = ctx.hasFile('pipfile');\n const hasUvLock = ctx.hasFile('uv.lock');\n const hasPoetry = ctx.hasFile('poetry.lock');\n\n if (!hasPyproject && !hasReqs && !hasPipfile && !hasUvLock && !hasPoetry) {\n return null;\n }\n\n const now = new Date().toISOString();\n const tools: string[] = [];\n if (hasUvLock) tools.push('uv');\n if (hasPoetry) tools.push('poetry');\n if (hasPyproject) tools.push('pyproject.toml');\n if (hasReqs) tools.push('requirements.txt');\n\n return createObservation({\n source: 'filesystem:python',\n claim: `Project contains Python dependencies (${tools.join(', ')})`,\n provenance: {\n type: 'file',\n path: hasPyproject ? 'pyproject.toml' : hasReqs ? 'requirements.txt' : 'uv.lock',\n timestamp: now\n },\n confidence: 0.95,\n positive: ['python', 'py', ...tools],\n details: { ecosystem: 'python', tools }\n });\n }\n },\n\n // 7. Monorepo & Workspaces\n {\n id: 'monorepo',\n name: 'Monorepo Workspace Detector',\n category: 'monorepo',\n detect(ctx) {\n const hasTurbo = ctx.hasFile('turbo.json');\n const hasNx = ctx.hasFile('nx.json');\n const hasPnpmWs = ctx.hasFile('pnpm-workspace.yaml');\n const hasLerna = ctx.hasFile('lerna.json');\n\n if (!hasTurbo && !hasNx && !hasPnpmWs && !hasLerna) {\n return null;\n }\n\n const now = new Date().toISOString();\n const tools: string[] = [];\n if (hasTurbo) tools.push('turborepo');\n if (hasNx) tools.push('nx');\n if (hasPnpmWs) tools.push('pnpm-workspaces');\n if (hasLerna) tools.push('lerna');\n\n return createObservation({\n source: 'filesystem:monorepo',\n claim: `Project is structured as a monorepo workspace managed by ${tools.join(', ')}`,\n provenance: { type: 'file', path: hasTurbo ? 'turbo.json' : hasPnpmWs ? 'pnpm-workspace.yaml' : 'nx.json', timestamp: now },\n confidence: 0.95,\n positive: ['monorepo', 'workspace', ...tools]\n });\n }\n },\n\n // 8. Testing Suites\n {\n id: 'testing-suite',\n name: 'Testing Suite & Framework Detector',\n category: 'testing',\n detect(ctx) {\n const now = new Date().toISOString();\n const hasVitest = ctx.hasFile('vitest.config.ts') || ctx.hasFile('vitest.config.js') || ctx.hasFile('vitest.config.mts');\n const hasJest = ctx.hasFile('jest.config.js') || ctx.hasFile('jest.config.ts');\n const hasPlaywright = ctx.hasFile('playwright.config.ts') || ctx.hasFile('playwright.config.js');\n const hasPytest = ctx.hasFile('pytest.ini') || ctx.hasFile('conftest.py');\n\n const testFiles = ctx.findFiles(\n (f) =>\n f.relativePath.includes('test') ||\n f.relativePath.includes('spec') ||\n f.name.endsWith('.test.ts') ||\n f.name.endsWith('.spec.ts') ||\n f.name.endsWith('.test.js') ||\n f.name.endsWith('_test.go') ||\n f.name.startsWith('test_')\n );\n\n if (!hasVitest && !hasJest && !hasPlaywright && !hasPytest && testFiles.length === 0) {\n return null;\n }\n\n const frameworks: string[] = [];\n if (hasVitest) frameworks.push('Vitest');\n if (hasJest) frameworks.push('Jest');\n if (hasPlaywright) frameworks.push('Playwright');\n if (hasPytest) frameworks.push('Pytest');\n\n const fwStr = frameworks.length > 0 ? ` (${frameworks.join(', ')})` : '';\n\n return createObservation({\n source: 'filesystem:tests',\n claim: `Project includes automated test suite${fwStr} with ${testFiles.length} test files detected`,\n provenance: { type: 'file', path: 'test', timestamp: now },\n confidence: 0.95,\n positive: ['tests', 'testing', 'qa', ...frameworks.map((f) => f.toLowerCase())],\n details: { testFilesCount: testFiles.length, frameworks }\n });\n }\n },\n\n // 9. Database & ORM\n {\n id: 'database-orm',\n name: 'Database & Schema Detector',\n category: 'database',\n detect(ctx) {\n const now = new Date().toISOString();\n const hasPrisma = ctx.hasFile('schema.prisma') || ctx.hasDirectory('prisma');\n const hasDrizzle = ctx.hasFile('drizzle.config.ts') || ctx.hasFile('drizzle.config.js');\n const hasMigrations = ctx.hasDirectory('migrations') || ctx.hasDirectory('db/migrations');\n\n if (!hasPrisma && !hasDrizzle && !hasMigrations) {\n return null;\n }\n\n const tools: string[] = [];\n if (hasPrisma) tools.push('Prisma');\n if (hasDrizzle) tools.push('Drizzle');\n if (hasMigrations) tools.push('SQL Migrations');\n\n return createObservation({\n source: 'filesystem:database',\n claim: `Project includes database schema and migration tooling: ${tools.join(', ')}`,\n provenance: { type: 'file', path: hasPrisma ? 'prisma/schema.prisma' : 'migrations', timestamp: now },\n confidence: 0.92,\n positive: ['database', 'orm', 'migrations', ...tools.map((t) => t.toLowerCase())]\n });\n }\n },\n\n // 10. Container & DevOps\n {\n id: 'container-devops',\n name: 'Container & Docker Detector',\n category: 'tooling',\n detect(ctx) {\n const now = new Date().toISOString();\n const hasDockerfile = ctx.hasFile('dockerfile');\n const hasCompose = ctx.hasFile('docker-compose.yml') || ctx.hasFile('compose.yaml') || ctx.hasFile('docker-compose.yaml');\n\n if (!hasDockerfile && !hasCompose) return null;\n\n return createObservation({\n source: 'filesystem:docker',\n claim: 'Project includes Docker container configuration',\n provenance: { type: 'file', path: hasDockerfile ? 'Dockerfile' : 'docker-compose.yml', timestamp: now },\n confidence: 0.95,\n positive: ['docker', 'containers', 'devops']\n });\n }\n },\n\n // 11. CI/CD Workflows\n {\n id: 'ci-cd',\n name: 'CI/CD Workflow Detector',\n category: 'ci-cd',\n detect(ctx) {\n const now = new Date().toISOString();\n const ghWorkflows = ctx.findFiles((f) => f.relativePath.startsWith('.github/workflows/'));\n const hasGitlab = ctx.hasFile('.gitlab-ci.yml');\n\n if (ghWorkflows.length === 0 && !hasGitlab) return null;\n\n const claim = ghWorkflows.length > 0\n ? `Project configures GitHub Actions CI/CD workflows (${ghWorkflows.length} workflow files)`\n : 'Project configures GitLab CI pipeline';\n\n return createObservation({\n source: 'filesystem:ci',\n claim,\n provenance: { type: 'file', path: ghWorkflows.length > 0 ? '.github/workflows' : '.gitlab-ci.yml', timestamp: now },\n confidence: 0.95,\n positive: ['ci', 'github-actions', 'automation']\n });\n }\n },\n\n // 12. Documentation\n {\n id: 'documentation',\n name: 'Project Documentation Detector',\n category: 'documentation',\n detect(ctx) {\n const now = new Date().toISOString();\n const hasReadme = ctx.hasFile('readme.md');\n const hasDocs = ctx.hasDirectory('docs');\n const hasContributing = ctx.hasFile('contributing.md');\n\n if (!hasReadme && !hasDocs && !hasContributing) return null;\n\n return createObservation({\n source: 'filesystem:readme.md',\n claim: 'Root README.md is present for project documentation',\n provenance: { type: 'file', path: 'README.md', timestamp: now },\n confidence: 0.95,\n positive: ['documentation', 'readme']\n });\n }\n },\n\n // 13. Architecture & Code Layout\n {\n id: 'code-layout',\n name: 'Architecture & Layout Pattern Detector',\n category: 'architecture',\n detect(ctx) {\n const now = new Date().toISOString();\n const isCleanArch =\n (ctx.hasDirectory('src/domain') || ctx.hasDirectory('domain')) &&\n (ctx.hasDirectory('src/application') || ctx.hasDirectory('application'));\n\n if (isCleanArch) {\n return createObservation({\n source: 'filesystem:architecture',\n claim: 'Project follows Clean / Hexagonal Architecture layout (domain, application, infrastructure)',\n provenance: { type: 'file', path: 'src', timestamp: now },\n confidence: 0.88,\n positive: ['clean-architecture', 'domain-driven', 'hexagonal']\n });\n }\n\n const isFeatureSliced = ctx.hasDirectory('src/features') || ctx.hasDirectory('src/modules');\n if (isFeatureSliced) {\n return createObservation({\n source: 'filesystem:architecture',\n claim: 'Project follows Feature-sliced or modular directory architecture',\n provenance: { type: 'file', path: 'src', timestamp: now },\n confidence: 0.85,\n positive: ['feature-sliced', 'modular-architecture']\n });\n }\n\n return null;\n }\n }\n];\n\n// --- Default Global Registry ---\n\nexport const defaultRegistry = new ConventionRegistry();\nfor (const detector of BUILTIN_DETECTORS) {\n defaultRegistry.register(detector);\n}\n\n/**\n * Convenience helper to register a new convention detector globally.\n */\nexport function registerConventionDetector(detector: ConventionDetector): void {\n defaultRegistry.register(detector);\n}\n\n/**\n * Analyzes project structure using extensible convention detectors.\n */\nexport async function analyzeProjectStructure(\n files: ScannedFileInfo[],\n rootDir: string,\n registry: ConventionRegistry = defaultRegistry\n): Promise<Observation[]> {\n const ctx = new ProjectContext(files, rootDir);\n return registry.run(ctx);\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport YAML from 'yaml';\nimport type { Observation, EvidenceRelation } from '../core/types.js';\nimport { createObservation } from '../core/knowledge.js';\n\nexport interface MarkdownEvidenceResult {\n observations: Observation[];\n relations?: EvidenceRelation[];\n}\n\nexport interface MarkdownHeading {\n level: number;\n text: string;\n line: number;\n}\n\nexport interface MarkdownAlert {\n type: 'WARNING' | 'CAUTION' | 'IMPORTANT' | 'NOTE' | 'TIP';\n body: string;\n line: number;\n heading?: string;\n}\n\nexport interface MarkdownCodeBlock {\n language: string;\n code: string;\n startLine: number;\n endLine: number;\n heading?: string;\n}\n\nexport interface MarkdownTable {\n headers: string[];\n rows: string[][];\n line: number;\n heading?: string;\n}\n\nexport interface MarkdownTaskItem {\n completed: boolean;\n text: string;\n line: number;\n heading?: string;\n}\n\nexport interface MarkdownLink {\n text: string;\n target: string;\n line: number;\n}\n\nexport interface MarkdownSection {\n heading: MarkdownHeading;\n content: string;\n lines: string[];\n startLine: number;\n endLine: number;\n}\n\nexport interface MarkdownDocument {\n filePath: string;\n relativePath: string;\n baseName: string;\n raw: string;\n lines: string[];\n frontmatter: Record<string, unknown>;\n headings: MarkdownHeading[];\n sections: MarkdownSection[];\n alerts: MarkdownAlert[];\n codeBlocks: MarkdownCodeBlock[];\n tables: MarkdownTable[];\n taskItems: MarkdownTaskItem[];\n links: MarkdownLink[];\n prohibitions: { rule: string; line: number; heading?: string }[];\n}\n\nexport interface MarkdownExtractorResult {\n observations: Observation[];\n relations?: EvidenceRelation[];\n}\n\nexport interface MarkdownExtractor {\n id: string;\n name: string;\n description?: string;\n extract(doc: MarkdownDocument): MarkdownExtractorResult | Promise<MarkdownExtractorResult>;\n}\n\n// --- Markdown Parser to Structured Document Model ---\n\nexport function parseMarkdownDocument(\n content: string,\n filePath: string,\n relativePath: string\n): MarkdownDocument {\n const lines = content.split('\\n');\n const baseName = path.basename(relativePath, '.md').toLowerCase();\n let frontmatter: Record<string, unknown> = {};\n\n const headings: MarkdownHeading[] = [];\n const alerts: MarkdownAlert[] = [];\n const codeBlocks: MarkdownCodeBlock[] = [];\n const tables: MarkdownTable[] = [];\n const taskItems: MarkdownTaskItem[] = [];\n const links: MarkdownLink[] = [];\n const prohibitions: { rule: string; line: number; heading?: string }[] = [];\n\n let currentHeadingText = '';\n let inCodeBlock = false;\n let codeBlockLang = '';\n let codeBlockLines: string[] = [];\n let codeBlockStart = 0;\n\n let inTable = false;\n let tableHeaders: string[] = [];\n let tableRows: string[][] = [];\n let tableStartLine = 0;\n\n let inFrontmatter = false;\n let frontmatterLines: string[] = [];\n let bodyStartIndex = 0;\n\n // 1. Extract Frontmatter if present\n if (lines.length > 0 && lines[0].trim() === '---') {\n inFrontmatter = true;\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].trim() === '---') {\n inFrontmatter = false;\n bodyStartIndex = i + 1;\n try {\n const yamlText = frontmatterLines.join('\\n');\n const parsed = YAML.parse(yamlText);\n if (parsed && typeof parsed === 'object') {\n frontmatter = parsed as Record<string, unknown>;\n }\n } catch {\n // Ignore invalid frontmatter YAML\n }\n break;\n }\n frontmatterLines.push(lines[i]);\n }\n }\n\n // Helper to commit active table\n function commitTable() {\n if (inTable && tableHeaders.length > 0) {\n tables.push({\n headers: tableHeaders,\n rows: tableRows,\n line: tableStartLine,\n heading: currentHeadingText || undefined\n });\n inTable = false;\n tableHeaders = [];\n tableRows = [];\n }\n }\n\n // 2. Parse Document Body\n for (let i = bodyStartIndex; i < lines.length; i++) {\n const rawLine = lines[i];\n const line = rawLine.trim();\n\n // Code block fencing\n const codeMatch = line.match(/^```([a-zA-Z0-9_-]*)/);\n if (codeMatch) {\n if (!inCodeBlock) {\n commitTable();\n inCodeBlock = true;\n codeBlockLang = codeMatch[1] || '';\n codeBlockLines = [];\n codeBlockStart = i + 1;\n } else {\n inCodeBlock = false;\n codeBlocks.push({\n language: codeBlockLang,\n code: codeBlockLines.join('\\n'),\n startLine: codeBlockStart,\n endLine: i + 1,\n heading: currentHeadingText || undefined\n });\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeBlockLines.push(rawLine);\n continue;\n }\n\n // Table parsing\n if (line.startsWith('|') && line.endsWith('|')) {\n const cells = line\n .split('|')\n .slice(1, -1)\n .map((c) => c.trim());\n\n // Check if delimiter row (| --- | --- |)\n const isDelimiter = cells.every((c) => /^:?-+:?$/.test(c));\n\n if (!inTable) {\n commitTable();\n inTable = true;\n tableHeaders = cells;\n tableRows = [];\n tableStartLine = i + 1;\n } else if (!isDelimiter) {\n tableRows.push(cells);\n }\n continue;\n } else {\n commitTable();\n }\n\n // Headings (e.g. # Title, ## Section)\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n if (headingMatch) {\n const level = headingMatch[1].length;\n currentHeadingText = headingMatch[2].trim();\n headings.push({\n level,\n text: currentHeadingText,\n line: i + 1\n });\n continue;\n }\n\n // GitHub-style alerts: > [!WARNING], > [!CAUTION], > [!IMPORTANT], > [!NOTE], > [!TIP]\n const alertMatch = line.match(/^>\\s*\\[!(WARNING|CAUTION|IMPORTANT|NOTE|TIP)\\]/i);\n if (alertMatch) {\n const alertStartLine = i + 1;\n const alertType = alertMatch[1].toUpperCase() as MarkdownAlert['type'];\n const alertLines: string[] = [];\n let j = i + 1;\n while (j < lines.length && lines[j].trim().startsWith('>')) {\n alertLines.push(lines[j].trim().replace(/^>\\s*/, ''));\n j++;\n }\n i = j - 1;\n\n alerts.push({\n type: alertType,\n body: alertLines.join(' ').trim(),\n line: alertStartLine,\n heading: currentHeadingText || undefined\n });\n continue;\n }\n\n // Task Items: - [ ] Open or - [x] Completed\n const taskMatch = line.match(/^[-*]\\s*\\[([ xX])\\]\\s*(.+)$/);\n if (taskMatch) {\n const completed = taskMatch[1].toLowerCase() === 'x';\n const text = taskMatch[2].trim();\n taskItems.push({\n completed,\n text,\n line: i + 1,\n heading: currentHeadingText || undefined\n });\n continue;\n }\n\n // Markdown Links: [text](target)\n const linkRegex = /\\[([^\\]]+)\\]\\(([^)]+)\\)/g;\n let match: RegExpExecArray | null;\n while ((match = linkRegex.exec(line)) !== null) {\n const linkText = match[1].trim();\n const linkTarget = match[2].trim();\n if (!linkTarget.startsWith('#')) {\n links.push({\n text: linkText,\n target: linkTarget,\n line: i + 1\n });\n }\n }\n\n // Explicit Prohibitions & Constraints (\"Never\", \"Do not\", \"Must not\", \"Avoid\")\n const prohibMatch = line.match(/\\b(Never|Must not|Do not|Cannot|Avoid)\\s+([^.!?]+[.!?]?)/i);\n if (prohibMatch && !line.startsWith('>')) {\n prohibitions.push({\n rule: `${prohibMatch[1]} ${prohibMatch[2].trim()}`,\n line: i + 1,\n heading: currentHeadingText || undefined\n });\n }\n }\n\n commitTable();\n\n // 3. Build Hierarchical Sections\n const sections: MarkdownSection[] = [];\n for (let idx = 0; idx < headings.length; idx++) {\n const h = headings[idx];\n const nextH = headings[idx + 1];\n const startLine = h.line;\n const endLine = nextH ? nextH.line - 1 : lines.length;\n const secLines = lines.slice(startLine - 1, endLine);\n\n sections.push({\n heading: h,\n content: secLines.join('\\n').trim(),\n lines: secLines,\n startLine,\n endLine\n });\n }\n\n return {\n filePath,\n relativePath,\n baseName,\n raw: content,\n lines,\n frontmatter,\n headings,\n sections,\n alerts,\n codeBlocks,\n tables,\n taskItems,\n links,\n prohibitions\n };\n}\n\n// --- Built-in Markdown Extractors ---\n\nexport const BUILTIN_MARKDOWN_EXTRACTORS: MarkdownExtractor[] = [\n // 1. Frontmatter Extractor\n {\n id: 'frontmatter',\n name: 'YAML Frontmatter Extractor',\n extract(doc) {\n const observations: Observation[] = [];\n const now = new Date().toISOString();\n const fm = doc.frontmatter;\n\n for (const [key, val] of Object.entries(fm)) {\n if (!val || typeof val === 'object' && !Array.isArray(val)) continue;\n const valStr = Array.isArray(val) ? val.join(', ') : String(val);\n const lowerKey = key.toLowerCase();\n\n observations.push(\n createObservation({\n source: `doc:${doc.relativePath}:frontmatter:${lowerKey}`,\n claim: `Document metadata (${lowerKey}): ${valStr}`,\n provenance: { type: 'doc', path: doc.relativePath, line: 1, timestamp: now },\n confidence: 0.92,\n positive: [doc.baseName, lowerKey, ...(Array.isArray(val) ? val.map(String) : [])],\n details: { frontmatterKey: lowerKey, value: val }\n })\n );\n }\n return { observations };\n }\n },\n\n // 2. GitHub Alerts Extractor (> [!WARNING], etc.)\n {\n id: 'github-alerts',\n name: 'GitHub Callouts & Alerts Extractor',\n extract(doc) {\n const observations: Observation[] = [];\n const now = new Date().toISOString();\n\n for (const alert of doc.alerts) {\n if (!alert.body) continue;\n const isCritical = alert.type === 'WARNING' || alert.type === 'CAUTION';\n observations.push(\n createObservation({\n source: `doc:${doc.relativePath}#L${alert.line}`,\n claim: `[${alert.type}] ${alert.body}`,\n provenance: { type: 'doc', path: doc.relativePath, line: alert.line, timestamp: now },\n confidence: isCritical ? 0.96 : 0.88,\n positive: [doc.baseName, alert.type.toLowerCase(), ...(alert.heading ? [alert.heading.toLowerCase()] : [])],\n details: { alertType: alert.type, heading: alert.heading, line: alert.line }\n })\n );\n }\n return { observations };\n }\n },\n\n // 3. ADR & Architectural Decisions Extractor\n {\n id: 'adr-decisions',\n name: 'Architecture Decision Record (ADR/MADR) Extractor',\n extract(doc) {\n const observations: Observation[] = [];\n const now = new Date().toISOString();\n\n let hasContext = false;\n let decision = '';\n let status = '';\n let adrLine = 1;\n\n for (const sec of doc.sections) {\n const lowerHead = sec.heading.text.toLowerCase();\n if (lowerHead.includes('context')) {\n hasContext = true;\n }\n\n if (lowerHead.includes('decision') && !lowerHead.includes('options')) {\n for (const line of sec.lines) {\n const clean = line.replace(/^#{1,6}\\s+/, '').trim();\n if (clean && clean.length > 5 && !clean.toLowerCase().includes('decision')) {\n decision = clean;\n adrLine = sec.heading.line;\n break;\n }\n }\n }\n\n if (lowerHead.includes('status')) {\n for (const line of sec.lines) {\n const clean = line.replace(/^#{1,6}\\s+/, '').trim();\n if (clean && clean.length > 2 && !clean.toLowerCase().includes('status')) {\n status = clean;\n break;\n }\n }\n }\n }\n\n if (hasContext && decision) {\n observations.push(\n createObservation({\n source: `doc:${doc.relativePath}:adr#L${adrLine}`,\n claim: `Architectural Decision in ${doc.relativePath}: ${decision}`,\n provenance: { type: 'doc', path: doc.relativePath, line: adrLine, timestamp: now },\n confidence: 0.95,\n positive: ['adr', 'architecture', 'decision', doc.baseName],\n details: { status: status || 'Accepted', decision }\n })\n );\n }\n\n return { observations };\n }\n },\n\n // 4. Task Lists Extractor (- [ ] and - [x])\n {\n id: 'task-items',\n name: 'Task Items & TODOs Extractor',\n extract(doc) {\n const observations: Observation[] = [];\n const now = new Date().toISOString();\n\n for (const item of doc.taskItems) {\n const tag = item.completed ? 'DONE' : 'TODO';\n observations.push(\n createObservation({\n source: `doc:${doc.relativePath}#L${item.line}:todo`,\n claim: `[${tag}] ${item.text}`,\n provenance: { type: 'doc', path: doc.relativePath, line: item.line, timestamp: now },\n confidence: item.completed ? 0.70 : 0.82,\n positive: ['todo', doc.baseName, ...(item.heading ? [item.heading.toLowerCase()] : [])],\n details: { completed: item.completed, heading: item.heading, line: item.line }\n })\n );\n }\n return { observations };\n }\n },\n\n // 5. Code Block Commands & Configurations\n {\n id: 'code-blocks',\n name: 'Code Block Commands Extractor',\n extract(doc) {\n const observations: Observation[] = [];\n const now = new Date().toISOString();\n\n for (const cb of doc.codeBlocks) {\n const lang = cb.language.toLowerCase();\n if (lang === 'bash' || lang === 'sh' || lang === 'shell' || lang === 'zsh') {\n const lines = cb.code.split('\\n').map((l) => l.trim()).filter((l) => l && !l.startsWith('#'));\n for (const line of lines.slice(0, 3)) {\n if (/^(npm|pnpm|yarn|bun|cargo|go|docker|make|npx)\\b/.test(line)) {\n observations.push(\n createObservation({\n source: `doc:${doc.relativePath}#L${cb.startLine}:cli`,\n claim: `Documented CLI command in ${doc.baseName}: ${line}`,\n provenance: { type: 'doc', path: doc.relativePath, line: cb.startLine, timestamp: now },\n confidence: 0.88,\n positive: ['command', 'cli', doc.baseName],\n details: { command: line, language: lang }\n })\n );\n }\n }\n }\n }\n return { observations };\n }\n },\n\n // 6. Markdown Tables (Configurations & Environment Variables)\n {\n id: 'markdown-tables',\n name: 'Markdown Table Key-Value Extractor',\n extract(doc) {\n const observations: Observation[] = [];\n const now = new Date().toISOString();\n\n for (const table of doc.tables) {\n if (table.headers.length < 2 || table.rows.length === 0) continue;\n const lowerHeaders = table.headers.map((h) => h.toLowerCase());\n\n // Check if table contains key-value configurations, env vars, options, or flags\n const isConfigTable = lowerHeaders.some(\n (h) =>\n h.includes('variable') ||\n h.includes('env') ||\n h.includes('setting') ||\n h.includes('option') ||\n h.includes('command') ||\n h.includes('param') ||\n h.includes('flag') ||\n h.includes('property') ||\n h.includes('key') ||\n h.includes('config')\n );\n\n if (isConfigTable) {\n for (const row of table.rows.slice(0, 10)) {\n const key = row[0];\n const val = row[1];\n const desc = row[2] ? ` (${row[2]})` : '';\n if (key && val) {\n observations.push(\n createObservation({\n source: `doc:${doc.relativePath}#L${table.line}:table:${key}`,\n claim: `Configuration in ${doc.baseName}: ${key} = ${val}${desc}`,\n provenance: { type: 'doc', path: doc.relativePath, line: table.line, timestamp: now },\n confidence: 0.88,\n positive: ['config', key.toLowerCase(), doc.baseName],\n details: { key, value: val, heading: table.heading }\n })\n );\n }\n }\n }\n }\n return { observations };\n }\n },\n\n // 7. Normative Rules & Prohibitions (\"Never\", \"Do not\", \"Must not\")\n {\n id: 'rules-and-prohibitions',\n name: 'Normative Rules & Prohibitions Extractor',\n extract(doc) {\n const observations: Observation[] = [];\n const now = new Date().toISOString();\n\n for (const p of doc.prohibitions) {\n observations.push(\n createObservation({\n source: `doc:${doc.relativePath}#L${p.line}:rule`,\n claim: `[RULE] in ${doc.baseName}: ${p.rule}`,\n provenance: { type: 'doc', path: doc.relativePath, line: p.line, timestamp: now },\n confidence: 0.90,\n positive: ['rule', 'constraint', doc.baseName],\n details: { rule: p.rule, heading: p.heading, line: p.line }\n })\n );\n }\n return { observations };\n }\n },\n\n // 8. Cross-Reference File Links\n {\n id: 'file-links',\n name: 'Cross-Reference File Links Extractor',\n extract(doc) {\n const relations: EvidenceRelation[] = [];\n\n for (const link of doc.links) {\n const target = link.target;\n // Check relative file links (ignore web urls and anchors)\n if (\n !target.startsWith('http://') &&\n !target.startsWith('https://') &&\n !target.startsWith('mailto:') &&\n (target.startsWith('.') || target.includes('/') || /\\.(md|ts|js|json|ya?ml|toml|rs|go|py)$/i.test(target))\n ) {\n const rawTarget = target.split('#')[0].split('?')[0].trim();\n if (rawTarget) {\n const dir = path.dirname(doc.relativePath);\n const resolved =\n dir === '.' || path.isAbsolute(rawTarget)\n ? rawTarget.replace(/^\\.\\//, '')\n : path.normalize(path.join(dir, rawTarget));\n relations.push({\n from: doc.relativePath,\n to: resolved,\n type: 'DOCUMENTS'\n });\n }\n }\n }\n return { observations: [], relations };\n }\n }\n];\n\n// --- Pluggable Markdown Registry ---\n\nexport class MarkdownRegistry {\n private extractors = new Map<string, MarkdownExtractor>();\n\n register(extractor: MarkdownExtractor): this {\n this.extractors.set(extractor.id, extractor);\n return this;\n }\n\n unregister(id: string): boolean {\n return this.extractors.delete(id);\n }\n\n get(id: string): MarkdownExtractor | undefined {\n return this.extractors.get(id);\n }\n\n list(): MarkdownExtractor[] {\n return Array.from(this.extractors.values());\n }\n\n async run(doc: MarkdownDocument): Promise<MarkdownEvidenceResult> {\n const observations: Observation[] = [];\n const relations: EvidenceRelation[] = [];\n\n for (const extractor of this.extractors.values()) {\n try {\n const result = await extractor.extract(doc);\n if (result.observations && result.observations.length > 0) {\n observations.push(...result.observations);\n }\n if (result.relations && result.relations.length > 0) {\n relations.push(...result.relations);\n }\n } catch {\n // Individual extractor failure does not abort scan\n }\n }\n\n return { observations, relations };\n }\n}\n\nexport const defaultMarkdownRegistry = new MarkdownRegistry();\nfor (const ext of BUILTIN_MARKDOWN_EXTRACTORS) {\n defaultMarkdownRegistry.register(ext);\n}\n\n/**\n * Convenience helper to register a new Markdown extractor globally.\n */\nexport function registerMarkdownExtractor(extractor: MarkdownExtractor): void {\n defaultMarkdownRegistry.register(extractor);\n}\n\n/**\n * Parses markdown files into structured evidence without dumping entire documents.\n * Extracts: Frontmatter, ADRs, GitHub alerts, code blocks, tables, task lists, and cross-references.\n */\nexport async function parseMarkdownFile(\n filePath: string,\n relativePath: string,\n registry: MarkdownRegistry = defaultMarkdownRegistry\n): Promise<MarkdownEvidenceResult> {\n let content = '';\n try {\n content = await fs.readFile(filePath, 'utf-8');\n } catch {\n return { observations: [], relations: [] };\n }\n\n const doc = parseMarkdownDocument(content, filePath, relativePath);\n return registry.run(doc);\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport type { Observation, EvidenceRelation } from '../core/types.js';\nimport { createObservation } from '../core/knowledge.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface GitCommit {\n hash: string;\n author: string;\n date: string;\n subject: string;\n files: string[];\n isMerge: boolean;\n}\n\nexport interface GitScanResult {\n isGitRepo: boolean;\n headCommit?: string;\n commitsScanned: number;\n observations: Observation[];\n relations: EvidenceRelation[];\n}\n\nasync function runGit(args: string[], cwd: string): Promise<string> {\n const { stdout } = await execFileAsync('git', args, {\n cwd,\n maxBuffer: 10 * 1024 * 1024\n });\n return stdout.trim();\n}\n\n/**\n * Checks if directory is inside a valid git repository.\n */\nexport async function isGitRepository(cwd: string): Promise<boolean> {\n try {\n const res = await runGit(['rev-parse', '--is-inside-work-tree'], cwd);\n return res === 'true';\n } catch {\n return false;\n }\n}\n\n/**\n * Inspects Git history for lessons, reverts, hotfixes, and co-changing file relationships.\n * Supports incremental scanning via lastScanCommit.\n */\nexport async function scanGitHistory(\n cwd: string,\n options: { lastScanCommit?: string; maxCommits?: number } = {}\n): Promise<GitScanResult> {\n const isRepo = await isGitRepository(cwd);\n if (!isRepo) {\n return {\n isGitRepo: false,\n commitsScanned: 0,\n observations: [],\n relations: []\n };\n }\n\n let headCommit = '';\n try {\n headCommit = await runGit(['rev-parse', 'HEAD'], cwd);\n } catch {\n // Empty repo with no commits yet\n return {\n isGitRepo: true,\n commitsScanned: 0,\n observations: [],\n relations: []\n };\n }\n\n // Determine git range\n let revisionRange: string[] = [];\n if (options.lastScanCommit && options.lastScanCommit !== headCommit) {\n try {\n // Verify lastScanCommit exists in history\n await runGit(['cat-file', '-e', `${options.lastScanCommit}^{commit}`], cwd);\n revisionRange = [`${options.lastScanCommit}..HEAD`];\n } catch {\n // Commit no longer reachable (e.g. rebased/force-pushed), fallback to recent HEAD\n revisionRange = ['-n', String(options.maxCommits ?? 100), 'HEAD'];\n }\n } else {\n revisionRange = ['-n', String(options.maxCommits ?? 100), 'HEAD'];\n }\n\n const logArgs = [\n 'log',\n ...revisionRange,\n '--name-only',\n '--pretty=format:COMMIT:%H|%an|%aI|%s'\n ];\n\n let rawLog = '';\n try {\n rawLog = await runGit(logArgs, cwd);\n } catch {\n return {\n isGitRepo: true,\n headCommit,\n commitsScanned: 0,\n observations: [],\n relations: []\n };\n }\n\n const commits: GitCommit[] = [];\n const lines = rawLog.split('\\n');\n let currentCommit: GitCommit | null = null;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n if (trimmed.startsWith('COMMIT:')) {\n if (currentCommit) commits.push(currentCommit);\n\n const parts = trimmed.substring('COMMIT:'.length).split('|');\n currentCommit = {\n hash: parts[0] || '',\n author: parts[1] || '',\n date: parts[2] || '',\n subject: parts.slice(3).join('|'),\n files: [],\n isMerge: false\n };\n } else if (currentCommit) {\n currentCommit.files.push(trimmed);\n }\n }\n if (currentCommit) commits.push(currentCommit);\n\n const observations: Observation[] = [];\n const relations: EvidenceRelation[] = [];\n const coChangeMap = new Map<string, number>();\n const fileFixCount = new Map<string, number>();\n\n // 1. Analyze commits\n for (const commit of commits) {\n // Avoid treating huge merge commits (> 15 files) as strong co-change evidence\n if (commit.files.length > 15) {\n commit.isMerge = true;\n continue;\n }\n\n const lowerSubject = commit.subject.toLowerCase();\n const isRevert = lowerSubject.startsWith('revert') || lowerSubject.includes('reverting');\n const isFix =\n lowerSubject.startsWith('fix') ||\n lowerSubject.startsWith('hotfix') ||\n lowerSubject.startsWith('bugfix') ||\n lowerSubject.includes('fix:');\n\n // Pattern 1: Change -> Revert\n if (isRevert && commit.files.length > 0) {\n observations.push(\n createObservation({\n source: `git:${commit.hash}`,\n claim: `Revert recorded in git: \"${commit.subject}\" affecting [${commit.files.slice(0, 5).join(', ')}]`,\n provenance: {\n type: 'git',\n commit: commit.hash,\n author: commit.author,\n timestamp: commit.date\n },\n confidence: 0.95,\n positive: ['revert', ...commit.files.map((f) => f.split('/').pop()?.toLowerCase() || f)],\n negative: ['fragile-change'],\n details: { commit: commit.hash, files: commit.files }\n })\n );\n }\n\n // Pattern 2: Bugfix -> Test Added\n if (isFix && commit.files.length > 1) {\n const testFiles = commit.files.filter((f) => f.includes('test') || f.includes('spec'));\n const srcFiles = commit.files.filter((f) => !f.includes('test') && !f.includes('spec'));\n\n if (testFiles.length > 0 && srcFiles.length > 0) {\n observations.push(\n createObservation({\n source: `git:${commit.hash}:bugfix-test`,\n claim: `Bugfix \"${commit.subject}\" included test verification in ${testFiles.join(', ')}`,\n provenance: {\n type: 'git',\n commit: commit.hash,\n author: commit.author,\n timestamp: commit.date\n },\n confidence: 0.92,\n positive: ['bugfix', 'test-added', ...srcFiles.map((f) => f.split('/').pop()?.toLowerCase() || f)],\n details: { srcFiles, testFiles }\n })\n );\n }\n }\n\n // Count fix occurrences per file for hotspot detection\n if (isFix) {\n for (const file of commit.files) {\n fileFixCount.set(file, (fileFixCount.get(file) ?? 0) + 1);\n }\n }\n\n // Track co-changes for pairs\n if (commit.files.length >= 2 && commit.files.length <= 8) {\n for (let i = 0; i < commit.files.length; i++) {\n for (let j = i + 1; j < commit.files.length; j++) {\n const a = commit.files[i];\n const b = commit.files[j];\n const key = a < b ? `${a} <-> ${b}` : `${b} <-> ${a}`;\n coChangeMap.set(key, (coChangeMap.get(key) ?? 0) + 1);\n }\n }\n }\n }\n\n // Pattern 3: Repeated Fixes Hotspot\n for (const [file, count] of fileFixCount.entries()) {\n if (count >= 3) {\n observations.push(\n createObservation({\n source: `git:hotspot:${file}`,\n claim: `Fragile hotspot: \"${file}\" required ${count} fixes in recent history`,\n provenance: { type: 'git', path: file, timestamp: new Date().toISOString() },\n confidence: 0.88,\n positive: ['hotspot', 'fragile', file.split('/').pop()?.toLowerCase() || file],\n details: { fixCount: count }\n })\n );\n }\n }\n\n // Co-change edges with weight >= 2\n for (const [key, count] of coChangeMap.entries()) {\n if (count >= 2) {\n const [from, to] = key.split(' <-> ');\n relations.push({\n from,\n to,\n type: 'CO_CHANGED',\n weight: count\n });\n relations.push({\n from: to,\n to: from,\n type: 'CO_CHANGED',\n weight: count\n });\n }\n }\n\n return {\n isGitRepo: true,\n headCommit,\n commitsScanned: commits.length,\n observations,\n relations\n };\n}\n","import * as fs from 'node:fs/promises';\nimport * as fsSync from 'node:fs';\nimport * as path from 'node:path';\nimport { createRequire } from 'node:module';\nimport Parser from 'web-tree-sitter';\nimport type { Observation, EvidenceRelation } from '../core/types.js';\nimport { createObservation } from '../core/knowledge.js';\n\nexport interface SourceScanResult {\n observations: Observation[];\n relations: EvidenceRelation[];\n}\n\nconst SOURCE_EXTENSIONS = new Set([\n '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',\n '.py', '.go', '.rs', '.java', '.c', '.cpp',\n '.h', '.hpp', '.rb', '.php', '.cs', '.swift',\n '.kt', '.scala', '.sh', '.bash', '.zsh', '.sql'\n]);\n\nexport function isSourceFile(ext: string): boolean {\n return SOURCE_EXTENSIONS.has(ext.toLowerCase());\n}\n\nconst EXT_TO_WASM: Record<string, string> = {\n '.ts': 'tree-sitter-typescript.wasm',\n '.mts': 'tree-sitter-typescript.wasm',\n '.cts': 'tree-sitter-typescript.wasm',\n '.tsx': 'tree-sitter-tsx.wasm',\n '.js': 'tree-sitter-javascript.wasm',\n '.mjs': 'tree-sitter-javascript.wasm',\n '.cjs': 'tree-sitter-javascript.wasm',\n '.jsx': 'tree-sitter-javascript.wasm',\n '.py': 'tree-sitter-python.wasm',\n '.go': 'tree-sitter-go.wasm',\n '.rs': 'tree-sitter-rust.wasm'\n};\n\n// Tree-sitter WASM Directory Resolution & Parser Cache\nlet wasmBaseDir: string | null = null;\nlet parserInitialized = false;\nlet parserInstance: Parser | null = null;\nconst languageCache = new Map<string, Parser.Language>();\n\nfunction getWasmDir(): string | null {\n if (wasmBaseDir) return wasmBaseDir;\n try {\n const req = createRequire(import.meta.url);\n const pkgJson = req.resolve('tree-sitter-wasms/package.json');\n const outDir = path.join(path.dirname(pkgJson), 'out');\n if (fsSync.existsSync(outDir)) {\n wasmBaseDir = outDir;\n return wasmBaseDir;\n }\n } catch {\n // Fallback to relative candidate paths\n }\n\n const candidateDirs = [\n path.resolve(process.cwd(), 'node_modules/tree-sitter-wasms/out'),\n path.resolve(process.cwd(), '../node_modules/tree-sitter-wasms/out')\n ];\n\n for (const dir of candidateDirs) {\n if (fsSync.existsSync(dir)) {\n wasmBaseDir = dir;\n return wasmBaseDir;\n }\n }\n\n return null;\n}\n\nasync function getParserForWasm(wasmName: string): Promise<Parser | null> {\n const wasmDir = getWasmDir();\n if (!wasmDir) return null;\n\n const wasmPath = path.join(wasmDir, wasmName);\n if (!fsSync.existsSync(wasmPath)) return null;\n\n try {\n if (!parserInitialized) {\n await Parser.init();\n parserInitialized = true;\n }\n\n if (!parserInstance) {\n parserInstance = new Parser();\n }\n\n let lang = languageCache.get(wasmName);\n if (!lang) {\n lang = await Parser.Language.load(wasmPath);\n languageCache.set(wasmName, lang);\n }\n\n parserInstance.setLanguage(lang);\n return parserInstance;\n } catch {\n return null;\n }\n}\n\nfunction cleanQuote(str: string): string {\n return str.replace(/^['\"`]|['\"`]$/g, '').trim();\n}\n\nfunction getEnclosingScope(node: Parser.SyntaxNode): string | undefined {\n let curr = node.parent;\n const parts: string[] = [];\n while (curr) {\n if (\n curr.type === 'class_declaration' ||\n curr.type === 'class_definition' ||\n curr.type === 'function_declaration' ||\n curr.type === 'function_definition' ||\n curr.type === 'method_definition' ||\n curr.type === 'interface_declaration' ||\n curr.type === 'struct_item' ||\n curr.type === 'impl_item'\n ) {\n const name = curr.childForFieldName('name')?.text;\n if (name) parts.unshift(name);\n }\n curr = curr.parent;\n }\n return parts.length > 0 ? parts.join('.') : undefined;\n}\n\nfunction extractCommentObservation(\n node: Parser.SyntaxNode,\n relativePath: string,\n baseName: string,\n now: string\n): Observation | null {\n const text = node.text;\n const match = text.match(/\\b(TODO|FIXME|HACK|DEPRECATED|WARN|NOTE|BUG)\\b:?\\s*(.*)$/i);\n if (!match) return null;\n\n const tag = match[1].toUpperCase();\n const commentText = match[2].trim() || 'Unspecified';\n const scope = getEnclosingScope(node);\n const line = node.startPosition.row + 1;\n const scopePrefix = scope ? ` in ${scope}` : '';\n\n const positive = [tag.toLowerCase(), baseName.toLowerCase()];\n if (scope) {\n for (const part of scope.split('.')) {\n if (part) positive.push(part.toLowerCase());\n }\n }\n\n const confidence = tag === 'DEPRECATED' || tag === 'FIXME' || tag === 'BUG' ? 0.90 : 0.80;\n\n return createObservation({\n source: `code:${relativePath}#L${line}`,\n claim: `[${tag}${scopePrefix}] in ${baseName}: ${commentText}`,\n provenance: { type: 'code', path: relativePath, line, timestamp: now },\n confidence,\n positive,\n details: { tag, text: commentText, scope, line }\n });\n}\n\n// --- AST Extractors ---\n\nfunction extractFromTsJs(\n root: Parser.SyntaxNode,\n relativePath: string,\n baseName: string,\n now: string,\n observations: Observation[],\n relations: EvidenceRelation[]\n) {\n function walk(node: Parser.SyntaxNode) {\n // 1. Imports\n if (node.type === 'import_statement') {\n const source = node.childForFieldName('source');\n if (source) {\n const target = cleanQuote(source.text);\n relations.push({ from: relativePath, to: target, type: 'IMPORTS' });\n }\n }\n\n // 2. Call expression (require / dynamic import)\n if (node.type === 'call_expression') {\n const fn = node.childForFieldName('function');\n if (fn && (fn.text === 'require' || fn.text === 'import')) {\n const args = node.childForFieldName('arguments');\n if (args && args.namedChildCount > 0) {\n const firstArg = args.namedChild(0);\n if (firstArg && (firstArg.type === 'string' || firstArg.type === 'template_string')) {\n const target = cleanQuote(firstArg.text);\n if (target) {\n relations.push({ from: relativePath, to: target, type: 'IMPORTS' });\n }\n }\n }\n }\n }\n\n // 3. Export statements (definitions & re-exports)\n if (node.type === 'export_statement') {\n const source = node.childForFieldName('source');\n if (source) {\n const target = cleanQuote(source.text);\n relations.push({ from: relativePath, to: target, type: 'IMPORTS' });\n }\n\n for (let i = 0; i < node.namedChildCount; i++) {\n const child = node.namedChild(i);\n if (!child) continue;\n\n if (\n child.type === 'function_declaration' ||\n child.type === 'class_declaration' ||\n child.type === 'interface_declaration' ||\n child.type === 'type_alias_declaration' ||\n child.type === 'enum_declaration'\n ) {\n const name = child.childForFieldName('name')?.text;\n const kind = child.type.replace('_declaration', '');\n const line = child.startPosition.row + 1;\n if (name) {\n observations.push(\n createObservation({\n source: `code:${relativePath}#L${line}`,\n claim: `[export ${kind}] ${name} in ${baseName}`,\n provenance: { type: 'code', path: relativePath, line, timestamp: now },\n confidence: 0.85,\n positive: [name.toLowerCase(), kind, baseName.toLowerCase()],\n details: { kind, name, exported: true, line }\n })\n );\n relations.push({\n from: relativePath,\n to: `${relativePath}#${name}`,\n type: 'DEFINES'\n });\n }\n } else if (child.type === 'lexical_declaration') {\n for (let j = 0; j < child.namedChildCount; j++) {\n const decl = child.namedChild(j);\n if (decl && decl.type === 'variable_declarator') {\n const name = decl.childForFieldName('name')?.text;\n const line = decl.startPosition.row + 1;\n if (name) {\n observations.push(\n createObservation({\n source: `code:${relativePath}#L${line}`,\n claim: `[export const] ${name} in ${baseName}`,\n provenance: { type: 'code', path: relativePath, line, timestamp: now },\n confidence: 0.80,\n positive: [name.toLowerCase(), 'const', baseName.toLowerCase()],\n details: { kind: 'const', name, exported: true, line }\n })\n );\n relations.push({\n from: relativePath,\n to: `${relativePath}#${name}`,\n type: 'DEFINES'\n });\n }\n }\n }\n }\n }\n }\n\n // 4. Actionable Comments\n if (node.type === 'comment') {\n const obs = extractCommentObservation(node, relativePath, baseName, now);\n if (obs) observations.push(obs);\n }\n\n // Traverse children\n for (let i = 0; i < node.childCount; i++) {\n const ch = node.child(i);\n if (ch) walk(ch);\n }\n }\n\n walk(root);\n}\n\nfunction extractFromPython(\n root: Parser.SyntaxNode,\n relativePath: string,\n baseName: string,\n now: string,\n observations: Observation[],\n relations: EvidenceRelation[]\n) {\n function walk(node: Parser.SyntaxNode) {\n if (node.type === 'import_statement') {\n for (let i = 0; i < node.namedChildCount; i++) {\n const child = node.namedChild(i);\n if (child && (child.type === 'dotted_name' || child.type === 'aliased_import')) {\n const target = child.type === 'aliased_import' ? child.childForFieldName('name')?.text : child.text;\n if (target) {\n relations.push({ from: relativePath, to: target, type: 'IMPORTS' });\n }\n }\n }\n }\n\n if (node.type === 'import_from_statement') {\n const moduleName = node.childForFieldName('module_name')?.text;\n if (moduleName) {\n relations.push({ from: relativePath, to: moduleName, type: 'IMPORTS' });\n }\n }\n\n if (node.type === 'class_definition' || node.type === 'function_definition') {\n const name = node.childForFieldName('name')?.text;\n const kind = node.type === 'class_definition' ? 'class' : 'def';\n const line = node.startPosition.row + 1;\n if (name && (node.parent?.type === 'module' || node.type === 'class_definition')) {\n observations.push(\n createObservation({\n source: `code:${relativePath}#L${line}`,\n claim: `[${kind}] ${name} in ${baseName}`,\n provenance: { type: 'code', path: relativePath, line, timestamp: now },\n confidence: 0.85,\n positive: [name.toLowerCase(), kind, baseName.toLowerCase()],\n details: { kind, name, line }\n })\n );\n relations.push({\n from: relativePath,\n to: `${relativePath}#${name}`,\n type: 'DEFINES'\n });\n }\n }\n\n if (node.type === 'comment') {\n const obs = extractCommentObservation(node, relativePath, baseName, now);\n if (obs) observations.push(obs);\n }\n\n for (let i = 0; i < node.childCount; i++) {\n const ch = node.child(i);\n if (ch) walk(ch);\n }\n }\n\n walk(root);\n}\n\nfunction extractFromGo(\n root: Parser.SyntaxNode,\n relativePath: string,\n baseName: string,\n now: string,\n observations: Observation[],\n relations: EvidenceRelation[]\n) {\n function walk(node: Parser.SyntaxNode) {\n if (node.type === 'import_spec') {\n const pathNode = node.childForFieldName('path');\n if (pathNode) {\n const target = cleanQuote(pathNode.text);\n relations.push({ from: relativePath, to: target, type: 'IMPORTS' });\n }\n }\n\n if (node.type === 'function_declaration' || node.type === 'method_declaration') {\n const name = node.childForFieldName('name')?.text;\n const line = node.startPosition.row + 1;\n if (name) {\n observations.push(\n createObservation({\n source: `code:${relativePath}#L${line}`,\n claim: `[func] ${name} in ${baseName}`,\n provenance: { type: 'code', path: relativePath, line, timestamp: now },\n confidence: 0.85,\n positive: [name.toLowerCase(), 'func', baseName.toLowerCase()],\n details: { kind: 'func', name, line }\n })\n );\n relations.push({\n from: relativePath,\n to: `${relativePath}#${name}`,\n type: 'DEFINES'\n });\n }\n }\n\n if (node.type === 'type_spec') {\n const name = node.childForFieldName('name')?.text;\n const line = node.startPosition.row + 1;\n if (name) {\n observations.push(\n createObservation({\n source: `code:${relativePath}#L${line}`,\n claim: `[type] ${name} in ${baseName}`,\n provenance: { type: 'code', path: relativePath, line, timestamp: now },\n confidence: 0.85,\n positive: [name.toLowerCase(), 'type', baseName.toLowerCase()],\n details: { kind: 'type', name, line }\n })\n );\n relations.push({\n from: relativePath,\n to: `${relativePath}#${name}`,\n type: 'DEFINES'\n });\n }\n }\n\n if (node.type === 'comment') {\n const obs = extractCommentObservation(node, relativePath, baseName, now);\n if (obs) observations.push(obs);\n }\n\n for (let i = 0; i < node.childCount; i++) {\n const ch = node.child(i);\n if (ch) walk(ch);\n }\n }\n\n walk(root);\n}\n\nfunction extractFromRust(\n root: Parser.SyntaxNode,\n relativePath: string,\n baseName: string,\n now: string,\n observations: Observation[],\n relations: EvidenceRelation[]\n) {\n function walk(node: Parser.SyntaxNode) {\n if (node.type === 'use_declaration') {\n const text = node.text.replace(/^use\\s+/, '').replace(/;$/, '').trim();\n const rootCrate = text.split('::')[0];\n if (rootCrate) {\n relations.push({ from: relativePath, to: rootCrate, type: 'IMPORTS' });\n }\n }\n\n if (\n node.type === 'function_item' ||\n node.type === 'struct_item' ||\n node.type === 'enum_item' ||\n node.type === 'trait_item'\n ) {\n const name = node.childForFieldName('name')?.text;\n const kind = node.type.replace('_item', '');\n const line = node.startPosition.row + 1;\n if (name) {\n observations.push(\n createObservation({\n source: `code:${relativePath}#L${line}`,\n claim: `[${kind}] ${name} in ${baseName}`,\n provenance: { type: 'code', path: relativePath, line, timestamp: now },\n confidence: 0.85,\n positive: [name.toLowerCase(), kind, baseName.toLowerCase()],\n details: { kind, name, line }\n })\n );\n relations.push({\n from: relativePath,\n to: `${relativePath}#${name}`,\n type: 'DEFINES'\n });\n }\n }\n\n if (node.type === 'line_comment' || node.type === 'block_comment') {\n const obs = extractCommentObservation(node, relativePath, baseName, now);\n if (obs) observations.push(obs);\n }\n\n for (let i = 0; i < node.childCount; i++) {\n const ch = node.child(i);\n if (ch) walk(ch);\n }\n }\n\n walk(root);\n}\n\n// --- Fallback Lexical Analyzer ---\n\nfunction analyzeSourceLexical(\n content: string,\n relativePath: string,\n baseName: string,\n now: string\n): SourceScanResult {\n const observations: Observation[] = [];\n const relations: EvidenceRelation[] = [];\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (!line) continue;\n\n // 1. Imports (TS/JS, Python, Go, Rust, C/C++)\n const jsImportMatch = line.match(/(?:import\\s+.*?\\s+from\\s+['\"]([^'\"]+)['\"]|require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\))/);\n if (jsImportMatch) {\n const target = jsImportMatch[1] || jsImportMatch[2];\n relations.push({ from: relativePath, to: target, type: 'IMPORTS' });\n }\n\n const pyImportMatch = line.match(/^(?:from\\s+([a-zA-Z0-9_.]+)\\s+import|import\\s+([a-zA-Z0-9_.]+))/);\n if (pyImportMatch && relativePath.endsWith('.py')) {\n const target = pyImportMatch[1] || pyImportMatch[2];\n relations.push({ from: relativePath, to: target, type: 'IMPORTS' });\n }\n\n const rustUseMatch = line.match(/^use\\s+([a-zA-Z0-9_]+)::/);\n if (rustUseMatch && relativePath.endsWith('.rs')) {\n relations.push({ from: relativePath, to: rustUseMatch[1], type: 'IMPORTS' });\n }\n\n const goImportMatch = line.match(/^import\\s+[\"']([^\"']+)[\"']/);\n if (goImportMatch && relativePath.endsWith('.go')) {\n relations.push({ from: relativePath, to: goImportMatch[1], type: 'IMPORTS' });\n }\n\n // 2. Actionable Code Comments\n const commentMatch = line.match(/\\b(TODO|FIXME|HACK|DEPRECATED|WARN|NOTE|BUG)\\b:?\\s*(.*)$/i);\n if (commentMatch) {\n const tag = commentMatch[1].toUpperCase();\n const text = commentMatch[2].trim() || 'Unspecified';\n const confidence = tag === 'DEPRECATED' || tag === 'FIXME' || tag === 'BUG' ? 0.90 : 0.80;\n observations.push(\n createObservation({\n source: `code:${relativePath}#L${i + 1}`,\n claim: `[${tag}] in ${baseName}: ${text}`,\n provenance: { type: 'code', path: relativePath, line: i + 1, timestamp: now },\n confidence,\n positive: [tag.toLowerCase(), baseName.toLowerCase()],\n details: { tag, text, line: i + 1 }\n })\n );\n }\n }\n\n return { observations, relations };\n}\n\n/**\n * High-performance source code analyzer powered by web-tree-sitter (WASM)\n * with robust lexical fallback. Extracts AST symbols, imports, definitions,\n * and scoped actionable comments without requiring language toolchains.\n */\nexport async function analyzeSourceFile(\n filePath: string,\n relativePath: string\n): Promise<SourceScanResult> {\n const observations: Observation[] = [];\n const relations: EvidenceRelation[] = [];\n\n let content = '';\n try {\n content = await fs.readFile(filePath, 'utf-8');\n } catch {\n return { observations, relations };\n }\n\n // Skip very large generated files (> 500KB)\n if (content.length > 500 * 1024) {\n return { observations, relations };\n }\n\n const now = new Date().toISOString();\n const baseName = path.basename(relativePath);\n const ext = path.extname(relativePath).toLowerCase();\n const wasmName = EXT_TO_WASM[ext];\n\n // Try Tree-sitter AST extraction if language is supported\n if (wasmName) {\n try {\n const parser = await getParserForWasm(wasmName);\n if (parser) {\n const tree = parser.parse(content);\n const root = tree.rootNode;\n\n if (ext === '.ts' || ext === '.mts' || ext === '.cts' || ext === '.tsx' || ext === '.js' || ext === '.jsx' || ext === '.mjs' || ext === '.cjs') {\n extractFromTsJs(root, relativePath, baseName, now, observations, relations);\n } else if (ext === '.py') {\n extractFromPython(root, relativePath, baseName, now, observations, relations);\n } else if (ext === '.go') {\n extractFromGo(root, relativePath, baseName, now, observations, relations);\n } else if (ext === '.rs') {\n extractFromRust(root, relativePath, baseName, now, observations, relations);\n }\n\n return { observations, relations };\n }\n } catch {\n // Tree-sitter failed; fall back to lexical\n }\n }\n\n return analyzeSourceLexical(content, relativePath, baseName, now);\n}\n","import type {\n RuleDefinition,\n RuleSet,\n EvaluatedRule,\n Observation,\n Knowledge\n} from '../core/types.js';\nimport { createObservation } from '../core/knowledge.js';\nimport type { ProjectContext } from '../scanner/filesystem.js';\n\n/**\n * Converts a simple glob-like pattern (e.g. *.sh, src/**\\/*.ts) into a regular expression.\n */\nfunction globToRegex(glob: string): RegExp {\n let pattern = glob.trim().replace(/^\\//, '').replace(/\\/$/, '');\n pattern = pattern.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&');\n pattern = pattern.replace(/\\*\\*/g, '.*');\n pattern = pattern.replace(/\\*/g, '[^/]*');\n pattern = pattern.replace(/\\?/g, '[^/]');\n return new RegExp(`(^|/)${pattern}$`, 'i');\n}\n\n/**\n * Evaluates a single rule condition against the project context.\n */\nexport async function evaluateRule(\n rule: RuleDefinition,\n context: ProjectContext\n): Promise<EvaluatedRule> {\n const cond = rule.when;\n\n // Unconditional rules are always matched\n if (!cond || Object.keys(cond).length === 0) {\n return {\n rule,\n matched: true,\n reason: 'Always active project rule'\n };\n }\n\n const matchedFiles: string[] = [];\n\n // 1. Check has_file condition\n if (cond.has_file) {\n const files = Array.isArray(cond.has_file) ? cond.has_file : [cond.has_file];\n for (const f of files) {\n if (!context.hasFile(f)) {\n return {\n rule,\n matched: false,\n reason: `Required file '${f}' not found in project`\n };\n }\n matchedFiles.push(f);\n }\n }\n\n // 2. Check missing_file condition\n if (cond.missing_file) {\n const files = Array.isArray(cond.missing_file) ? cond.missing_file : [cond.missing_file];\n for (const f of files) {\n if (context.hasFile(f)) {\n return {\n rule,\n matched: false,\n reason: `Prohibited file '${f}' is present in project`\n };\n }\n }\n }\n\n // 3. Check any_file condition\n if (cond.any_file && cond.any_file.length > 0) {\n let anyFound = false;\n for (const f of cond.any_file) {\n if (context.hasFile(f)) {\n anyFound = true;\n matchedFiles.push(f);\n break;\n }\n }\n if (!anyFound) {\n return {\n rule,\n matched: false,\n reason: `None of the expected files were found: ${cond.any_file.join(', ')}`\n };\n }\n }\n\n // 4. Check file_pattern condition\n if (cond.file_pattern) {\n const regex = globToRegex(cond.file_pattern);\n const matches = context.files.filter(\n (f) => regex.test(f.relativePath) || regex.test(f.name)\n );\n if (matches.length === 0) {\n return {\n rule,\n matched: false,\n reason: `No files matched pattern '${cond.file_pattern}'`\n };\n }\n matchedFiles.push(...matches.slice(0, 5).map((m) => m.relativePath));\n }\n\n // 5. Check content_match condition\n if (cond.content_match) {\n const { files: targetFile, pattern } = cond.content_match;\n const regex = new RegExp(pattern, 'm');\n\n if (targetFile) {\n const content = await context.readText(targetFile);\n if (!content || !regex.test(content)) {\n return {\n rule,\n matched: false,\n reason: `Pattern '${pattern}' was not found in file '${targetFile}'`\n };\n }\n matchedFiles.push(targetFile);\n } else {\n // If no specific file target, search across top candidate files\n let contentFound = false;\n for (const file of context.files.slice(0, 20)) {\n const content = await context.readText(file.relativePath);\n if (content && regex.test(content)) {\n contentFound = true;\n matchedFiles.push(file.relativePath);\n break;\n }\n }\n if (!contentFound) {\n return {\n rule,\n matched: false,\n reason: `Pattern '${pattern}' was not found in project files`\n };\n }\n }\n }\n\n return {\n rule,\n matched: true,\n reason: 'Rule condition matched repository structure',\n matchedFiles: matchedFiles.length > 0 ? Array.from(new Set(matchedFiles)) : undefined\n };\n}\n\n/**\n * Evaluates all rules within a RuleSet against the project context.\n */\nexport async function evaluateRuleSet(\n ruleSet: RuleSet,\n context: ProjectContext\n): Promise<EvaluatedRule[]> {\n const results: EvaluatedRule[] = [];\n for (const rule of ruleSet.rules) {\n results.push(await evaluateRule(rule, context));\n }\n return results;\n}\n\n/**\n * Converts a matched rule into a standard Observation.\n */\nexport function ruleToObservation(\n rule: RuleDefinition,\n evaluated: EvaluatedRule,\n sourceFile: string\n): Observation {\n const now = new Date().toISOString();\n const ruleType = rule.type ?? 'rule';\n\n const positive = [\n ...(rule.positive ?? []),\n rule.id,\n ruleType,\n ...(rule.tags ?? [])\n ];\n\n return createObservation({\n source: `rule:${rule.id}`,\n claim: rule.statement,\n confidence: rule.confidence ?? 0.95,\n provenance: {\n type: 'file',\n path: sourceFile,\n timestamp: now\n },\n positive: Array.from(new Set(positive)),\n negative: rule.negative ? [...rule.negative] : [],\n details: {\n ruleId: rule.id,\n ruleName: rule.name,\n ruleType,\n matchedReason: evaluated.reason,\n matchedFiles: evaluated.matchedFiles,\n scope: rule.scope ?? 'project',\n ...(rule.details ?? {})\n }\n });\n}\n\n/**\n * Converts a matched rule into a candidate Knowledge item.\n */\nexport function ruleToCandidateLesson(\n rule: RuleDefinition,\n evaluated: EvaluatedRule,\n obsSource: string\n): Partial<Knowledge> & { statement: string } {\n const ruleType = rule.type ?? 'rule';\n const positive = [\n ...(rule.positive ?? []),\n rule.id,\n ruleType,\n ...(rule.tags ?? [])\n ];\n\n return {\n id: `rule.${rule.id}`,\n type: ruleType,\n statement: rule.statement,\n positive: Array.from(new Set(positive)),\n negative: rule.negative ? [...rule.negative] : [],\n confidence: rule.confidence ?? 0.95,\n evidence: [obsSource],\n scope: rule.scope ?? 'project',\n tags: rule.tags ? [...rule.tags] : []\n };\n}\n","import type { Storage } from '../storage/canonical.js';\nimport type { Knowledge, KnowledgeStatus } from '../core/types.js';\nimport type {\n MetricEvent,\n StatsReport,\n KnowledgeStatsReport,\n KnowledgeHealthCategory,\n EffectivenessRatio\n} from './types.js';\n\nfunction formatPercentage(ratio?: number): string {\n if (ratio === undefined || isNaN(ratio)) {\n return '—';\n }\n return `${(ratio * 100).toFixed(1)}%`;\n}\n\nfunction formatRelativeTime(dateStr?: string | number): string | undefined {\n if (!dateStr) return undefined;\n const ts = typeof dateStr === 'number' ? dateStr : Date.parse(dateStr);\n if (isNaN(ts)) return undefined;\n\n const diffMs = Date.now() - ts;\n const diffSec = Math.floor(diffMs / 1000);\n if (diffSec < 60) return `${diffSec}s ago`;\n const diffMin = Math.floor(diffSec / 60);\n if (diffMin < 60) return `${diffMin}m ago`;\n const diffHr = Math.floor(diffMin / 60);\n if (diffHr < 24) return `${diffHr}h ago`;\n const diffDays = Math.floor(diffHr / 24);\n return `${diffDays}d ago`;\n}\n\nexport function classifyKnowledgeHealth(\n knowledge: Knowledge,\n knowledgeEvents: MetricEvent[],\n independentSourcesCount: number\n): { category: KnowledgeHealthCategory; reason: string } {\n // 1. Needs Revalidation\n if (knowledge.status === 'needs_revalidation' || knowledge.status === 'stale') {\n return {\n category: 'NEEDS_REVALIDATION',\n reason: 'Underlying source or dependency changed since last validation'\n };\n }\n\n // 2. Frequently Misleading\n const outcomes = knowledgeEvents.filter((e) => e.type === 'outcome') as Array<\n MetricEvent & { type: 'outcome' }\n >;\n const misleadingCount = outcomes.filter(\n (o) => o.result === 'failure' || o.result === 'reverted' || (o as any).result === 'misleading'\n ).length + (knowledge.outcomesSummary?.misleading ?? 0);\n const successCount = outcomes.filter((o) => o.result === 'success').length +\n (knowledge.metrics.successful_outcomes ?? 0);\n\n if (misleadingCount > 0 && misleadingCount >= successCount) {\n return {\n category: 'FREQUENTLY_MISLEADING',\n reason: `${misleadingCount} negative or misleading outcome(s) recorded`\n };\n }\n\n // 3. Frequently Rejected by JEV\n const jevEvents = knowledgeEvents.filter((e) => e.type === 'jev_result') as Array<\n MetricEvent & { type: 'jev_result' }\n >;\n const rejectCount = jevEvents.filter((j) => j.result === 'REJECT').length;\n if (jevEvents.length >= 3 && rejectCount / jevEvents.length >= 0.7) {\n return {\n category: 'FREQUENTLY_REJECTED',\n reason: `Rejected in ${rejectCount} of ${jevEvents.length} JEV evaluations`\n };\n }\n\n // 4. Low Evidence\n if (independentSourcesCount < 2 && knowledge.confidence < 0.75) {\n return {\n category: 'LOW_EVIDENCE',\n reason: `Only ${independentSourcesCount} independent source(s) and confidence < 0.75`\n };\n }\n\n // 5. Unused\n const reuseCount =\n knowledge.metrics.reuse_count +\n knowledgeEvents.filter((e) => e.type === 'knowledge_reused').length;\n const createdAtMs = Date.parse(knowledge.createdAt);\n const ageHours = !isNaN(createdAtMs) ? (Date.now() - createdAtMs) / (1000 * 3600) : 0;\n if (reuseCount === 0 && ageHours > 1) {\n return {\n category: 'UNUSED',\n reason: 'No reuse recorded since creation'\n };\n }\n\n // 6. Healthy\n return {\n category: 'HEALTHY',\n reason: 'Active with verified evidence and clean outcome history'\n };\n}\n\nexport async function computeStats(\n storage: Storage,\n events: MetricEvent[],\n options?: { since?: string; sinceTimestamp?: number }\n): Promise<StatsReport> {\n // 1. Current State Metrics (read directly from current Bilmem state, never drift)\n const allKnowledge = await storage.getAllKnowledge();\n const allUnknowns = await storage.getAllUnknowns();\n\n let active = 0;\n let candidates = 0;\n let conflicted = 0;\n let needsRevalidation = 0;\n let stale = 0;\n\n for (const k of allKnowledge) {\n if (k.status === 'active') active++;\n else if (k.status === 'candidate' || k.stage === 'candidate') candidates++;\n else if (k.status === 'contradicted') conflicted++;\n else if (k.status === 'needs_revalidation') needsRevalidation++;\n else if (k.status === 'stale') stale++;\n }\n\n // 2. Activity Metrics (aggregated from events)\n const learning = {\n observations: 0,\n new: 0,\n merged: 0,\n strengthened: 0,\n specialized: 0,\n superseded: 0,\n contradictions: 0,\n ignoredDuplicates: 0\n };\n\n const resolution = {\n resolveCalls: 0,\n known: 0,\n partiallyKnown: 0,\n unknown: 0,\n conflicted: 0,\n stale: 0\n };\n\n const investigation = {\n repeatedChecksAvoided: 0,\n knowledgeReused: 0,\n questionsSuggested: 0,\n questionsResolved: 0,\n broadSearchesAvoided: 0,\n sourceReadsAvoided: 0,\n investigationsReused: 0\n };\n\n const jev = {\n candidates: 0,\n match: 0,\n possible: 0,\n rejected: 0,\n hardNegativeRejects: 0,\n reasons: {\n hardNegative: 0,\n scopeMismatch: 0,\n insufficientContext: 0,\n staleKnowledge: 0\n }\n };\n\n const actions: Record<string, number> = {};\n\n const preflight = {\n runs: 0,\n ready: 0,\n needsClarification: 0,\n needsRevalidation: 0,\n conflicted: 0,\n insufficientKnowledge: 0,\n blockingUnknownsFound: 0,\n staleKnowledgeFound: 0,\n pastFailuresSurfaced: 0,\n questionsSuggested: 0,\n repeatedChecksAvoided: 0\n };\n\n for (const e of events) {\n switch (e.type) {\n case 'preflight':\n preflight.runs++;\n if (e.readiness === 'READY') preflight.ready++;\n else if (e.readiness === 'NEEDS_CLARIFICATION') preflight.needsClarification++;\n else if (e.readiness === 'NEEDS_REVALIDATION') preflight.needsRevalidation++;\n else if (e.readiness === 'CONFLICTED') preflight.conflicted++;\n else if (e.readiness === 'INSUFFICIENT_KNOWLEDGE') preflight.insufficientKnowledge++;\n\n preflight.blockingUnknownsFound += e.blockingUnknownsCount || 0;\n preflight.staleKnowledgeFound += e.staleKnowledgeCount || 0;\n preflight.pastFailuresSurfaced += e.pastFailuresCount || 0;\n preflight.questionsSuggested += e.questionsCount || 0;\n preflight.repeatedChecksAvoided += e.repeatedChecksAvoidedCount || 0;\n break;\n case 'knowledge_created':\n learning.new++;\n break;\n case 'knowledge_merged':\n learning.merged++;\n break;\n case 'knowledge_strengthened':\n learning.strengthened++;\n break;\n case 'knowledge_specialized':\n learning.specialized++;\n break;\n case 'knowledge_superseded':\n learning.superseded++;\n break;\n case 'contradiction_detected':\n learning.contradictions++;\n break;\n case 'duplicate_ignored':\n learning.ignoredDuplicates++;\n break;\n\n case 'resolve':\n resolution.resolveCalls++;\n if (e.state === 'KNOWN') resolution.known++;\n else if (e.state === 'PARTIALLY_KNOWN') resolution.partiallyKnown++;\n else if (e.state === 'UNKNOWN') resolution.unknown++;\n else if (e.state === 'CONFLICTED') resolution.conflicted++;\n else if (e.state === 'STALE') resolution.stale++;\n\n if (e.action) {\n actions[e.action] = (actions[e.action] ?? 0) + 1;\n }\n break;\n\n case 'knowledge_reused':\n investigation.knowledgeReused++;\n break;\n case 'question_suggested':\n investigation.questionsSuggested++;\n break;\n case 'question_resolved':\n investigation.questionsResolved++;\n break;\n case 'broad_search_avoided':\n investigation.broadSearchesAvoided++;\n break;\n case 'source_read_avoided':\n investigation.sourceReadsAvoided++;\n investigation.repeatedChecksAvoided++;\n break;\n case 'investigation_reused':\n investigation.investigationsReused++;\n investigation.repeatedChecksAvoided++;\n break;\n\n case 'jev_result':\n jev.candidates++;\n if (e.result === 'MATCH') jev.match++;\n else if (e.result === 'POSSIBLE') jev.possible++;\n else if (e.result === 'REJECT') {\n jev.rejected++;\n const reason = String(e.reason || '').toUpperCase();\n if (reason.includes('HARD_NEGATIVE') || reason.includes('FORBIDS')) {\n jev.hardNegativeRejects++;\n jev.reasons.hardNegative++;\n } else if (reason.includes('SCOPE')) {\n jev.reasons.scopeMismatch++;\n } else if (reason.includes('STALE')) {\n jev.reasons.staleKnowledge++;\n } else {\n jev.reasons.insufficientContext++;\n }\n }\n break;\n\n case 'jev_hard_negative':\n // Counted if not already accounted for\n break;\n }\n }\n\n // Count total observations from storage\n try {\n const allObs = await storage.getAllObservations();\n learning.observations = allObs.length;\n } catch {\n learning.observations = 0;\n }\n\n // 3. Effectiveness Ratios\n // Knowledge reuse rate: resolve operations that reused existing applicable knowledge / all resolve operations\n const reuseRatio =\n resolution.resolveCalls > 0\n ? Math.min(1.0, (resolution.known + Math.min(resolution.partiallyKnown, investigation.knowledgeReused)) / resolution.resolveCalls)\n : undefined;\n\n const knowledgeReuseRate: EffectivenessRatio = {\n value: reuseRatio,\n formatted: reuseRatio !== undefined ? formatPercentage(reuseRatio) : '— (Not enough observations)',\n formula: 'resolve operations that reused existing applicable knowledge / all resolve operations'\n };\n\n // Resolve success rate: (KNOWN + successfully resolved PARTIALLY_KNOWN) / all completed resolve attempts\n const resolveSuccessRatio =\n resolution.resolveCalls > 0\n ? Math.min(1.0, (resolution.known + investigation.questionsResolved) / resolution.resolveCalls)\n : undefined;\n\n const resolveSuccessRate: EffectivenessRatio = {\n value: resolveSuccessRatio,\n formatted: resolveSuccessRatio !== undefined ? formatPercentage(resolveSuccessRatio) : '— (Not enough observations)',\n formula: '(KNOWN + successfully resolved PARTIALLY_KNOWN) / all completed resolve attempts'\n };\n\n // Question resolution rate: questions resolved / questions suggested\n const questionRatio =\n investigation.questionsSuggested > 0\n ? Math.min(1.0, investigation.questionsResolved / investigation.questionsSuggested)\n : undefined;\n\n const questionResolutionRate: EffectivenessRatio = {\n value: questionRatio,\n formatted: questionRatio !== undefined ? formatPercentage(questionRatio) : '— (Not enough observations)',\n formula: 'questions resolved / questions suggested'\n };\n\n // JEV rejection rate: JEV rejected candidates / all JEV candidates evaluated\n const jevRatio =\n jev.candidates > 0\n ? jev.rejected / jev.candidates\n : undefined;\n\n const jevRejectionRate: EffectivenessRatio = {\n value: jevRatio,\n formatted: jevRatio !== undefined ? formatPercentage(jevRatio) : '— (Not enough observations)',\n formula: 'JEV rejected candidates / all JEV candidates evaluated'\n };\n\n // 4. Knowledge Health Distribution\n const health = {\n healthy: 0,\n needsRevalidation: 0,\n lowEvidence: 0,\n frequentlyRejected: 0,\n frequentlyMisleading: 0,\n unused: 0\n };\n\n const eventsByKnowledge = new Map<string, MetricEvent[]>();\n for (const e of events) {\n const kid = (e as { knowledgeId?: string }).knowledgeId;\n if (kid) {\n const list = eventsByKnowledge.get(kid) || [];\n list.push(e);\n eventsByKnowledge.set(kid, list);\n }\n }\n\n for (const k of allKnowledge) {\n const kEvents = eventsByKnowledge.get(k.id) || [];\n const uniqueSources = new Set(k.evidence.map((ev) => ev.replace(/^(code|file|test|doc):/, '')));\n const { category } = classifyKnowledgeHealth(k, kEvents, uniqueSources.size);\n\n switch (category) {\n case 'HEALTHY':\n health.healthy++;\n break;\n case 'NEEDS_REVALIDATION':\n health.needsRevalidation++;\n break;\n case 'LOW_EVIDENCE':\n health.lowEvidence++;\n break;\n case 'FREQUENTLY_REJECTED':\n health.frequentlyRejected++;\n break;\n case 'FREQUENTLY_MISLEADING':\n health.frequentlyMisleading++;\n break;\n case 'UNUSED':\n health.unused++;\n break;\n }\n }\n\n return {\n since: options?.since,\n sinceTimestamp: options?.sinceTimestamp,\n knowledge: {\n active,\n candidates,\n unknown: allUnknowns.length,\n conflicted,\n needsRevalidation,\n stale,\n total: allKnowledge.length\n },\n learning,\n resolution,\n investigation,\n jev,\n actions,\n effectiveness: {\n knowledgeReuseRate,\n resolveSuccessRate,\n questionResolutionRate,\n jevRejectionRate\n },\n health,\n preflight: preflight.runs > 0 ? preflight : undefined\n };\n}\n\nexport async function computeKnowledgeStats(\n storage: Storage,\n knowledgeId: string,\n events: MetricEvent[]\n): Promise<KnowledgeStatsReport | undefined> {\n const knowledge = await storage.getKnowledge(knowledgeId);\n if (!knowledge) {\n return undefined;\n }\n\n const kEvents = events.filter((e) => (e as { knowledgeId?: string }).knowledgeId === knowledgeId);\n\n // Usage & Outcomes\n const outcomes = kEvents.filter((e) => e.type === 'outcome') as Array<\n MetricEvent & { type: 'outcome' }\n >;\n const successfulOutcomes =\n knowledge.metrics.successful_outcomes +\n outcomes.filter((o) => o.result === 'success').length;\n const neutralOutcomes =\n (knowledge.outcomesSummary?.neutral ?? 0) +\n outcomes.filter((o) => o.result === 'neutral').length;\n const misleadingOutcomes =\n (knowledge.outcomesSummary?.misleading ?? 0) +\n outcomes.filter((o) => (o as any).result === 'misleading').length;\n const failedOutcomes =\n knowledge.metrics.failed_outcomes +\n outcomes.filter((o) => o.result === 'failure' || o.result === 'reverted').length;\n\n const used =\n knowledge.metrics.reuse_count +\n kEvents.filter((e) => e.type === 'knowledge_reused').length;\n\n // JEV stats\n const jevEvents = kEvents.filter((e) => e.type === 'jev_result') as Array<\n MetricEvent & { type: 'jev_result' }\n >;\n const jevMatch = jevEvents.filter((j) => j.result === 'MATCH').length;\n const jevPossible = jevEvents.filter((j) => j.result === 'POSSIBLE').length;\n const jevRejected = jevEvents.filter((j) => j.result === 'REJECT').length;\n const jevHardNegativeRejects = jevEvents.filter(\n (j) => String(j.reason || '').toUpperCase().includes('HARD_NEGATIVE')\n ).length + kEvents.filter((e) => e.type === 'jev_hard_negative').length;\n\n // Evidence\n const uniqueSources = new Set(knowledge.evidence.map((ev) => ev.replace(/^(code|file|test|doc):/, '')));\n\n // Lifecycle\n const revisions = knowledge.temporal?.revision || knowledge.history?.length || 1;\n const strengthened =\n knowledge.metrics.support_count +\n kEvents.filter((e) => e.type === 'knowledge_strengthened').length;\n const contradictions =\n knowledge.metrics.contradiction_count +\n kEvents.filter((e) => e.type === 'contradiction_detected').length;\n\n const lastUsedStr = formatRelativeTime(knowledge.metrics.last_used);\n const lastValidatedStr = formatRelativeTime(knowledge.updatedAt);\n\n const { category: healthCategory, reason: healthReason } = classifyKnowledgeHealth(\n knowledge,\n kEvents,\n uniqueSources.size\n );\n\n return {\n id: knowledge.id,\n status: knowledge.status,\n stage: knowledge.stage,\n statement: knowledge.statement,\n usage: {\n used,\n successfulOutcomes,\n neutralOutcomes,\n misleadingOutcomes,\n failedOutcomes\n },\n jev: {\n match: jevMatch,\n possible: jevPossible,\n rejected: jevRejected,\n hardNegativeRejects: jevHardNegativeRejects\n },\n evidence: {\n sources: knowledge.evidence.length,\n independentSources: uniqueSources.size,\n sourcesList: knowledge.evidence\n },\n lifecycle: {\n revisions,\n strengthened,\n contradictions,\n lastUsed: lastUsedStr,\n lastValidated: lastValidatedStr,\n health: healthCategory,\n healthReason\n }\n };\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Resolves a --since argument into a numeric unix timestamp in milliseconds.\n * Supports relative duration (e.g. 24h, 7d, 30d) or Git revision (e.g. HEAD~20, commit SHA).\n */\nexport async function resolveSinceTimestamp(\n since: string,\n projectDir: string = process.cwd()\n): Promise<number> {\n const trimmed = since.trim();\n\n // 1. Duration format: e.g. 24h, 7d, 30d, 2w\n const durationMatch = trimmed.match(/^(\\d+)\\s*([smhdw])$/i);\n if (durationMatch) {\n const value = parseInt(durationMatch[1], 10);\n const unit = durationMatch[2].toLowerCase();\n let ms = 0;\n switch (unit) {\n case 's':\n ms = value * 1000;\n break;\n case 'm':\n ms = value * 60 * 1000;\n break;\n case 'h':\n ms = value * 3600 * 1000;\n break;\n case 'd':\n ms = value * 86400 * 1000;\n break;\n case 'w':\n ms = value * 7 * 86400 * 1000;\n break;\n }\n return Date.now() - ms;\n }\n\n // 2. ISO timestamp format: e.g. 2026-09-01T00:00:00Z\n const parsedDate = Date.parse(trimmed);\n if (!isNaN(parsedDate) && trimmed.includes('-')) {\n return parsedDate;\n }\n\n // 3. Git revision format: e.g. HEAD~20, 81ac23, main\n try {\n const { stdout } = await execFileAsync(\n 'git',\n ['log', '-1', '--format=%ct', trimmed],\n { cwd: projectDir }\n );\n const epochSec = parseInt(stdout.trim(), 10);\n if (!isNaN(epochSec) && epochSec > 0) {\n return epochSec * 1000;\n }\n throw new Error(`Invalid git output: ${stdout}`);\n } catch {\n throw new Error(`Unable to resolve Git revision: ${trimmed}`);\n }\n}\n","import { Storage } from '../storage/canonical.js';\nimport type { StatsReport, KnowledgeStatsReport } from './types.js';\nimport { readMetricEvents, resetMetricEvents } from './events.js';\nimport { computeStats, computeKnowledgeStats } from './aggregator.js';\nimport { resolveSinceTimestamp } from './filter.js';\n\nexport * from './types.js';\nexport * from './events.js';\nexport * from './aggregator.js';\nexport * from './filter.js';\nexport * from './format.js';\n\nexport interface RunStatsOptions {\n rootDir?: string;\n since?: string;\n knowledgeId?: string;\n reset?: boolean;\n}\n\n/**\n * High-level stats runner for CLI and programmatic API.\n */\nexport async function runStats(\n options: RunStatsOptions = {}\n): Promise<{\n report?: StatsReport;\n knowledgeReport?: KnowledgeStatsReport;\n reset?: boolean;\n}> {\n const rootDir = options.rootDir || process.cwd();\n const storage = new Storage(rootDir);\n\n // If reset requested:\n if (options.reset) {\n await resetMetricEvents(rootDir);\n return { reset: true };\n }\n\n let sinceTimestamp: number | undefined;\n if (options.since) {\n sinceTimestamp = await resolveSinceTimestamp(options.since, rootDir);\n }\n\n const events = await readMetricEvents(rootDir, {\n sinceTimestamp,\n knowledgeId: options.knowledgeId\n });\n\n if (options.knowledgeId) {\n const knowledgeReport = await computeKnowledgeStats(storage, options.knowledgeId, events);\n return { knowledgeReport };\n }\n\n const report = await computeStats(storage, events, {\n since: options.since,\n sinceTimestamp\n });\n\n return { report };\n}\n","import type {\n InstallResult,\n UninstallResult,\n DoctorReport,\n DoctorFixResult,\n InstallScope\n} from './types.js';\n\nexport function formatInstallResult(\n results: InstallResult[],\n scope: InstallScope,\n projectDir: string,\n dryRun?: boolean\n): string {\n const lines: string[] = [];\n\n if (results.length === 0) {\n return 'No agents installed.';\n }\n\n lines.push(`Scope:\\n ${scope}\\n`);\n if (scope === 'project') {\n lines.push(`Project:\\n ${projectDir}\\n`);\n }\n\n for (const res of results) {\n lines.push(`${res.name}`);\n if (res.actionsTaken.length > 0) {\n for (const action of res.actionsTaken) {\n if (action === 'Already up to date' || action.includes('already')) {\n lines.push(` ✓ ${action}`);\n } else if (action.startsWith('Not detected')) {\n lines.push(` ○ ${action}`);\n } else {\n lines.push(` ✓ ${action}`);\n }\n }\n }\n\n if (res.warnings && res.warnings.length > 0) {\n for (const w of res.warnings) {\n lines.push(` ! ${w}`);\n }\n }\n lines.push('');\n }\n\n if (dryRun) {\n lines.push('Dry run: No files were changed.');\n } else {\n const totalInstalled = results.filter(\n (r) => r.mcpChanged || r.instructionChanged || r.projectInitialized\n ).length;\n if (totalInstalled > 0) {\n lines.push(`${totalInstalled} integration(s) configured successfully.`);\n } else {\n lines.push('No changes required.');\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function formatUninstallResult(\n result: UninstallResult,\n dryRun?: boolean\n): string {\n const lines: string[] = [];\n lines.push(`${result.name}`);\n for (const action of result.actionsTaken) {\n lines.push(` ✓ ${action}`);\n }\n if (result.warnings && result.warnings.length > 0) {\n for (const w of result.warnings) {\n lines.push(` ! ${w}`);\n }\n }\n lines.push('');\n if (dryRun) {\n lines.push('Dry run: No files were changed.');\n } else {\n lines.push(result.message || 'Uninstall complete.');\n }\n return lines.join('\\n');\n}\n\nexport function formatDoctorReport(report: DoctorReport): string {\n const lines: string[] = [];\n lines.push('Bilmem System Diagnostics\\n');\n\n lines.push('Core');\n const s = report.core.storage;\n lines.push(` Storage ${s.status === 'ok' ? '✓' : '!'}${s.details ? ` (${s.details})` : ''}`);\n\n const k = report.core.knowledge;\n lines.push(` Knowledge ${k.status === 'ok' ? '✓' : '!'}${k.details ? ` (${k.details})` : ''}`);\n\n const idx = report.core.searchIndex;\n lines.push(` Search index ${idx.status === 'ok' ? '✓' : '!'}${idx.details ? ` (${idx.details})` : ''}`);\n\n const m = report.core.mcpRuntime;\n lines.push(` MCP runtime ${m.status === 'ok' ? '✓' : '!'}${m.details ? ` (${m.details})` : ''}`);\n lines.push('');\n\n for (const agent of report.agents) {\n lines.push(`${agent.name}`);\n lines.push(` Detected ${agent.detected ? '✓' : '○'}`);\n if (agent.detected || agent.mcp.status !== 'missing' || agent.instructions.status !== 'none') {\n const mcpMark = agent.mcp.status === 'ok' ? '✓' : agent.mcp.status === 'outdated' ? '!' : '✗';\n lines.push(` MCP ${mcpMark}${agent.mcp.details ? ` (${agent.mcp.details})` : ''}`);\n\n const instMark =\n agent.instructions.status === 'ok'\n ? '✓'\n : agent.instructions.status === 'outdated'\n ? '!'\n : agent.instructions.status === 'missing'\n ? '✗'\n : '○';\n lines.push(` Instructions ${instMark}${agent.instructions.details ? ` (${agent.instructions.details})` : ''}`);\n\n if (agent.skillPath) {\n const skillMark =\n agent.skill?.status === 'ok'\n ? '✓'\n : agent.skill?.status === 'outdated'\n ? '!'\n : agent.skill?.status === 'missing'\n ? '✗'\n : '○';\n lines.push(` Skill ${skillMark}${agent.skill?.details ? ` (${agent.skill?.details})` : ''}`);\n }\n\n const cmdMark = agent.command.status === 'ok' ? '✓' : '!';\n lines.push(` Connection ${cmdMark}${agent.command.details ? ` (${agent.command.details})` : ''}`);\n }\n lines.push('');\n }\n\n\n if (report.issuesCount > 0 && report.canFix) {\n lines.push(`Found ${report.issuesCount} fixable issue(s). Run \"bilmem doctor --fix\" to repair.`);\n } else if (report.issuesCount === 0) {\n lines.push('All systems and detected integrations are healthy.');\n }\n\n return lines.join('\\n');\n}\n\nexport function formatDoctorFixResult(fixed: DoctorFixResult): string {\n const lines: string[] = [];\n lines.push('Bilmem Repair Results\\n');\n\n if (fixed.coreFixed.length > 0) {\n lines.push('Core');\n for (const item of fixed.coreFixed) {\n lines.push(` ✓ ${item}`);\n }\n lines.push('');\n }\n\n const agentNames = Object.keys(fixed.agentsFixed);\n if (agentNames.length > 0) {\n for (const name of agentNames) {\n lines.push(name);\n for (const item of fixed.agentsFixed[name]) {\n lines.push(` ✓ ${item}`);\n }\n lines.push('');\n }\n }\n\n if (fixed.coreFixed.length === 0 && agentNames.length === 0) {\n lines.push('No repair actions were needed.');\n } else if (fixed.dryRun) {\n lines.push('Dry run: No files were changed.');\n } else {\n lines.push('Repair complete.');\n }\n\n return lines.join('\\n');\n}\n"],"mappings":"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","names":["path","fs","path","fs","path","path","path","fs","fs","path","updated","path","path","os","path","os","path","os","path","os","fs","path","path","m","path","fs","YAML","isDecision","stat","tokenize","createHash","createHash","path","fs","path","stat","fs","path","YAML","YAML","execFile","promisify","execFileAsync","promisify","execFile","fs","path","execFile","promisify","execFileAsync","adapters","results","report"]}
|