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.
Files changed (164) hide show
  1. package/README.md +45 -0
  2. package/commands/cancel-ultraqa.md +1 -1
  3. package/dist/__tests__/analytics/analytics-summary.test.d.ts +2 -0
  4. package/dist/__tests__/analytics/analytics-summary.test.d.ts.map +1 -0
  5. package/dist/__tests__/analytics/analytics-summary.test.js +267 -0
  6. package/dist/__tests__/analytics/analytics-summary.test.js.map +1 -0
  7. package/dist/__tests__/analytics/backfill-dedup.test.d.ts +2 -0
  8. package/dist/__tests__/analytics/backfill-dedup.test.d.ts.map +1 -0
  9. package/dist/__tests__/analytics/backfill-dedup.test.js +179 -0
  10. package/dist/__tests__/analytics/backfill-dedup.test.js.map +1 -0
  11. package/dist/__tests__/analytics/backfill-engine.test.d.ts +2 -0
  12. package/dist/__tests__/analytics/backfill-engine.test.d.ts.map +1 -0
  13. package/dist/__tests__/analytics/backfill-engine.test.js +362 -0
  14. package/dist/__tests__/analytics/backfill-engine.test.js.map +1 -0
  15. package/dist/__tests__/analytics/cost-estimator.test.d.ts +2 -0
  16. package/dist/__tests__/analytics/cost-estimator.test.d.ts.map +1 -0
  17. package/dist/__tests__/analytics/cost-estimator.test.js +212 -0
  18. package/dist/__tests__/analytics/cost-estimator.test.js.map +1 -0
  19. package/dist/__tests__/analytics/output-estimator.test.d.ts +2 -0
  20. package/dist/__tests__/analytics/output-estimator.test.d.ts.map +1 -0
  21. package/dist/__tests__/analytics/output-estimator.test.js +106 -0
  22. package/dist/__tests__/analytics/output-estimator.test.js.map +1 -0
  23. package/dist/__tests__/analytics/token-extractor.test.d.ts +2 -0
  24. package/dist/__tests__/analytics/token-extractor.test.d.ts.map +1 -0
  25. package/dist/__tests__/analytics/token-extractor.test.js +121 -0
  26. package/dist/__tests__/analytics/token-extractor.test.js.map +1 -0
  27. package/dist/__tests__/analytics/transcript-parser.test.d.ts +2 -0
  28. package/dist/__tests__/analytics/transcript-parser.test.d.ts.map +1 -0
  29. package/dist/__tests__/analytics/transcript-parser.test.js +285 -0
  30. package/dist/__tests__/analytics/transcript-parser.test.js.map +1 -0
  31. package/dist/__tests__/analytics/transcript-scanner.test.d.ts +2 -0
  32. package/dist/__tests__/analytics/transcript-scanner.test.d.ts.map +1 -0
  33. package/dist/__tests__/analytics/transcript-scanner.test.js +401 -0
  34. package/dist/__tests__/analytics/transcript-scanner.test.js.map +1 -0
  35. package/dist/__tests__/analytics/transcript-token-extractor.test.d.ts +2 -0
  36. package/dist/__tests__/analytics/transcript-token-extractor.test.d.ts.map +1 -0
  37. package/dist/__tests__/analytics/transcript-token-extractor.test.js +175 -0
  38. package/dist/__tests__/analytics/transcript-token-extractor.test.js.map +1 -0
  39. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts +2 -0
  40. package/dist/__tests__/hud/auto-tracking.integration.test.d.ts.map +1 -0
  41. package/dist/__tests__/hud/auto-tracking.integration.test.js +12 -0
  42. package/dist/__tests__/hud/auto-tracking.integration.test.js.map +1 -0
  43. package/dist/__tests__/learner/auto-learner.test.d.ts +7 -0
  44. package/dist/__tests__/learner/auto-learner.test.d.ts.map +1 -0
  45. package/dist/__tests__/learner/auto-learner.test.js +507 -0
  46. package/dist/__tests__/learner/auto-learner.test.js.map +1 -0
  47. package/dist/__tests__/learner/matcher.test.d.ts +2 -0
  48. package/dist/__tests__/learner/matcher.test.d.ts.map +1 -0
  49. package/dist/__tests__/learner/matcher.test.js +330 -0
  50. package/dist/__tests__/learner/matcher.test.js.map +1 -0
  51. package/dist/analytics/analytics-summary.d.ts +47 -0
  52. package/dist/analytics/analytics-summary.d.ts.map +1 -0
  53. package/dist/analytics/analytics-summary.js +171 -0
  54. package/dist/analytics/analytics-summary.js.map +1 -0
  55. package/dist/analytics/backfill-dedup.d.ts +49 -0
  56. package/dist/analytics/backfill-dedup.d.ts.map +1 -0
  57. package/dist/analytics/backfill-dedup.js +115 -0
  58. package/dist/analytics/backfill-dedup.js.map +1 -0
  59. package/dist/analytics/backfill-engine.d.ts +59 -0
  60. package/dist/analytics/backfill-engine.d.ts.map +1 -0
  61. package/dist/analytics/backfill-engine.js +172 -0
  62. package/dist/analytics/backfill-engine.js.map +1 -0
  63. package/dist/analytics/index.d.ts +8 -0
  64. package/dist/analytics/index.d.ts.map +1 -1
  65. package/dist/analytics/index.js +10 -0
  66. package/dist/analytics/index.js.map +1 -1
  67. package/dist/analytics/output-estimator.d.ts +26 -0
  68. package/dist/analytics/output-estimator.d.ts.map +1 -0
  69. package/dist/analytics/output-estimator.js +61 -0
  70. package/dist/analytics/output-estimator.js.map +1 -0
  71. package/dist/analytics/query-engine.d.ts.map +1 -1
  72. package/dist/analytics/query-engine.js +3 -2
  73. package/dist/analytics/query-engine.js.map +1 -1
  74. package/dist/analytics/token-extractor.d.ts +31 -0
  75. package/dist/analytics/token-extractor.d.ts.map +1 -0
  76. package/dist/analytics/token-extractor.js +57 -0
  77. package/dist/analytics/token-extractor.js.map +1 -0
  78. package/dist/analytics/token-tracker.d.ts +7 -1
  79. package/dist/analytics/token-tracker.d.ts.map +1 -1
  80. package/dist/analytics/token-tracker.js +94 -18
  81. package/dist/analytics/token-tracker.js.map +1 -1
  82. package/dist/analytics/transcript-parser.d.ts +42 -0
  83. package/dist/analytics/transcript-parser.d.ts.map +1 -0
  84. package/dist/analytics/transcript-parser.js +90 -0
  85. package/dist/analytics/transcript-parser.js.map +1 -0
  86. package/dist/analytics/transcript-scanner.d.ts +50 -0
  87. package/dist/analytics/transcript-scanner.d.ts.map +1 -0
  88. package/dist/analytics/transcript-scanner.js +149 -0
  89. package/dist/analytics/transcript-scanner.js.map +1 -0
  90. package/dist/analytics/transcript-token-extractor.d.ts +35 -0
  91. package/dist/analytics/transcript-token-extractor.d.ts.map +1 -0
  92. package/dist/analytics/transcript-token-extractor.js +136 -0
  93. package/dist/analytics/transcript-token-extractor.js.map +1 -0
  94. package/dist/analytics/types.d.ts +65 -0
  95. package/dist/analytics/types.d.ts.map +1 -1
  96. package/dist/analytics/types.js.map +1 -1
  97. package/dist/cli/analytics.js +26 -1
  98. package/dist/cli/analytics.js.map +1 -1
  99. package/dist/cli/commands/backfill.d.ts +15 -0
  100. package/dist/cli/commands/backfill.d.ts.map +1 -0
  101. package/dist/cli/commands/backfill.js +146 -0
  102. package/dist/cli/commands/backfill.js.map +1 -0
  103. package/dist/cli/commands/stats.d.ts +1 -0
  104. package/dist/cli/commands/stats.d.ts.map +1 -1
  105. package/dist/cli/commands/stats.js +67 -31
  106. package/dist/cli/commands/stats.js.map +1 -1
  107. package/dist/cli/components/CostDashboard.d.ts +15 -0
  108. package/dist/cli/components/CostDashboard.d.ts.map +1 -0
  109. package/dist/cli/components/CostDashboard.js +15 -0
  110. package/dist/cli/components/CostDashboard.js.map +1 -0
  111. package/dist/cli/components/LiveStats.d.ts +16 -0
  112. package/dist/cli/components/LiveStats.d.ts.map +1 -0
  113. package/dist/cli/components/LiveStats.js +16 -0
  114. package/dist/cli/components/LiveStats.js.map +1 -0
  115. package/dist/cli/components/SessionBrowser.d.ts +14 -0
  116. package/dist/cli/components/SessionBrowser.d.ts.map +1 -0
  117. package/dist/cli/components/SessionBrowser.js +14 -0
  118. package/dist/cli/components/SessionBrowser.js.map +1 -0
  119. package/dist/cli/index.js +159 -3
  120. package/dist/cli/index.js.map +1 -1
  121. package/dist/cli/tui.d.ts +21 -0
  122. package/dist/cli/tui.d.ts.map +1 -0
  123. package/dist/cli/tui.js +21 -0
  124. package/dist/cli/tui.js.map +1 -0
  125. package/dist/hooks/learner/auto-invoke.d.ts +82 -0
  126. package/dist/hooks/learner/auto-invoke.d.ts.map +1 -0
  127. package/dist/hooks/learner/auto-invoke.js +234 -0
  128. package/dist/hooks/learner/auto-invoke.js.map +1 -0
  129. package/dist/hooks/learner/auto-learner.d.ts +55 -0
  130. package/dist/hooks/learner/auto-learner.d.ts.map +1 -0
  131. package/dist/hooks/learner/auto-learner.js +361 -0
  132. package/dist/hooks/learner/auto-learner.js.map +1 -0
  133. package/dist/hooks/learner/index.d.ts +3 -0
  134. package/dist/hooks/learner/index.d.ts.map +1 -1
  135. package/dist/hooks/learner/index.js +4 -0
  136. package/dist/hooks/learner/index.js.map +1 -1
  137. package/dist/hooks/learner/matcher.d.ts +40 -0
  138. package/dist/hooks/learner/matcher.d.ts.map +1 -0
  139. package/dist/hooks/learner/matcher.js +230 -0
  140. package/dist/hooks/learner/matcher.js.map +1 -0
  141. package/dist/hud/analytics-display.d.ts +16 -0
  142. package/dist/hud/analytics-display.d.ts.map +1 -1
  143. package/dist/hud/analytics-display.js +42 -0
  144. package/dist/hud/analytics-display.js.map +1 -1
  145. package/dist/hud/index.js +90 -3
  146. package/dist/hud/index.js.map +1 -1
  147. package/dist/hud/render.d.ts.map +1 -1
  148. package/dist/hud/render.js +27 -1
  149. package/dist/hud/render.js.map +1 -1
  150. package/dist/hud/types.d.ts +2 -0
  151. package/dist/hud/types.d.ts.map +1 -1
  152. package/dist/hud/types.js.map +1 -1
  153. package/docs/ANALYTICS-SYSTEM.md +150 -0
  154. package/hooks/keyword-detector.sh +1 -1
  155. package/package.json +1 -1
  156. package/scripts/keyword-detector.mjs +1 -1
  157. package/scripts/persistent-mode.mjs +1 -1
  158. package/scripts/test-mutual-exclusion.ts +4 -4
  159. package/scripts/test-remember-tags.ts +6 -6
  160. package/scripts/test-session-injection.ts +4 -4
  161. package/skills/cancel-ultraqa/SKILL.md +1 -1
  162. package/skills/local-skills-setup/SKILL.md +465 -0
  163. package/skills/omc-setup/SKILL.md +30 -5
  164. package/skills/skill/SKILL.md +406 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-learner.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/learner/auto-learner.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,507 @@
