saffron-ai 0.9.8 → 0.9.9
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/CHANGELOG.md +62 -0
- package/README.md +2 -2
- package/dist-pkg/cli.js +234 -214
- package/package.json +1 -1
- package/skills/saffron/SKILL.md +11 -1
- package/skills/saffron/references/config.md +6 -4
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,68 @@ the VS Code extension (`ChathurangaJayasinghe.saffron-vscode`) and the
|
|
|
5
5
|
JetBrains plugin (`ai.saffron.jetbrains`). Dates are publish dates. Each
|
|
6
6
|
release heading names its main feature: `## <version>: <title>`.
|
|
7
7
|
|
|
8
|
+
## 0.9.9: A browser matrix in one run
|
|
9
|
+
|
|
10
|
+
Released 2026-10-06.
|
|
11
|
+
|
|
12
|
+
Runner
|
|
13
|
+
|
|
14
|
+
- **A browser matrix in one run.** `saffron run --browser
|
|
15
|
+
chromium,firefox,webkit` (or a list in `browser`) runs the suite in each
|
|
16
|
+
browser, one after another, into one report: a row per scenario per
|
|
17
|
+
browser, in the terminal, the report, the history and the dashboard.
|
|
18
|
+
Chromium-family browsers go first, so Firefox and WebKit replay what
|
|
19
|
+
they recorded. Every browser starts before anything runs. Screenshots
|
|
20
|
+
and traces are kept per browser, and `saffron trace` names them
|
|
21
|
+
`feature:scenario@browser`. The dashboard stands a scenario at its
|
|
22
|
+
worst browser and never calls a difference between browsers flaky.
|
|
23
|
+
Refused with `--shard`. Every result now names its browser, so running
|
|
24
|
+
one browser again replaces that browser's rows and keeps the others'.
|
|
25
|
+
`saffron status --json` (and the MCP `project_status` tool) names the
|
|
26
|
+
browser of each row that needs attention.
|
|
27
|
+
- **Device and viewport profiles.** `--device "iPhone 15"` (config
|
|
28
|
+
`device`) runs every scenario under a Playwright device profile,
|
|
29
|
+
recordings and heals included; `--viewport 1280x720` (config `viewport`)
|
|
30
|
+
sets the size alone. An unknown device names the closest ones, and a
|
|
31
|
+
mobile profile in Firefox stops the run up front.
|
|
32
|
+
- **Parallel recording and healing.** `--agent-workers N` (config
|
|
33
|
+
`agentWorkers`, default 1) lets up to N agent sessions run at once,
|
|
34
|
+
each in a browser of its own. An outline's rows stay together on one
|
|
35
|
+
worker. Each session is paid for: raise it deliberately.
|
|
36
|
+
- **Shards know their browser.** A shard records the browser it ran in;
|
|
37
|
+
`saffron report --merge` refuses shards of different browsers, a
|
|
38
|
+
re-run attempt replaces only its own browser's shard, and each
|
|
39
|
+
browser's merge keeps its own history line.
|
|
40
|
+
- **A bad storage state stops the run first.** A `storageState` file that
|
|
41
|
+
is missing, unreadable or not JSON now stops the run at startup, exit 2,
|
|
42
|
+
before `--rerecord` deletes any recording.
|
|
43
|
+
- **No second replay without an agent.** With `--workers` and
|
|
44
|
+
`--no-agent`, or in Firefox and WebKit, a scenario that went red in the
|
|
45
|
+
parallel phase is no longer run again afterwards: nothing could change
|
|
46
|
+
its result.
|
|
47
|
+
- **Per-worker timing.** The report has a timing panel (each worker's
|
|
48
|
+
runs, busy time and share, and the five slowest scenarios), and the
|
|
49
|
+
terminal prints each worker's share and the three slowest scenarios.
|
|
50
|
+
Merged shards list each machine's workers.
|
|
51
|
+
- **Saffron's own data in the replay.** Each step shows the tabs it
|
|
52
|
+
opened or switched to and the response each network check matched,
|
|
53
|
+
and the Saffron pane shows what the agent cost for the scenario. The
|
|
54
|
+
report's steps carry `tabs` and `responses` for tools.
|
|
55
|
+
- **Browsers in the editors' contracts.** `saffron status --json` and
|
|
56
|
+
`saffron report --run <id> --json` give each row its `browser`, and the
|
|
57
|
+
run's `browsers` when its rows span several.
|
|
58
|
+
|
|
59
|
+
VS Code extension 0.6.2
|
|
60
|
+
|
|
61
|
+
- After a browser-matrix run, Last Run and a CI run's results label each
|
|
62
|
+
row with its browser, and Open Replay and Open Trace open that
|
|
63
|
+
browser's execution alone (`feature:scenario@browser`).
|
|
64
|
+
|
|
65
|
+
JetBrains plugin 0.6.2
|
|
66
|
+
|
|
67
|
+
- The same in the Last Run and CI Runs tabs: rows say their browser, and
|
|
68
|
+
the replay opens that browser's execution alone.
|
|
69
|
+
|
|
8
70
|
## 0.9.8: Run one scenario, from the editor too
|
|
9
71
|
|
|
10
72
|
Released 2026-10-06.
|
package/README.md
CHANGED
|
@@ -73,7 +73,7 @@ node dist/cli/index.js -p examples accept --all
|
|
|
73
73
|
|
|
74
74
|
| Command | What it does |
|
|
75
75
|
|---|---|
|
|
76
|
-
| `saffron run [paths] [--headed] [--filter expr] [--rerecord] [--no-agent] [--strict] [--browser b] [--no-hooks] [--workers n] [--heal-model m] [--no-verify] [--no-reuse] [--model m] [--storage-state f] [--trace mode]` | Run features. Cached replays are deterministic; misses/failures escalate to the agent (unless `--no-agent`). A path with a line or a name, `features/login.saffron:12` or `"features/login.saffron:Successful login"`, runs that one scenario. Replay cross-browser with `--browser firefox\|webkit`, parallelize with `--workers N`, heal on a cheaper model with `--heal-model`, keep an execution trace with `--trace retain-on-failure`. Exit 1 on red (and on yellow with `--strict`). |
|
|
76
|
+
| `saffron run [paths] [--headed] [--filter expr] [--rerecord] [--no-agent] [--strict] [--browser b[,b...]] [--device name] [--viewport WxH] [--no-hooks] [--workers n] [--agent-workers n] [--heal-model m] [--no-verify] [--no-reuse] [--model m] [--storage-state f] [--trace mode]` | Run features. Cached replays are deterministic; misses/failures escalate to the agent (unless `--no-agent`). A path with a line or a name, `features/login.saffron:12` or `"features/login.saffron:Successful login"`, runs that one scenario. Replay cross-browser with `--browser firefox\|webkit`, parallelize with `--workers N`, heal on a cheaper model with `--heal-model`, keep an execution trace with `--trace retain-on-failure`. Exit 1 on red (and on yellow with `--strict`). |
|
|
77
77
|
| `saffron accept [files... \| --all] [--include-unverified] [--include-imported] [--with-feature-edit] [--propagate]` | Promote cache proposals to committed caches (`--all` skips UNVERIFIED ones unless `--include-unverified`, and ones imported from a CI run unless `--include-imported`); `--with-feature-edit` also rewrites the adapted steps in the `.feature` file (and keeps the cache in sync); `--propagate` applies the heal's locator fixes to every other cache using the same locator. One heal repairs N scenarios before they ever fail. No args: list pending proposals. |
|
|
78
78
|
| `saffron reject [files... \| --all]` | Discard proposals; the agent will try again next run. |
|
|
79
79
|
| `saffron export [-o file] [--branch name]` / `saffron runs` / `saffron import <bundles...> \| --run <id>` | Carry a CI heal to your machine: export packs the run's proposals, report, screenshots and traces into one bundle for CI to upload; `runs` lists the branch's CI runs (GitHub Actions or Azure Pipelines); import (of a file, or of a run with `--run`) checks the bundle against your checkout (repository, each proposal's binding) and files it there, ready for `saffron diff` and `saffron accept`. `--branch` also has CI commit the proposals to a new branch and open a draft pull request with their diffs. |
|
|
@@ -155,7 +155,7 @@ milestones, statuses and decision gates, and everything shipped so far in
|
|
|
155
155
|
its "Where we are" table.
|
|
156
156
|
Headlines ahead: API testing (reusable REST operations, fixtures and schema
|
|
157
157
|
validation), scenarios with two users in two browsers, a configurable
|
|
158
|
-
features folder,
|
|
158
|
+
features folder, failure video,
|
|
159
159
|
agent-blind secrets, LLM-less MCP replay, the Level-2 shared step library
|
|
160
160
|
(gated on Level-1 divergence data), and the long-term open-core SaaS layer.
|
|
161
161
|
|