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
package/src/routing/types.ts
CHANGED
|
@@ -1,94 +1,104 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Routing Types
|
|
3
|
-
* Phase 19: Normalized result types for the brain() router
|
|
4
|
-
*
|
|
5
|
-
* Eliminates scattered `r.decision?.decision || r.content?.slice(0, 300)`
|
|
6
|
-
* by normalizing all search results to a flat structure.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
export interface NormalizedResult {
|
|
10
|
-
id: string
|
|
11
|
-
content: string
|
|
12
|
-
score: number
|
|
13
|
-
source: 'decision' | 'pattern' | 'correction' | 'memory' | 'graph' | 'episode' | 'cross-project'
|
|
14
|
-
project?: string
|
|
15
|
-
date?: string
|
|
16
|
-
metadata?: Record<string, unknown>
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Normalize raw searchRaw() results into flat NormalizedResult[]
|
|
21
|
-
* Handles the nested { memory: { id }, decision: { id } } structure
|
|
22
|
-
*/
|
|
23
|
-
/**
|
|
24
|
-
* Ensure a value is a string ā prevents [object Object] in template literals
|
|
25
|
-
*/
|
|
26
|
-
function ensureString(val: unknown): string {
|
|
27
|
-
if (typeof val === 'string') return val
|
|
28
|
-
if (val === null || val === undefined) return ''
|
|
29
|
-
if (typeof val === 'object') return JSON.stringify(val)
|
|
30
|
-
return String(val)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export function normalizeSearchResults(rawResults:
|
|
34
|
-
return rawResults.map(r => {
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
} else {
|
|
51
|
-
content =
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Routing Types
|
|
3
|
+
* Phase 19: Normalized result types for the brain() router
|
|
4
|
+
*
|
|
5
|
+
* Eliminates scattered `r.decision?.decision || r.content?.slice(0, 300)`
|
|
6
|
+
* by normalizing all search results to a flat structure.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface NormalizedResult {
|
|
10
|
+
id: string
|
|
11
|
+
content: string
|
|
12
|
+
score: number
|
|
13
|
+
source: 'decision' | 'pattern' | 'correction' | 'memory' | 'graph' | 'episode' | 'cross-project'
|
|
14
|
+
project?: string
|
|
15
|
+
date?: string
|
|
16
|
+
metadata?: Record<string, unknown>
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Normalize raw searchRaw() results into flat NormalizedResult[]
|
|
21
|
+
* Handles the nested { memory: { id }, decision: { id } } structure
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Ensure a value is a string ā prevents [object Object] in template literals
|
|
25
|
+
*/
|
|
26
|
+
function ensureString(val: unknown): string {
|
|
27
|
+
if (typeof val === 'string') return val
|
|
28
|
+
if (val === null || val === undefined) return ''
|
|
29
|
+
if (typeof val === 'object') return JSON.stringify(val)
|
|
30
|
+
return String(val)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function normalizeSearchResults(rawResults: Record<string, unknown>[]): NormalizedResult[] {
|
|
34
|
+
return rawResults.map(r => {
|
|
35
|
+
const memory = r.memory as Record<string, unknown> | undefined
|
|
36
|
+
const decision = r.decision as Record<string, unknown> | undefined
|
|
37
|
+
const meta = r.metadata as Record<string, unknown> | undefined
|
|
38
|
+
|
|
39
|
+
const id = String(memory?.id || decision?.id || r.id || '')
|
|
40
|
+
const project = memory?.project || decision?.project || meta?.project || ''
|
|
41
|
+
const date = memory?.createdAt || decision?.createdAt || meta?.created_at || ''
|
|
42
|
+
|
|
43
|
+
// Prefer decision content, fall back to memory content
|
|
44
|
+
let content: string
|
|
45
|
+
if (decision?.decision) {
|
|
46
|
+
content = ensureString(decision.decision)
|
|
47
|
+
if (decision.reasoning) {
|
|
48
|
+
content = `**${content}**\n${ensureString(decision.reasoning)}`
|
|
49
|
+
}
|
|
50
|
+
} else if (memory?.content) {
|
|
51
|
+
content = ensureString(memory.content)
|
|
52
|
+
} else if (r.content) {
|
|
53
|
+
content = ensureString(r.content)
|
|
54
|
+
} else {
|
|
55
|
+
content = ''
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
id,
|
|
60
|
+
content,
|
|
61
|
+
score: (r.similarity as number) || (r.score as number) || 0,
|
|
62
|
+
source: decision ? 'decision' as const : 'memory' as const,
|
|
63
|
+
project: typeof project === 'string' ? project : String(project),
|
|
64
|
+
date: date instanceof Date ? date.toISOString() : typeof date === 'string' ? date : '',
|
|
65
|
+
metadata: (meta || (decision ? { ...decision } : (memory?.metadata as Record<string, unknown>)) || {}) as Record<string, unknown>
|
|
66
|
+
}
|
|
67
|
+
})
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Normalize pattern search results
|
|
72
|
+
*/
|
|
73
|
+
export function normalizePatternResults(results: Record<string, unknown>[]): NormalizedResult[] {
|
|
74
|
+
return results.map(p => {
|
|
75
|
+
const meta = (p.metadata || {}) as Record<string, unknown>
|
|
76
|
+
return {
|
|
77
|
+
id: String(p.id || ''),
|
|
78
|
+
content: ensureString(meta.description || p.description || p.content || ''),
|
|
79
|
+
score: (p.similarity as number) || (p.score as number) || 0,
|
|
80
|
+
source: 'pattern' as const,
|
|
81
|
+
project: ensureString(meta.project || p.project || ''),
|
|
82
|
+
date: ensureString(meta.created_at || ''),
|
|
83
|
+
metadata: meta
|
|
84
|
+
}
|
|
85
|
+
})
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Normalize correction search results
|
|
90
|
+
*/
|
|
91
|
+
export function normalizeCorrectionResults(results: Record<string, unknown>[]): NormalizedResult[] {
|
|
92
|
+
return results.map(c => {
|
|
93
|
+
const meta = (c.metadata || {}) as Record<string, unknown>
|
|
94
|
+
return {
|
|
95
|
+
id: String(c.id || ''),
|
|
96
|
+
content: `Original: ${ensureString(meta.original || c.original || '')}\nFix: ${ensureString(meta.correction || c.correction || c.content || '')}`,
|
|
97
|
+
score: (c.similarity as number) || (c.score as number) || 0,
|
|
98
|
+
source: 'correction' as const,
|
|
99
|
+
project: ensureString(meta.project || c.project || ''),
|
|
100
|
+
date: ensureString(meta.created_at || ''),
|
|
101
|
+
metadata: meta
|
|
102
|
+
}
|
|
103
|
+
})
|
|
104
|
+
}
|
|
@@ -1,118 +1,118 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
|
|
3
|
-
import { existsSync, statSync, accessSync, constants } from 'node:fs'
|
|
4
|
-
import { resolve } from 'node:path'
|
|
5
|
-
import { loadConfig } from '@/config'
|
|
6
|
-
|
|
7
|
-
interface HealthCheck {
|
|
8
|
-
name: string
|
|
9
|
-
status: 'pass' | 'fail' | 'warn'
|
|
10
|
-
message: string
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
const checks: HealthCheck[] = []
|
|
14
|
-
|
|
15
|
-
function addCheck(name: string, status: HealthCheck['status'], message: string) {
|
|
16
|
-
checks.push({ name, status, message })
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
async function checkConfig(): Promise<void> {
|
|
20
|
-
try {
|
|
21
|
-
await loadConfig()
|
|
22
|
-
addCheck('Configuration', 'pass', 'Loaded and validated')
|
|
23
|
-
} catch (error) {
|
|
24
|
-
addCheck('Configuration', 'fail', error instanceof Error ? error.message : 'Failed to load')
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function checkDirectory(name: string, path: string): void {
|
|
29
|
-
const dirPath = resolve(process.cwd(), path)
|
|
30
|
-
if (existsSync(dirPath)) {
|
|
31
|
-
try {
|
|
32
|
-
accessSync(dirPath, constants.R_OK | constants.W_OK)
|
|
33
|
-
addCheck(name, 'pass', `${path}/ exists and is writable`)
|
|
34
|
-
} catch {
|
|
35
|
-
addCheck(name, 'fail', `${path}/ exists but is not writable`)
|
|
36
|
-
}
|
|
37
|
-
} else {
|
|
38
|
-
addCheck(name, 'warn', `${path}/ does not exist`)
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
async function checkVaultPath(): Promise<void> {
|
|
43
|
-
try {
|
|
44
|
-
const config = await loadConfig()
|
|
45
|
-
if (!config.vaultPath || config.vaultPath === '/path/to/your/obsidian/vault') {
|
|
46
|
-
addCheck('Vault Path', 'warn', 'Not configured')
|
|
47
|
-
return
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if (existsSync(config.vaultPath)) {
|
|
51
|
-
const stats = statSync(config.vaultPath)
|
|
52
|
-
if (stats.isDirectory()) {
|
|
53
|
-
addCheck('Vault Path', 'pass', `Exists: ${config.vaultPath}`)
|
|
54
|
-
} else {
|
|
55
|
-
addCheck('Vault Path', 'fail', 'Path exists but is not a directory')
|
|
56
|
-
}
|
|
57
|
-
} else {
|
|
58
|
-
addCheck('Vault Path', 'fail', `Does not exist: ${config.vaultPath}`)
|
|
59
|
-
}
|
|
60
|
-
} catch {
|
|
61
|
-
addCheck('Vault Path', 'warn', 'Could not verify (config error)')
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function checkDependencies(): void {
|
|
66
|
-
const pkgPath = resolve(process.cwd(), 'package.json')
|
|
67
|
-
if (!existsSync(pkgPath)) {
|
|
68
|
-
addCheck('Dependencies', 'fail', 'package.json not found')
|
|
69
|
-
return
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const nodeModulesPath = resolve(process.cwd(), 'node_modules')
|
|
73
|
-
if (!existsSync(nodeModulesPath)) {
|
|
74
|
-
addCheck('Dependencies', 'fail', 'node_modules not found - run bun install')
|
|
75
|
-
return
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const requiredDeps = ['hono', '@modelcontextprotocol/sdk', 'zod', 'pino']
|
|
79
|
-
const missingDeps = requiredDeps.filter(dep =>
|
|
80
|
-
!existsSync(resolve(nodeModulesPath, dep))
|
|
81
|
-
)
|
|
82
|
-
|
|
83
|
-
if (missingDeps.length > 0) {
|
|
84
|
-
addCheck('Dependencies', 'fail', `Missing: ${missingDeps.join(', ')}`)
|
|
85
|
-
} else {
|
|
86
|
-
addCheck('Dependencies', 'pass', 'All required dependencies installed')
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
async function main() {
|
|
91
|
-
console.log('\nš„ Claude Brain Health Check\n')
|
|
92
|
-
console.log('ā'.repeat(50))
|
|
93
|
-
|
|
94
|
-
await checkConfig()
|
|
95
|
-
checkDirectory('Data Directory', 'data')
|
|
96
|
-
checkDirectory('Logs Directory', 'logs')
|
|
97
|
-
await checkVaultPath()
|
|
98
|
-
checkDependencies()
|
|
99
|
-
|
|
100
|
-
console.log('')
|
|
101
|
-
for (const check of checks) {
|
|
102
|
-
const symbol = check.status === 'pass' ? 'ā' : check.status === 'warn' ? 'ā ' : 'ā'
|
|
103
|
-
const color = check.status === 'pass' ? '\x1b[32m' : check.status === 'warn' ? '\x1b[33m' : '\x1b[31m'
|
|
104
|
-
console.log(`${color}${symbol}\x1b[0m ${check.name}: ${check.message}`)
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
console.log('\n' + 'ā'.repeat(50))
|
|
108
|
-
|
|
109
|
-
const failures = checks.filter(c => c.status === 'fail').length
|
|
110
|
-
const warnings = checks.filter(c => c.status === 'warn').length
|
|
111
|
-
const passes = checks.filter(c => c.status === 'pass').length
|
|
112
|
-
|
|
113
|
-
console.log(`\nResults: ${passes} passed, ${warnings} warnings, ${failures} failed\n`)
|
|
114
|
-
|
|
115
|
-
process.exit(failures > 0 ? 1 : 0)
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
main()
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
import { existsSync, statSync, accessSync, constants } from 'node:fs'
|
|
4
|
+
import { resolve } from 'node:path'
|
|
5
|
+
import { loadConfig } from '@/config'
|
|
6
|
+
|
|
7
|
+
interface HealthCheck {
|
|
8
|
+
name: string
|
|
9
|
+
status: 'pass' | 'fail' | 'warn'
|
|
10
|
+
message: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const checks: HealthCheck[] = []
|
|
14
|
+
|
|
15
|
+
function addCheck(name: string, status: HealthCheck['status'], message: string) {
|
|
16
|
+
checks.push({ name, status, message })
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async function checkConfig(): Promise<void> {
|
|
20
|
+
try {
|
|
21
|
+
await loadConfig()
|
|
22
|
+
addCheck('Configuration', 'pass', 'Loaded and validated')
|
|
23
|
+
} catch (error) {
|
|
24
|
+
addCheck('Configuration', 'fail', error instanceof Error ? error.message : 'Failed to load')
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function checkDirectory(name: string, path: string): void {
|
|
29
|
+
const dirPath = resolve(process.cwd(), path)
|
|
30
|
+
if (existsSync(dirPath)) {
|
|
31
|
+
try {
|
|
32
|
+
accessSync(dirPath, constants.R_OK | constants.W_OK)
|
|
33
|
+
addCheck(name, 'pass', `${path}/ exists and is writable`)
|
|
34
|
+
} catch {
|
|
35
|
+
addCheck(name, 'fail', `${path}/ exists but is not writable`)
|
|
36
|
+
}
|
|
37
|
+
} else {
|
|
38
|
+
addCheck(name, 'warn', `${path}/ does not exist`)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async function checkVaultPath(): Promise<void> {
|
|
43
|
+
try {
|
|
44
|
+
const config = await loadConfig()
|
|
45
|
+
if (!config.vaultPath || config.vaultPath === '/path/to/your/obsidian/vault') {
|
|
46
|
+
addCheck('Vault Path', 'warn', 'Not configured')
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (existsSync(config.vaultPath)) {
|
|
51
|
+
const stats = statSync(config.vaultPath)
|
|
52
|
+
if (stats.isDirectory()) {
|
|
53
|
+
addCheck('Vault Path', 'pass', `Exists: ${config.vaultPath}`)
|
|
54
|
+
} else {
|
|
55
|
+
addCheck('Vault Path', 'fail', 'Path exists but is not a directory')
|
|
56
|
+
}
|
|
57
|
+
} else {
|
|
58
|
+
addCheck('Vault Path', 'fail', `Does not exist: ${config.vaultPath}`)
|
|
59
|
+
}
|
|
60
|
+
} catch {
|
|
61
|
+
addCheck('Vault Path', 'warn', 'Could not verify (config error)')
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function checkDependencies(): void {
|
|
66
|
+
const pkgPath = resolve(process.cwd(), 'package.json')
|
|
67
|
+
if (!existsSync(pkgPath)) {
|
|
68
|
+
addCheck('Dependencies', 'fail', 'package.json not found')
|
|
69
|
+
return
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const nodeModulesPath = resolve(process.cwd(), 'node_modules')
|
|
73
|
+
if (!existsSync(nodeModulesPath)) {
|
|
74
|
+
addCheck('Dependencies', 'fail', 'node_modules not found - run bun install')
|
|
75
|
+
return
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const requiredDeps = ['hono', '@modelcontextprotocol/sdk', 'zod', 'pino']
|
|
79
|
+
const missingDeps = requiredDeps.filter(dep =>
|
|
80
|
+
!existsSync(resolve(nodeModulesPath, dep))
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
if (missingDeps.length > 0) {
|
|
84
|
+
addCheck('Dependencies', 'fail', `Missing: ${missingDeps.join(', ')}`)
|
|
85
|
+
} else {
|
|
86
|
+
addCheck('Dependencies', 'pass', 'All required dependencies installed')
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async function main() {
|
|
91
|
+
console.log('\nš„ Claude Brain Health Check\n')
|
|
92
|
+
console.log('ā'.repeat(50))
|
|
93
|
+
|
|
94
|
+
await checkConfig()
|
|
95
|
+
checkDirectory('Data Directory', 'data')
|
|
96
|
+
checkDirectory('Logs Directory', 'logs')
|
|
97
|
+
await checkVaultPath()
|
|
98
|
+
checkDependencies()
|
|
99
|
+
|
|
100
|
+
console.log('')
|
|
101
|
+
for (const check of checks) {
|
|
102
|
+
const symbol = check.status === 'pass' ? 'ā' : check.status === 'warn' ? 'ā ' : 'ā'
|
|
103
|
+
const color = check.status === 'pass' ? '\x1b[32m' : check.status === 'warn' ? '\x1b[33m' : '\x1b[31m'
|
|
104
|
+
console.log(`${color}${symbol}\x1b[0m ${check.name}: ${check.message}`)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
console.log('\n' + 'ā'.repeat(50))
|
|
108
|
+
|
|
109
|
+
const failures = checks.filter(c => c.status === 'fail').length
|
|
110
|
+
const warnings = checks.filter(c => c.status === 'warn').length
|
|
111
|
+
const passes = checks.filter(c => c.status === 'pass').length
|
|
112
|
+
|
|
113
|
+
console.log(`\nResults: ${passes} passed, ${warnings} warnings, ${failures} failed\n`)
|
|
114
|
+
|
|
115
|
+
process.exit(failures > 0 ? 1 : 0)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
main()
|