saffron-ai 0.9.2 → 0.9.4

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 CHANGED
@@ -2,9 +2,199 @@
2
2
 
3
3
  All notable changes to Saffron, in one place: the `saffron-ai` runner (npm),
4
4
  the VS Code extension (`ChathurangaJayasinghe.saffron-vscode`) and the
5
- JetBrains plugin (`ai.saffron.jetbrains`). Dates are publish dates.
5
+ JetBrains plugin (`ai.saffron.jetbrains`). Dates are publish dates. Each
6
+ release heading names its main feature: `## <version>: <title>`.
6
7
 
7
- ## 0.9.2
8
+ ## 0.9.4: The suite's quality at a glance
9
+
10
+ Released 2026-10-04.
11
+
12
+ Runner
13
+
14
+ - **The agent skill knows the new features.** It shows tag expressions
15
+ in `--filter`, `saffron trace`, and a CI job that exports its heals as
16
+ a bundle (or a draft pull request) for `saffron runs` and `saffron
17
+ import --run`. The AGENTS.md / CLAUDE.md block `saffron init` writes
18
+ says how a CI heal arrives, and the `project_status` MCP tool says
19
+ which run an imported proposal came from. Run `npx saffron init` again
20
+ to update a project's copy.
21
+ - **`saffron dashboard`: the suite's quality at a glance.** A page in
22
+ the run report's design, read from `.saffron/history.jsonl`: tests,
23
+ the share passing (each scenario's latest result), failing scenarios
24
+ and for how many runs in a row, flaky ones (passed and failed by turns
25
+ over the last 20 runs), ones the agent healed again and again, never
26
+ run and left out of the last run, the slowest, pass rate and execution
27
+ time per run, and results per tag. It writes
28
+ `.saffron/reports/dashboard.html` and opens it; `--stdout` prints the
29
+ page for the IDE panels. The same numbers are in `saffron status
30
+ --json` as `quality`.
31
+
32
+ VS Code extension 0.5.0
33
+
34
+ - **The dashboard is the suite's quality page**, the one `saffron
35
+ dashboard` renders, instead of the run report. Click a scenario's
36
+ name to open it. Needs saffron-ai 0.9.4 or later.
37
+ - **Last run: Open Replay and Open Report in the title bar.** Open
38
+ Replay opens every scenario the run traced, so it works when
39
+ everything passed and no row is listed; Open Report opens the HTML
40
+ report in the browser.
41
+
42
+ JetBrains plugin 0.5.0
43
+
44
+ - **The Dashboard is the suite's quality page**, the same one as in VS
45
+ Code, instead of the embedded run report. Click a scenario's name to
46
+ open it. Needs saffron-ai 0.9.4 or later.
47
+ - **Last Run: Open Report** opens the run's HTML report in the browser.
48
+ - **Last Run: Open Replay works when everything passed.** With no row to
49
+ select it did nothing; it now opens every scenario the run traced, or
50
+ says how to keep traces when the run kept none.
51
+
52
+ ## 0.9.3: Review CI heals on your machine
53
+
54
+ Released 2026-10-04.
55
+
56
+ Runner
57
+
58
+ - **A heal made in CI can be reviewed and accepted on your machine.**
59
+ `saffron export` packs the pending proposals, the run's report and the
60
+ screenshots and traces it names into one zip, with where the run
61
+ happened (repository, branch, commit, CI run, shard); CI uploads it as
62
+ an artifact. `saffron import` checks it against your checkout and files
63
+ it where a local run would have, so `saffron diff`, `saffron accept`,
64
+ `saffron trace`, the report and both IDE panels work on it unchanged. A
65
+ bundle from another repository (by its path; the same path under
66
+ another host name, such as an SSH host alias, imports with a warning),
67
+ one that does not say its repository (unless
68
+ `--allow-unknown-repository`), of a newer format, with a damaged file or
69
+ a report it cannot show, or with a file over 1 GB (or over 100 times
70
+ its size unzipped) is refused whole, before anything is written, and so
71
+ are bundles that add up to over 8 GB unzipped together; a proposal made
72
+ against a different scenario text or committed recording is refused by
73
+ name, and the rest import. Bundles are read from disk one file at a
74
+ time, a URL's downloaded to disk first, so every shard of a large run
75
+ imports at once. Text from a bundle, in errors and reasons too, is
76
+ printed without control characters. Export keeps to the same limits:
77
+ it refuses a file over 1 GB and, when a bundle would be over 4 GB,
78
+ leaves the traces of green scenarios out first and says so. Shard
79
+ bundles merge into one report. The imported report says where it came
80
+ from and links to the CI run. Examples for GitHub Actions and Azure
81
+ Pipelines are in the guide (§19).
82
+ - **Or CI opens a draft pull request with the heals.**
83
+ `saffron export --branch <name>` commits the proposal files, not the
84
+ recordings, onto the commit the run tested (on a pull request build, the
85
+ head of its branch, where each proposal's binding is checked again and
86
+ one that does not fit is left out, judged by that commit's own StepSets
87
+ and data) as a new branch, pushes it and, on GitHub, opens a
88
+ draft pull request through `gh` whose description is each proposal's
89
+ verification and diff, with the commands to accept, and a staging line
90
+ that stages exactly what accept changed (`git add -A .saffron/cache &&
91
+ git add -u .saffron/proposals`). After a tag build, which tested no
92
+ branch, name the pull request's branch with `--base`. Only the
93
+ checkout's HEAD, a commit it merged in or one it descends from is ever
94
+ built on; a `pull_request_target` build records the base branch and the
95
+ commit it checked out, never the fork's. The reviewer
96
+ switches to the branch, runs `saffron accept`, commits and marks it
97
+ ready: no agent session on their machine. The CI checkout is left as it
98
+ was, and an existing branch is never pushed onto.
99
+ - **`saffron status --json` says which CI run a proposal was imported
100
+ from** (`importedFrom`: repository, branch, commit, run and its link,
101
+ shard), for as long as it is the proposal that was imported, so the
102
+ editors can show it past the next local run.
103
+ - **`saffron runs` and `saffron import --run <id>`, for GitHub Actions and
104
+ Azure Pipelines alike.** `runs` lists the branch's CI runs (through `gh`,
105
+ or `az` with its azure-devops extension), with how many of each run's
106
+ proposals are pending here; `import --run` downloads a run's bundles and
107
+ imports them. The repository's host picks the service; a `ci` key in the
108
+ config sets it, and the Azure DevOps organization and project, for a
109
+ GitHub repository built by Azure Pipelines. An Azure pull request build
110
+ is listed under the branch it validates, and only the repository's own
111
+ builds are listed. Bundles of a re-run take each shard from its latest
112
+ attempt. `import --run` downloads into a folder under `.saffron/reports`
113
+ and removes it when done. A download that takes over 10 minutes is
114
+ stopped and says so. A tag build is listed under its tag on both
115
+ services. An Azure DevOps SSH remote through a host alias counts as
116
+ Azure. With `--json`, every `import` failure, an invalid config
117
+ included, is `{"error": ...}` and exit 2. A `runs --json` whose `gh` or
118
+ `az` is missing, signed out or failing answers `{provider, branch,
119
+ runs: [], problem: {kind, message}, error}`, `error` holding the same
120
+ message, so a client reading either field works; any other failure is
121
+ `{"error": ...}` alone; both exit 2. On Azure Pipelines the pull
122
+ request builds are asked for once (`--top 500`), so a listing usually takes
123
+ three `az` calls, not seven.
124
+ `export --branch` opens the draft pull request on Azure DevOps too,
125
+ through `az repos pr create`.
126
+ - **Export streams the bundle to disk.** Screenshots and traces are
127
+ copied into the zip in chunks, never all held in memory, and the zip
128
+ is renamed into place only when complete; a file that changes while it
129
+ is packed is refused.
130
+ - **Failures are one line.** `export` exits 2 for every failure that
131
+ pushed nothing (an `--out` that is a folder, an invalid config with
132
+ `--branch`), keeping exit 1 for a branch pushed without its pull
133
+ request. Any command's expected failure prints `saffron: <message>`
134
+ and exits 2, never a stack; `SAFFRON_DEBUG=1` shows it.
135
+ - **Safe branch names in the pull request.** The description quotes the
136
+ branch in its commands, and `--branch` or `--base` with a space, a
137
+ quote or any of `` $ ` ; | & < > ( ) \ `` is refused up front.
138
+ - **A `pull_request_review` build records its pull request's branch**,
139
+ read from the event, not `12/merge`.
140
+ - **`import --json` passes on only the manifest fields it knows**, cleaned
141
+ of control characters.
142
+ - **The pull request's review steps run saffron-ai by name**
143
+ (`npx -y -p saffron-ai saffron diff`): in a checkout without
144
+ `node_modules`, a bare `npx saffron` would fetch the unrelated `saffron`
145
+ package.
146
+ - **A bundle names its run as the CI service does** (`github:<run id>`,
147
+ `azure:<build id>`), even with `SAFFRON_RUN_ID` set, so `saffron runs`
148
+ and both editors count its proposals under the right run.
149
+ - **A green scenario's trace over 1 GB is left out of the bundle** like
150
+ the other green traces, instead of failing the export.
151
+ - **Import hashes, compares and copies traces in chunks**: a 1 GB trace is
152
+ never held in memory. A bundle that changes on disk while it is
153
+ imported no longer says "nothing was imported" after some files were
154
+ written.
155
+ - **`saffron runs` on Azure asks for 50 pull request builds first**, and
156
+ for more only while too few are the branch's, not 500 on every list.
157
+
158
+ VS Code extension 0.4.0
159
+
160
+ - **CI runs**: a new view lists the current branch's CI runs, GitHub
161
+ Actions or Azure Pipelines, through `saffron runs`. **Import** runs
162
+ `saffron import --run`, then lists under the run what happened to each
163
+ proposal and any warning (a checkout at another commit, a scenario that
164
+ changed since). Imported proposals are marked with the run they came
165
+ from, linked in the tooltip. From a red CI run to an accepted repair
166
+ without leaving the editor; commit and push with the Source Control
167
+ view. The CI's own tool keeps the credentials.
168
+ - **Text from CI cannot act in a tooltip.** Run titles, branch names and
169
+ a bundle's notes are escaped so they never form links, headings or
170
+ other markup; a run links out only to GitHub or Azure DevOps, and never
171
+ when the address carries a user name. Import results are kept per
172
+ project. An import can be cancelled, and on Windows cancelling stops
173
+ the whole process tree. The list follows a branch switch, and makes no
174
+ CI call while its view is hidden.
175
+ - **Cancelling an import stops all of it, and says what it left.** On
176
+ Windows the whole process tree is stopped however the CLI was started;
177
+ on macOS and Linux a process that outlives SIGTERM gets SIGKILL. The
178
+ message says a cancelled import may have written part of the run.
179
+
180
+ JetBrains plugin 0.4.0
181
+
182
+ - **CI Runs tab**: the same runs and the same Import, through the same
183
+ two commands, with each proposal's outcome under its run. The Proposals
184
+ tab names the CI run an imported proposal came from.
185
+ - **Text from CI is shown as plain text**, in CI Runs and in Last Run
186
+ after an import, never as markup. Import is a background task you can
187
+ cancel, with no time limit; a run is imported once even if you switch
188
+ projects meanwhile; Refresh never starts a second list. The tab loads
189
+ as soon as the project is trusted, and its processes stop when the
190
+ project closes.
191
+ - **Choosing another project clears the tabs at once**: a run listed for
192
+ the last project can no longer be imported into the new one, and a
193
+ status that arrives late for the last project is dropped.
194
+ - **CI Runs lists again when you check out another branch.** A cancelled
195
+ import says it may have written part of the run.
196
+
197
+ ## 0.9.2: Bring your own AI agent
8
198
 
9
199
  Released 2026-09-30.
10
200
 
@@ -256,7 +446,7 @@ Editors (VS Code extension 0.3.3, JetBrains plugin 0.3.3)
256
446
  CSV; Run Tagged skips tags `--filter` cannot express and says which;
257
447
  diagnostics clear when a file closes or is deleted.
258
448
 
259
- ## 0.9.1
449
+ ## 0.9.1: Tag expressions: and, or, not
260
450
 
261
451
  Released 2026-09-29.
262
452
 
@@ -320,7 +510,7 @@ Editors (VS Code extension 0.3.2, JetBrains plugin 0.3.2)
320
510
  tabs, under any file icon theme that has no icon of its own for them
321
511
  (Seti, the default, included).
322
512
 
323
- ## 0.9.0
513
+ ## 0.9.0: Time-travel replay
324
514
 
325
515
  Released 2026-09-27.
326
516
 
@@ -515,7 +705,7 @@ Editors (VS Code extension 0.3.0, JetBrains plugin 0.3.0)
515
705
  what is pending when it runs, skipping UNVERIFIED proposals and
516
706
  refusing STALE ones.
517
707
 
518
- ## 0.8.5
708
+ ## 0.8.5: Proposals bound to what you reviewed
519
709
 
520
710
  Released 2026-09-24.
521
711
 
@@ -554,7 +744,7 @@ Editors (VS Code extension 0.2.10, JetBrains plugin 0.2.5)
554
744
  - Both Proposals panels mark a stale proposal STALE, with the reason and
555
745
  what to do, and note a proposal filed by an older runner.
556
746
 
557
- ## 0.8.4
747
+ ## 0.8.4: Heal and replay fixes
558
748
 
559
749
  Released 2026-09-24.
560
750
 
@@ -667,7 +857,7 @@ Editors (VS Code extension 0.2.9)
667
857
  files and to the config now refresh every open feature file, including a
668
858
  custom data folder and environment overlays.
669
859
 
670
- ## 0.8.3
860
+ ## 0.8.3: Data references in table cells
671
861
 
672
862
  Released 2026-09-22.
673
863
 
@@ -683,7 +873,7 @@ Runner
683
873
  Code currently defaults to, which drifts) and which values it takes, so a
