@muggleai/works 5.19.0-staging.127 → 5.19.0-staging.129

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Muggle AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  Coding agents are good at producing a diff. They are bad at knowing whether the diff works, whether it broke the login flow, and what still has to happen before a human can merge it. Muggle Works is the harness around the agent that answers those questions: it freezes requirements, delegates the design and build, runs the unit suite, drives a **real browser** through the affected user flows, opens the pull request with screenshots attached, and then keeps watching that PR — picking up review comments, red CI, and a stale base branch until the change is genuinely mergeable.
6
6
 
7
7
  [![npm](https://img.shields.io/npm/v/@muggleai/works.svg)](https://www.npmjs.com/package/@muggleai/works)
8
- [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://www.npmjs.com/package/@muggleai/works)
8
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
9
9
  [![Node](https://img.shields.io/badge/node-%3E%3D22-brightgreen.svg)](https://nodejs.org)
10
10
  [![MCP tools](https://img.shields.io/badge/MCP%20tools-100%2B-blue.svg)](#mcp-tool-reference)
11
11
 
@@ -477,6 +477,6 @@ Agents pick tools by reading descriptions, so that text is tuned deliberately ra
477
477
 
478
478
  ## License
479
479
 
480
- MIT. Use it, fork it, make it yours.
480
+ [MIT](LICENSE). Use it, fork it, make it yours.
481
481
 
482
482
  If it saves you a bad merge, a star helps others find it.
@@ -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": "5.19.0-staging.127",
4
+ "version": "5.19.0-staging.129",
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": "5.19.0-staging.127",
5
+ "version": "5.19.0-staging.129",
6
6
  "author": {
7
7
  "name": "Muggle AI",
8
8
  "email": "support@muggle-ai.com"
@@ -34,15 +34,26 @@ Only if a worktree was used.
34
34
 
35
35
  A worktree's dependency dir (`node_modules`, and nested workspace copies) is often a **link** — a symlink or a Windows junction — to a shared tree rather than a real copy. A forced or recursive delete follows the link and wipes that shared target, breaking every other worktree.
36
36
 
37
+ `git worktree remove` refuses for two unrelated reasons, and **both texts lead to the same forbidden flag** — one because it is the obvious fix, the other because git prints it as the suggestion. Clear each cause at its source; neither is a reason to reconsider the flag.
38
+
37
39
  1. **Never `--force`.** It is the one flag that follows links.
38
40
  2. Clear the dependency and build dirs first, nested workspace ones included (`packages/*/node_modules`, `dist`). A plain `git worktree remove` fails with `Directory not empty` while they remain, and the obvious fix for that error is exactly the forbidden flag.
39
41
  - A **link** → unlink it first with the host OS's unlink, removing the link only and never its target.
40
42
  - A **real directory** → delete it in place.
41
43
  Check which it is before deleting; the two are indistinguishable from a listing but not from a `rm -r`.
42
- 3. Then plain `git worktree remove {worktreePath}`.
43
- 4. `git worktree prune` to drop the administrative entry when the directory went away out from under git.
44
+ 3. Clear the worktree's own dirty state — what the merge already landed, and nothing else. While anything remains, removal fails with `contains modified or untracked files, use --force to delete it`, an error that prescribes the forbidden flag in its own text.
45
+
46
+ Expect this on any cycle that pushed through a server-side signed commit: that mutation writes to the remote only, so the worktree keeps the edits as modifications of a commit it never made locally. The dirt is this cycle's own landed work, not something the user left behind.
47
+
48
+ Read the dirt with `git -C {worktreePath} status --porcelain`, then settle each kind on whether the base already carries it:
49
+ - **Tracked modifications** — when `git -C {worktreePath} diff origin/<base>` is empty the working tree holds nothing the merge did not land, so `git -C {worktreePath} reset --hard` discards a copy rather than work. A non-empty diff stops the sequence: that diff is unlanded work, and this step would be the thing that destroyed it.
50
+ - **Untracked files** — never on the base, so no diff can clear them. Delete only the paths this procedure itself created: the dependency and build dirs cleared above. Anything else stops the sequence and is reported by name; an untracked file is the one thing in the worktree with no copy anywhere.
51
+
52
+ **Never `git clean -x`.** `-x` is what reaches the ignored dependency dir, and clean recurses through a link exactly as a forced remove does — it undoes the unlink above under a different name.
53
+ 4. Then plain `git worktree remove {worktreePath}`.
54
+ 5. `git worktree prune` to drop the administrative entry when the directory went away out from under git.
44
55
 
45
- **Verify:** the path is gone, it no longer appears in `git worktree list`, **and** the shared dependency tree the links pointed at still exists. That last check is the one that catches a link-follow.
56
+ **Verify:** the path is gone, it no longer appears in `git worktree list`, the removal ran without `--force`, **and** the shared dependency tree the links pointed at still exists. That last check is the one that catches a link-follow.
46
57
 
47
58
  ## 3. Delete the local branch
48
59
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "release": "5.18.0",
3
- "buildId": "run-127-1",
4
- "commitSha": "8429e3aeb98d981f077fe76986404e9e9e1946c2",
5
- "buildTime": "2026-09-22T08:17:57Z",
3
+ "buildId": "run-129-1",
4
+ "commitSha": "0d87587f70defe63f99a2bb64cd41366dd1b78e8",
5
+ "buildTime": "2026-09-22T18:01:23Z",
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.19.0-staging.127",
4
+ "version": "5.19.0-staging.129",
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",
@@ -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": "5.19.0-staging.127",
4
+ "version": "5.19.0-staging.129",
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": "5.19.0-staging.127",
5
+ "version": "5.19.0-staging.129",
6
6
  "author": {
7
7
  "name": "Muggle AI",
8
8
  "email": "support@muggle-ai.com"
@@ -34,15 +34,26 @@ Only if a worktree was used.
34
34
 
35
35
  A worktree's dependency dir (`node_modules`, and nested workspace copies) is often a **link** — a symlink or a Windows junction — to a shared tree rather than a real copy. A forced or recursive delete follows the link and wipes that shared target, breaking every other worktree.
36
36
 
37
+ `git worktree remove` refuses for two unrelated reasons, and **both texts lead to the same forbidden flag** — one because it is the obvious fix, the other because git prints it as the suggestion. Clear each cause at its source; neither is a reason to reconsider the flag.
38
+
37
39
  1. **Never `--force`.** It is the one flag that follows links.
38
40
  2. Clear the dependency and build dirs first, nested workspace ones included (`packages/*/node_modules`, `dist`). A plain `git worktree remove` fails with `Directory not empty` while they remain, and the obvious fix for that error is exactly the forbidden flag.
39
41
  - A **link** → unlink it first with the host OS's unlink, removing the link only and never its target.
40
42
  - A **real directory** → delete it in place.
41
43
  Check which it is before deleting; the two are indistinguishable from a listing but not from a `rm -r`.
42
- 3. Then plain `git worktree remove {worktreePath}`.
43
- 4. `git worktree prune` to drop the administrative entry when the directory went away out from under git.
44
+ 3. Clear the worktree's own dirty state — what the merge already landed, and nothing else. While anything remains, removal fails with `contains modified or untracked files, use --force to delete it`, an error that prescribes the forbidden flag in its own text.
45
+
46
+ Expect this on any cycle that pushed through a server-side signed commit: that mutation writes to the remote only, so the worktree keeps the edits as modifications of a commit it never made locally. The dirt is this cycle's own landed work, not something the user left behind.
47
+
48
+ Read the dirt with `git -C {worktreePath} status --porcelain`, then settle each kind on whether the base already carries it:
49
+ - **Tracked modifications** — when `git -C {worktreePath} diff origin/<base>` is empty the working tree holds nothing the merge did not land, so `git -C {worktreePath} reset --hard` discards a copy rather than work. A non-empty diff stops the sequence: that diff is unlanded work, and this step would be the thing that destroyed it.
50
+ - **Untracked files** — never on the base, so no diff can clear them. Delete only the paths this procedure itself created: the dependency and build dirs cleared above. Anything else stops the sequence and is reported by name; an untracked file is the one thing in the worktree with no copy anywhere.
51
+
52
+ **Never `git clean -x`.** `-x` is what reaches the ignored dependency dir, and clean recurses through a link exactly as a forced remove does — it undoes the unlink above under a different name.
53
+ 4. Then plain `git worktree remove {worktreePath}`.
54
+ 5. `git worktree prune` to drop the administrative entry when the directory went away out from under git.
44
55
 
45
- **Verify:** the path is gone, it no longer appears in `git worktree list`, **and** the shared dependency tree the links pointed at still exists. That last check is the one that catches a link-follow.
56
+ **Verify:** the path is gone, it no longer appears in `git worktree list`, the removal ran without `--force`, **and** the shared dependency tree the links pointed at still exists. That last check is the one that catches a link-follow.
46
57
 
47
58
  ## 3. Delete the local branch
48
59