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 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 @tags] [--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`). |
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. |