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,179 +1,179 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Zod Validation Schemas for Tool Handlers
|
|
3
|
-
* Provides input validation for all MCP tool handlers
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { z } from 'zod'
|
|
7
|
-
|
|
8
|
-
// ============================================================================
|
|
9
|
-
// Project Context & Management
|
|
10
|
-
// ============================================================================
|
|
11
|
-
|
|
12
|
-
export const GetProjectContextSchema = z.object({
|
|
13
|
-
project_name: z.string().min(1, 'project_name is required'),
|
|
14
|
-
include_memories: z.boolean().optional().default(true),
|
|
15
|
-
memory_limit: z.number().int().min(1).max(100).optional().default(5)
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
export const ListProjectsSchema = z.object({
|
|
19
|
-
status_filter: z.enum(['active', 'archived', 'planning', 'all']).optional().default('active')
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
export const CreateProjectSchema = z.object({
|
|
23
|
-
project_name: z.string().min(1, 'project_name is required')
|
|
24
|
-
.regex(/^[a-z0-9-]+$/, 'project_name must be lowercase with hyphens only'),
|
|
25
|
-
description: z.string().optional(),
|
|
26
|
-
tech_stack: z.array(z.string()).optional().default([]),
|
|
27
|
-
status: z.enum(['planning', 'active', 'on-hold', 'completed']).optional().default('planning'),
|
|
28
|
-
tags: z.array(z.string()).optional().default([])
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
export const InitProjectSchema = z.object({
|
|
32
|
-
project_path: z.string().optional(),
|
|
33
|
-
project_name: z.string().optional(),
|
|
34
|
-
save_to_memory: z.boolean().optional().default(true)
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
// ============================================================================
|
|
38
|
-
// Decision & Memory
|
|
39
|
-
// ============================================================================
|
|
40
|
-
|
|
41
|
-
export const RememberDecisionSchema = z.object({
|
|
42
|
-
project_name: z.string().min(1, 'project_name is required'),
|
|
43
|
-
context: z.string().min(1, 'context is required'),
|
|
44
|
-
decision: z.string().min(1, 'decision is required'),
|
|
45
|
-
reasoning: z.string().min(1, 'reasoning is required'),
|
|
46
|
-
alternatives_considered: z.string().optional(),
|
|
47
|
-
tags: z.array(z.string()).optional().default([])
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
export const RecallSimilarSchema = z.object({
|
|
51
|
-
query: z.string().min(1, 'query is required'),
|
|
52
|
-
project_filter: z.string().optional(),
|
|
53
|
-
limit: z.number().int().min(1).max(50).optional().default(5),
|
|
54
|
-
min_similarity: z.number().min(0).max(1).optional().default(0.3)
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
// ============================================================================
|
|
58
|
-
// Smart Context & Automation
|
|
59
|
-
// ============================================================================
|
|
60
|
-
|
|
61
|
-
export const SmartContextSchema = z.object({
|
|
62
|
-
project_name: z.string().min(1, 'project_name is required'),
|
|
63
|
-
current_task: z.string().min(1, 'current_task is required'),
|
|
64
|
-
min_similarity: z.number().min(0).max(1).optional().default(0.3)
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
export const AutoRememberSchema = z.object({
|
|
68
|
-
project_name: z.string().min(1, 'project_name is required'),
|
|
69
|
-
text: z.string().min(1, 'text is required'),
|
|
70
|
-
confidence_threshold: z.number().min(0).max(1).optional().default(0.7)
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
// ============================================================================
|
|
74
|
-
// Code Standards
|
|
75
|
-
// ============================================================================
|
|
76
|
-
|
|
77
|
-
export const GetCodeStandardsSchema = z.object({
|
|
78
|
-
project_name: z.string().min(1, 'project_name is required'),
|
|
79
|
-
language: z.string().optional()
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
// ============================================================================
|
|
83
|
-
// Progress Tracking
|
|
84
|
-
// ============================================================================
|
|
85
|
-
|
|
86
|
-
export const UpdateProgressSchema = z.object({
|
|
87
|
-
project_name: z.string().min(1, 'project_name is required'),
|
|
88
|
-
completed_task: z.string().min(1, 'completed_task is required'),
|
|
89
|
-
next_steps: z.string().min(1, 'next_steps is required'),
|
|
90
|
-
notes: z.string().optional()
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
// ============================================================================
|
|
94
|
-
// Patterns & Corrections
|
|
95
|
-
// ============================================================================
|
|
96
|
-
|
|
97
|
-
export const RecognizePatternSchema = z.object({
|
|
98
|
-
project_name: z.string().min(1, 'project_name is required'),
|
|
99
|
-
pattern_type: z.enum(['solution', 'anti-pattern', 'best-practice', 'common-issue']),
|
|
100
|
-
description: z.string().min(1, 'description is required'),
|
|
101
|
-
example: z.string().optional(),
|
|
102
|
-
confidence: z.number().min(0).max(1).optional().default(0.8),
|
|
103
|
-
context: z.string().optional()
|
|
104
|
-
})
|
|
105
|
-
|
|
106
|
-
export const RecordCorrectionSchema = z.object({
|
|
107
|
-
project_name: z.string().min(1, 'project_name is required'),
|
|
108
|
-
original: z.string().min(1, 'original is required'),
|
|
109
|
-
correction: z.string().min(1, 'correction is required'),
|
|
110
|
-
reasoning: z.string().min(1, 'reasoning is required'),
|
|
111
|
-
context: z.string().optional(),
|
|
112
|
-
confidence: z.number().min(0).max(1).optional().default(0.9)
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
export const GetPatternsSchema = z.object({
|
|
116
|
-
project_name: z.string().optional(),
|
|
117
|
-
pattern_type: z.enum(['solution', 'anti-pattern', 'best-practice', 'common-issue']).optional(),
|
|
118
|
-
limit: z.number().int().min(1).max(100).optional().default(10),
|
|
119
|
-
query: z.string().optional()
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
export const GetCorrectionsSchema = z.object({
|
|
123
|
-
project_name: z.string().optional(),
|
|
124
|
-
limit: z.number().int().min(1).max(100).optional().default(10),
|
|
125
|
-
query: z.string().optional()
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
// ============================================================================
|
|
129
|
-
// Phase 12 Status
|
|
130
|
-
// ============================================================================
|
|
131
|
-
|
|
132
|
-
export const GetPhase12StatusSchema = z.object({})
|
|
133
|
-
|
|
134
|
-
// ============================================================================
|
|
135
|
-
// Phase 16 - Unified Brain Tool
|
|
136
|
-
// ============================================================================
|
|
137
|
-
|
|
138
|
-
export const BrainSchema = z.object({
|
|
139
|
-
message: z.string().min(1, 'message is required'),
|
|
140
|
-
project: z.string().optional(),
|
|
141
|
-
action: z.enum(['auto', 'store', 'recall', 'update', 'delete']).optional()
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
// ============================================================================
|
|
145
|
-
// Code Intelligence
|
|
146
|
-
// ============================================================================
|
|
147
|
-
|
|
148
|
-
export const SearchCodeSchema = z.object({
|
|
149
|
-
query: z.string().min(1, 'query is required'),
|
|
150
|
-
project: z.string().min(1, 'project is required'),
|
|
151
|
-
type: z.enum(['symbols', 'files', 'dependencies']).optional().default('symbols'),
|
|
152
|
-
file_path: z.string().optional(),
|
|
153
|
-
limit: z.number().int().min(1).max(100).optional().default(20)
|
|
154
|
-
})
|
|
155
|
-
|
|
156
|
-
// ============================================================================
|
|
157
|
-
// Type exports for validated inputs
|
|
158
|
-
// ============================================================================
|
|
159
|
-
|
|
160
|
-
export type ValidatedGetProjectContext = z.infer<typeof GetProjectContextSchema>
|
|
161
|
-
export type ValidatedListProjects = z.infer<typeof ListProjectsSchema>
|
|
162
|
-
export type ValidatedCreateProject = z.infer<typeof CreateProjectSchema>
|
|
163
|
-
export type ValidatedInitProject = z.infer<typeof InitProjectSchema>
|
|
164
|
-
export type ValidatedRememberDecision = z.infer<typeof RememberDecisionSchema>
|
|
165
|
-
export type ValidatedRecallSimilar = z.infer<typeof RecallSimilarSchema>
|
|
166
|
-
export type ValidatedSmartContext = z.infer<typeof SmartContextSchema>
|
|
167
|
-
export type ValidatedAutoRemember = z.infer<typeof AutoRememberSchema>
|
|
168
|
-
export type ValidatedGetCodeStandards = z.infer<typeof GetCodeStandardsSchema>
|
|
169
|
-
export type ValidatedUpdateProgress = z.infer<typeof UpdateProgressSchema>
|
|
170
|
-
export type ValidatedRecognizePattern = z.infer<typeof RecognizePatternSchema>
|
|
171
|
-
export type ValidatedRecordCorrection = z.infer<typeof RecordCorrectionSchema>
|
|
172
|
-
export type ValidatedGetPatterns = z.infer<typeof GetPatternsSchema>
|
|
173
|
-
export type ValidatedGetCorrections = z.infer<typeof GetCorrectionsSchema>
|
|
174
|
-
|
|
175
|
-
// Phase 16
|
|
176
|
-
export type ValidatedBrain = z.infer<typeof BrainSchema>
|
|
177
|
-
|
|
178
|
-
// Code Intelligence
|
|
179
|
-
export type ValidatedSearchCode = z.infer<typeof SearchCodeSchema>
|
|
1
|
+
/**
|
|
2
|
+
* Zod Validation Schemas for Tool Handlers
|
|
3
|
+
* Provides input validation for all MCP tool handlers
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { z } from 'zod'
|
|
7
|
+
|
|
8
|
+
// ============================================================================
|
|
9
|
+
// Project Context & Management
|
|
10
|
+
// ============================================================================
|
|
11
|
+
|
|
12
|
+
export const GetProjectContextSchema = z.object({
|
|
13
|
+
project_name: z.string().min(1, 'project_name is required'),
|
|
14
|
+
include_memories: z.boolean().optional().default(true),
|
|
15
|
+
memory_limit: z.number().int().min(1).max(100).optional().default(5)
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
export const ListProjectsSchema = z.object({
|
|
19
|
+
status_filter: z.enum(['active', 'archived', 'planning', 'all']).optional().default('active')
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
export const CreateProjectSchema = z.object({
|
|
23
|
+
project_name: z.string().min(1, 'project_name is required')
|
|
24
|
+
.regex(/^[a-z0-9-]+$/, 'project_name must be lowercase with hyphens only'),
|
|
25
|
+
description: z.string().optional(),
|
|
26
|
+
tech_stack: z.array(z.string()).optional().default([]),
|
|
27
|
+
status: z.enum(['planning', 'active', 'on-hold', 'completed']).optional().default('planning'),
|
|
28
|
+
tags: z.array(z.string()).optional().default([])
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
export const InitProjectSchema = z.object({
|
|
32
|
+
project_path: z.string().optional(),
|
|
33
|
+
project_name: z.string().optional(),
|
|
34
|
+
save_to_memory: z.boolean().optional().default(true)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
// ============================================================================
|
|
38
|
+
// Decision & Memory
|
|
39
|
+
// ============================================================================
|
|
40
|
+
|
|
41
|
+
export const RememberDecisionSchema = z.object({
|
|
42
|
+
project_name: z.string().min(1, 'project_name is required'),
|
|
43
|
+
context: z.string().min(1, 'context is required'),
|
|
44
|
+
decision: z.string().min(1, 'decision is required'),
|
|
45
|
+
reasoning: z.string().min(1, 'reasoning is required'),
|
|
46
|
+
alternatives_considered: z.string().optional(),
|
|
47
|
+
tags: z.array(z.string()).optional().default([])
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
export const RecallSimilarSchema = z.object({
|
|
51
|
+
query: z.string().min(1, 'query is required'),
|
|
52
|
+
project_filter: z.string().optional(),
|
|
53
|
+
limit: z.number().int().min(1).max(50).optional().default(5),
|
|
54
|
+
min_similarity: z.number().min(0).max(1).optional().default(0.3)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
// ============================================================================
|
|
58
|
+
// Smart Context & Automation
|
|
59
|
+
// ============================================================================
|
|
60
|
+
|
|
61
|
+
export const SmartContextSchema = z.object({
|
|
62
|
+
project_name: z.string().min(1, 'project_name is required'),
|
|
63
|
+
current_task: z.string().min(1, 'current_task is required'),
|
|
64
|
+
min_similarity: z.number().min(0).max(1).optional().default(0.3)
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
export const AutoRememberSchema = z.object({
|
|
68
|
+
project_name: z.string().min(1, 'project_name is required'),
|
|
69
|
+
text: z.string().min(1, 'text is required'),
|
|
70
|
+
confidence_threshold: z.number().min(0).max(1).optional().default(0.7)
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
// ============================================================================
|
|
74
|
+
// Code Standards
|
|
75
|
+
// ============================================================================
|
|
76
|
+
|
|
77
|
+
export const GetCodeStandardsSchema = z.object({
|
|
78
|
+
project_name: z.string().min(1, 'project_name is required'),
|
|
79
|
+
language: z.string().optional()
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
// ============================================================================
|
|
83
|
+
// Progress Tracking
|
|
84
|
+
// ============================================================================
|
|
85
|
+
|
|
86
|
+
export const UpdateProgressSchema = z.object({
|
|
87
|
+
project_name: z.string().min(1, 'project_name is required'),
|
|
88
|
+
completed_task: z.string().min(1, 'completed_task is required'),
|
|
89
|
+
next_steps: z.string().min(1, 'next_steps is required'),
|
|
90
|
+
notes: z.string().optional()
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
// ============================================================================
|
|
94
|
+
// Patterns & Corrections
|
|
95
|
+
// ============================================================================
|
|
96
|
+
|
|
97
|
+
export const RecognizePatternSchema = z.object({
|
|
98
|
+
project_name: z.string().min(1, 'project_name is required'),
|
|
99
|
+
pattern_type: z.enum(['solution', 'anti-pattern', 'best-practice', 'common-issue']),
|
|
100
|
+
description: z.string().min(1, 'description is required'),
|
|
101
|
+
example: z.string().optional(),
|
|
102
|
+
confidence: z.number().min(0).max(1).optional().default(0.8),
|
|
103
|
+
context: z.string().optional()
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
export const RecordCorrectionSchema = z.object({
|
|
107
|
+
project_name: z.string().min(1, 'project_name is required'),
|
|
108
|
+
original: z.string().min(1, 'original is required'),
|
|
109
|
+
correction: z.string().min(1, 'correction is required'),
|
|
110
|
+
reasoning: z.string().min(1, 'reasoning is required'),
|
|
111
|
+
context: z.string().optional(),
|
|
112
|
+
confidence: z.number().min(0).max(1).optional().default(0.9)
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
export const GetPatternsSchema = z.object({
|
|
116
|
+
project_name: z.string().optional(),
|
|
117
|
+
pattern_type: z.enum(['solution', 'anti-pattern', 'best-practice', 'common-issue']).optional(),
|
|
118
|
+
limit: z.number().int().min(1).max(100).optional().default(10),
|
|
119
|
+
query: z.string().optional()
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
export const GetCorrectionsSchema = z.object({
|
|
123
|
+
project_name: z.string().optional(),
|
|
124
|
+
limit: z.number().int().min(1).max(100).optional().default(10),
|
|
125
|
+
query: z.string().optional()
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
// ============================================================================
|
|
129
|
+
// Phase 12 Status
|
|
130
|
+
// ============================================================================
|
|
131
|
+
|
|
132
|
+
export const GetPhase12StatusSchema = z.object({})
|
|
133
|
+
|
|
134
|
+
// ============================================================================
|
|
135
|
+
// Phase 16 - Unified Brain Tool
|
|
136
|
+
// ============================================================================
|
|
137
|
+
|
|
138
|
+
export const BrainSchema = z.object({
|
|
139
|
+
message: z.string().min(1, 'message is required'),
|
|
140
|
+
project: z.string().optional(),
|
|
141
|
+
action: z.enum(['auto', 'store', 'recall', 'update', 'delete']).optional()
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
// ============================================================================
|
|
145
|
+
// Code Intelligence
|
|
146
|
+
// ============================================================================
|
|
147
|
+
|
|
148
|
+
export const SearchCodeSchema = z.object({
|
|
149
|
+
query: z.string().min(1, 'query is required'),
|
|
150
|
+
project: z.string().min(1, 'project is required'),
|
|
151
|
+
type: z.enum(['symbols', 'files', 'dependencies']).optional().default('symbols'),
|
|
152
|
+
file_path: z.string().optional(),
|
|
153
|
+
limit: z.number().int().min(1).max(100).optional().default(20)
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
// ============================================================================
|
|
157
|
+
// Type exports for validated inputs
|
|
158
|
+
// ============================================================================
|
|
159
|
+
|
|
160
|
+
export type ValidatedGetProjectContext = z.infer<typeof GetProjectContextSchema>
|
|
161
|
+
export type ValidatedListProjects = z.infer<typeof ListProjectsSchema>
|
|
162
|
+
export type ValidatedCreateProject = z.infer<typeof CreateProjectSchema>
|
|
163
|
+
export type ValidatedInitProject = z.infer<typeof InitProjectSchema>
|
|
164
|
+
export type ValidatedRememberDecision = z.infer<typeof RememberDecisionSchema>
|
|
165
|
+
export type ValidatedRecallSimilar = z.infer<typeof RecallSimilarSchema>
|
|
166
|
+
export type ValidatedSmartContext = z.infer<typeof SmartContextSchema>
|
|
167
|
+
export type ValidatedAutoRemember = z.infer<typeof AutoRememberSchema>
|
|
168
|
+
export type ValidatedGetCodeStandards = z.infer<typeof GetCodeStandardsSchema>
|
|
169
|
+
export type ValidatedUpdateProgress = z.infer<typeof UpdateProgressSchema>
|
|
170
|
+
export type ValidatedRecognizePattern = z.infer<typeof RecognizePatternSchema>
|
|
171
|
+
export type ValidatedRecordCorrection = z.infer<typeof RecordCorrectionSchema>
|
|
172
|
+
export type ValidatedGetPatterns = z.infer<typeof GetPatternsSchema>
|
|
173
|
+
export type ValidatedGetCorrections = z.infer<typeof GetCorrectionsSchema>
|
|
174
|
+
|
|
175
|
+
// Phase 16
|
|
176
|
+
export type ValidatedBrain = z.infer<typeof BrainSchema>
|
|
177
|
+
|
|
178
|
+
// Code Intelligence
|
|
179
|
+
export type ValidatedSearchCode = z.infer<typeof SearchCodeSchema>
|
|
@@ -1,122 +1,122 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Search Code Handler
|
|
3
|
-
* Exposes code intelligence (symbol/file/dependency search) as a direct MCP tool
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { Logger } from 'pino'
|
|
7
|
-
import type { ToolResponse } from '@/tools/types'
|
|
8
|
-
import { getCodeQuery, isServicesInitialized } from '@/server/services'
|
|
9
|
-
import { ToolValidator } from '@/server/utils/validators'
|
|
10
|
-
import { ResponseFormatter } from '@/server/utils/response-formatter'
|
|
11
|
-
import { ErrorHandler } from '@/server/utils/error-handler'
|
|
12
|
-
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
13
|
-
import { SearchCodeSchema } from './schemas'
|
|
14
|
-
|
|
15
|
-
export async function handleSearchCode(
|
|
16
|
-
args: unknown,
|
|
17
|
-
logger: Logger
|
|
18
|
-
): Promise<ToolResponse> {
|
|
19
|
-
try {
|
|
20
|
-
const input = ToolValidator.validate(args, SearchCodeSchema)
|
|
21
|
-
const { query, project, type, file_path, limit } = input
|
|
22
|
-
|
|
23
|
-
logger.debug({ query, project, type, limit }, 'Searching code index')
|
|
24
|
-
|
|
25
|
-
if (!isServicesInitialized()) {
|
|
26
|
-
throw new McpError(
|
|
27
|
-
ErrorCode.InternalError,
|
|
28
|
-
'Services not initialized. The server may still be starting up.'
|
|
29
|
-
)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const codeQuery = getCodeQuery()
|
|
33
|
-
if (!codeQuery) {
|
|
34
|
-
return ResponseFormatter.text(
|
|
35
|
-
'Code intelligence is not available. Run `claude-brain reindex` to index your project first.'
|
|
36
|
-
)
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if (type === 'files') {
|
|
40
|
-
const results = codeQuery.findFiles(query, project)
|
|
41
|
-
if (results.length === 0) {
|
|
42
|
-
return ResponseFormatter.text(
|
|
43
|
-
`No files found matching "${query}" in project "${project}". Try \`claude-brain reindex\` if the project hasn't been indexed.`
|
|
44
|
-
)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const lines = results.map(r => {
|
|
48
|
-
const parts = [r.filePath]
|
|
49
|
-
if (r.language) parts.push(`(${r.language})`)
|
|
50
|
-
if (r.summary) parts.push(`— ${r.summary}`)
|
|
51
|
-
parts.push(`[${r.symbolCount} symbols, ${r.lineCount} lines]`)
|
|
52
|
-
return parts.join(' ')
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
return ResponseFormatter.text(
|
|
56
|
-
`Found ${results.length} file${results.length === 1 ? '' : 's'} matching "${query}":\n\n${lines.join('\n')}`
|
|
57
|
-
)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
if (type === 'dependencies') {
|
|
61
|
-
const targetPath = file_path || query
|
|
62
|
-
const deps = codeQuery.getDependencies(targetPath, project)
|
|
63
|
-
|
|
64
|
-
const parts: string[] = [`Dependencies for ${deps.file}:\n`]
|
|
65
|
-
|
|
66
|
-
if (deps.imports.length > 0) {
|
|
67
|
-
parts.push('**Imports:**')
|
|
68
|
-
for (const imp of deps.imports) {
|
|
69
|
-
const names = imp.names.length > 0 ? ` { ${imp.names.join(', ')} }` : ''
|
|
70
|
-
parts.push(` → ${imp.file}${names}`)
|
|
71
|
-
}
|
|
72
|
-
} else {
|
|
73
|
-
parts.push('**Imports:** none')
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
parts.push('')
|
|
77
|
-
|
|
78
|
-
if (deps.importedBy.length > 0) {
|
|
79
|
-
parts.push('**Imported by:**')
|
|
80
|
-
for (const dep of deps.importedBy) {
|
|
81
|
-
const names = dep.names.length > 0 ? ` { ${dep.names.join(', ')} }` : ''
|
|
82
|
-
parts.push(` ← ${dep.file}${names}`)
|
|
83
|
-
}
|
|
84
|
-
} else {
|
|
85
|
-
parts.push('**Imported by:** none')
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return ResponseFormatter.text(parts.join('\n'))
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Default: symbols
|
|
92
|
-
const results = codeQuery.findSymbols(query, project, limit)
|
|
93
|
-
if (results.length === 0) {
|
|
94
|
-
return ResponseFormatter.text(
|
|
95
|
-
`No symbols found matching "${query}" in project "${project}". Try \`claude-brain reindex\` if the project hasn't been indexed.`
|
|
96
|
-
)
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const lines = results.map(r => {
|
|
100
|
-
const sig = r.signature ? ` ${r.signature}` : ''
|
|
101
|
-
const lineRange = r.lineEnd ? `${r.lineStart}-${r.lineEnd}` : `${r.lineStart}`
|
|
102
|
-
const conf = r.confidence < 1.0 ? ` (${(r.confidence * 100).toFixed(0)}%)` : ''
|
|
103
|
-
return `${r.symbol} (${r.type})${sig} → ${r.filePath}:${lineRange}${conf}`
|
|
104
|
-
})
|
|
105
|
-
|
|
106
|
-
return ResponseFormatter.text(
|
|
107
|
-
`Found ${results.length} symbol${results.length === 1 ? '' : 's'} matching "${query}":\n\n${lines.join('\n')}`
|
|
108
|
-
)
|
|
109
|
-
|
|
110
|
-
} catch (error) {
|
|
111
|
-
ErrorHandler.logError(logger, error, { tool: 'search_code', args })
|
|
112
|
-
|
|
113
|
-
if (error instanceof McpError) {
|
|
114
|
-
throw error
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
throw new McpError(
|
|
118
|
-
ErrorCode.InternalError,
|
|
119
|
-
`Failed to search code: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
120
|
-
)
|
|
121
|
-
}
|
|
122
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Search Code Handler
|
|
3
|
+
* Exposes code intelligence (symbol/file/dependency search) as a direct MCP tool
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { Logger } from 'pino'
|
|
7
|
+
import type { ToolResponse } from '@/tools/types'
|
|
8
|
+
import { getCodeQuery, isServicesInitialized } from '@/server/services'
|
|
9
|
+
import { ToolValidator } from '@/server/utils/validators'
|
|
10
|
+
import { ResponseFormatter } from '@/server/utils/response-formatter'
|
|
11
|
+
import { ErrorHandler } from '@/server/utils/error-handler'
|
|
12
|
+
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
13
|
+
import { SearchCodeSchema } from './schemas'
|
|
14
|
+
|
|
15
|
+
export async function handleSearchCode(
|
|
16
|
+
args: unknown,
|
|
17
|
+
logger: Logger
|
|
18
|
+
): Promise<ToolResponse> {
|
|
19
|
+
try {
|
|
20
|
+
const input = ToolValidator.validate(args, SearchCodeSchema)
|
|
21
|
+
const { query, project, type, file_path, limit } = input
|
|
22
|
+
|
|
23
|
+
logger.debug({ query, project, type, limit }, 'Searching code index')
|
|
24
|
+
|
|
25
|
+
if (!isServicesInitialized()) {
|
|
26
|
+
throw new McpError(
|
|
27
|
+
ErrorCode.InternalError,
|
|
28
|
+
'Services not initialized. The server may still be starting up.'
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const codeQuery = getCodeQuery()
|
|
33
|
+
if (!codeQuery) {
|
|
34
|
+
return ResponseFormatter.text(
|
|
35
|
+
'Code intelligence is not available. Run `claude-brain reindex` to index your project first.'
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (type === 'files') {
|
|
40
|
+
const results = codeQuery.findFiles(query, project)
|
|
41
|
+
if (results.length === 0) {
|
|
42
|
+
return ResponseFormatter.text(
|
|
43
|
+
`No files found matching "${query}" in project "${project}". Try \`claude-brain reindex\` if the project hasn't been indexed.`
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const lines = results.map(r => {
|
|
48
|
+
const parts = [r.filePath]
|
|
49
|
+
if (r.language) parts.push(`(${r.language})`)
|
|
50
|
+
if (r.summary) parts.push(`— ${r.summary}`)
|
|
51
|
+
parts.push(`[${r.symbolCount} symbols, ${r.lineCount} lines]`)
|
|
52
|
+
return parts.join(' ')
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
return ResponseFormatter.text(
|
|
56
|
+
`Found ${results.length} file${results.length === 1 ? '' : 's'} matching "${query}":\n\n${lines.join('\n')}`
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (type === 'dependencies') {
|
|
61
|
+
const targetPath = file_path || query
|
|
62
|
+
const deps = codeQuery.getDependencies(targetPath, project)
|
|
63
|
+
|
|
64
|
+
const parts: string[] = [`Dependencies for ${deps.file}:\n`]
|
|
65
|
+
|
|
66
|
+
if (deps.imports.length > 0) {
|
|
67
|
+
parts.push('**Imports:**')
|
|
68
|
+
for (const imp of deps.imports) {
|
|
69
|
+
const names = imp.names.length > 0 ? ` { ${imp.names.join(', ')} }` : ''
|
|
70
|
+
parts.push(` → ${imp.file}${names}`)
|
|
71
|
+
}
|
|
72
|
+
} else {
|
|
73
|
+
parts.push('**Imports:** none')
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
parts.push('')
|
|
77
|
+
|
|
78
|
+
if (deps.importedBy.length > 0) {
|
|
79
|
+
parts.push('**Imported by:**')
|
|
80
|
+
for (const dep of deps.importedBy) {
|
|
81
|
+
const names = dep.names.length > 0 ? ` { ${dep.names.join(', ')} }` : ''
|
|
82
|
+
parts.push(` ← ${dep.file}${names}`)
|
|
83
|
+
}
|
|
84
|
+
} else {
|
|
85
|
+
parts.push('**Imported by:** none')
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return ResponseFormatter.text(parts.join('\n'))
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Default: symbols
|
|
92
|
+
const results = codeQuery.findSymbols(query, project, limit)
|
|
93
|
+
if (results.length === 0) {
|
|
94
|
+
return ResponseFormatter.text(
|
|
95
|
+
`No symbols found matching "${query}" in project "${project}". Try \`claude-brain reindex\` if the project hasn't been indexed.`
|
|
96
|
+
)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const lines = results.map(r => {
|
|
100
|
+
const sig = r.signature ? ` ${r.signature}` : ''
|
|
101
|
+
const lineRange = r.lineEnd ? `${r.lineStart}-${r.lineEnd}` : `${r.lineStart}`
|
|
102
|
+
const conf = r.confidence < 1.0 ? ` (${(r.confidence * 100).toFixed(0)}%)` : ''
|
|
103
|
+
return `${r.symbol} (${r.type})${sig} → ${r.filePath}:${lineRange}${conf}`
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
return ResponseFormatter.text(
|
|
107
|
+
`Found ${results.length} symbol${results.length === 1 ? '' : 's'} matching "${query}":\n\n${lines.join('\n')}`
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
} catch (error) {
|
|
111
|
+
ErrorHandler.logError(logger, error, { tool: 'search_code', args })
|
|
112
|
+
|
|
113
|
+
if (error instanceof McpError) {
|
|
114
|
+
throw error
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
throw new McpError(
|
|
118
|
+
ErrorCode.InternalError,
|
|
119
|
+
`Failed to search code: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
120
|
+
)
|
|
121
|
+
}
|
|
122
|
+
}
|