claude-brain 0.30.2 → 0.30.3
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 +241 -191
- package/VERSION +1 -1
- package/assets/CLAUDE-unified.md +11 -11
- package/assets/CLAUDE.md +29 -29
- package/package.json +7 -3
- 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 +531 -531
- package/src/automation/decision-detector.ts +452 -452
- 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 +210 -205
- package/src/cli/auto-setup.ts +75 -75
- package/src/cli/auto-start.ts +266 -266
- package/src/cli/bin.ts +264 -264
- package/src/cli/commands/autostart.ts +90 -90
- package/src/cli/commands/chroma.ts +578 -577
- package/src/cli/commands/export-training.ts +70 -70
- package/src/cli/commands/export.ts +130 -130
- package/src/cli/commands/git-hook.ts +183 -183
- package/src/cli/commands/hooks.ts +217 -217
- package/src/cli/commands/init.ts +123 -123
- package/src/cli/commands/install-mcp.ts +122 -111
- package/src/cli/commands/models.ts +979 -979
- package/src/cli/commands/pack.ts +200 -200
- package/src/cli/commands/refresh.ts +344 -339
- package/src/cli/commands/reindex.ts +120 -120
- package/src/cli/commands/serve.ts +466 -463
- package/src/cli/commands/start.ts +44 -44
- package/src/cli/commands/status.ts +220 -203
- package/src/cli/commands/uninstall-mcp.ts +45 -41
- package/src/cli/commands/update.ts +130 -124
- package/src/cli/migrate-chroma.ts +106 -106
- 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/code-intelligence/indexer.ts +352 -352
- package/src/code-intelligence/linker.ts +178 -178
- package/src/code-intelligence/parser.ts +484 -484
- package/src/code-intelligence/query.ts +291 -291
- package/src/code-intelligence/schema.ts +83 -83
- package/src/code-intelligence/types.ts +95 -95
- package/src/config/defaults.ts +52 -52
- package/src/config/home.ts +56 -56
- package/src/config/index.ts +5 -5
- package/src/config/loader.ts +192 -192
- package/src/config/schema.ts +446 -415
- package/src/config/validator.ts +182 -182
- package/src/context/assembler.ts +407 -400
- package/src/context/index.ts +79 -79
- package/src/context/progress-tracker.ts +174 -174
- package/src/context/standards-manager.ts +287 -287
- package/src/context/validator.ts +58 -58
- package/src/diagnostics/index.ts +122 -121
- package/src/health/index.ts +233 -232
- package/src/hooks/brain-hook.ts +134 -131
- package/src/hooks/capture.ts +168 -168
- package/src/hooks/claude-code-mastery.md +112 -112
- package/src/hooks/context-hook.ts +260 -245
- package/src/hooks/deduplicator.ts +72 -72
- package/src/hooks/git-capture.ts +109 -109
- package/src/hooks/git-hook-installer.ts +211 -207
- package/src/hooks/index.ts +20 -20
- package/src/hooks/installer.ts +306 -288
- package/src/hooks/interceptor-hook.ts +204 -201
- package/src/hooks/passive-classifier.ts +397 -397
- package/src/hooks/queue.ts +160 -129
- package/src/hooks/session-tracker.ts +312 -312
- package/src/hooks/types.ts +52 -52
- package/src/index.ts +7 -7
- package/src/intelligence/cross-project/generalizer.ts +283 -283
- package/src/intelligence/cross-project/index.ts +7 -7
- package/src/intelligence/hf-downloader.ts +222 -222
- package/src/intelligence/hf-manifest.json +78 -78
- package/src/intelligence/index.ts +24 -24
- package/src/intelligence/inference-router.ts +762 -762
- package/src/intelligence/model-manager.ts +263 -245
- package/src/intelligence/optimization/index.ts +10 -10
- package/src/intelligence/optimization/precompute.ts +202 -202
- package/src/intelligence/optimization/semantic-cache.ts +213 -207
- package/src/intelligence/prediction/index.ts +7 -7
- package/src/intelligence/prediction/recommender.ts +276 -268
- package/src/intelligence/reasoning/chain-retrieval.ts +243 -247
- package/src/intelligence/reasoning/index.ts +7 -7
- package/src/intelligence/temporal/evolution.ts +193 -197
- package/src/intelligence/temporal/index.ts +16 -16
- package/src/intelligence/temporal/query-processor.ts +190 -190
- package/src/intelligence/temporal/timeline.ts +272 -259
- package/src/intelligence/temporal/trends.ts +263 -263
- package/src/intelligence/tokenizer.ts +118 -118
- package/src/knowledge/entity-extractor.ts +447 -443
- 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 +166 -166
- package/src/knowledge/relationship-extractor.ts +108 -108
- package/src/memory/chroma/client.ts +211 -192
- package/src/memory/chroma/collection-manager.ts +92 -92
- package/src/memory/chroma/config.ts +57 -57
- package/src/memory/chroma/embeddings.ts +177 -175
- 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 +319 -315
- package/src/memory/chroma/store.ts +755 -747
- package/src/memory/compression.ts +121 -121
- package/src/memory/consolidation/archiver.ts +162 -165
- package/src/memory/consolidation/merger.ts +182 -186
- package/src/memory/consolidation/scorer.ts +136 -136
- package/src/memory/database.ts +9 -0
- package/src/memory/dual-write.ts +145 -0
- package/src/memory/embeddings.ts +226 -226
- package/src/memory/episodic/detector.ts +108 -108
- package/src/memory/episodic/manager.ts +347 -351
- package/src/memory/episodic/summarizer.ts +179 -179
- package/src/memory/episodic/types.ts +52 -52
- package/src/memory/fts5-search.ts +692 -633
- package/src/memory/index.ts +943 -1060
- package/src/memory/migrations/add-fts5.ts +118 -108
- package/src/memory/patterns.ts +438 -438
- package/src/memory/pruning.ts +60 -60
- package/src/memory/schema.ts +88 -88
- package/src/memory/store.ts +911 -787
- package/src/orchestrator/handlers/decision-handler.ts +204 -204
- 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 -297
- package/src/retrieval/bm25/tokenizer.ts +184 -184
- package/src/retrieval/feedback/adaptive.ts +221 -221
- package/src/retrieval/feedback/index.ts +16 -16
- package/src/retrieval/feedback/metrics.ts +221 -221
- package/src/retrieval/feedback/store.ts +283 -283
- package/src/retrieval/fusion/index.ts +194 -194
- package/src/retrieval/fusion/rrf.ts +165 -165
- package/src/retrieval/index.ts +12 -12
- package/src/retrieval/pipeline.ts +375 -375
- package/src/retrieval/query/expander.ts +203 -203
- package/src/retrieval/query/index.ts +27 -27
- package/src/retrieval/query/intent-classifier.ts +252 -252
- package/src/retrieval/query/temporal-parser.ts +295 -295
- package/src/retrieval/reranker/index.ts +189 -188
- package/src/retrieval/reranker/model.ts +99 -95
- package/src/retrieval/service.ts +125 -125
- package/src/retrieval/types.ts +162 -162
- package/src/routing/entity-extractor.ts +454 -454
- package/src/routing/handlers/exploration-handler.ts +369 -0
- package/src/routing/handlers/index.ts +19 -0
- package/src/routing/handlers/memory-handler.ts +273 -0
- package/src/routing/handlers/mutation-handler.ts +241 -0
- package/src/routing/handlers/recall-handler.ts +642 -0
- package/src/routing/handlers/shared.ts +515 -0
- package/src/routing/handlers/types.ts +48 -0
- package/src/routing/intent-classifier.ts +552 -552
- package/src/routing/response-filter.ts +399 -391
- package/src/routing/router.ts +245 -2193
- package/src/routing/search-engine.ts +521 -514
- package/src/routing/types.ts +104 -94
- package/src/scripts/health-check.ts +118 -118
- package/src/scripts/setup.ts +122 -122
- package/src/server/auto-updater.ts +283 -276
- package/src/server/handlers/call-tool.ts +159 -159
- package/src/server/handlers/list-tools.ts +35 -35
- package/src/server/handlers/tools/auto-remember.ts +165 -165
- package/src/server/handlers/tools/brain.ts +86 -86
- package/src/server/handlers/tools/create-project.ts +135 -135
- package/src/server/handlers/tools/get-code-standards.ts +123 -123
- package/src/server/handlers/tools/get-corrections.ts +152 -152
- package/src/server/handlers/tools/get-patterns.ts +156 -156
- package/src/server/handlers/tools/get-project-context.ts +75 -75
- package/src/server/handlers/tools/index.ts +30 -30
- package/src/server/handlers/tools/init-project.ts +756 -756
- package/src/server/handlers/tools/list-projects.ts +126 -126
- package/src/server/handlers/tools/recall-similar.ts +87 -87
- package/src/server/handlers/tools/recognize-pattern.ts +132 -132
- package/src/server/handlers/tools/record-correction.ts +131 -131
- package/src/server/handlers/tools/remember-decision.ts +168 -168
- package/src/server/handlers/tools/schemas.ts +179 -179
- package/src/server/handlers/tools/search-code.ts +122 -122
- package/src/server/handlers/tools/smart-context.ts +146 -146
- package/src/server/handlers/tools/update-progress.ts +131 -131
- package/src/server/http-api.ts +215 -1229
- package/src/server/mcp-proxy.ts +85 -84
- package/src/server/mcp-server.ts +285 -284
- package/src/server/middleware/auth.ts +39 -0
- package/src/server/middleware/error-handler.ts +37 -0
- package/src/server/middleware/rate-limit.ts +53 -0
- package/src/server/middleware/validate.ts +42 -0
- package/src/server/pid-manager.ts +137 -136
- package/src/server/providers/resources.ts +581 -581
- package/src/server/routes/code.ts +228 -0
- package/src/server/routes/context.ts +26 -0
- package/src/server/routes/health.ts +19 -0
- package/src/server/routes/helpers.ts +100 -0
- package/src/server/routes/hooks.ts +197 -0
- package/src/server/routes/mcp.ts +47 -0
- package/src/server/routes/memory.ts +397 -0
- package/src/server/routes/models.ts +96 -0
- package/src/server/routes/projects.ts +89 -0
- package/src/server/routes/types.ts +21 -0
- package/src/server/schemas/api-schemas.ts +202 -0
- package/src/server/services.ts +720 -720
- package/src/server/utils/memory-indicator.ts +84 -84
- package/src/server/utils/response-formatter.ts +129 -129
- package/src/server/web-viewer.ts +1145 -1115
- package/src/setup/index.ts +38 -38
- package/src/tools/registry.ts +115 -115
- package/src/tools/schemas.ts +666 -666
- package/src/tools/types.ts +412 -412
- package/src/training/data-store.ts +320 -298
- package/src/training/retrain-pipeline.ts +399 -394
- package/src/utils/error-handler.ts +136 -136
- package/src/utils/index.ts +58 -58
- package/src/utils/kill-port.ts +55 -53
- package/src/utils/phase12-helper.ts +56 -56
- package/src/utils/safe-path.ts +43 -0
- package/src/utils/timing.ts +47 -47
- package/src/utils/transaction.ts +63 -63
- package/src/vault/index.ts +4 -3
- package/src/vault/paths.ts +106 -106
- package/src/vault/query.ts +4 -1
- package/src/vault/reader.ts +44 -1
- package/src/vault/watcher.ts +24 -1
- package/src/vault/writer.ts +487 -413
- package/skills/persistent-memory/SKILL.md +0 -148
- package/skills/persistent-memory/references/tool-reference.md +0 -90
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Start Command
|
|
3
|
-
* Starts the Claude Brain server (MCP + HTTP)
|
|
4
|
-
*
|
|
5
|
-
* Usage:
|
|
6
|
-
* claude-brain start Start server
|
|
7
|
-
* claude-brain start --chroma-only Start only ChromaDB server (if enabled)
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { parseArgs } from 'citty'
|
|
11
|
-
import {
|
|
12
|
-
heading, successText, warningText, dimText,
|
|
13
|
-
} from '@/cli/ui/index.js'
|
|
14
|
-
|
|
15
|
-
export async function runStart(): Promise<void> {
|
|
16
|
-
const args = parseArgs(process.argv.slice(3), {
|
|
17
|
-
'chroma-only': { type: 'boolean', default: false, description: 'Start only ChromaDB server' },
|
|
18
|
-
})
|
|
19
|
-
const chromaOnly = args['chroma-only']
|
|
20
|
-
|
|
21
|
-
if (chromaOnly) {
|
|
22
|
-
const { ensureChromaRunning } = await import('@/cli/commands/chroma')
|
|
23
|
-
console.log()
|
|
24
|
-
console.log(heading('Starting ChromaDB'))
|
|
25
|
-
console.log()
|
|
26
|
-
|
|
27
|
-
const chromaReady = await ensureChromaRunning()
|
|
28
|
-
console.log()
|
|
29
|
-
|
|
30
|
-
if (chromaReady) {
|
|
31
|
-
console.log(successText('ChromaDB is running and ready.'))
|
|
32
|
-
} else {
|
|
33
|
-
console.log(warningText('ChromaDB could not be started. Check installation with: claude-brain chroma status'))
|
|
34
|
-
}
|
|
35
|
-
console.log()
|
|
36
|
-
return
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
console.error(dimText('Starting Claude Brain server...'))
|
|
40
|
-
console.error()
|
|
41
|
-
|
|
42
|
-
const { runServe } = await import('./serve')
|
|
43
|
-
await runServe()
|
|
44
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Start Command
|
|
3
|
+
* Starts the Claude Brain server (MCP + HTTP)
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* claude-brain start Start server
|
|
7
|
+
* claude-brain start --chroma-only Start only ChromaDB server (if enabled)
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { parseArgs } from 'citty'
|
|
11
|
+
import {
|
|
12
|
+
heading, successText, warningText, dimText,
|
|
13
|
+
} from '@/cli/ui/index.js'
|
|
14
|
+
|
|
15
|
+
export async function runStart(): Promise<void> {
|
|
16
|
+
const args = parseArgs(process.argv.slice(3), {
|
|
17
|
+
'chroma-only': { type: 'boolean', default: false, description: 'Start only ChromaDB server' },
|
|
18
|
+
})
|
|
19
|
+
const chromaOnly = args['chroma-only']
|
|
20
|
+
|
|
21
|
+
if (chromaOnly) {
|
|
22
|
+
const { ensureChromaRunning } = await import('@/cli/commands/chroma')
|
|
23
|
+
console.log()
|
|
24
|
+
console.log(heading('Starting ChromaDB'))
|
|
25
|
+
console.log()
|
|
26
|
+
|
|
27
|
+
const chromaReady = await ensureChromaRunning()
|
|
28
|
+
console.log()
|
|
29
|
+
|
|
30
|
+
if (chromaReady) {
|
|
31
|
+
console.log(successText('ChromaDB is running and ready.'))
|
|
32
|
+
} else {
|
|
33
|
+
console.log(warningText('ChromaDB could not be started. Check installation with: claude-brain chroma status'))
|
|
34
|
+
}
|
|
35
|
+
console.log()
|
|
36
|
+
return
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
console.error(dimText('Starting Claude Brain server...'))
|
|
40
|
+
console.error()
|
|
41
|
+
|
|
42
|
+
const { runServe } = await import('./serve')
|
|
43
|
+
await runServe()
|
|
44
|
+
}
|
|
@@ -1,203 +1,220 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Status Command — Phase 30
|
|
3
|
-
* Shows a system overview of Claude Brain's current state.
|
|
4
|
-
*
|
|
5
|
-
* Usage: claude-brain status
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { readFileSync, existsSync } from 'node:fs'
|
|
9
|
-
import { resolve, join } from 'node:path'
|
|
10
|
-
import { renderLogo, theme, heading, dimText, successText, warningText, summaryPanel } from '@/cli/ui/index.js'
|
|
11
|
-
import { getClaudeBrainHome } from '@/config/home'
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
items.push({ label: 'Storage', value: 'SQLite FTS5
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
const
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
if (
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Status Command — Phase 30
|
|
3
|
+
* Shows a system overview of Claude Brain's current state.
|
|
4
|
+
*
|
|
5
|
+
* Usage: claude-brain status
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { readFileSync, existsSync } from 'node:fs'
|
|
9
|
+
import { resolve, join } from 'node:path'
|
|
10
|
+
import { renderLogo, theme, heading, dimText, successText, warningText, summaryPanel } from '@/cli/ui/index.js'
|
|
11
|
+
import { getClaudeBrainHome } from '@/config/home'
|
|
12
|
+
|
|
13
|
+
/** Count row from DB queries */
|
|
14
|
+
interface CountRow { cnt: number }
|
|
15
|
+
/** Category count row */
|
|
16
|
+
interface CategoryCountRow { category: string; cnt: number }
|
|
17
|
+
/** Project row */
|
|
18
|
+
interface ProjectRow { project: string }
|
|
19
|
+
/** Code file count */
|
|
20
|
+
interface CodeCountRow { cnt: number }
|
|
21
|
+
/** Latest indexed row */
|
|
22
|
+
interface LatestRow { latest: string | null }
|
|
23
|
+
/** Table existence check */
|
|
24
|
+
interface TableRow { name: string }
|
|
25
|
+
/** Task count row */
|
|
26
|
+
interface TaskCountRow { task: string; cnt: number }
|
|
27
|
+
/** Hook entry in settings */
|
|
28
|
+
interface HookEntry { command?: string; hooks?: Array<{ command?: string }> }
|
|
29
|
+
|
|
30
|
+
export async function runStatus() {
|
|
31
|
+
console.log()
|
|
32
|
+
console.log(renderLogo())
|
|
33
|
+
console.log()
|
|
34
|
+
console.log(heading('System Status'))
|
|
35
|
+
console.log()
|
|
36
|
+
|
|
37
|
+
// Version
|
|
38
|
+
let version = 'unknown'
|
|
39
|
+
try {
|
|
40
|
+
const pkgPath = resolve(__dirname, '..', '..', '..', 'package.json')
|
|
41
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'))
|
|
42
|
+
version = pkg.version || 'unknown'
|
|
43
|
+
} catch {
|
|
44
|
+
// fall through
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const home = getClaudeBrainHome()
|
|
48
|
+
const items: Array<{ label: string; value: string; status?: 'success' | 'warning' | 'error' | 'info' }> = []
|
|
49
|
+
|
|
50
|
+
items.push({ label: 'Version', value: `v${version}`, status: 'info' })
|
|
51
|
+
|
|
52
|
+
// Storage info
|
|
53
|
+
const dbPath = join(home, 'data', 'memory.db')
|
|
54
|
+
if (existsSync(dbPath)) {
|
|
55
|
+
try {
|
|
56
|
+
const { Database } = await import('bun:sqlite')
|
|
57
|
+
const db = new Database(dbPath, { readonly: true })
|
|
58
|
+
|
|
59
|
+
// Count observations by category (dynamic — includes all categories)
|
|
60
|
+
const total = (db.prepare('SELECT COUNT(*) as cnt FROM observations WHERE archived = 0').get() as CountRow | null)?.cnt ?? 0
|
|
61
|
+
const catRows = db.prepare(
|
|
62
|
+
'SELECT category, COUNT(*) as cnt FROM observations WHERE archived = 0 GROUP BY category'
|
|
63
|
+
).all() as CategoryCountRow[]
|
|
64
|
+
const breakdown = catRows.map((r) => `${r.cnt} ${r.category}s`).join(', ')
|
|
65
|
+
|
|
66
|
+
items.push({ label: 'Storage', value: 'SQLite FTS5', status: 'success' })
|
|
67
|
+
items.push({
|
|
68
|
+
label: 'Observations',
|
|
69
|
+
value: `${total}${breakdown ? ` (${breakdown})` : ''}`,
|
|
70
|
+
status: total > 0 ? 'success' : 'warning'
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
// Projects
|
|
74
|
+
const projects = db.prepare('SELECT DISTINCT project FROM observations WHERE archived = 0').all() as ProjectRow[]
|
|
75
|
+
items.push({
|
|
76
|
+
label: 'Projects',
|
|
77
|
+
value: projects.length > 0 ? projects.map(p => p.project).join(', ') : '(none)',
|
|
78
|
+
status: projects.length > 0 ? 'success' : 'warning'
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
db.close()
|
|
82
|
+
} catch {
|
|
83
|
+
items.push({ label: 'Storage', value: 'SQLite FTS5 (error reading DB)', status: 'error' })
|
|
84
|
+
}
|
|
85
|
+
} else {
|
|
86
|
+
items.push({ label: 'Storage', value: 'Not initialized', status: 'warning' })
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Code intelligence
|
|
90
|
+
const codeDbPath = join(home, 'data', 'code.db')
|
|
91
|
+
if (existsSync(codeDbPath)) {
|
|
92
|
+
try {
|
|
93
|
+
const { Database } = await import('bun:sqlite')
|
|
94
|
+
const codeDb = new Database(codeDbPath, { readonly: true })
|
|
95
|
+
|
|
96
|
+
const files = (codeDb.prepare('SELECT COUNT(*) as cnt FROM code_files').get() as CodeCountRow | null)?.cnt ?? 0
|
|
97
|
+
const symbols = (codeDb.prepare('SELECT COUNT(*) as cnt FROM code_symbols').get() as CodeCountRow | null)?.cnt ?? 0
|
|
98
|
+
|
|
99
|
+
// Last indexed time
|
|
100
|
+
const latest = (codeDb.prepare('SELECT MAX(last_indexed) as latest FROM code_files').get() as LatestRow | null)?.latest
|
|
101
|
+
const lastIndexed = latest ? formatAge(latest) : 'never'
|
|
102
|
+
|
|
103
|
+
items.push({
|
|
104
|
+
label: 'Code Index',
|
|
105
|
+
value: `${files} files, ${symbols} symbols (last indexed: ${lastIndexed})`,
|
|
106
|
+
status: files > 0 ? 'success' : 'warning'
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
codeDb.close()
|
|
110
|
+
} catch {
|
|
111
|
+
items.push({ label: 'Code Index', value: 'Not available', status: 'warning' })
|
|
112
|
+
}
|
|
113
|
+
} else {
|
|
114
|
+
items.push({ label: 'Code Index', value: 'Not initialized', status: 'warning' })
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Hooks status
|
|
118
|
+
const hookNames = ['PostToolUse', 'Stop', 'SessionStart', 'UserPromptSubmit']
|
|
119
|
+
const settingsPath = join(process.env.HOME || '', '.claude', 'settings.json')
|
|
120
|
+
let installedHooks: string[] = []
|
|
121
|
+
if (existsSync(settingsPath)) {
|
|
122
|
+
try {
|
|
123
|
+
const settings = JSON.parse(readFileSync(settingsPath, 'utf-8'))
|
|
124
|
+
const hooks = settings.hooks || {}
|
|
125
|
+
for (const hookName of hookNames) {
|
|
126
|
+
const hookEntries = hooks[hookName] || []
|
|
127
|
+
const hasBrain = hookEntries.some((h: HookEntry) => {
|
|
128
|
+
const cmd = typeof h === 'string' ? h : h.command || ''
|
|
129
|
+
return cmd.includes('claude-brain')
|
|
130
|
+
})
|
|
131
|
+
if (hasBrain) installedHooks.push(hookName)
|
|
132
|
+
}
|
|
133
|
+
} catch {
|
|
134
|
+
// settings parse failed
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
items.push({
|
|
138
|
+
label: 'Hooks',
|
|
139
|
+
value: installedHooks.length > 0 ? `${installedHooks.length} installed (${installedHooks.join(', ')})` : 'Not installed',
|
|
140
|
+
status: installedHooks.length > 0 ? 'success' : 'warning'
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
// SLM Models
|
|
144
|
+
const modelsDir = join(home, 'models')
|
|
145
|
+
const manifestPath = join(modelsDir, 'manifest.json')
|
|
146
|
+
if (existsSync(manifestPath)) {
|
|
147
|
+
try {
|
|
148
|
+
const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'))
|
|
149
|
+
const tasks = Object.keys(manifest.models || {})
|
|
150
|
+
const available = tasks.filter(t => existsSync(join(modelsDir, manifest.models[t].file)))
|
|
151
|
+
items.push({
|
|
152
|
+
label: 'SLM Models',
|
|
153
|
+
value: `${available.length}/${tasks.length} available (${available.join(', ') || 'none'})`,
|
|
154
|
+
status: available.length > 0 ? 'success' : 'warning'
|
|
155
|
+
})
|
|
156
|
+
} catch {
|
|
157
|
+
items.push({ label: 'SLM Models', value: 'Manifest error', status: 'error' })
|
|
158
|
+
}
|
|
159
|
+
} else {
|
|
160
|
+
items.push({ label: 'SLM Models', value: 'Not installed', status: 'warning' })
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Training data
|
|
164
|
+
if (existsSync(dbPath)) {
|
|
165
|
+
try {
|
|
166
|
+
const { Database } = await import('bun:sqlite')
|
|
167
|
+
const db2 = new Database(dbPath, { readonly: true })
|
|
168
|
+
const hasTable = db2.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='training_data'").get()
|
|
169
|
+
if (hasTable) {
|
|
170
|
+
const trainingTotal = (db2.prepare('SELECT COUNT(*) as cnt FROM training_data').get() as CountRow | null)?.cnt ?? 0
|
|
171
|
+
if (trainingTotal > 0) {
|
|
172
|
+
const taskCounts = db2.prepare('SELECT task, COUNT(*) as cnt FROM training_data GROUP BY task').all() as TaskCountRow[]
|
|
173
|
+
const breakdown = taskCounts.map((r) => `${r.cnt} ${r.task}`).join(', ')
|
|
174
|
+
items.push({
|
|
175
|
+
label: 'Training Data',
|
|
176
|
+
value: `${trainingTotal} examples (${breakdown})`,
|
|
177
|
+
status: 'success'
|
|
178
|
+
})
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
db2.close()
|
|
182
|
+
} catch {
|
|
183
|
+
// ignore
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Server status
|
|
188
|
+
const port = process.env.CLAUDE_BRAIN_PORT || '3000'
|
|
189
|
+
try {
|
|
190
|
+
const res = await fetch(`http://localhost:${port}/api/health`, {
|
|
191
|
+
signal: AbortSignal.timeout(2000)
|
|
192
|
+
})
|
|
193
|
+
if (res.ok) {
|
|
194
|
+
items.push({ label: 'Server', value: `http://localhost:${port} (running)`, status: 'success' })
|
|
195
|
+
} else {
|
|
196
|
+
items.push({ label: 'Server', value: 'Not responding', status: 'warning' })
|
|
197
|
+
}
|
|
198
|
+
} catch {
|
|
199
|
+
items.push({ label: 'Server', value: 'Not running', status: 'warning' })
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
console.log(summaryPanel('Claude Brain', items))
|
|
203
|
+
console.log()
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function formatAge(isoDate: string): string {
|
|
207
|
+
try {
|
|
208
|
+
const diff = Date.now() - new Date(isoDate).getTime()
|
|
209
|
+
const minutes = Math.floor(diff / 60000)
|
|
210
|
+
if (minutes < 1) return 'just now'
|
|
211
|
+
if (minutes < 60) return `${minutes} minutes ago`
|
|
212
|
+
const hours = Math.floor(minutes / 60)
|
|
213
|
+
if (hours < 24) return `${hours} hours ago`
|
|
214
|
+
const days = Math.floor(hours / 24)
|
|
215
|
+
if (days === 1) return 'yesterday'
|
|
216
|
+
return `${days} days ago`
|
|
217
|
+
} catch {
|
|
218
|
+
return 'unknown'
|
|
219
|
+
}
|
|
220
|
+
}
|
|
@@ -1,41 +1,45 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
// Falls back to local scope removal in case it was registered there
|
|
23
|
-
|
|
24
|
-
encoding: 'utf-8',
|
|
25
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
console.log(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
1
|
+
import { spawnSync } 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
|
+
const userResult = spawnSync('claude', ['mcp', 'remove', 'claude-brain', '-s', 'user'], {
|
|
17
|
+
encoding: 'utf-8',
|
|
18
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
19
|
+
timeout: 5000,
|
|
20
|
+
})
|
|
21
|
+
if (userResult.error || userResult.status !== 0) {
|
|
22
|
+
// Falls back to local scope removal in case it was registered there
|
|
23
|
+
const localResult = spawnSync('claude', ['mcp', 'remove', 'claude-brain', '-s', 'local'], {
|
|
24
|
+
encoding: 'utf-8',
|
|
25
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
26
|
+
timeout: 5000,
|
|
27
|
+
})
|
|
28
|
+
if (localResult.error || localResult.status !== 0) {
|
|
29
|
+
throw new Error(localResult.stderr || 'Failed to remove MCP')
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
})
|
|
33
|
+
console.log()
|
|
34
|
+
console.log(box(successText('Claude Brain MCP server removed from Claude Code.'), 'Success'))
|
|
35
|
+
} catch {
|
|
36
|
+
console.log()
|
|
37
|
+
console.log(box([
|
|
38
|
+
errorText('Failed to remove automatically.'),
|
|
39
|
+
'',
|
|
40
|
+
dimText('Run manually:'),
|
|
41
|
+
` ${theme.bold('claude mcp remove claude-brain')}`,
|
|
42
|
+
].join('\n'), 'Error'))
|
|
43
|
+
}
|
|
44
|
+
console.log()
|
|
45
|
+
}
|