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/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
|
+
}
|