oh-my-claude-sisyphus 3.6.3 → 3.7.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/README.md +40 -1
- package/commands/hud.md +37 -5
- package/commands/omc-setup.md +105 -0
- package/dist/__tests__/delegation-enforcement-levels.test.d.ts +9 -0
- package/dist/__tests__/delegation-enforcement-levels.test.d.ts.map +1 -0
- package/dist/__tests__/delegation-enforcement-levels.test.js +550 -0
- package/dist/__tests__/delegation-enforcement-levels.test.js.map +1 -0
- package/dist/__tests__/hud/analytics-display.test.js +137 -1
- package/dist/__tests__/hud/analytics-display.test.js.map +1 -1
- package/dist/__tests__/hud-windows.test.d.ts +2 -0
- package/dist/__tests__/hud-windows.test.d.ts.map +1 -0
- package/dist/__tests__/hud-windows.test.js +91 -0
- package/dist/__tests__/hud-windows.test.js.map +1 -0
- package/dist/__tests__/installer.test.js +1 -1
- package/dist/__tests__/rate-limit-wait/daemon.test.d.ts +5 -0
- package/dist/__tests__/rate-limit-wait/daemon.test.d.ts.map +1 -0
- package/dist/__tests__/rate-limit-wait/daemon.test.js +313 -0
- package/dist/__tests__/rate-limit-wait/daemon.test.js.map +1 -0
- package/dist/__tests__/rate-limit-wait/integration.test.d.ts +8 -0
- package/dist/__tests__/rate-limit-wait/integration.test.d.ts.map +1 -0
- package/dist/__tests__/rate-limit-wait/integration.test.js +329 -0
- package/dist/__tests__/rate-limit-wait/integration.test.js.map +1 -0
- package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.d.ts +5 -0
- package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.d.ts.map +1 -0
- package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.js +167 -0
- package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.js.map +1 -0
- package/dist/__tests__/rate-limit-wait/tmux-detector.test.d.ts +5 -0
- package/dist/__tests__/rate-limit-wait/tmux-detector.test.d.ts.map +1 -0
- package/dist/__tests__/rate-limit-wait/tmux-detector.test.js +295 -0
- package/dist/__tests__/rate-limit-wait/tmux-detector.test.js.map +1 -0
- package/dist/cli/commands/wait.d.ts +52 -0
- package/dist/cli/commands/wait.d.ts.map +1 -0
- package/dist/cli/commands/wait.js +229 -0
- package/dist/cli/commands/wait.js.map +1 -0
- package/dist/cli/index.js +54 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/features/rate-limit-wait/daemon.d.ts +52 -0
- package/dist/features/rate-limit-wait/daemon.d.ts.map +1 -0
- package/dist/features/rate-limit-wait/daemon.js +585 -0
- package/dist/features/rate-limit-wait/daemon.js.map +1 -0
- package/dist/features/rate-limit-wait/index.d.ts +16 -0
- package/dist/features/rate-limit-wait/index.d.ts.map +1 -0
- package/dist/features/rate-limit-wait/index.js +18 -0
- package/dist/features/rate-limit-wait/index.js.map +1 -0
- package/dist/features/rate-limit-wait/rate-limit-monitor.d.ts +22 -0
- package/dist/features/rate-limit-wait/rate-limit-monitor.d.ts.map +1 -0
- package/dist/features/rate-limit-wait/rate-limit-monitor.js +99 -0
- package/dist/features/rate-limit-wait/rate-limit-monitor.js.map +1 -0
- package/dist/features/rate-limit-wait/tmux-detector.d.ts +59 -0
- package/dist/features/rate-limit-wait/tmux-detector.d.ts.map +1 -0
- package/dist/features/rate-limit-wait/tmux-detector.js +304 -0
- package/dist/features/rate-limit-wait/tmux-detector.js.map +1 -0
- package/dist/features/rate-limit-wait/types.d.ts +121 -0
- package/dist/features/rate-limit-wait/types.d.ts.map +1 -0
- package/dist/features/rate-limit-wait/types.js +8 -0
- package/dist/features/rate-limit-wait/types.js.map +1 -0
- package/dist/features/state-manager/index.d.ts.map +1 -1
- package/dist/features/state-manager/index.js +4 -1
- package/dist/features/state-manager/index.js.map +1 -1
- package/dist/hooks/bridge.d.ts +1 -1
- package/dist/hooks/bridge.d.ts.map +1 -1
- package/dist/hooks/bridge.js +50 -4
- package/dist/hooks/bridge.js.map +1 -1
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +15 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/omc-orchestrator/audit.d.ts +2 -1
- package/dist/hooks/omc-orchestrator/audit.d.ts.map +1 -1
- package/dist/hooks/omc-orchestrator/audit.js.map +1 -1
- package/dist/hooks/omc-orchestrator/index.d.ts +7 -0
- package/dist/hooks/omc-orchestrator/index.d.ts.map +1 -1
- package/dist/hooks/omc-orchestrator/index.js +95 -8
- package/dist/hooks/omc-orchestrator/index.js.map +1 -1
- package/dist/hooks/permission-handler/__tests__/index.test.d.ts +2 -0
- package/dist/hooks/permission-handler/__tests__/index.test.d.ts.map +1 -0
- package/dist/hooks/permission-handler/__tests__/index.test.js +291 -0
- package/dist/hooks/permission-handler/__tests__/index.test.js.map +1 -0
- package/dist/hooks/permission-handler/index.d.ts +42 -0
- package/dist/hooks/permission-handler/index.d.ts.map +1 -0
- package/dist/hooks/permission-handler/index.js +107 -0
- package/dist/hooks/permission-handler/index.js.map +1 -0
- package/dist/hooks/plugin-patterns/index.d.ts +5 -0
- package/dist/hooks/plugin-patterns/index.d.ts.map +1 -1
- package/dist/hooks/plugin-patterns/index.js +26 -1
- package/dist/hooks/plugin-patterns/index.js.map +1 -1
- package/dist/hooks/pre-compact/index.d.ts +82 -0
- package/dist/hooks/pre-compact/index.d.ts.map +1 -0
- package/dist/hooks/pre-compact/index.js +265 -0
- package/dist/hooks/pre-compact/index.js.map +1 -0
- package/dist/hooks/session-end/index.d.ts +42 -0
- package/dist/hooks/session-end/index.d.ts.map +1 -0
- package/dist/hooks/session-end/index.js +200 -0
- package/dist/hooks/session-end/index.js.map +1 -0
- package/dist/hooks/setup/index.d.ts +66 -0
- package/dist/hooks/setup/index.d.ts.map +1 -0
- package/dist/hooks/setup/index.js +299 -0
- package/dist/hooks/setup/index.js.map +1 -0
- package/dist/hooks/setup/types.d.ts +25 -0
- package/dist/hooks/setup/types.d.ts.map +1 -0
- package/dist/hooks/setup/types.js +5 -0
- package/dist/hooks/setup/types.js.map +1 -0
- package/dist/hooks/subagent-tracker/index.d.ts +68 -29
- package/dist/hooks/subagent-tracker/index.d.ts.map +1 -1
- package/dist/hooks/subagent-tracker/index.js +316 -131
- package/dist/hooks/subagent-tracker/index.js.map +1 -1
- package/dist/hud/analytics-display.d.ts +16 -0
- package/dist/hud/analytics-display.d.ts.map +1 -1
- package/dist/hud/analytics-display.js +35 -9
- package/dist/hud/analytics-display.js.map +1 -1
- package/dist/hud/render.d.ts.map +1 -1
- package/dist/hud/render.js +49 -18
- package/dist/hud/render.js.map +1 -1
- package/dist/hud/types.d.ts +2 -0
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js +14 -0
- package/dist/hud/types.js.map +1 -1
- package/dist/installer/index.d.ts +1 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +4 -3
- package/dist/installer/index.js.map +1 -1
- package/hooks/hooks.json +83 -1
- package/hooks/keyword-detector.sh +4 -4
- package/hooks/persistent-mode.sh +10 -10
- package/hooks/session-start.sh +4 -4
- package/package.json +3 -1
- package/scripts/keyword-detector.mjs +4 -4
- package/scripts/permission-handler.mjs +23 -0
- package/scripts/persistent-mode.mjs +6 -6
- package/scripts/persistent-mode.sh +10 -10
- package/scripts/pre-compact.mjs +23 -0
- package/scripts/session-end.mjs +23 -0
- package/scripts/session-start.mjs +4 -4
- package/scripts/setup-init.mjs +23 -0
- package/scripts/setup-maintenance.mjs +23 -0
- package/scripts/subagent-tracker.mjs +35 -0
- package/skills/hud/SKILL.md +37 -5
- package/skills/omc-setup/SKILL.md +162 -4
- package/skills/writer-memory/SKILL.md +443 -0
- package/skills/writer-memory/lib/character-tracker.ts +338 -0
- package/skills/writer-memory/lib/memory-manager.ts +804 -0
- package/skills/writer-memory/lib/relationship-graph.ts +400 -0
- package/skills/writer-memory/lib/scene-organizer.ts +544 -0
- package/skills/writer-memory/lib/synopsis-builder.ts +339 -0
- package/skills/writer-memory/templates/synopsis-template.md +46 -0
- package/templates/hooks/keyword-detector.mjs +198 -0
- package/templates/hooks/keyword-detector.sh +102 -0
- package/templates/hooks/persistent-mode.mjs +249 -0
- package/templates/hooks/persistent-mode.sh +187 -0
- package/templates/hooks/post-tool-use.mjs +133 -0
- package/templates/hooks/post-tool-use.sh +90 -0
- package/templates/hooks/pre-tool-use.mjs +145 -0
- package/templates/hooks/pre-tool-use.sh +113 -0
- package/templates/hooks/session-start.mjs +100 -0
- package/templates/hooks/session-start.sh +62 -0
- package/templates/hooks/stop-continuation.mjs +80 -0
- package/templates/hooks/stop-continuation.sh +40 -0
- package/templates/rules/README.md +40 -0
- package/templates/rules/coding-style.md +74 -0
- package/templates/rules/git-workflow.md +41 -0
- package/templates/rules/performance.md +40 -0
- package/templates/rules/security.md +41 -0
- package/templates/rules/testing.md +42 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for tmux-detector.ts
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
5
|
+
import { analyzePaneContent, isTmuxAvailable, listTmuxPanes, capturePaneContent, formatBlockedPanesSummary, } from '../../features/rate-limit-wait/tmux-detector.js';
|
|
6
|
+
// Mock child_process
|
|
7
|
+
vi.mock('child_process', () => ({
|
|
8
|
+
execSync: vi.fn(),
|
|
9
|
+
spawnSync: vi.fn(),
|
|
10
|
+
}));
|
|
11
|
+
import { execSync, spawnSync } from 'child_process';
|
|
12
|
+
describe('tmux-detector', () => {
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
vi.clearAllMocks();
|
|
15
|
+
});
|
|
16
|
+
describe('analyzePaneContent', () => {
|
|
17
|
+
it('should detect rate limit messages with Claude Code context', () => {
|
|
18
|
+
const content = `
|
|
19
|
+
Claude Code v1.2.3
|
|
20
|
+
You've reached your rate limit. Please wait for the limit to reset.
|
|
21
|
+
[1] Continue when ready
|
|
22
|
+
[2] Exit
|
|
23
|
+
`;
|
|
24
|
+
const result = analyzePaneContent(content);
|
|
25
|
+
expect(result.hasClaudeCode).toBe(true);
|
|
26
|
+
expect(result.hasRateLimitMessage).toBe(true);
|
|
27
|
+
expect(result.isBlocked).toBe(true);
|
|
28
|
+
expect(result.confidence).toBeGreaterThan(0.5);
|
|
29
|
+
});
|
|
30
|
+
it('should detect 5-hour rate limit', () => {
|
|
31
|
+
const content = `
|
|
32
|
+
Claude Code assistant
|
|
33
|
+
5-hour usage limit reached
|
|
34
|
+
[1] Wait for reset
|
|
35
|
+
`;
|
|
36
|
+
const result = analyzePaneContent(content);
|
|
37
|
+
expect(result.hasRateLimitMessage).toBe(true);
|
|
38
|
+
expect(result.rateLimitType).toBe('five_hour');
|
|
39
|
+
});
|
|
40
|
+
it('should detect weekly rate limit', () => {
|
|
41
|
+
const content = `
|
|
42
|
+
Claude Code
|
|
43
|
+
Weekly usage quota exceeded
|
|
44
|
+
Please try again later
|
|
45
|
+
`;
|
|
46
|
+
const result = analyzePaneContent(content);
|
|
47
|
+
expect(result.hasRateLimitMessage).toBe(true);
|
|
48
|
+
expect(result.rateLimitType).toBe('weekly');
|
|
49
|
+
});
|
|
50
|
+
it('should not flag content without Claude Code indicators', () => {
|
|
51
|
+
const content = `
|
|
52
|
+
vim test.js
|
|
53
|
+
Hello World
|
|
54
|
+
`;
|
|
55
|
+
const result = analyzePaneContent(content);
|
|
56
|
+
expect(result.hasClaudeCode).toBe(false);
|
|
57
|
+
expect(result.isBlocked).toBe(false);
|
|
58
|
+
});
|
|
59
|
+
it('should not flag rate limit messages in non-Claude contexts', () => {
|
|
60
|
+
const content = `
|
|
61
|
+
curl api.example.com
|
|
62
|
+
Error: rate limit exceeded
|
|
63
|
+
`;
|
|
64
|
+
const result = analyzePaneContent(content);
|
|
65
|
+
expect(result.hasClaudeCode).toBe(false);
|
|
66
|
+
expect(result.hasRateLimitMessage).toBe(true);
|
|
67
|
+
expect(result.isBlocked).toBe(false); // No Claude context
|
|
68
|
+
});
|
|
69
|
+
it('should handle empty content', () => {
|
|
70
|
+
const result = analyzePaneContent('');
|
|
71
|
+
expect(result.hasClaudeCode).toBe(false);
|
|
72
|
+
expect(result.hasRateLimitMessage).toBe(false);
|
|
73
|
+
expect(result.isBlocked).toBe(false);
|
|
74
|
+
expect(result.confidence).toBe(0);
|
|
75
|
+
});
|
|
76
|
+
it('should detect waiting patterns', () => {
|
|
77
|
+
const content = `
|
|
78
|
+
Claude assistant
|
|
79
|
+
Rate limit reached
|
|
80
|
+
[1] Continue
|
|
81
|
+
[2] Cancel
|
|
82
|
+
`;
|
|
83
|
+
const result = analyzePaneContent(content);
|
|
84
|
+
expect(result.confidence).toBeGreaterThan(0.6);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe('isTmuxAvailable', () => {
|
|
88
|
+
it('should return true when tmux is installed', () => {
|
|
89
|
+
vi.mocked(spawnSync).mockReturnValue({
|
|
90
|
+
status: 0,
|
|
91
|
+
stdout: '/usr/bin/tmux\n',
|
|
92
|
+
stderr: '',
|
|
93
|
+
signal: null,
|
|
94
|
+
pid: 1234,
|
|
95
|
+
output: [],
|
|
96
|
+
});
|
|
97
|
+
expect(isTmuxAvailable()).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
it('should return false when tmux is not installed', () => {
|
|
100
|
+
vi.mocked(spawnSync).mockReturnValue({
|
|
101
|
+
status: 1,
|
|
102
|
+
stdout: '',
|
|
103
|
+
stderr: '',
|
|
104
|
+
signal: null,
|
|
105
|
+
pid: 1234,
|
|
106
|
+
output: [],
|
|
107
|
+
});
|
|
108
|
+
expect(isTmuxAvailable()).toBe(false);
|
|
109
|
+
});
|
|
110
|
+
it('should return false when spawnSync throws', () => {
|
|
111
|
+
vi.mocked(spawnSync).mockImplementation(() => {
|
|
112
|
+
throw new Error('Command not found');
|
|
113
|
+
});
|
|
114
|
+
expect(isTmuxAvailable()).toBe(false);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe('listTmuxPanes', () => {
|
|
118
|
+
it('should parse tmux pane list correctly', () => {
|
|
119
|
+
vi.mocked(spawnSync).mockReturnValue({
|
|
120
|
+
status: 0,
|
|
121
|
+
stdout: '/usr/bin/tmux',
|
|
122
|
+
stderr: '',
|
|
123
|
+
signal: null,
|
|
124
|
+
pid: 1234,
|
|
125
|
+
output: [],
|
|
126
|
+
});
|
|
127
|
+
vi.mocked(execSync).mockReturnValue('main:0.0 %0 1 dev Claude\nmain:0.1 %1 0 dev Other\n');
|
|
128
|
+
const panes = listTmuxPanes();
|
|
129
|
+
expect(panes).toHaveLength(2);
|
|
130
|
+
expect(panes[0]).toEqual({
|
|
131
|
+
id: '%0',
|
|
132
|
+
session: 'main',
|
|
133
|
+
windowIndex: 0,
|
|
134
|
+
windowName: 'dev',
|
|
135
|
+
paneIndex: 0,
|
|
136
|
+
title: 'Claude',
|
|
137
|
+
isActive: true,
|
|
138
|
+
});
|
|
139
|
+
expect(panes[1]).toEqual({
|
|
140
|
+
id: '%1',
|
|
141
|
+
session: 'main',
|
|
142
|
+
windowIndex: 0,
|
|
143
|
+
windowName: 'dev',
|
|
144
|
+
paneIndex: 1,
|
|
145
|
+
title: 'Other',
|
|
146
|
+
isActive: false,
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
it('should return empty array when tmux not available', () => {
|
|
150
|
+
vi.mocked(spawnSync).mockReturnValue({
|
|
151
|
+
status: 1,
|
|
152
|
+
stdout: '',
|
|
153
|
+
stderr: '',
|
|
154
|
+
signal: null,
|
|
155
|
+
pid: 1234,
|
|
156
|
+
output: [],
|
|
157
|
+
});
|
|
158
|
+
const panes = listTmuxPanes();
|
|
159
|
+
expect(panes).toEqual([]);
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
describe('capturePaneContent', () => {
|
|
163
|
+
it('should capture pane content', () => {
|
|
164
|
+
vi.mocked(spawnSync).mockReturnValue({
|
|
165
|
+
status: 0,
|
|
166
|
+
stdout: '/usr/bin/tmux',
|
|
167
|
+
stderr: '',
|
|
168
|
+
signal: null,
|
|
169
|
+
pid: 1234,
|
|
170
|
+
output: [],
|
|
171
|
+
});
|
|
172
|
+
vi.mocked(execSync).mockReturnValue('Line 1\nLine 2\nLine 3\n');
|
|
173
|
+
const content = capturePaneContent('%0', 3);
|
|
174
|
+
expect(content).toBe('Line 1\nLine 2\nLine 3\n');
|
|
175
|
+
expect(execSync).toHaveBeenCalledWith("tmux capture-pane -t '%0' -p -S -3", expect.any(Object));
|
|
176
|
+
});
|
|
177
|
+
it('should return empty string when tmux not available', () => {
|
|
178
|
+
vi.mocked(spawnSync).mockReturnValue({
|
|
179
|
+
status: 1,
|
|
180
|
+
stdout: '',
|
|
181
|
+
stderr: '',
|
|
182
|
+
signal: null,
|
|
183
|
+
pid: 1234,
|
|
184
|
+
output: [],
|
|
185
|
+
});
|
|
186
|
+
const content = capturePaneContent('%0');
|
|
187
|
+
expect(content).toBe('');
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
describe('security: input validation', () => {
|
|
191
|
+
it('should reject invalid pane IDs in capturePaneContent', () => {
|
|
192
|
+
vi.mocked(spawnSync).mockReturnValue({
|
|
193
|
+
status: 0,
|
|
194
|
+
stdout: '/usr/bin/tmux',
|
|
195
|
+
stderr: '',
|
|
196
|
+
signal: null,
|
|
197
|
+
pid: 1234,
|
|
198
|
+
output: [],
|
|
199
|
+
});
|
|
200
|
+
// Valid pane ID should work
|
|
201
|
+
vi.mocked(execSync).mockReturnValue('content');
|
|
202
|
+
const validResult = capturePaneContent('%0');
|
|
203
|
+
expect(validResult).toBe('content');
|
|
204
|
+
// Invalid pane IDs should return empty string (not execute command)
|
|
205
|
+
const invalidIds = [
|
|
206
|
+
'; rm -rf /',
|
|
207
|
+
'%0; echo hacked',
|
|
208
|
+
'$(whoami)',
|
|
209
|
+
'%0`id`',
|
|
210
|
+
'../etc/passwd',
|
|
211
|
+
'',
|
|
212
|
+
'abc',
|
|
213
|
+
];
|
|
214
|
+
for (const invalidId of invalidIds) {
|
|
215
|
+
vi.mocked(execSync).mockClear();
|
|
216
|
+
const result = capturePaneContent(invalidId);
|
|
217
|
+
expect(result).toBe('');
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
it('should validate lines parameter bounds', () => {
|
|
221
|
+
vi.mocked(spawnSync).mockReturnValue({
|
|
222
|
+
status: 0,
|
|
223
|
+
stdout: '/usr/bin/tmux',
|
|
224
|
+
stderr: '',
|
|
225
|
+
signal: null,
|
|
226
|
+
pid: 1234,
|
|
227
|
+
output: [],
|
|
228
|
+
});
|
|
229
|
+
vi.mocked(execSync).mockReturnValue('content');
|
|
230
|
+
// Should clamp negative to 1
|
|
231
|
+
capturePaneContent('%0', -5);
|
|
232
|
+
expect(execSync).toHaveBeenCalledWith(expect.stringContaining('-S -1'), expect.any(Object));
|
|
233
|
+
// Should clamp excessive values to 100
|
|
234
|
+
vi.mocked(execSync).mockClear();
|
|
235
|
+
capturePaneContent('%0', 1000);
|
|
236
|
+
expect(execSync).toHaveBeenCalledWith(expect.stringContaining('-S -100'), expect.any(Object));
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
describe('formatBlockedPanesSummary', () => {
|
|
240
|
+
it('should format empty list', () => {
|
|
241
|
+
const result = formatBlockedPanesSummary([]);
|
|
242
|
+
expect(result).toBe('No blocked Claude Code sessions detected.');
|
|
243
|
+
});
|
|
244
|
+
it('should format blocked panes', () => {
|
|
245
|
+
const panes = [
|
|
246
|
+
{
|
|
247
|
+
id: '%0',
|
|
248
|
+
session: 'main',
|
|
249
|
+
windowIndex: 0,
|
|
250
|
+
windowName: 'dev',
|
|
251
|
+
paneIndex: 0,
|
|
252
|
+
isActive: true,
|
|
253
|
+
analysis: {
|
|
254
|
+
hasClaudeCode: true,
|
|
255
|
+
hasRateLimitMessage: true,
|
|
256
|
+
isBlocked: true,
|
|
257
|
+
rateLimitType: 'five_hour',
|
|
258
|
+
confidence: 0.9,
|
|
259
|
+
},
|
|
260
|
+
firstDetectedAt: new Date(),
|
|
261
|
+
resumeAttempted: false,
|
|
262
|
+
},
|
|
263
|
+
];
|
|
264
|
+
const result = formatBlockedPanesSummary(panes);
|
|
265
|
+
expect(result).toContain('Found 1 blocked');
|
|
266
|
+
expect(result).toContain('%0');
|
|
267
|
+
expect(result).toContain('five_hour');
|
|
268
|
+
expect(result).toContain('90%');
|
|
269
|
+
});
|
|
270
|
+
it('should show resume status', () => {
|
|
271
|
+
const panes = [
|
|
272
|
+
{
|
|
273
|
+
id: '%0',
|
|
274
|
+
session: 'main',
|
|
275
|
+
windowIndex: 0,
|
|
276
|
+
windowName: 'dev',
|
|
277
|
+
paneIndex: 0,
|
|
278
|
+
isActive: true,
|
|
279
|
+
analysis: {
|
|
280
|
+
hasClaudeCode: true,
|
|
281
|
+
hasRateLimitMessage: true,
|
|
282
|
+
isBlocked: true,
|
|
283
|
+
confidence: 0.8,
|
|
284
|
+
},
|
|
285
|
+
firstDetectedAt: new Date(),
|
|
286
|
+
resumeAttempted: true,
|
|
287
|
+
resumeSuccessful: true,
|
|
288
|
+
},
|
|
289
|
+
];
|
|
290
|
+
const result = formatBlockedPanesSummary(panes);
|
|
291
|
+
expect(result).toContain('[RESUMED]');
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
//# sourceMappingURL=tmux-detector.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tmux-detector.test.js","sourceRoot":"","sources":["../../../src/__tests__/rate-limit-wait/tmux-detector.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wait Command
|
|
3
|
+
*
|
|
4
|
+
* CLI commands for rate limit wait and auto-resume functionality.
|
|
5
|
+
*
|
|
6
|
+
* Design Philosophy (aligned with oh-my-claudecode values):
|
|
7
|
+
* - Zero learning curve: `omc wait` just works
|
|
8
|
+
* - Smart defaults: Auto-detects tmux and daemon status
|
|
9
|
+
* - Minimal commands: Most users only need `omc wait`
|
|
10
|
+
*
|
|
11
|
+
* Commands:
|
|
12
|
+
* omc wait - Smart command: shows status, offers to start daemon if needed
|
|
13
|
+
* omc wait status - Show current rate limit and daemon status
|
|
14
|
+
* omc wait daemon start - Start the background daemon
|
|
15
|
+
* omc wait daemon stop - Stop the daemon
|
|
16
|
+
* omc wait detect - Scan for blocked Claude Code sessions
|
|
17
|
+
*/
|
|
18
|
+
export interface WaitOptions {
|
|
19
|
+
json?: boolean;
|
|
20
|
+
start?: boolean;
|
|
21
|
+
stop?: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface WaitStatusOptions {
|
|
24
|
+
json?: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface WaitDaemonOptions {
|
|
27
|
+
verbose?: boolean;
|
|
28
|
+
foreground?: boolean;
|
|
29
|
+
interval?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface WaitDetectOptions {
|
|
32
|
+
json?: boolean;
|
|
33
|
+
lines?: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Smart wait command - the main entry point
|
|
37
|
+
* Follows "zero learning curve" philosophy
|
|
38
|
+
*/
|
|
39
|
+
export declare function waitCommand(options: WaitOptions): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Show current rate limit and daemon status
|
|
42
|
+
*/
|
|
43
|
+
export declare function waitStatusCommand(options: WaitStatusOptions): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Start/stop the daemon
|
|
46
|
+
*/
|
|
47
|
+
export declare function waitDaemonCommand(action: 'start' | 'stop', options: WaitDaemonOptions): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Detect blocked Claude Code sessions
|
|
50
|
+
*/
|
|
51
|
+
export declare function waitDetectCommand(options: WaitDetectOptions): Promise<void>;
|
|
52
|
+
//# sourceMappingURL=wait.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/wait.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAmBH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DrE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuEjF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,OAAO,GAAG,MAAM,EACxB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAwCf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCjF"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wait Command
|
|
3
|
+
*
|
|
4
|
+
* CLI commands for rate limit wait and auto-resume functionality.
|
|
5
|
+
*
|
|
6
|
+
* Design Philosophy (aligned with oh-my-claudecode values):
|
|
7
|
+
* - Zero learning curve: `omc wait` just works
|
|
8
|
+
* - Smart defaults: Auto-detects tmux and daemon status
|
|
9
|
+
* - Minimal commands: Most users only need `omc wait`
|
|
10
|
+
*
|
|
11
|
+
* Commands:
|
|
12
|
+
* omc wait - Smart command: shows status, offers to start daemon if needed
|
|
13
|
+
* omc wait status - Show current rate limit and daemon status
|
|
14
|
+
* omc wait daemon start - Start the background daemon
|
|
15
|
+
* omc wait daemon stop - Stop the daemon
|
|
16
|
+
* omc wait detect - Scan for blocked Claude Code sessions
|
|
17
|
+
*/
|
|
18
|
+
import chalk from 'chalk';
|
|
19
|
+
import { checkRateLimitStatus, formatRateLimitStatus, isTmuxAvailable, isInsideTmux, getDaemonStatus, startDaemon, stopDaemon, detectBlockedPanes, runDaemonForeground, isDaemonRunning, } from '../../features/rate-limit-wait/index.js';
|
|
20
|
+
/**
|
|
21
|
+
* Smart wait command - the main entry point
|
|
22
|
+
* Follows "zero learning curve" philosophy
|
|
23
|
+
*/
|
|
24
|
+
export async function waitCommand(options) {
|
|
25
|
+
// Handle explicit start/stop flags
|
|
26
|
+
if (options.start) {
|
|
27
|
+
await waitDaemonCommand('start', {});
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (options.stop) {
|
|
31
|
+
await waitDaemonCommand('stop', {});
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const rateLimitStatus = await checkRateLimitStatus();
|
|
35
|
+
const daemonRunning = isDaemonRunning();
|
|
36
|
+
const tmuxAvailable = isTmuxAvailable();
|
|
37
|
+
if (options.json) {
|
|
38
|
+
console.log(JSON.stringify({
|
|
39
|
+
rateLimit: rateLimitStatus,
|
|
40
|
+
daemon: { running: daemonRunning },
|
|
41
|
+
tmux: { available: tmuxAvailable, insideSession: isInsideTmux() },
|
|
42
|
+
}, null, 2));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// Smart output based on current state
|
|
46
|
+
console.log(chalk.bold('\n🕐 Rate Limit Status\n'));
|
|
47
|
+
if (!rateLimitStatus) {
|
|
48
|
+
console.log(chalk.yellow('Unable to check rate limits (OAuth credentials required)\n'));
|
|
49
|
+
console.log(chalk.gray('Rate limit monitoring requires Claude Pro/Max subscription.'));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (rateLimitStatus.isLimited) {
|
|
53
|
+
// Rate limited - provide helpful guidance
|
|
54
|
+
console.log(chalk.red.bold('⚠️ Rate Limited'));
|
|
55
|
+
console.log(chalk.yellow(`\n${formatRateLimitStatus(rateLimitStatus)}\n`));
|
|
56
|
+
if (!tmuxAvailable) {
|
|
57
|
+
console.log(chalk.gray('💡 Install tmux to enable auto-resume when limit clears'));
|
|
58
|
+
console.log(chalk.gray(' brew install tmux (macOS)'));
|
|
59
|
+
console.log(chalk.gray(' apt install tmux (Linux)\n'));
|
|
60
|
+
}
|
|
61
|
+
else if (!daemonRunning) {
|
|
62
|
+
console.log(chalk.cyan('💡 Want to auto-resume when the limit clears?'));
|
|
63
|
+
console.log(chalk.white(' Run: ') + chalk.green('omc wait --start'));
|
|
64
|
+
console.log(chalk.gray(' (or: omc wait daemon start)\n'));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
console.log(chalk.green('✓ Auto-resume daemon is running'));
|
|
68
|
+
console.log(chalk.gray(' Your session will resume automatically when the limit clears.\n'));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// Not rate limited
|
|
73
|
+
console.log(chalk.green('✓ Not rate limited\n'));
|
|
74
|
+
if (daemonRunning) {
|
|
75
|
+
console.log(chalk.gray('Auto-resume daemon is running (not needed when not rate limited)'));
|
|
76
|
+
console.log(chalk.gray('Stop with: omc wait --stop\n'));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Show current rate limit and daemon status
|
|
82
|
+
*/
|
|
83
|
+
export async function waitStatusCommand(options) {
|
|
84
|
+
const rateLimitStatus = await checkRateLimitStatus();
|
|
85
|
+
const daemonStatus = getDaemonStatus();
|
|
86
|
+
if (options.json) {
|
|
87
|
+
console.log(JSON.stringify({
|
|
88
|
+
rateLimit: rateLimitStatus,
|
|
89
|
+
daemon: daemonStatus,
|
|
90
|
+
tmux: {
|
|
91
|
+
available: isTmuxAvailable(),
|
|
92
|
+
insideSession: isInsideTmux(),
|
|
93
|
+
},
|
|
94
|
+
}, null, 2));
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
console.log(chalk.bold('\n📊 Rate Limit Wait Status\n'));
|
|
98
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
99
|
+
// Rate limit status
|
|
100
|
+
console.log(chalk.bold('\nRate Limits:'));
|
|
101
|
+
if (rateLimitStatus) {
|
|
102
|
+
if (rateLimitStatus.isLimited) {
|
|
103
|
+
console.log(chalk.yellow(` ⚠ ${formatRateLimitStatus(rateLimitStatus)}`));
|
|
104
|
+
if (rateLimitStatus.fiveHourLimited && rateLimitStatus.fiveHourResetsAt) {
|
|
105
|
+
console.log(chalk.gray(` 5-hour resets: ${rateLimitStatus.fiveHourResetsAt.toLocaleString()}`));
|
|
106
|
+
}
|
|
107
|
+
if (rateLimitStatus.weeklyLimited && rateLimitStatus.weeklyResetsAt) {
|
|
108
|
+
console.log(chalk.gray(` Weekly resets: ${rateLimitStatus.weeklyResetsAt.toLocaleString()}`));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.log(chalk.green(' ✓ Not rate limited'));
|
|
113
|
+
console.log(chalk.gray(` 5-hour: ${rateLimitStatus.fiveHourLimited ? '100%' : 'OK'}`));
|
|
114
|
+
console.log(chalk.gray(` Weekly: ${rateLimitStatus.weeklyLimited ? '100%' : 'OK'}`));
|
|
115
|
+
}
|
|
116
|
+
console.log(chalk.dim(` Last checked: ${rateLimitStatus.lastCheckedAt.toLocaleTimeString()}`));
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
console.log(chalk.yellow(' ? Unable to check (no OAuth credentials?)'));
|
|
120
|
+
}
|
|
121
|
+
// Daemon status
|
|
122
|
+
console.log(chalk.bold('\nDaemon:'));
|
|
123
|
+
if (daemonStatus.state) {
|
|
124
|
+
if (daemonStatus.state.isRunning) {
|
|
125
|
+
console.log(chalk.green(` ✓ Running (PID: ${daemonStatus.state.pid})`));
|
|
126
|
+
if (daemonStatus.state.lastPollAt) {
|
|
127
|
+
console.log(chalk.dim(` Last poll: ${daemonStatus.state.lastPollAt.toLocaleTimeString()}`));
|
|
128
|
+
}
|
|
129
|
+
console.log(chalk.dim(` Resume attempts: ${daemonStatus.state.totalResumeAttempts}`));
|
|
130
|
+
console.log(chalk.dim(` Successful: ${daemonStatus.state.successfulResumes}`));
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
console.log(chalk.gray(' ○ Not running'));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
console.log(chalk.gray(' ○ Never started'));
|
|
138
|
+
}
|
|
139
|
+
// tmux status
|
|
140
|
+
console.log(chalk.bold('\ntmux:'));
|
|
141
|
+
if (isTmuxAvailable()) {
|
|
142
|
+
console.log(chalk.green(' ✓ Available'));
|
|
143
|
+
if (isInsideTmux()) {
|
|
144
|
+
console.log(chalk.dim(' Currently inside tmux session'));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
console.log(chalk.yellow(' ⚠ Not installed'));
|
|
149
|
+
console.log(chalk.gray(' Install tmux for auto-resume functionality'));
|
|
150
|
+
}
|
|
151
|
+
console.log('');
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Start/stop the daemon
|
|
155
|
+
*/
|
|
156
|
+
export async function waitDaemonCommand(action, options) {
|
|
157
|
+
const config = {
|
|
158
|
+
verbose: options.verbose,
|
|
159
|
+
pollIntervalMs: options.interval ? options.interval * 1000 : undefined,
|
|
160
|
+
};
|
|
161
|
+
if (action === 'start') {
|
|
162
|
+
if (options.foreground) {
|
|
163
|
+
// Run in foreground (blocking)
|
|
164
|
+
await runDaemonForeground(config);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
const result = startDaemon(config);
|
|
168
|
+
if (result.success) {
|
|
169
|
+
console.log(chalk.green(`✓ ${result.message}`));
|
|
170
|
+
console.log(chalk.gray('\nThe daemon will:'));
|
|
171
|
+
console.log(chalk.gray(' • Poll rate limit status every minute'));
|
|
172
|
+
console.log(chalk.gray(' • Track blocked Claude Code sessions in tmux'));
|
|
173
|
+
console.log(chalk.gray(' • Auto-resume sessions when rate limit clears'));
|
|
174
|
+
console.log(chalk.gray('\nUse "omc wait status" to check daemon status'));
|
|
175
|
+
console.log(chalk.gray('Use "omc wait daemon stop" to stop the daemon'));
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
console.error(chalk.red(`✗ ${result.message}`));
|
|
179
|
+
if (result.error) {
|
|
180
|
+
console.error(chalk.gray(` ${result.error}`));
|
|
181
|
+
}
|
|
182
|
+
process.exit(1);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else if (action === 'stop') {
|
|
187
|
+
const result = stopDaemon(config);
|
|
188
|
+
if (result.success) {
|
|
189
|
+
console.log(chalk.green(`✓ ${result.message}`));
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
console.error(chalk.red(`✗ ${result.message}`));
|
|
193
|
+
if (result.error) {
|
|
194
|
+
console.error(chalk.gray(` ${result.error}`));
|
|
195
|
+
}
|
|
196
|
+
process.exit(1);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Detect blocked Claude Code sessions
|
|
202
|
+
*/
|
|
203
|
+
export async function waitDetectCommand(options) {
|
|
204
|
+
if (!isTmuxAvailable()) {
|
|
205
|
+
console.error(chalk.yellow('⚠ tmux is not installed'));
|
|
206
|
+
console.log(chalk.gray('Install tmux to use session detection and auto-resume'));
|
|
207
|
+
process.exit(1);
|
|
208
|
+
}
|
|
209
|
+
console.log(chalk.blue('Scanning for blocked Claude Code sessions...\n'));
|
|
210
|
+
const config = {
|
|
211
|
+
paneLinesToCapture: options.lines,
|
|
212
|
+
};
|
|
213
|
+
const result = await detectBlockedPanes(config);
|
|
214
|
+
if (options.json) {
|
|
215
|
+
console.log(JSON.stringify(result, null, 2));
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
console.log(result.message);
|
|
219
|
+
if (result.state?.blockedPanes && result.state.blockedPanes.length > 0) {
|
|
220
|
+
console.log(chalk.gray('\nTip: Start the daemon to auto-resume when rate limit clears:'));
|
|
221
|
+
console.log(chalk.gray(' omc wait daemon start'));
|
|
222
|
+
}
|
|
223
|
+
// Also show rate limit status
|
|
224
|
+
if (result.state?.rateLimitStatus) {
|
|
225
|
+
console.log(chalk.bold('\nCurrent Rate Limit:'));
|
|
226
|
+
console.log(` ${formatRateLimitStatus(result.state.rateLimitStatus)}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=wait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../../src/cli/commands/wait.ts"],"names":[],"mappings":"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"}
|