oh-my-claude-sisyphus 3.4.2 → 3.5.0
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 +45 -0
- package/commands/cancel-ultraqa.md +1 -1
- package/dist/__tests__/analytics/analytics-summary.test.d.ts +2 -0
- package/dist/__tests__/analytics/analytics-summary.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/analytics-summary.test.js +267 -0
- package/dist/__tests__/analytics/analytics-summary.test.js.map +1 -0
- package/dist/__tests__/analytics/backfill-dedup.test.d.ts +2 -0
- package/dist/__tests__/analytics/backfill-dedup.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/backfill-dedup.test.js +179 -0
- package/dist/__tests__/analytics/backfill-dedup.test.js.map +1 -0
- package/dist/__tests__/analytics/backfill-engine.test.d.ts +2 -0
- package/dist/__tests__/analytics/backfill-engine.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/backfill-engine.test.js +362 -0
- package/dist/__tests__/analytics/backfill-engine.test.js.map +1 -0
- package/dist/__tests__/analytics/cost-estimator.test.d.ts +2 -0
- package/dist/__tests__/analytics/cost-estimator.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/cost-estimator.test.js +212 -0
- package/dist/__tests__/analytics/cost-estimator.test.js.map +1 -0
- package/dist/__tests__/analytics/output-estimator.test.d.ts +2 -0
- package/dist/__tests__/analytics/output-estimator.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/output-estimator.test.js +106 -0
- package/dist/__tests__/analytics/output-estimator.test.js.map +1 -0
- package/dist/__tests__/analytics/token-extractor.test.d.ts +2 -0
- package/dist/__tests__/analytics/token-extractor.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/token-extractor.test.js +121 -0
- package/dist/__tests__/analytics/token-extractor.test.js.map +1 -0
- package/dist/__tests__/analytics/transcript-parser.test.d.ts +2 -0
- package/dist/__tests__/analytics/transcript-parser.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/transcript-parser.test.js +285 -0
- package/dist/__tests__/analytics/transcript-parser.test.js.map +1 -0
- package/dist/__tests__/analytics/transcript-scanner.test.d.ts +2 -0
- package/dist/__tests__/analytics/transcript-scanner.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/transcript-scanner.test.js +401 -0
- package/dist/__tests__/analytics/transcript-scanner.test.js.map +1 -0
- package/dist/__tests__/analytics/transcript-token-extractor.test.d.ts +2 -0
- package/dist/__tests__/analytics/transcript-token-extractor.test.d.ts.map +1 -0
- package/dist/__tests__/analytics/transcript-token-extractor.test.js +175 -0
- package/dist/__tests__/analytics/transcript-token-extractor.test.js.map +1 -0
- package/dist/__tests__/hud/auto-tracking.integration.test.d.ts +2 -0
- package/dist/__tests__/hud/auto-tracking.integration.test.d.ts.map +1 -0
- package/dist/__tests__/hud/auto-tracking.integration.test.js +12 -0
- package/dist/__tests__/hud/auto-tracking.integration.test.js.map +1 -0
- package/dist/__tests__/learner/auto-learner.test.d.ts +7 -0
- package/dist/__tests__/learner/auto-learner.test.d.ts.map +1 -0
- package/dist/__tests__/learner/auto-learner.test.js +507 -0
- package/dist/__tests__/learner/auto-learner.test.js.map +1 -0
- package/dist/__tests__/learner/matcher.test.d.ts +2 -0
- package/dist/__tests__/learner/matcher.test.d.ts.map +1 -0
- package/dist/__tests__/learner/matcher.test.js +330 -0
- package/dist/__tests__/learner/matcher.test.js.map +1 -0
- package/dist/analytics/analytics-summary.d.ts +47 -0
- package/dist/analytics/analytics-summary.d.ts.map +1 -0
- package/dist/analytics/analytics-summary.js +171 -0
- package/dist/analytics/analytics-summary.js.map +1 -0
- package/dist/analytics/backfill-dedup.d.ts +49 -0
- package/dist/analytics/backfill-dedup.d.ts.map +1 -0
- package/dist/analytics/backfill-dedup.js +115 -0
- package/dist/analytics/backfill-dedup.js.map +1 -0
- package/dist/analytics/backfill-engine.d.ts +59 -0
- package/dist/analytics/backfill-engine.d.ts.map +1 -0
- package/dist/analytics/backfill-engine.js +172 -0
- package/dist/analytics/backfill-engine.js.map +1 -0
- package/dist/analytics/index.d.ts +8 -0
- package/dist/analytics/index.d.ts.map +1 -1
- package/dist/analytics/index.js +10 -0
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/output-estimator.d.ts +26 -0
- package/dist/analytics/output-estimator.d.ts.map +1 -0
- package/dist/analytics/output-estimator.js +61 -0
- package/dist/analytics/output-estimator.js.map +1 -0
- package/dist/analytics/query-engine.d.ts.map +1 -1
- package/dist/analytics/query-engine.js +3 -2
- package/dist/analytics/query-engine.js.map +1 -1
- package/dist/analytics/token-extractor.d.ts +31 -0
- package/dist/analytics/token-extractor.d.ts.map +1 -0
- package/dist/analytics/token-extractor.js +57 -0
- package/dist/analytics/token-extractor.js.map +1 -0
- package/dist/analytics/token-tracker.d.ts +7 -1
- package/dist/analytics/token-tracker.d.ts.map +1 -1
- package/dist/analytics/token-tracker.js +94 -18
- package/dist/analytics/token-tracker.js.map +1 -1
- package/dist/analytics/transcript-parser.d.ts +42 -0
- package/dist/analytics/transcript-parser.d.ts.map +1 -0
- package/dist/analytics/transcript-parser.js +90 -0
- package/dist/analytics/transcript-parser.js.map +1 -0
- package/dist/analytics/transcript-scanner.d.ts +50 -0
- package/dist/analytics/transcript-scanner.d.ts.map +1 -0
- package/dist/analytics/transcript-scanner.js +149 -0
- package/dist/analytics/transcript-scanner.js.map +1 -0
- package/dist/analytics/transcript-token-extractor.d.ts +35 -0
- package/dist/analytics/transcript-token-extractor.d.ts.map +1 -0
- package/dist/analytics/transcript-token-extractor.js +136 -0
- package/dist/analytics/transcript-token-extractor.js.map +1 -0
- package/dist/analytics/types.d.ts +65 -0
- package/dist/analytics/types.d.ts.map +1 -1
- package/dist/analytics/types.js.map +1 -1
- package/dist/cli/analytics.js +26 -1
- package/dist/cli/analytics.js.map +1 -1
- package/dist/cli/commands/backfill.d.ts +15 -0
- package/dist/cli/commands/backfill.d.ts.map +1 -0
- package/dist/cli/commands/backfill.js +146 -0
- package/dist/cli/commands/backfill.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +1 -0
- package/dist/cli/commands/stats.d.ts.map +1 -1
- package/dist/cli/commands/stats.js +67 -31
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/components/CostDashboard.d.ts +15 -0
- package/dist/cli/components/CostDashboard.d.ts.map +1 -0
- package/dist/cli/components/CostDashboard.js +15 -0
- package/dist/cli/components/CostDashboard.js.map +1 -0
- package/dist/cli/components/LiveStats.d.ts +16 -0
- package/dist/cli/components/LiveStats.d.ts.map +1 -0
- package/dist/cli/components/LiveStats.js +16 -0
- package/dist/cli/components/LiveStats.js.map +1 -0
- package/dist/cli/components/SessionBrowser.d.ts +14 -0
- package/dist/cli/components/SessionBrowser.d.ts.map +1 -0
- package/dist/cli/components/SessionBrowser.js +14 -0
- package/dist/cli/components/SessionBrowser.js.map +1 -0
- package/dist/cli/index.js +159 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/tui.d.ts +21 -0
- package/dist/cli/tui.d.ts.map +1 -0
- package/dist/cli/tui.js +21 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/hooks/learner/auto-invoke.d.ts +82 -0
- package/dist/hooks/learner/auto-invoke.d.ts.map +1 -0
- package/dist/hooks/learner/auto-invoke.js +234 -0
- package/dist/hooks/learner/auto-invoke.js.map +1 -0
- package/dist/hooks/learner/auto-learner.d.ts +55 -0
- package/dist/hooks/learner/auto-learner.d.ts.map +1 -0
- package/dist/hooks/learner/auto-learner.js +361 -0
- package/dist/hooks/learner/auto-learner.js.map +1 -0
- package/dist/hooks/learner/index.d.ts +3 -0
- package/dist/hooks/learner/index.d.ts.map +1 -1
- package/dist/hooks/learner/index.js +4 -0
- package/dist/hooks/learner/index.js.map +1 -1
- package/dist/hooks/learner/matcher.d.ts +40 -0
- package/dist/hooks/learner/matcher.d.ts.map +1 -0
- package/dist/hooks/learner/matcher.js +230 -0
- package/dist/hooks/learner/matcher.js.map +1 -0
- package/dist/hud/analytics-display.d.ts +16 -0
- package/dist/hud/analytics-display.d.ts.map +1 -1
- package/dist/hud/analytics-display.js +42 -0
- package/dist/hud/analytics-display.js.map +1 -1
- package/dist/hud/index.js +90 -3
- package/dist/hud/index.js.map +1 -1
- package/dist/hud/render.d.ts.map +1 -1
- package/dist/hud/render.js +27 -1
- package/dist/hud/render.js.map +1 -1
- package/dist/hud/types.d.ts +2 -0
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js.map +1 -1
- package/docs/ANALYTICS-SYSTEM.md +150 -0
- package/hooks/keyword-detector.sh +1 -1
- package/package.json +1 -1
- package/scripts/keyword-detector.mjs +1 -1
- package/scripts/persistent-mode.mjs +1 -1
- package/scripts/test-mutual-exclusion.ts +4 -4
- package/scripts/test-remember-tags.ts +6 -6
- package/scripts/test-session-injection.ts +4 -4
- package/skills/cancel-ultraqa/SKILL.md +1 -1
- package/skills/local-skills-setup/SKILL.md +465 -0
- package/skills/omc-setup/SKILL.md +30 -5
- package/skills/skill/SKILL.md +406 -0
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-Learner Module
|
|
3
|
+
*
|
|
4
|
+
* Automatically detects skill-worthy patterns during work sessions.
|
|
5
|
+
* Tracks problem-solution pairs and suggests skill extraction.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from 'crypto';
|
|
8
|
+
/**
|
|
9
|
+
* Default threshold for suggesting skills.
|
|
10
|
+
*/
|
|
11
|
+
const DEFAULT_SUGGESTION_THRESHOLD = 70;
|
|
12
|
+
/**
|
|
13
|
+
* Keywords that boost skill-worthiness score.
|
|
14
|
+
*/
|
|
15
|
+
const HIGH_VALUE_KEYWORDS = [
|
|
16
|
+
'error',
|
|
17
|
+
'failed',
|
|
18
|
+
'crash',
|
|
19
|
+
'bug',
|
|
20
|
+
'fix',
|
|
21
|
+
'workaround',
|
|
22
|
+
'solution',
|
|
23
|
+
'resolved',
|
|
24
|
+
];
|
|
25
|
+
/**
|
|
26
|
+
* Common file extensions that indicate technical content.
|
|
27
|
+
*/
|
|
28
|
+
const TECHNICAL_EXTENSIONS = [
|
|
29
|
+
'.ts',
|
|
30
|
+
'.tsx',
|
|
31
|
+
'.js',
|
|
32
|
+
'.jsx',
|
|
33
|
+
'.py',
|
|
34
|
+
'.go',
|
|
35
|
+
'.rs',
|
|
36
|
+
'.java',
|
|
37
|
+
'.c',
|
|
38
|
+
'.cpp',
|
|
39
|
+
'.h',
|
|
40
|
+
];
|
|
41
|
+
/**
|
|
42
|
+
* Generic patterns that lower skill-worthiness.
|
|
43
|
+
*/
|
|
44
|
+
const GENERIC_PATTERNS = [
|
|
45
|
+
'try again',
|
|
46
|
+
'restart',
|
|
47
|
+
'check the docs',
|
|
48
|
+
'google it',
|
|
49
|
+
'look at the error',
|
|
50
|
+
];
|
|
51
|
+
/**
|
|
52
|
+
* Initialize state for a session.
|
|
53
|
+
*/
|
|
54
|
+
export function initAutoLearner(sessionId) {
|
|
55
|
+
return {
|
|
56
|
+
sessionId,
|
|
57
|
+
patterns: new Map(),
|
|
58
|
+
suggestedSkills: [],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Generate a content hash for deduplication.
|
|
63
|
+
*/
|
|
64
|
+
function generateContentHash(problem, solution) {
|
|
65
|
+
const normalized = `${problem.toLowerCase().trim()}::${solution.toLowerCase().trim()}`;
|
|
66
|
+
return createHash('sha256').update(normalized).digest('hex').slice(0, 16);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Extract file paths from text.
|
|
70
|
+
*/
|
|
71
|
+
function extractFilePaths(text) {
|
|
72
|
+
const paths = [];
|
|
73
|
+
// Match common path patterns
|
|
74
|
+
const pathPatterns = [
|
|
75
|
+
// Absolute paths: /path/to/file.ext or C:\path\to\file.ext
|
|
76
|
+
/(?:^|\s)((?:[A-Z]:)?(?:\/|\\)[\w\/\\.-]+\.\w+)/gi,
|
|
77
|
+
// Relative paths: ./path/to/file.ext or ../path/to/file.ext
|
|
78
|
+
/(?:^|\s)(\.\.?\/[\w\/.-]+\.\w+)/gi,
|
|
79
|
+
// Simple paths: src/components/Button.tsx
|
|
80
|
+
/(?:^|\s)([\w-]+(?:\/[\w-]+)+\.\w+)/gi,
|
|
81
|
+
];
|
|
82
|
+
for (const pattern of pathPatterns) {
|
|
83
|
+
const matches = text.matchAll(pattern);
|
|
84
|
+
for (const match of matches) {
|
|
85
|
+
if (match[1]) {
|
|
86
|
+
paths.push(match[1].trim());
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return [...new Set(paths)];
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Extract error messages from text.
|
|
94
|
+
*/
|
|
95
|
+
function extractErrorMessages(text) {
|
|
96
|
+
const errors = [];
|
|
97
|
+
// Match common error patterns
|
|
98
|
+
const errorPatterns = [
|
|
99
|
+
// "Error: message"
|
|
100
|
+
/(?:Error|Exception|Warning):\s*([^\n]+)/gi,
|
|
101
|
+
// "TypeError: message"
|
|
102
|
+
/(?:Type|Reference|Syntax|Range|URI)Error:\s*([^\n]+)/gi,
|
|
103
|
+
// "ENOENT: no such file"
|
|
104
|
+
/E[A-Z]+:\s*([^\n]+)/gi,
|
|
105
|
+
];
|
|
106
|
+
for (const pattern of errorPatterns) {
|
|
107
|
+
const matches = text.matchAll(pattern);
|
|
108
|
+
for (const match of matches) {
|
|
109
|
+
if (match[1]) {
|
|
110
|
+
errors.push(match[1].trim());
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return [...new Set(errors)];
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Extract key technical terms from text.
|
|
118
|
+
*/
|
|
119
|
+
function extractKeyTerms(text) {
|
|
120
|
+
const terms = [];
|
|
121
|
+
// Extract quoted strings (likely command names or technical terms)
|
|
122
|
+
const quotedPattern = /['"`]([^'"`]+)['"`]/g;
|
|
123
|
+
const quotedMatches = text.matchAll(quotedPattern);
|
|
124
|
+
for (const match of quotedMatches) {
|
|
125
|
+
if (match[1] && match[1].length > 2 && match[1].length < 30) {
|
|
126
|
+
terms.push(match[1]);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Extract capitalized technical terms (like React, TypeScript, etc.)
|
|
130
|
+
const capitalizedPattern = /\b([A-Z][a-zA-Z0-9]{2,})\b/g;
|
|
131
|
+
const capitalizedMatches = text.matchAll(capitalizedPattern);
|
|
132
|
+
for (const match of capitalizedMatches) {
|
|
133
|
+
if (match[1] && !['The', 'This', 'That', 'There'].includes(match[1])) {
|
|
134
|
+
terms.push(match[1]);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return [...new Set(terms)];
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Extract triggers from problem and solution text.
|
|
141
|
+
*/
|
|
142
|
+
export function extractTriggers(problem, solution) {
|
|
143
|
+
const triggers = new Set();
|
|
144
|
+
// Add error messages as triggers
|
|
145
|
+
const errors = extractErrorMessages(problem);
|
|
146
|
+
for (const error of errors.slice(0, 3)) {
|
|
147
|
+
// Limit to 3 errors
|
|
148
|
+
// Take first 5 words of error message
|
|
149
|
+
const words = error.split(/\s+/).slice(0, 5).join(' ');
|
|
150
|
+
if (words.length > 5) {
|
|
151
|
+
triggers.add(words);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Add file paths (basenames only)
|
|
155
|
+
const paths = extractFilePaths(problem + ' ' + solution);
|
|
156
|
+
for (const path of paths.slice(0, 3)) {
|
|
157
|
+
// Limit to 3 paths
|
|
158
|
+
const basename = path.split(/[/\\]/).pop();
|
|
159
|
+
if (basename && basename.length > 3) {
|
|
160
|
+
triggers.add(basename);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Add key terms
|
|
164
|
+
const terms = extractKeyTerms(problem + ' ' + solution);
|
|
165
|
+
for (const term of terms.slice(0, 5)) {
|
|
166
|
+
// Limit to 5 terms
|
|
167
|
+
if (term.length > 3 && term.length < 30) {
|
|
168
|
+
triggers.add(term.toLowerCase());
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Add high-value keywords if present
|
|
172
|
+
const combinedText = (problem + ' ' + solution).toLowerCase();
|
|
173
|
+
for (const keyword of HIGH_VALUE_KEYWORDS) {
|
|
174
|
+
if (combinedText.includes(keyword)) {
|
|
175
|
+
triggers.add(keyword);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return Array.from(triggers).slice(0, 10); // Max 10 triggers
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Generate tags based on content analysis.
|
|
182
|
+
*/
|
|
183
|
+
function generateTags(problem, solution) {
|
|
184
|
+
const tags = new Set();
|
|
185
|
+
const combinedText = (problem + ' ' + solution).toLowerCase();
|
|
186
|
+
// Language/framework detection
|
|
187
|
+
const langMap = {
|
|
188
|
+
typescript: 'typescript',
|
|
189
|
+
javascript: 'javascript',
|
|
190
|
+
python: 'python',
|
|
191
|
+
react: 'react',
|
|
192
|
+
vue: 'vue',
|
|
193
|
+
angular: 'angular',
|
|
194
|
+
node: 'nodejs',
|
|
195
|
+
'node.js': 'nodejs',
|
|
196
|
+
rust: 'rust',
|
|
197
|
+
go: 'golang',
|
|
198
|
+
};
|
|
199
|
+
for (const [keyword, tag] of Object.entries(langMap)) {
|
|
200
|
+
if (combinedText.includes(keyword)) {
|
|
201
|
+
tags.add(tag);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Problem category detection
|
|
205
|
+
if (combinedText.includes('error') || combinedText.includes('bug')) {
|
|
206
|
+
tags.add('debugging');
|
|
207
|
+
}
|
|
208
|
+
if (combinedText.includes('test') || combinedText.includes('spec')) {
|
|
209
|
+
tags.add('testing');
|
|
210
|
+
}
|
|
211
|
+
if (combinedText.includes('build') || combinedText.includes('compile')) {
|
|
212
|
+
tags.add('build');
|
|
213
|
+
}
|
|
214
|
+
if (combinedText.includes('performance') || combinedText.includes('slow')) {
|
|
215
|
+
tags.add('performance');
|
|
216
|
+
}
|
|
217
|
+
if (combinedText.includes('security') || combinedText.includes('vulnerability')) {
|
|
218
|
+
tags.add('security');
|
|
219
|
+
}
|
|
220
|
+
// File type detection
|
|
221
|
+
const paths = extractFilePaths(problem + ' ' + solution);
|
|
222
|
+
for (const path of paths) {
|
|
223
|
+
for (const ext of TECHNICAL_EXTENSIONS) {
|
|
224
|
+
if (path.endsWith(ext)) {
|
|
225
|
+
tags.add('code');
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return Array.from(tags).slice(0, 5); // Max 5 tags
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Calculate skill-worthiness score (0-100).
|
|
234
|
+
*/
|
|
235
|
+
export function calculateSkillWorthiness(pattern) {
|
|
236
|
+
let score = 50; // Base score
|
|
237
|
+
const combinedText = (pattern.problem + ' ' + pattern.solution).toLowerCase();
|
|
238
|
+
// Boost for specificity
|
|
239
|
+
const hasFilePaths = extractFilePaths(pattern.problem + ' ' + pattern.solution).length > 0;
|
|
240
|
+
if (hasFilePaths) {
|
|
241
|
+
score += 15;
|
|
242
|
+
}
|
|
243
|
+
const hasErrorMessages = extractErrorMessages(pattern.problem).length > 0;
|
|
244
|
+
if (hasErrorMessages) {
|
|
245
|
+
score += 15;
|
|
246
|
+
}
|
|
247
|
+
// Boost for high-value keywords
|
|
248
|
+
let keywordCount = 0;
|
|
249
|
+
for (const keyword of HIGH_VALUE_KEYWORDS) {
|
|
250
|
+
if (combinedText.includes(keyword)) {
|
|
251
|
+
keywordCount++;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
score += Math.min(keywordCount * 5, 20); // Max 20 points from keywords
|
|
255
|
+
// Boost for multiple occurrences
|
|
256
|
+
if (pattern.occurrences > 1) {
|
|
257
|
+
score += Math.min((pattern.occurrences - 1) * 10, 30); // Max 30 points
|
|
258
|
+
}
|
|
259
|
+
// Boost for detailed solution (longer is better, to a point)
|
|
260
|
+
const solutionLength = pattern.solution.length;
|
|
261
|
+
if (solutionLength > 100) {
|
|
262
|
+
score += 10;
|
|
263
|
+
}
|
|
264
|
+
if (solutionLength > 300) {
|
|
265
|
+
score += 10;
|
|
266
|
+
}
|
|
267
|
+
// Penalty for generic patterns
|
|
268
|
+
for (const generic of GENERIC_PATTERNS) {
|
|
269
|
+
if (combinedText.includes(generic)) {
|
|
270
|
+
score -= 15;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// Penalty for very short content
|
|
274
|
+
if (pattern.problem.length < 20 || pattern.solution.length < 30) {
|
|
275
|
+
score -= 20;
|
|
276
|
+
}
|
|
277
|
+
// Penalty for missing triggers
|
|
278
|
+
if (pattern.suggestedTriggers.length === 0) {
|
|
279
|
+
score -= 25;
|
|
280
|
+
}
|
|
281
|
+
// Ensure score is in valid range
|
|
282
|
+
return Math.max(0, Math.min(100, score));
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Record a problem-solution pair.
|
|
286
|
+
* Returns the pattern if it's new or updated, null if ignored.
|
|
287
|
+
*/
|
|
288
|
+
export function recordPattern(state, problem, solution) {
|
|
289
|
+
// Basic validation
|
|
290
|
+
if (!problem || !solution) {
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
const trimmedProblem = problem.trim();
|
|
294
|
+
const trimmedSolution = solution.trim();
|
|
295
|
+
if (trimmedProblem.length < 10 || trimmedSolution.length < 20) {
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
// Generate hash for deduplication
|
|
299
|
+
const hash = generateContentHash(trimmedProblem, trimmedSolution);
|
|
300
|
+
// Check if pattern already exists
|
|
301
|
+
const existingPattern = state.patterns.get(hash);
|
|
302
|
+
if (existingPattern) {
|
|
303
|
+
// Update existing pattern
|
|
304
|
+
existingPattern.occurrences++;
|
|
305
|
+
existingPattern.lastSeen = Date.now();
|
|
306
|
+
existingPattern.confidence = calculateSkillWorthiness(existingPattern);
|
|
307
|
+
// Re-evaluate for suggestion
|
|
308
|
+
if (existingPattern.confidence >= DEFAULT_SUGGESTION_THRESHOLD &&
|
|
309
|
+
!state.suggestedSkills.find(p => p.id === existingPattern.id)) {
|
|
310
|
+
state.suggestedSkills.push(existingPattern);
|
|
311
|
+
}
|
|
312
|
+
return existingPattern;
|
|
313
|
+
}
|
|
314
|
+
// Create new pattern
|
|
315
|
+
const triggers = extractTriggers(trimmedProblem, trimmedSolution);
|
|
316
|
+
const tags = generateTags(trimmedProblem, trimmedSolution);
|
|
317
|
+
const newPattern = {
|
|
318
|
+
id: hash,
|
|
319
|
+
problem: trimmedProblem,
|
|
320
|
+
solution: trimmedSolution,
|
|
321
|
+
occurrences: 1,
|
|
322
|
+
firstSeen: Date.now(),
|
|
323
|
+
lastSeen: Date.now(),
|
|
324
|
+
suggestedTriggers: triggers,
|
|
325
|
+
suggestedTags: tags,
|
|
326
|
+
confidence: 0, // Will be calculated below
|
|
327
|
+
};
|
|
328
|
+
// Calculate initial confidence
|
|
329
|
+
newPattern.confidence = calculateSkillWorthiness(newPattern);
|
|
330
|
+
// Store pattern
|
|
331
|
+
state.patterns.set(hash, newPattern);
|
|
332
|
+
// Add to suggestions if worthy
|
|
333
|
+
if (newPattern.confidence >= DEFAULT_SUGGESTION_THRESHOLD) {
|
|
334
|
+
state.suggestedSkills.push(newPattern);
|
|
335
|
+
}
|
|
336
|
+
return newPattern;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Get ready-to-suggest skills (confidence above threshold).
|
|
340
|
+
*/
|
|
341
|
+
export function getSuggestedSkills(state, threshold = DEFAULT_SUGGESTION_THRESHOLD) {
|
|
342
|
+
return state.suggestedSkills.filter(p => p.confidence >= threshold).sort((a, b) => b.confidence - a.confidence);
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Convert pattern to skill metadata (partial).
|
|
346
|
+
*/
|
|
347
|
+
export function patternToSkillMetadata(pattern) {
|
|
348
|
+
// Generate a descriptive name from the problem
|
|
349
|
+
const problemWords = pattern.problem.split(/\s+/).slice(0, 6).join(' ');
|
|
350
|
+
const name = problemWords.length > 50 ? problemWords.slice(0, 50) + '...' : problemWords;
|
|
351
|
+
return {
|
|
352
|
+
name,
|
|
353
|
+
description: pattern.problem.slice(0, 200),
|
|
354
|
+
triggers: pattern.suggestedTriggers,
|
|
355
|
+
tags: pattern.suggestedTags,
|
|
356
|
+
source: 'extracted',
|
|
357
|
+
quality: pattern.confidence,
|
|
358
|
+
usageCount: 0,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=auto-learner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-learner.js","sourceRoot":"","sources":["../../../src/hooks/learner/auto-learner.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,9 @@ export * from './detector.js';
|
|
|
16
16
|
export * from './detection-hook.js';
|
|
17
17
|
export * from './promotion.js';
|
|
18
18
|
export * from './config.js';
|
|
19
|
+
export * from './matcher.js';
|
|
20
|
+
export * from './auto-invoke.js';
|
|
21
|
+
export { type PatternDetection, type AutoLearnerState, initAutoLearner, calculateSkillWorthiness, extractTriggers, getSuggestedSkills, patternToSkillMetadata, recordPattern as recordSkillPattern, } from './auto-learner.js';
|
|
19
22
|
/**
|
|
20
23
|
* Check if feature is enabled.
|
|
21
24
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/learner/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/learner/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AAEjC,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,IAAI,kBAAkB,GACpC,MAAM,mBAAmB,CAAC;AAO3B;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAkCD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAAG,IAAI,GACzB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,EAAE,CAAA;CAAE,CAsC9C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEzD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,YAAY,EAAE,CAEvE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAE9D;;OAEG;8BACuB,MAAM,aAAa,MAAM;kBA9DxC,MAAM;gBAAU,YAAY,EAAE;;IAkEzC;;OAEG;8BACuB,MAAM;IAIhC;;OAEG;;IAGH;;OAEG;;EAGN"}
|
|
@@ -20,6 +20,10 @@ export * from './detector.js';
|
|
|
20
20
|
export * from './detection-hook.js';
|
|
21
21
|
export * from './promotion.js';
|
|
22
22
|
export * from './config.js';
|
|
23
|
+
export * from './matcher.js';
|
|
24
|
+
export * from './auto-invoke.js';
|
|
25
|
+
// Note: auto-learner exports are renamed to avoid collision with ralph's recordPattern
|
|
26
|
+
export { initAutoLearner, calculateSkillWorthiness, extractTriggers, getSuggestedSkills, patternToSkillMetadata, recordPattern as recordSkillPattern, } from './auto-learner.js';
|
|
23
27
|
/**
|
|
24
28
|
* Session cache for tracking injected skills.
|
|
25
29
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/learner/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,uBAAuB;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/learner/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface MatchResult {
|
|
2
|
+
skillId: string;
|
|
3
|
+
confidence: number;
|
|
4
|
+
matchedTriggers: string[];
|
|
5
|
+
matchType: 'exact' | 'fuzzy' | 'pattern' | 'semantic';
|
|
6
|
+
context: MatchContext;
|
|
7
|
+
}
|
|
8
|
+
export interface MatchContext {
|
|
9
|
+
detectedErrors: string[];
|
|
10
|
+
detectedFiles: string[];
|
|
11
|
+
detectedPatterns: string[];
|
|
12
|
+
}
|
|
13
|
+
interface SkillInput {
|
|
14
|
+
id: string;
|
|
15
|
+
triggers: string[];
|
|
16
|
+
tags?: string[];
|
|
17
|
+
}
|
|
18
|
+
interface MatchOptions {
|
|
19
|
+
threshold?: number;
|
|
20
|
+
maxResults?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Match skills against a prompt using multiple matching strategies
|
|
24
|
+
*/
|
|
25
|
+
export declare function matchSkills(prompt: string, skills: SkillInput[], options?: MatchOptions): MatchResult[];
|
|
26
|
+
/**
|
|
27
|
+
* Fuzzy string matching using Levenshtein distance
|
|
28
|
+
* Returns confidence score 0-100
|
|
29
|
+
*/
|
|
30
|
+
export declare function fuzzyMatch(text: string, pattern: string): number;
|
|
31
|
+
/**
|
|
32
|
+
* Extract contextual information from the prompt
|
|
33
|
+
*/
|
|
34
|
+
export declare function extractContext(prompt: string): MatchContext;
|
|
35
|
+
/**
|
|
36
|
+
* Calculate confidence score based on match metrics
|
|
37
|
+
*/
|
|
38
|
+
export declare function calculateConfidence(matches: number, total: number, matchType: string): number;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=matcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../../src/hooks/learner/matcher.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;IACtD,OAAO,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,UAAU,YAAY;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,EAAE,EACpB,OAAO,GAAE,YAAiB,GACzB,WAAW,EAAE,CAmEf;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAuBhE;AA0ED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAgE3D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,MAAM,CAkBR"}
|