oh-my-claude-sisyphus 3.6.0 → 3.6.2
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/commands/omc-setup.md +3 -3
- package/commands/psm.md +180 -0
- package/commands/release.md +1 -1
- package/dist/__tests__/analytics/transcript-scanner.test.js +69 -27
- package/dist/__tests__/analytics/transcript-scanner.test.js.map +1 -1
- package/dist/__tests__/installer.test.js +2 -1
- package/dist/__tests__/installer.test.js.map +1 -1
- package/dist/analytics/session-manager.d.ts +24 -0
- package/dist/analytics/session-manager.d.ts.map +1 -1
- package/dist/analytics/session-manager.js +98 -9
- package/dist/analytics/session-manager.js.map +1 -1
- package/dist/analytics/transcript-scanner.d.ts +9 -8
- package/dist/analytics/transcript-scanner.d.ts.map +1 -1
- package/dist/analytics/transcript-scanner.js +146 -16
- package/dist/analytics/transcript-scanner.js.map +1 -1
- package/dist/hooks/empty-message-sanitizer/__tests__/index.test.d.ts +2 -0
- package/dist/hooks/empty-message-sanitizer/__tests__/index.test.d.ts.map +1 -0
- package/dist/hooks/empty-message-sanitizer/__tests__/index.test.js +416 -0
- package/dist/hooks/empty-message-sanitizer/__tests__/index.test.js.map +1 -0
- package/dist/hooks/keyword-detector/__tests__/index.test.d.ts +2 -0
- package/dist/hooks/keyword-detector/__tests__/index.test.d.ts.map +1 -0
- package/dist/hooks/keyword-detector/__tests__/index.test.js +427 -0
- package/dist/hooks/keyword-detector/__tests__/index.test.js.map +1 -0
- package/dist/hooks/subagent-tracker/index.d.ts +83 -0
- package/dist/hooks/subagent-tracker/index.d.ts.map +1 -0
- package/dist/hooks/subagent-tracker/index.js +207 -0
- package/dist/hooks/subagent-tracker/index.js.map +1 -0
- package/dist/hooks/think-mode/__tests__/index.test.d.ts +2 -0
- package/dist/hooks/think-mode/__tests__/index.test.d.ts.map +1 -0
- package/dist/hooks/think-mode/__tests__/index.test.js +556 -0
- package/dist/hooks/think-mode/__tests__/index.test.js.map +1 -0
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +8 -0
- package/dist/installer/index.js.map +1 -1
- package/docs/design/project-session-manager.md +1033 -0
- package/package.json +1 -1
- package/skills/omc-setup/SKILL.md +27 -3
- package/skills/project-session-manager/SKILL.md +410 -0
- package/skills/project-session-manager/lib/config.sh +86 -0
- package/skills/project-session-manager/lib/parse.sh +121 -0
- package/skills/project-session-manager/lib/session.sh +132 -0
- package/skills/project-session-manager/lib/tmux.sh +103 -0
- package/skills/project-session-manager/lib/worktree.sh +171 -0
- package/skills/project-session-manager/psm.sh +629 -0
- package/skills/project-session-manager/templates/feature.md +56 -0
- package/skills/project-session-manager/templates/issue-fix.md +57 -0
- package/skills/project-session-manager/templates/pr-review.md +65 -0
- package/skills/project-session-manager/templates/projects.json +19 -0
- package/skills/release/SKILL.md +1 -1
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
+
import {
|
|
3
|
+
// Detector functions
|
|
4
|
+
removeCodeBlocks, detectThinkKeyword, extractPromptText, detectUltrathinkKeyword,
|
|
5
|
+
// Switcher functions
|
|
6
|
+
getHighVariant, isAlreadyHighVariant, getThinkingConfig, getClaudeThinkingConfig, THINKING_CONFIGS,
|
|
7
|
+
// State management
|
|
8
|
+
clearThinkModeState, getThinkModeState, isThinkModeActive, processThinkMode,
|
|
9
|
+
// Hook factory
|
|
10
|
+
createThinkModeHook,
|
|
11
|
+
// Simplified functions
|
|
12
|
+
shouldActivateThinkMode, shouldActivateUltrathink, } from '../index.js';
|
|
13
|
+
describe('think-mode', () => {
|
|
14
|
+
// Clean up state after each test
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
clearThinkModeState('test-session');
|
|
17
|
+
clearThinkModeState('session-1');
|
|
18
|
+
clearThinkModeState('session-2');
|
|
19
|
+
});
|
|
20
|
+
describe('detector - removeCodeBlocks', () => {
|
|
21
|
+
it('should remove fenced code blocks', () => {
|
|
22
|
+
const text = 'Before ```code``` after';
|
|
23
|
+
expect(removeCodeBlocks(text)).toBe('Before after');
|
|
24
|
+
});
|
|
25
|
+
it('should remove multiline fenced code blocks', () => {
|
|
26
|
+
const text = `Hello
|
|
27
|
+
\`\`\`
|
|
28
|
+
think
|
|
29
|
+
\`\`\`
|
|
30
|
+
World`;
|
|
31
|
+
expect(removeCodeBlocks(text)).toBe(`Hello
|
|
32
|
+
|
|
33
|
+
World`);
|
|
34
|
+
});
|
|
35
|
+
it('should remove inline code', () => {
|
|
36
|
+
const text = 'Use `think` command';
|
|
37
|
+
expect(removeCodeBlocks(text)).toBe('Use command');
|
|
38
|
+
});
|
|
39
|
+
it('should handle empty input', () => {
|
|
40
|
+
expect(removeCodeBlocks('')).toBe('');
|
|
41
|
+
});
|
|
42
|
+
it('should return unchanged text without code', () => {
|
|
43
|
+
expect(removeCodeBlocks('regular text')).toBe('regular text');
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe('detector - detectThinkKeyword', () => {
|
|
47
|
+
describe('English keywords', () => {
|
|
48
|
+
it('should detect "think" keyword', () => {
|
|
49
|
+
expect(detectThinkKeyword('think about this')).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
it('should detect "ultrathink" keyword', () => {
|
|
52
|
+
expect(detectThinkKeyword('ultrathink this problem')).toBe(true);
|
|
53
|
+
});
|
|
54
|
+
it('should be case insensitive', () => {
|
|
55
|
+
expect(detectThinkKeyword('THINK about this')).toBe(true);
|
|
56
|
+
expect(detectThinkKeyword('Think carefully')).toBe(true);
|
|
57
|
+
});
|
|
58
|
+
it('should not detect partial matches', () => {
|
|
59
|
+
// "think" should be a word boundary
|
|
60
|
+
expect(detectThinkKeyword('rethinking this')).toBe(false);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe('Multilingual keywords', () => {
|
|
64
|
+
it('should detect Korean "생각"', () => {
|
|
65
|
+
expect(detectThinkKeyword('이것에 대해 생각해주세요')).toBe(true);
|
|
66
|
+
});
|
|
67
|
+
it('should detect Chinese "思考"', () => {
|
|
68
|
+
expect(detectThinkKeyword('请思考这个问题')).toBe(true);
|
|
69
|
+
});
|
|
70
|
+
it('should detect Japanese "考え"', () => {
|
|
71
|
+
expect(detectThinkKeyword('これについて考えてください')).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
it('should detect Russian "думать"', () => {
|
|
74
|
+
expect(detectThinkKeyword('пожалуйста думай')).toBe(true);
|
|
75
|
+
});
|
|
76
|
+
it('should detect Spanish "piensa"', () => {
|
|
77
|
+
expect(detectThinkKeyword('piensa en esto')).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
it('should detect French "penser"', () => {
|
|
80
|
+
expect(detectThinkKeyword('tu dois penser')).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
it('should detect German "denken"', () => {
|
|
83
|
+
expect(detectThinkKeyword('bitte denken Sie')).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
describe('Code block exclusion', () => {
|
|
87
|
+
it('should not detect keyword inside fenced code block', () => {
|
|
88
|
+
expect(detectThinkKeyword('```\nthink\n```')).toBe(false);
|
|
89
|
+
});
|
|
90
|
+
it('should not detect keyword inside inline code', () => {
|
|
91
|
+
expect(detectThinkKeyword('Use `think` command')).toBe(false);
|
|
92
|
+
});
|
|
93
|
+
it('should detect keyword outside code block', () => {
|
|
94
|
+
expect(detectThinkKeyword('think about ```code```')).toBe(true);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
it('should return false for no keywords', () => {
|
|
98
|
+
expect(detectThinkKeyword('regular text here')).toBe(false);
|
|
99
|
+
});
|
|
100
|
+
it('should return false for empty input', () => {
|
|
101
|
+
expect(detectThinkKeyword('')).toBe(false);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('detector - extractPromptText', () => {
|
|
105
|
+
it('should extract text from text parts', () => {
|
|
106
|
+
const parts = [
|
|
107
|
+
{ type: 'text', text: 'Hello' },
|
|
108
|
+
{ type: 'text', text: ' World' },
|
|
109
|
+
];
|
|
110
|
+
expect(extractPromptText(parts)).toBe('Hello World');
|
|
111
|
+
});
|
|
112
|
+
it('should ignore non-text parts', () => {
|
|
113
|
+
const parts = [
|
|
114
|
+
{ type: 'text', text: 'Hello' },
|
|
115
|
+
{ type: 'image' },
|
|
116
|
+
{ type: 'text', text: 'World' },
|
|
117
|
+
];
|
|
118
|
+
expect(extractPromptText(parts)).toBe('HelloWorld');
|
|
119
|
+
});
|
|
120
|
+
it('should handle empty parts array', () => {
|
|
121
|
+
expect(extractPromptText([])).toBe('');
|
|
122
|
+
});
|
|
123
|
+
it('should handle missing text property', () => {
|
|
124
|
+
const parts = [{ type: 'text' }, { type: 'text', text: 'Valid' }];
|
|
125
|
+
expect(extractPromptText(parts)).toBe('Valid');
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
describe('detector - detectUltrathinkKeyword', () => {
|
|
129
|
+
it('should detect ultrathink keyword', () => {
|
|
130
|
+
expect(detectUltrathinkKeyword('ultrathink this')).toBe(true);
|
|
131
|
+
});
|
|
132
|
+
it('should be case insensitive', () => {
|
|
133
|
+
expect(detectUltrathinkKeyword('ULTRATHINK')).toBe(true);
|
|
134
|
+
expect(detectUltrathinkKeyword('UltraThink')).toBe(true);
|
|
135
|
+
});
|
|
136
|
+
it('should not detect just "think"', () => {
|
|
137
|
+
expect(detectUltrathinkKeyword('think about this')).toBe(false);
|
|
138
|
+
});
|
|
139
|
+
it('should not detect in code block', () => {
|
|
140
|
+
expect(detectUltrathinkKeyword('```ultrathink```')).toBe(false);
|
|
141
|
+
});
|
|
142
|
+
it('should return false for empty input', () => {
|
|
143
|
+
expect(detectUltrathinkKeyword('')).toBe(false);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
describe('switcher - getHighVariant', () => {
|
|
147
|
+
describe('Claude models', () => {
|
|
148
|
+
it('should return high variant for claude-sonnet-4-5', () => {
|
|
149
|
+
expect(getHighVariant('claude-sonnet-4-5')).toBe('claude-sonnet-4-5-high');
|
|
150
|
+
});
|
|
151
|
+
it('should return high variant for claude-opus-4-5', () => {
|
|
152
|
+
expect(getHighVariant('claude-opus-4-5')).toBe('claude-opus-4-5-high');
|
|
153
|
+
});
|
|
154
|
+
it('should return high variant for claude-3-5-sonnet', () => {
|
|
155
|
+
expect(getHighVariant('claude-3-5-sonnet')).toBe('claude-3-5-sonnet-high');
|
|
156
|
+
});
|
|
157
|
+
it('should return high variant for claude-3-opus', () => {
|
|
158
|
+
expect(getHighVariant('claude-3-opus')).toBe('claude-3-opus-high');
|
|
159
|
+
});
|
|
160
|
+
it('should handle version with dot notation', () => {
|
|
161
|
+
expect(getHighVariant('claude-sonnet-4.5')).toBe('claude-sonnet-4-5-high');
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
describe('GPT models', () => {
|
|
165
|
+
it('should return high variant for gpt-4', () => {
|
|
166
|
+
expect(getHighVariant('gpt-4')).toBe('gpt-4-high');
|
|
167
|
+
});
|
|
168
|
+
it('should return high variant for gpt-4-turbo', () => {
|
|
169
|
+
expect(getHighVariant('gpt-4-turbo')).toBe('gpt-4-turbo-high');
|
|
170
|
+
});
|
|
171
|
+
it('should return high variant for gpt-4o', () => {
|
|
172
|
+
expect(getHighVariant('gpt-4o')).toBe('gpt-4o-high');
|
|
173
|
+
});
|
|
174
|
+
it('should return high variant for gpt-5', () => {
|
|
175
|
+
expect(getHighVariant('gpt-5')).toBe('gpt-5-high');
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
describe('Gemini models', () => {
|
|
179
|
+
it('should return high variant for gemini-2-pro', () => {
|
|
180
|
+
expect(getHighVariant('gemini-2-pro')).toBe('gemini-2-pro-high');
|
|
181
|
+
});
|
|
182
|
+
it('should return high variant for gemini-3-pro', () => {
|
|
183
|
+
expect(getHighVariant('gemini-3-pro')).toBe('gemini-3-pro-high');
|
|
184
|
+
});
|
|
185
|
+
it('should return high variant for gemini-3-flash', () => {
|
|
186
|
+
expect(getHighVariant('gemini-3-flash')).toBe('gemini-3-flash-high');
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
describe('Already high variants', () => {
|
|
190
|
+
it('should return null for already high variant', () => {
|
|
191
|
+
expect(getHighVariant('claude-sonnet-4-5-high')).toBeNull();
|
|
192
|
+
});
|
|
193
|
+
it('should return null for model ending in -high', () => {
|
|
194
|
+
expect(getHighVariant('some-model-high')).toBeNull();
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
describe('Prefixed models', () => {
|
|
198
|
+
it('should preserve prefix in high variant', () => {
|
|
199
|
+
expect(getHighVariant('vertex_ai/claude-sonnet-4-5')).toBe('vertex_ai/claude-sonnet-4-5-high');
|
|
200
|
+
});
|
|
201
|
+
it('should handle openai/ prefix', () => {
|
|
202
|
+
expect(getHighVariant('openai/gpt-4')).toBe('openai/gpt-4-high');
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
it('should return null for unknown model', () => {
|
|
206
|
+
expect(getHighVariant('unknown-model')).toBeNull();
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
describe('switcher - isAlreadyHighVariant', () => {
|
|
210
|
+
it('should return true for high variant models', () => {
|
|
211
|
+
expect(isAlreadyHighVariant('claude-sonnet-4-5-high')).toBe(true);
|
|
212
|
+
});
|
|
213
|
+
it('should return true for any model ending in -high', () => {
|
|
214
|
+
expect(isAlreadyHighVariant('custom-model-high')).toBe(true);
|
|
215
|
+
});
|
|
216
|
+
it('should return false for non-high variant', () => {
|
|
217
|
+
expect(isAlreadyHighVariant('claude-sonnet-4-5')).toBe(false);
|
|
218
|
+
});
|
|
219
|
+
it('should handle prefixed models', () => {
|
|
220
|
+
expect(isAlreadyHighVariant('vertex_ai/claude-sonnet-4-5-high')).toBe(true);
|
|
221
|
+
expect(isAlreadyHighVariant('vertex_ai/claude-sonnet-4-5')).toBe(false);
|
|
222
|
+
});
|
|
223
|
+
it('should normalize dot notation', () => {
|
|
224
|
+
expect(isAlreadyHighVariant('claude-sonnet-4.5-high')).toBe(true);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
describe('switcher - getThinkingConfig', () => {
|
|
228
|
+
describe('Anthropic provider', () => {
|
|
229
|
+
it('should return config for Claude models', () => {
|
|
230
|
+
const config = getThinkingConfig('anthropic', 'claude-sonnet-4-5');
|
|
231
|
+
expect(config).not.toBeNull();
|
|
232
|
+
expect(config).toHaveProperty('thinking');
|
|
233
|
+
});
|
|
234
|
+
it('should return null for already high variant', () => {
|
|
235
|
+
const config = getThinkingConfig('anthropic', 'claude-sonnet-4-5-high');
|
|
236
|
+
expect(config).toBeNull();
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
describe('Amazon Bedrock provider', () => {
|
|
240
|
+
it('should return config for Claude models on Bedrock', () => {
|
|
241
|
+
const config = getThinkingConfig('amazon-bedrock', 'anthropic.claude-3-sonnet');
|
|
242
|
+
expect(config).not.toBeNull();
|
|
243
|
+
expect(config).toHaveProperty('reasoningConfig');
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
describe('Google provider', () => {
|
|
247
|
+
it('should return config for Gemini models', () => {
|
|
248
|
+
const config = getThinkingConfig('google', 'gemini-2-pro');
|
|
249
|
+
expect(config).not.toBeNull();
|
|
250
|
+
expect(config).toHaveProperty('providerOptions');
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
describe('OpenAI provider', () => {
|
|
254
|
+
it('should return config for GPT models', () => {
|
|
255
|
+
const config = getThinkingConfig('openai', 'gpt-4');
|
|
256
|
+
expect(config).not.toBeNull();
|
|
257
|
+
expect(config).toHaveProperty('reasoning_effort');
|
|
258
|
+
});
|
|
259
|
+
it('should return config for o1 models', () => {
|
|
260
|
+
const config = getThinkingConfig('openai', 'o1-preview');
|
|
261
|
+
expect(config).not.toBeNull();
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
describe('GitHub Copilot proxy', () => {
|
|
265
|
+
it('should resolve to anthropic for Claude model', () => {
|
|
266
|
+
const config = getThinkingConfig('github-copilot', 'claude-sonnet-4-5');
|
|
267
|
+
expect(config).not.toBeNull();
|
|
268
|
+
expect(config).toHaveProperty('thinking');
|
|
269
|
+
});
|
|
270
|
+
it('should resolve to google for Gemini model', () => {
|
|
271
|
+
const config = getThinkingConfig('github-copilot', 'gemini-2-pro');
|
|
272
|
+
expect(config).not.toBeNull();
|
|
273
|
+
expect(config).toHaveProperty('providerOptions');
|
|
274
|
+
});
|
|
275
|
+
it('should resolve to openai for GPT model', () => {
|
|
276
|
+
const config = getThinkingConfig('github-copilot', 'gpt-4');
|
|
277
|
+
expect(config).not.toBeNull();
|
|
278
|
+
expect(config).toHaveProperty('reasoning_effort');
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
it('should return null for unknown provider', () => {
|
|
282
|
+
const config = getThinkingConfig('unknown-provider', 'some-model');
|
|
283
|
+
expect(config).toBeNull();
|
|
284
|
+
});
|
|
285
|
+
it('should return null for non-capable model', () => {
|
|
286
|
+
const config = getThinkingConfig('anthropic', 'unknown-model');
|
|
287
|
+
expect(config).toBeNull();
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
describe('switcher - getClaudeThinkingConfig', () => {
|
|
291
|
+
it('should return default config with 64000 tokens', () => {
|
|
292
|
+
const config = getClaudeThinkingConfig();
|
|
293
|
+
expect(config.thinking.type).toBe('enabled');
|
|
294
|
+
expect(config.thinking.budgetTokens).toBe(64000);
|
|
295
|
+
expect(config.maxTokens).toBe(128000);
|
|
296
|
+
});
|
|
297
|
+
it('should accept custom budget tokens', () => {
|
|
298
|
+
const config = getClaudeThinkingConfig(32000);
|
|
299
|
+
expect(config.thinking.budgetTokens).toBe(32000);
|
|
300
|
+
});
|
|
301
|
+
});
|
|
302
|
+
describe('switcher - THINKING_CONFIGS', () => {
|
|
303
|
+
it('should have anthropic config', () => {
|
|
304
|
+
expect(THINKING_CONFIGS.anthropic).toBeDefined();
|
|
305
|
+
expect(THINKING_CONFIGS.anthropic.thinking).toBeDefined();
|
|
306
|
+
});
|
|
307
|
+
it('should have amazon-bedrock config', () => {
|
|
308
|
+
expect(THINKING_CONFIGS['amazon-bedrock']).toBeDefined();
|
|
309
|
+
expect(THINKING_CONFIGS['amazon-bedrock'].reasoningConfig).toBeDefined();
|
|
310
|
+
});
|
|
311
|
+
it('should have google config', () => {
|
|
312
|
+
expect(THINKING_CONFIGS.google).toBeDefined();
|
|
313
|
+
expect(THINKING_CONFIGS.google.providerOptions).toBeDefined();
|
|
314
|
+
});
|
|
315
|
+
it('should have openai config', () => {
|
|
316
|
+
expect(THINKING_CONFIGS.openai).toBeDefined();
|
|
317
|
+
expect(THINKING_CONFIGS.openai.reasoning_effort).toBe('high');
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
describe('state management - processThinkMode', () => {
|
|
321
|
+
it('should set requested to false when no keyword', () => {
|
|
322
|
+
const state = processThinkMode('test-session', 'regular text');
|
|
323
|
+
expect(state.requested).toBe(false);
|
|
324
|
+
});
|
|
325
|
+
it('should set requested to true when keyword detected', () => {
|
|
326
|
+
const state = processThinkMode('test-session', 'think about this');
|
|
327
|
+
expect(state.requested).toBe(true);
|
|
328
|
+
});
|
|
329
|
+
it('should store state for session', () => {
|
|
330
|
+
processThinkMode('test-session', 'think about this');
|
|
331
|
+
const stored = getThinkModeState('test-session');
|
|
332
|
+
expect(stored?.requested).toBe(true);
|
|
333
|
+
});
|
|
334
|
+
it('should return initial state values', () => {
|
|
335
|
+
const state = processThinkMode('test-session', 'think');
|
|
336
|
+
expect(state.modelSwitched).toBe(false);
|
|
337
|
+
expect(state.thinkingConfigInjected).toBe(false);
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
describe('state management - getThinkModeState', () => {
|
|
341
|
+
it('should return undefined for unknown session', () => {
|
|
342
|
+
expect(getThinkModeState('unknown-session')).toBeUndefined();
|
|
343
|
+
});
|
|
344
|
+
it('should return state after processThinkMode', () => {
|
|
345
|
+
processThinkMode('test-session', 'think');
|
|
346
|
+
const state = getThinkModeState('test-session');
|
|
347
|
+
expect(state).toBeDefined();
|
|
348
|
+
expect(state?.requested).toBe(true);
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
describe('state management - isThinkModeActive', () => {
|
|
352
|
+
it('should return false for unknown session', () => {
|
|
353
|
+
expect(isThinkModeActive('unknown-session')).toBe(false);
|
|
354
|
+
});
|
|
355
|
+
it('should return true after think mode requested', () => {
|
|
356
|
+
processThinkMode('test-session', 'think');
|
|
357
|
+
expect(isThinkModeActive('test-session')).toBe(true);
|
|
358
|
+
});
|
|
359
|
+
it('should return false when not requested', () => {
|
|
360
|
+
processThinkMode('test-session', 'regular text');
|
|
361
|
+
expect(isThinkModeActive('test-session')).toBe(false);
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
describe('state management - clearThinkModeState', () => {
|
|
365
|
+
it('should clear state for session', () => {
|
|
366
|
+
processThinkMode('test-session', 'think');
|
|
367
|
+
clearThinkModeState('test-session');
|
|
368
|
+
expect(getThinkModeState('test-session')).toBeUndefined();
|
|
369
|
+
});
|
|
370
|
+
it('should not affect other sessions', () => {
|
|
371
|
+
processThinkMode('session-1', 'think');
|
|
372
|
+
processThinkMode('session-2', 'think');
|
|
373
|
+
clearThinkModeState('session-1');
|
|
374
|
+
expect(getThinkModeState('session-2')).toBeDefined();
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
describe('state management - session isolation', () => {
|
|
378
|
+
it('should maintain separate state per session', () => {
|
|
379
|
+
processThinkMode('session-1', 'think');
|
|
380
|
+
processThinkMode('session-2', 'regular');
|
|
381
|
+
expect(getThinkModeState('session-1')?.requested).toBe(true);
|
|
382
|
+
expect(getThinkModeState('session-2')?.requested).toBe(false);
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
describe('createThinkModeHook', () => {
|
|
386
|
+
it('should create hook with processChatParams method', () => {
|
|
387
|
+
const hook = createThinkModeHook();
|
|
388
|
+
expect(typeof hook.processChatParams).toBe('function');
|
|
389
|
+
});
|
|
390
|
+
it('should create hook with onSessionDeleted method', () => {
|
|
391
|
+
const hook = createThinkModeHook();
|
|
392
|
+
expect(typeof hook.onSessionDeleted).toBe('function');
|
|
393
|
+
});
|
|
394
|
+
it('should create hook with isRequested method', () => {
|
|
395
|
+
const hook = createThinkModeHook();
|
|
396
|
+
expect(typeof hook.isRequested).toBe('function');
|
|
397
|
+
});
|
|
398
|
+
it('should create hook with getState method', () => {
|
|
399
|
+
const hook = createThinkModeHook();
|
|
400
|
+
expect(typeof hook.getState).toBe('function');
|
|
401
|
+
});
|
|
402
|
+
it('should create hook with clear method', () => {
|
|
403
|
+
const hook = createThinkModeHook();
|
|
404
|
+
expect(typeof hook.clear).toBe('function');
|
|
405
|
+
});
|
|
406
|
+
describe('processChatParams', () => {
|
|
407
|
+
it('should detect think mode from parts', () => {
|
|
408
|
+
const hook = createThinkModeHook();
|
|
409
|
+
const input = {
|
|
410
|
+
parts: [{ type: 'text', text: 'think about this' }],
|
|
411
|
+
message: {},
|
|
412
|
+
};
|
|
413
|
+
const state = hook.processChatParams('test-session', input);
|
|
414
|
+
expect(state.requested).toBe(true);
|
|
415
|
+
});
|
|
416
|
+
it('should not request think mode for regular text', () => {
|
|
417
|
+
const hook = createThinkModeHook();
|
|
418
|
+
const input = {
|
|
419
|
+
parts: [{ type: 'text', text: 'regular text' }],
|
|
420
|
+
message: {},
|
|
421
|
+
};
|
|
422
|
+
const state = hook.processChatParams('test-session', input);
|
|
423
|
+
expect(state.requested).toBe(false);
|
|
424
|
+
});
|
|
425
|
+
it('should switch model to high variant', () => {
|
|
426
|
+
const hook = createThinkModeHook();
|
|
427
|
+
const input = {
|
|
428
|
+
parts: [{ type: 'text', text: 'think' }],
|
|
429
|
+
message: {
|
|
430
|
+
model: {
|
|
431
|
+
providerId: 'anthropic',
|
|
432
|
+
modelId: 'claude-sonnet-4-5',
|
|
433
|
+
},
|
|
434
|
+
},
|
|
435
|
+
};
|
|
436
|
+
const state = hook.processChatParams('test-session', input);
|
|
437
|
+
expect(state.modelSwitched).toBe(true);
|
|
438
|
+
expect(input.message.model?.modelId).toBe('claude-sonnet-4-5-high');
|
|
439
|
+
});
|
|
440
|
+
it('should not switch already high variant', () => {
|
|
441
|
+
const hook = createThinkModeHook();
|
|
442
|
+
const input = {
|
|
443
|
+
parts: [{ type: 'text', text: 'think' }],
|
|
444
|
+
message: {
|
|
445
|
+
model: {
|
|
446
|
+
providerId: 'anthropic',
|
|
447
|
+
modelId: 'claude-sonnet-4-5-high',
|
|
448
|
+
},
|
|
449
|
+
},
|
|
450
|
+
};
|
|
451
|
+
const state = hook.processChatParams('test-session', input);
|
|
452
|
+
expect(state.modelSwitched).toBe(false);
|
|
453
|
+
});
|
|
454
|
+
it('should inject thinking config', () => {
|
|
455
|
+
const hook = createThinkModeHook();
|
|
456
|
+
const input = {
|
|
457
|
+
parts: [{ type: 'text', text: 'think' }],
|
|
458
|
+
message: {
|
|
459
|
+
model: {
|
|
460
|
+
providerId: 'anthropic',
|
|
461
|
+
modelId: 'claude-sonnet-4-5',
|
|
462
|
+
},
|
|
463
|
+
},
|
|
464
|
+
};
|
|
465
|
+
const state = hook.processChatParams('test-session', input);
|
|
466
|
+
expect(state.thinkingConfigInjected).toBe(true);
|
|
467
|
+
});
|
|
468
|
+
it('should store provider and model in state', () => {
|
|
469
|
+
const hook = createThinkModeHook();
|
|
470
|
+
const input = {
|
|
471
|
+
parts: [{ type: 'text', text: 'think' }],
|
|
472
|
+
message: {
|
|
473
|
+
model: {
|
|
474
|
+
providerId: 'anthropic',
|
|
475
|
+
modelId: 'claude-sonnet-4-5',
|
|
476
|
+
},
|
|
477
|
+
},
|
|
478
|
+
};
|
|
479
|
+
hook.processChatParams('test-session', input);
|
|
480
|
+
const state = hook.getState('test-session');
|
|
481
|
+
expect(state?.providerId).toBe('anthropic');
|
|
482
|
+
expect(state?.modelId).toBe('claude-sonnet-4-5');
|
|
483
|
+
});
|
|
484
|
+
});
|
|
485
|
+
describe('onSessionDeleted', () => {
|
|
486
|
+
it('should clear state when session deleted', () => {
|
|
487
|
+
const hook = createThinkModeHook();
|
|
488
|
+
processThinkMode('test-session', 'think');
|
|
489
|
+
hook.onSessionDeleted('test-session');
|
|
490
|
+
expect(getThinkModeState('test-session')).toBeUndefined();
|
|
491
|
+
});
|
|
492
|
+
});
|
|
493
|
+
describe('isRequested', () => {
|
|
494
|
+
it('should return true when think mode requested', () => {
|
|
495
|
+
const hook = createThinkModeHook();
|
|
496
|
+
processThinkMode('test-session', 'think');
|
|
497
|
+
expect(hook.isRequested('test-session')).toBe(true);
|
|
498
|
+
});
|
|
499
|
+
it('should return false for unknown session', () => {
|
|
500
|
+
const hook = createThinkModeHook();
|
|
501
|
+
expect(hook.isRequested('unknown')).toBe(false);
|
|
502
|
+
});
|
|
503
|
+
});
|
|
504
|
+
describe('getState', () => {
|
|
505
|
+
it('should return state for session', () => {
|
|
506
|
+
const hook = createThinkModeHook();
|
|
507
|
+
processThinkMode('test-session', 'think');
|
|
508
|
+
expect(hook.getState('test-session')).toBeDefined();
|
|
509
|
+
});
|
|
510
|
+
it('should return undefined for unknown session', () => {
|
|
511
|
+
const hook = createThinkModeHook();
|
|
512
|
+
expect(hook.getState('unknown')).toBeUndefined();
|
|
513
|
+
});
|
|
514
|
+
});
|
|
515
|
+
describe('clear', () => {
|
|
516
|
+
it('should clear state for session', () => {
|
|
517
|
+
const hook = createThinkModeHook();
|
|
518
|
+
processThinkMode('test-session', 'think');
|
|
519
|
+
hook.clear('test-session');
|
|
520
|
+
expect(hook.getState('test-session')).toBeUndefined();
|
|
521
|
+
});
|
|
522
|
+
});
|
|
523
|
+
});
|
|
524
|
+
describe('shouldActivateThinkMode', () => {
|
|
525
|
+
it('should return true for think keyword', () => {
|
|
526
|
+
expect(shouldActivateThinkMode('think about this')).toBe(true);
|
|
527
|
+
});
|
|
528
|
+
it('should return true for ultrathink keyword', () => {
|
|
529
|
+
expect(shouldActivateThinkMode('ultrathink')).toBe(true);
|
|
530
|
+
});
|
|
531
|
+
it('should return true for multilingual keywords', () => {
|
|
532
|
+
expect(shouldActivateThinkMode('생각해주세요')).toBe(true);
|
|
533
|
+
});
|
|
534
|
+
it('should return false for no keywords', () => {
|
|
535
|
+
expect(shouldActivateThinkMode('regular text')).toBe(false);
|
|
536
|
+
});
|
|
537
|
+
it('should ignore keywords in code blocks', () => {
|
|
538
|
+
expect(shouldActivateThinkMode('```think```')).toBe(false);
|
|
539
|
+
});
|
|
540
|
+
});
|
|
541
|
+
describe('shouldActivateUltrathink', () => {
|
|
542
|
+
it('should return true for ultrathink keyword', () => {
|
|
543
|
+
expect(shouldActivateUltrathink('ultrathink this')).toBe(true);
|
|
544
|
+
});
|
|
545
|
+
it('should return false for just think', () => {
|
|
546
|
+
expect(shouldActivateUltrathink('think about this')).toBe(false);
|
|
547
|
+
});
|
|
548
|
+
it('should be case insensitive', () => {
|
|
549
|
+
expect(shouldActivateUltrathink('ULTRATHINK')).toBe(true);
|
|
550
|
+
});
|
|
551
|
+
it('should ignore in code blocks', () => {
|
|
552
|
+
expect(shouldActivateUltrathink('```ultrathink```')).toBe(false);
|
|
553
|
+
});
|
|
554
|
+
});
|
|
555
|
+
});
|
|
556
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../src/hooks/think-mode/__tests__/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/installer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAgBH,0CAA0C;AAC1C,eAAO,MAAM,iBAAiB,QAA6B,CAAC;AAC5D,eAAO,MAAM,UAAU,QAAoC,CAAC;AAC5D,eAAO,MAAM,YAAY,QAAsC,CAAC;AAChE,eAAO,MAAM,UAAU,QAAoC,CAAC;AAC5D,eAAO,MAAM,SAAS,QAAmC,CAAC;AAC1D,eAAO,MAAM,OAAO,QAAiC,CAAC;AACtD,eAAO,MAAM,aAAa,QAA2C,CAAC;AACtE,eAAO,MAAM,YAAY,QAA+C,CAAC;AAEzE;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,EAAO,CAAC;AAE1C,sBAAsB;AACtB,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,0BAA0B;AAC1B,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,2BAA2B;AAC3B,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAOxF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAQ3C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAI3C;AAqED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/installer/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAgBH,0CAA0C;AAC1C,eAAO,MAAM,iBAAiB,QAA6B,CAAC;AAC5D,eAAO,MAAM,UAAU,QAAoC,CAAC;AAC5D,eAAO,MAAM,YAAY,QAAsC,CAAC;AAChE,eAAO,MAAM,UAAU,QAAoC,CAAC;AAC5D,eAAO,MAAM,SAAS,QAAmC,CAAC;AAC1D,eAAO,MAAM,OAAO,QAAiC,CAAC;AACtD,eAAO,MAAM,aAAa,QAA2C,CAAC;AACtE,eAAO,MAAM,YAAY,QAA+C,CAAC;AAEzE;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,EAAO,CAAC;AAE1C,sBAAsB;AACtB,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,0BAA0B;AAC1B,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,2BAA2B;AAC3B,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAOxF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAQ3C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAI3C;AAqED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,aAAa,CAsWnE;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAehG"}
|
package/dist/installer/index.js
CHANGED
|
@@ -257,6 +257,14 @@ export function install(options = {}) {
|
|
|
257
257
|
const homeMdPath = join(homedir(), 'CLAUDE.md');
|
|
258
258
|
if (!existsSync(homeMdPath)) {
|
|
259
259
|
if (!existsSync(claudeMdPath) || options.force) {
|
|
260
|
+
// Backup existing CLAUDE.md before overwriting (if it exists and --force)
|
|
261
|
+
if (existsSync(claudeMdPath) && options.force) {
|
|
262
|
+
const today = new Date().toISOString().split('T')[0]; // YYYY-MM-DD
|
|
263
|
+
const backupPath = join(CLAUDE_CONFIG_DIR, `CLAUDE.md.backup.${today}`);
|
|
264
|
+
const existingContent = readFileSync(claudeMdPath, 'utf-8');
|
|
265
|
+
writeFileSync(backupPath, existingContent);
|
|
266
|
+
log(`Backed up existing CLAUDE.md to ${backupPath}`);
|
|
267
|
+
}
|
|
260
268
|
writeFileSync(claudeMdPath, loadClaudeMdContent());
|
|
261
269
|
log('Created CLAUDE.md');
|
|
262
270
|
}
|