@bongos/core 1.21.174 → 1.21.176

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 (1744) hide show
  1. package/.bongos-core.json +3565 -1515
  2. package/.claude/skills/ask-for-help/SKILL.md +4 -4
  3. package/.claude/skills/backlog-review/SKILL.md +1 -1
  4. package/.claude/skills/blocker-review/SKILL.md +2 -2
  5. package/.claude/skills/blocker-solve/SKILL.md +4 -4
  6. package/.claude/skills/bongos-feedback/SKILL.md +1 -1
  7. package/.claude/skills/bug-triage/SKILL.md +8 -8
  8. package/.claude/skills/builder-backup/SKILL.md +3 -3
  9. package/.claude/skills/builder-claim/SKILL.md +5 -5
  10. package/.claude/skills/builder-cost/SKILL.md +5 -5
  11. package/.claude/skills/builder-end/SKILL.md +6 -6
  12. package/.claude/skills/builder-exit/SKILL.md +2 -2
  13. package/.claude/skills/builder-key/SKILL.md +6 -6
  14. package/.claude/skills/builder-reauth/SKILL.md +4 -4
  15. package/.claude/skills/builder-redteam/SKILL.md +3 -3
  16. package/.claude/skills/builder-release/SKILL.md +3 -3
  17. package/.claude/skills/builder-sequence/SKILL.md +8 -8
  18. package/.claude/skills/builder-setup/SKILL.md +4 -4
  19. package/.claude/skills/builder-ship/SKILL.md +7 -7
  20. package/.claude/skills/builder-stage/SKILL.md +8 -8
  21. package/.claude/skills/builder-start/SKILL.md +4 -4
  22. package/.claude/skills/collab-review/SKILL.md +5 -5
  23. package/.claude/skills/design/SKILL.md +6 -4
  24. package/.claude/skills/design-sync/SKILL.md +3 -3
  25. package/.claude/skills/figma-design-sync/SKILL.md +4 -4
  26. package/.claude/skills/fix-task/SKILL.md +8 -8
  27. package/.claude/skills/goal-close/SKILL.md +9 -9
  28. package/.claude/skills/goal-create/SKILL.md +18 -18
  29. package/.claude/skills/grade-recover/SKILL.md +8 -8
  30. package/.claude/skills/grade-sweep/SKILL.md +15 -15
  31. package/.claude/skills/idea-triage/SKILL.md +15 -15
  32. package/.claude/skills/merge-mode/SKILL.md +14 -14
  33. package/.claude/skills/new-project/SKILL.md +5 -5
  34. package/.claude/skills/owner-review/SKILL.md +1 -1
  35. package/.claude/skills/planning-session/SKILL.md +14 -14
  36. package/.claude/skills/priority-session/SKILL.md +6 -6
  37. package/.claude/skills/read-session-export/SKILL.md +3 -3
  38. package/.claude/skills/recall/SKILL.md +7 -7
  39. package/.claude/skills/scan-before-install/SKILL.md +3 -3
  40. package/.claude/skills/session-handoff/SKILL.md +1 -1
  41. package/.claude/skills/ship-check/SKILL.md +3 -3
  42. package/.claude/skills/status/SKILL.md +3 -3
  43. package/.claude/skills/strand-fix/SKILL.md +6 -6
  44. package/.claude/skills/worktree-clean/SKILL.md +4 -4
  45. package/.gitattributes +12 -32
  46. package/GOVERNMENT.md +1 -1
  47. package/README.md +8 -8
  48. package/bin/bongos.js +23 -23
  49. package/clients/bongos-client/README.md +2 -2
  50. package/clients/bongos-client/bongos-client.global.js +22 -4
  51. package/clients/bongos-client/index.cjs +22 -4
  52. package/clients/bongos-client/index.d.ts +33 -4
  53. package/clients/bongos-client/index.mjs +21 -3
  54. package/config/branding.neutral.json +1 -1
  55. package/config/design-tokens.schema.json +1 -1
  56. package/config/modules.neutral.json +1 -3
  57. package/docs/adr/0029-status-page-outage-resilience.md +6 -6
  58. package/docs/adr/0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md +1 -1
  59. package/docs/adr/0294-cli-sessions-do-not-expire.md +1 -1
  60. package/docs/adr/0383-sessions-end-after-ten-idle-days.md +35 -0
  61. package/docs/adr/0384-the-raise-page-is-a-hub-module-builders-edit-in-place.md +31 -0
  62. package/docs/adr/README.md +2 -0
  63. package/docs/api/openapi.json +606 -44
  64. package/docs/api-reference.md +25 -12
  65. package/docs/architecture.md +8 -7
  66. package/docs/canonical-permissions.md +3 -3
  67. package/docs/copy-inventory.md +1389 -1437
  68. package/docs/copy-registry.json +2160 -2634
  69. package/docs/design/demonolith-plan.md +6 -6
  70. package/docs/design/modular-architecture/00-research-report.md +1 -1
  71. package/docs/design/project-startup-direction.md +2 -2
  72. package/docs/design/projects-hub-direction-v2.md +1 -1
  73. package/docs/design/reviews/hall-v2/README.md +2 -2
  74. package/docs/design/vanilla-hall-ui-redesign-scope.md +1 -1
  75. package/docs/file-map.md +89 -88
  76. package/docs/handoff-template.md +4 -4
  77. package/docs/module-api-changelog.md +6 -2
  78. package/docs/modules-contract.md +8 -7
  79. package/docs/onboarding/diagrams/01-task-lifecycle.mmd +1 -1
  80. package/docs/onboarding/diagrams/02-rank-ladder.mmd +1 -1
  81. package/docs/onboarding/diagrams/03-drachmae-karma.mmd +1 -1
  82. package/docs/onboarding/diagrams/04-architecture.mmd +1 -1
  83. package/docs/onboarding/diagrams/05-versioning.mmd +1 -1
  84. package/docs/onboarding/diagrams/README.md +2 -2
  85. package/docs/onboarding/diagrams/assertions.json +2 -2
  86. package/docs/onboarding/slash-commands.md +2 -2
  87. package/docs/packs/artist.md +4 -4
  88. package/docs/packs/engineer.md +11 -10
  89. package/docs/packs/ideator.md +7 -7
  90. package/docs/page-inventory.json +25 -1
  91. package/docs/page-readings.json +4388 -4602
  92. package/docs/recipes/README.md +1 -1
  93. package/docs/recipes/audit-replay.md +4 -4
  94. package/docs/recipes/autobongos-windows-host.md +6 -6
  95. package/docs/recipes/bongos-cli-release.md +2 -2
  96. package/docs/recipes/claude-design-loop.md +7 -7
  97. package/docs/recipes/core-release-pipeline.md +19 -19
  98. package/docs/recipes/failed-ship-recovery-proof.md +2 -2
  99. package/docs/recipes/figma-design-loop.md +6 -6
  100. package/docs/recipes/gds-db-backup.md +9 -9
  101. package/docs/recipes/instance-deploy.md +3 -3
  102. package/docs/recipes/instance-first-run.md +1 -1
  103. package/docs/recipes/multi-builder-merge.md +2 -2
  104. package/docs/recipes/ops-gotchas.md +10 -9
  105. package/docs/recipes/packaging-the-core.md +6 -6
  106. package/docs/recipes/parallel-goal-waves.md +4 -4
  107. package/docs/recipes/private-npm-distribution.md +9 -9
  108. package/docs/recipes/redteam-patrol.md +5 -5
  109. package/docs/recipes/render-pilot.md +2 -2
  110. package/docs/recipes/reranking-a-goals-board.md +2 -2
  111. package/docs/recipes/search-index-ingestion.md +5 -5
  112. package/docs/recipes/self-host.md +1 -1
  113. package/docs/recipes/ship-and-regrade.md +4 -4
  114. package/docs/recipes/staging-environment.md +1 -1
  115. package/docs/recipes/standalone-live-docs.md +1 -1
  116. package/docs/recipes/ui-look-before-you-ship.md +2 -2
  117. package/docs/recipes/upgrading-the-core.md +11 -11
  118. package/docs/recipes/windows-builders.md +18 -18
  119. package/docs/research/llm-model-agnostic-and-cheaper-grader.md +6 -6
  120. package/docs/research/task-network-map-readability.md +3 -3
  121. package/migrations/core_278_builder_tester_tag.sql +18 -0
  122. package/migrations/core_279_bongos_shipper_new_scripts_path.sql +13 -0
  123. package/modules/agents/lib/answer-hold.js +1 -1
  124. package/modules/agents/lib/gate.js +1 -1
  125. package/modules/agents/lib/validate.js +1 -1
  126. package/modules/autonomy/gauge.js +1 -1
  127. package/modules/autonomy/governor-docket.js +2 -2
  128. package/modules/autonomy/pollers/routine-timers.js +3 -3
  129. package/modules/autonomy/routes/autonomy.js +3 -3
  130. package/modules/builder-settings/interaction-prefs.js +1 -1
  131. package/modules/builder-settings/render-prefs.js +1 -1
  132. package/modules/builder-settings/routes/settings.js +1 -1
  133. package/modules/builder-settings/skill-prefs.js +2 -2
  134. package/modules/builder-settings/wandering-prefs.js +2 -2
  135. package/modules/copy-desk/module.json +2 -2
  136. package/modules/copy-desk/page-data.js +5 -5
  137. package/modules/copy-desk/page-decisions.js +13 -1
  138. package/modules/copy-desk/proposals.js +4 -4
  139. package/modules/copy-desk/registry.js +2 -2
  140. package/modules/copy-desk/routes/copy-desk-release.js +119 -0
  141. package/modules/copy-desk/routes/copy-desk.js +3 -12
  142. package/modules/copy-desk/skills/tweak/SKILL.md +12 -12
  143. package/modules/copy-desk/tests/copy_flags.mjs +1 -1
  144. package/modules/copy-desk/tests/copy_no_cms.mjs +7 -3
  145. package/modules/copy-desk/tests/copy_proposals.mjs +2 -2
  146. package/modules/copy-desk/tests/copy_queue.mjs +1 -1
  147. package/modules/design-styles/skills/README.md +4 -4
  148. package/modules/design-styles/skills/imagegen-frontend-mobile/SKILL.md +1 -1
  149. package/modules/design-styles/skills/imagegen-frontend-web/SKILL.md +1 -1
  150. package/modules/discord/bug-attachments.js +1 -1
  151. package/modules/discord/ship-broadcast.js +1 -1
  152. package/modules/economy/achievements.js +49 -7
  153. package/modules/economy/cost-classify.js +6 -6
  154. package/modules/economy/cost-report.js +1 -1
  155. package/modules/economy/cost.js +1 -1
  156. package/modules/economy/credits.js +2 -1
  157. package/modules/economy/idea-size.js +2 -2
  158. package/modules/economy/reward.js +2 -0
  159. package/modules/economy/routes/cost.js +1 -1
  160. package/modules/economy/streak.js +43 -4
  161. package/modules/government/asks.js +1 -1
  162. package/modules/government/board.js +19 -2
  163. package/modules/government/catalog.js +3 -0
  164. package/modules/government/migrations/government_033_idea_vote.sql +46 -0
  165. package/modules/government/protected-surfaces.json +48 -47
  166. package/modules/government/recommendations.js +6 -2
  167. package/modules/government/routes/government.js +1 -1
  168. package/modules/grading/generated-provenance.js +13 -5
  169. package/modules/grading/grade-engine.js +1 -1
  170. package/modules/grading/grader-rubric.json +1 -1
  171. package/modules/grading/grader-score.js +1 -1
  172. package/modules/grading/grader-workers/index.js +1 -1
  173. package/modules/grading/grader.js +1 -1
  174. package/modules/grading/routes/grade.js +1 -1
  175. package/modules/hall-ui/public/atlas.html +5 -7
  176. package/modules/hall-ui/public/atlas.js +1 -1
  177. package/modules/hall-ui/public/atlas.states.json +1 -1
  178. package/modules/hall-ui/public/blockers.css +9 -0
  179. package/modules/hall-ui/public/blockers.html +6 -4
  180. package/modules/hall-ui/public/blockers.js +39 -27
  181. package/modules/hall-ui/public/board-room.css +5 -12
  182. package/modules/hall-ui/public/board-room.html +6 -6
  183. package/modules/hall-ui/public/board-room.js +41 -23
  184. package/modules/hall-ui/public/board-room.states.json +1 -1
  185. package/modules/hall-ui/public/brand-apply.js +1 -1
  186. package/modules/hall-ui/public/brand-holes.js +1 -1
  187. package/modules/hall-ui/public/builders.js +40 -86
  188. package/modules/hall-ui/public/city-decide.js +18 -4
  189. package/modules/hall-ui/public/city.html +1 -1
  190. package/modules/hall-ui/public/collab.html +1 -1
  191. package/modules/hall-ui/public/commands.html +6 -9
  192. package/modules/hall-ui/public/copy-desk.html +1 -1
  193. package/modules/hall-ui/public/copy-desk.js +2 -2
  194. package/modules/hall-ui/public/craft-mode.js +4 -0
  195. package/modules/hall-ui/public/deploy.html +6 -2
  196. package/modules/hall-ui/public/deploy.js +21 -13
  197. package/modules/hall-ui/public/diagrams.css +1 -1
  198. package/modules/hall-ui/public/diagrams.html +5 -8
  199. package/modules/hall-ui/public/diagrams.states.json +1 -1
  200. package/modules/hall-ui/public/drachmae.html +3 -7
  201. package/modules/hall-ui/public/fleet.html +3 -2
  202. package/modules/hall-ui/public/fleet.js +0 -4
  203. package/modules/hall-ui/public/gate.html +7 -7
  204. package/modules/hall-ui/public/gate.js +58 -77
  205. package/modules/hall-ui/public/goal-inbox.js +69 -86
  206. package/modules/hall-ui/public/goal-map.html +1 -1
  207. package/modules/hall-ui/public/goals-page.js +5 -5
  208. package/modules/hall-ui/public/goals-render.js +10 -11
  209. package/modules/hall-ui/public/goals.css +10 -0
  210. package/modules/hall-ui/public/goals.html +14 -7
  211. package/modules/hall-ui/public/government.html +3 -5
  212. package/modules/hall-ui/public/government.js +1 -5
  213. package/modules/hall-ui/public/hall-ask.css +57 -0
  214. package/modules/hall-ui/public/hall-ask.js +50 -0
  215. package/modules/hall-ui/public/hall-render.js +117 -57
  216. package/modules/hall-ui/public/hall-widgets.js +11 -11
  217. package/modules/hall-ui/public/idea.html +1 -1
  218. package/modules/hall-ui/public/ideas.html +3 -1
  219. package/modules/hall-ui/public/ideas.js +1 -0
  220. package/modules/hall-ui/public/index.html +15 -6
  221. package/modules/hall-ui/public/index.states.json +1 -1
  222. package/modules/hall-ui/public/mine-lens.js +1 -1
  223. package/modules/hall-ui/public/modules.html +7 -10
  224. package/modules/hall-ui/public/modules.js +0 -2
  225. package/modules/hall-ui/public/my-agents.html +1 -1
  226. package/modules/hall-ui/public/palette.js +5 -5
  227. package/modules/hall-ui/public/primer.html +4 -9
  228. package/modules/hall-ui/public/profile-connections.js +10 -2
  229. package/modules/hall-ui/public/profile-roles.js +3 -10
  230. package/modules/hall-ui/public/profile.html +12 -10
  231. package/modules/hall-ui/public/profile.js +13 -17
  232. package/modules/hall-ui/public/project-settings.html +3 -4
  233. package/modules/hall-ui/public/project-settings.js +0 -3
  234. package/modules/hall-ui/public/ranks.html +5 -11
  235. package/modules/hall-ui/public/ranks.js +6 -8
  236. package/modules/hall-ui/public/roadmap.css +0 -2
  237. package/modules/hall-ui/public/roadmap.html +1 -1
  238. package/modules/hall-ui/public/roadmap.js +16 -51
  239. package/modules/hall-ui/public/roster.html +1 -1
  240. package/modules/hall-ui/public/sessions.html +6 -8
  241. package/modules/hall-ui/public/sessions.js +7 -7
  242. package/modules/hall-ui/public/settings.html +1 -1
  243. package/modules/hall-ui/public/shell-trail.js +1 -1
  244. package/modules/hall-ui/public/shell.js +17 -17
  245. package/modules/hall-ui/public/street-deck.css +2 -1
  246. package/modules/hall-ui/public/street-deck.js +10 -2
  247. package/modules/hall-ui/public/street-desk.js +16 -5
  248. package/modules/hall-ui/public/street.html +1 -1
  249. package/modules/hall-ui/public/studio-lib.js +4 -0
  250. package/modules/hall-ui/public/studio.css +2 -0
  251. package/modules/hall-ui/public/studio.html +1 -1
  252. package/modules/hall-ui/public/studio.js +27 -1
  253. package/modules/hall-ui/public/style.css +43 -26
  254. package/modules/hall-ui/public/task-detail.js +10 -7
  255. package/modules/hall-ui/public/task.css +2 -0
  256. package/modules/hall-ui/public/task.html +3 -1
  257. package/modules/hall-ui/public/task.js +23 -7
  258. package/modules/hall-ui/public/thinking.html +1 -1
  259. package/modules/hall-ui/public/tweak-editor.html +1 -1
  260. package/modules/hall-ui/public/vote-control.js +208 -0
  261. package/modules/hall-ui/public/watch.html +3 -5
  262. package/modules/hall-ui/public/watch.js +5 -4
  263. package/modules/hall-ui/public/welcome-boot.css +130 -0
  264. package/modules/hall-ui/public/welcome-boot.js +334 -0
  265. package/modules/hall-ui/public/welcome-day.webp +0 -0
  266. package/modules/hall-ui/public/welcome-night.webp +0 -0
  267. package/modules/hall-ui/public/work-summary.js +1 -1
  268. package/modules/hall-ui/public/work.css +1 -0
  269. package/modules/hall-ui/public/work.html +3 -1
  270. package/modules/hall-ui/public/work.js +2 -1
  271. package/modules/hall-ui/records/accomplishments.md +16 -0
  272. package/modules/hall-ui/records/hall-ask-card.md +33 -0
  273. package/modules/hall-ui/records/karma-vote-control.md +13 -0
  274. package/modules/hall-ui/records/oversight-family.md +1 -1
  275. package/modules/hall-ui/records/profile-connections.md +2 -0
  276. package/modules/hall-ui/records/profile-roles.md +1 -1
  277. package/modules/hall-ui/records/reading-rooms.md +1 -1
  278. package/modules/hall-ui/records/welcome-tower.md +50 -0
  279. package/modules/ideas/migrations/ideas_011_idea_votes.sql +31 -0
  280. package/modules/ideas/projection.js +1 -1
  281. package/modules/ideas/routes/blockers.js +3 -3
  282. package/modules/ideas/routes/inbox.js +29 -1
  283. package/modules/ideas/routes/ratify-goal.js +1 -1
  284. package/modules/ideas/routing.js +1 -1
  285. package/modules/ideas/templates.js +1 -1
  286. package/modules/ideas/trail-descent.js +1 -1
  287. package/modules/ideas/trail-size.js +1 -1
  288. package/modules/ideas/votes.js +93 -0
  289. package/modules/lifecycle/abandon-leftovers.js +1 -1
  290. package/modules/lifecycle/cascade.js +1 -1
  291. package/modules/lifecycle/conflict-resolve.js +13 -21
  292. package/modules/lifecycle/criterion-ref.js +1 -1
  293. package/modules/lifecycle/db-analytics.js +57 -4
  294. package/modules/lifecycle/db-deps-criteria.js +1 -1
  295. package/modules/lifecycle/db-ship.js +2 -2
  296. package/modules/lifecycle/db-tasks.js +2 -2
  297. package/modules/lifecycle/db-versions.js +1 -1
  298. package/modules/lifecycle/db.js +2 -0
  299. package/modules/lifecycle/dead-deps.js +3 -3
  300. package/modules/lifecycle/dependency-advisory.js +3 -3
  301. package/modules/lifecycle/goal-category.js +1 -1
  302. package/modules/lifecycle/goal-forest.js +1 -1
  303. package/modules/lifecycle/goal-task-relevance-advisory.js +1 -1
  304. package/modules/lifecycle/kickoff-checklist.js +1 -1
  305. package/modules/lifecycle/kickoff-seed.js +1 -1
  306. package/modules/lifecycle/lifecycle.js +2 -0
  307. package/modules/lifecycle/merge-reach.js +29 -15
  308. package/modules/lifecycle/missing-dep-classify.js +3 -3
  309. package/modules/lifecycle/module.json +2 -1
  310. package/modules/lifecycle/page-tweak-approve.js +85 -1
  311. package/modules/lifecycle/page-tweak-hold.js +1 -1
  312. package/modules/lifecycle/publish-reconciler.js +1 -2
  313. package/modules/lifecycle/rot.js +1 -1
  314. package/modules/lifecycle/routes/artist-gate.js +1 -1
  315. package/modules/lifecycle/routes/gate-approvals.js +22 -1
  316. package/modules/lifecycle/routes/goals.js +1 -1
  317. package/modules/lifecycle/routes/task-route-helpers.js +1 -1
  318. package/modules/lifecycle/routes/task-votes.js +54 -0
  319. package/modules/lifecycle/routes/task-write-routes.js +1 -1
  320. package/modules/lifecycle/routes/tasks.js +2 -2
  321. package/modules/lifecycle/routes/versions.js +2 -2
  322. package/modules/lifecycle/ship-card.js +4 -4
  323. package/modules/lifecycle/ship-preflight.js +1 -1
  324. package/modules/lifecycle/task-classifier.js +1 -1
  325. package/modules/lifecycle/task-status.js +1 -1
  326. package/modules/lifecycle/task-visual-db.js +1 -1
  327. package/modules/memory/learnings.js +1 -1
  328. package/modules/memory/pollers/search-index.js +2 -2
  329. package/modules/memory/routes/learnings.js +1 -1
  330. package/modules/memory/routes/memory.js +1 -1
  331. package/modules/memory/search.js +2 -2
  332. package/modules/npm-release/release.js +1 -1
  333. package/modules/onboarding/howto-moments.js +1 -1
  334. package/modules/onboarding/newcomer-restock.js +3 -3
  335. package/modules/onboarding/onboarding.js +1 -1
  336. package/modules/pixel-art/skills/otb-tile-generate/SKILL.md +1 -1
  337. package/modules/platform-identity/origin-containment.js +1 -1
  338. package/modules/platform-identity/publish-gate.js +1 -1
  339. package/modules/platform-identity/tests/platform-identity.mjs +1 -1
  340. package/modules/provisioning/capacity.js +1 -1
  341. package/modules/provisioning/core-upgrade.js +15 -9
  342. package/modules/provisioning/credential-preflight.js +3 -3
  343. package/modules/provisioning/disconnect.js +1 -1
  344. package/modules/provisioning/dns-resolves.js +1 -1
  345. package/modules/provisioning/module.json +1 -1
  346. package/modules/provisioning/onboard-plan.js +1 -1
  347. package/modules/provisioning/paid-shape-gate.js +2 -2
  348. package/modules/provisioning/planet-physics.js +11 -2
  349. package/modules/provisioning/pollers/liveness-sweep.js +1 -1
  350. package/modules/provisioning/pollers/runner-drift-notify.js +5 -5
  351. package/modules/provisioning/provisioning.js +2 -2
  352. package/modules/provisioning/render-lookup.js +1 -1
  353. package/modules/provisioning/render-standup.js +3 -3
  354. package/modules/provisioning/repo-private.js +1 -1
  355. package/modules/provisioning/routes/callback-page.js +1 -1
  356. package/modules/provisioning/routes/core-upgrade.js +23 -3
  357. package/modules/provisioning/routes/provisioning.js +2 -2
  358. package/modules/provisioning/routes/render-standup.js +1 -1
  359. package/modules/provisioning/routes/repo-private.js +1 -1
  360. package/modules/provisioning/soft-limits.js +1 -1
  361. package/modules/provisioning/starter-bundles.js +4 -2
  362. package/modules/provisioning/tests/provisioning.mjs +1 -1
  363. package/modules/public-landing/public/account.html +4 -6
  364. package/modules/public-landing/public/assets/cosmos.css +13 -6
  365. package/modules/public-landing/public/connections.html +4 -6
  366. package/modules/public-landing/public/contact.html +4 -6
  367. package/modules/public-landing/public/guild.html +4 -6
  368. package/modules/public-landing/public/index.html +11 -9
  369. package/modules/public-landing/public/invitations.html +4 -6
  370. package/modules/public-landing/public/privacy.html +4 -6
  371. package/modules/public-landing/public/projects.html +168 -46
  372. package/modules/public-landing/public/terms.html +4 -6
  373. package/modules/raise/content/copy.json +40 -0
  374. package/modules/raise/content/nda.html +39 -0
  375. package/modules/raise/content/settings.json +49 -0
  376. package/modules/raise/db.js +95 -0
  377. package/modules/raise/migrations/raise_001_tables.sql +71 -0
  378. package/modules/raise/module.json +28 -0
  379. package/modules/raise/page.js +194 -0
  380. package/modules/raise/public/edit.js +152 -0
  381. package/modules/raise/public/favicon.svg +1 -0
  382. package/modules/raise/public/logo-ink.svg +1 -0
  383. package/modules/raise/public/logo-night.svg +1 -0
  384. package/modules/raise/public/mode.js +8 -0
  385. package/modules/raise/public/raise.css +234 -0
  386. package/modules/raise/public/raise.js +91 -0
  387. package/modules/raise/raise.js +174 -0
  388. package/modules/raise/routes/raise.js +152 -0
  389. package/modules/raise/views/gate.html +39 -0
  390. package/modules/raise/views/nda.html +21 -0
  391. package/modules/raise/views/page.html +133 -0
  392. package/modules/raise/web.js +72 -0
  393. package/modules/render-deploy/deploys.js +1 -1
  394. package/modules/render-deploy/render.js +2 -2
  395. package/modules/security/secret-scrub.js +3 -3
  396. package/modules/security/security.js +1 -1
  397. package/modules/security/tests/artifact_scan.mjs +1 -1
  398. package/modules/security/tests/mirror.mjs +1 -1
  399. package/modules/security/tests/scan_store.mjs +1 -1
  400. package/modules/sessions/db.js +2 -2
  401. package/modules/sessions/pulse.js +2 -2
  402. package/modules/sessions/routes/sessions.js +1 -1
  403. package/modules/specialities/specialities.js +1 -1
  404. package/modules/status-ui/public/README.md +3 -4
  405. package/modules/status-ui/public/index.html +5 -31
  406. package/modules/status-ui/public/status.js +6 -174
  407. package/modules/status-ui/public/style.css +4 -133
  408. package/modules/ui-design/docs/design-contract.md +3 -3
  409. package/modules/ui-design/kit/README.md +1 -1
  410. package/modules/ui-design/kit/serve.js +13 -4
  411. package/modules/ui-design/scripts/design-sync.js +1 -1
  412. package/modules/ui-design/scripts/figma-design-sync.js +1 -1
  413. package/modules/ui-design/scripts/validate-design.js +1 -1
  414. package/package-lock.json +27 -11
  415. package/package.json +2 -3
  416. package/release-notes.json +178 -0
  417. package/scripts/bongos/CLAUDE.md +15 -0
  418. package/scripts/bongos/abandon.js +137 -0
  419. package/scripts/bongos/accessibility-replay.js +195 -0
  420. package/scripts/bongos/address-park-sweep.sh +91 -0
  421. package/scripts/bongos/adopt-detect.js +123 -0
  422. package/scripts/bongos/adopt-import.js +111 -0
  423. package/scripts/bongos/adopt-preflight.js +187 -0
  424. package/scripts/bongos/adr-namespace.js +273 -0
  425. package/scripts/bongos/agent-invoke.js +689 -0
  426. package/scripts/bongos/agents-sync.js +502 -0
  427. package/scripts/bongos/api-alias-caller-scan.js +256 -0
  428. package/scripts/bongos/api-artifacts.js +91 -0
  429. package/scripts/bongos/api.js +86 -0
  430. package/scripts/bongos/api.ps1 +26 -0
  431. package/scripts/bongos/architect-audit.js +294 -0
  432. package/scripts/bongos/artifact-audit.js +326 -0
  433. package/scripts/bongos/artifact-format.js +203 -0
  434. package/scripts/bongos/artifact-staleness.js +267 -0
  435. package/scripts/bongos/ask.js +231 -0
  436. package/scripts/bongos/audit-authorship.sh +329 -0
  437. package/scripts/bongos/audit-deps.js +189 -0
  438. package/scripts/bongos/audit-gate.js +121 -0
  439. package/scripts/bongos/audit-rank-roles.js +172 -0
  440. package/scripts/bongos/audit-replay.sh +205 -0
  441. package/scripts/bongos/autobongos-digest.js +123 -0
  442. package/scripts/bongos/autobongos-grade-cap.js +187 -0
  443. package/scripts/bongos/autobongos-loop.js +210 -0
  444. package/scripts/bongos/autobongos-run.js +1361 -0
  445. package/scripts/bongos/autobongos-service.cmd +50 -0
  446. package/scripts/bongos/autobongos-service.ps1 +270 -0
  447. package/scripts/bongos/autobongos-tweak-lane.js +262 -0
  448. package/scripts/bongos/autobongos-verify.js +618 -0
  449. package/scripts/bongos/autonomy-gate.js +135 -0
  450. package/scripts/bongos/autonomy-gauge-statusline.js +124 -0
  451. package/scripts/bongos/autonomy-gauge.js +84 -0
  452. package/scripts/bongos/backfill-cost.js +176 -0
  453. package/scripts/bongos/backfill-disciplines.js +144 -0
  454. package/scripts/bongos/backfill-session-earnings.js +123 -0
  455. package/scripts/bongos/backfill-session-types.js +87 -0
  456. package/scripts/bongos/backfill-sessions.js +411 -0
  457. package/scripts/bongos/backfill-subagent-rewards.js +485 -0
  458. package/scripts/bongos/backfill-task-rewards.js +413 -0
  459. package/scripts/bongos/backlog-review.js +399 -0
  460. package/scripts/bongos/backup-dropin-sweep.sh +95 -0
  461. package/scripts/bongos/backup.js +116 -0
  462. package/scripts/bongos/baseline-staleness.js +217 -0
  463. package/scripts/bongos/bfg-principal-token.js +65 -0
  464. package/scripts/bongos/bug-attachment-audit.js +149 -0
  465. package/scripts/bongos/bug-attachment-recover.js +198 -0
  466. package/scripts/bongos/bug-triage.js +292 -0
  467. package/scripts/bongos/build-bongos.js +94 -0
  468. package/scripts/bongos/bump-version.js +221 -0
  469. package/scripts/bongos/capture.js +481 -0
  470. package/scripts/bongos/category-advisory-guard.js +206 -0
  471. package/scripts/bongos/ci-grade.js +82 -0
  472. package/scripts/bongos/claim-recall.js +112 -0
  473. package/scripts/bongos/claim.js +789 -0
  474. package/scripts/bongos/classify-discipline.js +153 -0
  475. package/scripts/bongos/claude-materialize.js +1200 -0
  476. package/scripts/bongos/claude-md-template.js +142 -0
  477. package/scripts/bongos/cleanup-orphans.js +74 -0
  478. package/scripts/bongos/cli-lib.js +1226 -0
  479. package/scripts/bongos/client-baseurl-guard.js +116 -0
  480. package/scripts/bongos/codemod-rename-scripts-gds.js +381 -0
  481. package/scripts/bongos/codemod-rename-src-gds.js +145 -0
  482. package/scripts/bongos/conductor-dispatch.js +535 -0
  483. package/scripts/bongos/context-pack.js +326 -0
  484. package/scripts/bongos/control-manifest.js +199 -0
  485. package/scripts/bongos/copy-apply.js +758 -0
  486. package/scripts/bongos/copy-inventory.js +571 -0
  487. package/scripts/bongos/core-origin-follow.js +185 -0
  488. package/scripts/bongos/core-pin-sync.js +260 -0
  489. package/scripts/bongos/coreB-carve-proof.sh +725 -0
  490. package/scripts/bongos/cost-report.js +63 -0
  491. package/scripts/bongos/cost.js +47 -0
  492. package/scripts/bongos/credential-presence.js +296 -0
  493. package/scripts/bongos/cutover-codemod.js +240 -0
  494. package/scripts/bongos/db-backup-nightly.sh +232 -0
  495. package/scripts/bongos/db-backup-offsite.sh +267 -0
  496. package/scripts/bongos/demote.js +45 -0
  497. package/scripts/bongos/deploy-divergence.js +454 -0
  498. package/scripts/bongos/deploy-main-audit-gate.sh +97 -0
  499. package/scripts/bongos/design-sync.js +12 -0
  500. package/scripts/bongos/dev-box-guard.js +166 -0
  501. package/scripts/bongos/dev-lib.js +722 -0
  502. package/scripts/bongos/dev.js +645 -0
  503. package/scripts/bongos/device-flow-help.js +72 -0
  504. package/scripts/bongos/diagnose-achievements.js +118 -0
  505. package/scripts/bongos/diagram-facts.js +355 -0
  506. package/scripts/bongos/discord-channels.js +77 -0
  507. package/scripts/bongos/do-api.js +109 -0
  508. package/scripts/bongos/doc-cli-guard.js +274 -0
  509. package/scripts/bongos/doc-comment-coverage.js +139 -0
  510. package/scripts/bongos/doc-control-claims.js +170 -0
  511. package/scripts/bongos/docs-entropy.js +453 -0
  512. package/scripts/bongos/doctor.js +493 -0
  513. package/scripts/bongos/enroll-control-plane.js +101 -0
  514. package/scripts/bongos/exec-path-guard.js +564 -0
  515. package/scripts/bongos/feedback-send.js +249 -0
  516. package/scripts/bongos/fetch-art-key.js +106 -0
  517. package/scripts/bongos/fetch-sound-prefs.js +126 -0
  518. package/scripts/bongos/figma-design-sync.js +11 -0
  519. package/scripts/bongos/find-untested.js +371 -0
  520. package/scripts/bongos/fitness-checks-error-envelope.js +134 -0
  521. package/scripts/bongos/fitness-checks-identity.js +343 -0
  522. package/scripts/bongos/fitness-checks-packaging.js +132 -0
  523. package/scripts/bongos/fitness-checks-route-pins.js +76 -0
  524. package/scripts/bongos/fitness-checks-vocabulary.js +392 -0
  525. package/scripts/bongos/fitness-checks-write-validation.js +157 -0
  526. package/scripts/bongos/fitness-lib.js +127 -0
  527. package/scripts/bongos/fitness-migration-contraction.js +50 -0
  528. package/scripts/bongos/fitness-ratchets.js +594 -0
  529. package/scripts/bongos/fitness.js +1498 -0
  530. package/scripts/bongos/forwarder.js +80 -0
  531. package/scripts/bongos/gate-review.js +330 -0
  532. package/scripts/bongos/gating.js +348 -0
  533. package/scripts/{gds → bongos}/gds-db-backup.service +6 -6
  534. package/scripts/{gds → bongos}/gds-db-backup.timer +4 -4
  535. package/scripts/{gds → bongos}/gds-db-offsite.service +4 -4
  536. package/scripts/{gds → bongos}/gds-db-offsite.timer +4 -4
  537. package/scripts/bongos/gds-literal-scan.js +196 -0
  538. package/scripts/bongos/gen-api-client.js +576 -0
  539. package/scripts/bongos/gen-api-docs.js +1111 -0
  540. package/scripts/bongos/gen-atlas.js +366 -0
  541. package/scripts/bongos/gen-diagrams.js +608 -0
  542. package/scripts/bongos/gen-file-map.js +337 -0
  543. package/scripts/bongos/gen-freshness.js +32 -0
  544. package/scripts/bongos/gen-interaction-posture.js +122 -0
  545. package/scripts/bongos/gen-repo-map.js +540 -0
  546. package/scripts/bongos/gen-role-responsibilities.js +134 -0
  547. package/scripts/bongos/gen-session-index.js +243 -0
  548. package/scripts/bongos/gen-sounds.js +176 -0
  549. package/scripts/bongos/git-merge-regen.js +254 -0
  550. package/scripts/bongos/go-live.js +1071 -0
  551. package/scripts/bongos/goal-names.js +102 -0
  552. package/scripts/bongos/goal.js +272 -0
  553. package/scripts/bongos/government-walk.js +1477 -0
  554. package/scripts/bongos/grade-correlation-audit.js +310 -0
  555. package/scripts/bongos/grade-replay.js +237 -0
  556. package/scripts/bongos/grade-smoke.js +205 -0
  557. package/scripts/bongos/home-isolation-guard.js +126 -0
  558. package/scripts/bongos/hooks/pre-push.js +211 -0
  559. package/scripts/bongos/howto.js +145 -0
  560. package/scripts/bongos/http-api-client.js +81 -0
  561. package/scripts/bongos/identity-strip.js +75 -0
  562. package/scripts/bongos/init.js +1159 -0
  563. package/scripts/bongos/install-git-hooks.js +200 -0
  564. package/scripts/bongos/instance-apex.js +38 -0
  565. package/scripts/bongos/intent-retry.js +52 -0
  566. package/scripts/bongos/key-card.js +222 -0
  567. package/scripts/bongos/key-status.js +126 -0
  568. package/scripts/bongos/land-watch.js +201 -0
  569. package/scripts/bongos/leak-scan-allowlist.js +293 -0
  570. package/scripts/bongos/learning-capture.js +145 -0
  571. package/scripts/bongos/lib.sh +74 -0
  572. package/scripts/bongos/linkify-refs.js +655 -0
  573. package/scripts/bongos/lint-infra-exec.js +70 -0
  574. package/scripts/bongos/lint-migrations.js +102 -0
  575. package/scripts/bongos/lint-workflow-exec.js +63 -0
  576. package/scripts/bongos/local-preview-lib.js +128 -0
  577. package/scripts/bongos/local-preview.js +82 -0
  578. package/scripts/bongos/login.js +360 -0
  579. package/scripts/bongos/main-audit.js +625 -0
  580. package/scripts/bongos/me.js +97 -0
  581. package/scripts/bongos/memory-map.js +176 -0
  582. package/scripts/bongos/merge-lock.js +71 -0
  583. package/scripts/bongos/migration-namespace.js +313 -0
  584. package/scripts/bongos/mirror-lineage-check.js +343 -0
  585. package/scripts/bongos/mirror-redact.js +350 -0
  586. package/scripts/bongos/module-artifact.js +289 -0
  587. package/scripts/bongos/module-assess-docs.js +238 -0
  588. package/scripts/bongos/module-assess-installs.js +228 -0
  589. package/scripts/bongos/module-assess-score.js +111 -0
  590. package/scripts/bongos/module-assess-security.js +252 -0
  591. package/scripts/bongos/module-assess-tests.js +278 -0
  592. package/scripts/bongos/module-assess-version.js +92 -0
  593. package/scripts/bongos/module-error-report.js +148 -0
  594. package/scripts/{gds → bongos}/module-test-runner/README.md +3 -3
  595. package/scripts/{gds → bongos}/module-test-runner/module-tests.yml +2 -2
  596. package/scripts/bongos/module-test-runner.js +414 -0
  597. package/scripts/bongos/module.js +1376 -0
  598. package/scripts/bongos/move-escalation.js +141 -0
  599. package/scripts/{gds → bongos}/newcomer-floor.config.json +1 -1
  600. package/scripts/bongos/newcomer-floor.js +421 -0
  601. package/scripts/{gds → bongos}/newcomer-floor.templates.json +13 -13
  602. package/scripts/bongos/newcomer-floor.test.js +235 -0
  603. package/scripts/bongos/next-number.js +163 -0
  604. package/scripts/bongos/oauth-secret.js +202 -0
  605. package/scripts/bongos/onboard.js +267 -0
  606. package/scripts/bongos/onboarding-analyze.js +226 -0
  607. package/scripts/bongos/onboarding-config.js +179 -0
  608. package/scripts/bongos/onboarding-ship.js +92 -0
  609. package/scripts/bongos/pack-env-prefix.js +73 -0
  610. package/scripts/bongos/package-core.js +1200 -0
  611. package/scripts/bongos/page-inventory.js +348 -0
  612. package/scripts/bongos/page-reader.js +722 -0
  613. package/scripts/bongos/paste-token.js +212 -0
  614. package/scripts/bongos/plain-cards.js +351 -0
  615. package/scripts/bongos/portability-smoke-art.sh +85 -0
  616. package/scripts/bongos/portability-smoke-memory.sh +176 -0
  617. package/scripts/bongos/preflight.js +214 -0
  618. package/scripts/bongos/probe-cache.js +246 -0
  619. package/scripts/bongos/prove-strict-versioning.js +284 -0
  620. package/scripts/bongos/provision-auto-upgrade.js +162 -0
  621. package/scripts/bongos/provision-byo-host.js +68 -0
  622. package/scripts/bongos/provision-capacity.js +79 -0
  623. package/scripts/bongos/provision-caps.js +63 -0
  624. package/scripts/bongos/provision-config.js +233 -0
  625. package/scripts/bongos/provision-core-upgrade.js +1166 -0
  626. package/scripts/bongos/provision-disconnect.js +88 -0
  627. package/scripts/bongos/provision-github-setup.js +168 -0
  628. package/scripts/bongos/provision-net.js +357 -0
  629. package/scripts/bongos/provision-pin-key.js +176 -0
  630. package/scripts/bongos/provision-pin-replay.js +126 -0
  631. package/scripts/bongos/provision-process.js +170 -0
  632. package/scripts/bongos/provision-render.js +201 -0
  633. package/scripts/bongos/provision-repo-auth.js +164 -0
  634. package/scripts/bongos/provision-repo-private.js +98 -0
  635. package/scripts/bongos/provision-repo.js +1337 -0
  636. package/scripts/bongos/provision-teardown.js +106 -0
  637. package/scripts/bongos/provision-units.js +469 -0
  638. package/scripts/bongos/provision.js +1479 -0
  639. package/scripts/bongos/publish-credential-check.js +66 -0
  640. package/scripts/bongos/publish-integration-gate.js +142 -0
  641. package/scripts/bongos/publish-manifest.js +440 -0
  642. package/scripts/bongos/publish-watch.js +268 -0
  643. package/scripts/bongos/pulse.js +336 -0
  644. package/scripts/bongos/push-main.js +56 -0
  645. package/scripts/bongos/push-path-brief.js +100 -0
  646. package/scripts/bongos/read-session-export.js +359 -0
  647. package/scripts/bongos/reauth.js +155 -0
  648. package/scripts/bongos/recall.js +183 -0
  649. package/scripts/bongos/redteam-patrol.js +437 -0
  650. package/scripts/bongos/regen-instance-docs.js +47 -0
  651. package/scripts/bongos/release-core.js +80 -0
  652. package/scripts/bongos/release-notes.js +271 -0
  653. package/scripts/bongos/release.js +139 -0
  654. package/scripts/bongos/rename-goals.js +109 -0
  655. package/scripts/bongos/rename-history-check.js +369 -0
  656. package/scripts/bongos/rename-ledger-prose.js +482 -0
  657. package/scripts/bongos/render-api.js +197 -0
  658. package/scripts/bongos/render-check.js +206 -0
  659. package/scripts/bongos/render-ideas.js +226 -0
  660. package/scripts/bongos/render-payload.js +85 -0
  661. package/scripts/bongos/repo-metrics.js +363 -0
  662. package/scripts/bongos/review-sheet.js +108 -0
  663. package/scripts/bongos/role-pack-guard.js +142 -0
  664. package/scripts/bongos/route-shadow-guard.js +175 -0
  665. package/scripts/bongos/routine-schedule.js +283 -0
  666. package/scripts/bongos/run-routine.js +257 -0
  667. package/scripts/bongos/run-unit-tests.js +654 -0
  668. package/scripts/bongos/runner-drift.js +151 -0
  669. package/scripts/bongos/sandbox-stage.js +459 -0
  670. package/scripts/bongos/scope-map-guard.js +300 -0
  671. package/scripts/bongos/scope-roster-guard.js +118 -0
  672. package/scripts/bongos/seam-wiring-guard.js +275 -0
  673. package/scripts/bongos/search-ingest-db.js +288 -0
  674. package/scripts/bongos/search-ingest-md.js +269 -0
  675. package/scripts/bongos/seed-adopt-tasks.js +75 -0
  676. package/scripts/bongos/seed-api-contract-goal-tasks.js +141 -0
  677. package/scripts/bongos/seed-board-room-tasks.js +196 -0
  678. package/scripts/bongos/seed-bongos-app-tasks.js +294 -0
  679. package/scripts/bongos/seed-bongos-coreB-tranche1-tasks.js +81 -0
  680. package/scripts/bongos/seed-bongos-coreB-tranche2-tasks.js +100 -0
  681. package/scripts/bongos/seed-bongos-goal-hierarchy-tasks.js +307 -0
  682. package/scripts/bongos/seed-bongos-module-system-tasks.js +346 -0
  683. package/scripts/bongos/seed-bongos-tasks.js +214 -0
  684. package/scripts/bongos/seed-bongos-v1-idea-routing-tasks.js +152 -0
  685. package/scripts/bongos/seed-bongos-v1-seo-tasks.js +104 -0
  686. package/scripts/bongos/seed-bv1-community-tasks.js +131 -0
  687. package/scripts/bongos/seed-bv1-privacy-invites-tasks.js +133 -0
  688. package/scripts/bongos/seed-bv1-profile-page-tasks.js +161 -0
  689. package/scripts/bongos/seed-bv1-profiles-tasks.js +135 -0
  690. package/scripts/bongos/seed-bv1-r01-delta-tasks.js +154 -0
  691. package/scripts/bongos/seed-bv2-ideator-surface-tasks.js +390 -0
  692. package/scripts/bongos/seed-bv2-tweak-mode-tasks.js +277 -0
  693. package/scripts/bongos/seed-gds-v4-tasks.js +624 -0
  694. package/scripts/bongos/seed-governance-tasks.js +340 -0
  695. package/scripts/bongos/seed-medusa-tasks.js +440 -0
  696. package/scripts/bongos/seed-module-upstreaming.js +219 -0
  697. package/scripts/bongos/seed-productization-tasks.js +235 -0
  698. package/scripts/bongos/seed-project-admin-console-tasks.js +88 -0
  699. package/scripts/bongos/seed-provisioning-tasks.js +83 -0
  700. package/scripts/bongos/seed-staging.sh +117 -0
  701. package/scripts/bongos/seed-strict-versioning-tasks.js +275 -0
  702. package/scripts/bongos/seed-v2-world-tasks.js +283 -0
  703. package/scripts/bongos/seed-verify-criteria.js +124 -0
  704. package/scripts/bongos/sequence.js +597 -0
  705. package/scripts/bongos/session-cost.js +430 -0
  706. package/scripts/bongos/session-digest-build.js +293 -0
  707. package/scripts/bongos/session-digest.js +200 -0
  708. package/scripts/bongos/session-eval.js +631 -0
  709. package/scripts/bongos/session-transcript-build.js +155 -0
  710. package/scripts/bongos/session-transcript-upload.js +29 -0
  711. package/scripts/bongos/session.js +404 -0
  712. package/scripts/bongos/setup.js +646 -0
  713. package/scripts/bongos/ship-check.js +89 -0
  714. package/scripts/bongos/ship-deploy-target.js +393 -0
  715. package/scripts/bongos/ship-escalation.js +167 -0
  716. package/scripts/bongos/ship-finish.js +420 -0
  717. package/scripts/bongos/ship-flow.js +1217 -0
  718. package/scripts/bongos/ship-git.js +100 -0
  719. package/scripts/bongos/ship-grade-steps.js +547 -0
  720. package/scripts/bongos/ship-grade.js +426 -0
  721. package/scripts/bongos/ship-honesty.js +314 -0
  722. package/scripts/bongos/ship-io.js +139 -0
  723. package/scripts/bongos/ship-land.js +1130 -0
  724. package/scripts/bongos/ship-memory-sync.js +249 -0
  725. package/scripts/bongos/ship-merge-gate.js +225 -0
  726. package/scripts/bongos/ship-merge.js +466 -0
  727. package/scripts/bongos/ship-mode-ask.js +138 -0
  728. package/scripts/bongos/ship-mode-manual.js +54 -0
  729. package/scripts/bongos/ship-preflight-steps.js +399 -0
  730. package/scripts/bongos/ship-regen.js +292 -0
  731. package/scripts/bongos/ship-resume.js +201 -0
  732. package/scripts/bongos/ship-session-upload.js +313 -0
  733. package/scripts/bongos/ship-state.js +110 -0
  734. package/scripts/bongos/ship-surprise.js +84 -0
  735. package/scripts/bongos/ship-visual.js +75 -0
  736. package/scripts/bongos/ship.js +382 -0
  737. package/scripts/bongos/shipping-mode.js +71 -0
  738. package/scripts/bongos/skill-lint.js +250 -0
  739. package/scripts/bongos/skill-preflight.js +361 -0
  740. package/scripts/bongos/smoke-batch-claim.sh +238 -0
  741. package/scripts/bongos/smoke-batch-release.sh +316 -0
  742. package/scripts/bongos/smoke-claim-consistency.sh +222 -0
  743. package/scripts/bongos/smoke-dependencies.sh +143 -0
  744. package/scripts/bongos/smoke-gds.js +256 -0
  745. package/scripts/bongos/smoke-write.sh +275 -0
  746. package/scripts/bongos/source-text-test-scan.js +106 -0
  747. package/scripts/bongos/spark.js +294 -0
  748. package/scripts/bongos/stale-worktrees.js +212 -0
  749. package/scripts/bongos/start-goals.js +102 -0
  750. package/scripts/bongos/start.js +1090 -0
  751. package/scripts/bongos/status.js +545 -0
  752. package/scripts/bongos/strand-watch.js +315 -0
  753. package/scripts/bongos/stranded-rows.js +200 -0
  754. package/scripts/bongos/stray-unit-sweep.sh +71 -0
  755. package/scripts/bongos/surface.js +101 -0
  756. package/scripts/bongos/task.js +273 -0
  757. package/scripts/bongos/test-path-guard.js +99 -0
  758. package/scripts/bongos/triage.js +742 -0
  759. package/scripts/bongos/turn-end-sound.js +74 -0
  760. package/scripts/bongos/tweak-halt.js +70 -0
  761. package/scripts/bongos/tweak-renders.js +200 -0
  762. package/scripts/bongos/uat.js +120 -0
  763. package/scripts/bongos/ui-kit-transform.js +43 -0
  764. package/scripts/bongos/update-channel.js +512 -0
  765. package/scripts/bongos/update-sweep.js +829 -0
  766. package/scripts/bongos/upgrade-artist-gate.js +46 -0
  767. package/scripts/bongos/upgrade-commit-identity.js +32 -0
  768. package/scripts/bongos/upgrade-migrate.js +224 -0
  769. package/scripts/bongos/upgrade-operator.js +73 -0
  770. package/scripts/bongos/upgrade-outcome.js +174 -0
  771. package/scripts/bongos/upgrade.js +1499 -0
  772. package/scripts/bongos/validate-design.js +12 -0
  773. package/scripts/bongos/version-close.js +621 -0
  774. package/scripts/bongos/version-literal-guard.js +140 -0
  775. package/scripts/bongos/version-select.js +79 -0
  776. package/scripts/bongos/visual-review-nudge.js +39 -0
  777. package/scripts/bongos/wedge-remedy.js +174 -0
  778. package/scripts/bongos/worktree-claim-guard.js +130 -0
  779. package/scripts/bongos/worktree.js +449 -0
  780. package/scripts/discord/post.js +1 -1
  781. package/scripts/gds/README.md +9 -0
  782. package/scripts/gds/abandon.js +6 -136
  783. package/scripts/gds/accessibility-replay.js +5 -194
  784. package/scripts/gds/address-park-sweep.sh +7 -90
  785. package/scripts/gds/adopt-detect.js +5 -121
  786. package/scripts/gds/adopt-import.js +5 -109
  787. package/scripts/gds/adopt-preflight.js +5 -185
  788. package/scripts/gds/adr-namespace.js +5 -271
  789. package/scripts/gds/agent-invoke.js +5 -687
  790. package/scripts/gds/agents-sync.js +5 -500
  791. package/scripts/gds/api-alias-caller-scan.js +5 -255
  792. package/scripts/gds/api-artifacts.js +6 -0
  793. package/scripts/gds/api.js +6 -85
  794. package/scripts/gds/api.ps1 +8 -26
  795. package/scripts/gds/architect-audit.js +6 -293
  796. package/scripts/gds/artifact-audit.js +5 -324
  797. package/scripts/gds/artifact-format.js +6 -203
  798. package/scripts/gds/artifact-staleness.js +5 -265
  799. package/scripts/gds/ask.js +5 -229
  800. package/scripts/gds/audit-authorship.sh +7 -328
  801. package/scripts/gds/audit-deps.js +6 -188
  802. package/scripts/gds/audit-gate.js +5 -119
  803. package/scripts/gds/audit-rank-roles.js +6 -171
  804. package/scripts/gds/audit-replay.sh +7 -204
  805. package/scripts/gds/autobongos-digest.js +5 -121
  806. package/scripts/gds/autobongos-grade-cap.js +5 -186
  807. package/scripts/gds/autobongos-loop.js +5 -208
  808. package/scripts/gds/autobongos-run.js +5 -1359
  809. package/scripts/gds/autobongos-service.cmd +8 -49
  810. package/scripts/gds/autobongos-service.ps1 +8 -270
  811. package/scripts/gds/autobongos-tweak-lane.js +5 -261
  812. package/scripts/gds/autobongos-verify.js +5 -616
  813. package/scripts/gds/autonomy-gate.js +5 -133
  814. package/scripts/gds/autonomy-gauge-statusline.js +5 -122
  815. package/scripts/gds/autonomy-gauge.js +5 -82
  816. package/scripts/gds/backfill-cost.js +6 -175
  817. package/scripts/gds/backfill-disciplines.js +5 -142
  818. package/scripts/gds/backfill-session-earnings.js +5 -121
  819. package/scripts/gds/backfill-session-types.js +5 -85
  820. package/scripts/gds/backfill-sessions.js +5 -409
  821. package/scripts/gds/backfill-subagent-rewards.js +5 -483
  822. package/scripts/gds/backfill-task-rewards.js +5 -411
  823. package/scripts/gds/backlog-review.js +6 -398
  824. package/scripts/gds/backup-dropin-sweep.sh +7 -94
  825. package/scripts/gds/backup.js +6 -115
  826. package/scripts/gds/baseline-staleness.js +5 -215
  827. package/scripts/gds/bfg-principal-token.js +6 -64
  828. package/scripts/gds/bug-attachment-audit.js +5 -147
  829. package/scripts/gds/bug-attachment-recover.js +5 -196
  830. package/scripts/gds/bug-triage.js +6 -291
  831. package/scripts/gds/build-bongos.js +5 -92
  832. package/scripts/gds/bump-version.js +5 -219
  833. package/scripts/gds/capture.js +6 -480
  834. package/scripts/gds/category-advisory-guard.js +5 -205
  835. package/scripts/gds/ci-grade.js +6 -81
  836. package/scripts/gds/claim-recall.js +6 -111
  837. package/scripts/gds/claim.js +6 -788
  838. package/scripts/gds/classify-discipline.js +6 -152
  839. package/scripts/gds/claude-materialize.js +5 -1198
  840. package/scripts/gds/claude-md-template.js +5 -140
  841. package/scripts/gds/cleanup-orphans.js +6 -73
  842. package/scripts/gds/cli-lib.js +6 -1204
  843. package/scripts/gds/client-baseurl-guard.js +5 -114
  844. package/scripts/gds/codemod-rename-src-gds.js +6 -144
  845. package/scripts/gds/conductor-dispatch.js +6 -534
  846. package/scripts/gds/context-pack.js +6 -325
  847. package/scripts/gds/control-manifest.js +5 -197
  848. package/scripts/gds/copy-apply.js +5 -756
  849. package/scripts/gds/copy-inventory.js +5 -569
  850. package/scripts/gds/core-origin-follow.js +5 -184
  851. package/scripts/gds/core-pin-sync.js +5 -258
  852. package/scripts/gds/coreB-carve-proof.sh +7 -724
  853. package/scripts/gds/cost-report.js +6 -62
  854. package/scripts/gds/cost.js +6 -46
  855. package/scripts/gds/credential-presence.js +5 -294
  856. package/scripts/gds/cutover-codemod.js +5 -239
  857. package/scripts/gds/db-backup-nightly.sh +7 -231
  858. package/scripts/gds/db-backup-offsite.sh +7 -266
  859. package/scripts/gds/demote.js +6 -44
  860. package/scripts/gds/deploy-divergence.js +6 -445
  861. package/scripts/gds/deploy-main-audit-gate.sh +7 -96
  862. package/scripts/gds/design-sync.js +5 -10
  863. package/scripts/gds/dev-box-guard.js +5 -164
  864. package/scripts/gds/dev-lib.js +5 -721
  865. package/scripts/gds/dev.js +5 -643
  866. package/scripts/gds/device-flow-help.js +5 -70
  867. package/scripts/gds/diagnose-achievements.js +5 -116
  868. package/scripts/gds/diagram-facts.js +6 -355
  869. package/scripts/gds/discord-channels.js +5 -75
  870. package/scripts/gds/do-api.js +6 -109
  871. package/scripts/gds/doc-cli-guard.js +5 -266
  872. package/scripts/gds/doc-comment-coverage.js +5 -137
  873. package/scripts/gds/doc-control-claims.js +5 -166
  874. package/scripts/gds/docs-entropy.js +5 -443
  875. package/scripts/gds/doctor.js +6 -492
  876. package/scripts/gds/enroll-control-plane.js +5 -99
  877. package/scripts/gds/exec-path-guard.js +5 -562
  878. package/scripts/gds/feedback-send.js +5 -247
  879. package/scripts/gds/fetch-art-key.js +5 -104
  880. package/scripts/gds/fetch-sound-prefs.js +5 -124
  881. package/scripts/gds/figma-design-sync.js +5 -9
  882. package/scripts/gds/find-untested.js +5 -369
  883. package/scripts/gds/fitness-checks-error-envelope.js +5 -133
  884. package/scripts/gds/fitness-checks-identity.js +5 -342
  885. package/scripts/gds/fitness-checks-packaging.js +5 -131
  886. package/scripts/gds/fitness-checks-route-pins.js +5 -75
  887. package/scripts/gds/fitness-checks-vocabulary.js +5 -391
  888. package/scripts/gds/fitness-checks-write-validation.js +5 -156
  889. package/scripts/gds/fitness-lib.js +5 -126
  890. package/scripts/gds/fitness-migration-contraction.js +5 -49
  891. package/scripts/gds/fitness-ratchets.js +5 -563
  892. package/scripts/gds/fitness.js +5 -1493
  893. package/scripts/gds/gate-review.js +5 -328
  894. package/scripts/gds/gating.js +5 -346
  895. package/scripts/gds/gds-literal-scan.js +5 -194
  896. package/scripts/gds/gen-api-client.js +5 -555
  897. package/scripts/gds/gen-api-docs.js +5 -1100
  898. package/scripts/gds/gen-atlas.js +5 -364
  899. package/scripts/gds/gen-diagrams.js +6 -607
  900. package/scripts/gds/gen-file-map.js +5 -335
  901. package/scripts/gds/gen-freshness.js +5 -31
  902. package/scripts/gds/gen-interaction-posture.js +5 -120
  903. package/scripts/gds/gen-repo-map.js +5 -538
  904. package/scripts/gds/gen-role-responsibilities.js +5 -133
  905. package/scripts/gds/gen-session-index.js +5 -241
  906. package/scripts/gds/gen-sounds.js +5 -174
  907. package/scripts/gds/git-merge-regen.js +6 -291
  908. package/scripts/gds/go-live.js +5 -1069
  909. package/scripts/gds/goal-names.js +5 -100
  910. package/scripts/gds/goal.js +6 -271
  911. package/scripts/gds/government-walk.js +5 -1475
  912. package/scripts/gds/grade-correlation-audit.js +5 -308
  913. package/scripts/gds/grade-replay.js +5 -235
  914. package/scripts/gds/grade-smoke.js +6 -204
  915. package/scripts/gds/home-isolation-guard.js +5 -125
  916. package/scripts/gds/hooks/pre-push.js +5 -209
  917. package/scripts/gds/howto.js +5 -143
  918. package/scripts/gds/http-api-client.js +6 -81
  919. package/scripts/gds/identity-strip.js +5 -74
  920. package/scripts/gds/init.js +5 -1157
  921. package/scripts/gds/install-git-hooks.js +5 -198
  922. package/scripts/gds/instance-apex.js +5 -37
  923. package/scripts/gds/intent-retry.js +5 -51
  924. package/scripts/gds/key-card.js +6 -221
  925. package/scripts/gds/key-status.js +5 -124
  926. package/scripts/gds/land-watch.js +5 -199
  927. package/scripts/gds/leak-scan-allowlist.js +5 -291
  928. package/scripts/gds/learning-capture.js +6 -144
  929. package/scripts/gds/lib.sh +7 -73
  930. package/scripts/gds/linkify-refs.js +6 -654
  931. package/scripts/gds/lint-infra-exec.js +5 -68
  932. package/scripts/gds/lint-migrations.js +5 -100
  933. package/scripts/gds/lint-workflow-exec.js +5 -61
  934. package/scripts/gds/local-preview-lib.js +6 -128
  935. package/scripts/gds/local-preview.js +6 -81
  936. package/scripts/gds/login.js +5 -358
  937. package/scripts/gds/main-audit.js +5 -623
  938. package/scripts/gds/me.js +6 -96
  939. package/scripts/gds/memory-map.js +5 -174
  940. package/scripts/gds/merge-lock.js +6 -70
  941. package/scripts/gds/migration-namespace.js +5 -311
  942. package/scripts/gds/mirror-lineage-check.js +5 -341
  943. package/scripts/gds/mirror-redact.js +5 -348
  944. package/scripts/gds/module-artifact.js +6 -289
  945. package/scripts/gds/module-assess-docs.js +6 -237
  946. package/scripts/gds/module-assess-installs.js +6 -227
  947. package/scripts/gds/module-assess-score.js +6 -110
  948. package/scripts/gds/module-assess-security.js +6 -251
  949. package/scripts/gds/module-assess-tests.js +6 -277
  950. package/scripts/gds/module-assess-version.js +6 -91
  951. package/scripts/gds/module-error-report.js +5 -146
  952. package/scripts/gds/module-test-runner.js +6 -413
  953. package/scripts/gds/module.js +5 -1374
  954. package/scripts/gds/move-escalation.js +5 -140
  955. package/scripts/gds/newcomer-floor.js +6 -420
  956. package/scripts/gds/newcomer-floor.test.js +6 -234
  957. package/scripts/gds/next-number.js +6 -162
  958. package/scripts/gds/oauth-secret.js +5 -200
  959. package/scripts/gds/onboard.js +5 -265
  960. package/scripts/gds/onboarding-analyze.js +6 -225
  961. package/scripts/gds/onboarding-config.js +6 -179
  962. package/scripts/gds/onboarding-ship.js +6 -91
  963. package/scripts/gds/pack-env-prefix.js +5 -72
  964. package/scripts/gds/package-core.js +5 -1102
  965. package/scripts/gds/page-inventory.js +5 -346
  966. package/scripts/gds/page-reader.js +5 -720
  967. package/scripts/gds/paste-token.js +6 -211
  968. package/scripts/gds/plain-cards.js +5 -350
  969. package/scripts/gds/portability-smoke-art.sh +7 -84
  970. package/scripts/gds/portability-smoke-memory.sh +7 -175
  971. package/scripts/gds/preflight.js +5 -212
  972. package/scripts/gds/probe-cache.js +5 -244
  973. package/scripts/gds/prove-strict-versioning.js +6 -283
  974. package/scripts/gds/provision-auto-upgrade.js +5 -161
  975. package/scripts/gds/provision-byo-host.js +5 -67
  976. package/scripts/gds/provision-capacity.js +5 -78
  977. package/scripts/gds/provision-caps.js +5 -62
  978. package/scripts/gds/provision-config.js +5 -232
  979. package/scripts/gds/provision-core-upgrade.js +5 -1165
  980. package/scripts/gds/provision-disconnect.js +5 -87
  981. package/scripts/gds/provision-github-setup.js +5 -167
  982. package/scripts/gds/provision-net.js +5 -356
  983. package/scripts/gds/provision-pin-key.js +5 -175
  984. package/scripts/gds/provision-pin-replay.js +5 -125
  985. package/scripts/gds/provision-process.js +5 -169
  986. package/scripts/gds/provision-render.js +5 -200
  987. package/scripts/gds/provision-repo-auth.js +5 -163
  988. package/scripts/gds/provision-repo-private.js +5 -97
  989. package/scripts/gds/provision-repo.js +5 -1336
  990. package/scripts/gds/provision-teardown.js +5 -105
  991. package/scripts/gds/provision-units.js +5 -468
  992. package/scripts/gds/provision.js +5 -1477
  993. package/scripts/gds/publish-credential-check.js +6 -65
  994. package/scripts/gds/publish-integration-gate.js +5 -140
  995. package/scripts/gds/publish-manifest.js +5 -437
  996. package/scripts/gds/publish-watch.js +5 -266
  997. package/scripts/gds/pulse.js +6 -335
  998. package/scripts/gds/push-main.js +5 -54
  999. package/scripts/gds/push-path-brief.js +5 -98
  1000. package/scripts/gds/read-session-export.js +5 -357
  1001. package/scripts/gds/reauth.js +6 -154
  1002. package/scripts/gds/recall.js +6 -182
  1003. package/scripts/gds/redteam-patrol.js +5 -435
  1004. package/scripts/gds/regen-instance-docs.js +5 -45
  1005. package/scripts/gds/release-core.js +5 -78
  1006. package/scripts/gds/release-notes.js +5 -270
  1007. package/scripts/gds/release.js +6 -138
  1008. package/scripts/gds/rename-goals.js +5 -107
  1009. package/scripts/gds/rename-history-check.js +5 -367
  1010. package/scripts/gds/rename-ledger-prose.js +5 -480
  1011. package/scripts/gds/render-api.js +5 -196
  1012. package/scripts/gds/render-check.js +5 -204
  1013. package/scripts/gds/render-ideas.js +6 -225
  1014. package/scripts/gds/render-payload.js +5 -84
  1015. package/scripts/gds/repo-metrics.js +6 -362
  1016. package/scripts/gds/review-sheet.js +5 -106
  1017. package/scripts/gds/role-pack-guard.js +5 -141
  1018. package/scripts/gds/route-shadow-guard.js +5 -173
  1019. package/scripts/gds/routine-schedule.js +5 -281
  1020. package/scripts/gds/run-routine.js +5 -255
  1021. package/scripts/gds/run-unit-tests.js +6 -659
  1022. package/scripts/gds/runner-drift.js +5 -149
  1023. package/scripts/gds/sandbox-stage.js +6 -458
  1024. package/scripts/gds/scope-map-guard.js +5 -299
  1025. package/scripts/gds/scope-roster-guard.js +5 -117
  1026. package/scripts/gds/seam-wiring-guard.js +5 -274
  1027. package/scripts/gds/search-ingest-db.js +6 -287
  1028. package/scripts/gds/search-ingest-md.js +6 -268
  1029. package/scripts/gds/seed-adopt-tasks.js +6 -74
  1030. package/scripts/gds/seed-api-contract-goal-tasks.js +6 -140
  1031. package/scripts/gds/seed-board-room-tasks.js +6 -196
  1032. package/scripts/gds/seed-bongos-app-tasks.js +6 -293
  1033. package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +6 -80
  1034. package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +6 -99
  1035. package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +6 -306
  1036. package/scripts/gds/seed-bongos-module-system-tasks.js +6 -345
  1037. package/scripts/gds/seed-bongos-tasks.js +6 -213
  1038. package/scripts/gds/seed-bongos-v1-idea-routing-tasks.js +6 -152
  1039. package/scripts/gds/seed-bongos-v1-seo-tasks.js +6 -104
  1040. package/scripts/gds/seed-bv1-community-tasks.js +6 -131
  1041. package/scripts/gds/seed-bv1-privacy-invites-tasks.js +6 -133
  1042. package/scripts/gds/seed-bv1-profile-page-tasks.js +6 -161
  1043. package/scripts/gds/seed-bv1-profiles-tasks.js +6 -135
  1044. package/scripts/gds/seed-bv1-r01-delta-tasks.js +6 -154
  1045. package/scripts/gds/seed-bv2-ideator-surface-tasks.js +6 -390
  1046. package/scripts/gds/seed-bv2-tweak-mode-tasks.js +6 -277
  1047. package/scripts/gds/seed-gds-v4-tasks.js +6 -623
  1048. package/scripts/gds/seed-governance-tasks.js +6 -339
  1049. package/scripts/gds/seed-medusa-tasks.js +6 -439
  1050. package/scripts/gds/seed-module-upstreaming.js +5 -217
  1051. package/scripts/gds/seed-productization-tasks.js +6 -234
  1052. package/scripts/gds/seed-project-admin-console-tasks.js +6 -88
  1053. package/scripts/gds/seed-provisioning-tasks.js +6 -82
  1054. package/scripts/gds/seed-staging.sh +7 -116
  1055. package/scripts/gds/seed-strict-versioning-tasks.js +6 -274
  1056. package/scripts/gds/seed-v2-world-tasks.js +6 -282
  1057. package/scripts/gds/seed-verify-criteria.js +6 -124
  1058. package/scripts/gds/sequence.js +6 -596
  1059. package/scripts/gds/session-cost.js +6 -429
  1060. package/scripts/gds/session-digest-build.js +6 -293
  1061. package/scripts/gds/session-digest.js +6 -199
  1062. package/scripts/gds/session-eval.js +6 -630
  1063. package/scripts/gds/session-transcript-build.js +6 -155
  1064. package/scripts/gds/session-transcript-upload.js +6 -29
  1065. package/scripts/gds/session.js +6 -403
  1066. package/scripts/gds/setup.js +6 -645
  1067. package/scripts/gds/ship-check.js +5 -85
  1068. package/scripts/gds/ship-deploy-target.js +5 -392
  1069. package/scripts/gds/ship-escalation.js +5 -166
  1070. package/scripts/gds/ship-finish.js +5 -419
  1071. package/scripts/gds/ship-flow.js +5 -1216
  1072. package/scripts/gds/ship-git.js +5 -99
  1073. package/scripts/gds/ship-grade-steps.js +5 -546
  1074. package/scripts/gds/ship-grade.js +5 -425
  1075. package/scripts/gds/ship-honesty.js +5 -312
  1076. package/scripts/gds/ship-io.js +5 -138
  1077. package/scripts/gds/ship-land.js +5 -1129
  1078. package/scripts/gds/ship-memory-sync.js +5 -248
  1079. package/scripts/gds/ship-merge-gate.js +5 -224
  1080. package/scripts/gds/ship-merge.js +5 -465
  1081. package/scripts/gds/ship-mode-ask.js +5 -137
  1082. package/scripts/gds/ship-mode-manual.js +5 -53
  1083. package/scripts/gds/ship-preflight-steps.js +5 -398
  1084. package/scripts/gds/ship-regen.js +5 -313
  1085. package/scripts/gds/ship-resume.js +5 -200
  1086. package/scripts/gds/ship-session-upload.js +5 -312
  1087. package/scripts/gds/ship-state.js +5 -109
  1088. package/scripts/gds/ship-surprise.js +5 -83
  1089. package/scripts/gds/ship-visual.js +5 -74
  1090. package/scripts/gds/ship.js +5 -380
  1091. package/scripts/gds/shipping-mode.js +5 -69
  1092. package/scripts/gds/skill-lint.js +5 -248
  1093. package/scripts/gds/skill-preflight.js +5 -359
  1094. package/scripts/gds/smoke-batch-claim.sh +7 -237
  1095. package/scripts/gds/smoke-batch-release.sh +7 -315
  1096. package/scripts/gds/smoke-claim-consistency.sh +7 -221
  1097. package/scripts/gds/smoke-dependencies.sh +7 -142
  1098. package/scripts/gds/smoke-gds.js +6 -255
  1099. package/scripts/gds/smoke-write.sh +7 -274
  1100. package/scripts/gds/source-text-test-scan.js +7 -0
  1101. package/scripts/gds/spark.js +6 -293
  1102. package/scripts/gds/stale-worktrees.js +5 -210
  1103. package/scripts/gds/start-goals.js +5 -101
  1104. package/scripts/gds/start.js +6 -1089
  1105. package/scripts/gds/status.js +6 -544
  1106. package/scripts/gds/strand-watch.js +5 -313
  1107. package/scripts/gds/stranded-rows.js +5 -198
  1108. package/scripts/gds/stray-unit-sweep.sh +7 -70
  1109. package/scripts/gds/surface.js +5 -100
  1110. package/scripts/gds/task.js +6 -272
  1111. package/scripts/gds/test-path-guard.js +5 -97
  1112. package/scripts/gds/triage.js +6 -741
  1113. package/scripts/gds/turn-end-sound.js +5 -72
  1114. package/scripts/gds/tweak-halt.js +5 -68
  1115. package/scripts/gds/tweak-renders.js +5 -198
  1116. package/scripts/gds/uat.js +6 -119
  1117. package/scripts/gds/ui-kit-transform.js +5 -41
  1118. package/scripts/gds/update-channel.js +5 -510
  1119. package/scripts/gds/update-sweep.js +5 -827
  1120. package/scripts/gds/upgrade-artist-gate.js +5 -45
  1121. package/scripts/gds/upgrade-commit-identity.js +5 -31
  1122. package/scripts/gds/upgrade-migrate.js +5 -223
  1123. package/scripts/gds/upgrade-operator.js +6 -73
  1124. package/scripts/gds/upgrade-outcome.js +5 -173
  1125. package/scripts/gds/upgrade.js +5 -1497
  1126. package/scripts/gds/validate-design.js +5 -10
  1127. package/scripts/gds/version-close.js +6 -620
  1128. package/scripts/gds/version-literal-guard.js +5 -138
  1129. package/scripts/gds/version-select.js +5 -77
  1130. package/scripts/gds/visual-review-nudge.js +5 -38
  1131. package/scripts/gds/wedge-remedy.js +5 -173
  1132. package/scripts/gds/worktree-claim-guard.js +5 -129
  1133. package/scripts/gds/worktree.js +6 -448
  1134. package/scripts/hall-preview/refresh-fixtures.js +1 -1
  1135. package/scripts/hall-preview/server.js +2 -2
  1136. package/scripts/migrate.sh +3 -3
  1137. package/scripts/public-mirror-export.js +3 -3
  1138. package/scripts/setup-builder.js +7 -7
  1139. package/src/bongos/api-errors.js +1 -0
  1140. package/src/bongos/api-prefix.js +1 -1
  1141. package/src/bongos/auth-github.js +19 -3
  1142. package/src/bongos/auth-idp.js +7 -0
  1143. package/src/bongos/claim-attribution.js +2 -2
  1144. package/src/bongos/core-moves.js +1 -1
  1145. package/src/bongos/core-update.js +3 -3
  1146. package/src/bongos/craft-mode.js +2 -2
  1147. package/src/bongos/db-kernel.js +15 -3
  1148. package/src/bongos/db.js +30 -4
  1149. package/src/bongos/github-repos.js +1 -1
  1150. package/src/bongos/llm-cache.js +1 -1
  1151. package/src/bongos/llm-pricing.js +1 -1
  1152. package/src/bongos/metrics.js +1 -1
  1153. package/src/bongos/middleware/rate-limit.js +2 -2
  1154. package/src/bongos/module-listing.js +93 -1
  1155. package/src/bongos/module-scope-map.js +90 -85
  1156. package/src/bongos/module-store.js +1 -1
  1157. package/src/bongos/module-submissions.js +1 -1
  1158. package/src/bongos/optimizer.js +1 -1
  1159. package/src/bongos/package-registry.js +1 -1
  1160. package/src/bongos/path-match.js +1 -1
  1161. package/src/bongos/permission-path-check.js +3 -3
  1162. package/src/bongos/platform-visibility-gate.js +3 -5
  1163. package/src/bongos/prelaunch-gate.js +7 -6
  1164. package/src/bongos/route-rank-check.js +2 -2
  1165. package/src/bongos/routes/auth.js +15 -2
  1166. package/src/bongos/routes/backup.js +1 -1
  1167. package/src/bongos/routes/builders.js +29 -1
  1168. package/src/bongos/routes/me.js +49 -18
  1169. package/src/bongos/routes/modules.js +29 -9
  1170. package/src/bongos/routes/public.js +3 -72
  1171. package/src/bongos/schema-lag.js +1 -1
  1172. package/src/bongos/sensitive-surfaces.js +1 -1
  1173. package/src/bongos/serve-internal.js +65 -16
  1174. package/src/bongos/software-update.js +2 -2
  1175. package/src/bongos/upgrade-hold.js +3 -3
  1176. package/src/hall-look.js +6 -5
  1177. package/src/module-api.js +3 -3
  1178. package/src/module-loader/catalog.js +1 -1
  1179. package/src/module-loader/error-tally.js +3 -3
  1180. package/src/module-loader/manifest-schema.js +3 -3
  1181. package/src/platform-server.js +10 -0
  1182. package/src/role-responsibilities.js +1 -1
  1183. package/src/stale-timer.js +2 -2
  1184. package/tests/accessibility_replay.mjs +1 -1
  1185. package/tests/activity_rollup_order_db.mjs +1 -1
  1186. package/tests/activity_snapshots_db.mjs +1 -1
  1187. package/tests/adopt_detect.mjs +1 -1
  1188. package/tests/adopt_import.mjs +1 -1
  1189. package/tests/adopt_preflight.mjs +1 -1
  1190. package/tests/adr_0089_scope.mjs +10 -7
  1191. package/tests/adr_0162_citation.mjs +1 -1
  1192. package/tests/adr_0162_gate_citation.mjs +1 -1
  1193. package/tests/agent_invoke.mjs +1 -1
  1194. package/tests/agent_invoke_live.mjs +3 -3
  1195. package/tests/agents_cron_trigger.mjs +2 -2
  1196. package/tests/agents_roster.mjs +1 -1
  1197. package/tests/agents_sync.mjs +4 -4
  1198. package/tests/allow_rule_guard.mjs +20 -20
  1199. package/tests/api_alias_caller_ratchet.mjs +9 -10
  1200. package/tests/api_alias_exceptions.mjs +7 -6
  1201. package/tests/api_artifacts.mjs +214 -0
  1202. package/tests/api_cli_flags.mjs +3 -3
  1203. package/tests/api_client.mjs +56 -54
  1204. package/tests/api_docs.mjs +30 -9
  1205. package/tests/api_error_envelope_buildcheck.mjs +1 -1
  1206. package/tests/api_msys_path_repair.mjs +2 -2
  1207. package/tests/architect.mjs +1 -1
  1208. package/tests/art_stage.mjs +2 -2
  1209. package/tests/artifact_audit.mjs +2 -2
  1210. package/tests/artifact_staleness.mjs +9 -9
  1211. package/tests/atlas.mjs +1 -1
  1212. package/tests/audit_deps.mjs +1 -1
  1213. package/tests/audit_gate.mjs +1 -1
  1214. package/tests/auth_flow_slice1.mjs +3 -3
  1215. package/tests/auth_inactive_builder.mjs +43 -5
  1216. package/tests/auth_session_expiry_db.mjs +16 -4
  1217. package/tests/auth_session_ttl.mjs +23 -0
  1218. package/tests/authorship_audit.mjs +2 -2
  1219. package/tests/autobongos_cadence.mjs +1 -1
  1220. package/tests/autobongos_fence.mjs +1 -1
  1221. package/tests/autobongos_grade_cap.mjs +2 -2
  1222. package/tests/autobongos_heartbeat_head.mjs +1 -1
  1223. package/tests/autobongos_host_access.mjs +3 -3
  1224. package/tests/autobongos_loop.mjs +17 -17
  1225. package/tests/autobongos_service_ps1.mjs +3 -3
  1226. package/tests/autobongos_tweak_lane.mjs +2 -2
  1227. package/tests/autobongos_verify.mjs +2 -2
  1228. package/tests/autonomous_fit_protected_paths.mjs +3 -3
  1229. package/tests/autonomy_config_idle.mjs +1 -1
  1230. package/tests/autonomy_digest.mjs +1 -1
  1231. package/tests/autonomy_gate.mjs +1 -1
  1232. package/tests/autonomy_gauge.mjs +2 -2
  1233. package/tests/autonomy_runner_identity.mjs +1 -1
  1234. package/tests/backfill_sessions.mjs +8 -8
  1235. package/tests/backfill_subagent_rewards.mjs +1 -1
  1236. package/tests/backfill_task_rewards.mjs +2 -2
  1237. package/tests/backlog_review.mjs +3 -3
  1238. package/tests/baseline_staleness.mjs +2 -2
  1239. package/tests/bfg.mjs +11 -5
  1240. package/tests/bfg_write.mjs +20 -11
  1241. package/tests/blockers_hall.mjs +17 -5
  1242. package/tests/blockers_page_ui.mjs +56 -12
  1243. package/tests/bongos_dispatch.mjs +5 -5
  1244. package/tests/bongos_login.mjs +2 -2
  1245. package/tests/bug_attachment_audit.mjs +1 -1
  1246. package/tests/bug_attachment_recover.mjs +2 -2
  1247. package/tests/bug_triage.mjs +3 -3
  1248. package/tests/build_info.mjs +1 -1
  1249. package/tests/builder_tester_tag.mjs +184 -0
  1250. package/tests/bump_version.mjs +3 -3
  1251. package/tests/canonical_profile_url.mjs +1 -1
  1252. package/tests/capture_error_format.mjs +1 -1
  1253. package/tests/capture_goal_routing.mjs +2 -2
  1254. package/tests/category_advisory_guard.mjs +3 -3
  1255. package/tests/claim_error_surface.mjs +2 -2
  1256. package/tests/claim_from_task_and_home.mjs +1 -1
  1257. package/tests/claim_gate_open_blocker.mjs +7 -4
  1258. package/tests/claim_gate_rebase.mjs +12 -8
  1259. package/tests/claim_recall.mjs +4 -4
  1260. package/tests/claim_resolve_worktree_lock.mjs +1 -1
  1261. package/tests/claude_materialize.mjs +58 -58
  1262. package/tests/clawback_confirmed_backlog.mjs +8 -5
  1263. package/tests/cli_allowlist_permissions.mjs +11 -11
  1264. package/tests/cli_dispatcher.mjs +2 -2
  1265. package/tests/cli_err_code.mjs +6 -6
  1266. package/tests/cli_exit_no_abort.mjs +7 -7
  1267. package/tests/cli_lib_formatters.mjs +2 -2
  1268. package/tests/cli_sessions.mjs +5 -5
  1269. package/tests/cli_surface.mjs +15 -15
  1270. package/tests/cli_token_reissue.mjs +2 -2
  1271. package/tests/client_baseurl_guard.mjs +1 -1
  1272. package/tests/client_bundle_route.mjs +35 -4
  1273. package/tests/cloud_bongos_pack.mjs +1 -1
  1274. package/tests/community_leaderboard_db.mjs +1 -1
  1275. package/tests/conductor.mjs +18 -18
  1276. package/tests/conflict_resolve.mjs +14 -16
  1277. package/tests/consumer_layout_boot.mjs +12 -12
  1278. package/tests/context_pack.mjs +6 -6
  1279. package/tests/control_manifest.mjs +4 -4
  1280. package/tests/copy_desk_page_reads.mjs +1 -1
  1281. package/tests/copy_desk_page_release.mjs +192 -0
  1282. package/tests/copy_inventory.mjs +2 -2
  1283. package/tests/core_auto_upgrade.mjs +1 -1
  1284. package/tests/core_move_notice.mjs +2 -2
  1285. package/tests/core_origin_follow.mjs +7 -7
  1286. package/tests/core_pin_sync.mjs +3 -3
  1287. package/tests/core_upgrade_door.mjs +2 -2
  1288. package/tests/core_upgrade_owner_door.mjs +34 -1
  1289. package/tests/core_upgrade_runner.mjs +19 -19
  1290. package/tests/credential_presence.mjs +2 -2
  1291. package/tests/credit_grant.mjs +3 -3
  1292. package/tests/credit_log_single_writer.mjs +5 -5
  1293. package/tests/criterion_ref_status.mjs +2 -2
  1294. package/tests/cross_discipline_priority_direction.mjs +3 -3
  1295. package/tests/cutover_codemod.mjs +2 -4
  1296. package/tests/db_backup_nightly.mjs +1 -1
  1297. package/tests/db_backup_offsite.mjs +1 -1
  1298. package/tests/db_ownership_handover.mjs +2 -2
  1299. package/tests/dead_deps.mjs +3 -3
  1300. package/tests/dependency_advisory.mjs +1 -1
  1301. package/tests/deploy_audit_gate.mjs +4 -4
  1302. package/tests/deploy_divergence_line.mjs +36 -16
  1303. package/tests/deploy_page_projects.mjs +35 -4
  1304. package/tests/dev_lib.mjs +2 -2
  1305. package/tests/dev_windows.mjs +2 -2
  1306. package/tests/diagram_facts_offset.mjs +1 -1
  1307. package/tests/diagram_repo_slug.mjs +1 -1
  1308. package/tests/diff_derived_signals.mjs +2 -2
  1309. package/tests/dns_preflight.mjs +2 -2
  1310. package/tests/do_api.mjs +3 -3
  1311. package/tests/doc_cli_guard.mjs +28 -28
  1312. package/tests/doc_comment_coverage.mjs +1 -1
  1313. package/tests/doc_control_claims.mjs +11 -11
  1314. package/tests/docs_entropy.mjs +2 -2
  1315. package/tests/docs_openapi_route.mjs +8 -6
  1316. package/tests/doctor_hooks.mjs +1 -1
  1317. package/tests/edit_hints.mjs +3 -2
  1318. package/tests/effective_visibility_predicate.mjs +3 -3
  1319. package/tests/env_knobs_neutral_prefix.mjs +13 -13
  1320. package/tests/exec_path_guard.mjs +4 -4
  1321. package/tests/executed_closure.mjs +18 -12
  1322. package/tests/file_map.mjs +1 -1
  1323. package/tests/find_untested.mjs +13 -13
  1324. package/tests/first_admin_bootstrap.mjs +1 -1
  1325. package/tests/fitness.mjs +16 -16
  1326. package/tests/fitness_gds_ratchet.mjs +2 -2
  1327. package/tests/fitness_installed_core.mjs +3 -3
  1328. package/tests/fitness_no_raw_nul.mjs +1 -1
  1329. package/tests/fitness_ratchets.mjs +3 -3
  1330. package/tests/fitness_scope_roster.mjs +2 -2
  1331. package/tests/fitness_two_root.mjs +8 -8
  1332. package/tests/fixtures/accessibility-replay.json +5 -5
  1333. package/tests/fixtures/grade-replay/recorded-panel-grades.json +1 -1
  1334. package/tests/fixtures/ideator-prefold/README.md +1 -1
  1335. package/tests/fixtures/page-ledger.mjs +22 -0
  1336. package/tests/fixtures/session-506-digest.json +5 -5
  1337. package/tests/gate_approvals.mjs +50 -0
  1338. package/tests/gate_review.mjs +8 -8
  1339. package/tests/gating_review_retired.mjs +2 -2
  1340. package/tests/gen_freshness.mjs +3 -3
  1341. package/tests/git_guard.mjs +3 -3
  1342. package/tests/git_merge_regen.mjs +41 -65
  1343. package/tests/github_one_trip.mjs +4 -4
  1344. package/tests/github_pick_up.mjs +2 -2
  1345. package/tests/github_push_merge_driver.mjs +1 -1
  1346. package/tests/go_live.mjs +3 -2
  1347. package/tests/goal_category.mjs +1 -1
  1348. package/tests/goal_cli.mjs +2 -2
  1349. package/tests/goal_create_spec_entry.mjs +1 -1
  1350. package/tests/goal_invite_consent.mjs +3 -1
  1351. package/tests/goal_move.mjs +1 -1
  1352. package/tests/goal_names.mjs +2 -2
  1353. package/tests/goal_working_area.mjs +1 -1
  1354. package/tests/government_agent_asks.mjs +7 -7
  1355. package/tests/government_board_room_copy.mjs +6 -1
  1356. package/tests/government_board_view.mjs +39 -0
  1357. package/tests/government_board_vote_ui.mjs +39 -1
  1358. package/tests/government_config.mjs +2 -2
  1359. package/tests/government_live_proof_shape.mjs +1 -1
  1360. package/tests/government_protected_surfaces.mjs +54 -53
  1361. package/tests/government_require_permission.mjs +9 -1
  1362. package/tests/government_vanilla_boot.mjs +1 -1
  1363. package/tests/government_vocabulary.mjs +2 -2
  1364. package/tests/government_walk.mjs +2 -2
  1365. package/tests/grade_body_limit.mjs +6 -4
  1366. package/tests/grade_correlation_audit.mjs +3 -3
  1367. package/tests/grade_diff_hash.mjs +1 -1
  1368. package/tests/grade_engine_replay.mjs +2 -2
  1369. package/tests/grade_server_authoritative.mjs +1 -1
  1370. package/tests/grade_unavailable_display.mjs +1 -1
  1371. package/tests/grader.mjs +8 -24
  1372. package/tests/grader_generated_provenance.mjs +14 -14
  1373. package/tests/grader_no_artifact.mjs +1 -1
  1374. package/tests/grader_prompt_fencing.mjs +1 -1
  1375. package/tests/grader_quality_window_overflow.mjs +1 -1
  1376. package/tests/grader_reader_lens.mjs +3 -3
  1377. package/tests/grader_regrade_delta.mjs +1 -1
  1378. package/tests/grader_unbacked_score.mjs +2 -2
  1379. package/tests/hall_acclaim_vote_control.mjs +113 -0
  1380. package/tests/hall_asset_cache.mjs +127 -0
  1381. package/tests/hall_audit.mjs +63 -0
  1382. package/tests/hall_board_world.mjs +20 -0
  1383. package/tests/hall_city_card_words.mjs +61 -0
  1384. package/tests/hall_client_request_shape.mjs +5 -1
  1385. package/tests/hall_home_ships_bounded.mjs +160 -0
  1386. package/tests/hall_landing_boot.mjs +15 -2
  1387. package/tests/hall_nav.mjs +33 -0
  1388. package/tests/hall_onboarding_bongos_setup.mjs +1 -1
  1389. package/tests/hall_oversight_world.mjs +44 -4
  1390. package/tests/hall_palette.mjs +12 -9
  1391. package/tests/hall_preview_security.mjs +1 -1
  1392. package/tests/hall_profile_world.mjs +17 -0
  1393. package/tests/hall_reading_world.mjs +16 -1
  1394. package/tests/hall_roster_world.mjs +2 -1
  1395. package/tests/hall_studio_world.mjs +4 -1
  1396. package/tests/hall_work_history_id.mjs +39 -0
  1397. package/tests/held_tweak_reporting.mjs +4 -4
  1398. package/tests/helpers.mjs +3 -3
  1399. package/tests/home_attention_cards.mjs +2 -0
  1400. package/tests/home_bounded_reads.mjs +1 -1
  1401. package/tests/home_isolation_guard.mjs +1 -1
  1402. package/tests/hook_core_resolve.mjs +7 -7
  1403. package/tests/hook_user_agents.mjs +1 -1
  1404. package/tests/hooks_drain.mjs +2 -2
  1405. package/tests/host_topology_skips.mjs +1 -1
  1406. package/tests/howto_guide.mjs +1 -1
  1407. package/tests/howto_moments.mjs +3 -3
  1408. package/tests/hub_account_page.mjs +1 -1
  1409. package/tests/idea_capture_grades.mjs +2 -2
  1410. package/tests/idea_develop_spark.mjs +1 -1
  1411. package/tests/idea_filed_via.mjs +2 -2
  1412. package/tests/idea_ideate_full.mjs +1 -1
  1413. package/tests/idea_spark_mark.mjs +1 -1
  1414. package/tests/idea_spark_queue.mjs +1 -1
  1415. package/tests/idea_triage.mjs +1 -1
  1416. package/tests/idea_triage_grade.mjs +3 -3
  1417. package/tests/idea_vote_permission.mjs +113 -0
  1418. package/tests/idea_votes_fold_db.mjs +123 -0
  1419. package/tests/infra_exec_paths.mjs +12 -12
  1420. package/tests/init.mjs +2 -2
  1421. package/tests/instance_db_migrated_on_code_move.mjs +5 -5
  1422. package/tests/instance_feedback.mjs +9 -9
  1423. package/tests/instance_mismatch_guard.mjs +2 -2
  1424. package/tests/integration_parked_ratchet.mjs +24 -2
  1425. package/tests/intent_retry.mjs +1 -1
  1426. package/tests/interaction_posture.mjs +3 -3
  1427. package/tests/invite_expiry_db.mjs +1 -1
  1428. package/tests/joinability_invite_only.mjs +1 -1
  1429. package/tests/karma_vote_lists.mjs +270 -0
  1430. package/tests/key-card.mjs +2 -2
  1431. package/tests/key-status.mjs +2 -2
  1432. package/tests/knip_ratchet_ambient.mjs +2 -2
  1433. package/tests/known_failing_ratchet.mjs +1 -1
  1434. package/tests/land_watch.mjs +2 -2
  1435. package/tests/landing_legal_pages.mjs +1 -1
  1436. package/tests/landing_page.mjs +2 -2
  1437. package/tests/leaderboard_roles.mjs +4 -1
  1438. package/tests/leak_scan_allowlist.mjs +8 -8
  1439. package/tests/leak_scan_fail_closed.mjs +1 -1
  1440. package/tests/lib_sh_resolution.mjs +9 -9
  1441. package/tests/lifecycle-card.mjs +7 -7
  1442. package/tests/linkify_check.mjs +2 -2
  1443. package/tests/linkify_refs.mjs +1 -1
  1444. package/tests/llm-cache-route.mjs +1 -1
  1445. package/tests/local_preview.mjs +2 -2
  1446. package/tests/main_audit.mjs +3 -3
  1447. package/tests/main_audit_attestation.mjs +1 -1
  1448. package/tests/main_audit_db_roster.mjs +2 -2
  1449. package/tests/main_worktree_busy_reason.mjs +3 -3
  1450. package/tests/markdown_line_endings.mjs +2 -2
  1451. package/tests/me_streak_leaderboard_queries.mjs +193 -0
  1452. package/tests/membership_kind_lockstep.mjs +1 -1
  1453. package/tests/memory_isolation.mjs +16 -8
  1454. package/tests/memory_map.mjs +2 -2
  1455. package/tests/memory_pull.mjs +33 -25
  1456. package/tests/merge_driver_register.mjs +3 -3
  1457. package/tests/migration_allocation.mjs +2 -2
  1458. package/tests/migration_namespace.mjs +1 -1
  1459. package/tests/migrations_forward_safe.mjs +1 -1
  1460. package/tests/mingle.mjs +1 -1
  1461. package/tests/mirror_lineage_fulltree.mjs +3 -3
  1462. package/tests/mirror_lineage_proof.mjs +2 -2
  1463. package/tests/mirror_redact.mjs +4 -4
  1464. package/tests/missing_dep_classify.mjs +3 -3
  1465. package/tests/module-scope-map.mjs +22 -22
  1466. package/tests/module_api_lazy.mjs +1 -1
  1467. package/tests/module_assess_docs.mjs +2 -2
  1468. package/tests/module_assess_installs.mjs +3 -3
  1469. package/tests/module_assess_price_parity.mjs +5 -5
  1470. package/tests/module_assess_score.mjs +5 -5
  1471. package/tests/module_assess_security.mjs +4 -4
  1472. package/tests/module_assess_tests.mjs +3 -3
  1473. package/tests/module_assessments_migration.mjs +1 -1
  1474. package/tests/module_catalog.mjs +2 -2
  1475. package/tests/module_cli.mjs +3 -3
  1476. package/tests/module_entitlements.mjs +1 -1
  1477. package/tests/module_error_counts.mjs +1 -1
  1478. package/tests/module_install.mjs +4 -4
  1479. package/tests/module_loader.mjs +3 -1
  1480. package/tests/module_owned_tests.mjs +1 -1
  1481. package/tests/module_release_channels.mjs +1 -1
  1482. package/tests/module_store_howto.mjs +3 -3
  1483. package/tests/module_store_listing.mjs +139 -2
  1484. package/tests/module_store_publish.mjs +4 -4
  1485. package/tests/module_store_publish_route.mjs +1 -1
  1486. package/tests/module_store_reassess.mjs +1 -1
  1487. package/tests/module_store_registry_migration.mjs +1 -1
  1488. package/tests/module_test_runner.mjs +3 -3
  1489. package/tests/module_update.mjs +4 -4
  1490. package/tests/module_upgrade_updates.mjs +1 -1
  1491. package/tests/move_escalation.mjs +2 -2
  1492. package/tests/nav_permission_atoms.mjs +3 -2
  1493. package/tests/needs_rebase.mjs +7 -3
  1494. package/tests/newcomer_floor.mjs +1 -1
  1495. package/tests/newcomer_generator.mjs +48 -0
  1496. package/tests/next_number.mjs +1 -1
  1497. package/tests/no_artifact_escalation.mjs +3 -3
  1498. package/tests/npm_release_where.mjs +1 -1
  1499. package/tests/oauth_secret.mjs +2 -2
  1500. package/tests/onboard.mjs +6 -6
  1501. package/tests/onboarding_gate.mjs +2 -2
  1502. package/tests/opt_in_skill_modules.mjs +3 -3
  1503. package/tests/own_scope_guard.mjs +1 -1
  1504. package/tests/own_session_revoke.mjs +4 -1
  1505. package/tests/package_core.mjs +10 -11
  1506. package/tests/page_inventory.mjs +5 -5
  1507. package/tests/page_reader.mjs +7 -7
  1508. package/tests/page_tweak_hold.mjs +6 -6
  1509. package/tests/parallel-load.mjs +1 -1
  1510. package/tests/paste_token_api_base.mjs +1 -1
  1511. package/tests/paste_token_session_store.mjs +2 -2
  1512. package/tests/pending_invite_purge_db.mjs +1 -1
  1513. package/tests/permission_path.mjs +1 -1
  1514. package/tests/pin_replay.mjs +1 -1
  1515. package/tests/pin_write_key.mjs +7 -7
  1516. package/tests/plain_cards.mjs +15 -15
  1517. package/tests/pr_assign.mjs +1 -1
  1518. package/tests/pre_push_hook.mjs +3 -3
  1519. package/tests/preflight_checks.mjs +2 -2
  1520. package/tests/prelaunch_gate.mjs +1 -1
  1521. package/tests/privacy_matrix.mjs +1 -1
  1522. package/tests/probe_cache.mjs +6 -6
  1523. package/tests/profile_connections_ui.mjs +4 -3
  1524. package/tests/profile_fields.mjs +11 -1
  1525. package/tests/profile_privacy_owner_view.mjs +1 -1
  1526. package/tests/profile_role_headline.mjs +10 -9
  1527. package/tests/project_admin_console_model.mjs +1 -1
  1528. package/tests/projects_hub.mjs +1 -1
  1529. package/tests/projects_hub_cloud_hop.mjs +1 -1
  1530. package/tests/promote_goal_id.mjs +6 -6
  1531. package/tests/promotion_sweep.mjs +1 -1
  1532. package/tests/provision.mjs +24 -24
  1533. package/tests/provision_account_identity.mjs +2 -2
  1534. package/tests/provision_byo_host.mjs +1 -1
  1535. package/tests/provision_caddy_wiring.mjs +2 -2
  1536. package/tests/provision_disconnect.mjs +2 -2
  1537. package/tests/provision_dns_first.mjs +1 -1
  1538. package/tests/provision_render.mjs +9 -9
  1539. package/tests/provision_repo_private.mjs +3 -3
  1540. package/tests/provision_resource_caps.mjs +5 -5
  1541. package/tests/provision_restart.mjs +3 -3
  1542. package/tests/provision_settings_apply.mjs +7 -7
  1543. package/tests/provision_teardown_address.mjs +2 -2
  1544. package/tests/provisioning_capacity.mjs +5 -5
  1545. package/tests/provisioning_credential_preflight.mjs +1 -1
  1546. package/tests/provisioning_disconnect.mjs +1 -1
  1547. package/tests/provisioning_error_note_scope.mjs +4 -4
  1548. package/tests/provisioning_paid_shape_gate.mjs +2 -2
  1549. package/tests/provisioning_planet_physics.mjs +16 -0
  1550. package/tests/provisioning_runner_drift_notice.mjs +2 -2
  1551. package/tests/provisioning_settings_env.mjs +1 -1
  1552. package/tests/pruned_lockfile_integrity.mjs +1 -1
  1553. package/tests/public_mirror_export.mjs +1 -1
  1554. package/tests/publish_integration_gate.mjs +2 -2
  1555. package/tests/publish_manifest.mjs +6 -6
  1556. package/tests/publish_watch.mjs +1 -1
  1557. package/tests/push_path_brief.mjs +2 -2
  1558. package/tests/raise.mjs +248 -0
  1559. package/tests/rank_roles_audit.mjs +1 -1
  1560. package/tests/rank_tier_single_source.mjs +2 -2
  1561. package/tests/rate_limit_public.mjs +1 -1
  1562. package/tests/read_default_meter.mjs +2 -2
  1563. package/tests/read_session_export.mjs +1 -1
  1564. package/tests/rebase_gate_set_aside.mjs +1 -1
  1565. package/tests/recall_cli.mjs +1 -1
  1566. package/tests/recall_corpus_health.mjs +3 -2
  1567. package/tests/recall_hints.mjs +1 -1
  1568. package/tests/recruiter_sliver_boundary.mjs +1 -1
  1569. package/tests/redteam_patrol.mjs +2 -2
  1570. package/tests/regrade_actual_minutes.mjs +2 -2
  1571. package/tests/regrade_eligibility.mjs +2 -2
  1572. package/tests/release_core.mjs +2 -2
  1573. package/tests/release_notes.mjs +4 -4
  1574. package/tests/rename_history_restraint.mjs +3 -3
  1575. package/tests/rename_ledger_prose.mjs +6 -6
  1576. package/tests/render_api.mjs +1 -1
  1577. package/tests/render_check.mjs +4 -4
  1578. package/tests/render_deploy.mjs +1 -1
  1579. package/tests/repo_info_binding.mjs +1 -1
  1580. package/tests/repo_map.mjs +5 -5
  1581. package/tests/reward_mode_cost_plus_only.mjs +7 -3
  1582. package/tests/reward_mode_surfacing.mjs +1 -1
  1583. package/tests/role_responsibilities.mjs +1 -1
  1584. package/tests/rot_inbox.mjs +10 -7
  1585. package/tests/route_permission_check.mjs +1 -1
  1586. package/tests/route_shadow_guard.mjs +1 -1
  1587. package/tests/route_validation.mjs +1 -1
  1588. package/tests/routine_capture_kind.mjs +6 -6
  1589. package/tests/routine_schedule.mjs +9 -9
  1590. package/tests/run_routine.mjs +5 -5
  1591. package/tests/run_routine_two_root.mjs +5 -5
  1592. package/tests/runner_drift.mjs +17 -17
  1593. package/tests/sandbox_stage.mjs +5 -5
  1594. package/tests/scope_map_guard.mjs +7 -7
  1595. package/tests/scouting_owner_access_and_reach.mjs +1 -1
  1596. package/tests/scripts_gds_forwarders.mjs +224 -0
  1597. package/tests/scrubber_corpus.mjs +2 -2
  1598. package/tests/seam_wiring_guard.mjs +1 -1
  1599. package/tests/search_ingest.mjs +2 -2
  1600. package/tests/search_ingest_db.mjs +1 -1
  1601. package/tests/search_ingest_nul.mjs +6 -6
  1602. package/tests/seed_verify_criteria.mjs +3 -3
  1603. package/tests/sequence.mjs +3 -3
  1604. package/tests/served_paths_shipped.mjs +3 -3
  1605. package/tests/session_506_regression.mjs +1 -1
  1606. package/tests/session_accessibility.mjs +1 -1
  1607. package/tests/session_caps.mjs +1 -1
  1608. package/tests/session_cost.mjs +1 -1
  1609. package/tests/session_digest.mjs +2 -2
  1610. package/tests/session_eval.mjs +6 -6
  1611. package/tests/session_index.mjs +1 -1
  1612. package/tests/session_records.mjs +4 -4
  1613. package/tests/session_rename_fallback.mjs +2 -2
  1614. package/tests/session_reward_on_land.mjs +7 -149
  1615. package/tests/session_reward_on_land_db.mjs +191 -0
  1616. package/tests/session_reward_reconcile.mjs +6 -88
  1617. package/tests/session_reward_reconcile_db.mjs +132 -0
  1618. package/tests/session_transcript.mjs +1 -1
  1619. package/tests/sessions_kit_pager.mjs +2 -1
  1620. package/tests/setup_device_flow_fallback.mjs +2 -2
  1621. package/tests/setup_smoke.mjs +12 -5
  1622. package/tests/setup_status_facts.mjs +54 -12
  1623. package/tests/ship_autolinkify.mjs +2 -2
  1624. package/tests/ship_automerge_injection.mjs +1 -1
  1625. package/tests/ship_base_flag.mjs +1 -1
  1626. package/tests/ship_broadcast_routing.mjs +1 -1
  1627. package/tests/ship_broadcast_server.mjs +2 -2
  1628. package/tests/ship_builder_model.mjs +1 -1
  1629. package/tests/ship_cannot_lie.mjs +9 -9
  1630. package/tests/ship_card.mjs +2 -2
  1631. package/tests/ship_ci_deploy.mjs +7 -7
  1632. package/tests/ship_error_shape.mjs +1 -1
  1633. package/tests/ship_land_ci_not_started.mjs +3 -3
  1634. package/tests/ship_land_conflict.mjs +3 -3
  1635. package/tests/ship_land_proof.mjs +3 -3
  1636. package/tests/ship_land_red_pr.mjs +5 -5
  1637. package/tests/ship_merge_gate.mjs +14 -14
  1638. package/tests/ship_mode.mjs +1 -1
  1639. package/tests/ship_mode_first_ship.mjs +4 -4
  1640. package/tests/ship_mode_hands_off.mjs +8 -8
  1641. package/tests/ship_post_land_verify.mjs +1 -1
  1642. package/tests/ship_preflight.mjs +19 -19
  1643. package/tests/ship_premerge.mjs +1 -1
  1644. package/tests/ship_publish_error.mjs +2 -2
  1645. package/tests/ship_push_diagnosis.mjs +1 -1
  1646. package/tests/ship_regen_copy_inventory.mjs +3 -3
  1647. package/tests/ship_resume.mjs +4 -4
  1648. package/tests/ship_smoke_gate.mjs +1 -1
  1649. package/tests/ship_upload_skip.mjs +1 -1
  1650. package/tests/ship_upstream_deletion.mjs +1 -1
  1651. package/tests/ship_vendored_instance.mjs +8 -8
  1652. package/tests/ship_visual_regrade.mjs +3 -3
  1653. package/tests/ship_zero_commit.mjs +1 -1
  1654. package/tests/skill_docs_unavailable_regrade.mjs +3 -3
  1655. package/tests/skill_friction_kind.mjs +1 -1
  1656. package/tests/skill_grade_recover.mjs +1 -1
  1657. package/tests/skill_grader_health.mjs +1 -1
  1658. package/tests/skill_lint.mjs +1 -1
  1659. package/tests/skill_menu_ruling.mjs +1 -1
  1660. package/tests/skill_preflight.mjs +7 -7
  1661. package/tests/skip_is_not_pass.mjs +22 -1
  1662. package/tests/smoke_dependencies_witness.mjs +2 -2
  1663. package/tests/smoke_preflight.mjs +1 -1
  1664. package/tests/smoke_target.mjs +2 -2
  1665. package/tests/smoke_write_contract.mjs +2 -2
  1666. package/tests/sound_player.mjs +8 -8
  1667. package/tests/source_text_test_ratchet.mjs +97 -0
  1668. package/tests/speciality_corpus_scope.mjs +1 -1
  1669. package/tests/speciality_session_skills.mjs +1 -1
  1670. package/tests/sso_checkin_legacy_field_gone.mjs +4 -2
  1671. package/tests/stale_timer.mjs +3 -3
  1672. package/tests/stale_worktrees.mjs +1 -1
  1673. package/tests/start_env_guard.mjs +1 -1
  1674. package/tests/start_goal_first.mjs +3 -3
  1675. package/tests/start_inbox_count.mjs +1 -1
  1676. package/tests/start_rebase_warning.mjs +1 -1
  1677. package/tests/status_default_version.mjs +3 -3
  1678. package/tests/status_mirror_sync.mjs +1 -1
  1679. package/tests/status_page_no_dead_uptime.mjs +80 -0
  1680. package/tests/stop_refcheck.mjs +1 -1
  1681. package/tests/strand_watch.mjs +1 -1
  1682. package/tests/stranded_rows.mjs +1 -1
  1683. package/tests/stuck_detector.mjs +14 -14
  1684. package/tests/sweep_app_account.mjs +3 -3
  1685. package/tests/task_cli.mjs +2 -2
  1686. package/tests/task_detail_ui.mjs +11 -1
  1687. package/tests/task_discipline_required.mjs +2 -2
  1688. package/tests/task_list_paging.mjs +1 -1
  1689. package/tests/task_visual_slots.mjs +2 -2
  1690. package/tests/terms_acceptance.mjs +1 -1
  1691. package/tests/terms_grandfather_db.mjs +1 -1
  1692. package/tests/test_path_guard.mjs +1 -1
  1693. package/tests/triage_development.mjs +1 -1
  1694. package/tests/tweak_batch_apply.mjs +2 -2
  1695. package/tests/tweak_land_heal.mjs +3 -3
  1696. package/tests/tweak_unattended.mjs +3 -3
  1697. package/tests/ui_design_skills.mjs +2 -2
  1698. package/tests/unit_report_status.mjs +2 -2
  1699. package/tests/unit_runner_serial.mjs +2 -2
  1700. package/tests/unit_runner_teardown_abort.mjs +1 -1
  1701. package/tests/update_channel.mjs +2 -2
  1702. package/tests/update_channel_db.mjs +4 -4
  1703. package/tests/update_subscription_engine.mjs +26 -26
  1704. package/tests/update_sweep_home.mjs +14 -14
  1705. package/tests/upgrade.mjs +11 -11
  1706. package/tests/upgrade_artist_gate.mjs +4 -4
  1707. package/tests/upgrade_commit_identity.mjs +2 -2
  1708. package/tests/upgrade_migrate.mjs +7 -7
  1709. package/tests/upgrade_operator.mjs +2 -2
  1710. package/tests/upgrade_outcome.mjs +2 -2
  1711. package/tests/upgrade_persist_pin.mjs +5 -5
  1712. package/tests/upkeep_home.mjs +1 -1
  1713. package/tests/version_close.mjs +2 -2
  1714. package/tests/version_close_cli.mjs +2 -2
  1715. package/tests/version_close_route.mjs +1 -1
  1716. package/tests/version_literals.mjs +23 -23
  1717. package/tests/visual_review.mjs +5 -5
  1718. package/tests/wedge_remedy.mjs +5 -5
  1719. package/tests/welcome_boot.mjs +116 -0
  1720. package/tests/welcome_boot_browser.mjs +271 -0
  1721. package/tests/wizard_born_first_board.mjs +3 -3
  1722. package/tests/wizard_demo.mjs +1 -1
  1723. package/tests/wizard_one_page.mjs +4 -3
  1724. package/tests/wizard_physics.mjs +3 -1
  1725. package/tests/wizard_physics_more.mjs +42 -3
  1726. package/tests/work_title_wrap.mjs +1 -1
  1727. package/tests/workflow_exec_paths.mjs +6 -6
  1728. package/tests/worktree_claim_guard.mjs +1 -1
  1729. package/tests/worktree_helper.mjs +2 -2
  1730. package/tests/write_validation_gaps.mjs +3 -3
  1731. package/scripts/gds/api.sh +0 -6
  1732. package/scripts/gds/audit-exports.js +0 -128
  1733. package/scripts/gds/resolve-skill-model.js +0 -57
  1734. package/scripts/gds/security-baseline-check.sh +0 -180
  1735. package/scripts/gds/spike-task-map.js +0 -899
  1736. package/scripts/status-probe.mjs +0 -213
  1737. package/src/bongos/uptime-poller.js +0 -93
  1738. package/tests/government_fold_bench.mjs +0 -50
  1739. package/tests/spike_task_map.mjs +0 -422
  1740. package/tests/status-probe.mjs +0 -89
  1741. /package/{scripts/gds → modules/raise}/CLAUDE.md +0 -0
  1742. /package/scripts/{gds → bongos}/cloudbongos-token-isolation.conf +0 -0
  1743. /package/scripts/{gds → bongos}/discipline-modes.json +0 -0
  1744. /package/scripts/{gds → bongos}/retired-core-skills.json +0 -0
