@muggleai/works 5.12.0-staging.74 → 5.12.0-staging.76
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.
|
@@ -48,6 +48,7 @@ var CALL_FAILURE_SIGNALS = [
|
|
|
48
48
|
/"isError"\s*:\s*true/
|
|
49
49
|
];
|
|
50
50
|
var FORGE_TERMINAL_CMD = /\b(?:gh\s+pr\s+(?:merge|close|reopen)|glab\s+mr\s+(?:merge|close|reopen))\b/;
|
|
51
|
+
var WATCH_LOOP_CMD = /pr-watch-loop\.sh/;
|
|
51
52
|
|
|
52
53
|
// src/guardrails/store/fileLock.ts
|
|
53
54
|
function isProcessAlive(pid) {
|
|
@@ -169,8 +170,11 @@ ${input2.tool_response?.output ?? ""}`;
|
|
|
169
170
|
// src/guardrails/prTerminal.ts
|
|
170
171
|
function terminalProvenance(input2) {
|
|
171
172
|
const command = input2.tool_input?.command;
|
|
172
|
-
if (command === void 0) return { acceptsForgeLine: true };
|
|
173
|
-
return {
|
|
173
|
+
if (command === void 0) return { acceptsForgeLine: true, acceptsMonitorLine: true };
|
|
174
|
+
return {
|
|
175
|
+
acceptsForgeLine: FORGE_TERMINAL_CMD.test(command),
|
|
176
|
+
acceptsMonitorLine: WATCH_LOOP_CMD.test(command)
|
|
177
|
+
};
|
|
174
178
|
}
|
|
175
179
|
function detectPrTerminal(input2) {
|
|
176
180
|
if (input2.tool_name !== "Bash" && input2.tool_name !== "Monitor") return null;
|
|
@@ -185,7 +189,7 @@ function detectPrTerminal(input2) {
|
|
|
185
189
|
if (closedMatch) {
|
|
186
190
|
return { prNumber: Number(closedMatch[1]), verdict: "closed" /* Closed */ };
|
|
187
191
|
}
|
|
188
|
-
const monitorMatch = haystack.match(PR_MONITOR_TERMINAL_LINE);
|
|
192
|
+
const monitorMatch = provenance.acceptsMonitorLine ? haystack.match(PR_MONITOR_TERMINAL_LINE) : null;
|
|
189
193
|
if (monitorMatch) {
|
|
190
194
|
return {
|
|
191
195
|
prNumber: Number(monitorMatch[1]),
|
|
@@ -1101,6 +1105,7 @@ function skillStages() {
|
|
|
1101
1105
|
function recordStageRead() {
|
|
1102
1106
|
const filePath = input.tool_input?.file_path;
|
|
1103
1107
|
if (!filePath) return "{}";
|
|
1108
|
+
if (callFailed(input)) return "{}";
|
|
1104
1109
|
const state = readState(sessionId);
|
|
1105
1110
|
const next = applyStageRead(state, filePath);
|
|
1106
1111
|
if (next !== state) writeState(next);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"release": "5.11.0",
|
|
3
|
-
"buildId": "run-
|
|
4
|
-
"commitSha": "
|
|
5
|
-
"buildTime": "2026-08-
|
|
3
|
+
"buildId": "run-76-1",
|
|
4
|
+
"commitSha": "3bf62c628d299992a2fb37b0b5e80c3f49b0ef55",
|
|
5
|
+
"buildTime": "2026-08-26T22:02:09Z",
|
|
6
6
|
"serviceName": "muggle-ai-works-mcp"
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@muggleai/works",
|
|
3
3
|
"mcpName": "io.github.multiplex-ai/muggle",
|
|
4
|
-
"version": "5.12.0-staging.
|
|
4
|
+
"version": "5.12.0-staging.76",
|
|
5
5
|
"description": "Ship quality products with AI-powered E2E acceptance testing that validates your web app like a real user — from Claude Code and Cursor to PR.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "dist/index.js",
|
|
@@ -48,6 +48,7 @@ var CALL_FAILURE_SIGNALS = [
|
|
|
48
48
|
/"isError"\s*:\s*true/
|
|
49
49
|
];
|
|
50
50
|
var FORGE_TERMINAL_CMD = /\b(?:gh\s+pr\s+(?:merge|close|reopen)|glab\s+mr\s+(?:merge|close|reopen))\b/;
|
|
51
|
+
var WATCH_LOOP_CMD = /pr-watch-loop\.sh/;
|
|
51
52
|
|
|
52
53
|
// src/guardrails/store/fileLock.ts
|
|
53
54
|
function isProcessAlive(pid) {
|
|
@@ -169,8 +170,11 @@ ${input2.tool_response?.output ?? ""}`;
|
|
|
169
170
|
// src/guardrails/prTerminal.ts
|
|
170
171
|
function terminalProvenance(input2) {
|
|
171
172
|
const command = input2.tool_input?.command;
|
|
172
|
-
if (command === void 0) return { acceptsForgeLine: true };
|
|
173
|
-
return {
|
|
173
|
+
if (command === void 0) return { acceptsForgeLine: true, acceptsMonitorLine: true };
|
|
174
|
+
return {
|
|
175
|
+
acceptsForgeLine: FORGE_TERMINAL_CMD.test(command),
|
|
176
|
+
acceptsMonitorLine: WATCH_LOOP_CMD.test(command)
|
|
177
|
+
};
|
|
174
178
|
}
|
|
175
179
|
function detectPrTerminal(input2) {
|
|
176
180
|
if (input2.tool_name !== "Bash" && input2.tool_name !== "Monitor") return null;
|
|
@@ -185,7 +189,7 @@ function detectPrTerminal(input2) {
|
|
|
185
189
|
if (closedMatch) {
|
|
186
190
|
return { prNumber: Number(closedMatch[1]), verdict: "closed" /* Closed */ };
|
|
187
191
|
}
|
|
188
|
-
const monitorMatch = haystack.match(PR_MONITOR_TERMINAL_LINE);
|
|
192
|
+
const monitorMatch = provenance.acceptsMonitorLine ? haystack.match(PR_MONITOR_TERMINAL_LINE) : null;
|
|
189
193
|
if (monitorMatch) {
|
|
190
194
|
return {
|
|
191
195
|
prNumber: Number(monitorMatch[1]),
|
|
@@ -1101,6 +1105,7 @@ function skillStages() {
|
|
|
1101
1105
|
function recordStageRead() {
|
|
1102
1106
|
const filePath = input.tool_input?.file_path;
|
|
1103
1107
|
if (!filePath) return "{}";
|
|
1108
|
+
if (callFailed(input)) return "{}";
|
|
1104
1109
|
const state = readState(sessionId);
|
|
1105
1110
|
const next = applyStageRead(state, filePath);
|
|
1106
1111
|
if (next !== state) writeState(next);
|