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
|
@@ -1,205 +1,210 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Repo Scanner
|
|
3
|
-
* Phase 22: Scans a repository to extract initial project context.
|
|
4
|
-
* Used on first encounter or via `claude-brain init`.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import fs from 'fs/promises'
|
|
8
|
-
import path from 'path'
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const
|
|
73
|
-
const
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
if (deps.includes('
|
|
77
|
-
if (deps.includes('
|
|
78
|
-
if (deps.includes('
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
const
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
if (allDeps.
|
|
111
|
-
if (allDeps.
|
|
112
|
-
if (allDeps.
|
|
113
|
-
if (allDeps.
|
|
114
|
-
if (allDeps.
|
|
115
|
-
if (allDeps.
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if (allDeps.
|
|
120
|
-
if (allDeps.
|
|
121
|
-
if (allDeps.
|
|
122
|
-
if (allDeps.
|
|
123
|
-
if (allDeps.
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
if (allDeps['@
|
|
128
|
-
if (allDeps
|
|
129
|
-
if (allDeps.
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
'.
|
|
148
|
-
'.
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
.filter(e => !
|
|
166
|
-
.
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
if (
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Repo Scanner
|
|
3
|
+
* Phase 22: Scans a repository to extract initial project context.
|
|
4
|
+
* Used on first encounter or via `claude-brain init`.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import fs from 'fs/promises'
|
|
8
|
+
import path from 'path'
|
|
9
|
+
import { spawnSync } from 'child_process'
|
|
10
|
+
import { realpathSync } from 'node:fs'
|
|
11
|
+
|
|
12
|
+
export interface ProjectContext {
|
|
13
|
+
name: string
|
|
14
|
+
description: string
|
|
15
|
+
techStack: string[]
|
|
16
|
+
structure: string
|
|
17
|
+
recentActivity: string
|
|
18
|
+
projectInstructions?: string
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Scan a repository and extract project context.
|
|
23
|
+
*/
|
|
24
|
+
export async function scanRepo(repoPath: string): Promise<ProjectContext> {
|
|
25
|
+
const name = path.basename(repoPath)
|
|
26
|
+
|
|
27
|
+
// Detect tech stack and name from manifest files
|
|
28
|
+
const manifest = await detectManifest(repoPath)
|
|
29
|
+
const projectName = manifest?.name || name
|
|
30
|
+
const techStack = manifest?.techStack || []
|
|
31
|
+
|
|
32
|
+
// Read README for description
|
|
33
|
+
const description = await readDescription(repoPath)
|
|
34
|
+
|
|
35
|
+
// Get directory structure
|
|
36
|
+
const structure = await getDirectoryTree(repoPath, 2)
|
|
37
|
+
|
|
38
|
+
// Get recent git activity
|
|
39
|
+
const recentActivity = getRecentGitActivity(repoPath)
|
|
40
|
+
|
|
41
|
+
// Read CLAUDE.md if present
|
|
42
|
+
const projectInstructions = await readClaudeMd(repoPath)
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
name: projectName,
|
|
46
|
+
description,
|
|
47
|
+
techStack,
|
|
48
|
+
structure,
|
|
49
|
+
recentActivity,
|
|
50
|
+
projectInstructions
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
interface ManifestInfo {
|
|
55
|
+
name: string
|
|
56
|
+
techStack: string[]
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function detectManifest(repoPath: string): Promise<ManifestInfo | null> {
|
|
60
|
+
// Try package.json (Node.js)
|
|
61
|
+
try {
|
|
62
|
+
const content = await fs.readFile(path.join(repoPath, 'package.json'), 'utf-8')
|
|
63
|
+
const pkg = JSON.parse(content)
|
|
64
|
+
return {
|
|
65
|
+
name: (pkg.name || '').replace(/^@[^/]+\//, ''),
|
|
66
|
+
techStack: extractTechStack(pkg)
|
|
67
|
+
}
|
|
68
|
+
} catch { /* not a Node project */ }
|
|
69
|
+
|
|
70
|
+
// Try pyproject.toml (Python)
|
|
71
|
+
try {
|
|
72
|
+
const content = await fs.readFile(path.join(repoPath, 'pyproject.toml'), 'utf-8')
|
|
73
|
+
const nameMatch = content.match(/name\s*=\s*"([^"]+)"/)
|
|
74
|
+
const deps = content.match(/dependencies\s*=\s*\[([\s\S]*?)\]/)?.[1] || ''
|
|
75
|
+
const techStack = ['python']
|
|
76
|
+
if (deps.includes('django')) techStack.push('django')
|
|
77
|
+
if (deps.includes('fastapi')) techStack.push('fastapi')
|
|
78
|
+
if (deps.includes('flask')) techStack.push('flask')
|
|
79
|
+
if (deps.includes('pytest')) techStack.push('pytest')
|
|
80
|
+
return { name: nameMatch?.[1] || '', techStack }
|
|
81
|
+
} catch { /* not a Python project */ }
|
|
82
|
+
|
|
83
|
+
// Try Cargo.toml (Rust)
|
|
84
|
+
try {
|
|
85
|
+
const content = await fs.readFile(path.join(repoPath, 'Cargo.toml'), 'utf-8')
|
|
86
|
+
const nameMatch = content.match(/name\s*=\s*"([^"]+)"/)
|
|
87
|
+
return { name: nameMatch?.[1] || '', techStack: ['rust'] }
|
|
88
|
+
} catch { /* not a Rust project */ }
|
|
89
|
+
|
|
90
|
+
// Try go.mod (Go)
|
|
91
|
+
try {
|
|
92
|
+
const content = await fs.readFile(path.join(repoPath, 'go.mod'), 'utf-8')
|
|
93
|
+
const moduleMatch = content.match(/module\s+(\S+)/)
|
|
94
|
+
const moduleName = moduleMatch?.[1]?.split('/').pop() || ''
|
|
95
|
+
return { name: moduleName, techStack: ['go'] }
|
|
96
|
+
} catch { /* not a Go project */ }
|
|
97
|
+
|
|
98
|
+
return null
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function extractTechStack(pkg: Record<string, unknown>): string[] {
|
|
102
|
+
const stack: string[] = []
|
|
103
|
+
const allDeps: Record<string, unknown> = { ...(pkg.dependencies as Record<string, unknown>), ...(pkg.devDependencies as Record<string, unknown>) }
|
|
104
|
+
|
|
105
|
+
// Runtime
|
|
106
|
+
if (allDeps.typescript || allDeps['@types/node']) stack.push('typescript')
|
|
107
|
+
else stack.push('javascript')
|
|
108
|
+
|
|
109
|
+
// Frameworks
|
|
110
|
+
if (allDeps.react || allDeps['react-dom']) stack.push('react')
|
|
111
|
+
if (allDeps.next) stack.push('nextjs')
|
|
112
|
+
if (allDeps.vue) stack.push('vue')
|
|
113
|
+
if (allDeps.svelte) stack.push('svelte')
|
|
114
|
+
if (allDeps.express) stack.push('express')
|
|
115
|
+
if (allDeps.hono) stack.push('hono')
|
|
116
|
+
if (allDeps.fastify) stack.push('fastify')
|
|
117
|
+
|
|
118
|
+
// Tools
|
|
119
|
+
if (allDeps.bun || pkg.devDependencies?.['@types/bun']) stack.push('bun')
|
|
120
|
+
if (allDeps.vitest) stack.push('vitest')
|
|
121
|
+
if (allDeps.jest) stack.push('jest')
|
|
122
|
+
if (allDeps.tailwindcss) stack.push('tailwind')
|
|
123
|
+
if (allDeps.prisma || allDeps['@prisma/client']) stack.push('prisma')
|
|
124
|
+
if (allDeps.drizzle || allDeps['drizzle-orm']) stack.push('drizzle')
|
|
125
|
+
|
|
126
|
+
// AI/ML
|
|
127
|
+
if (allDeps['@modelcontextprotocol/sdk']) stack.push('mcp')
|
|
128
|
+
if (allDeps['@anthropic-ai/sdk']) stack.push('claude-api')
|
|
129
|
+
if (allDeps.openai) stack.push('openai')
|
|
130
|
+
if (allDeps.langchain) stack.push('langchain')
|
|
131
|
+
|
|
132
|
+
return stack
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async function readDescription(repoPath: string): Promise<string> {
|
|
136
|
+
for (const readme of ['README.md', 'readme.md', 'Readme.md']) {
|
|
137
|
+
try {
|
|
138
|
+
const content = await fs.readFile(path.join(repoPath, readme), 'utf-8')
|
|
139
|
+
return content.slice(0, 500).trim()
|
|
140
|
+
} catch { /* no readme */ }
|
|
141
|
+
}
|
|
142
|
+
return ''
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async function getDirectoryTree(repoPath: string, maxDepth: number): Promise<string> {
|
|
146
|
+
const IGNORED = new Set([
|
|
147
|
+
'node_modules', '.git', 'dist', 'build', '.next', '__pycache__',
|
|
148
|
+
'.venv', 'venv', '.mypy_cache', '.pytest_cache', 'target',
|
|
149
|
+
'.turbo', '.vercel', 'coverage', '.nyc_output'
|
|
150
|
+
])
|
|
151
|
+
|
|
152
|
+
const lines: string[] = []
|
|
153
|
+
|
|
154
|
+
async function walk(dir: string, depth: number, prefix: string) {
|
|
155
|
+
if (depth > maxDepth) return
|
|
156
|
+
|
|
157
|
+
let entries: import("fs").Dirent[]
|
|
158
|
+
try {
|
|
159
|
+
entries = await fs.readdir(dir, { withFileTypes: true, encoding: 'utf-8' })
|
|
160
|
+
} catch {
|
|
161
|
+
return
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const filtered = entries
|
|
165
|
+
.filter(e => !e.name.startsWith('.') || e.name === '.github')
|
|
166
|
+
.filter(e => !IGNORED.has(e.name))
|
|
167
|
+
.sort((a, b) => {
|
|
168
|
+
// Directories first
|
|
169
|
+
if (a.isDirectory() && !b.isDirectory()) return -1
|
|
170
|
+
if (!a.isDirectory() && b.isDirectory()) return 1
|
|
171
|
+
return a.name.localeCompare(b.name)
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
for (const entry of filtered.slice(0, 30)) { // Cap at 30 per level
|
|
175
|
+
const isDir = entry.isDirectory()
|
|
176
|
+
lines.push(`${prefix}${isDir ? entry.name + '/' : entry.name}`)
|
|
177
|
+
if (isDir) {
|
|
178
|
+
await walk(path.join(dir, entry.name), depth + 1, prefix + ' ')
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
await walk(repoPath, 0, '')
|
|
184
|
+
return lines.join('\n')
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function getRecentGitActivity(repoPath: string): string {
|
|
188
|
+
try {
|
|
189
|
+
const resolvedPath = realpathSync(repoPath)
|
|
190
|
+
const result = spawnSync('git', ['log', '--oneline', '-10'], {
|
|
191
|
+
cwd: resolvedPath,
|
|
192
|
+
encoding: 'utf-8',
|
|
193
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
194
|
+
timeout: 5000,
|
|
195
|
+
})
|
|
196
|
+
if (result.error || result.status !== 0) return ''
|
|
197
|
+
return result.stdout?.trim() || ''
|
|
198
|
+
} catch {
|
|
199
|
+
return ''
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
async function readClaudeMd(repoPath: string): Promise<string | undefined> {
|
|
204
|
+
try {
|
|
205
|
+
const content = await fs.readFile(path.join(repoPath, 'CLAUDE.md'), 'utf-8')
|
|
206
|
+
return content.trim()
|
|
207
|
+
} catch {
|
|
208
|
+
return undefined
|
|
209
|
+
}
|
|
210
|
+
}
|
package/src/cli/auto-setup.ts
CHANGED
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
import { mkdirSync, writeFileSync, existsSync } from 'node:fs'
|
|
2
|
-
import { join } from 'node:path'
|
|
3
|
-
import { isHomeInitialized, getHomePaths } from '@/config/home'
|
|
4
|
-
|
|
5
|
-
function getDefaultEnv(vaultPath: string): string {
|
|
6
|
-
return `# Claude Brain Configuration
|
|
7
|
-
# Generated by auto-setup on first run
|
|
8
|
-
VAULT_PATH=${vaultPath}
|
|
9
|
-
LOG_LEVEL=warn
|
|
10
|
-
NODE_ENV=production
|
|
11
|
-
`
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const DEFAULT_GLOBAL_STANDARDS = `---
|
|
15
|
-
type: global-standards
|
|
16
|
-
last_updated: ${new Date().toISOString().split('T')[0]}
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
# Global Coding Standards
|
|
20
|
-
|
|
21
|
-
## General
|
|
22
|
-
- Write clear, readable code
|
|
23
|
-
- Prefer explicit over implicit
|
|
24
|
-
- Keep functions focused and small
|
|
25
|
-
|
|
26
|
-
## TypeScript
|
|
27
|
-
- Use strict mode
|
|
28
|
-
- Prefer const over let
|
|
29
|
-
- Add JSDoc comments for public APIs
|
|
30
|
-
`
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Ensures the Claude Brain home directory exists with required structure.
|
|
34
|
-
* Called before server start. No-op if already initialized.
|
|
35
|
-
* All output goes to stderr (stdout reserved for MCP JSON-RPC).
|
|
36
|
-
*/
|
|
37
|
-
export function ensureHomeDirectory(): void {
|
|
38
|
-
if (isHomeInitialized()) {
|
|
39
|
-
return
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const paths = getHomePaths()
|
|
43
|
-
|
|
44
|
-
console.error(`[claude-brain] First run detected, initializing ${paths.root}`)
|
|
45
|
-
|
|
46
|
-
// Create directory structure
|
|
47
|
-
const dirs = [
|
|
48
|
-
paths.data,
|
|
49
|
-
paths.chroma,
|
|
50
|
-
paths.logs,
|
|
51
|
-
paths.vault,
|
|
52
|
-
paths.vaultProjects,
|
|
53
|
-
paths.vaultGlobal,
|
|
54
|
-
paths.models,
|
|
55
|
-
]
|
|
56
|
-
|
|
57
|
-
for (const dir of dirs) {
|
|
58
|
-
mkdirSync(dir, { recursive: true })
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Write default .env if not present
|
|
62
|
-
if (!existsSync(paths.env)) {
|
|
63
|
-
writeFileSync(paths.env, getDefaultEnv(paths.vault), 'utf-8')
|
|
64
|
-
console.error('[claude-brain] Created default .env')
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Write default global standards if not present
|
|
68
|
-
const globalStandardsPath = join(paths.vaultGlobal, 'standards.md')
|
|
69
|
-
if (!existsSync(globalStandardsPath)) {
|
|
70
|
-
writeFileSync(globalStandardsPath, DEFAULT_GLOBAL_STANDARDS, 'utf-8')
|
|
71
|
-
console.error('[claude-brain] Created default global standards')
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
console.error('[claude-brain] Home directory initialized')
|
|
75
|
-
}
|
|
1
|
+
import { mkdirSync, writeFileSync, existsSync } from 'node:fs'
|
|
2
|
+
import { join } from 'node:path'
|
|
3
|
+
import { isHomeInitialized, getHomePaths } from '@/config/home'
|
|
4
|
+
|
|
5
|
+
function getDefaultEnv(vaultPath: string): string {
|
|
6
|
+
return `# Claude Brain Configuration
|
|
7
|
+
# Generated by auto-setup on first run
|
|
8
|
+
VAULT_PATH=${vaultPath}
|
|
9
|
+
LOG_LEVEL=warn
|
|
10
|
+
NODE_ENV=production
|
|
11
|
+
`
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const DEFAULT_GLOBAL_STANDARDS = `---
|
|
15
|
+
type: global-standards
|
|
16
|
+
last_updated: ${new Date().toISOString().split('T')[0]}
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# Global Coding Standards
|
|
20
|
+
|
|
21
|
+
## General
|
|
22
|
+
- Write clear, readable code
|
|
23
|
+
- Prefer explicit over implicit
|
|
24
|
+
- Keep functions focused and small
|
|
25
|
+
|
|
26
|
+
## TypeScript
|
|
27
|
+
- Use strict mode
|
|
28
|
+
- Prefer const over let
|
|
29
|
+
- Add JSDoc comments for public APIs
|
|
30
|
+
`
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Ensures the Claude Brain home directory exists with required structure.
|
|
34
|
+
* Called before server start. No-op if already initialized.
|
|
35
|
+
* All output goes to stderr (stdout reserved for MCP JSON-RPC).
|
|
36
|
+
*/
|
|
37
|
+
export function ensureHomeDirectory(): void {
|
|
38
|
+
if (isHomeInitialized()) {
|
|
39
|
+
return
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const paths = getHomePaths()
|
|
43
|
+
|
|
44
|
+
console.error(`[claude-brain] First run detected, initializing ${paths.root}`)
|
|
45
|
+
|
|
46
|
+
// Create directory structure
|
|
47
|
+
const dirs = [
|
|
48
|
+
paths.data,
|
|
49
|
+
paths.chroma,
|
|
50
|
+
paths.logs,
|
|
51
|
+
paths.vault,
|
|
52
|
+
paths.vaultProjects,
|
|
53
|
+
paths.vaultGlobal,
|
|
54
|
+
paths.models,
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
for (const dir of dirs) {
|
|
58
|
+
mkdirSync(dir, { recursive: true })
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Write default .env if not present
|
|
62
|
+
if (!existsSync(paths.env)) {
|
|
63
|
+
writeFileSync(paths.env, getDefaultEnv(paths.vault), 'utf-8')
|
|
64
|
+
console.error('[claude-brain] Created default .env')
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Write default global standards if not present
|
|
68
|
+
const globalStandardsPath = join(paths.vaultGlobal, 'standards.md')
|
|
69
|
+
if (!existsSync(globalStandardsPath)) {
|
|
70
|
+
writeFileSync(globalStandardsPath, DEFAULT_GLOBAL_STANDARDS, 'utf-8')
|
|
71
|
+
console.error('[claude-brain] Created default global standards')
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
console.error('[claude-brain] Home directory initialized')
|
|
75
|
+
}
|