saffron-ai 0.9.5 → 0.9.7
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 +129 -0
- package/dist-pkg/cli.js +219 -216
- package/package.json +1 -1
- package/skills/saffron/SKILL.md +1 -0
- package/skills/saffron/references/config.md +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,135 @@ 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.7: CI results without importing
|
|
9
|
+
|
|
10
|
+
Released 2026-10-05.
|
|
11
|
+
|
|
12
|
+
Runner
|
|
13
|
+
|
|
14
|
+
- **See what a CI run found before you import it.** `saffron report --run
|
|
15
|
+
<id>` downloads the run's Saffron bundles once into
|
|
16
|
+
`.saffron/ci/<provider>-<id>/attempt-<n>/`, checks them as `saffron
|
|
17
|
+
import` does (repository, digests, sizes, format, the run, attempts and
|
|
18
|
+
shards), judges each proposal against this checkout without filing it,
|
|
19
|
+
and opens the run's report page. Your `.saffron/reports/`,
|
|
20
|
+
`.saffron/proposals/`, `.saffron/artifacts/` and import ledger are left
|
|
21
|
+
as they were. `--json` gives the run, its totals, each scenario with its
|
|
22
|
+
failing step, first error line, screenshot and trace, each proposal as
|
|
23
|
+
importable or not with the reason, and warnings: what the VS Code and
|
|
24
|
+
JetBrains CI runs views show under a run.
|
|
25
|
+
- **A run without results says why.** `running` (not finished),
|
|
26
|
+
`expired` (the service deleted the artifact) or `none` (nothing
|
|
27
|
+
uploaded; the guide's workflow exports only on failure, and `if:
|
|
28
|
+
always()` on the export and upload steps keeps every run's results), as
|
|
29
|
+
`reasonKind` and `reason`, exit 0.
|
|
30
|
+
- **Large runs ask first.** `--max-download <MB>` refuses a run whose
|
|
31
|
+
bundles add up to more, with `{"error", "kind": "too-large",
|
|
32
|
+
"sizeBytes"}` and exit 2, so an editor can ask and run again.
|
|
33
|
+
- **Replay a CI run, view only.** `saffron trace --run <id> [scenario]`
|
|
34
|
+
replays the run's traces from `.saffron/ci/`, taking the same scenario
|
|
35
|
+
forms as `saffron trace` (`<feature>:<scenario>` included). The page has
|
|
36
|
+
no Accept or Reject and its server no review routes: nothing was filed.
|
|
37
|
+
- **View, then import, downloads once.** `saffron import --run <id>`
|
|
38
|
+
reuses the viewed download of the run's latest attempt.
|
|
39
|
+
- **A cache that looks after itself.** `.saffron/ci/` keeps the newest 10
|
|
40
|
+
runs and at most 1 GB, removing the oldest first; a download goes
|
|
41
|
+
through a `.partial` folder and is renamed whole, so a cancelled one
|
|
42
|
+
leaves nothing behind. The folder writes its own `.gitignore` (`*`), so
|
|
43
|
+
it never shows in `git status`, even in a project set up before it
|
|
44
|
+
existed, and `saffron init` adds `.saffron/ci/` to the entries it
|
|
45
|
+
manages.
|
|
46
|
+
|
|
47
|
+
VS Code extension 0.6.0
|
|
48
|
+
|
|
49
|
+
- **Expand a CI run to see what it found, without importing it.** The
|
|
50
|
+
run lists its totals, each failed and healed scenario with its failing
|
|
51
|
+
step and first error line (the tooltip has what the agent changed), and
|
|
52
|
+
"N proposals: M importable" with the reason each one would not import.
|
|
53
|
+
Your reports, proposals and evidence are left alone. Needs saffron-ai
|
|
54
|
+
0.9.7 or later; an older runner says so.
|
|
55
|
+
- **Open Report and Open Trace on a viewed run.** Open Report shows the
|
|
56
|
+
run's report in your browser; Open Trace replays a traced scenario,
|
|
57
|
+
view only. Import stays the only action that files proposals.
|
|
58
|
+
- **Large results ask first.** Results above the new
|
|
59
|
+
`saffron.ciMaxDownloadMB` setting (default 100, 0 for no limit) ask
|
|
60
|
+
"This run's results are N MB. Download?". Loading can be cancelled,
|
|
61
|
+
which stops the whole download, and never runs while the CI runs view
|
|
62
|
+
is hidden.
|
|
63
|
+
- **A run with no results says why:** still running, its artifacts
|
|
64
|
+
expired, or it uploaded none.
|
|
65
|
+
|
|
66
|
+
JetBrains plugin 0.6.0
|
|
67
|
+
|
|
68
|
+
- **CI Runs shows what a run found without importing it.** Select a run
|
|
69
|
+
to see its totals, each failed and healed scenario with its failing
|
|
70
|
+
step and first error line (the narrative in the tooltip), and
|
|
71
|
+
"N proposals: M importable" with the reason for each one that is not.
|
|
72
|
+
It loads in a background task you can cancel, only while the tab is on
|
|
73
|
+
screen. Needs saffron-ai 0.9.7 or later; an older runner says so.
|
|
74
|
+
- **Open Report and Open Trace on a viewed run.** Open Trace (or a
|
|
75
|
+
double-click) replays a failed or healed scenario's trace, view only.
|
|
76
|
+
Import Run stays the only action that brings proposals into the
|
|
77
|
+
checkout.
|
|
78
|
+
- **Large results ask first**, above the limit in Settings, Tools, Saffron
|
|
79
|
+
(default 100 MB, 0 for no limit), the same as the VS Code setting.
|
|
80
|
+
- **A run with no results says why:** still running, expired, or none
|
|
81
|
+
uploaded.
|
|
82
|
+
|
|
83
|
+
## 0.9.6: Dashboard figures you can trust
|
|
84
|
+
|
|
85
|
+
Released 2026-10-05.
|
|
86
|
+
|
|
87
|
+
Runner
|
|
88
|
+
|
|
89
|
+
- **Three dashboard figures no longer flatter the suite.** *Recorded*
|
|
90
|
+
counted a stale recording, one whose scenario was edited since and
|
|
91
|
+
needs the agent again, so the dashboard could say 100% while `saffron
|
|
92
|
+
status` said otherwise; it now counts current recordings only, and at
|
|
93
|
+
100% says "every scenario has a current recording". *Passing* and the
|
|
94
|
+
last run's pass rate counted a heal whose zero-AI proof had failed;
|
|
95
|
+
such a heal is now "healed, unverified", out of the pass rate, with its
|
|
96
|
+
own stripe in the health bar, a count on the tiles and a mark in the
|
|
97
|
+
healed-again list. *Flaky* counted a scenario that was red on one base
|
|
98
|
+
URL and green on another as flipping; flips are now counted between
|
|
99
|
+
consecutive runs on the same base URL, and a first recording that
|
|
100
|
+
failed is left out. `status --json` gains `quality.suite.unverified`,
|
|
101
|
+
`quality.lastRun.unverified`, and `unverified` on tags and healing
|
|
102
|
+
entries. Both IDE dashboards show the runner's page, so they follow
|
|
103
|
+
without a plugin update.
|
|
104
|
+
- **An upload whose file does not exist says so.** Under a project path
|
|
105
|
+
reached through a link (a temp folder on macOS), the message was
|
|
106
|
+
"outside the project". The repository's own example now names its
|
|
107
|
+
upload file relative to the project, as replay has resolved it since
|
|
108
|
+
0.9.4.
|
|
109
|
+
- **Uploads are single files.** A folder passed to a file input was let
|
|
110
|
+
through, and a folder upload sends everything inside it, dotfiles such
|
|
111
|
+
as `.env` included. The agent's upload and replay both refuse a folder
|
|
112
|
+
now.
|
|
113
|
+
- **`saffron report --merge` never hides another environment's result.**
|
|
114
|
+
A re-run attempt replaced the earlier attempt of the same shard number
|
|
115
|
+
before checking that both ran the same suite against the same base
|
|
116
|
+
URL, so a green production attempt could silently drop a red staging
|
|
117
|
+
one. An attempt now replaces only the same shard of the same suite,
|
|
118
|
+
split and base URL; anything else is refused, naming the base URLs.
|
|
119
|
+
- **`saffron export --branch` works with `"features": "."`.** With the
|
|
120
|
+
scenarios at the project root, the shared StepSets were left out of the
|
|
121
|
+
check against the commit the branch starts on, so a correctly bound
|
|
122
|
+
proposal was refused as using a StepSet "not defined anywhere".
|
|
123
|
+
- A replay that finds its recording stale no longer leaves a listener on
|
|
124
|
+
the browser context.
|
|
125
|
+
|
|
126
|
+
VS Code extension 0.5.1
|
|
127
|
+
|
|
128
|
+
- **The dashboard tab shows the Saffron mark in dark themes.** It used the
|
|
129
|
+
activity bar icon, one dark shape that VS Code tints there and a tab
|
|
130
|
+
draws as is, so it was dark on a dark tab.
|
|
131
|
+
- **Cancelling an import stops every process it started, on macOS and
|
|
132
|
+
Linux too.** The CLI runs in a process group of its own, so a `gh` or
|
|
133
|
+
`az` download that outlives it is stopped as well, with a forced stop
|
|
134
|
+
for one that ignores the first request. Output over 16 MB ends the
|
|
135
|
+
command with a clear message.
|
|
136
|
+
|
|
8
137
|
## 0.9.5: CI heals you can trust
|
|
9
138
|
|
|
10
139
|
Released 2026-10-04.
|