olympus-ai 3.2.3 → 3.3.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 (126) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/dist/__tests__/ascent-checkpoint.test.d.ts +2 -0
  3. package/dist/__tests__/ascent-checkpoint.test.d.ts.map +1 -0
  4. package/dist/__tests__/ascent-checkpoint.test.js +261 -0
  5. package/dist/__tests__/ascent-checkpoint.test.js.map +1 -0
  6. package/dist/__tests__/config-ascent.test.d.ts +2 -0
  7. package/dist/__tests__/config-ascent.test.d.ts.map +1 -0
  8. package/dist/__tests__/config-ascent.test.js +134 -0
  9. package/dist/__tests__/config-ascent.test.js.map +1 -0
  10. package/dist/__tests__/hook-blocking.test.d.ts +8 -0
  11. package/dist/__tests__/hook-blocking.test.d.ts.map +1 -0
  12. package/dist/__tests__/hook-blocking.test.js +277 -0
  13. package/dist/__tests__/hook-blocking.test.js.map +1 -0
  14. package/dist/__tests__/installer.test.js +1 -1
  15. package/dist/__tests__/metrics-cli.test.d.ts +5 -0
  16. package/dist/__tests__/metrics-cli.test.d.ts.map +1 -0
  17. package/dist/__tests__/metrics-cli.test.js +24 -0
  18. package/dist/__tests__/metrics-cli.test.js.map +1 -0
  19. package/dist/__tests__/skill-auto-detection.test.d.ts +2 -0
  20. package/dist/__tests__/skill-auto-detection.test.d.ts.map +1 -0
  21. package/dist/__tests__/skill-auto-detection.test.js +255 -0
  22. package/dist/__tests__/skill-auto-detection.test.js.map +1 -0
  23. package/dist/__tests__/token-estimator.test.d.ts +5 -0
  24. package/dist/__tests__/token-estimator.test.d.ts.map +1 -0
  25. package/dist/__tests__/token-estimator.test.js +192 -0
  26. package/dist/__tests__/token-estimator.test.js.map +1 -0
  27. package/dist/agents/definitions.d.ts.map +1 -1
  28. package/dist/agents/definitions.js +83 -1
  29. package/dist/agents/definitions.js.map +1 -1
  30. package/dist/agents/document-writer.d.ts.map +1 -1
  31. package/dist/agents/document-writer.js +38 -0
  32. package/dist/agents/document-writer.js.map +1 -1
  33. package/dist/agents/frontend-engineer.d.ts.map +1 -1
  34. package/dist/agents/frontend-engineer.js +16 -0
  35. package/dist/agents/frontend-engineer.js.map +1 -1
  36. package/dist/agents/olympian.d.ts.map +1 -1
  37. package/dist/agents/olympian.js +15 -0
  38. package/dist/agents/olympian.js.map +1 -1
  39. package/dist/cli/commands/metrics.d.ts +31 -0
  40. package/dist/cli/commands/metrics.d.ts.map +1 -0
  41. package/dist/cli/commands/metrics.js +266 -0
  42. package/dist/cli/commands/metrics.js.map +1 -0
  43. package/dist/cli/index.js +39 -0
  44. package/dist/cli/index.js.map +1 -1
  45. package/dist/config/loader.d.ts.map +1 -1
  46. package/dist/config/loader.js +16 -0
  47. package/dist/config/loader.js.map +1 -1
  48. package/dist/features/ascent-checkpoint/index.d.ts +48 -0
  49. package/dist/features/ascent-checkpoint/index.d.ts.map +1 -0
  50. package/dist/features/ascent-checkpoint/index.js +144 -0
  51. package/dist/features/ascent-checkpoint/index.js.map +1 -0
  52. package/dist/features/hook-logging/index.d.ts +37 -0
  53. package/dist/features/hook-logging/index.d.ts.map +1 -0
  54. package/dist/features/hook-logging/index.js +120 -0
  55. package/dist/features/hook-logging/index.js.map +1 -0
  56. package/dist/features/hook-logging/index.test.d.ts +5 -0
  57. package/dist/features/hook-logging/index.test.d.ts.map +1 -0
  58. package/dist/features/hook-logging/index.test.js +268 -0
  59. package/dist/features/hook-logging/index.test.js.map +1 -0
  60. package/dist/features/index.d.ts +3 -0
  61. package/dist/features/index.d.ts.map +1 -1
  62. package/dist/features/index.js +8 -0
  63. package/dist/features/index.js.map +1 -1
  64. package/dist/features/magic-keywords.d.ts +51 -0
  65. package/dist/features/magic-keywords.d.ts.map +1 -1
  66. package/dist/features/magic-keywords.js +172 -0
  67. package/dist/features/magic-keywords.js.map +1 -1
  68. package/dist/features/session-state/index.d.ts +50 -0
  69. package/dist/features/session-state/index.d.ts.map +1 -0
  70. package/dist/features/session-state/index.js +64 -0
  71. package/dist/features/session-state/index.js.map +1 -0
  72. package/dist/features/session-state/index.test.d.ts +5 -0
  73. package/dist/features/session-state/index.test.d.ts.map +1 -0
  74. package/dist/features/session-state/index.test.js +221 -0
  75. package/dist/features/session-state/index.test.js.map +1 -0
  76. package/dist/features/token-metrics/index.d.ts +6 -0
  77. package/dist/features/token-metrics/index.d.ts.map +1 -0
  78. package/dist/features/token-metrics/index.js +5 -0
  79. package/dist/features/token-metrics/index.js.map +1 -0
  80. package/dist/features/token-metrics/storage.d.ts +16 -0
  81. package/dist/features/token-metrics/storage.d.ts.map +1 -0
  82. package/dist/features/token-metrics/storage.js +144 -0
  83. package/dist/features/token-metrics/storage.js.map +1 -0
  84. package/dist/features/token-metrics/token-estimator.d.ts +66 -0
  85. package/dist/features/token-metrics/token-estimator.d.ts.map +1 -0
  86. package/dist/features/token-metrics/token-estimator.js +230 -0
  87. package/dist/features/token-metrics/token-estimator.js.map +1 -0
  88. package/dist/features/token-metrics/types.d.ts +63 -0
  89. package/dist/features/token-metrics/types.d.ts.map +1 -0
  90. package/dist/features/token-metrics/types.js +5 -0
  91. package/dist/features/token-metrics/types.js.map +1 -0
  92. package/dist/hooks/olympus-orchestrator/constants.d.ts +2 -0
  93. package/dist/hooks/olympus-orchestrator/constants.d.ts.map +1 -1
  94. package/dist/hooks/olympus-orchestrator/constants.js +41 -0
  95. package/dist/hooks/olympus-orchestrator/constants.js.map +1 -1
  96. package/dist/hooks/olympus-orchestrator/index.d.ts +10 -1
  97. package/dist/hooks/olympus-orchestrator/index.d.ts.map +1 -1
  98. package/dist/hooks/olympus-orchestrator/index.js +108 -14
  99. package/dist/hooks/olympus-orchestrator/index.js.map +1 -1
  100. package/dist/hooks/registrations/index.d.ts +2 -1
  101. package/dist/hooks/registrations/index.d.ts.map +1 -1
  102. package/dist/hooks/registrations/index.js +3 -1
  103. package/dist/hooks/registrations/index.js.map +1 -1
  104. package/dist/hooks/registrations/token-metrics.d.ts +11 -0
  105. package/dist/hooks/registrations/token-metrics.d.ts.map +1 -0
  106. package/dist/hooks/registrations/token-metrics.js +119 -0
  107. package/dist/hooks/registrations/token-metrics.js.map +1 -0
  108. package/dist/installer/index.d.ts +1 -1
  109. package/dist/installer/index.d.ts.map +1 -1
  110. package/dist/installer/index.js +334 -9
  111. package/dist/installer/index.js.map +1 -1
  112. package/dist/shared/types.d.ts +16 -0
  113. package/dist/shared/types.d.ts.map +1 -1
  114. package/package.json +3 -3
  115. package/scripts/.olympus/token-metrics.jsonl +1 -0
  116. package/scripts/dist/hooks/olympus-hooks.cjs +127 -128
  117. package/scripts/esbuild.hooks.mjs +1 -1
  118. package/.claude/CLAUDE.md +0 -66
  119. package/scripts/generate-logo-hybrid-v2.mjs +0 -213
  120. package/scripts/generate-logo-hybrid.mjs +0 -209
  121. package/scripts/generate-logo-infinity.mjs +0 -239
  122. package/scripts/generate-logo-mythology.mjs +0 -190
  123. package/scripts/generate-logo-orchestration.mjs +0 -228
  124. package/scripts/generate-logo-recraft.mjs +0 -147
  125. package/scripts/generate-logo-simple.mjs +0 -154
  126. package/scripts/generate-logo.mjs +0 -117
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Integration Tests for Hook Blocking System
3
+ *
4
+ * Tests the complete flow: session state tracking, hook blocking logic,
5
+ * and violation logging.
6
+ */
7
+ import { describe, it, expect, beforeEach } from 'vitest';
8
+ import { SessionState } from '../features/session-state/index.js';
9
+ import { processOrchestratorPreTool, isAllowedPath, isTestFile, calculateLinesChanged, } from '../hooks/olympus-orchestrator/index.js';
10
+ describe('Hook Blocking Integration', () => {
11
+ describe('Path Filtering', () => {
12
+ describe('isAllowedPath', () => {
13
+ it('should allow .olympus/ paths', () => {
14
+ expect(isAllowedPath('.olympus/plans/test.md')).toBe(true);
15
+ expect(isAllowedPath('.olympus/logs/violations.jsonl')).toBe(true);
16
+ expect(isAllowedPath('C:\\Users\\project\\.olympus\\file.txt')).toBe(true);
17
+ });
18
+ it('should block non-.olympus/ paths', () => {
19
+ expect(isAllowedPath('src/index.ts')).toBe(false);
20
+ expect(isAllowedPath('package.json')).toBe(false);
21
+ expect(isAllowedPath('README.md')).toBe(false);
22
+ });
23
+ it('should allow empty paths', () => {
24
+ expect(isAllowedPath('')).toBe(true);
25
+ expect(isAllowedPath(undefined)).toBe(true);
26
+ });
27
+ });
28
+ describe('isTestFile', () => {
29
+ it('should recognize test files', () => {
30
+ expect(isTestFile('src/index.test.ts')).toBe(true);
31
+ expect(isTestFile('src/utils.spec.ts')).toBe(true);
32
+ expect(isTestFile('src/__tests__/integration.ts')).toBe(true);
33
+ expect(isTestFile('tests/unit.test.js')).toBe(true);
34
+ });
35
+ it('should not recognize non-test files', () => {
36
+ expect(isTestFile('src/index.ts')).toBe(false);
37
+ expect(isTestFile('src/utils.ts')).toBe(false);
38
+ expect(isTestFile('package.json')).toBe(false);
39
+ });
40
+ it('should handle Windows paths', () => {
41
+ expect(isTestFile('src\\__tests__\\file.ts')).toBe(true);
42
+ expect(isTestFile('C:\\project\\src\\test.spec.ts')).toBe(true);
43
+ });
44
+ it('should handle empty paths', () => {
45
+ expect(isTestFile('')).toBe(false);
46
+ expect(isTestFile(undefined)).toBe(false);
47
+ });
48
+ });
49
+ });
50
+ describe('calculateLinesChanged', () => {
51
+ it('should calculate lines for Edit tool', () => {
52
+ const toolInput = {
53
+ old_string: 'line1\nline2\nline3',
54
+ new_string: 'line1\nline2\nline3\nline4\nline5',
55
+ };
56
+ const lines = calculateLinesChanged('Edit', toolInput);
57
+ expect(lines).toBe(2); // |5 - 3| = 2
58
+ });
59
+ it('should calculate lines for Write tool', () => {
60
+ const toolInput = {
61
+ content: 'line1\nline2\nline3\nline4\nline5',
62
+ };
63
+ const lines = calculateLinesChanged('Write', toolInput);
64
+ expect(lines).toBe(5);
65
+ });
66
+ it('should handle empty input', () => {
67
+ expect(calculateLinesChanged('Edit', {})).toBe(0);
68
+ expect(calculateLinesChanged('Write', {})).toBe(0);
69
+ expect(calculateLinesChanged('Edit', undefined)).toBe(0);
70
+ });
71
+ it('should handle single line', () => {
72
+ const toolInput = {
73
+ old_string: 'line1',
74
+ new_string: 'line1\nline2',
75
+ };
76
+ const lines = calculateLinesChanged('Edit', toolInput);
77
+ expect(lines).toBe(1);
78
+ });
79
+ });
80
+ describe('Verification Edit Detection', () => {
81
+ let sessionState;
82
+ beforeEach(() => {
83
+ sessionState = new SessionState();
84
+ });
85
+ it('should allow small edits on recent task files', () => {
86
+ // Record a task that modified files
87
+ sessionState.recordTaskCompletion({
88
+ timestamp: Date.now(),
89
+ filesModified: ['src/index.ts', 'src/utils.ts'],
90
+ taskId: 'task-1',
91
+ });
92
+ // Small edit should be allowed
93
+ expect(sessionState.isVerificationEdit('src/index.ts', 5)).toBe(true);
94
+ expect(sessionState.isVerificationEdit('src/utils.ts', 9)).toBe(true);
95
+ });
96
+ it('should block large edits on recent task files', () => {
97
+ sessionState.recordTaskCompletion({
98
+ timestamp: Date.now(),
99
+ filesModified: ['src/index.ts'],
100
+ taskId: 'task-1',
101
+ });
102
+ // Large edit should be blocked
103
+ expect(sessionState.isVerificationEdit('src/index.ts', 10)).toBe(false);
104
+ expect(sessionState.isVerificationEdit('src/index.ts', 50)).toBe(false);
105
+ });
106
+ it('should block edits on non-recent files', () => {
107
+ sessionState.recordTaskCompletion({
108
+ timestamp: Date.now(),
109
+ filesModified: ['src/index.ts'],
110
+ taskId: 'task-1',
111
+ });
112
+ // Edit on different file should be blocked
113
+ expect(sessionState.isVerificationEdit('src/other.ts', 5)).toBe(false);
114
+ });
115
+ it('should track files across multiple tasks', () => {
116
+ sessionState.recordTaskCompletion({
117
+ timestamp: 1,
118
+ filesModified: ['file1.ts'],
119
+ taskId: 'task-1',
120
+ });
121
+ sessionState.recordTaskCompletion({
122
+ timestamp: 2,
123
+ filesModified: ['file2.ts'],
124
+ taskId: 'task-2',
125
+ });
126
+ sessionState.recordTaskCompletion({
127
+ timestamp: 3,
128
+ filesModified: ['file3.ts'],
129
+ taskId: 'task-3',
130
+ });
131
+ // All files from last 3 tasks should be tracked
132
+ expect(sessionState.isVerificationEdit('file1.ts', 5)).toBe(true);
133
+ expect(sessionState.isVerificationEdit('file2.ts', 5)).toBe(true);
134
+ expect(sessionState.isVerificationEdit('file3.ts', 5)).toBe(true);
135
+ });
136
+ it('should evict files from old tasks', () => {
137
+ // Record 4 tasks, pushing the first one out
138
+ sessionState.recordTaskCompletion({
139
+ timestamp: 1,
140
+ filesModified: ['old-file.ts'],
141
+ taskId: 'task-1',
142
+ });
143
+ sessionState.recordTaskCompletion({
144
+ timestamp: 2,
145
+ filesModified: ['file2.ts'],
146
+ taskId: 'task-2',
147
+ });
148
+ sessionState.recordTaskCompletion({
149
+ timestamp: 3,
150
+ filesModified: ['file3.ts'],
151
+ taskId: 'task-3',
152
+ });
153
+ sessionState.recordTaskCompletion({
154
+ timestamp: 4,
155
+ filesModified: ['file4.ts'],
156
+ taskId: 'task-4',
157
+ });
158
+ // Old file should no longer be tracked
159
+ expect(sessionState.isVerificationEdit('old-file.ts', 5)).toBe(false);
160
+ // New files should be tracked
161
+ expect(sessionState.isVerificationEdit('file2.ts', 5)).toBe(true);
162
+ expect(sessionState.isVerificationEdit('file3.ts', 5)).toBe(true);
163
+ expect(sessionState.isVerificationEdit('file4.ts', 5)).toBe(true);
164
+ });
165
+ });
166
+ describe('Hard Blocking Scenarios', () => {
167
+ it('should allow .olympus/ path edits', () => {
168
+ const result = processOrchestratorPreTool({
169
+ toolName: 'Edit',
170
+ toolInput: {
171
+ filePath: '.olympus/plans/test.md',
172
+ old_string: 'old',
173
+ new_string: 'new',
174
+ },
175
+ });
176
+ expect(result.continue).toBe(true);
177
+ expect(result.message).toBeUndefined();
178
+ });
179
+ it('should allow test file creation', () => {
180
+ const result = processOrchestratorPreTool({
181
+ toolName: 'Write',
182
+ toolInput: {
183
+ filePath: 'src/__tests__/new-test.test.ts',
184
+ content: 'test content',
185
+ },
186
+ });
187
+ expect(result.continue).toBe(true);
188
+ expect(result.message).toBeUndefined();
189
+ });
190
+ it('should block direct source file edits', () => {
191
+ const result = processOrchestratorPreTool({
192
+ toolName: 'Edit',
193
+ toolInput: {
194
+ filePath: 'src/index.ts',
195
+ old_string: 'old code',
196
+ new_string: 'new code',
197
+ },
198
+ });
199
+ expect(result.continue).toBe(false);
200
+ expect(result.message).toContain('HARD BLOCK');
201
+ expect(result.message).toContain('DELEGATION REQUIRED');
202
+ });
203
+ it('should block Write tool on source files', () => {
204
+ const result = processOrchestratorPreTool({
205
+ toolName: 'Write',
206
+ toolInput: {
207
+ filePath: 'src/new-file.ts',
208
+ content: 'new file content',
209
+ },
210
+ });
211
+ expect(result.continue).toBe(false);
212
+ expect(result.message).toContain('HARD BLOCK');
213
+ });
214
+ it('should allow non-write/edit tools', () => {
215
+ const result = processOrchestratorPreTool({
216
+ toolName: 'Read',
217
+ toolInput: {
218
+ filePath: 'src/index.ts',
219
+ },
220
+ });
221
+ expect(result.continue).toBe(true);
222
+ expect(result.message).toBeUndefined();
223
+ });
224
+ it('should handle missing file path', () => {
225
+ const result = processOrchestratorPreTool({
226
+ toolName: 'Edit',
227
+ toolInput: {},
228
+ });
229
+ expect(result.continue).toBe(true);
230
+ expect(result.message).toBeUndefined();
231
+ });
232
+ });
233
+ describe('Complete Flow', () => {
234
+ it('should block, then allow verification edit after task completion', () => {
235
+ const sessionState = new SessionState();
236
+ // Initial edit attempt should be blocked
237
+ let result = processOrchestratorPreTool({
238
+ toolName: 'Edit',
239
+ toolInput: {
240
+ filePath: 'src/index.ts',
241
+ old_string: 'old',
242
+ new_string: 'new code\nmore code',
243
+ },
244
+ });
245
+ expect(result.continue).toBe(false);
246
+ // Record task completion that modified the file
247
+ sessionState.recordTaskCompletion({
248
+ timestamp: Date.now(),
249
+ filesModified: ['src/index.ts'],
250
+ taskId: 'task-1',
251
+ });
252
+ // Small verification edit should be allowed
253
+ expect(sessionState.isVerificationEdit('src/index.ts', 3)).toBe(true);
254
+ });
255
+ it('should maintain session state across multiple tasks', () => {
256
+ const sessionState = new SessionState();
257
+ // Complete task 1
258
+ sessionState.recordTaskCompletion({
259
+ timestamp: 1,
260
+ filesModified: ['src/components.ts'],
261
+ taskId: 'task-1',
262
+ });
263
+ // Complete task 2
264
+ sessionState.recordTaskCompletion({
265
+ timestamp: 2,
266
+ filesModified: ['src/hooks.ts'],
267
+ taskId: 'task-2',
268
+ });
269
+ // Both files should allow verification edits
270
+ expect(sessionState.isVerificationEdit('src/components.ts', 5)).toBe(true);
271
+ expect(sessionState.isVerificationEdit('src/hooks.ts', 5)).toBe(true);
272
+ // Unrelated file should still be blocked
273
+ expect(sessionState.isVerificationEdit('src/other.ts', 5)).toBe(false);
274
+ });
275
+ });
276
+ });
277
+ //# sourceMappingURL=hook-blocking.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hook-blocking.test.js","sourceRoot":"","sources":["../../src/__tests__/hook-blocking.test.ts"],"names":[],"mappings":"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"}
@@ -231,7 +231,7 @@ describe('Installer Constants', () => {
231
231
  });
