@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,353 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Code-only folder map for agents. Folders, never files.
4
+ *
5
+ * Source: git ls-files (tracked + untracked, gitignore applied). A folder is
6
+ * shown when it or a descendant holds a code file and no segment is skipped.
7
+ * Package roots (package.json, go.mod, Cargo.toml, pyproject.toml) carry
8
+ * `# name path`. Single-child chains collapse; plain leaf dirs fold at foldAt.
9
+ * Depth is uniform per package: the deepest level that fits the size limit;
10
+ * deeper folders end in `…`.
11
+ *
12
+ * bun repo map [dir]
13
+ */
14
+ import { spawnSync } from "node:child_process";
15
+ import fs from "node:fs";
16
+ import path from "node:path";
17
+ import { isRecord } from "./hook-input.ts";
18
+ import { stripJsonc } from "./jsonc.ts";
19
+
20
+ /** The knobs `.repo/map.jsonc` may set. */
21
+ export interface MapConfig {
22
+ budget: number;
23
+ depthCap: number;
24
+ foldAt: number;
25
+ codeExt: string[];
26
+ skip: string[];
27
+ include: string[];
28
+ exclude: string[];
29
+ }
30
+
31
+ /** Config plus the hook's own character cap. */
32
+ export interface MapOptions extends Partial<MapConfig> {
33
+ maxChars?: number;
34
+ }
35
+
36
+ /** A folder in the raw tree. `own` = holds a kept file directly; `pkg` is the package name ("" when unnamed) on package roots, else null. */
37
+ export interface TreeNode {
38
+ name: string;
39
+ path: string;
40
+ kids: Map<string, TreeNode>;
41
+ own: boolean;
42
+ pkg: string | null;
43
+ }
44
+
45
+ export interface FoldRow {
46
+ kind: "fold";
47
+ label: string[];
48
+ path: string;
49
+ pkg: null;
50
+ kids: Row[];
51
+ }
52
+
53
+ export interface DirRow {
54
+ kind: "dir";
55
+ label: string;
56
+ path: string;
57
+ pkg: string | null;
58
+ kids: Row[];
59
+ }
60
+
61
+ export type Row = FoldRow | DirRow;
62
+
63
+ export interface FolderMapResult {
64
+ text: string;
65
+ rows: number;
66
+ tokens: number;
67
+ depth: number;
68
+ }
69
+
70
+ const NUMBER_KEYS = ["budget", "depthCap", "foldAt"] as const;
71
+ const LIST_KEYS = ["codeExt", "skip", "include", "exclude"] as const;
72
+ const isStringList = (v: unknown): v is string[] => Array.isArray(v) && v.every((x) => typeof x === "string");
73
+ const isNumberKey = (k: string): k is (typeof NUMBER_KEYS)[number] => (NUMBER_KEYS as readonly string[]).includes(k);
74
+ const isListKey = (k: string): k is (typeof LIST_KEYS)[number] => (LIST_KEYS as readonly string[]).includes(k);
75
+
76
+ export const DEFAULTS: Readonly<MapConfig> = Object.freeze({
77
+ budget: 5000,
78
+ depthCap: 6,
79
+ foldAt: 12,
80
+ codeExt: ["ts", "tsx", "js", "jsx", "mjs", "cjs", "py", "go", "rs", "sql", "vue", "svelte", "astro"],
81
+ skip: [
82
+ "_gen",
83
+ "gen",
84
+ "generated",
85
+ "dist",
86
+ "build",
87
+ "assets",
88
+ "static",
89
+ "public",
90
+ "fixtures",
91
+ "__fixtures__",
92
+ "__snapshots__",
93
+ "__mocks__",
94
+ "testdata",
95
+ "vendor",
96
+ "migrations",
97
+ "locales",
98
+ "i18n",
99
+ ],
100
+ include: [],
101
+ exclude: [],
102
+ });
103
+
104
+ export const CONFIG_REL = ".repo/map.jsonc";
105
+ const MANIFESTS = ["package.json", "go.mod", "Cargo.toml", "pyproject.toml"];
106
+
107
+ /** DEFAULTS merged with known keys from CONFIG_REL; bad file → defaults + warn. */
108
+ export function loadMapConfig(
109
+ root: string,
110
+ warn: (msg: string) => void = (m) => process.stderr.write(`${m}\n`),
111
+ ): MapConfig {
112
+ const abs = path.join(root, CONFIG_REL);
113
+ if (!fs.existsSync(abs)) return { ...DEFAULTS };
114
+ let raw: unknown;
115
+ try {
116
+ raw = JSON.parse(stripJsonc(fs.readFileSync(abs, "utf8")));
117
+ } catch (err) {
118
+ warn(
119
+ `repo map: ignoring ${CONFIG_REL}: ${(err /* readFileSync, stripJsonc and JSON.parse throw Errors */ as Error).message}`,
120
+ );
121
+ return { ...DEFAULTS };
122
+ }
123
+ const out: MapConfig = { ...DEFAULTS };
124
+ for (const [k, v] of Object.entries(isRecord(raw) ? raw : {})) {
125
+ if (isNumberKey(k)) {
126
+ if (typeof v === "number" && Number.isFinite(v) && v > 0) out[k] = v;
127
+ else warn(`repo map: ignoring ${CONFIG_REL} key ${k}`);
128
+ } else if (isListKey(k)) {
129
+ if (isStringList(v)) out[k] = v;
130
+ else warn(`repo map: ignoring ${CONFIG_REL} key ${k}`);
131
+ }
132
+ }
133
+ return out;
134
+ }
135
+
136
+ function git(args: string[], cwd: string): string | null {
137
+ const r = spawnSync("git", args, { cwd, encoding: "utf8", maxBuffer: 256 * 1024 * 1024 });
138
+ return r.status === 0 ? r.stdout : null;
139
+ }
140
+
141
+ /** Repo top, or null outside git. */
142
+ export function repoRoot(cwd: string): string | null {
143
+ const top = git(["rev-parse", "--show-toplevel"], cwd);
144
+ return top ? top.trim() : null;
145
+ }
146
+
147
+ /**
148
+ * Repo-relative posix path of `abs` ("" at the top), or null when it is not a
149
+ * dir in a repo. Asks git so Windows short (8.3) vs long paths cannot diverge.
150
+ */
151
+ export function repoPrefix(abs: string): string | null {
152
+ if (!fs.existsSync(abs) || !fs.statSync(abs).isDirectory()) return null;
153
+ const prefix = git(["rev-parse", "--show-prefix"], abs);
154
+ return prefix == null ? null : prefix.trim().replace(/\/$/, "");
155
+ }
156
+
157
+ /** Tracked + untracked-unignored files, repo-relative, posix. */
158
+ export function listFiles(root: string): string[] | null {
159
+ const out = git(["ls-files", "-z", "--cached", "--others", "--exclude-standard"], root);
160
+ if (out == null) return null;
161
+ return [...new Set(out.split("\0").filter(Boolean))];
162
+ }
163
+
164
+ /** `*` = one segment, `**` = any depth; matches the dir and everything under it. */
165
+ function globRe(glob: string): RegExp {
166
+ const body = String(glob)
167
+ .replace(/\/+$/, "")
168
+ .split("**")
169
+ .map((part) => part.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, "[^/]*"))
170
+ .join(".*");
171
+ return new RegExp(`^${body}(/|$)`);
172
+ }
173
+
174
+ function packageName(root: string, dir: string, manifest: string): string {
175
+ try {
176
+ const text = fs.readFileSync(path.join(root, dir, manifest), "utf8");
177
+ if (manifest === "package.json") {
178
+ const pkg: unknown = JSON.parse(text);
179
+ return isRecord(pkg) && typeof pkg.name === "string" ? pkg.name : "";
180
+ }
181
+ if (manifest === "go.mod") return (text.match(/^module\s+(\S+)/m) || [])[1] || "";
182
+ return (text.match(/^name\s*=\s*"([^"]+)"/m) || [])[1] || "";
183
+ } catch {
184
+ return "";
185
+ }
186
+ }
187
+
188
+ /**
189
+ * Raw tree from file paths. Node: { name, path, kids: Map, own, pkg }.
190
+ * `own` = holds a kept file directly. `pkg` is the package name ("" when
191
+ * unnamed) on package roots, else null.
192
+ */
193
+ export function buildTree(root: string, files: string[], opts: Partial<MapConfig> = {}): TreeNode {
194
+ const o = { ...DEFAULTS, ...opts };
195
+ const code = new RegExp(`\\.(${o.codeExt.join("|")})$`);
196
+ const skip = new Set(o.skip);
197
+ const include = o.include.map(globRe);
198
+ const exclude = o.exclude.map(globRe);
199
+ const manifests = new Map<string, string>();
200
+ for (const f of files) {
201
+ const base = path.posix.basename(f);
202
+ if (MANIFESTS.includes(base) && !manifests.has(path.posix.dirname(f))) {
203
+ manifests.set(path.posix.dirname(f), base);
204
+ }
205
+ }
206
+ const top: TreeNode = { name: "", path: "", kids: new Map(), own: false, pkg: null };
207
+ for (const f of files) {
208
+ const dir = path.posix.dirname(f);
209
+ if (dir === ".") continue;
210
+ if (exclude.some((re) => re.test(dir))) continue;
211
+ const forced = include.some((re) => re.test(dir));
212
+ const segs = dir.split("/");
213
+ if (!forced) {
214
+ if (!code.test(f)) continue;
215
+ if (segs.some((s) => s.startsWith(".") || skip.has(s))) continue;
216
+ }
217
+ let node = top;
218
+ for (const s of segs) {
219
+ let next = node.kids.get(s);
220
+ if (!next) {
221
+ const p = node.path ? `${node.path}/${s}` : s;
222
+ const m = manifests.get(p);
223
+ next = {
224
+ name: s,
225
+ path: p,
226
+ kids: new Map<string, TreeNode>(),
227
+ own: false,
228
+ pkg: m ? packageName(root, p, m) : null,
229
+ };
230
+ node.kids.set(s, next);
231
+ }
232
+ node = next;
233
+ }
234
+ node.own = true;
235
+ }
236
+ return top;
237
+ }
238
+
239
+ /**
240
+ * Display tree: chains collapsed, leaf dirs folded.
241
+ * Row: { kind: "dir"|"fold", label, path, pkg, kids: Row[] }.
242
+ */
243
+ export function displayRows(node: TreeNode, opts: Partial<MapConfig> = {}): Row[] {
244
+ const o = { ...DEFAULTS, ...opts };
245
+ const names = [...node.kids.keys()].sort();
246
+ const leaves = names.filter((n) => {
247
+ const k = node.kids.get(n)!; // n comes from node.kids.keys()
248
+ return k.kids.size === 0 && k.pkg == null;
249
+ });
250
+ const folded = leaves.length >= o.foldAt ? new Set(leaves) : new Set<string>();
251
+ const rows: Row[] = [];
252
+ if (folded.size) {
253
+ rows.push({ kind: "fold", label: leaves, path: node.path, pkg: null, kids: [] });
254
+ }
255
+ for (const n of names) {
256
+ if (folded.has(n)) continue;
257
+ let k = node.kids.get(n)!; // n comes from node.kids.keys()
258
+ let label = n;
259
+ // Collapse pass-through dirs only; a dir with its own code stays a row.
260
+ while (k.kids.size === 1 && k.pkg == null && !k.own) {
261
+ const only = k.kids.values().next().value!; // size is 1 here
262
+ label = `${label}/${only.name}`;
263
+ k = only;
264
+ }
265
+ rows.push({ kind: "dir", label, path: k.path, pkg: k.pkg, kids: displayRows(k, o) });
266
+ }
267
+ return rows;
268
+ }
269
+
270
+ export function rowText(
271
+ row: Row,
272
+ depth: number,
273
+ { more = false, base = "" }: { more?: boolean; base?: string } = {},
274
+ ): string {
275
+ const pad = " ".repeat(depth);
276
+ if (row.kind === "fold") {
277
+ const shown = row.label.slice(0, 6).join(", ");
278
+ return `${pad}(${row.label.length} leaf dirs: ${shown}${row.label.length > 6 ? ", …" : ""})`;
279
+ }
280
+ const full = base ? `${base}/${row.path}` : row.path;
281
+ let line = `${pad}${row.label}/`;
282
+ if (row.pkg != null) line += row.pkg ? ` # ${row.pkg} ${full}` : ` # ${full}`;
283
+ if (more) line += " …";
284
+ return line;
285
+ }
286
+
287
+ export function tokens(text: string): number {
288
+ return Math.ceil(text.length / 4);
289
+ }
290
+
291
+ /** True when a package root sits anywhere below `row`. */
292
+ function holdsPackage(row: Row): boolean {
293
+ return row.kids.some((k) => k.pkg != null || holdsPackage(k));
294
+ }
295
+
296
+ /**
297
+ * Render rows with every package expanded to `cap` levels below its root
298
+ * (top-level non-package rows count from 1). A row past the cap hides its
299
+ * kids and ends in `…`, unless a package root sits below it: package rows
300
+ * always stay reachable, and their own depth restarts at 0.
301
+ */
302
+ function renderAtDepth(rows: Row[], cap: number, base: string): string[] {
303
+ const lines: string[] = [];
304
+ const walk = (list: Row[], depth: number, pkgDepth: number): void => {
305
+ for (const row of list) {
306
+ const rel = row.pkg != null ? 0 : pkgDepth;
307
+ const hidden = row.kids.length > 0 && rel >= cap && !holdsPackage(row);
308
+ lines.push(rowText(row, depth, { more: hidden, base }));
309
+ if (!hidden) walk(row.kids, depth + 1, rel + 1);
310
+ }
311
+ };
312
+ walk(rows, 0, 1);
313
+ return lines;
314
+ }
315
+
316
+ /**
317
+ * Map text for `root` (any dir inside a git repo), scoped to `dir` when set.
318
+ * Depth is uniform: the deepest cap (≤ depthCap) whose text fits the limit,
319
+ * where limit = budget × 4 chars, lowered by `opts.maxChars` (hook caps).
320
+ * Returns { text, rows, tokens, depth } or null outside git.
321
+ */
322
+ export function folderMap({
323
+ root,
324
+ dir = "",
325
+ ...opts
326
+ }: MapOptions & { root: string; dir?: string }): FolderMapResult | null {
327
+ const top = repoRoot(root);
328
+ if (!top) return null;
329
+ const files = listFiles(top);
330
+ if (!files) return null;
331
+ const o = { ...loadMapConfig(top), ...opts };
332
+ const scope = dir ? repoPrefix(path.resolve(root, dir)) : "";
333
+ if (scope == null) return { text: "", rows: 0, tokens: 0, depth: 0 };
334
+ const scoped = scope ? files.filter((f) => f.startsWith(`${scope}/`)).map((f) => f.slice(scope.length + 1)) : files;
335
+ const rows = displayRows(buildTree(scope ? path.join(top, scope) : top, scoped, o), o);
336
+ const limit = Math.min(o.budget * 4, o.maxChars ?? Infinity);
337
+ let lines: string[] = [];
338
+ let depth = o.depthCap;
339
+ for (; depth >= 1; depth--) {
340
+ lines = renderAtDepth(rows, depth, scope);
341
+ if (lines.join("\n").length + 1 <= limit) break;
342
+ }
343
+ depth = Math.max(depth, 1);
344
+ const text = lines.length ? `${lines.join("\n")}\n` : "";
345
+ return { text, rows: lines.length, tokens: tokens(text), depth };
346
+ }
347
+
348
+ /** Text for `bun repo map [dir]` run from `cwd`. */
349
+ export function mapCommand(cwd: string, dir = ""): string {
350
+ const out = folderMap({ root: cwd, dir });
351
+ if (!out) return "repo map: not a git repository\n";
352
+ return out.text || "repo map: no code folders\n";
353
+ }