@liangjie559567/ultrapower 5.4.8 → 5.5.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 (70) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/bridge/codex-server.cjs +1 -0
  4. package/bridge/gemini-server.cjs +4 -2
  5. package/bridge/mcp-server.cjs +75 -4
  6. package/bridge/team-bridge.cjs +400 -55
  7. package/dist/features/rate-limit-wait/daemon.d.ts.map +1 -1
  8. package/dist/features/rate-limit-wait/daemon.js +39 -6
  9. package/dist/features/rate-limit-wait/daemon.js.map +1 -1
  10. package/dist/hooks/__tests__/bridge-security.test.js +94 -1
  11. package/dist/hooks/__tests__/bridge-security.test.js.map +1 -1
  12. package/dist/hooks/bridge-normalize.d.ts.map +1 -1
  13. package/dist/hooks/bridge-normalize.js +5 -2
  14. package/dist/hooks/bridge-normalize.js.map +1 -1
  15. package/dist/hooks/subagent-tracker/__tests__/syncSleep.test.d.ts +10 -0
  16. package/dist/hooks/subagent-tracker/__tests__/syncSleep.test.d.ts.map +1 -0
  17. package/dist/hooks/subagent-tracker/__tests__/syncSleep.test.js +112 -0
  18. package/dist/hooks/subagent-tracker/__tests__/syncSleep.test.js.map +1 -0
  19. package/dist/hooks/subagent-tracker/index.d.ts.map +1 -1
  20. package/dist/hooks/subagent-tracker/index.js +37 -5
  21. package/dist/hooks/subagent-tracker/index.js.map +1 -1
  22. package/dist/lib/__tests__/atomic-write.test.d.ts +2 -0
  23. package/dist/lib/__tests__/atomic-write.test.d.ts.map +1 -0
  24. package/dist/lib/__tests__/atomic-write.test.js +197 -0
  25. package/dist/lib/__tests__/atomic-write.test.js.map +1 -0
  26. package/dist/mcp/__tests__/gemini-yolo-env.test.d.ts +2 -0
  27. package/dist/mcp/__tests__/gemini-yolo-env.test.d.ts.map +1 -0
  28. package/dist/mcp/__tests__/gemini-yolo-env.test.js +274 -0
  29. package/dist/mcp/__tests__/gemini-yolo-env.test.js.map +1 -0
  30. package/dist/mcp/gemini-core.d.ts +1 -0
  31. package/dist/mcp/gemini-core.d.ts.map +1 -1
  32. package/dist/mcp/gemini-core.js +11 -2
  33. package/dist/mcp/gemini-core.js.map +1 -1
  34. package/dist/notifications/__tests__/sleepMs.test.d.ts +10 -0
  35. package/dist/notifications/__tests__/sleepMs.test.d.ts.map +1 -0
  36. package/dist/notifications/__tests__/sleepMs.test.js +117 -0
  37. package/dist/notifications/__tests__/sleepMs.test.js.map +1 -0
  38. package/dist/notifications/session-registry.d.ts.map +1 -1
  39. package/dist/notifications/session-registry.js +35 -2
  40. package/dist/notifications/session-registry.js.map +1 -1
  41. package/dist/team/mcp-team-bridge.d.ts.map +1 -1
  42. package/dist/team/mcp-team-bridge.js +2 -1
  43. package/dist/team/mcp-team-bridge.js.map +1 -1
  44. package/dist/tools/__tests__/state-tools.test.js +76 -0
  45. package/dist/tools/__tests__/state-tools.test.js.map +1 -1
  46. package/dist/tools/lsp/__tests__/client-timer-buffer.test.d.ts +11 -0
  47. package/dist/tools/lsp/__tests__/client-timer-buffer.test.d.ts.map +1 -0
  48. package/dist/tools/lsp/__tests__/client-timer-buffer.test.js +222 -0
  49. package/dist/tools/lsp/__tests__/client-timer-buffer.test.js.map +1 -0
  50. package/dist/tools/lsp/__tests__/command-exists.test.d.ts +2 -0
  51. package/dist/tools/lsp/__tests__/command-exists.test.d.ts.map +1 -0
  52. package/dist/tools/lsp/__tests__/command-exists.test.js +104 -0
  53. package/dist/tools/lsp/__tests__/command-exists.test.js.map +1 -0
  54. package/dist/tools/lsp/client.d.ts.map +1 -1
  55. package/dist/tools/lsp/client.js +15 -0
  56. package/dist/tools/lsp/client.js.map +1 -1
  57. package/dist/tools/lsp/servers.d.ts +7 -1
  58. package/dist/tools/lsp/servers.d.ts.map +1 -1
  59. package/dist/tools/lsp/servers.js +14 -3
  60. package/dist/tools/lsp/servers.js.map +1 -1
  61. package/dist/tools/state-tools.d.ts +9 -8
  62. package/dist/tools/state-tools.d.ts.map +1 -1
  63. package/dist/tools/state-tools.js +44 -1
  64. package/dist/tools/state-tools.js.map +1 -1
  65. package/docs/reviews/draft-prd-ultrapower-pain-fix/review_tech.md +219 -0
  66. package/docs/reviews/draft_prd_pain_points/review_domain.md +215 -0
  67. package/docs/reviews/ultrapower-full-bugfix-plan/review_product.md +135 -0
  68. package/docs/reviews/ultrapower-pain-points/review_critic.md +181 -0
  69. package/docs/reviews/ultrapower-pain-points/review_ux.md +167 -0
  70. package/package.json +1 -1
