saffron-ai 0.9.1 → 0.9.2
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 +252 -0
- package/README.md +13 -2
- package/dist-pkg/cli.js +180 -148
- package/package.json +16 -2
- package/skills/saffron/references/config.md +18 -9
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "saffron-ai",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.2",
|
|
4
4
|
"description": "AI-fallback test runner for end-to-end tests written in plain language: zero-token cached replay, runtime AI healing, honest reports",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "vitest run",
|
|
@@ -28,6 +28,8 @@
|
|
|
28
28
|
"saffron": "dist-pkg/cli.js"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
+
"@cursor/sdk": "^1.0.32",
|
|
32
|
+
"@openai/codex-sdk": "^0.158.0",
|
|
31
33
|
"@types/node": "^26.1.0",
|
|
32
34
|
"esbuild": "^0.28.1",
|
|
33
35
|
"marked": "^18.0.5",
|
|
@@ -46,12 +48,24 @@
|
|
|
46
48
|
"vscode-languageserver-textdocument": "^1.0.12",
|
|
47
49
|
"zod": "^4.4.3"
|
|
48
50
|
},
|
|
51
|
+
"peerDependencies": {
|
|
52
|
+
"@cursor/sdk": "^1.0.32",
|
|
53
|
+
"@openai/codex-sdk": ">=0.158.0"
|
|
54
|
+
},
|
|
55
|
+
"peerDependenciesMeta": {
|
|
56
|
+
"@cursor/sdk": {
|
|
57
|
+
"optional": true
|
|
58
|
+
},
|
|
59
|
+
"@openai/codex-sdk": {
|
|
60
|
+
"optional": true
|
|
61
|
+
}
|
|
62
|
+
},
|
|
49
63
|
"homepage": "https://saffron-ai.io",
|
|
50
64
|
"bugs": {
|
|
51
65
|
"url": "https://github.com/s-chathuranga-j/saffron-community/issues"
|
|
52
66
|
},
|
|
53
67
|
"engines": {
|
|
54
|
-
"node": ">=20"
|
|
68
|
+
"node": ">=20.6"
|
|
55
69
|
},
|
|
56
70
|
"files": [
|
|
57
71
|
"dist-pkg",
|
|
@@ -26,6 +26,7 @@ your-project/
|
|
|
26
26
|
"retries": 1,
|
|
27
27
|
"screenshot": "viewport",
|
|
28
28
|
"trace": "retain-on-failure",
|
|
29
|
+
"provider": "claude",
|
|
29
30
|
"model": "claude-sonnet-5",
|
|
30
31
|
"healModel": "claude-haiku-4-5",
|
|
31
32
|
"maxTurns": 100,
|
|
@@ -59,20 +60,23 @@ your-project/
|
|
|
59
60
|
| `browser` | `chromium` / `chrome` / `msedge` / `firefox` / `webkit`: replay runs anywhere; recording and healing need one of the first three. `chrome` and `msedge` must be installed on the machine |
|
|
60
61
|
| `workers` | Parallel replay workers; agent work stays sequential |
|
|
61
62
|
| `shardBy` | How `--shard` splits the suite: `"scenario"` (default) or `"file"` (each feature file on one machine) |
|
|
63
|
+
| `provider` | Whose agent records and heals, on its login on this machine: `claude` (default), `codex` (ChatGPT plan), `antigravity` (Google AI Pro/Ultra via the `agy` CLI, experimental), `cursor`. Also `--provider` |
|
|
64
|
+
| `model` | Model in the provider's own names (unset: the provider's default). A `--provider` run on another provider ignores it |
|
|
62
65
|
| `healModel` | Cheaper model for heal sessions only |
|
|
63
66
|
|
|
64
67
|
## CLI
|
|
65
68
|
|
|
66
69
|
| Command | Purpose |
|
|
67
70
|
|---|---|
|
|
68
|
-
| `saffron run [paths] [--filter @tag] [--no-agent] [--strict] [--browser b] [--workers n] [--shard i/n] [--shard-by scenario\|file] [--heal-model m] [--headed] [--trace mode]` | Run; cached replay, agent on misses/failures. `--shard 2/4` runs one part of the suite on one CI machine and writes `shard-2-of-4.json` instead of `latest.json`; `--trace retain-on-failure` keeps an execution trace of each scenario that is not green |
|
|
71
|
+
| `saffron run [paths] [--filter @tag] [--no-agent] [--strict] [--browser b] [--workers n] [--shard i/n] [--shard-by scenario\|file] [--provider p] [--heal-model m] [--headed] [--trace mode]` | Run; cached replay, agent on misses/failures. `--shard 2/4` runs one part of the suite on one CI machine and writes `shard-2-of-4.json` instead of `latest.json`; `--trace retain-on-failure` keeps an execution trace of each scenario that is not green |
|
|
69
72
|
| `saffron trace [scenario] [--port n] [--no-open] [--json]` | Open the execution replay of a scenario from the last run (scenario name, feature path or `feature:scenario`; default: every traced scenario in one replay, opening on a red one, else a yellow one); `--json` prints the parsed trace |
|
|
70
73
|
| `saffron accept [files... \| --all] [--include-unverified] [--with-feature-edit] [--propagate]` | Promote proposals (`--all` skips UNVERIFIED ones unless `--include-unverified`); `--with-feature-edit` rewrites adapted steps in the feature file; `--propagate` applies a heal's locator fix to every cache using that locator |
|
|
71
74
|
| `saffron reject [files... \| --all]` | Discard proposals |
|
|
72
75
|
| `saffron prune [--yes] [--check] [--json]` | List recordings no scenario owns any more; `--yes` deletes them, `--check` exits 1 for CI |
|
|
73
76
|
| `saffron status [--json]` | Project overview: files and scenarios with cache state, tags, pending proposals, last run, history, vocabulary health, effective config |
|
|
74
77
|
| `saffron steps [search] [--json] [--snippets]` | The step vocabulary with recorded/divergent/unrecorded badges |
|
|
75
|
-
| `saffron author <prose-file
|
|
78
|
+
| `saffron author <prose-file> [--provider p]` | Draft a `.saffron` file from plain-paragraph requirements using the project vocabulary |
|
|
79
|
+
| `saffron login [provider]` | Check that a provider can record and heal here and list what is missing; `saffron login cursor` also runs Cursor's one-time sign-in, `saffron login antigravity` also allows Saffron's tools in agy |
|
|
76
80
|
| `saffron mcp` / `saffron lsp` | MCP tools (`search_steps`, `list_step_sets`, `project_status`) for AI assistants / language server for editors |
|
|
77
81
|
| `saffron init [--examples] [--agents list]` | Install this skill into the project's agent directories, register MCP, add an AGENTS.md block, scaffold config; `--examples` adds the Saucedemo example suite |
|
|
78
82
|
| `saffron report [--merge [paths]]` | Open the latest HTML report; `--merge` combines a complete set of shard reports into `latest.json`, `latest.html` and one history line |
|
|
@@ -82,13 +86,18 @@ preflight (e.g. a missing `{env:VAR}`).
|
|
|
82
86
|
|
|
83
87
|
## AI access
|
|
84
88
|
|
|
85
|
-
Recording and healing need
|
|
86
|
-
Claude
|
|
87
|
-
|
|
88
|
-
`
|
|
89
|
-
(
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
Recording and healing need the configured provider's login on the machine.
|
|
90
|
+
Claude (default): `ANTHROPIC_API_KEY`, or a Claude Code login. Codex: a
|
|
91
|
+
ChatGPT-plan `npx @openai/codex login` plus `npm i -D @openai/codex-sdk`. Antigravity:
|
|
92
|
+
Google's `agy` CLI, signed in once, then `npx saffron login antigravity`
|
|
93
|
+
(allows Saffron's tools in agy's settings). Cursor: `npm i -D @cursor/sdk`
|
|
94
|
+
and `npx saffron login cursor`. `npx saffron login` lists what is missing.
|
|
95
|
+
Replay-only runs (`--no-agent`) need none: that is the normal CI mode once
|
|
96
|
+
caches are committed. With no `model` configured the provider's default
|
|
97
|
+
model is used; set `model` (and `healModel`) to pin one. On a Claude
|
|
98
|
+
subscription login the report shows the 5-hour plan window used and the
|
|
99
|
+
API-equivalent dollars; on a key it shows what was billed; Codex,
|
|
100
|
+
Antigravity and Cursor report tokens only.
|
|
92
101
|
|
|
93
102
|
## IDE integration
|
|
94
103
|
|