@workerstack/repo 0.0.0-stage → 0.1.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 (438) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/LICENSE +21 -0
  3. package/README.md +0 -3
  4. package/agents/global-settings/antigravity.json +3 -0
  5. package/agents/global-settings/claude.json +6 -0
  6. package/agents/global-settings/codex.toml +2 -0
  7. package/agents/global-settings/cursor.json +3 -0
  8. package/agents/global-settings/grok.toml +36 -0
  9. package/agents/global-settings/manifest.json +36 -0
  10. package/agents/grok/hooks/orchestrate-parent.json +60 -0
  11. package/agents/grok/hooks/rtk.json +16 -0
  12. package/agents/grok/hooks/rulesync.json +3 -0
  13. package/agents/grok/roles/scout.toml +5 -0
  14. package/agents/hooks.jsonc +67 -0
  15. package/agents/mcp-policy.jsonc +16 -0
  16. package/agents/rules/overview.md +21 -0
  17. package/agents/settings/claude.json +5 -0
  18. package/agents/skills/ask/SKILL.md +13 -0
  19. package/agents/skills/auto/SKILL.md +13 -0
  20. package/agents/skills/away/SKILL.md +19 -0
  21. package/agents/skills/blast-radius/SKILL.md +54 -0
  22. package/agents/skills/bro/SKILL.md +9 -0
  23. package/agents/skills/browser/SKILL.md +16 -0
  24. package/agents/skills/clasp/SKILL.md +11 -0
  25. package/agents/skills/commit/SKILL.md +35 -0
  26. package/agents/skills/commit-and-push/SKILL.md +9 -0
  27. package/agents/skills/commit-push/SKILL.md +59 -0
  28. package/agents/skills/commit-push-deploy/SKILL.md +74 -0
  29. package/agents/skills/commit-push-release/SKILL.md +75 -0
  30. package/agents/skills/correct/SKILL.md +39 -0
  31. package/agents/skills/do/SKILL.md +21 -0
  32. package/agents/skills/explain/SKILL.md +13 -0
  33. package/agents/skills/google-workspace/SKILL.md +12 -0
  34. package/agents/skills/handoff/SKILL.md +81 -0
  35. package/agents/skills/implement-plan/SKILL.md +29 -0
  36. package/agents/skills/implement-roadmap/SKILL.md +27 -0
  37. package/agents/skills/jev/SKILL.md +17 -0
  38. package/agents/skills/listen/SKILL.md +15 -0
  39. package/agents/skills/pickup/SKILL.md +58 -0
  40. package/agents/skills/principle-attack-the-premise/SKILL.md +24 -0
  41. package/agents/skills/principle-boundary-discipline/SKILL.md +38 -0
  42. package/agents/skills/principle-build-the-lever/SKILL.md +28 -0
  43. package/agents/skills/principle-encode-lessons-in-structure/SKILL.md +15 -0
  44. package/agents/skills/principle-exhaust-the-design-space/SKILL.md +12 -0
  45. package/agents/skills/principle-experience-first/SKILL.md +22 -0
  46. package/agents/skills/principle-explain-the-number/SKILL.md +21 -0
  47. package/agents/skills/principle-fix-root-causes/SKILL.md +24 -0
  48. package/agents/skills/principle-foundational-thinking/SKILL.md +25 -0
  49. package/agents/skills/principle-guard-the-context-window/SKILL.md +16 -0
  50. package/agents/skills/principle-laziness-protocol/SKILL.md +13 -0
  51. package/agents/skills/principle-make-operations-idempotent/SKILL.md +25 -0
  52. package/agents/skills/principle-migrate-callers-then-delete-legacy-apis/SKILL.md +18 -0
  53. package/agents/skills/principle-minimize-reader-load/SKILL.md +22 -0
  54. package/agents/skills/principle-model-the-domain/SKILL.md +26 -0
  55. package/agents/skills/principle-never-block-on-the-human/SKILL.md +17 -0
  56. package/agents/skills/principle-outcome-oriented-execution/SKILL.md +25 -0
  57. package/agents/skills/principle-prove-it-works/SKILL.md +25 -0
  58. package/agents/skills/principle-redesign-from-first-principles/SKILL.md +18 -0
  59. package/agents/skills/principle-separate-before-serializing-shared-state/SKILL.md +20 -0
  60. package/agents/skills/principle-sequence-verifiable-units/SKILL.md +22 -0
  61. package/agents/skills/principle-subtract-before-you-add/SKILL.md +21 -0
  62. package/agents/skills/principle-test-behavior-not-implementation/SKILL.md +24 -0
  63. package/agents/skills/principle-type-system-discipline/SKILL.md +17 -0
  64. package/agents/skills/review-plan/SKILL.md +28 -0
  65. package/agents/skills/review-roadmap/SKILL.md +28 -0
  66. package/agents/skills/show-me/SKILL.md +21 -0
  67. package/agents/skills/speak/SKILL.md +15 -0
  68. package/agents/skills/su/SKILL.md +11 -0
  69. package/agents/skills/teach/SKILL.md +25 -0
  70. package/agents/skills/tmp/SKILL.md +54 -0
  71. package/agents/skills/typescript-best-practices/SKILL.md +32 -0
  72. package/agents/skills/typescript-best-practices/references/patterns.md +328 -0
  73. package/agents/skills/unslop/SKILL.md +62 -0
  74. package/agents/skills/write-plan/SKILL.md +33 -0
  75. package/agents/skills/write-roadmap/SKILL.md +66 -0
  76. package/agents/subagents/implementer-deep.md +57 -0
  77. package/agents/subagents/implementer-fast.md +57 -0
  78. package/agents/subagents/orchestrator.md +43 -0
  79. package/agents/subagents/researcher.md +47 -0
  80. package/agents/subagents/scout.md +44 -0
  81. package/bin/repo.ts +4 -0
  82. package/cli/actionlint-default.test.ts +38 -0
  83. package/cli/actionlint-download.test.ts +162 -0
  84. package/cli/actionlint-real.test.ts +33 -0
  85. package/cli/actionlint.constants.ts +43 -0
  86. package/cli/actionlint.test.ts +108 -0
  87. package/cli/actionlint.ts +178 -0
  88. package/cli/bin.test.ts +54 -0
  89. package/cli/bin.ts +40 -0
  90. package/cli/check-changelog.test.ts +40 -0
  91. package/cli/check-changelog.ts +12 -0
  92. package/cli/check-comments.test.ts +157 -0
  93. package/cli/check-comments.ts +123 -0
  94. package/cli/check-env-modules.test.ts +85 -0
  95. package/cli/check-env-modules.ts +56 -0
  96. package/cli/check-magic.test.ts +139 -0
  97. package/cli/check-magic.ts +120 -0
  98. package/cli/check-manifests.constants.ts +4 -0
  99. package/cli/check-manifests.test.ts +210 -0
  100. package/cli/check-manifests.ts +71 -0
  101. package/cli/check-nightly.test.ts +103 -0
  102. package/cli/check-nightly.ts +37 -0
  103. package/cli/check-ratchets-missing.test.ts +46 -0
  104. package/cli/check-ratchets-mutation.test.ts +49 -0
  105. package/cli/check-ratchets.constants.ts +20 -0
  106. package/cli/check-ratchets.test.ts +190 -0
  107. package/cli/check-ratchets.ts +193 -0
  108. package/cli/check-rejections.test.ts +220 -0
  109. package/cli/check-rejections.ts +153 -0
  110. package/cli/check-reports.ts +37 -0
  111. package/cli/check-tsconfig.test.ts +507 -0
  112. package/cli/check-tsconfig.ts +205 -0
  113. package/cli/commands.test.ts +114 -0
  114. package/cli/commands.ts +218 -0
  115. package/cli/commit-changelog.ts +27 -0
  116. package/cli/commit-msg-changelog.test.ts +93 -0
  117. package/cli/commit-msg-range.test.ts +126 -0
  118. package/cli/commit-msg-red-proof.test.ts +147 -0
  119. package/cli/commit-msg-repo.test.ts +153 -0
  120. package/cli/commit-msg.test.ts +101 -0
  121. package/cli/commit-msg.ts +194 -0
  122. package/cli/commit-range.constants.ts +17 -0
  123. package/cli/commit-range.ts +57 -0
  124. package/cli/config-knip.test.ts +70 -0
  125. package/cli/config-nightly.test.ts +84 -0
  126. package/cli/config-tdd.test.ts +46 -0
  127. package/cli/config.test.ts +576 -0
  128. package/cli/config.ts +261 -0
  129. package/cli/conventional.ts +9 -0
  130. package/cli/coverage-config.ts +62 -0
  131. package/cli/coverage.constants.ts +6 -0
  132. package/cli/coverage.test.ts +199 -0
  133. package/cli/coverage.ts +127 -0
  134. package/cli/env.constants.ts +10 -0
  135. package/cli/env.test.ts +56 -0
  136. package/cli/env.ts +72 -0
  137. package/cli/fixtures/base-config.ts +13 -0
  138. package/cli/fixtures/gate-world.ts +48 -0
  139. package/cli/fixtures/knip-run.ts +38 -0
  140. package/cli/fixtures/mutate-fakes.ts +137 -0
  141. package/cli/fixtures/planted-repo.ts +50 -0
  142. package/cli/fixtures/publish-world.ts +71 -0
  143. package/cli/fixtures/red-proof-repo.ts +72 -0
  144. package/cli/fixtures/release-context.ts +15 -0
  145. package/cli/fixtures/release-world.ts +111 -0
  146. package/cli/fixtures/stub-bin.ts +40 -0
  147. package/cli/guard-diagnostics.test.ts +157 -0
  148. package/cli/guard-diagnostics.ts +195 -0
  149. package/cli/init.test.ts +487 -0
  150. package/cli/init.ts +275 -0
  151. package/cli/knip-check-ignores.test.ts +106 -0
  152. package/cli/knip-check-real.test.ts +65 -0
  153. package/cli/knip-check.constants.ts +46 -0
  154. package/cli/knip-check.test.ts +114 -0
  155. package/cli/knip-check.ts +169 -0
  156. package/cli/knip-schema.ts +67 -0
  157. package/cli/known-failures.constants.ts +22 -0
  158. package/cli/known-failures.test.ts +138 -0
  159. package/cli/known-failures.ts +131 -0
  160. package/cli/lint/as-needs-reason.ts +41 -0
  161. package/cli/lint/boundaries.ts +73 -0
  162. package/cli/lint/class-file.ts +39 -0
  163. package/cli/lint/config-file.ts +32 -0
  164. package/cli/lint/entry-file.ts +54 -0
  165. package/cli/lint/env-in-config.ts +66 -0
  166. package/cli/lint/filename-matches-export.ts +63 -0
  167. package/cli/lint/index-file.ts +22 -0
  168. package/cli/lint/index.ts +47 -0
  169. package/cli/lint/is-reason.ts +6 -0
  170. package/cli/lint/manifest.ts +46 -0
  171. package/cli/lint/names.ts +59 -0
  172. package/cli/lint/no-commented-out-code.ts +105 -0
  173. package/cli/lint/no-mock-of-subject.ts +64 -0
  174. package/cli/lint/no-module-side-effects.ts +94 -0
  175. package/cli/lint/no-module-state.ts +58 -0
  176. package/cli/lint/no-side-effect-import.ts +17 -0
  177. package/cli/lint/no-v8-ignore.ts +18 -0
  178. package/cli/lint/script-rules.ts +9 -0
  179. package/cli/lint/skip-on-platform.constants.ts +8 -0
  180. package/cli/lint/skip-on-platform.ts +118 -0
  181. package/cli/lint/todo-needs-id.ts +63 -0
  182. package/cli/lint/types-file.ts +28 -0
  183. package/cli/lint-schema.ts +32 -0
  184. package/cli/magic/fixtures/magic-repo.ts +64 -0
  185. package/cli/magic/magic-hit.ts +2 -0
  186. package/cli/magic/magic-nodes.ts +44 -0
  187. package/cli/magic/magic-numbers.test.ts +99 -0
  188. package/cli/magic/magic-numbers.ts +117 -0
  189. package/cli/magic/magic-strings.test.ts +38 -0
  190. package/cli/magic/magic-strings.ts +81 -0
  191. package/cli/main.test.ts +853 -0
  192. package/cli/main.ts +292 -0
  193. package/cli/mutate-args.ts +79 -0
  194. package/cli/mutate-check.test.ts +147 -0
  195. package/cli/mutate-deps.ts +42 -0
  196. package/cli/mutate-edges.test.ts +150 -0
  197. package/cli/mutate-files.test.ts +100 -0
  198. package/cli/mutate-files.ts +31 -0
  199. package/cli/mutate-floors.test.ts +91 -0
  200. package/cli/mutate-floors.ts +104 -0
  201. package/cli/mutate-real-deps.ts +57 -0
  202. package/cli/mutate-real.test.ts +96 -0
  203. package/cli/mutate-report.ts +96 -0
  204. package/cli/mutate-run.ts +128 -0
  205. package/cli/mutate-shards.ts +64 -0
  206. package/cli/mutate.constants.ts +67 -0
  207. package/cli/mutate.test.ts +182 -0
  208. package/cli/mutate.ts +64 -0
  209. package/cli/nested-vitest-flags.ts +8 -0
  210. package/cli/nightly-config.constants.ts +14 -0
  211. package/cli/nightly-config.ts +62 -0
  212. package/cli/prompt.test.ts +202 -0
  213. package/cli/prompt.ts +1 -0
  214. package/cli/red-proof-edges.test.ts +78 -0
  215. package/cli/red-proof-failures.test.ts +82 -0
  216. package/cli/red-proof-tree.test.ts +157 -0
  217. package/cli/red-proof-verdict.test.ts +44 -0
  218. package/cli/red-proof.constants.ts +14 -0
  219. package/cli/red-proof.ts +202 -0
  220. package/cli/release/changelog-parse.ts +83 -0
  221. package/cli/release/changelog.test.ts +141 -0
  222. package/cli/release/changelog.ts +106 -0
  223. package/cli/release/gate-refusals.test.ts +85 -0
  224. package/cli/release/gate.test.ts +63 -0
  225. package/cli/release/gate.ts +70 -0
  226. package/cli/release/git.ts +66 -0
  227. package/cli/release/github.test.ts +128 -0
  228. package/cli/release/github.ts +46 -0
  229. package/cli/release/list-dir.test.ts +11 -0
  230. package/cli/release/list-dir.ts +6 -0
  231. package/cli/release/main.test.ts +48 -0
  232. package/cli/release/main.ts +51 -0
  233. package/cli/release/manifest.test.ts +24 -0
  234. package/cli/release/manifest.ts +34 -0
  235. package/cli/release/pack.test.ts +107 -0
  236. package/cli/release/pack.ts +76 -0
  237. package/cli/release/plan.ts +127 -0
  238. package/cli/release/publish-run.test.ts +98 -0
  239. package/cli/release/publish.test.ts +127 -0
  240. package/cli/release/publish.ts +125 -0
  241. package/cli/release/refuse.ts +5 -0
  242. package/cli/release/release-messages.constants.ts +96 -0
  243. package/cli/release/release-refusals.test.ts +149 -0
  244. package/cli/release/release.constants.ts +128 -0
  245. package/cli/release/release.test.ts +199 -0
  246. package/cli/release/release.ts +145 -0
  247. package/cli/release/version.test.ts +118 -0
  248. package/cli/release/version.ts +69 -0
  249. package/cli/release/wait.test.ts +101 -0
  250. package/cli/release/wait.ts +95 -0
  251. package/cli/script-diagnostics.test.ts +76 -0
  252. package/cli/script-diagnostics.ts +62 -0
  253. package/cli/scripts/board.ts +519 -0
  254. package/cli/scripts/browser.ts +994 -0
  255. package/cli/scripts/change-set.ts +105 -0
  256. package/cli/scripts/check-globals.ts +199 -0
  257. package/cli/scripts/ci-skips.constants.ts +17 -0
  258. package/cli/scripts/ci-skips.ts +118 -0
  259. package/cli/scripts/ci-wait-run.ts +28 -0
  260. package/cli/scripts/ci-wait.constants.ts +44 -0
  261. package/cli/scripts/ci-wait.ts +175 -0
  262. package/cli/scripts/ci.constants.ts +15 -0
  263. package/cli/scripts/ci.ts +208 -0
  264. package/cli/scripts/clean.ts +363 -0
  265. package/cli/scripts/comments-step.ts +15 -0
  266. package/cli/scripts/doctor.ts +828 -0
  267. package/cli/scripts/emit-agent-shell-tools.ts +91 -0
  268. package/cli/scripts/emit-mcp-policy.ts +402 -0
  269. package/cli/scripts/folder-map.ts +353 -0
  270. package/cli/scripts/gate-fat-tools.ts +1095 -0
  271. package/cli/scripts/gitignore-guard.ts +338 -0
  272. package/cli/scripts/google-workspace.ts +779 -0
  273. package/cli/scripts/hook-command.ts +72 -0
  274. package/cli/scripts/hook-input.ts +178 -0
  275. package/cli/scripts/hook-io.constants.ts +5 -0
  276. package/cli/scripts/hook-io.ts +46 -0
  277. package/cli/scripts/hooks-union.ts +469 -0
  278. package/cli/scripts/interactive.ts +30 -0
  279. package/cli/scripts/jev.ts +420 -0
  280. package/cli/scripts/job.ts +934 -0
  281. package/cli/scripts/jsonc.ts +9 -0
  282. package/cli/scripts/lessons.ts +564 -0
  283. package/cli/scripts/lint-baseline.ts +233 -0
  284. package/cli/scripts/lint-main.ts +24 -0
  285. package/cli/scripts/lint-skips.ts +139 -0
  286. package/cli/scripts/lint.constants.ts +6 -0
  287. package/cli/scripts/lint.ts +142 -0
  288. package/cli/scripts/listen.ts +962 -0
  289. package/cli/scripts/managed-text.ts +47 -0
  290. package/cli/scripts/orchestrate-parent.ts +1155 -0
  291. package/cli/scripts/parse-need.ts +81 -0
  292. package/cli/scripts/persist-handoff.ts +228 -0
  293. package/cli/scripts/persist-implementation.ts +276 -0
  294. package/cli/scripts/persist-plan.ts +888 -0
  295. package/cli/scripts/persist-roadmap.ts +478 -0
  296. package/cli/scripts/persist-tmp.ts +177 -0
  297. package/cli/scripts/persist.ts +54 -0
  298. package/cli/scripts/phase-files.ts +121 -0
  299. package/cli/scripts/prompt.ts +38 -0
  300. package/cli/scripts/purge-global-mcps.ts +313 -0
  301. package/cli/scripts/rejections-step.ts +37 -0
  302. package/cli/scripts/rtk-grok.ts +102 -0
  303. package/cli/scripts/scrub-spawn-prompt.ts +103 -0
  304. package/cli/scripts/scrub-text-lib.ts +58 -0
  305. package/cli/scripts/session-map.ts +69 -0
  306. package/cli/scripts/setup.ts +862 -0
  307. package/cli/scripts/skill-conflicts.ts +82 -0
  308. package/cli/scripts/speak.ts +370 -0
  309. package/cli/scripts/strategy.ts +168 -0
  310. package/cli/scripts/sync-global-settings.ts +316 -0
  311. package/cli/scripts/turn-steps.ts +249 -0
  312. package/cli/scripts/turn.ts +157 -0
  313. package/cli/scripts/typecheck-step.ts +43 -0
  314. package/cli/scripts/vscode-tasks.ts +175 -0
  315. package/cli/scripts/workspace-root.ts +160 -0
  316. package/cli/scripts/worktree.ts +806 -0
  317. package/cli/spawn.test.ts +34 -0
  318. package/cli/spawn.ts +27 -0
  319. package/cli/staged-change.constants.ts +11 -0
  320. package/cli/staged-change.ts +79 -0
  321. package/cli/stryker-preload.test.ts +50 -0
  322. package/cli/stryker-preload.ts +9 -0
  323. package/cli/sync/agents/frontmatter.test.ts +197 -0
  324. package/cli/sync/agents/frontmatter.ts +140 -0
  325. package/cli/sync/agents/hooks.test.ts +517 -0
  326. package/cli/sync/agents/hooks.ts +401 -0
  327. package/cli/sync/agents/rules.test.ts +229 -0
  328. package/cli/sync/agents/rules.ts +84 -0
  329. package/cli/sync/agents/sources.test.ts +375 -0
  330. package/cli/sync/agents/sources.ts +244 -0
  331. package/cli/sync/agents/subagents.test.ts +149 -0
  332. package/cli/sync/agents/subagents.ts +158 -0
  333. package/cli/sync/agents-text.test.ts +31 -0
  334. package/cli/sync/agents-text.ts +36 -0
  335. package/cli/sync/fixtures/copied.README.md +35 -0
  336. package/cli/sync/fixtures/copied.tgz +0 -0
  337. package/cli/sync/fixtures/maps/golden/INDEX.md +22 -0
  338. package/cli/sync/fixtures/maps-ws.tgz +0 -0
  339. package/cli/sync/git-files.test.ts +340 -0
  340. package/cli/sync/git-files.ts +197 -0
  341. package/cli/sync/git-hooks.test.ts +94 -0
  342. package/cli/sync/golden.test.ts +15 -0
  343. package/cli/sync/hooks-mode.test.ts +99 -0
  344. package/cli/sync/hosts.ts +28 -0
  345. package/cli/sync/knip-config.constants.ts +4 -0
  346. package/cli/sync/knip-config.test.ts +147 -0
  347. package/cli/sync/knip-config.ts +108 -0
  348. package/cli/sync/manifest.test.ts +78 -0
  349. package/cli/sync/manifest.ts +60 -0
  350. package/cli/sync/maps.test.ts +304 -0
  351. package/cli/sync/maps.ts +297 -0
  352. package/cli/sync/migrate.test.ts +2000 -0
  353. package/cli/sync/migrate.ts +1104 -0
  354. package/cli/sync/nightly-jobs.test.ts +63 -0
  355. package/cli/sync/nightly.constants.ts +48 -0
  356. package/cli/sync/nightly.test.ts +100 -0
  357. package/cli/sync/nightly.ts +75 -0
  358. package/cli/sync/outputs.test.ts +351 -0
  359. package/cli/sync/outputs.ts +168 -0
  360. package/cli/sync/oxlint-config.test.ts +178 -0
  361. package/cli/sync/oxlint-config.ts +168 -0
  362. package/cli/sync/release-jobs.test.ts +29 -0
  363. package/cli/sync/release-reports.test.ts +31 -0
  364. package/cli/sync/release-workflow.constants.ts +61 -0
  365. package/cli/sync/release-workflow.test.ts +192 -0
  366. package/cli/sync/release-workflow.ts +86 -0
  367. package/cli/sync/release.constants.ts +93 -0
  368. package/cli/sync/release.test.ts +187 -0
  369. package/cli/sync/release.ts +112 -0
  370. package/cli/sync/repo-dir.test.ts +371 -0
  371. package/cli/sync/repo-dir.ts +205 -0
  372. package/cli/sync/standards.constants.ts +8 -0
  373. package/cli/sync/standards.test.ts +206 -0
  374. package/cli/sync/standards.ts +179 -0
  375. package/cli/sync/stock-history.json +2796 -0
  376. package/cli/sync/stock-history.test.ts +66 -0
  377. package/cli/sync/stock-history.ts +84 -0
  378. package/cli/sync/stock.test.ts +47 -0
  379. package/cli/sync/stock.ts +24 -0
  380. package/cli/sync/trees.test.ts +621 -0
  381. package/cli/sync/trees.ts +280 -0
  382. package/cli/sync/validate.test.ts +299 -0
  383. package/cli/sync/validate.ts +402 -0
  384. package/cli/sync/workspace.test.ts +180 -0
  385. package/cli/sync/workspace.ts +138 -0
  386. package/cli/sync/write.test.ts +341 -0
  387. package/cli/sync/write.ts +231 -0
  388. package/cli/sync.test.ts +1495 -0
  389. package/cli/sync.ts +360 -0
  390. package/cli/tdd-scope.test.ts +36 -0
  391. package/cli/tdd-scope.ts +41 -0
  392. package/cli/test-files.ts +16 -0
  393. package/cli/ts-program.ts +69 -0
  394. package/cli/tsconfig.constants.ts +8 -0
  395. package/cli/workerstack-config.types.ts +21 -0
  396. package/dist/cli/env.d.ts +10 -0
  397. package/dist/cli/env.js +64 -0
  398. package/dist/presets/temp-root-env.d.ts +10 -0
  399. package/dist/presets/temp-root-env.js +20 -0
  400. package/dist/presets/temp-root.constants.d.ts +6 -0
  401. package/dist/presets/temp-root.constants.js +6 -0
  402. package/dist/presets/temp-root.d.ts +2 -0
  403. package/dist/presets/temp-root.js +60 -0
  404. package/dist/presets/vitest.constants.d.ts +16 -0
  405. package/dist/presets/vitest.constants.js +16 -0
  406. package/dist/presets/vitest.d.ts +11 -0
  407. package/dist/presets/vitest.js +67 -0
  408. package/dist/presets/workers-plugin.d.ts +10 -0
  409. package/dist/presets/workers-plugin.js +54 -0
  410. package/package.json +141 -4
  411. package/references/INDEX.md +100 -0
  412. package/references/browser.md +66 -0
  413. package/references/cascade.md +15 -0
  414. package/references/clasp.md +21 -0
  415. package/references/cloudflare.md +36 -0
  416. package/references/google-workspace.md +79 -0
  417. package/references/hooks.md +103 -0
  418. package/references/implementation-format.md +119 -0
  419. package/references/jev.md +56 -0
  420. package/references/lessons.md +73 -0
  421. package/references/listen.md +80 -0
  422. package/references/map.md +107 -0
  423. package/references/output.md +47 -0
  424. package/references/plan-format.md +264 -0
  425. package/references/review-loop.md +48 -0
  426. package/references/roadmap-format.md +104 -0
  427. package/references/rtk.md +27 -0
  428. package/references/scope.md +76 -0
  429. package/references/setup.md +42 -0
  430. package/references/speak.md +59 -0
  431. package/tsconfig/base.json +28 -0
  432. package/tsconfig/bun.d.ts +1 -0
  433. package/tsconfig/bun.json +8 -0
  434. package/tsconfig/reset.d.ts +1 -0
  435. package/tsconfig/strict.json +12 -0
  436. package/tsconfig/web.json +7 -0
  437. package/tsconfig/worker.d.ts +1 -0
  438. package/tsconfig/worker.json +8 -0
