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,183 +1,183 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Phase 21: CLI Git Hook Command
|
|
3
|
-
* Manages git post-commit hook installation (install/uninstall/status)
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { parseArgs } from 'citty'
|
|
7
|
-
import {
|
|
8
|
-
renderLogo, theme, heading, successText, warningText, errorText, dimText,
|
|
9
|
-
box, summaryPanel, withSpinner,
|
|
10
|
-
} from '@/cli/ui/index.js'
|
|
11
|
-
import {
|
|
12
|
-
installGitHook, uninstallGitHook, isGitHookInstalled, installGitHookAll
|
|
13
|
-
} from '@/hooks/git-hook-installer'
|
|
14
|
-
|
|
15
|
-
export async function runGitHook() {
|
|
16
|
-
const args = parseArgs(process.argv.slice(3), {
|
|
17
|
-
subcommand: { type: 'positional', required: false, description: 'install|uninstall|status' },
|
|
18
|
-
path: { type: 'positional', required: false, description: 'Repository path' },
|
|
19
|
-
all: { type: 'string', required: false, description: 'Install in all repos under directory' },
|
|
20
|
-
})
|
|
21
|
-
const subcommand: string = args.subcommand ?? 'status'
|
|
22
|
-
|
|
23
|
-
switch (subcommand) {
|
|
24
|
-
case 'install':
|
|
25
|
-
await handleInstall(args.all, args.path)
|
|
26
|
-
break
|
|
27
|
-
case 'uninstall':
|
|
28
|
-
await handleUninstall(args.path)
|
|
29
|
-
break
|
|
30
|
-
case 'status':
|
|
31
|
-
handleStatus(args.path)
|
|
32
|
-
break
|
|
33
|
-
default:
|
|
34
|
-
console.log()
|
|
35
|
-
console.log(errorText(`Unknown git-hook subcommand: ${subcommand}`))
|
|
36
|
-
printHelp()
|
|
37
|
-
process.exit(1)
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
async function handleInstall(allDir?: string, repoPath?: string) {
|
|
42
|
-
console.log()
|
|
43
|
-
console.log(renderLogo())
|
|
44
|
-
console.log()
|
|
45
|
-
console.log(heading('Install Git Hook'))
|
|
46
|
-
console.log()
|
|
47
|
-
|
|
48
|
-
if (allDir) {
|
|
49
|
-
const dir = allDir
|
|
50
|
-
|
|
51
|
-
let results: { installed: number; skipped: number; errors: number } | undefined
|
|
52
|
-
await withSpinner(`Installing git hooks in all repos under ${dir}`, async () => {
|
|
53
|
-
results = await installGitHookAll(dir)
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
console.log()
|
|
57
|
-
if (results) {
|
|
58
|
-
console.log(box([
|
|
59
|
-
successText(`Installed: ${results.installed}`),
|
|
60
|
-
dimText(`Skipped (already installed): ${results.skipped}`),
|
|
61
|
-
results.errors > 0 ? warningText(`Errors: ${results.errors}`) : '',
|
|
62
|
-
].filter(Boolean).join('\n'), 'Batch Install'))
|
|
63
|
-
}
|
|
64
|
-
console.log()
|
|
65
|
-
return
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
try {
|
|
69
|
-
let result: { installed: boolean; message: string; hookPath: string } | undefined
|
|
70
|
-
await withSpinner('Installing post-commit hook', async () => {
|
|
71
|
-
result = installGitHook(repoPath)
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
console.log()
|
|
75
|
-
if (result?.installed) {
|
|
76
|
-
console.log(box([
|
|
77
|
-
successText(result.message),
|
|
78
|
-
'',
|
|
79
|
-
dimText('The hook fires after every git commit.'),
|
|
80
|
-
dimText('Commit data (branch, message, files) is sent to brain.'),
|
|
81
|
-
dimText('The hook runs in the background — no speed impact.'),
|
|
82
|
-
'',
|
|
83
|
-
result.hookPath ? `${theme.dim('Hook:')} ${result.hookPath}` : '',
|
|
84
|
-
].filter(Boolean).join('\n'), 'Git Hook Installed'))
|
|
85
|
-
} else if (result) {
|
|
86
|
-
console.log(box(warningText(result.message), 'Git Hook'))
|
|
87
|
-
}
|
|
88
|
-
} catch (err) {
|
|
89
|
-
console.log()
|
|
90
|
-
console.log(box(
|
|
91
|
-
errorText(`Failed: ${err instanceof Error ? err.message : String(err)}`),
|
|
92
|
-
'Error'
|
|
93
|
-
))
|
|
94
|
-
process.exit(1)
|
|
95
|
-
}
|
|
96
|
-
console.log()
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
async function handleUninstall(repoPath?: string) {
|
|
100
|
-
console.log()
|
|
101
|
-
console.log(renderLogo())
|
|
102
|
-
console.log()
|
|
103
|
-
console.log(heading('Uninstall Git Hook'))
|
|
104
|
-
console.log()
|
|
105
|
-
|
|
106
|
-
try {
|
|
107
|
-
let result: { uninstalled: boolean; message: string } | undefined
|
|
108
|
-
await withSpinner('Removing post-commit hook', async () => {
|
|
109
|
-
result = uninstallGitHook(repoPath)
|
|
110
|
-
})
|
|
111
|
-
|
|
112
|
-
console.log()
|
|
113
|
-
if (result?.uninstalled) {
|
|
114
|
-
console.log(box(successText(result.message), 'Git Hook Removed'))
|
|
115
|
-
}
|
|
116
|
-
} catch (err) {
|
|
117
|
-
console.log()
|
|
118
|
-
console.log(box(
|
|
119
|
-
errorText(`Failed: ${err instanceof Error ? err.message : String(err)}`),
|
|
120
|
-
'Error'
|
|
121
|
-
))
|
|
122
|
-
process.exit(1)
|
|
123
|
-
}
|
|
124
|
-
console.log()
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
function handleStatus(repoPath?: string) {
|
|
128
|
-
console.log()
|
|
129
|
-
console.log(renderLogo())
|
|
130
|
-
console.log()
|
|
131
|
-
console.log(heading('Git Hook Status'))
|
|
132
|
-
console.log()
|
|
133
|
-
|
|
134
|
-
const installed = isGitHookInstalled(repoPath)
|
|
135
|
-
|
|
136
|
-
const items = [
|
|
137
|
-
{
|
|
138
|
-
label: 'Installed',
|
|
139
|
-
value: installed ? 'Yes' : 'No',
|
|
140
|
-
status: installed ? 'success' as const : 'warning' as const
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
label: 'Repo',
|
|
144
|
-
value: repoPath || process.cwd(),
|
|
145
|
-
status: 'info' as const
|
|
146
|
-
},
|
|
147
|
-
{
|
|
148
|
-
label: 'Hook type',
|
|
149
|
-
value: 'post-commit',
|
|
150
|
-
status: 'info' as const
|
|
151
|
-
},
|
|
152
|
-
]
|
|
153
|
-
|
|
154
|
-
console.log(summaryPanel('Git Hook', items))
|
|
155
|
-
console.log()
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
function printHelp() {
|
|
159
|
-
console.log()
|
|
160
|
-
const commands = [
|
|
161
|
-
['install', 'Install post-commit hook in current (or specified) repo'],
|
|
162
|
-
['install --all <dir>', 'Install in all git repos under a directory'],
|
|
163
|
-
['uninstall', 'Remove post-commit hook from current (or specified) repo'],
|
|
164
|
-
['status', 'Check if hook is installed'],
|
|
165
|
-
]
|
|
166
|
-
|
|
167
|
-
const cmdLines = commands
|
|
168
|
-
.map(([cmd, desc]) => ` ${theme.primary(cmd!.padEnd(22))} ${dimText(desc!)}`)
|
|
169
|
-
.join('\n')
|
|
170
|
-
|
|
171
|
-
console.log(box([
|
|
172
|
-
theme.bold('Usage:') + ' ' + dimText('claude-brain git-hook [subcommand]'),
|
|
173
|
-
'',
|
|
174
|
-
theme.bold('Subcommands:'),
|
|
175
|
-
cmdLines,
|
|
176
|
-
'',
|
|
177
|
-
theme.bold('Examples:'),
|
|
178
|
-
` ${dimText('claude-brain git-hook install')} ${dimText('Install in current repo')}`,
|
|
179
|
-
` ${dimText('claude-brain git-hook install --all ~/dev')} ${dimText('Install in all repos under ~/dev')}`,
|
|
180
|
-
` ${dimText('claude-brain git-hook uninstall')} ${dimText('Remove from current repo')}`,
|
|
181
|
-
].join('\n'), 'Git Hook Help'))
|
|
182
|
-
console.log()
|
|
183
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Phase 21: CLI Git Hook Command
|
|
3
|
+
* Manages git post-commit hook installation (install/uninstall/status)
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { parseArgs } from 'citty'
|
|
7
|
+
import {
|
|
8
|
+
renderLogo, theme, heading, successText, warningText, errorText, dimText,
|
|
9
|
+
box, summaryPanel, withSpinner,
|
|
10
|
+
} from '@/cli/ui/index.js'
|
|
11
|
+
import {
|
|
12
|
+
installGitHook, uninstallGitHook, isGitHookInstalled, installGitHookAll
|
|
13
|
+
} from '@/hooks/git-hook-installer'
|
|
14
|
+
|
|
15
|
+
export async function runGitHook() {
|
|
16
|
+
const args = parseArgs(process.argv.slice(3), {
|
|
17
|
+
subcommand: { type: 'positional', required: false, description: 'install|uninstall|status' },
|
|
18
|
+
path: { type: 'positional', required: false, description: 'Repository path' },
|
|
19
|
+
all: { type: 'string', required: false, description: 'Install in all repos under directory' },
|
|
20
|
+
})
|
|
21
|
+
const subcommand: string = args.subcommand ?? 'status'
|
|
22
|
+
|
|
23
|
+
switch (subcommand) {
|
|
24
|
+
case 'install':
|
|
25
|
+
await handleInstall(args.all, args.path)
|
|
26
|
+
break
|
|
27
|
+
case 'uninstall':
|
|
28
|
+
await handleUninstall(args.path)
|
|
29
|
+
break
|
|
30
|
+
case 'status':
|
|
31
|
+
handleStatus(args.path)
|
|
32
|
+
break
|
|
33
|
+
default:
|
|
34
|
+
console.log()
|
|
35
|
+
console.log(errorText(`Unknown git-hook subcommand: ${subcommand}`))
|
|
36
|
+
printHelp()
|
|
37
|
+
process.exit(1)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async function handleInstall(allDir?: string, repoPath?: string) {
|
|
42
|
+
console.log()
|
|
43
|
+
console.log(renderLogo())
|
|
44
|
+
console.log()
|
|
45
|
+
console.log(heading('Install Git Hook'))
|
|
46
|
+
console.log()
|
|
47
|
+
|
|
48
|
+
if (allDir) {
|
|
49
|
+
const dir = allDir
|
|
50
|
+
|
|
51
|
+
let results: { installed: number; skipped: number; errors: number } | undefined
|
|
52
|
+
await withSpinner(`Installing git hooks in all repos under ${dir}`, async () => {
|
|
53
|
+
results = await installGitHookAll(dir)
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
console.log()
|
|
57
|
+
if (results) {
|
|
58
|
+
console.log(box([
|
|
59
|
+
successText(`Installed: ${results.installed}`),
|
|
60
|
+
dimText(`Skipped (already installed): ${results.skipped}`),
|
|
61
|
+
results.errors > 0 ? warningText(`Errors: ${results.errors}`) : '',
|
|
62
|
+
].filter(Boolean).join('\n'), 'Batch Install'))
|
|
63
|
+
}
|
|
64
|
+
console.log()
|
|
65
|
+
return
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
let result: { installed: boolean; message: string; hookPath: string } | undefined
|
|
70
|
+
await withSpinner('Installing post-commit hook', async () => {
|
|
71
|
+
result = installGitHook(repoPath)
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
console.log()
|
|
75
|
+
if (result?.installed) {
|
|
76
|
+
console.log(box([
|
|
77
|
+
successText(result.message),
|
|
78
|
+
'',
|
|
79
|
+
dimText('The hook fires after every git commit.'),
|
|
80
|
+
dimText('Commit data (branch, message, files) is sent to brain.'),
|
|
81
|
+
dimText('The hook runs in the background — no speed impact.'),
|
|
82
|
+
'',
|
|
83
|
+
result.hookPath ? `${theme.dim('Hook:')} ${result.hookPath}` : '',
|
|
84
|
+
].filter(Boolean).join('\n'), 'Git Hook Installed'))
|
|
85
|
+
} else if (result) {
|
|
86
|
+
console.log(box(warningText(result.message), 'Git Hook'))
|
|
87
|
+
}
|
|
88
|
+
} catch (err) {
|
|
89
|
+
console.log()
|
|
90
|
+
console.log(box(
|
|
91
|
+
errorText(`Failed: ${err instanceof Error ? err.message : String(err)}`),
|
|
92
|
+
'Error'
|
|
93
|
+
))
|
|
94
|
+
process.exit(1)
|
|
95
|
+
}
|
|
96
|
+
console.log()
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async function handleUninstall(repoPath?: string) {
|
|
100
|
+
console.log()
|
|
101
|
+
console.log(renderLogo())
|
|
102
|
+
console.log()
|
|
103
|
+
console.log(heading('Uninstall Git Hook'))
|
|
104
|
+
console.log()
|
|
105
|
+
|
|
106
|
+
try {
|
|
107
|
+
let result: { uninstalled: boolean; message: string } | undefined
|
|
108
|
+
await withSpinner('Removing post-commit hook', async () => {
|
|
109
|
+
result = uninstallGitHook(repoPath)
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
console.log()
|
|
113
|
+
if (result?.uninstalled) {
|
|
114
|
+
console.log(box(successText(result.message), 'Git Hook Removed'))
|
|
115
|
+
}
|
|
116
|
+
} catch (err) {
|
|
117
|
+
console.log()
|
|
118
|
+
console.log(box(
|
|
119
|
+
errorText(`Failed: ${err instanceof Error ? err.message : String(err)}`),
|
|
120
|
+
'Error'
|
|
121
|
+
))
|
|
122
|
+
process.exit(1)
|
|
123
|
+
}
|
|
124
|
+
console.log()
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function handleStatus(repoPath?: string) {
|
|
128
|
+
console.log()
|
|
129
|
+
console.log(renderLogo())
|
|
130
|
+
console.log()
|
|
131
|
+
console.log(heading('Git Hook Status'))
|
|
132
|
+
console.log()
|
|
133
|
+
|
|
134
|
+
const installed = isGitHookInstalled(repoPath)
|
|
135
|
+
|
|
136
|
+
const items = [
|
|
137
|
+
{
|
|
138
|
+
label: 'Installed',
|
|
139
|
+
value: installed ? 'Yes' : 'No',
|
|
140
|
+
status: installed ? 'success' as const : 'warning' as const
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
label: 'Repo',
|
|
144
|
+
value: repoPath || process.cwd(),
|
|
145
|
+
status: 'info' as const
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
label: 'Hook type',
|
|
149
|
+
value: 'post-commit',
|
|
150
|
+
status: 'info' as const
|
|
151
|
+
},
|
|
152
|
+
]
|
|
153
|
+
|
|
154
|
+
console.log(summaryPanel('Git Hook', items))
|
|
155
|
+
console.log()
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function printHelp() {
|
|
159
|
+
console.log()
|
|
160
|
+
const commands = [
|
|
161
|
+
['install', 'Install post-commit hook in current (or specified) repo'],
|
|
162
|
+
['install --all <dir>', 'Install in all git repos under a directory'],
|
|
163
|
+
['uninstall', 'Remove post-commit hook from current (or specified) repo'],
|
|
164
|
+
['status', 'Check if hook is installed'],
|
|
165
|
+
]
|
|
166
|
+
|
|
167
|
+
const cmdLines = commands
|
|
168
|
+
.map(([cmd, desc]) => ` ${theme.primary(cmd!.padEnd(22))} ${dimText(desc!)}`)
|
|
169
|
+
.join('\n')
|
|
170
|
+
|
|
171
|
+
console.log(box([
|
|
172
|
+
theme.bold('Usage:') + ' ' + dimText('claude-brain git-hook [subcommand]'),
|
|
173
|
+
'',
|
|
174
|
+
theme.bold('Subcommands:'),
|
|
175
|
+
cmdLines,
|
|
176
|
+
'',
|
|
177
|
+
theme.bold('Examples:'),
|
|
178
|
+
` ${dimText('claude-brain git-hook install')} ${dimText('Install in current repo')}`,
|
|
179
|
+
` ${dimText('claude-brain git-hook install --all ~/dev')} ${dimText('Install in all repos under ~/dev')}`,
|
|
180
|
+
` ${dimText('claude-brain git-hook uninstall')} ${dimText('Remove from current repo')}`,
|
|
181
|
+
].join('\n'), 'Git Hook Help'))
|
|
182
|
+
console.log()
|
|
183
|
+
}
|