@liangjie559567/ultrapower 5.0.25 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/dist/__tests__/compatibility.test.js +6 -6
  3. package/dist/__tests__/live-data.test.js +9 -9
  4. package/dist/__tests__/rate-limit-wait/integration.test.js +68 -68
  5. package/dist/__tests__/rate-limit-wait/tmux-detector.test.js +33 -33
  6. package/dist/agents/prompt-sections/index.js +36 -36
  7. package/dist/cli/index.js +226 -226
  8. package/dist/features/rate-limit-wait/daemon.js +5 -5
  9. package/dist/hooks/autopilot/enforcement.js +19 -19
  10. package/dist/hooks/autopilot/validation.js +58 -58
  11. package/dist/hooks/axiom-boot/index.d.ts.map +1 -1
  12. package/dist/hooks/axiom-boot/index.js +2 -1
  13. package/dist/hooks/axiom-boot/index.js.map +1 -1
  14. package/dist/hooks/axiom-boot/storage.d.ts +1 -0
  15. package/dist/hooks/axiom-boot/storage.d.ts.map +1 -1
  16. package/dist/hooks/axiom-boot/storage.js +37 -1
  17. package/dist/hooks/axiom-boot/storage.js.map +1 -1
  18. package/dist/hooks/bridge.d.ts.map +1 -1
  19. package/dist/hooks/bridge.js +110 -100
  20. package/dist/hooks/bridge.js.map +1 -1
  21. package/dist/hooks/keyword-detector/__tests__/index.test.js +7 -7
  22. package/dist/hooks/learner/learning-queue.d.ts.map +1 -1
  23. package/dist/hooks/learner/learning-queue.js +2 -1
  24. package/dist/hooks/learner/learning-queue.js.map +1 -1
  25. package/dist/hooks/learner/session-reflector.d.ts +22 -0
  26. package/dist/hooks/learner/session-reflector.d.ts.map +1 -0
  27. package/dist/hooks/learner/session-reflector.js +52 -0
  28. package/dist/hooks/learner/session-reflector.js.map +1 -0
  29. package/dist/hooks/learner/usage-tracker.d.ts +45 -0
  30. package/dist/hooks/learner/usage-tracker.d.ts.map +1 -0
  31. package/dist/hooks/learner/usage-tracker.js +143 -0
  32. package/dist/hooks/learner/usage-tracker.js.map +1 -0
  33. package/dist/hooks/omc-orchestrator/index.js +20 -20
  34. package/dist/hooks/session-end/callbacks.js +10 -10
  35. package/dist/hooks/session-end/index.d.ts.map +1 -1
  36. package/dist/hooks/session-end/index.js +17 -0
  37. package/dist/hooks/session-end/index.js.map +1 -1
  38. package/dist/hooks/think-mode/__tests__/index.test.js +6 -6
  39. package/dist/mcp/codex-core.js +26 -26
  40. package/dist/mcp/gemini-core.js +2 -2
  41. package/dist/team/mcp-team-bridge.js +26 -26
  42. package/docs/CLAUDE.md +1 -1
  43. package/package.json +1 -1
  44. package/scripts/persistent-mode.cjs +605 -605
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "ultrapower",
3
3
  "description": "Disciplined multi-agent orchestration: workflow enforcement + parallel execution. Combines superpowers' TDD/debugging discipline with OMC's multi-agent execution capabilities.",
4
- "version": "5.0.25",
4
+ "version": "5.1.0",
5
5
  "author": {
6
6
  "name": "Jesse Vincent & oh-my-claudecode contributors"
7
7
  },
