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.
Files changed (163) hide show
  1. package/README.md +40 -1
  2. package/commands/hud.md +37 -5
  3. package/commands/omc-setup.md +105 -0
  4. package/dist/__tests__/delegation-enforcement-levels.test.d.ts +9 -0
  5. package/dist/__tests__/delegation-enforcement-levels.test.d.ts.map +1 -0
  6. package/dist/__tests__/delegation-enforcement-levels.test.js +550 -0
  7. package/dist/__tests__/delegation-enforcement-levels.test.js.map +1 -0
  8. package/dist/__tests__/hud/analytics-display.test.js +137 -1
  9. package/dist/__tests__/hud/analytics-display.test.js.map +1 -1
  10. package/dist/__tests__/hud-windows.test.d.ts +2 -0
  11. package/dist/__tests__/hud-windows.test.d.ts.map +1 -0
  12. package/dist/__tests__/hud-windows.test.js +91 -0
  13. package/dist/__tests__/hud-windows.test.js.map +1 -0
  14. package/dist/__tests__/installer.test.js +1 -1
  15. package/dist/__tests__/rate-limit-wait/daemon.test.d.ts +5 -0
  16. package/dist/__tests__/rate-limit-wait/daemon.test.d.ts.map +1 -0
  17. package/dist/__tests__/rate-limit-wait/daemon.test.js +313 -0
  18. package/dist/__tests__/rate-limit-wait/daemon.test.js.map +1 -0
  19. package/dist/__tests__/rate-limit-wait/integration.test.d.ts +8 -0
  20. package/dist/__tests__/rate-limit-wait/integration.test.d.ts.map +1 -0
  21. package/dist/__tests__/rate-limit-wait/integration.test.js +329 -0
  22. package/dist/__tests__/rate-limit-wait/integration.test.js.map +1 -0
  23. package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.d.ts +5 -0
  24. package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.d.ts.map +1 -0
  25. package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.js +167 -0
  26. package/dist/__tests__/rate-limit-wait/rate-limit-monitor.test.js.map +1 -0
  27. package/dist/__tests__/rate-limit-wait/tmux-detector.test.d.ts +5 -0
  28. package/dist/__tests__/rate-limit-wait/tmux-detector.test.d.ts.map +1 -0
  29. package/dist/__tests__/rate-limit-wait/tmux-detector.test.js +295 -0
  30. package/dist/__tests__/rate-limit-wait/tmux-detector.test.js.map +1 -0
  31. package/dist/cli/commands/wait.d.ts +52 -0
  32. package/dist/cli/commands/wait.d.ts.map +1 -0
  33. package/dist/cli/commands/wait.js +229 -0
  34. package/dist/cli/commands/wait.js.map +1 -0
  35. package/dist/cli/index.js +54 -0
  36. package/dist/cli/index.js.map +1 -1
  37. package/dist/features/rate-limit-wait/daemon.d.ts +52 -0
  38. package/dist/features/rate-limit-wait/daemon.d.ts.map +1 -0
  39. package/dist/features/rate-limit-wait/daemon.js +585 -0
  40. package/dist/features/rate-limit-wait/daemon.js.map +1 -0
  41. package/dist/features/rate-limit-wait/index.d.ts +16 -0
  42. package/dist/features/rate-limit-wait/index.d.ts.map +1 -0
  43. package/dist/features/rate-limit-wait/index.js +18 -0
  44. package/dist/features/rate-limit-wait/index.js.map +1 -0
  45. package/dist/features/rate-limit-wait/rate-limit-monitor.d.ts +22 -0
  46. package/dist/features/rate-limit-wait/rate-limit-monitor.d.ts.map +1 -0
  47. package/dist/features/rate-limit-wait/rate-limit-monitor.js +99 -0
  48. package/dist/features/rate-limit-wait/rate-limit-monitor.js.map +1 -0
  49. package/dist/features/rate-limit-wait/tmux-detector.d.ts +59 -0
  50. package/dist/features/rate-limit-wait/tmux-detector.d.ts.map +1 -0
  51. package/dist/features/rate-limit-wait/tmux-detector.js +304 -0
  52. package/dist/features/rate-limit-wait/tmux-detector.js.map +1 -0
  53. package/dist/features/rate-limit-wait/types.d.ts +121 -0
  54. package/dist/features/rate-limit-wait/types.d.ts.map +1 -0
  55. package/dist/features/rate-limit-wait/types.js +8 -0
  56. package/dist/features/rate-limit-wait/types.js.map +1 -0
  57. package/dist/features/state-manager/index.d.ts.map +1 -1
  58. package/dist/features/state-manager/index.js +4 -1
  59. package/dist/features/state-manager/index.js.map +1 -1
  60. package/dist/hooks/bridge.d.ts +1 -1
  61. package/dist/hooks/bridge.d.ts.map +1 -1
  62. package/dist/hooks/bridge.js +50 -4
  63. package/dist/hooks/bridge.js.map +1 -1
  64. package/dist/hooks/index.d.ts +5 -0
  65. package/dist/hooks/index.d.ts.map +1 -1
  66. package/dist/hooks/index.js +15 -0
  67. package/dist/hooks/index.js.map +1 -1
  68. package/dist/hooks/omc-orchestrator/audit.d.ts +2 -1
  69. package/dist/hooks/omc-orchestrator/audit.d.ts.map +1 -1
  70. package/dist/hooks/omc-orchestrator/audit.js.map +1 -1
  71. package/dist/hooks/omc-orchestrator/index.d.ts +7 -0
  72. package/dist/hooks/omc-orchestrator/index.d.ts.map +1 -1
  73. package/dist/hooks/omc-orchestrator/index.js +95 -8
  74. package/dist/hooks/omc-orchestrator/index.js.map +1 -1
  75. package/dist/hooks/permission-handler/__tests__/index.test.d.ts +2 -0
  76. package/dist/hooks/permission-handler/__tests__/index.test.d.ts.map +1 -0
  77. package/dist/hooks/permission-handler/__tests__/index.test.js +291 -0
  78. package/dist/hooks/permission-handler/__tests__/index.test.js.map +1 -0
  79. package/dist/hooks/permission-handler/index.d.ts +42 -0
  80. package/dist/hooks/permission-handler/index.d.ts.map +1 -0
  81. package/dist/hooks/permission-handler/index.js +107 -0
  82. package/dist/hooks/permission-handler/index.js.map +1 -0
  83. package/dist/hooks/plugin-patterns/index.d.ts +5 -0
  84. package/dist/hooks/plugin-patterns/index.d.ts.map +1 -1
  85. package/dist/hooks/plugin-patterns/index.js +26 -1
  86. package/dist/hooks/plugin-patterns/index.js.map +1 -1
  87. package/dist/hooks/pre-compact/index.d.ts +82 -0
  88. package/dist/hooks/pre-compact/index.d.ts.map +1 -0
  89. package/dist/hooks/pre-compact/index.js +265 -0
  90. package/dist/hooks/pre-compact/index.js.map +1 -0
  91. package/dist/hooks/session-end/index.d.ts +42 -0
  92. package/dist/hooks/session-end/index.d.ts.map +1 -0
  93. package/dist/hooks/session-end/index.js +200 -0
  94. package/dist/hooks/session-end/index.js.map +1 -0
  95. package/dist/hooks/setup/index.d.ts +66 -0
  96. package/dist/hooks/setup/index.d.ts.map +1 -0
  97. package/dist/hooks/setup/index.js +299 -0
  98. package/dist/hooks/setup/index.js.map +1 -0
  99. package/dist/hooks/setup/types.d.ts +25 -0
  100. package/dist/hooks/setup/types.d.ts.map +1 -0
  101. package/dist/hooks/setup/types.js +5 -0
  102. package/dist/hooks/setup/types.js.map +1 -0
  103. package/dist/hooks/subagent-tracker/index.d.ts +68 -29
  104. package/dist/hooks/subagent-tracker/index.d.ts.map +1 -1
  105. package/dist/hooks/subagent-tracker/index.js +316 -131
  106. package/dist/hooks/subagent-tracker/index.js.map +1 -1
  107. package/dist/hud/analytics-display.d.ts +16 -0
  108. package/dist/hud/analytics-display.d.ts.map +1 -1
  109. package/dist/hud/analytics-display.js +35 -9
  110. package/dist/hud/analytics-display.js.map +1 -1
  111. package/dist/hud/render.d.ts.map +1 -1
  112. package/dist/hud/render.js +49 -18
  113. package/dist/hud/render.js.map +1 -1
  114. package/dist/hud/types.d.ts +2 -0
  115. package/dist/hud/types.d.ts.map +1 -1
  116. package/dist/hud/types.js +14 -0
  117. package/dist/hud/types.js.map +1 -1
  118. package/dist/installer/index.d.ts +1 -1
  119. package/dist/installer/index.d.ts.map +1 -1
  120. package/dist/installer/index.js +4 -3
  121. package/dist/installer/index.js.map +1 -1
  122. package/hooks/hooks.json +83 -1
  123. package/hooks/keyword-detector.sh +4 -4
  124. package/hooks/persistent-mode.sh +10 -10
  125. package/hooks/session-start.sh +4 -4
  126. package/package.json +3 -1
  127. package/scripts/keyword-detector.mjs +4 -4
  128. package/scripts/permission-handler.mjs +23 -0
  129. package/scripts/persistent-mode.mjs +6 -6
  130. package/scripts/persistent-mode.sh +10 -10
  131. package/scripts/pre-compact.mjs +23 -0
  132. package/scripts/session-end.mjs +23 -0
  133. package/scripts/session-start.mjs +4 -4
  134. package/scripts/setup-init.mjs +23 -0
  135. package/scripts/setup-maintenance.mjs +23 -0
  136. package/scripts/subagent-tracker.mjs +35 -0
  137. package/skills/hud/SKILL.md +37 -5
  138. package/skills/omc-setup/SKILL.md +162 -4
  139. package/skills/writer-memory/SKILL.md +443 -0
  140. package/skills/writer-memory/lib/character-tracker.ts +338 -0
  141. package/skills/writer-memory/lib/memory-manager.ts +804 -0
  142. package/skills/writer-memory/lib/relationship-graph.ts +400 -0
  143. package/skills/writer-memory/lib/scene-organizer.ts +544 -0
  144. package/skills/writer-memory/lib/synopsis-builder.ts +339 -0
  145. package/skills/writer-memory/templates/synopsis-template.md +46 -0
  146. package/templates/hooks/keyword-detector.mjs +198 -0
  147. package/templates/hooks/keyword-detector.sh +102 -0
  148. package/templates/hooks/persistent-mode.mjs +249 -0
  149. package/templates/hooks/persistent-mode.sh +187 -0
  150. package/templates/hooks/post-tool-use.mjs +133 -0
  151. package/templates/hooks/post-tool-use.sh +90 -0
  152. package/templates/hooks/pre-tool-use.mjs +145 -0
  153. package/templates/hooks/pre-tool-use.sh +113 -0
  154. package/templates/hooks/session-start.mjs +100 -0
  155. package/templates/hooks/session-start.sh +62 -0
  156. package/templates/hooks/stop-continuation.mjs +80 -0
  157. package/templates/hooks/stop-continuation.sh +40 -0
  158. package/templates/rules/README.md +40 -0
  159. package/templates/rules/coding-style.md +74 -0
  160. package/templates/rules/git-workflow.md +41 -0
  161. package/templates/rules/performance.md +40 -0
  162. package/templates/rules/security.md +41 -0
  163. 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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"}