@@ -1,1159 +1,7 @@
1
1
  #!/usr/bin/env node
2
+ // scripts/gds/init.js — @bongos-forwarder (task 1004848). Generated by
3
+ // scripts/bongos/codemod-rename-scripts-gds.js; do not edit.
4
+ // The real script is scripts/bongos/init.js. This forwarder keeps callers that still name
5
+ // the old path working, and warns once so they get repointed. Task 1003706 removes it.
2
6
  'use strict';
3
- //
4
- // scripts/gds/init.js — `bongos init`: scaffold a NEW Cloud Bongos instance.
5
- //
6
- // GDS-V4 · V4.R65 · task 1204 (ADR 0062 §7). The self-serve replacement for the
7
- // hand-written 35–83 KB seed-*.js-per-version pattern. It:
8
- // 1. gathers a spec (interactive interview, or --from <spec.json>),
9
- // 2. writes the instance config — config/branding.json + config/modules.json
10
- // (lean OVERRIDES; config/*.neutral.json fills the rest, src/branding.js),
11
- // 3. seeds the first version + its done-when goal via POST /api/bongos/versions
12
- // (the primitive added in this same task), then files the starter task and
13
- // the human-only KICKOFF steps as real, tracked tasks via POST /tasks,
14
- // 4. points the owner at docs/branding-fill-prompt.md for the LOOK (a locked
15
- // project rule: an owner brands with their OWN LLM — init never generates
16
- // branding) and prints the remaining manual steps.
17
- //
18
- // It deliberately does NOT try to make launch one command: a fresh instance
19
- // needs irreducibly-manual owner steps (a GitHub OAuth app, first sign-in).
20
- // init's value is that it writes what it can AND turns the rest into a claimable,
21
- // tracked checklist so nothing is silently skipped.
22
- //
23
- // Infra arm (ADR 0111 §3, task 1946): when the owner opts into production hosting,
24
- // the interview's infra answers (hosting shape, bring-your-own domain, credential
25
- // ref, tier) become a real provisioning REQUEST — a POST to the provisioning
26
- // module's /provisioning/instances, which enqueues a provision intent the
27
- // control-plane runner drains — instead of only a manual "production topology"
28
- // task. OAuth-app creation + first sign-in stay guided/manual (no clean API). If
29
- // the target instance doesn't have the provisioning module enabled, init falls
30
- // back to filing the manual task (nothing is silently dropped).
31
- //
32
- // Safety: refuses to overwrite an existing config/branding.json unless --force
33
- // (so running it inside an already-configured instance — e.g. OTB — can't
34
- // clobber it). Use --dry-run to preview every file + API call without doing any.
35
- //
36
- // --adopt (brownfield, ADR 0121): the greenfield body above assumes a blank slate —
37
- // it refuses where config/branding.json exists, and --force OVERWRITES. `--adopt` is
38
- // the opposite: it LAYERS Cloud Bongos onto an EXISTING repo (app code, git history,
39
- // a package.json). It writes the lean config only where absent, adds the pinned
40
- // @bongos/core dependency to the owner's package.json without touching any other
41
- // field, and materializes .claude/ ADDITIVELY — for any pre-existing file it
42
- // MERGES-or-LEAVES-AND-REPORTS, it NEVER overwrites, and it does not reuse the --force
43
- // path. It deliberately does NOT seed a synthetic "V1 — Prove the loop": capturing the
44
- // repo's real version/goal + importing its backlog is a later real-state step, and the
45
- // full conflict pre-flight is a later step too — this file lands the mode skeleton +
46
- // additive config layering (task 2042). Every other onboarding leg is identical.
47
- //
48
- // Usage:
49
- // bongos init interactive interview (greenfield — a NEW instance)
50
- // bongos init --adopt LAYER onto an existing repo (brownfield; never clobbers).
51
- // Runs a conflict PRE-FLIGHT + accept-gate: nothing writes
52
- // until you confirm (interactive y/N) or pass --accept.
53
- // bongos init --adopt --accept apply the adopt without the interactive prompt (CI / non-interactive)
54
- // bongos init --from spec.json non-interactive (CI / the C8 self-build proof)
55
- // bongos init --dry-run print the plan; write nothing, call nothing
56
- // bongos init --dir <path> target dir for the config files (default: cwd)
57
- // bongos init --no-seed write config only; skip the version/task seeding
58
- // bongos init --force overwrite existing config files (greenfield only; ignored by --adopt)
59
- // bongos init --vendor-core <tgz> greenfield only: vendor the @bongos/core .tgz + pin
60
- // package.json to file:vendor/… + generate package-lock.json,
61
- // so the scaffold is `npm ci`-installable (ADR 0108 gap 1/4).
62
- // Without it the scaffold pins the caret range, which
63
- // resolves from the public npm registry (--registry-core).
64
- // bongos init --registry-core greenfield only: keep the caret pin and generate
65
- // package-lock.json from the registry. @bongos/core is
66
- // PUBLIC (task 1003872), so this needs no token, no login
67
- // and no .npmrc — it resolves from the default registry
68
- // like any other dependency.
69
- // Mutually exclusive with --vendor-core (registry vs tarball).
70
-
71
- const fs = require('node:fs');
72
- const path = require('node:path');
73
- const readline = require('node:readline');
74
- const { apiCall, arg, hasFlag } = require('./cli-lib');
75
- const { DEFAULT_HIERARCHY } = require('../../src/bongos/hierarchy-config');
76
- const { resolveCoreRoot, FALLBACK_ENV_PREFIX } = require('../../src/instance-config'); // ADR 0108 §1: where the core package lives
77
- const { materializeClaude } = require('./claude-materialize'); // ADR 0108 §3 (W3): copy .claude/ into the instance
78
- const { detectStack, formatStackSummary } = require('./adopt-detect'); // ADR 0121 §Decision 4 (task 2043): inspect an existing repo before layering
79
- const { resolveBacklogTasks, DEFAULT_MAX: BACKLOG_MAX } = require('./adopt-import'); // ADR 0121 §Decision 3 (task 2044): import an existing backlog
80
- const { preflightAdopt, formatPreflight } = require('./adopt-preflight'); // ADR 0121 §Decision 5 (task 2045): the accept-gated conflict pre-flight
81
-
82
- const KNOWN_MODULES = ['game', 'art-pipeline', 'discord'];
83
-
84
- // The provisioning hosting shapes — a small mirror of modules/provisioning's
85
- // HOSTING_SHAPES. init deliberately does NOT import the (optional) provisioning
86
- // module: it stays self-contained and lets the server be the authority on a
87
- // request (POST /provisioning/instances validates slug/shape, and returns 404 when
88
- // the module isn't enabled on the target instance — init then falls back to filing
89
- // the manual production-topology task). ADR 0111 §3.
90
- // ADR 0323: 'byo-host' is the free front door and the default; 'co-tenant' is RETIRED
91
- // and the server refuses it outright, so it is absent here DELIBERATELY. Leaving it in
92
- // would let init write a spec the create route then 403s — a local list that accepts
93
- // more than the server does is worse than no list, because the refusal arrives a step
94
- // later with no useful message. Dropping it means `--shape co-tenant` fails here, naming
95
- // the shapes that work.
96
- //
97
- // 'dedicated' left for the same reason, one step further on: ADR 0327 decision 4 deleted
98
- // the shape outright, so it is not merely refused but unstorable (migration
99
- // provisioning_027 folded its value into 'cloud-host'). 'standalone' was renamed to
100
- // 'cloud-host' by the same migration. Both were requestable from here until task 1004182.
101
- const HOSTING_SHAPES = ['byo-host', 'cloud-host'];
102
-
103
- // The Cloud Bongos core npm package an instance pins as a dependency (ADR 0108).
104
- // `bongos init --adopt` LAYERS this onto an existing repo's package.json; `bongos
105
- // upgrade` later re-pins it to a vendored `file:` tarball. Named so the adopt
106
- // layering and the upgrade re-pin agree on the dependency name.
107
- const CORE_PKG = '@bongos/core';
108
-
109
- const isObj = (v) => v && typeof v === 'object' && !Array.isArray(v);
110
-
111
- // The version RANGE `--adopt` writes for the core dep: a caret over the running
112
- // core's CORE_VERSION — the declared intent. The CONCRETE artifact (a registry
113
- // install, or the vendored `file:` tarball a `bongos upgrade` pins) is resolved by
114
- // provisioning / upgrade per ADR 0108, not by init. Falls back to a safe floor if
115
- // module-api can't be resolved (e.g. a partial checkout).
116
- function coreDepRange() {
117
- let v;
118
- try { v = require('../../src/module-api').CORE_VERSION; } catch { v = null; }
119
- return `^${v || '1.0.0'}`;
120
- }
121
-
122
- // The running core's bare version (no caret) — for deriving the vendored tarball name
123
- // when `--vendor-core`'s tarball is non-canonically named. Fail-soft like coreDepRange().
124
- function coreVersionSafe() {
125
- try { return require('../../src/module-api').CORE_VERSION; } catch { return null; }
126
- }
127
-
128
- // The npm scripts a STANDALONE greenfield instance runs. They MIRROR how the control
129
- // plane runs a standalone instance (scripts/gds/provision.js): `hall` = the systemd
130
- // ExecStart (`node <core>/src/platform-server.js`), `migrate` = standaloneMigrateCmd
131
- // (`bash <core>/scripts/migrate.sh`). Keeping them identical means `npm run hall` /
132
- // `npm run migrate` on the instance behave like production, and `bongos upgrade`'s
133
- // `npm run migrate` step resolves to the core's migrate.sh (ADR 0108).
134
- // The hall is deliberately NOT `start` (task 1004484): `npm start` belongs to the
135
- // project's own app, and a host like Render reads it as "how this app starts" — given the
136
- // hall there, the deploy has no database and times out. Nothing runs an instance's
137
- // `npm start`: the box unit and `bongos dev` both start platform-server.js directly.
138
- const INSTANCE_CORE_PKG_DIR = 'node_modules/@bongos/core';
139
- const INSTANCE_HALL_SCRIPT = `node ${INSTANCE_CORE_PKG_DIR}/src/platform-server.js`;
140
- const INSTANCE_MIGRATE_SCRIPT = `bash ${INSTANCE_CORE_PKG_DIR}/scripts/migrate.sh`;
141
-
142
- // PURE (exported for tests) — build/augment the greenfield instance package.json so a
143
- // fresh instance is `npm ci`-installable and runnable (ADR 0108 greenfield gap 1/4,
144
- // task 2053): the @bongos/core dependency (the `file:` tarball pin when a tarball is
145
- // vendored, else the declared caret range — the CARET RESOLVES NOWHERE on npm, which is
146
- // exactly why the vendored path pins `file:`) plus the hall/migrate npm scripts a
147
- // standalone instance runs. Preserves any pre-existing fields + scripts (fills only what
148
- // is missing); greenfield OWNS the core dep, so it is always (re)set to `coreDep`. Never
149
- // spawns npm — generating the lockfile is a separate imperative step in main().
150
- // `moduleDeps` (ADR 0138 / task 2160): the merged external npm deps of the modules this
151
- // instance ENABLES. @bongos/core ships lean (express+pg, ADR 0108), so a bundled module that
152
- // needs more (e.g. discord → discord.js) declares it in its module.json `dependencies`, and the
153
- // consumer's package.json must carry it or boot crashes on the missing module (rehearsal F2).
154
- // Precedence: module deps FILL gaps, an explicit pre-existing pin WINS over them, @bongos/core
155
- // is always (re)set. With no moduleDeps this is byte-identical to before.
156
- function buildInstancePackageJson(existing, { name = 'cloudbongos-instance', coreDep, moduleDeps } = {}) {
157
- const dep = coreDep || coreDepRange();
158
- const pkg = isObj(existing) ? { ...existing } : {};
159
- if (!pkg.name) pkg.name = name;
160
- if (pkg.private === undefined) pkg.private = true;
161
- pkg.scripts = { ...(isObj(pkg.scripts) ? pkg.scripts : {}) };
162
- // A scaffold from before task 1004484 wrote the hall as `start`; move exactly that
163
- // command (never an owner's own start) to `hall`, unless they already have a `hall`.
164
- if (pkg.scripts.start === INSTANCE_HALL_SCRIPT && !pkg.scripts.hall) {
165
- pkg.scripts.hall = pkg.scripts.start;
166
- delete pkg.scripts.start;
167
- }
168
- if (!pkg.scripts.hall) pkg.scripts.hall = INSTANCE_HALL_SCRIPT;
169
- if (!pkg.scripts.migrate) pkg.scripts.migrate = INSTANCE_MIGRATE_SCRIPT;
170
- pkg.dependencies = {
171
- ...(isObj(moduleDeps) ? moduleDeps : {}),
172
- ...(isObj(pkg.dependencies) ? pkg.dependencies : {}),
173
- [CORE_PKG]: dep,
174
- };
175
- return pkg;
176
- }
177
-
178
- // The external npm deps a single module declares in its module.json `dependencies` (ADR 0138).
179
- // I/O (reads the core-package module manifest); fail-soft → {} when absent/unreadable.
180
- function moduleDeclaredDeps(moduleKey, { coreRoot = resolveCoreRoot(), fsImpl = fs } = {}) {
181
- try {
182
- const mj = JSON.parse(fsImpl.readFileSync(path.join(coreRoot, 'modules', moduleKey, 'module.json'), 'utf8'));
183
- return isObj(mj.dependencies) ? mj.dependencies : {};
184
- } catch {
185
- return {};
186
- }
187
- }
188
-
189
- // Merge the declared deps of every ENABLED module (modulesConfig = { modules: { key: bool } })
190
- // into one object. PURE — `readDeps(key)` is injected (defaults to moduleDeclaredDeps) so this is
191
- // testable with no disk. A later-enabled module's range wins on a key collision (rare).
192
- function enabledModuleDeps(modulesConfig, { readDeps = (k) => moduleDeclaredDeps(k) } = {}) {
193
- const enabled = isObj(modulesConfig) && isObj(modulesConfig.modules) ? modulesConfig.modules : {};
194
- const out = {};
195
- for (const [key, on] of Object.entries(enabled)) {
196
- if (on === true) Object.assign(out, readDeps(key));
197
- }
198
- return out;
199
- }
200
-
201
- // ---------------------------------------------------------------------------
202
- // Pure builders (exported for tests — no I/O, no network)
203
- // ---------------------------------------------------------------------------
204
-
205
- // A url-safe slug for a criterion_id derived from a short label.
206
- function slugify(s, fallback = 'goal') {
207
- const out = String(s || '')
208
- .toLowerCase()
209
- .replace(/[^a-z0-9]+/g, '-')
210
- .replace(/^-+|-+$/g, '')
211
- .slice(0, 48);
212
- return out || fallback;
213
- }
214
-
215
- // The DNS/db-safe instance slug a provisioning request carries — derived from an
216
- // explicit spec.provisioning.slug or the product name, lowercased/dashed, then
217
- // clamped to the module's 2–40-char rule (the server validates it too). Pure.
218
- function provisioningSlug(spec) {
219
- const p = (spec && spec.provisioning) || {};
220
- const base = p.slug || (spec && spec.identity && spec.identity.productName) || '';
221
- return slugify(base, 'instance').slice(0, 40).replace(/-+$/, '');
222
- }
223
-
224
- // The POST /api/bongos/provisioning/instances body built from the interview's infra
225
- // answers — or null when the owner didn't opt into provisioning (no spec.provisioning
226
- // block). THE ADR 0111 §3 ARM: infra answers become a real provisioning REQUEST (a
227
- // provisioning_intents row the control-plane runner drains) instead of only a manual
228
- // runbook task. Pure — no I/O; the caller POSTs it. Shape defaults to the cheapest
229
- // byo-host ($0 to us — the owner supplies the host) per the budget DNA (ADR 0323).
230
- function provisioningRequest(spec) {
231
- const p = spec && spec.provisioning;
232
- if (!isObj(p)) return null;
233
- const shape = HOSTING_SHAPES.includes(p.shape) ? p.shape : 'byo-host';
234
- const body = { slug: provisioningSlug(spec), hosting_shape: shape };
235
- if (p.domain) body.domain = String(p.domain).trim();
236
- if (p.targetRef) body.target_ref = String(p.targetRef).trim();
237
- if (p.tier) body.tier = String(p.tier).trim();
238
- return body;
239
- }
240
-
241
- // The kickoff checklist itself (and the production-topology step the provisioning
242
- // module can automate) now live in modules/lifecycle/kickoff-checklist.js — ONE list shared
243
- // with the lifecycle module, which files the same steps at the founder's first
244
- // sign-in on the control-plane path (task 1003239). init keeps its names.
245
- const { kickoffChecklist, productionTopologyKickoff } = require('../../modules/lifecycle/kickoff-checklist');
246
-
247
- // The lean instance branding.json: ONLY the fields the owner supplied. Everything
248
- // else (theme, copy, rank labels, box subdomain pattern) resolves from
249
- // config/branding.neutral.json via src/branding.js. Writing less keeps an
250
- // instance's overrides legible and lets vanilla defaults flow through.
251
- function buildBrandingConfig(spec) {
252
- const id = spec.identity || {};
253
- const productName = id.productName;
254
- const origin = (spec.domains && spec.domains.publicOrigin) || 'http://localhost:3000';
255
- const branding = {
256
- _note: `${productName} — instance brand pack (overrides over config/branding.neutral.json). ` +
257
- 'Authored by `bongos init`. Fill the LOOK (palette/fonts/wordmark) with your own LLM via docs/branding-fill-prompt.md.',
258
- identity: {
259
- productName,
260
- worldName: id.worldName || productName,
261
- company: { name: (id.company && id.company.name) || '', site: (id.company && id.company.site) || '' },
262
- },
263
- llmProjectName: productName,
264
- domains: {
265
- publicOrigin: origin,
266
- buildersOrigin: origin,
267
- statusOrigin: origin,
268
- oauthOrigin: origin,
269
- },
270
- repo: { owner: spec.repo.owner, name: spec.repo.name },
271
- firstAdmin: spec.firstAdmin,
272
- currency: { label: (spec.currency && spec.currency.label) || 'credits', symbol: (spec.currency && spec.currency.symbol) || '' },
273
- envPrefix: spec.envPrefix || FALLBACK_ENV_PREFIX,
274
- // Every instance gets its OWN session/config dir (task 1002626). Without
275
- // this, instance-config.js falls back to the shared 'cloudbongos' dir, so
276
- // every un-branded instance on a machine reads/writes the SAME
277
- // ~/.config/cloudbongos/bongos-session.json — signing in to one silently
278
- // evicts the CLI session of every other, including the hub. Same slug
279
- // family as the package name + provisioning slug.
280
- configDir: spec.configDir ? String(spec.configDir).trim() : slugify(productName, 'instance'),
281
- };
282
- if (spec.tagline) branding.copy = { tagline: spec.tagline };
283
- return branding;
284
- }
285
-
286
- // modules.json — every known module, explicit boolean. Default OFF (vanilla).
287
- function buildModulesConfig(spec) {
288
- const on = new Set(Array.isArray(spec.modules) ? spec.modules : []);
289
- const modules = {};
290
- for (const m of KNOWN_MODULES) modules[m] = on.has(m);
291
- return { modules };
292
- }
293
-
294
- // hierarchy.json — the work-tier preset (ADR 0086 §1). The six-tier default with
295
- // the instance's optional overrides applied: spec.hierarchy.labels ({tierKey:
296
- // label}), spec.hierarchy.enabled ({tierKey: bool}), spec.hierarchy.roles
297
- // ({scope/membership/criteria: tierKey}). Most instances keep the canonical six
298
- // tiers, so this writes them explicitly (self-documenting), resolved over the
299
- // baked DEFAULT_HIERARCHY by src/bongos/hierarchy-config.js at load.
300
- function buildHierarchyConfig(spec) {
301
- const h = isObj(spec.hierarchy) ? spec.hierarchy : {};
302
- const labels = isObj(h.labels) ? h.labels : {};
303
- const enabled = isObj(h.enabled) ? h.enabled : {};
304
- const tiers = DEFAULT_HIERARCHY.tiers.map((t) => ({
305
- key: t.key,
306
- label: typeof labels[t.key] === 'string' && labels[t.key].trim() ? labels[t.key].trim() : t.label,
307
- enabled: typeof enabled[t.key] === 'boolean' ? enabled[t.key] : t.enabled,
308
- }));
309
- const roles = { ...DEFAULT_HIERARCHY.roles, ...(isObj(h.roles) ? h.roles : {}) };
310
- const productName = (spec.identity && spec.identity.productName) || 'Instance';
311
- return {
312
- _note: `${productName} — work-hierarchy tiers (ADR 0086 §1): per-tier label/enabled + roles ` +
313
- '(which tier carries scope_modules / members / done-when criteria), resolved over the six-tier ' +
314
- 'default in src/bongos/hierarchy-config.js. Authored by `bongos init`.',
315
- tiers,
316
- roles,
317
- };
318
- }
319
-
320
- // PURE — layer the pinned core dependency into a parsed package.json (ADR 0121
321
- // §Decision 2 / task 2042). NEVER clobbers: if `@bongos/core` is already a dep
322
- // (in dependencies OR devDependencies) it returns the object untouched with
323
- // action:'present'; if there is no package.json at all it MINTS a minimal one
324
- // (action:'created'); otherwise it ADDS the dep, preserving every existing field and
325
- // key order (action:'added'). The `--force`-overwrite path is never involved. The
326
- // caller only writes the file for 'added'/'created' — 'present' stays byte-untouched.
327
- function mergeCoreDependency(pkg, { corePkg = CORE_PKG, coreRange, name = 'cloudbongos-instance' } = {}) {
328
- const range = coreRange || coreDepRange();
329
- if (!isObj(pkg)) {
330
- return { pkg: { name, private: true, dependencies: { [corePkg]: range } }, action: 'created' };
331
- }
332
- const already = (isObj(pkg.dependencies) && pkg.dependencies[corePkg]) ||
333
- (isObj(pkg.devDependencies) && pkg.devDependencies[corePkg]);
334
- if (already) return { pkg, action: 'present' };
335
- // Spread keeps the original key order — `dependencies` stays where it was (or is
336
- // appended if absent). We add exactly one key; we never reorder or drop theirs.
337
- const next = { ...pkg, dependencies: { ...(isObj(pkg.dependencies) ? pkg.dependencies : {}), [corePkg]: range } };
338
- return { pkg: next, action: 'added' };
339
- }
340
-
341
- // The kickoff checklist, as tasks — the steps init CANNOT do for you (the shared
342
- // list, self-host shape). Production topology is omitted when the owner opted into
343
- // provisioning: the control-plane runner covers that leg (ADR 0111 §3).
344
- function kickoffTasks(spec) {
345
- return kickoffChecklist(spec, { provisioned: !!provisioningRequest(spec) });
346
- }
347
-
348
- // Normalize a raw spec (from --from or the interview) to canonical shape +
349
- // defaults. Pure.
350
- function normalizeSpec(raw = {}) {
351
- const spec = { ...raw };
352
- spec.identity = spec.identity || {};
353
- spec.repo = spec.repo || {};
354
- spec.version = spec.version || {};
355
- spec.modules = Array.isArray(spec.modules) ? spec.modules.filter((m) => KNOWN_MODULES.includes(m)) : [];
356
- if (!spec.version.status) spec.version.status = 'building';
357
- // Provisioning (ADR 0111 §3) — a block ⇒ the owner opted in. Coerce the shape to a
358
- // known value (default byo-host, the free front door) and trim the free-text refs; drop the
359
- // block entirely when absent so provisioningRequest() reads it as "not requested".
360
- if (isObj(spec.provisioning)) {
361
- const p = spec.provisioning;
362
- spec.provisioning = {
363
- shape: HOSTING_SHAPES.includes(p.shape) ? p.shape : 'byo-host',
364
- ...(p.slug ? { slug: String(p.slug).trim() } : {}),
365
- ...(p.domain ? { domain: String(p.domain).trim() } : {}),
366
- ...(p.targetRef ? { targetRef: String(p.targetRef).trim() } : {}),
367
- ...(p.tier ? { tier: String(p.tier).trim() } : {}),
368
- };
369
- } else {
370
- delete spec.provisioning;
371
- }
372
- return spec;
373
- }
374
-
375
- // Validate a normalized spec → array of human-readable error strings ([] = ok).
376
- // Version fields are required whenever init will SEED — greenfield always, and
377
- // `--adopt` too (task 2044: adopt reflects the repo's REAL current version/goal, not
378
- // a synthetic V1). Only `--adopt --no-seed` (layering-only, the task-2042 skeleton
379
- // behavior) skips them, since it files nothing.
380
- function validateSpec(spec, { adopt = false, noSeed = false } = {}) {
381
- const errs = [];
382
- if (!spec.identity || !spec.identity.productName) errs.push('identity.productName is required');
383
- if (!spec.repo || !spec.repo.owner || !spec.repo.name) errs.push('repo.owner and repo.name are required');
384
- if (!spec.firstAdmin) errs.push('firstAdmin (the founding owner GitHub login) is required');
385
- const seeds = !(adopt && noSeed);
386
- if (seeds) {
387
- const noun = adopt ? 'your current version/milestone' : 'the first version';
388
- if (!spec.version || !spec.version.id) errs.push(`version.id is required (e.g. "V1") — ${noun}`);
389
- if (!spec.version || !spec.version.name) errs.push('version.name is required');
390
- if (!spec.version || !spec.version.done_when) errs.push(`version.done_when is required (what "done" means for ${noun})`);
391
- }
392
- for (const m of spec.modules || []) {
393
- if (!KNOWN_MODULES.includes(m)) errs.push(`unknown module "${m}" (known: ${KNOWN_MODULES.join(', ')})`);
394
- }
395
- if (spec.provisioning) {
396
- if (!HOSTING_SHAPES.includes(spec.provisioning.shape)) {
397
- errs.push(`provisioning.shape must be one of: ${HOSTING_SHAPES.join(', ')}`);
398
- }
399
- if (provisioningSlug(spec).length < 2) {
400
- errs.push('provisioning: could not derive a valid instance slug (need ≥2 chars of [a-z0-9-]) — set identity.productName or provisioning.slug');
401
- }
402
- }
403
- return errs;
404
- }
405
-
406
- // Build the POST /api/bongos/versions body from the spec (pure). The first version's
407
- // done_when goal becomes both the version blurb and one done-when criterion, so
408
- // /status has a finish line to roll up from day one.
409
- function versionPayload(spec) {
410
- const v = spec.version;
411
- return {
412
- id: v.id,
413
- name: v.name,
414
- status: v.status || 'building',
415
- done_when: v.done_when,
416
- criteria: [{ criterion_id: v.criterion_id ? slugify(v.criterion_id) : 'first-goal', criterion_md: v.done_when }],
417
- };
418
- }
419
-
420
- // ---------------------------------------------------------------------------
421
- // Interview (interactive)
422
- // ---------------------------------------------------------------------------
423
-
424
- function ask(rl, question, def) {
425
- const suffix = def ? ` [${def}]` : '';
426
- return new Promise((resolve) => rl.question(`${question}${suffix}\n> `, (a) => resolve((a || '').trim() || def || '')));
427
- }
428
-
429
- async function interview({ adopt = false } = {}) {
430
- const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
431
- try {
432
- console.log(adopt
433
- ? "\nLet's adopt Cloud Bongos onto your existing repo.\n (layering only — pre-existing files are left untouched, never overwritten)\n"
434
- : "\nLet's stand up a new Cloud Bongos instance.\n");
435
- const productName = await ask(rl, 'Project name?');
436
- const tagline = await ask(rl, 'One-line tagline? (optional)');
437
- const repoRaw = await ask(rl, 'GitHub repo the work lands in? (owner/name)');
438
- const firstAdmin = await ask(rl, 'First owner (GitHub login)?');
439
- const currency = await ask(rl, 'Name for the reward currency?', 'credits');
440
- const publicOrigin = await ask(rl, 'Where will it run?', 'http://localhost:3000');
441
-
442
- const modules = [];
443
- console.log('\nFeature modules (all off = plain build platform):');
444
- for (const m of KNOWN_MODULES) {
445
- const yn = (await ask(rl, ` Enable "${m}"? (y/N)`, 'N')).toLowerCase();
446
- if (yn === 'y' || yn === 'yes') modules.push(m);
447
- }
448
-
449
- // The version + goal. Greenfield seeds a SYNTHETIC first version; --adopt reflects
450
- // the repo's REAL current version/milestone + open goal (ADR 0121 §Decision 3 /
451
- // task 2044) — same questions, real-state framing, no "Prove the loop" default.
452
- console.log(adopt ? '\nYour CURRENT version / milestone (adopt reflects real state):' : '\nYour first version:');
453
- const versionId = await ask(rl, ' Version id?', adopt ? '' : 'V1');
454
- const versionName = await ask(rl, ' Version name?', adopt ? '' : `${versionId} — Prove the loop`);
455
- const doneWhen = await ask(rl, adopt ? ' What is the current goal — what does "done" mean right now?' : ` What does "done" mean for ${versionName}?`,
456
- adopt ? '' : 'A task goes claim → grade → ship, with credits, on this instance.');
457
- // Greenfield asks for one optional starter; --adopt IMPORTS the existing backlog
458
- // (GitHub issues / a local TODO·ROADMAP·BACKLOG file) at seed time, so instead it
459
- // just offers to point at a backlog file when auto-detection might miss it.
460
- const starter = adopt ? '' : await ask(rl, ' First starter task to claim? (optional)');
461
- const backlogFile = adopt ? await ask(rl, ' Path to a backlog file to import? (optional — blank = auto-detect TODO/ROADMAP/BACKLOG or GitHub issues)') : '';
462
-
463
- // Production hosting (ADR 0111 §3) — opt-in. When the owner answers these infra
464
- // questions, init files a real provisioning REQUEST via the API (not just a manual
465
- // runbook task). Default N: most inits are localhost/dev and shouldn't queue infra.
466
- console.log('\nProduction hosting (optional — needs the provisioning module + control-plane credentials):');
467
- let provisioning;
468
- const wantProv = (await ask(rl, ' Provision production hosting now? (y/N)', 'N')).toLowerCase();
469
- if (wantProv === 'y' || wantProv === 'yes') {
470
- // Describes each shape by WHAT IT DOES and never by its owner-facing product
471
- // name. The stored value → owner-facing label translation lives in exactly one
472
- // place — SHAPE_LABEL in modules/public-landing/public/projects.html (ADR 0323,
473
- // and this module's CLAUDE.md says so) — so glossing '"cloud host"' here would
474
- // be a second copy of it, in a file no designer renaming the product would
475
- // think to open. A CLI prompt naming the stored value it is about to write is
476
- // the right register anyway: this asks for a column value, not for a purchase.
477
- const shape = (await ask(rl, ' Hosting shape? (byo-host = you run it on your own host / cloud-host = its own repo + pinned @bongos/core, stood up for you)', 'byo-host')).toLowerCase();
478
- const domain = await ask(rl, ' Domain you own — bring-your-own (blank = the platform assigns <slug>.<its apex> when configured)?');
479
- const targetRef = await ask(rl, ' Target credential ref? (which control-plane creds the runner should use; optional)');
480
- // No tier question any more. It existed only for 'dedicated', which ADR 0327
481
- // decision 4 deleted: on the owner's own platform account a bigger plan is a
482
- // setting they choose, not a hosting shape we model. `tier` stays in the spec
483
- // shape below because a previously-written spec may still carry one.
484
- const tier = '';
485
- provisioning = {
486
- shape: HOSTING_SHAPES.includes(shape) ? shape : 'byo-host',
487
- domain: domain || undefined,
488
- targetRef: targetRef || undefined,
489
- tier: tier || undefined,
490
- };
491
- }
492
-
493
- const [owner, name] = repoRaw.includes('/') ? repoRaw.split('/') : [repoRaw, ''];
494
- const spec = {
495
- identity: { productName },
496
- tagline: tagline || undefined,
497
- repo: { owner, name },
498
- firstAdmin,
499
- currency: { label: currency },
500
- domains: { publicOrigin },
501
- modules,
502
- };
503
- spec.version = { id: versionId, name: versionName, done_when: doneWhen };
504
- if (starter) spec.starterTasks = [{ title: starter, kind: 'unclassified' }];
505
- if (backlogFile) spec.backlogFile = backlogFile;
506
- if (provisioning) spec.provisioning = provisioning;
507
- return spec;
508
- } finally {
509
- rl.close();
510
- }
511
- }
512
-
513
- // ---------------------------------------------------------------------------
514
- // Write + seed
515
- // ---------------------------------------------------------------------------
516
-
517
- // PURE (exported for tests) — the root START-HERE guide (task 1002404, goal
518
- // 1000052; task 1003881 made it LAYER onto an existing README instead of
519
- // skipping one — see layerReadme below). A freshly-CLONED instance must tell a human what to run FIRST: the
520
- // `bongos` CLI ships INSIDE the not-yet-installed @bongos/core package, so
521
- // `npm install` has to come before any `bongos` command (including `bongos dev`).
522
- // `bongos init` runs npm install during scaffolding, but a later `git clone` of
523
- // the committed instance repo skips that — so this file is the signpost the clone
524
- // carries. Owner-friendly and plain-language (the owner may not be an engineer).
525
- function buildReadme(branding = {}) {
526
- const identity = branding.identity || {};
527
- const name = identity.productName || 'This Cloud Bongos instance';
528
- const origin = (branding.domains && branding.domains.publicOrigin) || '';
529
- const loginLine = origin
530
- ? `3. \`bongos login ${origin}\` — only if you're signed in to a *different* instance (\`bongos dev\` signs you in the first time).`
531
- : `3. \`bongos login <your-instance-url>\` — only if you're signed in to a *different* instance (\`bongos dev\` signs you in the first time).`;
532
- return [
533
- `# ${name}`,
534
- '',
535
- 'A **Cloud Bongos** instance — an AI-first build platform: AI agents claim tasks and write the code; a human owner sets scope and the gates.',
536
- '',
537
- '## Start here (first run)',
538
- '',
539
- 'Just cloned this repo? Run these **in order**. The `bongos` CLI ships *inside* the `@bongos/core` dependency, so step 1 comes first — until it runs there is no `bongos` command:',
540
- '',
541
- '1. `npm install` — installs the toolchain (this is what creates the `bongos` command).',
542
- '2. `bongos dev` — one command to run this instance locally: starts Postgres, builds the tables, launches the server, and signs you in.',
543
- loginLine,
544
- '4. `bongos start` — see what you can work on. (Inside Claude Code, the same thing is `/builder-start`.)',
545
- '',
546
- 'Requires Node >= 22 and Postgres installed locally (macOS/Linux; on Windows use WSL). If anything looks off, `bongos doctor` checks your setup and prints the fix.',
547
- '',
548
- '## Where to look next',
549
- '',
550
- '- `CLAUDE.md` — how this project is built (the operating manual agents read first).',
551
- '- `bongos --help` — the full CLI: claim, ship, status, recall, and more.',
552
- '',
553
- ].join('\n');
554
- }
555
-
556
- // The START-HERE content as an APPENDABLE section, for a repo that already has a
557
- // README of its own. Fenced by a stable marker so re-running init is idempotent and so
558
- // an owner can find (and delete) the block we added.
559
- //
560
- // WHY this is not just buildReadme: an ADOPTED repo always has a README, and the
561
- // write-if-absent rule below therefore skipped the first-run guide on every single adopt
562
- // — silently, logging "already present — left untouched" as though nothing were owed.
563
- // That removed the one human-facing instruction to run `npm install`, without which the
564
- // repo has no `bongos` command at all. Appending mirrors how the adopt path already
565
- // treats .gitignore: keep what the owner wrote, add only what the instance needs.
566
- const README_MARKER = '<!-- cloud-bongos:start-here -->';
567
-
568
- function buildReadmeSection(branding = {}) {
569
- const guide = buildReadme(branding);
570
- // Reuse the canonical guide, demoted one heading level so it nests under the owner's
571
- // own README, and drop its H1 title (their README already has one).
572
- const body = guide
573
- .split('\n')
574
- .slice(1) // drop "# <product>"
575
- .join('\n')
576
- .replace(/^## /gm, '### ')
577
- .trim();
578
- return `${README_MARKER}\n\n## Working on this project (Cloud Bongos)\n\n${body}\n`;
579
- }
580
-
581
- // Append the START-HERE section to an existing README unless it is already there.
582
- // PURE (text in → text out) so the idempotence is unit-testable without fs.
583
- // Returns { text, action } where action is 'appended' | 'present'.
584
- function appendReadmeSection(existing, section) {
585
- const prev = String(existing == null ? '' : existing);
586
- if (prev.includes(README_MARKER)) return { text: prev, action: 'present' };
587
- return { text: `${prev.replace(/\n*$/, '\n')}\n---\n\n${section}`, action: 'appended' };
588
- }
589
-
590
- // Put the first-run guide in the repo's README whichever state it is in: mint the whole
591
- // guide when there is no README, else append the marked section. Shared by the greenfield
592
- // and adopt paths so neither can silently owe it. Returns the action taken.
593
- function layerReadme(branding, { dir, dryRun, log = console.log } = {}) {
594
- const readmePath = path.join(dir, 'README.md');
595
- if (!fs.existsSync(readmePath)) {
596
- if (dryRun) { log(` [dry-run] would write README.md (first-run START-HERE)`); return 'created'; }
597
- fs.writeFileSync(readmePath, buildReadme(branding));
598
- log(` ✓ wrote README.md (first-run START-HERE)`);
599
- return 'created';
600
- }
601
- const { text, action } = appendReadmeSection(fs.readFileSync(readmePath, 'utf8'), buildReadmeSection(branding));
602
- if (action === 'present') {
603
- log(' • README.md already carries the Cloud Bongos start-here section — left untouched.');
604
- return 'present';
605
- }
606
- if (dryRun) { log(' [dry-run] would append the Cloud Bongos start-here section to the existing README.md'); return 'appended'; }
607
- fs.writeFileSync(readmePath, text);
608
- log(' ✓ appended the Cloud Bongos start-here section to README.md (your own content is untouched)');
609
- return 'appended';
610
- }
611
-
612
- function writeConfigs(spec, { dir, force, dryRun, coreDep, log = console.log }) {
613
- const configDir = path.join(dir, 'config');
614
- const brandingPath = path.join(configDir, 'branding.json');
615
- const modulesPath = path.join(configDir, 'modules.json');
616
- const hierarchyPath = path.join(configDir, 'hierarchy.json');
617
- const pkgPath = path.join(dir, 'package.json');
618
- const readmePath = path.join(dir, 'README.md');
619
- const branding = buildBrandingConfig(spec);
620
- const modules = buildModulesConfig(spec);
621
- const hierarchy = buildHierarchyConfig(spec);
622
- // Greenfield OWNS package.json (ADR 0108 gap 1/4, task 2053): mint it — or augment one
623
- // from a prior --force run — so the scaffold is `npm ci`-installable + runnable. Augment,
624
- // never blind-overwrite, so a re-run keeps any hand-added fields/scripts.
625
- const pkgName = slugify((spec.identity && spec.identity.productName) || '', 'cloudbongos-instance');
626
- let existingPkg = null;
627
- if (fs.existsSync(pkgPath)) { try { existingPkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')); } catch { existingPkg = null; } }
628
- // Compose the deps of the ENABLED modules (ADR 0138 / task 2160) so an instance that turns a
629
- // bundled module on gets that module's npm deps (e.g. discord → discord.js) in its package.json,
630
- // rather than crashing at boot on a dep @bongos/core deliberately doesn't carry (rehearsal F2).
631
- const moduleDeps = enabledModuleDeps(modules);
632
- const pkg = buildInstancePackageJson(existingPkg, { name: pkgName, coreDep, moduleDeps });
633
- const pinNote = pkg.dependencies[CORE_PKG];
634
-
635
- if (dryRun) {
636
- log(`\n[dry-run] would write ${brandingPath}:`);
637
- log(JSON.stringify(branding, null, 2));
638
- log(`\n[dry-run] would write ${modulesPath}:`);
639
- log(JSON.stringify(modules, null, 2));
640
- log(`\n[dry-run] would write ${hierarchyPath}:`);
641
- log(JSON.stringify(hierarchy, null, 2));
642
- log(`\n[dry-run] would write ${pkgPath} (pins ${CORE_PKG} → ${pinNote}):`);
643
- log(JSON.stringify(pkg, null, 2));
644
- log(`\n[dry-run] would write ${readmePath} (root START-HERE first-run guide) if absent`);
645
- return { brandingPath, modulesPath, hierarchyPath, pkgPath, readmePath, wrote: false };
646
- }
647
- if (fs.existsSync(brandingPath) && !force) {
648
- throw new Error(`${brandingPath} already exists — refusing to overwrite. Use --force to replace, or run init in a fresh --dir.`);
649
- }
650
- fs.mkdirSync(configDir, { recursive: true });
651
- fs.writeFileSync(brandingPath, JSON.stringify(branding, null, 2) + '\n');
652
- fs.writeFileSync(modulesPath, JSON.stringify(modules, null, 2) + '\n');
653
- fs.writeFileSync(hierarchyPath, JSON.stringify(hierarchy, null, 2) + '\n');
654
- fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
655
- log(` ✓ wrote ${path.relative(dir, brandingPath)}`);
656
- log(` ✓ wrote ${path.relative(dir, modulesPath)}`);
657
- log(` ✓ wrote ${path.relative(dir, hierarchyPath)}`);
658
- log(` ✓ wrote ${path.relative(dir, pkgPath)} (pins ${CORE_PKG} → ${pinNote})`);
659
- // README START-HERE (task 1002404, layering added by task 1003881): mint it when
660
- // absent, else APPEND the marked section. Never a blind overwrite — an owner's own
661
- // README content always survives, which is why the guide stopped being skipped.
662
- layerReadme(branding, { dir, dryRun: false, log });
663
- return { brandingPath, modulesPath, hierarchyPath, pkgPath, readmePath, wrote: true };
664
- }
665
-
666
- // `--adopt` config layering (ADR 0121 §Decision 2 / task 2042). The additive
667
- // sibling of writeConfigs: it does NOT refuse where config/branding.json exists and
668
- // it NEVER overwrites. For each lean config file it WRITES only when absent, and
669
- // LEAVES-AND-REPORTS when present. The greenfield writeConfigs — with its --force
670
- // overwrite — is deliberately not reused: a brownfield repo is exactly where an
671
- // overwrite is expensive. Returns { wrote:[names], left:[names] }.
672
- function layerConfigs(spec, { dir, dryRun, log = console.log }) {
673
- const configDir = path.join(dir, 'config');
674
- const targets = [
675
- ['branding.json', buildBrandingConfig(spec)],
676
- ['modules.json', buildModulesConfig(spec)],
677
- ['hierarchy.json', buildHierarchyConfig(spec)],
678
- ];
679
- const wrote = [];
680
- const left = [];
681
- for (const [name, content] of targets) {
682
- const p = path.join(configDir, name);
683
- if (fs.existsSync(p)) {
684
- left.push(name);
685
- log(` • config/${name} already present — left untouched (adopt never overwrites).`);
686
- continue;
687
- }
688
- wrote.push(name);
689
- if (dryRun) { log(` [dry-run] would write config/${name}`); continue; }
690
- fs.mkdirSync(configDir, { recursive: true });
691
- fs.writeFileSync(p, JSON.stringify(content, null, 2) + '\n');
692
- log(` ✓ wrote config/${name}`);
693
- }
694
- return { wrote, left };
695
- }
696
-
697
- // `--adopt` package.json layering (ADR 0121 §Decision 2 / task 2042): add the
698
- // pinned @bongos/core dependency to the owner's EXISTING package.json without
699
- // touching any other field, or MINT a minimal one when the repo has none. When the
700
- // dep is already present the file is left byte-untouched (no reserialize). An
701
- // unparseable package.json is left alone with a report — adopt never risks
702
- // corrupting a file it can't safely rewrite. Returns { action, path }.
703
- function layerPackageJson(spec, { dir, dryRun, log = console.log, coreRange = coreDepRange() } = {}) {
704
- const p = path.join(dir, 'package.json');
705
- let existing = null;
706
- if (fs.existsSync(p)) {
707
- try { existing = JSON.parse(fs.readFileSync(p, 'utf8')); }
708
- catch (e) {
709
- log(` • package.json exists but is not valid JSON (${e.message}) — left untouched; add "${CORE_PKG}": "${coreRange}" to its dependencies by hand.`);
710
- return { action: 'unparseable', path: p };
711
- }
712
- }
713
- const name = slugify((spec.identity && spec.identity.productName) || '', 'cloudbongos-instance');
714
- const { pkg, action } = mergeCoreDependency(existing, { coreRange, name });
715
- if (action === 'present') {
716
- log(` • ${CORE_PKG} already a dependency — package.json left untouched.`);
717
- return { action, path: p };
718
- }
719
- const verb = action === 'created' ? 'create package.json pinning' : 'add';
720
- const tail = action === 'added' ? ' to dependencies (existing fields preserved)' : '';
721
- if (dryRun) { log(` [dry-run] would ${verb} ${CORE_PKG}@${coreRange}${tail}`); return { action, path: p }; }
722
- fs.writeFileSync(p, JSON.stringify(pkg, null, 2) + '\n');
723
- log(` ✓ ${action === 'created' ? 'created package.json pinning' : 'added'} ${CORE_PKG}@${coreRange}${tail}`);
724
- return { action, path: p };
725
- }
726
-
727
- async function seedViaApi(spec, { dryRun, log = console.log, api = apiCall } = {}) {
728
- const vp = versionPayload(spec);
729
- const starters = Array.isArray(spec.starterTasks) ? spec.starterTasks : [];
730
- const kickoff = kickoffTasks(spec);
731
- const pr = provisioningRequest(spec); // ADR 0111 §3 — null unless the owner opted in
732
-
733
- if (dryRun) {
734
- log(`\n[dry-run] would POST /api/bongos/versions:`);
735
- log(JSON.stringify(vp, null, 2));
736
- log(`\n[dry-run] would create ${starters.length} starter + ${kickoff.length} kickoff task(s) under ${vp.id}.`);
737
- if (pr) {
738
- log(`\n[dry-run] would POST /api/bongos/provisioning/instances:`);
739
- log(JSON.stringify(pr, null, 2));
740
- log(` (queues a 'provision' intent; the control-plane runner stands up hosting — ADR 0111 §2/§3.`);
741
- log(` production-topology is left OFF the kickoff list since it's now automated.)`);
742
- }
743
- return { seeded: false };
744
- }
745
-
746
- // 1. version + first goal
747
- const vres = await api('POST', '/api/bongos/versions', vp);
748
- if (!vres.ok && vres.status !== 409) {
749
- throw new Error(`POST /versions failed (${vres.status}): ${JSON.stringify(vres.data)}`);
750
- }
751
- // The version's first goal — every task below needs its id (BV1.R11 refuses a
752
- // goal-less task, and R03 refuses creating a goal on a version that is already
753
- // 'building', which is what versionPayload makes). POST /versions now returns it
754
- // alongside the version (task 1003701); on the 409 re-run path the version is
755
- // already there, so read its goals back instead.
756
- let goalId = vres.ok && vres.data && vres.data.goal ? vres.data.goal.id : null;
757
- if (vres.status === 409) {
758
- log(` • version ${vp.id} already exists — continuing.`);
759
- const gres = await api('GET', `/api/bongos/goals?version=${encodeURIComponent(vp.id)}`);
760
- const goals = gres.ok ? (Array.isArray(gres.data) ? gres.data : (gres.data && gres.data.goals) || []) : [];
761
- const open = goals.find((g) => g && g.status === 'open' && !g.is_maintenance) || goals.find((g) => g && g.status === 'open');
762
- goalId = open ? open.id : null;
763
- } else {
764
- log(` ✓ created version ${vp.id} + its first goal`);
765
- }
766
- // Fail LOUD rather than filing a wave of tasks the server will refuse one by one:
767
- // with no goal every POST below returns 400 goal_id_required, and the run would
768
- // report a pile of identical failures instead of the single reason behind them.
769
- if (goalId == null) {
770
- throw new Error(
771
- `could not determine a goal for version ${vp.id} — every task needs one (goal_id_required). ` +
772
- `The version exists but has no open goal to file under; create one and re-run.`
773
- );
774
- }
775
- const criterionId = vp.criteria[0].criterion_id;
776
-
777
- // A tracked kickoff/starter task (status ready). Returns true on success.
778
- // The whole point of filing these is "nothing is silently skipped" — so a
779
- // rejected POST must be LOUD: every failure is collected with its reason and
780
- // reported against the expected count, never absorbed into a smaller total.
781
- let attempted = 0;
782
- const failures = [];
783
- const postTask = async (t, extra = {}) => {
784
- attempted++;
785
- const res = await api('POST', '/api/bongos/tasks', {
786
- version_id: vp.id, goal_id: goalId, title: t.title, description: t.description || '', status: 'ready',
787
- kind: t.kind || 'infra', discipline: t.discipline || 'engineer', source: 'bongos-init', ...extra,
788
- });
789
- if (!res.ok) failures.push({ title: t.title, status: res.status, detail: JSON.stringify(res.data) });
790
- return res.ok;
791
- };
792
-
793
- // 2. starter task(s) — linked to the first goal so /status rolls them up
794
- let created = 0;
795
- for (const t of starters) {
796
- // task 1002988: `discipline: undefined` used to sit in this extras object, and
797
- // because `...extra` spreads AFTER postTask's own `t.discipline || 'engineer'`
798
- // it clobbered that default back to nothing — which is why a freshly scaffolded
799
- // instance was born with role-less starter tasks. Dropped, so starters inherit
800
- // the same default every other seeded task already got.
801
- if (await postTask(t, { kind: t.kind || 'unclassified', criterion_ids: [criterionId] })) created++;
802
- }
803
- // 3. kickoff steps as tracked tasks
804
- for (const t of kickoff) {
805
- if (await postTask(t)) created++;
806
- }
807
-
808
- // 4. Provisioning arm (ADR 0111 §3): the infra answers become a real provisioning
809
- // REQUEST, not just a manual runbook task. kickoffTasks already omitted the
810
- // production-topology step when pr is set — so if the request can't be enqueued
811
- // (module not enabled on the target instance → 404, or a transient failure), we
812
- // re-file that manual step here so the leg is never silently dropped.
813
- let provisioned = false;
814
- if (pr) {
815
- const pres = await api('POST', '/api/bongos/provisioning/instances', pr);
816
- if (pres.ok) {
817
- provisioned = true;
818
- const inst = (pres.data && pres.data.instance) || {};
819
- const cost = Number(inst.cost_estimate_usd || 0);
820
- // Report the ROW's domain, not the request's: the server may have
821
- // auto-assigned <slug>.<instanceBase> to a domainless request (task
822
- // 1002704) — the operator must hear the address they actually got.
823
- const addr = inst.domain
824
- ? `, ${inst.domain}${pr.domain ? '' : ' (auto-assigned — attach your own domain any time to replace it)'}`
825
- : ', no address yet';
826
- log(` ✓ requested provisioning of instance "${pr.slug}" (${pr.hosting_shape}${addr})` +
827
- `${cost ? ` — est. $${cost}/mo` : ''} — a provision intent is queued for the control-plane runner`);
828
- } else {
829
- const why = pres.status === 404
830
- ? 'the provisioning module is not enabled on this instance'
831
- : `the provisioning request failed (${pres.status}: ${JSON.stringify(pres.data)})`;
832
- log(` • ${why} — filing the manual production-topology task instead`);
833
- if (await postTask(productionTopologyKickoff())) created++;
834
- }
835
- }
836
-
837
- const kickoffLabel = provisioned ? `${kickoff.length} kickoff + provisioning request` : `${kickoff.length} kickoff`;
838
- if (failures.length) {
839
- log(` ✗ ${failures.length} of ${attempted} task(s) FAILED to file — the checklist below is INCOMPLETE:`);
840
- for (const f of failures) log(` ✗ "${f.title}" (${f.status}): ${f.detail}`);
841
- }
842
- log(` ${failures.length ? '⚠' : '✓'} filed ${created} of ${attempted} task(s) (${starters.length} starter + ${kickoffLabel})`);
843
- return { seeded: true, created, attempted, failures, provisioned };
844
- }
845
-
846
- // ---------------------------------------------------------------------------
847
- // adopt (brownfield) — LAYER onto an existing repo (ADR 0121 / task 2042)
848
- // ---------------------------------------------------------------------------
849
-
850
- // Interactive accept-gate for the pre-flight (ADR 0121 §Decision 5). Default No, so a
851
- // bare Enter never writes. Only reached when there are no BLOCKING findings (those hard-
852
- // stop before the prompt). Split out for testability (injectable input/output).
853
- function confirmProceed({ input = process.stdin, output = process.stdout } = {}) {
854
- const rl = readline.createInterface({ input, output });
855
- return new Promise((resolve) => rl.question('\nProceed with layering + seeding onto this repo? (y/N) ', (a) => { rl.close(); resolve(/^y(es)?$/i.test((a || '').trim())); }));
856
- }
857
-
858
- // The brownfield sibling of main()'s greenfield body: LAYER Cloud Bongos onto an
859
- // EXISTING repo without clobbering, then reflect its REAL state. It (1) detects the
860
- // stack (task 2043), (2) runs an accept-gated conflict PRE-FLIGHT (task 2045) — nothing
861
- // is written until the owner accepts — then, on accept, (3) writes the lean config where
862
- // absent + adds the pinned core dep + copies .claude/ ADDITIVELY (task 2042) and (4)
863
- // seeds the repo's REAL version/goal + IMPORTS its existing backlog (task 2044), NOT a
864
- // synthetic "V1 — Prove the loop". `--dry-run` previews everything and writes nothing;
865
- // `--no-seed` layers without seeding. Returns a process exit code.
866
- // `coreDep`/`vendorPlan` (task 1002562): adopt used to ALWAYS write the caret range,
867
- // which resolves NOWHERE on npm — so an adopted repo could not `npm ci --omit=dev`, the
868
- // exact command the provisioner runs on the box. Greenfield already had --vendor-core for
869
- // this; passing the same resolved pin through here makes an adopted repo equally
870
- // installable. Omitted (a plain `bongos init --adopt` on a laptop) → the caret, unchanged.
871
- async function runAdopt(spec, { dir, dryRun, noSeed = false, accept = false, coreDep = null, vendorPlan = null, log = console.log }) {
872
- log(`\nAdopting Cloud Bongos onto the existing repo at "${dir}"${dryRun ? ' (dry run — nothing will be written or created)' : ''}:`);
873
- log(' Layering — pre-existing files are left untouched; nothing is overwritten.');
874
-
875
- // Inspect the tree BEFORE writing anything (ADR 0121 §Decision 4 / task 2043) so
876
- // layering fits what is already here.
877
- const stack = detectStack({ dir });
878
- log('\nDetected stack + layout:');
879
- for (const line of formatStackSummary(stack)) log(` • ${line}`);
880
-
881
- // Conflict PRE-FLIGHT (ADR 0121 §Decision 5 / task 2045): report the blast radius, then
882
- // gate the writes on the owner's acceptance. --dry-run previews without writing, so it
883
- // needs no gate; a real run proceeds only on --accept or an interactive yes.
884
- const report = preflightAdopt({ dir, stack });
885
- log('\nConflict pre-flight (nothing is written until you accept):');
886
- for (const line of formatPreflight(report)) log(line);
887
- log(` → ${report.counts.blocking} blocking · ${report.counts.warning} warning · ${report.counts.info} ok`);
888
- if (!dryRun) {
889
- // A BLOCKING finding (e.g. a migration that WILL collide) is a hard stop — it can't
890
- // be waved through with --accept; the owner must resolve it and re-run.
891
- if (report.hasBlocking) {
892
- log(`\n✗ ${report.counts.blocking} BLOCKING conflict(s) above — resolve them, then re-run. Nothing was written.`);
893
- return 2;
894
- }
895
- const proceed = accept || (process.stdin.isTTY ? await confirmProceed() : false);
896
- if (!proceed) {
897
- log('\nPre-flight only — nothing was written. Re-run with --accept (or confirm interactively) to apply.');
898
- return 0;
899
- }
900
- }
901
-
902
- const cfg = layerConfigs(spec, { dir, dryRun, log });
903
- const pkg = layerPackageJson(spec, { dir, dryRun, log, ...(coreDep ? { coreRange: coreDep } : {}) });
904
- // The first-run guide, which adopt used to skip entirely: an adopted repo always has a
905
- // README, so the greenfield write-if-absent rule never fired and the one instruction to
906
- // run `npm install` was silently owed on every adopt.
907
- layerReadme(buildBrandingConfig(spec), { dir, dryRun, log });
908
-
909
- // Vendor the pinned core tarball + generate the lockfile, mirroring the greenfield
910
- // --vendor-core steps, so the adopted repo is `npm ci --omit=dev`-installable (ADR 0108).
911
- // Skipped when layerPackageJson found the dep ALREADY present — re-pinning someone's
912
- // existing declaration is an overwrite, and adopt never overwrites.
913
- if (vendorPlan && pkg.action !== 'present' && pkg.action !== 'unparseable') {
914
- const upgrade = require('./upgrade');
915
- if (dryRun) {
916
- log(`\n [dry-run] would vendor ${vendorPlan.tgz} → ${vendorPlan.vendorRel} and run \`npm install\` to generate package-lock.json`);
917
- } else {
918
- log('\nVendoring the pinned @bongos/core + generating the lockfile:');
919
- upgrade.vendorTarball({ instanceDir: dir, fromTgz: vendorPlan.tgz, targetVersion: vendorPlan.version });
920
- log(` ✓ vendored ${vendorPlan.vendorRel}`);
921
- const inst = upgrade.npmInstall(dir);
922
- if (!inst.ok) {
923
- log(` ! npm install failed (${inst.reason || 'exit ' + inst.code}) — package-lock.json not generated; run \`npm install\` in ${dir} by hand before provisioning.`);
924
- } else {
925
- log(' ✓ npm install → package-lock.json generated (node_modules/@bongos/core installed)');
926
- }
927
- }
928
- } else if (vendorPlan && pkg.action === 'present') {
929
- log(` • ${CORE_PKG} was already declared — left as-is; the vendored tarball was NOT pinned over it.`);
930
- }
931
-
932
- log('\nMaterializing the .claude/ methodology surface (additive — existing files left untouched):');
933
- const claude = materializeClaude({ coreRoot: resolveCoreRoot(), instanceDir: dir, dryRun, overwrite: false, log });
934
-
935
- // Reflect REAL state (ADR 0121 §Decision 3 / task 2044): import the existing backlog,
936
- // then seed the repo's REAL version/goal + the imported tasks + the (identical) human-
937
- // only kickoff steps via the same seedViaApi greenfield uses — so the ledger starts
938
- // truthful, not empty. `--no-seed` layers only (the task-2042 skeleton behavior).
939
- let backlog = { source: 'none', tasks: [], truncated: false };
940
- if (!noSeed) {
941
- const githubToken = process.env.GITHUB_TOKEN || process.env.GH_TOKEN || null;
942
- backlog = await resolveBacklogTasks({ dir, repo: spec.repo, githubToken, backlogFile: spec.backlogFile, onWarn: (m) => log(` • ${m}`) });
943
- // Imported tasks ride in as starterTasks so seedViaApi links them to the goal's criterion.
944
- if (backlog.tasks.length) spec.starterTasks = [...(spec.starterTasks || []), ...backlog.tasks];
945
- const importNote = backlog.tasks.length
946
- ? `${backlog.tasks.length} imported task(s) from ${backlog.source}${backlog.truncated ? ` (capped at ${BACKLOG_MAX})` : ''}`
947
- : 'no backlog found (capture tasks later)';
948
- log(`\nReflecting real state — seeding version "${spec.version && spec.version.id}" + goal + ${importNote}:`);
949
- const seedResult = (await seedViaApi(spec, { dryRun, log })) || {};
950
- if (Array.isArray(seedResult.failures) && seedResult.failures.length) {
951
- log(`\n ⚠ ${seedResult.failures.length} seed task(s) failed to file (details above) — re-file them by hand or re-run the seed; the tracked checklist is incomplete until they exist.`);
952
- }
953
- } else {
954
- log('\n (--no-seed: layered config only; skipped real-state seeding)');
955
- }
956
-
957
- const leftFiles = cfg.left.length
958
- + (Array.isArray(claude.skippedFiles) ? claude.skippedFiles.length : 0)
959
- + (pkg.action === 'present' || pkg.action === 'unparseable' ? 1 : 0);
960
-
961
- log(`\n${dryRun ? 'Dry run complete — re-run without --dry-run (and --accept) to apply.' : 'Adopted.'} Next:`);
962
- if (report.counts.warning > 0) log(` • ${report.counts.warning} pre-flight warning(s) above — reconcile them (esp. migrations / CI check names) as you settle in.`);
963
- if (leftFiles > 0) log(` • ${leftFiles} pre-existing file(s) were left untouched — reconcile them against what a fresh instance ships.`);
964
- log(' • fill the look: hand docs/branding-fill-prompt.md to your own LLM (or keep your existing branding).');
965
- log(` • sign in as ${spec.firstAdmin} to seat yourself as the founding owner.`);
966
- return 0;
967
- }
968
-
969
- // ---------------------------------------------------------------------------
970
- // main
971
- // ---------------------------------------------------------------------------
972
-
973
- async function main(argv) {
974
- const args = argv.slice(2);
975
- const fromPath = arg('--from', args);
976
- const dir = path.resolve(arg('--dir', args) || process.cwd());
977
- const dryRun = hasFlag('--dry-run', args);
978
- const force = hasFlag('--force', args);
979
- const noSeed = hasFlag('--no-seed', args);
980
- const adopt = hasFlag('--adopt', args); // brownfield: LAYER onto an existing repo (ADR 0121)
981
- const accept = hasFlag('--accept', args) || hasFlag('--yes', args) || hasFlag('-y', args); // adopt pre-flight accept-gate (§Decision 5)
982
- const vendorCore = arg('--vendor-core', args); // greenfield: vendor + file:-pin a core .tgz, then generate the lockfile (ADR 0108 gap 1/4, task 2053)
983
- const registryCore = hasFlag('--registry-core', args); // greenfield: keep the caret pin and generate the lockfile from the public registry (task 1003878)
984
-
985
- if (adopt && force) {
986
- console.error('init: --force is a greenfield-only overwrite; --adopt never overwrites, so --force is ignored.');
987
- }
988
- if (vendorCore && registryCore) {
989
- console.error('init: --vendor-core and --registry-core are mutually exclusive — the vendored tarball and the registry pull are two ways to resolve the same core dependency. Pick one.');
990
- return 1;
991
- }
992
-
993
- let raw;
994
- if (fromPath) {
995
- try {
996
- raw = JSON.parse(fs.readFileSync(path.resolve(fromPath), 'utf8'));
997
- } catch (e) {
998
- console.error(`init: could not read spec ${fromPath}: ${e.message}`);
999
- return 1;
1000
- }
1001
- } else {
1002
- raw = await interview({ adopt });
1003
- }
1004
-
1005
- const spec = normalizeSpec(raw);
1006
- const errs = validateSpec(spec, { adopt, noSeed });
1007
- if (errs.length) {
1008
- console.error('\ninit: the spec is incomplete:');
1009
- for (const e of errs) console.error(` • ${e}`);
1010
- return 1;
1011
- }
1012
-
1013
- // Core-dep resolution (ADR 0108 gap 1/4, task 2053). With --vendor-core, pin
1014
- // package.json to the vendored `file:` tarball (the caret range resolves NOWHERE on npm,
1015
- // so a caret-only scaffold can't `npm ci`); the tarball is copied + the lockfile generated
1016
- // below. Without it, the scaffold carries the declared caret (a local/dev scaffold the
1017
- // owner resolves another way). Reuses the bongos-upgrade vendoring + install steps.
1018
- //
1019
- // Resolved BEFORE the adopt branch (task 1002562) because BOTH paths need it: an adopted
1020
- // repo has to be `npm ci`-installable by the provisioner exactly like a scaffolded one.
1021
- const upgrade = require('./upgrade');
1022
- let coreDep = null; // null → writeConfigs/layerPackageJson write the caret range
1023
- let vendorPlan = null;
1024
- if (vendorCore) {
1025
- const tgz = path.resolve(vendorCore);
1026
- if (!fs.existsSync(tgz)) {
1027
- console.error(`init: --vendor-core tarball not found: ${tgz}`);
1028
- return 1;
1029
- }
1030
- const version = upgrade.versionFromTgzPath(tgz) || coreVersionSafe();
1031
- if (!version) {
1032
- console.error(`init: could not derive the core version from ${path.basename(tgz)} — expected a tarball named ${upgrade.ARTIFACT}-<version>.tgz (produced by \`node scripts/gds/package-core.js\`).`);
1033
- return 1;
1034
- }
1035
- const vendorRel = upgrade.vendorRelFor(version);
1036
- coreDep = `file:${vendorRel}`;
1037
- vendorPlan = { tgz, version, vendorRel };
1038
- }
1039
-
1040
- // Brownfield (ADR 0121): a distinct LAYER + real-state path — never the greenfield
1041
- // scaffold/overwrite below. Its own report + next-steps live in runAdopt.
1042
- if (adopt) return await runAdopt(spec, { dir, dryRun, noSeed, accept, coreDep, vendorPlan });
1043
-
1044
- console.log(`\nScaffolding "${spec.identity.productName}"${dryRun ? ' (dry run — nothing will be written or created)' : ''}:`);
1045
- writeConfigs(spec, { dir, force, dryRun, coreDep });
1046
-
1047
- // Vendor the pinned @bongos/core tarball + generate the lockfile so the scaffold is
1048
- // `npm ci --omit=dev`-installable by the provisioner (ADR 0108 gap 1/4, task 2053). The
1049
- // `npm install` here is the ONLY heavy step — it CREATES package-lock.json from the file:
1050
- // tarball; the provisioner later runs `npm ci` against that committed lockfile.
1051
- if (vendorPlan) {
1052
- if (dryRun) {
1053
- console.log(`\n[dry-run] would vendor ${vendorPlan.tgz} → ${vendorPlan.vendorRel} and run \`npm install\` to generate package-lock.json`);
1054
- } else {
1055
- console.log('\nVendoring the pinned @bongos/core + generating the lockfile:');
1056
- upgrade.vendorTarball({ instanceDir: dir, fromTgz: vendorPlan.tgz, targetVersion: vendorPlan.version });
1057
- console.log(` ✓ vendored ${vendorPlan.vendorRel}`);
1058
- const inst = upgrade.npmInstall(dir);
1059
- if (!inst.ok) {
1060
- console.error(` ! npm install failed (${inst.reason || 'exit ' + inst.code}) — package-lock.json not generated; run \`npm install\` in ${dir} by hand before provisioning.`);
1061
- } else {
1062
- console.log(' ✓ npm install → package-lock.json generated (node_modules/@bongos/core installed)');
1063
- }
1064
- }
1065
- }
1066
-
1067
- // Registry-install path: keep the caret pin writeConfigs wrote and generate
1068
- // package-lock.json from the registry, so a later `npm ci` is reproducible.
1069
- //
1070
- // This used to write an env-fed npm auth file and skip the lockfile when no credential was
1071
- // present, because @bongos/core published PRIVATE. It is public now (task 1003872), so it
1072
- // resolves from the default registry like any other dependency: no auth file, no credential,
1073
- // and no tokenless-404 branch to explain (task 1003878).
1074
- if (registryCore) {
1075
- if (dryRun) {
1076
- console.log('\n[dry-run] would run `npm install` to generate package-lock.json from the registry');
1077
- } else {
1078
- console.log('\nWiring the registry-install path:');
1079
- const inst = upgrade.npmInstall(dir);
1080
- if (!inst.ok) {
1081
- console.error(` ! npm install failed (${inst.reason || 'exit ' + inst.code}) — package-lock.json not generated. @bongos/core is public, so this is a real failure (network, registry outage, or an unpublished version), not a missing credential.`);
1082
- } else {
1083
- console.log(' ✓ npm install → package-lock.json generated (pulled @bongos/core from the registry)');
1084
- }
1085
- }
1086
- }
1087
-
1088
- // Materialize the .claude/ methodology surface (ADR 0108 §3 / W3): Claude Code reads skills +
1089
- // hooks + settings.json from the project root, never node_modules, so init copies them from the
1090
- // core package into the instance and rewrites `node scripts/gds/<x>.js` → the `bongos` bin.
1091
- // A no-op when the instance dir IS the core checkout (self-copy guard).
1092
- console.log('\nMaterializing the .claude/ methodology surface:');
1093
- materializeClaude({ coreRoot: resolveCoreRoot(), instanceDir: dir, dryRun, log: console.log });
1094
-
1095
- // Regenerate the per-instance API artifacts (OpenAPI spec + api-reference + typed
1096
- // client) from the PINNED core's routes so this fresh consumer's COMMITTED artifacts
1097
- // match its core from day one — not the core package's build-time snapshot (task 2141).
1098
- // They ship as CORE starters (task 2078 — the hall/docs must render before first regen)
1099
- // yet are per-instance GENERATED; `bongos upgrade` does the same on a bump, this closes
1100
- // the gap at standup. Best-effort: a hiccup warns, never fails init — the instance-root
1101
- // drift guard (fitness `gen-api-docs --check` + the api_client byte-identity test)
1102
- // catches any lag on the consumer's first CI.
1103
- if (dryRun) {
1104
- console.log('\n[dry-run] would regenerate the API artifacts (OpenAPI spec + reference + typed client) from the pinned core');
1105
- console.log('[dry-run] would seed the whole-file navigation docs (session-log index) from the pinned core');
1106
- } else {
1107
- console.log('\nRegenerating the API artifacts from the pinned core (OpenAPI spec + reference + typed client):');
1108
- const regen = upgrade.regenerateApiArtifacts({ instanceDir: dir, coreRoot: resolveCoreRoot() });
1109
- if (regen.ok) console.log(` ✓ regenerated (${regen.ran.join(', ')}) → docs/api/ + docs/api-reference.md + clients/bongos-client/`);
1110
- else console.error(` ! API-artifact regen skipped (${regen.reason}) — regenerate in ${dir} by hand; the instance-root fitness gate flags the lag otherwise.`);
1111
- // Seed the whole-file navigation docs (session-log index) so a fresh instance's docs/ isn't
1112
- // empty before its first deploy-regen (ADR 0110 / task 1002314). Gitignored on the instance —
1113
- // this is a local seed; the ongoing refresh is regen-instance-docs.js on deploy + `bongos
1114
- // upgrade`. Best-effort, mirrors the api-artifacts line: a hiccup warns, never fails init.
1115
- console.log('\nSeeding the navigation docs from the pinned core (session-log index):');
1116
- const nav = upgrade.regenerateNavDocs({ instanceDir: dir, coreRoot: resolveCoreRoot() });
1117
- if (nav.ok) console.log(` ✓ seeded (${nav.ran.join(', ')}) → docs/`);
1118
- else console.error(` ! nav-doc seed incomplete (failed: ${nav.failed.map((f) => f.gen).join(', ')}) — the deploy regen (regen-instance-docs.js) retries.`);
1119
- }
1120
-
1121
- let seedResult = {};
1122
- if (!noSeed) seedResult = (await seedViaApi(spec, { dryRun })) || {};
1123
- else console.log(' (--no-seed: skipped version/task seeding)');
1124
-
1125
- console.log(`\n${dryRun ? 'Dry run complete.' : 'Done.'} Next:`);
1126
- if (Array.isArray(seedResult.failures) && seedResult.failures.length) {
1127
- console.log(` ⚠ ${seedResult.failures.length} seed task(s) failed to file (details above) — re-file them by hand or re-run the seed; the tracked checklist is incomplete until they exist.`);
1128
- }
1129
- console.log(' • fill the look: hand docs/branding-fill-prompt.md to your own LLM');
1130
- console.log(` • sign in as ${spec.firstAdmin} to become the owner, then run \`bongos start\` to see the kickoff tasks`);
1131
- console.log(' • work through the kickoff tasks the way you would any task: claim → ship');
1132
- if (seedResult.provisioned) {
1133
- console.log(` • the control-plane runner (\`bongos provision run-intents --apply\`) will stand up your hosting — watch it in the hall's Instances panel`);
1134
- } else if (provisioningRequest(spec) && !dryRun) {
1135
- console.log(' • provisioning wasn\'t enqueued (module off / request failed) — the manual production-topology task is in your queue');
1136
- }
1137
- return 0;
1138
- }
1139
-
1140
- module.exports = {
1141
- buildBrandingConfig, buildModulesConfig, buildHierarchyConfig, buildReadme, kickoffTasks, normalizeSpec,
1142
- validateSpec, versionPayload, slugify, writeConfigs, seedViaApi, interview, main,
1143
- provisioningSlug, provisioningRequest, productionTopologyKickoff,
1144
- // --adopt (brownfield layering, ADR 0121 / task 2042)
1145
- mergeCoreDependency, coreDepRange, layerConfigs, layerPackageJson, runAdopt,
1146
- buildReadmeSection, appendReadmeSection, layerReadme, README_MARKER,
1147
- KNOWN_MODULES, HOSTING_SHAPES, CORE_PKG,
1148
- // greenfield installability (ADR 0108 gap 1/4, task 2053)
1149
- buildInstancePackageJson, coreVersionSafe, INSTANCE_HALL_SCRIPT, INSTANCE_MIGRATE_SCRIPT,
1150
- // enabled-module dep composition (ADR 0138 / task 2160)
1151
- moduleDeclaredDeps, enabledModuleDeps,
1152
- };
1153
-
1154
- if (require.main === module) {
1155
- main(process.argv).then((code) => process.exit(code)).catch((err) => {
1156
- console.error(`init: ${err.message}`);
1157
- process.exit(1);
1158
- });
1159
- }
7
+ require('../bongos/forwarder.js').forward(module, 'init.js');