@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.
Files changed (328) hide show
  1. package/README.md +129 -0
  2. package/bin/samurai.mjs +31 -0
  3. package/dist/api.js +3 -0
  4. package/dist/assert/assertion-error.d.ts +23 -0
  5. package/dist/assert/assertion-error.js +45 -0
  6. package/dist/assert/expect.d.ts +55 -0
  7. package/dist/assert/expect.js +188 -0
  8. package/dist/browser/browser-context.d.ts +91 -0
  9. package/dist/browser/browser-context.js +146 -0
  10. package/dist/browser/browser-finder.d.ts +2 -0
  11. package/dist/browser/browser-finder.js +95 -0
  12. package/dist/browser/browser.d.ts +95 -0
  13. package/dist/browser/browser.js +372 -0
  14. package/dist/browser/context-tree.d.ts +23 -0
  15. package/dist/browser/context-tree.js +60 -0
  16. package/dist/browser/dialog.d.ts +37 -0
  17. package/dist/browser/dialog.js +61 -0
  18. package/dist/browser/download.d.ts +71 -0
  19. package/dist/browser/download.js +137 -0
  20. package/dist/browser/downloads-dir.d.ts +8 -0
  21. package/dist/browser/downloads-dir.js +38 -0
  22. package/dist/browser/emulation.d.ts +61 -0
  23. package/dist/browser/emulation.js +144 -0
  24. package/dist/browser/file-chooser.d.ts +39 -0
  25. package/dist/browser/file-chooser.js +86 -0
  26. package/dist/browser/file-paths.d.ts +4 -0
  27. package/dist/browser/file-paths.js +18 -0
  28. package/dist/browser/index.d.ts +4 -0
  29. package/dist/browser/index.js +4 -0
  30. package/dist/browser/navigation-error.d.ts +13 -0
  31. package/dist/browser/navigation-error.js +19 -0
  32. package/dist/browser/page-logs.d.ts +86 -0
  33. package/dist/browser/page-logs.js +149 -0
  34. package/dist/browser/page-wait.d.ts +9 -0
  35. package/dist/browser/page-wait.js +17 -0
  36. package/dist/browser/page.d.ts +370 -0
  37. package/dist/browser/page.js +1038 -0
  38. package/dist/browser/pdf.d.ts +72 -0
  39. package/dist/browser/pdf.js +37 -0
  40. package/dist/browser/screenshot.d.ts +29 -0
  41. package/dist/browser/screenshot.js +42 -0
  42. package/dist/cli/args.d.ts +35 -0
  43. package/dist/cli/args.js +69 -0
  44. package/dist/cli/cli.cli-test.d.ts +1 -0
  45. package/dist/cli/cli.cli-test.js +170 -0
  46. package/dist/cli/console-reporter.d.ts +15 -0
  47. package/dist/cli/console-reporter.js +52 -0
  48. package/dist/cli/init.d.ts +7 -0
  49. package/dist/cli/init.js +61 -0
  50. package/dist/cli/main.d.ts +12 -0
  51. package/dist/cli/main.js +156 -0
  52. package/dist/config/config.d.ts +24 -0
  53. package/dist/config/config.js +42 -0
  54. package/dist/config/default.d.ts +2 -0
  55. package/dist/config/default.js +3 -0
  56. package/dist/config/mask.d.ts +11 -0
  57. package/dist/config/mask.js +85 -0
  58. package/dist/config/run-settings.d.ts +28 -0
  59. package/dist/config/run-settings.js +61 -0
  60. package/dist/config/secrets.d.ts +10 -0
  61. package/dist/config/secrets.js +67 -0
  62. package/dist/config/variables.d.ts +11 -0
  63. package/dist/config/variables.js +26 -0
  64. package/dist/index.d.ts +1 -0
  65. package/dist/index.js +15 -0
  66. package/dist/locator/action-timeout-error.d.ts +25 -0
  67. package/dist/locator/action-timeout-error.js +35 -0
  68. package/dist/locator/element-state.d.ts +44 -0
  69. package/dist/locator/element-state.js +109 -0
  70. package/dist/locator/label-locator.d.ts +13 -0
  71. package/dist/locator/label-locator.js +49 -0
  72. package/dist/locator/locator.d.ts +168 -0
  73. package/dist/locator/locator.js +591 -0
  74. package/dist/locator/selector-errors.d.ts +9 -0
  75. package/dist/locator/selector-errors.js +15 -0
  76. package/dist/locator/selector.d.ts +60 -0
  77. package/dist/locator/selector.js +113 -0
  78. package/dist/locator/text-locator.d.ts +13 -0
  79. package/dist/logger/index.d.ts +2 -0
  80. package/dist/logger/index.js +30 -0
  81. package/dist/network/data-collector.d.ts +26 -0
  82. package/dist/network/data-collector.js +77 -0
  83. package/dist/network/network-tracker.d.ts +94 -0
  84. package/dist/network/network-tracker.js +198 -0
  85. package/dist/network/network-wait.d.ts +16 -0
  86. package/dist/network/network-wait.js +24 -0
  87. package/dist/network/response.d.ts +22 -0
  88. package/dist/network/response.js +42 -0
  89. package/dist/network/router.d.ts +120 -0
  90. package/dist/network/router.js +343 -0
  91. package/dist/network/url-match.d.ts +8 -0
  92. package/dist/network/url-match.js +38 -0
  93. package/dist/recorder/apply.d.ts +3 -0
  94. package/dist/recorder/apply.js +10 -0
  95. package/dist/recorder/capture.d.ts +18 -0
  96. package/dist/recorder/capture.js +198 -0
  97. package/dist/recorder/index.d.ts +3 -0
  98. package/dist/recorder/index.js +3 -0
  99. package/dist/recorder/normalise.d.ts +68 -0
  100. package/dist/recorder/normalise.js +104 -0
  101. package/dist/recorder/ranking.d.ts +9 -0
  102. package/dist/recorder/ranking.js +21 -0
  103. package/dist/recorder/recorder.d.ts +52 -0
  104. package/dist/recorder/recorder.js +143 -0
  105. package/dist/recorder/session.d.ts +49 -0
  106. package/dist/recorder/session.js +113 -0
  107. package/dist/runner/module-type.d.ts +6 -0
  108. package/dist/runner/module-type.js +29 -0
  109. package/dist/runner/page-logs-report.d.ts +40 -0
  110. package/dist/runner/page-logs-report.js +44 -0
  111. package/dist/runner/prepare-run.d.ts +14 -0
  112. package/dist/runner/prepare-run.js +20 -0
  113. package/dist/runner/project.d.ts +17 -0
  114. package/dist/runner/project.js +33 -0
  115. package/dist/runner/registry.d.ts +7 -0
  116. package/dist/runner/registry.js +40 -0
  117. package/dist/runner/reporter.d.ts +43 -0
  118. package/dist/runner/reporter.js +83 -0
  119. package/dist/runner/run.d.ts +27 -0
  120. package/dist/runner/run.js +34 -0
  121. package/dist/runner/test-error.d.ts +3 -0
  122. package/dist/runner/test-error.js +18 -0
  123. package/dist/runner/test-runner.d.ts +44 -0
  124. package/dist/runner/test-runner.js +205 -0
  125. package/dist/script/call-function.d.ts +34 -0
  126. package/dist/script/call-function.js +71 -0
  127. package/dist/script/element-handle.d.ts +10 -0
  128. package/{src/script/element-handle.ts → dist/script/element-handle.js} +4 -4
  129. package/dist/script/helpers.d.ts +28 -0
  130. package/dist/script/helpers.js +50 -0
  131. package/dist/script/preload.d.ts +31 -0
  132. package/dist/script/preload.js +71 -0
  133. package/dist/script/serialize.d.ts +29 -0
  134. package/dist/script/serialize.js +207 -0
  135. package/dist/steps/build.d.ts +5 -0
  136. package/dist/steps/build.js +38 -0
  137. package/dist/steps/edit.d.ts +30 -0
  138. package/dist/steps/edit.js +80 -0
  139. package/dist/steps/emit.d.ts +6 -0
  140. package/dist/steps/emit.js +73 -0
  141. package/dist/steps/index.d.ts +5 -0
  142. package/dist/steps/index.js +4 -0
  143. package/dist/steps/model.d.ts +103 -0
  144. package/dist/steps/model.js +1 -0
  145. package/dist/steps/parse.d.ts +3 -0
  146. package/dist/steps/parse.js +272 -0
  147. package/dist/transport/bidi-connection.d.ts +46 -0
  148. package/dist/transport/bidi-connection.js +176 -0
  149. package/dist/transport/bidi-error.d.ts +10 -0
  150. package/dist/transport/bidi-error.js +10 -0
  151. package/dist/transport/subscriptions.d.ts +36 -0
  152. package/dist/transport/subscriptions.js +81 -0
  153. package/{src → dist}/types/test.d.ts +10 -4
  154. package/dist/wait/wait-until.d.ts +20 -0
  155. package/dist/wait/wait-until.js +63 -0
  156. package/package.json +44 -7
  157. package/.claude/settings.local.json +0 -7
  158. package/.env.example +0 -3
  159. package/.github/actions/setup/action.yml +0 -16
  160. package/.github/workflows/ci.yml +0 -71
  161. package/.trunk/configs/.markdownlint.yaml +0 -2
  162. package/.trunk/configs/.yamllint.yaml +0 -7
  163. package/.trunk/configs/svgo.config.mjs +0 -14
  164. package/.trunk/trunk.yaml +0 -34
  165. package/docs/superpowers/bidi-roadmap.md +0 -60
  166. package/docs/superpowers/plans/2026-09-29-auto-wait.md +0 -1827
  167. package/docs/superpowers/plans/2026-09-29-expect.md +0 -1350
  168. package/docs/superpowers/plans/2026-10-01-ci.md +0 -350
  169. package/docs/superpowers/plans/2026-10-01-test-api-alignment.md +0 -1821
  170. package/docs/superpowers/recorder-roadmap.md +0 -52
  171. package/docs/superpowers/specs/2026-09-29-auto-wait-design.md +0 -185
  172. package/docs/superpowers/specs/2026-09-29-bidi-foundation-design.md +0 -130
  173. package/docs/superpowers/specs/2026-09-29-contexts-and-storage-design.md +0 -88
  174. package/docs/superpowers/specs/2026-09-29-downloads-and-file-dialogs-design.md +0 -94
  175. package/docs/superpowers/specs/2026-09-29-emulation-design.md +0 -88
  176. package/docs/superpowers/specs/2026-09-29-expect-design.md +0 -130
  177. package/docs/superpowers/specs/2026-09-29-locate-nodes-design.md +0 -90
  178. package/docs/superpowers/specs/2026-09-29-logs-and-errors-design.md +0 -87
  179. package/docs/superpowers/specs/2026-09-29-navigation-waits-design.md +0 -83
  180. package/docs/superpowers/specs/2026-09-29-network-data-design.md +0 -78
  181. package/docs/superpowers/specs/2026-09-29-network-interception-design.md +0 -91
  182. package/docs/superpowers/specs/2026-09-29-network-tracking-design.md +0 -86
  183. package/docs/superpowers/specs/2026-09-29-page-api-design.md +0 -90
  184. package/docs/superpowers/specs/2026-09-29-preload-scripts-design.md +0 -82
  185. package/docs/superpowers/specs/2026-09-29-script-call-function-design.md +0 -107
  186. package/docs/superpowers/specs/2026-09-29-set-files-design.md +0 -62
  187. package/docs/superpowers/specs/2026-09-29-user-prompts-design.md +0 -75
  188. package/docs/superpowers/specs/2026-10-01-ci-design.md +0 -106
  189. package/docs/superpowers/specs/2026-10-01-test-api-alignment-design.md +0 -241
  190. package/public/logo-dark.svg +0 -236
  191. package/public/logo-light.svg +0 -262
  192. package/samurai.config.ts +0 -7
  193. package/src/assert/assertion-error.test.ts +0 -55
  194. package/src/assert/assertion-error.ts +0 -62
  195. package/src/assert/expect-locator.test.ts +0 -217
  196. package/src/assert/expect.test.ts +0 -73
  197. package/src/assert/expect.ts +0 -299
  198. package/src/browser/browser-context.browser-test.ts +0 -201
  199. package/src/browser/browser-context.test.ts +0 -407
  200. package/src/browser/browser-context.ts +0 -208
  201. package/src/browser/browser-finder.ts +0 -110
  202. package/src/browser/browser.test.ts +0 -88
  203. package/src/browser/browser.ts +0 -515
  204. package/src/browser/context-tree.test.ts +0 -86
  205. package/src/browser/context-tree.ts +0 -70
  206. package/src/browser/dialog.browser-test.ts +0 -144
  207. package/src/browser/dialog.test.ts +0 -322
  208. package/src/browser/dialog.ts +0 -83
  209. package/src/browser/download.test.ts +0 -161
  210. package/src/browser/download.ts +0 -172
  211. package/src/browser/downloads-dir.test.ts +0 -75
  212. package/src/browser/downloads-dir.ts +0 -39
  213. package/src/browser/emulation.browser-test.ts +0 -186
  214. package/src/browser/emulation.test.ts +0 -200
  215. package/src/browser/emulation.ts +0 -204
  216. package/src/browser/file-chooser.test.ts +0 -142
  217. package/src/browser/file-chooser.ts +0 -99
  218. package/src/browser/file-paths.ts +0 -18
  219. package/src/browser/goto.browser-test.ts +0 -44
  220. package/src/browser/navigation-error.ts +0 -26
  221. package/src/browser/navigation.browser-test.ts +0 -172
  222. package/src/browser/page-api.browser-test.ts +0 -228
  223. package/src/browser/page-logs.browser-test.ts +0 -119
  224. package/src/browser/page-logs.test.ts +0 -212
  225. package/src/browser/page-logs.ts +0 -208
  226. package/src/browser/page-wait.ts +0 -19
  227. package/src/browser/page.test.ts +0 -1567
  228. package/src/browser/page.ts +0 -1176
  229. package/src/browser/pdf.ts +0 -62
  230. package/src/browser/screenshot.ts +0 -65
  231. package/src/browser/transfers.browser-test.ts +0 -180
  232. package/src/config/config.ts +0 -33
  233. package/src/config/default.ts +0 -5
  234. package/src/config/fixtures.test.ts +0 -137
  235. package/src/config/mask.test.ts +0 -143
  236. package/src/config/mask.ts +0 -87
  237. package/src/config/run-settings.test.ts +0 -163
  238. package/src/config/run-settings.ts +0 -114
  239. package/src/config/secrets.ts +0 -70
  240. package/src/config/variables.ts +0 -31
  241. package/src/index.ts +0 -10
  242. package/src/locator/action-timeout-error.test.ts +0 -83
  243. package/src/locator/action-timeout-error.ts +0 -72
  244. package/src/locator/element-state.test.ts +0 -181
  245. package/src/locator/element-state.ts +0 -159
  246. package/src/locator/locate-nodes.browser-test.ts +0 -169
  247. package/src/locator/locator-actions.test.ts +0 -355
  248. package/src/locator/locator-chain.test.ts +0 -292
  249. package/src/locator/locator.browser-test.ts +0 -137
  250. package/src/locator/locator.test.ts +0 -179
  251. package/src/locator/locator.ts +0 -656
  252. package/src/locator/selector-errors.ts +0 -18
  253. package/src/locator/selector.test.ts +0 -124
  254. package/src/locator/selector.ts +0 -107
  255. package/src/locator/set-files.browser-test.ts +0 -141
  256. package/src/locator/set-files.test.ts +0 -191
  257. package/src/locator/text-locator.test.ts +0 -118
  258. package/src/logger/index.test.ts +0 -28
  259. package/src/logger/index.ts +0 -40
  260. package/src/network/data-collector.test.ts +0 -111
  261. package/src/network/data-collector.ts +0 -92
  262. package/src/network/network-data.browser-test.ts +0 -192
  263. package/src/network/network-tracker.browser-test.ts +0 -151
  264. package/src/network/network-tracker.test.ts +0 -307
  265. package/src/network/network-tracker.ts +0 -286
  266. package/src/network/network-wait.ts +0 -28
  267. package/src/network/response.test.ts +0 -93
  268. package/src/network/response.ts +0 -58
  269. package/src/network/router.browser-test.ts +0 -260
  270. package/src/network/router.test.ts +0 -528
  271. package/src/network/router.ts +0 -420
  272. package/src/network/url-match.test.ts +0 -69
  273. package/src/network/url-match.ts +0 -41
  274. package/src/runner/page-logs-report.test.ts +0 -144
  275. package/src/runner/page-logs-report.ts +0 -82
  276. package/src/runner/prepare-run.test.ts +0 -33
  277. package/src/runner/prepare-run.ts +0 -36
  278. package/src/runner/registry.test.ts +0 -59
  279. package/src/runner/registry.ts +0 -46
  280. package/src/runner/reporter.test.ts +0 -73
  281. package/src/runner/reporter.ts +0 -109
  282. package/src/runner/test-error.test.ts +0 -39
  283. package/src/runner/test-error.ts +0 -20
  284. package/src/runner/test-runner.ts +0 -184
  285. package/src/script/call-function.browser-test.ts +0 -112
  286. package/src/script/call-function.test.ts +0 -174
  287. package/src/script/call-function.ts +0 -113
  288. package/src/script/helpers.test.ts +0 -116
  289. package/src/script/helpers.ts +0 -68
  290. package/src/script/preload.browser-test.ts +0 -144
  291. package/src/script/preload.test.ts +0 -180
  292. package/src/script/preload.ts +0 -102
  293. package/src/script/serialize.test.ts +0 -182
  294. package/src/script/serialize.ts +0 -203
  295. package/src/testing/browser-fixture.ts +0 -18
  296. package/src/testing/fake-websocket.ts +0 -72
  297. package/src/testing/stub-connector.ts +0 -154
  298. package/src/tests/index.spec.ts +0 -30
  299. package/src/transport/bidi-connection.test.ts +0 -155
  300. package/src/transport/bidi-connection.ts +0 -256
  301. package/src/transport/bidi-error.ts +0 -23
  302. package/src/transport/foundation.browser-test.ts +0 -73
  303. package/src/transport/subscriptions.test.ts +0 -140
  304. package/src/transport/subscriptions.ts +0 -110
  305. package/src/types/bidi-commands.test-d.ts +0 -55
  306. package/src/wait/wait-until.test.ts +0 -117
  307. package/src/wait/wait-until.ts +0 -86
  308. package/tsconfig.json +0 -44
  309. /package/{src/api.ts → dist/api.d.ts} +0 -0
  310. /package/{src/locator/text-locator.ts → dist/locator/text-locator.js} +0 -0
  311. /package/{src → dist}/types/bidi-modules/browser.d.ts +0 -0
  312. /package/{src → dist}/types/bidi-modules/browsing-context.d.ts +0 -0
  313. /package/{src → dist}/types/bidi-modules/emulation.d.ts +0 -0
  314. /package/{src → dist}/types/bidi-modules/input.d.ts +0 -0
  315. /package/{src → dist}/types/bidi-modules/log.d.ts +0 -0
  316. /package/{src → dist}/types/bidi-modules/network.d.ts +0 -0
  317. /package/{src → dist}/types/bidi-modules/permissions.d.ts +0 -0
  318. /package/{src → dist}/types/bidi-modules/script.d.ts +0 -0
  319. /package/{src → dist}/types/bidi-modules/session.d.ts +0 -0
  320. /package/{src → dist}/types/bidi-modules/storage.d.ts +0 -0
  321. /package/{src → dist}/types/bidi-modules/web-extensions.d.ts +0 -0
  322. /package/{src → dist}/types/bidi-protocols/command.d.ts +0 -0
  323. /package/{src → dist}/types/bidi-protocols/error.d.ts +0 -0
  324. /package/{src → dist}/types/bidi-protocols/event.d.ts +0 -0
  325. /package/{src → dist}/types/bidi.d.ts +0 -0
  326. /package/{src → dist}/types/browser.d.ts +0 -0
  327. /package/{src → dist}/types/config.d.ts +0 -0
  328. /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.