@pcamarajr/scout 0.5.0 → 0.6.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/README.md CHANGED
@@ -143,6 +143,7 @@ Opt-in, off by default (zero overhead otherwise). When enabled, a **verified** s
143
143
 
144
144
  - Always sourced from the clean deterministic replay — never the exploratory AI run.
145
145
  - Pacing via `videoSpeed` in `scout.config.json` (`(0,1]`, default `0.4` = slower; `1` = natural speed).
146
+ - A verified scenario never yields zero video: if the paced replay trips on timing the authoritative run handled fine, scout silently records a non-paced fallback clip instead. The verdict is never affected.
146
147
  - Requires `ffmpeg` on `PATH` (or `FFMPEG_PATH`). Missing it isn't fatal — scout keeps the raw `.webm` and warns with an install hint. Font autodetected, or set `SCOUT_VIDEO_FONT` to a `.ttf`.
147
148
  - Enable per-run with `--record-video`, via `SCOUT_RECORD_VIDEO=1`, or `"recordVideo": true` in the config.
148
149
 
package/dist/cli.js CHANGED
@@ -6,6 +6,7 @@ import { Command } from "commander";
6
6
  import { chromium } from "playwright";
7
7
  import { CONFIG_FILE, SCOUT_DIR, loadConfig } from "./config.js";
8
8
  import { runScenario } from "./engine.js";
9
+ import { runInit } from "./init.js";
9
10
  import { buildReport, renderSummary, scenarioStatus } from "./report.js";
10
11
  import { addScenario, slugify } from "./specs.js";
11
12
  import { Store } from "./store.js";
@@ -23,24 +24,10 @@ program
23
24
  program
24
25
  .command("init")
25
26
  .description("Creates scout.config.json and .scout/ in the current project")
