claude-brain 0.14.0 → 0.14.2
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 +191 -191
- package/VERSION +1 -1
- package/assets/CLAUDE-unified.md +11 -11
- package/assets/CLAUDE.md +11 -11
- package/bunfig.toml +8 -8
- package/package.json +80 -80
- 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/src/automation/auto-context.ts +240 -240
- package/src/automation/decision-detector.ts +452 -452
- package/src/automation/index.ts +11 -11
- 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 +205 -205
- package/src/cli/auto-setup.ts +82 -82
- package/src/cli/bin.ts +202 -202
- package/src/cli/commands/chroma.ts +573 -573
- package/src/cli/commands/git-hook.ts +189 -189
- package/src/cli/commands/hooks.ts +213 -213
- package/src/cli/commands/init.ts +122 -122
- package/src/cli/commands/install-mcp.ts +92 -92
- package/src/cli/commands/pack.ts +197 -197
- package/src/cli/commands/serve.ts +167 -167
- package/src/cli/commands/start.ts +42 -42
- package/src/cli/commands/uninstall-mcp.ts +41 -41
- package/src/cli/commands/update.ts +121 -121
- package/src/cli/diagnose.ts +4 -4
- package/src/cli/health-check.ts +4 -4
- package/src/cli/migrate-chroma.ts +106 -106
- package/src/cli/setup.ts +4 -4
- 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/config/defaults.ts +50 -50
- package/src/config/home.ts +55 -55
- package/src/config/index.ts +7 -7
- package/src/config/loader.ts +166 -166
- package/src/config/migration.ts +76 -76
- package/src/config/schema.ts +360 -360
- package/src/config/validator.ts +184 -184
- package/src/config/watcher.ts +86 -86
- package/src/context/assembler.ts +398 -398
- package/src/context/cache-manager.ts +101 -101
- package/src/context/formatter.ts +84 -84
- package/src/context/hierarchy.ts +85 -85
- package/src/context/index.ts +83 -83
- package/src/context/progress-tracker.ts +174 -174
- package/src/context/standards-manager.ts +287 -287
- package/src/context/types.ts +252 -252
- package/src/context/validator.ts +58 -58
- package/src/diagnostics/index.ts +123 -123
- package/src/health/index.ts +229 -229
- package/src/hooks/brain-hook.ts +112 -112
- package/src/hooks/capture.ts +168 -168
- package/src/hooks/deduplicator.ts +72 -72
- package/src/hooks/git-capture.ts +109 -109
- package/src/hooks/git-hook-installer.ts +207 -207
- package/src/hooks/index.ts +20 -20
- package/src/hooks/installer.ts +194 -181
- package/src/hooks/passive-classifier.ts +366 -366
- package/src/hooks/queue.ts +129 -122
- package/src/hooks/session-tracker.ts +275 -275
- package/src/hooks/types.ts +47 -47
- package/src/index.ts +7 -7
- package/src/intelligence/cross-project/affinity.ts +162 -162
- package/src/intelligence/cross-project/generalizer.ts +283 -283
- package/src/intelligence/cross-project/index.ts +13 -13
- package/src/intelligence/cross-project/transfer.ts +201 -201
- package/src/intelligence/index.ts +24 -24
- package/src/intelligence/optimization/index.ts +10 -10
- package/src/intelligence/optimization/precompute.ts +202 -202
- package/src/intelligence/optimization/semantic-cache.ts +207 -207
- package/src/intelligence/prediction/context-anticipator.ts +198 -198
- package/src/intelligence/prediction/decision-predictor.ts +184 -184
- package/src/intelligence/prediction/index.ts +13 -13
- package/src/intelligence/prediction/recommender.ts +268 -268
- package/src/intelligence/reasoning/chain-retrieval.ts +247 -247
- package/src/intelligence/reasoning/counterfactual.ts +248 -248
- package/src/intelligence/reasoning/index.ts +13 -13
- package/src/intelligence/reasoning/synthesizer.ts +169 -169
- package/src/intelligence/temporal/evolution.ts +197 -197
- package/src/intelligence/temporal/index.ts +16 -16
- package/src/intelligence/temporal/query-processor.ts +190 -190
- package/src/intelligence/temporal/timeline.ts +259 -259
- package/src/intelligence/temporal/trends.ts +263 -263
- package/src/knowledge/entity-extractor.ts +416 -416
- 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 +168 -168
- package/src/knowledge/relationship-extractor.ts +108 -108
- package/src/memory/chroma/client.ts +174 -174
- package/src/memory/chroma/collection-manager.ts +94 -94
- package/src/memory/chroma/config.ts +57 -57
- package/src/memory/chroma/embeddings.ts +153 -153
- 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 +315 -315
- package/src/memory/chroma/store.ts +741 -741
- package/src/memory/consolidation/archiver.ts +164 -164
- package/src/memory/consolidation/merger.ts +186 -186
- package/src/memory/consolidation/scorer.ts +138 -138
- package/src/memory/context-builder.ts +236 -236
- package/src/memory/database.ts +169 -169
- package/src/memory/embedding-utils.ts +156 -156
- package/src/memory/embeddings.ts +226 -226
- package/src/memory/episodic/detector.ts +108 -108
- package/src/memory/episodic/manager.ts +351 -351
- package/src/memory/episodic/summarizer.ts +179 -179
- package/src/memory/episodic/types.ts +52 -52
- package/src/memory/index.ts +582 -582
- package/src/memory/knowledge-extractor.ts +455 -455
- package/src/memory/learning.ts +378 -378
- package/src/memory/patterns.ts +396 -396
- package/src/memory/schema.ts +88 -88
- package/src/memory/search.ts +309 -309
- package/src/memory/store.ts +787 -787
- package/src/memory/types.ts +121 -121
- package/src/orchestrator/coordinator.ts +272 -272
- package/src/orchestrator/decision-logger.ts +228 -228
- package/src/orchestrator/event-emitter.ts +198 -198
- package/src/orchestrator/event-queue.ts +184 -184
- package/src/orchestrator/handlers/base-handler.ts +70 -70
- package/src/orchestrator/handlers/context-handler.ts +73 -73
- package/src/orchestrator/handlers/decision-handler.ts +204 -204
- package/src/orchestrator/handlers/index.ts +10 -10
- package/src/orchestrator/handlers/status-handler.ts +131 -131
- package/src/orchestrator/handlers/task-handler.ts +171 -171
- package/src/orchestrator/index.ts +275 -275
- package/src/orchestrator/task-parser.ts +284 -284
- package/src/orchestrator/types.ts +98 -98
- 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 -300
- package/src/retrieval/bm25/tokenizer.ts +184 -184
- package/src/retrieval/feedback/adaptive.ts +223 -223
- package/src/retrieval/feedback/index.ts +16 -16
- package/src/retrieval/feedback/metrics.ts +223 -223
- package/src/retrieval/feedback/store.ts +283 -283
- package/src/retrieval/fusion/index.ts +194 -194
- package/src/retrieval/fusion/rrf.ts +163 -163
- package/src/retrieval/index.ts +12 -12
- package/src/retrieval/pipeline.ts +375 -375
- package/src/retrieval/query/expander.ts +198 -198
- package/src/retrieval/query/index.ts +27 -27
- package/src/retrieval/query/intent-classifier.ts +236 -236
- package/src/retrieval/query/temporal-parser.ts +295 -295
- package/src/retrieval/reranker/index.ts +188 -188
- package/src/retrieval/reranker/model.ts +95 -95
- package/src/retrieval/service.ts +125 -125
- package/src/retrieval/types.ts +162 -162
- package/src/routing/entity-extractor.ts +428 -428
- package/src/routing/intent-classifier.ts +436 -436
- package/src/routing/response-filter.ts +254 -254
- package/src/routing/router.ts +1314 -1314
- package/src/routing/search-engine.ts +475 -475
- package/src/routing/types.ts +84 -84
- package/src/scripts/health-check.ts +118 -118
- package/src/scripts/setup.ts +122 -122
- package/src/server/handlers/call-tool.ts +156 -156
- package/src/server/handlers/index.ts +9 -9
- package/src/server/handlers/list-tools.ts +35 -35
- package/src/server/handlers/tools/analyze-decision-evolution.ts +151 -151
- package/src/server/handlers/tools/auto-remember.ts +200 -200
- package/src/server/handlers/tools/brain.ts +85 -85
- package/src/server/handlers/tools/create-project.ts +135 -135
- package/src/server/handlers/tools/detect-trends.ts +144 -144
- package/src/server/handlers/tools/find-cross-project-patterns.ts +168 -168
- package/src/server/handlers/tools/get-activity-log.ts +194 -194
- package/src/server/handlers/tools/get-code-standards.ts +124 -124
- package/src/server/handlers/tools/get-corrections.ts +154 -154
- package/src/server/handlers/tools/get-decision-timeline.ts +172 -172
- package/src/server/handlers/tools/get-episode.ts +103 -103
- package/src/server/handlers/tools/get-patterns.ts +158 -158
- package/src/server/handlers/tools/get-phase12-status.ts +63 -63
- package/src/server/handlers/tools/get-project-context.ts +75 -75
- package/src/server/handlers/tools/get-recommendations.ts +145 -145
- package/src/server/handlers/tools/index.ts +31 -31
- package/src/server/handlers/tools/init-project.ts +757 -757
- package/src/server/handlers/tools/list-episodes.ts +90 -90
- package/src/server/handlers/tools/list-projects.ts +125 -125
- package/src/server/handlers/tools/rate-memory.ts +101 -101
- package/src/server/handlers/tools/recall-similar.ts +87 -87
- package/src/server/handlers/tools/recognize-pattern.ts +126 -126
- package/src/server/handlers/tools/record-correction.ts +125 -125
- package/src/server/handlers/tools/remember-decision.ts +153 -153
- package/src/server/handlers/tools/schemas.ts +253 -253
- package/src/server/handlers/tools/search-knowledge-graph.ts +102 -102
- package/src/server/handlers/tools/smart-context.ts +146 -146
- package/src/server/handlers/tools/update-progress.ts +131 -131
- package/src/server/handlers/tools/what-if-analysis.ts +135 -135
- package/src/server/http-api.ts +693 -693
- package/src/server/index.ts +40 -40
- package/src/server/mcp-server.ts +283 -283
- package/src/server/providers/index.ts +7 -7
- package/src/server/providers/prompts.ts +327 -327
- package/src/server/providers/resources.ts +622 -622
- package/src/server/services.ts +468 -468
- package/src/server/types.ts +39 -39
- package/src/server/utils/error-handler.ts +155 -155
- package/src/server/utils/index.ts +13 -13
- package/src/server/utils/memory-indicator.ts +83 -83
- package/src/server/utils/request-context.ts +122 -122
- package/src/server/utils/response-formatter.ts +124 -124
- package/src/server/utils/validators.ts +210 -210
- package/src/setup/index.ts +48 -48
- package/src/setup/wizard.ts +461 -461
- package/src/tools/index.ts +24 -24
- package/src/tools/registry.ts +115 -115
- package/src/tools/schemas.test.ts +30 -30
- package/src/tools/schemas.ts +617 -617
- package/src/tools/types.ts +412 -412
- package/src/utils/circuit-breaker.ts +130 -130
- package/src/utils/cleanup.ts +34 -34
- package/src/utils/error-handler.ts +132 -132
- package/src/utils/error-messages.ts +60 -60
- package/src/utils/fallback.ts +45 -45
- package/src/utils/index.ts +54 -54
- package/src/utils/logger-utils.ts +80 -80
- package/src/utils/logger.ts +88 -88
- package/src/utils/phase12-helper.ts +56 -56
- package/src/utils/retry.ts +94 -94
- package/src/utils/timing.ts +47 -47
- package/src/utils/transaction.ts +63 -63
- package/src/vault/frontmatter.ts +264 -264
- package/src/vault/index.ts +318 -318
- package/src/vault/paths.ts +106 -106
- package/src/vault/query.ts +422 -422
- package/src/vault/reader.ts +264 -264
- package/src/vault/templates.ts +186 -186
- package/src/vault/types.ts +73 -73
- package/src/vault/watcher.ts +277 -277
- package/src/vault/writer.ts +413 -413
- package/tsconfig.json +30 -30
|
@@ -1,240 +1,240 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auto-Context Loader
|
|
3
|
-
* Phase 12: Advanced Memory & Intelligent Automation
|
|
4
|
-
*
|
|
5
|
-
* Automatically detects project and loads context
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { Logger } from 'pino'
|
|
9
|
-
import type { ContextManager } from '@/context'
|
|
10
|
-
import type { AssembledContext } from '@/context/types'
|
|
11
|
-
import { ProjectDetector, type DetectedProject } from './project-detector'
|
|
12
|
-
|
|
13
|
-
export interface LoadedContextEntry {
|
|
14
|
-
project: string
|
|
15
|
-
context: AssembledContext
|
|
16
|
-
loadedAt: Date
|
|
17
|
-
detected: DetectedProject
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface AutoContextStats {
|
|
21
|
-
loadedContexts: number
|
|
22
|
-
directories: string[]
|
|
23
|
-
lastLoadTime?: Date
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export class AutoContextLoader {
|
|
27
|
-
private logger: Logger
|
|
28
|
-
private context: ContextManager
|
|
29
|
-
private detector: ProjectDetector
|
|
30
|
-
private loadedContext: Map<string, LoadedContextEntry> = new Map()
|
|
31
|
-
private currentProject: string | null = null
|
|
32
|
-
|
|
33
|
-
constructor(
|
|
34
|
-
logger: Logger,
|
|
35
|
-
context: ContextManager,
|
|
36
|
-
detector: ProjectDetector
|
|
37
|
-
) {
|
|
38
|
-
this.logger = logger.child({ component: 'auto-context-loader' })
|
|
39
|
-
this.context = context
|
|
40
|
-
this.detector = detector
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Initialize and load context for current directory
|
|
45
|
-
*/
|
|
46
|
-
async initialize(): Promise<DetectedProject | null> {
|
|
47
|
-
try {
|
|
48
|
-
const cwd = process.cwd()
|
|
49
|
-
const detected = await this.loadContextForDirectory(cwd)
|
|
50
|
-
|
|
51
|
-
this.logger.info(
|
|
52
|
-
{ project: detected?.name },
|
|
53
|
-
'Auto-context loader initialized'
|
|
54
|
-
)
|
|
55
|
-
|
|
56
|
-
return detected
|
|
57
|
-
} catch (error) {
|
|
58
|
-
this.logger.error({ error }, 'Failed to initialize auto-context loader')
|
|
59
|
-
return null
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Load context for a directory
|
|
65
|
-
*/
|
|
66
|
-
async loadContextForDirectory(directory: string): Promise<DetectedProject | null> {
|
|
67
|
-
// Check if already loaded
|
|
68
|
-
const existing = this.loadedContext.get(directory)
|
|
69
|
-
if (existing) {
|
|
70
|
-
this.logger.debug({ directory, project: existing.project }, 'Context already loaded')
|
|
71
|
-
this.currentProject = existing.project
|
|
72
|
-
return existing.detected
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// Detect project
|
|
76
|
-
const detected = await this.detector.detectProject(directory)
|
|
77
|
-
|
|
78
|
-
if (!detected) {
|
|
79
|
-
this.logger.debug({ directory }, 'No project detected')
|
|
80
|
-
return null
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (detected.confidence < 0.5) {
|
|
84
|
-
this.logger.warn(
|
|
85
|
-
{ project: detected.name, confidence: detected.confidence },
|
|
86
|
-
'Low confidence project detection - skipping auto-load'
|
|
87
|
-
)
|
|
88
|
-
return detected
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Load context
|
|
92
|
-
this.logger.info(
|
|
93
|
-
{
|
|
94
|
-
project: detected.name,
|
|
95
|
-
confidence: detected.confidence,
|
|
96
|
-
indicators: detected.indicators
|
|
97
|
-
},
|
|
98
|
-
'Auto-loading project context'
|
|
99
|
-
)
|
|
100
|
-
|
|
101
|
-
try {
|
|
102
|
-
const context = await this.context.getContext(detected.name)
|
|
103
|
-
|
|
104
|
-
this.loadedContext.set(directory, {
|
|
105
|
-
project: detected.name,
|
|
106
|
-
context,
|
|
107
|
-
loadedAt: new Date(),
|
|
108
|
-
detected
|
|
109
|
-
})
|
|
110
|
-
|
|
111
|
-
this.currentProject = detected.name
|
|
112
|
-
|
|
113
|
-
this.logger.info(
|
|
114
|
-
{ project: detected.name },
|
|
115
|
-
'Context loaded successfully'
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
return detected
|
|
119
|
-
|
|
120
|
-
} catch (error) {
|
|
121
|
-
this.logger.error(
|
|
122
|
-
{ error, project: detected.name },
|
|
123
|
-
'Failed to load context'
|
|
124
|
-
)
|
|
125
|
-
return detected
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Get loaded context for directory
|
|
131
|
-
*/
|
|
132
|
-
getLoadedContext(directory: string): LoadedContextEntry | undefined {
|
|
133
|
-
return this.loadedContext.get(directory)
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Get current project context
|
|
138
|
-
*/
|
|
139
|
-
getCurrentContext(): LoadedContextEntry | undefined {
|
|
140
|
-
const cwd = process.cwd()
|
|
141
|
-
return this.loadedContext.get(cwd)
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Get current project name
|
|
146
|
-
*/
|
|
147
|
-
getCurrentProject(): string | null {
|
|
148
|
-
return this.currentProject
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Reload context for a directory
|
|
153
|
-
*/
|
|
154
|
-
async reloadContext(directory: string): Promise<LoadedContextEntry | null> {
|
|
155
|
-
// Clear existing
|
|
156
|
-
this.loadedContext.delete(directory)
|
|
157
|
-
|
|
158
|
-
// Reload
|
|
159
|
-
const detected = await this.loadContextForDirectory(directory)
|
|
160
|
-
|
|
161
|
-
if (detected) {
|
|
162
|
-
return this.loadedContext.get(directory) || null
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
return null
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Clear loaded context for a directory
|
|
170
|
-
*/
|
|
171
|
-
clearContext(directory: string): void {
|
|
172
|
-
const entry = this.loadedContext.get(directory)
|
|
173
|
-
if (entry) {
|
|
174
|
-
this.logger.info({ project: entry.project }, 'Clearing context')
|
|
175
|
-
this.loadedContext.delete(directory)
|
|
176
|
-
|
|
177
|
-
if (this.currentProject === entry.project) {
|
|
178
|
-
this.currentProject = null
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Clear all loaded contexts
|
|
185
|
-
*/
|
|
186
|
-
clearAllContexts(): void {
|
|
187
|
-
this.loadedContext.clear()
|
|
188
|
-
this.currentProject = null
|
|
189
|
-
this.logger.info('All contexts cleared')
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Get formatted context summary for current directory
|
|
194
|
-
*/
|
|
195
|
-
async getContextSummary(): Promise<string | null> {
|
|
196
|
-
const current = this.getCurrentContext()
|
|
197
|
-
|
|
198
|
-
if (!current) {
|
|
199
|
-
return null
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
return this.context.getFormattedContext(current.project)
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* Check if context is loaded for directory
|
|
207
|
-
*/
|
|
208
|
-
isContextLoaded(directory: string): boolean {
|
|
209
|
-
return this.loadedContext.has(directory)
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Get auto-context statistics
|
|
214
|
-
*/
|
|
215
|
-
getStats(): AutoContextStats {
|
|
216
|
-
const directories = Array.from(this.loadedContext.keys())
|
|
217
|
-
const lastEntry = Array.from(this.loadedContext.values())
|
|
218
|
-
.sort((a, b) => b.loadedAt.getTime() - a.loadedAt.getTime())[0]
|
|
219
|
-
|
|
220
|
-
return {
|
|
221
|
-
loadedContexts: this.loadedContext.size,
|
|
222
|
-
directories,
|
|
223
|
-
lastLoadTime: lastEntry?.loadedAt
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Pre-load context for multiple directories
|
|
229
|
-
*/
|
|
230
|
-
async preloadContexts(directories: string[]): Promise<Map<string, DetectedProject | null>> {
|
|
231
|
-
const results = new Map<string, DetectedProject | null>()
|
|
232
|
-
|
|
233
|
-
for (const dir of directories) {
|
|
234
|
-
const detected = await this.loadContextForDirectory(dir)
|
|
235
|
-
results.set(dir, detected)
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
return results
|
|
239
|
-
}
|
|
240
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Context Loader
|
|
3
|
+
* Phase 12: Advanced Memory & Intelligent Automation
|
|
4
|
+
*
|
|
5
|
+
* Automatically detects project and loads context
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { Logger } from 'pino'
|
|
9
|
+
import type { ContextManager } from '@/context'
|
|
10
|
+
import type { AssembledContext } from '@/context/types'
|
|
11
|
+
import { ProjectDetector, type DetectedProject } from './project-detector'
|
|
12
|
+
|
|
13
|
+
export interface LoadedContextEntry {
|
|
14
|
+
project: string
|
|
15
|
+
context: AssembledContext
|
|
16
|
+
loadedAt: Date
|
|
17
|
+
detected: DetectedProject
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface AutoContextStats {
|
|
21
|
+
loadedContexts: number
|
|
22
|
+
directories: string[]
|
|
23
|
+
lastLoadTime?: Date
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export class AutoContextLoader {
|
|
27
|
+
private logger: Logger
|
|
28
|
+
private context: ContextManager
|
|
29
|
+
private detector: ProjectDetector
|
|
30
|
+
private loadedContext: Map<string, LoadedContextEntry> = new Map()
|
|
31
|
+
private currentProject: string | null = null
|
|
32
|
+
|
|
33
|
+
constructor(
|
|
34
|
+
logger: Logger,
|
|
35
|
+
context: ContextManager,
|
|
36
|
+
detector: ProjectDetector
|
|
37
|
+
) {
|
|
38
|
+
this.logger = logger.child({ component: 'auto-context-loader' })
|
|
39
|
+
this.context = context
|
|
40
|
+
this.detector = detector
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Initialize and load context for current directory
|
|
45
|
+
*/
|
|
46
|
+
async initialize(): Promise<DetectedProject | null> {
|
|
47
|
+
try {
|
|
48
|
+
const cwd = process.cwd()
|
|
49
|
+
const detected = await this.loadContextForDirectory(cwd)
|
|
50
|
+
|
|
51
|
+
this.logger.info(
|
|
52
|
+
{ project: detected?.name },
|
|
53
|
+
'Auto-context loader initialized'
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
return detected
|
|
57
|
+
} catch (error) {
|
|
58
|
+
this.logger.error({ error }, 'Failed to initialize auto-context loader')
|
|
59
|
+
return null
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Load context for a directory
|
|
65
|
+
*/
|
|
66
|
+
async loadContextForDirectory(directory: string): Promise<DetectedProject | null> {
|
|
67
|
+
// Check if already loaded
|
|
68
|
+
const existing = this.loadedContext.get(directory)
|
|
69
|
+
if (existing) {
|
|
70
|
+
this.logger.debug({ directory, project: existing.project }, 'Context already loaded')
|
|
71
|
+
this.currentProject = existing.project
|
|
72
|
+
return existing.detected
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Detect project
|
|
76
|
+
const detected = await this.detector.detectProject(directory)
|
|
77
|
+
|
|
78
|
+
if (!detected) {
|
|
79
|
+
this.logger.debug({ directory }, 'No project detected')
|
|
80
|
+
return null
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (detected.confidence < 0.5) {
|
|
84
|
+
this.logger.warn(
|
|
85
|
+
{ project: detected.name, confidence: detected.confidence },
|
|
86
|
+
'Low confidence project detection - skipping auto-load'
|
|
87
|
+
)
|
|
88
|
+
return detected
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Load context
|
|
92
|
+
this.logger.info(
|
|
93
|
+
{
|
|
94
|
+
project: detected.name,
|
|
95
|
+
confidence: detected.confidence,
|
|
96
|
+
indicators: detected.indicators
|
|
97
|
+
},
|
|
98
|
+
'Auto-loading project context'
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
try {
|
|
102
|
+
const context = await this.context.getContext(detected.name)
|
|
103
|
+
|
|
104
|
+
this.loadedContext.set(directory, {
|
|
105
|
+
project: detected.name,
|
|
106
|
+
context,
|
|
107
|
+
loadedAt: new Date(),
|
|
108
|
+
detected
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
this.currentProject = detected.name
|
|
112
|
+
|
|
113
|
+
this.logger.info(
|
|
114
|
+
{ project: detected.name },
|
|
115
|
+
'Context loaded successfully'
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
return detected
|
|
119
|
+
|
|
120
|
+
} catch (error) {
|
|
121
|
+
this.logger.error(
|
|
122
|
+
{ error, project: detected.name },
|
|
123
|
+
'Failed to load context'
|
|
124
|
+
)
|
|
125
|
+
return detected
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Get loaded context for directory
|
|
131
|
+
*/
|
|
132
|
+
getLoadedContext(directory: string): LoadedContextEntry | undefined {
|
|
133
|
+
return this.loadedContext.get(directory)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Get current project context
|
|
138
|
+
*/
|
|
139
|
+
getCurrentContext(): LoadedContextEntry | undefined {
|
|
140
|
+
const cwd = process.cwd()
|
|
141
|
+
return this.loadedContext.get(cwd)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Get current project name
|
|
146
|
+
*/
|
|
147
|
+
getCurrentProject(): string | null {
|
|
148
|
+
return this.currentProject
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Reload context for a directory
|
|
153
|
+
*/
|
|
154
|
+
async reloadContext(directory: string): Promise<LoadedContextEntry | null> {
|
|
155
|
+
// Clear existing
|
|
156
|
+
this.loadedContext.delete(directory)
|
|
157
|
+
|
|
158
|
+
// Reload
|
|
159
|
+
const detected = await this.loadContextForDirectory(directory)
|
|
160
|
+
|
|
161
|
+
if (detected) {
|
|
162
|
+
return this.loadedContext.get(directory) || null
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return null
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Clear loaded context for a directory
|
|
170
|
+
*/
|
|
171
|
+
clearContext(directory: string): void {
|
|
172
|
+
const entry = this.loadedContext.get(directory)
|
|
173
|
+
if (entry) {
|
|
174
|
+
this.logger.info({ project: entry.project }, 'Clearing context')
|
|
175
|
+
this.loadedContext.delete(directory)
|
|
176
|
+
|
|
177
|
+
if (this.currentProject === entry.project) {
|
|
178
|
+
this.currentProject = null
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Clear all loaded contexts
|
|
185
|
+
*/
|
|
186
|
+
clearAllContexts(): void {
|
|
187
|
+
this.loadedContext.clear()
|
|
188
|
+
this.currentProject = null
|
|
189
|
+
this.logger.info('All contexts cleared')
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Get formatted context summary for current directory
|
|
194
|
+
*/
|
|
195
|
+
async getContextSummary(): Promise<string | null> {
|
|
196
|
+
const current = this.getCurrentContext()
|
|
197
|
+
|
|
198
|
+
if (!current) {
|
|
199
|
+
return null
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return this.context.getFormattedContext(current.project)
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Check if context is loaded for directory
|
|
207
|
+
*/
|
|
208
|
+
isContextLoaded(directory: string): boolean {
|
|
209
|
+
return this.loadedContext.has(directory)
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Get auto-context statistics
|
|
214
|
+
*/
|
|
215
|
+
getStats(): AutoContextStats {
|
|
216
|
+
const directories = Array.from(this.loadedContext.keys())
|
|
217
|
+
const lastEntry = Array.from(this.loadedContext.values())
|
|
218
|
+
.sort((a, b) => b.loadedAt.getTime() - a.loadedAt.getTime())[0]
|
|
219
|
+
|
|
220
|
+
return {
|
|
221
|
+
loadedContexts: this.loadedContext.size,
|
|
222
|
+
directories,
|
|
223
|
+
lastLoadTime: lastEntry?.loadedAt
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Pre-load context for multiple directories
|
|
229
|
+
*/
|
|
230
|
+
async preloadContexts(directories: string[]): Promise<Map<string, DetectedProject | null>> {
|
|
231
|
+
const results = new Map<string, DetectedProject | null>()
|
|
232
|
+
|
|
233
|
+
for (const dir of directories) {
|
|
234
|
+
const detected = await this.loadContextForDirectory(dir)
|
|
235
|
+
results.set(dir, detected)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return results
|
|
239
|
+
}
|
|
240
|
+
}
|