codehere 0.2.2 → 0.3.0-rc.1
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 +88 -68
- package/dist/domain/entities/task.js +4 -4
- package/dist/error-handler.js +4 -9
- package/dist/index.js +253 -1219
- package/dist/infrastructure/config/product-context.js +7 -6
- package/dist/infrastructure/hooks/claude-sdk-hook.js +335 -63
- package/dist/infrastructure/observability/execution-tracer.js +11 -6
- package/dist/infrastructure/orchestration/agent-adapter.js +13 -0
- package/dist/infrastructure/orchestration/agent-installer.js +101 -0
- package/dist/infrastructure/orchestration/agents-config-seed.js +56 -0
- package/dist/infrastructure/orchestration/aider-adapter.js +319 -0
- package/dist/infrastructure/orchestration/artifacts-extractor.js +175 -0
- package/dist/infrastructure/orchestration/claude-code-adapter.js +352 -0
- package/dist/infrastructure/orchestration/codex-adapter.js +310 -0
- package/dist/infrastructure/orchestration/generic-cli-adapter.js +553 -0
- package/dist/infrastructure/orchestration/opencode-adapter.js +275 -0
- package/dist/infrastructure/orchestration/progress-aggregator.js +189 -0
- package/dist/infrastructure/orchestration/readiness.js +106 -0
- package/dist/infrastructure/orchestration/session-manager.js +272 -0
- package/dist/infrastructure/orchestration/session-persistence.js +109 -0
- package/dist/infrastructure/protocols/mcp-helpers.js +10 -30
- package/dist/infrastructure/protocols/mcp-server-impl.js +359 -21
- package/dist/infrastructure/protocols/ui-page.js +1827 -0
- package/dist/infrastructure/security/file-collection.js +115 -0
- package/dist/infrastructure/security/trust-scorer.js +301 -56
- package/dist/infrastructure/storage/task-repository.js +8 -7
- package/dist/monitoring.js +9 -38
- package/dist/presentation/cli/commands/help-command.js +96 -139
- package/dist/presentation/cli/commands/hook-command.js +17 -24
- package/dist/presentation/cli/commands/report-command.js +59 -72
- package/dist/presentation/cli/commands/setup-command.js +4 -4
- package/dist/presentation/cli/commands/status-command.js +321 -30
- package/dist/presentation/cli/commands/trust-command.js +84 -72
- package/dist/presentation/cli/error-display.js +17 -21
- package/dist/ui.js +11 -11
- package/package.json +24 -62
- package/dist/agents/base.js +0 -101
- package/dist/agents/orchestrator-model-driven.js +0 -141
- package/dist/agents/react-orchestrator-agent.js +0 -54
- package/dist/application/agents/execution-agent.js +0 -508
- package/dist/application/agents/multi-agent-orchestrator.js +0 -295
- package/dist/application/agents/planning-agent.js +0 -433
- package/dist/application/agents/validation-agent.js +0 -317
- package/dist/application/architectures/plan-and-act.js +0 -242
- package/dist/application/index.js +0 -12
- package/dist/application/services/agent-factory.js +0 -28
- package/dist/application/services/dependency-container.js +0 -596
- package/dist/application/services/git-context-service.js +0 -83
- package/dist/application/services/intelligent-router.js +0 -934
- package/dist/application/services/tool-executor-service.js +0 -94
- package/dist/application/use-cases/ask-question-use-case.js +0 -338
- package/dist/application/use-cases/edit-file-use-case.js +0 -830
- package/dist/application/use-cases/explain-file-use-case.js +0 -50
- package/dist/application/use-cases/index-codebase-use-case.js +0 -113
- package/dist/application/use-cases/planning-use-case.js +0 -276
- package/dist/application/use-cases/react-orchestration-use-case.js +0 -329
- package/dist/application/use-cases/reflexion-use-case.js +0 -30
- package/dist/application/workflows/deterministic-workflows.js +0 -189
- package/dist/ast-parser.js +0 -331
- package/dist/cache.js +0 -180
- package/dist/chat.js +0 -251
- package/dist/code-analysis.js +0 -327
- package/dist/context.js +0 -187
- package/dist/docs.js +0 -146
- package/dist/domain/entities/code-chunk.js +0 -6
- package/dist/domain/entities/decision.js +0 -9
- package/dist/domain/entities/edit.js +0 -6
- package/dist/domain/entities/knowledge-node.js +0 -9
- package/dist/domain/entities/knowledge-preservation.js +0 -10
- package/dist/domain/entities/memory.js +0 -6
- package/dist/domain/entities/pattern.js +0 -7
- package/dist/domain/entities/plan.js +0 -6
- package/dist/domain/entities/query.js +0 -6
- package/dist/domain/errors/embeddings-not-found-error.js +0 -13
- package/dist/domain/index.js +0 -19
- package/dist/domain/interfaces/ai-service.interface.js +0 -6
- package/dist/domain/interfaces/code-analyzer.interface.js +0 -6
- package/dist/domain/interfaces/decision-repository.interface.js +0 -9
- package/dist/domain/interfaces/embedding-repository.interface.js +0 -6
- package/dist/domain/interfaces/knowledge-graph-repository.interface.js +0 -9
- package/dist/domain/interfaces/knowledge-preservation-repository.interface.js +0 -8
- package/dist/domain/interfaces/memory-repository.interface.js +0 -6
- package/dist/domain/interfaces/pattern-repository.interface.js +0 -6
- package/dist/domain/interfaces/verification-service.interface.js +0 -6
- package/dist/domain/services/cross-team-pattern-sharing.js +0 -125
- package/dist/domain/services/decision-recorder.js +0 -223
- package/dist/domain/services/decision-retriever.js +0 -133
- package/dist/domain/services/environment-mode-manager.js +0 -22
- package/dist/domain/services/graded-memory-activation.js +0 -69
- package/dist/domain/services/knowledge-access.js +0 -132
- package/dist/domain/services/knowledge-extractor.js +0 -247
- package/dist/domain/services/knowledge-graph-builder.js +0 -268
- package/dist/domain/services/knowledge-graph-query.js +0 -187
- package/dist/domain/services/memory-retriever.js +0 -82
- package/dist/domain/services/memory-synthesizer.js +0 -91
- package/dist/domain/services/pattern-extractor.js +0 -442
- package/dist/domain/services/query-intent-classifier.js +0 -140
- package/dist/domain/services/react-loop.js +0 -186
- package/dist/domain/services/risk-tier-detector.js +0 -78
- package/dist/edit.js +0 -319
- package/dist/embed.js +0 -459
- package/dist/formatter.js +0 -168
- package/dist/git.js +0 -198
- package/dist/infrastructure/ai/cohere-ai-service.js +0 -607
- package/dist/infrastructure/ai/command-r-evaluation.js +0 -206
- package/dist/infrastructure/ai/model-config.js +0 -84
- package/dist/infrastructure/ai/provider-ai-service.js +0 -477
- package/dist/infrastructure/cache/embedding-cache.js +0 -175
- package/dist/infrastructure/cache/query-result-cache.js +0 -66
- package/dist/infrastructure/cache/response-cache.js +0 -48
- package/dist/infrastructure/cache/security-scan-cache.js +0 -47
- package/dist/infrastructure/chunking/ast-code-chunker.js +0 -19
- package/dist/infrastructure/chunking/code-aware-chunker.js +0 -397
- package/dist/infrastructure/context/context-compressor.js +0 -329
- package/dist/infrastructure/context/conversation-context.js +0 -128
- package/dist/infrastructure/context/session-manager.js +0 -94
- package/dist/infrastructure/cost/cost-tracker.js +0 -360
- package/dist/infrastructure/file-scanner/file-scanner.js +0 -106
- package/dist/infrastructure/governance/nist-ai-rmf.js +0 -292
- package/dist/infrastructure/governance/policy-as-code.js +0 -258
- package/dist/infrastructure/governance/prompt-to-code-lineage.js +0 -239
- package/dist/infrastructure/index.js +0 -7
- package/dist/infrastructure/observability/prompt-versioner.js +0 -145
- package/dist/infrastructure/protocols/a2a-metadata.js +0 -137
- package/dist/infrastructure/protocols/a2a-protocol.js +0 -314
- package/dist/infrastructure/protocols/mcp-oauth.js +0 -184
- package/dist/infrastructure/protocols/mcp-server.js +0 -333
- package/dist/infrastructure/protocols/streaming-handler.js +0 -103
- package/dist/infrastructure/providers/cohere-provider.js +0 -444
- package/dist/infrastructure/providers/fake-provider.js +0 -130
- package/dist/infrastructure/providers/local-llm-provider.js +0 -330
- package/dist/infrastructure/providers/model-config.types.js +0 -9
- package/dist/infrastructure/providers/model-provider.interface.js +0 -8
- package/dist/infrastructure/providers/openai-provider.js +0 -413
- package/dist/infrastructure/providers/openrouter-provider.js +0 -399
- package/dist/infrastructure/providers/operation-provider-resolver.js +0 -105
- package/dist/infrastructure/providers/provider-config-loader.js +0 -120
- package/dist/infrastructure/providers/provider-registry.js +0 -88
- package/dist/infrastructure/safety/pattern-detector.js +0 -133
- package/dist/infrastructure/security/ai-sast-scanner.js +0 -290
- package/dist/infrastructure/security/docker-sandbox.js +0 -178
- package/dist/infrastructure/security/enhanced-security-gate.js +0 -151
- package/dist/infrastructure/security/license-scanner.js +0 -167
- package/dist/infrastructure/security/provider-bias-detector.js +0 -164
- package/dist/infrastructure/security/sandbox-executor.js +0 -64
- package/dist/infrastructure/serialization/toon-serializer.js +0 -119
- package/dist/infrastructure/storage/memory-stream-service.js +0 -204
- package/dist/infrastructure/storage/plan-repository.js +0 -96
- package/dist/infrastructure/storage/sqlite-decision-repository.js +0 -232
- package/dist/infrastructure/storage/sqlite-embedding-repository.js +0 -311
- package/dist/infrastructure/storage/sqlite-knowledge-graph-repository.js +0 -417
- package/dist/infrastructure/storage/sqlite-knowledge-preservation-repository.js +0 -230
- package/dist/infrastructure/storage/sqlite-memory-repository.js +0 -229
- package/dist/infrastructure/storage/sqlite-pattern-repository.js +0 -249
- package/dist/infrastructure/storage/task-helpers.js +0 -197
- package/dist/infrastructure/telemetry/telemetry-service.js +0 -167
- package/dist/infrastructure/ux/appropriate-friction.js +0 -213
- package/dist/infrastructure/ux/bi-directional-learning.js +0 -337
- package/dist/infrastructure/ux/capability-boundaries.js +0 -42
- package/dist/infrastructure/ux/comprehensive-formatter.js +0 -117
- package/dist/infrastructure/ux/contextual-feature-discovery.js +0 -10
- package/dist/infrastructure/ux/expectation-management.js +0 -327
- package/dist/infrastructure/ux/feature-discovery.js +0 -14
- package/dist/infrastructure/ux/feedback-prompt.js +0 -45
- package/dist/infrastructure/ux/hitl-validation.js +0 -297
- package/dist/infrastructure/ux/progress-indicator.js +0 -116
- package/dist/infrastructure/ux/progressive-disclosure.js +0 -236
- package/dist/infrastructure/ux/review-checkpoint.js +0 -72
- package/dist/infrastructure/ux/staged-feature-intro.js +0 -24
- package/dist/infrastructure/ux/stream-markdown.js +0 -151
- package/dist/infrastructure/ux/syntax-highlighter.js +0 -91
- package/dist/infrastructure/ux/team-standards.js +0 -196
- package/dist/infrastructure/ux/transparency.js +0 -71
- package/dist/infrastructure/validation/agent-feedback.js +0 -55
- package/dist/infrastructure/validation/agent-validation-helper.js +0 -137
- package/dist/infrastructure/validation/review-handler.js +0 -40
- package/dist/infrastructure/validation/summary-aggregator.js +0 -70
- package/dist/infrastructure/validation/summary-extractor.js +0 -45
- package/dist/infrastructure/validation/trace-summary.js +0 -52
- package/dist/infrastructure/verification/verification-service.js +0 -47
- package/dist/infrastructure/xai/attention-visualizer.js +0 -172
- package/dist/infrastructure/xai/cot-visualizer.js +0 -283
- package/dist/infrastructure/xai/decision-tree-log.js +0 -212
- package/dist/infrastructure/xai/interactive-xai.js +0 -260
- package/dist/infrastructure/xai/uncertainty-quantifier.js +0 -198
- package/dist/intelligent-retrieval.js +0 -272
- package/dist/intent/classifier.js +0 -2
- package/dist/intent/context.js +0 -2
- package/dist/iterative-refinement.js +0 -189
- package/dist/learning.js +0 -232
- package/dist/log.js +0 -31
- package/dist/migrate.js +0 -133
- package/dist/parallel-processor.js +0 -534
- package/dist/planner.js +0 -198
- package/dist/policy.js +0 -26
- package/dist/presentation/cli/commands/ask-command.js +0 -314
- package/dist/presentation/cli/commands/cost-command.js +0 -191
- package/dist/presentation/cli/commands/decision-command.js +0 -207
- package/dist/presentation/cli/commands/docs-command.js +0 -25
- package/dist/presentation/cli/commands/fix-command.js +0 -53
- package/dist/presentation/cli/commands/knowledge-command.js +0 -129
- package/dist/presentation/cli/commands/learning-dashboard-command.js +0 -183
- package/dist/presentation/cli/commands/models-command.js +0 -194
- package/dist/presentation/cli/commands/orchestrate-command.js +0 -207
- package/dist/presentation/cli/commands/plan-command.js +0 -246
- package/dist/presentation/cli/commands/product-command.js +0 -199
- package/dist/presentation/cli/commands/react-command.js +0 -181
- package/dist/presentation/cli/commands/review-command.js +0 -154
- package/dist/presentation/cli/commands/run-command.js +0 -188
- package/dist/presentation/cli/commands/smart-command.js +0 -395
- package/dist/presentation/cli/commands/suggest-command.js +0 -138
- package/dist/presentation/cli/commands/trace-command.js +0 -129
- package/dist/presentation/cli/commands/undo-command.js +0 -150
- package/dist/query-optimizer.js +0 -205
- package/dist/refactor.js +0 -116
- package/dist/review.js +0 -206
- package/dist/search.js +0 -163
- package/dist/session.js +0 -704
- package/dist/task-verification.js +0 -336
- package/dist/testgen.js +0 -166
- package/dist/token-optimizer.js +0 -277
- package/dist/tools/bash.js +0 -213
- package/dist/tools/edit.js +0 -235
- package/dist/tools/executor.js +0 -153
- package/dist/tools/git-tool.js +0 -292
- package/dist/tools/parser.js +0 -158
- package/dist/tools/registry.js +0 -302
- package/dist/tools/search.js +0 -100
- package/dist/types.js +0 -2
- package/dist/utils/check-api-status.js +0 -100
- package/dist/utils/diff-parser.js +0 -162
- package/dist/verification/backup.js +0 -259
- package/dist/verification/compiler.js +0 -264
- package/dist/verification/index.js +0 -273
- package/dist/verification/test-runner.js +0 -379
|
@@ -1,442 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Domain Service: PatternExtractor
|
|
3
|
-
* Extracts patterns from code, memories, and codebase analysis
|
|
4
|
-
*
|
|
5
|
-
* Clean Architecture: Domain Layer
|
|
6
|
-
* Pattern: Strategy Pattern (different extraction strategies for different pattern types)
|
|
7
|
-
*
|
|
8
|
-
* Responsibilities:
|
|
9
|
-
* - Extract patterns from code files
|
|
10
|
-
* - Extract patterns from memory reflections
|
|
11
|
-
* - Identify pattern types (architectural, structural, behavioral, etc.)
|
|
12
|
-
* - Store patterns in pattern repository
|
|
13
|
-
*/
|
|
14
|
-
import { randomUUID } from 'crypto';
|
|
15
|
-
/**
|
|
16
|
-
* Pattern Extractor Service
|
|
17
|
-
* Uses AI to identify and extract patterns from various sources
|
|
18
|
-
*/
|
|
19
|
-
export class PatternExtractor {
|
|
20
|
-
patternRepository;
|
|
21
|
-
aiService;
|
|
22
|
-
constructor(patternRepository, aiService) {
|
|
23
|
-
this.patternRepository = patternRepository;
|
|
24
|
-
this.aiService = aiService;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Extract patterns from code
|
|
28
|
-
*/
|
|
29
|
-
async extractFromCode(request) {
|
|
30
|
-
if (!request.content || !request.filepath) {
|
|
31
|
-
throw new Error('Code extraction requires content and filepath');
|
|
32
|
-
}
|
|
33
|
-
const patterns = [];
|
|
34
|
-
// Strategy 1: Structural pattern detection (file organization)
|
|
35
|
-
const structuralPatterns = this.extractStructuralPatterns(request);
|
|
36
|
-
patterns.push(...structuralPatterns);
|
|
37
|
-
// Strategy 2: Use AI to identify architectural and behavioral patterns
|
|
38
|
-
const aiPatterns = await this.extractPatternsWithAI(request);
|
|
39
|
-
patterns.push(...aiPatterns);
|
|
40
|
-
// Strategy 3: Extract idiomatic patterns (language-specific)
|
|
41
|
-
const idiomaticPatterns = await this.extractIdiomaticPatterns(request);
|
|
42
|
-
patterns.push(...idiomaticPatterns);
|
|
43
|
-
// Store patterns in repository
|
|
44
|
-
for (const pattern of patterns) {
|
|
45
|
-
await this.patternRepository.store(pattern);
|
|
46
|
-
}
|
|
47
|
-
return {
|
|
48
|
-
patterns,
|
|
49
|
-
extractionMethod: 'code-analysis',
|
|
50
|
-
confidence: this.calculateConfidence(patterns),
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Extract patterns from memory reflections
|
|
55
|
-
*/
|
|
56
|
-
async extractFromMemory(memories, codebaseId, codebasePath) {
|
|
57
|
-
const patterns = [];
|
|
58
|
-
// Analyze memories for recurring patterns
|
|
59
|
-
for (const memory of memories) {
|
|
60
|
-
if (memory.type === 'reflection' && memory.description) {
|
|
61
|
-
// Extract patterns from reflection descriptions
|
|
62
|
-
const reflectionPatterns = await this.extractFromReflection(memory.description, codebaseId, codebasePath, memory);
|
|
63
|
-
patterns.push(...reflectionPatterns);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
// Store patterns
|
|
67
|
-
for (const pattern of patterns) {
|
|
68
|
-
await this.patternRepository.store(pattern);
|
|
69
|
-
}
|
|
70
|
-
return {
|
|
71
|
-
patterns,
|
|
72
|
-
extractionMethod: 'memory-analysis',
|
|
73
|
-
confidence: this.calculateConfidence(patterns),
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Extract patterns from a reflection description
|
|
78
|
-
*/
|
|
79
|
-
async extractFromReflection(reflectionDescription, codebaseId, codebasePath, memory) {
|
|
80
|
-
const patterns = [];
|
|
81
|
-
// Use AI to identify patterns in reflection
|
|
82
|
-
const prompt = `Analyze this reflection and extract any code patterns, architectural decisions, or conventions mentioned:
|
|
83
|
-
|
|
84
|
-
${reflectionDescription}
|
|
85
|
-
|
|
86
|
-
Extract patterns in JSON format:
|
|
87
|
-
[
|
|
88
|
-
{
|
|
89
|
-
"type": "architectural|structural|behavioral|idiomatic|convention|design|custom",
|
|
90
|
-
"name": "Pattern name",
|
|
91
|
-
"description": "Pattern description",
|
|
92
|
-
"confidence": 0.0-1.0,
|
|
93
|
-
"tags": ["tag1", "tag2"]
|
|
94
|
-
}
|
|
95
|
-
]
|
|
96
|
-
|
|
97
|
-
Only extract patterns with confidence > 0.6. Return valid JSON array.`;
|
|
98
|
-
try {
|
|
99
|
-
const response = await this.aiService.chat(prompt, []);
|
|
100
|
-
const jsonMatch = response.match(/\[[\s\S]*\]/);
|
|
101
|
-
if (jsonMatch) {
|
|
102
|
-
const extractedPatterns = JSON.parse(jsonMatch[0]);
|
|
103
|
-
for (const extracted of extractedPatterns) {
|
|
104
|
-
if (extracted.confidence > 0.6) {
|
|
105
|
-
const pattern = {
|
|
106
|
-
id: randomUUID(),
|
|
107
|
-
codebaseId,
|
|
108
|
-
type: extracted.type,
|
|
109
|
-
name: extracted.name,
|
|
110
|
-
description: extracted.description,
|
|
111
|
-
codeExample: undefined, // Can be extracted from memory description if needed
|
|
112
|
-
filepath: memory.metadata?.filepath,
|
|
113
|
-
lineNumbers: undefined, // Not stored in memory metadata
|
|
114
|
-
metadata: {
|
|
115
|
-
tags: extracted.tags || [],
|
|
116
|
-
confidence: Math.round(extracted.confidence * 10), // Convert to 1-10 scale
|
|
117
|
-
extractedFrom: 'reflection',
|
|
118
|
-
source: memory.id,
|
|
119
|
-
},
|
|
120
|
-
createdAt: new Date(),
|
|
121
|
-
usageCount: 0,
|
|
122
|
-
};
|
|
123
|
-
patterns.push(pattern);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
catch (error) {
|
|
129
|
-
// If AI extraction fails, fall back to keyword-based extraction
|
|
130
|
-
console.warn('AI pattern extraction failed, using keyword-based extraction:', error);
|
|
131
|
-
const keywordPatterns = this.extractPatternsByKeywords(reflectionDescription, codebaseId, codebasePath);
|
|
132
|
-
patterns.push(...keywordPatterns);
|
|
133
|
-
}
|
|
134
|
-
return patterns;
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Extract structural patterns from code (file organization, naming conventions)
|
|
138
|
-
*/
|
|
139
|
-
extractStructuralPatterns(request) {
|
|
140
|
-
const patterns = [];
|
|
141
|
-
const { content, filepath, codebaseId, codebasePath } = request;
|
|
142
|
-
if (!content || !filepath)
|
|
143
|
-
return patterns;
|
|
144
|
-
// Detect file organization patterns
|
|
145
|
-
const pathParts = filepath.split('/');
|
|
146
|
-
const fileName = pathParts[pathParts.length - 1];
|
|
147
|
-
const directory = pathParts.slice(0, -1).join('/');
|
|
148
|
-
// Pattern: File naming convention
|
|
149
|
-
if (this.detectNamingConvention(fileName)) {
|
|
150
|
-
patterns.push({
|
|
151
|
-
id: randomUUID(),
|
|
152
|
-
codebaseId,
|
|
153
|
-
type: 'convention',
|
|
154
|
-
name: 'File Naming Convention',
|
|
155
|
-
description: `Files follow naming pattern: ${this.getNamingPattern(fileName)}`,
|
|
156
|
-
filepath,
|
|
157
|
-
metadata: {
|
|
158
|
-
tags: ['naming', 'convention'],
|
|
159
|
-
confidence: 8,
|
|
160
|
-
extractedFrom: 'code',
|
|
161
|
-
},
|
|
162
|
-
createdAt: new Date(),
|
|
163
|
-
usageCount: 0,
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
// Pattern: Directory structure
|
|
167
|
-
if (this.detectDirectoryStructure(directory)) {
|
|
168
|
-
patterns.push({
|
|
169
|
-
id: randomUUID(),
|
|
170
|
-
codebaseId,
|
|
171
|
-
type: 'structural',
|
|
172
|
-
name: 'Directory Structure Pattern',
|
|
173
|
-
description: `Code organized in: ${this.getDirectoryPattern(directory)}`,
|
|
174
|
-
filepath: directory,
|
|
175
|
-
metadata: {
|
|
176
|
-
tags: ['structure', 'organization'],
|
|
177
|
-
confidence: 7,
|
|
178
|
-
extractedFrom: 'code',
|
|
179
|
-
},
|
|
180
|
-
createdAt: new Date(),
|
|
181
|
-
usageCount: 0,
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
return patterns;
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Extract patterns using AI analysis
|
|
188
|
-
*/
|
|
189
|
-
async extractPatternsWithAI(request) {
|
|
190
|
-
const patterns = [];
|
|
191
|
-
const { content, filepath, codebaseId, codebasePath } = request;
|
|
192
|
-
if (!content)
|
|
193
|
-
return patterns;
|
|
194
|
-
const prompt = `Analyze this code and identify patterns (architectural, design, behavioral):
|
|
195
|
-
|
|
196
|
-
\`\`\`
|
|
197
|
-
${content.substring(0, 3000)} // Limit to avoid token limits
|
|
198
|
-
\`\`\`
|
|
199
|
-
|
|
200
|
-
Extract patterns in JSON format:
|
|
201
|
-
[
|
|
202
|
-
{
|
|
203
|
-
"type": "architectural|structural|behavioral|idiomatic|convention|design|custom",
|
|
204
|
-
"name": "Pattern name",
|
|
205
|
-
"description": "What this pattern does",
|
|
206
|
-
"codeExample": "Key code snippet showing pattern",
|
|
207
|
-
"confidence": 0.0-1.0,
|
|
208
|
-
"tags": ["tag1", "tag2"],
|
|
209
|
-
"complexity": 1-10
|
|
210
|
-
}
|
|
211
|
-
]
|
|
212
|
-
|
|
213
|
-
Only extract patterns with confidence > 0.7. Return valid JSON array.`;
|
|
214
|
-
try {
|
|
215
|
-
const response = await this.aiService.chat(prompt, []);
|
|
216
|
-
const jsonMatch = response.match(/\[[\s\S]*\]/);
|
|
217
|
-
if (jsonMatch) {
|
|
218
|
-
const extractedPatterns = JSON.parse(jsonMatch[0]);
|
|
219
|
-
for (const extracted of extractedPatterns) {
|
|
220
|
-
if (extracted.confidence > 0.7) {
|
|
221
|
-
const pattern = {
|
|
222
|
-
id: randomUUID(),
|
|
223
|
-
codebaseId,
|
|
224
|
-
type: extracted.type,
|
|
225
|
-
name: extracted.name,
|
|
226
|
-
description: extracted.description,
|
|
227
|
-
codeExample: extracted.codeExample || content.substring(0, 500),
|
|
228
|
-
filepath,
|
|
229
|
-
lineNumbers: request.lineNumbers,
|
|
230
|
-
metadata: {
|
|
231
|
-
tags: extracted.tags || [],
|
|
232
|
-
confidence: Math.round(extracted.confidence * 10),
|
|
233
|
-
complexity: extracted.complexity || 5,
|
|
234
|
-
extractedFrom: 'code',
|
|
235
|
-
},
|
|
236
|
-
createdAt: new Date(),
|
|
237
|
-
usageCount: 0,
|
|
238
|
-
};
|
|
239
|
-
patterns.push(pattern);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
catch (error) {
|
|
245
|
-
console.warn('AI pattern extraction failed:', error);
|
|
246
|
-
// Return empty array - fail gracefully
|
|
247
|
-
}
|
|
248
|
-
return patterns;
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Extract idiomatic patterns (language-specific conventions)
|
|
252
|
-
*/
|
|
253
|
-
async extractIdiomaticPatterns(request) {
|
|
254
|
-
const patterns = [];
|
|
255
|
-
const { content, filepath, codebaseId } = request;
|
|
256
|
-
if (!content)
|
|
257
|
-
return patterns;
|
|
258
|
-
// Detect TypeScript/JavaScript idioms
|
|
259
|
-
const typescriptPatterns = this.detectTypeScriptIdioms(content, codebaseId, filepath);
|
|
260
|
-
patterns.push(...typescriptPatterns);
|
|
261
|
-
return patterns;
|
|
262
|
-
}
|
|
263
|
-
/**
|
|
264
|
-
* Detect TypeScript/JavaScript idioms
|
|
265
|
-
*/
|
|
266
|
-
detectTypeScriptIdioms(content, codebaseId, filepath) {
|
|
267
|
-
const patterns = [];
|
|
268
|
-
// Pattern: Async/await pattern
|
|
269
|
-
if (content.includes('async') && content.includes('await')) {
|
|
270
|
-
patterns.push({
|
|
271
|
-
id: randomUUID(),
|
|
272
|
-
codebaseId,
|
|
273
|
-
type: 'idiomatic',
|
|
274
|
-
name: 'Async/Await Pattern',
|
|
275
|
-
description: 'Uses async/await for asynchronous operations',
|
|
276
|
-
codeExample: this.extractCodeExample(content, /async\s+\w+.*?await/),
|
|
277
|
-
filepath,
|
|
278
|
-
metadata: {
|
|
279
|
-
tags: ['async', 'promises', 'typescript'],
|
|
280
|
-
confidence: 9,
|
|
281
|
-
extractedFrom: 'code',
|
|
282
|
-
},
|
|
283
|
-
createdAt: new Date(),
|
|
284
|
-
usageCount: 0,
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
// Pattern: Interface/Type definitions
|
|
288
|
-
if (content.match(/(interface|type)\s+\w+/)) {
|
|
289
|
-
patterns.push({
|
|
290
|
-
id: randomUUID(),
|
|
291
|
-
codebaseId,
|
|
292
|
-
type: 'idiomatic',
|
|
293
|
-
name: 'Type Definitions Pattern',
|
|
294
|
-
description: 'Uses TypeScript interfaces/types for type safety',
|
|
295
|
-
codeExample: this.extractCodeExample(content, /(interface|type)\s+\w+.*?\{[\s\S]{0,200}/),
|
|
296
|
-
filepath,
|
|
297
|
-
metadata: {
|
|
298
|
-
tags: ['typescript', 'types', 'type-safety'],
|
|
299
|
-
confidence: 8,
|
|
300
|
-
extractedFrom: 'code',
|
|
301
|
-
},
|
|
302
|
-
createdAt: new Date(),
|
|
303
|
-
usageCount: 0,
|
|
304
|
-
});
|
|
305
|
-
}
|
|
306
|
-
// Pattern: Error handling pattern
|
|
307
|
-
if (content.match(/try\s*\{.*?\}\s*catch/)) {
|
|
308
|
-
patterns.push({
|
|
309
|
-
id: randomUUID(),
|
|
310
|
-
codebaseId,
|
|
311
|
-
type: 'behavioral',
|
|
312
|
-
name: 'Try-Catch Error Handling',
|
|
313
|
-
description: 'Uses try-catch for error handling',
|
|
314
|
-
codeExample: this.extractCodeExample(content, /try\s*\{[\s\S]{0,300}\}\s*catch/),
|
|
315
|
-
filepath,
|
|
316
|
-
metadata: {
|
|
317
|
-
tags: ['error-handling', 'exception'],
|
|
318
|
-
confidence: 9,
|
|
319
|
-
extractedFrom: 'code',
|
|
320
|
-
},
|
|
321
|
-
createdAt: new Date(),
|
|
322
|
-
usageCount: 0,
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
return patterns;
|
|
326
|
-
}
|
|
327
|
-
/**
|
|
328
|
-
* Extract patterns by keyword matching (fallback when AI fails)
|
|
329
|
-
*/
|
|
330
|
-
extractPatternsByKeywords(text, codebaseId, codebasePath) {
|
|
331
|
-
const patterns = [];
|
|
332
|
-
const lowerText = text.toLowerCase();
|
|
333
|
-
// Pattern: Authentication
|
|
334
|
-
if (lowerText.match(/(auth|authentication|login|jwt|session)/)) {
|
|
335
|
-
patterns.push({
|
|
336
|
-
id: randomUUID(),
|
|
337
|
-
codebaseId,
|
|
338
|
-
type: 'behavioral',
|
|
339
|
-
name: 'Authentication Pattern',
|
|
340
|
-
description: 'Authentication-related code pattern',
|
|
341
|
-
metadata: {
|
|
342
|
-
tags: ['authentication', 'security'],
|
|
343
|
-
confidence: 6,
|
|
344
|
-
extractedFrom: 'memory',
|
|
345
|
-
},
|
|
346
|
-
createdAt: new Date(),
|
|
347
|
-
usageCount: 0,
|
|
348
|
-
});
|
|
349
|
-
}
|
|
350
|
-
// Pattern: API Route
|
|
351
|
-
if (lowerText.match(/(api|route|endpoint|controller)/)) {
|
|
352
|
-
patterns.push({
|
|
353
|
-
id: randomUUID(),
|
|
354
|
-
codebaseId,
|
|
355
|
-
type: 'architectural',
|
|
356
|
-
name: 'API Route Pattern',
|
|
357
|
-
description: 'API routing or controller pattern',
|
|
358
|
-
metadata: {
|
|
359
|
-
tags: ['api', 'routing'],
|
|
360
|
-
confidence: 6,
|
|
361
|
-
extractedFrom: 'memory',
|
|
362
|
-
},
|
|
363
|
-
createdAt: new Date(),
|
|
364
|
-
usageCount: 0,
|
|
365
|
-
});
|
|
366
|
-
}
|
|
367
|
-
return patterns;
|
|
368
|
-
}
|
|
369
|
-
/**
|
|
370
|
-
* Helper: Detect naming convention
|
|
371
|
-
*/
|
|
372
|
-
detectNamingConvention(fileName) {
|
|
373
|
-
// Detect kebab-case, camelCase, PascalCase, snake_case
|
|
374
|
-
return /^[a-z]+(-[a-z]+)*\.(ts|js|tsx|jsx)$/.test(fileName) || // kebab-case
|
|
375
|
-
/^[a-z]+[A-Z]/.test(fileName) || // camelCase
|
|
376
|
-
/^[A-Z]/.test(fileName) || // PascalCase
|
|
377
|
-
/^[a-z]+(_[a-z]+)*\./.test(fileName); // snake_case
|
|
378
|
-
}
|
|
379
|
-
/**
|
|
380
|
-
* Helper: Get naming pattern
|
|
381
|
-
*/
|
|
382
|
-
getNamingPattern(fileName) {
|
|
383
|
-
if (/^[a-z]+(-[a-z]+)*\./.test(fileName))
|
|
384
|
-
return 'kebab-case';
|
|
385
|
-
if (/^[a-z]+[A-Z]/.test(fileName))
|
|
386
|
-
return 'camelCase';
|
|
387
|
-
if (/^[A-Z]/.test(fileName))
|
|
388
|
-
return 'PascalCase';
|
|
389
|
-
if (/^[a-z]+(_[a-z]+)*\./.test(fileName))
|
|
390
|
-
return 'snake_case';
|
|
391
|
-
return 'mixed';
|
|
392
|
-
}
|
|
393
|
-
/**
|
|
394
|
-
* Helper: Detect directory structure pattern
|
|
395
|
-
*/
|
|
396
|
-
detectDirectoryStructure(directory) {
|
|
397
|
-
// Common patterns: src/, components/, services/, utils/, etc.
|
|
398
|
-
return /^(src|lib|components|services|utils|api|domain|infrastructure)/.test(directory);
|
|
399
|
-
}
|
|
400
|
-
/**
|
|
401
|
-
* Helper: Get directory pattern
|
|
402
|
-
*/
|
|
403
|
-
getDirectoryPattern(directory) {
|
|
404
|
-
const parts = directory.split('/');
|
|
405
|
-
return parts.slice(0, 3).join('/'); // Return top-level structure
|
|
406
|
-
}
|
|
407
|
-
/**
|
|
408
|
-
* Helper: Extract code example matching regex
|
|
409
|
-
*/
|
|
410
|
-
extractCodeExample(content, regex) {
|
|
411
|
-
const match = content.match(regex);
|
|
412
|
-
return match ? match[0].substring(0, 300) : content.substring(0, 300);
|
|
413
|
-
}
|
|
414
|
-
/**
|
|
415
|
-
* Helper: Calculate overall confidence
|
|
416
|
-
*/
|
|
417
|
-
calculateConfidence(patterns) {
|
|
418
|
-
if (patterns.length === 0)
|
|
419
|
-
return 0;
|
|
420
|
-
const avgConfidence = patterns.reduce((sum, p) => {
|
|
421
|
-
return sum + (p.metadata?.confidence || 5);
|
|
422
|
-
}, 0) / patterns.length;
|
|
423
|
-
return avgConfidence / 10; // Normalize to 0-1
|
|
424
|
-
}
|
|
425
|
-
/**
|
|
426
|
-
* Get existing patterns for a codebase (useful for pattern reuse)
|
|
427
|
-
*/
|
|
428
|
-
async getExistingPatterns(codebaseId, type) {
|
|
429
|
-
if (type) {
|
|
430
|
-
return await this.patternRepository.findByType(codebaseId, type);
|
|
431
|
-
}
|
|
432
|
-
return await this.patternRepository.findByCodebase(codebaseId);
|
|
433
|
-
}
|
|
434
|
-
/**
|
|
435
|
-
* Suggest patterns for a given task
|
|
436
|
-
*/
|
|
437
|
-
async suggestPatterns(task, codebaseId, limit = 5) {
|
|
438
|
-
// Search patterns relevant to the task
|
|
439
|
-
return await this.patternRepository.search(codebaseId, task, limit);
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
//# sourceMappingURL=pattern-extractor.js.map
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Domain Service: QueryIntentClassifier
|
|
3
|
-
* Classifies user query intent (pure business logic)
|
|
4
|
-
*/
|
|
5
|
-
export class QueryIntentClassifier {
|
|
6
|
-
/**
|
|
7
|
-
* Classify query intent
|
|
8
|
-
*/
|
|
9
|
-
classify(query) {
|
|
10
|
-
const lowerQuery = query.toLowerCase();
|
|
11
|
-
// Multi-file operations detection (check BEFORE single-file intents)
|
|
12
|
-
// These patterns indicate system-wide, multi-file operations
|
|
13
|
-
const multiFilePatterns = [
|
|
14
|
-
// Numbered step lists (compound instructions) - check first - MOST SPECIFIC
|
|
15
|
-
/\d+\.\s+[^\n]+\n\s*\d+\.\s+[^\n]+/s, // Two or more numbered steps (1. ... \n 2. ...)
|
|
16
|
-
/\d+\.\s+[^\n]+\n\s*\d+\.\s+[^\n]+\n\s*\d+\./s, // Three or more numbered steps
|
|
17
|
-
/(?:^|\n)\s*\d+\.\s+[^\n]+\n\s*\d+\.\s+[^\n]+/m, // Match numbered lists at start or after newline
|
|
18
|
-
// Compound instruction keywords with numbered steps
|
|
19
|
-
/implement.*complete.*:?\s*\n?\s*\d+\./i, // "Implement complete X: 1."
|
|
20
|
-
/create.*complete.*:?\s*\n?\s*\d+\./i, // "Create complete X: 1."
|
|
21
|
-
// System-wide refactoring
|
|
22
|
-
/refactor\s+(system|codebase|codebase|all|multiple|several|across)/i,
|
|
23
|
-
/refactor.*(system|codebase|all|multiple|several|across)/i,
|
|
24
|
-
/(system|codebase|codebase|architecture)\s+(refactor|migration|change|restructure)/i,
|
|
25
|
-
// Migration patterns
|
|
26
|
-
/migrate\s+(codebase|system|all|multiple|several|across)/i,
|
|
27
|
-
/migration\s+of\s+(codebase|system|all)/i,
|
|
28
|
-
// Update multiple files
|
|
29
|
-
/update\s+(all|multiple|several|across)\s+files/i,
|
|
30
|
-
/update.*(all|multiple|several|across).*files/i,
|
|
31
|
-
// Architecture changes - improved patterns
|
|
32
|
-
/architecture\s+(change|refactor|restructure|migration)/i,
|
|
33
|
-
/(change|implement|add|create|introduce).*architecture/i,
|
|
34
|
-
/(architecture|pattern|layer|design).*\s+(change|refactor|migration|add|create|implement|introduce)/i,
|
|
35
|
-
// Pattern additions (repository, service, etc.)
|
|
36
|
-
/add\s+(a\s+)?(repository|service|controller|middleware|pattern|layer|abstraction)/i,
|
|
37
|
-
/(repository|service|controller|middleware|pattern|layer|abstraction)\s+pattern/i,
|
|
38
|
-
/add\s+.*\s+pattern/i,
|
|
39
|
-
/introduce\s+(a\s+)?(repository|service|controller|middleware|pattern|layer|abstraction)/i,
|
|
40
|
-
/create\s+(a\s+)?(repository|service|controller|middleware|pattern|layer|abstraction)\s+(layer|pattern|abstraction)/i,
|
|
41
|
-
// Multi-file indicators
|
|
42
|
-
/(across|multiple|several|all)\s+files/i,
|
|
43
|
-
/files.*(across|multiple|several|all)/i,
|
|
44
|
-
// System-wide changes
|
|
45
|
-
/system-wide/i,
|
|
46
|
-
/codebase-wide/i,
|
|
47
|
-
// Feature implementation (often multi-file)
|
|
48
|
-
/implement\s+(complete|full|entire).*(feature|system|component)/i,
|
|
49
|
-
/create\s+(complete|full|entire).*(feature|system|component)/i,
|
|
50
|
-
// JWT/Authentication system changes (typically multi-file)
|
|
51
|
-
/refactor.*(authentication|auth)\s+system/i,
|
|
52
|
-
/(authentication|auth)\s+system.*(refactor|migrate|change)/i,
|
|
53
|
-
/(convert|switch|change).*(authentication|auth).*(to|from)/i,
|
|
54
|
-
// Component creation (often multiple files)
|
|
55
|
-
/create\s+.*components/i,
|
|
56
|
-
/generate\s+.*components/i,
|
|
57
|
-
];
|
|
58
|
-
for (const pattern of multiFilePatterns) {
|
|
59
|
-
if (pattern.test(query)) {
|
|
60
|
-
return 'multi-file-modify';
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
// Refactor intent (single-file)
|
|
64
|
-
if (lowerQuery.includes('refactor') || lowerQuery.includes('rename') ||
|
|
65
|
-
lowerQuery.includes('extract') || lowerQuery.includes('move') ||
|
|
66
|
-
lowerQuery.includes('restructure')) {
|
|
67
|
-
return 'refactor';
|
|
68
|
-
}
|
|
69
|
-
// Debug intent
|
|
70
|
-
if (lowerQuery.includes('bug') || lowerQuery.includes('error') ||
|
|
71
|
-
lowerQuery.includes('fix') || lowerQuery.includes('issue') ||
|
|
72
|
-
lowerQuery.includes('problem') || lowerQuery.includes('wrong')) {
|
|
73
|
-
return 'debug';
|
|
74
|
-
}
|
|
75
|
-
// Implement intent
|
|
76
|
-
if (lowerQuery.includes('implement') || lowerQuery.includes('create') ||
|
|
77
|
-
lowerQuery.includes('add') || lowerQuery.includes('write') ||
|
|
78
|
-
lowerQuery.includes('build')) {
|
|
79
|
-
return 'implement';
|
|
80
|
-
}
|
|
81
|
-
// Find intent
|
|
82
|
-
if (lowerQuery.includes('find') || lowerQuery.includes('where') ||
|
|
83
|
-
lowerQuery.includes('locate') || lowerQuery.includes('search')) {
|
|
84
|
-
return 'find';
|
|
85
|
-
}
|
|
86
|
-
// Modify intent
|
|
87
|
-
if (lowerQuery.includes('modify') || lowerQuery.includes('change') ||
|
|
88
|
-
lowerQuery.includes('update') || lowerQuery.includes('edit')) {
|
|
89
|
-
return 'modify';
|
|
90
|
-
}
|
|
91
|
-
// Explain intent
|
|
92
|
-
if (lowerQuery.includes('how') || lowerQuery.includes('what') ||
|
|
93
|
-
lowerQuery.includes('explain') || lowerQuery.includes('understand') ||
|
|
94
|
-
lowerQuery.includes('does') || lowerQuery.includes('work')) {
|
|
95
|
-
return 'explain';
|
|
96
|
-
}
|
|
97
|
-
// Review intent
|
|
98
|
-
if (lowerQuery.includes('review') || lowerQuery.includes('check') ||
|
|
99
|
-
lowerQuery.includes('analyze') || lowerQuery.includes('audit')) {
|
|
100
|
-
return 'review';
|
|
101
|
-
}
|
|
102
|
-
// Test intent
|
|
103
|
-
if (lowerQuery.includes('test') || lowerQuery.includes('spec') ||
|
|
104
|
-
lowerQuery.includes('coverage')) {
|
|
105
|
-
return 'test';
|
|
106
|
-
}
|
|
107
|
-
// Index intent
|
|
108
|
-
if (lowerQuery.includes('index') || lowerQuery.includes('embed')) {
|
|
109
|
-
return 'index';
|
|
110
|
-
}
|
|
111
|
-
return 'general';
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Extract symbol names from query
|
|
115
|
-
*/
|
|
116
|
-
extractSymbols(query) {
|
|
117
|
-
const patterns = [
|
|
118
|
-
/function\s+(\w+)/gi,
|
|
119
|
-
/class\s+(\w+)/gi,
|
|
120
|
-
/interface\s+(\w+)/gi,
|
|
121
|
-
/type\s+(\w+)/gi,
|
|
122
|
-
/const\s+(\w+)/gi,
|
|
123
|
-
/let\s+(\w+)/gi,
|
|
124
|
-
/var\s+(\w+)/gi,
|
|
125
|
-
/([A-Z][a-zA-Z0-9]+)/g, // Capitalized words
|
|
126
|
-
/([a-z][a-zA-Z0-9]*\(\))/g, // camelCase functions
|
|
127
|
-
];
|
|
128
|
-
const symbols = new Set();
|
|
129
|
-
for (const pattern of patterns) {
|
|
130
|
-
const matches = query.matchAll(pattern);
|
|
131
|
-
for (const match of matches) {
|
|
132
|
-
if (match[1]) {
|
|
133
|
-
symbols.add(match[1]);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
return Array.from(symbols);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
//# sourceMappingURL=query-intent-classifier.js.map
|