@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,107 @@
1
+ ---
2
+ tags: [map]
3
+ ---
4
+
5
+ # Map
6
+
7
+ Cheap outline. Not a file dump.
8
+
9
+ ## Protocol
10
+ - `node_modules/@workerstack/repo/references/cascade.md` — session agent tools; job first; spawn scout when the dump needs judgment
11
+ - `node_modules/@workerstack/repo/references/rtk.md` — shell compression
12
+ - `node_modules/@workerstack/repo/references/browser.md` — Lightpanda-first session CLI (`nav|snap|click|fill|scroll|wait|hover|select|shot|pdf|stop`); not MCP
13
+ - `node_modules/@workerstack/repo/references/hooks.md` — hook policy
14
+ - `node_modules/@workerstack/repo/references/map.md` — this file
15
+ - `node_modules/@workerstack/repo/references/output.md` — default voice
16
+ - `node_modules/@workerstack/repo/references/scope.md` — size gate; plan by default: research → `/write-plan` → approval → `/implement-plan`; two or more slices → `/write-roadmap`
17
+ - `node_modules/@workerstack/repo/references/INDEX.md` — the catalog, read first: the repo's domain law, then the generated `repo:skills` (skills), `repo:refs` (reference docs) and `repo:stack` (the stack's packages) sections. INDEX always. Not if-maps-else
18
+
19
+ ## Agent SSOT
20
+ - Docs SoT: `agents/skills` + `references/` (shipped in the package; a consumer reads `node_modules/@workerstack/repo/references/`). `bun repo sync` maps anything placed there. `.claude/skills/<name>` and `.agents/skills/<name>` are generated links to `agents/skills/<name>`, not SoT; no mirror scan
21
+ - The trees come from `cli/sync/agents/` (`sources` `frontmatter` `rules` `subagents` `hooks`) via `bun repo sync`, reading the stock sources in `agents/` (exported as `@workerstack/repo/agents/*`)
22
+ - `agents/subagents/{orchestrator,repo}.md`
23
+ - `agents/rules/overview.md` → `AGENTS.md`
24
+ - A consumer's own content lives in `.repo/` (below) and `references/`; both are committed, and `bun repo sync` merges them over the package's
25
+ - Default output: `node_modules/@workerstack/repo/references/output.md` (overview.md → AGENTS.md; also agent bodies, not auto-injected)
26
+
27
+ ## Skills layout
28
+ - Source: `agents/skills/<name>/SKILL.md`, the one copy (`STOCK_SKILLS_REL` in `cli/scripts/skill-conflicts.ts`) in this repo. A consumer's own skills go to `.repo/skills/<name>/`, and one named like a stock skill replaces it
29
+ - A consumer's `bun repo sync` links each stock skill (and each `.repo/skills/<name>`) into `.agents/skills/<name>` for codex and antigravity and into `.claude/skills/<name>` for claude, as a directory symlink (a junction with an absolute target on Windows): to the generated `.agents/skills/<name>` when there is one, else straight to the skill. Optional packs (`google-workspace` `listen` `speak` `clasp`) are linked only when `agents.skills` names them. In this repo sync links both `.claude/skills/<name>` and `.agents/skills/<name>` straight to `agents/skills/<name>` with a relative link. The package ships no generated trees, so each consumer's sync makes its links
30
+ - Read directly: Codex and Antigravity read `.agents/skills`; Grok reads `.grok/skills`, `.agents/skills` and `.claude/skills` (deduplicated by name); Cursor reads `.cursor/skills`, `.claude/skills`, `.codex/skills`, `.grok/skills` and `.agents/skills` (follows symlinks, deduplicates by realpath)
31
+ - There is no skills generator step: `bun repo sync` only links skills; nothing wipes `.agents/skills`
32
+
33
+ ## Grok hand files
34
+ - `cli/scripts/orchestrate-parent.ts` + `agents/grok/hooks/orchestrate-parent.json` — spawn/fat/stop/persist / SubagentStop intercept / session receipt
35
+ - `bun repo sync` prunes what it wrote last run and no longer plans (the `.repo/tmp/sync.json` manifest); a path outside the manifest is never removed
36
+ - `agents/grok/hooks/rtk.json` — RTK
37
+ - `agents/global-settings/` — `manifest.json` (hosts `claude` `codex` `grok` `antigravity` `cursor`: `format`, `payload`, `dest` under `$HOME`) and one payload per host (`claude.json` `codex.toml` `grok.toml` `antigravity.json` `cursor.json`); `sync-global-settings.ts` (`bun repo yolo`) merges each into its dest (not auto-loaded; project `.grok/config.toml` cannot set `[features]`)
38
+ - `agents/mcp-policy.jsonc` — MCP deny-default SSOT (`default: deny`, `allow: []`)
39
+ - `agents/grok/{roles,hooks}/` — grok's static roles and hook configs; `bun repo sync` copies them into `.grok/roles` and `.grok/hooks`
40
+ - `agents/skills/<name>/` — the one skills source; `bun repo sync` links each into the host skill dirs
41
+
42
+ ## Scripts
43
+ - `cli/scripts/check-globals.ts` — every manifest payload key (minus `skipKeyPattern`) must be present in its `$HOME` dest; project `.grok/config.toml` sets no `[features]` or `[agent]`. Not in `bun repo sync --check`: `bun cli/scripts/check-globals.ts` in this repo and the `bun repo doctor` `globals` row everywhere
44
+ - `cli/scripts/gate-fat-tools.ts`
45
+ - `cli/scripts/scrub-spawn-prompt.ts`
46
+ - `cli/scripts/job.ts` — flags `--job` `--query` `--path` `--glob` (repeatable) `--cwd`; regex in `--query` OK; never `cd &&`; unknown flags / exec shell-meta → FALLBACK
47
+ - `cli/scripts/parse-need.ts`
48
+ - `cli/scripts/persist-handoff.ts` — `.tmp/repo/handoffs/{serial}-{slug}-{stamp}.md`
49
+ - `cli/scripts/persist-tmp.ts` — `.tmp/repo/{serial}-{slug}-{stamp}.{ext}` root files
50
+ - `cli/scripts/persist-plan.ts`
51
+ - `cli/scripts/persist-implementation.ts` — `.tmp/repo/implementations/{serial}-{slug}-{stamp}.md`
52
+ - `cli/scripts/sync-global-settings.ts` — dry-run by default, `--apply` writes `$HOME`, `--host <id>`; report line `{action} {id} {dest}`
53
+ - `cli/scripts/purge-global-mcps.ts`
54
+ - `cli/scripts/emit-mcp-policy.ts`
55
+ - `cli/scripts/emit-agent-shell-tools.ts`
56
+ - `cli/scripts/browser.ts` — session browser rail
57
+ - `cli/scripts/google-workspace.ts` — Sheets Docs Slides Calendar Gmail Drive
58
+ - `cli/scripts/speak.ts` — TTS
59
+ - `cli/scripts/listen.ts` — STT
60
+ - `cli/scripts/setup.ts` — handheld speak / listen / google-workspace / browser (`~/.workerstack/`)
61
+ - `cli/scripts/doctor.ts` — unified prereqs; `globals` row (ok or first drift line); optional google-workspace (`oauth` `tokens` `adc` `clasprc`), speak, clasp, ffmpeg, whisper-cli
62
+
63
+ ## Tmp
64
+ - `.tmp/repo/plans/` — persist-plan; format SSOT = `node_modules/@workerstack/repo/references/plan-format.md`
65
+ - `.tmp/repo/implementations/` — persist-implementation; format SSOT = `node_modules/@workerstack/repo/references/implementation-format.md`
66
+ - `.tmp/repo/orchestrator-logs/` — need-intercept, session-gate, stop-block stamps
67
+ - `.tmp/repo/` — scratch + `/tmp` dumps `{serial}-{slug}-{stamp}.{ext}` at root (not nested `tmp/`)
68
+ - `.tmp/repo/browser/` — browser session/profile/shot/pdf (not MCP)
69
+ - `.tmp/repo/handoffs/` — persist-handoff / `/handoff`
70
+ - `.tmp/repo/stash/` — job / snap overflow
71
+ - `.tmp/repo/sessions/{sid}/` — wrote/read/receipt
72
+ - `.tmp/repo/speak/` — TTS mp3
73
+ - `.tmp/repo/listen/` — STT wav + `latest.txt`
74
+
75
+ ## `.repo/` layout
76
+ Repo-owned content, committed. In this repo `.repo/` holds `lessons/` and the ignored `tmp/`.
77
+ - `lessons/` — one file per lesson plus the generated `INDEX.md`
78
+ - `rules/` — extra rules, merged into `AGENTS.md` (a hand-written `AGENTS.md` that sync finds is adopted as `agents.md`); a stock rule's extra sections go to `<name>-local.md` so the stock text stays live
79
+ - `subagents/` — extra agents; one named like a stock agent replaces it
80
+ - `skills/` — extra skills, linked into each host tree (a real skill dir found under `.agents/skills` or `.claude/skills` moves here)
81
+ - `settings/claude.json` — keys deep-merged into the generated `.claude/settings.json`
82
+ - `mcp.json` — servers deep-merged into the generated `.mcp.json`
83
+ - `hooks.jsonc` — replaces the stock hooks whole
84
+ - `mcp-policy.jsonc` — deep-merged over the stock MCP policy
85
+ - `permissions.json` — path deny rules added to the generated hooks
86
+ - `global-settings/` — a payload of the stock's name here (`claude.json`, `codex.toml`, `grok.toml`, `antigravity.json`, `cursor.json`) replaces that stock payload whole in `bun repo yolo` and the `globals` check; the stock manifest stays
87
+ - `tmp/` — ignored: `sync.json` (the manifest) and `stage/` (the build dir, removed after each sync)
88
+
89
+ ## Generated (do not hand-edit)
90
+ `bun repo sync` writes these from `node_modules/@workerstack/repo` plus `.repo/` for the hosts in `agents.hosts` (default: all five; `HOST_TREES` in `cli/sync/hosts.ts` is the one table). In a consumer they are gitignored and recreated by every `bun install`; in this repo they are committed. `bun repo sync --check` reports drift.
91
+ - `AGENTS.md` — any host on
92
+ - `.mcp.json` — `mcpServers` from policy allow only; claude
93
+ - claude → `.claude/`: `agents/*`, `settings.json` (MCP keys, hooks, the `.repo/settings/claude.json` merge), `skills/<name>` links
94
+ - codex → `.codex/` (`agents/*`, `config.toml` `mcp_servers`, absent when allow empty) and `.agents/skills/<name>` links
95
+ - antigravity → `.agents/`: `agents/*`, `skills/<name>` links, `mcp_config.json`, hooks
96
+ - grok → `.grok/`: `agents/*`, `config.toml` (project MCP `[[permissions]]` + `[plugins] deny_default`; no `[features]`), `roles/scout.toml` and `hooks/*.json` copied from `agents/grok/`; the hook scripts stay in the package's `cli/scripts/`
97
+ - cursor → `.cursor/`: `hooks.json` (hooks-union adds consumer extras), `agents/scout.md`; a real dir, not shipped in the package
98
+ - release pack: `.github/workflows/ci.yml` (tracked, whole-file; the e2e job only when the root has a `test:e2e` script); a hand-written one is refused
99
+ - always: `bunfig.toml`, the managed `.gitignore` block, `references/INDEX.md` sections `repo:skills`, `repo:refs`, `repo:packages` and `repo:stack`, `.repo/lessons/INDEX.md` when lessons exist, `.vscode/tasks.json` (committed in a consumer too)
100
+
101
+ ## Generator divergences
102
+ Where `cli/sync/agents/` differs from the rulesync 43.7.0 it replaced:
103
+ - YAML 1.2 parsing: `yes` stays a string
104
+ - No 80-column folding of long values
105
+ - The `agentsmd` and `codexcli` rule targets both fold into `AGENTS.md` only
106
+ - A leading `./` in a claude hook command becomes `"$CLAUDE_PROJECT_DIR"/`
107
+ - A bad subagent, or a rule without frontmatter, fails sync
@@ -0,0 +1,47 @@
1
+ ---
2
+ tags: [output]
3
+ ---
4
+
5
+ # Output
6
+
7
+ en-US default. Detail behind the reply rules in `overview.md`, which stays the source for voice and shape.
8
+
9
+ Cue names are examples too: example, e.g., for instance, such as, and so on, `…`, `etc.`, a sketched sentence, or one labeled case. Do not reuse one reply for every turn. Pick the count and the form for this case.
10
+
11
+ A closed instruction stays literal. Cues of that kind include only, exactly, just these, verbatim, no others, a schema, an identifier, a command, or quoted text. When an open cue and a closed cue both apply, the closed cue wins.
12
+
13
+ Do not invent a question or let the close introduce new numbers. Completed work uses past verbs and paths. If more work remains, say what. Ask in English when a choice is real.
14
+
15
+ `/su`, `/bro`, `/unslop`, `/blast-radius`, `/correct`, `/teach`, plan files, commit subjects, and job stdout keep their own shape. `/bro` restates a reply that missed the voice in `overview.md`. `/explain` keeps the shape and may lengthen the middle. Repo children do not talk to the user.
16
+
17
+ Job stdout is a sentence plus up to 6 dash facts, cap 8 lines, and an optional `stash=` receipt.
18
+
19
+ ## Example: waiting on the user
20
+
21
+ One case of the class "the user must act before we can finish". Copy the shape, not the words.
22
+
23
+ Cold:
24
+
25
+ > We're waiting on four things, and only the first is mine to do now.
26
+ >
27
+ > 1. Local main isn't pushed. It's 10 commits ahead of origin, including my test fix. Nothing below can start until those commits reach origin.
28
+ > 2. The first public-sync run after that push. It should copy the generated code into each public repo.
29
+ > 3. Publish secrets. None of the public repos I checked has its own secrets or variables. They may be set at the org level, but my token can't read org settings.
30
+ > 4. Your go to publish.
31
+ >
32
+ > Should I push main myself, or keep waiting?
33
+
34
+ Partner:
35
+
36
+ > We're one push away from the first releases, and most of what's left is yours.
37
+ >
38
+ > **You**
39
+ > - Push main, or tell me to. It's 10 commits ahead, including another session's work.
40
+ > - NuGet (`org/sdk-csharp`): add a trusted publishing policy for `release.yml`, and the repo variable `NUGET_USER`.
41
+ > - Maven (`org/sdk-java`): add the user token as `MAVEN_CENTRAL_USERNAME` and `MAVEN_CENTRAL_PASSWORD`, and the GPG key as `MAVEN_GPG_PRIVATE_KEY` plus `MAVEN_GPG_PASSPHRASE`. Skip any already set at the org level; my token can't see org settings.
42
+ >
43
+ > **Me**: writing the test that blocks a release when the spec differs from prod, now. After the push I run the public sync, cut the releases, and verify each registry on Linux, macOS and Windows.
44
+ >
45
+ > Say "publish" when the secrets are in.
46
+
47
+ The partner reply opens on the goal, groups the user's steps by where they do them, says what the agent does next, and ends on one action.
@@ -0,0 +1,264 @@
1
+ # Plan format (SSOT)
2
+
3
+ Local session checklist. Not a design doc, PR stack, or DAG.
4
+
5
+ ## Path
6
+
7
+ `.tmp/repo/plans/{serial}-{slug}-{YYYYMMDDTHHMMSSZ}.md`
8
+
9
+ - **serial:** unpadded decimal int only (`1`, `12`, `10000`). **Never** `0001`, never quoted `"0001"` / `"1"`. Serial ≥ 1.
10
+ - **filename:** unpadded serial, slug, UTC datetime stamp (`6-sync-global-settings-20260826T143000Z.md`, not `0001-slug.md`). Stamp is `created` with `-` and `:` dropped (keep `T` and `Z`).
11
+ - **lookup:** integer equality on leading digits (`1` matches `1-foo-20260826T143000Z.md` and legacy `1-foo.md`; also `0001-foo.md` if an old padded file still exists).
12
+ - **valid filename (new):** `^[0-9]+-[a-z0-9]+(-[a-z0-9]+)*-\d{8}T\d{6}Z\.md$`
13
+ - **valid filename (legacy):** `^[0-9]+-[a-z0-9]+(-[a-z0-9]+)*\.md$` (no stamp; still accepted for existing files)
14
+ - Frontmatter line must match `^serial: [1-9][0-9]*$`. Leading zeros are invalid (YAML octal / VS Code warning).
15
+ - **New writes** always use the stamped filename. Collision: increment serial, rebuild filename, same stamp.
16
+
17
+ ## Slugify (`PLAN_NAME`)
18
+
19
+ Send `PLAN_NAME: <name>` as the body's first line. The save reads the name from it and drops the line wherever it sits above the first `##` outside a code fence, so a body that opens with `commit:` or `strategy:` lines still saves with the card right under the title. A `PLAN_NAME:` line inside a fence or below the first `##` stays as text.
20
+
21
+ 1. lower
22
+ 2. non `[a-z0-9]` → `-`
23
+ 3. collapse `-`, strip edges
24
+ 4. trim to 50 chars; if cut on `-`, strip trailing `-`
25
+ 5. empty → `unnamed`
26
+ 6. strip trailing `.lock` if any
27
+
28
+ ## Allocate next serial (repo, bash)
29
+
30
+ ```bash
31
+ mkdir -p .tmp/repo/plans
32
+ next=1
33
+ for f in .tmp/repo/plans/*; do
34
+ [ -f "$f" ] || continue
35
+ b=$(basename "$f")
36
+ case "$b" in
37
+ [0-9]*.md) n=${b%%-*}; n=$((10#$n)); [ "$n" -ge "$next" ] && next=$((n+1));;
38
+ esac
39
+ done
40
+ # filename prefix: unpadded decimal "$next" (1, 12, 10000)
41
+ ```
42
+
43
+ Collision: if target path exists, increment and retry (max 5).
44
+
45
+ ## Frontmatter (required)
46
+
47
+ ```yaml
48
+ ---
49
+ serial: 1
50
+ name: add-auth
51
+ status: ready # ready | in-progress | done | blocked
52
+ reviews: 0 # settled /review-plan rounds; never lowered or removed
53
+ created: 2026-08-26T14:30:00Z # UTC ISO-8601 seconds + Z; no milliseconds
54
+ source: "<≤120 chars of user task>"
55
+ commit: feat: <subject>
56
+ strategy: default # default | review-fast | review-deep
57
+ mode: away # optional: ask | auto | away
58
+ ---
59
+ ```
60
+
61
+ `name` is the slug only (no datetime). `source` ≤120 chars.
62
+
63
+ `strategy` is required. It says how the plan gets implemented:
64
+
65
+ - `default`: the main session does the work, as it always has. No extra rules apply.
66
+ - `review-fast`: the main session only reviews. Each phase goes to the `implementer-fast` agent. The reviewer reads the real diff, reruns the tests and sends findings back. A second attempt goes to `implementer-deep`.
67
+ - `review-deep`: the same loop, with `implementer-deep` from the first attempt.
68
+
69
+ A save with no `strategy` or an unknown value is denied with `strategy: default|review-fast|review-deep`. A body line `strategy: {value}` moves into the frontmatter after `commit:`, like `commit:`. A line inside a code fence is not moved. The person can change the value with `y <strategy>` when approving, or `h fast` / `h deep` when handing off.
70
+
71
+ `mode` is optional: `ask`, `auto` or `away`. While the plan is `in-progress`, its `mode` wins over the session's `/ask` or `/away` flag, for the session that saved it only. `/write-plan` writes it only when the session runs `/away` or the person asked for a mode. A body line `mode: {value}` moves into the frontmatter after `strategy:`, like `strategy:`; a line inside a code fence is not moved. Another value is denied with `mode: ask|auto|away`.
72
+
73
+ `reviews` counts the `/review-plan` rounds whose findings the writer settled: a whole number with no sign or leading zero, `0` on a new plan. The writer bumps it in the same save that applies a round's findings, even a round with no findings. It never goes down, and once present it cannot be removed, so every Write that sends full frontmatter carries the current `reviews`. The count proves a round ran and was settled, not that the review was good.
74
+
75
+ `created` for **new writes:** `new Date().toISOString()` with milliseconds stripped (`.\d{3}Z` → `Z`), e.g. `2026-08-26T14:30:00Z`. Existing files may still have `created: YYYY-MM-DD`.
76
+
77
+ ### Status machine
78
+
79
+ `ready` → `in-progress` → `done` | `blocked`
80
+
81
+ - Fresh write: `ready`
82
+ - Implement start: `in-progress`, only with `reviews` ≥ 1. The save denies the move with `reviews: 0`, and a missing `reviews` counts as 0. A plan already `in-progress` without the key stays editable
83
+ - All boxes `[x]`: `done`
84
+ - Cannot finish: `blocked` (leave remaining `[ ]`)
85
+
86
+ ## Body headings (this order only)
87
+
88
+ `# {slug}`, the card, `## Goal`, `## Usage`, `## Context`, `## Constraints`, `## Watch-outs`, `## Steps`, `## Verify`, `## Previous mistakes`
89
+
90
+ No other `##` headings. A plan saved before `## Usage` or `## Previous mistakes` existed stays valid without them; a fresh save needs both. Lines inside a code fence are never headings or checkboxes. No PR Plan, Key Decisions, or DAG.
91
+ No required Why heading. Optional why footnote only (not a `##`). Pick2 file plan stays how-first; missing Why heading does not block.
92
+
93
+ ## Card
94
+
95
+ The 5 lines a person reads first: right after `# {slug}` and one blank line, then a blank line before `## Goal`.
96
+
97
+ ```markdown
98
+ WHAT notes export --json prints a JSON array
99
+ WHY scripts parse notes without the table
100
+ RISK empty notebook must print []
101
+ TOUCH src/cli.ts, src/export.ts (+ test)
102
+ DONE bun run test; --json | JSON.parse ok
103
+ ```
104
+
105
+ - Labels `WHAT`, `WHY`, `RISK`, `TOUCH`, `DONE`, in that order, each padded to 7 columns so the text starts at column 8. The text is never empty.
106
+ - Each line is at most 120 characters.
107
+ - The card sums up Goal and Steps for a person reviewing at a glance. It does not replace `## Goal`, which tools and `/review-plan` read.
108
+ - Fresh writes only. An update to a plan saved without a card stays valid.
109
+ - Each failing line has its own deny: `start with the 5-line card after the title: WHAT, WHY, RISK, TOUCH, DONE`, `card line 2 must start with WHY`, `card line 4 (TOUCH) is 131 characters; the limit is 120`.
110
+
111
+ ## Size
112
+
113
+ At most 100 lines above `## Previous mistakes`, frontmatter included. More than that is two or more slices: write a roadmap with `/write-roadmap`. A fresh save over the cap is denied with `131 lines above ## Previous mistakes, the cap is 100; split it into a roadmap (/write-roadmap)`. An update over 100 lines is denied only when it is longer than the saved file, so a legacy plan can still flip boxes. `## Previous mistakes` never counts: it grows during the run.
114
+
115
+ ## Previous mistakes
116
+
117
+ This plan's own log of what went wrong. Last heading, after Verify, no checkboxes. A new plan writes `(none)`.
118
+
119
+ - Entry: `- {source}: {what was wrong} → {what changed}`, optionally ending ` (lesson: {slug})`.
120
+ - `source`: `feedback` (the user sent the plan back), `verify` (a Verify or test failed after a fix), `review` (an accepted `/review-plan` finding), `premise` (an assumption turned out wrong), `decision` (a choice made under away instead of asking).
121
+ - A decision entry is `- decision: {question} → {choice}, because {why}`.
122
+ - Append-only. A save that edits or drops an existing entry is denied and names the entry.
123
+ - An entry that will happen again on other tasks also becomes a lesson: `node_modules/@workerstack/repo/references/lessons.md`.
124
+
125
+ ## Revisions
126
+
127
+ A Write of a saved plan updates that file: same path, serial, and `created`. The given `status` and `[x]` boxes are kept. A body without frontmatter keeps the saved frontmatter. An Edit of a saved plan is checked against the text it would produce and runs as sent when valid. Never save a revision as a new plan.
128
+
129
+ ## Checkbox grammar
130
+
131
+ - Open: `[ ]` (space in box required)
132
+ - Done: `[x]` (accept `[X]`, write `[x]`)
133
+ - Line: `^{id} [ ] {text}$` with optional 0–2 space indent
134
+ - `{id}` = `N` / `N.M` / `N.M.K` (digits + dots). **Not** `1. [ ]`. **Not** GitHub `- [ ]`
135
+ - Fresh plans: all `[ ]`, never `[x]`
136
+ - Marking done: only flip the box. No renumber, delete, or rewrite leaf text
137
+ - Depth 2 default (`N` phase + `N.M` leaf). 3rd level only if a leaf would itself be a mini-plan
138
+ - Every phase `N` has ≥1 leaf `N.M`. The session agent **executes leaves**. Roll up: all children `[x]` ⇒ parent `[x]`
139
+ - Verify = last numbered phase, same grammar
140
+ - A Read leaf (``N.M [ ] read `principle-…` ``) sits in the phase it gates, before the leaves it governs. A phase whose every leaf reads a principle gates nothing and is denied on a fresh write: `phase 1 only reads principles; move each read into the phase it gates`. An update is denied only when the saved file had no such phase. Verify reads `principle-prove-it-works` beside its command leaves
141
+ - Done plan: every checkbox `[x]`, `status: done`
142
+
143
+ ## Parallel phases
144
+
145
+ A phase line may end `(parallel: <path>, <path>, …)`, listing every file its leaves write, repo-relative and comma-separated:
146
+
147
+ ```markdown
148
+ 2 [ ] Parser (parallel: src/parse.ts, src/parse.test.ts)
149
+ 2.1 [ ] add the parser in src/parse.ts
150
+ 3 [ ] Printer (parallel: src/print.ts, src/print.test.ts)
151
+ 3.1 [ ] add the printer in src/print.ts
152
+ ```
153
+
154
+ - Adjacent parallel phases form a group whose phases can run at the same time. A group needs two or more phases, and no two of its lists may share a path.
155
+ - Paths are compared as written, never resolved on disk; `\` reads as `/`, so `src\cli.ts` and `src/cli.ts` are the same path.
156
+ - Denies: `parallel phases 2 and 3 both list src/cli.ts; parallel phases need disjoint files`, `phase 4 is parallel alone; parallel needs two or more adjacent phases`, `phase 2 is parallel with no files; list the files it writes after parallel:`.
157
+ - Under a review strategy a group runs at once as `references/review-loop.md` says; `bun repo phase-files <plan> <phases>` checks that each phase wrote only its list.
158
+ - Every path a parallel phase's leaves name sits in its list. The save cannot see that; `/review-plan` checks it.
159
+
160
+ ## Prose vs steps
161
+
162
+ | Section | Amount |
163
+ |---|---|
164
+ | Goal | 1–3 sentences. What “done” means. |
165
+ | Usage | What a person or agent types and sees once the plan lands: each new or changed command, flag, output, error message, or file, in fenced blocks, with the before for each changed one. Internal steps nobody types or reads need none. A plan with no visible change writes one line: `No visible change:` and why. |
166
+ | Context / Constraints / Watch-outs | bullets only. Watch-outs: non-obvious footguns; empty allowed (`(none)`). A new plan that names a file a lesson matches cites that lesson path in Watch-outs, or the save is denied. Context includes `Task type:`, `Named checks:` from `node_modules/@workerstack/repo/references/scope.md` ## Types, and a skip-with-reason when a named check is dropped. |
167
+ | Steps | bulk of the file; each leaf = one coherent edit or one file-level action |
168
+ | Verify | 1–5 runnable leaves (cmd or observable) |
169
+
170
+ Tests live in Steps (not a new heading). New behavior or a bug: a failing test leaf before the impl leaf. Other behavior change: a test leaf immediately after the impl leaf. Docs, rename-only, config-only, generated: no test leaf. Verify is the end gate (project cmd or named subset), not a substitute for those leaves. Do not re-run the whole suite after every leaf unless it is cheap.
171
+
172
+ Thinker cites **repo-relative paths** (`cli/scripts/x.ts`). The plan's worktree `{serial}-{name}` does not exist until the serial is saved, so `/implement-plan` applies each path inside that worktree; an absolute path under the root is accepted too and names the same path there. Leaves must be implementable without re-planning. Product fork → pick the narrowest default, state it under Constraints, still emit steps.
173
+
174
+ ## Validation checklist
175
+
176
+ - filename matches new stamped regex or legacy unstamped; new writes unpadded + stamp (`1-foo-20260826T143000Z.md` not `0001-foo.md`); serial int equals leading digits; `name` equals slug after stripping optional trailing `-\d{8}T\d{6}Z`
177
+ - frontmatter `serial` line matches `^serial: [1-9][0-9]*$` (unpadded decimal ≥ 1; reject `0001`, `"0001"`, `0`, `01`)
178
+ - frontmatter keys: `serial`, `name`, `status`, `reviews`, `created`, `source`, `strategy`. `strategy` is required and is `default`, `review-fast` or `review-deep`; a save without it, or with another value, is invalid. Optional `mode` is `ask`, `auto` or `away`; another value is invalid. `reviews` matches `^(0|[1-9][0-9]*)$`, is `0` on a fresh write, is not lowered or removed on an update, and is ≥ 1 for a change into `in-progress`; a legacy plan without it stays valid. Optional `commit:` is a Conventional Commits subject (`type(scope): subject`, scope optional, imperative lowercase, no trailing period). A new plan includes it. A plan with no `commit` key stays valid. A present `commit` that is not that subject is invalid
179
+ - `status` ∈ `ready` | `in-progress` | `done` | `blocked`; `created` `YYYY-MM-DDTHH:MM:SSZ` (new writes) or legacy `YYYY-MM-DD`; `source` ≤120
180
+ - headings in order only; no extra `##`; `## Usage` right after `## Goal`, required on a fresh write and optional on an update to a plan saved without it, holding a fenced block or a `No visible change:` line; lines inside code fences are never headings or checkboxes; `## Previous mistakes` last and required on a fresh write, entries valid and append-only on an update; fresh write cites every matched lesson in Watch-outs; no required Why heading (optional footnote only)
181
+ - ≥1 `N.M [ ]` leaf; every phase has ≥1 leaf; Verify is last numbered phase
182
+ - `PLAN_NAME:` dropped wherever it sits above the first `##` outside a fence
183
+ - ≤100 lines above `## Previous mistakes`, frontmatter included; an update over 100 only when no longer than the saved file
184
+ - no phase whose every leaf reads a principle, on a fresh write or on an update whose saved file had none
185
+ - `(parallel: …)` phases come in adjacent groups of two or more, each with a non-empty list, lists disjoint after `\` → `/`
186
+ - checkbox grammar (`N [ ]` / `N.M [ ]` / `N.M.K [ ]`); no `- [ ]`; no `1. [ ]`
187
+ - fresh write: the card right after `# {slug}` and one blank line, `WHAT` `WHY` `RISK` `TOUCH` `DONE` in order, padded to 7 columns, text non-empty, each line ≤120 characters; zero `[x]` / `[X]`; Goal 1–3 sentences; Context/Constraints/Watch-outs bullets; Context includes `Task type:`, `Named checks:`, and a skip-with-reason when a named check is dropped; frontmatter includes `commit:` and `strategy:`; Verify 1–5 leaves
188
+
189
+ ## Worked example
190
+
191
+ File: `.tmp/repo/plans/1-notes-export-json-20260826T143000Z.md`
192
+
193
+ ````markdown
194
+ ---
195
+ serial: 1
196
+ name: notes-export-json
197
+ status: ready
198
+ reviews: 0
199
+ created: 2026-08-26T14:30:00Z
200
+ source: "add --json to notes export"
201
+ commit: feat(notes): add --json to notes export
202
+ strategy: default
203
+ ---
204
+
205
+ # notes-export-json
206
+
207
+ WHAT notes export --json prints every note as one JSON array
208
+ WHY scripts read notes without parsing the text table
209
+ RISK an empty notebook must print [], and the table stays the default
210
+ TOUCH src/cli.ts, src/export.ts (+ test)
211
+ DONE bun run test passes; notes export --json | JSON.parse exits 0
212
+
213
+ ## Goal
214
+ `notes export --json` prints every note as one JSON array on stdout, so scripts read notes without parsing the text table. The text table stays the default.
215
+
216
+ ## Usage
217
+ Before:
218
+
219
+ ```console
220
+ $ notes export --json
221
+ error: unknown flag --json
222
+ ```
223
+
224
+ After:
225
+
226
+ ```console
227
+ $ notes export --json
228
+ [{"id":1,"title":"groceries","updated":"2026-08-26T14:00:00Z"}]
229
+ $ notes export
230
+ 1 groceries 2026-08-26 14:00
231
+ ```
232
+
233
+ ## Context
234
+ - Task type: feature
235
+ - Named checks: failing test before impl; read `principle-test-behavior-not-implementation`
236
+ - `/home/ecomet/Development/example-app/src/cli.ts` parses flags; `/home/ecomet/Development/example-app/src/export.ts` prints the table
237
+ - Rejected: a separate `notes json` command, which splits one export into two
238
+
239
+ ## Constraints
240
+ - Keys are `id`, `title`, `updated`, in that order; `updated` is ISO 8601 UTC
241
+ - No new dependency
242
+
243
+ ## Watch-outs
244
+ - An empty notebook prints `[]`, not nothing
245
+
246
+ ## Steps
247
+ 1 [ ] Failing test
248
+ 1.1 [ ] read `principle-test-behavior-not-implementation`
249
+ 1.2 [ ] in `/home/ecomet/Development/example-app/src/export.test.ts`, `notes export --json` on two notes prints a two-element array with those keys, and on none prints `[]`
250
+ 1.3 [ ] run `bun run test export`; the new cases fail on the unknown flag
251
+ 2 [ ] Implement
252
+ 2.1 [ ] parse `--json` in `/home/ecomet/Development/example-app/src/cli.ts`
253
+ 2.2 [ ] in `/home/ecomet/Development/example-app/src/export.ts`, print `JSON.stringify` of the notes when `--json` is set
254
+ 2.3 [ ] run the test from 1.3; all pass
255
+
256
+ ## Verify
257
+ 3 [ ] Verify
258
+ 3.1 [ ] read `principle-prove-it-works`
259
+ 3.2 [ ] `bun run test` passes
260
+ 3.3 [ ] `notes export --json | node -e "JSON.parse(require('fs').readFileSync(0, 'utf8'))"` exits 0
261
+
262
+ ## Previous mistakes
263
+ (none)
264
+ ````
@@ -0,0 +1,48 @@
1
+ ---
2
+ tags: [review-loop]
3
+ ---
4
+
5
+ # Review loop
6
+
7
+ Read this when the plan's `strategy` is `review-fast` or `review-deep`. You are the reviewer. An implementer agent writes the product code. Values: `plan-format.md`. Gate rules: `hooks.md`.
8
+
9
+ ## Start
10
+
11
+ The first action, at start or on resume, is a plan save (a status or box edit). It stamps the session. Until it runs, the gate does not know this session reviews.
12
+
13
+ ## Phases
14
+
15
+ - Phases run in order; each goes to one implementer: `implementer-fast` first on `review-fast`, `implementer-deep` on `review-deep` (`implementerOf(strategy, 1)`). A parallel group spawns its implementers in one message. Each brief lists its phase's files as the only ones it writes; that list is guidance, and `bun repo phase-files` is the check. A parallel implementer runs only its phase's tests, never `sync` or the full suite. After the round, run `phase-files`, then stage each passed phase by name, one at a time, and run the full suite once. A failed phase reruns alone.
16
+ - The brief is that phase's leaves, plus the findings to fix. The agent file holds the rest of its rules. The spawn prompt names the plan's worktree path (`<root>/.worktrees/{serial}-{name}`): a Claude subagent starts in the parent's cwd, the root, where the gate denies a product write. Run `bun repo worktree add {serial}-{name}` first if it is missing.
17
+ - A Read leaf in a phase goes to that phase's implementer with the brief: it reads the principle, you do not. You read only `principle-prove-it-works`, before Verify.
18
+ - Your own product writes are denied. The plan, the journal and `.tmp/` stay writable.
19
+ - Only you tick boxes and write the journal. Write one entry per round.
20
+
21
+ ## Review
22
+
23
+ - Read the implementer's report: `changed:`, `tests:`, `status:`. A missing report or a status other than `done` is a failed round.
24
+ - Read the real `git diff` in the worktree and rerun the phase's tests yourself. Do not trust the report.
25
+ - Send findings back to the same implementer. Continue it where the harness allows. Otherwise respawn it with the findings and the current diff.
26
+ - A phase passes when the diff matches its leaves and your test run is green.
27
+
28
+ ## Baseline
29
+
30
+ The index is the baseline. After a phase passes, stage only the implementer's `changed:` files that the phase's leaves name: `git add -- <files>`. Never `git add -A` on this shared tree. The next phase's `git diff` (unstaged) then shows only that phase. The implementer never stages or commits.
31
+
32
+ ## Escalate
33
+
34
+ After 3 failed rounds, a missing report or a status other than `done`, spawn `implementerOf(strategy, 2)` fresh with the findings. If that one fails the same way, set the plan `blocked` and add a `- blocked:` journal entry.
35
+
36
+ ## Commit
37
+
38
+ One commit at the end, in the worktree, as `implement-plan` says; `/commit` then runs `finish` from the root. It holds only this plan's files.
39
+
40
+ ## Dumps
41
+
42
+ You and the implementer send big output through `bun repo job`. The gate rewrites a plain test run to `--job test`. Use `--job exec` for any other large command. Neither of you spawns scout for the implementer's work.
43
+
44
+ ## Not enforced
45
+
46
+ The gate denies your product writes on claude (Grok runs through it) and codex.
47
+
48
+ Not enforced on: antigravity, cursor. There, make no product writes yourself; every product edit goes through the implementer.
@@ -0,0 +1,104 @@
1
+ # Roadmap format (SSOT)
2
+
3
+ Ordered program of child plans. Not a plan, a handoff, or a design doc.
4
+
5
+ ## Path
6
+
7
+ `.tmp/repo/roadmaps/{serial}-{slug}-{YYYYMMDDTHHMMSSZ}.md`
8
+
9
+ - **serial:** unpadded decimal int ≥ 1. Never `0001`.
10
+ - **filename:** `^[0-9]+-[a-z0-9]+(-[a-z0-9]+)*-\d{8}T\d{6}Z\.md$`
11
+ - Create mints the next serial. A later write of an existing file keeps that path and serial. The hook validates the update and the host writes it. An Edit of a saved roadmap is checked against the text it would produce, and a valid one runs as sent.
12
+ - Child plans stay in `.tmp/repo/plans/`.
13
+
14
+ ## Frontmatter
15
+
16
+ ```yaml
17
+ ---
18
+ serial: 1
19
+ name: auth-program
20
+ status: draft # draft | locked | in-progress | done | blocked
21
+ reviews: 0 # settled /review-roadmap rounds; never lowered or removed
22
+ created: 2026-10-25T18:00:00Z
23
+ source: "<≤120 chars>"
24
+ strategy: default # default | review-fast | review-deep
25
+ mode: away # optional: ask | auto | away
26
+ ---
27
+ ```
28
+
29
+ `draft` → `locked` → `in-progress` → `done` | `blocked`.
30
+
31
+ `strategy` is required: `default`, `review-fast` or `review-deep`. It means what it means in a plan (see `plan-format.md`). On a roadmap it is the default its slices copy: each slice plan starts with the roadmap's value, unless that slice's scope argues for another. A save with no `strategy` or an unknown value is denied with `strategy: default|review-fast|review-deep`. A body-only save may send a bare `strategy: {value}` line above `ROADMAP_NAME:`, and a save that omits it keeps the saved value. The person can change the value with `y <strategy>` when approving, or `h fast` / `h deep` when handing off.
32
+
33
+ `mode` is optional: `ask`, `auto` or `away`, as in a plan (see `plan-format.md`). A body-only save may send a bare `mode: {value}` line above `ROADMAP_NAME:`, and a save that omits it keeps the saved value. Another value is denied with `mode: ask|auto|away`.
34
+
35
+ `/implement-roadmap` refuses `draft`.
36
+
37
+ `reviews` counts the `/review-roadmap` rounds whose findings the writer settled. It starts at `0`, never goes down, and once present cannot be removed. A body-only save sends it as a bare `reviews: {n}` line above `ROADMAP_NAME:`, and a save that omits it keeps the saved count. Moving into `locked` needs `reviews` ≥ 1; a missing key counts as 0. A roadmap already past `draft` without the key stays editable.
38
+
39
+ ## Body (this order only)
40
+
41
+ A roadmap is pointers: what each slice ships, in order. Decisions, Usage, context and the why of each slice go into that slice's plan, which `/implement-roadmap` writes.
42
+
43
+ ```
44
+ # auth-program
45
+
46
+ WHAT auth ships as two slices: reserved types first, then the commit diff pass
47
+ WHY later slices add skills, so their names must be reserved first
48
+ RISK init and INDEX drift apart when a name changes
49
+ TOUCH init reserved names, INDEX, commit skills
50
+ DONE both slices done; repo init lists auth-types
51
+
52
+ ## Order
53
+ 1 [ ] auth types: Reserved names list the new skills.
54
+ Location: /home/me/app/.tmp/repo/plans/14-auth-types-20261025T165531Z.md
55
+ 2 [ ] commit diff pass: Commit skills strip narrating comments.
56
+
57
+ ## Verify
58
+ 3 [ ] Verify
59
+ 3.1 [ ] both child plans have finished Verify
60
+
61
+ ## Previous mistakes
62
+ (none)
63
+ ```
64
+
65
+ - **Card:** the 5 lines after `# {slug}` and one blank line, as in a plan (`plan-format.md`): WHAT, WHY, RISK, TOUCH, DONE, text at column 8, at most 120 characters each.
66
+ - **Headings:** `## Order`, `## Verify`, `## Previous mistakes`, nothing else. Lines inside a code fence are never headings. A new roadmap with any other `##` is denied with `a new roadmap has only ## Order, ## Verify and ## Previous mistakes; move ## {heading} into the slice plans`.
67
+ - **Slice:** one line, `N [ ] {title, 2–6 words}: {one sentence}`. The sentence says what that slice's plan ships. A slice that breaks it is denied with `slice N needs "N [ ] {title, 2–6 words}: {one sentence}"`.
68
+ - **Location:** an optional indented line under the slice. Omit it in a draft. `/implement-roadmap` sets it to the absolute plan path `/write-plan` reported; a slice that has one does not get a second plan. A relative `.tmp/repo/plans/{file}` also resolves.
69
+ - `[x]` only after that child plan's Verify is done.
70
+ - **Verify:** 1–5 runnable program gates, same `N.M [ ]` grammar as plans.
71
+ - **Previous mistakes:** `(none)`, or one entry per line. Append-only.
72
+ - **Cap:** at most 60 lines above `## Previous mistakes`, frontmatter included, `Location:` lines not counted, so filling them in mid-run never trips it. A fresh save past 60 is denied with `{n} lines above ## Previous mistakes, the cap is 60; move detail into the slice plans`; an update only when it grows past both 60 and the saved file.
73
+
74
+ A roadmap has at least two slices. One slice is `/write-plan`.
75
+
76
+ ### Roadmaps saved before pointers
77
+
78
+ A roadmap saved with `## Goal` keeps that shape and its rules for every later save, even one that deletes `## Goal`: the saved file decides. Its headings are `# {slug}`, `## Goal` (1–3 sentences), `## Usage`, `## Context`, `## Decisions`, `## Order`, `## Watch-outs`, `## Verify`, `## Previous mistakes`; Context, Decisions and Watch-outs are bullets, each decision naming the rejected alternative. Each slice is `N [ ] Title: {2–6 words}` with indented `Goal:` (one sentence), `Why:` (one or two sentences) and the optional `Location:`. It has no card and no cap. One saved before `## Usage` or `## Previous mistakes` existed stays valid without them.
79
+
80
+ ## Previous mistakes
81
+
82
+ Mistakes about the program: slice order, slice boundaries, a premise later slices lean on, and on an old-shape roadmap a Decision that turned out wrong. A mistake inside one slice stays in that child plan.
83
+
84
+ ```
85
+ - {feedback|verify|review|premise|decision|slice}: {what was wrong} → {what changed}
86
+ - decision: {question} → {choice}, because {why}
87
+ ```
88
+
89
+ - `feedback`, `review`, `premise` and `decision` mean what they mean in a plan. `verify` is a failed program Verify gate.
90
+ - `slice` is roadmap-only: what child plan N found that changed the Order or a later slice (or a Decision on an old-shape roadmap). The same save makes that change.
91
+ - Optional ` (lesson: {slug})` at the end when the entry is also a lesson.
92
+ - `/implement-roadmap` copies each entry that touches a slice into that slice's plan Watch-outs, and promotes entries that outlive the program to lessons before `done`.
93
+
94
+ ## Validation checklist
95
+
96
+ - filename stamped and unpadded; `name` equals the slug
97
+ - `status` is one of the five values; `source` ≤120; `strategy` is one of the three values; `mode`, when present, is `ask`, `auto` or `away`
98
+ - a new roadmap: the card; only Order, Verify and Previous mistakes, in that order; ≥2 one-line slices, title 2–6 words, one sentence; at most 60 lines above Previous mistakes without `Location:` lines
99
+ - an update keeps the saved file's shape; an old-shape one keeps the old checks: headings in order, Goal 1–3 sentences, bulleted Context, Decisions and Watch-outs, ≥2 slices each with Title (2–6 words), one-sentence Goal and Why (1–2 sentences)
100
+ - Location, when present, is the absolute plan path (a relative `.tmp/repo/plans/{file}` still resolves)
101
+ - Verify has 1–5 leaves
102
+ - `## Previous mistakes` is last, required on a fresh create, and keeps every saved entry unchanged and in order
103
+ - `reviews` is a whole number, never lower than the saved one; `locked` needs at least 1
104
+ - a fresh create is `draft`, `reviews: 0`, and has no `[x]`
@@ -0,0 +1,27 @@
1
+ ---
2
+ tags: [rtk]
3
+ ---
4
+
5
+ # RTK
6
+
7
+ Shell stdout compression. PreToolUse: Bash → `rtk <cmd>`. Not Read/Grep/Glob/prompts/images.
8
+
9
+ Grok PostToolUse is observe-only — do not attempt output scrub; compress via RTK / spawn / isolation facts only.
10
+
11
+ ## Commands
12
+
13
+ ls · tree · read · smart · git · gh · glab · clasp · aws · psql · pnpm · err · test · json · deps · env · find · diff · log · dotnet · docker · kubectl · oc · summary · grep · rg · init · wget · wc · gain · cc-economics · config · jest · vitest · prisma · tsc · next · lint · prettier · format · playwright · lightpanda · cargo · npm · npx · curl · discover · session · telemetry · learn · run · proxy · pipe · trust · untrust · verify · ruff · pytest · mypy · rake · rubocop · rspec · pip · go · gt · golangci-lint · gradlew · mvn · hook-audit · rewrite · hook · help
14
+
15
+ **git:** diff · log · status · show · add · commit · push · pull · branch · fetch · stash (list show pop apply drop push) · worktree
16
+ **cargo:** build · test · clippy · check · install · nextest
17
+ **go:** test · build · vet
18
+ **docker:** ps · images · logs · compose (ps logs build)
19
+ **gh:** pr · issue · run · repo
20
+ **clasp:** login · logout · create · clone · pull · push · status · open · run · deploy · logs · setting
21
+
22
+ Flags: `-v`/`-vv`/`-vvv` · `--ultra-compact` · `--skip-env` · `-h` · `-V`
23
+
24
+ Unknown cmds passthrough. `rtk run` unfiltered.
25
+
26
+ **playwright:** test-runner family only — not the browser rail.
27
+ **lightpanda:** browser-rail CDP via `bun repo browser` (not MCP, not env).