684
874
  project can pin its recording model.
685
875
 
686
- ## 0.8.2
876
+ ## 0.8.2: Split a suite across CI machines
687
877
 
688
878
  Released 2026-09-22.
689
879
 
@@ -706,7 +896,7 @@ Runner
706
896
  twice does not count the run twice. Setup and teardown run on each shard
707
897
  and receive `SAFFRON_SHARD`. The docs have a GitHub Actions example.
708
898
 
709
- ## 0.8.1
899
+ ## 0.8.1: Chrome, Edge, and setup and teardown
710
900
 
711
901
  Released 2026-09-22.
712
902
 
@@ -769,7 +959,7 @@ Editors (VS Code extension 0.2.8)
769
959
  hover and go-to-definition now follow the runner: the environment's CSV
770
960
  replaces the base one, and the hover names the file it read.
771
961
 
772
- ## 0.8.0
962
+ ## 0.8.0: Test data outside the feature file
773
963
 
774
964
  Released 2026-09-21.
775
965
 
@@ -835,7 +1025,7 @@ Editors (VS Code extension 0.2.7, JetBrains plugin 0.2.4)
835
1025
  - Both Orphans lists show the screenshot folders of scenarios that no longer
836
1026
  exist, so "Remove All" never deletes something it did not show.
837
1027
 