232
232
  it('should match package.json version', () => {
233
233
  // This is a runtime check - VERSION should match the package.json
234
- expect(VERSION).toBe('3.2.3');
234
+ expect(VERSION).toBe('3.3.0');
235
235
  });
236
236
  });
237
237
  describe('File Paths', () => {
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Token Metrics CLI Commands Tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=metrics-cli.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-cli.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/metrics-cli.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Token Metrics CLI Commands Tests
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { existsSync } from 'fs';
6
+ import { join } from 'path';
7
+ import { logTokenMetric } from '../features/token-metrics/storage.js';
8
+ describe('Token Metrics CLI Commands', () => {
9
+ it('logTokenMetric creates entry', async () => {
10
+ // Create sample metrics in current directory
11
+ const entry = {
12
+ timestamp: new Date().toISOString(),
13
+ session_id: 'test-session',
14
+ event_type: 'prompt',
15
+ input_tokens: 100,
16
+ output_tokens: 50,
17
+ project_path: process.cwd()
18
+ };
19
+ await logTokenMetric(entry);
20
+ const metricsPath = join(process.cwd(), '.olympus', 'token-metrics.jsonl');
21
+ expect(existsSync(metricsPath)).toBe(true);
22
+ });
23
+ });
24
+ //# sourceMappingURL=metrics-cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-cli.test.js","sourceRoot":"","sources":["../../src/__tests__/metrics-cli.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAGtE,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,6CAA6C;QAC7C,MAAM,KAAK,GAAsB;YAC/B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,UAAU,EAAE,cAAc;YAC1B,UAAU,EAAE,QAAQ;YACpB,YAAY,EAAE,GAAG;YACjB,aAAa,EAAE,EAAE;YACjB,YAAY,EAAE,OAAO,CAAC,GAAG,EAAE;SAC5B,CAAC;QAEF,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;QAE5B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC;QAC3E,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=skill-auto-detection.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-auto-detection.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/skill-auto-detection.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,255 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { detectFrontendUiUx, detectGitMaster, detectAscent, detectSkills } from '../features/magic-keywords.js';
3
+ describe('Skill Auto-Detection', () => {
4
+ describe('detectFrontendUiUx', () => {
5
+ it('should detect frontend work with component + styling', () => {
6
+ expect(detectFrontendUiUx('Create a button component with custom styling')).toBe(true);
7
+ });
8
+ it('should detect UI work with multiple element keywords', () => {
9
+ expect(detectFrontendUiUx('Build a modal dialog with a form input')).toBe(true);
10
+ });
11
+ it('should detect design work with ui + responsive', () => {
12
+ expect(detectFrontendUiUx('Make the ui responsive for mobile devices')).toBe(true);
13
+ });
14
+ it('should NOT detect with single keyword', () => {
15
+ expect(detectFrontendUiUx('Update the button')).toBe(false);
16
+ });
17
+ it('should NOT detect with negative signals (api)', () => {
18
+ expect(detectFrontendUiUx('Create a button component that calls the api')).toBe(false);
19
+ });
20
+ it('should NOT detect with negative signals (backend)', () => {
21
+ expect(detectFrontendUiUx('Design a form that sends data to the backend')).toBe(false);
22
+ });
23
+ it('should NOT detect with negative signals (database)', () => {
24
+ expect(detectFrontendUiUx('Create a modal to display database records')).toBe(false);
25
+ });
26
+ it('should NOT detect with negative signals (server)', () => {
27
+ expect(detectFrontendUiUx('Build a component that connects to the server')).toBe(false);
28
+ });
29
+ it('should NOT detect with negative signals (endpoint)', () => {
30
+ expect(detectFrontendUiUx('Create UI that calls an endpoint')).toBe(false);
31
+ });
32
+ it('should NOT detect with negative signals (query)', () => {
33
+ expect(detectFrontendUiUx('Design a form with database query logic')).toBe(false);
34
+ });
35
+ it('should NOT detect with negative signals (migration)', () => {
36
+ expect(detectFrontendUiUx('Update the UI and run database migration')).toBe(false);
37
+ });
38
+ it('should detect with Tailwind + layout', () => {
39
+ expect(detectFrontendUiUx('Style the layout using Tailwind CSS')).toBe(true);
40
+ });
41
+ it('should detect with navbar + menu', () => {
42
+ expect(detectFrontendUiUx('Create a navbar with dropdown menu')).toBe(true);
43
+ });
44
+ it('should detect with animate + theme', () => {
45
+ expect(detectFrontendUiUx('Add animate effects and apply the theme')).toBe(true);
46
+ });
47
+ it('should detect with card + design', () => {
48
+ expect(detectFrontendUiUx('Design a card component for the dashboard')).toBe(true);
49
+ });
50
+ it('should ignore keywords in code blocks', () => {
51
+ expect(detectFrontendUiUx('Update the file:\n```js\nconst button = "component";\nconst ui = "design";\n```')).toBe(false);
52
+ });
53
+ it('should be case-insensitive', () => {
54
+ expect(detectFrontendUiUx('Create a BUTTON COMPONENT with custom STYLING')).toBe(true);
55
+ });
56
+ });
57
+ describe('detectGitMaster', () => {
58
+ it('should detect refactor keyword', () => {
59
+ expect(detectGitMaster('Refactor the authentication module')).toBe(true);
60
+ });
61
+ it('should detect rename keyword', () => {
62
+ expect(detectGitMaster('Rename the utils folder to helpers')).toBe(true);
63
+ });
64
+ it('should detect reorganize keyword', () => {
65
+ expect(detectGitMaster('Reorganize the project structure')).toBe(true);
66
+ });
67
+ it('should detect migrate keyword', () => {
68
+ expect(detectGitMaster('Migrate to TypeScript')).toBe(true);
69
+ });
70
+ it('should detect restructure keyword', () => {
71
+ expect(detectGitMaster('Restructure the codebase for better organization')).toBe(true);
72
+ });
73
+ it('should detect "move files" phrase', () => {
74
+ expect(detectGitMaster('Move files from src to lib')).toBe(true);
75
+ });
76
+ it('should detect "move file" singular', () => {
77
+ expect(detectGitMaster('Move file to new location')).toBe(true);
78
+ });
79
+ it('should NOT detect unrelated keywords', () => {
80
+ expect(detectGitMaster('Create a new feature')).toBe(false);
81
+ });
82
+ it('should NOT detect keywords in code blocks', () => {
83
+ expect(detectGitMaster('Update code:\n```js\nfunction refactor() {}\n```')).toBe(false);
84
+ });
85
+ it('should be case-insensitive', () => {
86
+ expect(detectGitMaster('REFACTOR the module')).toBe(true);
87
+ });
88
+ });
89
+ describe('detectAscent', () => {
90
+ it('should detect "must complete"', () => {
91
+ expect(detectAscent('You must complete this task')).toBe(true);
92
+ });
93
+ it('should detect "don\'t stop"', () => {
94
+ expect(detectAscent('Don\'t stop until it works')).toBe(true);
95
+ });
96
+ it('should detect "dont stop" (no apostrophe)', () => {
97
+ expect(detectAscent('Dont stop working on this')).toBe(true);
98
+ });
99
+ it('should detect "finish this"', () => {
100
+ expect(detectAscent('Please finish this task')).toBe(true);
101
+ });
102
+ it('should detect "finish it"', () => {
103
+ expect(detectAscent('Finish it completely')).toBe(true);
104
+ });
105
+ it('should detect "finish everything"', () => {
106
+ expect(detectAscent('Finish everything on the list')).toBe(true);
107
+ });
108
+ it('should detect "complete all"', () => {
109
+ expect(detectAscent('Complete all the tasks')).toBe(true);
110
+ });
111
+ it('should detect "complete everything"', () => {
112
+ expect(detectAscent('Complete everything before stopping')).toBe(true);
113
+ });
114
+ it('should detect "until done"', () => {
115
+ expect(detectAscent('Keep working until done')).toBe(true);
116
+ });
117
+ it('should detect "until complete"', () => {
118
+ expect(detectAscent('Continue until complete')).toBe(true);
119
+ });
120
+ it('should detect "until finished"', () => {
121
+ expect(detectAscent('Work until finished')).toBe(true);
122
+ });
123
+ it('should detect "keep going"', () => {
124
+ expect(detectAscent('Keep going until it\'s done')).toBe(true);
125
+ });
126
+ it('should detect "don\'t give up"', () => {
127
+ expect(detectAscent('Don\'t give up on this')).toBe(true);
128
+ });
129
+ it('should detect "dont give up" (no apostrophe)', () => {
130
+ expect(detectAscent('Dont give up')).toBe(true);
131
+ });
132
+ it('should NOT detect "try" (negative pattern)', () => {
133
+ expect(detectAscent('Try to implement this feature')).toBe(false);
134
+ });
135
+ it('should NOT detect "attempt" (negative pattern)', () => {
136
+ expect(detectAscent('Attempt to fix the bug')).toBe(false);
137
+ });
138
+ it('should NOT detect "explore" (negative pattern)', () => {
139
+ expect(detectAscent('Explore the codebase')).toBe(false);
140
+ });
141
+ it('should NOT detect "investigate" (negative pattern)', () => {
142
+ expect(detectAscent('Investigate the issue')).toBe(false);
143
+ });
144
+ it('should NOT detect "check if" (negative pattern)', () => {
145
+ expect(detectAscent('Check if this works')).toBe(false);
146
+ });
147
+ it('should NOT detect "see if" (negative pattern)', () => {
148
+ expect(detectAscent('See if you can fix it')).toBe(false);
149
+ });
150
+ it('should NOT detect unrelated text', () => {
151
+ expect(detectAscent('Create a new feature')).toBe(false);
152
+ });
153
+ it('should NOT detect keywords in code blocks', () => {
154
+ expect(detectAscent('Code:\n```js\nconst msg = "must complete";\n```')).toBe(false);
155
+ });
156
+ it('should be case-insensitive', () => {
157
+ expect(detectAscent('MUST COMPLETE this task')).toBe(true);
158
+ });
159
+ });
160
+ describe('detectSkills', () => {
161
+ it('should detect multiple skills at once', () => {
162
+ const skills = detectSkills('Refactor the button component with new styling and don\'t stop until done');
163
+ expect(skills).toContain('frontend-ui-ux');
164
+ expect(skills).toContain('git-master');
165
+ expect(skills).toContain('ascent');
166
+ expect(skills).toHaveLength(3);
167
+ });
168
+ it('should detect only frontend-ui-ux', () => {
169
+ const skills = detectSkills('Create a modal dialog with form inputs');
170
+ expect(skills).toEqual(['frontend-ui-ux']);
171
+ });
172
+ it('should detect only git-master', () => {
173
+ const skills = detectSkills('Reorganize the folder structure');
174
+ expect(skills).toEqual(['git-master']);
175
+ });
176
+ it('should detect only ascent', () => {
177
+ const skills = detectSkills('Complete all tasks until finished');
178
+ expect(skills).toEqual(['ascent']);
179
+ });
180
+ it('should detect no skills for generic request', () => {
181
+ const skills = detectSkills('Add a new function to utils.ts');
182
+ expect(skills).toEqual([]);
183
+ });
184
+ it('should detect frontend-ui-ux + ascent', () => {
185
+ const skills = detectSkills('Design a beautiful navbar and keep going until perfect');
186
+ expect(skills).toContain('frontend-ui-ux');
187
+ expect(skills).toContain('ascent');
188
+ expect(skills).toHaveLength(2);
189
+ });
190
+ it('should detect git-master + ascent', () => {
191
+ const skills = detectSkills('Refactor the entire codebase and must complete it');
192
+ expect(skills).toContain('git-master');
193
+ expect(skills).toContain('ascent');
194
+ expect(skills).toHaveLength(2);
195
+ });
196
+ it('should respect negative signals (no frontend when backend present)', () => {
197
+ const skills = detectSkills('Create a button component that calls the api endpoint and refactor the code');
198
+ // Should detect git-master but NOT frontend-ui-ux (due to api/endpoint)
199
+ expect(skills).not.toContain('frontend-ui-ux');
200
+ expect(skills).toContain('git-master');
201
+ });
202
+ it('should respect negative patterns for ascent', () => {
203
+ const skills = detectSkills('Try to refactor the code and finish this');
204
+ // Should detect git-master, but NOT ascent (due to "try")
205
+ expect(skills).toContain('git-master');
206
+ expect(skills).not.toContain('ascent');
207
+ });
208
+ it('should return empty array for ambiguous text', () => {
209
+ const skills = detectSkills('Update the file');
210
+ expect(skills).toEqual([]);
211
+ });
212
+ });
213
+ describe('Edge Cases', () => {
214
+ it('should handle empty string', () => {
215
+ expect(detectFrontendUiUx('')).toBe(false);
216
+ expect(detectGitMaster('')).toBe(false);
217
+ expect(detectAscent('')).toBe(false);
218
+ expect(detectSkills('')).toEqual([]);
219
+ });
220
+ it('should handle whitespace-only string', () => {
221
+ expect(detectFrontendUiUx(' \n\t ')).toBe(false);
222
+ expect(detectGitMaster(' \n\t ')).toBe(false);
223
+ expect(detectAscent(' \n\t ')).toBe(false);
224
+ expect(detectSkills(' \n\t ')).toEqual([]);
225
+ });
226
+ it('should handle strings with only code blocks', () => {
227
+ const codeOnly = '```js\nconst button = "component";\nconst ui = "design";\n```';
228
+ expect(detectFrontendUiUx(codeOnly)).toBe(false);
229
+ expect(detectGitMaster(codeOnly)).toBe(false);
230
+ expect(detectAscent(codeOnly)).toBe(false);
231
+ expect(detectSkills(codeOnly)).toEqual([]);
232
+ });
233
+ it('should handle multiple code blocks with text', () => {
234
+ const mixed = 'Create a button ```code here``` and modal ```more code``` with styling';
235
+ expect(detectFrontendUiUx(mixed)).toBe(true);
236
+ });
237
+ it('should handle partial word matches correctly ("trying" does not match "try")', () => {
238
+ // "trying" contains "try" but word boundaries prevent false match
239
+ // "finish this" IS a positive signal, and "trying" doesn't negate it
240
+ // This correctly detects ascent because "finish this" is present
241
+ expect(detectAscent('Finish this by trying harder')).toBe(true);
242
+ });
243
+ it('should reject when "try" appears as complete word', () => {
244
+ // "try" as a complete word should prevent ascent detection
245
+ expect(detectAscent('Try to finish this')).toBe(false);
246
+ });
247
+ it('should handle contractions with and without apostrophes', () => {
248
+ expect(detectAscent('Don\'t stop')).toBe(true);
249
+ expect(detectAscent('Dont stop')).toBe(true);
250
+ expect(detectAscent('Don\'t give up')).toBe(true);
251
+ expect(detectAscent('Dont give up')).toBe(true);
252
+ });
253
+ });
254
+ });
255
+ //# sourceMappingURL=skill-auto-detection.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-auto-detection.test.js","sourceRoot":"","sources":["../../src/__tests__/skill-auto-detection.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for token estimation utilities
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=token-estimator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimator.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/token-estimator.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}