@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 { acceptsForgeLine: FORGE_TERMINAL_CMD.test(command) };
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-74-1",
4
- "commitSha": "d2d28543763361dcae7b5bef1c31ca4ae75df64c",
5
- "buildTime": "2026-08-26T20:14:09Z",
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.74",
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 { acceptsForgeLine: FORGE_TERMINAL_CMD.test(command) };
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);