838
- ## 0.7.2
1028
+ ## 0.7.2: Failure screenshots
839
1029
 
840
1030
  Released 2026-09-21.
841
1031
 
@@ -890,7 +1080,7 @@ Editors (JetBrains plugin 0.2.2)
890
1080
  notification says so when it is missing. The presence check uses no
891
1081
  plugin-manager API, so it stays clean as that API turns internal.
892
1082
 
893
- ## 0.7.1
1083
+ ## 0.7.1: Truthful checks and safer edits
894
1084
 
895
1085
  Released 2026-09-20.
896
1086
 
@@ -961,7 +1151,7 @@ Editors (VS Code extension 0.2.5)
961
1151
  passes the tree item, not the file path the row click passes; both forms
962
1152
  are accepted, and the project guard applies to both.
963
1153
 
964
- ## 0.7.0
1154
+ ## 0.7.0: saffron diff, saffron prune, and an external review
965
1155
 
966
1156
  Released 2026-09-19.
967
1157
 
@@ -1154,7 +1344,7 @@ Editors (JetBrains plugin 0.2.2, VS Code extension 0.2.4)
1154
1344
  longer shell syntax, and a file from a second workspace folder runs
1155
1345
  against that folder's config and install.
1156
1346
 
1157
- ## 0.6.0
1347
+ ## 0.6.0: Multi-tab scenarios
1158
1348
 
