@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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/bridge/codex-server.cjs +1 -0
- package/bridge/gemini-server.cjs +4 -2
- package/bridge/mcp-server.cjs +75 -4
- package/bridge/team-bridge.cjs +400 -55
- package/dist/features/rate-limit-wait/daemon.d.ts.map +1 -1
- package/dist/features/rate-limit-wait/daemon.js +39 -6
- package/dist/features/rate-limit-wait/daemon.js.map +1 -1
- package/dist/hooks/__tests__/bridge-security.test.js +94 -1
- package/dist/hooks/__tests__/bridge-security.test.js.map +1 -1
- package/dist/hooks/bridge-normalize.d.ts.map +1 -1
- package/dist/hooks/bridge-normalize.js +5 -2
- package/dist/hooks/bridge-normalize.js.map +1 -1
- package/dist/hooks/subagent-tracker/__tests__/syncSleep.test.d.ts +10 -0
- package/dist/hooks/subagent-tracker/__tests__/syncSleep.test.d.ts.map +1 -0
- package/dist/hooks/subagent-tracker/__tests__/syncSleep.test.js +112 -0
- package/dist/hooks/subagent-tracker/__tests__/syncSleep.test.js.map +1 -0
- package/dist/hooks/subagent-tracker/index.d.ts.map +1 -1
- package/dist/hooks/subagent-tracker/index.js +37 -5
- package/dist/hooks/subagent-tracker/index.js.map +1 -1
- package/dist/lib/__tests__/atomic-write.test.d.ts +2 -0
- package/dist/lib/__tests__/atomic-write.test.d.ts.map +1 -0
- package/dist/lib/__tests__/atomic-write.test.js +197 -0
- package/dist/lib/__tests__/atomic-write.test.js.map +1 -0
- package/dist/mcp/__tests__/gemini-yolo-env.test.d.ts +2 -0
- package/dist/mcp/__tests__/gemini-yolo-env.test.d.ts.map +1 -0
- package/dist/mcp/__tests__/gemini-yolo-env.test.js +274 -0
- package/dist/mcp/__tests__/gemini-yolo-env.test.js.map +1 -0
- package/dist/mcp/gemini-core.d.ts +1 -0
- package/dist/mcp/gemini-core.d.ts.map +1 -1
- package/dist/mcp/gemini-core.js +11 -2
- package/dist/mcp/gemini-core.js.map +1 -1
- package/dist/notifications/__tests__/sleepMs.test.d.ts +10 -0
- package/dist/notifications/__tests__/sleepMs.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/sleepMs.test.js +117 -0
- package/dist/notifications/__tests__/sleepMs.test.js.map +1 -0
- package/dist/notifications/session-registry.d.ts.map +1 -1
- package/dist/notifications/session-registry.js +35 -2
- package/dist/notifications/session-registry.js.map +1 -1
- package/dist/team/mcp-team-bridge.d.ts.map +1 -1
- package/dist/team/mcp-team-bridge.js +2 -1
- package/dist/team/mcp-team-bridge.js.map +1 -1
- package/dist/tools/__tests__/state-tools.test.js +76 -0
- package/dist/tools/__tests__/state-tools.test.js.map +1 -1
- package/dist/tools/lsp/__tests__/client-timer-buffer.test.d.ts +11 -0
- package/dist/tools/lsp/__tests__/client-timer-buffer.test.d.ts.map +1 -0
- package/dist/tools/lsp/__tests__/client-timer-buffer.test.js +222 -0
- package/dist/tools/lsp/__tests__/client-timer-buffer.test.js.map +1 -0
- package/dist/tools/lsp/__tests__/command-exists.test.d.ts +2 -0
- package/dist/tools/lsp/__tests__/command-exists.test.d.ts.map +1 -0
- package/dist/tools/lsp/__tests__/command-exists.test.js +104 -0
- package/dist/tools/lsp/__tests__/command-exists.test.js.map +1 -0
- package/dist/tools/lsp/client.d.ts.map +1 -1
- package/dist/tools/lsp/client.js +15 -0
- package/dist/tools/lsp/client.js.map +1 -1
- package/dist/tools/lsp/servers.d.ts +7 -1
- package/dist/tools/lsp/servers.d.ts.map +1 -1
- package/dist/tools/lsp/servers.js +14 -3
- package/dist/tools/lsp/servers.js.map +1 -1
- package/dist/tools/state-tools.d.ts +9 -8
- package/dist/tools/state-tools.d.ts.map +1 -1
- package/dist/tools/state-tools.js +44 -1
- package/dist/tools/state-tools.js.map +1 -1
- package/docs/reviews/draft-prd-ultrapower-pain-fix/review_tech.md +219 -0
- package/docs/reviews/draft_prd_pain_points/review_domain.md +215 -0
- package/docs/reviews/ultrapower-full-bugfix-plan/review_product.md +135 -0
- package/docs/reviews/ultrapower-pain-points/review_critic.md +181 -0
- package/docs/reviews/ultrapower-pain-points/review_ux.md +167 -0
- 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.
|
|
11
|
+
"version": "5.5.0",
|
|
12
12
|
"source": {
|
|
13
13
|
"source": "npm",
|
|
14
14
|
"package": "@liangjie559567/ultrapower",
|
|
15
|
-
"version": "5.
|
|
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
|
+
"version": "5.5.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "liangjie559567"
|
|
7
7
|
},
|
package/bridge/codex-server.cjs
CHANGED
|
@@ -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
|
|
package/bridge/gemini-server.cjs
CHANGED
|
@@ -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"],
|
package/bridge/mcp-server.cjs
CHANGED
|
@@ -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.
|
|
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
|
|
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) {
|