1
+ /**
2
+ * Auto-Learner Module Tests
3
+ *
4
+ * Comprehensive QA tests for the auto-learner module.
5
+ */
6
+ import { describe, it, expect, beforeEach } from 'vitest';
7
+ import { initAutoLearner, recordPattern, extractTriggers, calculateSkillWorthiness, getSuggestedSkills, } from '../../hooks/learner/auto-learner.js';
8
+ describe('Auto-Learner Module', () => {
9
+ // Test Case 1: State Initialization
10
+ describe('1. State Initialization', () => {
11
+ it('initAutoLearner creates correct initial state', () => {
12
+ const state = initAutoLearner('test-session-123');
13
+ expect(state).toBeDefined();
14
+ expect(state.sessionId).toBe('test-session-123');
15
+ expect(state.patterns).toBeInstanceOf(Map);
16
+ expect(state.suggestedSkills).toBeInstanceOf(Array);
17
+ });
18
+ it('verifies empty patterns map', () => {
19
+ const state = initAutoLearner('test-session');
20
+ expect(state.patterns.size).toBe(0);
21
+ });
22
+ it('verifies empty suggestedSkills array', () => {
23
+ const state = initAutoLearner('test-session');
24
+ expect(state.suggestedSkills).toHaveLength(0);
25
+ });
26
+ });
27
+ // Test Case 2: Pattern Recording
28
+ describe('2. Pattern Recording', () => {
29
+ let state;
30
+ beforeEach(() => {
31
+ state = initAutoLearner('test-session');
32
+ });
33
+ it('recordPattern records a valid problem-solution pair', () => {
34
+ const problem = 'TypeError: Cannot read properties of undefined when accessing user.name';
35
+ const solution = 'Check if user object exists before accessing properties. Use optional chaining: user?.name';
36
+ const pattern = recordPattern(state, problem, solution);
37
+ expect(pattern).not.toBeNull();
38
+ expect(pattern.problem).toBe(problem);
39
+ expect(pattern.solution).toBe(solution);
40
+ expect(pattern.occurrences).toBe(1);
41
+ });
42
+ it('content hashing provides deduplication', () => {
43
+ const problem = 'Error: Module not found';
44
+ const solution = 'Install the missing dependency with npm install package-name';
45
+ // Record same pattern twice
46
+ const pattern1 = recordPattern(state, problem, solution);
47
+ const pattern2 = recordPattern(state, problem, solution);
48
+ // Should be the same pattern
49
+ expect(pattern1.id).toBe(pattern2.id);
50
+ // Should only have one entry in the map
51
+ expect(state.patterns.size).toBe(1);
52
+ });
53
+ it('occurrence counting increments on duplicate patterns', () => {
54
+ const problem = 'Error: ENOENT: no such file or directory';
55
+ const solution = 'The file path is incorrect. Verify the path exists or create the directory first.';
56
+ recordPattern(state, problem, solution);
57
+ const pattern = recordPattern(state, problem, solution);
58
+ expect(pattern.occurrences).toBe(2);
59
+ });
60
+ it('records multiple different patterns separately', () => {
61
+ recordPattern(state, 'Error: Module not found react', 'Install react with: npm install react');
62
+ recordPattern(state, 'TypeError: undefined is not a function', 'Check if the function exists before calling it');
63
+ expect(state.patterns.size).toBe(2);
64
+ });
65
+ });
66
+ // Test Case 3: Trigger Extraction
67
+ describe('3. Trigger Extraction', () => {
68
+ it('extractTriggers extracts error messages', () => {
69
+ const problem = 'Got this error: TypeError: Cannot read properties of undefined';
70
+ const solution = 'Check for null/undefined values';
71
+ const triggers = extractTriggers(problem, solution);
72
+ expect(triggers.some(t => t.toLowerCase().includes('cannot read'))).toBe(true);
73
+ });
74
+ it('extractTriggers extracts file paths', () => {
75
+ const problem = 'Issue in src/components/Button.tsx when rendering';
76
+ const solution = 'Fixed the import path in the component';
77
+ const triggers = extractTriggers(problem, solution);
78
+ expect(triggers.some(t => t.includes('Button.tsx'))).toBe(true);
79
+ });
80
+ it('extractTriggers extracts technical terms', () => {
81
+ const problem = 'The React component does not render properly in TypeScript';
82
+ const solution = 'Add proper type annotations for the props interface';
83
+ const triggers = extractTriggers(problem, solution);
84
+ // Should extract capitalized terms like React or TypeScript
85
+ const hasReact = triggers.some(t => t.toLowerCase() === 'react');
86
+ const hasTypeScript = triggers.some(t => t.toLowerCase() === 'typescript');
87
+ expect(hasReact || hasTypeScript).toBe(true);
88
+ });
89
+ it('extracts high-value keywords when present', () => {
90
+ const problem = 'The application crashed with an error';
91
+ const solution = 'Fixed the bug by adding null checks';
92
+ const triggers = extractTriggers(problem, solution);
93
+ // Should include high-value keywords
94
+ expect(triggers.some(t => ['error', 'crash', 'fix', 'bug'].includes(t.toLowerCase()))).toBe(true);
95
+ });
96
+ it('limits triggers to maximum of 10', () => {
97
+ const problem = `
98
+ Error: Module 'react' not found in /src/components/App.tsx
99
+ Also found TypeError in /src/utils/helper.ts
100
+ SyntaxError: Unexpected token in /src/config/settings.js
101
+ ReferenceError: variable is not defined
102
+ `;
103
+ const solution = `
104
+ Fixed multiple issues in React, TypeScript, JavaScript, Vue, Angular
105
+ Updated Node.js configuration and Python scripts
106
+ Resolved Rust and Go compilation errors
107
+ `;
108
+ const triggers = extractTriggers(problem, solution);
109
+ expect(triggers.length).toBeLessThanOrEqual(10);
110
+ });
111
+ });
112
+ // Test Case 4: Skill Worthiness Scoring
113
+ describe('4. Skill Worthiness Scoring', () => {
114
+ it('calculateSkillWorthiness returns score in valid range', () => {
115
+ const pattern = {
116
+ id: 'test-1',
117
+ problem: 'Error: Cannot connect to database',
118
+ solution: 'Check database connection string and ensure the server is running',
119
+ confidence: 0,
120
+ occurrences: 1,
121
+ firstSeen: Date.now(),
122
+ lastSeen: Date.now(),
123
+ suggestedTriggers: ['error', 'database'],
124
+ suggestedTags: ['debugging'],
125
+ };
126
+ const score = calculateSkillWorthiness(pattern);
127
+ expect(score).toBeGreaterThanOrEqual(0);
128
+ expect(score).toBeLessThanOrEqual(100);
129
+ });
130
+ it('high-value keywords boost the score', () => {
131
+ const basePattern = {
132
+ id: 'test-base',
133
+ problem: 'Issue with the component rendering',
134
+ solution: 'Updated the state management logic in the component to properly handle updates',
135
+ confidence: 0,
136
+ occurrences: 1,
137
+ firstSeen: Date.now(),
138
+ lastSeen: Date.now(),
139
+ suggestedTriggers: ['component'],
140
+ suggestedTags: [],
141
+ };
142
+ const boostedPattern = {
143
+ id: 'test-boosted',
144
+ problem: 'Error: Crash when component renders, bug in state',
145
+ solution: 'Fixed the bug by adding proper error handling. The workaround was to use a try-catch block.',
146
+ confidence: 0,
147
+ occurrences: 1,
148
+ firstSeen: Date.now(),
149
+ lastSeen: Date.now(),
150
+ suggestedTriggers: ['error', 'crash', 'fix', 'bug', 'workaround'],
151
+ suggestedTags: ['debugging'],
152
+ };
153
+ const baseScore = calculateSkillWorthiness(basePattern);
154
+ const boostedScore = calculateSkillWorthiness(boostedPattern);
155
+ expect(boostedScore).toBeGreaterThan(baseScore);
156
+ });
157
+ it('generic patterns receive penalties', () => {
158
+ const specificPattern = {
159
+ id: 'test-specific',
160
+ problem: 'Error: ECONNREFUSED when connecting to localhost:5432 in /src/db/connection.ts',
161
+ solution: 'The PostgreSQL server was not running. Start it with: sudo systemctl start postgresql',
162
+ confidence: 0,
163
+ occurrences: 1,
164
+ firstSeen: Date.now(),
165
+ lastSeen: Date.now(),
166
+ suggestedTriggers: ['error', 'postgresql', 'connection.ts'],
167
+ suggestedTags: ['database'],
168
+ };
169
+ const genericPattern = {
170
+ id: 'test-generic',
171
+ problem: 'Something is not working correctly in the app',
172
+ solution: 'Try again after restarting. Check the docs and google it if problem persists. Look at the error message.',
173
+ confidence: 0,
174
+ occurrences: 1,
175
+ firstSeen: Date.now(),
176
+ lastSeen: Date.now(),
177
+ suggestedTriggers: [],
178
+ suggestedTags: [],
179
+ };
180
+ const specificScore = calculateSkillWorthiness(specificPattern);
181
+ const genericScore = calculateSkillWorthiness(genericPattern);
182
+ expect(specificScore).toBeGreaterThan(genericScore);
183
+ });
184
+ it('multiple occurrences boost the score', () => {
185
+ const singleOccurrence = {
186
+ id: 'test-single',
187
+ problem: 'Error: Port 3000 already in use',
188
+ solution: 'Kill the process using the port: lsof -ti:3000 | xargs kill -9',
189
+ confidence: 0,
190
+ occurrences: 1,
191
+ firstSeen: Date.now(),
192
+ lastSeen: Date.now(),
193
+ suggestedTriggers: ['error', 'port'],
194
+ suggestedTags: [],
195
+ };
196
+ const multipleOccurrences = {
197
+ ...singleOccurrence,
198
+ id: 'test-multiple',
199
+ occurrences: 5,
200
+ };
201
+ const singleScore = calculateSkillWorthiness(singleOccurrence);
202
+ const multipleScore = calculateSkillWorthiness(multipleOccurrences);
203
+ expect(multipleScore).toBeGreaterThan(singleScore);
204
+ });
205
+ it('longer solutions score higher than very short ones', () => {
206
+ const shortSolution = {
207
+ id: 'test-short',
208
+ problem: 'Error in the application configuration',
209
+ solution: 'Fixed the config file settings.',
210
+ confidence: 0,
211
+ occurrences: 1,
212
+ firstSeen: Date.now(),
213
+ lastSeen: Date.now(),
214
+ suggestedTriggers: ['error'],
215
+ suggestedTags: [],
216
+ };
217
+ const detailedSolution = {
218
+ id: 'test-detailed',
219
+ problem: 'Error in the application configuration loading',
220
+ solution: `The configuration file was missing the required DATABASE_URL environment variable.
221
+ To fix this, add DATABASE_URL=postgresql://user:pass@localhost:5432/dbname to your .env file.
222
+ Also ensure the .env file is in the project root and not gitignored accidentally.
223
+ You can verify with: node -e "console.log(process.env.DATABASE_URL)"`,
224
+ confidence: 0,
225
+ occurrences: 1,
226
+ firstSeen: Date.now(),
227
+ lastSeen: Date.now(),
228
+ suggestedTriggers: ['error', 'configuration'],
229
+ suggestedTags: [],
230
+ };
231
+ const shortScore = calculateSkillWorthiness(shortSolution);
232
+ const detailedScore = calculateSkillWorthiness(detailedSolution);
233
+ expect(detailedScore).toBeGreaterThan(shortScore);
234
+ });
235
+ });
236
+ // Test Case 5: Suggestion Threshold
237
+ describe('5. Suggestion Threshold', () => {
238
+ let state;
239
+ beforeEach(() => {
240
+ state = initAutoLearner('test-session');
241
+ });
242
+ it('getSuggestedSkills filters by threshold', () => {
243
+ // Add a high-quality pattern that should be suggested
244
+ const highQualityProblem = 'Error: ENOENT no such file /src/config/database.ts when loading config';
245
+ const highQualitySolution = `
246
+ The database configuration file was missing. Fixed by:
247
+ 1. Creating the missing config file
248
+ 2. Adding proper TypeScript types for the config
249
+ 3. Setting up environment variable fallbacks
250
+ This resolved the ENOENT error and made the app work properly.
251
+ `;
252
+ // Record it multiple times to boost occurrences
253
+ recordPattern(state, highQualityProblem, highQualitySolution);
254
+ recordPattern(state, highQualityProblem, highQualitySolution);
255
+ recordPattern(state, highQualityProblem, highQualitySolution);
256
+ // Add a low-quality pattern that shouldn't be suggested
257
+ const lowQualityProblem = 'Problem with app';
258
+ const lowQualitySolution = 'Try again or restart';
259
+ recordPattern(state, lowQualityProblem, lowQualitySolution);
260
+ const suggestions = getSuggestedSkills(state, 70);
261
+ // Only high-quality patterns should pass the threshold
262
+ expect(suggestions.every(s => s.confidence >= 70)).toBe(true);
263
+ });
264
+ it('verifies default threshold of 70', () => {
265
+ // Create a pattern that should be around the threshold
266
+ const problem = 'Error: Module react not found in /src/App.tsx';
267
+ const solution = 'Install the missing dependency: npm install react. The fix resolved the import error in the component.';
268
+ // Record multiple times to boost score
269
+ for (let i = 0; i < 3; i++) {
270
+ recordPattern(state, problem, solution);
271
+ }
272
+ // Get suggestions with default threshold (70)
273
+ const suggestions = getSuggestedSkills(state);
274
+ // All returned suggestions should meet the default threshold
275
+ suggestions.forEach(s => {
276
+ expect(s.confidence).toBeGreaterThanOrEqual(70);
277
+ });
278
+ });
279
+ it('higher threshold returns fewer suggestions', () => {
280
+ // Add multiple patterns with varying quality
281
+ const patterns = [
282
+ {
283
+ problem: 'Error: ENOENT crash reading /src/db/config.ts - bug in loader',
284
+ solution: 'Fixed the bug by creating the missing configuration file. Added workaround for path resolution. The solution involved proper error handling.',
285
+ },
286
+ {
287
+ problem: 'Error: Connection failed to database server',
288
+ solution: 'Verified the database server was running and fixed the connection string configuration.',
289
+ },
290
+ {
291
+ problem: 'Warning: Component missing key prop',
292
+ solution: 'Added unique key prop to list items in the React component.',
293
+ },
294
+ ];
295
+ patterns.forEach(p => {
296
+ recordPattern(state, p.problem, p.solution);
297
+ recordPattern(state, p.problem, p.solution); // Record twice for boost
298
+ });
299
+ const lowThresholdSuggestions = getSuggestedSkills(state, 50);
300
+ const highThresholdSuggestions = getSuggestedSkills(state, 90);
301
+ expect(lowThresholdSuggestions.length).toBeGreaterThanOrEqual(highThresholdSuggestions.length);
302
+ });
303
+ it('returns suggestions sorted by confidence descending', () => {
304
+ // Add patterns with varying quality
305
+ const patterns = [
306
+ {
307
+ problem: 'Error: ENOENT no such file in /src/config.ts - crash',
308
+ solution: 'Fixed by creating missing file and adding proper error handling. The bug was in the loader module.',
309
+ },
310
+ {
311
+ problem: 'TypeError: Cannot read property of undefined in component',
312
+ solution: 'Added null checks before accessing properties.',
313
+ },
314
+ ];
315
+ patterns.forEach(p => {
316
+ for (let i = 0; i < 3; i++) {
317
+ recordPattern(state, p.problem, p.solution);
318
+ }
319
+ });
320
+ const suggestions = getSuggestedSkills(state, 0); // Low threshold to get all
321
+ // Verify sorted by confidence descending
322
+ for (let i = 1; i < suggestions.length; i++) {
323
+ expect(suggestions[i - 1].confidence).toBeGreaterThanOrEqual(suggestions[i].confidence);
324
+ }
325
+ });
326
+ });
327
+ // Test Case 6: Edge Cases
328
+ describe('6. Edge Cases', () => {
329
+ let state;
330
+ beforeEach(() => {
331
+ state = initAutoLearner('test-session');
332
+ });
333
+ it('handles empty problem string', () => {
334
+ const result = recordPattern(state, '', 'Some solution text here for testing');
335
+ expect(result).toBeNull();
336
+ });
337
+ it('handles empty solution string', () => {
338
+ const result = recordPattern(state, 'Error: Some problem occurred', '');
339
+ expect(result).toBeNull();
340
+ });
341
+ it('handles both empty problem and solution', () => {
342
+ const result = recordPattern(state, '', '');
343
+ expect(result).toBeNull();
344
+ });
345
+ it('handles very short content (below minimum)', () => {
346
+ const result = recordPattern(state, 'Short', 'Also short');
347
+ expect(result).toBeNull();
348
+ });
349
+ it('handles whitespace-only input', () => {
350
+ const result = recordPattern(state, ' \n\t ', ' \n\t ');
351
+ expect(result).toBeNull();
352
+ });
353
+ it('extracts no triggers from generic text', () => {
354
+ const triggers = extractTriggers('something happened', 'did something to fix it');
355
+ // May still extract some keywords but should be minimal
356
+ expect(triggers.length).toBeLessThanOrEqual(10);
357
+ });
358
+ it('handles null/undefined gracefully in recordPattern', () => {
359
+ // TypeScript would normally prevent this, but test runtime behavior
360
+ const result1 = recordPattern(state, null, 'solution');
361
+ const result2 = recordPattern(state, 'problem', undefined);
362
+ expect(result1).toBeNull();
363
+ expect(result2).toBeNull();
364
+ });
365
+ it('handles special characters in problem/solution', () => {
366
+ const problem = 'Error: Path contains special chars: /path/to/file<>:"|?*.ts';
367
+ const solution = 'Escape or remove special characters: path.replace(/[<>:"|?*]/g, "_")';
368
+ const pattern = recordPattern(state, problem, solution);
369
+ expect(pattern).not.toBeNull();
370
+ expect(pattern.problem).toContain('special chars');
371
+ });
372
+ it('handles Unicode content', () => {
373
+ const problem = 'Error: 文件未找到 - File not found in 日本語パス/コンポーネント.tsx';
374
+ const solution = 'The file path contained CJK characters. Fixed by using proper encoding.';
375
+ const pattern = recordPattern(state, problem, solution);
376
+ expect(pattern).not.toBeNull();
377
+ });
378
+ it('handles extremely long content', () => {
379
+ const longProblem = 'Error: ' + 'A'.repeat(5000);
380
+ const longSolution = 'Fix: ' + 'B'.repeat(5000);
381
+ const pattern = recordPattern(state, longProblem, longSolution);
382
+ expect(pattern).not.toBeNull();
383
+ expect(pattern.id).toBeDefined();
384
+ });
385
+ it('pattern with no extractable triggers gets penalty', () => {
386
+ const pattern = {
387
+ id: 'test-no-triggers',
388
+ problem: 'Something went wrong somewhere.',
389
+ solution: 'Did some things to make it better.',
390
+ confidence: 0,
391
+ occurrences: 1,
392
+ firstSeen: Date.now(),
393
+ lastSeen: Date.now(),
394
+ suggestedTriggers: [], // No triggers
395
+ suggestedTags: [],
396
+ };
397
+ const score = calculateSkillWorthiness(pattern);
398
+ // Should have penalty for missing triggers (base 50 - 25 penalty - 20 short content = ~5)
399
+ expect(score).toBeLessThan(50);
400
+ });
401
+ });
402
+ // Test Case 7: Integration - Full Workflow
403
+ describe('7. Integration - Full Workflow', () => {
404
+ it('complete workflow from init to suggestions', () => {
405
+ // Initialize
406
+ const state = initAutoLearner('integration-test-session');
407
+ expect(state.patterns.size).toBe(0);
408
+ // Record high-quality pattern multiple times
409
+ const problem = 'Error: ECONNREFUSED connecting to localhost:5432 in /src/db/client.ts';
410
+ const solution = `
411
+ The PostgreSQL database server was not running. Fixed by:
412
+ 1. Starting the database: sudo systemctl start postgresql
413
+ 2. Verifying connection: psql -U postgres -c "SELECT 1"
414
+ 3. Updated connection retry logic in the application
415
+ This error commonly occurs after system restart.
416
+ `;
417
+ recordPattern(state, problem, solution);
418
+ expect(state.patterns.size).toBe(1);
419
+ recordPattern(state, problem, solution);
420
+ const pattern = Array.from(state.patterns.values())[0];
421
+ expect(pattern.occurrences).toBe(2);
422
+ // Get suggestions
423
+ const suggestions = getSuggestedSkills(state, 60);
424
+ // Should have at least one suggestion if quality is high enough
425
+ if (suggestions.length > 0) {
426
+ expect(suggestions[0].problem).toBe(problem.trim());
427
+ expect(suggestions[0].suggestedTriggers.length).toBeGreaterThan(0);
428
+ }
429
+ });
430
+ });
431
+ });
432
+ // Additional Security Tests
433
+ describe('Security Tests', () => {
434
+ let state;
435
+ beforeEach(() => {
436
+ state = initAutoLearner('security-test');
437
+ });
438
+ it('does not expose hash internals in pattern ID', () => {
439
+ const pattern = recordPattern(state, 'Error: sensitive database password issue in /etc/passwd', 'Fixed by updating the credentials in the config file');
440
+ // Pattern ID should be a truncated hash, not exposing content
441
+ expect(pattern.id.length).toBe(16); // SHA-256 truncated to 16 hex chars
442
+ expect(pattern.id).not.toContain('password');
443
+ expect(pattern.id).not.toContain('passwd');
444
+ });
445
+ it('handles injection-like content safely', () => {
446
+ const problem = 'Error: SQL injection detected: \'; DROP TABLE users; --';
447
+ const solution = 'Use parameterized queries: db.query("SELECT * FROM users WHERE id = $1", [userId])';
448
+ const pattern = recordPattern(state, problem, solution);
449
+ expect(pattern).not.toBeNull();
450
+ // Content is stored as-is (not evaluated), which is safe for a data structure
451
+ expect(pattern.problem).toContain('DROP TABLE');
452
+ });
453
+ it('handles path traversal strings safely', () => {
454
+ const problem = 'Error reading file: ../../../etc/shadow';
455
+ const solution = 'Validate and sanitize file paths before reading';
456
+ const pattern = recordPattern(state, problem, solution);
457
+ // Pattern is stored, not executed
458
+ expect(pattern).not.toBeNull();
459
+ expect(pattern.problem).toContain('../../../etc/shadow');
460
+ });
461
+ it('handles prototype pollution attempt in content', () => {
462
+ const problem = 'Error: __proto__.polluted = true causes issues';
463
+ const solution = 'Use Object.create(null) or Map instead of plain objects';
464
+ const pattern = recordPattern(state, problem, solution);
465
+ expect(pattern).not.toBeNull();
466
+ // Verify Map-based storage is safe from prototype pollution
467
+ expect(state.patterns.__proto__).not.toHaveProperty('polluted');
468
+ });
469
+ });
470
+ // Performance Tests
471
+ describe('Performance Tests', () => {
472
+ it('handles 1000 patterns without significant slowdown', () => {
473
+ const state = initAutoLearner('perf-test');
474
+ const start = Date.now();
475
+ for (let i = 0; i < 1000; i++) {
476
+ recordPattern(state, `Error number ${i}: Something failed in /src/file${i}.ts`, `Fixed error ${i} by applying the correct solution with proper error handling and verification`);
477
+ }
478
+ const elapsed = Date.now() - start;
479
+ expect(state.patterns.size).toBe(1000);
480
+ // Should complete within 5 seconds even on slow machines
481
+ expect(elapsed).toBeLessThan(5000);
482
+ });
483
+ it('deduplication with 1000 identical patterns is efficient', () => {
484
+ const state = initAutoLearner('dedup-perf-test');
485
+ const start = Date.now();
486
+ for (let i = 0; i < 1000; i++) {
487
+ recordPattern(state, 'Error: The same error occurs every time in /src/main.ts', 'Apply the same fix: restart the server and check the configuration');
488
+ }
489
+ const elapsed = Date.now() - start;
490
+ // Should still only have 1 pattern
491
+ expect(state.patterns.size).toBe(1);
492
+ // Pattern should have 1000 occurrences
493
+ const pattern = Array.from(state.patterns.values())[0];
494
+ expect(pattern.occurrences).toBe(1000);
495
+ // Should be fast since it's just incrementing
496
+ expect(elapsed).toBeLessThan(3000);
497
+ });
498
+ it('extractTriggers handles very large text efficiently', () => {
499
+ const largeText = 'Error: ' + 'word '.repeat(10000);
500
+ const start = Date.now();
501
+ const triggers = extractTriggers(largeText, 'solution text');
502
+ const elapsed = Date.now() - start;
503
+ expect(elapsed).toBeLessThan(2000);
504
+ expect(triggers.length).toBeLessThanOrEqual(10);
505
+ });
506
+ });
507
+ //# sourceMappingURL=auto-learner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-learner.test.js","sourceRoot":"","sources":["../../../src/__tests__/learner/auto-learner.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=matcher.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matcher.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/learner/matcher.test.ts"],"names":[],"mappings":""}