@asrunjs/asrun 0.6.0 → 0.7.0
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/.claude/settings.json +5 -5
- package/.claude/skills/exploring-cases/references/assertion-targets.md +103 -103
- package/.claude/skills/exploring-cases/references/handoff-card.js +128 -128
- package/.claude/skills/making-cases/references/gaps.md +36 -36
- package/.claude/skills/making-cases/references/splitting.md +28 -28
- package/AGENTS.md +3 -0
- package/README.md +16 -2
- package/bin/asrun.mjs +2 -1
- package/dist/scripts/cli.js +14 -6
- package/dist/scripts/doctor.js +7 -2
- package/dist/scripts/go.mjs +36 -6
- package/dist/scripts/heal-evidence.mjs +149 -143
- package/dist/scripts/init.d.ts +9 -1
- package/dist/scripts/init.js +101 -26
- package/dist/scripts/reset.d.ts +1 -0
- package/dist/scripts/reset.js +233 -0
- package/dist/scripts/run.js +23 -23
- package/docs/agents/framework-dev.md +29 -1
- package/docs/commands.md +25 -8
- package/docs/install.md +52 -10
- package/docs/troubleshooting.md +31 -4
- package/package.json +34 -30
- package/templates/.claude/settings.json +5 -5
- package/templates/CLAUDE.md +1 -1
- package/templates/gitignore +13 -13
- package/templates/package.json +33 -31
- package/templates/playwright.config.ts +3 -3
- package/templates/pnpm-workspace.yaml +8 -5
- package/templates/seed.spec.ts +9 -9
- package/templates/tsconfig.json +14 -14
- package/ui/dist/favicon.svg +11 -11
- package/ui/dist/logos/claude.svg +1 -1
- package/ui/dist/logos/opencode.svg +1 -1
package/docs/install.md
CHANGED
|
@@ -23,8 +23,15 @@ pnpm go
|
|
|
23
23
|
|
|
24
24
|
`init --install` scaffolds the workspace and then adds the dependency. Running `init` first matters on pnpm 12: it
|
|
25
25
|
writes `pnpm-workspace.yaml` with the `allowBuilds` entry (`esbuild` through `tsx`, `ffmpeg-static`), and without it
|
|
26
|
-
`pnpm add` exits with `ERR_PNPM_IGNORED_BUILDS`.
|
|
27
|
-
|
|
26
|
+
`pnpm add` exits with `ERR_PNPM_IGNORED_BUILDS`. The same file lists `@asrunjs/asrun` under `minimumReleaseAgeExclude`,
|
|
27
|
+
so pnpm's 24-hour release age does not hold a fresh release back (see
|
|
28
|
+
[troubleshooting.md](./troubleshooting.md#installing)). An existing `pnpm-workspace.yaml` that lacks either entry gets
|
|
29
|
+
a note instead: add the block by hand (see "Manual install").
|
|
30
|
+
|
|
31
|
+
`init` also records `@asrunjs/asrun` (pinned to its own version) in the workspace `package.json`, so `pnpm install`
|
|
32
|
+
installs the framework even without `--install`. When the install step itself fails — `pnpm` is not on `PATH`, the
|
|
33
|
+
registry is unreachable, or a build script is not approved — `init` names the reason and stops before writing
|
|
34
|
+
`.asrun.json`: fix the cause, run the `pnpm add -D @asrunjs/asrun` it prints, and run `pnpm asrun init` again.
|
|
28
35
|
|
|
29
36
|
`pnpm go` then does the rest and is the command to remember:
|
|
30
37
|
|
|
@@ -34,7 +41,9 @@ instead: add the block by hand (see "Manual install").
|
|
|
34
41
|
4. starts the web UI at http://127.0.0.1:4173 and opens it.
|
|
35
42
|
|
|
36
43
|
Run it again on any day: the install step then takes seconds, and if the UI is already running it only opens it.
|
|
37
|
-
`pnpm go --no-open` does not open a browser
|
|
44
|
+
`pnpm go --no-open` does not open a browser; `pnpm go --no-ui` stops after step 3, with the workspace prepared and no
|
|
45
|
+
server running; `pnpm go --dry-run` only prints the workspace, the framework and the `asrun` command it resolved, then
|
|
46
|
+
exits. Set `ASRUN_UI_PORT` to change the port.
|
|
38
47
|
|
|
39
48
|
The UI is optional: all commands in [commands.md](./commands.md) work without it.
|
|
40
49
|
|
|
@@ -48,13 +57,15 @@ pnpm asrun init
|
|
|
48
57
|
pnpm go
|
|
49
58
|
```
|
|
50
59
|
|
|
51
|
-
If pnpm refuses the build scripts of `esbuild` / `ffmpeg-static`,
|
|
52
|
-
install again:
|
|
60
|
+
If pnpm refuses the build scripts of `esbuild` / `ffmpeg-static`, or installs the release before `latest`, add this to
|
|
61
|
+
`pnpm-workspace.yaml` and run the install again:
|
|
53
62
|
|
|
54
63
|
```yaml
|
|
55
64
|
allowBuilds:
|
|
56
65
|
esbuild: true
|
|
57
66
|
ffmpeg-static: true
|
|
67
|
+
minimumReleaseAgeExclude:
|
|
68
|
+
- '@asrunjs/asrun'
|
|
58
69
|
```
|
|
59
70
|
|
|
60
71
|
To pin a version:
|
|
@@ -63,7 +74,8 @@ To pin a version:
|
|
|
63
74
|
pnpm add -D @asrunjs/asrun@<version>
|
|
64
75
|
```
|
|
65
76
|
|
|
66
|
-
`pnpm asrun init` is safe to run many times: it never overwrites a file the project owns
|
|
77
|
+
`pnpm asrun init` is safe to run many times: it never overwrites a file the project owns unless `--force` asks for
|
|
78
|
+
it (and `--reset-rules` for the project's rules).
|
|
67
79
|
|
|
68
80
|
## What `init` writes
|
|
69
81
|
|
|
@@ -81,13 +93,16 @@ Flags:
|
|
|
81
93
|
|---|---|
|
|
82
94
|
| `--root <dir>` | initialize that folder instead of the current one |
|
|
83
95
|
| `--update` | refresh only the generated files |
|
|
96
|
+
| `--force` | overwrite every file init writes, for a clean installation (keeps `profiles.yaml` and `package.json`) |
|
|
84
97
|
| `--force <path>` | overwrite one file init owns (repeatable) |
|
|
85
98
|
| `--reset-rules` | allow `--force` on `AGENTS.md`, `CLAUDE.md` or `.claude/skills/**` |
|
|
86
99
|
| `--no-env` | do not write `.env` |
|
|
87
100
|
| `--install [spec]` | also add the dependency (default `@asrunjs/asrun`) |
|
|
88
101
|
|
|
89
|
-
`AGENTS.md`, `CLAUDE.md` and `.claude/skills/**` belong to the project. `init --force`
|
|
90
|
-
`--reset-rules
|
|
102
|
+
`AGENTS.md`, `CLAUDE.md` and `.claude/skills/**` belong to the project. `init --force` keeps them unless
|
|
103
|
+
`--reset-rules` is given, so a framework update can never replace a project's rules. `--force` also keeps
|
|
104
|
+
`profiles.yaml` and `package.json`: replace the profiles with `--force profiles.yaml`; `package.json` is only merged
|
|
105
|
+
into, so your scripts and dependencies stay.
|
|
91
106
|
|
|
92
107
|
## Update
|
|
93
108
|
|
|
@@ -98,7 +113,8 @@ pnpm asrun doctor
|
|
|
98
113
|
```
|
|
99
114
|
|
|
100
115
|
`init --update` rewrites only the generated files and leaves project rules, case files, values and baselines alone.
|
|
101
|
-
`doctor` tells you when the workspace is
|
|
116
|
+
`init --force` rewrites every file init writes (see the flags above). `doctor` tells you when the workspace is
|
|
117
|
+
behind the installed version.
|
|
102
118
|
|
|
103
119
|
There is no folder to move: the framework lives in `node_modules`, which the package manager owns. To change the
|
|
104
120
|
framework itself, `pnpm patch @asrunjs/asrun` (a committed patch).
|
|
@@ -164,6 +180,32 @@ and `pnpm-workspace.yaml`.
|
|
|
164
180
|
Never commit or share `.auth/` (one saved login per profile, as sensitive as a password), `reports/`, `.tmp/`,
|
|
165
181
|
`.explore/`, `.env` or `node_modules/`. The asrun block of `.gitignore` covers them.
|
|
166
182
|
|
|
183
|
+
## Reset and reinstall
|
|
184
|
+
|
|
185
|
+
To get a clean environment without losing the project's test content:
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
pnpm asrun reset # lists what it removes, then asks
|
|
189
|
+
pnpm dlx @asrunjs/asrun init --install
|
|
190
|
+
pnpm go
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
`reset` removes `node_modules/` and the files `init` writes: the generated config and commands, `.asrun.json`, the
|
|
194
|
+
asrun block of `.gitignore` and the `ASRUN_ROOT` lines of `.env`. It deletes a once-only file only when it is still
|
|
195
|
+
identical to its template, so a file you edited is kept (and listed). `cases/`, specs and their baselines,
|
|
196
|
+
`profiles.yaml`, `package.json` and `.claude/skills/**` are never removed.
|
|
197
|
+
|
|
198
|
+
| Flag | Meaning |
|
|
199
|
+
|---|---|
|
|
200
|
+
| `--root <dir>` | reset that folder instead of the current workspace |
|
|
201
|
+
| `--dry-run` | list what would be removed, and change nothing |
|
|
202
|
+
| `--yes` | skip the confirmation (for unattended runs) |
|
|
203
|
+
| `--state` | also remove `.auth/`, `reports/`, `.tmp/`, `.explore/`, `test-results/`, `playwright-report/`, `.playwright-mcp/` |
|
|
204
|
+
| `--lockfile` | also remove `pnpm-lock.yaml`, so the next install resolves the dependencies again |
|
|
205
|
+
|
|
206
|
+
Without `--yes` it asks you to type `yes`; a run without a terminal refuses instead of removing anything. It refuses
|
|
207
|
+
to run on the framework's own checkout. `--state` removes saved logins, so every profile must be signed in again.
|
|
208
|
+
|
|
167
209
|
## Uninstall
|
|
168
210
|
|
|
169
211
|
```bash
|
|
@@ -171,4 +213,4 @@ pnpm remove @asrunjs/asrun
|
|
|
171
213
|
```
|
|
172
214
|
|
|
173
215
|
Then delete the workspace files you no longer want (`profiles.yaml`, `cases/`, `tests/`, the generated commands and
|
|
174
|
-
configs, `.asrun.json`).
|
|
216
|
+
configs, `.asrun.json`). `pnpm asrun reset` does most of that; keep the files if another tool still uses them.
|
package/docs/troubleshooting.md
CHANGED
|
@@ -67,6 +67,37 @@ is recorded.
|
|
|
67
67
|
checkout has the card but not the screenshot. Run the exploration again on this machine (or look at the card and the
|
|
68
68
|
report's baseline).
|
|
69
69
|
|
|
70
|
+
## Installing
|
|
71
|
+
|
|
72
|
+
**`pnpm add` installs the previous release instead of `latest`** — pnpm holds back versions published in the last
|
|
73
|
+
24 hours (`minimumReleaseAge`, 1440 minutes), so right after a release `latest` resolves to the version before it.
|
|
74
|
+
Exempt the framework in `pnpm-workspace.yaml` (the file `init` writes already does):
|
|
75
|
+
|
|
76
|
+
```yaml
|
|
77
|
+
minimumReleaseAgeExclude:
|
|
78
|
+
- '@asrunjs/asrun'
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
For a single command, set the same list as a JSON array:
|
|
82
|
+
`PNPM_CONFIG_MINIMUM_RELEASE_AGE_EXCLUDE='["@asrunjs/asrun"]'` (a comma-separated list is not parsed), or turn the wait
|
|
83
|
+
off for that command with `PNPM_CONFIG_MINIMUM_RELEASE_AGE=0`. The wait covers `pnpm dlx @asrunjs/asrun init` too. Once
|
|
84
|
+
`minimumReleaseAgeStrict` is on, the install fails with `ERR_PNPM_NO_MATURE_MATCHING_VERSION` instead of falling back.
|
|
85
|
+
|
|
86
|
+
**`ERR_PNPM_IGNORED_BUILDS` while installing** — pnpm refused the build scripts of `esbuild` / `ffmpeg-static`. Run
|
|
87
|
+
`pnpm dlx @asrunjs/asrun init` first (it writes the `allowBuilds` entry), or add it to `pnpm-workspace.yaml` by hand;
|
|
88
|
+
see [install.md](./install.md#manual-install).
|
|
89
|
+
|
|
90
|
+
**`init` stopped and `.asrun.json` is missing** — the workspace files are written, but the `pnpm add -D
|
|
91
|
+
@asrunjs/asrun` step failed, and `init` printed the reason (most often `pnpm` is not on `PATH`, or the registry
|
|
92
|
+
refused the install). Run the command it prints, then `pnpm asrun init` again. Until then `pnpm asrun` and every
|
|
93
|
+
script that calls `asrun` do not exist, and `pnpm asrun doctor` reports both the missing framework and the missing
|
|
94
|
+
marker.
|
|
95
|
+
|
|
96
|
+
**The workspace looks half-installed, or you want fresh dependencies** — run `pnpm asrun reset` (add `--dry-run` to
|
|
97
|
+
see the list first, `--yes` to skip the prompt). It removes `node_modules` and the files `init` wrote; edited files,
|
|
98
|
+
cases, specs, `profiles.yaml` and `package.json` stay. Then run `pnpm dlx @asrunjs/asrun init --install` and
|
|
99
|
+
`pnpm go`. `--state` also clears saved logins and reports, and `--lockfile` clears the lockfile.
|
|
100
|
+
|
|
70
101
|
## AI steps
|
|
71
102
|
|
|
72
103
|
**An AI command says the `playwright-test` MCP server is missing** — run `pnpm asrun doctor`. OpenCode reads only
|
|
@@ -91,10 +122,6 @@ read it. `doctor` lists the overrides it sees.
|
|
|
91
122
|
**`pnpm asrun init --force AGENTS.md` is refused** — `AGENTS.md`, `CLAUDE.md` and `.claude/skills/**` belong to the
|
|
92
123
|
project. Add `--reset-rules` to replace them with the template, and expect to lose the project's rules.
|
|
93
124
|
|
|
94
|
-
**`ERR_PNPM_IGNORED_BUILDS` while installing** — pnpm refused the build scripts of `esbuild` / `ffmpeg-static`. Run
|
|
95
|
-
`pnpm dlx @asrunjs/asrun init` first (it writes the `allowBuilds` entry), or add it to `pnpm-workspace.yaml` by hand;
|
|
96
|
-
see [install.md](./install.md#manual-install).
|
|
97
|
-
|
|
98
125
|
**The AI did something you did not expect** — exploring and generating only read pages and edit the case file; healing
|
|
99
126
|
edits the spec and runs it under the same write gate as any run (staging writes are allowed, any other environment
|
|
100
127
|
needs a person's confirmation). None of them writes product data on its own, and none updates a baseline. If a step
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@asrunjs/asrun",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Multi-profile end-to-end test suite: plain-language cases, AI-written Playwright specs, evidence for every run.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"author": "Zoro Chen",
|
|
@@ -42,6 +42,38 @@
|
|
|
42
42
|
"publishConfig": {
|
|
43
43
|
"access": "public"
|
|
44
44
|
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"go": "node scripts/go.mjs",
|
|
47
|
+
"bootstrap": "pnpm install && playwright install chromium",
|
|
48
|
+
"signin": "tsx scripts/login.ts",
|
|
49
|
+
"status": "tsx scripts/status.ts",
|
|
50
|
+
"reset": "tsx scripts/cli.ts reset",
|
|
51
|
+
"asrun": "tsx scripts/cli.ts",
|
|
52
|
+
"report": "tsx scripts/report.ts",
|
|
53
|
+
"heal:evidence": "node scripts/heal-evidence.mjs",
|
|
54
|
+
"explore": "tsx scripts/explore.ts",
|
|
55
|
+
"cleanup": "tsx scripts/cleanup.ts",
|
|
56
|
+
"case:new": "tsx scripts/new-case.ts",
|
|
57
|
+
"case:check": "tsx scripts/check-cases.ts",
|
|
58
|
+
"spec:lint": "tsx scripts/lint-specs.ts",
|
|
59
|
+
"baselines:review": "tsx scripts/review-baselines.ts",
|
|
60
|
+
"pdf:render": "tsx scripts/render-pdf.ts",
|
|
61
|
+
"demo:up": "node scripts/demo.mjs up",
|
|
62
|
+
"demo:build": "node scripts/demo.mjs build",
|
|
63
|
+
"demo:seed": "node scripts/demo.mjs seed",
|
|
64
|
+
"demo:reset": "node scripts/demo.mjs reset",
|
|
65
|
+
"demo:down": "node scripts/demo.mjs down",
|
|
66
|
+
"demo:logs": "node scripts/demo.mjs logs",
|
|
67
|
+
"demo:status": "node scripts/demo.mjs status",
|
|
68
|
+
"typecheck": "tsc --noEmit && tsc --noEmit -p ui/tsconfig.json",
|
|
69
|
+
"ui": "tsx scripts/ui.ts",
|
|
70
|
+
"ui:build": "tsx scripts/ui-build.ts",
|
|
71
|
+
"ui:dev": "tsx scripts/ui-dev.ts",
|
|
72
|
+
"build": "tsx scripts/build.ts",
|
|
73
|
+
"prepare": "pnpm build && pnpm ui:build",
|
|
74
|
+
"prepack": "pnpm build && pnpm ui:build",
|
|
75
|
+
"verify:pack": "node scripts/verify-pack.mjs"
|
|
76
|
+
},
|
|
45
77
|
"peerDependencies": {
|
|
46
78
|
"@playwright/test": "^1.64.0"
|
|
47
79
|
},
|
|
@@ -88,33 +120,5 @@
|
|
|
88
120
|
},
|
|
89
121
|
"optionalDependencies": {
|
|
90
122
|
"ffmpeg-static": "^5.3.0"
|
|
91
|
-
},
|
|
92
|
-
"scripts": {
|
|
93
|
-
"go": "node scripts/go.mjs",
|
|
94
|
-
"bootstrap": "pnpm install && playwright install chromium",
|
|
95
|
-
"signin": "tsx scripts/login.ts",
|
|
96
|
-
"status": "tsx scripts/status.ts",
|
|
97
|
-
"asrun": "tsx scripts/cli.ts",
|
|
98
|
-
"report": "tsx scripts/report.ts",
|
|
99
|
-
"heal:evidence": "node scripts/heal-evidence.mjs",
|
|
100
|
-
"explore": "tsx scripts/explore.ts",
|
|
101
|
-
"cleanup": "tsx scripts/cleanup.ts",
|
|
102
|
-
"case:new": "tsx scripts/new-case.ts",
|
|
103
|
-
"case:check": "tsx scripts/check-cases.ts",
|
|
104
|
-
"spec:lint": "tsx scripts/lint-specs.ts",
|
|
105
|
-
"baselines:review": "tsx scripts/review-baselines.ts",
|
|
106
|
-
"pdf:render": "tsx scripts/render-pdf.ts",
|
|
107
|
-
"demo:up": "node scripts/demo.mjs up",
|
|
108
|
-
"demo:build": "node scripts/demo.mjs build",
|
|
109
|
-
"demo:seed": "node scripts/demo.mjs seed",
|
|
110
|
-
"demo:reset": "node scripts/demo.mjs reset",
|
|
111
|
-
"demo:down": "node scripts/demo.mjs down",
|
|
112
|
-
"demo:logs": "node scripts/demo.mjs logs",
|
|
113
|
-
"demo:status": "node scripts/demo.mjs status",
|
|
114
|
-
"typecheck": "tsc --noEmit && tsc --noEmit -p ui/tsconfig.json",
|
|
115
|
-
"ui": "tsx scripts/ui.ts",
|
|
116
|
-
"ui:build": "tsx scripts/ui-build.ts",
|
|
117
|
-
"ui:dev": "tsx scripts/ui-dev.ts",
|
|
118
|
-
"build": "tsx scripts/build.ts"
|
|
119
123
|
}
|
|
120
|
-
}
|
|
124
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
{
|
|
2
|
-
"sandbox": {
|
|
3
|
-
"excludedCommands": ["pnpm asrun *", "pnpm status *", "pnpm heal:evidence *", "tail *", "head *"]
|
|
4
|
-
}
|
|
5
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"sandbox": {
|
|
3
|
+
"excludedCommands": ["pnpm asrun *", "pnpm status *", "pnpm heal:evidence *", "tail *", "head *"]
|
|
4
|
+
}
|
|
5
|
+
}
|
package/templates/CLAUDE.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@AGENTS.md
|
|
1
|
+
@AGENTS.md
|
package/templates/gitignore
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
# >>> asrun (generated by `pnpm asrun init`; keep these lines)
|
|
2
|
-
# Saved logins are equivalent to passwords: never commit or share them.
|
|
3
|
-
.auth/
|
|
4
|
-
reports/
|
|
5
|
-
.tmp/
|
|
6
|
-
.explore/
|
|
7
|
-
test-results/
|
|
8
|
-
playwright-report/
|
|
9
|
-
.playwright-mcp/
|
|
10
|
-
# Local settings: ASRUN_ROOT and machine-specific values.
|
|
11
|
-
.env
|
|
12
|
-
.env.*
|
|
13
|
-
# <<< asrun
|
|
1
|
+
# >>> asrun (generated by `pnpm asrun init`; keep these lines)
|
|
2
|
+
# Saved logins are equivalent to passwords: never commit or share them.
|
|
3
|
+
.auth/
|
|
4
|
+
reports/
|
|
5
|
+
.tmp/
|
|
6
|
+
.explore/
|
|
7
|
+
test-results/
|
|
8
|
+
playwright-report/
|
|
9
|
+
.playwright-mcp/
|
|
10
|
+
# Local settings: ASRUN_ROOT and machine-specific values.
|
|
11
|
+
.env
|
|
12
|
+
.env.*
|
|
13
|
+
# <<< asrun
|
package/templates/package.json
CHANGED
|
@@ -1,31 +1,33 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "my-project",
|
|
3
|
-
"private": true,
|
|
4
|
-
"type": "module",
|
|
5
|
-
"engines": {
|
|
6
|
-
"node": ">=22"
|
|
7
|
-
},
|
|
8
|
-
"scripts": {
|
|
9
|
-
"go": "asrun go",
|
|
10
|
-
"asrun": "asrun",
|
|
11
|
-
"signin": "asrun signin",
|
|
12
|
-
"status": "asrun status",
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"case:
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"ui
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
"@
|
|
29
|
-
"
|
|
30
|
-
|
|
31
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "my-project",
|
|
3
|
+
"private": true,
|
|
4
|
+
"type": "module",
|
|
5
|
+
"engines": {
|
|
6
|
+
"node": ">=22"
|
|
7
|
+
},
|
|
8
|
+
"scripts": {
|
|
9
|
+
"go": "asrun go",
|
|
10
|
+
"asrun": "asrun",
|
|
11
|
+
"signin": "asrun signin",
|
|
12
|
+
"status": "asrun status",
|
|
13
|
+
"reset": "asrun reset",
|
|
14
|
+
"report": "asrun report",
|
|
15
|
+
"heal:evidence": "asrun heal:evidence",
|
|
16
|
+
"explore": "asrun explore",
|
|
17
|
+
"cleanup": "asrun cleanup",
|
|
18
|
+
"case:new": "asrun case:new",
|
|
19
|
+
"case:check": "asrun case:check",
|
|
20
|
+
"spec:lint": "asrun spec:lint",
|
|
21
|
+
"baselines:review": "asrun baselines:review",
|
|
22
|
+
"pdf:render": "asrun pdf:render",
|
|
23
|
+
"typecheck": "tsc --noEmit",
|
|
24
|
+
"ui": "asrun ui",
|
|
25
|
+
"ui:dev": "asrun ui:dev"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@asrunjs/asrun": "{{asrun}}",
|
|
29
|
+
"@playwright/test": "1.64.1",
|
|
30
|
+
"@types/node": "^22.20.5",
|
|
31
|
+
"typescript": "^7.0.2"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
// Generated by `pnpm asrun init`. The real configuration is `{{framework}}/dist/playwright.config.js`; it resolves the
|
|
2
|
-
// workspace root (this folder) itself, so `pnpm asrun` finds `tests/`, `profiles.yaml` and `reports/` here.
|
|
3
|
-
export {default} from '{{framework}}/dist/playwright.config.js';
|
|
1
|
+
// Generated by `pnpm asrun init`. The real configuration is `{{framework}}/dist/playwright.config.js`; it resolves the
|
|
2
|
+
// workspace root (this folder) itself, so `pnpm asrun` finds `tests/`, `profiles.yaml` and `reports/` here.
|
|
3
|
+
export {default} from '{{framework}}/dist/playwright.config.js';
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
# `asrun` is a normal devDependency; this file
|
|
2
|
-
#
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
# `asrun` is a normal devDependency; this file approves the build scripts its dependencies run
|
|
2
|
+
# (esbuild through tsx and ffmpeg-static compile a binary on install) and exempts the framework
|
|
3
|
+
# from pnpm's 24-hour release age, so a fresh release installs right away.
|
|
4
|
+
allowBuilds:
|
|
5
|
+
esbuild: true
|
|
6
|
+
ffmpeg-static: true
|
|
7
|
+
minimumReleaseAgeExclude:
|
|
8
|
+
- '@asrunjs/asrun'
|
package/templates/seed.spec.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {test} from '@asrunjs/asrun/fixtures';
|
|
2
|
-
|
|
3
|
-
test.use({mustLogin: false});
|
|
4
|
-
|
|
5
|
-
// Used by the Playwright MCP agents to open a ready-to-use page for the current profile.
|
|
6
|
-
// Not a real test: `pnpm asrun` skips anything tagged @seed.
|
|
7
|
-
test('seed @seed', async ({page}) => {
|
|
8
|
-
await page.goto('/');
|
|
9
|
-
});
|
|
1
|
+
import {test} from '@asrunjs/asrun/fixtures';
|
|
2
|
+
|
|
3
|
+
test.use({mustLogin: false});
|
|
4
|
+
|
|
5
|
+
// Used by the Playwright MCP agents to open a ready-to-use page for the current profile.
|
|
6
|
+
// Not a real test: `pnpm asrun` skips anything tagged @seed.
|
|
7
|
+
test('seed @seed', async ({page}) => {
|
|
8
|
+
await page.goto('/');
|
|
9
|
+
});
|
package/templates/tsconfig.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "ESNext",
|
|
5
|
-
"moduleResolution": "bundler",
|
|
6
|
-
"strict": true,
|
|
7
|
-
"noEmit": true,
|
|
8
|
-
"skipLibCheck": true,
|
|
9
|
-
"esModuleInterop": true,
|
|
10
|
-
"resolveJsonModule": true,
|
|
11
|
-
"types": ["node"]
|
|
12
|
-
},
|
|
13
|
-
"include": ["tests", "playwright.config.ts"]
|
|
14
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "bundler",
|
|
6
|
+
"strict": true,
|
|
7
|
+
"noEmit": true,
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"resolveJsonModule": true,
|
|
11
|
+
"types": ["node"]
|
|
12
|
+
},
|
|
13
|
+
"include": ["tests", "playwright.config.ts"]
|
|
14
|
+
}
|
package/ui/dist/favicon.svg
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
|
2
|
-
<g transform="rotate(-3 32 32)">
|
|
3
|
-
<rect x="5" y="5" width="54" height="54" rx="6" fill="#b5443a"/>
|
|
4
|
-
<rect x="8" y="8" width="48" height="48" rx="4" fill="none" stroke="#f6f2e9" stroke-opacity="0.32" stroke-width="2"/>
|
|
5
|
-
<polygon fill="#f6f2e9" points="30.6,15 33.4,15 22,48 19,48"/>
|
|
6
|
-
<polygon fill="#f6f2e9" points="29.2,15 34.8,15 46.5,48 40.5,48"/>
|
|
7
|
-
<rect fill="#f6f2e9" x="24.5" y="36.5" width="15" height="2.6"/>
|
|
8
|
-
<rect fill="#f6f2e9" x="15" y="47" width="12" height="2.6"/>
|
|
9
|
-
<rect fill="#f6f2e9" x="36.5" y="47" width="13" height="2.6"/>
|
|
10
|
-
</g>
|
|
11
|
-
</svg>
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
|
2
|
+
<g transform="rotate(-3 32 32)">
|
|
3
|
+
<rect x="5" y="5" width="54" height="54" rx="6" fill="#b5443a"/>
|
|
4
|
+
<rect x="8" y="8" width="48" height="48" rx="4" fill="none" stroke="#f6f2e9" stroke-opacity="0.32" stroke-width="2"/>
|
|
5
|
+
<polygon fill="#f6f2e9" points="30.6,15 33.4,15 22,48 19,48"/>
|
|
6
|
+
<polygon fill="#f6f2e9" points="29.2,15 34.8,15 46.5,48 40.5,48"/>
|
|
7
|
+
<rect fill="#f6f2e9" x="24.5" y="36.5" width="15" height="2.6"/>
|
|
8
|
+
<rect fill="#f6f2e9" x="15" y="47" width="12" height="2.6"/>
|
|
9
|
+
<rect fill="#f6f2e9" x="36.5" y="47" width="13" height="2.6"/>
|
|
10
|
+
</g>
|
|
11
|
+
</svg>
|
package/ui/dist/logos/claude.svg
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z"/></svg>
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z"/></svg>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M16 6H8v12h8V6zm4 16H4V2h16v20z"/></svg>
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M16 6H8v12h8V6zm4 16H4V2h16v20z"/></svg>
|