@@ -8,11 +8,11 @@
8
8
  {
9
9
  "name": "ultrapower",
10
10
  "description": "Disciplined multi-agent orchestration: workflow enforcement + parallel execution",
11
- "version": "5.4.8",
11
+ "version": "5.5.0",
12
12
  "source": {
13
13
  "source": "npm",
14
14
  "package": "@liangjie559567/ultrapower",
15
- "version": "5.4.8"
15
+ "version": "5.5.0"
16
16
  },
17
17
  "author": {
18
18
  "name": "liangjie559567"
@@ -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.4.8",
4
+ "version": "5.5.0",
5
5
  "author": {
6
6
  "name": "liangjie559567"
7
7
  },
@@ -17323,6 +17323,7 @@ function isSpawnedPid2(pid) {
17323
17323
  }
17324
17324
  var GEMINI_DEFAULT_MODEL = process.env.OMC_GEMINI_DEFAULT_MODEL || "gemini-3-pro-preview";
17325
17325
  var GEMINI_TIMEOUT = Math.min(Math.max(5e3, parseInt(process.env.OMC_GEMINI_TIMEOUT || "3600000", 10) || 36e5), 36e5);
17326
+ var _yoloEnv = process.env.OMC_GEMINI_YOLO;
17326
17327
  var MAX_FILE_SIZE2 = 5 * 1024 * 1024;
17327
17328
  var MAX_STDOUT_BYTES2 = 10 * 1024 * 1024;
17328
17329
 
@@ -16374,6 +16374,8 @@ function validateModelName(model) {
16374
16374
  }
16375
16375
  var GEMINI_DEFAULT_MODEL = process.env.OMC_GEMINI_DEFAULT_MODEL || "gemini-3-pro-preview";
16376
16376
  var GEMINI_TIMEOUT = Math.min(Math.max(5e3, parseInt(process.env.OMC_GEMINI_TIMEOUT || "3600000", 10) || 36e5), 36e5);
16377
+ var _yoloEnv = process.env.OMC_GEMINI_YOLO;
16378
+ var GEMINI_YOLO = _yoloEnv === "false" || _yoloEnv === "0" ? false : true;
16377
16379
  var GEMINI_RECOMMENDED_ROLES = ["designer", "writer", "vision"];
16378
16380
  var MAX_FILE_SIZE = 5 * 1024 * 1024;
16379
16381
  var MAX_STDOUT_BYTES = 10 * 1024 * 1024;
@@ -16394,7 +16396,7 @@ function executeGemini(prompt, model, cwd) {
16394
16396
  return new Promise((resolve7, reject) => {
16395
16397
  if (model) validateModelName(model);
16396
16398
  let settled = false;
16397
- const args = ["-p=.", "--yolo"];
16399
+ const args = ["-p=.", ...GEMINI_YOLO ? ["--yolo"] : []];
16398
16400
  if (model) {
16399
16401
  args.push("--model", model);
16400
16402
  }
@@ -16469,7 +16471,7 @@ function executeGeminiBackground(fullPrompt, modelInput, jobMeta, workingDirecto
16469
16471
  const modelsToTry = modelExplicit ? [effectiveModel] : GEMINI_MODEL_FALLBACKS.includes(effectiveModel) ? GEMINI_MODEL_FALLBACKS.slice(GEMINI_MODEL_FALLBACKS.indexOf(effectiveModel)) : [effectiveModel, ...GEMINI_MODEL_FALLBACKS];
16470
16472
  const trySpawnWithModel = (tryModel, remainingModels) => {
16471
16473
  validateModelName(tryModel);
16472
- const args = ["-p=.", "--yolo", "--model", tryModel];
16474
+ const args = ["-p=.", ...GEMINI_YOLO ? ["--yolo"] : [], "--model", tryModel];
16473
16475
  const child = (0, import_child_process3.spawn)("gemini", args, {
16474
16476
  detached: process.platform !== "win32",
16475
16477
  stdio: ["pipe", "pipe", "pipe"],
@@ -17913,9 +17913,12 @@ var LSP_SERVERS = {
17913
17913
  }
17914
17914
  };
17915
17915
  function commandExists(command) {
17916
+ if (!command || !command.trim()) {
17917
+ return false;
17918
+ }
17916
17919
  try {
17917
17920
  const checkCommand = process.platform === "win32" ? "where" : "which";
17918
- (0, import_child_process.execSync)(`${checkCommand} ${command}`, { stdio: "ignore" });
17921
+ (0, import_child_process.execFileSync)(checkCommand, [command], { stdio: "ignore" });
17919
17922
  return true;
17920
17923
  } catch {
17921
17924
  return false;
@@ -17938,6 +17941,7 @@ function getAllServers() {
17938
17941
  }
17939
17942
 
17940
17943
  // src/tools/lsp/client.ts
17944
+ var MAX_BUFFER_BYTES = 64 * 1024 * 1024;
17941
17945
  function fileUri(filePath) {
17942
17946
  return (0, import_url.pathToFileURL)((0, import_path2.resolve)(filePath)).href;
17943
17947
  }
@@ -18011,6 +18015,10 @@ Install with: ${this.serverConfig.installHint}`
18011
18015
  this.process.kill();
18012
18016
  this.process = null;
18013
18017
  this.initialized = false;
18018
+ for (const [, pending] of this.pendingRequests) {
18019
+ clearTimeout(pending.timeout);
18020
+ pending.reject(new Error("LSP client disconnected"));
18021
+ }
18014
18022
  this.pendingRequests.clear();
18015
18023
  this.openDocuments.clear();
18016
18024
  this.diagnostics.clear();
@@ -18019,6 +18027,14 @@ Install with: ${this.serverConfig.installHint}`
18019
18027
  * Handle incoming data from the server
18020
18028
  */
18021
18029
  handleData(data) {
18030
+ if (this.buffer.length + data.length > MAX_BUFFER_BYTES) {
18031
+ console.error(
18032
+ `[ultrapower] \u9519\u8BEF\uFF1ALSP \u7F13\u51B2\u533A\u8D85\u8FC7 ${MAX_BUFFER_BYTES} \u5B57\u8282\uFF0864MB\uFF09\u4E0A\u9650\uFF0C\u6B63\u5728\u65AD\u5F00\u8FDE\u63A5`
18033
+ );
18034
+ this.disconnect().catch(() => {
18035
+ });
18036
+ return;
18037
+ }
18022
18038
  this.buffer += data;
18023
18039
  while (true) {
18024
18040
  const headerEnd = this.buffer.indexOf("\r\n\r\n");
@@ -21491,8 +21507,33 @@ function getActiveSessionsForMode(mode, cwd) {
21491
21507
  return sessionIds.filter((sid) => isJsonModeActive(cwd, mode, sid));
21492
21508
  }
21493
21509
 
21510
+ // src/lib/validateMode.ts
21511
+ var VALID_MODES = [
21512
+ "autopilot",
21513
+ "ultrapilot",
21514
+ "team",
21515
+ "pipeline",
21516
+ "ralph",
21517
+ "ultrawork",
21518
+ "ultraqa",
21519
+ "swarm"
21520
+ ];
21521
+ function validateMode(mode) {
21522
+ return typeof mode === "string" && VALID_MODES.includes(mode);
21523
+ }
21524
+ function assertValidMode(mode) {
21525
+ if (!validateMode(mode)) {
21526
+ const raw = typeof mode === "string" ? mode : String(mode);
21527
+ const display = raw.length > 50 ? `${raw.slice(0, 50)}...(truncated)` : raw;
21528
+ throw new Error(
21529
+ `Invalid mode: "${display}". Valid modes are: ${VALID_MODES.join(", ")}`
21530
+ );
21531
+ }
21532
+ return mode;
21533
+ }
21534
+
21494
21535
  // src/tools/state-tools.ts
21495
- var EXECUTION_MODES = [
21536
+ var STATE_TOOL_MODES = [
21496
21537
  "autopilot",
21497
21538
  "ultrapilot",
21498
21539
  "swarm",
@@ -21500,9 +21541,9 @@ var EXECUTION_MODES = [
21500
21541
  "team",
21501
21542
  "ralph",
21502
21543
  "ultrawork",
21503
- "ultraqa"
21544
+ "ultraqa",
21545
+ "ralplan"
21504
21546
  ];
21505
- var STATE_TOOL_MODES = [...EXECUTION_MODES, "ralplan"];
21506
21547
  function getStatePath(mode, root) {
21507
21548
  if (MODE_CONFIGS[mode]) {
21508
21549
  return getStateFilePath(root, mode);
@@ -21520,6 +21561,16 @@ var stateReadTool = {
21520
21561
  handler: async (args) => {
21521
21562
  const { mode, workingDirectory, session_id } = args;
21522
21563
  try {
21564
+ if (mode !== "ralplan") {
21565
+ try {
21566
+ assertValidMode(mode);
21567
+ } catch {
21568
+ return {
21569
+ content: [{ type: "text", text: `[ultrapower] \u9519\u8BEF\uFF1A\u65E0\u6548\u7684\u72B6\u6001\u6A21\u5F0F\uFF1A${mode}` }],
21570
+ isError: true
21571
+ };
21572
+ }
21573
+ }
21523
21574
  const root = validateWorkingDirectory(workingDirectory);
21524
21575
  const sessionId = session_id;
21525
21576
  if (mode === "swarm") {
@@ -21696,6 +21747,16 @@ var stateWriteTool = {
21696
21747
  session_id
21697
21748
  } = args;
21698
21749
  try {
21750
+ if (mode !== "ralplan") {
21751
+ try {
21752
+ assertValidMode(mode);
21753
+ } catch {
21754
+ return {
21755
+ content: [{ type: "text", text: `[ultrapower] \u9519\u8BEF\uFF1A\u65E0\u6548\u7684\u72B6\u6001\u6A21\u5F0F\uFF1A${mode}` }],
21756
+ isError: true
21757
+ };
21758
+ }
21759
+ }
21699
21760
  const root = validateWorkingDirectory(workingDirectory);
21700
21761
  const sessionId = session_id;
21701
21762
  if (mode === "swarm") {
@@ -21778,6 +21839,16 @@ var stateClearTool = {
21778
21839
  handler: async (args) => {
21779
21840
  const { mode, workingDirectory, session_id } = args;
21780
21841
  try {
21842
+ if (mode !== "ralplan") {
21843
+ try {
21844
+ assertValidMode(mode);
21845
+ } catch {
21846
+ return {
21847
+ content: [{ type: "text", text: `[ultrapower] \u9519\u8BEF\uFF1A\u65E0\u6548\u7684\u72B6\u6001\u6A21\u5F0F\uFF1A${mode}` }],
21848
+ isError: true
21849
+ };
21850
+ }
21851
+ }
21781
21852
  const root = validateWorkingDirectory(workingDirectory);
21782
21853
  const sessionId = session_id;
21783
21854
  if (sessionId) {