claude-brain 0.14.2 ā 0.14.4
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 +11 -11
- package/bunfig.toml +8 -8
- package/package.json +80 -80
- 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/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 +202 -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/serve.ts +167 -167
- package/src/cli/commands/start.ts +42 -42
- package/src/cli/commands/uninstall-mcp.ts +41 -41
- package/src/cli/commands/update.ts +121 -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 +112 -112
- package/src/hooks/capture.ts +168 -168
- 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 +191 -194
- package/src/hooks/passive-classifier.ts +366 -366
- package/src/hooks/queue.ts +129 -129
- package/src/hooks/session-tracker.ts +275 -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 +153 -153
- 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 +436 -436
- package/src/routing/response-filter.ts +258 -254
- package/src/routing/router.ts +1322 -1314
- package/src/routing/search-engine.ts +475 -475
- package/src/routing/types.ts +94 -84
- 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 -124
- 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/routing/types.ts
CHANGED
|
@@ -1,84 +1,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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: any[]): NormalizedResult[] {
|
|
34
|
+
return rawResults.map(r => {
|
|
35
|
+
const id = r.memory?.id || r.decision?.id || r.id || ''
|
|
36
|
+
const project = r.memory?.project || r.decision?.project || r.metadata?.project || ''
|
|
37
|
+
const date = r.memory?.createdAt || r.decision?.createdAt || r.metadata?.created_at || ''
|
|
38
|
+
|
|
39
|
+
// Prefer decision content, fall back to memory content
|
|
40
|
+
let content: string
|
|
41
|
+
if (r.decision?.decision) {
|
|
42
|
+
content = ensureString(r.decision.decision)
|
|
43
|
+
if (r.decision.reasoning) {
|
|
44
|
+
content = `**${content}**\n${ensureString(r.decision.reasoning)}`
|
|
45
|
+
}
|
|
46
|
+
} else if (r.memory?.content) {
|
|
47
|
+
content = ensureString(r.memory.content)
|
|
48
|
+
} else if (r.content) {
|
|
49
|
+
content = ensureString(r.content)
|
|
50
|
+
} else {
|
|
51
|
+
content = ''
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
id,
|
|
56
|
+
content,
|
|
57
|
+
score: r.similarity || r.score || 0,
|
|
58
|
+
source: r.decision ? 'decision' as const : 'memory' as const,
|
|
59
|
+
project: typeof project === 'string' ? project : String(project),
|
|
60
|
+
date: date instanceof Date ? date.toISOString() : typeof date === 'string' ? date : '',
|
|
61
|
+
metadata: r.metadata || (r.decision ? { ...r.decision } : r.memory?.metadata) || {}
|
|
62
|
+
}
|
|
63
|
+
})
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Normalize pattern search results
|
|
68
|
+
*/
|
|
69
|
+
export function normalizePatternResults(results: any[]): NormalizedResult[] {
|
|
70
|
+
return results.map(p => ({
|
|
71
|
+
id: p.id || '',
|
|
72
|
+
content: ensureString(p.metadata?.description || p.description || p.content || ''),
|
|
73
|
+
score: p.similarity || p.score || 0,
|
|
74
|
+
source: 'pattern' as const,
|
|
75
|
+
project: ensureString(p.metadata?.project || p.project || ''),
|
|
76
|
+
date: ensureString(p.metadata?.created_at || ''),
|
|
77
|
+
metadata: p.metadata || {}
|
|
78
|
+
}))
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Normalize correction search results
|
|
83
|
+
*/
|
|
84
|
+
export function normalizeCorrectionResults(results: any[]): NormalizedResult[] {
|
|
85
|
+
return results.map(c => ({
|
|
86
|
+
id: c.id || '',
|
|
87
|
+
content: `Original: ${ensureString(c.metadata?.original || c.original || '')}\nFix: ${ensureString(c.metadata?.correction || c.correction || c.content || '')}`,
|
|
88
|
+
score: c.similarity || c.score || 0,
|
|
89
|
+
source: 'correction' as const,
|
|
90
|
+
project: ensureString(c.metadata?.project || c.project || ''),
|
|
91
|
+
date: ensureString(c.metadata?.created_at || ''),
|
|
92
|
+
metadata: c.metadata || {}
|
|
93
|
+
}))
|
|
94
|
+
}
|
|
@@ -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
|
-
const config = 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
|
+
const config = 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()
|
package/src/scripts/setup.ts
CHANGED
|
@@ -1,122 +1,122 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
|
|
3
|
-
import { existsSync, mkdirSync, copyFileSync } from 'node:fs'
|
|
4
|
-
import { resolve } from 'node:path'
|
|
5
|
-
import { loadConfig, validateConfig } from '@/config'
|
|
6
|
-
|
|
7
|
-
const REQUIRED_BUN_VERSION = '1.0.0'
|
|
8
|
-
const REQUIRED_DIRS = ['data', 'logs']
|
|
9
|
-
|
|
10
|
-
function log(message: string, type: 'info' | 'success' | 'warn' | 'error' = 'info') {
|
|
11
|
-
const symbols = { info: 'ā¹', success: 'ā', warn: 'ā ', error: 'ā' }
|
|
12
|
-
console.log(`${symbols[type]} ${message}`)
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function checkBunVersion(): boolean {
|
|
16
|
-
const version = Bun.version
|
|
17
|
-
const [major, minor, patch] = version.split('.').map(Number)
|
|
18
|
-
const [reqMajor, reqMinor, reqPatch] = REQUIRED_BUN_VERSION.split('.').map(Number)
|
|
19
|
-
|
|
20
|
-
if (major > reqMajor || (major === reqMajor && minor > reqMinor) ||
|
|
21
|
-
(major === reqMajor && minor === reqMinor && patch >= reqPatch)) {
|
|
22
|
-
log(`Bun version ${version} >= ${REQUIRED_BUN_VERSION}`, 'success')
|
|
23
|
-
return true
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
log(`Bun version ${version} < ${REQUIRED_BUN_VERSION} required`, 'error')
|
|
27
|
-
return false
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function createDirectories(): boolean {
|
|
31
|
-
let success = true
|
|
32
|
-
for (const dir of REQUIRED_DIRS) {
|
|
33
|
-
const dirPath = resolve(process.cwd(), dir)
|
|
34
|
-
if (!existsSync(dirPath)) {
|
|
35
|
-
try {
|
|
36
|
-
mkdirSync(dirPath, { recursive: true })
|
|
37
|
-
log(`Created directory: ${dir}`, 'success')
|
|
38
|
-
} catch (error) {
|
|
39
|
-
log(`Failed to create directory: ${dir}`, 'error')
|
|
40
|
-
success = false
|
|
41
|
-
}
|
|
42
|
-
} else {
|
|
43
|
-
log(`Directory exists: ${dir}`, 'info')
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
return success
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function checkEnvFile(): boolean {
|
|
50
|
-
const envPath = resolve(process.cwd(), '.env')
|
|
51
|
-
const examplePath = resolve(process.cwd(), '.env.example')
|
|
52
|
-
|
|
53
|
-
if (!existsSync(envPath) && existsSync(examplePath)) {
|
|
54
|
-
try {
|
|
55
|
-
copyFileSync(examplePath, envPath)
|
|
56
|
-
log('Created .env from .env.example - please update with your settings', 'warn')
|
|
57
|
-
} catch {
|
|
58
|
-
log('Failed to copy .env.example to .env', 'error')
|
|
59
|
-
return false
|
|
60
|
-
}
|
|
61
|
-
} else if (existsSync(envPath)) {
|
|
62
|
-
log('.env file exists', 'success')
|
|
63
|
-
} else {
|
|
64
|
-
log('No .env or .env.example found', 'warn')
|
|
65
|
-
}
|
|
66
|
-
return true
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
async function validateConfiguration(): Promise<boolean> {
|
|
70
|
-
try {
|
|
71
|
-
const config = await loadConfig()
|
|
72
|
-
log('Configuration validated successfully', 'success')
|
|
73
|
-
|
|
74
|
-
if (!config.vaultPath || config.vaultPath === '/path/to/your/obsidian/vault') {
|
|
75
|
-
log('VAULT_PATH not configured - update .env with your Obsidian vault path', 'warn')
|
|
76
|
-
} else if (!existsSync(config.vaultPath)) {
|
|
77
|
-
log(`Vault path does not exist: ${config.vaultPath}`, 'warn')
|
|
78
|
-
} else {
|
|
79
|
-
log(`Vault path exists: ${config.vaultPath}`, 'success')
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return true
|
|
83
|
-
} catch (error) {
|
|
84
|
-
log(`Configuration error: ${error instanceof Error ? error.message : error}`, 'error')
|
|
85
|
-
return false
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
async function main() {
|
|
90
|
-
console.log('\nš§ Claude Brain Setup\n')
|
|
91
|
-
console.log('ā'.repeat(40))
|
|
92
|
-
|
|
93
|
-
let allPassed = true
|
|
94
|
-
|
|
95
|
-
// Check Bun version
|
|
96
|
-
console.log('\nš¦ Checking Bun version...')
|
|
97
|
-
allPassed = checkBunVersion() && allPassed
|
|
98
|
-
|
|
99
|
-
// Create required directories
|
|
100
|
-
console.log('\nš Creating directories...')
|
|
101
|
-
allPassed = createDirectories() && allPassed
|
|
102
|
-
|
|
103
|
-
// Check/create .env file
|
|
104
|
-
console.log('\nāļø Checking environment...')
|
|
105
|
-
allPassed = checkEnvFile() && allPassed
|
|
106
|
-
|
|
107
|
-
// Validate configuration
|
|
108
|
-
console.log('\nš Validating configuration...')
|
|
109
|
-
allPassed = await validateConfiguration() && allPassed
|
|
110
|
-
|
|
111
|
-
console.log('\n' + 'ā'.repeat(40))
|
|
112
|
-
|
|
113
|
-
if (allPassed) {
|
|
114
|
-
console.log('\nā
Setup complete! Run `bun run dev` to start development.\n')
|
|
115
|
-
process.exit(0)
|
|
116
|
-
} else {
|
|
117
|
-
console.log('\nā ļø Setup completed with warnings. Please review above messages.\n')
|
|
118
|
-
process.exit(1)
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
main()
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
import { existsSync, mkdirSync, copyFileSync } from 'node:fs'
|
|
4
|
+
import { resolve } from 'node:path'
|
|
5
|
+
import { loadConfig, validateConfig } from '@/config'
|
|
6
|
+
|
|
7
|
+
const REQUIRED_BUN_VERSION = '1.0.0'
|
|
8
|
+
const REQUIRED_DIRS = ['data', 'logs']
|
|
9
|
+
|
|
10
|
+
function log(message: string, type: 'info' | 'success' | 'warn' | 'error' = 'info') {
|
|
11
|
+
const symbols = { info: 'ā¹', success: 'ā', warn: 'ā ', error: 'ā' }
|
|
12
|
+
console.log(`${symbols[type]} ${message}`)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function checkBunVersion(): boolean {
|
|
16
|
+
const version = Bun.version
|
|
17
|
+
const [major, minor, patch] = version.split('.').map(Number)
|
|
18
|
+
const [reqMajor, reqMinor, reqPatch] = REQUIRED_BUN_VERSION.split('.').map(Number)
|
|
19
|
+
|
|
20
|
+
if (major > reqMajor || (major === reqMajor && minor > reqMinor) ||
|
|
21
|
+
(major === reqMajor && minor === reqMinor && patch >= reqPatch)) {
|
|
22
|
+
log(`Bun version ${version} >= ${REQUIRED_BUN_VERSION}`, 'success')
|
|
23
|
+
return true
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
log(`Bun version ${version} < ${REQUIRED_BUN_VERSION} required`, 'error')
|
|
27
|
+
return false
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function createDirectories(): boolean {
|
|
31
|
+
let success = true
|
|
32
|
+
for (const dir of REQUIRED_DIRS) {
|
|
33
|
+
const dirPath = resolve(process.cwd(), dir)
|
|
34
|
+
if (!existsSync(dirPath)) {
|
|
35
|
+
try {
|
|
36
|
+
mkdirSync(dirPath, { recursive: true })
|
|
37
|
+
log(`Created directory: ${dir}`, 'success')
|
|
38
|
+
} catch (error) {
|
|
39
|
+
log(`Failed to create directory: ${dir}`, 'error')
|
|
40
|
+
success = false
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
log(`Directory exists: ${dir}`, 'info')
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return success
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function checkEnvFile(): boolean {
|
|
50
|
+
const envPath = resolve(process.cwd(), '.env')
|
|
51
|
+
const examplePath = resolve(process.cwd(), '.env.example')
|
|
52
|
+
|
|
53
|
+
if (!existsSync(envPath) && existsSync(examplePath)) {
|
|
54
|
+
try {
|
|
55
|
+
copyFileSync(examplePath, envPath)
|
|
56
|
+
log('Created .env from .env.example - please update with your settings', 'warn')
|
|
57
|
+
} catch {
|
|
58
|
+
log('Failed to copy .env.example to .env', 'error')
|
|
59
|
+
return false
|
|
60
|
+
}
|
|
61
|
+
} else if (existsSync(envPath)) {
|
|
62
|
+
log('.env file exists', 'success')
|
|
63
|
+
} else {
|
|
64
|
+
log('No .env or .env.example found', 'warn')
|
|
65
|
+
}
|
|
66
|
+
return true
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function validateConfiguration(): Promise<boolean> {
|
|
70
|
+
try {
|
|
71
|
+
const config = await loadConfig()
|
|
72
|
+
log('Configuration validated successfully', 'success')
|
|
73
|
+
|
|
74
|
+
if (!config.vaultPath || config.vaultPath === '/path/to/your/obsidian/vault') {
|
|
75
|
+
log('VAULT_PATH not configured - update .env with your Obsidian vault path', 'warn')
|
|
76
|
+
} else if (!existsSync(config.vaultPath)) {
|
|
77
|
+
log(`Vault path does not exist: ${config.vaultPath}`, 'warn')
|
|
78
|
+
} else {
|
|
79
|
+
log(`Vault path exists: ${config.vaultPath}`, 'success')
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return true
|
|
83
|
+
} catch (error) {
|
|
84
|
+
log(`Configuration error: ${error instanceof Error ? error.message : error}`, 'error')
|
|
85
|
+
return false
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async function main() {
|
|
90
|
+
console.log('\nš§ Claude Brain Setup\n')
|
|
91
|
+
console.log('ā'.repeat(40))
|
|
92
|
+
|
|
93
|
+
let allPassed = true
|
|
94
|
+
|
|
95
|
+
// Check Bun version
|
|
96
|
+
console.log('\nš¦ Checking Bun version...')
|
|
97
|
+
allPassed = checkBunVersion() && allPassed
|
|
98
|
+
|
|
99
|
+
// Create required directories
|
|
100
|
+
console.log('\nš Creating directories...')
|
|
101
|
+
allPassed = createDirectories() && allPassed
|
|
102
|
+
|
|
103
|
+
// Check/create .env file
|
|
104
|
+
console.log('\nāļø Checking environment...')
|
|
105
|
+
allPassed = checkEnvFile() && allPassed
|
|
106
|
+
|
|
107
|
+
// Validate configuration
|
|
108
|
+
console.log('\nš Validating configuration...')
|
|
109
|
+
allPassed = await validateConfiguration() && allPassed
|
|
110
|
+
|
|
111
|
+
console.log('\n' + 'ā'.repeat(40))
|
|
112
|
+
|
|
113
|
+
if (allPassed) {
|
|
114
|
+
console.log('\nā
Setup complete! Run `bun run dev` to start development.\n')
|
|
115
|
+
process.exit(0)
|
|
116
|
+
} else {
|
|
117
|
+
console.log('\nā ļø Setup completed with warnings. Please review above messages.\n')
|
|
118
|
+
process.exit(1)
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
main()
|