claude-brain 0.15.2 ā 0.16.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 +191 -191
- package/VERSION +1 -1
- package/assets/CLAUDE-unified.md +11 -11
- package/assets/CLAUDE.md +29 -11
- package/bunfig.toml +8 -8
- package/package.json +82 -82
- package/packs/backend/node.json +173 -173
- package/packs/core/javascript.json +176 -176
- package/packs/core/typescript.json +222 -222
- package/packs/frontend/react.json +254 -254
- package/packs/meta/testing.json +172 -172
- package/scripts/postinstall.mjs +341 -341
- package/src/automation/auto-context.ts +240 -240
- package/src/automation/decision-detector.ts +452 -452
- package/src/automation/index.ts +11 -11
- package/src/automation/phase12-manager.ts +456 -456
- package/src/automation/proactive-recall.ts +373 -373
- package/src/automation/project-detector.ts +310 -310
- package/src/automation/repo-scanner.ts +205 -205
- package/src/cli/auto-setup.ts +82 -82
- package/src/cli/bin.ts +209 -202
- package/src/cli/commands/chroma.ts +573 -573
- package/src/cli/commands/git-hook.ts +189 -189
- package/src/cli/commands/hooks.ts +213 -213
- package/src/cli/commands/init.ts +122 -122
- package/src/cli/commands/install-mcp.ts +92 -92
- package/src/cli/commands/pack.ts +197 -197
- package/src/cli/commands/refresh.ts +323 -0
- package/src/cli/commands/serve.ts +167 -173
- package/src/cli/commands/start.ts +42 -42
- package/src/cli/commands/uninstall-mcp.ts +41 -41
- package/src/cli/commands/update.ts +124 -121
- package/src/cli/diagnose.ts +4 -4
- package/src/cli/health-check.ts +4 -4
- package/src/cli/migrate-chroma.ts +106 -106
- package/src/cli/setup.ts +4 -4
- package/src/cli/ui/animations.ts +80 -80
- package/src/cli/ui/components.ts +82 -82
- package/src/cli/ui/index.ts +4 -4
- package/src/cli/ui/logo.ts +36 -36
- package/src/cli/ui/theme.ts +55 -55
- package/src/config/defaults.ts +50 -50
- package/src/config/home.ts +55 -55
- package/src/config/index.ts +7 -7
- package/src/config/loader.ts +166 -166
- package/src/config/migration.ts +76 -76
- package/src/config/schema.ts +360 -360
- package/src/config/validator.ts +184 -184
- package/src/config/watcher.ts +86 -86
- package/src/context/assembler.ts +398 -398
- package/src/context/cache-manager.ts +101 -101
- package/src/context/formatter.ts +84 -84
- package/src/context/hierarchy.ts +85 -85
- package/src/context/index.ts +83 -83
- package/src/context/progress-tracker.ts +174 -174
- package/src/context/standards-manager.ts +287 -287
- package/src/context/types.ts +252 -252
- package/src/context/validator.ts +58 -58
- package/src/diagnostics/index.ts +123 -123
- package/src/health/index.ts +229 -229
- package/src/hooks/brain-hook.ts +128 -112
- package/src/hooks/capture.ts +168 -205
- package/src/hooks/deduplicator.ts +72 -72
- package/src/hooks/git-capture.ts +109 -109
- package/src/hooks/git-hook-installer.ts +207 -207
- package/src/hooks/index.ts +20 -20
- package/src/hooks/installer.ts +194 -194
- package/src/hooks/passive-classifier.ts +404 -723
- package/src/hooks/queue.ts +129 -129
- package/src/hooks/session-tracker.ts +312 -275
- package/src/hooks/types.ts +47 -47
- package/src/index.ts +7 -7
- package/src/intelligence/cross-project/affinity.ts +162 -162
- package/src/intelligence/cross-project/generalizer.ts +283 -283
- package/src/intelligence/cross-project/index.ts +13 -13
- package/src/intelligence/cross-project/transfer.ts +201 -201
- package/src/intelligence/index.ts +24 -24
- package/src/intelligence/optimization/index.ts +10 -10
- package/src/intelligence/optimization/precompute.ts +202 -202
- package/src/intelligence/optimization/semantic-cache.ts +207 -207
- package/src/intelligence/prediction/context-anticipator.ts +198 -198
- package/src/intelligence/prediction/decision-predictor.ts +184 -184
- package/src/intelligence/prediction/index.ts +13 -13
- package/src/intelligence/prediction/recommender.ts +268 -268
- package/src/intelligence/reasoning/chain-retrieval.ts +247 -247
- package/src/intelligence/reasoning/counterfactual.ts +248 -248
- package/src/intelligence/reasoning/index.ts +13 -13
- package/src/intelligence/reasoning/synthesizer.ts +169 -169
- package/src/intelligence/temporal/evolution.ts +197 -197
- package/src/intelligence/temporal/index.ts +16 -16
- package/src/intelligence/temporal/query-processor.ts +190 -190
- package/src/intelligence/temporal/timeline.ts +259 -259
- package/src/intelligence/temporal/trends.ts +263 -263
- package/src/knowledge/entity-extractor.ts +416 -416
- package/src/knowledge/graph/builder.ts +185 -185
- package/src/knowledge/graph/linker.ts +201 -201
- package/src/knowledge/graph/memory-graph.ts +359 -359
- package/src/knowledge/graph/schema.ts +99 -99
- package/src/knowledge/graph/search.ts +168 -168
- package/src/knowledge/relationship-extractor.ts +108 -108
- package/src/memory/chroma/client.ts +174 -174
- package/src/memory/chroma/collection-manager.ts +94 -94
- package/src/memory/chroma/config.ts +57 -57
- package/src/memory/chroma/embeddings.ts +155 -155
- package/src/memory/chroma/index.ts +82 -82
- package/src/memory/chroma/migration.ts +270 -270
- package/src/memory/chroma/schemas.ts +69 -69
- package/src/memory/chroma/search.ts +315 -315
- package/src/memory/chroma/store.ts +741 -741
- package/src/memory/consolidation/archiver.ts +164 -164
- package/src/memory/consolidation/merger.ts +186 -186
- package/src/memory/consolidation/scorer.ts +138 -138
- package/src/memory/context-builder.ts +236 -236
- package/src/memory/database.ts +169 -169
- package/src/memory/embedding-utils.ts +156 -156
- package/src/memory/embeddings.ts +226 -226
- package/src/memory/episodic/detector.ts +108 -108
- package/src/memory/episodic/manager.ts +351 -351
- package/src/memory/episodic/summarizer.ts +179 -179
- package/src/memory/episodic/types.ts +52 -52
- package/src/memory/index.ts +582 -582
- package/src/memory/knowledge-extractor.ts +455 -455
- package/src/memory/learning.ts +378 -378
- package/src/memory/patterns.ts +396 -396
- package/src/memory/schema.ts +88 -88
- package/src/memory/search.ts +309 -309
- package/src/memory/store.ts +787 -787
- package/src/memory/types.ts +121 -121
- package/src/orchestrator/coordinator.ts +272 -272
- package/src/orchestrator/decision-logger.ts +228 -228
- package/src/orchestrator/event-emitter.ts +198 -198
- package/src/orchestrator/event-queue.ts +184 -184
- package/src/orchestrator/handlers/base-handler.ts +70 -70
- package/src/orchestrator/handlers/context-handler.ts +73 -73
- package/src/orchestrator/handlers/decision-handler.ts +204 -204
- package/src/orchestrator/handlers/index.ts +10 -10
- package/src/orchestrator/handlers/status-handler.ts +131 -131
- package/src/orchestrator/handlers/task-handler.ts +171 -171
- package/src/orchestrator/index.ts +275 -275
- package/src/orchestrator/task-parser.ts +284 -284
- package/src/orchestrator/types.ts +98 -98
- package/src/packs/index.ts +9 -9
- package/src/packs/loader.ts +134 -134
- package/src/packs/manager.ts +204 -204
- package/src/packs/ranker.ts +78 -78
- package/src/packs/types.ts +81 -81
- package/src/phase12/index.ts +5 -5
- package/src/retrieval/bm25/index.ts +300 -300
- package/src/retrieval/bm25/tokenizer.ts +184 -184
- package/src/retrieval/feedback/adaptive.ts +223 -223
- package/src/retrieval/feedback/index.ts +16 -16
- package/src/retrieval/feedback/metrics.ts +223 -223
- package/src/retrieval/feedback/store.ts +283 -283
- package/src/retrieval/fusion/index.ts +194 -194
- package/src/retrieval/fusion/rrf.ts +163 -163
- package/src/retrieval/index.ts +12 -12
- package/src/retrieval/pipeline.ts +375 -375
- package/src/retrieval/query/expander.ts +198 -198
- package/src/retrieval/query/index.ts +27 -27
- package/src/retrieval/query/intent-classifier.ts +236 -236
- package/src/retrieval/query/temporal-parser.ts +295 -295
- package/src/retrieval/reranker/index.ts +188 -188
- package/src/retrieval/reranker/model.ts +95 -95
- package/src/retrieval/service.ts +125 -125
- package/src/retrieval/types.ts +162 -162
- package/src/routing/entity-extractor.ts +428 -428
- package/src/routing/intent-classifier.ts +450 -436
- package/src/routing/response-filter.ts +261 -258
- package/src/routing/router.ts +1441 -1322
- package/src/routing/search-engine.ts +515 -475
- package/src/routing/types.ts +94 -94
- package/src/scripts/health-check.ts +118 -118
- package/src/scripts/setup.ts +122 -122
- package/src/server/handlers/call-tool.ts +156 -156
- package/src/server/handlers/index.ts +9 -9
- package/src/server/handlers/list-tools.ts +35 -35
- package/src/server/handlers/tools/analyze-decision-evolution.ts +151 -151
- package/src/server/handlers/tools/auto-remember.ts +200 -200
- package/src/server/handlers/tools/brain.ts +85 -85
- package/src/server/handlers/tools/create-project.ts +135 -135
- package/src/server/handlers/tools/detect-trends.ts +144 -144
- package/src/server/handlers/tools/find-cross-project-patterns.ts +168 -168
- package/src/server/handlers/tools/get-activity-log.ts +194 -194
- package/src/server/handlers/tools/get-code-standards.ts +124 -124
- package/src/server/handlers/tools/get-corrections.ts +154 -154
- package/src/server/handlers/tools/get-decision-timeline.ts +172 -172
- package/src/server/handlers/tools/get-episode.ts +103 -103
- package/src/server/handlers/tools/get-patterns.ts +158 -158
- package/src/server/handlers/tools/get-phase12-status.ts +63 -63
- package/src/server/handlers/tools/get-project-context.ts +75 -75
- package/src/server/handlers/tools/get-recommendations.ts +145 -145
- package/src/server/handlers/tools/index.ts +31 -31
- package/src/server/handlers/tools/init-project.ts +757 -757
- package/src/server/handlers/tools/list-episodes.ts +90 -90
- package/src/server/handlers/tools/list-projects.ts +125 -125
- package/src/server/handlers/tools/rate-memory.ts +101 -101
- package/src/server/handlers/tools/recall-similar.ts +87 -87
- package/src/server/handlers/tools/recognize-pattern.ts +126 -126
- package/src/server/handlers/tools/record-correction.ts +125 -125
- package/src/server/handlers/tools/remember-decision.ts +153 -153
- package/src/server/handlers/tools/schemas.ts +253 -253
- package/src/server/handlers/tools/search-knowledge-graph.ts +102 -102
- package/src/server/handlers/tools/smart-context.ts +146 -146
- package/src/server/handlers/tools/update-progress.ts +131 -131
- package/src/server/handlers/tools/what-if-analysis.ts +135 -135
- package/src/server/http-api.ts +693 -693
- package/src/server/index.ts +40 -40
- package/src/server/mcp-server.ts +283 -283
- package/src/server/providers/index.ts +7 -7
- package/src/server/providers/prompts.ts +327 -327
- package/src/server/providers/resources.ts +622 -622
- package/src/server/services.ts +468 -468
- package/src/server/types.ts +39 -39
- package/src/server/utils/error-handler.ts +155 -155
- package/src/server/utils/index.ts +13 -13
- package/src/server/utils/memory-indicator.ts +83 -83
- package/src/server/utils/request-context.ts +122 -122
- package/src/server/utils/response-formatter.ts +129 -129
- package/src/server/utils/validators.ts +210 -210
- package/src/setup/index.ts +48 -48
- package/src/setup/wizard.ts +461 -461
- package/src/tools/index.ts +24 -24
- package/src/tools/registry.ts +115 -115
- package/src/tools/schemas.test.ts +30 -30
- package/src/tools/schemas.ts +617 -617
- package/src/tools/types.ts +412 -412
- package/src/utils/circuit-breaker.ts +130 -130
- package/src/utils/cleanup.ts +34 -34
- package/src/utils/error-handler.ts +132 -132
- package/src/utils/error-messages.ts +60 -60
- package/src/utils/fallback.ts +45 -45
- package/src/utils/index.ts +54 -54
- package/src/utils/logger-utils.ts +80 -80
- package/src/utils/logger.ts +88 -88
- package/src/utils/phase12-helper.ts +56 -56
- package/src/utils/retry.ts +94 -94
- package/src/utils/timing.ts +47 -47
- package/src/utils/transaction.ts +63 -63
- package/src/vault/frontmatter.ts +264 -264
- package/src/vault/index.ts +318 -318
- package/src/vault/paths.ts +106 -106
- package/src/vault/query.ts +422 -422
- package/src/vault/reader.ts +264 -264
- package/src/vault/templates.ts +186 -186
- package/src/vault/types.ts +73 -73
- package/src/vault/watcher.ts +277 -277
- package/src/vault/writer.ts +413 -413
- package/tsconfig.json +30 -30
- package/src/cli/auto-update.ts +0 -157
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Start Command
|
|
3
|
-
* Starts ChromaDB + MCP server together, or just ChromaDB with --chroma-only
|
|
4
|
-
*
|
|
5
|
-
* Usage:
|
|
6
|
-
* claude-brain start Start ChromaDB + MCP server
|
|
7
|
-
* claude-brain start --chroma-only Start only ChromaDB server
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import {
|
|
11
|
-
heading, successText, warningText, dimText,
|
|
12
|
-
} from '@/cli/ui/index.js'
|
|
13
|
-
import { ensureChromaRunning } from '@/cli/commands/chroma'
|
|
14
|
-
|
|
15
|
-
export async function runStart(): Promise<void> {
|
|
16
|
-
const chromaOnly = process.argv.includes('--chroma-only')
|
|
17
|
-
|
|
18
|
-
if (chromaOnly) {
|
|
19
|
-
console.log()
|
|
20
|
-
console.log(heading('Starting ChromaDB'))
|
|
21
|
-
console.log()
|
|
22
|
-
|
|
23
|
-
const chromaReady = await ensureChromaRunning()
|
|
24
|
-
console.log()
|
|
25
|
-
|
|
26
|
-
if (chromaReady) {
|
|
27
|
-
console.log(successText('ChromaDB is running and ready.'))
|
|
28
|
-
} else {
|
|
29
|
-
console.log(warningText('ChromaDB could not be started. Check installation with: claude-brain chroma status'))
|
|
30
|
-
}
|
|
31
|
-
console.log()
|
|
32
|
-
return
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// Full start: ChromaDB + MCP server
|
|
36
|
-
// serve.ts already calls ensureChromaRunning(), so just delegate
|
|
37
|
-
console.error(dimText('Starting ChromaDB + MCP server...'))
|
|
38
|
-
console.error()
|
|
39
|
-
|
|
40
|
-
const { runServe } = await import('./serve')
|
|
41
|
-
await runServe()
|
|
42
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Start Command
|
|
3
|
+
* Starts ChromaDB + MCP server together, or just ChromaDB with --chroma-only
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* claude-brain start Start ChromaDB + MCP server
|
|
7
|
+
* claude-brain start --chroma-only Start only ChromaDB server
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
heading, successText, warningText, dimText,
|
|
12
|
+
} from '@/cli/ui/index.js'
|
|
13
|
+
import { ensureChromaRunning } from '@/cli/commands/chroma'
|
|
14
|
+
|
|
15
|
+
export async function runStart(): Promise<void> {
|
|
16
|
+
const chromaOnly = process.argv.includes('--chroma-only')
|
|
17
|
+
|
|
18
|
+
if (chromaOnly) {
|
|
19
|
+
console.log()
|
|
20
|
+
console.log(heading('Starting ChromaDB'))
|
|
21
|
+
console.log()
|
|
22
|
+
|
|
23
|
+
const chromaReady = await ensureChromaRunning()
|
|
24
|
+
console.log()
|
|
25
|
+
|
|
26
|
+
if (chromaReady) {
|
|
27
|
+
console.log(successText('ChromaDB is running and ready.'))
|
|
28
|
+
} else {
|
|
29
|
+
console.log(warningText('ChromaDB could not be started. Check installation with: claude-brain chroma status'))
|
|
30
|
+
}
|
|
31
|
+
console.log()
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Full start: ChromaDB + MCP server
|
|
36
|
+
// serve.ts already calls ensureChromaRunning(), so just delegate
|
|
37
|
+
console.error(dimText('Starting ChromaDB + MCP server...'))
|
|
38
|
+
console.error()
|
|
39
|
+
|
|
40
|
+
const { runServe } = await import('./serve')
|
|
41
|
+
await runServe()
|
|
42
|
+
}
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
import { execSync } from 'node:child_process'
|
|
2
|
-
import {
|
|
3
|
-
renderLogo, theme, heading, successText, errorText, dimText,
|
|
4
|
-
box, withSpinner,
|
|
5
|
-
} from '@/cli/ui/index.js'
|
|
6
|
-
|
|
7
|
-
export async function runUninstall() {
|
|
8
|
-
console.log()
|
|
9
|
-
console.log(renderLogo())
|
|
10
|
-
console.log()
|
|
11
|
-
console.log(heading('MCP Uninstall'))
|
|
12
|
-
console.log()
|
|
13
|
-
|
|
14
|
-
try {
|
|
15
|
-
await withSpinner('Removing Claude Brain from Claude Code', async () => {
|
|
16
|
-
try {
|
|
17
|
-
execSync('claude mcp remove claude-brain', {
|
|
18
|
-
encoding: 'utf-8',
|
|
19
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
20
|
-
})
|
|
21
|
-
} catch {
|
|
22
|
-
// Falls back to scoped removal when registered in multiple scopes
|
|
23
|
-
execSync('claude mcp remove claude-brain -s local', {
|
|
24
|
-
encoding: 'utf-8',
|
|
25
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
26
|
-
})
|
|
27
|
-
}
|
|
28
|
-
})
|
|
29
|
-
console.log()
|
|
30
|
-
console.log(box(successText('Claude Brain MCP server removed from Claude Code.'), 'Success'))
|
|
31
|
-
} catch {
|
|
32
|
-
console.log()
|
|
33
|
-
console.log(box([
|
|
34
|
-
errorText('Failed to remove automatically.'),
|
|
35
|
-
'',
|
|
36
|
-
dimText('Run manually:'),
|
|
37
|
-
` ${theme.bold('claude mcp remove claude-brain')}`,
|
|
38
|
-
].join('\n'), 'Error'))
|
|
39
|
-
}
|
|
40
|
-
console.log()
|
|
41
|
-
}
|
|
1
|
+
import { execSync } from 'node:child_process'
|
|
2
|
+
import {
|
|
3
|
+
renderLogo, theme, heading, successText, errorText, dimText,
|
|
4
|
+
box, withSpinner,
|
|
5
|
+
} from '@/cli/ui/index.js'
|
|
6
|
+
|
|
7
|
+
export async function runUninstall() {
|
|
8
|
+
console.log()
|
|
9
|
+
console.log(renderLogo())
|
|
10
|
+
console.log()
|
|
11
|
+
console.log(heading('MCP Uninstall'))
|
|
12
|
+
console.log()
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
await withSpinner('Removing Claude Brain from Claude Code', async () => {
|
|
16
|
+
try {
|
|
17
|
+
execSync('claude mcp remove claude-brain', {
|
|
18
|
+
encoding: 'utf-8',
|
|
19
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
20
|
+
})
|
|
21
|
+
} catch {
|
|
22
|
+
// Falls back to scoped removal when registered in multiple scopes
|
|
23
|
+
execSync('claude mcp remove claude-brain -s local', {
|
|
24
|
+
encoding: 'utf-8',
|
|
25
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
26
|
+
})
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
console.log()
|
|
30
|
+
console.log(box(successText('Claude Brain MCP server removed from Claude Code.'), 'Success'))
|
|
31
|
+
} catch {
|
|
32
|
+
console.log()
|
|
33
|
+
console.log(box([
|
|
34
|
+
errorText('Failed to remove automatically.'),
|
|
35
|
+
'',
|
|
36
|
+
dimText('Run manually:'),
|
|
37
|
+
` ${theme.bold('claude mcp remove claude-brain')}`,
|
|
38
|
+
].join('\n'), 'Error'))
|
|
39
|
+
}
|
|
40
|
+
console.log()
|
|
41
|
+
}
|
|
@@ -1,121 +1,124 @@
|
|
|
1
|
-
import { execSync } from 'node:child_process'
|
|
2
|
-
import { existsSync, readFileSync } from 'node:fs'
|
|
3
|
-
import fs from 'fs/promises'
|
|
4
|
-
import path from 'path'
|
|
5
|
-
import os from 'os'
|
|
6
|
-
import { fileURLToPath } from 'url'
|
|
7
|
-
import {
|
|
8
|
-
renderLogo, theme, heading, successText, warningText, dimText,
|
|
9
|
-
box, withSpinner,
|
|
10
|
-
} from '@/cli/ui/index.js'
|
|
11
|
-
|
|
12
|
-
const __filename = fileURLToPath(import.meta.url)
|
|
13
|
-
const __dirname = path.dirname(__filename)
|
|
14
|
-
const PACKAGE_ROOT = path.resolve(__dirname, '..', '..', '..')
|
|
15
|
-
|
|
16
|
-
function getInstalledVersion(): string {
|
|
17
|
-
try {
|
|
18
|
-
const pkg = JSON.parse(readFileSync(path.join(PACKAGE_ROOT, 'package.json'), 'utf-8'))
|
|
19
|
-
return pkg.version || 'unknown'
|
|
20
|
-
} catch {
|
|
21
|
-
return 'unknown'
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function getLatestVersion(): string | null {
|
|
26
|
-
try {
|
|
27
|
-
const result = execSync('npm view claude-brain version', {
|
|
28
|
-
encoding: 'utf-8',
|
|
29
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
30
|
-
})
|
|
31
|
-
return result.trim()
|
|
32
|
-
} catch {
|
|
33
|
-
return null
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export async function runUpdate() {
|
|
38
|
-
console.log()
|
|
39
|
-
console.log(renderLogo())
|
|
40
|
-
console.log()
|
|
41
|
-
console.log(heading('Update Claude Brain'))
|
|
42
|
-
console.log()
|
|
43
|
-
|
|
44
|
-
const currentVersion = getInstalledVersion()
|
|
45
|
-
console.log(` ${theme.bold('Installed:')} ${dimText('v' + currentVersion)}`)
|
|
46
|
-
|
|
47
|
-
const latestVersion = await withSpinner('Checking for updates', () => getLatestVersion())
|
|
48
|
-
|
|
49
|
-
if (latestVersion) {
|
|
50
|
-
console.log(` ${theme.bold('Latest:')} ${dimText('v' + latestVersion)}`)
|
|
51
|
-
}
|
|
52
|
-
console.log()
|
|
53
|
-
|
|
54
|
-
// Step 1: Update package if newer version available
|
|
55
|
-
if (latestVersion && latestVersion !== currentVersion) {
|
|
56
|
-
try {
|
|
57
|
-
await withSpinner(`Updating claude-brain to v${latestVersion}`, () => {
|
|
58
|
-
execSync('bun update -g claude-brain', {
|
|
59
|
-
encoding: 'utf-8',
|
|
60
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
61
|
-
})
|
|
62
|
-
})
|
|
63
|
-
console.log(successText(` Updated to v${latestVersion}`))
|
|
64
|
-
} catch {
|
|
65
|
-
console.log(warningText(' Package update failed. Try manually: bun update -g claude-brain'))
|
|
66
|
-
}
|
|
67
|
-
} else {
|
|
68
|
-
console.log(successText(' Package is up to date'))
|
|
69
|
-
}
|
|
70
|
-
console.log()
|
|
71
|
-
|
|
72
|
-
// Step 2: Update CLAUDE.md to ~/.claude/CLAUDE.md (where Claude Code reads it)
|
|
73
|
-
const sourcePath = path.join(PACKAGE_ROOT, 'assets', 'CLAUDE.md')
|
|
74
|
-
const claudeDir = path.join(os.homedir(), '.claude')
|
|
75
|
-
const destPath = path.join(claudeDir, 'CLAUDE.md')
|
|
76
|
-
|
|
77
|
-
if (!existsSync(sourcePath)) {
|
|
78
|
-
console.log(warningText(' CLAUDE.md asset not found in package, skipping'))
|
|
79
|
-
} else if (!existsSync(destPath)) {
|
|
80
|
-
await withSpinner('Installing CLAUDE.md (brain works automatically)', async () => {
|
|
81
|
-
await fs.mkdir(claudeDir, { recursive: true })
|
|
82
|
-
await fs.copyFile(sourcePath, destPath)
|
|
83
|
-
})
|
|
84
|
-
console.log(successText(' CLAUDE.md installed to ~/.claude/CLAUDE.md (brain is now automatic)'))
|
|
85
|
-
} else {
|
|
86
|
-
const sourceContent = readFileSync(sourcePath, 'utf-8')
|
|
87
|
-
const destContent = readFileSync(destPath, 'utf-8')
|
|
88
|
-
|
|
89
|
-
if (sourceContent === destContent) {
|
|
90
|
-
console.log(successText(' CLAUDE.md is already up to date'))
|
|
91
|
-
} else {
|
|
92
|
-
await withSpinner('Updating CLAUDE.md', async () => {
|
|
93
|
-
await fs.copyFile(sourcePath, destPath)
|
|
94
|
-
})
|
|
95
|
-
console.log(successText(' CLAUDE.md updated to ~/.claude/CLAUDE.md (brain is now automatic)'))
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Clean up old ~/CLAUDE.md if it exists (from previous versions)
|
|
100
|
-
const oldDestPath = path.join(os.homedir(), 'CLAUDE.md')
|
|
101
|
-
if (existsSync(oldDestPath)) {
|
|
102
|
-
try {
|
|
103
|
-
const oldContent = readFileSync(oldDestPath, 'utf-8')
|
|
104
|
-
if (oldContent.includes('Claude Brain')) {
|
|
105
|
-
await fs.unlink(oldDestPath)
|
|
106
|
-
console.log(dimText(' Removed old ~/CLAUDE.md (migrated to ~/.claude/)'))
|
|
107
|
-
}
|
|
108
|
-
} catch {
|
|
109
|
-
// ignore cleanup errors
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
console.log()
|
|
114
|
-
console.log(box([
|
|
115
|
-
heading('Update complete!'),
|
|
116
|
-
'',
|
|
117
|
-
dimText('Run health check to verify:'),
|
|
118
|
-
` ${theme.bold('claude-brain health')}`,
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
1
|
+
import { execSync } from 'node:child_process'
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
3
|
+
import fs from 'fs/promises'
|
|
4
|
+
import path from 'path'
|
|
5
|
+
import os from 'os'
|
|
6
|
+
import { fileURLToPath } from 'url'
|
|
7
|
+
import {
|
|
8
|
+
renderLogo, theme, heading, successText, warningText, dimText,
|
|
9
|
+
box, withSpinner,
|
|
10
|
+
} from '@/cli/ui/index.js'
|
|
11
|
+
|
|
12
|
+
const __filename = fileURLToPath(import.meta.url)
|
|
13
|
+
const __dirname = path.dirname(__filename)
|
|
14
|
+
const PACKAGE_ROOT = path.resolve(__dirname, '..', '..', '..')
|
|
15
|
+
|
|
16
|
+
function getInstalledVersion(): string {
|
|
17
|
+
try {
|
|
18
|
+
const pkg = JSON.parse(readFileSync(path.join(PACKAGE_ROOT, 'package.json'), 'utf-8'))
|
|
19
|
+
return pkg.version || 'unknown'
|
|
20
|
+
} catch {
|
|
21
|
+
return 'unknown'
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function getLatestVersion(): string | null {
|
|
26
|
+
try {
|
|
27
|
+
const result = execSync('npm view claude-brain version', {
|
|
28
|
+
encoding: 'utf-8',
|
|
29
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
30
|
+
})
|
|
31
|
+
return result.trim()
|
|
32
|
+
} catch {
|
|
33
|
+
return null
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export async function runUpdate() {
|
|
38
|
+
console.log()
|
|
39
|
+
console.log(renderLogo())
|
|
40
|
+
console.log()
|
|
41
|
+
console.log(heading('Update Claude Brain'))
|
|
42
|
+
console.log()
|
|
43
|
+
|
|
44
|
+
const currentVersion = getInstalledVersion()
|
|
45
|
+
console.log(` ${theme.bold('Installed:')} ${dimText('v' + currentVersion)}`)
|
|
46
|
+
|
|
47
|
+
const latestVersion = await withSpinner('Checking for updates', () => getLatestVersion())
|
|
48
|
+
|
|
49
|
+
if (latestVersion) {
|
|
50
|
+
console.log(` ${theme.bold('Latest:')} ${dimText('v' + latestVersion)}`)
|
|
51
|
+
}
|
|
52
|
+
console.log()
|
|
53
|
+
|
|
54
|
+
// Step 1: Update package if newer version available
|
|
55
|
+
if (latestVersion && latestVersion !== currentVersion) {
|
|
56
|
+
try {
|
|
57
|
+
await withSpinner(`Updating claude-brain to v${latestVersion}`, () => {
|
|
58
|
+
execSync('bun update -g claude-brain', {
|
|
59
|
+
encoding: 'utf-8',
|
|
60
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
61
|
+
})
|
|
62
|
+
})
|
|
63
|
+
console.log(successText(` Updated to v${latestVersion}`))
|
|
64
|
+
} catch {
|
|
65
|
+
console.log(warningText(' Package update failed. Try manually: bun update -g claude-brain'))
|
|
66
|
+
}
|
|
67
|
+
} else {
|
|
68
|
+
console.log(successText(' Package is up to date'))
|
|
69
|
+
}
|
|
70
|
+
console.log()
|
|
71
|
+
|
|
72
|
+
// Step 2: Update CLAUDE.md to ~/.claude/CLAUDE.md (where Claude Code reads it)
|
|
73
|
+
const sourcePath = path.join(PACKAGE_ROOT, 'assets', 'CLAUDE.md')
|
|
74
|
+
const claudeDir = path.join(os.homedir(), '.claude')
|
|
75
|
+
const destPath = path.join(claudeDir, 'CLAUDE.md')
|
|
76
|
+
|
|
77
|
+
if (!existsSync(sourcePath)) {
|
|
78
|
+
console.log(warningText(' CLAUDE.md asset not found in package, skipping'))
|
|
79
|
+
} else if (!existsSync(destPath)) {
|
|
80
|
+
await withSpinner('Installing CLAUDE.md (brain works automatically)', async () => {
|
|
81
|
+
await fs.mkdir(claudeDir, { recursive: true })
|
|
82
|
+
await fs.copyFile(sourcePath, destPath)
|
|
83
|
+
})
|
|
84
|
+
console.log(successText(' CLAUDE.md installed to ~/.claude/CLAUDE.md (brain is now automatic)'))
|
|
85
|
+
} else {
|
|
86
|
+
const sourceContent = readFileSync(sourcePath, 'utf-8')
|
|
87
|
+
const destContent = readFileSync(destPath, 'utf-8')
|
|
88
|
+
|
|
89
|
+
if (sourceContent === destContent) {
|
|
90
|
+
console.log(successText(' CLAUDE.md is already up to date'))
|
|
91
|
+
} else {
|
|
92
|
+
await withSpinner('Updating CLAUDE.md', async () => {
|
|
93
|
+
await fs.copyFile(sourcePath, destPath)
|
|
94
|
+
})
|
|
95
|
+
console.log(successText(' CLAUDE.md updated to ~/.claude/CLAUDE.md (brain is now automatic)'))
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Clean up old ~/CLAUDE.md if it exists (from previous versions)
|
|
100
|
+
const oldDestPath = path.join(os.homedir(), 'CLAUDE.md')
|
|
101
|
+
if (existsSync(oldDestPath)) {
|
|
102
|
+
try {
|
|
103
|
+
const oldContent = readFileSync(oldDestPath, 'utf-8')
|
|
104
|
+
if (oldContent.includes('Claude Brain')) {
|
|
105
|
+
await fs.unlink(oldDestPath)
|
|
106
|
+
console.log(dimText(' Removed old ~/CLAUDE.md (migrated to ~/.claude/)'))
|
|
107
|
+
}
|
|
108
|
+
} catch {
|
|
109
|
+
// ignore cleanup errors
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
console.log()
|
|
114
|
+
console.log(box([
|
|
115
|
+
heading('Update complete!'),
|
|
116
|
+
'',
|
|
117
|
+
dimText('Run health check to verify:'),
|
|
118
|
+
` ${theme.bold('claude-brain health')}`,
|
|
119
|
+
'',
|
|
120
|
+
dimText('For a full kill + update + restart:'),
|
|
121
|
+
` ${theme.bold('claude-brain refresh')}`,
|
|
122
|
+
].join('\n'), 'Done'))
|
|
123
|
+
console.log()
|
|
124
|
+
}
|
package/src/cli/diagnose.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
import { runDiagnostics } from '@/diagnostics'
|
|
3
|
-
|
|
4
|
-
runDiagnostics()
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { runDiagnostics } from '@/diagnostics'
|
|
3
|
+
|
|
4
|
+
runDiagnostics()
|
package/src/cli/health-check.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
import { runHealthCheck } from '@/health'
|
|
3
|
-
|
|
4
|
-
runHealthCheck()
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { runHealthCheck } from '@/health'
|
|
3
|
+
|
|
4
|
+
runHealthCheck()
|
|
@@ -1,106 +1,106 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
|
|
3
|
-
import { MemoryManager } from '@/memory'
|
|
4
|
-
import { createLogger } from '@/utils'
|
|
5
|
-
import fs from 'node:fs/promises'
|
|
6
|
-
|
|
7
|
-
// Parse CLI arguments (simple argv parsing)
|
|
8
|
-
const args = process.argv.slice(2)
|
|
9
|
-
const options = {
|
|
10
|
-
batchSize: 100,
|
|
11
|
-
validateAfter: false,
|
|
12
|
-
verbose: false
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
for (const arg of args) {
|
|
16
|
-
if (arg === '--validate-after') options.validateAfter = true
|
|
17
|
-
if (arg === '--verbose') options.verbose = true
|
|
18
|
-
const batchMatch = arg.match(/--batch-size=(\d+)/)
|
|
19
|
-
if (batchMatch) options.batchSize = parseInt(batchMatch[1])
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// Create dedicated migration logger
|
|
23
|
-
const logger = createLogger('info', './logs/migration.log')
|
|
24
|
-
|
|
25
|
-
async function main() {
|
|
26
|
-
const startTime = Date.now()
|
|
27
|
-
|
|
28
|
-
console.log('š¦ SQLite ā ChromaDB Migration\n')
|
|
29
|
-
|
|
30
|
-
// Ensure logs directory exists
|
|
31
|
-
await fs.mkdir('./logs', { recursive: true })
|
|
32
|
-
|
|
33
|
-
// Initialize MemoryManager with ChromaDB enabled
|
|
34
|
-
if (options.verbose) {
|
|
35
|
-
console.log('ā³ Initializing MemoryManager...')
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const memoryManager = new MemoryManager(
|
|
39
|
-
'./data/memory.db',
|
|
40
|
-
logger,
|
|
41
|
-
true // useChromaDB = true
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
await memoryManager.initialize()
|
|
45
|
-
|
|
46
|
-
// Clear existing collections to avoid embedding function conflicts
|
|
47
|
-
if (options.verbose) {
|
|
48
|
-
console.log('ā³ Clearing existing ChromaDB collections...')
|
|
49
|
-
}
|
|
50
|
-
await memoryManager.chroma.collections.clearAll()
|
|
51
|
-
|
|
52
|
-
// Check ChromaDB connection
|
|
53
|
-
if (options.verbose) {
|
|
54
|
-
console.log('ā³ Verifying ChromaDB connection...')
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const healthy = await memoryManager.chroma.healthCheck()
|
|
58
|
-
if (!healthy) {
|
|
59
|
-
console.error('ā ChromaDB health check failed')
|
|
60
|
-
logger.error('ChromaDB health check failed')
|
|
61
|
-
process.exit(1)
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (options.verbose) {
|
|
65
|
-
console.log('ā
ChromaDB connected')
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Get SQLite stats before migration
|
|
69
|
-
const sqliteStats = memoryManager.database.getStats()
|
|
70
|
-
console.log(`š SQLite Database: ${sqliteStats.decisions} decisions, ${sqliteStats.memories} memories\n`)
|
|
71
|
-
|
|
72
|
-
// Run migration
|
|
73
|
-
console.log('š Starting migration...\n')
|
|
74
|
-
|
|
75
|
-
const stats = await memoryManager.migrateToChromaDB({
|
|
76
|
-
batchSize: options.batchSize,
|
|
77
|
-
validateAfter: options.validateAfter,
|
|
78
|
-
skipExisting: false, // Always migrate, don't skip
|
|
79
|
-
dryRun: false
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
const duration = Date.now() - startTime
|
|
83
|
-
|
|
84
|
-
// Display results
|
|
85
|
-
console.log('\nā
Migration completed!')
|
|
86
|
-
console.log(` Duration: ${(duration / 1000).toFixed(2)}s`)
|
|
87
|
-
console.log(` Decisions: ${stats.migratedDecisions}/${stats.totalDecisions} (${stats.failedDecisions} failed)`)
|
|
88
|
-
console.log(` Memories: ${stats.migratedMemories}/${stats.totalMemories} (${stats.failedMemories} failed)`)
|
|
89
|
-
|
|
90
|
-
if (options.validateAfter) {
|
|
91
|
-
console.log('\nš Validation passed ā')
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
await memoryManager.close()
|
|
95
|
-
|
|
96
|
-
logger.info({
|
|
97
|
-
stats,
|
|
98
|
-
duration
|
|
99
|
-
}, 'Migration completed successfully')
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
main().catch(error => {
|
|
103
|
-
console.error('\nā Migration failed:', error.message)
|
|
104
|
-
logger.error({ error }, 'Migration failed')
|
|
105
|
-
process.exit(1)
|
|
106
|
-
})
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
import { MemoryManager } from '@/memory'
|
|
4
|
+
import { createLogger } from '@/utils'
|
|
5
|
+
import fs from 'node:fs/promises'
|
|
6
|
+
|
|
7
|
+
// Parse CLI arguments (simple argv parsing)
|
|
8
|
+
const args = process.argv.slice(2)
|
|
9
|
+
const options = {
|
|
10
|
+
batchSize: 100,
|
|
11
|
+
validateAfter: false,
|
|
12
|
+
verbose: false
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
for (const arg of args) {
|
|
16
|
+
if (arg === '--validate-after') options.validateAfter = true
|
|
17
|
+
if (arg === '--verbose') options.verbose = true
|
|
18
|
+
const batchMatch = arg.match(/--batch-size=(\d+)/)
|
|
19
|
+
if (batchMatch) options.batchSize = parseInt(batchMatch[1])
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Create dedicated migration logger
|
|
23
|
+
const logger = createLogger('info', './logs/migration.log')
|
|
24
|
+
|
|
25
|
+
async function main() {
|
|
26
|
+
const startTime = Date.now()
|
|
27
|
+
|
|
28
|
+
console.log('š¦ SQLite ā ChromaDB Migration\n')
|
|
29
|
+
|
|
30
|
+
// Ensure logs directory exists
|
|
31
|
+
await fs.mkdir('./logs', { recursive: true })
|
|
32
|
+
|
|
33
|
+
// Initialize MemoryManager with ChromaDB enabled
|
|
34
|
+
if (options.verbose) {
|
|
35
|
+
console.log('ā³ Initializing MemoryManager...')
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const memoryManager = new MemoryManager(
|
|
39
|
+
'./data/memory.db',
|
|
40
|
+
logger,
|
|
41
|
+
true // useChromaDB = true
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
await memoryManager.initialize()
|
|
45
|
+
|
|
46
|
+
// Clear existing collections to avoid embedding function conflicts
|
|
47
|
+
if (options.verbose) {
|
|
48
|
+
console.log('ā³ Clearing existing ChromaDB collections...')
|
|
49
|
+
}
|
|
50
|
+
await memoryManager.chroma.collections.clearAll()
|
|
51
|
+
|
|
52
|
+
// Check ChromaDB connection
|
|
53
|
+
if (options.verbose) {
|
|
54
|
+
console.log('ā³ Verifying ChromaDB connection...')
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const healthy = await memoryManager.chroma.healthCheck()
|
|
58
|
+
if (!healthy) {
|
|
59
|
+
console.error('ā ChromaDB health check failed')
|
|
60
|
+
logger.error('ChromaDB health check failed')
|
|
61
|
+
process.exit(1)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (options.verbose) {
|
|
65
|
+
console.log('ā
ChromaDB connected')
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Get SQLite stats before migration
|
|
69
|
+
const sqliteStats = memoryManager.database.getStats()
|
|
70
|
+
console.log(`š SQLite Database: ${sqliteStats.decisions} decisions, ${sqliteStats.memories} memories\n`)
|
|
71
|
+
|
|
72
|
+
// Run migration
|
|
73
|
+
console.log('š Starting migration...\n')
|
|
74
|
+
|
|
75
|
+
const stats = await memoryManager.migrateToChromaDB({
|
|
76
|
+
batchSize: options.batchSize,
|
|
77
|
+
validateAfter: options.validateAfter,
|
|
78
|
+
skipExisting: false, // Always migrate, don't skip
|
|
79
|
+
dryRun: false
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
const duration = Date.now() - startTime
|
|
83
|
+
|
|
84
|
+
// Display results
|
|
85
|
+
console.log('\nā
Migration completed!')
|
|
86
|
+
console.log(` Duration: ${(duration / 1000).toFixed(2)}s`)
|
|
87
|
+
console.log(` Decisions: ${stats.migratedDecisions}/${stats.totalDecisions} (${stats.failedDecisions} failed)`)
|
|
88
|
+
console.log(` Memories: ${stats.migratedMemories}/${stats.totalMemories} (${stats.failedMemories} failed)`)
|
|
89
|
+
|
|
90
|
+
if (options.validateAfter) {
|
|
91
|
+
console.log('\nš Validation passed ā')
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
await memoryManager.close()
|
|
95
|
+
|
|
96
|
+
logger.info({
|
|
97
|
+
stats,
|
|
98
|
+
duration
|
|
99
|
+
}, 'Migration completed successfully')
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
main().catch(error => {
|
|
103
|
+
console.error('\nā Migration failed:', error.message)
|
|
104
|
+
logger.error({ error }, 'Migration failed')
|
|
105
|
+
process.exit(1)
|
|
106
|
+
})
|
package/src/cli/setup.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
import { runSetup } from '@/setup'
|
|
3
|
-
|
|
4
|
-
runSetup()
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { runSetup } from '@/setup'
|
|
3
|
+
|
|
4
|
+
runSetup()
|