1159
1349
  Released 2026-09-18.
1160
1350
 
@@ -1176,7 +1366,7 @@ Editors
1176
1366
  its short description fits without being cut off, and the overview
1177
1367
  introduces the tool and how to get started before listing features.
1178
1368
 
1179
- ## 0.5.7
1369
+ ## 0.5.7: Claude Code plugin
1180
1370
 
1181
1371
  Released 2026-09-17.
1182
1372
 
@@ -1200,7 +1390,7 @@ Agents
1200
1390
  points at `saffron status`. Run `npx saffron init` again to refresh both
1201
1391
  in a project.
1202
1392
 
1203
- ## 0.5.6
1393
+ ## 0.5.6: Fewer false duplicate wordings
1204
1394
 
1205
1395
  Released 2026-09-17.
1206
1396
 
@@ -1211,7 +1401,7 @@ Runner
1211
1401
  duplicate wordings; steps are compared by their quote-generalised
1212
1402
  pattern.
1213
1403
 
1214
- ## 0.5.5
1404
+ ## 0.5.5: Duplicate wordings proven by behaviour
1215
1405
 
1216
1406
  Released 2026-09-17.
1217
1407
 
@@ -1223,7 +1413,7 @@ Runner
1223
1413
  "enter X in the username field" against "enter Y in the password
