@muggleai/works 5.19.0-staging.131 → 5.19.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/dist/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { runCli } from './chunk-ODEPI25T.js';
3
- import './chunk-U6ZACW6K.js';
2
+ import { runCli } from './chunk-H2KMRAQZ.js';
3
+ import './chunk-ZA5KHVX5.js';
4
4
 
5
5
  // src/cli/main.ts
6
6
  runCli().catch((error) => {
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { src_exports as commands, createUnifiedMcpServer, server_exports as server } from './chunk-ODEPI25T.js';
2
- export { createChildLogger, e2e_exports as e2e, getConfig, getLocalQaTools, getLogger, getQaTools, local_exports as localQa, mcp_exports as mcp, e2e_exports as qa, src_exports as shared } from './chunk-U6ZACW6K.js';
1
+ export { src_exports as commands, createUnifiedMcpServer, server_exports as server } from './chunk-H2KMRAQZ.js';
2
+ export { createChildLogger, e2e_exports as e2e, getConfig, getLocalQaTools, getLogger, getQaTools, local_exports as localQa, mcp_exports as mcp, e2e_exports as qa, src_exports as shared } from './chunk-ZA5KHVX5.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.131",
4
+ "version": "5.19.0",
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.131",
5
+ "version": "5.19.0",
6
6
  "author": {
7
7
  "name": "Muggle AI",
8
8
  "email": "support@muggle-ai.com"
@@ -19,8 +19,8 @@ The guarantee binds **interactive** callers. An autonomous caller with no user t
19
19
 
20
20
  Read **structured run fields**, never the `execute` stdout tail (see [`dev-loop/failures.md`](./dev-loop/failures.md)). Assemble:
21
21
 
22
- - **Attempted steps + reasoning** — local: the attempted steps + `summaryStep` halt reason from `action-script.json` in `artifactsDir`; remote: the per-step list + `summaryStep` from `muggle-remote-wf-get-ts-gen-latest-run` / `muggle-remote-wf-get-ts-replay-latest-run`.
23
- - **Visual evidence** — a failed run already preserves the full step-by-step on disk: every per-step frame under `<artifactsDir>/electron-runtime/screenshot/` (with per-step label data under `.../dataset/`), alongside the step script at `<artifactsDir>/action-script.json`. `run-result-get` returns `artifactsDir` — read the whole set there; don't trust a step's `screenshotLocalPath`, which points at the original runtime dir. Once published — failed runs are published too, see [`dev-loop/publish.md`](./dev-loop/publish.md) — the same frames are cloud-hosted per step as `screenshotUrl`, the form remote runs expose directly.
22
+ - **Attempted steps + reasoning** — local: call `muggle-local-run-steps-get` with the `runId`. It returns the ordered steps (action, the agent's own explanation, the resolved frame path) plus the run's recorded status and closing verdict, already paired up. Remote: the per-step list + `summaryStep` from `muggle-remote-wf-get-ts-gen-latest-run` / `muggle-remote-wf-get-ts-replay-latest-run`.
23
+ - **Visual evidence** — local: the frame path on each step from the call above is the frame for that step; a step with none reports it rather than guessing. Do not hunt `<artifactsDir>/electron-runtime/screenshot/` by hand, and don't trust a step's `screenshotLocalPath`, which points at the original runtime dir. To look at the frames rather than their paths, `muggle run-view <runId> --html --open` renders them inline. Once published — failed runs are published too, see [`dev-loop/publish.md`](./dev-loop/publish.md) — the same frames are cloud-hosted per step as `screenshotUrl`, the form remote runs expose directly.
24
24
  - **Verdict** — `Status` + `Error`.
25
25
 
26
26
  ## Step 2 — Diagnose
@@ -29,7 +29,9 @@ Classify into the failure bucket per [`failure-mode-handling.md`](./failure-mode
29
29
 
30
30
  ## Step 3 — Present the debug card, then the guaranteed offer
31
31
 
32
- Show the **debug card** first: attempted steps + reasoning, the failing step's screenshot (or a one-line note if a path is genuinely absent), and the one-line diagnosis.
32
+ Show the **debug card** first: attempted steps + reasoning, the failing step's screenshot (or a one-line note if a path is genuinely absent), and the one-line diagnosis. For a local run `muggle-local-run-steps-get` already returns that card's body as text — print it rather than reassembling it, and offer `muggle run-view <runId> --html` when the user should see the frames themselves.
33
+
34
+ A verdict that disagrees with its own frames is common enough to check for: if the steps say the agent saw the thing its verdict calls missing, say so instead of reporting the verdict.
33
35
 
34
36
  Then present one `AskUserQuestion` whose options are:
35
37
 
@@ -1,3 +1,5 @@
1
1
  # Dev Loop — Action Script
2
2
 
3
3
  On the replay path use the `muggle-remote-action-script-get` response **as-is** — never edit, shorten, or rebuild `actionScript`; replay needs the full `label` paths for element lookup. For batches, fan the script fetches out in parallel before the sequential execute loop.
4
+
5
+ To *read* what a local run did rather than replay it, call `muggle-local-run-steps-get` — it returns the steps with the frame each produced. Never parse a session's `action-script.json` by hand.
@@ -4,7 +4,9 @@ For each `runId`, call `muggle-local-run-result-get` and read **structured field
4
4
 
5
5
  ## Artifacts
6
6
 
7
- The `Artifacts` section is present after any completed run; it names `artifactsDir` and lists files. On pass, `results.md` is the step-by-step verdict (read it before summarizing). On failure, `stdout.log` + `stderr.log` are always present; `action-script.json` appears when generation reached step-emission (typical for `goal_not_achievable`); `results.md` and per-step screenshots are absent on the failure path — don't hunt for them.
7
+ The `Artifacts` section is present after any completed run; it names `artifactsDir` and lists files. On pass, `results.md` is the step-by-step verdict (read it before summarizing). On failure, `stdout.log` + `stderr.log` are always present; `action-script.json` appears when generation reached step-emission (typical for `goal_not_achievable`); `results.md` is absent.
8
+
9
+ Per-step frames are **not** absent on the failure path — the `Artifacts` section just doesn't list them. A failed run writes them under `artifactsDir` like any other, so a run that halted still has a frame for every step it took. Call `muggle-local-run-steps-get` with the `runId` to get the steps paired with those frames rather than walking the directory.
8
10
 
9
11
  ## Common failures
10
12
 
@@ -114,8 +114,9 @@ Triggered when `muggle-local-execute-replay` returns `status: "failed"` (or non-
114
114
  Call `muggle-local-run-result-get` (local) or the remote equivalent and read **structured fields**, not `execute`'s response stdout tail (it's a truncated display excerpt and routinely cuts off mid-sentence). Order:
115
115
 
116
116
  1. `Status` + `Error` — the verdict and the one-line cause.
117
- 2. `Artifacts` section, when present — opens `artifactsDir`. Read `results.md` (step-by-step + screenshot links) for the per-step verdict, then `action-script.json` for what the agent attempted.
118
- 3. `stdout.log` / `stderr.log` only when the Artifacts section is absent or `results.md` doesn't exist (e.g. early Electron failure).
117
+ 2. `muggle-local-run-steps-get` with the `runId` (local) — what the agent attempted, each step beside the frame it produced. This replaces reading `action-script.json` out of `artifactsDir` by hand.
118
+ 3. `Artifacts` section, when present — opens `artifactsDir`. Read `results.md` for the per-step verdict on a passing run.
119
+ 4. `stdout.log` / `stderr.log` only when the Artifacts section is absent or `results.md` doesn't exist (e.g. early Electron failure).
119
120
 
120
121
  ### Initial signal heuristics
121
122
 
@@ -197,12 +198,12 @@ Triggered when `muggle-local-execute-test-generation` (or the remote equivalent)
197
198
 
198
199
  ### Where to read signals
199
200
 
200
- Same rule as section B: read **structured fields** from `muggle-local-run-result-get`, not `execute`'s response stdout tail. The `Artifacts` section is present on failed regen too — `action-script.json` is included when generation reached the step-emission stage (typical for `goal_not_achievable`: the agent's attempted steps + halt summary). `results.md` and per-step screenshots are absent on failure (electron-app emits those only on the successful completion path).
201
+ Same rule as section B: read **structured fields** from `muggle-local-run-result-get`, not `execute`'s response stdout tail. The `Artifacts` section is present on failed regen too — `action-script.json` is included when generation reached the step-emission stage (typical for `goal_not_achievable`: the agent's attempted steps + halt summary). `results.md` is absent on failure; the per-step frames are not — electron-app writes those as it goes, so a halted run still has one per step taken.
201
202
 
202
203
  Order:
203
204
 
204
205
  1. `Status` + `Error` — the verdict and one-line cause. `Error: Electron exited with code 26` typically means `goal_not_achievable`.
205
- 2. `action-script.json` in `artifactsDir` when present — read the steps the agent attempted and the `summaryStep` (halt reason, goal-not-achievable verdict).
206
+ 2. `muggle-local-run-steps-get` with the `runId` — the steps the agent attempted, its own explanation of each, the frame each produced, and the closing `summaryStep` verdict. Read this before trusting the verdict: a `goal_not_achievable` whose frames show the thing it calls missing is a false negative, not a defect.
206
207
  3. `stdout.log` / `stderr.log` at `artifactsDir/` — last 100 lines is usually enough; look for the final structured summary the generation agent emitted (it appears near the end as a JSON-ish block, not in the truncated execute tail).
207
208
  4. Remote regen — fetch the workflow run with `muggle-remote-wf-get-ts-gen-latest-run`; signals live in `summaryStep` and the per-step list there.
208
209
 
@@ -25,7 +25,9 @@ Read the Stage 6 run-level verdict, defined in [`../_shared/failure-mode-handlin
25
25
 
26
26
  ## Step 1: Root-cause each failure
27
27
 
28
- Per failing test case, assemble evidence and a diagnosis with [`../_shared/debug-failed-run.md`](../_shared/debug-failed-run.md) Steps 1–2 — attempted steps, halt reason, the failing step's screenshot, then the bucket. That doc's Step 3 is the interactive debug card; this stage is autonomous and does not run it.
28
+ Per failing test case, assemble evidence and a diagnosis with [`../_shared/debug-failed-run.md`](../_shared/debug-failed-run.md) Steps 1–2 — attempted steps, halt reason, the failing step's screenshot, then the bucket. For a local run that is one `muggle-local-run-steps-get` call. That doc's Step 3 is the interactive debug card; this stage is autonomous and does not run it.
29
+
30
+ Check the steps against the verdict before repairing anything. A run whose frames show the element its verdict calls missing is a false negative — repairing working code against one wastes the cycle.
29
31
 
30
32
  Stage 6 already wrote this evidence into its Failed block. Re-derive a bucket only for entries that arrived without one.
31
33
 
@@ -45,6 +45,8 @@ Always render before asking for feedback — the user must see the steps to refe
45
45
 
46
46
  `muggle-remote-action-script-get` with the resolved `actionScriptId`.
47
47
 
48
+ For a local run you already hold the `runId` for, `muggle-local-run-steps-get` returns the same steps with each frame's path already resolved — prefer it over walking the session directory. It numbers steps from 0; this skill's feedback anchors are **1-based**, so renumber when printing rather than passing its text through.
49
+
48
50
  Print:
49
51
 
50
52
  - **Header** — project name, test case title, script name, status, run url (if available). For remote, include the dashboard link.
@@ -24,6 +24,7 @@ Lookup material pulled out of `SKILL.md` to keep the always-loaded body lean. Ev
24
24
  | Execute (replay) | `muggle-remote-workflow-start-test-script-replay` | Remote |
25
25
  | Failure-mode telemetry | `muggle-local-telemetry-event-emit` | Both |
26
26
  | Results + cloud refs (studio-published `viewUrl` / `cloudTestScriptId` / `cloudActionScriptId`) | `muggle-local-run-result-get` | Local |
27
+ | Attempted steps + their frames (debugging a run) | `muggle-local-run-steps-get` | Local |
27
28
  | Results | `muggle-remote-wf-get-ts-gen-latest-run`, `muggle-remote-wf-get-ts-replay-latest-run` | Remote |
28
29
  | Per-step screenshots (for walkthrough) | `muggle-remote-test-script-get` | Both |
29
30
  | Browser | `open` (shell command) | Both |
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "release": "5.18.0",
3
- "buildId": "run-131-1",
4
- "commitSha": "2a9c35dcbe2ea26e25e420774ef737accd505c5d",
5
- "buildTime": "2026-09-23T00:34:07Z",
3
+ "buildId": "run-134-1",
4
+ "commitSha": "2172e219eab739a676b60437a8d6052b0ada3b58",
5
+ "buildTime": "2026-09-23T06:28:29Z",
6
6
  "serviceName": "muggle-ai-works-mcp"
7
7
  }
@@ -0,0 +1 @@
1
+ export { ACTION_SCRIPT_FILE_NAME, DEFAULT_PREFERENCES, ElectronAppReleaseStream, HTML_VIEW_OFFER_LINE, ONBOARDING_BLANKET_OPTIONS, ONBOARDING_CHOICE_GROUPS, ONBOARDING_MAX_OFFERS, ONBOARDING_PRIMER_BULLETS, ONBOARDING_PRIMER_HEADLINE, ONBOARDING_TOGGLE_GROUPS, ONBOARDING_TOGGLE_PROMPT, ONBOARDING_UNSELECTED_TOGGLE_VALUE, OnboardingBlanketChoice, OnboardingGroupKind, PREFERENCES_FILE_NAME, PREFERENCES_PROJECT_DIR_NAME, PREFERENCES_SCHEMA, PREFERENCES_VERSION, PREFERENCE_ALLOWED_VALUES, PreferenceKey, PreferenceValue, ProjectPreferencesReconcileOutcome, RUN_SESSIONS_DIR_NAME, RunViewError, RuntimeTarget, SCREENSHOT_DIR_RELATIVE_PATH, SCREENSHOT_FILE_EXTENSION, WATCHER_LIFETIME_SECONDS, WATCHER_LIFETIME_UNBOUNDED_SECONDS, applyOnboardingAnswers, assertDeviceCodeClientProvisioned, buildElectronAppChecksumsUrl, buildElectronAppReleaseAssetUrl, buildElectronAppReleaseTag, buildOnboardingPlan, calculateFileChecksum, completeOnboarding, createApiKeyWithToken, createChildLogger, deleteApiKeyData, deleteCredentials, e2e_exports as e2e, formatPreferencesOneLiner, getActiveElectronAppReleaseStream, getActiveRuntimeTarget, getApiKey, getApiKeyFilePath, getAuthService, getBundledElectronAppVersion, getCallerCredentials, getCallerCredentialsAsync, getChecksumForPlatform, getConfig, getCredentialsFilePath, getDataDir, getDownloadBaseUrl, getElectronAppChecksums, getElectronAppDir, getElectronAppReleaseTagPrefix, getElectronAppSignedFromVersion, getElectronAppVersion, getElectronAppVersionSource, getLocalQaTools, getLogger, getOnboardingToggleKeys, getPlatformKey, getQaTools, getReleaseSignerIdentityUri, getRunSessionsDir, getValidApiKeyData, getValidCredentials, hasApiKey, isElectronAppInstalled, isFirstRun, loadApiKeyData, loadCredentials, local_exports as localQa, markOnboardingCompleted, mcp_exports as mcp, needsOnboarding, openBrowserUrl, performLogin, performLogout, pollDeviceCode, e2e_exports as qa, readPreferencesMetadata, readRunView, reconcileProjectPreferences, recordOnboardingSkip, renderRunViewHtml, renderRunViewText, resetConfig, resetLogger, resetPreference, resolveActiveProfile, resolveActiveReleaseStream, resolveActiveReleaseTagPrefix, resolveBlanketPreferences, resolveElectronAppPathOrNull, resolveOnboardingAnswers, resolvePreferences, resolveRunSessionPath, resolveRuntimeTarget, resolveTogglePreferences, saveApiKey, saveApiKeyData, saveCredentials, startDeviceCodeFlow, toolRequiresAuth, validatePreference, verifyFileChecksum, writePreferences, writePreferencesWithMetadata, writeRunViewHtml } from './chunk-ZA5KHVX5.js';
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.131",
4
+ "version": "5.19.0",
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",
@@ -54,7 +54,7 @@
54
54
  "muggleConfig": {
55
55
  "electronAppVersion": "1.10.6",
56
56
  "downloadBaseUrl": "https://github.com/multiplex-ai/muggle-ai-works/releases/download",
57
- "runtimeTargetDefault": "staging",
57
+ "runtimeTargetDefault": "production",
58
58
  "checksumsByStream": {
59
59
  "production": {
60
60
  "win32-x64": "c20acdc2fd7a05039c62f9e5b079e3068d1b3a23a1b3b37b75e2a650b5401de6",
@@ -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.131",
4
+ "version": "5.19.0",
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.131",
5
+ "version": "5.19.0",
6
6
  "author": {
7
7
  "name": "Muggle AI",
8
8
  "email": "support@muggle-ai.com"
@@ -19,8 +19,8 @@ The guarantee binds **interactive** callers. An autonomous caller with no user t
19
19
 
20
20
  Read **structured run fields**, never the `execute` stdout tail (see [`dev-loop/failures.md`](./dev-loop/failures.md)). Assemble:
21
21
 
22
- - **Attempted steps + reasoning** — local: the attempted steps + `summaryStep` halt reason from `action-script.json` in `artifactsDir`; remote: the per-step list + `summaryStep` from `muggle-remote-wf-get-ts-gen-latest-run` / `muggle-remote-wf-get-ts-replay-latest-run`.
23
- - **Visual evidence** — a failed run already preserves the full step-by-step on disk: every per-step frame under `<artifactsDir>/electron-runtime/screenshot/` (with per-step label data under `.../dataset/`), alongside the step script at `<artifactsDir>/action-script.json`. `run-result-get` returns `artifactsDir` — read the whole set there; don't trust a step's `screenshotLocalPath`, which points at the original runtime dir. Once published — failed runs are published too, see [`dev-loop/publish.md`](./dev-loop/publish.md) — the same frames are cloud-hosted per step as `screenshotUrl`, the form remote runs expose directly.
22
+ - **Attempted steps + reasoning** — local: call `muggle-local-run-steps-get` with the `runId`. It returns the ordered steps (action, the agent's own explanation, the resolved frame path) plus the run's recorded status and closing verdict, already paired up. Remote: the per-step list + `summaryStep` from `muggle-remote-wf-get-ts-gen-latest-run` / `muggle-remote-wf-get-ts-replay-latest-run`.
23
+ - **Visual evidence** — local: the frame path on each step from the call above is the frame for that step; a step with none reports it rather than guessing. Do not hunt `<artifactsDir>/electron-runtime/screenshot/` by hand, and don't trust a step's `screenshotLocalPath`, which points at the original runtime dir. To look at the frames rather than their paths, `muggle run-view <runId> --html --open` renders them inline. Once published — failed runs are published too, see [`dev-loop/publish.md`](./dev-loop/publish.md) — the same frames are cloud-hosted per step as `screenshotUrl`, the form remote runs expose directly.
24
24
  - **Verdict** — `Status` + `Error`.
25
25
 
26
26
  ## Step 2 — Diagnose
@@ -29,7 +29,9 @@ Classify into the failure bucket per [`failure-mode-handling.md`](./failure-mode
29
29
 
30
30
  ## Step 3 — Present the debug card, then the guaranteed offer
31
31
 
32
- Show the **debug card** first: attempted steps + reasoning, the failing step's screenshot (or a one-line note if a path is genuinely absent), and the one-line diagnosis.
32
+ Show the **debug card** first: attempted steps + reasoning, the failing step's screenshot (or a one-line note if a path is genuinely absent), and the one-line diagnosis. For a local run `muggle-local-run-steps-get` already returns that card's body as text — print it rather than reassembling it, and offer `muggle run-view <runId> --html` when the user should see the frames themselves.
33
+
34
+ A verdict that disagrees with its own frames is common enough to check for: if the steps say the agent saw the thing its verdict calls missing, say so instead of reporting the verdict.
33
35
 
34
36
  Then present one `AskUserQuestion` whose options are:
35
37
 
@@ -1,3 +1,5 @@
1
1
  # Dev Loop — Action Script
2
2
 
3
3
  On the replay path use the `muggle-remote-action-script-get` response **as-is** — never edit, shorten, or rebuild `actionScript`; replay needs the full `label` paths for element lookup. For batches, fan the script fetches out in parallel before the sequential execute loop.
4
+
5
+ To *read* what a local run did rather than replay it, call `muggle-local-run-steps-get` — it returns the steps with the frame each produced. Never parse a session's `action-script.json` by hand.
@@ -4,7 +4,9 @@ For each `runId`, call `muggle-local-run-result-get` and read **structured field
4
4
 
5
5
  ## Artifacts
6
6
 
7
- The `Artifacts` section is present after any completed run; it names `artifactsDir` and lists files. On pass, `results.md` is the step-by-step verdict (read it before summarizing). On failure, `stdout.log` + `stderr.log` are always present; `action-script.json` appears when generation reached step-emission (typical for `goal_not_achievable`); `results.md` and per-step screenshots are absent on the failure path — don't hunt for them.
7
+ The `Artifacts` section is present after any completed run; it names `artifactsDir` and lists files. On pass, `results.md` is the step-by-step verdict (read it before summarizing). On failure, `stdout.log` + `stderr.log` are always present; `action-script.json` appears when generation reached step-emission (typical for `goal_not_achievable`); `results.md` is absent.
8
+
9
+ Per-step frames are **not** absent on the failure path — the `Artifacts` section just doesn't list them. A failed run writes them under `artifactsDir` like any other, so a run that halted still has a frame for every step it took. Call `muggle-local-run-steps-get` with the `runId` to get the steps paired with those frames rather than walking the directory.
8
10
 
9
11
  ## Common failures
10
12
 
@@ -114,8 +114,9 @@ Triggered when `muggle-local-execute-replay` returns `status: "failed"` (or non-
114
114
  Call `muggle-local-run-result-get` (local) or the remote equivalent and read **structured fields**, not `execute`'s response stdout tail (it's a truncated display excerpt and routinely cuts off mid-sentence). Order:
115
115
 
116
116
  1. `Status` + `Error` — the verdict and the one-line cause.
117
- 2. `Artifacts` section, when present — opens `artifactsDir`. Read `results.md` (step-by-step + screenshot links) for the per-step verdict, then `action-script.json` for what the agent attempted.
118
- 3. `stdout.log` / `stderr.log` only when the Artifacts section is absent or `results.md` doesn't exist (e.g. early Electron failure).
117
+ 2. `muggle-local-run-steps-get` with the `runId` (local) — what the agent attempted, each step beside the frame it produced. This replaces reading `action-script.json` out of `artifactsDir` by hand.
118
+ 3. `Artifacts` section, when present — opens `artifactsDir`. Read `results.md` for the per-step verdict on a passing run.
119
+ 4. `stdout.log` / `stderr.log` only when the Artifacts section is absent or `results.md` doesn't exist (e.g. early Electron failure).
119
120
 
120
121
  ### Initial signal heuristics
121
122
 
@@ -197,12 +198,12 @@ Triggered when `muggle-local-execute-test-generation` (or the remote equivalent)
197
198
 
198
199
  ### Where to read signals
199
200
 
200
- Same rule as section B: read **structured fields** from `muggle-local-run-result-get`, not `execute`'s response stdout tail. The `Artifacts` section is present on failed regen too — `action-script.json` is included when generation reached the step-emission stage (typical for `goal_not_achievable`: the agent's attempted steps + halt summary). `results.md` and per-step screenshots are absent on failure (electron-app emits those only on the successful completion path).
201
+ Same rule as section B: read **structured fields** from `muggle-local-run-result-get`, not `execute`'s response stdout tail. The `Artifacts` section is present on failed regen too — `action-script.json` is included when generation reached the step-emission stage (typical for `goal_not_achievable`: the agent's attempted steps + halt summary). `results.md` is absent on failure; the per-step frames are not — electron-app writes those as it goes, so a halted run still has one per step taken.
201
202
 
202
203
  Order:
203
204
 
204
205
  1. `Status` + `Error` — the verdict and one-line cause. `Error: Electron exited with code 26` typically means `goal_not_achievable`.
205
- 2. `action-script.json` in `artifactsDir` when present — read the steps the agent attempted and the `summaryStep` (halt reason, goal-not-achievable verdict).
206
+ 2. `muggle-local-run-steps-get` with the `runId` — the steps the agent attempted, its own explanation of each, the frame each produced, and the closing `summaryStep` verdict. Read this before trusting the verdict: a `goal_not_achievable` whose frames show the thing it calls missing is a false negative, not a defect.
206
207
  3. `stdout.log` / `stderr.log` at `artifactsDir/` — last 100 lines is usually enough; look for the final structured summary the generation agent emitted (it appears near the end as a JSON-ish block, not in the truncated execute tail).
207
208
  4. Remote regen — fetch the workflow run with `muggle-remote-wf-get-ts-gen-latest-run`; signals live in `summaryStep` and the per-step list there.
208
209
 
@@ -25,7 +25,9 @@ Read the Stage 6 run-level verdict, defined in [`../_shared/failure-mode-handlin
25
25
 
26
26
  ## Step 1: Root-cause each failure
27
27
 
28
- Per failing test case, assemble evidence and a diagnosis with [`../_shared/debug-failed-run.md`](../_shared/debug-failed-run.md) Steps 1–2 — attempted steps, halt reason, the failing step's screenshot, then the bucket. That doc's Step 3 is the interactive debug card; this stage is autonomous and does not run it.
28
+ Per failing test case, assemble evidence and a diagnosis with [`../_shared/debug-failed-run.md`](../_shared/debug-failed-run.md) Steps 1–2 — attempted steps, halt reason, the failing step's screenshot, then the bucket. For a local run that is one `muggle-local-run-steps-get` call. That doc's Step 3 is the interactive debug card; this stage is autonomous and does not run it.
29
+
30
+ Check the steps against the verdict before repairing anything. A run whose frames show the element its verdict calls missing is a false negative — repairing working code against one wastes the cycle.
29
31
 
30
32
  Stage 6 already wrote this evidence into its Failed block. Re-derive a bucket only for entries that arrived without one.
31
33
 
@@ -45,6 +45,8 @@ Always render before asking for feedback — the user must see the steps to refe
45
45
 
46
46
  `muggle-remote-action-script-get` with the resolved `actionScriptId`.
47
47
 
48
+ For a local run you already hold the `runId` for, `muggle-local-run-steps-get` returns the same steps with each frame's path already resolved — prefer it over walking the session directory. It numbers steps from 0; this skill's feedback anchors are **1-based**, so renumber when printing rather than passing its text through.
49
+
48
50
  Print:
49
51
 
50
52
  - **Header** — project name, test case title, script name, status, run url (if available). For remote, include the dashboard link.
@@ -24,6 +24,7 @@ Lookup material pulled out of `SKILL.md` to keep the always-loaded body lean. Ev
24
24
  | Execute (replay) | `muggle-remote-workflow-start-test-script-replay` | Remote |
25
25
  | Failure-mode telemetry | `muggle-local-telemetry-event-emit` | Both |
26
26
  | Results + cloud refs (studio-published `viewUrl` / `cloudTestScriptId` / `cloudActionScriptId`) | `muggle-local-run-result-get` | Local |
27
+ | Attempted steps + their frames (debugging a run) | `muggle-local-run-steps-get` | Local |
27
28
  | Results | `muggle-remote-wf-get-ts-gen-latest-run`, `muggle-remote-wf-get-ts-replay-latest-run` | Remote |
28
29
  | Per-step screenshots (for walkthrough) | `muggle-remote-test-script-get` | Both |
29
30
  | Browser | `open` (shell command) | Both |
@@ -1 +0,0 @@
1
- export { DEFAULT_PREFERENCES, ElectronAppReleaseStream, ONBOARDING_BLANKET_OPTIONS, ONBOARDING_CHOICE_GROUPS, ONBOARDING_MAX_OFFERS, ONBOARDING_PRIMER_BULLETS, ONBOARDING_PRIMER_HEADLINE, ONBOARDING_TOGGLE_GROUPS, ONBOARDING_TOGGLE_PROMPT, ONBOARDING_UNSELECTED_TOGGLE_VALUE, OnboardingBlanketChoice, OnboardingGroupKind, PREFERENCES_FILE_NAME, PREFERENCES_PROJECT_DIR_NAME, PREFERENCES_SCHEMA, PREFERENCES_VERSION, PREFERENCE_ALLOWED_VALUES, PreferenceKey, PreferenceValue, ProjectPreferencesReconcileOutcome, RuntimeTarget, WATCHER_LIFETIME_SECONDS, WATCHER_LIFETIME_UNBOUNDED_SECONDS, applyOnboardingAnswers, assertDeviceCodeClientProvisioned, buildElectronAppChecksumsUrl, buildElectronAppReleaseAssetUrl, buildElectronAppReleaseTag, buildOnboardingPlan, calculateFileChecksum, completeOnboarding, createApiKeyWithToken, createChildLogger, deleteApiKeyData, deleteCredentials, e2e_exports as e2e, formatPreferencesOneLiner, getActiveElectronAppReleaseStream, getActiveRuntimeTarget, getApiKey, getApiKeyFilePath, getAuthService, getBundledElectronAppVersion, getCallerCredentials, getCallerCredentialsAsync, getChecksumForPlatform, getConfig, getCredentialsFilePath, getDataDir, getDownloadBaseUrl, getElectronAppChecksums, getElectronAppDir, getElectronAppReleaseTagPrefix, getElectronAppSignedFromVersion, getElectronAppVersion, getElectronAppVersionSource, getLocalQaTools, getLogger, getOnboardingToggleKeys, getPlatformKey, getQaTools, getReleaseSignerIdentityUri, getValidApiKeyData, getValidCredentials, hasApiKey, isElectronAppInstalled, isFirstRun, loadApiKeyData, loadCredentials, local_exports as localQa, markOnboardingCompleted, mcp_exports as mcp, needsOnboarding, openBrowserUrl, performLogin, performLogout, pollDeviceCode, e2e_exports as qa, readPreferencesMetadata, reconcileProjectPreferences, recordOnboardingSkip, resetConfig, resetLogger, resetPreference, resolveActiveProfile, resolveActiveReleaseStream, resolveActiveReleaseTagPrefix, resolveBlanketPreferences, resolveElectronAppPathOrNull, resolveOnboardingAnswers, resolvePreferences, resolveRuntimeTarget, resolveTogglePreferences, saveApiKey, saveApiKeyData, saveCredentials, startDeviceCodeFlow, toolRequiresAuth, validatePreference, verifyFileChecksum, writePreferences, writePreferencesWithMetadata } from './chunk-U6ZACW6K.js';