@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,363 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Delete scratch under .tmp/repo/ that repo does not own, dead-session state and stray nested .tmp/repo dirs,
4
+ * and age out repo's own files untouched for 30 days (roadmap D12).
5
+ */
6
+ import { spawnSync } from "node:child_process";
7
+ import fs from "node:fs";
8
+ import path from "node:path";
9
+ import { boardHome, readBootId, sweep } from "./board.ts";
10
+ import { FILENAME_RE, TMP_DIR, TMP_RESERVED_DIRS } from "./persist-tmp.ts";
11
+ import { resolveRoots } from "./workspace-root.ts";
12
+ import { readEnv } from "../env.ts";
13
+ import type { Env } from "../env.ts";
14
+
15
+ /** One path planned for removal; `kind` picks its line in the report. */
16
+ export interface RemoveItem {
17
+ path: string;
18
+ kind: string;
19
+ }
20
+
21
+ /** One path kept; nested dirs also name the durable dir that holds files. */
22
+ export interface KeepItem {
23
+ path: string;
24
+ kind: string;
25
+ holds?: string;
26
+ }
27
+
28
+ export interface CleanPlan {
29
+ remove: RemoveItem[];
30
+ keep: KeepItem[];
31
+ }
32
+
33
+ export interface CleanRun {
34
+ root: string;
35
+ now: number;
36
+ liveSessions: Set<string>;
37
+ dryRun: boolean;
38
+ out: (line: string) => void;
39
+ /** The delete edge; tests pass a failing one. */
40
+ rm?: typeof fs.rmSync;
41
+ }
42
+
43
+ const HOUR = 3600_000;
44
+ const DAY = 24 * HOUR;
45
+ const AGE = 30 * DAY;
46
+ const DURABLE = ["plans", "roadmaps", "handoffs", "implementations"];
47
+
48
+ // How each repo-owned dir is cleaned. A reserved dir with no policy fails at load, so a new one is never deleted silently.
49
+ const POLICY: Record<string, string> = {
50
+ plans: "age-done",
51
+ roadmaps: "age-done",
52
+ handoffs: "age",
53
+ implementations: "age-done",
54
+ browser: "keep",
55
+ listen: "keep",
56
+ speak: "keep",
57
+ sessions: "per-session",
58
+ "orchestrator-logs": "per-stamp",
59
+ stash: "per-receipt",
60
+ };
61
+ // clean.test.ts holds POLICY to TMP_RESERVED_DIRS, so a reserved dir without a policy fails the suite.
62
+
63
+ function list(dir: string): string[] {
64
+ try {
65
+ return fs.readdirSync(dir);
66
+ } catch {
67
+ return [];
68
+ }
69
+ }
70
+
71
+ // Newest mtime anywhere inside; a symlink counts by its own mtime and is never followed.
72
+ function newest(p: string): number {
73
+ const st = fs.lstatSync(p);
74
+ let t = st.mtimeMs;
75
+ if (st.isDirectory()) for (const name of list(p)) t = Math.max(t, newest(path.join(p, name)));
76
+ return t;
77
+ }
78
+
79
+ function stats(p: string): { bytes: number; dir: boolean } {
80
+ const st = fs.lstatSync(p);
81
+ if (!st.isDirectory()) return { bytes: st.size, dir: false };
82
+ let bytes = 0;
83
+ for (const name of list(p)) bytes += stats(path.join(p, name)).bytes;
84
+ return { bytes, dir: true };
85
+ }
86
+
87
+ function holdsFile(p: string): boolean {
88
+ let st: fs.Stats;
89
+ try {
90
+ st = fs.lstatSync(p);
91
+ } catch {
92
+ return false;
93
+ }
94
+ if (!st.isDirectory()) return true;
95
+ return list(p).some((name) => holdsFile(path.join(p, name)));
96
+ }
97
+
98
+ /** Nested .tmp/repo dirs below the root, from git's ignored-dir listing; [] outside git. */
99
+ export function nestedTmpDirs(root: string): string[] {
100
+ const r = spawnSync("git", ["ls-files", "-o", "-i", "--exclude-standard", "--directory", "-z"], {
101
+ cwd: root,
102
+ encoding: "utf8",
103
+ maxBuffer: 256 * 1024 * 1024,
104
+ });
105
+ if (r.status !== 0) return [];
106
+ const out = new Set<string>();
107
+ for (const entry of r.stdout.split("\0")) {
108
+ const e = entry.replace(/\/+$/, "");
109
+ let rel: string | null = null;
110
+ if (e.endsWith("/.tmp")) rel = `${e}/repo`;
111
+ else if (e.endsWith("/.tmp/repo")) rel = e;
112
+ if (!rel) continue;
113
+ const abs = path.join(root, rel);
114
+ try {
115
+ if (fs.lstatSync(abs).isDirectory()) out.add(abs);
116
+ } catch {
117
+ /* no repo dir under this .tmp */
118
+ }
119
+ }
120
+ return [...out];
121
+ }
122
+
123
+ const OLD_KIND: Record<string, string> = {
124
+ plans: "old plan",
125
+ roadmaps: "old roadmap",
126
+ implementations: "old journal",
127
+ handoffs: "old handoff",
128
+ };
129
+ const SERIAL_RE = /^([0-9]+)-/;
130
+
131
+ /** The serial a dir's counter sees in `name`, else null: `nextSerial` counts `.md` only, the roadmap counter any name. */
132
+ function serialOf(dir: string, name: string): number | null {
133
+ const m = SERIAL_RE.exec(name);
134
+ if (!m || (dir !== "roadmaps" && !name.endsWith(".md"))) return null;
135
+ return Number(m[1]); // group 1 is unconditional
136
+ }
137
+
138
+ function statusOf(file: string): string | null {
139
+ try {
140
+ const m = /^---\r?\n([\s\S]*?)\r?\n---/.exec(fs.readFileSync(file, "utf8"));
141
+ const s = m?.[1] === undefined ? null : /^status:\s*(\S+)/m.exec(m[1]);
142
+ return s?.[1] ?? null;
143
+ } catch {
144
+ return null;
145
+ }
146
+ }
147
+
148
+ /** Resolved `Location:` paths named by every roadmap that is not `done`. */
149
+ function roadmapLocations(tmp: string): Set<string> {
150
+ const dir = path.join(tmp, "roadmaps");
151
+ const out = new Set<string>();
152
+ for (const name of list(dir)) {
153
+ const file = path.join(dir, name);
154
+ if (statusOf(file) === "done") continue;
155
+ let text = "";
156
+ try {
157
+ text = fs.readFileSync(file, "utf8");
158
+ } catch {
159
+ continue;
160
+ }
161
+ for (const m of text.matchAll(/^\s*Location:\s*(\S+)\s*$/gm)) out.add(path.resolve(m[1]!)); // group 1 is unconditional
162
+ }
163
+ return out;
164
+ }
165
+
166
+ /** The name with the highest serial under `pick`, so max + 1 counters never hand out a number again. */
167
+ function keeperOf(names: string[], pick: (name: string) => number | null): string | null {
168
+ let best: string | null = null;
169
+ let top = -1;
170
+ for (const n of names) {
171
+ const s = pick(n);
172
+ if (s !== null && s > top) [best, top] = [n, s];
173
+ }
174
+ return best;
175
+ }
176
+
177
+ /** The first durable dir (`plans`, `roadmaps`, `handoffs`, `implementations`) holding a file under `dir`, else null. */
178
+ export function nestedHolds(dir: string): string | null {
179
+ return DURABLE.find((d) => holdsFile(path.join(dir, d))) ?? null;
180
+ }
181
+
182
+ /** Pure decision: which paths to remove and what was kept, by kind. */
183
+ export function planClean({
184
+ root,
185
+ now,
186
+ liveSessions,
187
+ nested = [],
188
+ }: {
189
+ root: string;
190
+ now: number;
191
+ liveSessions: Set<string>;
192
+ nested?: string[];
193
+ }): CleanPlan {
194
+ const tmp = path.join(root, TMP_DIR);
195
+ const remove: RemoveItem[] = [];
196
+ const keep: KeepItem[] = [];
197
+ const recent = (p: string, window: number = HOUR): boolean => newest(p) >= now - window;
198
+ const decide = (p: string, gone: boolean, kind: string, keptAs: string): void => {
199
+ if (gone) remove.push({ path: p, kind });
200
+ else keep.push({ path: p, kind: keptAs });
201
+ };
202
+ const old = (p: string): boolean => newest(p) < now - AGE;
203
+ const pinned = roadmapLocations(tmp);
204
+ const names = list(tmp);
205
+ const artifactKeeper = keeperOf(
206
+ names.filter((n) => FILENAME_RE.test(n) && !fs.lstatSync(path.join(tmp, n)).isDirectory()),
207
+ (n) => Number(SERIAL_RE.exec(n)![1]), // names were filtered by FILENAME_RE, which starts with the serial
208
+ );
209
+ for (const name of names) {
210
+ const p = path.join(tmp, name);
211
+ const policy = TMP_RESERVED_DIRS.has(name) ? POLICY[name] : null;
212
+ if (policy === "keep") {
213
+ keep.push({ path: p, kind: name });
214
+ } else if (policy === "age" || policy === "age-done") {
215
+ const entries = list(p);
216
+ const keeper = keeperOf(entries, (n) => serialOf(name, n));
217
+ keep.push({ path: p, kind: name });
218
+ for (const entry of entries) {
219
+ const child = path.join(p, entry);
220
+ if (entry === keeper || serialOf(name, entry) === null || !old(child)) continue;
221
+ if (policy === "age-done" && statusOf(child) !== "done") continue;
222
+ if (name === "plans" && pinned.has(path.resolve(child))) continue;
223
+ remove.push({
224
+ path: child,
225
+ kind: OLD_KIND[name] /* only plans, roadmaps, handoffs and implementations reach age policies */ as string,
226
+ });
227
+ }
228
+ } else if (policy === "per-session") {
229
+ for (const sid of list(p)) {
230
+ const child = path.join(p, sid);
231
+ const live = liveSessions.has(sid);
232
+ decide(child, !live && !recent(child), "dead session", live ? "live session" : "recent");
233
+ }
234
+ } else if (policy === "per-stamp") {
235
+ for (const stamp of list(p)) {
236
+ const child = path.join(p, stamp);
237
+ const live = [...liveSessions].some((sid) => stamp.endsWith(`-${sid}`));
238
+ decide(child, !live && !recent(child), "stale stamp", live ? "live session" : "recent");
239
+ }
240
+ } else if (policy === "per-receipt") {
241
+ for (const receipt of list(p)) {
242
+ const child = path.join(p, receipt);
243
+ decide(child, !recent(child, DAY), "stash receipt", "recent");
244
+ }
245
+ } else if (FILENAME_RE.test(name) && !fs.lstatSync(p).isDirectory()) {
246
+ decide(p, name !== artifactKeeper && old(p), "old tmp artifact", "tmp artifact");
247
+ } else {
248
+ decide(p, !recent(p), stats(p).dir ? "dir" : "file", "recent");
249
+ }
250
+ }
251
+ for (const dir of nested) {
252
+ const held = nestedHolds(dir);
253
+ if (held) keep.push({ path: dir, kind: "nested", holds: held });
254
+ else remove.push({ path: dir, kind: "nested dir" });
255
+ }
256
+ return { remove, keep };
257
+ }
258
+
259
+ const REMOVE_ORDER = [
260
+ "file",
261
+ "dir",
262
+ "dead session",
263
+ "stale stamp",
264
+ "stash receipt",
265
+ "nested dir",
266
+ "old plan",
267
+ "old roadmap",
268
+ "old journal",
269
+ "old handoff",
270
+ "old tmp artifact",
271
+ ];
272
+ const PLURAL: Record<string, string> = {
273
+ file: "files",
274
+ dir: "dirs",
275
+ "dead session": "dead sessions",
276
+ "stale stamp": "stale stamps",
277
+ "stash receipt": "stash receipts",
278
+ "nested dir": "nested dirs",
279
+ "old plan": "old plans",
280
+ "old roadmap": "old roadmaps",
281
+ "old journal": "old journals",
282
+ "old handoff": "old handoffs",
283
+ "old tmp artifact": "old tmp artifacts",
284
+ };
285
+
286
+ function counted(items: { kind: string }[], order: string[], plural: Record<string, string>): string[] {
287
+ const counts = new Map<string, number>();
288
+ for (const item of items) counts.set(item.kind, (counts.get(item.kind) || 0) + 1);
289
+ return order
290
+ .filter((k) => counts.get(k))
291
+ .map(
292
+ (k) =>
293
+ `${counts.get(k)} ${counts.get(k) === 1 ? k : (plural[k] /* every ordered kind has a plural */ as string)}`,
294
+ );
295
+ }
296
+
297
+ function size(bytes: number): string {
298
+ if (bytes >= 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
299
+ if (bytes >= 1024) return `${(bytes / 1024).toFixed(1)} KB`;
300
+ return `${bytes} B`;
301
+ }
302
+
303
+ function keptLine(keep: KeepItem[]): string {
304
+ const durable = DURABLE.filter((d) => keep.some((k) => k.kind === d));
305
+ const rest = counted(keep, ["tmp artifact", "live session", "recent"], {
306
+ "tmp artifact": "tmp artifacts",
307
+ "live session": "live sessions",
308
+ recent: "entries touched recently",
309
+ });
310
+ return [...durable, ...rest].join(", ") || "nothing";
311
+ }
312
+
313
+ /** Plan, delete unless dryRun, report through `out`; returns the exit code. */
314
+ export function runClean({ root, now, liveSessions, dryRun, out, rm = fs.rmSync }: CleanRun): number {
315
+ const relOf = (p: string): string => path.relative(root, p).split(path.sep).join("/");
316
+ const { remove, keep } = planClean({ root, now, liveSessions, nested: nestedTmpDirs(root) });
317
+ const done: RemoveItem[] = [];
318
+ let failed = 0;
319
+ let bytes = 0;
320
+ for (const item of remove) {
321
+ const b = stats(item.path).bytes;
322
+ if (dryRun) {
323
+ out(relOf(item.path));
324
+ } else {
325
+ try {
326
+ rm(item.path, { recursive: true, force: true, maxRetries: 3 });
327
+ } catch (err) {
328
+ failed += 1;
329
+ out(
330
+ `skipped ${relOf(item.path)}: ${(err /* rm throws an fs error that carries a code */ as NodeJS.ErrnoException).code}`,
331
+ );
332
+ continue;
333
+ }
334
+ }
335
+ done.push(item);
336
+ bytes += b;
337
+ }
338
+ const verb = dryRun ? "would remove" : "removed";
339
+ const parts = counted(done, REMOVE_ORDER, PLURAL);
340
+ out(
341
+ parts.length
342
+ ? `${verb} ${parts.join(", ")} (${size(bytes)})`
343
+ : `${verb} 0 entries from ${relOf(path.join(root, TMP_DIR))}`,
344
+ );
345
+ out(`${dryRun ? "would keep" : "kept"} ${keptLine(keep)}`);
346
+ for (const k of keep.filter((k) => k.kind === "nested")) out(`kept nested ${relOf(k.path)}: holds ${k.holds}`);
347
+ return failed ? 1 : 0;
348
+ }
349
+
350
+ /** Session ids with a live host process on this machine's board. */
351
+ export function liveSessions(env: Env = readEnv()): Set<string> {
352
+ return new Set(sweep({ home: boardHome(env), boot: readBootId() }).map((row) => row.session));
353
+ }
354
+
355
+ export function main(argv: string[]): number {
356
+ return runClean({
357
+ root: resolveRoots().root,
358
+ now: Date.now(),
359
+ liveSessions: liveSessions(),
360
+ dryRun: argv.includes("--dry-run"),
361
+ out: (line) => console.log(line),
362
+ });
363
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Turn's step that refuses rule-disable comments, `@ts-ignore`, `@ts-nocheck` and an `@ts-expect-error` with no
3
+ * reason in the turn's changed source files, as `repo check` does over the whole tree.
4
+ */
5
+ import { commentProblems } from "../check-comments.ts";
6
+ import type { Step } from "./turn-steps.ts";
7
+
8
+ /** `comments ok`, or `comments <n> refused` with one line per refused comment. */
9
+ export const commentsStep: Step = (turn) => {
10
+ const files = turn.changes.filter((change) => !change.deleted).map((change) => change.rel);
11
+ const problems = commentProblems(turn.root, files);
12
+ if (problems.length === 0) return { label: "comments ok", ok: true, output: [], touched: [] };
13
+ const output = problems.map((problem) => `${problem}\n`);
14
+ return { label: `comments ${problems.length} refused`, ok: false, output, touched: [] };
15
+ };