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,126 +1,126 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* List Projects Handler
|
|
3
|
-
* Lists all available projects in the Obsidian vault
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { Logger } from 'pino'
|
|
7
|
-
import type { ToolResponse } from '@/tools/types'
|
|
8
|
-
import { getVaultService } 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 { ListProjectsSchema } from './schemas'
|
|
14
|
-
|
|
15
|
-
export async function handleListProjects(
|
|
16
|
-
args: unknown,
|
|
17
|
-
logger: Logger
|
|
18
|
-
): Promise<ToolResponse> {
|
|
19
|
-
try {
|
|
20
|
-
const input = ToolValidator.validate(args, ListProjectsSchema)
|
|
21
|
-
const { status_filter } = input
|
|
22
|
-
|
|
23
|
-
logger.debug({ status_filter }, 'Listing projects')
|
|
24
|
-
|
|
25
|
-
const vault = getVaultService()
|
|
26
|
-
|
|
27
|
-
const projectDirs = await vault.listProjects()
|
|
28
|
-
|
|
29
|
-
if (projectDirs.length === 0) {
|
|
30
|
-
return ResponseFormatter.text(
|
|
31
|
-
`No projects found in your vault.\n\n` +
|
|
32
|
-
`To create a project, add a directory under:\n` +
|
|
33
|
-
`${vault.paths.projects}/your-project-name/\n\n` +
|
|
34
|
-
`Each project should have:\n` +
|
|
35
|
-
`- context.md (project overview)\n` +
|
|
36
|
-
`- progress.md (current status)\n` +
|
|
37
|
-
`- decisions.md (decision log)\n` +
|
|
38
|
-
`- standards.md (coding standards)`
|
|
39
|
-
)
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const projects = []
|
|
43
|
-
|
|
44
|
-
for (const dir of projectDirs) {
|
|
45
|
-
try {
|
|
46
|
-
const metadata = await vault.getProjectMetadata(dir)
|
|
47
|
-
if (!metadata) continue
|
|
48
|
-
|
|
49
|
-
if (status_filter !== 'all' && metadata.status !== status_filter) {
|
|
50
|
-
continue
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
projects.push({
|
|
54
|
-
name: dir,
|
|
55
|
-
status: metadata.status,
|
|
56
|
-
techStack: metadata.techStack,
|
|
57
|
-
created: undefined,
|
|
58
|
-
updated: undefined,
|
|
59
|
-
tags: [],
|
|
60
|
-
currentPhase: metadata.currentPhase,
|
|
61
|
-
completionPercentage: metadata.completionPercentage
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
} catch (error) {
|
|
65
|
-
logger.warn({ project: dir }, 'Skipping project with invalid context')
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
if (projects.length === 0) {
|
|
70
|
-
return ResponseFormatter.text(
|
|
71
|
-
`No projects found with status: ${status_filter}\n\n` +
|
|
72
|
-
`Try changing the status_filter or use "all" to see all projects.`
|
|
73
|
-
)
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
projects.sort((a, b) => {
|
|
77
|
-
const dateA = new Date(a.updated || 0)
|
|
78
|
-
const dateB = new Date(b.updated || 0)
|
|
79
|
-
return dateB.getTime() - dateA.getTime()
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
let output = `# Available Projects (${projects.length})\n\n`
|
|
83
|
-
|
|
84
|
-
for (const project of projects) {
|
|
85
|
-
output += `## ${project.name}\n\n`
|
|
86
|
-
output += `**Status:** ${project.status}\n`
|
|
87
|
-
output += `**Phase:** ${project.currentPhase}\n`
|
|
88
|
-
output += `**Completion:** ${project.completionPercentage}%\n`
|
|
89
|
-
|
|
90
|
-
if (project.techStack && project.techStack.length > 0) {
|
|
91
|
-
output += `**Tech Stack:** ${project.techStack.join(', ')}\n`
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
if (project.tags && project.tags.length > 0) {
|
|
95
|
-
output += `**Tags:** ${project.tags.join(', ')}\n`
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
if (project.updated) {
|
|
99
|
-
output += `**Last Updated:** ${project.updated}\n`
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
output += '\n'
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
output += `---\n\n`
|
|
106
|
-
output += `💡 **Next Steps:**\n`
|
|
107
|
-
output += `- Use \`get_project_context\` with any project name to get full context\n`
|
|
108
|
-
output += `- Use \`get_code_standards\` to see coding standards for a project\n`
|
|
109
|
-
|
|
110
|
-
logger.info({ count: projects.length }, 'Projects listed')
|
|
111
|
-
|
|
112
|
-
return ResponseFormatter.text(output)
|
|
113
|
-
|
|
114
|
-
} catch (error) {
|
|
115
|
-
ErrorHandler.logError(logger, error, { tool: 'list_projects', args })
|
|
116
|
-
|
|
117
|
-
if (error instanceof McpError) {
|
|
118
|
-
throw error
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
throw new McpError(
|
|
122
|
-
ErrorCode.InternalError,
|
|
123
|
-
`Failed to list projects: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
124
|
-
)
|
|
125
|
-
}
|
|
126
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* List Projects Handler
|
|
3
|
+
* Lists all available projects in the Obsidian vault
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { Logger } from 'pino'
|
|
7
|
+
import type { ToolResponse } from '@/tools/types'
|
|
8
|
+
import { getVaultService } 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 { ListProjectsSchema } from './schemas'
|
|
14
|
+
|
|
15
|
+
export async function handleListProjects(
|
|
16
|
+
args: unknown,
|
|
17
|
+
logger: Logger
|
|
18
|
+
): Promise<ToolResponse> {
|
|
19
|
+
try {
|
|
20
|
+
const input = ToolValidator.validate(args, ListProjectsSchema)
|
|
21
|
+
const { status_filter } = input
|
|
22
|
+
|
|
23
|
+
logger.debug({ status_filter }, 'Listing projects')
|
|
24
|
+
|
|
25
|
+
const vault = getVaultService()
|
|
26
|
+
|
|
27
|
+
const projectDirs = await vault.listProjects()
|
|
28
|
+
|
|
29
|
+
if (projectDirs.length === 0) {
|
|
30
|
+
return ResponseFormatter.text(
|
|
31
|
+
`No projects found in your vault.\n\n` +
|
|
32
|
+
`To create a project, add a directory under:\n` +
|
|
33
|
+
`${vault.paths.projects}/your-project-name/\n\n` +
|
|
34
|
+
`Each project should have:\n` +
|
|
35
|
+
`- context.md (project overview)\n` +
|
|
36
|
+
`- progress.md (current status)\n` +
|
|
37
|
+
`- decisions.md (decision log)\n` +
|
|
38
|
+
`- standards.md (coding standards)`
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const projects = []
|
|
43
|
+
|
|
44
|
+
for (const dir of projectDirs) {
|
|
45
|
+
try {
|
|
46
|
+
const metadata = await vault.getProjectMetadata(dir)
|
|
47
|
+
if (!metadata) continue
|
|
48
|
+
|
|
49
|
+
if (status_filter !== 'all' && metadata.status !== status_filter) {
|
|
50
|
+
continue
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
projects.push({
|
|
54
|
+
name: dir,
|
|
55
|
+
status: metadata.status,
|
|
56
|
+
techStack: metadata.techStack,
|
|
57
|
+
created: undefined,
|
|
58
|
+
updated: undefined,
|
|
59
|
+
tags: [],
|
|
60
|
+
currentPhase: metadata.currentPhase,
|
|
61
|
+
completionPercentage: metadata.completionPercentage
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
} catch (error) {
|
|
65
|
+
logger.warn({ project: dir }, 'Skipping project with invalid context')
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (projects.length === 0) {
|
|
70
|
+
return ResponseFormatter.text(
|
|
71
|
+
`No projects found with status: ${status_filter}\n\n` +
|
|
72
|
+
`Try changing the status_filter or use "all" to see all projects.`
|
|
73
|
+
)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
projects.sort((a, b) => {
|
|
77
|
+
const dateA = new Date(a.updated || 0)
|
|
78
|
+
const dateB = new Date(b.updated || 0)
|
|
79
|
+
return dateB.getTime() - dateA.getTime()
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
let output = `# Available Projects (${projects.length})\n\n`
|
|
83
|
+
|
|
84
|
+
for (const project of projects) {
|
|
85
|
+
output += `## ${project.name}\n\n`
|
|
86
|
+
output += `**Status:** ${project.status}\n`
|
|
87
|
+
output += `**Phase:** ${project.currentPhase}\n`
|
|
88
|
+
output += `**Completion:** ${project.completionPercentage}%\n`
|
|
89
|
+
|
|
90
|
+
if (project.techStack && project.techStack.length > 0) {
|
|
91
|
+
output += `**Tech Stack:** ${project.techStack.join(', ')}\n`
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (project.tags && project.tags.length > 0) {
|
|
95
|
+
output += `**Tags:** ${project.tags.join(', ')}\n`
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (project.updated) {
|
|
99
|
+
output += `**Last Updated:** ${project.updated}\n`
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
output += '\n'
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
output += `---\n\n`
|
|
106
|
+
output += `💡 **Next Steps:**\n`
|
|
107
|
+
output += `- Use \`get_project_context\` with any project name to get full context\n`
|
|
108
|
+
output += `- Use \`get_code_standards\` to see coding standards for a project\n`
|
|
109
|
+
|
|
110
|
+
logger.info({ count: projects.length }, 'Projects listed')
|
|
111
|
+
|
|
112
|
+
return ResponseFormatter.text(output)
|
|
113
|
+
|
|
114
|
+
} catch (error) {
|
|
115
|
+
ErrorHandler.logError(logger, error, { tool: 'list_projects', args })
|
|
116
|
+
|
|
117
|
+
if (error instanceof McpError) {
|
|
118
|
+
throw error
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
throw new McpError(
|
|
122
|
+
ErrorCode.InternalError,
|
|
123
|
+
`Failed to list projects: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
124
|
+
)
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -1,87 +1,87 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Recall Similar Handler
|
|
3
|
-
* Finds past decisions and context similar to the current situation
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { Logger } from 'pino'
|
|
7
|
-
import type { ToolResponse } from '@/tools/types'
|
|
8
|
-
import { getMemoryService, isServicesInitialized } from '@/server/services'
|
|
9
|
-
import { ToolValidator } from '@/server/utils/validators'
|
|
10
|
-
import { ResponseFormatter } from '@/server/utils/response-formatter'
|
|
11
|
-
import { withMemoryIndicator } from '@/server/utils/memory-indicator'
|
|
12
|
-
import { ErrorHandler } from '@/server/utils/error-handler'
|
|
13
|
-
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
14
|
-
import { RecallSimilarSchema } from './schemas'
|
|
15
|
-
|
|
16
|
-
export async function handleRecallSimilar(
|
|
17
|
-
args: unknown,
|
|
18
|
-
logger: Logger
|
|
19
|
-
): Promise<ToolResponse> {
|
|
20
|
-
try {
|
|
21
|
-
const input = ToolValidator.validate(args, RecallSimilarSchema)
|
|
22
|
-
const { query, project_filter, limit, min_similarity } = input
|
|
23
|
-
|
|
24
|
-
logger.debug(
|
|
25
|
-
{
|
|
26
|
-
queryLength: query.length,
|
|
27
|
-
project_filter,
|
|
28
|
-
limit,
|
|
29
|
-
min_similarity
|
|
30
|
-
},
|
|
31
|
-
'Recalling similar memories'
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
if (!isServicesInitialized()) {
|
|
35
|
-
throw new McpError(
|
|
36
|
-
ErrorCode.InternalError,
|
|
37
|
-
'Memory service not initialized. The server may still be starting up.'
|
|
38
|
-
)
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const memory = getMemoryService()
|
|
42
|
-
|
|
43
|
-
// Use recallSimilar which routes to ChromaDB when enabled
|
|
44
|
-
const formattedContext = await memory.recallSimilar(query, {
|
|
45
|
-
project: project_filter,
|
|
46
|
-
limit,
|
|
47
|
-
minSimilarity: min_similarity
|
|
48
|
-
})
|
|
49
|
-
|
|
50
|
-
// Check if no results by inspecting the returned context
|
|
51
|
-
if (formattedContext.includes('No decisions found') || !formattedContext.trim()) {
|
|
52
|
-
return ResponseFormatter.text(
|
|
53
|
-
`No similar memories found for query: "${query.slice(0, 100)}${query.length > 100 ? '...' : ''}"\n\n` +
|
|
54
|
-
`**Search Parameters:**\n` +
|
|
55
|
-
`- Project filter: ${project_filter || 'all projects'}\n` +
|
|
56
|
-
`- Max results: ${limit}\n` +
|
|
57
|
-
`- Minimum similarity: ${(min_similarity * 100).toFixed(0)}%\n\n` +
|
|
58
|
-
`**Suggestions:**\n` +
|
|
59
|
-
`- Try a more general query\n` +
|
|
60
|
-
`- Lower the minimum similarity threshold\n` +
|
|
61
|
-
`- Check if decisions have been stored for this project`
|
|
62
|
-
)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
memory.getStats()
|
|
66
|
-
|
|
67
|
-
logger.info(
|
|
68
|
-
{ query },
|
|
69
|
-
'Similar decisions found'
|
|
70
|
-
)
|
|
71
|
-
|
|
72
|
-
// Add memory indicator to show Claude Brain helped
|
|
73
|
-
return ResponseFormatter.text(withMemoryIndicator(formattedContext))
|
|
74
|
-
|
|
75
|
-
} catch (error) {
|
|
76
|
-
ErrorHandler.logError(logger, error, { tool: 'recall_similar', args })
|
|
77
|
-
|
|
78
|
-
if (error instanceof McpError) {
|
|
79
|
-
throw error
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
throw new McpError(
|
|
83
|
-
ErrorCode.InternalError,
|
|
84
|
-
`Failed to recall similar decisions: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
85
|
-
)
|
|
86
|
-
}
|
|
87
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Recall Similar Handler
|
|
3
|
+
* Finds past decisions and context similar to the current situation
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { Logger } from 'pino'
|
|
7
|
+
import type { ToolResponse } from '@/tools/types'
|
|
8
|
+
import { getMemoryService, isServicesInitialized } from '@/server/services'
|
|
9
|
+
import { ToolValidator } from '@/server/utils/validators'
|
|
10
|
+
import { ResponseFormatter } from '@/server/utils/response-formatter'
|
|
11
|
+
import { withMemoryIndicator } from '@/server/utils/memory-indicator'
|
|
12
|
+
import { ErrorHandler } from '@/server/utils/error-handler'
|
|
13
|
+
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js'
|
|
14
|
+
import { RecallSimilarSchema } from './schemas'
|
|
15
|
+
|
|
16
|
+
export async function handleRecallSimilar(
|
|
17
|
+
args: unknown,
|
|
18
|
+
logger: Logger
|
|
19
|
+
): Promise<ToolResponse> {
|
|
20
|
+
try {
|
|
21
|
+
const input = ToolValidator.validate(args, RecallSimilarSchema)
|
|
22
|
+
const { query, project_filter, limit, min_similarity } = input
|
|
23
|
+
|
|
24
|
+
logger.debug(
|
|
25
|
+
{
|
|
26
|
+
queryLength: query.length,
|
|
27
|
+
project_filter,
|
|
28
|
+
limit,
|
|
29
|
+
min_similarity
|
|
30
|
+
},
|
|
31
|
+
'Recalling similar memories'
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
if (!isServicesInitialized()) {
|
|
35
|
+
throw new McpError(
|
|
36
|
+
ErrorCode.InternalError,
|
|
37
|
+
'Memory service not initialized. The server may still be starting up.'
|
|
38
|
+
)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const memory = getMemoryService()
|
|
42
|
+
|
|
43
|
+
// Use recallSimilar which routes to ChromaDB when enabled
|
|
44
|
+
const formattedContext = await memory.recallSimilar(query, {
|
|
45
|
+
project: project_filter,
|
|
46
|
+
limit,
|
|
47
|
+
minSimilarity: min_similarity
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
// Check if no results by inspecting the returned context
|
|
51
|
+
if (formattedContext.includes('No decisions found') || !formattedContext.trim()) {
|
|
52
|
+
return ResponseFormatter.text(
|
|
53
|
+
`No similar memories found for query: "${query.slice(0, 100)}${query.length > 100 ? '...' : ''}"\n\n` +
|
|
54
|
+
`**Search Parameters:**\n` +
|
|
55
|
+
`- Project filter: ${project_filter || 'all projects'}\n` +
|
|
56
|
+
`- Max results: ${limit}\n` +
|
|
57
|
+
`- Minimum similarity: ${(min_similarity * 100).toFixed(0)}%\n\n` +
|
|
58
|
+
`**Suggestions:**\n` +
|
|
59
|
+
`- Try a more general query\n` +
|
|
60
|
+
`- Lower the minimum similarity threshold\n` +
|
|
61
|
+
`- Check if decisions have been stored for this project`
|
|
62
|
+
)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
memory.getStats()
|
|
66
|
+
|
|
67
|
+
logger.info(
|
|
68
|
+
{ query },
|
|
69
|
+
'Similar decisions found'
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
// Add memory indicator to show Claude Brain helped
|
|
73
|
+
return ResponseFormatter.text(withMemoryIndicator(formattedContext))
|
|
74
|
+
|
|
75
|
+
} catch (error) {
|
|
76
|
+
ErrorHandler.logError(logger, error, { tool: 'recall_similar', args })
|
|
77
|
+
|
|
78
|
+
if (error instanceof McpError) {
|
|
79
|
+
throw error
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
throw new McpError(
|
|
83
|
+
ErrorCode.InternalError,
|
|
84
|
+
`Failed to recall similar decisions: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
}
|