@itmetsam/samurai-framework 0.1.0 → 0.2.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/README.md +129 -0
- package/bin/samurai.mjs +31 -0
- package/dist/api.js +3 -0
- package/dist/assert/assertion-error.d.ts +23 -0
- package/dist/assert/assertion-error.js +45 -0
- package/dist/assert/expect.d.ts +55 -0
- package/dist/assert/expect.js +188 -0
- package/dist/browser/browser-context.d.ts +91 -0
- package/dist/browser/browser-context.js +146 -0
- package/dist/browser/browser-finder.d.ts +2 -0
- package/dist/browser/browser-finder.js +95 -0
- package/dist/browser/browser.d.ts +95 -0
- package/dist/browser/browser.js +372 -0
- package/dist/browser/context-tree.d.ts +23 -0
- package/dist/browser/context-tree.js +60 -0
- package/dist/browser/dialog.d.ts +37 -0
- package/dist/browser/dialog.js +61 -0
- package/dist/browser/download.d.ts +71 -0
- package/dist/browser/download.js +137 -0
- package/dist/browser/downloads-dir.d.ts +8 -0
- package/dist/browser/downloads-dir.js +38 -0
- package/dist/browser/emulation.d.ts +61 -0
- package/dist/browser/emulation.js +144 -0
- package/dist/browser/file-chooser.d.ts +39 -0
- package/dist/browser/file-chooser.js +86 -0
- package/dist/browser/file-paths.d.ts +4 -0
- package/dist/browser/file-paths.js +18 -0
- package/dist/browser/index.d.ts +4 -0
- package/dist/browser/index.js +4 -0
- package/dist/browser/navigation-error.d.ts +13 -0
- package/dist/browser/navigation-error.js +19 -0
- package/dist/browser/page-logs.d.ts +86 -0
- package/dist/browser/page-logs.js +149 -0
- package/dist/browser/page-wait.d.ts +9 -0
- package/dist/browser/page-wait.js +17 -0
- package/dist/browser/page.d.ts +370 -0
- package/dist/browser/page.js +1038 -0
- package/dist/browser/pdf.d.ts +72 -0
- package/dist/browser/pdf.js +37 -0
- package/dist/browser/screenshot.d.ts +29 -0
- package/dist/browser/screenshot.js +42 -0
- package/dist/cli/args.d.ts +35 -0
- package/dist/cli/args.js +69 -0
- package/dist/cli/cli.cli-test.d.ts +1 -0
- package/dist/cli/cli.cli-test.js +170 -0
- package/dist/cli/console-reporter.d.ts +15 -0
- package/dist/cli/console-reporter.js +52 -0
- package/dist/cli/init.d.ts +7 -0
- package/dist/cli/init.js +61 -0
- package/dist/cli/main.d.ts +12 -0
- package/dist/cli/main.js +156 -0
- package/dist/config/config.d.ts +24 -0
- package/dist/config/config.js +42 -0
- package/dist/config/default.d.ts +2 -0
- package/dist/config/default.js +3 -0
- package/dist/config/mask.d.ts +11 -0
- package/dist/config/mask.js +85 -0
- package/dist/config/run-settings.d.ts +28 -0
- package/dist/config/run-settings.js +61 -0
- package/dist/config/secrets.d.ts +10 -0
- package/dist/config/secrets.js +67 -0
- package/dist/config/variables.d.ts +11 -0
- package/dist/config/variables.js +26 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +15 -0
- package/dist/locator/action-timeout-error.d.ts +25 -0
- package/dist/locator/action-timeout-error.js +35 -0
- package/dist/locator/element-state.d.ts +44 -0
- package/dist/locator/element-state.js +109 -0
- package/dist/locator/label-locator.d.ts +13 -0
- package/dist/locator/label-locator.js +49 -0
- package/dist/locator/locator.d.ts +168 -0
- package/dist/locator/locator.js +591 -0
- package/dist/locator/selector-errors.d.ts +9 -0
- package/dist/locator/selector-errors.js +15 -0
- package/dist/locator/selector.d.ts +60 -0
- package/dist/locator/selector.js +113 -0
- package/dist/locator/text-locator.d.ts +13 -0
- package/dist/logger/index.d.ts +2 -0
- package/dist/logger/index.js +30 -0
- package/dist/network/data-collector.d.ts +26 -0
- package/dist/network/data-collector.js +77 -0
- package/dist/network/network-tracker.d.ts +94 -0
- package/dist/network/network-tracker.js +198 -0
- package/dist/network/network-wait.d.ts +16 -0
- package/dist/network/network-wait.js +24 -0
- package/dist/network/response.d.ts +22 -0
- package/dist/network/response.js +42 -0
- package/dist/network/router.d.ts +120 -0
- package/dist/network/router.js +343 -0
- package/dist/network/url-match.d.ts +8 -0
- package/dist/network/url-match.js +38 -0
- package/dist/recorder/apply.d.ts +3 -0
- package/dist/recorder/apply.js +10 -0
- package/dist/recorder/capture.d.ts +18 -0
- package/dist/recorder/capture.js +198 -0
- package/dist/recorder/index.d.ts +3 -0
- package/dist/recorder/index.js +3 -0
- package/dist/recorder/normalise.d.ts +68 -0
- package/dist/recorder/normalise.js +104 -0
- package/dist/recorder/ranking.d.ts +9 -0
- package/dist/recorder/ranking.js +21 -0
- package/dist/recorder/recorder.d.ts +52 -0
- package/dist/recorder/recorder.js +143 -0
- package/dist/recorder/session.d.ts +49 -0
- package/dist/recorder/session.js +113 -0
- package/dist/runner/module-type.d.ts +6 -0
- package/dist/runner/module-type.js +29 -0
- package/dist/runner/page-logs-report.d.ts +40 -0
- package/dist/runner/page-logs-report.js +44 -0
- package/dist/runner/prepare-run.d.ts +14 -0
- package/dist/runner/prepare-run.js +20 -0
- package/dist/runner/project.d.ts +17 -0
- package/dist/runner/project.js +33 -0
- package/dist/runner/registry.d.ts +7 -0
- package/dist/runner/registry.js +40 -0
- package/dist/runner/reporter.d.ts +43 -0
- package/dist/runner/reporter.js +83 -0
- package/dist/runner/run.d.ts +27 -0
- package/dist/runner/run.js +34 -0
- package/dist/runner/test-error.d.ts +3 -0
- package/dist/runner/test-error.js +18 -0
- package/dist/runner/test-runner.d.ts +44 -0
- package/dist/runner/test-runner.js +205 -0
- package/dist/script/call-function.d.ts +34 -0
- package/dist/script/call-function.js +71 -0
- package/dist/script/element-handle.d.ts +10 -0
- package/{src/script/element-handle.ts → dist/script/element-handle.js} +4 -4
- package/dist/script/helpers.d.ts +28 -0
- package/dist/script/helpers.js +50 -0
- package/dist/script/preload.d.ts +31 -0
- package/dist/script/preload.js +71 -0
- package/dist/script/serialize.d.ts +29 -0
- package/dist/script/serialize.js +207 -0
- package/dist/steps/build.d.ts +5 -0
- package/dist/steps/build.js +38 -0
- package/dist/steps/edit.d.ts +30 -0
- package/dist/steps/edit.js +80 -0
- package/dist/steps/emit.d.ts +6 -0
- package/dist/steps/emit.js +73 -0
- package/dist/steps/index.d.ts +5 -0
- package/dist/steps/index.js +4 -0
- package/dist/steps/model.d.ts +103 -0
- package/dist/steps/model.js +1 -0
- package/dist/steps/parse.d.ts +3 -0
- package/dist/steps/parse.js +272 -0
- package/dist/transport/bidi-connection.d.ts +46 -0
- package/dist/transport/bidi-connection.js +176 -0
- package/dist/transport/bidi-error.d.ts +10 -0
- package/dist/transport/bidi-error.js +10 -0
- package/dist/transport/subscriptions.d.ts +36 -0
- package/dist/transport/subscriptions.js +81 -0
- package/{src → dist}/types/test.d.ts +10 -4
- package/dist/wait/wait-until.d.ts +20 -0
- package/dist/wait/wait-until.js +63 -0
- package/package.json +44 -7
- package/.claude/settings.local.json +0 -7
- package/.env.example +0 -3
- package/.github/actions/setup/action.yml +0 -16
- package/.github/workflows/ci.yml +0 -71
- package/.trunk/configs/.markdownlint.yaml +0 -2
- package/.trunk/configs/.yamllint.yaml +0 -7
- package/.trunk/configs/svgo.config.mjs +0 -14
- package/.trunk/trunk.yaml +0 -34
- package/docs/superpowers/bidi-roadmap.md +0 -60
- package/docs/superpowers/plans/2026-09-29-auto-wait.md +0 -1827
- package/docs/superpowers/plans/2026-09-29-expect.md +0 -1350
- package/docs/superpowers/plans/2026-10-01-ci.md +0 -350
- package/docs/superpowers/plans/2026-10-01-test-api-alignment.md +0 -1821
- package/docs/superpowers/recorder-roadmap.md +0 -52
- package/docs/superpowers/specs/2026-09-29-auto-wait-design.md +0 -185
- package/docs/superpowers/specs/2026-09-29-bidi-foundation-design.md +0 -130
- package/docs/superpowers/specs/2026-09-29-contexts-and-storage-design.md +0 -88
- package/docs/superpowers/specs/2026-09-29-downloads-and-file-dialogs-design.md +0 -94
- package/docs/superpowers/specs/2026-09-29-emulation-design.md +0 -88
- package/docs/superpowers/specs/2026-09-29-expect-design.md +0 -130
- package/docs/superpowers/specs/2026-09-29-locate-nodes-design.md +0 -90
- package/docs/superpowers/specs/2026-09-29-logs-and-errors-design.md +0 -87
- package/docs/superpowers/specs/2026-09-29-navigation-waits-design.md +0 -83
- package/docs/superpowers/specs/2026-09-29-network-data-design.md +0 -78
- package/docs/superpowers/specs/2026-09-29-network-interception-design.md +0 -91
- package/docs/superpowers/specs/2026-09-29-network-tracking-design.md +0 -86
- package/docs/superpowers/specs/2026-09-29-page-api-design.md +0 -90
- package/docs/superpowers/specs/2026-09-29-preload-scripts-design.md +0 -82
- package/docs/superpowers/specs/2026-09-29-script-call-function-design.md +0 -107
- package/docs/superpowers/specs/2026-09-29-set-files-design.md +0 -62
- package/docs/superpowers/specs/2026-09-29-user-prompts-design.md +0 -75
- package/docs/superpowers/specs/2026-10-01-ci-design.md +0 -106
- package/docs/superpowers/specs/2026-10-01-test-api-alignment-design.md +0 -241
- package/public/logo-dark.svg +0 -236
- package/public/logo-light.svg +0 -262
- package/samurai.config.ts +0 -7
- package/src/assert/assertion-error.test.ts +0 -55
- package/src/assert/assertion-error.ts +0 -62
- package/src/assert/expect-locator.test.ts +0 -217
- package/src/assert/expect.test.ts +0 -73
- package/src/assert/expect.ts +0 -299
- package/src/browser/browser-context.browser-test.ts +0 -201
- package/src/browser/browser-context.test.ts +0 -407
- package/src/browser/browser-context.ts +0 -208
- package/src/browser/browser-finder.ts +0 -110
- package/src/browser/browser.test.ts +0 -88
- package/src/browser/browser.ts +0 -515
- package/src/browser/context-tree.test.ts +0 -86
- package/src/browser/context-tree.ts +0 -70
- package/src/browser/dialog.browser-test.ts +0 -144
- package/src/browser/dialog.test.ts +0 -322
- package/src/browser/dialog.ts +0 -83
- package/src/browser/download.test.ts +0 -161
- package/src/browser/download.ts +0 -172
- package/src/browser/downloads-dir.test.ts +0 -75
- package/src/browser/downloads-dir.ts +0 -39
- package/src/browser/emulation.browser-test.ts +0 -186
- package/src/browser/emulation.test.ts +0 -200
- package/src/browser/emulation.ts +0 -204
- package/src/browser/file-chooser.test.ts +0 -142
- package/src/browser/file-chooser.ts +0 -99
- package/src/browser/file-paths.ts +0 -18
- package/src/browser/goto.browser-test.ts +0 -44
- package/src/browser/navigation-error.ts +0 -26
- package/src/browser/navigation.browser-test.ts +0 -172
- package/src/browser/page-api.browser-test.ts +0 -228
- package/src/browser/page-logs.browser-test.ts +0 -119
- package/src/browser/page-logs.test.ts +0 -212
- package/src/browser/page-logs.ts +0 -208
- package/src/browser/page-wait.ts +0 -19
- package/src/browser/page.test.ts +0 -1567
- package/src/browser/page.ts +0 -1176
- package/src/browser/pdf.ts +0 -62
- package/src/browser/screenshot.ts +0 -65
- package/src/browser/transfers.browser-test.ts +0 -180
- package/src/config/config.ts +0 -33
- package/src/config/default.ts +0 -5
- package/src/config/fixtures.test.ts +0 -137
- package/src/config/mask.test.ts +0 -143
- package/src/config/mask.ts +0 -87
- package/src/config/run-settings.test.ts +0 -163
- package/src/config/run-settings.ts +0 -114
- package/src/config/secrets.ts +0 -70
- package/src/config/variables.ts +0 -31
- package/src/index.ts +0 -10
- package/src/locator/action-timeout-error.test.ts +0 -83
- package/src/locator/action-timeout-error.ts +0 -72
- package/src/locator/element-state.test.ts +0 -181
- package/src/locator/element-state.ts +0 -159
- package/src/locator/locate-nodes.browser-test.ts +0 -169
- package/src/locator/locator-actions.test.ts +0 -355
- package/src/locator/locator-chain.test.ts +0 -292
- package/src/locator/locator.browser-test.ts +0 -137
- package/src/locator/locator.test.ts +0 -179
- package/src/locator/locator.ts +0 -656
- package/src/locator/selector-errors.ts +0 -18
- package/src/locator/selector.test.ts +0 -124
- package/src/locator/selector.ts +0 -107
- package/src/locator/set-files.browser-test.ts +0 -141
- package/src/locator/set-files.test.ts +0 -191
- package/src/locator/text-locator.test.ts +0 -118
- package/src/logger/index.test.ts +0 -28
- package/src/logger/index.ts +0 -40
- package/src/network/data-collector.test.ts +0 -111
- package/src/network/data-collector.ts +0 -92
- package/src/network/network-data.browser-test.ts +0 -192
- package/src/network/network-tracker.browser-test.ts +0 -151
- package/src/network/network-tracker.test.ts +0 -307
- package/src/network/network-tracker.ts +0 -286
- package/src/network/network-wait.ts +0 -28
- package/src/network/response.test.ts +0 -93
- package/src/network/response.ts +0 -58
- package/src/network/router.browser-test.ts +0 -260
- package/src/network/router.test.ts +0 -528
- package/src/network/router.ts +0 -420
- package/src/network/url-match.test.ts +0 -69
- package/src/network/url-match.ts +0 -41
- package/src/runner/page-logs-report.test.ts +0 -144
- package/src/runner/page-logs-report.ts +0 -82
- package/src/runner/prepare-run.test.ts +0 -33
- package/src/runner/prepare-run.ts +0 -36
- package/src/runner/registry.test.ts +0 -59
- package/src/runner/registry.ts +0 -46
- package/src/runner/reporter.test.ts +0 -73
- package/src/runner/reporter.ts +0 -109
- package/src/runner/test-error.test.ts +0 -39
- package/src/runner/test-error.ts +0 -20
- package/src/runner/test-runner.ts +0 -184
- package/src/script/call-function.browser-test.ts +0 -112
- package/src/script/call-function.test.ts +0 -174
- package/src/script/call-function.ts +0 -113
- package/src/script/helpers.test.ts +0 -116
- package/src/script/helpers.ts +0 -68
- package/src/script/preload.browser-test.ts +0 -144
- package/src/script/preload.test.ts +0 -180
- package/src/script/preload.ts +0 -102
- package/src/script/serialize.test.ts +0 -182
- package/src/script/serialize.ts +0 -203
- package/src/testing/browser-fixture.ts +0 -18
- package/src/testing/fake-websocket.ts +0 -72
- package/src/testing/stub-connector.ts +0 -154
- package/src/tests/index.spec.ts +0 -30
- package/src/transport/bidi-connection.test.ts +0 -155
- package/src/transport/bidi-connection.ts +0 -256
- package/src/transport/bidi-error.ts +0 -23
- package/src/transport/foundation.browser-test.ts +0 -73
- package/src/transport/subscriptions.test.ts +0 -140
- package/src/transport/subscriptions.ts +0 -110
- package/src/types/bidi-commands.test-d.ts +0 -55
- package/src/wait/wait-until.test.ts +0 -117
- package/src/wait/wait-until.ts +0 -86
- package/tsconfig.json +0 -44
- /package/{src/api.ts → dist/api.d.ts} +0 -0
- /package/{src/locator/text-locator.ts → dist/locator/text-locator.js} +0 -0
- /package/{src → dist}/types/bidi-modules/browser.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/browsing-context.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/emulation.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/input.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/log.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/network.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/permissions.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/script.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/session.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/storage.d.ts +0 -0
- /package/{src → dist}/types/bidi-modules/web-extensions.d.ts +0 -0
- /package/{src → dist}/types/bidi-protocols/command.d.ts +0 -0
- /package/{src → dist}/types/bidi-protocols/error.d.ts +0 -0
- /package/{src → dist}/types/bidi-protocols/event.d.ts +0 -0
- /package/{src → dist}/types/bidi.d.ts +0 -0
- /package/{src → dist}/types/browser.d.ts +0 -0
- /package/{src → dist}/types/config.d.ts +0 -0
- /package/{src → dist}/types/env.d.ts +0 -0
|
@@ -1,350 +0,0 @@
|
|
|
1
|
-
# CI Implementation Plan
|
|
2
|
-
|
|
3
|
-
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
|
4
|
-
|
|
5
|
-
**Goal:** GitHub Actions runs the typecheck, unit tests, browser tests (Firefox) and Trunk's code quality checks on every push to `main` and every pull request, using bun.
|
|
6
|
-
|
|
7
|
-
**Architecture:** One workflow, `.github/workflows/ci.yml`, with four parallel jobs on `ubuntu-latest`. The three code jobs share a local composite action (`.github/actions/setup`) that installs bun 1.3.0, Node 26 and the locked dependencies. The `trunk` job uses `trunk-io/trunk-action@v1` with the repository's committed `.trunk/trunk.yaml`, checking only changed files.
|
|
8
|
-
|
|
9
|
-
**Tech Stack:** GitHub Actions, bun 1.3.0, Node 26, tsx + Node's test runner (existing scripts), Firefox (preinstalled on the runner), Trunk CLI 1.25.0.
|
|
10
|
-
|
|
11
|
-
**Spec:** `docs/superpowers/specs/2026-10-01-ci-design.md`
|
|
12
|
-
|
|
13
|
-
## Global Constraints
|
|
14
|
-
|
|
15
|
-
- bun, not npm: `bun install --frozen-lockfile`, `bun run <script>`, `bunx <bin>`. Never `npm`/`npx` in the workflow. Never replace `bun run test` with `bun test`.
|
|
16
|
-
- `oven-sh/setup-bun@v2` with `bun-version: 1.3.0`; `actions/setup-node@v4` with `node-version: 26`; `actions/checkout@v4`; `actions/upload-artifact@v4`; `trunk-io/trunk-action@v1`.
|
|
17
|
-
- Triggers: `push` to `main` and `pull_request`. `concurrency: { group: ci-${{ github.ref }}, cancel-in-progress: true }`. Workflow `permissions: contents: read`; the `trunk` job adds `checks: write`.
|
|
18
|
-
- Job ids, names and timeouts: `typecheck` "Typecheck" 5 min; `unit` "Unit tests" 10 min; `browser` "Browser tests (Firefox)" 15 min; `trunk` "Code quality (Trunk)" 15 min. All `runs-on: ubuntu-latest`.
|
|
19
|
-
- Browser job: a separate `firefox --version` step before `bun run test:browser`; on failure upload `logs/` and `result/` as artifact `browser-test-logs`, `retention-days: 7`, `if-no-files-found: ignore`.
|
|
20
|
-
- Trunk checks changed files only (the action's default); no `--all`.
|
|
21
|
-
- No changes to `src/`, `package.json` scripts or `bun.lock`.
|
|
22
|
-
- Never run `bun run dev` / `src/index.ts` / `src/tests/index.spec.ts`: the example spec submits a real contact form.
|
|
23
|
-
- A Trunk pre-commit hook formats staged files and a pre-push hook runs `trunk check`; let them run, and commit what they format.
|
|
24
|
-
- Commit messages end with `Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>`. Stage only the files a task names; never `git add -A`.
|
|
25
|
-
|
|
26
|
-
## Review Focus
|
|
27
|
-
|
|
28
|
-
1. **`bun.lock` out of sync with `package.json`** — CI must fail at install with bun's frozen-lockfile error, not later with a missing module. Pinned in Task 2 Step 4 (local `bun install --frozen-lockfile` run, the exact command CI uses).
|
|
29
|
-
2. **A browser run that hangs** — the job must stop at its `timeout-minutes`, not after GitHub's 6-hour default. Pinned in Task 2 Step 3 (actionlint check) and Step 6 (grep for every job's timeout).
|
|
30
|
-
3. **Trunk's own tool folders committed by accident** (`.trunk/tools`, `.trunk/logs`, `.trunk/out` …) — they are large and machine-specific. Pinned in Task 1 Step 2 (`git check-ignore` on each).
|
|
31
|
-
4. **Trunk's yamllint rejecting the workflow's `on:` key** (the `truthy` rule) — the `trunk` job would fail on its own workflow. Pinned in Task 3 Step 3 (local `trunk check` on the workflow, with the exact config fix if it fires).
|
|
32
|
-
5. **A red CI run diagnosed by guessing** — every failing job on GitHub is read from its log (and the browser artifact) before any fix. Pinned in Task 4 Steps 3–4.
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## File Structure
|
|
37
|
-
|
|
38
|
-
| File | Status | Responsibility |
|
|
39
|
-
| ---------------------------------- | ------------------------------------- | --------------------------------------------------------------------- |
|
|
40
|
-
| `.trunk/trunk.yaml` | commit (exists, untracked) | Trunk CLI version, linters, hooks — shared by local hooks and CI |
|
|
41
|
-
| `.trunk/.gitignore` | commit (exists, untracked) | keeps Trunk's caches out of git |
|
|
42
|
-
| `.trunk/configs/svgo.config.mjs` | commit (exists, untracked) | svgo linter config |
|
|
43
|
-
| `.github/actions/setup/action.yml` | create | composite action: bun 1.3.0, Node 26, `bun install --frozen-lockfile` |
|
|
44
|
-
| `.github/workflows/ci.yml` | create | triggers, concurrency, the four jobs |
|
|
45
|
-
| `.trunk/configs/.yamllint.yaml` | create only if Task 3 Step 3 needs it | yamllint rules for GitHub workflow syntax |
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
### Task 1: Commit the Trunk configuration
|
|
50
|
-
|
|
51
|
-
**Files:**
|
|
52
|
-
|
|
53
|
-
- Commit: `.trunk/trunk.yaml`, `.trunk/.gitignore`, `.trunk/configs/svgo.config.mjs`
|
|
54
|
-
|
|
55
|
-
**Interfaces:**
|
|
56
|
-
|
|
57
|
-
- Produces: a tracked `.trunk/trunk.yaml` that the `trunk` job (Task 3) reads.
|
|
58
|
-
|
|
59
|
-
- [ ] **Step 1: See what Trunk would add**
|
|
60
|
-
|
|
61
|
-
Run: `git status --short --untracked-files=all .trunk`
|
|
62
|
-
Expected: exactly these three lines (Trunk's `.gitignore` hides the rest):
|
|
63
|
-
|
|
64
|
-
```text
|
|
65
|
-
?? .trunk/.gitignore
|
|
66
|
-
?? .trunk/configs/svgo.config.mjs
|
|
67
|
-
?? .trunk/trunk.yaml
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
If more files show up, stop and report them instead of committing.
|
|
71
|
-
|
|
72
|
-
- [ ] **Step 2: Check Trunk's caches stay ignored**
|
|
73
|
-
|
|
74
|
-
Run: `for d in actions logs notifications out plugins tools; do git check-ignore -q .trunk/$d && echo "ignored $d" || echo "NOT IGNORED $d"; done`
|
|
75
|
-
Expected: six `ignored …` lines.
|
|
76
|
-
|
|
77
|
-
- [ ] **Step 3: Commit**
|
|
78
|
-
|
|
79
|
-
```bash
|
|
80
|
-
git add .trunk/trunk.yaml .trunk/.gitignore .trunk/configs/svgo.config.mjs
|
|
81
|
-
git commit -m "chore: commit Trunk configuration
|
|
82
|
-
|
|
83
|
-
The same trunk.yaml drives the local pre-commit/pre-push hooks and
|
|
84
|
-
the CI code quality job.
|
|
85
|
-
|
|
86
|
-
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>"
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Expected: the pre-commit hook may format the files; the commit succeeds.
|
|
90
|
-
|
|
91
|
-
---
|
|
92
|
-
|
|
93
|
-
### Task 2: Workflow with typecheck, unit and browser jobs
|
|
94
|
-
|
|
95
|
-
**Files:**
|
|
96
|
-
|
|
97
|
-
- Create: `.github/actions/setup/action.yml`
|
|
98
|
-
- Create: `.github/workflows/ci.yml`
|
|
99
|
-
|
|
100
|
-
**Interfaces:**
|
|
101
|
-
|
|
102
|
-
- Consumes: package scripts `test` and `test:browser` (unchanged), `bun.lock`.
|
|
103
|
-
- Produces: `.github/workflows/ci.yml` with top-level `name`, `on`, `concurrency`, `permissions` and a `jobs:` map containing `typecheck`, `unit`, `browser`. Task 3 appends a `trunk` job to that map.
|
|
104
|
-
|
|
105
|
-
- [ ] **Step 1: Write the shared setup action**
|
|
106
|
-
|
|
107
|
-
Create `.github/actions/setup/action.yml`:
|
|
108
|
-
|
|
109
|
-
```yaml
|
|
110
|
-
name: Setup
|
|
111
|
-
description: Install bun, Node and the locked dependencies
|
|
112
|
-
|
|
113
|
-
runs:
|
|
114
|
-
using: composite
|
|
115
|
-
steps:
|
|
116
|
-
- uses: oven-sh/setup-bun@v2
|
|
117
|
-
with:
|
|
118
|
-
bun-version: 1.3.0
|
|
119
|
-
# The test scripts run tsx on Node's test runner, which needs Node 22+ (fs/promises glob)
|
|
120
|
-
- uses: actions/setup-node@v4
|
|
121
|
-
with:
|
|
122
|
-
node-version: 26
|
|
123
|
-
- name: Install dependencies
|
|
124
|
-
shell: bash
|
|
125
|
-
run: bun install --frozen-lockfile
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
- [ ] **Step 2: Write the workflow**
|
|
129
|
-
|
|
130
|
-
Create `.github/workflows/ci.yml`:
|
|
131
|
-
|
|
132
|
-
```yaml
|
|
133
|
-
name: CI
|
|
134
|
-
|
|
135
|
-
on:
|
|
136
|
-
push:
|
|
137
|
-
branches: [main]
|
|
138
|
-
pull_request:
|
|
139
|
-
|
|
140
|
-
concurrency:
|
|
141
|
-
group: ci-${{ github.ref }}
|
|
142
|
-
cancel-in-progress: true
|
|
143
|
-
|
|
144
|
-
permissions:
|
|
145
|
-
contents: read
|
|
146
|
-
|
|
147
|
-
jobs:
|
|
148
|
-
typecheck:
|
|
149
|
-
name: Typecheck
|
|
150
|
-
runs-on: ubuntu-latest
|
|
151
|
-
timeout-minutes: 5
|
|
152
|
-
steps:
|
|
153
|
-
- uses: actions/checkout@v4
|
|
154
|
-
- uses: ./.github/actions/setup
|
|
155
|
-
- name: Typecheck
|
|
156
|
-
run: bunx tsc --noEmit -p .
|
|
157
|
-
|
|
158
|
-
unit:
|
|
159
|
-
name: Unit tests
|
|
160
|
-
runs-on: ubuntu-latest
|
|
161
|
-
timeout-minutes: 10
|
|
162
|
-
steps:
|
|
163
|
-
- uses: actions/checkout@v4
|
|
164
|
-
- uses: ./.github/actions/setup
|
|
165
|
-
- name: Unit tests
|
|
166
|
-
run: bun run test
|
|
167
|
-
|
|
168
|
-
browser:
|
|
169
|
-
name: Browser tests (Firefox)
|
|
170
|
-
runs-on: ubuntu-latest
|
|
171
|
-
timeout-minutes: 15
|
|
172
|
-
steps:
|
|
173
|
-
- uses: actions/checkout@v4
|
|
174
|
-
- uses: ./.github/actions/setup
|
|
175
|
-
- name: Firefox version
|
|
176
|
-
run: firefox --version
|
|
177
|
-
- name: Browser tests
|
|
178
|
-
run: bun run test:browser
|
|
179
|
-
- name: Upload logs
|
|
180
|
-
if: failure()
|
|
181
|
-
uses: actions/upload-artifact@v4
|
|
182
|
-
with:
|
|
183
|
-
name: browser-test-logs
|
|
184
|
-
path: |
|
|
185
|
-
logs/
|
|
186
|
-
result/
|
|
187
|
-
retention-days: 7
|
|
188
|
-
if-no-files-found: ignore
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
- [ ] **Step 3: Lint the workflow with actionlint**
|
|
192
|
-
|
|
193
|
-
Run: `docker run --rm -v "$PWD:/repo" -w /repo rhysd/actionlint:latest -color`
|
|
194
|
-
Expected: no output, exit 0. (actionlint resolves the local `./.github/actions/setup` action and checks `timeout-minutes`, expressions and action inputs.) If Docker is not running, say so in the report and rely on Step 5 plus the GitHub run in Task 4.
|
|
195
|
-
|
|
196
|
-
- [ ] **Step 4: Run each job's commands locally with bun**
|
|
197
|
-
|
|
198
|
-
Run, in order, and record each exit code:
|
|
199
|
-
|
|
200
|
-
```bash
|
|
201
|
-
bun install --frozen-lockfile
|
|
202
|
-
bunx tsc --noEmit -p .
|
|
203
|
-
bun run test
|
|
204
|
-
perl -e 'alarm 900; exec @ARGV' bun run test:browser
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
Expected: install reports no changes; tsc prints nothing; `bun run test` ends with `ℹ fail 0`; `bun run test:browser` ends with `ℹ fail 0`. After the browser run, `ps -Ao command | grep browsers/profiles/firefox | grep -v grep` prints nothing. If `result/report.json` changed, restore it: `git checkout -- result/report.json`.
|
|
208
|
-
|
|
209
|
-
- [ ] **Step 5: Trunk-check the new files**
|
|
210
|
-
|
|
211
|
-
Run: `trunk check .github/actions/setup/action.yml .github/workflows/ci.yml`
|
|
212
|
-
Expected: `No issues`, or only formatting that `trunk fmt` fixes (then run `trunk fmt` on the two files and re-check). Any yamllint `truthy` finding on `on:` is handled in Task 3 Step 3, not here — note it in the report.
|
|
213
|
-
|
|
214
|
-
- [ ] **Step 6: Confirm every job has a timeout**
|
|
215
|
-
|
|
216
|
-
Run: `grep -c "timeout-minutes" .github/workflows/ci.yml`
|
|
217
|
-
Expected: `3`.
|
|
218
|
-
|
|
219
|
-
- [ ] **Step 7: Commit**
|
|
220
|
-
|
|
221
|
-
```bash
|
|
222
|
-
git add .github/actions/setup/action.yml .github/workflows/ci.yml
|
|
223
|
-
git commit -m "ci: typecheck, unit and browser tests on GitHub Actions
|
|
224
|
-
|
|
225
|
-
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>"
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
---
|
|
229
|
-
|
|
230
|
-
### Task 3: Trunk code quality job
|
|
231
|
-
|
|
232
|
-
**Files:**
|
|
233
|
-
|
|
234
|
-
- Modify: `.github/workflows/ci.yml` (append to `jobs:`)
|
|
235
|
-
- Create (only if Step 3 requires it): `.trunk/configs/.yamllint.yaml`
|
|
236
|
-
|
|
237
|
-
**Interfaces:**
|
|
238
|
-
|
|
239
|
-
- Consumes: the `jobs:` map from Task 2; `.trunk/trunk.yaml` from Task 1.
|
|
240
|
-
|
|
241
|
-
- [ ] **Step 1: Append the job**
|
|
242
|
-
|
|
243
|
-
Add the `trunk` job at the end of `.github/workflows/ci.yml`, inside `jobs:`, indented like `browser:` (two spaces). Shown here under its parent so the indentation is unambiguous — add only the `trunk:` block:
|
|
244
|
-
|
|
245
|
-
```yaml
|
|
246
|
-
jobs:
|
|
247
|
-
# typecheck, unit and browser from Task 2 stay above, unchanged
|
|
248
|
-
trunk:
|
|
249
|
-
name: Code quality (Trunk)
|
|
250
|
-
runs-on: ubuntu-latest
|
|
251
|
-
timeout-minutes: 15
|
|
252
|
-
permissions:
|
|
253
|
-
contents: read
|
|
254
|
-
checks: write
|
|
255
|
-
steps:
|
|
256
|
-
- uses: actions/checkout@v4
|
|
257
|
-
# Checks only what the PR or push changed; linters come from .trunk/trunk.yaml
|
|
258
|
-
- uses: trunk-io/trunk-action@v1
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
- [ ] **Step 2: Lint the workflow with actionlint**
|
|
262
|
-
|
|
263
|
-
Run: `docker run --rm -v "$PWD:/repo" -w /repo rhysd/actionlint:latest -color`
|
|
264
|
-
Expected: no output, exit 0.
|
|
265
|
-
|
|
266
|
-
- [ ] **Step 3: Run Trunk on the workflow the way CI will**
|
|
267
|
-
|
|
268
|
-
Run: `trunk check .github/workflows/ci.yml .github/actions/setup/action.yml .trunk/trunk.yaml`
|
|
269
|
-
Expected: `No issues`.
|
|
270
|
-
|
|
271
|
-
If yamllint reports `truthy value should be one of [false, true]` on the `on:` line, create `.trunk/configs/.yamllint.yaml`:
|
|
272
|
-
|
|
273
|
-
```yaml
|
|
274
|
-
extends: default
|
|
275
|
-
rules:
|
|
276
|
-
# GitHub Actions' trigger key is `on:`
|
|
277
|
-
truthy:
|
|
278
|
-
allowed-values: ["true", "false"]
|
|
279
|
-
check-keys: false
|
|
280
|
-
document-start: disable
|
|
281
|
-
line-length: disable
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
then re-run the same `trunk check` command. Expected: `No issues`. Any other finding: fix the workflow (not the linter config) and say what you changed.
|
|
285
|
-
|
|
286
|
-
- [ ] **Step 4: Confirm every job has a timeout**
|
|
287
|
-
|
|
288
|
-
Run: `grep -c "timeout-minutes" .github/workflows/ci.yml`
|
|
289
|
-
Expected: `4`.
|
|
290
|
-
|
|
291
|
-
- [ ] **Step 5: Commit**
|
|
292
|
-
|
|
293
|
-
```bash
|
|
294
|
-
git add .github/workflows/ci.yml
|
|
295
|
-
# only if Step 3 created it:
|
|
296
|
-
git add .trunk/configs/.yamllint.yaml
|
|
297
|
-
git commit -m "ci: run Trunk code quality checks on changed files
|
|
298
|
-
|
|
299
|
-
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>"
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
---
|
|
303
|
-
|
|
304
|
-
### Task 4: First run on GitHub
|
|
305
|
-
|
|
306
|
-
**Files:** none (verification; fixes found here go back to the task that owns the file).
|
|
307
|
-
|
|
308
|
-
- [ ] **Step 1: Push the branch**
|
|
309
|
-
|
|
310
|
-
```bash
|
|
311
|
-
git push -u origin ci/github-actions
|
|
312
|
-
```
|
|
313
|
-
|
|
314
|
-
Expected: the pre-push hook runs `trunk check` and passes; the push succeeds.
|
|
315
|
-
|
|
316
|
-
- [ ] **Step 2: Open the PR against the PR #6 branch**
|
|
317
|
-
|
|
318
|
-
```bash
|
|
319
|
-
gh pr create --base feat/test-api-alignment --head ci/github-actions \
|
|
320
|
-
--title "ci: typecheck, unit, browser and Trunk checks on GitHub Actions" \
|
|
321
|
-
--body-file <(printf '%s\n' \
|
|
322
|
-
"Adds GitHub Actions CI (spec: docs/superpowers/specs/2026-10-01-ci-design.md)." "" \
|
|
323
|
-
"- **typecheck**: \`bunx tsc --noEmit -p .\`" \
|
|
324
|
-
"- **unit**: \`bun run test\`" \
|
|
325
|
-
"- **browser**: \`bun run test:browser\` on the runner's Firefox; logs uploaded on failure" \
|
|
326
|
-
"- **trunk**: Trunk checks on changed files (\`.trunk/trunk.yaml\` is now committed)" "" \
|
|
327
|
-
"Based on #6; GitHub retargets this PR to \`main\` when #6 merges." "" \
|
|
328
|
-
"🤖 Generated with [Claude Code](https://claude.com/claude-code)")
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
Expected: a PR URL.
|
|
332
|
-
|
|
333
|
-
- [ ] **Step 3: Watch the run**
|
|
334
|
-
|
|
335
|
-
```bash
|
|
336
|
-
gh run watch "$(gh run list --branch ci/github-actions --workflow CI --limit 1 --json databaseId --jq '.[0].databaseId')" --exit-status
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
Expected: all four jobs succeed.
|
|
340
|
-
|
|
341
|
-
- [ ] **Step 4: If a job fails, read before fixing**
|
|
342
|
-
|
|
343
|
-
```bash
|
|
344
|
-
RUN=$(gh run list --branch ci/github-actions --workflow CI --limit 1 --json databaseId --jq '.[0].databaseId')
|
|
345
|
-
gh run view "$RUN" --log-failed | tail -100
|
|
346
|
-
# browser job only:
|
|
347
|
-
gh run download "$RUN" -n browser-test-logs -D /tmp/browser-test-logs
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
Report the failing job, the error lines and the Firefox version from the `Firefox version` step. Fix only with evidence from the log; a Firefox-version-specific failure is reported (the spec's mitigation is a follow-up pin), not patched blindly.
|