1224
1414
  field", which are different steps.
1225
1415
 
1226
- ## 0.5.4
1416
+ ## 0.5.4: saffron status for the IDE panels
1227
1417
 
1228
1418
  Released 2026-09-17.
1229
1419
 
@@ -1243,7 +1433,7 @@ Editors
1243
1433
  Health sections and an in-editor dashboard. All read
1244
1434
  `saffron status --json`.
1245
1435
 
1246
- ## 0.5.3
1436
+ ## 0.5.3: Cost by how you pay, and running from JetBrains
1247
1437
 
1248
1438
  Released 2026-09-17.
1249
1439
 
@@ -1284,7 +1474,7 @@ Editors
1284
1474
  extension, the last run's totals with the report one click away, and
1285
1475
  the proposals pending review with Accept all.
1286
1476
 
1287
- ## 0.5.2
1477
+ ## 0.5.2: Scenario Outlines record correctly
1288
1478
 
1289
1479
  Released 2026-09-15.
1290
1480
 
@@ -1313,7 +1503,7 @@ Editors
1313
1503
  hover says where it is defined and never shows the value. In the VS
1314
1504
  Code extension and in `saffron lsp` for JetBrains and other editors.
1315
1505
 
1316
- ## 0.5.1
1506
+ ## 0.5.1: The example suite in .saffron files
1317
1507
 
1318
1508
  Released 2026-09-14.
1319
1509
 
@@ -1330,7 +1520,7 @@ Editors
1330
1520
  parameters instead of the whole step line. Ships in the VS Code
1331
1521
  extension, the JetBrains plugin and the package's TextMate bundle.
1332
1522
 
1333
- ## 0.5.0
1523
+ ## 0.5.0: Guided first run
1334
1524
 
1335
1525
  Released 2026-09-14.
1336
1526
 
@@ -1343,7 +1533,7 @@ Runner
1343
1533
  matching `saffron.config.json` with `retries: 1`. Only installs into an
1344
1534
  empty `features/` directory. Documented as "Your first run".
1345
1535
 
1346
- ## 0.4.2
1536
+ ## 0.4.2: Recover from a wrong recording
1347
1537
 
1348
1538
  Released 2026-09-13.
1349
1539
 
@@ -1375,7 +1565,7 @@ Docs and site
1375
1565
  - Assertion policy documented on the Features page; cache lifecycle gained
1376
1566
  the staleness and wrong-recording stages.
1377
1567
 
1378
- ## 0.4.1
1568
+ ## 0.4.1: JetBrains plugin
1379
1569
 
1380
1570
  Released 2026-09-13.
1381
1571
 
@@ -1397,7 +1587,7 @@ Editors
1397
1587
  - VS Code extension 0.1.3: plain punctuation in README, hover and
1398
1588
  diagnostic messages.
1399
1589
 
1400
- ## 0.4.0
1590
+ ## 0.4.0: Agent skill for AI assistants
1401
1591
 
1402
1592
  Released 2026-09-13.
1403
1593
 
@@ -1423,13 +1613,13 @@ Editors
1423
1613
  - VS Code extension 0.1.2: warning and quick fix when a set name is written
