saffron-ai 0.9.0 → 0.9.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/CHANGELOG.md +64 -0
- package/README.md +1 -1
- package/dist-pkg/cli.js +134 -134
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,70 @@ 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
5
|
JetBrains plugin (`ai.saffron.jetbrains`). Dates are publish dates.
|
|
6
6
|
|
|
7
|
+
## 0.9.1
|
|
8
|
+
|
|
9
|
+
Released 2026-09-29.
|
|
10
|
+
|
|
11
|
+
Runner
|
|
12
|
+
|
|
13
|
+
- **Tag expressions in `--filter`.** `--filter "@e2e and not @wip"`,
|
|
14
|
+
`"(@smoke or @sanity) and not @flaky"`: `and`, `or`, `not` and
|
|
15
|
+
parentheses, in the shape Cucumber and pytest use, with `and` binding
|
|
16
|
+
tighter than `or`. The list forms keep their meaning: `@a,@b`, `@a @b`,
|
|
17
|
+
`@a|@b` and a repeated flag all mean `or`, and the `@` may be left off.
|
|
18
|
+
A malformed expression stops the run with exit 2 and names the problem.
|
|
19
|
+
- **Replay fixes.** A network assertion checked without the run's
|
|
20
|
+
response log (the check after a heal) now checks the response body too:
|
|
21
|
+
a heal could pass while the API answered `{"ok":false}`. A file upload
|
|
22
|
+
armed for the next file chooser is set by the click that opens it,
|
|
23
|
+
which waits for a chooser that opens late up to the action timeout. If
|
|
24
|
+
no chooser opens, or the files cannot be set (a missing file), that
|
|
25
|
+
click fails, and so does each retry of it, instead of the runner ending
|
|
26
|
+
or the scenario passing with nothing uploaded. `{env:VAR}` in the
|
|
27
|
+
pattern of `expectMatches` and `expectAttribute` is resolved like
|
|
28
|
+
every other field.
|
|
29
|
+
- **A click through a locator chain records the element it clicked.**
|
|
30
|
+
When the agent targets an element with a selector string, Playwright
|
|
31
|
+
MCP reports a chain such as `locator('article:has(...)')
|
|
32
|
+
.locator('role=button[name="Select room"]')`. The recorder kept only the
|
|
33
|
+
first link, so replay clicked the whole card instead of its button, and
|
|
34
|
+
a refine pass then re-clicked the room under the next step. Chains of
|
|
35
|
+
locators, getBy calls, `filter({ hasText })`, `nth`, `first` and `last`
|
|
36
|
+
are now kept whole as one selector; a chain part with no selector form
|
|
37
|
+
is not recorded rather than recorded as a different element. The agent
|
|
38
|
+
is also told to act through snapshot refs, which record as role and
|
|
39
|
+
name.
|
|
40
|
+
- **Dates picked through a selector string move with the calendar.** A
|
|
41
|
+
date in a fallback selector or test id (`role=button[name="2026-10-11"]`)
|
|
42
|
+
is now templated to `{date+N}` like one in a name or label, and replay
|
|
43
|
+
resolves it there, so the recording does not expire the next day.
|
|
44
|
+
- **Open Replay opens the run its row lists.** `saffron trace --run
|
|
45
|
+
<startedAt>` refuses a later run ("The last run changed since this was
|
|
46
|
+
listed"), and both editors pass it, so an older row no longer opens a
|
|
47
|
+
newer run's trace.
|
|
48
|
+
- **A decision under way keeps its lock.** A proposal lock held by a live
|
|
49
|
+
process on this machine is never broken for its age, so a paused
|
|
50
|
+
decision cannot be overtaken.
|
|
51
|
+
|
|
52
|
+
Editors (VS Code extension 0.3.2, JetBrains plugin 0.3.2)
|
|
53
|
+
|
|
54
|
+
- **VS Code: a project nested inside a bigger workspace folder finds its
|
|
55
|
+
data folder.** `{data:...}` completion, hover and diagnostics resolve
|
|
56
|
+
against the nearest `saffron.config.json` above the file, not the
|
|
57
|
+
workspace root.
|
|
58
|
+
- **JetBrains: the Run Tagged tooltip** says the CLI also takes tag
|
|
59
|
+
expressions.
|
|
60
|
+
- **Open Replay opens the run its row lists**, with saffron-ai 0.9.1 or
|
|
61
|
+
later; with an older runner it opens the scenario as before.
|
|
62
|
+
- **JetBrains: the tool window opens on IntelliJ 2026.2.** The Dashboard
|
|
63
|
+
tab crashed the whole Saffron tool window there (NoClassDefFoundError:
|
|
64
|
+
JBCefApp), because 2026.2 moved the embedded browser into its own
|
|
65
|
+
plugin. The plugin now depends on it where it exists, and without it
|
|
66
|
+
the Dashboard falls back to Open in Browser.
|
|
67
|
+
- **VS Code: `.saffron` files show the Saffron mark** in the explorer and
|
|
68
|
+
tabs, under any file icon theme that has no icon of its own for them
|
|
69
|
+
(Seti, the default, included).
|
|
70
|
+
|
|
7
71
|
## 0.9.0
|
|
8
72
|
|
|
9
73
|
Released 2026-09-27.
|
package/README.md
CHANGED
|
@@ -72,7 +72,7 @@ node dist/cli/index.js -p examples accept --all
|
|
|
72
72
|
|
|
73
73
|
| Command | What it does |
|
|
74
74
|
|---|---|
|
|
75
|
-
| `saffron run [paths] [--headed] [--filter
|
|
75
|
+
| `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`). |
|
|
76
76
|
| `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. |
|
|
77
77
|
| `saffron reject [files... \| --all]` | Discard proposals; the agent will try again next run. |
|
|
78
78
|
| `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. |
|