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,124 +1,130 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { existsSync, readFileSync } from 'node:fs'
|
|
3
|
-
import fs from 'fs/promises'
|
|
4
|
-
import path from 'path'
|
|
5
|
-
import os from 'os'
|
|
6
|
-
import { fileURLToPath } from 'url'
|
|
7
|
-
import {
|
|
8
|
-
renderLogo, theme, heading, successText, warningText, dimText,
|
|
9
|
-
box, withSpinner,
|
|
10
|
-
} from '@/cli/ui/index.js'
|
|
11
|
-
|
|
12
|
-
const __filename = fileURLToPath(import.meta.url)
|
|
13
|
-
const __dirname = path.dirname(__filename)
|
|
14
|
-
const PACKAGE_ROOT = path.resolve(__dirname, '..', '..', '..')
|
|
15
|
-
|
|
16
|
-
function getInstalledVersion(): string {
|
|
17
|
-
try {
|
|
18
|
-
const pkg = JSON.parse(readFileSync(path.join(PACKAGE_ROOT, 'package.json'), 'utf-8'))
|
|
19
|
-
return pkg.version || 'unknown'
|
|
20
|
-
} catch {
|
|
21
|
-
return 'unknown'
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function getLatestVersion(): string | null {
|
|
26
|
-
try {
|
|
27
|
-
const result =
|
|
28
|
-
encoding: 'utf-8',
|
|
29
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
return null
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
console.log()
|
|
41
|
-
console.log(
|
|
42
|
-
console.log()
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
console.log(
|
|
85
|
-
} else {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}
|
|
1
|
+
import { spawnSync } from 'node:child_process'
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
3
|
+
import fs from 'fs/promises'
|
|
4
|
+
import path from 'path'
|
|
5
|
+
import os from 'os'
|
|
6
|
+
import { fileURLToPath } from 'url'
|
|
7
|
+
import {
|
|
8
|
+
renderLogo, theme, heading, successText, warningText, dimText,
|
|
9
|
+
box, withSpinner,
|
|
10
|
+
} from '@/cli/ui/index.js'
|
|
11
|
+
|
|
12
|
+
const __filename = fileURLToPath(import.meta.url)
|
|
13
|
+
const __dirname = path.dirname(__filename)
|
|
14
|
+
const PACKAGE_ROOT = path.resolve(__dirname, '..', '..', '..')
|
|
15
|
+
|
|
16
|
+
function getInstalledVersion(): string {
|
|
17
|
+
try {
|
|
18
|
+
const pkg = JSON.parse(readFileSync(path.join(PACKAGE_ROOT, 'package.json'), 'utf-8'))
|
|
19
|
+
return pkg.version || 'unknown'
|
|
20
|
+
} catch {
|
|
21
|
+
return 'unknown'
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function getLatestVersion(): string | null {
|
|
26
|
+
try {
|
|
27
|
+
const result = spawnSync('npm', ['view', 'claude-brain', 'version'], {
|
|
28
|
+
encoding: 'utf-8',
|
|
29
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
30
|
+
timeout: 15_000,
|
|
31
|
+
})
|
|
32
|
+
if (result.error || result.status !== 0) return null
|
|
33
|
+
return result.stdout?.trim() || null
|
|
34
|
+
} catch {
|
|
35
|
+
return null
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export async function runUpdate() {
|
|
40
|
+
console.log()
|
|
41
|
+
console.log(renderLogo())
|
|
42
|
+
console.log()
|
|
43
|
+
console.log(heading('Update Claude Brain'))
|
|
44
|
+
console.log()
|
|
45
|
+
|
|
46
|
+
const currentVersion = getInstalledVersion()
|
|
47
|
+
console.log(` ${theme.bold('Installed:')} ${dimText('v' + currentVersion)}`)
|
|
48
|
+
|
|
49
|
+
const latestVersion = await withSpinner('Checking for updates', async () => getLatestVersion())
|
|
50
|
+
|
|
51
|
+
if (latestVersion) {
|
|
52
|
+
console.log(` ${theme.bold('Latest:')} ${dimText('v' + latestVersion)}`)
|
|
53
|
+
}
|
|
54
|
+
console.log()
|
|
55
|
+
|
|
56
|
+
// Step 1: Update package if newer version available
|
|
57
|
+
if (latestVersion && latestVersion !== currentVersion) {
|
|
58
|
+
try {
|
|
59
|
+
await withSpinner(`Updating claude-brain to v${latestVersion}`, async () => {
|
|
60
|
+
const result = spawnSync('bun', ['update', '-g', 'claude-brain'], {
|
|
61
|
+
encoding: 'utf-8',
|
|
62
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
63
|
+
timeout: 120_000,
|
|
64
|
+
})
|
|
65
|
+
if (result.error || result.status !== 0) {
|
|
66
|
+
throw new Error(result.stderr || 'bun update failed')
|
|
67
|
+
}
|
|
68
|
+
})
|
|
69
|
+
console.log(successText(` Updated to v${latestVersion}`))
|
|
70
|
+
} catch {
|
|
71
|
+
console.log(warningText(' Package update failed. Try manually: bun update -g claude-brain'))
|
|
72
|
+
}
|
|
73
|
+
} else {
|
|
74
|
+
console.log(successText(' Package is up to date'))
|
|
75
|
+
}
|
|
76
|
+
console.log()
|
|
77
|
+
|
|
78
|
+
// Step 2: Update CLAUDE.md to ~/.claude/CLAUDE.md (where Claude Code reads it)
|
|
79
|
+
const sourcePath = path.join(PACKAGE_ROOT, 'assets', 'CLAUDE.md')
|
|
80
|
+
const claudeDir = path.join(os.homedir(), '.claude')
|
|
81
|
+
const destPath = path.join(claudeDir, 'CLAUDE.md')
|
|
82
|
+
|
|
83
|
+
if (!existsSync(sourcePath)) {
|
|
84
|
+
console.log(warningText(' CLAUDE.md asset not found in package, skipping'))
|
|
85
|
+
} else if (!existsSync(destPath)) {
|
|
86
|
+
await withSpinner('Installing CLAUDE.md (brain works automatically)', async () => {
|
|
87
|
+
await fs.mkdir(claudeDir, { recursive: true })
|
|
88
|
+
await fs.copyFile(sourcePath, destPath)
|
|
89
|
+
})
|
|
90
|
+
console.log(successText(' CLAUDE.md installed to ~/.claude/CLAUDE.md (brain is now automatic)'))
|
|
91
|
+
} else {
|
|
92
|
+
const sourceContent = readFileSync(sourcePath, 'utf-8')
|
|
93
|
+
const destContent = readFileSync(destPath, 'utf-8')
|
|
94
|
+
|
|
95
|
+
if (sourceContent === destContent) {
|
|
96
|
+
console.log(successText(' CLAUDE.md is already up to date'))
|
|
97
|
+
} else {
|
|
98
|
+
await withSpinner('Updating CLAUDE.md', async () => {
|
|
99
|
+
await fs.copyFile(sourcePath, destPath)
|
|
100
|
+
})
|
|
101
|
+
console.log(successText(' CLAUDE.md updated to ~/.claude/CLAUDE.md (brain is now automatic)'))
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Clean up old ~/CLAUDE.md if it exists (from previous versions)
|
|
106
|
+
const oldDestPath = path.join(os.homedir(), 'CLAUDE.md')
|
|
107
|
+
if (existsSync(oldDestPath)) {
|
|
108
|
+
try {
|
|
109
|
+
const oldContent = readFileSync(oldDestPath, 'utf-8')
|
|
110
|
+
if (oldContent.includes('Claude Brain')) {
|
|
111
|
+
await fs.unlink(oldDestPath)
|
|
112
|
+
console.log(dimText(' Removed old ~/CLAUDE.md (migrated to ~/.claude/)'))
|
|
113
|
+
}
|
|
114
|
+
} catch {
|
|
115
|
+
// ignore cleanup errors
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
console.log()
|
|
120
|
+
console.log(box([
|
|
121
|
+
heading('Update complete!'),
|
|
122
|
+
'',
|
|
123
|
+
dimText('Run health check to verify:'),
|
|
124
|
+
` ${theme.bold('claude-brain health')}`,
|
|
125
|
+
'',
|
|
126
|
+
dimText('For a full kill + update + restart:'),
|
|
127
|
+
` ${theme.bold('claude-brain refresh')}`,
|
|
128
|
+
].join('\n'), 'Done'))
|
|
129
|
+
console.log()
|
|
130
|
+
}
|
|
@@ -1,106 +1,106 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
|
|
3
|
-
import { MemoryManager } from '@/memory'
|
|
4
|
-
import { createLogger } from '@/utils'
|
|
5
|
-
import fs from 'node:fs/promises'
|
|
6
|
-
|
|
7
|
-
// Parse CLI arguments (simple argv parsing)
|
|
8
|
-
const args = process.argv.slice(2)
|
|
9
|
-
const options = {
|
|
10
|
-
batchSize: 100,
|
|
11
|
-
validateAfter: false,
|
|
12
|
-
verbose: false
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
for (const arg of args) {
|
|
16
|
-
if (arg === '--validate-after') options.validateAfter = true
|
|
17
|
-
if (arg === '--verbose') options.verbose = true
|
|
18
|
-
const batchMatch = arg.match(/--batch-size=(\d+)/)
|
|
19
|
-
if (batchMatch) options.batchSize = parseInt(batchMatch[1]!)
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// Create dedicated migration logger
|
|
23
|
-
const logger = createLogger('info', './logs/migration.log')
|
|
24
|
-
|
|
25
|
-
async function main() {
|
|
26
|
-
const startTime = Date.now()
|
|
27
|
-
|
|
28
|
-
console.log('📦 SQLite → ChromaDB Migration\n')
|
|
29
|
-
|
|
30
|
-
// Ensure logs directory exists
|
|
31
|
-
await fs.mkdir('./logs', { recursive: true })
|
|
32
|
-
|
|
33
|
-
// Initialize MemoryManager with ChromaDB enabled
|
|
34
|
-
if (options.verbose) {
|
|
35
|
-
console.log('⏳ Initializing MemoryManager...')
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const memoryManager = new MemoryManager(
|
|
39
|
-
'./data/memory.db',
|
|
40
|
-
logger,
|
|
41
|
-
true // useChromaDB = true
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
await memoryManager.initialize()
|
|
45
|
-
|
|
46
|
-
// Clear existing collections to avoid embedding function conflicts
|
|
47
|
-
if (options.verbose) {
|
|
48
|
-
console.log('⏳ Clearing existing ChromaDB collections...')
|
|
49
|
-
}
|
|
50
|
-
await memoryManager.chroma.collections.clearAll()
|
|
51
|
-
|
|
52
|
-
// Check ChromaDB connection
|
|
53
|
-
if (options.verbose) {
|
|
54
|
-
console.log('⏳ Verifying ChromaDB connection...')
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const healthy = await memoryManager.chroma.healthCheck()
|
|
58
|
-
if (!healthy) {
|
|
59
|
-
console.error('❌ ChromaDB health check failed')
|
|
60
|
-
logger.error('ChromaDB health check failed')
|
|
61
|
-
process.exit(1)
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (options.verbose) {
|
|
65
|
-
console.log('✅ ChromaDB connected')
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Get SQLite stats before migration
|
|
69
|
-
const sqliteStats = memoryManager.database.getStats()
|
|
70
|
-
console.log(`📊 SQLite Database: ${sqliteStats.decisions} decisions, ${sqliteStats.memories} memories\n`)
|
|
71
|
-
|
|
72
|
-
// Run migration
|
|
73
|
-
console.log('🚀 Starting migration...\n')
|
|
74
|
-
|
|
75
|
-
const stats = await memoryManager.migrateToChromaDB({
|
|
76
|
-
batchSize: options.batchSize,
|
|
77
|
-
validateAfter: options.validateAfter,
|
|
78
|
-
skipExisting: false, // Always migrate, don't skip
|
|
79
|
-
dryRun: false
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
const duration = Date.now() - startTime
|
|
83
|
-
|
|
84
|
-
// Display results
|
|
85
|
-
console.log('\n✅ Migration completed!')
|
|
86
|
-
console.log(` Duration: ${(duration / 1000).toFixed(2)}s`)
|
|
87
|
-
console.log(` Decisions: ${stats.migratedDecisions}/${stats.totalDecisions} (${stats.failedDecisions} failed)`)
|
|
88
|
-
console.log(` Memories: ${stats.migratedMemories}/${stats.totalMemories} (${stats.failedMemories} failed)`)
|
|
89
|
-
|
|
90
|
-
if (options.validateAfter) {
|
|
91
|
-
console.log('\n🔍 Validation passed ✓')
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
await memoryManager.close()
|
|
95
|
-
|
|
96
|
-
logger.info({
|
|
97
|
-
stats,
|
|
98
|
-
duration
|
|
99
|
-
}, 'Migration completed successfully')
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
main().catch(error => {
|
|
103
|
-
console.error('\n❌ Migration failed:', error.message)
|
|
104
|
-
logger.error({ error }, 'Migration failed')
|
|
105
|
-
process.exit(1)
|
|
106
|
-
})
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
import { MemoryManager } from '@/memory'
|
|
4
|
+
import { createLogger } from '@/utils'
|
|
5
|
+
import fs from 'node:fs/promises'
|
|
6
|
+
|
|
7
|
+
// Parse CLI arguments (simple argv parsing)
|
|
8
|
+
const args = process.argv.slice(2)
|
|
9
|
+
const options = {
|
|
10
|
+
batchSize: 100,
|
|
11
|
+
validateAfter: false,
|
|
12
|
+
verbose: false
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
for (const arg of args) {
|
|
16
|
+
if (arg === '--validate-after') options.validateAfter = true
|
|
17
|
+
if (arg === '--verbose') options.verbose = true
|
|
18
|
+
const batchMatch = arg.match(/--batch-size=(\d+)/)
|
|
19
|
+
if (batchMatch) options.batchSize = parseInt(batchMatch[1]!)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Create dedicated migration logger
|
|
23
|
+
const logger = createLogger('info', './logs/migration.log')
|
|
24
|
+
|
|
25
|
+
async function main() {
|
|
26
|
+
const startTime = Date.now()
|
|
27
|
+
|
|
28
|
+
console.log('📦 SQLite → ChromaDB Migration\n')
|
|
29
|
+
|
|
30
|
+
// Ensure logs directory exists
|
|
31
|
+
await fs.mkdir('./logs', { recursive: true })
|
|
32
|
+
|
|
33
|
+
// Initialize MemoryManager with ChromaDB enabled
|
|
34
|
+
if (options.verbose) {
|
|
35
|
+
console.log('⏳ Initializing MemoryManager...')
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const memoryManager = new MemoryManager(
|
|
39
|
+
'./data/memory.db',
|
|
40
|
+
logger,
|
|
41
|
+
true // useChromaDB = true
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
await memoryManager.initialize()
|
|
45
|
+
|
|
46
|
+
// Clear existing collections to avoid embedding function conflicts
|
|
47
|
+
if (options.verbose) {
|
|
48
|
+
console.log('⏳ Clearing existing ChromaDB collections...')
|
|
49
|
+
}
|
|
50
|
+
await memoryManager.chroma.collections.clearAll()
|
|
51
|
+
|
|
52
|
+
// Check ChromaDB connection
|
|
53
|
+
if (options.verbose) {
|
|
54
|
+
console.log('⏳ Verifying ChromaDB connection...')
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const healthy = await memoryManager.chroma.healthCheck()
|
|
58
|
+
if (!healthy) {
|
|
59
|
+
console.error('❌ ChromaDB health check failed')
|
|
60
|
+
logger.error('ChromaDB health check failed')
|
|
61
|
+
process.exit(1)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (options.verbose) {
|
|
65
|
+
console.log('✅ ChromaDB connected')
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Get SQLite stats before migration
|
|
69
|
+
const sqliteStats = memoryManager.database.getStats()
|
|
70
|
+
console.log(`📊 SQLite Database: ${sqliteStats.decisions} decisions, ${sqliteStats.memories} memories\n`)
|
|
71
|
+
|
|
72
|
+
// Run migration
|
|
73
|
+
console.log('🚀 Starting migration...\n')
|
|
74
|
+
|
|
75
|
+
const stats = await memoryManager.migrateToChromaDB({
|
|
76
|
+
batchSize: options.batchSize,
|
|
77
|
+
validateAfter: options.validateAfter,
|
|
78
|
+
skipExisting: false, // Always migrate, don't skip
|
|
79
|
+
dryRun: false
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
const duration = Date.now() - startTime
|
|
83
|
+
|
|
84
|
+
// Display results
|
|
85
|
+
console.log('\n✅ Migration completed!')
|
|
86
|
+
console.log(` Duration: ${(duration / 1000).toFixed(2)}s`)
|
|
87
|
+
console.log(` Decisions: ${stats.migratedDecisions}/${stats.totalDecisions} (${stats.failedDecisions} failed)`)
|
|
88
|
+
console.log(` Memories: ${stats.migratedMemories}/${stats.totalMemories} (${stats.failedMemories} failed)`)
|
|
89
|
+
|
|
90
|
+
if (options.validateAfter) {
|
|
91
|
+
console.log('\n🔍 Validation passed ✓')
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
await memoryManager.close()
|
|
95
|
+
|
|
96
|
+
logger.info({
|
|
97
|
+
stats,
|
|
98
|
+
duration
|
|
99
|
+
}, 'Migration completed successfully')
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
main().catch(error => {
|
|
103
|
+
console.error('\n❌ Migration failed:', error.message)
|
|
104
|
+
logger.error({ error }, 'Migration failed')
|
|
105
|
+
process.exit(1)
|
|
106
|
+
})
|
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
|
+
}
|