@pcamarajr/scout 0.6.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -237
- package/dist/cli.js +121 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +7 -0
- package/dist/config.js +3 -0
- package/dist/config.js.map +1 -1
- package/dist/credentials.d.ts +73 -0
- package/dist/credentials.js +196 -0
- package/dist/credentials.js.map +1 -0
- package/dist/engine.js +5 -8
- package/dist/engine.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/runner/agent-tools.d.ts +45 -0
- package/dist/runner/agent-tools.js +151 -0
- package/dist/runner/agent-tools.js.map +1 -0
- package/dist/runner/ai-runner.d.ts +11 -35
- package/dist/runner/ai-runner.js +36 -229
- package/dist/runner/ai-runner.js.map +1 -1
- package/dist/runner/engines/ai-sdk.d.ts +58 -0
- package/dist/runner/engines/ai-sdk.js +144 -0
- package/dist/runner/engines/ai-sdk.js.map +1 -0
- package/dist/runner/engines/claude-agent-sdk.d.ts +11 -0
- package/dist/runner/engines/claude-agent-sdk.js +117 -0
- package/dist/runner/engines/claude-agent-sdk.js.map +1 -0
- package/dist/runner/engines/index.d.ts +20 -0
- package/dist/runner/engines/index.js +28 -0
- package/dist/runner/engines/index.js.map +1 -0
- package/dist/runner/engines/types.d.ts +68 -0
- package/dist/runner/engines/types.js +37 -0
- package/dist/runner/engines/types.js.map +1 -0
- package/package.json +7 -1
package/README.md
CHANGED
|
@@ -1,281 +1,117 @@
|
|
|
1
1
|
# 🔭 Scout
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Describe a test in plain English. Scout verifies it in a real browser, then replays it for free, forever.**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://www.npmjs.com/package/@pcamarajr/scout)
|
|
6
|
+
[](./LICENSE)
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
Scout is self-healing browser QA. You write a scenario in one sentence; an AI agent drives a real browser (Playwright) to verify it and records a deterministic script. Every run after that is pure replay — no LLM, fast and free — and AI only steps back in when the UI changes and the script breaks.
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
| Judges behavior ("paywall MUST NOT appear") | only what was coded | yes | yes |
|
|
10
|
+
- ✍️ **Author in one sentence** — no selectors, no code. Just the flow and what should happen.
|
|
11
|
+
- 🤖 **Verified in a real browser** — an agent judges behavior ("the paywall must *not* appear"), not just clicks.
|
|
12
|
+
- ⚡ **Replays for free** — recorded runs are pure Playwright. ~zero cost, seconds per scenario, CI-ready.
|
|
13
|
+
- 🔧 **Self-heals** — when the UI changes, AI re-verifies and re-records; you review the diff.
|
|
14
|
+
- 🧠 **Works with Claude, Gemini, or OpenAI** — zero-config with Claude Code; one env var for the rest.
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
## How it works
|
|
17
17
|
|
|
18
18
|
```
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
UI changed and replay broke?
|
|
29
|
-
|
|
19
|
+
You write: "On the homepage, search for 'shoes' and results appear."
|
|
20
|
+
│
|
|
21
|
+
▼ scout go (first run)
|
|
22
|
+
AI agent runs it in a real browser, judges the outcome (verified / failed / …),
|
|
23
|
+
and records a deterministic script (steps + assertions).
|
|
24
|
+
│
|
|
25
|
+
▼ scout go (every run after)
|
|
26
|
+
Pure Playwright replay — no LLM, seconds per scenario, ~zero cost.
|
|
27
|
+
│
|
|
28
|
+
▼ UI changed and replay broke?
|
|
29
|
+
AI re-runs, re-judges, re-records the script (self-healing). You review the diff.
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
scout init # creates scout.config.json + .scout/specs/
|
|
39
|
-
scout create "Login with Google" \
|
|
40
|
-
-f auth \
|
|
41
|
-
-c "On logged-out home, click Sign In; login page should show Google and email/password options" \
|
|
42
|
-
-p anon
|
|
43
|
-
scout go # 1st run = AI (requires Anthropic credentials)
|
|
44
|
-
scout go # subsequent runs = deterministic replay
|
|
45
|
-
scout report # markdown ready to embed in PR body
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### AI runner credentials
|
|
49
|
-
|
|
50
|
-
- **Local:** if you use Claude Code, the Agent SDK reuses your machine credentials — zero config.
|
|
51
|
-
- **CI/headless:** export `ANTHROPIC_API_KEY`. The SDK is self-contained (Claude Code CLI not required).
|
|
52
|
-
- Deterministic replay **does not use LLM** — in CI without a key, use `scout go --no-heal` (failure becomes ❌ in the report instead of healing).
|
|
32
|
+
| | Pure Playwright | Pure AI | **Scout** |
|
|
33
|
+
|---|---|---|---|
|
|
34
|
+
| Authoring | code + selectors | one sentence | **one sentence** |
|
|
35
|
+
| Cost per CI run | ~zero | $$ + slow | **~zero (replay)** |
|
|
36
|
+
| Survives UI changes | breaks | adapts | **breaks → AI re-records** |
|
|
37
|
+
| Judges behavior | only what you coded | yes | **yes** |
|
|
53
38
|
|
|
54
|
-
##
|
|
39
|
+
## Quickstart — try it on any live URL (~2 min)
|
|
55
40
|
|
|
56
|
-
|
|
41
|
+
No codebase required. Point Scout at a site you already have and watch it verify a real flow.
|
|
57
42
|
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
profile: anon # default auth profile for scenarios below
|
|
62
|
-
tags: [monetization] # optional
|
|
63
|
-
---
|
|
43
|
+
```bash
|
|
44
|
+
npm install -g @pcamarajr/scout # or: npx @pcamarajr/scout <command>
|
|
45
|
+
npx playwright install chromium # the browser engine
|
|
64
46
|
|
|
65
|
-
|
|
66
|
-
|
|
47
|
+
scout init --base-url https://your-app.com # or run `scout init` and answer the prompt
|
|
48
|
+
scout doctor # check your AI credentials (see below)
|
|
67
49
|
|
|
68
|
-
|
|
69
|
-
|
|
50
|
+
scout create "Homepage search" \
|
|
51
|
+
-f home \
|
|
52
|
+
-c "On the homepage, search for 'shoes'; a list of results appears"
|
|
70
53
|
|
|
71
|
-
|
|
54
|
+
scout go # first run: the AI agent verifies it in a real browser
|
|
55
|
+
scout go # again: deterministic replay, no LLM, seconds
|
|
72
56
|
```
|
|
73
57
|
|
|
74
|
-
|
|
75
|
-
- Optional `profile`/`notes`/`tags` lines right after a heading override the file-level defaults.
|
|
76
|
-
- Author by hand, or via `scout create <name> -f <feature> -c <text>` / the `scout_create_scenario` MCP tool.
|
|
58
|
+
That's it — you have a verified test that replays for free.
|
|
77
59
|
|
|
78
|
-
###
|
|
60
|
+
### AI credentials
|
|
79
61
|
|
|
80
|
-
|
|
62
|
+
The first `scout go` needs an AI provider. Run `scout doctor` anytime to check.
|
|
81
63
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
```
|
|
64
|
+
- **Claude Code (zero-config) — the happy path.** If you're signed in to [Claude Code](https://claude.com/claude-code), Scout reuses that session automatically. Nothing to set.
|
|
65
|
+
- **Or an API key:** `export ANTHROPIC_API_KEY=…` (Claude), `export GEMINI_API_KEY=…` (Gemini), or `export OPENAI_API_KEY=…` (OpenAI). Scout picks the provider from the `model` in `scout.config.json`.
|
|
85
66
|
|
|
86
|
-
|
|
67
|
+
Full provider setup → [`docs/providers/`](./docs/providers). Deterministic **replay never uses an LLM**, so CI needs no credentials (`scout go --no-heal`).
|
|
87
68
|
|
|
88
|
-
##
|
|
69
|
+
## Use it in your codebase
|
|
89
70
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
```jsonc
|
|
93
|
-
// scout.config.json
|
|
94
|
-
{
|
|
95
|
-
"baseUrl": "http://localhost:3000",
|
|
96
|
-
"model": "claude-sonnet-4-6",
|
|
97
|
-
"profiles": {
|
|
98
|
-
"anon": { "description": "Logged-out session" },
|
|
99
|
-
"subscriber": { "description": "User with active subscription", "env": ["QA_SUB_EMAIL", "QA_SUB_PASSWORD"] },
|
|
100
|
-
"free-no-coins": { "description": "Free user with no coin balance" }
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
```
|
|
71
|
+
Same flow, committed alongside your app — the suite travels with the branch and runs as a PR gate.
|
|
104
72
|
|
|
105
73
|
```bash
|
|
106
|
-
|
|
74
|
+
cd your-project
|
|
75
|
+
npm install --save-dev @pcamarajr/scout
|
|
76
|
+
npx playwright install chromium
|
|
77
|
+
scout init # writes scout.config.json, .scout/, and AI agent files (below)
|
|
107
78
|
```
|
|
108
79
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
## Worktrees and environments
|
|
112
|
-
|
|
113
|
-
Everything is relative to the project directory and the target can be overridden per run — two worktrees run in parallel without colliding:
|
|
80
|
+
- `.scout/specs/*.scout.md` (your scenarios) and `.scout/scripts/` are **committed**; runs and sessions are gitignored.
|
|
81
|
+
- Gate a PR on it: `scout report --check` exits non-zero if any scenario isn't `verified`. → [CI setup](./docs/environments.md)
|
|
114
82
|
|
|
115
|
-
|
|
116
|
-
scout go --base-url http://localhost:3001 # worktree B pointing to its ephemeral server
|
|
117
|
-
SCOUT_BASE_URL=http://localhost:3001 scout go # same, via env
|
|
118
|
-
SCOUT_BASE_URL=https://staging.myapp.com scout go --no-heal # against staging
|
|
119
|
-
```
|
|
83
|
+
## Use it with your AI agent
|
|
120
84
|
|
|
121
|
-
|
|
85
|
+
`scout init` also scaffolds onboarding for coding agents, so the agent that builds a feature can write and verify its test:
|
|
122
86
|
|
|
123
|
-
-
|
|
124
|
-
-
|
|
87
|
+
- **`AGENTS.md`** (repo root) — the canonical guide; the source of truth for how an agent uses Scout.
|
|
88
|
+
- **`.claude/skills/scout/SKILL.md`** + **`.cursor/rules/scout.mdc`** — point your agent at it automatically.
|
|
89
|
+
- **MCP server** (`scout mcp`) — exposes `scout_create_scenario`, `scout_run`, `scout_report`, … so the agent runs the loop end-to-end.
|
|
125
90
|
|
|
126
|
-
|
|
91
|
+
The loop: you describe a flow → the agent writes the `.scout.md` → runs `scout go` → reports the **real** verdict (never claims success without running it) → iterates with you until it's green. Full guide → [`docs/ai-agents.md`](./docs/ai-agents.md).
|
|
127
92
|
|
|
128
|
-
|
|
93
|
+
## Docs
|
|
129
94
|
|
|
130
|
-
|
|
|
95
|
+
| Topic | |
|
|
131
96
|
|---|---|
|
|
132
|
-
|
|
|
133
|
-
|
|
|
134
|
-
|
|
|
135
|
-
|
|
|
136
|
-
|
|
|
137
|
-
|
|
|
138
|
-
|
|
|
139
|
-
|
|
140
|
-
### Preview video (`--record-video`)
|
|
141
|
-
|
|
142
|
-
Opt-in, off by default (zero overhead otherwise). When enabled, a **verified** scenario gets one extra, deterministic replay — recorded, paced for human viewing, and rendered by `ffmpeg` into a GitHub-playable MP4 with the scenario title, per-step captions, and a green/red verdict card burned in. It's meant as a **rich PR artifact**: a reviewer plays it and sees the implemented feature working, no tooling required.
|
|
143
|
-
|
|
144
|
-
- Always sourced from the clean deterministic replay — never the exploratory AI run.
|
|
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.
|
|
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`.
|
|
148
|
-
- Enable per-run with `--record-video`, via `SCOUT_RECORD_VIDEO=1`, or `"recordVideo": true` in the config.
|
|
149
|
-
|
|
150
|
-
## MCP — usage by coding agents (Claude Code, cloud sessions)
|
|
151
|
-
|
|
152
|
-
Scout's main flow is to be called **by the agent that developed the feature**: the agent writes the scenario (in NL — never the script; the script is born from the verified execution) and triggers the verification.
|
|
153
|
-
|
|
154
|
-
```jsonc
|
|
155
|
-
// .mcp.json of the target project
|
|
156
|
-
{
|
|
157
|
-
"mcpServers": {
|
|
158
|
-
"scout": { "command": "npx", "args": ["scout", "mcp"] }
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
Exposed tools: `scout_list_scenarios`, `scout_create_scenario`, `scout_run`, `scout_report`, `scout_get_run_report`.
|
|
164
|
-
|
|
165
|
-
## CI (GitHub Actions)
|
|
166
|
-
|
|
167
|
-
```yaml
|
|
168
|
-
qa-browser:
|
|
169
|
-
runs-on: ubuntu-latest
|
|
170
|
-
steps:
|
|
171
|
-
- uses: actions/checkout@v4
|
|
172
|
-
- uses: actions/setup-node@v4
|
|
173
|
-
with: { node-version: 24 }
|
|
174
|
-
- run: npm ci && npx playwright install --with-deps chromium
|
|
175
|
-
- run: npm run start:test-server & # app running
|
|
176
|
-
- run: npx scout go --no-heal # pure replay, no LLM, exit 1 on failure
|
|
177
|
-
env: { SCOUT_BASE_URL: "http://localhost:3000" }
|
|
178
|
-
- run: npx scout report >> "$GITHUB_STEP_SUMMARY"
|
|
179
|
-
if: always()
|
|
180
|
-
- uses: actions/upload-artifact@v4 # traces + screenshots in the action run
|
|
181
|
-
if: always()
|
|
182
|
-
with: { name: scout-runs, path: .scout/runs/ }
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
With heal in CI: add `ANTHROPIC_API_KEY` and switch to `npx scout go` — when the UI changes legitimately, the job re-records the script and the `.scout/scripts/` diff shows up for commit (e.g. via PR bot).
|
|
186
|
-
|
|
187
|
-
## Full CLI
|
|
188
|
-
|
|
189
|
-
```
|
|
190
|
-
scout init # bootstrap in the project (.scout/specs/ + config)
|
|
191
|
-
scout create <name> -f <feature> -c <scenario> [-p profile] [-n notes]
|
|
192
|
-
scout list # scenarios + status + 📜 if cached script exists
|
|
193
|
-
scout go [-s slug|name] [--ai] [--no-heal] [--headed] [--record-video] [--base-url <url>]
|
|
194
|
-
scout report [--json] [--check] # suite summary (markdown default)
|
|
195
|
-
scout migrate # legacy scenarios.json → .scout.md specs
|
|
196
|
-
scout login <profile> [--base-url <url>] # capture storageState in headed browser
|
|
197
|
-
scout mcp # MCP server stdio
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
### `scout report` — markdown, JSON and gate mode
|
|
201
|
-
|
|
202
|
-
By default `scout report` prints the markdown suite summary (embeddable in a PR body). Two flags make it consumable by scripts and CI gates — they compose freely:
|
|
203
|
-
|
|
204
|
-
```bash
|
|
205
|
-
scout report # markdown summary (default)
|
|
206
|
-
scout report --json # machine-readable JSON (below)
|
|
207
|
-
scout report --check # exit 1 if ANY scenario is not `verified`, exit 0 otherwise
|
|
208
|
-
scout report --json --check # prints the JSON AND sets the exit code
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
`--json` shape:
|
|
212
|
-
|
|
213
|
-
```jsonc
|
|
214
|
-
{
|
|
215
|
-
"scenarios": [
|
|
216
|
-
{ "slug": "paywall/paywall-free", "name": "Paywall free", "feature": "Paywall", "profile": "anon", "status": "verified", "lastRun": "2026-06-10T12:00:00.000Z" }
|
|
217
|
-
],
|
|
218
|
-
"summary": { "total": 4, "verified": 3, "failed": 1, "partial": 0, "blocked": 0, "pending": 0 }
|
|
219
|
-
}
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
`--check` is the PR-gate primitive: no grepping the markdown for emojis/words. A scenario counts as passing only with status `verified` — `failed`, `partial`, `blocked` and `pending` all fail the check. An empty suite passes vacuously (gate scripts that require scenarios should test `summary.total`).
|
|
223
|
-
|
|
224
|
-
```bash
|
|
225
|
-
# typical gate script
|
|
226
|
-
npx scout report --check || { echo "Scout gate: non-verified scenarios"; exit 1; }
|
|
227
|
-
```
|
|
97
|
+
| [Writing scenarios](./docs/scenarios.md) | the `.scout.md` format, slugs, per-scenario overrides |
|
|
98
|
+
| [Providers & credentials](./docs/providers) | Claude, Gemini, OpenAI — detection order + `scout doctor` |
|
|
99
|
+
| [Auth profiles](./docs/auth.md) | logged-in flows, `scout login`, `$ENV:` secrets |
|
|
100
|
+
| [Environments & CI](./docs/environments.md) | base-URL overrides, worktrees, the PR gate |
|
|
101
|
+
| [Run artifacts](./docs/artifacts.md) | traces, screenshots, the preview video |
|
|
102
|
+
| [AI agents & MCP](./docs/ai-agents.md) | the co-author loop, the scaffolded files, MCP tools |
|
|
103
|
+
| [CLI reference](./docs/cli.md) | every command, `scout report --json/--check` |
|
|
104
|
+
| [Architecture](./docs/architecture.md) | how it works inside + design decisions + limitations |
|
|
228
105
|
|
|
229
106
|
## Verdicts
|
|
230
107
|
|
|
231
108
|
| | Meaning |
|
|
232
109
|
|---|---|
|
|
233
110
|
| ✅ `verified` | All expected behavior confirmed by assertions |
|
|
234
|
-
| ❌ `failed` | Broken behavior
|
|
235
|
-
| ⚠️ `partial` |
|
|
111
|
+
| ❌ `failed` | Broken behavior — the reason says what |
|
|
112
|
+
| ⚠️ `partial` | Only part of the expected behavior confirmed |
|
|
236
113
|
| 🚫 `blocked` | Couldn't reach the flow (app down, login broken) |
|
|
237
114
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
An AI run can also die without any verdict — agent ran out of turns, SDK error, dead subprocess. Scout treats that as an **infrastructure failure**, never as a judgment about the app:
|
|
241
|
-
|
|
242
|
-
1. **Forced verdict:** when the agent ends without calling `scout_verdict` (typically `maxTurns` exhausted), Scout resumes the same session with a tiny turn budget and demands a verdict based on what was already observed — a `partial` with context beats a silent death.
|
|
243
|
-
2. **Automatic retry:** if the rescue also fails, the whole AI run is retried once with a fresh browser and agent.
|
|
244
|
-
3. **Honest reporting:** if it still fails, the result is `blocked` with `runnerFailure` set in `result.json` (and flagged in `report.md` and the CLI output: 💥 *runner failure — not a UI judgment*), naming the cause (e.g. "agent exhausted the 40-turn limit") and pointing at the run artifacts. Rerun it instead of debugging the app.
|
|
245
|
-
|
|
246
|
-
Every AI run aborts its Agent SDK query on completion (success or failure), so no `claude` subprocess outlives the run.
|
|
247
|
-
|
|
248
|
-
## Architecture
|
|
249
|
-
|
|
250
|
-
```
|
|
251
|
-
src/
|
|
252
|
-
├── cli.ts # commander CLI
|
|
253
|
-
├── engine.ts # orchestrates: replay → (failed?) → AI heal → re-record
|
|
254
|
-
├── config.ts # scout.config.json + env overrides
|
|
255
|
-
├── specs.ts # .scout.md parser + slug model + scenario writer
|
|
256
|
-
├── store.ts # .scout/ (specs, scripts, runs)
|
|
257
|
-
├── report.ts # per-run markdown + suite summary
|
|
258
|
-
├── runner/
|
|
259
|
-
│ ├── browser.ts # Playwright wrapper: snapshot with refs, trace, screenshots,
|
|
260
|
-
│ │ # ref→locator resolution (getByRole when unique, CSS fallback)
|
|
261
|
-
│ ├── ai-runner.ts # Claude Agent SDK + in-process browser tools; records steps
|
|
262
|
-
│ └── script-runner.ts # deterministic step replay
|
|
263
|
-
└── mcp/server.ts # MCP interface (stdio)
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
Design decisions:
|
|
267
|
-
|
|
268
|
-
- **The agent never writes test code.** It acts in the browser; the script is recorded from actions that actually worked (`getByRole` + accessible name when unique on the page, CSS path as fallback). Eliminates hallucinated selectors.
|
|
269
|
-
- **Assertions are tools.** The agent registers each expectation via `browser_assert` — that's what makes the replay a real test, not just a click macro.
|
|
270
|
-
- **Recorded scripts are pruned before caching.** Agent retries (e.g. re-filling the same field) are deduplicated conservatively: an earlier `fill`/`select` is dropped only when a later one targets the same element and nothing in between (click/press/navigate) could have consumed the value. Clicks are never deduplicated.
|
|
271
|
-
- **Trace for debugging, video for humans.** Playwright's trace.zip is the deep-debug artifact (per-action screenshots, DOM, network, console). The opt-in preview video is a different job: a low-friction, GitHub-playable clip a reviewer watches in the PR to see the feature working — sourced from the clean replay and paced + annotated so it's worth watching, not "video for the sake of video".
|
|
272
|
-
- **Scenarios are versioned source, not database rows.** One `.scout.md` per feature, reviewed in PRs like a `.test.ts`; the spec is a pure input that a run never mutates (status derives from `.scout/runs/`). The recorded JSON script is a derived sidecar — clean diffs, no run noise in history.
|
|
273
|
-
- **No server/dashboard.** State is the filesystem in the target repo; report is markdown. Pluggable into any project with `npm i` + 2 files.
|
|
274
|
-
|
|
275
|
-
## Known POC limitations
|
|
115
|
+
---
|
|
276
116
|
|
|
277
|
-
|
|
278
|
-
- Snapshot covers interactive elements + text; canvas/video are verified indirectly (element presence, surrounding UI state).
|
|
279
|
-
- Flows that depend on reading email are not verifiable — covers UI + redirects.
|
|
280
|
-
- Heal re-records the script locally; committing the updated script is manual (intentional: script diff is reviewable).
|
|
281
|
-
- Fixed mobile viewport (390×844) — multi-viewport is a simple enhancement (per-scenario variant).
|
|
117
|
+
Early but functional, and published on npm. Issues and PRs welcome — see [`docs/architecture.md`](./docs/architecture.md) for internals. MIT licensed.
|
package/dist/cli.js
CHANGED
|
@@ -5,6 +5,8 @@ import readline from "node:readline";
|
|
|
5
5
|
import { Command } from "commander";
|
|
6
6
|
import { chromium } from "playwright";
|
|
7
7
|
import { CONFIG_FILE, SCOUT_DIR, loadConfig } from "./config.js";
|
|
8
|
+
import { detectAiCredentials, inferProvider } from "./credentials.js";
|
|
9
|
+
import { resolveEngineKind } from "./runner/engines/index.js";
|
|
8
10
|
import { runScenario } from "./engine.js";
|
|
9
11
|
import { runInit } from "./init.js";
|
|
10
12
|
import { buildReport, renderSummary, scenarioStatus } from "./report.js";
|
|
@@ -163,7 +165,7 @@ program
|
|
|
163
165
|
});
|
|
164
166
|
program
|
|
165
167
|
.command("login <profile>")
|
|
166
|
-
.description("
|
|
168
|
+
.description("Captures YOUR APP's logged-in session (storageState) via a headed browser. This is your application's auth, NOT AI credentials / model provider auth — for those, run `scout doctor`.")
|
|
167
169
|
.option("--base-url <url>", "Target app URL (precedence: flag > SCOUT_BASE_URL > scout.config.json)")
|
|
168
170
|
.action(async (profileName, opts) => {
|
|
169
171
|
const config = loadConfig(process.cwd(), { baseUrl: opts.baseUrl });
|
|
@@ -189,6 +191,124 @@ program
|
|
|
189
191
|
await browser.close();
|
|
190
192
|
console.log(`✓ Session saved to ${statePath} (gitignored).`);
|
|
191
193
|
});
|
|
194
|
+
/**
|
|
195
|
+
* Cheapest correct proof that an Anthropic credential actually works: a 1-turn
|
|
196
|
+
* agent query with a trivial prompt. It authenticates via the SAME path the
|
|
197
|
+
* real run uses (ANTHROPIC_API_KEY / CLAUDE_CODE_OAUTH_TOKEN / Claude Code
|
|
198
|
+
* session — including the macOS keychain-backed session the file probe can't
|
|
199
|
+
* see), so a green ping here means a real run will authenticate too.
|
|
200
|
+
* Token cost: a one-word system prompt + a one-word reply (a handful of tokens).
|
|
201
|
+
*/
|
|
202
|
+
async function livePingAnthropic(model) {
|
|
203
|
+
try {
|
|
204
|
+
const { query } = await import("@anthropic-ai/claude-agent-sdk");
|
|
205
|
+
const controller = new AbortController();
|
|
206
|
+
let ended;
|
|
207
|
+
try {
|
|
208
|
+
for await (const message of query({
|
|
209
|
+
prompt: "Reply with the single word: ok",
|
|
210
|
+
options: {
|
|
211
|
+
model,
|
|
212
|
+
systemPrompt: "You are a connectivity probe. Reply with exactly one word.",
|
|
213
|
+
mcpServers: {},
|
|
214
|
+
allowedTools: [],
|
|
215
|
+
tools: [],
|
|
216
|
+
settingSources: [],
|
|
217
|
+
permissionMode: "bypassPermissions",
|
|
218
|
+
maxTurns: 1,
|
|
219
|
+
abortController: controller,
|
|
220
|
+
},
|
|
221
|
+
})) {
|
|
222
|
+
if (message.type === "result") {
|
|
223
|
+
ended = {
|
|
224
|
+
subtype: message.subtype,
|
|
225
|
+
errors: "errors" in message ? message.errors : undefined,
|
|
226
|
+
};
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
finally {
|
|
232
|
+
controller.abort();
|
|
233
|
+
}
|
|
234
|
+
if (ended && ended.subtype !== "success" && ended.errors?.length) {
|
|
235
|
+
return { ok: false, error: ended.errors.join("; ") };
|
|
236
|
+
}
|
|
237
|
+
return { ok: true };
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
return { ok: false, error: error instanceof Error ? error.message : String(error) };
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Provider-aware live ping for the AI SDK engine (google/openai). Resolves the
|
|
245
|
+
* same provider model the engine would use and runs a 1-step `generateText`
|
|
246
|
+
* asking for the single word "ok". Token cost: a one-word system prompt + a
|
|
247
|
+
* one-word reply (a handful of tokens). Any thrown error (bad/absent key, wrong
|
|
248
|
+
* project, network) is surfaced as the failure reason.
|
|
249
|
+
*/
|
|
250
|
+
async function livePingAiSdk(provider, model) {
|
|
251
|
+
try {
|
|
252
|
+
const { generateText } = await import("ai");
|
|
253
|
+
const { resolveModel } = await import("./runner/engines/ai-sdk.js");
|
|
254
|
+
await generateText({
|
|
255
|
+
model: resolveModel(provider, model),
|
|
256
|
+
system: "You are a connectivity probe. Reply with exactly one word.",
|
|
257
|
+
prompt: "Reply with the single word: ok",
|
|
258
|
+
maxOutputTokens: 8,
|
|
259
|
+
});
|
|
260
|
+
return { ok: true };
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
return { ok: false, error: error instanceof Error ? error.message : String(error) };
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
program
|
|
267
|
+
.command("doctor")
|
|
268
|
+
.description("Diagnoses AI credentials (model provider auth) for the configured model — CI-usable exit code")
|
|
269
|
+
.action(async () => {
|
|
270
|
+
const config = loadConfig();
|
|
271
|
+
const provider = inferProvider(config.model);
|
|
272
|
+
const engine = resolveEngineKind(provider, config.engine);
|
|
273
|
+
const status = detectAiCredentials(provider, { engine });
|
|
274
|
+
console.log(`Model: ${config.model}`);
|
|
275
|
+
console.log(`Provider: ${provider}`);
|
|
276
|
+
console.log(`Engine: ${engine}`);
|
|
277
|
+
if (status.ok) {
|
|
278
|
+
console.log(`Detection: ✓ matched ${status.source}`);
|
|
279
|
+
}
|
|
280
|
+
else if (provider === "anthropic") {
|
|
281
|
+
// The file/env probe missed — but a macOS keychain-backed Claude Code
|
|
282
|
+
// session is invisible to it, yet the SDK can still authenticate. Don't
|
|
283
|
+
// give up here; let the live ping be the authority for Anthropic.
|
|
284
|
+
console.log("Detection: ✗ no credential file or env var found (a macOS keychain session would not show here).");
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
// google/openai have no invisible-credential path: if detection failed,
|
|
288
|
+
// there is nothing to ping. Report remediation and stop.
|
|
289
|
+
console.log(`Detection: ✗ no usable ${provider} credentials found.`);
|
|
290
|
+
console.log(`\n${status.remediation}`);
|
|
291
|
+
process.exit(1);
|
|
292
|
+
}
|
|
293
|
+
process.stdout.write("Live check: pinging the model... ");
|
|
294
|
+
const ping = provider === "anthropic"
|
|
295
|
+
? await livePingAnthropic(config.model)
|
|
296
|
+
: await livePingAiSdk(provider, config.model);
|
|
297
|
+
if (ping.ok) {
|
|
298
|
+
console.log("✓ credentials valid");
|
|
299
|
+
process.exit(0);
|
|
300
|
+
}
|
|
301
|
+
console.log("✗");
|
|
302
|
+
console.log(`The live check failed: ${ping.error ?? "unknown error"}`);
|
|
303
|
+
// When detection passed, the credentials are present but the live key was
|
|
304
|
+
// rejected (invalid/expired key, wrong project, no quota) — the ping error
|
|
305
|
+
// above is the actionable message. Only fall back to detection remediation
|
|
306
|
+
// when detection itself had something to say.
|
|
307
|
+
const remediation = status.remediation ?? detectAiCredentials(provider, { engine }).remediation;
|
|
308
|
+
if (remediation)
|
|
309
|
+
console.log(`\n${remediation}`);
|
|
310
|
+
process.exit(1);
|
|
311
|
+
});
|
|
192
312
|
program
|
|
193
313
|
.command("mcp")
|
|
194
314
|
.description("Starts the MCP server (stdio) — for Claude Code and cloud coding sessions")
|
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,mBAAmB,EAAE,aAAa,EAAmB,MAAM,kBAAkB,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,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,CACV,uLAAuL,CACxL;KACA,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;;;;;;;GAOG;AACH,KAAK,UAAU,iBAAiB,CAAC,KAAa;IAC5C,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QACjE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,KAAyD,CAAC;QAC9D,IAAI,CAAC;YACH,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,KAAK,CAAC;gBAChC,MAAM,EAAE,gCAAgC;gBACxC,OAAO,EAAE;oBACP,KAAK;oBACL,YAAY,EAAE,4DAA4D;oBAC1E,UAAU,EAAE,EAAE;oBACd,YAAY,EAAE,EAAQ;oBACtB,KAAK,EAAE,EAAQ;oBACf,cAAc,EAAE,EAAQ;oBACxB,cAAc,EAAE,mBAA4B;oBAC5C,QAAQ,EAAE,CAAC;oBACX,eAAe,EAAE,UAAU;iBAC5B;aACF,CAAC,EAAE,CAAC;gBACH,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC9B,KAAK,GAAG;wBACN,OAAO,EAAE,OAAO,CAAC,OAAO;wBACxB,MAAM,EAAE,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;qBACzD,CAAC;oBACF,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QACD,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YACjE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IACtF,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,aAAa,CAC1B,QAAoB,EACpB,KAAa;IAEb,IAAI,CAAC;QACH,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;QACpE,MAAM,YAAY,CAAC;YACjB,KAAK,EAAE,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC;YACpC,MAAM,EAAE,4DAA4D;YACpE,MAAM,EAAE,gCAAgC;YACxC,eAAe,EAAE,CAAC;SACnB,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IACtF,CAAC;AACH,CAAC;AAED,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,+FAA+F,CAAC;KAC5G,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAEzD,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC;IAEnC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACvD,CAAC;SAAM,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,sEAAsE;QACtE,wEAAwE;QACxE,kEAAkE;QAClE,OAAO,CAAC,GAAG,CAAC,kGAAkG,CAAC,CAAC;IAClH,CAAC;SAAM,CAAC;QACN,wEAAwE;QACxE,yDAAyD;QACzD,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,qBAAqB,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC1D,MAAM,IAAI,GACR,QAAQ,KAAK,WAAW;QACtB,CAAC,CAAC,MAAM,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC;QACvC,CAAC,CAAC,MAAM,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;IACvE,0EAA0E;IAC1E,2EAA2E;IAC3E,2EAA2E;IAC3E,8CAA8C;IAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,mBAAmB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,WAAW,CAAC;IAChG,IAAI,WAAW;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,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/config.d.ts
CHANGED
|
@@ -27,6 +27,13 @@ export interface ScoutConfig {
|
|
|
27
27
|
recordVideo?: boolean;
|
|
28
28
|
/** Preview pacing in (0,1]; <1 = slower so a human can follow. Default 0.4. */
|
|
29
29
|
videoSpeed?: number;
|
|
30
|
+
/**
|
|
31
|
+
* Agent engine for AI runs. `agent-sdk` (default) uses the trusted
|
|
32
|
+
* @anthropic-ai/claude-agent-sdk; `ai-sdk` uses the Vercel AI SDK. Override
|
|
33
|
+
* with SCOUT_ENGINE. Unset = provider-aware default (agent-sdk for Anthropic,
|
|
34
|
+
* ai-sdk for other providers).
|
|
35
|
+
*/
|
|
36
|
+
engine?: "agent-sdk" | "ai-sdk";
|
|
30
37
|
profiles: Record<string, ScoutProfile>;
|
|
31
38
|
}
|
|
32
39
|
export declare const CONFIG_FILE = "scout.config.json";
|
package/dist/config.js
CHANGED
|
@@ -28,6 +28,9 @@ export function loadConfig(cwd = process.cwd(), overrides = {}) {
|
|
|
28
28
|
merged.headless = false;
|
|
29
29
|
if (process.env.SCOUT_RECORD_VIDEO === "1")
|
|
30
30
|
merged.recordVideo = true;
|
|
31
|
+
if (process.env.SCOUT_ENGINE === "agent-sdk" || process.env.SCOUT_ENGINE === "ai-sdk") {
|
|
32
|
+
merged.engine = process.env.SCOUT_ENGINE;
|
|
33
|
+
}
|
|
31
34
|
if (overrides.baseUrl)
|
|
32
35
|
merged.baseUrl = overrides.baseUrl;
|
|
33
36
|
if (overrides.recordVideo)
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|