claude-brain 0.15.2 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +191 -191
- package/VERSION +1 -1
- package/assets/CLAUDE-unified.md +11 -11
- package/assets/CLAUDE.md +29 -11
- package/bunfig.toml +8 -8
- package/package.json +82 -82
- package/packs/backend/node.json +173 -173
- package/packs/core/javascript.json +176 -176
- package/packs/core/typescript.json +222 -222
- package/packs/frontend/react.json +254 -254
- package/packs/meta/testing.json +172 -172
- package/scripts/postinstall.mjs +341 -341
- package/src/automation/auto-context.ts +240 -240
- package/src/automation/decision-detector.ts +452 -452
- package/src/automation/index.ts +11 -11
- package/src/automation/phase12-manager.ts +456 -456
- package/src/automation/proactive-recall.ts +373 -373
- package/src/automation/project-detector.ts +310 -310
- package/src/automation/repo-scanner.ts +205 -205
- package/src/cli/auto-setup.ts +82 -82
- package/src/cli/bin.ts +209 -202
- package/src/cli/commands/chroma.ts +573 -573
- package/src/cli/commands/git-hook.ts +189 -189
- package/src/cli/commands/hooks.ts +213 -213
- package/src/cli/commands/init.ts +122 -122
- package/src/cli/commands/install-mcp.ts +92 -92
- package/src/cli/commands/pack.ts +197 -197
- package/src/cli/commands/refresh.ts +323 -0
- package/src/cli/commands/serve.ts +167 -173
- package/src/cli/commands/start.ts +42 -42
- package/src/cli/commands/uninstall-mcp.ts +41 -41
- package/src/cli/commands/update.ts +124 -121
- package/src/cli/diagnose.ts +4 -4
- package/src/cli/health-check.ts +4 -4
- package/src/cli/migrate-chroma.ts +106 -106
- package/src/cli/setup.ts +4 -4
- package/src/cli/ui/animations.ts +80 -80
- package/src/cli/ui/components.ts +82 -82
- package/src/cli/ui/index.ts +4 -4
- package/src/cli/ui/logo.ts +36 -36
- package/src/cli/ui/theme.ts +55 -55
- package/src/config/defaults.ts +50 -50
- package/src/config/home.ts +55 -55
- package/src/config/index.ts +7 -7
- package/src/config/loader.ts +166 -166
- package/src/config/migration.ts +76 -76
- package/src/config/schema.ts +360 -360
- package/src/config/validator.ts +184 -184
- package/src/config/watcher.ts +86 -86
- package/src/context/assembler.ts +398 -398
- package/src/context/cache-manager.ts +101 -101
- package/src/context/formatter.ts +84 -84
- package/src/context/hierarchy.ts +85 -85
- package/src/context/index.ts +83 -83
- package/src/context/progress-tracker.ts +174 -174
- package/src/context/standards-manager.ts +287 -287
- package/src/context/types.ts +252 -252
- package/src/context/validator.ts +58 -58
- package/src/diagnostics/index.ts +123 -123
- package/src/health/index.ts +229 -229
- package/src/hooks/brain-hook.ts +128 -112
- package/src/hooks/capture.ts +168 -205
- package/src/hooks/deduplicator.ts +72 -72
- package/src/hooks/git-capture.ts +109 -109
- package/src/hooks/git-hook-installer.ts +207 -207
- package/src/hooks/index.ts +20 -20
- package/src/hooks/installer.ts +194 -194
- package/src/hooks/passive-classifier.ts +404 -723
- package/src/hooks/queue.ts +129 -129
- package/src/hooks/session-tracker.ts +312 -275
- package/src/hooks/types.ts +47 -47
- package/src/index.ts +7 -7
- package/src/intelligence/cross-project/affinity.ts +162 -162
- package/src/intelligence/cross-project/generalizer.ts +283 -283
- package/src/intelligence/cross-project/index.ts +13 -13
- package/src/intelligence/cross-project/transfer.ts +201 -201
- package/src/intelligence/index.ts +24 -24
- package/src/intelligence/optimization/index.ts +10 -10
- package/src/intelligence/optimization/precompute.ts +202 -202
- package/src/intelligence/optimization/semantic-cache.ts +207 -207
- package/src/intelligence/prediction/context-anticipator.ts +198 -198
- package/src/intelligence/prediction/decision-predictor.ts +184 -184
- package/src/intelligence/prediction/index.ts +13 -13
- package/src/intelligence/prediction/recommender.ts +268 -268
- package/src/intelligence/reasoning/chain-retrieval.ts +247 -247
- package/src/intelligence/reasoning/counterfactual.ts +248 -248
- package/src/intelligence/reasoning/index.ts +13 -13
- package/src/intelligence/reasoning/synthesizer.ts +169 -169
- package/src/intelligence/temporal/evolution.ts +197 -197
- package/src/intelligence/temporal/index.ts +16 -16
- package/src/intelligence/temporal/query-processor.ts +190 -190
- package/src/intelligence/temporal/timeline.ts +259 -259
- package/src/intelligence/temporal/trends.ts +263 -263
- package/src/knowledge/entity-extractor.ts +416 -416
- package/src/knowledge/graph/builder.ts +185 -185
- package/src/knowledge/graph/linker.ts +201 -201
- package/src/knowledge/graph/memory-graph.ts +359 -359
- package/src/knowledge/graph/schema.ts +99 -99
- package/src/knowledge/graph/search.ts +168 -168
- package/src/knowledge/relationship-extractor.ts +108 -108
- package/src/memory/chroma/client.ts +174 -174
- package/src/memory/chroma/collection-manager.ts +94 -94
- package/src/memory/chroma/config.ts +57 -57
- package/src/memory/chroma/embeddings.ts +155 -155
- package/src/memory/chroma/index.ts +82 -82
- package/src/memory/chroma/migration.ts +270 -270
- package/src/memory/chroma/schemas.ts +69 -69
- package/src/memory/chroma/search.ts +315 -315
- package/src/memory/chroma/store.ts +741 -741
- package/src/memory/consolidation/archiver.ts +164 -164
- package/src/memory/consolidation/merger.ts +186 -186
- package/src/memory/consolidation/scorer.ts +138 -138
- package/src/memory/context-builder.ts +236 -236
- package/src/memory/database.ts +169 -169
- package/src/memory/embedding-utils.ts +156 -156
- package/src/memory/embeddings.ts +226 -226
- package/src/memory/episodic/detector.ts +108 -108
- package/src/memory/episodic/manager.ts +351 -351
- package/src/memory/episodic/summarizer.ts +179 -179
- package/src/memory/episodic/types.ts +52 -52
- package/src/memory/index.ts +582 -582
- package/src/memory/knowledge-extractor.ts +455 -455
- package/src/memory/learning.ts +378 -378
- package/src/memory/patterns.ts +396 -396
- package/src/memory/schema.ts +88 -88
- package/src/memory/search.ts +309 -309
- package/src/memory/store.ts +787 -787
- package/src/memory/types.ts +121 -121
- package/src/orchestrator/coordinator.ts +272 -272
- package/src/orchestrator/decision-logger.ts +228 -228
- package/src/orchestrator/event-emitter.ts +198 -198
- package/src/orchestrator/event-queue.ts +184 -184
- package/src/orchestrator/handlers/base-handler.ts +70 -70
- package/src/orchestrator/handlers/context-handler.ts +73 -73
- package/src/orchestrator/handlers/decision-handler.ts +204 -204
- package/src/orchestrator/handlers/index.ts +10 -10
- package/src/orchestrator/handlers/status-handler.ts +131 -131
- package/src/orchestrator/handlers/task-handler.ts +171 -171
- package/src/orchestrator/index.ts +275 -275
- package/src/orchestrator/task-parser.ts +284 -284
- package/src/orchestrator/types.ts +98 -98
- package/src/packs/index.ts +9 -9
- package/src/packs/loader.ts +134 -134
- package/src/packs/manager.ts +204 -204
- package/src/packs/ranker.ts +78 -78
- package/src/packs/types.ts +81 -81
- package/src/phase12/index.ts +5 -5
- package/src/retrieval/bm25/index.ts +300 -300
- package/src/retrieval/bm25/tokenizer.ts +184 -184
- package/src/retrieval/feedback/adaptive.ts +223 -223
- package/src/retrieval/feedback/index.ts +16 -16
- package/src/retrieval/feedback/metrics.ts +223 -223
- package/src/retrieval/feedback/store.ts +283 -283
- package/src/retrieval/fusion/index.ts +194 -194
- package/src/retrieval/fusion/rrf.ts +163 -163
- package/src/retrieval/index.ts +12 -12
- package/src/retrieval/pipeline.ts +375 -375
- package/src/retrieval/query/expander.ts +198 -198
- package/src/retrieval/query/index.ts +27 -27
- package/src/retrieval/query/intent-classifier.ts +236 -236
- package/src/retrieval/query/temporal-parser.ts +295 -295
- package/src/retrieval/reranker/index.ts +188 -188
- package/src/retrieval/reranker/model.ts +95 -95
- package/src/retrieval/service.ts +125 -125
- package/src/retrieval/types.ts +162 -162
- package/src/routing/entity-extractor.ts +428 -428
- package/src/routing/intent-classifier.ts +450 -436
- package/src/routing/response-filter.ts +261 -258
- package/src/routing/router.ts +1441 -1322
- package/src/routing/search-engine.ts +515 -475
- package/src/routing/types.ts +94 -94
- package/src/scripts/health-check.ts +118 -118
- package/src/scripts/setup.ts +122 -122
- package/src/server/handlers/call-tool.ts +156 -156
- package/src/server/handlers/index.ts +9 -9
- package/src/server/handlers/list-tools.ts +35 -35
- package/src/server/handlers/tools/analyze-decision-evolution.ts +151 -151
- package/src/server/handlers/tools/auto-remember.ts +200 -200
- package/src/server/handlers/tools/brain.ts +85 -85
- package/src/server/handlers/tools/create-project.ts +135 -135
- package/src/server/handlers/tools/detect-trends.ts +144 -144
- package/src/server/handlers/tools/find-cross-project-patterns.ts +168 -168
- package/src/server/handlers/tools/get-activity-log.ts +194 -194
- package/src/server/handlers/tools/get-code-standards.ts +124 -124
- package/src/server/handlers/tools/get-corrections.ts +154 -154
- package/src/server/handlers/tools/get-decision-timeline.ts +172 -172
- package/src/server/handlers/tools/get-episode.ts +103 -103
- package/src/server/handlers/tools/get-patterns.ts +158 -158
- package/src/server/handlers/tools/get-phase12-status.ts +63 -63
- package/src/server/handlers/tools/get-project-context.ts +75 -75
- package/src/server/handlers/tools/get-recommendations.ts +145 -145
- package/src/server/handlers/tools/index.ts +31 -31
- package/src/server/handlers/tools/init-project.ts +757 -757
- package/src/server/handlers/tools/list-episodes.ts +90 -90
- package/src/server/handlers/tools/list-projects.ts +125 -125
- package/src/server/handlers/tools/rate-memory.ts +101 -101
- package/src/server/handlers/tools/recall-similar.ts +87 -87
- package/src/server/handlers/tools/recognize-pattern.ts +126 -126
- package/src/server/handlers/tools/record-correction.ts +125 -125
- package/src/server/handlers/tools/remember-decision.ts +153 -153
- package/src/server/handlers/tools/schemas.ts +253 -253
- package/src/server/handlers/tools/search-knowledge-graph.ts +102 -102
- package/src/server/handlers/tools/smart-context.ts +146 -146
- package/src/server/handlers/tools/update-progress.ts +131 -131
- package/src/server/handlers/tools/what-if-analysis.ts +135 -135
- package/src/server/http-api.ts +693 -693
- package/src/server/index.ts +40 -40
- package/src/server/mcp-server.ts +283 -283
- package/src/server/providers/index.ts +7 -7
- package/src/server/providers/prompts.ts +327 -327
- package/src/server/providers/resources.ts +622 -622
- package/src/server/services.ts +468 -468
- package/src/server/types.ts +39 -39
- package/src/server/utils/error-handler.ts +155 -155
- package/src/server/utils/index.ts +13 -13
- package/src/server/utils/memory-indicator.ts +83 -83
- package/src/server/utils/request-context.ts +122 -122
- package/src/server/utils/response-formatter.ts +129 -129
- package/src/server/utils/validators.ts +210 -210
- package/src/setup/index.ts +48 -48
- package/src/setup/wizard.ts +461 -461
- package/src/tools/index.ts +24 -24
- package/src/tools/registry.ts +115 -115
- package/src/tools/schemas.test.ts +30 -30
- package/src/tools/schemas.ts +617 -617
- package/src/tools/types.ts +412 -412
- package/src/utils/circuit-breaker.ts +130 -130
- package/src/utils/cleanup.ts +34 -34
- package/src/utils/error-handler.ts +132 -132
- package/src/utils/error-messages.ts +60 -60
- package/src/utils/fallback.ts +45 -45
- package/src/utils/index.ts +54 -54
- package/src/utils/logger-utils.ts +80 -80
- package/src/utils/logger.ts +88 -88
- package/src/utils/phase12-helper.ts +56 -56
- package/src/utils/retry.ts +94 -94
- package/src/utils/timing.ts +47 -47
- package/src/utils/transaction.ts +63 -63
- package/src/vault/frontmatter.ts +264 -264
- package/src/vault/index.ts +318 -318
- package/src/vault/paths.ts +106 -106
- package/src/vault/query.ts +422 -422
- package/src/vault/reader.ts +264 -264
- package/src/vault/templates.ts +186 -186
- package/src/vault/types.ts +73 -73
- package/src/vault/watcher.ts +277 -277
- package/src/vault/writer.ts +413 -413
- package/tsconfig.json +30 -30
- package/src/cli/auto-update.ts +0 -157
package/src/cli/ui/animations.ts
CHANGED
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
import ora from 'ora'
|
|
2
|
-
import { theme } from './theme.js'
|
|
3
|
-
|
|
4
|
-
const isTTY = process.stdout.isTTY === true
|
|
5
|
-
|
|
6
|
-
// Async delay utility
|
|
7
|
-
export function delay(ms: number): Promise<void> {
|
|
8
|
-
return new Promise(resolve => setTimeout(resolve, ms))
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
// Character-by-character text output with configurable speed
|
|
12
|
-
export async function typewrite(text: string, speed = 30): Promise<void> {
|
|
13
|
-
if (!isTTY) {
|
|
14
|
-
process.stdout.write(text + '\n')
|
|
15
|
-
return
|
|
16
|
-
}
|
|
17
|
-
for (const char of text) {
|
|
18
|
-
process.stdout.write(char)
|
|
19
|
-
await delay(speed)
|
|
20
|
-
}
|
|
21
|
-
process.stdout.write('\n')
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// Wraps async operations with ora spinner, auto succeed/fail
|
|
25
|
-
export async function withSpinner<T>(label: string, fn: () => Promise<T>): Promise<T> {
|
|
26
|
-
if (!isTTY) {
|
|
27
|
-
process.stdout.write(`${label}...`)
|
|
28
|
-
try {
|
|
29
|
-
const result = await fn()
|
|
30
|
-
process.stdout.write(' done\n')
|
|
31
|
-
return result
|
|
32
|
-
} catch (error) {
|
|
33
|
-
process.stdout.write(' failed\n')
|
|
34
|
-
throw error
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const spinner = ora({
|
|
39
|
-
text: label,
|
|
40
|
-
color: 'magenta',
|
|
41
|
-
}).start()
|
|
42
|
-
|
|
43
|
-
try {
|
|
44
|
-
const result = await fn()
|
|
45
|
-
spinner.succeed(theme.success(label))
|
|
46
|
-
return result
|
|
47
|
-
} catch (error) {
|
|
48
|
-
spinner.fail(theme.error(label))
|
|
49
|
-
throw error
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Pause between sections for visual breathing room
|
|
54
|
-
export async function transition(ms = 300): Promise<void> {
|
|
55
|
-
if (!isTTY) return
|
|
56
|
-
await delay(ms)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Progress bar that fills over time
|
|
60
|
-
export async function animateProgress(label: string, durationMs = 1000, width = 30): Promise<void> {
|
|
61
|
-
if (!isTTY) {
|
|
62
|
-
console.log(`${label}... done`)
|
|
63
|
-
return
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const steps = 20
|
|
67
|
-
const stepDelay = durationMs / steps
|
|
68
|
-
|
|
69
|
-
for (let i = 0; i <= steps; i++) {
|
|
70
|
-
const percent = Math.round((i / steps) * 100)
|
|
71
|
-
const filled = Math.round((percent / 100) * width)
|
|
72
|
-
const empty = width - filled
|
|
73
|
-
const bar = theme.primary('='.repeat(Math.max(0, filled - 1)) + (filled > 0 ? '>' : '')) +
|
|
74
|
-
' '.repeat(empty)
|
|
75
|
-
const pct = theme.dim(`${percent}%`)
|
|
76
|
-
process.stdout.write(`\r ${label} [${bar}] ${pct}`)
|
|
77
|
-
await delay(stepDelay)
|
|
78
|
-
}
|
|
79
|
-
process.stdout.write('\n')
|
|
80
|
-
}
|
|
1
|
+
import ora from 'ora'
|
|
2
|
+
import { theme } from './theme.js'
|
|
3
|
+
|
|
4
|
+
const isTTY = process.stdout.isTTY === true
|
|
5
|
+
|
|
6
|
+
// Async delay utility
|
|
7
|
+
export function delay(ms: number): Promise<void> {
|
|
8
|
+
return new Promise(resolve => setTimeout(resolve, ms))
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// Character-by-character text output with configurable speed
|
|
12
|
+
export async function typewrite(text: string, speed = 30): Promise<void> {
|
|
13
|
+
if (!isTTY) {
|
|
14
|
+
process.stdout.write(text + '\n')
|
|
15
|
+
return
|
|
16
|
+
}
|
|
17
|
+
for (const char of text) {
|
|
18
|
+
process.stdout.write(char)
|
|
19
|
+
await delay(speed)
|
|
20
|
+
}
|
|
21
|
+
process.stdout.write('\n')
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Wraps async operations with ora spinner, auto succeed/fail
|
|
25
|
+
export async function withSpinner<T>(label: string, fn: () => Promise<T>): Promise<T> {
|
|
26
|
+
if (!isTTY) {
|
|
27
|
+
process.stdout.write(`${label}...`)
|
|
28
|
+
try {
|
|
29
|
+
const result = await fn()
|
|
30
|
+
process.stdout.write(' done\n')
|
|
31
|
+
return result
|
|
32
|
+
} catch (error) {
|
|
33
|
+
process.stdout.write(' failed\n')
|
|
34
|
+
throw error
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const spinner = ora({
|
|
39
|
+
text: label,
|
|
40
|
+
color: 'magenta',
|
|
41
|
+
}).start()
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
const result = await fn()
|
|
45
|
+
spinner.succeed(theme.success(label))
|
|
46
|
+
return result
|
|
47
|
+
} catch (error) {
|
|
48
|
+
spinner.fail(theme.error(label))
|
|
49
|
+
throw error
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Pause between sections for visual breathing room
|
|
54
|
+
export async function transition(ms = 300): Promise<void> {
|
|
55
|
+
if (!isTTY) return
|
|
56
|
+
await delay(ms)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Progress bar that fills over time
|
|
60
|
+
export async function animateProgress(label: string, durationMs = 1000, width = 30): Promise<void> {
|
|
61
|
+
if (!isTTY) {
|
|
62
|
+
console.log(`${label}... done`)
|
|
63
|
+
return
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const steps = 20
|
|
67
|
+
const stepDelay = durationMs / steps
|
|
68
|
+
|
|
69
|
+
for (let i = 0; i <= steps; i++) {
|
|
70
|
+
const percent = Math.round((i / steps) * 100)
|
|
71
|
+
const filled = Math.round((percent / 100) * width)
|
|
72
|
+
const empty = width - filled
|
|
73
|
+
const bar = theme.primary('='.repeat(Math.max(0, filled - 1)) + (filled > 0 ? '>' : '')) +
|
|
74
|
+
' '.repeat(empty)
|
|
75
|
+
const pct = theme.dim(`${percent}%`)
|
|
76
|
+
process.stdout.write(`\r ${label} [${bar}] ${pct}`)
|
|
77
|
+
await delay(stepDelay)
|
|
78
|
+
}
|
|
79
|
+
process.stdout.write('\n')
|
|
80
|
+
}
|
package/src/cli/ui/components.ts
CHANGED
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
import { theme, dimText, heading } from './theme.js'
|
|
2
|
-
|
|
3
|
-
const BOX_WIDTH = 60
|
|
4
|
-
|
|
5
|
-
// Unicode box-drawing panel with optional title
|
|
6
|
-
export function box(content: string, title?: string): string {
|
|
7
|
-
const innerWidth = BOX_WIDTH - 2
|
|
8
|
-
const lines = content.split('\n')
|
|
9
|
-
|
|
10
|
-
let top: string
|
|
11
|
-
if (title) {
|
|
12
|
-
const titleText = ` ${title} `
|
|
13
|
-
const remaining = innerWidth - titleText.length - 1
|
|
14
|
-
top = theme.secondary('╭─') + theme.primary.bold(titleText) + theme.secondary('─'.repeat(Math.max(0, remaining)) + '╮')
|
|
15
|
-
} else {
|
|
16
|
-
top = theme.secondary('╭' + '─'.repeat(innerWidth) + '╮')
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const bottom = theme.secondary('╰' + '─'.repeat(innerWidth) + '╯')
|
|
20
|
-
|
|
21
|
-
const body = lines.map(line => {
|
|
22
|
-
// Strip ANSI codes to calculate visible length
|
|
23
|
-
const visible = stripAnsi(line)
|
|
24
|
-
const padding = Math.max(0, innerWidth - visible.length - 1)
|
|
25
|
-
return theme.secondary('│') + ' ' + line + ' '.repeat(padding) + theme.secondary('│')
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
return [top, ...body, bottom].join('\n')
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Step indicator: [Step 2/5] Configuring Vault
|
|
32
|
-
export function stepIndicator(current: number, total: number, label: string): string {
|
|
33
|
-
const badge = theme.secondary(`[Step ${current}/${total}]`)
|
|
34
|
-
const text = heading(label)
|
|
35
|
-
return `\n${badge} ${text}\n`
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// Progress bar: [========> ] 40%
|
|
39
|
-
export function progressBar(percent: number, width = 30): string {
|
|
40
|
-
const filled = Math.round((percent / 100) * width)
|
|
41
|
-
const empty = width - filled
|
|
42
|
-
const bar = theme.primary('='.repeat(Math.max(0, filled - 1)) + (filled > 0 ? '>' : '')) +
|
|
43
|
-
dimText(' '.repeat(empty))
|
|
44
|
-
const pct = theme.dim(`${Math.round(percent)}%`)
|
|
45
|
-
return `[${bar}] ${pct}`
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Info panel: key-value list in a box
|
|
49
|
-
export function infoPanel(title: string, items: Record<string, string>): string {
|
|
50
|
-
const lines = Object.entries(items).map(([key, value]) => {
|
|
51
|
-
return `${theme.dim(key + ':')} ${theme.white(value)}`
|
|
52
|
-
})
|
|
53
|
-
return box(lines.join('\n'), title)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Styled horizontal divider
|
|
57
|
-
export function divider(): string {
|
|
58
|
-
return theme.secondary('─'.repeat(BOX_WIDTH))
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Summary panel with status icons
|
|
62
|
-
export function summaryPanel(title: string, items: Array<{ label: string; value: string; status?: 'success' | 'warning' | 'error' | 'info' }>): string {
|
|
63
|
-
const statusIcons: Record<string, string> = {
|
|
64
|
-
success: theme.success('+'),
|
|
65
|
-
warning: theme.warning('!'),
|
|
66
|
-
error: theme.error('x'),
|
|
67
|
-
info: theme.primary('*'),
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const lines = items.map(item => {
|
|
71
|
-
const icon = item.status ? statusIcons[item.status] ?? ' ' : ' '
|
|
72
|
-
return ` ${icon} ${theme.dim(item.label + ':')} ${theme.white(item.value)}`
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
return box(lines.join('\n'), title)
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// Strip ANSI escape codes for length calculation
|
|
79
|
-
function stripAnsi(str: string): string {
|
|
80
|
-
// eslint-disable-next-line no-control-regex
|
|
81
|
-
return str.replace(/\u001B\[[0-9;]*[a-zA-Z]/g, '')
|
|
82
|
-
}
|
|
1
|
+
import { theme, dimText, heading } from './theme.js'
|
|
2
|
+
|
|
3
|
+
const BOX_WIDTH = 60
|
|
4
|
+
|
|
5
|
+
// Unicode box-drawing panel with optional title
|
|
6
|
+
export function box(content: string, title?: string): string {
|
|
7
|
+
const innerWidth = BOX_WIDTH - 2
|
|
8
|
+
const lines = content.split('\n')
|
|
9
|
+
|
|
10
|
+
let top: string
|
|
11
|
+
if (title) {
|
|
12
|
+
const titleText = ` ${title} `
|
|
13
|
+
const remaining = innerWidth - titleText.length - 1
|
|
14
|
+
top = theme.secondary('╭─') + theme.primary.bold(titleText) + theme.secondary('─'.repeat(Math.max(0, remaining)) + '╮')
|
|
15
|
+
} else {
|
|
16
|
+
top = theme.secondary('╭' + '─'.repeat(innerWidth) + '╮')
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const bottom = theme.secondary('╰' + '─'.repeat(innerWidth) + '╯')
|
|
20
|
+
|
|
21
|
+
const body = lines.map(line => {
|
|
22
|
+
// Strip ANSI codes to calculate visible length
|
|
23
|
+
const visible = stripAnsi(line)
|
|
24
|
+
const padding = Math.max(0, innerWidth - visible.length - 1)
|
|
25
|
+
return theme.secondary('│') + ' ' + line + ' '.repeat(padding) + theme.secondary('│')
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
return [top, ...body, bottom].join('\n')
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Step indicator: [Step 2/5] Configuring Vault
|
|
32
|
+
export function stepIndicator(current: number, total: number, label: string): string {
|
|
33
|
+
const badge = theme.secondary(`[Step ${current}/${total}]`)
|
|
34
|
+
const text = heading(label)
|
|
35
|
+
return `\n${badge} ${text}\n`
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Progress bar: [========> ] 40%
|
|
39
|
+
export function progressBar(percent: number, width = 30): string {
|
|
40
|
+
const filled = Math.round((percent / 100) * width)
|
|
41
|
+
const empty = width - filled
|
|
42
|
+
const bar = theme.primary('='.repeat(Math.max(0, filled - 1)) + (filled > 0 ? '>' : '')) +
|
|
43
|
+
dimText(' '.repeat(empty))
|
|
44
|
+
const pct = theme.dim(`${Math.round(percent)}%`)
|
|
45
|
+
return `[${bar}] ${pct}`
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Info panel: key-value list in a box
|
|
49
|
+
export function infoPanel(title: string, items: Record<string, string>): string {
|
|
50
|
+
const lines = Object.entries(items).map(([key, value]) => {
|
|
51
|
+
return `${theme.dim(key + ':')} ${theme.white(value)}`
|
|
52
|
+
})
|
|
53
|
+
return box(lines.join('\n'), title)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Styled horizontal divider
|
|
57
|
+
export function divider(): string {
|
|
58
|
+
return theme.secondary('─'.repeat(BOX_WIDTH))
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Summary panel with status icons
|
|
62
|
+
export function summaryPanel(title: string, items: Array<{ label: string; value: string; status?: 'success' | 'warning' | 'error' | 'info' }>): string {
|
|
63
|
+
const statusIcons: Record<string, string> = {
|
|
64
|
+
success: theme.success('+'),
|
|
65
|
+
warning: theme.warning('!'),
|
|
66
|
+
error: theme.error('x'),
|
|
67
|
+
info: theme.primary('*'),
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const lines = items.map(item => {
|
|
71
|
+
const icon = item.status ? statusIcons[item.status] ?? ' ' : ' '
|
|
72
|
+
return ` ${icon} ${theme.dim(item.label + ':')} ${theme.white(item.value)}`
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
return box(lines.join('\n'), title)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Strip ANSI escape codes for length calculation
|
|
79
|
+
function stripAnsi(str: string): string {
|
|
80
|
+
// eslint-disable-next-line no-control-regex
|
|
81
|
+
return str.replace(/\u001B\[[0-9;]*[a-zA-Z]/g, '')
|
|
82
|
+
}
|
package/src/cli/ui/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from './theme.js'
|
|
2
|
-
export * from './components.js'
|
|
3
|
-
export * from './logo.js'
|
|
4
|
-
export * from './animations.js'
|
|
1
|
+
export * from './theme.js'
|
|
2
|
+
export * from './components.js'
|
|
3
|
+
export * from './logo.js'
|
|
4
|
+
export * from './animations.js'
|
package/src/cli/ui/logo.ts
CHANGED
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
import chalk from 'chalk'
|
|
2
|
-
import { box } from './components.js'
|
|
3
|
-
import { dimText } from './theme.js'
|
|
4
|
-
|
|
5
|
-
// 5-shade gradient from light purple to dark violet
|
|
6
|
-
const gradientColors = [
|
|
7
|
-
'#A78BFA', // light purple
|
|
8
|
-
'#8B5CF6', // medium purple
|
|
9
|
-
'#7C3AED', // deep purple (primary)
|
|
10
|
-
'#6D28D9', // dark purple
|
|
11
|
-
'#5B21B6', // dark violet (secondary)
|
|
12
|
-
]
|
|
13
|
-
|
|
14
|
-
const logoLines = [
|
|
15
|
-
' ██████╗ ██████╗ █████╗ ██╗███╗ ██╗ ',
|
|
16
|
-
' ██╔══██╗██╔══██╗██╔══██╗██║████╗ ██║ ',
|
|
17
|
-
' ██████╔╝██████╔╝███████║██║██╔██╗ ██║ ',
|
|
18
|
-
' ██╔══██╗██╔══██╗██╔══██║██║██║╚██╗██║ ',
|
|
19
|
-
' ██████╔╝██║ ██║██║ ██║██║██║ ╚████║ ',
|
|
20
|
-
' ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝ ',
|
|
21
|
-
]
|
|
22
|
-
|
|
23
|
-
export function renderLogo(): string {
|
|
24
|
-
return logoLines
|
|
25
|
-
.map((line, i) => chalk.hex(gradientColors[i] ?? gradientColors[gradientColors.length - 1]!)(line))
|
|
26
|
-
.join('\n')
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function renderBanner(version: string): string {
|
|
30
|
-
const logo = renderLogo()
|
|
31
|
-
const tagline = dimText(' Local Development Assistant with Memory')
|
|
32
|
-
const ver = dimText(` v${version}`)
|
|
33
|
-
|
|
34
|
-
const content = [logo, '', tagline, ver].join('\n')
|
|
35
|
-
return box(content, 'Claude Brain')
|
|
36
|
-
}
|
|
1
|
+
import chalk from 'chalk'
|
|
2
|
+
import { box } from './components.js'
|
|
3
|
+
import { dimText } from './theme.js'
|
|
4
|
+
|
|
5
|
+
// 5-shade gradient from light purple to dark violet
|
|
6
|
+
const gradientColors = [
|
|
7
|
+
'#A78BFA', // light purple
|
|
8
|
+
'#8B5CF6', // medium purple
|
|
9
|
+
'#7C3AED', // deep purple (primary)
|
|
10
|
+
'#6D28D9', // dark purple
|
|
11
|
+
'#5B21B6', // dark violet (secondary)
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
const logoLines = [
|
|
15
|
+
' ██████╗ ██████╗ █████╗ ██╗███╗ ██╗ ',
|
|
16
|
+
' ██╔══██╗██╔══██╗██╔══██╗██║████╗ ██║ ',
|
|
17
|
+
' ██████╔╝██████╔╝███████║██║██╔██╗ ██║ ',
|
|
18
|
+
' ██╔══██╗██╔══██╗██╔══██║██║██║╚██╗██║ ',
|
|
19
|
+
' ██████╔╝██║ ██║██║ ██║██║██║ ╚████║ ',
|
|
20
|
+
' ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝ ',
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
export function renderLogo(): string {
|
|
24
|
+
return logoLines
|
|
25
|
+
.map((line, i) => chalk.hex(gradientColors[i] ?? gradientColors[gradientColors.length - 1]!)(line))
|
|
26
|
+
.join('\n')
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function renderBanner(version: string): string {
|
|
30
|
+
const logo = renderLogo()
|
|
31
|
+
const tagline = dimText(' Local Development Assistant with Memory')
|
|
32
|
+
const ver = dimText(` v${version}`)
|
|
33
|
+
|
|
34
|
+
const content = [logo, '', tagline, ver].join('\n')
|
|
35
|
+
return box(content, 'Claude Brain')
|
|
36
|
+
}
|
package/src/cli/ui/theme.ts
CHANGED
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
import chalk from 'chalk'
|
|
2
|
-
|
|
3
|
-
// Color palette
|
|
4
|
-
export const colors = {
|
|
5
|
-
deepPurple: '#7C3AED',
|
|
6
|
-
darkViolet: '#5B21B6',
|
|
7
|
-
charcoal: '#1A1A1A',
|
|
8
|
-
nearBlack: '#0A0A0A',
|
|
9
|
-
darkRed: '#B91C1C',
|
|
10
|
-
green: '#22C55E',
|
|
11
|
-
amber: '#F59E0B',
|
|
12
|
-
white: '#FFFFFF',
|
|
13
|
-
gray: '#6B7280',
|
|
14
|
-
} as const
|
|
15
|
-
|
|
16
|
-
// Pre-built chalk instances
|
|
17
|
-
export const theme = {
|
|
18
|
-
primary: chalk.hex(colors.deepPurple),
|
|
19
|
-
secondary: chalk.hex(colors.darkViolet),
|
|
20
|
-
error: chalk.hex(colors.darkRed),
|
|
21
|
-
success: chalk.hex(colors.green),
|
|
22
|
-
warning: chalk.hex(colors.amber),
|
|
23
|
-
dim: chalk.hex(colors.gray),
|
|
24
|
-
bold: chalk.bold,
|
|
25
|
-
white: chalk.white,
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// Styled text helpers
|
|
29
|
-
export function heading(text: string): string {
|
|
30
|
-
return theme.primary.bold(text)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export function successText(text: string): string {
|
|
34
|
-
return theme.success(` ${text}`)
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export function errorText(text: string): string {
|
|
38
|
-
return theme.error(` ${text}`)
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function warningText(text: string): string {
|
|
42
|
-
return theme.warning(` ${text}`)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export function dimText(text: string): string {
|
|
46
|
-
return theme.dim(text)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export function highlight(text: string): string {
|
|
50
|
-
return theme.primary(text)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function keyValue(key: string, value: string): string {
|
|
54
|
-
return `${theme.dim(key + ':')} ${theme.white(value)}`
|
|
55
|
-
}
|
|
1
|
+
import chalk from 'chalk'
|
|
2
|
+
|
|
3
|
+
// Color palette
|
|
4
|
+
export const colors = {
|
|
5
|
+
deepPurple: '#7C3AED',
|
|
6
|
+
darkViolet: '#5B21B6',
|
|
7
|
+
charcoal: '#1A1A1A',
|
|
8
|
+
nearBlack: '#0A0A0A',
|
|
9
|
+
darkRed: '#B91C1C',
|
|
10
|
+
green: '#22C55E',
|
|
11
|
+
amber: '#F59E0B',
|
|
12
|
+
white: '#FFFFFF',
|
|
13
|
+
gray: '#6B7280',
|
|
14
|
+
} as const
|
|
15
|
+
|
|
16
|
+
// Pre-built chalk instances
|
|
17
|
+
export const theme = {
|
|
18
|
+
primary: chalk.hex(colors.deepPurple),
|
|
19
|
+
secondary: chalk.hex(colors.darkViolet),
|
|
20
|
+
error: chalk.hex(colors.darkRed),
|
|
21
|
+
success: chalk.hex(colors.green),
|
|
22
|
+
warning: chalk.hex(colors.amber),
|
|
23
|
+
dim: chalk.hex(colors.gray),
|
|
24
|
+
bold: chalk.bold,
|
|
25
|
+
white: chalk.white,
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Styled text helpers
|
|
29
|
+
export function heading(text: string): string {
|
|
30
|
+
return theme.primary.bold(text)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function successText(text: string): string {
|
|
34
|
+
return theme.success(` ${text}`)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function errorText(text: string): string {
|
|
38
|
+
return theme.error(` ${text}`)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function warningText(text: string): string {
|
|
42
|
+
return theme.warning(` ${text}`)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function dimText(text: string): string {
|
|
46
|
+
return theme.dim(text)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function highlight(text: string): string {
|
|
50
|
+
return theme.primary(text)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function keyValue(key: string, value: string): string {
|
|
54
|
+
return `${theme.dim(key + ':')} ${theme.white(value)}`
|
|
55
|
+
}
|
package/src/config/defaults.ts
CHANGED
|
@@ -1,50 +1,50 @@
|
|
|
1
|
-
import type { PartialConfig } from './schema'
|
|
2
|
-
|
|
3
|
-
/** Default configuration values for Claude Brain */
|
|
4
|
-
export const defaultConfig: PartialConfig = {
|
|
5
|
-
serverName: 'claude-brain',
|
|
6
|
-
serverVersion: '0.
|
|
7
|
-
logLevel: 'info',
|
|
8
|
-
logFilePath: './logs/claude-brain.log',
|
|
9
|
-
dbPath: './data/memory.db',
|
|
10
|
-
port: 3000,
|
|
11
|
-
enableFileWatch: true,
|
|
12
|
-
cacheSize: 100,
|
|
13
|
-
nodeEnv: 'development',
|
|
14
|
-
retrieval: {
|
|
15
|
-
enabled: false,
|
|
16
|
-
dense: {
|
|
17
|
-
weight: 0.7,
|
|
18
|
-
limit: 20,
|
|
19
|
-
minSimilarity: 0.3
|
|
20
|
-
},
|
|
21
|
-
sparse: {
|
|
22
|
-
enabled: true,
|
|
23
|
-
weight: 0.3,
|
|
24
|
-
limit: 20
|
|
25
|
-
},
|
|
26
|
-
fusion: {
|
|
27
|
-
method: 'rrf',
|
|
28
|
-
rrfK: 60
|
|
29
|
-
},
|
|
30
|
-
reranker: {
|
|
31
|
-
enabled: false,
|
|
32
|
-
model: 'cross-encoder/ms-marco-MiniLM-L-6-v2',
|
|
33
|
-
topK: 10
|
|
34
|
-
},
|
|
35
|
-
queryUnderstanding: {
|
|
36
|
-
enabled: true,
|
|
37
|
-
intentClassification: true,
|
|
38
|
-
queryExpansion: true,
|
|
39
|
-
temporalParsing: true
|
|
40
|
-
},
|
|
41
|
-
feedback: {
|
|
42
|
-
enabled: true,
|
|
43
|
-
adaptiveThresholds: true,
|
|
44
|
-
minFeedbackForAdaptation: 10
|
|
45
|
-
}
|
|
46
|
-
},
|
|
47
|
-
intelligence: {
|
|
48
|
-
enabled: false
|
|
49
|
-
}
|
|
50
|
-
}
|
|
1
|
+
import type { PartialConfig } from './schema'
|
|
2
|
+
|
|
3
|
+
/** Default configuration values for Claude Brain */
|
|
4
|
+
export const defaultConfig: PartialConfig = {
|
|
5
|
+
serverName: 'claude-brain',
|
|
6
|
+
serverVersion: '0.16.0',
|
|
7
|
+
logLevel: 'info',
|
|
8
|
+
logFilePath: './logs/claude-brain.log',
|
|
9
|
+
dbPath: './data/memory.db',
|
|
10
|
+
port: 3000,
|
|
11
|
+
enableFileWatch: true,
|
|
12
|
+
cacheSize: 100,
|
|
13
|
+
nodeEnv: 'development',
|
|
14
|
+
retrieval: {
|
|
15
|
+
enabled: false,
|
|
16
|
+
dense: {
|
|
17
|
+
weight: 0.7,
|
|
18
|
+
limit: 20,
|
|
19
|
+
minSimilarity: 0.3
|
|
20
|
+
},
|
|
21
|
+
sparse: {
|
|
22
|
+
enabled: true,
|
|
23
|
+
weight: 0.3,
|
|
24
|
+
limit: 20
|
|
25
|
+
},
|
|
26
|
+
fusion: {
|
|
27
|
+
method: 'rrf',
|
|
28
|
+
rrfK: 60
|
|
29
|
+
},
|
|
30
|
+
reranker: {
|
|
31
|
+
enabled: false,
|
|
32
|
+
model: 'cross-encoder/ms-marco-MiniLM-L-6-v2',
|
|
33
|
+
topK: 10
|
|
34
|
+
},
|
|
35
|
+
queryUnderstanding: {
|
|
36
|
+
enabled: true,
|
|
37
|
+
intentClassification: true,
|
|
38
|
+
queryExpansion: true,
|
|
39
|
+
temporalParsing: true
|
|
40
|
+
},
|
|
41
|
+
feedback: {
|
|
42
|
+
enabled: true,
|
|
43
|
+
adaptiveThresholds: true,
|
|
44
|
+
minFeedbackForAdaptation: 10
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
intelligence: {
|
|
48
|
+
enabled: false
|
|
49
|
+
}
|
|
50
|
+
}
|