@@ -36,12 +36,12 @@ function createTestPlugin(name, manifest) {
36
36
  // Create a sample skill
37
37
  const sampleSkillDir = join(skillsDir, 'sample-skill');
38
38
  mkdirSync(sampleSkillDir, { recursive: true });
39
- writeFileSync(join(sampleSkillDir, 'SKILL.md'), `---
40
- name: sample-skill
41
- description: A sample skill for testing
42
- ---
43
-
44
- This is a sample skill.
39
+ writeFileSync(join(sampleSkillDir, 'SKILL.md'), `---
40
+ name: sample-skill
41
+ description: A sample skill for testing
42
+ ---
43
+
44
+ This is a sample skill.
45
45
  `);
46
46
  }
47
47
  return pluginDir;
@@ -253,15 +253,15 @@ describe('resolveLiveData - output formats', () => {
253
253
  expect(result).toContain('format="table"');
254
254
  });
255
255
  it('!diff adds format="diff" with file/add/del stats', () => {
256
- const diffOutput = `diff --git a/src/main.ts b/src/main.ts
257
- --- a/src/main.ts
258
- +++ b/src/main.ts
259
- @@ -1,3 +1,5 @@
260
- +import { foo } from 'bar';
261
- +import { baz } from 'qux';
262
- const x = 1;
263
- -const y = 2;
264
- const z = 3;
256
+ const diffOutput = `diff --git a/src/main.ts b/src/main.ts
257
+ --- a/src/main.ts
258
+ +++ b/src/main.ts
259
+ @@ -1,3 +1,5 @@
260
+ +import { foo } from 'bar';
261
+ +import { baz } from 'qux';
262
+ const x = 1;
263
+ -const y = 2;
264
+ const z = 3;
265
265
  `;
266
266
  mockedExecSync.mockReturnValue(diffOutput);
267
267
  const result = resolveLiveData('!diff git diff');
@@ -95,20 +95,20 @@ describe('Rate Limit Wait Integration Tests', () => {
95
95
  });
96
96
  describe('Scenario: tmux pane analysis accuracy', () => {
97
97
  it('should correctly identify Claude Code rate limit message', () => {
98
- const realWorldContent = `
99
- ╭─────────────────────────────────────────────────────────────────╮
100
- │ Claude Code │
101
- ╰─────────────────────────────────────────────────────────────────╯
102
-
103
- You've reached your usage limit for the 5-hour period.
104
- Your limit will reset at 3:45 PM.
105
-
106
- What would you like to do?
107
-
108
- [1] Wait and continue automatically when limit resets
109
- [2] Switch to a different conversation
110
- [3] Exit
111
-
98
+ const realWorldContent = `
99
+ ╭─────────────────────────────────────────────────────────────────╮
100
+ │ Claude Code │
101
+ ╰─────────────────────────────────────────────────────────────────╯
102
+
103
+ You've reached your usage limit for the 5-hour period.
104
+ Your limit will reset at 3:45 PM.
105
+
106
+ What would you like to do?
107
+
108
+ [1] Wait and continue automatically when limit resets
109
+ [2] Switch to a different conversation
110
+ [3] Exit
111
+
112
112
  > `;
113
113
  const result = analyzePaneContent(realWorldContent);
114
114
  expect(result.hasClaudeCode).toBe(true);
@@ -118,18 +118,18 @@ What would you like to do?
118
118
  expect(result.confidence).toBeGreaterThanOrEqual(0.8);
119
119
  });
120
120
  it('should correctly identify weekly rate limit message', () => {
121
- const weeklyLimitContent = `
122
- Claude Code v1.0.0
123
-
124
- ⚠️ Weekly usage limit reached
125
-
126
- You've used your weekly allocation of tokens.
127
- Limit resets on Monday at 12:00 AM UTC.
128
-
129
- Options:
130
- [1] Continue when limit resets
131
- [2] Exit
132
-
121
+ const weeklyLimitContent = `
122
+ Claude Code v1.0.0
123
+
124
+ ⚠️ Weekly usage limit reached
125
+
126
+ You've used your weekly allocation of tokens.
127
+ Limit resets on Monday at 12:00 AM UTC.
128
+
129
+ Options:
130
+ [1] Continue when limit resets
131
+ [2] Exit
132
+
133
133
  Enter choice: `;
134
134
  const result = analyzePaneContent(weeklyLimitContent);
135
135
  expect(result.hasClaudeCode).toBe(true);
@@ -138,18 +138,18 @@ Enter choice: `;
138
138
  expect(result.rateLimitType).toBe('weekly');
139
139
  });
140
140
  it('should NOT flag normal Claude Code output as blocked', () => {
141
- const normalContent = `
142
- Claude Code
143
-
144
- > What would you like to build today?
145
-
146
- I can help you with:
147
- - Writing code
148
- - Debugging
149
- - Refactoring
150
- - Documentation
151
-
152
- Just describe what you need!
141
+ const normalContent = `
142
+ Claude Code
143
+
144
+ > What would you like to build today?
145
+
146
+ I can help you with:
147
+ - Writing code
148
+ - Debugging
149
+ - Refactoring
150
+ - Documentation
151
+
152
+ Just describe what you need!
153
153
  `;
154
154
  const result = analyzePaneContent(normalContent);
155
155
  expect(result.hasClaudeCode).toBe(true);
@@ -157,12 +157,12 @@ Just describe what you need!
157
157
  expect(result.isBlocked).toBe(false);
158
158
  });
159
159
  it('should NOT flag unrelated rate limit messages', () => {
160
- const unrelatedContent = `
161
- $ curl https://api.github.com/users/test
162
- {
163
- "message": "API rate limit exceeded for IP",
164
- "documentation_url": "https://docs.github.com"
165
- }
160
+ const unrelatedContent = `
161
+ $ curl https://api.github.com/users/test
162
+ {
163
+ "message": "API rate limit exceeded for IP",
164
+ "documentation_url": "https://docs.github.com"
165
+ }
166
166
  $ `;
167
167
  const result = analyzePaneContent(unrelatedContent);
168
168
  expect(result.hasClaudeCode).toBe(false);
@@ -172,18 +172,18 @@ $ `;
172
172
  it('should handle edge case: old rate limit message scrolled up', () => {
173
173
  // Only last 15 lines should be analyzed
174
174
  // Rate limit message from earlier should be ignored if not in recent content
175
- const scrolledContent = `
176
- User: fix the bug
177
- Assistant: I'll fix that for you.
178
- [Edit] src/main.ts
179
- Done! The bug is fixed.
180
-
181
- User: thanks
182
- Assistant: You're welcome!
183
-
184
- User: what else?
185
- Assistant: I can help with more tasks.
186
-
175
+ const scrolledContent = `
176
+ User: fix the bug
177
+ Assistant: I'll fix that for you.
178
+ [Edit] src/main.ts
179
+ Done! The bug is fixed.
180
+
181
+ User: thanks
182
+ Assistant: You're welcome!
183
+
184
+ User: what else?
185
+ Assistant: I can help with more tasks.
186
+
187
187
  > `;
188
188
  const result = analyzePaneContent(scrolledContent);
189
189
  expect(result.isBlocked).toBe(false);
@@ -311,25 +311,25 @@ Assistant: I can help with more tasks.
311
311
  });
312
312
  describe('Scenario: Confidence scoring', () => {
313
313
  it('should give higher confidence for multiple indicators', () => {
314
- const highConfidenceContent = `
315
- Claude Code
316
- Rate limit reached
317
- 5-hour usage limit
318
- [1] Continue
319
- [2] Exit
314
+ const highConfidenceContent = `
315
+ Claude Code
316
+ Rate limit reached
317
+ 5-hour usage limit
318
+ [1] Continue
319
+ [2] Exit
320
320
  `;
321
- const lowConfidenceContent = `
322
- Claude
323
- rate limit
321
+ const lowConfidenceContent = `
322
+ Claude
323
+ rate limit
324
324
  `;
325
325
  const highResult = analyzePaneContent(highConfidenceContent);
326
326
  const lowResult = analyzePaneContent(lowConfidenceContent);
327
327
  expect(highResult.confidence).toBeGreaterThan(lowResult.confidence);
328
328
  });
329
329
  it('should require minimum confidence to mark as blocked', () => {
330
- const ambiguousContent = `
331
- some claude reference
332
- limit mentioned
330
+ const ambiguousContent = `
331
+ some claude reference
332
+ limit mentioned
333
333
  `;
334
334
  const result = analyzePaneContent(ambiguousContent);
335
335
  // Even if some patterns match, confidence should be too low
@@ -15,11 +15,11 @@ describe('tmux-detector', () => {
15
15
  });
16
16
  describe('analyzePaneContent', () => {
17
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
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
23
  `;
24
24
  const result = analyzePaneContent(content);
25
25
  expect(result.hasClaudeCode).toBe(true);
@@ -28,38 +28,38 @@ describe('tmux-detector', () => {
28
28
  expect(result.confidence).toBeGreaterThan(0.5);
29
29
  });
30
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
31
+ const content = `
32
+ Claude Code assistant
33
+ 5-hour usage limit reached
34
+ [1] Wait for reset
35
35
  `;
36
36
  const result = analyzePaneContent(content);
37
37
  expect(result.hasRateLimitMessage).toBe(true);
38
38
  expect(result.rateLimitType).toBe('five_hour');
39
39
  });
40
40
  it('should detect weekly rate limit', () => {
41
- const content = `
42
- Claude Code
43
- Weekly usage quota exceeded
44
- Please try again later
41
+ const content = `
42
+ Claude Code
43
+ Weekly usage quota exceeded
44
+ Please try again later
45
45
  `;
46
46
  const result = analyzePaneContent(content);
47
47
  expect(result.hasRateLimitMessage).toBe(true);
48
48
  expect(result.rateLimitType).toBe('weekly');
49
49
  });
50
50
  it('should not flag content without Claude Code indicators', () => {
51
- const content = `
52
- vim test.js
53
- Hello World
51
+ const content = `
52
+ vim test.js
53
+ Hello World
54
54
  `;
55
55
  const result = analyzePaneContent(content);
56
56
  expect(result.hasClaudeCode).toBe(false);
57
57
  expect(result.isBlocked).toBe(false);
58
58
  });
59
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
60
+ const content = `
61
+ curl api.example.com
62
+ Error: rate limit exceeded
63
63
  `;
64
64
  const result = analyzePaneContent(content);
65
65
  expect(result.hasClaudeCode).toBe(false);
@@ -74,25 +74,25 @@ describe('tmux-detector', () => {
74
74
  expect(result.confidence).toBe(0);
75
75
  });
76
76
  it('should detect waiting patterns', () => {
77
- const content = `
78
- Claude assistant
79
- Rate limit reached
80
- [1] Continue
81
- [2] Cancel
77
+ const content = `
78
+ Claude assistant
79
+ Rate limit reached
80
+ [1] Continue
81
+ [2] Cancel
82
82
  `;
83
83
  const result = analyzePaneContent(content);
84
84
  expect(result.confidence).toBeGreaterThan(0.6);
85
85
  });
86
86
  it('should detect Claude limit screen phrasing: hit your limit + numeric menu', () => {
87
- const content = `
88
- Claude Code
89
- You've hit your limit · resets Feb 17 at 2pm (Asia/Seoul)
90
- What do you want to do?
91
-
92
- ❯ 1. Stop and wait for limit to reset
93
- 2. Request more
94
-
95
- Enter to confirm · Esc to cancel
87
+ const content = `
88
+ Claude Code
89
+ You've hit your limit · resets Feb 17 at 2pm (Asia/Seoul)
90
+ What do you want to do?
91
+
92
+ ❯ 1. Stop and wait for limit to reset
93
+ 2. Request more
94
+
95
+ Enter to confirm · Esc to cancel
96
96
  `;
97
97
  const result = analyzePaneContent(content);
98
98
  expect(result.hasClaudeCode).toBe(true);
@@ -8,13 +8,13 @@
8
8
  * Build the header section with core orchestrator identity
9
9
  */
10
10
  export function buildHeader() {
11
- return `You are the relentless orchestrator of a multi-agent development system.
12
-
13
- ## RELENTLESS EXECUTION
14
-
15
- You are BOUND to your task list. You do not stop. You do not quit. You do not take breaks. Work continues until EVERY task is COMPLETE.
16
-
17
- ## Your Core Duty
11
+ return `You are the relentless orchestrator of a multi-agent development system.
12
+
13
+ ## RELENTLESS EXECUTION
14
+
15
+ You are BOUND to your task list. You do not stop. You do not quit. You do not take breaks. Work continues until EVERY task is COMPLETE.
16
+
17
+ ## Your Core Duty
18
18
  You coordinate specialized subagents to accomplish complex software engineering tasks. Abandoning work mid-task is not an option. If you stop without completing ALL tasks, you have failed.`;
19
19
  }
20
20
  /**
@@ -138,53 +138,53 @@ export function buildDelegationMatrix(agents) {
138
138
  * Build orchestration principles section
139
139
  */
140
140
  export function buildOrchestrationPrinciples() {
141
- return `## Orchestration Principles
142
- 1. **Delegate Aggressively**: Fire off subagents for specialized tasks - don't do everything yourself
143
- 2. **Parallelize Ruthlessly**: Launch multiple subagents concurrently whenever tasks are independent
144
- 3. **PERSIST RELENTLESSLY**: Continue until ALL tasks are VERIFIED complete - check your todo list BEFORE stopping
145
- 4. **Communicate Progress**: Keep the user informed but DON'T STOP to explain when you should be working
141
+ return `## Orchestration Principles
142
+ 1. **Delegate Aggressively**: Fire off subagents for specialized tasks - don't do everything yourself
143
+ 2. **Parallelize Ruthlessly**: Launch multiple subagents concurrently whenever tasks are independent
144
+ 3. **PERSIST RELENTLESSLY**: Continue until ALL tasks are VERIFIED complete - check your todo list BEFORE stopping
145
+ 4. **Communicate Progress**: Keep the user informed but DON'T STOP to explain when you should be working
146
146
  5. **Verify Thoroughly**: Test, check, verify - then verify again`;
147
147
  }
148
148
  /**
149
149
  * Build workflow section
150
150
  */
151
151
  export function buildWorkflow() {
152
- return `## Workflow
153
- 1. Analyze the user's request and break it into tasks using TodoWrite
154
- 2. Mark the first task in_progress and BEGIN WORKING
155
- 3. Delegate to appropriate subagents based on task type
156
- 4. Coordinate results and handle any issues WITHOUT STOPPING
157
- 5. Mark tasks complete ONLY when verified
158
- 6. LOOP back to step 2 until ALL tasks show 'completed'
159
- 7. Final verification: Re-read todo list, confirm 100% completion
152
+ return `## Workflow
153
+ 1. Analyze the user's request and break it into tasks using TodoWrite
154
+ 2. Mark the first task in_progress and BEGIN WORKING
155
+ 3. Delegate to appropriate subagents based on task type
156
+ 4. Coordinate results and handle any issues WITHOUT STOPPING
157
+ 5. Mark tasks complete ONLY when verified
158
+ 6. LOOP back to step 2 until ALL tasks show 'completed'
159
+ 7. Final verification: Re-read todo list, confirm 100% completion
160
160
  8. Only THEN may you rest`;
161
161
  }
162
162
  /**
163
163
  * Build critical rules section
164
164
  */
165
165
  export function buildCriticalRules() {
166
- return `## CRITICAL RULES - VIOLATION IS FAILURE
167
-
168
- 1. **NEVER STOP WITH INCOMPLETE WORK** - If your todo list has pending/in_progress items, YOU ARE NOT DONE
169
- 2. **ALWAYS VERIFY** - Check your todo list before ANY attempt to conclude
170
- 3. **NO PREMATURE CONCLUSIONS** - Saying "I've completed the task" without verification is a LIE
171
- 4. **PARALLEL EXECUTION** - Use it whenever possible for speed
172
- 5. **CONTINUOUS PROGRESS** - Report progress but keep working
173
- 6. **WHEN BLOCKED, UNBLOCK** - Don't stop because something is hard; find another way
166
+ return `## CRITICAL RULES - VIOLATION IS FAILURE
167
+
168
+ 1. **NEVER STOP WITH INCOMPLETE WORK** - If your todo list has pending/in_progress items, YOU ARE NOT DONE
169
+ 2. **ALWAYS VERIFY** - Check your todo list before ANY attempt to conclude
170
+ 3. **NO PREMATURE CONCLUSIONS** - Saying "I've completed the task" without verification is a LIE
171
+ 4. **PARALLEL EXECUTION** - Use it whenever possible for speed
172
+ 5. **CONTINUOUS PROGRESS** - Report progress but keep working
173
+ 6. **WHEN BLOCKED, UNBLOCK** - Don't stop because something is hard; find another way
174
174
  7. **ASK ONLY WHEN NECESSARY** - Clarifying questions are for ambiguity, not for avoiding work`;
175
175
  }
176
176
  /**
177
177
  * Build completion checklist section
178
178
  */
179
179
  export function buildCompletionChecklist() {
180
- return `## Completion Checklist
181
- Before concluding, you MUST verify:
182
- - [ ] Every todo item is marked 'completed'
183
- - [ ] All requested functionality is implemented
184
- - [ ] Tests pass (if applicable)
185
- - [ ] No errors remain unaddressed
186
- - [ ] The user's original request is FULLY satisfied
187
-
180
+ return `## Completion Checklist
181
+ Before concluding, you MUST verify:
182
+ - [ ] Every todo item is marked 'completed'
183
+ - [ ] All requested functionality is implemented
184
+ - [ ] Tests pass (if applicable)
185
+ - [ ] No errors remain unaddressed
186
+ - [ ] The user's original request is FULLY satisfied
187
+
188
188
  If ANY checkbox is unchecked, YOU ARE NOT DONE. Continue working.`;
189
189
  }
190
190
  /**