@@ -0,0 +1,175 @@
1
+ /**
2
+ * `repo ci wait`: finds the newest `ci` run for HEAD on the current branch, waits for it, and exits 0 when it passed,
3
+ * 2 when a newer run on the branch superseded it (it was cancelled), 1 when it failed (with the failed jobs and their
4
+ * logs) or could not be found.
5
+ */
6
+ import { z } from "zod";
7
+ import {
8
+ CONCLUSION_CANCELLED,
9
+ CONCLUSION_SUCCESS,
10
+ EXIT_FAILED,
11
+ EXIT_PASSED,
12
+ EXIT_SUPERSEDED,
13
+ GH_AUTH,
14
+ GH_LIST_BRANCH,
15
+ GH_LIST_COMMIT,
16
+ GH_LOGS,
17
+ GH_VIEW,
18
+ GH_WATCH,
19
+ GIT_BRANCH,
20
+ GIT_HEAD,
21
+ GIT_REMOTES,
22
+ GIVE_UP_MS,
23
+ MS_PER_SECOND,
24
+ NOT_FAILED,
25
+ POLL_MS,
26
+ SHA_SHOWN,
27
+ } from "./ci-wait.constants.ts";
28
+ import { realSleep, spawnRunner, type Runner } from "./ci-wait-run.ts";
29
+
30
+ export type { Runner } from "./ci-wait-run.ts";
31
+ export type WaitDeps = {
32
+ cwd: string;
33
+ stdout: (s: string) => void;
34
+ stderr: (s: string) => void;
35
+ /** Milliseconds; the clock the wait for the run is measured on. */
36
+ now?: () => number;
37
+ sleep?: (ms: number) => Promise<void>;
38
+ git?: Runner;
39
+ gh?: Runner;
40
+ /** The commit and branch to wait on; skips the HEAD, branch and remote checks and keeps the gh login check. */
41
+ target?: Target;
42
+ };
43
+ /** How the wait for HEAD's run ended: `error` carries the line `repo ci wait` prints and a shorter `detail`. */
44
+ export type WaitOutcome =
45
+ | { kind: "passed" }
46
+ | { kind: "failed" }
47
+ | { kind: "superseded" }
48
+ | { kind: "error"; line: string; detail: string };
49
+ type Io = Required<Omit<WaitDeps, "target">>;
50
+ /** A commit and the branch whose `ci` run for it is waited on. */
51
+ export type Target = { sha: string; branch: string };
52
+ type RunInfo = { databaseId: number; createdAt: string; headBranch: string };
53
+
54
+ const runsSchema = () => z.array(z.object({ databaseId: z.number(), createdAt: z.string(), headBranch: z.string() }));
55
+ const branchRunsSchema = () => z.array(z.object({ databaseId: z.number(), createdAt: z.string() }));
56
+ const viewSchema = () =>
57
+ z.object({
58
+ conclusion: z.string(),
59
+ jobs: z.array(z.object({ name: z.string(), conclusion: z.string() })),
60
+ });
61
+
62
+ /** The JSON in a gh run's stdout, parsed against `schema`; null when the run failed or the text is not that. */
63
+ export function readJson<T>(got: { code: number; stdout: string }, schema: z.ZodType<T>): T | null {
64
+ if (got.code !== 0) return null;
65
+ try {
66
+ const parsed = schema.safeParse(JSON.parse(got.stdout));
67
+ return parsed.success ? parsed.data : null;
68
+ } catch {
69
+ return null;
70
+ }
71
+ }
72
+
73
+ const newestFirst = <T extends { createdAt: string }>(runs: T[]): T[] =>
74
+ [...runs].sort((a, b) => b.createdAt.localeCompare(a.createdAt));
75
+
76
+ const GH_LOGIN = "gh is not installed or not logged in; run `gh auth login`";
77
+
78
+ /** HEAD and the current branch, or why there is nothing to wait on. */
79
+ function locate(io: Io): Target | { error: string } {
80
+ const head = io.git(GIT_HEAD.slice(), io.cwd);
81
+ const sha = head.stdout.trim();
82
+ if (head.code !== 0 || sha === "") {
83
+ return { error: `cannot read HEAD (${head.stderr.trim()}); run it inside a git checkout` };
84
+ }
85
+ if (io.git(GIT_REMOTES(sha), io.cwd).stdout.trim() === "") {
86
+ return { error: `${sha.slice(0, SHA_SHOWN)} is not on any remote branch; push it first` };
87
+ }
88
+ if (io.gh(GH_AUTH.slice(), io.cwd).code !== 0) return { error: GH_LOGIN };
89
+ return { sha, branch: io.git(GIT_BRANCH.slice(), io.cwd).stdout.trim() };
90
+ }
91
+
92
+ /** The given target once gh is logged in, or why there is nothing to wait on. */
93
+ function givenTarget(io: Io, target: Target): Target | { error: string } {
94
+ return io.gh(GH_AUTH.slice(), io.cwd).code === 0 ? target : { error: GH_LOGIN };
95
+ }
96
+
97
+ /** The newest run of HEAD on the branch, looking every `POLL_MS` until `GIVE_UP_MS` have passed since `started`. */
98
+ async function findRun(io: Io, target: Target, started: number): Promise<RunInfo | null> {
99
+ const runs = readJson(io.gh(GH_LIST_COMMIT(target.sha), io.cwd), runsSchema()) ?? [];
100
+ const [newest] = newestFirst(runs.filter((run) => run.headBranch === target.branch));
101
+ if (newest !== undefined) return newest;
102
+ if (io.now() - started >= GIVE_UP_MS) return null;
103
+ await io.sleep(POLL_MS);
104
+ return findRun(io, target, started);
105
+ }
106
+
107
+ /** The newest run on the branch that was created after `run`. */
108
+ function newerRun(io: Io, run: RunInfo): { databaseId: number } | undefined {
109
+ const runs = readJson(io.gh(GH_LIST_BRANCH(run.headBranch), io.cwd), branchRunsSchema()) ?? [];
110
+ return newestFirst(runs.filter((other) => other.createdAt > run.createdAt))[0];
111
+ }
112
+
113
+ /** Prints the failed line and the failed steps' logs. */
114
+ function failure(io: Io, run: RunInfo, view: z.infer<ReturnType<typeof viewSchema>> | null): WaitOutcome {
115
+ const names = (view?.jobs ?? []).filter((item) => !NOT_FAILED.includes(item.conclusion)).map((item) => item.name);
116
+ const what = names.length > 0 ? names.join(", ") : `ci ${view?.conclusion || "run has no result"}`;
117
+ io.stdout(`failed: ${what}; logs below\n`);
118
+ const logs = io.gh(GH_LOGS(run.databaseId), io.cwd);
119
+ io.stdout(logs.code === 0 ? logs.stdout : "logs expired\n");
120
+ return { kind: "failed" };
121
+ }
122
+
123
+ /** Watches `run` to its end, then reads its result and reports it. */
124
+ function conclude(io: Io, run: RunInfo): WaitOutcome {
125
+ io.gh(GH_WATCH(run.databaseId), io.cwd);
126
+ const view = readJson(io.gh(GH_VIEW(run.databaseId), io.cwd), viewSchema());
127
+ if (view?.conclusion === CONCLUSION_SUCCESS) {
128
+ io.stdout("passed\n");
129
+ return { kind: "passed" };
130
+ }
131
+ const newer = view?.conclusion === CONCLUSION_CANCELLED ? newerRun(io, run) : undefined;
132
+ if (newer !== undefined) {
133
+ io.stdout(`superseded by run ${newer.databaseId} on ${run.headBranch}\n`);
134
+ return { kind: "superseded" };
135
+ }
136
+ return failure(io, run, view);
137
+ }
138
+
139
+ /**
140
+ * Waits for the newest `ci` run of HEAD and reports how it ended, printing what the run printed: the waiting line, then
141
+ * passed, the failed jobs with their logs, or the run that superseded it. A missing run, remote or gh login is `error`.
142
+ */
143
+ export async function waitFor(deps: WaitDeps): Promise<WaitOutcome> {
144
+ const io: Io = {
145
+ cwd: deps.cwd,
146
+ stdout: deps.stdout,
147
+ stderr: deps.stderr,
148
+ now: deps.now ?? Date.now,
149
+ sleep: deps.sleep ?? realSleep,
150
+ git: deps.git ?? spawnRunner("git"),
151
+ gh: deps.gh ?? spawnRunner("gh"),
152
+ };
153
+ const target = deps.target === undefined ? locate(io) : givenTarget(io, deps.target);
154
+ if ("error" in target) return { kind: "error", line: target.error, detail: target.error };
155
+ const short = target.sha.slice(0, SHA_SHOWN);
156
+ const run = await findRun(io, target, io.now());
157
+ if (run === null) {
158
+ const waited = `${GIVE_UP_MS / MS_PER_SECOND}s`;
159
+ return {
160
+ kind: "error",
161
+ line: `no ci run for ${short} after ${waited}; check the workflow ran`,
162
+ detail: `no ci run after ${waited}`,
163
+ };
164
+ }
165
+ io.stdout(`waiting for ci on ${short} (run ${run.databaseId})…\n`);
166
+ return conclude(io, run);
167
+ }
168
+
169
+ const EXIT_OF = { passed: EXIT_PASSED, failed: EXIT_FAILED, superseded: EXIT_SUPERSEDED, error: EXIT_FAILED };
170
+
171
+ export async function waitMain(deps: WaitDeps): Promise<number> {
172
+ const outcome = await waitFor(deps);
173
+ if (outcome.kind === "error") deps.stderr(`repo ci wait: ${outcome.line}\n`);
174
+ return EXIT_OF[outcome.kind];
175
+ }
@@ -0,0 +1,15 @@
1
+ /** A tsconfig file name in the root or a package directory. */
2
+ export const TSCONFIG_FILE: RegExp = /^tsconfig.*\.json$/;
3
+ /** A path segment under which a package is a fixture or an install, never typechecked. */
4
+ export const SKIPPED_SEGMENTS: readonly string[] = ["fixtures", `${"node"}_modules`];
5
+ export const TSC_ARGS: readonly string[] = ["--noEmit", "-p"];
6
+ export const VITEST_RUN_ARGS: readonly string[] = ["run", "--coverage"];
7
+ /** The same run without coverage, so no per-file floor applies. */
8
+ export const VITEST_RUN_NO_COVERAGE_ARGS: readonly string[] = ["run"];
9
+ export const SUMMARY_SEPARATOR = " · ";
10
+ export const MS_PER_SECOND = 1000;
11
+ export const USAGE = "use repo ci [--no-coverage] [--report <file>], repo ci skips <dir> or repo ci wait";
12
+ export const REPORT_FLAG = "--report";
13
+ export const NO_COVERAGE_FLAG = "--no-coverage";
14
+ export const SKIPS_COMMAND = "skips";
15
+ export const WAIT_COMMAND = "wait";
@@ -0,0 +1,208 @@
1
+ /**
2
+ * `repo ci`: every gate of the repo in one call, in order and all of them: `repo check`, `repo fmt --check`,
3
+ * `tsc --noEmit -p` on every tsconfig of the root and each workspace package, and `vitest run --coverage`. Each gate
4
+ * prints its line when it ends, with its output under it when it failed, then one summary line; exit 1 when any failed.
5
+ */
6
+ import fs from "node:fs";
7
+ import os from "node:os";
8
+ import path from "node:path";
9
+ import { CONFIG_FILE, findRoot } from "../config.ts";
10
+ import { readWorkspace } from "../sync/workspace.ts";
11
+ import { REPORT_JSON_FILE, REPORT_OUTPUT_FLAG, REPORT_REPORTERS, REPORT_TEMP_PREFIX } from "./ci-skips.constants.ts";
12
+ import { skipsMain, writeReport } from "./ci-skips.ts";
13
+ import { waitMain, type WaitDeps } from "./ci-wait.ts";
14
+ import {
15
+ MS_PER_SECOND,
16
+ REPORT_FLAG,
17
+ SKIPPED_SEGMENTS,
18
+ SKIPS_COMMAND,
19
+ SUMMARY_SEPARATOR,
20
+ TSCONFIG_FILE,
21
+ TSC_ARGS,
22
+ USAGE,
23
+ NO_COVERAGE_FLAG,
24
+ VITEST_RUN_ARGS,
25
+ VITEST_RUN_NO_COVERAGE_ARGS,
26
+ WAIT_COMMAND,
27
+ } from "./ci.constants.ts";
28
+ import { captureBun, type Captured } from "./lint.ts";
29
+ import { BINS } from "./turn.ts";
30
+ import { countsOfRun, type Bins } from "./turn-steps.ts";
31
+
32
+ export type CiDeps = {
33
+ cwd?: string;
34
+ stdout?: (s: string) => void;
35
+ stderr?: (s: string) => void;
36
+ /** Milliseconds; the clock the gate times come from. */
37
+ now?: () => number;
38
+ bins?: Bins;
39
+ /** Runs `repo <args>` in a directory. */
40
+ repo?: (args: string[], cwd: string) => Captured;
41
+ } & Pick<WaitDeps, "git" | "gh" | "sleep">;
42
+ /** Where `repo ci` runs and writes. */
43
+ type Io = { cwd: string; stdout: (s: string) => void; stderr: (s: string) => void };
44
+ type Ctx = Required<Pick<CiDeps, "bins" | "repo">> & { root: string; json: string | undefined; coverage: boolean };
45
+ type Command =
46
+ | { kind: "gates"; report?: string; coverage: boolean }
47
+ | { kind: "skips"; dir: string }
48
+ | { kind: "wait" }
49
+ | { kind: "usage" };
50
+ /** A gate's outcome; `ran` is false when no tool ran, so there is no time to show. */
51
+ type Gate = { label: string; ok: boolean; output: string[]; ran: boolean };
52
+
53
+ const pass = (label: string, ran = true): Gate => ({ label, ok: true, output: [], ran });
54
+ const fail = (label: string, output: string[], ran = true): Gate => ({ label, ok: false, output, ran });
55
+ const plural = (n: number, word: string) => `${n} ${word}${n === 1 ? "" : "s"}`;
56
+ const textOf = (run: Captured) => `${run.stdout}${run.stderr}`;
57
+
58
+ /** `repo <args>` run by this checkout's bin. */
59
+ const runRepo = (args: string[], cwd: string): Captured =>
60
+ captureBun([path.join(import.meta.dirname, "../../bin/repo.ts"), ...args], cwd);
61
+
62
+ /** `repo <args>` as the gate `name`. */
63
+ function repoGate(name: string, args: string[], ctx: Ctx): Gate {
64
+ const run = ctx.repo(args, ctx.root);
65
+ return run.code === 0 ? pass(`${name} ok`) : fail(`${name} failed`, [textOf(run)]);
66
+ }
67
+
68
+ /** The root-relative tsconfigs of the root and each package that is not a fixture or an install. */
69
+ function tsconfigs(root: string): { ok: true; files: string[] } | { ok: false; errors: string[] } {
70
+ const workspace = readWorkspace(root);
71
+ if (!workspace.ok) return workspace;
72
+ const dirs = workspace.workspace.packages
73
+ .map((pkg) => pkg.dir)
74
+ .filter((dir) => !dir.split("/").some((segment) => SKIPPED_SEGMENTS.includes(segment)));
75
+ const files = [".", ...dirs].flatMap((dir) =>
76
+ fs
77
+ .readdirSync(path.join(root, dir), { withFileTypes: true })
78
+ .filter((entry) => entry.isFile() && TSCONFIG_FILE.test(entry.name))
79
+ .map((entry) => path.posix.join(dir, entry.name))
80
+ .sort(),
81
+ );
82
+ return { ok: true, files };
83
+ }
84
+
85
+ function typecheckGate(ctx: Ctx): Gate {
86
+ const found = tsconfigs(ctx.root);
87
+ if (!found.ok)
88
+ return fail(
89
+ "typecheck failed",
90
+ found.errors.map((line) => `${line}\n`),
91
+ );
92
+ if (found.files.length === 0) return pass("typecheck skipped (no tsconfig.json)", false);
93
+ const runs = found.files.map((file) => ({ file, run: ctx.bins.tsc([...TSC_ARGS, file], ctx.root) }));
94
+ const bad = runs.filter(({ run }) => run.code !== 0);
95
+ if (bad.length === 0) return pass(`typecheck ${plural(found.files.length, "config")}`);
96
+ return fail(
97
+ `typecheck failed (${bad.map(({ file }) => file).join(", ")})`,
98
+ bad.map(({ run }) => textOf(run)),
99
+ );
100
+ }
101
+
102
+ function testsGate(ctx: Ctx): Gate {
103
+ const reporting = ctx.json === undefined ? [] : [...REPORT_REPORTERS, `${REPORT_OUTPUT_FLAG}${ctx.json}`];
104
+ const base = ctx.coverage ? VITEST_RUN_ARGS : VITEST_RUN_NO_COVERAGE_ARGS;
105
+ const run = ctx.bins.vitest([...base, ...reporting], ctx.root);
106
+ if (run === null) return pass("tests skipped (no vitest in .)", false);
107
+ const counts = countsOfRun(run);
108
+ if (run.code === 0) return pass(`${plural(counts.passed, "test")} passed`);
109
+ const detail = counts.failed > 0 ? ` (${counts.failed} failed, ${counts.passed} passed)` : "";
110
+ return fail(`tests failed${detail}`, [textOf(run)]);
111
+ }
112
+
113
+ /** Runs each gate in order, printing its line as it ends and its output under it when it failed. */
114
+ function runGates(ctx: Ctx, now: () => number, stdout: (s: string) => void): Gate[] {
115
+ const gates: ((ctx: Ctx) => Gate)[] = [
116
+ (c) => repoGate("check", ["check"], c),
117
+ (c) => repoGate("fmt", ["fmt", "--check"], c),
118
+ typecheckGate,
119
+ testsGate,
120
+ ];
121
+ return gates.map((run) => {
122
+ const started = now();
123
+ const gate = run(ctx);
124
+ const seconds = ((now() - started) / MS_PER_SECOND).toFixed(1);
125
+ stdout(`ci: ${gate.label}${gate.ran ? ` (${seconds}s)` : ""}\n`);
126
+ for (const chunk of gate.output) stdout(chunk.endsWith("\n") ? chunk : `${chunk}\n`);
127
+ return gate;
128
+ });
129
+ }
130
+
131
+ /** The gates run that `--no-coverage` and `--report <file>`, in any order, ask for; null for anything else. */
132
+ function gateFlags(argv: string[]): Command | null {
133
+ const command: Command = { kind: "gates", coverage: true };
134
+ for (let i = 0; i < argv.length; i++) {
135
+ const next = argv[i + 1];
136
+ if (argv[i] === NO_COVERAGE_FLAG) command.coverage = false;
137
+ else if (argv[i] === REPORT_FLAG && next !== undefined) {
138
+ command.report = next;
139
+ i++;
140
+ } else return null;
141
+ }
142
+ return command;
143
+ }
144
+
145
+ /** What `argv` asks for. */
146
+ function parse(argv: string[]): Command {
147
+ const [first, second, ...rest] = argv;
148
+ if (first === SKIPS_COMMAND && second !== undefined && rest.length === 0) return { kind: "skips", dir: second };
149
+ if (first === WAIT_COMMAND && second === undefined) return { kind: "wait" };
150
+ return gateFlags(argv) ?? { kind: "usage" };
151
+ }
152
+
153
+ /** The context to run the gates in, or why `repo ci` cannot start; `json` is where vitest writes its report. */
154
+ function prepare(
155
+ cwd: string,
156
+ deps: CiDeps,
157
+ run: { json: string | undefined; coverage: boolean },
158
+ ): { ctx: Ctx } | { error: string } {
159
+ const root = findRoot(cwd);
160
+ if (root === null) return { error: `no ${CONFIG_FILE} in ${cwd} or any parent; run \`bun repo init\`` };
161
+ return { ctx: { root, json: run.json, coverage: run.coverage, bins: deps.bins ?? BINS, repo: deps.repo ?? runRepo } };
162
+ }
163
+
164
+ /** Runs the gates, and writes the skip report to `report` after them when asked for one. */
165
+ function gatesMain({ report, coverage }: { report?: string; coverage: boolean }, deps: CiDeps, io: Io): number {
166
+ const temp = report === undefined ? undefined : fs.mkdtempSync(path.join(os.tmpdir(), REPORT_TEMP_PREFIX));
167
+ const json = temp === undefined ? undefined : path.join(temp, REPORT_JSON_FILE);
168
+ try {
169
+ const prepared = prepare(io.cwd, deps, { json, coverage });
170
+ if ("error" in prepared) {
171
+ io.stderr(`repo ci: ${prepared.error}\n`);
172
+ return 1;
173
+ }
174
+ const gates = runGates(prepared.ctx, deps.now ?? Date.now, io.stdout);
175
+ io.stdout(`ci: ${gates.map((gate) => gate.label).join(SUMMARY_SEPARATOR)}\n`);
176
+ if (report !== undefined && json !== undefined && !writeTo({ report, json, root: prepared.ctx.root }, io)) return 1;
177
+ return gates.every((gate) => gate.ok) ? 0 : 1;
178
+ } finally {
179
+ if (temp !== undefined) fs.rmSync(temp, { recursive: true, force: true });
180
+ }
181
+ }
182
+
183
+ /** Writes the report file from the JSON at `json`; false, with the reason on stderr, when it cannot be written. */
184
+ function writeTo({ report, json, root }: { report: string; json: string; root: string }, io: Io): boolean {
185
+ try {
186
+ writeReport(path.resolve(io.cwd, report), json, root);
187
+ return true;
188
+ } catch (error) {
189
+ io.stderr(
190
+ `repo ci: cannot write ${report}: ${(error /* writeFileSync throws Errors, with a message */ as Error).message}\n`,
191
+ );
192
+ return false;
193
+ }
194
+ }
195
+
196
+ export function main(argv: string[], deps: CiDeps = {}): number | Promise<number> {
197
+ const command = parse(argv);
198
+ const io: Io = {
199
+ cwd: deps.cwd ?? process.cwd(),
200
+ stdout: deps.stdout ?? ((s: string) => process.stdout.write(s)),
201
+ stderr: deps.stderr ?? ((s: string) => process.stderr.write(s)),
202
+ };
203
+ if (command.kind === "skips") return skipsMain(command.dir, io);
204
+ if (command.kind === "wait") return waitMain({ ...deps, ...io });
205
+ if (command.kind === "gates") return gatesMain(command, deps, io);
206
+ io.stderr(`repo ci: ${USAGE}\n`);
207
+ return 1;
208
+ }