clavix 4.0.0 → 4.1.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/dist/core/intelligence/intent-detector.js +351 -119
- package/dist/core/intelligence/pattern-library.js +17 -4
- package/dist/core/intelligence/patterns/actionability-enhancer.d.ts +1 -1
- package/dist/core/intelligence/patterns/actionability-enhancer.js +31 -26
- package/dist/core/intelligence/patterns/alternative-phrasing-generator.d.ts +1 -1
- package/dist/core/intelligence/patterns/alternative-phrasing-generator.js +40 -40
- package/dist/core/intelligence/patterns/ambiguity-detector.d.ts +20 -0
- package/dist/core/intelligence/patterns/ambiguity-detector.js +168 -0
- package/dist/core/intelligence/patterns/assumption-explicitizer.d.ts +1 -1
- package/dist/core/intelligence/patterns/assumption-explicitizer.js +27 -27
- package/dist/core/intelligence/patterns/completeness-validator.d.ts +1 -1
- package/dist/core/intelligence/patterns/completeness-validator.js +94 -29
- package/dist/core/intelligence/patterns/conciseness-filter.d.ts +1 -1
- package/dist/core/intelligence/patterns/conciseness-filter.js +11 -12
- package/dist/core/intelligence/patterns/context-precision.d.ts +1 -1
- package/dist/core/intelligence/patterns/context-precision.js +76 -39
- package/dist/core/intelligence/patterns/domain-context-enricher.d.ts +19 -0
- package/dist/core/intelligence/patterns/domain-context-enricher.js +174 -0
- package/dist/core/intelligence/patterns/edge-case-identifier.d.ts +1 -1
- package/dist/core/intelligence/patterns/edge-case-identifier.js +42 -42
- package/dist/core/intelligence/patterns/error-tolerance-enhancer.d.ts +20 -0
- package/dist/core/intelligence/patterns/error-tolerance-enhancer.js +161 -0
- package/dist/core/intelligence/patterns/output-format-enforcer.d.ts +20 -0
- package/dist/core/intelligence/patterns/output-format-enforcer.js +134 -0
- package/dist/core/intelligence/patterns/prd-structure-enforcer.d.ts +2 -2
- package/dist/core/intelligence/patterns/prd-structure-enforcer.js +20 -20
- package/dist/core/intelligence/patterns/prerequisite-identifier.d.ts +21 -0
- package/dist/core/intelligence/patterns/prerequisite-identifier.js +197 -0
- package/dist/core/intelligence/patterns/scope-definer.d.ts +1 -1
- package/dist/core/intelligence/patterns/scope-definer.js +12 -12
- package/dist/core/intelligence/patterns/step-decomposer.d.ts +1 -1
- package/dist/core/intelligence/patterns/step-decomposer.js +23 -23
- package/dist/core/intelligence/patterns/structure-organizer.d.ts +1 -1
- package/dist/core/intelligence/patterns/structure-organizer.js +23 -10
- package/dist/core/intelligence/patterns/success-criteria-enforcer.d.ts +20 -0
- package/dist/core/intelligence/patterns/success-criteria-enforcer.js +148 -0
- package/dist/core/intelligence/patterns/validation-checklist-creator.d.ts +1 -1
- package/dist/core/intelligence/patterns/validation-checklist-creator.js +40 -24
- package/dist/core/intelligence/quality-assessor.js +133 -61
- package/dist/core/intelligence/universal-optimizer.js +20 -19
- package/dist/core/template-assembler.js +12 -10
- package/dist/templates/slash-commands/_canonical/deep.md +36 -10
- package/dist/templates/slash-commands/_canonical/execute.md +23 -7
- package/dist/templates/slash-commands/_canonical/fast.md +32 -11
- package/dist/templates/slash-commands/_canonical/implement.md +28 -8
- package/dist/templates/slash-commands/_canonical/plan.md +31 -10
- package/dist/templates/slash-commands/_canonical/prd.md +31 -10
- package/dist/templates/slash-commands/_canonical/start.md +24 -12
- package/dist/templates/slash-commands/_canonical/summarize.md +31 -10
- package/dist/templates/slash-commands/_components/agent-protocols/decision-rules.md +123 -0
- package/dist/templates/slash-commands/_components/agent-protocols/error-handling.md +120 -0
- package/dist/templates/slash-commands/_components/agent-protocols/file-formats.md +187 -0
- package/dist/templates/slash-commands/_components/agent-protocols/quality-output.md +94 -0
- package/dist/templates/slash-commands/_components/agent-protocols/state-awareness.md +104 -0
- package/dist/templates/slash-commands/_components/sections/escalation-factors.md +117 -0
- package/dist/templates/slash-commands/_components/sections/pattern-visibility.md +119 -0
- package/package.json +1 -1
|
@@ -5,122 +5,307 @@
|
|
|
5
5
|
export class IntentDetector {
|
|
6
6
|
// Strong indicators (20 points)
|
|
7
7
|
STRONG_CODE_KEYWORDS = [
|
|
8
|
-
'create function',
|
|
9
|
-
'
|
|
8
|
+
'create function',
|
|
9
|
+
'build component',
|
|
10
|
+
'implement feature',
|
|
11
|
+
'add endpoint',
|
|
12
|
+
'write class',
|
|
13
|
+
'develop api',
|
|
14
|
+
'generate code',
|
|
10
15
|
];
|
|
11
16
|
STRONG_PLANNING_KEYWORDS = [
|
|
12
|
-
'how should i',
|
|
13
|
-
'
|
|
14
|
-
'
|
|
17
|
+
'how should i',
|
|
18
|
+
"what's the best way",
|
|
19
|
+
'pros and cons',
|
|
20
|
+
'architecture for',
|
|
21
|
+
'design pattern',
|
|
22
|
+
'system design',
|
|
23
|
+
'should i use',
|
|
24
|
+
'help me choose',
|
|
25
|
+
'design the database',
|
|
26
|
+
'plan the',
|
|
27
|
+
'requirements document',
|
|
15
28
|
// v4.0: Spec-driven development keywords
|
|
16
|
-
'write spec',
|
|
17
|
-
'
|
|
29
|
+
'write spec',
|
|
30
|
+
'create spec',
|
|
31
|
+
'spec document',
|
|
32
|
+
'functional spec',
|
|
33
|
+
'technical spec',
|
|
34
|
+
'design spec',
|
|
35
|
+
'specification for',
|
|
36
|
+
'write specification',
|
|
18
37
|
];
|
|
19
38
|
STRONG_DEBUGGING_KEYWORDS = [
|
|
20
|
-
'fix error',
|
|
21
|
-
'
|
|
22
|
-
'
|
|
23
|
-
'
|
|
39
|
+
'fix error',
|
|
40
|
+
'debug issue',
|
|
41
|
+
"doesn't work",
|
|
42
|
+
'throws error',
|
|
43
|
+
'not working',
|
|
44
|
+
'returns null',
|
|
45
|
+
'undefined error',
|
|
46
|
+
'stack trace',
|
|
47
|
+
'error message',
|
|
48
|
+
'causing this bug',
|
|
49
|
+
'how do i fix',
|
|
50
|
+
'fix this error',
|
|
51
|
+
'resolve the',
|
|
52
|
+
'memory leak',
|
|
53
|
+
'not rendering',
|
|
54
|
+
'why is my',
|
|
24
55
|
];
|
|
25
56
|
STRONG_DOCUMENTATION_KEYWORDS = [
|
|
26
|
-
'explain how',
|
|
27
|
-
'
|
|
28
|
-
'
|
|
57
|
+
'explain how',
|
|
58
|
+
'walk me through',
|
|
59
|
+
'how does this work',
|
|
60
|
+
'show me how',
|
|
61
|
+
'document this',
|
|
62
|
+
'describe how',
|
|
63
|
+
'what does this do',
|
|
64
|
+
'write documentation',
|
|
65
|
+
'create documentation',
|
|
66
|
+
'add documentation',
|
|
67
|
+
'api documentation',
|
|
68
|
+
'add comments',
|
|
29
69
|
];
|
|
30
70
|
STRONG_REFINEMENT_KEYWORDS = [
|
|
31
|
-
'make it faster',
|
|
32
|
-
'
|
|
33
|
-
'
|
|
71
|
+
'make it faster',
|
|
72
|
+
'speed up',
|
|
73
|
+
'reduce time',
|
|
74
|
+
'optimize performance',
|
|
75
|
+
'clean up code',
|
|
76
|
+
'refactor this',
|
|
77
|
+
'improve efficiency',
|
|
78
|
+
'make this component',
|
|
79
|
+
'make it more',
|
|
80
|
+
'enhance the',
|
|
81
|
+
'update the styling',
|
|
82
|
+
'more reusable',
|
|
83
|
+
'more modern',
|
|
34
84
|
];
|
|
35
85
|
// v4.0: New intent - Testing
|
|
36
86
|
STRONG_TESTING_KEYWORDS = [
|
|
37
|
-
'write test',
|
|
38
|
-
'
|
|
39
|
-
'
|
|
87
|
+
'write test',
|
|
88
|
+
'unit test',
|
|
89
|
+
'integration test',
|
|
90
|
+
'test coverage',
|
|
91
|
+
'add test',
|
|
92
|
+
'create test',
|
|
93
|
+
'write tests for',
|
|
94
|
+
'add tests for',
|
|
95
|
+
'test this',
|
|
96
|
+
'e2e test',
|
|
97
|
+
'end to end test',
|
|
98
|
+
'snapshot test',
|
|
99
|
+
'test suite',
|
|
40
100
|
];
|
|
41
101
|
// v4.0: New intent - Migration
|
|
42
102
|
STRONG_MIGRATION_KEYWORDS = [
|
|
43
|
-
'migrate from',
|
|
44
|
-
'
|
|
45
|
-
'
|
|
103
|
+
'migrate from',
|
|
104
|
+
'migrate to',
|
|
105
|
+
'upgrade from',
|
|
106
|
+
'upgrade to',
|
|
107
|
+
'port from',
|
|
108
|
+
'port to',
|
|
109
|
+
'convert from',
|
|
110
|
+
'convert to',
|
|
111
|
+
'transition from',
|
|
112
|
+
'move from',
|
|
113
|
+
'update from version',
|
|
114
|
+
'upgrade version',
|
|
46
115
|
];
|
|
47
116
|
// v4.0: New intent - Security Review
|
|
48
117
|
STRONG_SECURITY_KEYWORDS = [
|
|
49
|
-
'security audit',
|
|
50
|
-
'
|
|
51
|
-
'check for
|
|
118
|
+
'security audit',
|
|
119
|
+
'find vulnerabilities',
|
|
120
|
+
'check for injection',
|
|
121
|
+
'security scan',
|
|
122
|
+
'audit security',
|
|
123
|
+
'review for security',
|
|
124
|
+
'penetration test',
|
|
125
|
+
'security review',
|
|
126
|
+
'check for xss',
|
|
127
|
+
'check for csrf',
|
|
128
|
+
'vulnerability scan',
|
|
129
|
+
'security assessment',
|
|
52
130
|
];
|
|
53
131
|
// v4.0: New intent - Learning
|
|
54
132
|
STRONG_LEARNING_KEYWORDS = [
|
|
55
|
-
'teach me',
|
|
56
|
-
'
|
|
57
|
-
'
|
|
133
|
+
'teach me',
|
|
134
|
+
'explain how',
|
|
135
|
+
'help me understand',
|
|
136
|
+
'what is the concept',
|
|
137
|
+
'how does',
|
|
138
|
+
'why does',
|
|
139
|
+
'learn about',
|
|
140
|
+
'understand how',
|
|
141
|
+
'what are',
|
|
142
|
+
'difference between',
|
|
143
|
+
'when should i use',
|
|
144
|
+
'best practices for',
|
|
58
145
|
];
|
|
59
146
|
// Medium indicators (10 points)
|
|
60
147
|
CODE_KEYWORDS = [
|
|
61
|
-
'function',
|
|
62
|
-
'
|
|
148
|
+
'function',
|
|
149
|
+
'class',
|
|
150
|
+
'component',
|
|
151
|
+
'api',
|
|
152
|
+
'endpoint',
|
|
153
|
+
'database',
|
|
154
|
+
'implement',
|
|
155
|
+
'build',
|
|
156
|
+
'create',
|
|
157
|
+
'write',
|
|
158
|
+
'code',
|
|
159
|
+
'develop',
|
|
63
160
|
];
|
|
64
161
|
PLANNING_KEYWORDS = [
|
|
65
|
-
'plan',
|
|
66
|
-
'
|
|
162
|
+
'plan',
|
|
163
|
+
'design',
|
|
164
|
+
'architect',
|
|
165
|
+
'strategy',
|
|
166
|
+
'approach',
|
|
167
|
+
'structure',
|
|
168
|
+
'organize',
|
|
169
|
+
'layout',
|
|
170
|
+
'workflow',
|
|
67
171
|
// v4.0: Spec-driven development keywords
|
|
68
|
-
'spec',
|
|
172
|
+
'spec',
|
|
173
|
+
'specification',
|
|
174
|
+
'requirements',
|
|
175
|
+
'blueprint',
|
|
176
|
+
'outline',
|
|
69
177
|
];
|
|
70
178
|
REFINEMENT_KEYWORDS = [
|
|
71
|
-
'improve',
|
|
72
|
-
'
|
|
179
|
+
'improve',
|
|
180
|
+
'optimize',
|
|
181
|
+
'refactor',
|
|
182
|
+
'enhance',
|
|
183
|
+
'better',
|
|
184
|
+
'faster',
|
|
185
|
+
'cleaner',
|
|
186
|
+
'simplify',
|
|
187
|
+
'reduce',
|
|
188
|
+
'increase',
|
|
73
189
|
];
|
|
74
190
|
DEBUGGING_KEYWORDS = [
|
|
75
|
-
'fix',
|
|
76
|
-
'
|
|
191
|
+
'fix',
|
|
192
|
+
'debug',
|
|
193
|
+
'error',
|
|
194
|
+
'bug',
|
|
195
|
+
'issue',
|
|
196
|
+
'problem',
|
|
197
|
+
'failing',
|
|
198
|
+
'broken',
|
|
199
|
+
'crash',
|
|
200
|
+
'exception',
|
|
201
|
+
'incorrect',
|
|
202
|
+
'wrong',
|
|
77
203
|
];
|
|
78
204
|
DOCUMENTATION_KEYWORDS = [
|
|
79
|
-
'explain',
|
|
80
|
-
'
|
|
205
|
+
'explain',
|
|
206
|
+
'document',
|
|
207
|
+
'describe',
|
|
208
|
+
'understand',
|
|
209
|
+
'clarify',
|
|
210
|
+
'comment',
|
|
211
|
+
'documentation',
|
|
212
|
+
'guide',
|
|
213
|
+
'tutorial',
|
|
81
214
|
];
|
|
82
215
|
// v4.0: Medium keywords for new intents
|
|
83
216
|
TESTING_KEYWORDS = [
|
|
84
|
-
'test',
|
|
85
|
-
'
|
|
217
|
+
'test',
|
|
218
|
+
'coverage',
|
|
219
|
+
'jest',
|
|
220
|
+
'pytest',
|
|
221
|
+
'mocha',
|
|
222
|
+
'vitest',
|
|
223
|
+
'mock',
|
|
224
|
+
'assertion',
|
|
225
|
+
'expect',
|
|
226
|
+
'describe',
|
|
227
|
+
'spec',
|
|
228
|
+
'fixture',
|
|
229
|
+
'stub',
|
|
230
|
+
'spy',
|
|
86
231
|
];
|
|
87
232
|
MIGRATION_KEYWORDS = [
|
|
88
|
-
'migrate',
|
|
89
|
-
'
|
|
233
|
+
'migrate',
|
|
234
|
+
'migration',
|
|
235
|
+
'upgrade',
|
|
236
|
+
'port',
|
|
237
|
+
'convert',
|
|
238
|
+
'transition',
|
|
239
|
+
'legacy',
|
|
240
|
+
'deprecated',
|
|
241
|
+
'version',
|
|
242
|
+
'breaking change',
|
|
243
|
+
'compatibility',
|
|
90
244
|
];
|
|
91
245
|
SECURITY_KEYWORDS = [
|
|
92
|
-
'security',
|
|
93
|
-
'
|
|
246
|
+
'security',
|
|
247
|
+
'vulnerability',
|
|
248
|
+
'xss',
|
|
249
|
+
'csrf',
|
|
250
|
+
'injection',
|
|
251
|
+
'sanitize',
|
|
252
|
+
'escape',
|
|
253
|
+
'owasp',
|
|
254
|
+
'cve',
|
|
255
|
+
'exploit',
|
|
256
|
+
'attack',
|
|
257
|
+
'threat',
|
|
258
|
+
'risk',
|
|
94
259
|
];
|
|
95
260
|
LEARNING_KEYWORDS = [
|
|
96
|
-
'understand',
|
|
97
|
-
'
|
|
261
|
+
'understand',
|
|
262
|
+
'learn',
|
|
263
|
+
'concept',
|
|
264
|
+
'basics',
|
|
265
|
+
'fundamentals',
|
|
266
|
+
'tutorial',
|
|
267
|
+
'introduction',
|
|
268
|
+
'beginner',
|
|
269
|
+
'overview',
|
|
270
|
+
'theory',
|
|
271
|
+
'principle',
|
|
98
272
|
];
|
|
99
273
|
// Weak indicators (5 points)
|
|
100
274
|
WEAK_CODE_KEYWORDS = [
|
|
101
|
-
'react',
|
|
102
|
-
'
|
|
275
|
+
'react',
|
|
276
|
+
'vue',
|
|
277
|
+
'angular',
|
|
278
|
+
'python',
|
|
279
|
+
'javascript',
|
|
280
|
+
'typescript',
|
|
281
|
+
'java',
|
|
282
|
+
'rust',
|
|
283
|
+
'go',
|
|
284
|
+
'php',
|
|
285
|
+
'ruby',
|
|
286
|
+
'swift',
|
|
287
|
+
'kotlin',
|
|
288
|
+
'system',
|
|
289
|
+
'feature',
|
|
103
290
|
];
|
|
104
291
|
// Negation words (reduces score by 50%)
|
|
105
|
-
NEGATION_WORDS = [
|
|
106
|
-
'don\'t', 'dont', 'not', 'avoid', 'without', 'never', 'no'
|
|
107
|
-
];
|
|
292
|
+
NEGATION_WORDS = ["don't", 'dont', 'not', 'avoid', 'without', 'never', 'no'];
|
|
108
293
|
analyze(prompt) {
|
|
109
294
|
const lowerPrompt = prompt.toLowerCase();
|
|
110
295
|
const words = lowerPrompt.split(/\s+/);
|
|
111
296
|
// Calculate weighted scores for each intent
|
|
112
297
|
const scores = {
|
|
113
298
|
'code-generation': this.calculateIntentScore(lowerPrompt, words, 'code-generation'),
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
299
|
+
planning: this.calculateIntentScore(lowerPrompt, words, 'planning'),
|
|
300
|
+
refinement: this.calculateIntentScore(lowerPrompt, words, 'refinement'),
|
|
301
|
+
debugging: this.calculateIntentScore(lowerPrompt, words, 'debugging'),
|
|
302
|
+
documentation: this.calculateIntentScore(lowerPrompt, words, 'documentation'),
|
|
118
303
|
'prd-generation': 0, // PRD is explicit command, not inferred
|
|
119
304
|
// v4.0: New intents
|
|
120
|
-
|
|
121
|
-
|
|
305
|
+
testing: this.calculateIntentScore(lowerPrompt, words, 'testing'),
|
|
306
|
+
migration: this.calculateIntentScore(lowerPrompt, words, 'migration'),
|
|
122
307
|
'security-review': this.calculateIntentScore(lowerPrompt, words, 'security-review'),
|
|
123
|
-
|
|
308
|
+
learning: this.calculateIntentScore(lowerPrompt, words, 'learning'),
|
|
124
309
|
};
|
|
125
310
|
// Apply intent priority rules
|
|
126
311
|
const primaryIntent = this.selectPrimaryIntent(scores, lowerPrompt);
|
|
@@ -131,7 +316,7 @@ export class IntentDetector {
|
|
|
131
316
|
hasCodeContext: this.hasCodeContext(prompt),
|
|
132
317
|
hasTechnicalTerms: this.hasTechnicalTerms(lowerPrompt),
|
|
133
318
|
isOpenEnded: this.isOpenEnded(prompt),
|
|
134
|
-
needsStructure: this.needsStructure(prompt, primaryIntent)
|
|
319
|
+
needsStructure: this.needsStructure(prompt, primaryIntent),
|
|
135
320
|
};
|
|
136
321
|
// Suggest mode
|
|
137
322
|
const suggestedMode = this.suggestMode(primaryIntent, characteristics, prompt.length, confidence);
|
|
@@ -139,7 +324,7 @@ export class IntentDetector {
|
|
|
139
324
|
primaryIntent,
|
|
140
325
|
confidence,
|
|
141
326
|
characteristics,
|
|
142
|
-
suggestedMode
|
|
327
|
+
suggestedMode,
|
|
143
328
|
};
|
|
144
329
|
}
|
|
145
330
|
calculateIntentScore(prompt, words, intent) {
|
|
@@ -174,56 +359,56 @@ export class IntentDetector {
|
|
|
174
359
|
return {
|
|
175
360
|
strong: this.STRONG_CODE_KEYWORDS,
|
|
176
361
|
medium: this.CODE_KEYWORDS,
|
|
177
|
-
weak: this.WEAK_CODE_KEYWORDS
|
|
362
|
+
weak: this.WEAK_CODE_KEYWORDS,
|
|
178
363
|
};
|
|
179
364
|
case 'planning':
|
|
180
365
|
return {
|
|
181
366
|
strong: this.STRONG_PLANNING_KEYWORDS,
|
|
182
367
|
medium: this.PLANNING_KEYWORDS,
|
|
183
|
-
weak: []
|
|
368
|
+
weak: [],
|
|
184
369
|
};
|
|
185
370
|
case 'debugging':
|
|
186
371
|
return {
|
|
187
372
|
strong: this.STRONG_DEBUGGING_KEYWORDS,
|
|
188
373
|
medium: this.DEBUGGING_KEYWORDS,
|
|
189
|
-
weak: []
|
|
374
|
+
weak: [],
|
|
190
375
|
};
|
|
191
376
|
case 'documentation':
|
|
192
377
|
return {
|
|
193
378
|
strong: this.STRONG_DOCUMENTATION_KEYWORDS,
|
|
194
379
|
medium: this.DOCUMENTATION_KEYWORDS,
|
|
195
|
-
weak: []
|
|
380
|
+
weak: [],
|
|
196
381
|
};
|
|
197
382
|
case 'refinement':
|
|
198
383
|
return {
|
|
199
384
|
strong: this.STRONG_REFINEMENT_KEYWORDS,
|
|
200
385
|
medium: this.REFINEMENT_KEYWORDS,
|
|
201
|
-
weak: []
|
|
386
|
+
weak: [],
|
|
202
387
|
};
|
|
203
388
|
// v4.0: New intents
|
|
204
389
|
case 'testing':
|
|
205
390
|
return {
|
|
206
391
|
strong: this.STRONG_TESTING_KEYWORDS,
|
|
207
392
|
medium: this.TESTING_KEYWORDS,
|
|
208
|
-
weak: []
|
|
393
|
+
weak: [],
|
|
209
394
|
};
|
|
210
395
|
case 'migration':
|
|
211
396
|
return {
|
|
212
397
|
strong: this.STRONG_MIGRATION_KEYWORDS,
|
|
213
398
|
medium: this.MIGRATION_KEYWORDS,
|
|
214
|
-
weak: []
|
|
399
|
+
weak: [],
|
|
215
400
|
};
|
|
216
401
|
case 'security-review':
|
|
217
402
|
return {
|
|
218
403
|
strong: this.STRONG_SECURITY_KEYWORDS,
|
|
219
404
|
medium: this.SECURITY_KEYWORDS,
|
|
220
|
-
weak: []
|
|
405
|
+
weak: [],
|
|
221
406
|
};
|
|
222
407
|
case 'learning':
|
|
223
408
|
return {
|
|
224
409
|
strong: this.STRONG_LEARNING_KEYWORDS,
|
|
225
410
|
medium: this.LEARNING_KEYWORDS,
|
|
226
|
-
weak: []
|
|
411
|
+
weak: [],
|
|
227
412
|
};
|
|
228
413
|
default:
|
|
229
414
|
return { strong: [], medium: [], weak: [] };
|
|
@@ -246,11 +431,13 @@ export class IntentDetector {
|
|
|
246
431
|
getContextBonus(prompt, intent) {
|
|
247
432
|
let bonus = 0;
|
|
248
433
|
// Code snippet bonus for debugging/refinement/testing
|
|
249
|
-
if ((intent === 'debugging' || intent === 'refinement' || intent === 'testing') &&
|
|
434
|
+
if ((intent === 'debugging' || intent === 'refinement' || intent === 'testing') &&
|
|
435
|
+
this.hasCodeContext(prompt)) {
|
|
250
436
|
bonus += 15;
|
|
251
437
|
}
|
|
252
438
|
// Question mark bonus for planning/documentation/learning
|
|
253
|
-
if ((intent === 'planning' || intent === 'documentation' || intent === 'learning') &&
|
|
439
|
+
if ((intent === 'planning' || intent === 'documentation' || intent === 'learning') &&
|
|
440
|
+
prompt.includes('?')) {
|
|
254
441
|
bonus += 10;
|
|
255
442
|
}
|
|
256
443
|
// Technical terms bonus for code-generation
|
|
@@ -279,11 +466,11 @@ export class IntentDetector {
|
|
|
279
466
|
// v4.0: Helper methods for new intent bonuses
|
|
280
467
|
hasTestingFrameworkTerms(prompt) {
|
|
281
468
|
const terms = ['jest', 'mocha', 'pytest', 'vitest', 'cypress', 'playwright', 'testing-library'];
|
|
282
|
-
return terms.some(term => prompt.includes(term));
|
|
469
|
+
return terms.some((term) => prompt.includes(term));
|
|
283
470
|
}
|
|
284
471
|
hasSecurityTerms(prompt) {
|
|
285
472
|
const terms = ['owasp', 'cve', 'vulnerability', 'exploit', 'injection', 'xss', 'csrf'];
|
|
286
|
-
return terms.some(term => prompt.includes(term));
|
|
473
|
+
return terms.some((term) => prompt.includes(term));
|
|
287
474
|
}
|
|
288
475
|
hasMigrationPatterns(prompt) {
|
|
289
476
|
// Check for version patterns like "v1 to v2", "17 to 18", "2.x to 3.x"
|
|
@@ -293,49 +480,75 @@ export class IntentDetector {
|
|
|
293
480
|
}
|
|
294
481
|
selectPrimaryIntent(scores, prompt) {
|
|
295
482
|
// Priority 1: Debugging (if strong indicators present)
|
|
296
|
-
if (scores.debugging >= 20 &&
|
|
297
|
-
|
|
483
|
+
if (scores.debugging >= 20 &&
|
|
484
|
+
(prompt.includes('error') ||
|
|
485
|
+
prompt.includes('bug') ||
|
|
486
|
+
prompt.includes('fix') ||
|
|
487
|
+
prompt.includes('debug') ||
|
|
488
|
+
prompt.includes('issue') ||
|
|
489
|
+
prompt.includes('resolve'))) {
|
|
298
490
|
return 'debugging';
|
|
299
491
|
}
|
|
300
492
|
// Priority 2: Security Review (if security audit explicitly requested)
|
|
301
|
-
if (scores['security-review'] >= 20 &&
|
|
302
|
-
prompt.includes('
|
|
493
|
+
if (scores['security-review'] >= 20 &&
|
|
494
|
+
(prompt.includes('security') ||
|
|
495
|
+
prompt.includes('vulnerability') ||
|
|
496
|
+
prompt.includes('audit') ||
|
|
497
|
+
prompt.includes('owasp'))) {
|
|
303
498
|
return 'security-review';
|
|
304
499
|
}
|
|
305
500
|
// Priority 3: Testing (if test creation explicitly requested)
|
|
306
|
-
if (scores.testing >= 20 &&
|
|
307
|
-
|
|
501
|
+
if (scores.testing >= 20 &&
|
|
502
|
+
(prompt.includes('test') ||
|
|
503
|
+
prompt.includes('coverage') ||
|
|
504
|
+
(prompt.includes('spec') && !prompt.includes('specification')))) {
|
|
308
505
|
return 'testing';
|
|
309
506
|
}
|
|
310
507
|
// Priority 4: Migration (if version upgrade explicitly requested)
|
|
311
|
-
if (scores.migration >= 20 &&
|
|
312
|
-
prompt.includes('
|
|
508
|
+
if (scores.migration >= 20 &&
|
|
509
|
+
(prompt.includes('migrate') ||
|
|
510
|
+
prompt.includes('upgrade') ||
|
|
511
|
+
prompt.includes('port') ||
|
|
512
|
+
this.hasMigrationPatterns(prompt))) {
|
|
313
513
|
return 'migration';
|
|
314
514
|
}
|
|
315
515
|
// Priority 5: Documentation (if explanation requested or write documentation)
|
|
316
|
-
if (scores.documentation >= 20 &&
|
|
317
|
-
prompt.includes('
|
|
516
|
+
if (scores.documentation >= 20 &&
|
|
517
|
+
(prompt.includes('explain') ||
|
|
518
|
+
prompt.includes('how does') ||
|
|
519
|
+
prompt.includes('documentation') ||
|
|
520
|
+
(prompt.includes('write') && prompt.includes('document')))) {
|
|
318
521
|
return 'documentation';
|
|
319
522
|
}
|
|
320
523
|
// Priority 6: Learning (if conceptual understanding requested)
|
|
321
|
-
if (scores.learning >= 20 &&
|
|
322
|
-
prompt.includes('
|
|
524
|
+
if (scores.learning >= 20 &&
|
|
525
|
+
(prompt.includes('teach') ||
|
|
526
|
+
prompt.includes('learn') ||
|
|
527
|
+
prompt.includes('understand') ||
|
|
528
|
+
prompt.includes('concept'))) {
|
|
323
529
|
return 'learning';
|
|
324
530
|
}
|
|
325
531
|
// Priority 7: Planning (if architecture/design question or spec-driven)
|
|
326
|
-
if (scores.planning >= 20 &&
|
|
327
|
-
prompt.includes('
|
|
328
|
-
|
|
532
|
+
if (scores.planning >= 20 &&
|
|
533
|
+
(prompt.includes('how should') ||
|
|
534
|
+
prompt.includes('architecture') ||
|
|
535
|
+
prompt.includes('what is the best') ||
|
|
536
|
+
prompt.includes('specification') ||
|
|
537
|
+
(prompt.includes('spec') && !prompt.includes('test')))) {
|
|
329
538
|
return 'planning';
|
|
330
539
|
}
|
|
331
540
|
// Priority 8: Refinement (if improvement requested)
|
|
332
|
-
if (scores.refinement >= 15 &&
|
|
333
|
-
|
|
541
|
+
if (scores.refinement >= 15 &&
|
|
542
|
+
(prompt.includes('improve') ||
|
|
543
|
+
prompt.includes('optimize') ||
|
|
544
|
+
prompt.includes('enhance') ||
|
|
545
|
+
prompt.includes('make') ||
|
|
546
|
+
prompt.includes('refactor'))) {
|
|
334
547
|
return 'refinement';
|
|
335
548
|
}
|
|
336
549
|
// Default: Highest score
|
|
337
550
|
const entries = Object.entries(scores);
|
|
338
|
-
const [primaryIntent] = entries.reduce((max, current) => current[1] > max[1] ? current : max);
|
|
551
|
+
const [primaryIntent] = entries.reduce((max, current) => (current[1] > max[1] ? current : max));
|
|
339
552
|
return primaryIntent;
|
|
340
553
|
}
|
|
341
554
|
calculateConfidence(scores, primaryIntent) {
|
|
@@ -375,32 +588,54 @@ export class IntentDetector {
|
|
|
375
588
|
/def\s+\w+\s*\(/,
|
|
376
589
|
/import\s+/,
|
|
377
590
|
/<\w+>/,
|
|
378
|
-
/\w+\.\w+\(
|
|
591
|
+
/\w+\.\w+\(/,
|
|
379
592
|
];
|
|
380
|
-
return codePatterns.some(pattern => pattern.test(prompt));
|
|
593
|
+
return codePatterns.some((pattern) => pattern.test(prompt));
|
|
381
594
|
}
|
|
382
595
|
hasTechnicalTerms(prompt) {
|
|
383
596
|
const terms = [
|
|
384
|
-
'api',
|
|
385
|
-
'
|
|
386
|
-
'
|
|
597
|
+
'api',
|
|
598
|
+
'database',
|
|
599
|
+
'sql',
|
|
600
|
+
'rest',
|
|
601
|
+
'graphql',
|
|
602
|
+
'jwt',
|
|
603
|
+
'authentication',
|
|
604
|
+
'middleware',
|
|
605
|
+
'framework',
|
|
606
|
+
'library',
|
|
607
|
+
'npm',
|
|
608
|
+
'docker',
|
|
609
|
+
'aws',
|
|
610
|
+
'frontend',
|
|
611
|
+
'backend',
|
|
612
|
+
'microservice',
|
|
387
613
|
];
|
|
388
|
-
return terms.some(term => prompt.includes(term));
|
|
614
|
+
return terms.some((term) => prompt.includes(term));
|
|
389
615
|
}
|
|
390
616
|
hasPerformanceTerms(prompt) {
|
|
391
617
|
const terms = [
|
|
392
|
-
'performance',
|
|
393
|
-
'
|
|
618
|
+
'performance',
|
|
619
|
+
'speed',
|
|
620
|
+
'fast',
|
|
621
|
+
'slow',
|
|
622
|
+
'optimize',
|
|
623
|
+
'latency',
|
|
624
|
+
'throughput',
|
|
625
|
+
'memory',
|
|
626
|
+
'cpu',
|
|
627
|
+
'load time',
|
|
628
|
+
'response time',
|
|
394
629
|
];
|
|
395
|
-
return terms.some(term => prompt.includes(term));
|
|
630
|
+
return terms.some((term) => prompt.includes(term));
|
|
396
631
|
}
|
|
397
632
|
isOpenEnded(prompt) {
|
|
398
633
|
const questionWords = ['how', 'what', 'why', 'when', 'where', 'which', 'should'];
|
|
399
634
|
const lowerPrompt = prompt.toLowerCase();
|
|
400
|
-
const hasQuestionWord = questionWords.some(word => lowerPrompt.startsWith(word));
|
|
635
|
+
const hasQuestionWord = questionWords.some((word) => lowerPrompt.startsWith(word));
|
|
401
636
|
const hasQuestionMark = prompt.includes('?');
|
|
402
637
|
const vaguePatterns = ['help me', 'i need', 'not sure', 'maybe', 'somehow'];
|
|
403
|
-
const hasVague = vaguePatterns.some(pattern => lowerPrompt.includes(pattern));
|
|
638
|
+
const hasVague = vaguePatterns.some((pattern) => lowerPrompt.includes(pattern));
|
|
404
639
|
return hasQuestionWord || hasQuestionMark || hasVague;
|
|
405
640
|
}
|
|
406
641
|
needsStructure(prompt, intent) {
|
|
@@ -409,8 +644,7 @@ export class IntentDetector {
|
|
|
409
644
|
const hasObjective = /objective|goal|purpose|need to|want to/i.test(prompt);
|
|
410
645
|
const hasRequirements = /requirement|must|should|need|expect/i.test(prompt);
|
|
411
646
|
const hasConstraints = /constraint|limit|within|must not|cannot/i.test(prompt);
|
|
412
|
-
const structureScore = [hasObjective, hasRequirements, hasConstraints]
|
|
413
|
-
.filter(Boolean).length;
|
|
647
|
+
const structureScore = [hasObjective, hasRequirements, hasConstraints].filter(Boolean).length;
|
|
414
648
|
return structureScore < 2;
|
|
415
649
|
}
|
|
416
650
|
suggestMode(intent, characteristics, promptLength, confidence) {
|
|
@@ -442,15 +676,15 @@ export class IntentDetector {
|
|
|
442
676
|
// Calculate all scores for secondary intent detection
|
|
443
677
|
const scores = {
|
|
444
678
|
'code-generation': this.calculateIntentScore(lowerPrompt, words, 'code-generation'),
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
679
|
+
planning: this.calculateIntentScore(lowerPrompt, words, 'planning'),
|
|
680
|
+
refinement: this.calculateIntentScore(lowerPrompt, words, 'refinement'),
|
|
681
|
+
debugging: this.calculateIntentScore(lowerPrompt, words, 'debugging'),
|
|
682
|
+
documentation: this.calculateIntentScore(lowerPrompt, words, 'documentation'),
|
|
449
683
|
'prd-generation': 0,
|
|
450
|
-
|
|
451
|
-
|
|
684
|
+
testing: this.calculateIntentScore(lowerPrompt, words, 'testing'),
|
|
685
|
+
migration: this.calculateIntentScore(lowerPrompt, words, 'migration'),
|
|
452
686
|
'security-review': this.calculateIntentScore(lowerPrompt, words, 'security-review'),
|
|
453
|
-
|
|
687
|
+
learning: this.calculateIntentScore(lowerPrompt, words, 'learning'),
|
|
454
688
|
};
|
|
455
689
|
// Get secondary intents (top 2-3 after primary, with score > 10)
|
|
456
690
|
const secondaryIntents = this.getSecondaryIntents(scores, basicAnalysis.primaryIntent);
|
|
@@ -459,11 +693,10 @@ export class IntentDetector {
|
|
|
459
693
|
return {
|
|
460
694
|
...basicAnalysis,
|
|
461
695
|
secondaryIntents,
|
|
462
|
-
intentAmbiguity
|
|
696
|
+
intentAmbiguity,
|
|
463
697
|
};
|
|
464
698
|
}
|
|
465
699
|
getSecondaryIntents(scores, primaryIntent) {
|
|
466
|
-
const primaryScore = scores[primaryIntent];
|
|
467
700
|
const totalScore = Object.values(scores).reduce((sum, s) => sum + s, 0);
|
|
468
701
|
if (totalScore === 0)
|
|
469
702
|
return [];
|
|
@@ -473,12 +706,11 @@ export class IntentDetector {
|
|
|
473
706
|
.slice(0, 2)
|
|
474
707
|
.map(([intent, score]) => ({
|
|
475
708
|
intent: intent,
|
|
476
|
-
confidence: Math.round((score / totalScore) * 100)
|
|
709
|
+
confidence: Math.round((score / totalScore) * 100),
|
|
477
710
|
}));
|
|
478
711
|
}
|
|
479
|
-
calculateAmbiguity(scores,
|
|
480
|
-
const sortedScores = Object.entries(scores)
|
|
481
|
-
.sort(([, a], [, b]) => b - a);
|
|
712
|
+
calculateAmbiguity(scores, _primaryIntent) {
|
|
713
|
+
const sortedScores = Object.entries(scores).sort(([, a], [, b]) => b - a);
|
|
482
714
|
if (sortedScores.length < 2)
|
|
483
715
|
return 'low';
|
|
484
716
|
const primaryScore = sortedScores[0][1];
|