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
|
@@ -1,92 +1,92 @@
|
|
|
1
|
-
import { execSync } from 'node:child_process'
|
|
2
|
-
import {
|
|
3
|
-
renderLogo, theme, heading, successText, warningText, errorText, dimText,
|
|
4
|
-
box, withSpinner,
|
|
5
|
-
} from '@/cli/ui/index.js'
|
|
6
|
-
|
|
7
|
-
function isGloballyInstalled(): boolean {
|
|
8
|
-
const cmd = process.platform === 'win32' ? 'where claude-brain' : 'which claude-brain'
|
|
9
|
-
try {
|
|
10
|
-
const result = execSync(cmd, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] })
|
|
11
|
-
return result.trim().length > 0
|
|
12
|
-
} catch {
|
|
13
|
-
return false
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function isMcpAlreadyConfigured(): boolean {
|
|
18
|
-
try {
|
|
19
|
-
const result = execSync('claude mcp list', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] })
|
|
20
|
-
return result.includes('claude-brain')
|
|
21
|
-
} catch {
|
|
22
|
-
return false
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export async function runInstall() {
|
|
27
|
-
console.log()
|
|
28
|
-
console.log(renderLogo())
|
|
29
|
-
console.log()
|
|
30
|
-
console.log(heading('MCP Installation'))
|
|
31
|
-
console.log()
|
|
32
|
-
|
|
33
|
-
const installed = isGloballyInstalled()
|
|
34
|
-
|
|
35
|
-
if (installed) {
|
|
36
|
-
console.log(successText('claude-brain is globally installed'))
|
|
37
|
-
console.log()
|
|
38
|
-
|
|
39
|
-
if (isMcpAlreadyConfigured()) {
|
|
40
|
-
console.log(box(successText('Already MCP configured. Claude Brain is registered as an MCP server.'), 'Success'))
|
|
41
|
-
} else {
|
|
42
|
-
try {
|
|
43
|
-
await withSpinner('Registering with Claude Code', async () => {
|
|
44
|
-
execSync('claude mcp add claude-brain -- claude-brain serve', {
|
|
45
|
-
encoding: 'utf-8',
|
|
46
|
-
stdio: ['pipe', 'pipe', 'pipe']
|
|
47
|
-
})
|
|
48
|
-
})
|
|
49
|
-
console.log()
|
|
50
|
-
console.log(box(successText('Claude Brain registered as MCP server in Claude Code.'), 'Success'))
|
|
51
|
-
} catch (err) {
|
|
52
|
-
const errorMsg = err instanceof Error ? err.message : String(err)
|
|
53
|
-
if (errorMsg.includes('already') || errorMsg.includes('exists')) {
|
|
54
|
-
console.log()
|
|
55
|
-
console.log(box(successText('Already MCP configured. Claude Brain is registered as an MCP server.'), 'Success'))
|
|
56
|
-
} else {
|
|
57
|
-
console.log()
|
|
58
|
-
console.log(box([
|
|
59
|
-
errorText('Failed to register automatically.'),
|
|
60
|
-
'',
|
|
61
|
-
dimText('Run manually:'),
|
|
62
|
-
` ${theme.bold('claude mcp add claude-brain -- claude-brain serve')}`,
|
|
63
|
-
].join('\n'), 'Error'))
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
} else {
|
|
68
|
-
console.log(warningText('claude-brain is not globally installed'))
|
|
69
|
-
console.log()
|
|
70
|
-
|
|
71
|
-
console.log(box([
|
|
72
|
-
`${theme.primary('Option 1:')} Install globally, then register`,
|
|
73
|
-
` ${theme.bold('bun install -g claude-brain')}`,
|
|
74
|
-
` ${theme.bold('claude mcp add claude-brain -- claude-brain serve')}`,
|
|
75
|
-
'',
|
|
76
|
-
`${theme.primary('Option 2:')} Use bunx ${dimText('(zero-install)')}`,
|
|
77
|
-
` ${theme.bold('claude mcp add claude-brain -- bunx claude-brain@latest')}`,
|
|
78
|
-
'',
|
|
79
|
-
`${theme.primary('Option 3:')} Add to Claude Code config manually`,
|
|
80
|
-
dimText(' Add to your Claude Code MCP settings:'),
|
|
81
|
-
` ${theme.dim('{')}`,
|
|
82
|
-
` ${theme.dim('"mcpServers": {')}`,
|
|
83
|
-
` ${theme.dim('"claude-brain": {')}`,
|
|
84
|
-
` ${theme.dim('"command": "bunx",')}`,
|
|
85
|
-
` ${theme.dim('"args": ["claude-brain@latest"]')}`,
|
|
86
|
-
` ${theme.dim('}')}`,
|
|
87
|
-
` ${theme.dim('}')}`,
|
|
88
|
-
` ${theme.dim('}')}`,
|
|
89
|
-
].join('\n'), 'Install Options'))
|
|
90
|
-
}
|
|
91
|
-
console.log()
|
|
92
|
-
}
|
|
1
|
+
import { execSync } from 'node:child_process'
|
|
2
|
+
import {
|
|
3
|
+
renderLogo, theme, heading, successText, warningText, errorText, dimText,
|
|
4
|
+
box, withSpinner,
|
|
5
|
+
} from '@/cli/ui/index.js'
|
|
6
|
+
|
|
7
|
+
function isGloballyInstalled(): boolean {
|
|
8
|
+
const cmd = process.platform === 'win32' ? 'where claude-brain' : 'which claude-brain'
|
|
9
|
+
try {
|
|
10
|
+
const result = execSync(cmd, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] })
|
|
11
|
+
return result.trim().length > 0
|
|
12
|
+
} catch {
|
|
13
|
+
return false
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function isMcpAlreadyConfigured(): boolean {
|
|
18
|
+
try {
|
|
19
|
+
const result = execSync('claude mcp list', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] })
|
|
20
|
+
return result.includes('claude-brain')
|
|
21
|
+
} catch {
|
|
22
|
+
return false
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export async function runInstall() {
|
|
27
|
+
console.log()
|
|
28
|
+
console.log(renderLogo())
|
|
29
|
+
console.log()
|
|
30
|
+
console.log(heading('MCP Installation'))
|
|
31
|
+
console.log()
|
|
32
|
+
|
|
33
|
+
const installed = isGloballyInstalled()
|
|
34
|
+
|
|
35
|
+
if (installed) {
|
|
36
|
+
console.log(successText('claude-brain is globally installed'))
|
|
37
|
+
console.log()
|
|
38
|
+
|
|
39
|
+
if (isMcpAlreadyConfigured()) {
|
|
40
|
+
console.log(box(successText('Already MCP configured. Claude Brain is registered as an MCP server.'), 'Success'))
|
|
41
|
+
} else {
|
|
42
|
+
try {
|
|
43
|
+
await withSpinner('Registering with Claude Code', async () => {
|
|
44
|
+
execSync('claude mcp add claude-brain -- claude-brain serve', {
|
|
45
|
+
encoding: 'utf-8',
|
|
46
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
47
|
+
})
|
|
48
|
+
})
|
|
49
|
+
console.log()
|
|
50
|
+
console.log(box(successText('Claude Brain registered as MCP server in Claude Code.'), 'Success'))
|
|
51
|
+
} catch (err) {
|
|
52
|
+
const errorMsg = err instanceof Error ? err.message : String(err)
|
|
53
|
+
if (errorMsg.includes('already') || errorMsg.includes('exists')) {
|
|
54
|
+
console.log()
|
|
55
|
+
console.log(box(successText('Already MCP configured. Claude Brain is registered as an MCP server.'), 'Success'))
|
|
56
|
+
} else {
|
|
57
|
+
console.log()
|
|
58
|
+
console.log(box([
|
|
59
|
+
errorText('Failed to register automatically.'),
|
|
60
|
+
'',
|
|
61
|
+
dimText('Run manually:'),
|
|
62
|
+
` ${theme.bold('claude mcp add claude-brain -- claude-brain serve')}`,
|
|
63
|
+
].join('\n'), 'Error'))
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
} else {
|
|
68
|
+
console.log(warningText('claude-brain is not globally installed'))
|
|
69
|
+
console.log()
|
|
70
|
+
|
|
71
|
+
console.log(box([
|
|
72
|
+
`${theme.primary('Option 1:')} Install globally, then register`,
|
|
73
|
+
` ${theme.bold('bun install -g claude-brain')}`,
|
|
74
|
+
` ${theme.bold('claude mcp add claude-brain -- claude-brain serve')}`,
|
|
75
|
+
'',
|
|
76
|
+
`${theme.primary('Option 2:')} Use bunx ${dimText('(zero-install)')}`,
|
|
77
|
+
` ${theme.bold('claude mcp add claude-brain -- bunx claude-brain@latest')}`,
|
|
78
|
+
'',
|
|
79
|
+
`${theme.primary('Option 3:')} Add to Claude Code config manually`,
|
|
80
|
+
dimText(' Add to your Claude Code MCP settings:'),
|
|
81
|
+
` ${theme.dim('{')}`,
|
|
82
|
+
` ${theme.dim('"mcpServers": {')}`,
|
|
83
|
+
` ${theme.dim('"claude-brain": {')}`,
|
|
84
|
+
` ${theme.dim('"command": "bunx",')}`,
|
|
85
|
+
` ${theme.dim('"args": ["claude-brain@latest"]')}`,
|
|
86
|
+
` ${theme.dim('}')}`,
|
|
87
|
+
` ${theme.dim('}')}`,
|
|
88
|
+
` ${theme.dim('}')}`,
|
|
89
|
+
].join('\n'), 'Install Options'))
|
|
90
|
+
}
|
|
91
|
+
console.log()
|
|
92
|
+
}
|
package/src/cli/commands/pack.ts
CHANGED
|
@@ -1,197 +1,197 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Phase 18: CLI Pack Command
|
|
3
|
-
* Manages knowledge packs (list/status/reload)
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
renderLogo, theme, heading, successText, warningText, errorText, dimText,
|
|
8
|
-
box, summaryPanel, withSpinner,
|
|
9
|
-
} from '@/cli/ui/index.js'
|
|
10
|
-
import { readFileSync } from 'node:fs'
|
|
11
|
-
import { resolve, dirname, join } from 'node:path'
|
|
12
|
-
import { fileURLToPath } from 'node:url'
|
|
13
|
-
import { PackManager } from '@/packs/manager'
|
|
14
|
-
|
|
15
|
-
const __filename = fileURLToPath(import.meta.url)
|
|
16
|
-
const __dirname = dirname(__filename)
|
|
17
|
-
const PACKAGE_ROOT = resolve(__dirname, '..', '..', '..')
|
|
18
|
-
|
|
19
|
-
function getDataDir(): string {
|
|
20
|
-
return join(
|
|
21
|
-
process.env.CLAUDE_BRAIN_HOME || join(process.env.HOME || '~', '.claude-brain'),
|
|
22
|
-
'data'
|
|
23
|
-
)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function getDefaultConfig() {
|
|
27
|
-
return {
|
|
28
|
-
enabled: true,
|
|
29
|
-
packsDir: 'packs',
|
|
30
|
-
alwaysLoadCore: true,
|
|
31
|
-
alwaysLoadMeta: true,
|
|
32
|
-
communityConfidenceMultiplier: 0.8,
|
|
33
|
-
personalBoost: 1.2,
|
|
34
|
-
projectBoost: 1.15
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function createPackManager(): PackManager {
|
|
39
|
-
// Lightweight logger for CLI
|
|
40
|
-
const logger = {
|
|
41
|
-
child: () => logger,
|
|
42
|
-
debug: () => {},
|
|
43
|
-
info: () => {},
|
|
44
|
-
warn: () => {},
|
|
45
|
-
error: () => {},
|
|
46
|
-
} as any
|
|
47
|
-
|
|
48
|
-
return new PackManager(logger, getDefaultConfig(), PACKAGE_ROOT, getDataDir())
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export async function runPack() {
|
|
52
|
-
const subcommand = process.argv[3] || 'list'
|
|
53
|
-
|
|
54
|
-
switch (subcommand) {
|
|
55
|
-
case 'list':
|
|
56
|
-
await handleList()
|
|
57
|
-
break
|
|
58
|
-
case 'status':
|
|
59
|
-
await handleStatus()
|
|
60
|
-
break
|
|
61
|
-
case 'reload':
|
|
62
|
-
await handleReload()
|
|
63
|
-
break
|
|
64
|
-
default:
|
|
65
|
-
console.log()
|
|
66
|
-
console.log(errorText(`Unknown pack subcommand: ${subcommand}`))
|
|
67
|
-
printPackHelp()
|
|
68
|
-
process.exit(1)
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
async function handleList() {
|
|
73
|
-
console.log()
|
|
74
|
-
console.log(renderLogo())
|
|
75
|
-
console.log()
|
|
76
|
-
console.log(heading('Available Knowledge Packs'))
|
|
77
|
-
console.log()
|
|
78
|
-
|
|
79
|
-
const manager = createPackManager()
|
|
80
|
-
|
|
81
|
-
let packs: Array<{ id: string; name: string; description: string; entries: number; version: string }> = []
|
|
82
|
-
await withSpinner('Scanning packs directory', async () => {
|
|
83
|
-
packs = await manager.listAvailablePacks()
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
if (packs.length === 0) {
|
|
87
|
-
console.log(warningText(' No packs found in packs/ directory'))
|
|
88
|
-
console.log()
|
|
89
|
-
return
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
console.log()
|
|
93
|
-
for (const pack of packs) {
|
|
94
|
-
console.log(` ${theme.primary(pack.id.padEnd(24))} ${theme.bold(pack.name)}`)
|
|
95
|
-
console.log(` ${''.padEnd(24)} ${dimText(pack.description)}`)
|
|
96
|
-
console.log(` ${''.padEnd(24)} ${dimText(`v${pack.version} - ${pack.entries} entries`)}`)
|
|
97
|
-
console.log()
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const totalEntries = packs.reduce((sum, p) => sum + p.entries, 0)
|
|
101
|
-
console.log(dimText(` Total: ${packs.length} packs, ${totalEntries} entries`))
|
|
102
|
-
console.log()
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
async function handleStatus() {
|
|
106
|
-
console.log()
|
|
107
|
-
console.log(renderLogo())
|
|
108
|
-
console.log()
|
|
109
|
-
console.log(heading('Pack Status'))
|
|
110
|
-
console.log()
|
|
111
|
-
|
|
112
|
-
const project = process.argv[4]
|
|
113
|
-
if (!project) {
|
|
114
|
-
console.log(warningText(' Usage: claude-brain pack status <project-name>'))
|
|
115
|
-
console.log(dimText(' Example: claude-brain pack status my-app'))
|
|
116
|
-
console.log()
|
|
117
|
-
return
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const manager = createPackManager()
|
|
121
|
-
const manifest = await manager.getManifest(project)
|
|
122
|
-
|
|
123
|
-
if (manifest.packs.length === 0) {
|
|
124
|
-
console.log(dimText(` No packs loaded for project "${project}"`))
|
|
125
|
-
console.log(dimText(' Packs are loaded automatically when you run init_project'))
|
|
126
|
-
console.log()
|
|
127
|
-
return
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
const items = manifest.packs.map(p => ({
|
|
131
|
-
label: p.packId,
|
|
132
|
-
value: `v${p.version} (${p.entriesLoaded} entries, ${new Date(p.loadedAt).toLocaleDateString()})`,
|
|
133
|
-
status: 'success' as const
|
|
134
|
-
}))
|
|
135
|
-
|
|
136
|
-
console.log(summaryPanel(`Packs for ${project}`, items))
|
|
137
|
-
console.log()
|
|
138
|
-
console.log(dimText(` Last updated: ${manifest.lastUpdated}`))
|
|
139
|
-
console.log()
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
async function handleReload() {
|
|
143
|
-
console.log()
|
|
144
|
-
console.log(renderLogo())
|
|
145
|
-
console.log()
|
|
146
|
-
console.log(heading('Reload Knowledge Packs'))
|
|
147
|
-
console.log()
|
|
148
|
-
|
|
149
|
-
const project = process.argv[4]
|
|
150
|
-
if (!project) {
|
|
151
|
-
console.log(warningText(' Usage: claude-brain pack reload <project-name>'))
|
|
152
|
-
console.log(dimText(' This clears the manifest so packs are re-loaded on next init_project'))
|
|
153
|
-
console.log()
|
|
154
|
-
return
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
const manager = createPackManager()
|
|
158
|
-
|
|
159
|
-
await withSpinner(`Clearing manifest for "${project}"`, async () => {
|
|
160
|
-
await manager.deleteManifest(project)
|
|
161
|
-
})
|
|
162
|
-
|
|
163
|
-
console.log()
|
|
164
|
-
console.log(box([
|
|
165
|
-
successText(`Manifest cleared for "${project}"`),
|
|
166
|
-
'',
|
|
167
|
-
dimText('Packs will be re-loaded on the next init_project call.'),
|
|
168
|
-
dimText('Or use the init_project MCP tool to reload now.'),
|
|
169
|
-
].join('\n'), 'Reload'))
|
|
170
|
-
console.log()
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
function printPackHelp() {
|
|
174
|
-
console.log()
|
|
175
|
-
const commands = [
|
|
176
|
-
['list', 'Show all available knowledge packs'],
|
|
177
|
-
['status', 'Show loaded packs for a project'],
|
|
178
|
-
['reload', 'Clear manifest to force pack reload'],
|
|
179
|
-
]
|
|
180
|
-
|
|
181
|
-
const cmdLines = commands
|
|
182
|
-
.map(([cmd, desc]) => ` ${theme.primary(cmd!.padEnd(14))} ${dimText(desc!)}`)
|
|
183
|
-
.join('\n')
|
|
184
|
-
|
|
185
|
-
console.log(box([
|
|
186
|
-
theme.bold('Usage:') + ' ' + dimText('claude-brain pack [subcommand]'),
|
|
187
|
-
'',
|
|
188
|
-
theme.bold('Subcommands:'),
|
|
189
|
-
cmdLines,
|
|
190
|
-
'',
|
|
191
|
-
theme.bold('Examples:'),
|
|
192
|
-
` ${dimText('claude-brain pack list')}`,
|
|
193
|
-
` ${dimText('claude-brain pack status my-project')}`,
|
|
194
|
-
` ${dimText('claude-brain pack reload my-project')}`,
|
|
195
|
-
].join('\n'), 'Pack Help'))
|
|
196
|
-
console.log()
|
|
197
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Phase 18: CLI Pack Command
|
|
3
|
+
* Manages knowledge packs (list/status/reload)
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
renderLogo, theme, heading, successText, warningText, errorText, dimText,
|
|
8
|
+
box, summaryPanel, withSpinner,
|
|
9
|
+
} from '@/cli/ui/index.js'
|
|
10
|
+
import { readFileSync } from 'node:fs'
|
|
11
|
+
import { resolve, dirname, join } from 'node:path'
|
|
12
|
+
import { fileURLToPath } from 'node:url'
|
|
13
|
+
import { PackManager } from '@/packs/manager'
|
|
14
|
+
|
|
15
|
+
const __filename = fileURLToPath(import.meta.url)
|
|
16
|
+
const __dirname = dirname(__filename)
|
|
17
|
+
const PACKAGE_ROOT = resolve(__dirname, '..', '..', '..')
|
|
18
|
+
|
|
19
|
+
function getDataDir(): string {
|
|
20
|
+
return join(
|
|
21
|
+
process.env.CLAUDE_BRAIN_HOME || join(process.env.HOME || '~', '.claude-brain'),
|
|
22
|
+
'data'
|
|
23
|
+
)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function getDefaultConfig() {
|
|
27
|
+
return {
|
|
28
|
+
enabled: true,
|
|
29
|
+
packsDir: 'packs',
|
|
30
|
+
alwaysLoadCore: true,
|
|
31
|
+
alwaysLoadMeta: true,
|
|
32
|
+
communityConfidenceMultiplier: 0.8,
|
|
33
|
+
personalBoost: 1.2,
|
|
34
|
+
projectBoost: 1.15
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function createPackManager(): PackManager {
|
|
39
|
+
// Lightweight logger for CLI
|
|
40
|
+
const logger = {
|
|
41
|
+
child: () => logger,
|
|
42
|
+
debug: () => {},
|
|
43
|
+
info: () => {},
|
|
44
|
+
warn: () => {},
|
|
45
|
+
error: () => {},
|
|
46
|
+
} as any
|
|
47
|
+
|
|
48
|
+
return new PackManager(logger, getDefaultConfig(), PACKAGE_ROOT, getDataDir())
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export async function runPack() {
|
|
52
|
+
const subcommand = process.argv[3] || 'list'
|
|
53
|
+
|
|
54
|
+
switch (subcommand) {
|
|
55
|
+
case 'list':
|
|
56
|
+
await handleList()
|
|
57
|
+
break
|
|
58
|
+
case 'status':
|
|
59
|
+
await handleStatus()
|
|
60
|
+
break
|
|
61
|
+
case 'reload':
|
|
62
|
+
await handleReload()
|
|
63
|
+
break
|
|
64
|
+
default:
|
|
65
|
+
console.log()
|
|
66
|
+
console.log(errorText(`Unknown pack subcommand: ${subcommand}`))
|
|
67
|
+
printPackHelp()
|
|
68
|
+
process.exit(1)
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async function handleList() {
|
|
73
|
+
console.log()
|
|
74
|
+
console.log(renderLogo())
|
|
75
|
+
console.log()
|
|
76
|
+
console.log(heading('Available Knowledge Packs'))
|
|
77
|
+
console.log()
|
|
78
|
+
|
|
79
|
+
const manager = createPackManager()
|
|
80
|
+
|
|
81
|
+
let packs: Array<{ id: string; name: string; description: string; entries: number; version: string }> = []
|
|
82
|
+
await withSpinner('Scanning packs directory', async () => {
|
|
83
|
+
packs = await manager.listAvailablePacks()
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
if (packs.length === 0) {
|
|
87
|
+
console.log(warningText(' No packs found in packs/ directory'))
|
|
88
|
+
console.log()
|
|
89
|
+
return
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
console.log()
|
|
93
|
+
for (const pack of packs) {
|
|
94
|
+
console.log(` ${theme.primary(pack.id.padEnd(24))} ${theme.bold(pack.name)}`)
|
|
95
|
+
console.log(` ${''.padEnd(24)} ${dimText(pack.description)}`)
|
|
96
|
+
console.log(` ${''.padEnd(24)} ${dimText(`v${pack.version} - ${pack.entries} entries`)}`)
|
|
97
|
+
console.log()
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const totalEntries = packs.reduce((sum, p) => sum + p.entries, 0)
|
|
101
|
+
console.log(dimText(` Total: ${packs.length} packs, ${totalEntries} entries`))
|
|
102
|
+
console.log()
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async function handleStatus() {
|
|
106
|
+
console.log()
|
|
107
|
+
console.log(renderLogo())
|
|
108
|
+
console.log()
|
|
109
|
+
console.log(heading('Pack Status'))
|
|
110
|
+
console.log()
|
|
111
|
+
|
|
112
|
+
const project = process.argv[4]
|
|
113
|
+
if (!project) {
|
|
114
|
+
console.log(warningText(' Usage: claude-brain pack status <project-name>'))
|
|
115
|
+
console.log(dimText(' Example: claude-brain pack status my-app'))
|
|
116
|
+
console.log()
|
|
117
|
+
return
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const manager = createPackManager()
|
|
121
|
+
const manifest = await manager.getManifest(project)
|
|
122
|
+
|
|
123
|
+
if (manifest.packs.length === 0) {
|
|
124
|
+
console.log(dimText(` No packs loaded for project "${project}"`))
|
|
125
|
+
console.log(dimText(' Packs are loaded automatically when you run init_project'))
|
|
126
|
+
console.log()
|
|
127
|
+
return
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const items = manifest.packs.map(p => ({
|
|
131
|
+
label: p.packId,
|
|
132
|
+
value: `v${p.version} (${p.entriesLoaded} entries, ${new Date(p.loadedAt).toLocaleDateString()})`,
|
|
133
|
+
status: 'success' as const
|
|
134
|
+
}))
|
|
135
|
+
|
|
136
|
+
console.log(summaryPanel(`Packs for ${project}`, items))
|
|
137
|
+
console.log()
|
|
138
|
+
console.log(dimText(` Last updated: ${manifest.lastUpdated}`))
|
|
139
|
+
console.log()
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async function handleReload() {
|
|
143
|
+
console.log()
|
|
144
|
+
console.log(renderLogo())
|
|
145
|
+
console.log()
|
|
146
|
+
console.log(heading('Reload Knowledge Packs'))
|
|
147
|
+
console.log()
|
|
148
|
+
|
|
149
|
+
const project = process.argv[4]
|
|
150
|
+
if (!project) {
|
|
151
|
+
console.log(warningText(' Usage: claude-brain pack reload <project-name>'))
|
|
152
|
+
console.log(dimText(' This clears the manifest so packs are re-loaded on next init_project'))
|
|
153
|
+
console.log()
|
|
154
|
+
return
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const manager = createPackManager()
|
|
158
|
+
|
|
159
|
+
await withSpinner(`Clearing manifest for "${project}"`, async () => {
|
|
160
|
+
await manager.deleteManifest(project)
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
console.log()
|
|
164
|
+
console.log(box([
|
|
165
|
+
successText(`Manifest cleared for "${project}"`),
|
|
166
|
+
'',
|
|
167
|
+
dimText('Packs will be re-loaded on the next init_project call.'),
|
|
168
|
+
dimText('Or use the init_project MCP tool to reload now.'),
|
|
169
|
+
].join('\n'), 'Reload'))
|
|
170
|
+
console.log()
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function printPackHelp() {
|
|
174
|
+
console.log()
|
|
175
|
+
const commands = [
|
|
176
|
+
['list', 'Show all available knowledge packs'],
|
|
177
|
+
['status', 'Show loaded packs for a project'],
|
|
178
|
+
['reload', 'Clear manifest to force pack reload'],
|
|
179
|
+
]
|
|
180
|
+
|
|
181
|
+
const cmdLines = commands
|
|
182
|
+
.map(([cmd, desc]) => ` ${theme.primary(cmd!.padEnd(14))} ${dimText(desc!)}`)
|
|
183
|
+
.join('\n')
|
|
184
|
+
|
|
185
|
+
console.log(box([
|
|
186
|
+
theme.bold('Usage:') + ' ' + dimText('claude-brain pack [subcommand]'),
|
|
187
|
+
'',
|
|
188
|
+
theme.bold('Subcommands:'),
|
|
189
|
+
cmdLines,
|
|
190
|
+
'',
|
|
191
|
+
theme.bold('Examples:'),
|
|
192
|
+
` ${dimText('claude-brain pack list')}`,
|
|
193
|
+
` ${dimText('claude-brain pack status my-project')}`,
|
|
194
|
+
` ${dimText('claude-brain pack reload my-project')}`,
|
|
195
|
+
].join('\n'), 'Pack Help'))
|
|
196
|
+
console.log()
|
|
197
|
+
}
|