@muggleai/works 4.11.0 → 4.11.1

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "muggle",
3
3
  "description": "Run real-browser end-to-end (E2E) acceptance tests on your web app from any AI coding agent. Generate test scripts from plain English, replay them on localhost, capture screenshots, and validate user flows like signup, checkout, and dashboards. Works across Claude Code, Cursor, Codex, and Windsurf.",
4
- "version": "4.11.0",
4
+ "version": "4.11.1",
5
5
  "author": {
6
6
  "name": "Muggle AI",
7
7
  "email": "support@muggle-ai.com"
@@ -2,7 +2,7 @@
2
2
  "name": "muggle",
3
3
  "displayName": "Muggle AI",
4
4
  "description": "Ship quality products with AI-powered end-to-end (E2E) acceptance testing that validates your web app like a real user — from Claude Code and Cursor to PR.",
5
- "version": "4.11.0",
5
+ "version": "4.11.1",
6
6
  "author": {
7
7
  "name": "Muggle AI",
8
8
  "email": "support@muggle-ai.com"
@@ -101,18 +101,19 @@ fix(ci): lint — remove unused import
101
101
 
102
102
  ## Classify
103
103
 
104
- Classify the **review as a unit**, not individual comments.
104
+ Classify the **review as a unit** — but reply per line comment (threaded), not per review.
105
105
 
106
106
  | Class | Signal | Action |
107
107
  | :---- | :----- | :----- |
108
- | **actionable** | Review names at least one concrete change or asks an answerable question. Soft phrasing counts when there's a concrete referent. | Treat as amended requirements; run the caller's implementation cycle; reply with one summary referencing the new SHA. |
108
+ | **actionable** | Review names at least one concrete change or asks an answerable question. Soft phrasing counts when there's a concrete referent. | Treat as amended requirements; run **one** implementation cycle for the whole review; reply **threaded per line comment** referencing the new SHA (top-level only when the review is body-only). |
109
109
  | **ambiguous** | No actionable signal — pure vibes, contradictory, or depends on knowledge the loop can't access. | Escalate once with two interpretations; pause the PR. |
110
110
 
111
111
  Default to **actionable**. CI catches wrong attempts; reviewers correct on the next round. Escalation is a round-trip with an absent user — reserve it.
112
112
 
113
- Reply summary shape:
113
+ Reply shape (all replies for one review reference the same SHA):
114
114
 
115
- - **actionable**: `Addressed review <review_id> in <sha> — cycle ran clean (or: with <N> failures, see walkthrough).`
115
+ - **threaded** (default): `Done in <sha> — <attribution>. (Review #<review_id>, cycle <status>.)`
116
+ - **top-level** (fallback, body-only reviews): `Re: review #<review_id> — addressed in <sha>, cycle <status>.`
116
117
  - **ambiguous**: no bot reply.
117
118
 
118
119
  ### Worked examples — Actionable reviews
@@ -86,10 +86,7 @@ When the review is actionable:
86
86
  2. **Amend `requirements.md`** in the session dir with a new `## Amendment — review <review_id> by <login> (<timestamp>)` section pasting the review body and each comment (with `<file>:<line>` context).
87
87
  3. **Invoke the implementation cycle** declared in the caller's `cycle.json`. Iterate the `steps[]` in order. Each step is either a markdown file to follow, a skill to invoke, or a shell command (per the `cycle.json` schema in SKILL.md). When a step fails, the cycle returns `failed: <step-name>`; the loop escalates per Step 8 with the failure as the reason.
88
88
  4. **Push** via `cycle.json`'s `pushHandler`. Set `last_seen.last_pushed_sha` to the new HEAD.
89
- 5. **Reply** with one summary via `gh pr comment <n>`:
90
- ```
91
- Addressed review <review_id> in <sha> — cycle ran clean (or: with <N> failures, see walkthrough).
92
- ```
89
+ 5. **Reply** per [helpers § Reply routing](../_shared/pr-followup-helpers.md#reply-routing) and [§ Classify](../_shared/pr-followup-helpers.md#classify) (reply shape). For each line comment in the review, derive `<attribution>` from `git diff <last_pushed_sha>..HEAD -- <comment.path>` near `comment.line` ±5 (fall back to `addressed indirectly — see walkthrough` if empty). `<status>` = `ran clean` or `had <N> failures, see walkthrough`. If the review is body-only (no line comments), post the top-level fallback shape; if both body and line comments, threaded replies cover it — no top-level.
93
90
  6. **Resume polling**: clear `cycling: true`, increment `cycles_completed`, advance `last_seen.reviewId` past this review.
94
91
  7. Emit per-cycle telemetry.
95
92
 
@@ -133,9 +130,10 @@ Emit one tick event per `muggle-local-telemetry-skill-emit`. Exit the turn.
133
130
 
134
131
  ## Reply routing
135
132
 
136
- - **Summary reply on a review**: `gh pr comment <number> --body "..."` referencing the review id and the new SHA. There's no "reply to a review" endpoint.
137
- - **Reply to a specific line comment** (optional): `POST /repos/{owner}/{repo}/pulls/{n}/comments/{comment_id}/replies`.
138
- - **Never post the same summary twice** — `last_seen.reviewId` is the only re-entry guard.
133
+ - **Threaded reply per line comment** (default): `POST /repos/{owner}/{repo}/pulls/{n}/comments/{comment_id}/replies`. Use for every line comment in the review so each thread can be resolved in GitHub's UI.
134
+ - **Top-level summary on a body-only review** (fallback): `gh pr comment <number> --body "..."` referencing the review id and the new SHA. Used only when the review has body content and zero line comments — GitHub has no "reply to a review body" endpoint.
135
+ - **Never post the same reply twice** — `last_seen.reviewId` is the only re-entry guard.
136
+ - **Never post a top-level summary alongside threaded replies** — duplication pollutes the Conversation tab.
139
137
 
140
138
  ## Telemetry
141
139
 
@@ -187,5 +185,6 @@ This stage produces no console output beyond:
187
185
  - [ ] `followup.log` has at minimum a heartbeat or per-review line for this tick.
188
186
  - [ ] Telemetry events emitted (per-cycle when applicable + per-tick).
189
187
  - [ ] If pushed, `last_pushed_sha` is set and `cycles_completed` incremented.
188
+ - [ ] If actionable, one threaded reply posted per line comment (or one top-level reply for body-only reviews) — never both, never zero.
190
189
  - [ ] If escalated, `escalated_review_ids` contains the review id.
191
190
  - [ ] If terminal, the loop is NOT continued.
@@ -1,7 +1,7 @@
1
1
  {
2
- "release": "4.11.0",
3
- "buildId": "run-33-1",
4
- "commitSha": "f704789e0836e91f5e24f364d0d8eccf1d1a5439",
5
- "buildTime": "2026-05-15T07:07:24Z",
2
+ "release": "4.11.1",
3
+ "buildId": "run-34-1",
4
+ "commitSha": "09bc0bf650bd1c56171238fb0065ec3e584bb9fd",
5
+ "buildTime": "2026-05-19T19:57:13Z",
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": "4.11.0",
4
+ "version": "4.11.1",
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",
@@ -41,14 +41,14 @@
41
41
  "test:watch": "vitest"
42
42
  },
43
43
  "muggleConfig": {
44
- "electronAppVersion": "1.0.84",
44
+ "electronAppVersion": "1.0.87",
45
45
  "downloadBaseUrl": "https://github.com/multiplex-ai/muggle-ai-works/releases/download",
46
46
  "runtimeTargetDefault": "production",
47
47
  "checksums": {
48
- "darwin-arm64": "da978efea8e3c8633f96c5245b932f98988eb60dc94cced62cac20f4bdefbb20",
49
- "darwin-x64": "9aa611d446494ab1d48674813cead2d669f8aea6869efea6f4f2beb13d18e4ac",
50
- "win32-x64": "5220df3c394f2406201955f04e78d8faf764ea565fc59611484c8bbaad24635e",
51
- "linux-x64": "5c519a473800b2726eef7a55c50d1d2c2e0ff78ab2d860dc869e2cd42fa59d74"
48
+ "darwin-arm64": "df04c98269e22ae427bb863956215b3f20cbf2ff0b51c037647d6e734a7b7502",
49
+ "darwin-x64": "e9f5b8a61f4a9f47743aaabb27d6e4c462dca5aa922ba66ae04f0a0133b8a7eb",
50
+ "win32-x64": "75e552672757d280259637bdcbe0aae0eecc2417ed9a6e5bd49f42d3466f66cf",
51
+ "linux-x64": "2c8b64cf549f9a6682db959b17c5f04578d632d5bcdba1ac9efbb45d6a097802"
52
52
  }
53
53
  },
54
54
  "dependencies": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "muggle",
3
3
  "description": "Run real-browser end-to-end (E2E) acceptance tests on your web app from any AI coding agent. Generate test scripts from plain English, replay them on localhost, capture screenshots, and validate user flows like signup, checkout, and dashboards. Works across Claude Code, Cursor, Codex, and Windsurf.",
4
- "version": "4.11.0",
4
+ "version": "4.11.1",
5
5
  "author": {
6
6
  "name": "Muggle AI",
7
7
  "email": "support@muggle-ai.com"
@@ -2,7 +2,7 @@
2
2
  "name": "muggle",
3
3
  "displayName": "Muggle AI",
4
4
  "description": "Ship quality products with AI-powered end-to-end (E2E) acceptance testing that validates your web app like a real user — from Claude Code and Cursor to PR.",
5
- "version": "4.11.0",
5
+ "version": "4.11.1",
6
6
  "author": {
7
7
  "name": "Muggle AI",
8
8
  "email": "support@muggle-ai.com"
@@ -101,18 +101,19 @@ fix(ci): lint — remove unused import
101
101
 
102
102
  ## Classify
103
103
 
104
- Classify the **review as a unit**, not individual comments.
104
+ Classify the **review as a unit** — but reply per line comment (threaded), not per review.
105
105
 
106
106
  | Class | Signal | Action |
107
107
  | :---- | :----- | :----- |
108
- | **actionable** | Review names at least one concrete change or asks an answerable question. Soft phrasing counts when there's a concrete referent. | Treat as amended requirements; run the caller's implementation cycle; reply with one summary referencing the new SHA. |
108
+ | **actionable** | Review names at least one concrete change or asks an answerable question. Soft phrasing counts when there's a concrete referent. | Treat as amended requirements; run **one** implementation cycle for the whole review; reply **threaded per line comment** referencing the new SHA (top-level only when the review is body-only). |
109
109
  | **ambiguous** | No actionable signal — pure vibes, contradictory, or depends on knowledge the loop can't access. | Escalate once with two interpretations; pause the PR. |
110
110
 
111
111
  Default to **actionable**. CI catches wrong attempts; reviewers correct on the next round. Escalation is a round-trip with an absent user — reserve it.
112
112
 
113
- Reply summary shape:
113
+ Reply shape (all replies for one review reference the same SHA):
114
114
 
115
- - **actionable**: `Addressed review <review_id> in <sha> — cycle ran clean (or: with <N> failures, see walkthrough).`
115
+ - **threaded** (default): `Done in <sha> — <attribution>. (Review #<review_id>, cycle <status>.)`
116
+ - **top-level** (fallback, body-only reviews): `Re: review #<review_id> — addressed in <sha>, cycle <status>.`
116
117
  - **ambiguous**: no bot reply.
117
118
 
118
119
  ### Worked examples — Actionable reviews
@@ -86,10 +86,7 @@ When the review is actionable:
86
86
  2. **Amend `requirements.md`** in the session dir with a new `## Amendment — review <review_id> by <login> (<timestamp>)` section pasting the review body and each comment (with `<file>:<line>` context).
87
87
  3. **Invoke the implementation cycle** declared in the caller's `cycle.json`. Iterate the `steps[]` in order. Each step is either a markdown file to follow, a skill to invoke, or a shell command (per the `cycle.json` schema in SKILL.md). When a step fails, the cycle returns `failed: <step-name>`; the loop escalates per Step 8 with the failure as the reason.
88
88
  4. **Push** via `cycle.json`'s `pushHandler`. Set `last_seen.last_pushed_sha` to the new HEAD.
89
- 5. **Reply** with one summary via `gh pr comment <n>`:
90
- ```
91
- Addressed review <review_id> in <sha> — cycle ran clean (or: with <N> failures, see walkthrough).
92
- ```
89
+ 5. **Reply** per [helpers § Reply routing](../_shared/pr-followup-helpers.md#reply-routing) and [§ Classify](../_shared/pr-followup-helpers.md#classify) (reply shape). For each line comment in the review, derive `<attribution>` from `git diff <last_pushed_sha>..HEAD -- <comment.path>` near `comment.line` ±5 (fall back to `addressed indirectly — see walkthrough` if empty). `<status>` = `ran clean` or `had <N> failures, see walkthrough`. If the review is body-only (no line comments), post the top-level fallback shape; if both body and line comments, threaded replies cover it — no top-level.
93
90
  6. **Resume polling**: clear `cycling: true`, increment `cycles_completed`, advance `last_seen.reviewId` past this review.
94
91
  7. Emit per-cycle telemetry.
95
92
 
@@ -133,9 +130,10 @@ Emit one tick event per `muggle-local-telemetry-skill-emit`. Exit the turn.
133
130
 
134
131
  ## Reply routing
135
132
 
136
- - **Summary reply on a review**: `gh pr comment <number> --body "..."` referencing the review id and the new SHA. There's no "reply to a review" endpoint.
137
- - **Reply to a specific line comment** (optional): `POST /repos/{owner}/{repo}/pulls/{n}/comments/{comment_id}/replies`.
138
- - **Never post the same summary twice** — `last_seen.reviewId` is the only re-entry guard.
133
+ - **Threaded reply per line comment** (default): `POST /repos/{owner}/{repo}/pulls/{n}/comments/{comment_id}/replies`. Use for every line comment in the review so each thread can be resolved in GitHub's UI.
134
+ - **Top-level summary on a body-only review** (fallback): `gh pr comment <number> --body "..."` referencing the review id and the new SHA. Used only when the review has body content and zero line comments — GitHub has no "reply to a review body" endpoint.
135
+ - **Never post the same reply twice** — `last_seen.reviewId` is the only re-entry guard.
136
+ - **Never post a top-level summary alongside threaded replies** — duplication pollutes the Conversation tab.
139
137
 
140
138
  ## Telemetry
141
139
 
@@ -187,5 +185,6 @@ This stage produces no console output beyond:
187
185
  - [ ] `followup.log` has at minimum a heartbeat or per-review line for this tick.
188
186
  - [ ] Telemetry events emitted (per-cycle when applicable + per-tick).
189
187
  - [ ] If pushed, `last_pushed_sha` is set and `cycles_completed` incremented.
188
+ - [ ] If actionable, one threaded reply posted per line comment (or one top-level reply for body-only reviews) — never both, never zero.
190
189
  - [ ] If escalated, `escalated_review_ids` contains the review id.
191
190
  - [ ] If terminal, the loop is NOT continued.