26
- .action(() => {
27
- const store = new Store();
28
- store.init();
29
- const configPath = path.join(process.cwd(), CONFIG_FILE);
30
- if (!fs.existsSync(configPath)) {
31
- fs.writeFileSync(configPath, JSON.stringify({
32
- baseUrl: "http://localhost:3000",
33
- model: "claude-sonnet-4-6",
34
- headless: true,
35
- maxTurns: 40,
36
- locale: "pt-BR",
37
- profiles: {
38
- anon: { description: "Logged-out session" },
39
- },
40
- }, null, 2) + "\n");
41
- console.log(`✓ ${CONFIG_FILE} created — adjust baseUrl and profiles.`);
42
- }
43
- console.log(`✓ ${SCOUT_DIR}/ initialized.`);
27
+ .option("--base-url <url>", "Default target app URL (skips the prompt)")
28
+ .option("-y, --yes", "Non-interactive: accept defaults, never prompt", false)
29
+ .action(async (opts) => {
30
+ await runInit({ baseUrl: opts.baseUrl, yes: opts.yes });
44
31
  });
45
32
  program
46
33
  .command("create <name>")
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,8EAA8E;AAC9E,+EAA+E;AAC/E,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,4BAA4B,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACzG,CAAC,CAAC,CAAC;AAEH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAwB,CAAC;AAEpH,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,kFAAkF,CAAC;KAC/F,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,8DAA8D,CAAC;KAC3E,MAAM,CAAC,kBAAkB,EAAE,2CAA2C,CAAC;KACvE,MAAM,CAAC,WAAW,EAAE,gDAAgD,EAAE,KAAK,CAAC;KAC5E,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,qEAAqE,CAAC;KAClF,cAAc,CAAC,yBAAyB,EAAE,2DAA2D,CAAC;KACtG,cAAc,CAAC,uBAAuB,EAAE,wDAAwD,CAAC;KACjG,MAAM,CAAC,yBAAyB,EAAE,uCAAuC,CAAC;KAC1E,MAAM,CAAC,qBAAqB,EAAE,2BAA2B,CAAC;KAC1D,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,QAAQ,GAAG,WAAW,CAAC;QAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI;QACJ,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC;AACzE,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,EAAE,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACrD,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,IAAI,WAAW,GAAG,CAAC,CAAC;IACvG,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,IAAI,CAAC;KACb,WAAW,CAAC,iFAAiF,CAAC;KAC9F,MAAM,CAAC,2BAA2B,EAAE,uBAAuB,CAAC;KAC5D,MAAM,CAAC,MAAM,EAAE,6CAA6C,EAAE,KAAK,CAAC;KACpE,MAAM,CAAC,WAAW,EAAE,qDAAqD,CAAC;KAC1E,MAAM,CAAC,UAAU,EAAE,+BAA+B,EAAE,KAAK,CAAC;KAC1D,MAAM,CAAC,gBAAgB,EAAE,mEAAmE,EAAE,KAAK,CAAC;KACpG,MAAM,CAAC,kBAAkB,EAAE,qFAAqF,CAAC;KACjH,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACnG,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ;QAC3B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC;QACzE,CAAC,CAAC,GAAG,CAAC;IACR,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,QAAQ,cAAc,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC;QAC9G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,IAAI,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE;gBACxD,OAAO,EAAE,IAAI,CAAC,EAAE;gBAChB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YAC3H,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5F,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,OAAO,GAAG,GAAG,KAAK,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACzI,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;gBACrC,MAAM,EAAE,CAAC;YACX,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC9E,IAAI,MAAM,CAAC,KAAK;gBAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3E,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,mEAAmE,CAAC;KAChF,MAAM,CAAC,QAAQ,EAAE,sDAAsD,EAAE,KAAK,CAAC;KAC/E,MAAM,CAAC,SAAS,EAAE,qDAAqD,EAAE,KAAK,CAAC;KAC/E,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;IACf,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;IAClC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9F,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,mGAAmG,CAAC;KAChH,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;IACrE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAMpD,CAAC;IACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,wEAAwE;QACxE,uEAAuE;QACvE,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACzG,OAAO,EAAE,CAAC;QACV,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC;QACnF,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACzC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACpC,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CACT,cAAc,OAAO,2BAA2B,OAAO,oBAAoB,OAAO,CAAC,CAAC,CAAC,aAAa,OAAO,kBAAkB,CAAC,CAAC,CAAC,EAAE,GAAG,CACpI,CAAC;IACF,OAAO,CAAC,GAAG,CACT,gIAAgI,CACjI,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,kBAAkB,EAAE,wEAAwE,CAAC;KACpG,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;IAClC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,YAAY,WAAW,uBAAuB,WAAW,iBAAiB,CAAC,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAC5B,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,WAAW,OAAO,CAAC,CAClG,CAAC;IACF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACrC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEhC,OAAO,CAAC,GAAG,CAAC,gBAAgB,WAAW,0BAA0B,CAAC,CAAC;IACnE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtF,EAAE,CAAC,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;YAC5C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAChD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,sBAAsB,SAAS,gBAAgB,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,2EAA2E,CAAC;KACxF,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC3D,MAAM,cAAc,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,EAAE,CAAC"}
package/dist/engine.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { type ScoutConfig } from "./config.js";
2
2
  import { Store } from "./store.js";
3
3
  import { describeStep } from "./runner/script-runner.js";
4
+ import { type TimelineEntry, type VideoPacing } from "./runner/video.js";
4
5
  import type { RunResult, Scenario, Step } from "./types.js";
5
6
  export interface RunOptions {
6
7
  /** Skip the cached script and force an AI run (re-record) */
@@ -17,6 +18,34 @@ export interface RunOptions {
17
18
  * no script / --ai → AI run; if verified, record the script
18
19
  */
19
20
  export declare function runScenario(store: Store, scenario: Scenario, config?: ScoutConfig, opts?: RunOptions): Promise<RunResult>;
21
+ /** A single recorded replay attempt: the WebM it produced and whether it passed. */
22
+ export interface RecordedReplay {
23
+ passed: boolean;
24
+ /** Path to the recorded WebM, if the context produced one. */
25
+ webm?: string;
26
+ /** Step captions with wall-clock offsets, for burned overlays. */
27
+ timeline: TimelineEntry[];
28
+ }
29
+ /**
30
+ * Builds the pacing for the non-paced fallback replay: zero slowMo and zero
31
+ * dwell so it mirrors the authoritative `ai+heal` replay (which passed). The
32
+ * title/verdict card durations are kept so the rendered MP4 still bookends with
33
+ * the scenario name and the VERIFIED card.
34
+ */
35
+ export declare function nonPacedPacing(paced: VideoPacing): VideoPacing;
36
+ /**
37
+ * Orchestrates preview-video generation, decoupled from the browser so it can be
38
+ * tested: `attempt` performs one recorded replay at a given pacing and returns
39
+ * its outcome + WebM. Best-effort and post-verdict — never touches the verdict.
40
+ *
41
+ * The verified scenario must NEVER yield zero video. The first attempt is paced
42
+ * (slowMo + dwell) for human viewing. If that paced replay fails — the pacing
43
+ * sometimes perturbs timing on flows the authoritative run handled fine (e.g. a
44
+ * cookie banner) — we fall back to a non-paced replay that mirrors the
45
+ * authoritative run, which passed, so a usable clip is still produced. Only if
46
+ * the fallback ALSO fails do we warn and yield no video.
47
+ */
48
+ export declare function recordPreviewVideoFrom(attempt: (pacing: VideoPacing) => Promise<RecordedReplay>, scenario: Scenario, runDir: string, pacing: VideoPacing): Promise<string | undefined>;
20
49
  /**
21
50
  * Runs `attempt` until it produces a real verdict, retrying runner failures
22
51
  * (agent died without calling scout_verdict) up to maxAttempts total runs.
package/dist/engine.js CHANGED
@@ -98,41 +98,26 @@ export async function runScenario(store, scenario, config = loadConfig(), opts =
98
98
  return result;
99
99
  }
100
100
  /**
101
- * Runs one extra, paced replay of the verified script with video recording on,
102
- * then renders it to a GitHub-ready MP4 with baked step labels + verdict card.
103
- * Best-effort: any failure warns and yields no video the verdict is untouched.
101
+ * Builds the pacing for the non-paced fallback replay: zero slowMo and zero
102
+ * dwell so it mirrors the authoritative `ai+heal` replay (which passed). The
103
+ * title/verdict card durations are kept so the rendered MP4 still bookends with
104
+ * the scenario name and the VERIFIED card.
104
105
  */
105
- async function recordPreviewVideo(scenario, steps, config, storageState, runDir) {
106
- const pacing = pacingFor(config.videoSpeed);
107
- let session;
108
- try {
109
- session = await BrowserSession.launch({
110
- baseUrl: config.baseUrl,
111
- headless: config.headless,
112
- storageState,
113
- locale: config.locale,
114
- runDir,
115
- recordVideo: true,
116
- slowMoMs: pacing.slowMoMs,
117
- });
118
- }
119
- catch {
120
- console.warn("[scout] vídeo: não foi possível abrir o browser para o replay de preview.");
121
- return undefined;
122
- }
123
- const preview = await replayForVideo(session, steps, pacing.assertDwellMs, pacing.verdictCardMs);
124
- const { video: webm } = await session.close();
125
- if (!preview.passed) {
126
- console.warn("[scout] vídeo: replay de preview falhou — nenhum vídeo gerado (veredito não afetado).");
127
- if (webm)
128
- fs.rmSync(webm, { force: true });
129
- return undefined;
130
- }
106
+ export function nonPacedPacing(paced) {
107
+ return { ...paced, slowMoMs: 0, assertDwellMs: 0 };
108
+ }
109
+ /**
110
+ * Renders an MP4 from a recorded WebM, persisting the timeline and degrading to
111
+ * the raw WebM under a stable name when ffmpeg is missing or fails. Returns the
112
+ * artifact path, or undefined when no WebM was produced at all.
113
+ */
114
+ function renderPreview(recorded, scenario, runDir, pacing) {
115
+ const webm = recorded.webm;
131
116
  if (!webm || !fs.existsSync(webm)) {
132
- console.warn("[scout] vídeo: replay não produziu arquivo WebM.");
117
+ console.warn("[scout] video: replay produced no WebM file.");
133
118
  return undefined;
134
119
  }
135
- fs.writeFileSync(path.join(runDir, "video.timeline.json"), JSON.stringify(preview.timeline, null, 2) + "\n");
120
+ fs.writeFileSync(path.join(runDir, "video.timeline.json"), JSON.stringify(recorded.timeline, null, 2) + "\n");
136
121
  const result = generateVideo({
137
122
  webmPath: webm,
138
123
  outPath: path.join(runDir, "video.mp4"),
@@ -140,11 +125,11 @@ async function recordPreviewVideo(scenario, steps, config, storageState, runDir)
140
125
  height: 844,
141
126
  scenarioName: scenario.name,
142
127
  verdict: "verified",
143
- timeline: preview.timeline,
128
+ timeline: recorded.timeline,
144
129
  pacing,
145
130
  });
146
131
  if (result.warning)
147
- console.warn(`[scout] vídeo: ${result.warning}`);
132
+ console.warn(`[scout] video: ${result.warning}`);
148
133
  if (result.output && result.output !== webm) {
149
134
  fs.rmSync(webm, { force: true }); // MP4 superseded the intermediate WebM
150
135
  return result.output;
@@ -159,6 +144,64 @@ async function recordPreviewVideo(scenario, steps, config, storageState, runDir)
159
144
  return webm;
160
145
  }
161
146
  }
147
+ /**
148
+ * Orchestrates preview-video generation, decoupled from the browser so it can be
149
+ * tested: `attempt` performs one recorded replay at a given pacing and returns
150
+ * its outcome + WebM. Best-effort and post-verdict — never touches the verdict.
151
+ *
152
+ * The verified scenario must NEVER yield zero video. The first attempt is paced
153
+ * (slowMo + dwell) for human viewing. If that paced replay fails — the pacing
154
+ * sometimes perturbs timing on flows the authoritative run handled fine (e.g. a
155
+ * cookie banner) — we fall back to a non-paced replay that mirrors the
156
+ * authoritative run, which passed, so a usable clip is still produced. Only if
157
+ * the fallback ALSO fails do we warn and yield no video.
158
+ */
159
+ export async function recordPreviewVideoFrom(attempt, scenario, runDir, pacing) {
160
+ const paced = await attempt(pacing);
161
+ if (paced.passed)
162
+ return renderPreview(paced, scenario, runDir, pacing);
163
+ if (paced.webm)
164
+ fs.rmSync(paced.webm, { force: true }); // discard the failed paced take
165
+ console.warn("[scout] video: paced preview replay failed; recorded a non-paced fallback clip (verdict unaffected).");
166
+ const fallbackPacing = nonPacedPacing(pacing);
167
+ const fallback = await attempt(fallbackPacing);
168
+ if (fallback.passed)
169
+ return renderPreview(fallback, scenario, runDir, fallbackPacing);
170
+ if (fallback.webm)
171
+ fs.rmSync(fallback.webm, { force: true });
172
+ console.warn("[scout] video: non-paced fallback replay also failed — no video generated (verdict unaffected).");
173
+ return undefined;
174
+ }
175
+ /**
176
+ * Runs one extra, paced replay of the verified script with video recording on,
177
+ * then renders it to a GitHub-ready MP4 with baked step labels + verdict card.
178
+ * On a paced-replay failure it retries without pacing so a verified scenario
179
+ * still yields a clip; the verdict is never affected.
180
+ */
181
+ async function recordPreviewVideo(scenario, steps, config, storageState, runDir) {
182
+ const attempt = async (pacing) => {
183
+ let session;
184
+ try {
185
+ session = await BrowserSession.launch({
186
+ baseUrl: config.baseUrl,
187
+ headless: config.headless,
188
+ storageState,
189
+ locale: config.locale,
190
+ runDir,
191
+ recordVideo: true,
192
+ slowMoMs: pacing.slowMoMs,
193
+ });
194
+ }
195
+ catch {
196
+ console.warn("[scout] video: could not open the browser for the preview replay.");
197
+ return { passed: false, timeline: [] };
198
+ }
199
+ const preview = await replayForVideo(session, steps, pacing.assertDwellMs, pacing.verdictCardMs);
200
+ const { video: webm } = await session.close();
201
+ return { passed: preview.passed, webm, timeline: preview.timeline };
202
+ };
203
+ return recordPreviewVideoFrom(attempt, scenario, runDir, pacingFor(config.videoSpeed));
204
+ }
162
205
  /**
163
206
  * Runs `attempt` until it produces a real verdict, retrying runner failures
164
207
  * (agent died without calling scout_verdict) up to maxAttempts total runs.
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAoB,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAW7D,SAAS,WAAW;IAClB,OAAO,OAAO,CACZ,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAC3B,OAAO,CAAC,GAAG,CAAC,uBAAuB;QACnC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC,CAC9D,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAY,EACZ,QAAkB,EAClB,SAAsB,UAAU,EAAE,EAClC,OAAmB,EAAE;IAErB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEzE,MAAM,MAAM,GAAG,GAAG,EAAE,CAClB,cAAc,CAAC,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ;QAC/C,YAAY;QACZ,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM;KACP,CAAC,CAAC;IAEL,IAAI,MAAiB,CAAC;IAEtB,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,MAAM,MAAM,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QAExC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,GAAG;gBACP,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,UAAU;gBACnB,MAAM,EAAE,gCAAgC,MAAM,CAAC,MAAM,UAAU;gBAC/D,SAAS,EAAE,MAAM,CAAC,MAAM;gBACxB,MAAM;gBACN,SAAS;gBACT,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,KAAK;aACN,CAAC;QACJ,CAAC;aAAM,IAAI,IAAI,IAAI,WAAW,EAAE,EAAE,CAAC;YACjC,+DAA+D;YAC/D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;YAClF,MAAM,GAAG;gBACP,GAAG,QAAQ;gBACX,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,+BAA+B,MAAM,CAAC,WAAY,GAAG,CAAC,KAAK,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,KAAK,yBAAyB,QAAQ,CAAC,MAAM,EAAE;gBAC/I,SAAS;gBACT,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC/B,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,GAAG;gBACP,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,QAAQ;gBACjB,MAAM,EAAE,QAAQ,MAAM,CAAC,WAAY,GAAG,CAAC,YAAY,MAAM,CAAC,UAAU,MAAM,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,kBAAkB,EAAE;gBACzK,SAAS,EAAE,MAAM,CAAC,MAAM;gBACxB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,MAAM;gBACN,SAAS;gBACT,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAC9B,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,KAAK;aACN,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,aAAa,QAAQ,CAAC,IAAI,mGAAmG,CAC9H,CAAC;QACJ,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;QAClF,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IACtE,CAAC;IAED,qEAAqE;IACrE,uEAAuE;IACvE,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,KAAK,EAAE,MAAM,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5B,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAC9B,eAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAClE,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,kBAAkB,CAC/B,QAAkB,EAClB,KAAa,EACb,MAAmB,EACnB,YAAgC,EAChC,MAAc;IAEd,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,OAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC;YACpC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,YAAY;YACZ,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM;YACN,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;QAC1F,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IACjG,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IAE9C,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;QACtG,IAAI,IAAI;YAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;QACjE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,qBAAqB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7G,MAAM,MAAM,GAAG,aAAa,CAAC;QAC3B,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;QACvC,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,YAAY,EAAE,QAAQ,CAAC,IAAI;QAC3B,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM;KACP,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC5C,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,uCAAuC;QACzE,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IACD,sEAAsE;IACtE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA0C,EAC1C,WAAW,GAAG,CAAC;IAEf,IAAI,OAAW,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,OAAO,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,aAAa;YAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,KAAK,CAClB,QAAkB,EAClB,MAAmB,EACnB,KAAY,EACZ,MAAc,EACd,YAAgC,EAChC,IAAgB;IAEhB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,KAAyB,CAAC;IAE9B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;QACrE,IAAI,SAAS,GAAG,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,qBAAqB,SAAS,8DAA8D,CAAC,CAAC;QACjI,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC;YAC1C,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ;YAC/C,YAAY;YACZ,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM;SACP,CAAC,CAAC;QACH,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACzD,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC;QACtC,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACtC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,WAAW;YAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChG,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;IAErF,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC3D,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,aAAa;YAC3B,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,KAAK,QAAQ,sDAAsD,MAAM,GAAG;YAC/F,CAAC,CAAC,OAAO,CAAC,MAAM;QAClB,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;QAC/B,MAAM;QACN,SAAS;QACT,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;QAC9B,WAAW;QACX,KAAK;QACL,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC;AACJ,CAAC;AAED,0FAA0F;AAC1F,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAe;IAChD,aAAa;IACb,YAAY;IACZ,eAAe;IACf,kBAAkB;IAClB,WAAW;IACX,YAAY;CACb,CAAC,CAAC;AAEH,SAAS,SAAS,CAAC,MAAc;IAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;AACxF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnF,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,8BAA8B;gBAC3C,MAAM;YACR,CAAC;YACD,6DAA6D;YAC7D,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YACpC,IAAI,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAClD,MAAM,CAAC,sEAAsE;QAC/E,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAClE,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,26 @@
1
+ export declare const DEFAULT_BASE_URL = "http://localhost:3000";
2
+ export interface InitOptions {
3
+ /** Base URL chosen on the command line (`--base-url`). Wins over any prompt. */
4
+ baseUrl?: string;
5
+ /** Non-interactive: never prompt, fall back to the default silently (`--yes`). */
6
+ yes?: boolean;
7
+ }
8
+ export interface InitDeps {
9
+ cwd?: string;
10
+ /**
11
+ * Resolves the default base URL when it was not passed on the CLI. Returns
12
+ * the chosen URL (possibly the default). Injected in tests; in production it
13
+ * prompts on a TTY or falls back to the default otherwise.
14
+ */
15
+ resolveBaseUrl?: (defaultUrl: string) => Promise<string>;
16
+ /** Sink for user-facing messages (defaults to console.log). */
17
+ log?: (message: string) => void;
18
+ }
19
+ /**
20
+ * Bootstraps `.scout/` and `scout.config.json` in the target project.
21
+ *
22
+ * Base URL precedence: `--base-url` flag > interactive prompt (TTY, not `--yes`)
23
+ * > the localhost default. An existing `scout.config.json` is never overwritten
24
+ * (it may carry secrets), and the prompt is skipped entirely in that case.
25
+ */
26
+ export declare function runInit(opts?: InitOptions, deps?: InitDeps): Promise<void>;
package/dist/init.js ADDED
@@ -0,0 +1,60 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import readline from "node:readline/promises";
4
+ import { CONFIG_FILE, SCOUT_DIR } from "./config.js";
5
+ import { scaffoldAgentOnboarding } from "./scaffold.js";
6
+ import { Store } from "./store.js";
7
+ export const DEFAULT_BASE_URL = "http://localhost:3000";
8
+ /** Prompt for the base URL on an interactive TTY; otherwise use the default. */
9
+ async function promptBaseUrl(defaultUrl) {
10
+ if (!process.stdin.isTTY || !process.stdout.isTTY)
11
+ return defaultUrl;
12
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
13
+ try {
14
+ const answer = (await rl.question(`Default base URL (${defaultUrl}): `)).trim();
15
+ return answer || defaultUrl;
16
+ }
17
+ finally {
18
+ rl.close();
19
+ }
20
+ }
21
+ /**
22
+ * Bootstraps `.scout/` and `scout.config.json` in the target project.
23
+ *
24
+ * Base URL precedence: `--base-url` flag > interactive prompt (TTY, not `--yes`)
25
+ * > the localhost default. An existing `scout.config.json` is never overwritten
26
+ * (it may carry secrets), and the prompt is skipped entirely in that case.
27
+ */
28
+ export async function runInit(opts = {}, deps = {}) {
29
+ const cwd = deps.cwd ?? process.cwd();
30
+ const log = deps.log ?? ((m) => console.log(m));
31
+ const resolveBaseUrl = deps.resolveBaseUrl ?? promptBaseUrl;
32
+ const store = new Store(cwd);
33
+ store.init();
34
+ const configPath = path.join(cwd, CONFIG_FILE);
35
+ if (!fs.existsSync(configPath)) {
36
+ let baseUrl = DEFAULT_BASE_URL;
37
+ if (opts.baseUrl) {
38
+ baseUrl = opts.baseUrl;
39
+ }
40
+ else if (!opts.yes) {
41
+ baseUrl = await resolveBaseUrl(DEFAULT_BASE_URL);
42
+ }
43
+ fs.writeFileSync(configPath, JSON.stringify({
44
+ baseUrl,
45
+ model: "claude-sonnet-4-6",
46
+ headless: true,
47
+ maxTurns: 40,
48
+ locale: "pt-BR",
49
+ profiles: {
50
+ anon: { description: "Logged-out session" },
51
+ },
52
+ }, null, 2) + "\n");
53
+ log(`✓ ${CONFIG_FILE} created (baseUrl: ${baseUrl}) — adjust baseUrl and profiles.`);
54
+ }
55
+ log(`✓ ${SCOUT_DIR}/ initialized.`);
56
+ // Refresh agent-onboarding artifacts (AGENTS.md block, Claude skill, Cursor
57
+ // rule). Idempotent — re-running init is the upgrade path for these files.
58
+ scaffoldAgentOnboarding({ cwd, log });
59
+ }
60
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,CAAC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAqBxD,gFAAgF;AAChF,KAAK,UAAU,aAAa,CAAC,UAAkB;IAC7C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,UAAU,CAAC;IACrE,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,UAAU,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChF,OAAO,MAAM,IAAI,UAAU,CAAC;IAC9B,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAoB,EAAE,EAAE,OAAiB,EAAE;IACvE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,aAAa,CAAC;IAE5D,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,KAAK,CAAC,IAAI,EAAE,CAAC;IAEb,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,IAAI,OAAO,GAAG,gBAAgB,CAAC;QAC/B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACrB,OAAO,GAAG,MAAM,cAAc,CAAC,gBAAgB,CAAC,CAAC;QACnD,CAAC;QACD,EAAE,CAAC,aAAa,CACd,UAAU,EACV,IAAI,CAAC,SAAS,CACZ;YACE,OAAO;YACP,KAAK,EAAE,mBAAmB;YAC1B,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,OAAO;YACf,QAAQ,EAAE;gBACR,IAAI,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE;aAC5C;SACF,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CACT,CAAC;QACF,GAAG,CAAC,KAAK,WAAW,sBAAsB,OAAO,kCAAkC,CAAC,CAAC;IACvF,CAAC;IACD,GAAG,CAAC,KAAK,SAAS,gBAAgB,CAAC,CAAC;IAEpC,4EAA4E;IAC5E,2EAA2E;IAC3E,uBAAuB,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Onboarding artifacts written by `scout init` so any AI agent in the consuming
3
+ * repo can help a QA team configure Scout and author `.scout.md` scenarios.
4
+ *
5
+ * Three files, two ownership models:
6
+ * - AGENTS.md (repo root) — SHARED with the user and other tools. Scout owns
7
+ * only a managed block delimited by the markers below; everything outside
8
+ * it is left untouched.
9
+ * - .claude/skills/scout/SKILL.md and .cursor/rules/scout.mdc — Scout-OWNED,
10
+ * overwritten on every init (init is the upgrade path).
11
+ *
12
+ * Re-running init refreshes all three. `scout.config.json` is never touched here.
13
+ */
14
+ export declare const SCOUT_BLOCK_START = "<!-- scout:start -->";
15
+ export declare const SCOUT_BLOCK_END = "<!-- scout:end -->";
16
+ /** Resolve the bundled `templates/` dir, whether running from `src/` or `dist/`. */
17
+ export declare function templatesDir(): string;
18
+ /**
19
+ * Embed `body` inside the scout managed block in `existing` content.
20
+ *
21
+ * - no existing content → just the block.
22
+ * - existing WITH a block → replace ONLY the block's contents.
23
+ * - existing WITHOUT a block → append the block, preserving everything else.
24
+ */
25
+ export declare function applyManagedBlock(existing: string | undefined, body: string): string;
26
+ export interface ScaffoldDeps {
27
+ cwd?: string;
28
+ log?: (message: string) => void;
29
+ }
30
+ /** Write/refresh AGENTS.md (managed block), the Claude skill, and the Cursor rule. */
31
+ export declare function scaffoldAgentOnboarding(deps?: ScaffoldDeps): void;
@@ -0,0 +1,82 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ /**
5
+ * Onboarding artifacts written by `scout init` so any AI agent in the consuming
6
+ * repo can help a QA team configure Scout and author `.scout.md` scenarios.
7
+ *
8
+ * Three files, two ownership models:
9
+ * - AGENTS.md (repo root) — SHARED with the user and other tools. Scout owns
10
+ * only a managed block delimited by the markers below; everything outside
11
+ * it is left untouched.
12
+ * - .claude/skills/scout/SKILL.md and .cursor/rules/scout.mdc — Scout-OWNED,
13
+ * overwritten on every init (init is the upgrade path).
14
+ *
15
+ * Re-running init refreshes all three. `scout.config.json` is never touched here.
16
+ */
17
+ export const SCOUT_BLOCK_START = "<!-- scout:start -->";
18
+ export const SCOUT_BLOCK_END = "<!-- scout:end -->";
19
+ const AGENTS_FILE = "AGENTS.md";
20
+ const SKILL_FILE = path.join(".claude", "skills", "scout", "SKILL.md");
21
+ const CURSOR_RULE_FILE = path.join(".cursor", "rules", "scout.mdc");
22
+ /** Resolve the bundled `templates/` dir, whether running from `src/` or `dist/`. */
23
+ export function templatesDir() {
24
+ const here = path.dirname(fileURLToPath(import.meta.url));
25
+ // here is <pkg>/src or <pkg>/dist → templates sits at <pkg>/templates
26
+ return path.join(here, "..", "templates");
27
+ }
28
+ function readTemplate(name) {
29
+ return fs.readFileSync(path.join(templatesDir(), name), "utf8");
30
+ }
31
+ /**
32
+ * Embed `body` inside the scout managed block in `existing` content.
33
+ *
34
+ * - no existing content → just the block.
35
+ * - existing WITH a block → replace ONLY the block's contents.
36
+ * - existing WITHOUT a block → append the block, preserving everything else.
37
+ */
38
+ export function applyManagedBlock(existing, body) {
39
+ const block = `${SCOUT_BLOCK_START}\n${body.trim()}\n${SCOUT_BLOCK_END}\n`;
40
+ if (existing === undefined || existing.trim() === "") {
41
+ return block;
42
+ }
43
+ const startIdx = existing.indexOf(SCOUT_BLOCK_START);
44
+ const endIdx = existing.indexOf(SCOUT_BLOCK_END);
45
+ if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
46
+ const before = existing.slice(0, startIdx);
47
+ const after = existing.slice(endIdx + SCOUT_BLOCK_END.length);
48
+ // Trim a leading newline off `after` so we don't accumulate blank lines.
49
+ return `${before}${block}${after.replace(/^\n/, "")}`;
50
+ }
51
+ // No block yet — append, keeping the user's content and a clean separator.
52
+ const sep = existing.endsWith("\n") ? "\n" : "\n\n";
53
+ return `${existing}${sep}${block}`;
54
+ }
55
+ /** Write/refresh AGENTS.md (managed block), the Claude skill, and the Cursor rule. */
56
+ export function scaffoldAgentOnboarding(deps = {}) {
57
+ const cwd = deps.cwd ?? process.cwd();
58
+ const log = deps.log ?? ((m) => console.log(m));
59
+ // 1. AGENTS.md — managed block, never clobbers surrounding content.
60
+ const agentsPath = path.join(cwd, AGENTS_FILE);
61
+ const body = readTemplate("AGENTS.md");
62
+ const existing = fs.existsSync(agentsPath) ? fs.readFileSync(agentsPath, "utf8") : undefined;
63
+ const had = existing !== undefined;
64
+ const hadBlock = had && existing.includes(SCOUT_BLOCK_START);
65
+ fs.writeFileSync(agentsPath, applyManagedBlock(existing, body));
66
+ log(hadBlock
67
+ ? `✓ ${AGENTS_FILE} — refreshed the Scout block.`
68
+ : had
69
+ ? `✓ ${AGENTS_FILE} — appended the Scout block (your content kept).`
70
+ : `✓ ${AGENTS_FILE} created.`);
71
+ // 2. Claude Code skill — Scout-owned, overwrite.
72
+ const skillPath = path.join(cwd, SKILL_FILE);
73
+ fs.mkdirSync(path.dirname(skillPath), { recursive: true });
74
+ fs.writeFileSync(skillPath, readTemplate("SKILL.md"));
75
+ log(`✓ ${SKILL_FILE}`);
76
+ // 3. Cursor rule — Scout-owned, overwrite.
77
+ const cursorPath = path.join(cwd, CURSOR_RULE_FILE);
78
+ fs.mkdirSync(path.dirname(cursorPath), { recursive: true });
79
+ fs.writeFileSync(cursorPath, readTemplate("scout.mdc"));
80
+ log(`✓ ${CURSOR_RULE_FILE}`);
81
+ }
82
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pcamarajr/scout",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Self-healing browser QA: natural-language scenarios verified by an AI agent, replayed deterministically in CI",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -35,7 +35,8 @@
35
35
  }
36
36
  },
37
37
  "files": [
38
- "dist"
38
+ "dist",
39
+ "templates"
39
40
  ],
40
41
  "scripts": {
41
42
  "build": "tsc",
@@ -0,0 +1,100 @@
1
+ # Scout — browser QA for AI agents
2
+
3
+ Scout turns **natural-language scenarios** into **AI-verified, deterministically-replayed** browser tests. A scenario is written in plain English in a `.scout.md` file; on its first `scout go` an AI agent drives a real browser (Playwright), judges the outcome, and records a deterministic script. Every later run replays that script with **no LLM** — fast and free — and only falls back to AI when the script breaks (self-heal).
4
+
5
+ This file is the **single source of truth** for how an AI agent should help a QA team work with Scout in this repo. The Claude Code skill and the Cursor rule both point here.
6
+
7
+ ## Your primary job: co-author scenarios with QA
8
+
9
+ When a QA person describes a flow they want covered, **you write the `.scout.md` directly** — do not make them hand-write it. You have full repo context (routes, components, copy, auth), so you can author a richer, more accurate spec than the CLI scaffold (`scout create`) ever could. Then you verify it and iterate with the human until it is green.
10
+
11
+ The loop:
12
+
13
+ 1. **Author** — translate the QA person's intent into one or more scenarios in a `.scout.md` file (format below). Capture the flow *and* the expected behavior, in plain language. No selectors, no code.
14
+ 2. **Verify** — run `scout go` (optionally `-s <slug>` to target one scenario). The first run is AI-driven, in a real browser.
15
+ 3. **Interpret** — read the verdict Scout reports and relay it to the human verbatim (see *Verdicts* below).
16
+ 4. **Iterate** — refine the scenario text with QA until the verdict is `verified`, then commit the `.scout.md` and the recorded script.
17
+
18
+ > `scout create <name> -f <feature> -c <text>` exists as a convenience for **humans without an agent**. As the agent, prefer authoring the `.scout.md` directly — you can write a fuller spec from repo context.
19
+
20
+ ## ⛔ Verification-integrity rule (non-negotiable)
21
+
22
+ **Never declare a scenario working, passing, or done without actually running `scout go` and reporting the real verdict.**
23
+
24
+ - Do **not** fabricate, assume, or predict success. Run it.
25
+ - Report the verdict Scout produced **verbatim** — including the `reason` line.
26
+ - If the result is `failed`, `partial`, or `blocked`, say so honestly. If a replay **healed**, surface that and show the script diff so a human can review what changed.
27
+
28
+ This rule protects Scout's entire value proposition: a verdict is trustworthy only because it came from a real run. Inventing one poisons the suite.
29
+
30
+ ## The `.scout.md` authoring guide
31
+
32
+ Scenarios live as markdown under `.scout/specs/**/*.scout.md` — **one file per feature/component**, versioned and reviewed like any other test. The markdown is a **pure input**: a run never writes back to it (status lives in `.scout/runs/`), so the spec diff only ever reflects an intent change.
33
+
34
+ Format:
35
+
36
+ ```markdown
37
+ ---
38
+ feature: Paywall # optional; defaults to the filename
39
+ profile: anon # optional; default auth profile for scenarios below
40
+ tags: [monetization] # optional
41
+ ---
42
+
43
+ ## Free user hits paywall on ep 3
44
+ Open ep 3 of series X without login; the paywall appears with a signup CTA.
45
+
46
+ ## Subscriber bypasses paywall
47
+ profile: qa # per-scenario override (also: notes, tags)
48
+
49
+ Logged-in subscriber opens ep 3; the episode plays with no paywall.
50
+ ```
51
+
52
+ Rules that matter when you author:
53
+
54
+ - **Frontmatter** (YAML, optional): `feature` (defaults to the filename), `profile` (default auth profile), `tags`.
55
+ - **Each `## heading` is one scenario.** Its logical slug is `<file-slug>/<scenario-slug>` (e.g. `paywall/free-user-hits-paywall-on-ep-3`) and must be unique across the suite. Duplicate headings in a file, or a scenario with no body text, are hard errors.
56
+ - **Per-scenario overrides:** immediately under a heading you may place `profile:`, `notes:`, and `tags:` lines (before the prose) to override the file-level defaults.
57
+ - **Body = flow + expected behavior, in plain language.** Describe what the user does and what must (or must not) be true. No CSS selectors, no Playwright code — the agent discovers the real elements at run time and records them.
58
+ - A `.scout.md` whose every `##` lives inside a fenced ```` ``` ```` block parses as **zero scenarios** (that is how `example.scout.md` documents the format without polluting the suite).
59
+
60
+ ## Base URL and secrets
61
+
62
+ There is a **default base URL** set at `scout init` (in `scout.config.json`). It can be **overridden per run** without editing the file:
63
+
64
+ - `scout go --base-url https://staging.example.com`
65
+ - `SCOUT_BASE_URL=https://staging.example.com scout go`
66
+ - Precedence: `--base-url` flag > `SCOUT_BASE_URL` env > `baseUrl` in `scout.config.json`.
67
+
68
+ Recorded scripts store navigation **relative to the base URL in effect at record time**, so a script recorded against `:3000` replays unchanged against staging.
69
+
70
+ For credentials and tokens, never put a literal secret in a scenario. Use a **`$ENV:VAR` placeholder** — Scout resolves it from the environment at run time, in both **form fills** and **`browser_navigate` URLs** (e.g. `/renew?token=$ENV:RENEW_TOKEN`). The real value never enters the committed script and never passes through the LLM. Declare the allowed env vars per auth profile in `scout.config.json` (`profiles.<name>.env`).
71
+
72
+ ## Verdicts (what `scout go` reports)
73
+
74
+ | Verdict | Meaning |
75
+ |---|---|
76
+ | `verified` ✅ | All expected behavior confirmed by assertions. |
77
+ | `failed` ❌ | Broken behavior — the `reason` says exactly what. |
78
+ | `partial` ⚠️ | Only part of the expected behavior was confirmed. |
79
+ | `blocked` 🚫 | Couldn't reach the flow at all (app down, login broken). |
80
+
81
+ **Healed:** when a cached script breaks but the AI re-verifies and re-records it, the run is flagged `healed`. The recorded-script diff is the heal diff — review it; a legitimate UI change is fine to commit, an unexpected one is a real regression.
82
+
83
+ **Runner failure ≠ UI verdict:** an AI run can die without producing a verdict (turn budget exhausted, SDK error). Scout flags that as `runnerFailure` / 💥 — it is an infrastructure failure, **not** a judgment about the app. Rerun it; don't debug the app over it.
84
+
85
+ ## Secondary: helping triage a failed replay
86
+
87
+ When a replay comes back `failed`/`partial`/`blocked` or `healed`, you can help — but the **human stays in the loop on intent**. Triage flow:
88
+
89
+ 1. Read the `reason` and open the run artifacts under `.scout/runs/<timestamp>-<slug>/` — `report.md` (verdict + recorded script), `trace.zip` (`npx playwright show-trace`), screenshots, and `transcript.md` for AI runs.
90
+ 2. Decide *with the human* whether this is a **real regression** (the app broke → fix the app) or a **legitimate UI change** (the spec/script is stale → re-verify with `scout go --ai -s <slug>` to re-record, then review the diff).
91
+ 3. Never silently re-record to make a red suite green. A green verdict must reflect reality.
92
+
93
+ ## Defer to the live CLI for commands and flags
94
+
95
+ Commands and flags evolve — read them live instead of trusting a copy:
96
+
97
+ - `scout --help` — all commands.
98
+ - `scout <command> --help` — flags for one command (e.g. `scout go --help`).
99
+
100
+ The core commands you will use: `scout go` (verify/replay), `scout list` (scenarios + status), `scout report` (suite summary, `--check` for a CI gate). `scout init` is the setup/upgrade entry point and also refreshes these onboarding files.
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: scout
3
+ description: >
4
+ Help a QA team use Scout — browser QA where natural-language scenarios are
5
+ AI-verified once and then replayed deterministically. TRIGGER when the user
6
+ mentions Scout, a `.scout.md` scenario, `scout.config.json`, `scout go` /
7
+ `scout init` / `scout report`, browser/E2E/QA testing of a user flow, or asks
8
+ to author, verify, replay, or triage a browser test scenario. Do NOT trigger
9
+ for unrelated unit tests or non-browser work.
10
+ ---
11
+
12
+ # Scout
13
+
14
+ Scout is self-healing browser QA: QA describes a flow in plain English, an AI
15
+ agent verifies it once in a real browser and records a deterministic script,
16
+ and every later run replays that script with no LLM.
17
+
18
+ Your job is to **co-author `.scout.md` scenarios** with QA, **verify** them with
19
+ `scout go`, and **report the real verdict** — never claim a scenario passes
20
+ without running it.
21
+
22
+ **Read `AGENTS.md` at the repo root — it is the canonical, always-current guide**
23
+ to the authoring loop, the `.scout.md` format, base-URL/secret handling,
24
+ verdicts, and failure triage. Follow it. For commands and flags, run
25
+ `scout --help` / `scout <command> --help`.
@@ -0,0 +1,21 @@
1
+ ---
2
+ description: Scout browser QA — authoring and verifying .scout.md scenarios.
3
+ globs:
4
+ - "**/*.scout.md"
5
+ - "scout.config.json"
6
+ alwaysApply: false
7
+ ---
8
+
9
+ # Scout
10
+
11
+ When working with Scout files (`*.scout.md`, `scout.config.json`), you are
12
+ helping a QA team with **browser QA**: natural-language scenarios that are
13
+ AI-verified once and then replayed deterministically.
14
+
15
+ Co-author `.scout.md` scenarios with QA, verify them with `scout go`, and report
16
+ the **real** verdict — never claim a scenario passes without running it.
17
+
18
+ **Read `AGENTS.md` at the repo root** — it is the canonical, always-current
19
+ guide to the authoring loop, the `.scout.md` format, base-URL/secret handling,
20
+ verdicts, and failure triage. For commands and flags, run `scout --help` /
21
+ `scout <command> --help`.