@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,1376 +1,7 @@
1
1
  #!/usr/bin/env node
2
+ // scripts/gds/module.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/module.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/module.js — `bongos module new <key>` (scaffolder) + `bongos upgrade`
5
- // (coreVersion pre-check). BONGOS-V1 · BV1.R50 · task 1419 (ADR 0083 / design 04§2).
6
- //
7
- // Two halves of "operating the module system from the terminal":
8
- //
9
- // bongos module new <key>
10
- // Scaffolds modules/<key>/ — a VALID, loader-discoverable module.json (M03),
11
- // the dir skeleton (routes/, migrations/, ui/), a sample route factory, a
12
- // HOWTO.md template for the store page (ADR 0347), and a nested CLAUDE.md — with NO edit to any core file. The loader
13
- // (src/module-loader/loader.js) discovers it; enabling it (config/modules.json
14
- // or env) mounts its routes behind the kernel's auth — the strangler endgame
15
- // where adding a feature is "drop a directory," not "edit routes.js + modules.js".
16
- //
17
- // bongos upgrade
18
- // A fail-closed pre-flight: every ENABLED discovered module declares the
19
- // src/module-api.js CORE_VERSION range (`coreVersion`) it supports. This
20
- // reports each module's compatibility and REFUSES (exit 1) if an enabled
21
- // module no longer satisfies the current core — the loud, ahead-of-time
22
- // version of the loader's silent coreVersion SKIP (which would just drop the
23
- // module at boot). Disabled mismatches are warnings, not blockers.
24
- //
25
- // bongos module list [--catalog] [--search <q>] [--json]
26
- // ADR 0107 §2/§3 (task 1001772) — the BROWSABLE CATALOG from the terminal:
27
- // every module this instance can enable, each with its author + origin
28
- // credit, its enabled state, and who maintains it. `--catalog` narrows to
29
- // the CORE-shipped modules (the shared catalog an instance opts into, §6);
30
- // without it you also see the instance's own modules. It renders the same
31
- // model as the hall's Modules tab (src/module-loader/catalog.js), so the two
32
- // surfaces cannot disagree about who built what.
33
- //
34
- // bongos module check <key>
35
- // ADR 0107 §4 — the submit-time pre-check a module must clear before it can
36
- // be upstreamed into the shared core catalog. REUSES (never re-types) the
37
- // public-mirror publish boundary (scripts/gds/publish-manifest.js): every
38
- // file the module carries is classified as if it already lived at its
39
- // canonical modules/<key>/ location, and anything the DENYLIST forbids
40
- // (game content, pixel art, copyrighted reference material, instance
41
- // secrets, deploy/CI topology) fails the check with a clear reason — this
42
- // is deliberately the DENY half only, not the full isPublishable() gate,
43
- // because a brand-new module is never on the ALLOWLIST until it is
44
- // accepted (§6); that omission must not read as "denied content." Also
45
- // requires the manifest to declare an AGPL-3.0 license (inbound = outbound,
46
- // ADR 0107 §4 — no CLA) and a `maintenance` posture (ADR 0107 §7 / ADR
47
- // 0166 — core-maintained, or maintained by a named maintainer; a module
48
- // already deprecated/orphaned cannot be submitted INTO the catalog).
49
- // On a pass, `--sign-off "Name <email>"` records a
50
- // lightweight DCO-style affirmation (own work, licensed AGPL-3.0 — never a
51
- // copyright-assignment CLA) to modules/<key>/.upstream-signoff.json.
52
- //
53
- // This is build tooling (scripts/), so — unlike a module — it may freely require
54
- // the core (src/*). It makes NO API/network calls: it is pure local fs + config
55
- // resolution, so it runs anywhere (a box, CI, a laptop) with no GDS session.
56
- //
57
- // Usage:
58
- // bongos module new <key> scaffold modules/<key>/
59
- // bongos module new <key> --force overwrite an existing modules/<key>/
60
- // bongos module list [--catalog] browse the module catalog (author + origin credit)
61
- // bongos upgrade [--no-store] pre-check enabled modules vs the core version + list store updates
62
- // bongos module check <key> [--sign-off "Name <email>"] AGPL/publish pre-check + DCO sign-off
63
- // bongos module install <key> [--version X.Y.Z] acquire from the store, verify, place (not enabled)
64
- // bongos module update <key> [--version X.Y.Z] move an installed store module forward
65
-
66
- const fs = require('node:fs');
67
- const path = require('node:path');
68
-
69
- const REPO_ROOT = path.resolve(__dirname, '..', '..');
70
- const MODULES_DIR = path.join(REPO_ROOT, 'modules');
71
-
72
- const { validateManifest, assertValidManifest, KEY_RE, SUNSET_STATUSES } = require('../../src/module-loader/manifest-schema');
73
- const { parseVersion, cmp } = require('../../src/module-loader/semver');
74
- const loader = require('../../src/module-loader/loader');
75
- const catalog = require('../../src/module-loader/catalog');
76
- const { resolveModules, MODULE_REGISTRY, NEUTRAL_PATH, INSTANCE_PATH } = require('../../src/modules');
77
- // The public-mirror publish boundary (ADR 0098) — REUSED, never re-typed, for
78
- // the ADR 0107 §4 upstreaming pre-check. Only matchesDeny is used (not the full
79
- // isPublishable), because a brand-new module is never on the ALLOWLIST until
80
- // accepted (§6) — gating on the allowlist here would reject every legitimate
81
- // new module. The denylist is the copyright/content classification we want.
82
- const { matchesDeny } = require('./publish-manifest');
83
-
84
- // CORE_VERSION via the doorway, lazily + fail-soft (mirrors loader.coreVersion):
85
- // requiring src/module-api pulls auth/pool, so a tooling context with no DB still
86
- // resolves to the known initial version rather than crashing.
87
- function coreVersion() {
88
- try { return require('../../src/module-api').CORE_VERSION; }
89
- catch { return '1.0.0'; }
90
- }
91
-
92
- function readJson(p) {
93
- try { return JSON.parse(fs.readFileSync(p, 'utf8')); }
94
- catch (e) { if (e.code === 'ENOENT') return null; throw e; }
95
- }
96
-
97
- // A text file's contents, or null when it does not exist.
98
- function readText(p) {
99
- try { return fs.readFileSync(p, 'utf8'); }
100
- catch (e) { if (e.code === 'ENOENT') return null; throw e; }
101
- }
102
-
103
- function envPrefix() {
104
- const { FALLBACK_ENV_PREFIX } = require('../../src/instance-config');
105
- try { return require('../../src/branding').branding().envPrefix || FALLBACK_ENV_PREFIX; }
106
- catch { return FALLBACK_ENV_PREFIX; }
107
- }
108
-
109
- // ---------------------------------------------------------------------------
110
- // Pure builders (exported for tests — no I/O, no network)
111
- // ---------------------------------------------------------------------------
112
-
113
- // art-pipeline -> "Art Pipeline"; economy -> "Economy". A readable default title.
114
- function titleize(key) {
115
- return String(key).split(/[-_]+/).filter(Boolean)
116
- .map((w) => w[0].toUpperCase() + w.slice(1)).join(' ');
117
- }
118
- // art-pipeline -> artPipeline (for the generated route-factory function name).
119
- function camel(key) {
120
- return String(key).replace(/[-_]+(.)/g, (_, c) => c.toUpperCase());
121
- }
122
-
123
- // The minimal-but-valid manifest a fresh module starts from. coreVersion is a
124
- // caret on the CURRENT core, so the module supports this core + its future
125
- // minors; it declares one sample route so the scaffold mounts something real.
126
- // The four attribution fields (ADR 0107 §2) are stamped as TODO placeholders —
127
- // non-empty so they self-validate — so authorship travels with the module from
128
- // the start rather than being an afterthought bolted on at upstream-submit time.
129
- // `license` defaults to the core's own license (AGPL-3.0, ADR 0065) since
130
- // inbound = outbound is the project's default posture; override if different.
131
- function buildManifest(key, { core = coreVersion() } = {}) {
132
- return {
133
- key,
134
- title: titleize(key),
135
- description: `TODO: one sentence describing the ${key} module.`,
136
- // The module's own version (task 1003781). A fresh scaffold is pre-release.
137
- version: '0.1.0',
138
- coreVersion: `^${core}`,
139
- default: false,
140
- author: 'TODO: your name or builder handle',
141
- origin: 'TODO: the instance/project this module was built in',
142
- license: 'AGPL-3.0',
143
- maintainer: 'TODO: who to credit/contact if this module is upstreamed',
144
- // Upkeep posture (ADR 0107 §7 / ADR 0166). Scaffolded as `maintained`
145
- // because a brand-new module's author IS its maintainer — the honest
146
- // default. Change it to `core-maintained` only if the core team has agreed
147
- // to own it, and to `deprecated`/`orphaned` (with a path) when that changes.
148
- maintenance: { status: 'maintained' },
149
- contributes: { routes: [key] },
150
- };
151
- }
152
-
153
- function routeTemplate(key) {
154
- const fn = `${camel(key)}Routes`;
155
- return `// modules/${key}/routes/${key}.js — sample route factory for the "${key}" module.
156
- //
157
- // A route factory is \`() => express.Router()\`. The loader (src/module-loader)
158
- // mounts it behind the kernel's auth + audit when this module is enabled — you
159
- // never edit the core to add a route. Reach core capabilities ONLY through the
160
- // published doorway src/module-api.js; never deep-import core internals or a
161
- // sibling module (the one-way rule, ADR 0083).
162
- 'use strict';
163
-
164
- const express = require('express');
165
- const api = require('../../../src/module-api');
166
-
167
- module.exports = function ${fn}() {
168
- const router = express.Router();
169
-
170
- // Read routes need no rank gate. EVERY write route MUST be rank-gated — list
171
- // every rank allowed; ('metic', 'archon') means Metic-and-above, e.g.:
172
- // router.post('/${key}/thing', api.requireRank('metic', 'archon'), (req, res) => { ... });
173
- // the BV1.R44 fitness check fails the build on an ungated module write route.
174
- router.get('/${key}/health', (req, res) => {
175
- res.json({ module: '${key}', ok: true, coreVersion: api.CORE_VERSION });
176
- });
177
-
178
- return router;
179
- };
180
- `;
181
- }
182
-
183
- function claudeMdTemplate(key, manifest) {
184
- const ENVKEY = key.toUpperCase().replace(/-/g, '_');
185
- return `# ${manifest.title} module (\`modules/${key}/\`)
186
-
187
- > A Cloud Bongos feature module. It contributes routes / rooms / migrations / UI
188
- > to the host **only** through its \`module.json\` manifest + the published doorway
189
- > \`src/module-api.js\`. The core never imports it; it never imports core internals
190
- > or a sibling module (the one-way rule, ADR 0083).
191
-
192
- ## Manifest (\`module.json\`)
193
- - \`key\` — must equal this directory name (\`${key}\`).
194
- - \`coreVersion\` — the \`src/module-api.js\` CORE_VERSION range this module supports.
195
- \`bongos upgrade\` refuses to advance the core if an enabled module no longer
196
- satisfies it; the loader silently skips a mismatched module at boot.
197
- - \`contributes\` — what mounts: \`routes\`, \`rooms\`, \`pollers\`, \`disciplines\`,
198
- \`skills\`, \`uiSections\`, \`migrations\`. An empty \`{}\` is valid (mounts nothing).
199
- - \`default\` — fail-safe enablement when no config names the module (keep \`false\`).
200
- - \`author\` / \`origin\` / \`license\` / \`maintainer\` — attribution (ADR 0107 §2).
201
- Optional but scaffolded as TODOs — fill them in now so credit travels with the
202
- module if it's ever upstreamed to core. Portable metadata, not a cross-GDS link.
203
-
204
- ## Enable it
205
- This module is OFF until an instance turns it on, via \`config/modules.json\`
206
- (\`{ "modules": { "${key}": true } }\`) or env (\`<PREFIX>_MODULE_${ENVKEY}=1\`). The
207
- loader then discovers and mounts it — no core edit.
208
-
209
- ## Add a route
210
- \`contributes.routes: ["${key}"]\` → \`routes/${key}.js\` exports \`() => express.Router()\`.
211
- Gate every write route with \`api.requireRank('metic', 'archon')\` (Metic-and-above —
212
- list every allowed rank; BV1.R44 enforces this).
213
-
214
- ## Add a migration
215
- Put \`NNN_*.sql\` under \`migrations/\` and set \`contributes.migrations: true\`
216
- (BV1.R46). Own only your \`${key}_*\` tables.
217
-
218
- ## The one-way rule
219
- \`require('../../../src/module-api')\` — the doorway — is the ONLY core import
220
- allowed. No deep core imports, no sibling-module imports; cooperate through
221
- kernel seams (\`api.registerProvider\` / \`api.resolve\` / \`api.on\` / \`api.emit\`).
222
-
223
- ## The how-to (\`HOWTO.md\`)
224
- This CLAUDE.md is for AI sessions working *inside* the module. \`HOWTO.md\` is for the
225
- person who installs it — the store shows it as the module's page (ADR 0347). It is
226
- plain Markdown, so any AI or person can write it. \`bongos module publish\` refuses
227
- the module until each of its five sections has some text; replace the prompts in
228
- \`<!-- -->\` with real answers. An optional \`howto.artifactUrl\` in module.json can
229
- link a Claude page as an extra — never instead of the file.
230
- `;
231
- }
232
-
233
- // The HOWTO.md a fresh module starts from (ADR 0347 D2): every required section as a
234
- // heading, with its prompt in an HTML comment. checkHowto strips comments, so an
235
- // untouched scaffold fails the publish gate until the author writes each section.
236
- function howtoTemplate(key, manifest) {
237
- const { HOWTO_SECTIONS } = require('./module-artifact');
238
- const prompts = {
239
- 'What it does': 'A few sentences: what this module adds, and who it is for.',
240
- 'Install and enable': `How to get it (\`bongos module install ${key}\`) and switch it on (hall Modules tab).`,
241
- 'How to use it': 'Its commands, routes and hall surfaces, with one worked example.',
242
- 'Configuration': 'Env vars and settings, with their defaults. "None." is a fine answer.',
243
- 'Limits and known issues': 'What it does not do, and anything known to go wrong. "None known." is a fine answer.',
244
- };
245
- const sections = HOWTO_SECTIONS.map((name) => `## ${name}\n\n<!-- ${prompts[name]} -->\n`).join('\n');
246
- return `# ${manifest.title} — how to use it
247
-
248
- <!-- Written for the person who installs this module, or for any AI helping them.
249
- The store shows this file as the module's page. Every section below must have
250
- some text before \`bongos module publish\` will accept the module (ADR 0347). -->
251
-
252
- ${sections}`;
253
- }
254
-
255
- // Has the core advanced past a deprecated module's declared removal version?
256
- // `removeAfter: "1.12.0"` means "may be deleted once core is ABOVE 1.12.0".
257
- function isPastRemoveAfter(maintenance, core) {
258
- const after = maintenance && maintenance.removeAfter;
259
- const a = parseVersion(after);
260
- const c = parseVersion(core);
261
- return !!(a && c && cmp(c, a) > 0);
262
- }
263
-
264
- // One line of "who do I chase about this?" for a row, from its maintenance block
265
- // (ADR 0166). Shared by cmdUpgrade and upgrade.js's real-bump pre-flight so both
266
- // surfaces say the same thing about the same module.
267
- function formatMaintenanceHint(row = {}) {
268
- const m = row.maintenance;
269
- if (!m || !m.status) {
270
- return 'no maintenance declared — nobody is on the hook for this module (ADR 0166: declare a `maintenance` block)';
271
- }
272
- const parts = [`maintenance: ${m.status}`];
273
- if (m.status === 'maintained') parts.push(`maintainer ${row.maintainer || '(unnamed!)'}`);
274
- if (m.status === 'core-maintained') parts.push('core-maintained — fixing this is the core\'s job');
275
- if (m.successor) parts.push(`superseded by "${m.successor}"`);
276
- if (m.removeAfter) parts.push(`removable after core ${m.removeAfter}`);
277
- if (m.note) parts.push(m.note);
278
- return parts.join('; ');
279
- }
280
-
281
- // Decide compatibility from rows (pure — tests drive it with injected rows).
282
- // A row: { key, coreVersion, enabled, satisfied, maintenance?, maintainer? }.
283
- //
284
- // BLOCKING = an enabled module that does not satisfy the core (fail-closed).
285
- // WARNINGS = a DISABLED mismatch. These are not cosmetic: an accepted catalog
286
- // module ships `default: false` (ADR 0107 §6), so EVERY rotted catalog entry
287
- // lands in this bucket. Dropping warnings on the floor is exactly how "the
288
- // catalog fills with silently-broken entries" happens (ADR 0107 §7) — every
289
- // caller must surface them, even though none of them block.
290
- // DEPRECATIONS = modules whose own manifest says they are on the way out;
291
- // EXPIRED = deprecated modules the core has already advanced past `removeAfter`
292
- // (they are due for deletion, not just a label).
293
- function evaluateUpgrade({ rows = [], errors = [], core } = {}) {
294
- const blocking = rows.filter((r) => r.enabled && !r.satisfied);
295
- const warnings = rows.filter((r) => !r.enabled && !r.satisfied);
296
- const deprecations = rows.filter((r) => r.maintenance && SUNSET_STATUSES.includes(r.maintenance.status));
297
- const expired = deprecations.filter((r) => isPastRemoveAfter(r.maintenance, core));
298
- const undeclared = rows.filter((r) => !r.maintenance || !r.maintenance.status);
299
- return { ok: blocking.length === 0, blocking, warnings, deprecations, expired, undeclared, rows, errors, core };
300
- }
301
-
302
- // ---------------------------------------------------------------------------
303
- // Scaffolder (fs)
304
- // ---------------------------------------------------------------------------
305
-
306
- function scaffoldModule({ key, modulesDir = MODULES_DIR, core = coreVersion(), force = false } = {}) {
307
- if (!key || !KEY_RE.test(key)) {
308
- throw new Error(`invalid module key "${key}" — must match ${KEY_RE} (lowercase kebab-case, e.g. "art-pipeline")`);
309
- }
310
- const dir = path.join(modulesDir, key);
311
- if (fs.existsSync(dir) && !force) {
312
- throw new Error(`${path.relative(REPO_ROOT, dir)} already exists — use --force to overwrite, or pick another key.`);
313
- }
314
- const manifest = buildManifest(key, { core });
315
- // self-check: a scaffolder that emits an INVALID manifest is a bug, not a typo.
316
- assertValidManifest(manifest, `generated modules/${key}/module.json`);
317
-
318
- const files = {
319
- 'module.json': JSON.stringify(manifest, null, 2) + '\n',
320
- [`routes/${key}.js`]: routeTemplate(key),
321
- 'CLAUDE.md': claudeMdTemplate(key, manifest),
322
- 'HOWTO.md': howtoTemplate(key, manifest),
323
- // git does not track empty dirs — keep the rest of the skeleton with placeholders.
324
- 'migrations/.gitkeep': '',
325
- 'ui/.gitkeep': '',
326
- };
327
- for (const [relp, content] of Object.entries(files)) {
328
- const fp = path.join(dir, relp);
329
- fs.mkdirSync(path.dirname(fp), { recursive: true });
330
- fs.writeFileSync(fp, content);
331
- }
332
- return { dir, files: Object.keys(files), manifest };
333
- }
334
-
335
- // Gather the live compatibility state from disk + config (the I/O half of upgrade).
336
- function gatherUpgrade({ modulesDir = MODULES_DIR, core = coreVersion(), env = process.env, neutral, instance, prefix } = {}) {
337
- neutral = neutral || readJson(NEUTRAL_PATH) || {};
338
- instance = instance || readJson(INSTANCE_PATH) || {};
339
- prefix = prefix || envPrefix();
340
-
341
- const { loaded, skipped, errors } = loader.discoverModules({ roots: [modulesDir], core });
342
- // the loader drops skipped manifests; re-read them so we can show coreVersion + default.
343
- const skippedFull = skipped.map((s) => {
344
- let manifest = null;
345
- try { manifest = JSON.parse(fs.readFileSync(path.join(s.dir, 'module.json'), 'utf8')); } catch { /* gone/garbled */ }
346
- return { ...s, manifest };
347
- });
348
-
349
- // resolveModules throws on an unknown key, so the registry MUST span every
350
- // discovered key (loaded + skipped) — built-in entries plus a synthesized
351
- // {default} for each discovered module.
352
- const registry = { ...MODULE_REGISTRY };
353
- for (const { key, manifest } of loaded) {
354
- if (!(key in registry)) registry[key] = { default: manifest.default === true, contributes: manifest.contributes || {} };
355
- }
356
- for (const { key, manifest } of skippedFull) {
357
- if (key && !(key in registry)) registry[key] = { default: manifest && manifest.default === true, contributes: (manifest && manifest.contributes) || {} };
358
- }
359
-
360
- let enabled = {};
361
- try { enabled = resolveModules({ neutral, instance, env, envPrefix: prefix, registry }); }
362
- catch { /* a malformed config shouldn't crash the pre-check; treat all as disabled */ }
363
-
364
- // Maintenance posture travels with the row (ADR 0166) so both the pre-check
365
- // printout and the real bump can say WHO owns a module that no longer fits —
366
- // an incompatibility with no owner named is the orphaning failure itself.
367
- const upkeep = (manifest) => ({
368
- maintenance: (manifest && manifest.maintenance) || null,
369
- maintainer: (manifest && manifest.maintainer) || null,
370
- });
371
-
372
- const rows = [];
373
- for (const { key, manifest } of loaded) {
374
- rows.push({ key, version: manifest.version || null, coreVersion: manifest.coreVersion, enabled: enabled[key] === true, satisfied: true, ...upkeep(manifest) });
375
- }
376
- for (const { key, manifest, reason } of skippedFull) {
377
- rows.push({ key, version: (manifest && manifest.version) || null, coreVersion: manifest ? manifest.coreVersion : null, enabled: enabled[key] === true, satisfied: false, reason, ...upkeep(manifest) });
378
- }
379
- rows.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0));
380
- return { rows, errors, core };
381
- }
382
-
383
- // ---------------------------------------------------------------------------
384
- // bongos module list — ADR 0107 §2/§3 the browsable catalog (task 1001772)
385
- // ---------------------------------------------------------------------------
386
-
387
- // The live catalog off disk + config. Unlike gatherUpgrade (which scans ONE
388
- // modulesDir because it is answering a question about this checkout's own
389
- // modules), this uses the loader's DEFAULT roots so a split instance sees both
390
- // trees — the core package's modules/ AND its own (ADR 0108 §1). That two-root
391
- // scan is what makes "core-shipped vs. built here" a structural fact here
392
- // rather than a guess.
393
- function gatherCatalog({ roots, core = coreVersion(), env = process.env, neutral, instance, prefix } = {}) {
394
- neutral = neutral || readJson(NEUTRAL_PATH) || {};
395
- instance = instance || readJson(INSTANCE_PATH) || {};
396
- prefix = prefix || envPrefix();
397
-
398
- const { loaded, skipped, errors } = loader.discoverModules(roots ? { roots, core } : { core });
399
-
400
- // Same registry-spanning rule as gatherUpgrade: resolveModules throws on an
401
- // unknown key, so every discovered key must be in the registry it is given.
402
- const registry = { ...MODULE_REGISTRY };
403
- for (const { key, manifest } of loaded) {
404
- if (!(key in registry)) registry[key] = { default: manifest.default === true, contributes: manifest.contributes || {} };
405
- }
406
- for (const { key } of skipped) {
407
- if (key && !(key in registry)) registry[key] = { default: false, contributes: {} };
408
- }
409
-
410
- let enabled = {};
411
- try { enabled = resolveModules({ neutral, instance, env, envPrefix: prefix, registry }); }
412
- catch { /* a malformed config must not blank the catalog — show it all as disabled */ }
413
-
414
- const { coreRoot, instanceRoot, coreCheckout } = catalog.detectRoots();
415
- const rows = catalog.buildCatalog({
416
- loaded, enabled, coreRoot, instanceRoot, coreCheckout, ownProjectName: ownProjectName(),
417
- });
418
- return { rows, skipped, errors, core };
419
- }
420
-
421
- // The instance's own product name, for the credit axis (deriveProvenance).
422
- // Fail-soft: no brand pack resolvable → null, which makes provenance fall back
423
- // to "own-built" rather than guessing (provenance.js's documented behaviour).
424
- function ownProjectName() {
425
- try { return require('../../src/branding').branding().identity.productName; } catch { return null; }
426
- }
427
-
428
- function pad(s, n) { return String(s == null ? '' : s).padEnd(n); }
429
- function clip(s, n) {
430
- const v = String(s == null ? '' : s);
431
- return v.length > n ? `${v.slice(0, n - 1)}…` : v;
432
- }
433
-
434
- // Pure renderer — every input arrives as a parameter (the tests pass catalog
435
- // rows straight in), so it touches no disk and no config.
436
- function formatCatalog(rows, { catalogOnly = false, query = '', core = null, delisted = new Set() } = {}) {
437
- const scoped = catalogOnly ? catalog.catalogRows(rows) : rows;
438
- const shown = catalog.searchCatalog(scoped, query);
439
- const counts = catalog.summarize(rows);
440
- const out = [];
441
-
442
- out.push(catalogOnly
443
- ? 'bongos module list --catalog — core modules this instance can enable (ADR 0107 §6: opt-in, default-off)'
444
- : 'bongos module list — every module on disk, with author + origin credit (ADR 0107 §2)');
445
- if (core) out.push(` core (src/module-api.js CORE_VERSION): ${core}`);
446
- out.push(` ${counts.catalog} in the core catalog (${counts.catalog_enabled} enabled) · ${counts.instance} built here · ${counts.total} total`);
447
- if (query) out.push(` filter "${query}" — ${shown.length} match(es)`);
448
- out.push('');
449
-
450
- if (!shown.length) {
451
- out.push(query ? ' no module matches that filter.' : ' no modules discovered.');
452
- return out.join('\n');
453
- }
454
-
455
- out.push(` ${pad('', 5)}${pad('KEY', 20)}${pad('VERSION', 9)}${pad('SOURCE', 10)}${pad('CATEGORY', 28)}${pad('AUTHOR', 20)}${pad('ORIGIN', 26)}${pad('LICENSE', 12)}UPKEEP`);
456
- for (const r of shown) {
457
- const mark = r.enabled ? '[x]' : '[ ]';
458
- // An inferred credit is marked so it never reads as something the author
459
- // typed — the catalog's whole job is honest attribution (ADR 0107 §2).
460
- const suffix = r.credit.inferred ? '*' : '';
461
- const upkeep = ((r.maintenance && r.maintenance.status) || 'undeclared') + (delisted.has(r.key) ? ' · DELISTED' : '');
462
- // The parent key, plus the sub-category once one is approved (ADR 0342).
463
- const cat = r.category ? r.category.parent + (r.category.sub ? `/${r.category.sub}` : '') : '—';
464
- out.push(` ${pad(mark, 5)}${pad(clip(r.key, 19), 20)}${pad(clip(r.version || '—', 8), 9)}${pad(r.source, 10)}${pad(clip(cat, 27), 28)}${pad(clip((r.credit.author || '—') + suffix, 19), 20)}${pad(clip((r.credit.origin || '—') + suffix, 25), 26)}${pad(clip(r.license || '—', 11), 12)}${upkeep}`);
465
- }
466
- out.push('');
467
- out.push(' [x] enabled here · [ ] available, not enabled');
468
- if (shown.some((r) => delisted.has(r.key))) {
469
- out.push(' DELISTED = taken out of the store: your copy keeps working, but no more versions will come.');
470
- }
471
- if (shown.some((r) => r.credit.inferred)) {
472
- out.push(` * credit not declared in module.json — shown as the platform (${catalog.CORE_PROJECT_NAME}), which ships it.`);
473
- }
474
- out.push(' enable one: add it to config/modules.json, or use the hall\'s Modules tab (Metic+).');
475
- return out.join('\n');
476
- }
477
-
478
- // Which installed store modules the store has delisted (task 1003797). Only modules
479
- // built into this instance's tree can be store installs, so a core checkout asks
480
- // nothing. Fail-soft like the upgrade check: offline, or no session, lists as before.
481
- async function gatherDelisted(rows, { checkStore = gatherUpdates } = {}) {
482
- const held = rows.filter((r) => r.source === 'instance');
483
- if (!held.length) return new Set();
484
- const found = await checkStore(held);
485
- if (!found.checked) return new Set();
486
- return new Set(Object.keys(found.latest).filter((k) => found.latest[k] && found.latest[k].status === 'delisted'));
487
- }
488
-
489
- async function cmdList(args, { log = console.log, errlog = console.error, gather = gatherCatalog, checkStore = gatherUpdates } = {}) {
490
- const catalogOnly = args.includes('--catalog');
491
- const json = args.includes('--json');
492
- const sIdx = args.indexOf('--search');
493
- const query = sIdx !== -1 ? (args[sIdx + 1] || '') : '';
494
- if (sIdx !== -1 && (!args[sIdx + 1] || args[sIdx + 1].startsWith('--'))) {
495
- errlog('usage: bongos module list [--catalog] [--search <text>] [--json]');
496
- return 2;
497
- }
498
-
499
- let data;
500
- try { data = gather(); }
501
- catch (e) { errlog(`bongos module list: ${e.message}`); return 1; }
502
-
503
- const delisted = await gatherDelisted(data.rows, { checkStore });
504
-
505
- if (json) {
506
- const scoped = catalogOnly ? catalog.catalogRows(data.rows) : data.rows;
507
- const modules = catalog.searchCatalog(scoped, query).map((m) => ({ ...m, store_delisted: delisted.has(m.key) }));
508
- log(JSON.stringify({ core: data.core, summary: catalog.summarize(data.rows), modules }, null, 2));
509
- return 0;
510
- }
511
-
512
- log(formatCatalog(data.rows, { catalogOnly, query, core: data.core, delisted }));
513
- for (const s of data.skipped) {
514
- errlog(` ! ${s.key}: not listed — ${s.reason}`);
515
- }
516
- for (const e of data.errors) errlog(` ! ${e.dir}: ${(e.errors || []).join('; ')}`);
517
- return 0;
518
- }
519
-
520
- // ---------------------------------------------------------------------------
521
- // bongos module check <key> — ADR 0107 §4 upstreaming pre-check + DCO sign-off
522
- // ---------------------------------------------------------------------------
523
-
524
- // The DCO-style affirmation recorded on a pass. Deliberately NOT a
525
- // copyright-assignment CLA (ADR 0065 rejects relicensing-as-capture; ADR 0107
526
- // §4 "inbound = outbound") — the contributor affirms and RETAINS copyright.
527
- const DCO_STATEMENT =
528
- 'I affirm that this contribution is my own original work, or that I have the right to ' +
529
- 'submit it, and that I license it under AGPL-3.0. This is a Developer Certificate of ' +
530
- 'Origin-style affirmation, not a copyright-assignment CLA — I retain my copyright.';
531
-
532
- // Recursively list files under dir (skip VCS/dependency noise no module should ship).
533
- function listModuleFiles(dir) {
534
- const out = [];
535
- for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
536
- if (entry.name === 'node_modules' || entry.name === '.git') continue;
537
- const full = path.join(dir, entry.name);
538
- if (entry.isDirectory()) out.push(...listModuleFiles(full));
539
- else out.push(full);
540
- }
541
- return out;
542
- }
543
-
544
- // Pure(ish) — reads modules/<key>/ off disk, no network. Returns
545
- // { key, ok, findings[], files[] }. findings are { kind, detail } — kind is
546
- // 'manifest' | 'license' | 'content'.
547
- function checkModulePublishability(key, { modulesDir = MODULES_DIR } = {}) {
548
- const dir = path.join(modulesDir, key);
549
- if (!fs.existsSync(dir)) {
550
- throw new Error(`modules/${key} does not exist under ${path.relative(REPO_ROOT, modulesDir) || '.'}`);
551
- }
552
-
553
- const findings = [];
554
- const manifestRaw = readJson(path.join(dir, 'module.json'));
555
- if (!manifestRaw) {
556
- findings.push({ kind: 'manifest', detail: 'module.json missing or unreadable' });
557
- } else {
558
- const { valid, errors } = validateManifest(manifestRaw);
559
- if (!valid) findings.push({ kind: 'manifest', detail: `module.json invalid: ${errors.join('; ')}` });
560
- const license = manifestRaw.license;
561
- if (!license || !/^AGPL-3\.0/.test(license)) {
562
- findings.push({
563
- kind: 'license',
564
- detail: `module.json license is ${license ? JSON.stringify(license) : 'unset'} — upstreaming requires ` +
565
- 'AGPL-3.0 (inbound = outbound, ADR 0107 §4)',
566
- });
567
- }
568
-
569
- // ADR 0107 §7 / ADR 0166 — the maintenance gate. Acceptance into the shared
570
- // catalog is a commitment to keep the module true as the core advances, so
571
- // the module must SAY who is committing before it can be filed for review.
572
- // The shape is already schema-validated above (a `maintained` module must
573
- // name a maintainer; a sunset one must state its path); what this adds is
574
- // that the block cannot simply be absent. Refusing here — at submit time —
575
- // is what keeps the catalog from filling with entries nobody owns.
576
- const maint = manifestRaw.maintenance;
577
- if (!maint || !maint.status) {
578
- findings.push({
579
- kind: 'maintenance',
580
- detail: 'module.json declares no `maintenance.status` — an upstreamed module must state its upkeep ' +
581
- 'posture (ADR 0107 §7): "core-maintained" (the core team owns it) or "maintained" with a named ' +
582
- '`maintainer`. A module nobody owns rots silently as the core advances.',
583
- });
584
- } else if (SUNSET_STATUSES.includes(maint.status)) {
585
- findings.push({
586
- kind: 'maintenance',
587
- detail: `module.json declares maintenance.status "${maint.status}" — a module already on its way out ` +
588
- 'cannot be submitted INTO the catalog. Upstream a maintained module, or its successor.',
589
- });
590
- }
591
- }
592
-
593
- // Classify every file AS IF it already lived at its canonical modules/<key>/
594
- // path — this is what makes the check hermetically testable against a temp
595
- // modulesDir while still reusing the REAL repo-wide denylist.
596
- const files = listModuleFiles(dir)
597
- .map((abs) => `modules/${key}/${path.relative(dir, abs).split(path.sep).join('/')}`)
598
- .sort();
599
- const denied = files.filter((f) => matchesDeny(f));
600
- if (denied.length) {
601
- findings.push({
602
- kind: 'content',
603
- detail: 'contains content the AGPL core publish boundary denies (game content, pixel art, ' +
604
- `copyrighted reference material, or instance/topology secrets): ${denied.join(', ')}`,
605
- });
606
- }
607
-
608
- return { key, ok: findings.length === 0, findings, files, denied };
609
- }
610
-
611
- // Records the sign-off ONLY once the content/license check has passed —
612
- // there is nothing to affirm over rejected content.
613
- function recordSignOff(key, signedBy, { modulesDir = MODULES_DIR } = {}) {
614
- const dir = path.join(modulesDir, key);
615
- const now = new Date().toISOString();
616
- const record = { module: key, checkedAt: now, statement: DCO_STATEMENT, signOff: { signedBy, date: now } };
617
- const file = path.join(dir, '.upstream-signoff.json');
618
- fs.writeFileSync(file, JSON.stringify(record, null, 2) + '\n');
619
- return { ...record, path: path.relative(REPO_ROOT, file) };
620
- }
621
-
622
- // Reads a previously-recorded sign-off (recordSignOff above), or null if the
623
- // module has never been signed off. Never throws on a missing/garbled file —
624
- // "no sign-off yet" is the expected common case, not an error.
625
- function readSignOff(key, { modulesDir = MODULES_DIR } = {}) {
626
- return readJson(path.join(modulesDir, key, '.upstream-signoff.json'));
627
- }
628
-
629
- // ---------------------------------------------------------------------------
630
- // bongos module submit <key> — ADR 0107 §1 upstreaming submission
631
- // ---------------------------------------------------------------------------
632
-
633
- // Packages a module for the upstreaming queue: its manifest + a full file
634
- // snapshot (base64, so binary assets round-trip identically) + whatever
635
- // sign-off is on disk. Pure fs read — no pre-check, no network; the caller
636
- // (cmdSubmit locally, the POST /modules/:key/submit route server-side) is
637
- // responsible for having already run checkModulePublishability() and for
638
- // deciding whether a missing sign-off is fatal.
639
- function packageModuleForSubmission(key, { modulesDir = MODULES_DIR } = {}) {
640
- const dir = path.join(modulesDir, key);
641
- const manifest = readJson(path.join(dir, 'module.json'));
642
- if (!manifest) throw new Error(`modules/${key}/module.json missing or unreadable`);
643
- let totalBytes = 0;
644
- const files = listModuleFiles(dir)
645
- .map((abs) => {
646
- const rel = path.relative(dir, abs).split(path.sep).join('/');
647
- const buf = fs.readFileSync(abs);
648
- totalBytes += buf.length;
649
- return { path: rel, contentBase64: buf.toString('base64'), bytes: buf.length };
650
- })
651
- .sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
652
- const signOff = readSignOff(key, { modulesDir });
653
- return { key, manifest, files, totalBytes, signOff };
654
- }
655
-
656
- // ---------------------------------------------------------------------------
657
- // Commands
658
- // ---------------------------------------------------------------------------
659
-
660
- function cmdNew(args, { log = console.log, errlog = console.error } = {}) {
661
- const key = args.find((a) => !a.startsWith('-'));
662
- const force = args.includes('--force');
663
- if (!key) {
664
- errlog('usage: bongos module new <key> (e.g. bongos module new economy)');
665
- return 2;
666
- }
667
- let res;
668
- try { res = scaffoldModule({ key, force }); }
669
- catch (e) { errlog(`bongos module new: ${e.message}`); return 1; }
670
-
671
- log(`Scaffolded module "${key}" at modules/${key}/ (no core edit needed):`);
672
- for (const f of res.files) log(` ✓ modules/${key}/${f}`);
673
- const ENVKEY = key.toUpperCase().replace(/-/g, '_');
674
- log('\nNext:');
675
- log(` • describe it — edit modules/${key}/module.json (title + description)`);
676
- log(` • credit it — fill in author/origin/maintainer in module.json (license defaults to AGPL-3.0)`);
677
- log(` • enable it — add "${key}": true to config/modules.json (or set <PREFIX>_MODULE_${ENVKEY}=1)`);
678
- log(` • build it — fill routes/${key}.js; add migrations/ + ui/ (see modules/${key}/CLAUDE.md)`);
679
- log(` • explain it — fill in every section of modules/${key}/HOWTO.md (publish refuses it until you do)`);
680
- log(' • verify — bongos upgrade (checks coreVersion compatibility)');
681
- return 0;
682
- }
683
-
684
- // ---------------------------------------------------------------------------
685
- // Available module updates — the store half of `bongos upgrade` (task 1003787)
686
- // ---------------------------------------------------------------------------
687
-
688
- // Ask the store for the newest version of every module here that carries an exact
689
- // version (the I/O half). A key the store does not know is absent from the answer,
690
- // so a module built here, or one the core ships, simply has nothing to report.
691
- // Never throws: no session or an unreachable store comes back as
692
- // { checked: false, reason }, because the compatibility pre-check must work
693
- // offline and must never fail on the store's account.
694
- async function gatherUpdates(rows, { request } = {}) {
695
- const keys = rows.filter((r) => r.version && parseVersion(String(r.version))).map((r) => r.key);
696
- if (!keys.length) return { checked: true, latest: {} };
697
- let call;
698
- try { call = request || storeRequest(); }
699
- catch (e) { return { checked: false, reason: e.message }; }
700
- let res;
701
- try { res = await call('GET', `/store/modules/latest?keys=${keys.map(encodeURIComponent).join(',')}`); }
702
- catch (e) { return { checked: false, reason: `the store could not be reached — ${e.message}` }; }
703
- // A 404 here is a server whose core predates this route, not a missing module.
704
- if (res.status === 404) return { checked: false, reason: "this server's store does not answer update checks yet (its core is older)" };
705
- if (!res.ok) return { checked: false, reason: `the store answered ${storeError(res)}` };
706
- return { checked: true, latest: (res.data && res.data.latest) || {} };
707
- }
708
-
709
- // Decide what is stale from rows + the store's answer (pure — tests drive it).
710
- // UPDATES = a module whose store version is newer than the one installed; `fits`
711
- // says whether that newer version can mount on this core (when it cannot, the
712
- // update waits for the core — it is not something to run now). DELISTED = an
713
- // installed module the store has delisted: it keeps working, but no further
714
- // versions will come (ADR 0338 D2). Neither ever blocks — an update is news, and
715
- // what blocks `bongos upgrade` is still only an incompatible ENABLED module.
716
- function evaluateUpdates(rows = [], latest = {}, core) {
717
- const { satisfies } = require('../../src/module-loader/semver');
718
- const updates = [];
719
- const delisted = [];
720
- for (const r of rows) {
721
- const store = latest[r.key];
722
- const have = r.version && parseVersion(String(r.version));
723
- if (!store || !have) continue;
724
- if (store.status === 'delisted') { delisted.push({ key: r.key, installed: r.version, enabled: r.enabled }); continue; }
725
- const next = parseVersion(String(store.version));
726
- if (!next || cmp(next, have) <= 0) continue;
727
- let fits = false;
728
- try { fits = !!(core && store.core_version && satisfies(core, store.core_version)); } catch { fits = false; }
729
- updates.push({ key: r.key, installed: r.version, latest: store.version, coreVersion: store.core_version, enabled: r.enabled, fits });
730
- }
731
- return { updates, delisted };
732
- }
733
-
734
- function reportUpdates(found, verdict, { log, errlog }) {
735
- log('\nModule updates (from the store):');
736
- if (!found.checked) {
737
- log(` not checked — ${found.reason}. The compatibility check above still stands.`);
738
- return;
739
- }
740
- const { updates, delisted } = evaluateUpdates(verdict.rows, found.latest, verdict.core);
741
- for (const u of updates) {
742
- const how = u.fits
743
- ? `run \`bongos module update ${u.key}\``
744
- : `needs core ${u.coreVersion}; this core is ${verdict.core}, so it waits until the core moves`;
745
- log(` ↑ ${u.key.padEnd(18)} ${u.installed} → ${u.latest} — ${how}`);
746
- }
747
- for (const d of delisted) {
748
- errlog(` ! ${d.key.padEnd(18)} ${d.installed} — delisted in the store: it keeps working, but no further versions will come`);
749
- }
750
- if (!updates.length && !delisted.length) log(' every installed store module is on its newest version.');
751
- }
752
-
753
- async function cmdUpgrade(args = [], { log = console.log, errlog = console.error, gather = gatherUpgrade, checkUpdates = gatherUpdates } = {}) {
754
- const data = gather();
755
- const verdict = evaluateUpgrade(data);
756
-
757
- log('bongos upgrade — module compatibility pre-check');
758
- log(` core (src/module-api.js CORE_VERSION): ${verdict.core}`);
759
-
760
- if (!verdict.rows.length && !data.errors.length) {
761
- log(' no modules discovered under modules/ — nothing to check.');
762
- return 0;
763
- }
764
- for (const r of verdict.rows) {
765
- const mark = r.satisfied ? '✓' : (r.enabled ? '✗' : '!');
766
- const state = r.enabled ? 'enabled' : 'disabled';
767
- let note = '';
768
- if (!r.satisfied) {
769
- // A DISABLED mismatch is harmless to THIS boot, but it is not harmless to
770
- // the catalog — it is a rotted entry with an owner who needs telling
771
- // (ADR 0166). Name that owner right here rather than shrugging at it.
772
- note = ` — coreVersion ${r.coreVersion || '(none)'} not satisfied by core ${verdict.core}` +
773
- (r.enabled ? ' — will NOT mount' : ' — disabled, so it does not block this boot, but it is BROKEN if enabled') +
774
- `\n ↳ ${formatMaintenanceHint(r)}`;
775
- }
776
- log(` ${mark} ${r.key.padEnd(18)} ${String(r.coreVersion || '').padEnd(10)} ${state}${note}`);
777
- }
778
- for (const e of data.errors) errlog(` ! ${e.dir}: ${(e.errors || []).join('; ')}`);
779
-
780
- // Deprecation roll-up (ADR 0166) — separate from compatibility: a module can
781
- // satisfy the core perfectly and still be on its way out.
782
- for (const d of verdict.deprecations) {
783
- const overdue = verdict.expired.includes(d);
784
- errlog(` ${overdue ? '✗' : '!'} ${d.key}: ${d.maintenance.status}${overdue ? ` — PAST removeAfter ${d.maintenance.removeAfter} (core is ${verdict.core}); it is due for removal` : ''}`);
785
- errlog(` ↳ ${formatMaintenanceHint(d)}`);
786
- }
787
- if (verdict.undeclared.length) {
788
- errlog(` ! ${verdict.undeclared.length} module(s) declare no \`maintenance\` block — nobody is on the hook for them as the core advances (ADR 0166): ${verdict.undeclared.map((r) => r.key).join(', ')}`);
789
- }
790
-
791
- // What is stale here, beside what is broken: the store's newer versions of the
792
- // modules installed from it. Reported either way, and it never changes the exit
793
- // code. `--no-store` skips the read (offline, or a CI pre-check).
794
- if (!args.includes('--no-store')) reportUpdates(await checkUpdates(verdict.rows), verdict, { log, errlog });
795
-
796
- if (!verdict.ok) {
797
- errlog(`\nREFUSING: ${verdict.blocking.length} enabled module(s) incompatible with core ${verdict.core}: ${verdict.blocking.map((b) => b.key).join(', ')}.`);
798
- errlog(`Widen each module's coreVersion to a range that includes ${verdict.core} (or hold the core upgrade) before proceeding.`);
799
- return 1;
800
- }
801
- log(`\nOK — every enabled module satisfies core ${verdict.core}.`);
802
- return 0;
803
- }
804
-
805
- function cmdCheck(args, { log = console.log, errlog = console.error, check = checkModulePublishability, sign = recordSignOff, howtoCheck } = {}) {
806
- const key = args.find((a) => !a.startsWith('-'));
807
- if (!key) {
808
- errlog('usage: bongos module check <key> [--sign-off "Name <email>"]');
809
- return 2;
810
- }
811
- const signIdx = args.indexOf('--sign-off');
812
- const signedBy = signIdx !== -1 ? args[signIdx + 1] : null;
813
-
814
- let result;
815
- try { result = check(key); }
816
- catch (e) { errlog(`bongos module check: ${e.message}`); return 1; }
817
-
818
- log(`bongos module check — upstreaming pre-check for "${key}"`);
819
- if (result.ok) {
820
- log(' ✓ AGPL/publish pre-check passed — no denied content, license is AGPL-3.0, upkeep is declared.');
821
- } else {
822
- for (const f of result.findings) errlog(` ✗ ${f.kind}: ${f.detail}`);
823
- }
824
-
825
- // The store's how-to gate (ADR 0347 D4), reported here so an author learns early.
826
- // Advisory only: it gates `bongos module publish`, never an upstream submit.
827
- const { checkHowto, HOWTO_FILE } = require('./module-artifact');
828
- const howto = (howtoCheck || ((k) => checkHowto(readText(path.join(MODULES_DIR, k, HOWTO_FILE)))))(key);
829
- if (howto.ok) log(` ✓ ${HOWTO_FILE} has every required section — ready for \`bongos module publish\`.`);
830
- else for (const p of howto.problems) log(` ! ${p} — needed before \`bongos module publish\` (not for an upstream submit)`);
831
-
832
- if (!result.ok) {
833
- errlog(`\nREFUSING: "${key}" is not clear to submit upstream. Fix the finding(s) above and re-run.`);
834
- return 1;
835
- }
836
-
837
- if (signedBy) {
838
- const record = sign(key, signedBy);
839
- log(`\nSign-off recorded — ${record.path}`);
840
- log(` "${record.signOff.signedBy}", ${record.signOff.date}`);
841
- } else {
842
- log('\nNo --sign-off given — pass --sign-off "Name <email>" to affirm + record the DCO-style sign-off.');
843
- }
844
- return 0;
845
- }
846
-
847
- // `bongos module submit <key>` — ADR 0107 §1. Runs the §4 pre-check + requires
848
- // a sign-off (locally, for fast refusal without a network round trip), then
849
- // POSTs to POST /modules/:key/submit — the SAME route the hall "Modules" tab's
850
- // submit button calls (src/bongos/routes/modules.js). That route re-runs the
851
- // pre-check against ITS OWN on-disk copy of the module and is the authoritative
852
- // gate: a local pass here is a courtesy, not a guarantee, if the module's
853
- // changes aren't committed + shipped + deployed yet.
854
- async function cmdSubmit(args, {
855
- log = console.log, errlog = console.error,
856
- check = checkModulePublishability, sign = recordSignOff, readSign = readSignOff,
857
- submit,
858
- } = {}) {
859
- const key = args.find((a) => !a.startsWith('-'));
860
- if (!key) {
861
- errlog('usage: bongos module submit <key> [--sign-off "Name <email>"]');
862
- return 2;
863
- }
864
- const signIdx = args.indexOf('--sign-off');
865
- const signedBy = signIdx !== -1 ? args[signIdx + 1] : null;
866
-
867
- log(`bongos module submit — upstreaming "${key}" (ADR 0107 §1)`);
868
-
869
- let result;
870
- try { result = check(key); }
871
- catch (e) { errlog(`bongos module submit: ${e.message}`); return 1; }
872
-
873
- if (!result.ok) {
874
- for (const f of result.findings) errlog(` ✗ ${f.kind}: ${f.detail}`);
875
- errlog(`\nREFUSING: "${key}" is not clear to submit upstream. Fix the finding(s) above and re-run.`);
876
- return 1;
877
- }
878
- log(' ✓ AGPL/publish pre-check passed.');
879
-
880
- let signOff = readSign(key);
881
- if (!signOff && signedBy) {
882
- const record = sign(key, signedBy);
883
- log(` ✓ Sign-off recorded — ${record.path}`);
884
- signOff = readSign(key);
885
- }
886
- if (!signOff) {
887
- errlog(`\nREFUSING: no DCO-style sign-off on file for "${key}". Pass --sign-off "Name <email>" (or run \`bongos module check ${key} --sign-off "Name <email>"\` first).`);
888
- return 1;
889
- }
890
- log(` ✓ Sign-off on file — "${signOff.signOff.signedBy}", ${signOff.signOff.date}.`);
891
-
892
- const doSubmit = submit || (async (k, body) => {
893
- // Lazy require: cli-lib.js carries session/fetch plumbing that must NEVER
894
- // load into the always-on server process — this file is also required by
895
- // src/bongos/routes/modules.js for the pre-check it reuses. A real network
896
- // call only happens when a human/agent actually invokes this CLI command.
897
- const { cliClient, requireSession } = require('./cli-lib');
898
- await requireSession();
899
- const api = await cliClient();
900
- return api.modules.postModulesKeySubmit({ key: k, body });
901
- });
902
-
903
- let res;
904
- try { res = await doSubmit(key, { signed_by: signedBy || undefined }); }
905
- catch (e) { errlog(`bongos module submit: request failed — ${e.message}`); return 1; }
906
-
907
- if (!res.ok) {
908
- const detail = (res.data && (res.data.message || res.data.error)) || JSON.stringify(res.data);
909
- errlog(`\nREFUSING: the review queue rejected the submission (HTTP ${res.status}): ${detail}`);
910
- if (res.status === 422) errlog('(the server re-runs the pre-check/sign-off check against its OWN deployed copy — commit + ship first if this module has local-only changes.)');
911
- return 1;
912
- }
913
-
914
- const submission = res.data && res.data.submission;
915
- log(`\n✓ Filed — submission id ${submission ? submission.id : '?'} for "${key}", status ${submission ? submission.status : 'pending'}.`);
916
- log('Task 1771 (core-side review & accept flow) picks it up from here.');
917
- return 0;
918
- }
919
-
920
- // ---------------------------------------------------------------------------
921
- // bongos module publish <key> — put a module version in the store (ADR 0338 D1)
922
- // ---------------------------------------------------------------------------
923
-
924
- // `bongos module publish <key>` — task 1004271. Packs modules/<key>/ into the
925
- // store's tarball + hash manifest (scripts/gds/module-artifact.js — the core
926
- // release's own format, through the publish denylist), then uploads it to
927
- // POST /store/modules/:key/versions, which re-verifies every hash itself and
928
- // records the version. `--dry-run` packs and reports without uploading;
929
- // `--out <dir>` also writes the tarball and its side-car manifest there.
930
- // Distinct from `submit`, which proposes a module INTO core (ADR 0135).
931
- async function cmdPublish(args, {
932
- log = console.log, errlog = console.error,
933
- modulesDir = MODULES_DIR, pack, upload, writeFile = fs.writeFileSync,
934
- } = {}) {
935
- const key = args.find((a, i) => !a.startsWith('-') && args[i - 1] !== '--out');
936
- if (!key) {
937
- errlog('usage: bongos module publish <key> [--dry-run] [--out <dir>]');
938
- return 2;
939
- }
940
- const dryRun = args.includes('--dry-run');
941
- const outIdx = args.indexOf('--out');
942
- const outDir = outIdx !== -1 ? args[outIdx + 1] : null;
943
- if (outIdx !== -1 && (!outDir || outDir.startsWith('--'))) {
944
- errlog('usage: bongos module publish <key> [--dry-run] [--out <dir>]');
945
- return 2;
946
- }
947
-
948
- const artifact = require('./module-artifact');
949
- let packed;
950
- try { packed = (pack || ((k) => artifact.packModule(k, { modulesDir })))(key); }
951
- catch (e) { errlog(`REFUSING: ${e.message}`); return 1; }
952
- const { tgz, sidecar } = packed;
953
- log(`bongos module publish — "${key}" ${sidecar.module_version} (needs core ${sidecar.core_version})`);
954
- // The how-to gate (ADR 0347 D4) — the same checker the store re-runs on upload.
955
- const howto = artifact.checkHowto(readText(path.join(modulesDir, key, artifact.HOWTO_FILE)));
956
- if (!howto.ok) {
957
- for (const p of howto.problems) errlog(` ✗ ${p}`);
958
- errlog(`REFUSING: "${key}" needs a complete ${artifact.HOWTO_FILE} before it can be published — fill in the section(s) above.`);
959
- return 1;
960
- }
961
- log(` ✓ ${artifact.HOWTO_FILE} has all ${artifact.HOWTO_SECTIONS.length} required sections`);
962
- log(` ✓ packed ${sidecar.file_count} file(s), ${tgz.length} bytes — tree ${sidecar.tree_sha256.slice(0, 12)}…`);
963
- if (tgz.length > artifact.MAX_TARBALL_BYTES) {
964
- errlog(`REFUSING: the tarball is ${tgz.length} bytes, over the store's ${artifact.MAX_TARBALL_BYTES}-byte cap.`);
965
- return 1;
966
- }
967
-
968
- if (outDir) {
969
- fs.mkdirSync(outDir, { recursive: true });
970
- const tgzPath = path.join(outDir, sidecar.tarball.name);
971
- writeFile(tgzPath, tgz);
972
- writeFile(tgzPath.replace(/\.tgz$/, '.manifest.json'), JSON.stringify(sidecar, null, 2) + '\n');
973
- log(` ✓ wrote ${tgzPath} (+ .manifest.json)`);
974
- }
975
- if (dryRun) {
976
- log('\n--dry-run: nothing uploaded.');
977
- return 0;
978
- }
979
-
980
- const doUpload = upload || (async (k, body) => {
981
- // Lazy require — the same reason cmdSubmit gives: this file loads in the server
982
- // process too, and cli-lib's session/fetch plumbing must never come with it.
983
- const { readSessionToken, dispatchedFetch, noKeepAliveDispatcher, CLI_USER_AGENT } = require('./cli-lib');
984
- const session = readSessionToken();
985
- if (!session) throw new Error('no Bongos session — run `bongos setup` first');
986
- const res = await dispatchedFetch(`${session.apiBase}/api/bongos/store/modules/${encodeURIComponent(k)}/versions`, {
987
- method: 'POST',
988
- headers: { 'Content-Type': 'application/gzip', Authorization: `Bearer ${session.token}`, 'User-Agent': CLI_USER_AGENT },
989
- body,
990
- dispatcher: noKeepAliveDispatcher(),
991
- });
992
- const text = await res.text();
993
- let data;
994
- try { data = text ? JSON.parse(text) : null; } catch { data = { raw: text }; }
995
- return { status: res.status, ok: res.ok, data };
996
- });
997
-
998
- let res;
999
- try { res = await doUpload(key, tgz); }
1000
- catch (e) { errlog(`bongos module publish: upload failed — ${e.message}`); return 1; }
1001
- if (!res.ok) {
1002
- const err = res.data && (res.data.error || res.data);
1003
- const detail = (err && (err.message || err.code)) || JSON.stringify(res.data);
1004
- errlog(`\nREFUSING: the store rejected "${key}" ${sidecar.module_version} (HTTP ${res.status}): ${detail}`);
1005
- return 1;
1006
- }
1007
- const row = res.data && res.data.version;
1008
- log(`\n✓ Published "${key}" ${row ? row.version : sidecar.module_version} to the store${res.data && res.data.created_module ? ' — its first version, so you are its author' : ''}.`);
1009
- if (res.data && res.data.channel === 'tester') {
1010
- log(' It goes to testing projects first, and reaches every project once it has been tested (ADR 0344).');
1011
- }
1012
- return 0;
1013
- }
1014
-
1015
- // ---------------------------------------------------------------------------
1016
- // bongos module install <key> — acquire a module from the store (ADR 0338 D1)
1017
- // ---------------------------------------------------------------------------
1018
-
1019
- // The store half of the CLI, over three calls (src/bongos/routes/modules.js):
1020
- // acquire (take the entitlement, learn the version), download the tarball, and
1021
- // once the files are placed, record the version acquired. Injected in tests.
1022
- function storeRequest() {
1023
- // Lazy require — cli-lib's session/fetch plumbing must never load in the server
1024
- // process, which requires this file too (the same reason cmdPublish gives).
1025
- const { readSessionToken, dispatchedFetch, noKeepAliveDispatcher, CLI_USER_AGENT } = require('./cli-lib');
1026
- const session = readSessionToken();
1027
- if (!session) throw new Error('no Bongos session — run `bongos setup` first');
1028
- const call = async (method, urlPath, { json, binary = false } = {}) => {
1029
- const res = await dispatchedFetch(`${session.apiBase}/api/bongos${urlPath}`, {
1030
- method,
1031
- headers: {
1032
- Authorization: `Bearer ${session.token}`, 'User-Agent': CLI_USER_AGENT,
1033
- ...(json ? { 'Content-Type': 'application/json' } : {}),
1034
- },
1035
- body: json ? JSON.stringify(json) : undefined,
1036
- dispatcher: noKeepAliveDispatcher(),
1037
- });
1038
- if (binary && res.ok) return { ok: true, status: res.status, buf: Buffer.from(await res.arrayBuffer()) };
1039
- const text = await res.text();
1040
- let data;
1041
- try { data = text ? JSON.parse(text) : null; } catch { data = { raw: text }; }
1042
- return { ok: res.ok, status: res.status, data };
1043
- };
1044
- // Where the store lives, so install can print a full link to the how-to page.
1045
- call.apiBase = session.apiBase;
1046
- return call;
1047
- }
1048
-
1049
- // The hall page that shows a version's HOWTO.md (task 1004366) — the Modules tab,
1050
- // opened on one version. null when the version shipped without one (published
1051
- // before ADR 0347's gate), so install never prints a link that would 404.
1052
- function howtoLink(key, version, files, apiBase) {
1053
- if (!files.some((f) => f.path === 'HOWTO.md')) return null;
1054
- const p = `/builders/modules?howto=${encodeURIComponent(key)}&version=${encodeURIComponent(version)}`;
1055
- return apiBase ? `${String(apiBase).replace(/\/+$/, '')}${p}` : p;
1056
- }
1057
-
1058
- function storeError(res) {
1059
- const err = res.data && (res.data.error || res.data);
1060
- return (err && (err.message || err.code)) || `HTTP ${res.status}`;
1061
- }
1062
-
1063
- // Where install places a module: the INSTANCE's own modules/ root (ADR 0108 §1),
1064
- // which the loader discovers. In a single checkout that is this repo's modules/.
1065
- function instanceModulesDir() {
1066
- return path.join(require('../../src/instance-config').resolveInstanceRoot(), 'modules');
1067
- }
1068
-
1069
- // Write the verified files into a private staging dir beside the target, then
1070
- // rename it into place, so a crash leaves a staging dir to delete, never a
1071
- // half-written module the loader would try to mount.
1072
- function placeModule(files, target) {
1073
- const staging = `${target}.installing-${process.pid}-${Date.now()}`;
1074
- fs.mkdirSync(staging, { recursive: true });
1075
- try {
1076
- for (const f of files) {
1077
- const dest = path.join(staging, ...f.path.split('/'));
1078
- if (!dest.startsWith(staging + path.sep)) throw new Error(`"${f.path}" would land outside the module`);
1079
- fs.mkdirSync(path.dirname(dest), { recursive: true });
1080
- fs.writeFileSync(dest, f.buf, { mode: parseInt(f.mode, 8) || 0o644 });
1081
- }
1082
- fs.renameSync(staging, target);
1083
- } catch (e) {
1084
- fs.rmSync(staging, { recursive: true, force: true });
1085
- throw e;
1086
- }
1087
- }
1088
-
1089
- // Every discovery root the loader scans (core + instance, ADR 0108 §1). A key on
1090
- // disk in ANY of them is already taken: the loader treats a repeated key as a hard
1091
- // error, so placing a second copy in the instance root would break boot.
1092
- function discoveryRoots() {
1093
- return require('../../src/module-loader/loader').DEFAULT_ROOTS;
1094
- }
1095
-
1096
- // Parse `<key> [--version X.Y.Z]` for install and update. Returns { key, wanted }
1097
- // or { code } (2 = usage) after printing why.
1098
- function parseStoreArgs(args, verb, errlog) {
1099
- const usage = `usage: bongos module ${verb} <key> [--version X.Y.Z]`;
1100
- const vIdx = args.indexOf('--version');
1101
- const wanted = vIdx !== -1 ? args[vIdx + 1] : null;
1102
- const key = args.find((a, i) => !a.startsWith('-') && args[i - 1] !== '--version');
1103
- if (!key || (vIdx !== -1 && (!wanted || wanted.startsWith('--')))) { errlog(usage); return { code: 2 }; }
1104
- if (!KEY_RE.test(key)) { errlog(`REFUSING: "${key}" is not a module key (lowercase kebab-case).`); return { code: 2 }; }
1105
- const { parseVersion } = require('../../src/module-loader/semver');
1106
- if (wanted && !parseVersion(wanted)) { errlog(`REFUSING: --version must be exact X.Y.Z, not "${wanted}".`); return { code: 2 }; }
1107
- return { key, wanted };
1108
- }
1109
-
1110
- // The one acquisition path install AND update share (task 1003786): acquire, check
1111
- // the version can mount on this core, download, verify with verifyModuleArtifact and
1112
- // hold the bytes to what the store described. Nothing here reads a price or branches
1113
- // on how the module was obtained — the store decides entitlement, and a holder it has
1114
- // already granted (for any reason) is never asked again. tests/module_update.mjs
1115
- // fails if a price-conditional branch appears in this path.
1116
- //
1117
- // `shouldDownload(described)` lets update stop before the download when the store's
1118
- // version is not newer than what is installed. Resolves { ok, described, verified }
1119
- // or { ok: false, code, upToDate? } after printing why.
1120
- async function fetchVerified(key, { wanted, call, core, log, errlog, verb, shouldDownload = () => true }) {
1121
- const fail = (code, msg) => { if (msg) errlog(msg); return { ok: false, code }; };
1122
- const enc = encodeURIComponent(key);
1123
- let acq;
1124
- try { acq = await call('POST', `/store/modules/${enc}/acquire`, { json: wanted ? { version: wanted } : {} }); }
1125
- catch (e) { return fail(1, `bongos module ${verb}: the store could not be reached — ${e.message}`); }
1126
- if (!acq.ok) return fail(1, `REFUSING: the store would not hand over "${key}" (HTTP ${acq.status}): ${storeError(acq)}`);
1127
- const described = acq.data;
1128
- log(`bongos module ${verb} — "${key}" ${described.version} (needs core ${described.core_version})`);
1129
-
1130
- const stop = shouldDownload(described);
1131
- if (stop !== true) return { ok: false, code: stop.code, upToDate: stop.upToDate };
1132
-
1133
- const { satisfies } = require('../../src/module-loader/semver');
1134
- const coreV = core || require('../../src/module-api').CORE_VERSION;
1135
- if (!satisfies(coreV, described.core_version)) {
1136
- return fail(1, `REFUSING: "${key}" ${described.version} needs core ${described.core_version}; this core is ${coreV}, so it could not mount.`);
1137
- }
1138
-
1139
- let dl;
1140
- try { dl = await call('GET', `/store/modules/${enc}/versions/${encodeURIComponent(described.version)}/tarball`, { binary: true }); }
1141
- catch (e) { return fail(1, `bongos module ${verb}: download failed — ${e.message}`); }
1142
- if (!dl.ok) return fail(1, `REFUSING: the download was refused (HTTP ${dl.status}): ${storeError(dl)}`);
1143
-
1144
- const artifact = require('./module-artifact');
1145
- const verified = await artifact.verifyModuleArtifact(dl.buf, { key, includeFiles: true });
1146
- if (!verified.ok) {
1147
- await reportInstall(call, key, described.version, 'verify_failed');
1148
- return fail(1, `REFUSING: the downloaded tarball failed verification (${verified.code}): ${verified.message}`);
1149
- }
1150
- if (verified.version !== described.version || verified.tarballSha256 !== described.tarball_sha256 || verified.treeSha256 !== described.tree_sha256) {
1151
- await reportInstall(call, key, described.version, 'hash_mismatch');
1152
- return fail(1, `REFUSING: the download is not the ${described.version} the store described (version or hash differs).`);
1153
- }
1154
- log(` ✓ verified ${verified.files.length} file(s), ${verified.bytes} bytes — tree ${verified.treeSha256.slice(0, 12)}…`);
1155
- return { ok: true, described, verified };
1156
- }
1157
-
1158
- // Tell the store whether an install or update of this exact version worked (task
1159
- // 1003793): it feeds the module's Install score, the part an author cannot fake.
1160
- // Counts only — yes, or a short code saying where it failed; never a message, a
1161
- // path or anything about this machine (owner's privacy posture, 2026-10-01). The
1162
- // store drops it if the caller switched reporting off in Settings, so there is no
1163
- // client-side switch to keep in step. Best-effort and silent: a report that does
1164
- // not arrive changes nothing about the install. Only failures that are the
1165
- // module's own count: a refused or unreachable store, or a core the module does
1166
- // not support, says nothing about the module and is not reported.
1167
- async function reportInstall(call, key, version, errorCode = null) {
1168
- const body = errorCode ? { ok: false, error_code: errorCode } : { ok: true };
1169
- try {
1170
- await call('POST', `/store/modules/${encodeURIComponent(key)}/versions/${encodeURIComponent(version)}/install-report`, { json: body });
1171
- } catch { /* best-effort */ }
1172
- }
1173
-
1174
- // Tell the store which exact version was placed. A failure here never undoes the
1175
- // placement: the files are good, and the next install or update records it.
1176
- async function recordPlaced(key, version, { call, errlog, verb }) {
1177
- let rec;
1178
- try { rec = await call('POST', `/store/modules/${encodeURIComponent(key)}/acquired`, { json: { version } }); }
1179
- catch (e) { rec = { ok: false, status: 0, data: { error: { message: e.message } } }; }
1180
- if (!rec.ok) {
1181
- errlog(`WARNING: "${key}" is ${verb === 'update' ? 'updated' : 'installed'}, but the store did not record the version (${storeError(rec)}). Nothing is lost; the next install or update records it.`);
1182
- return false;
1183
- }
1184
- return true;
1185
- }
1186
-
1187
- // `bongos module install <key> [--version X.Y.Z]` — task 1003785. Acquires the
1188
- // module (a free one is granted on the spot; a priced one waits on the buy action,
1189
- // area 8), downloads its tarball, verifies it with verifyModuleArtifact — the one
1190
- // checker the store itself uses on publish — and places it under the instance's
1191
- // modules/. It never enables: the loader discovers what is on disk and the hall's
1192
- // Modules tab decides what mounts. A key already on disk in ANY discovery root is
1193
- // refused; moving an installed module to a newer version is `update` (task 1003786).
1194
- async function cmdInstall(args, {
1195
- log = console.log, errlog = console.error,
1196
- modulesDir, roots, request, core,
1197
- } = {}) {
1198
- const parsed = parseStoreArgs(args, 'install', errlog);
1199
- if (parsed.code) return parsed.code;
1200
- const { key, wanted } = parsed;
1201
-
1202
- const dir = modulesDir || instanceModulesDir();
1203
- const target = path.join(dir, key);
1204
- const taken = [dir, ...(roots || discoveryRoots())].map((r) => path.join(r, key)).find((p) => fs.existsSync(p));
1205
- if (taken) {
1206
- errlog(`REFUSING: "${key}" is already on disk at ${taken}. Install only adds a new module; to move an installed one forward, run \`bongos module update ${key}\`.`);
1207
- return 1;
1208
- }
1209
-
1210
- let call;
1211
- try { call = request || storeRequest(); }
1212
- catch (e) { errlog(`bongos module install: ${e.message}`); return 1; }
1213
-
1214
- const got = await fetchVerified(key, { wanted, call, core, log, errlog, verb: 'install' });
1215
- if (!got.ok) return got.code;
1216
-
1217
- try { placeModule(got.verified.files, target); }
1218
- catch (e) { await reportInstall(call, key, got.described.version, 'place_failed'); errlog(`bongos module install: could not place the module — ${e.message}`); return 1; }
1219
- log(` ✓ placed at ${target}`);
1220
-
1221
- const recorded = await recordPlaced(key, got.described.version, { call, errlog, verb: 'install' });
1222
- await reportInstall(call, key, got.described.version);
1223
- if (!recorded) return 1;
1224
- log(`\n✓ Installed "${key}" ${got.described.version}. It is not switched on: enable it from the hall's Modules tab when you want it.`);
1225
- const howto = howtoLink(key, got.described.version, got.verified.files, call.apiBase);
1226
- if (howto) log(` How to use it: ${howto}`);
1227
- return 0;
1228
- }
1229
-
1230
- // Replace an installed module's directory with a verified new one. The new files
1231
- // are written to a staging dir first; the old dir is moved aside, the new one moved
1232
- // in, and only then is the old one removed — so a failure at any step leaves the
1233
- // previous version in place, never a half-written or missing module.
1234
- function replaceModule(files, target) {
1235
- const aside = `${target}.previous-${process.pid}-${Date.now()}`;
1236
- const staging = `${target}.installing-${process.pid}-${Date.now()}`;
1237
- placeModule(files, staging);
1238
- try {
1239
- fs.renameSync(target, aside);
1240
- } catch (e) {
1241
- fs.rmSync(staging, { recursive: true, force: true });
1242
- throw e;
1243
- }
1244
- try {
1245
- fs.renameSync(staging, target);
1246
- } catch (e) {
1247
- fs.renameSync(aside, target);
1248
- fs.rmSync(staging, { recursive: true, force: true });
1249
- throw e;
1250
- }
1251
- fs.rmSync(aside, { recursive: true, force: true });
1252
- }
1253
-
1254
- // `bongos module update <key> [--version X.Y.Z]` — task 1003786. Moves an installed
1255
- // store module forward, through exactly the acquisition path install uses
1256
- // (fetchVerified): the same calls whether the module was free or paid, and a module
1257
- // the caller already holds is never charged again (the store's acquire route only
1258
- // looks at price for a caller with no entitlement). Only forward: with no --version
1259
- // it takes the newest, and says so without downloading when that is not newer; an
1260
- // older --version is refused, since rolling back is a different act. Like install it
1261
- // never enables or disables — the module keeps whatever switch it had.
1262
- async function cmdUpdate(args, {
1263
- log = console.log, errlog = console.error,
1264
- modulesDir, roots, request, core,
1265
- } = {}) {
1266
- const parsed = parseStoreArgs(args, 'update', errlog);
1267
- if (parsed.code) return parsed.code;
1268
- const { key, wanted } = parsed;
1269
-
1270
- const dir = modulesDir || instanceModulesDir();
1271
- const target = path.join(dir, key);
1272
- if (!fs.existsSync(path.join(target, 'module.json'))) {
1273
- const bundled = (roots || discoveryRoots()).map((r) => path.join(r, key)).find((p) => p !== target && fs.existsSync(p));
1274
- errlog(bundled
1275
- ? `REFUSING: "${key}" at ${bundled} comes with the core, not the store. It updates when the core does (\`bongos upgrade\`).`
1276
- : `REFUSING: "${key}" is not installed here. Run \`bongos module install ${key}\` first.`);
1277
- return 1;
1278
- }
1279
- const { parseVersion, cmp } = require('../../src/module-loader/semver');
1280
- let installed;
1281
- try { installed = JSON.parse(fs.readFileSync(path.join(target, 'module.json'), 'utf8')).version; }
1282
- catch (e) { errlog(`REFUSING: could not read the installed ${key}/module.json — ${e.message}`); return 1; }
1283
- const have = parseVersion(String(installed));
1284
- if (!have) { errlog(`REFUSING: the installed "${key}" has no exact version in module.json, so there is nothing to compare against.`); return 1; }
1285
- if (wanted && cmp(parseVersion(wanted), have) < 0) {
1286
- errlog(`REFUSING: ${wanted} is older than the installed ${installed}. Update only moves forward.`);
1287
- return 1;
1288
- }
1289
-
1290
- let call;
1291
- try { call = request || storeRequest(); }
1292
- catch (e) { errlog(`bongos module update: ${e.message}`); return 1; }
1293
-
1294
- const got = await fetchVerified(key, {
1295
- wanted, call, core, log, errlog, verb: 'update',
1296
- shouldDownload: (d) => {
1297
- const next = parseVersion(String(d.version));
1298
- if (next && cmp(next, have) > 0) return true;
1299
- log(`\n✓ "${key}" is up to date at ${installed}.`);
1300
- return { code: 0, upToDate: true };
1301
- },
1302
- });
1303
- if (!got.ok) return got.code;
1304
-
1305
- try { replaceModule(got.verified.files, target); }
1306
- catch (e) { await reportInstall(call, key, got.described.version, 'place_failed'); errlog(`bongos module update: could not replace the module, ${installed} is still in place — ${e.message}`); return 1; }
1307
- log(` ✓ replaced ${installed} with ${got.described.version} at ${target}`);
1308
-
1309
- const recorded = await recordPlaced(key, got.described.version, { call, errlog, verb: 'update' });
1310
- await reportInstall(call, key, got.described.version);
1311
- if (!recorded) return 1;
1312
- log(`\n✓ Updated "${key}" ${installed} → ${got.described.version}. Its on/off switch is unchanged.`);
1313
- return 0;
1314
- }
1315
-
1316
- function printHelp(out = console.log) {
1317
- out('bongos module — scaffold + manage Cloud Bongos modules\n');
1318
- out('Usage:');
1319
- out(' bongos module new <key> Scaffold modules/<key>/ (manifest + skeleton + sample route + HOWTO.md + CLAUDE.md)');
1320
- out(' bongos module list [--catalog] [--search <text>] [--json]');
1321
- out(' Browse the module catalog — what you can enable, with author + origin credit');
1322
- out(' bongos upgrade [--no-store] Pre-check enabled modules against the core version (fail-closed),');
1323
- out(' then list newer store versions of installed modules (never blocks)');
1324
- out(' bongos module check <key> [--sign-off "Name <email>"]');
1325
- out(' AGPL/publish pre-check before upstreaming + record a DCO-style sign-off');
1326
- out(' bongos module submit <key> [--sign-off "Name <email>"]');
1327
- out(' Pre-check + sign-off, then file into the rank-gated upstreaming review queue');
1328
- out(' bongos module publish <key> [--dry-run] [--out <dir>]');
1329
- out(' Pack a module version (tarball + hash manifest) and upload it to the module store');
1330
- out(' bongos module install <key> [--version X.Y.Z]');
1331
- out(' Acquire a module from the store, verify it and place it under modules/ (not enabled)');
1332
- out(' bongos module update <key> [--version X.Y.Z]');
1333
- out(' Move an installed store module to a newer version (same path, paid or free)');
1334
- }
1335
-
1336
- async function main(argv) {
1337
- const args = argv.slice(2);
1338
- const sub = args[0];
1339
- if (sub === 'new') return cmdNew(args.slice(1));
1340
- if (sub === 'list' || sub === 'ls') return cmdList(args.slice(1));
1341
- if (sub === 'upgrade') return cmdUpgrade(args.slice(1));
1342
- if (sub === 'check') return cmdCheck(args.slice(1));
1343
- if (sub === 'submit') return cmdSubmit(args.slice(1));
1344
- if (sub === 'publish') return cmdPublish(args.slice(1));
1345
- if (sub === 'install') return cmdInstall(args.slice(1));
1346
- if (sub === 'update') return cmdUpdate(args.slice(1));
1347
- if (!sub || sub === 'help' || sub === '--help' || sub === '-h') {
1348
- printHelp();
1349
- return sub ? 0 : 2;
1350
- }
1351
- console.error(`bongos module: unknown subcommand "${sub}"`);
1352
- printHelp(console.error);
1353
- return 2;
1354
- }
1355
-
1356
- module.exports = {
1357
- main, cmdNew, cmdList, cmdUpgrade, cmdCheck, cmdSubmit, cmdPublish, cmdInstall, cmdUpdate, printHelp,
1358
- storeRequest,
1359
- gatherCatalog, formatCatalog, ownProjectName,
1360
- scaffoldModule, gatherUpgrade, evaluateUpgrade, gatherUpdates, evaluateUpdates, buildManifest,
1361
- formatMaintenanceHint, isPastRemoveAfter,
1362
- checkModulePublishability, recordSignOff, readSignOff, DCO_STATEMENT,
1363
- listModuleFiles, packageModuleForSubmission,
1364
- routeTemplate, claudeMdTemplate, titleize, camel, coreVersion,
1365
- MODULES_DIR,
1366
- };
1367
-
1368
- if (require.main === module) {
1369
- // Set the exit code and drain, never a hard exit: install, update and upgrade end
1370
- // after a store request, and a hard exit there aborts natively on Windows + Node 24
1371
- // (task 1002734).
1372
- Promise.resolve(main(process.argv)).then(
1373
- (code) => { process.exitCode = code; },
1374
- (e) => { console.error(e); process.exit(1); }
1375
- );
1376
- }
7
+ require('../bongos/forwarder.js').forward(module, 'module.js');