1424
1614
  without the `StepSet` keyword.
1425
1615
 
1426
- ## 0.3.1
1616
+ ## 0.3.1: Version fix
1427
1617
 
1428
1618
  Released 2026-08-15.
1429
1619
 
1430
1620
  - `saffron --version` no longer reports a hardcoded value.
1431
1621
 
1432
- ## 0.3.0
1622
+ ## 0.3.0: Network-aware steps
1433
1623
 
1434
1624
  Released 2026-08-12.
1435
1625
 
@@ -1451,7 +1641,7 @@ Editors
1451
1641
 
1452
1642
  - VS Code extension 0.1.0 published to the Marketplace.
1453
1643
 
1454
- ## 0.2.0
1644
+ ## 0.2.0: Secrets, cross-browser and parallel replay
1455
1645
 
1456
1646
  Released 2026-07-19.
1457
1647
 
@@ -1467,7 +1657,7 @@ Runner
1467
1657
  workers (`--workers N`), and a cheaper model for heal sessions
1468
1658
  (`--heal-model`).
1469
1659
 
1470
- ## 0.1.0
1660
+ ## 0.1.0: First public release
1471
1661
 
1472
1662
  Released 2026-07-10.
1473
1663
 
package/README.md CHANGED
@@ -76,13 +76,15 @@ node dist/cli/index.js -p examples accept --all
76
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`). 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] [--with-feature-edit] [--propagate]` | Promote cache proposals to committed caches (`--all` skips UNVERIFIED ones unless `--include-unverified`); `--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
- | `saffron status [--json]` | Project overview for people, IDE panels and dashboards: feature files and scenarios with cache state, tags, pending proposals, last run, history, vocabulary health (divergent steps, duplicate wordings proven by identical recordings), effective config. |
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. |
80
+ | `saffron status [--json]` | Project overview for people, IDE panels and dashboards: feature files and scenarios with cache state, tags, pending proposals, last run, history, vocabulary health (divergent steps, duplicate wordings proven by identical recordings), effective config, and suite quality from the run history (failing, flaky, never run, slowest, trends, per tag). |
80
81
  | `saffron steps [search] [--json] [--snippets]` | List/search the step vocabulary (files + caches) with recorded/divergent/unrecorded badges and usage; `--snippets` writes `.vscode/saffron.code-snippets` for native VS Code completion. |
81
82
  | `saffron mcp` | Serve the vocabulary and the project overview to AI assistants over stdio MCP (`search_steps`, `list_step_sets`, `project_status`), e.g. `claude mcp add saffron -- npx saffron mcp`. |
82
83
  | `saffron author <prose-file> [-o out]` | Draft a `.saffron` feature file from plain-paragraph requirements, reusing the project's step vocabulary (AI; reports how many lines are seedable). |
83
84
  | `saffron lsp` | Run the Saffron language server over stdio for JetBrains (LSP4IJ/Ultimate), Neovim, any LSP editor: badge completion, StepSet go-to-definition, hover, diagnostics. Highlighting for JetBrains comes from the bundled TextMate grammar (`textmate/saffron` in the package); run `npx saffron lsp` in a terminal for setup steps. |
84
85
  | `saffron init [--agents list] [--examples]` | Make the project agent-ready (`--examples` installs the Saucedemo example suite): installs the bundled **Saffron agent skill** into `.claude/skills` and `.agents/skills` (Copilot/Cursor via `--agents`), registers the `saffron mcp` server in `.mcp.json` / `.cursor/mcp.json` / `.vscode/mcp.json`, adds a managed block to `AGENTS.md`/`CLAUDE.md`, scaffolds config. |
85
86
  | `saffron report` | Open the latest HTML report. |
87
+ | `saffron dashboard` | Open the suite's quality dashboard: failing, flaky and never-run scenarios, repeated heals, slowest, trends, per tag. |
86
88
  | `saffron trace [scenario] [--port n] [--no-open] [--json]` | Open the execution replay of the last run (every traced scenario, or the one you name): its Given / When / Then, the page inspectable at every action, the network alongside, and what the agent changed. Needs `"trace": "retain-on-failure"` (or `"on"`). |
87
89
 
88
90
  Configuration lives in `saffron.config.json` at your project root: