@bongos/core 1.21.175 → 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.
- package/.bongos-core.json +3551 -1516
- package/.claude/skills/ask-for-help/SKILL.md +4 -4
- package/.claude/skills/backlog-review/SKILL.md +1 -1
- package/.claude/skills/blocker-review/SKILL.md +2 -2
- package/.claude/skills/blocker-solve/SKILL.md +4 -4
- package/.claude/skills/bongos-feedback/SKILL.md +1 -1
- package/.claude/skills/bug-triage/SKILL.md +8 -8
- package/.claude/skills/builder-backup/SKILL.md +3 -3
- package/.claude/skills/builder-claim/SKILL.md +5 -5
- package/.claude/skills/builder-cost/SKILL.md +5 -5
- package/.claude/skills/builder-end/SKILL.md +6 -6
- package/.claude/skills/builder-exit/SKILL.md +2 -2
- package/.claude/skills/builder-key/SKILL.md +6 -6
- package/.claude/skills/builder-reauth/SKILL.md +4 -4
- package/.claude/skills/builder-redteam/SKILL.md +3 -3
- package/.claude/skills/builder-release/SKILL.md +3 -3
- package/.claude/skills/builder-sequence/SKILL.md +8 -8
- package/.claude/skills/builder-setup/SKILL.md +4 -4
- package/.claude/skills/builder-ship/SKILL.md +7 -7
- package/.claude/skills/builder-stage/SKILL.md +8 -8
- package/.claude/skills/builder-start/SKILL.md +4 -4
- package/.claude/skills/collab-review/SKILL.md +5 -5
- package/.claude/skills/design/SKILL.md +6 -4
- package/.claude/skills/design-sync/SKILL.md +3 -3
- package/.claude/skills/figma-design-sync/SKILL.md +4 -4
- package/.claude/skills/fix-task/SKILL.md +8 -8
- package/.claude/skills/goal-close/SKILL.md +9 -9
- package/.claude/skills/goal-create/SKILL.md +18 -18
- package/.claude/skills/grade-recover/SKILL.md +8 -8
- package/.claude/skills/grade-sweep/SKILL.md +15 -15
- package/.claude/skills/idea-triage/SKILL.md +15 -15
- package/.claude/skills/merge-mode/SKILL.md +14 -14
- package/.claude/skills/new-project/SKILL.md +5 -5
- package/.claude/skills/owner-review/SKILL.md +1 -1
- package/.claude/skills/planning-session/SKILL.md +14 -14
- package/.claude/skills/priority-session/SKILL.md +6 -6
- package/.claude/skills/read-session-export/SKILL.md +3 -3
- package/.claude/skills/recall/SKILL.md +7 -7
- package/.claude/skills/scan-before-install/SKILL.md +3 -3
- package/.claude/skills/session-handoff/SKILL.md +1 -1
- package/.claude/skills/ship-check/SKILL.md +3 -3
- package/.claude/skills/status/SKILL.md +3 -3
- package/.claude/skills/strand-fix/SKILL.md +6 -6
- package/.claude/skills/worktree-clean/SKILL.md +4 -4
- package/.gitattributes +12 -32
- package/GOVERNMENT.md +1 -1
- package/README.md +8 -8
- package/bin/bongos.js +23 -23
- package/clients/bongos-client/README.md +2 -2
- package/clients/bongos-client/bongos-client.global.js +22 -4
- package/clients/bongos-client/index.cjs +22 -4
- package/clients/bongos-client/index.d.ts +33 -4
- package/clients/bongos-client/index.mjs +21 -3
- package/config/branding.neutral.json +1 -1
- package/config/design-tokens.schema.json +1 -1
- package/config/modules.neutral.json +1 -3
- package/docs/adr/0029-status-page-outage-resilience.md +6 -6
- package/docs/adr/0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md +1 -1
- package/docs/adr/0294-cli-sessions-do-not-expire.md +1 -1
- package/docs/adr/0383-sessions-end-after-ten-idle-days.md +35 -0
- package/docs/adr/0384-the-raise-page-is-a-hub-module-builders-edit-in-place.md +31 -0
- package/docs/adr/README.md +2 -0
- package/docs/api/openapi.json +606 -44
- package/docs/api-reference.md +25 -12
- package/docs/architecture.md +8 -7
- package/docs/canonical-permissions.md +3 -3
- package/docs/copy-inventory.md +1370 -1411
- package/docs/copy-registry.json +2136 -2536
- package/docs/design/demonolith-plan.md +6 -6
- package/docs/design/modular-architecture/00-research-report.md +1 -1
- package/docs/design/project-startup-direction.md +2 -2
- package/docs/design/projects-hub-direction-v2.md +1 -1
- package/docs/design/reviews/hall-v2/README.md +2 -2
- package/docs/design/vanilla-hall-ui-redesign-scope.md +1 -1
- package/docs/file-map.md +89 -88
- package/docs/handoff-template.md +4 -4
- package/docs/module-api-changelog.md +5 -3
- package/docs/modules-contract.md +8 -7
- package/docs/onboarding/diagrams/01-task-lifecycle.mmd +1 -1
- package/docs/onboarding/diagrams/02-rank-ladder.mmd +1 -1
- package/docs/onboarding/diagrams/03-drachmae-karma.mmd +1 -1
- package/docs/onboarding/diagrams/04-architecture.mmd +1 -1
- package/docs/onboarding/diagrams/05-versioning.mmd +1 -1
- package/docs/onboarding/diagrams/README.md +2 -2
- package/docs/onboarding/diagrams/assertions.json +2 -2
- package/docs/onboarding/slash-commands.md +2 -2
- package/docs/packs/artist.md +4 -4
- package/docs/packs/engineer.md +11 -10
- package/docs/packs/ideator.md +7 -7
- package/docs/page-inventory.json +20 -1
- package/docs/page-readings.json +4387 -4603
- package/docs/recipes/README.md +1 -1
- package/docs/recipes/audit-replay.md +4 -4
- package/docs/recipes/autobongos-windows-host.md +6 -6
- package/docs/recipes/bongos-cli-release.md +2 -2
- package/docs/recipes/claude-design-loop.md +7 -7
- package/docs/recipes/core-release-pipeline.md +19 -19
- package/docs/recipes/failed-ship-recovery-proof.md +2 -2
- package/docs/recipes/figma-design-loop.md +6 -6
- package/docs/recipes/gds-db-backup.md +9 -9
- package/docs/recipes/instance-deploy.md +3 -3
- package/docs/recipes/instance-first-run.md +1 -1
- package/docs/recipes/multi-builder-merge.md +2 -2
- package/docs/recipes/ops-gotchas.md +10 -9
- package/docs/recipes/packaging-the-core.md +6 -6
- package/docs/recipes/parallel-goal-waves.md +4 -4
- package/docs/recipes/private-npm-distribution.md +9 -9
- package/docs/recipes/redteam-patrol.md +5 -5
- package/docs/recipes/render-pilot.md +2 -2
- package/docs/recipes/reranking-a-goals-board.md +2 -2
- package/docs/recipes/search-index-ingestion.md +5 -5
- package/docs/recipes/self-host.md +1 -1
- package/docs/recipes/ship-and-regrade.md +4 -4
- package/docs/recipes/staging-environment.md +1 -1
- package/docs/recipes/standalone-live-docs.md +1 -1
- package/docs/recipes/ui-look-before-you-ship.md +2 -2
- package/docs/recipes/upgrading-the-core.md +11 -11
- package/docs/recipes/windows-builders.md +18 -18
- package/docs/research/llm-model-agnostic-and-cheaper-grader.md +6 -6
- package/docs/research/task-network-map-readability.md +3 -3
- package/migrations/core_278_builder_tester_tag.sql +18 -0
- package/migrations/core_279_bongos_shipper_new_scripts_path.sql +13 -0
- package/modules/agents/lib/answer-hold.js +1 -1
- package/modules/agents/lib/gate.js +1 -1
- package/modules/agents/lib/validate.js +1 -1
- package/modules/autonomy/gauge.js +1 -1
- package/modules/autonomy/governor-docket.js +2 -2
- package/modules/autonomy/pollers/routine-timers.js +3 -3
- package/modules/autonomy/routes/autonomy.js +3 -3
- package/modules/builder-settings/interaction-prefs.js +1 -1
- package/modules/builder-settings/render-prefs.js +1 -1
- package/modules/builder-settings/routes/settings.js +1 -1
- package/modules/builder-settings/skill-prefs.js +2 -2
- package/modules/builder-settings/wandering-prefs.js +2 -2
- package/modules/copy-desk/module.json +2 -2
- package/modules/copy-desk/page-data.js +5 -5
- package/modules/copy-desk/page-decisions.js +13 -1
- package/modules/copy-desk/proposals.js +4 -4
- package/modules/copy-desk/registry.js +2 -2
- package/modules/copy-desk/routes/copy-desk-release.js +119 -0
- package/modules/copy-desk/routes/copy-desk.js +3 -12
- package/modules/copy-desk/skills/tweak/SKILL.md +12 -12
- package/modules/copy-desk/tests/copy_flags.mjs +1 -1
- package/modules/copy-desk/tests/copy_no_cms.mjs +7 -3
- package/modules/copy-desk/tests/copy_proposals.mjs +2 -2
- package/modules/copy-desk/tests/copy_queue.mjs +1 -1
- package/modules/design-styles/skills/README.md +4 -4
- package/modules/design-styles/skills/imagegen-frontend-mobile/SKILL.md +1 -1
- package/modules/design-styles/skills/imagegen-frontend-web/SKILL.md +1 -1
- package/modules/discord/bug-attachments.js +1 -1
- package/modules/discord/ship-broadcast.js +1 -1
- package/modules/economy/achievements.js +49 -7
- package/modules/economy/cost-classify.js +6 -6
- package/modules/economy/cost-report.js +1 -1
- package/modules/economy/cost.js +1 -1
- package/modules/economy/credits.js +2 -1
- package/modules/economy/idea-size.js +2 -2
- package/modules/economy/reward.js +2 -0
- package/modules/economy/routes/cost.js +1 -1
- package/modules/economy/streak.js +43 -4
- package/modules/government/asks.js +1 -1
- package/modules/government/board.js +19 -2
- package/modules/government/catalog.js +3 -0
- package/modules/government/migrations/government_033_idea_vote.sql +46 -0
- package/modules/government/protected-surfaces.json +48 -47
- package/modules/government/recommendations.js +6 -2
- package/modules/government/routes/government.js +1 -1
- package/modules/grading/generated-provenance.js +13 -5
- package/modules/grading/grade-engine.js +1 -1
- package/modules/grading/grader-rubric.json +1 -1
- package/modules/grading/grader-score.js +1 -1
- package/modules/grading/grader-workers/index.js +1 -1
- package/modules/grading/grader.js +1 -1
- package/modules/grading/routes/grade.js +1 -1
- package/modules/hall-ui/public/atlas.html +5 -7
- package/modules/hall-ui/public/atlas.js +1 -1
- package/modules/hall-ui/public/atlas.states.json +1 -1
- package/modules/hall-ui/public/blockers.css +9 -0
- package/modules/hall-ui/public/blockers.html +4 -4
- package/modules/hall-ui/public/blockers.js +29 -30
- package/modules/hall-ui/public/board-room.css +5 -17
- package/modules/hall-ui/public/board-room.html +5 -6
- package/modules/hall-ui/public/board-room.js +41 -23
- package/modules/hall-ui/public/board-room.states.json +1 -1
- package/modules/hall-ui/public/brand-apply.js +1 -1
- package/modules/hall-ui/public/brand-holes.js +1 -1
- package/modules/hall-ui/public/builders.js +40 -86
- package/modules/hall-ui/public/city-decide.js +18 -4
- package/modules/hall-ui/public/city.html +1 -1
- package/modules/hall-ui/public/collab.html +1 -1
- package/modules/hall-ui/public/commands.html +6 -9
- package/modules/hall-ui/public/copy-desk.html +1 -1
- package/modules/hall-ui/public/copy-desk.js +2 -2
- package/modules/hall-ui/public/craft-mode.js +4 -0
- package/modules/hall-ui/public/deploy.html +6 -2
- package/modules/hall-ui/public/deploy.js +21 -13
- package/modules/hall-ui/public/diagrams.css +1 -1
- package/modules/hall-ui/public/diagrams.html +5 -8
- package/modules/hall-ui/public/diagrams.states.json +1 -1
- package/modules/hall-ui/public/drachmae.html +3 -7
- package/modules/hall-ui/public/fleet.html +3 -2
- package/modules/hall-ui/public/fleet.js +0 -4
- package/modules/hall-ui/public/gate.html +7 -7
- package/modules/hall-ui/public/gate.js +58 -77
- package/modules/hall-ui/public/goal-map.html +1 -1
- package/modules/hall-ui/public/goals-page.js +5 -5
- package/modules/hall-ui/public/goals-render.js +10 -11
- package/modules/hall-ui/public/goals.css +10 -0
- package/modules/hall-ui/public/goals.html +14 -7
- package/modules/hall-ui/public/government.html +3 -5
- package/modules/hall-ui/public/government.js +1 -5
- package/modules/hall-ui/public/hall-render.js +117 -57
- package/modules/hall-ui/public/hall-widgets.js +11 -11
- package/modules/hall-ui/public/idea.html +1 -1
- package/modules/hall-ui/public/ideas.html +3 -1
- package/modules/hall-ui/public/ideas.js +1 -0
- package/modules/hall-ui/public/index.html +12 -6
- package/modules/hall-ui/public/index.states.json +1 -1
- package/modules/hall-ui/public/mine-lens.js +1 -1
- package/modules/hall-ui/public/modules.html +7 -10
- package/modules/hall-ui/public/modules.js +0 -2
- package/modules/hall-ui/public/my-agents.html +1 -1
- package/modules/hall-ui/public/palette.js +5 -5
- package/modules/hall-ui/public/primer.html +4 -9
- package/modules/hall-ui/public/profile-connections.js +10 -2
- package/modules/hall-ui/public/profile-roles.js +3 -10
- package/modules/hall-ui/public/profile.html +12 -10
- package/modules/hall-ui/public/profile.js +13 -17
- package/modules/hall-ui/public/project-settings.html +3 -4
- package/modules/hall-ui/public/project-settings.js +0 -3
- package/modules/hall-ui/public/ranks.html +5 -11
- package/modules/hall-ui/public/ranks.js +6 -8
- package/modules/hall-ui/public/roadmap.css +0 -2
- package/modules/hall-ui/public/roadmap.html +1 -1
- package/modules/hall-ui/public/roadmap.js +16 -51
- package/modules/hall-ui/public/roster.html +1 -1
- package/modules/hall-ui/public/sessions.html +6 -8
- package/modules/hall-ui/public/sessions.js +7 -7
- package/modules/hall-ui/public/settings.html +1 -1
- package/modules/hall-ui/public/shell-trail.js +1 -1
- package/modules/hall-ui/public/shell.js +17 -17
- package/modules/hall-ui/public/street-deck.css +2 -1
- package/modules/hall-ui/public/street-deck.js +10 -2
- package/modules/hall-ui/public/street-desk.js +16 -5
- package/modules/hall-ui/public/street.html +1 -1
- package/modules/hall-ui/public/studio-lib.js +4 -0
- package/modules/hall-ui/public/studio.css +2 -0
- package/modules/hall-ui/public/studio.html +1 -1
- package/modules/hall-ui/public/studio.js +27 -1
- package/modules/hall-ui/public/style.css +43 -26
- package/modules/hall-ui/public/task-detail.js +10 -7
- package/modules/hall-ui/public/task.css +2 -0
- package/modules/hall-ui/public/task.html +3 -1
- package/modules/hall-ui/public/task.js +23 -7
- package/modules/hall-ui/public/thinking.html +1 -1
- package/modules/hall-ui/public/tweak-editor.html +1 -1
- package/modules/hall-ui/public/vote-control.js +208 -0
- package/modules/hall-ui/public/watch.html +3 -5
- package/modules/hall-ui/public/watch.js +5 -4
- package/modules/hall-ui/public/welcome-boot.css +130 -0
- package/modules/hall-ui/public/welcome-boot.js +334 -0
- package/modules/hall-ui/public/welcome-day.webp +0 -0
- package/modules/hall-ui/public/welcome-night.webp +0 -0
- package/modules/hall-ui/public/work-summary.js +1 -1
- package/modules/hall-ui/public/work.css +1 -0
- package/modules/hall-ui/public/work.html +3 -1
- package/modules/hall-ui/public/work.js +2 -1
- package/modules/hall-ui/records/accomplishments.md +16 -0
- package/modules/hall-ui/records/hall-ask-card.md +9 -0
- package/modules/hall-ui/records/karma-vote-control.md +13 -0
- package/modules/hall-ui/records/oversight-family.md +1 -1
- package/modules/hall-ui/records/profile-connections.md +2 -0
- package/modules/hall-ui/records/profile-roles.md +1 -1
- package/modules/hall-ui/records/reading-rooms.md +1 -1
- package/modules/hall-ui/records/welcome-tower.md +50 -0
- package/modules/ideas/migrations/ideas_011_idea_votes.sql +31 -0
- package/modules/ideas/projection.js +1 -1
- package/modules/ideas/routes/blockers.js +3 -3
- package/modules/ideas/routes/inbox.js +29 -1
- package/modules/ideas/routes/ratify-goal.js +1 -1
- package/modules/ideas/routing.js +1 -1
- package/modules/ideas/templates.js +1 -1
- package/modules/ideas/trail-descent.js +1 -1
- package/modules/ideas/trail-size.js +1 -1
- package/modules/ideas/votes.js +93 -0
- package/modules/lifecycle/abandon-leftovers.js +1 -1
- package/modules/lifecycle/cascade.js +1 -1
- package/modules/lifecycle/conflict-resolve.js +13 -21
- package/modules/lifecycle/criterion-ref.js +1 -1
- package/modules/lifecycle/db-analytics.js +57 -4
- package/modules/lifecycle/db-deps-criteria.js +1 -1
- package/modules/lifecycle/db-ship.js +2 -2
- package/modules/lifecycle/db-tasks.js +2 -2
- package/modules/lifecycle/db-versions.js +1 -1
- package/modules/lifecycle/db.js +2 -0
- package/modules/lifecycle/dead-deps.js +3 -3
- package/modules/lifecycle/dependency-advisory.js +3 -3
- package/modules/lifecycle/goal-category.js +1 -1
- package/modules/lifecycle/goal-forest.js +1 -1
- package/modules/lifecycle/goal-task-relevance-advisory.js +1 -1
- package/modules/lifecycle/kickoff-checklist.js +1 -1
- package/modules/lifecycle/kickoff-seed.js +1 -1
- package/modules/lifecycle/lifecycle.js +2 -0
- package/modules/lifecycle/merge-reach.js +29 -15
- package/modules/lifecycle/missing-dep-classify.js +3 -3
- package/modules/lifecycle/module.json +2 -1
- package/modules/lifecycle/page-tweak-approve.js +85 -1
- package/modules/lifecycle/page-tweak-hold.js +1 -1
- package/modules/lifecycle/publish-reconciler.js +1 -2
- package/modules/lifecycle/rot.js +1 -1
- package/modules/lifecycle/routes/artist-gate.js +1 -1
- package/modules/lifecycle/routes/gate-approvals.js +22 -1
- package/modules/lifecycle/routes/goals.js +1 -1
- package/modules/lifecycle/routes/task-route-helpers.js +1 -1
- package/modules/lifecycle/routes/task-votes.js +54 -0
- package/modules/lifecycle/routes/task-write-routes.js +1 -1
- package/modules/lifecycle/routes/tasks.js +2 -2
- package/modules/lifecycle/routes/versions.js +2 -2
- package/modules/lifecycle/ship-card.js +4 -4
- package/modules/lifecycle/ship-preflight.js +1 -1
- package/modules/lifecycle/task-classifier.js +1 -1
- package/modules/lifecycle/task-status.js +1 -1
- package/modules/lifecycle/task-visual-db.js +1 -1
- package/modules/memory/learnings.js +1 -1
- package/modules/memory/pollers/search-index.js +2 -2
- package/modules/memory/routes/learnings.js +1 -1
- package/modules/memory/routes/memory.js +1 -1
- package/modules/memory/search.js +2 -2
- package/modules/npm-release/release.js +1 -1
- package/modules/onboarding/howto-moments.js +1 -1
- package/modules/onboarding/newcomer-restock.js +3 -3
- package/modules/onboarding/onboarding.js +1 -1
- package/modules/pixel-art/skills/otb-tile-generate/SKILL.md +1 -1
- package/modules/platform-identity/origin-containment.js +1 -1
- package/modules/platform-identity/publish-gate.js +1 -1
- package/modules/platform-identity/tests/platform-identity.mjs +1 -1
- package/modules/provisioning/capacity.js +1 -1
- package/modules/provisioning/core-upgrade.js +15 -9
- package/modules/provisioning/credential-preflight.js +3 -3
- package/modules/provisioning/disconnect.js +1 -1
- package/modules/provisioning/dns-resolves.js +1 -1
- package/modules/provisioning/module.json +1 -1
- package/modules/provisioning/onboard-plan.js +1 -1
- package/modules/provisioning/paid-shape-gate.js +2 -2
- package/modules/provisioning/planet-physics.js +11 -2
- package/modules/provisioning/pollers/liveness-sweep.js +1 -1
- package/modules/provisioning/pollers/runner-drift-notify.js +5 -5
- package/modules/provisioning/provisioning.js +2 -2
- package/modules/provisioning/render-lookup.js +1 -1
- package/modules/provisioning/render-standup.js +3 -3
- package/modules/provisioning/repo-private.js +1 -1
- package/modules/provisioning/routes/callback-page.js +1 -1
- package/modules/provisioning/routes/core-upgrade.js +23 -3
- package/modules/provisioning/routes/provisioning.js +2 -2
- package/modules/provisioning/routes/render-standup.js +1 -1
- package/modules/provisioning/routes/repo-private.js +1 -1
- package/modules/provisioning/soft-limits.js +1 -1
- package/modules/provisioning/starter-bundles.js +4 -2
- package/modules/provisioning/tests/provisioning.mjs +1 -1
- package/modules/public-landing/public/account.html +4 -6
- package/modules/public-landing/public/assets/cosmos.css +13 -6
- package/modules/public-landing/public/connections.html +4 -6
- package/modules/public-landing/public/contact.html +4 -6
- package/modules/public-landing/public/guild.html +4 -6
- package/modules/public-landing/public/index.html +11 -9
- package/modules/public-landing/public/invitations.html +4 -6
- package/modules/public-landing/public/privacy.html +4 -6
- package/modules/public-landing/public/projects.html +168 -46
- package/modules/public-landing/public/terms.html +4 -6
- package/modules/raise/content/copy.json +40 -0
- package/modules/raise/content/nda.html +39 -0
- package/modules/raise/content/settings.json +49 -0
- package/modules/raise/db.js +95 -0
- package/modules/raise/migrations/raise_001_tables.sql +71 -0
- package/modules/raise/module.json +28 -0
- package/modules/raise/page.js +194 -0
- package/modules/raise/public/edit.js +152 -0
- package/modules/raise/public/favicon.svg +1 -0
- package/modules/raise/public/logo-ink.svg +1 -0
- package/modules/raise/public/logo-night.svg +1 -0
- package/modules/raise/public/mode.js +8 -0
- package/modules/raise/public/raise.css +234 -0
- package/modules/raise/public/raise.js +91 -0
- package/modules/raise/raise.js +174 -0
- package/modules/raise/routes/raise.js +152 -0
- package/modules/raise/views/gate.html +39 -0
- package/modules/raise/views/nda.html +21 -0
- package/modules/raise/views/page.html +133 -0
- package/modules/raise/web.js +72 -0
- package/modules/render-deploy/deploys.js +1 -1
- package/modules/render-deploy/render.js +2 -2
- package/modules/security/secret-scrub.js +3 -3
- package/modules/security/security.js +1 -1
- package/modules/security/tests/artifact_scan.mjs +1 -1
- package/modules/security/tests/mirror.mjs +1 -1
- package/modules/security/tests/scan_store.mjs +1 -1
- package/modules/sessions/db.js +2 -2
- package/modules/sessions/pulse.js +2 -2
- package/modules/sessions/routes/sessions.js +1 -1
- package/modules/specialities/specialities.js +1 -1
- package/modules/status-ui/public/README.md +3 -4
- package/modules/status-ui/public/index.html +5 -31
- package/modules/status-ui/public/status.js +6 -174
- package/modules/status-ui/public/style.css +4 -133
- package/modules/ui-design/docs/design-contract.md +3 -3
- package/modules/ui-design/kit/README.md +1 -1
- package/modules/ui-design/kit/serve.js +13 -4
- package/modules/ui-design/scripts/design-sync.js +1 -1
- package/modules/ui-design/scripts/figma-design-sync.js +1 -1
- package/modules/ui-design/scripts/validate-design.js +1 -1
- package/package-lock.json +27 -11
- package/package.json +2 -3
- package/release-notes.json +172 -0
- package/scripts/bongos/CLAUDE.md +15 -0
- package/scripts/bongos/abandon.js +137 -0
- package/scripts/bongos/accessibility-replay.js +195 -0
- package/scripts/bongos/address-park-sweep.sh +91 -0
- package/scripts/bongos/adopt-detect.js +123 -0
- package/scripts/bongos/adopt-import.js +111 -0
- package/scripts/bongos/adopt-preflight.js +187 -0
- package/scripts/bongos/adr-namespace.js +273 -0
- package/scripts/bongos/agent-invoke.js +689 -0
- package/scripts/bongos/agents-sync.js +502 -0
- package/scripts/bongos/api-alias-caller-scan.js +256 -0
- package/scripts/bongos/api-artifacts.js +91 -0
- package/scripts/bongos/api.js +86 -0
- package/scripts/bongos/api.ps1 +26 -0
- package/scripts/bongos/architect-audit.js +294 -0
- package/scripts/bongos/artifact-audit.js +326 -0
- package/scripts/bongos/artifact-format.js +203 -0
- package/scripts/bongos/artifact-staleness.js +267 -0
- package/scripts/bongos/ask.js +231 -0
- package/scripts/bongos/audit-authorship.sh +329 -0
- package/scripts/bongos/audit-deps.js +189 -0
- package/scripts/bongos/audit-gate.js +121 -0
- package/scripts/bongos/audit-rank-roles.js +172 -0
- package/scripts/bongos/audit-replay.sh +205 -0
- package/scripts/bongos/autobongos-digest.js +123 -0
- package/scripts/bongos/autobongos-grade-cap.js +187 -0
- package/scripts/bongos/autobongos-loop.js +210 -0
- package/scripts/bongos/autobongos-run.js +1361 -0
- package/scripts/bongos/autobongos-service.cmd +50 -0
- package/scripts/bongos/autobongos-service.ps1 +270 -0
- package/scripts/bongos/autobongos-tweak-lane.js +262 -0
- package/scripts/bongos/autobongos-verify.js +618 -0
- package/scripts/bongos/autonomy-gate.js +135 -0
- package/scripts/bongos/autonomy-gauge-statusline.js +124 -0
- package/scripts/bongos/autonomy-gauge.js +84 -0
- package/scripts/bongos/backfill-cost.js +176 -0
- package/scripts/bongos/backfill-disciplines.js +144 -0
- package/scripts/bongos/backfill-session-earnings.js +123 -0
- package/scripts/bongos/backfill-session-types.js +87 -0
- package/scripts/bongos/backfill-sessions.js +411 -0
- package/scripts/bongos/backfill-subagent-rewards.js +485 -0
- package/scripts/bongos/backfill-task-rewards.js +413 -0
- package/scripts/bongos/backlog-review.js +399 -0
- package/scripts/bongos/backup-dropin-sweep.sh +95 -0
- package/scripts/bongos/backup.js +116 -0
- package/scripts/bongos/baseline-staleness.js +217 -0
- package/scripts/bongos/bfg-principal-token.js +65 -0
- package/scripts/bongos/bug-attachment-audit.js +149 -0
- package/scripts/bongos/bug-attachment-recover.js +198 -0
- package/scripts/bongos/bug-triage.js +292 -0
- package/scripts/bongos/build-bongos.js +94 -0
- package/scripts/bongos/bump-version.js +221 -0
- package/scripts/bongos/capture.js +481 -0
- package/scripts/bongos/category-advisory-guard.js +206 -0
- package/scripts/bongos/ci-grade.js +82 -0
- package/scripts/bongos/claim-recall.js +112 -0
- package/scripts/bongos/claim.js +789 -0
- package/scripts/bongos/classify-discipline.js +153 -0
- package/scripts/bongos/claude-materialize.js +1200 -0
- package/scripts/bongos/claude-md-template.js +142 -0
- package/scripts/bongos/cleanup-orphans.js +74 -0
- package/scripts/bongos/cli-lib.js +1226 -0
- package/scripts/bongos/client-baseurl-guard.js +116 -0
- package/scripts/bongos/codemod-rename-scripts-gds.js +381 -0
- package/scripts/bongos/codemod-rename-src-gds.js +145 -0
- package/scripts/bongos/conductor-dispatch.js +535 -0
- package/scripts/bongos/context-pack.js +326 -0
- package/scripts/bongos/control-manifest.js +199 -0
- package/scripts/bongos/copy-apply.js +758 -0
- package/scripts/bongos/copy-inventory.js +571 -0
- package/scripts/bongos/core-origin-follow.js +185 -0
- package/scripts/bongos/core-pin-sync.js +260 -0
- package/scripts/bongos/coreB-carve-proof.sh +725 -0
- package/scripts/bongos/cost-report.js +63 -0
- package/scripts/bongos/cost.js +47 -0
- package/scripts/bongos/credential-presence.js +296 -0
- package/scripts/bongos/cutover-codemod.js +240 -0
- package/scripts/bongos/db-backup-nightly.sh +232 -0
- package/scripts/bongos/db-backup-offsite.sh +267 -0
- package/scripts/bongos/demote.js +45 -0
- package/scripts/bongos/deploy-divergence.js +454 -0
- package/scripts/bongos/deploy-main-audit-gate.sh +97 -0
- package/scripts/bongos/design-sync.js +12 -0
- package/scripts/bongos/dev-box-guard.js +166 -0
- package/scripts/bongos/dev-lib.js +722 -0
- package/scripts/bongos/dev.js +645 -0
- package/scripts/bongos/device-flow-help.js +72 -0
- package/scripts/bongos/diagnose-achievements.js +118 -0
- package/scripts/bongos/diagram-facts.js +355 -0
- package/scripts/bongos/discord-channels.js +77 -0
- package/scripts/bongos/do-api.js +109 -0
- package/scripts/bongos/doc-cli-guard.js +274 -0
- package/scripts/bongos/doc-comment-coverage.js +139 -0
- package/scripts/bongos/doc-control-claims.js +170 -0
- package/scripts/bongos/docs-entropy.js +453 -0
- package/scripts/bongos/doctor.js +493 -0
- package/scripts/bongos/enroll-control-plane.js +101 -0
- package/scripts/bongos/exec-path-guard.js +564 -0
- package/scripts/bongos/feedback-send.js +249 -0
- package/scripts/bongos/fetch-art-key.js +106 -0
- package/scripts/bongos/fetch-sound-prefs.js +126 -0
- package/scripts/bongos/figma-design-sync.js +11 -0
- package/scripts/bongos/find-untested.js +371 -0
- package/scripts/bongos/fitness-checks-error-envelope.js +134 -0
- package/scripts/bongos/fitness-checks-identity.js +343 -0
- package/scripts/bongos/fitness-checks-packaging.js +132 -0
- package/scripts/bongos/fitness-checks-route-pins.js +76 -0
- package/scripts/bongos/fitness-checks-vocabulary.js +392 -0
- package/scripts/bongos/fitness-checks-write-validation.js +157 -0
- package/scripts/bongos/fitness-lib.js +127 -0
- package/scripts/bongos/fitness-migration-contraction.js +50 -0
- package/scripts/bongos/fitness-ratchets.js +594 -0
- package/scripts/bongos/fitness.js +1498 -0
- package/scripts/bongos/forwarder.js +80 -0
- package/scripts/bongos/gate-review.js +330 -0
- package/scripts/bongos/gating.js +348 -0
- package/scripts/{gds → bongos}/gds-db-backup.service +6 -6
- package/scripts/{gds → bongos}/gds-db-backup.timer +4 -4
- package/scripts/{gds → bongos}/gds-db-offsite.service +4 -4
- package/scripts/{gds → bongos}/gds-db-offsite.timer +4 -4
- package/scripts/bongos/gds-literal-scan.js +196 -0
- package/scripts/bongos/gen-api-client.js +576 -0
- package/scripts/bongos/gen-api-docs.js +1111 -0
- package/scripts/bongos/gen-atlas.js +366 -0
- package/scripts/bongos/gen-diagrams.js +608 -0
- package/scripts/bongos/gen-file-map.js +337 -0
- package/scripts/bongos/gen-freshness.js +32 -0
- package/scripts/bongos/gen-interaction-posture.js +122 -0
- package/scripts/bongos/gen-repo-map.js +540 -0
- package/scripts/bongos/gen-role-responsibilities.js +134 -0
- package/scripts/bongos/gen-session-index.js +243 -0
- package/scripts/bongos/gen-sounds.js +176 -0
- package/scripts/bongos/git-merge-regen.js +254 -0
- package/scripts/bongos/go-live.js +1071 -0
- package/scripts/bongos/goal-names.js +102 -0
- package/scripts/bongos/goal.js +272 -0
- package/scripts/bongos/government-walk.js +1477 -0
- package/scripts/bongos/grade-correlation-audit.js +310 -0
- package/scripts/bongos/grade-replay.js +237 -0
- package/scripts/bongos/grade-smoke.js +205 -0
- package/scripts/bongos/home-isolation-guard.js +126 -0
- package/scripts/bongos/hooks/pre-push.js +211 -0
- package/scripts/bongos/howto.js +145 -0
- package/scripts/bongos/http-api-client.js +81 -0
- package/scripts/bongos/identity-strip.js +75 -0
- package/scripts/bongos/init.js +1159 -0
- package/scripts/bongos/install-git-hooks.js +200 -0
- package/scripts/bongos/instance-apex.js +38 -0
- package/scripts/bongos/intent-retry.js +52 -0
- package/scripts/bongos/key-card.js +222 -0
- package/scripts/bongos/key-status.js +126 -0
- package/scripts/bongos/land-watch.js +201 -0
- package/scripts/bongos/leak-scan-allowlist.js +293 -0
- package/scripts/bongos/learning-capture.js +145 -0
- package/scripts/bongos/lib.sh +74 -0
- package/scripts/bongos/linkify-refs.js +655 -0
- package/scripts/bongos/lint-infra-exec.js +70 -0
- package/scripts/bongos/lint-migrations.js +102 -0
- package/scripts/bongos/lint-workflow-exec.js +63 -0
- package/scripts/bongos/local-preview-lib.js +128 -0
- package/scripts/bongos/local-preview.js +82 -0
- package/scripts/bongos/login.js +360 -0
- package/scripts/bongos/main-audit.js +625 -0
- package/scripts/bongos/me.js +97 -0
- package/scripts/bongos/memory-map.js +176 -0
- package/scripts/bongos/merge-lock.js +71 -0
- package/scripts/bongos/migration-namespace.js +313 -0
- package/scripts/bongos/mirror-lineage-check.js +343 -0
- package/scripts/bongos/mirror-redact.js +350 -0
- package/scripts/bongos/module-artifact.js +289 -0
- package/scripts/bongos/module-assess-docs.js +238 -0
- package/scripts/bongos/module-assess-installs.js +228 -0
- package/scripts/bongos/module-assess-score.js +111 -0
- package/scripts/bongos/module-assess-security.js +252 -0
- package/scripts/bongos/module-assess-tests.js +278 -0
- package/scripts/bongos/module-assess-version.js +92 -0
- package/scripts/bongos/module-error-report.js +148 -0
- package/scripts/{gds → bongos}/module-test-runner/README.md +3 -3
- package/scripts/{gds → bongos}/module-test-runner/module-tests.yml +2 -2
- package/scripts/bongos/module-test-runner.js +414 -0
- package/scripts/bongos/module.js +1376 -0
- package/scripts/bongos/move-escalation.js +141 -0
- package/scripts/{gds → bongos}/newcomer-floor.config.json +1 -1
- package/scripts/bongos/newcomer-floor.js +421 -0
- package/scripts/{gds → bongos}/newcomer-floor.templates.json +13 -13
- package/scripts/bongos/newcomer-floor.test.js +235 -0
- package/scripts/bongos/next-number.js +163 -0
- package/scripts/bongos/oauth-secret.js +202 -0
- package/scripts/bongos/onboard.js +267 -0
- package/scripts/bongos/onboarding-analyze.js +226 -0
- package/scripts/bongos/onboarding-config.js +179 -0
- package/scripts/bongos/onboarding-ship.js +92 -0
- package/scripts/bongos/pack-env-prefix.js +73 -0
- package/scripts/bongos/package-core.js +1200 -0
- package/scripts/bongos/page-inventory.js +348 -0
- package/scripts/bongos/page-reader.js +722 -0
- package/scripts/bongos/paste-token.js +212 -0
- package/scripts/bongos/plain-cards.js +351 -0
- package/scripts/bongos/portability-smoke-art.sh +85 -0
- package/scripts/bongos/portability-smoke-memory.sh +176 -0
- package/scripts/bongos/preflight.js +214 -0
- package/scripts/bongos/probe-cache.js +246 -0
- package/scripts/bongos/prove-strict-versioning.js +284 -0
- package/scripts/bongos/provision-auto-upgrade.js +162 -0
- package/scripts/bongos/provision-byo-host.js +68 -0
- package/scripts/bongos/provision-capacity.js +79 -0
- package/scripts/bongos/provision-caps.js +63 -0
- package/scripts/bongos/provision-config.js +233 -0
- package/scripts/bongos/provision-core-upgrade.js +1166 -0
- package/scripts/bongos/provision-disconnect.js +88 -0
- package/scripts/bongos/provision-github-setup.js +168 -0
- package/scripts/bongos/provision-net.js +357 -0
- package/scripts/bongos/provision-pin-key.js +176 -0
- package/scripts/bongos/provision-pin-replay.js +126 -0
- package/scripts/bongos/provision-process.js +170 -0
- package/scripts/bongos/provision-render.js +201 -0
- package/scripts/bongos/provision-repo-auth.js +164 -0
- package/scripts/bongos/provision-repo-private.js +98 -0
- package/scripts/bongos/provision-repo.js +1337 -0
- package/scripts/bongos/provision-teardown.js +106 -0
- package/scripts/bongos/provision-units.js +469 -0
- package/scripts/bongos/provision.js +1479 -0
- package/scripts/bongos/publish-credential-check.js +66 -0
- package/scripts/bongos/publish-integration-gate.js +142 -0
- package/scripts/bongos/publish-manifest.js +440 -0
- package/scripts/bongos/publish-watch.js +268 -0
- package/scripts/bongos/pulse.js +336 -0
- package/scripts/bongos/push-main.js +56 -0
- package/scripts/bongos/push-path-brief.js +100 -0
- package/scripts/bongos/read-session-export.js +359 -0
- package/scripts/bongos/reauth.js +155 -0
- package/scripts/bongos/recall.js +183 -0
- package/scripts/bongos/redteam-patrol.js +437 -0
- package/scripts/bongos/regen-instance-docs.js +47 -0
- package/scripts/bongos/release-core.js +80 -0
- package/scripts/bongos/release-notes.js +271 -0
- package/scripts/bongos/release.js +139 -0
- package/scripts/bongos/rename-goals.js +109 -0
- package/scripts/bongos/rename-history-check.js +369 -0
- package/scripts/bongos/rename-ledger-prose.js +482 -0
- package/scripts/bongos/render-api.js +197 -0
- package/scripts/bongos/render-check.js +206 -0
- package/scripts/bongos/render-ideas.js +226 -0
- package/scripts/bongos/render-payload.js +85 -0
- package/scripts/bongos/repo-metrics.js +363 -0
- package/scripts/bongos/review-sheet.js +108 -0
- package/scripts/bongos/role-pack-guard.js +142 -0
- package/scripts/bongos/route-shadow-guard.js +175 -0
- package/scripts/bongos/routine-schedule.js +283 -0
- package/scripts/bongos/run-routine.js +257 -0
- package/scripts/bongos/run-unit-tests.js +654 -0
- package/scripts/bongos/runner-drift.js +151 -0
- package/scripts/bongos/sandbox-stage.js +459 -0
- package/scripts/bongos/scope-map-guard.js +300 -0
- package/scripts/bongos/scope-roster-guard.js +118 -0
- package/scripts/bongos/seam-wiring-guard.js +275 -0
- package/scripts/bongos/search-ingest-db.js +288 -0
- package/scripts/bongos/search-ingest-md.js +269 -0
- package/scripts/bongos/seed-adopt-tasks.js +75 -0
- package/scripts/bongos/seed-api-contract-goal-tasks.js +141 -0
- package/scripts/bongos/seed-board-room-tasks.js +196 -0
- package/scripts/bongos/seed-bongos-app-tasks.js +294 -0
- package/scripts/bongos/seed-bongos-coreB-tranche1-tasks.js +81 -0
- package/scripts/bongos/seed-bongos-coreB-tranche2-tasks.js +100 -0
- package/scripts/bongos/seed-bongos-goal-hierarchy-tasks.js +307 -0
- package/scripts/bongos/seed-bongos-module-system-tasks.js +346 -0
- package/scripts/bongos/seed-bongos-tasks.js +214 -0
- package/scripts/bongos/seed-bongos-v1-idea-routing-tasks.js +152 -0
- package/scripts/bongos/seed-bongos-v1-seo-tasks.js +104 -0
- package/scripts/bongos/seed-bv1-community-tasks.js +131 -0
- package/scripts/bongos/seed-bv1-privacy-invites-tasks.js +133 -0
- package/scripts/bongos/seed-bv1-profile-page-tasks.js +161 -0
- package/scripts/bongos/seed-bv1-profiles-tasks.js +135 -0
- package/scripts/bongos/seed-bv1-r01-delta-tasks.js +154 -0
- package/scripts/bongos/seed-bv2-ideator-surface-tasks.js +390 -0
- package/scripts/bongos/seed-bv2-tweak-mode-tasks.js +277 -0
- package/scripts/bongos/seed-gds-v4-tasks.js +624 -0
- package/scripts/bongos/seed-governance-tasks.js +340 -0
- package/scripts/bongos/seed-medusa-tasks.js +440 -0
- package/scripts/bongos/seed-module-upstreaming.js +219 -0
- package/scripts/bongos/seed-productization-tasks.js +235 -0
- package/scripts/bongos/seed-project-admin-console-tasks.js +88 -0
- package/scripts/bongos/seed-provisioning-tasks.js +83 -0
- package/scripts/bongos/seed-staging.sh +117 -0
- package/scripts/bongos/seed-strict-versioning-tasks.js +275 -0
- package/scripts/bongos/seed-v2-world-tasks.js +283 -0
- package/scripts/bongos/seed-verify-criteria.js +124 -0
- package/scripts/bongos/sequence.js +597 -0
- package/scripts/bongos/session-cost.js +430 -0
- package/scripts/bongos/session-digest-build.js +293 -0
- package/scripts/bongos/session-digest.js +200 -0
- package/scripts/bongos/session-eval.js +631 -0
- package/scripts/bongos/session-transcript-build.js +155 -0
- package/scripts/bongos/session-transcript-upload.js +29 -0
- package/scripts/bongos/session.js +404 -0
- package/scripts/bongos/setup.js +646 -0
- package/scripts/bongos/ship-check.js +89 -0
- package/scripts/bongos/ship-deploy-target.js +393 -0
- package/scripts/bongos/ship-escalation.js +167 -0
- package/scripts/bongos/ship-finish.js +420 -0
- package/scripts/bongos/ship-flow.js +1217 -0
- package/scripts/bongos/ship-git.js +100 -0
- package/scripts/bongos/ship-grade-steps.js +547 -0
- package/scripts/bongos/ship-grade.js +426 -0
- package/scripts/bongos/ship-honesty.js +314 -0
- package/scripts/bongos/ship-io.js +139 -0
- package/scripts/bongos/ship-land.js +1130 -0
- package/scripts/bongos/ship-memory-sync.js +249 -0
- package/scripts/bongos/ship-merge-gate.js +225 -0
- package/scripts/bongos/ship-merge.js +466 -0
- package/scripts/bongos/ship-mode-ask.js +138 -0
- package/scripts/bongos/ship-mode-manual.js +54 -0
- package/scripts/bongos/ship-preflight-steps.js +399 -0
- package/scripts/bongos/ship-regen.js +292 -0
- package/scripts/bongos/ship-resume.js +201 -0
- package/scripts/bongos/ship-session-upload.js +313 -0
- package/scripts/bongos/ship-state.js +110 -0
- package/scripts/bongos/ship-surprise.js +84 -0
- package/scripts/bongos/ship-visual.js +75 -0
- package/scripts/bongos/ship.js +382 -0
- package/scripts/bongos/shipping-mode.js +71 -0
- package/scripts/bongos/skill-lint.js +250 -0
- package/scripts/bongos/skill-preflight.js +361 -0
- package/scripts/bongos/smoke-batch-claim.sh +238 -0
- package/scripts/bongos/smoke-batch-release.sh +316 -0
- package/scripts/bongos/smoke-claim-consistency.sh +222 -0
- package/scripts/bongos/smoke-dependencies.sh +143 -0
- package/scripts/bongos/smoke-gds.js +256 -0
- package/scripts/bongos/smoke-write.sh +275 -0
- package/scripts/bongos/source-text-test-scan.js +106 -0
- package/scripts/bongos/spark.js +294 -0
- package/scripts/bongos/stale-worktrees.js +212 -0
- package/scripts/bongos/start-goals.js +102 -0
- package/scripts/bongos/start.js +1090 -0
- package/scripts/bongos/status.js +545 -0
- package/scripts/bongos/strand-watch.js +315 -0
- package/scripts/bongos/stranded-rows.js +200 -0
- package/scripts/bongos/stray-unit-sweep.sh +71 -0
- package/scripts/bongos/surface.js +101 -0
- package/scripts/bongos/task.js +273 -0
- package/scripts/bongos/test-path-guard.js +99 -0
- package/scripts/bongos/triage.js +742 -0
- package/scripts/bongos/turn-end-sound.js +74 -0
- package/scripts/bongos/tweak-halt.js +70 -0
- package/scripts/bongos/tweak-renders.js +200 -0
- package/scripts/bongos/uat.js +120 -0
- package/scripts/bongos/ui-kit-transform.js +43 -0
- package/scripts/bongos/update-channel.js +512 -0
- package/scripts/bongos/update-sweep.js +829 -0
- package/scripts/bongos/upgrade-artist-gate.js +46 -0
- package/scripts/bongos/upgrade-commit-identity.js +32 -0
- package/scripts/bongos/upgrade-migrate.js +224 -0
- package/scripts/bongos/upgrade-operator.js +73 -0
- package/scripts/bongos/upgrade-outcome.js +174 -0
- package/scripts/bongos/upgrade.js +1499 -0
- package/scripts/bongos/validate-design.js +12 -0
- package/scripts/bongos/version-close.js +621 -0
- package/scripts/bongos/version-literal-guard.js +140 -0
- package/scripts/bongos/version-select.js +79 -0
- package/scripts/bongos/visual-review-nudge.js +39 -0
- package/scripts/bongos/wedge-remedy.js +174 -0
- package/scripts/bongos/worktree-claim-guard.js +130 -0
- package/scripts/bongos/worktree.js +449 -0
- package/scripts/discord/post.js +1 -1
- package/scripts/gds/README.md +9 -0
- package/scripts/gds/abandon.js +6 -136
- package/scripts/gds/accessibility-replay.js +5 -194
- package/scripts/gds/address-park-sweep.sh +7 -90
- package/scripts/gds/adopt-detect.js +5 -121
- package/scripts/gds/adopt-import.js +5 -109
- package/scripts/gds/adopt-preflight.js +5 -185
- package/scripts/gds/adr-namespace.js +5 -271
- package/scripts/gds/agent-invoke.js +5 -687
- package/scripts/gds/agents-sync.js +5 -500
- package/scripts/gds/api-alias-caller-scan.js +5 -255
- package/scripts/gds/api-artifacts.js +6 -0
- package/scripts/gds/api.js +6 -85
- package/scripts/gds/api.ps1 +8 -26
- package/scripts/gds/architect-audit.js +6 -293
- package/scripts/gds/artifact-audit.js +5 -324
- package/scripts/gds/artifact-format.js +6 -203
- package/scripts/gds/artifact-staleness.js +5 -265
- package/scripts/gds/ask.js +5 -229
- package/scripts/gds/audit-authorship.sh +7 -328
- package/scripts/gds/audit-deps.js +6 -188
- package/scripts/gds/audit-gate.js +5 -119
- package/scripts/gds/audit-rank-roles.js +6 -171
- package/scripts/gds/audit-replay.sh +7 -204
- package/scripts/gds/autobongos-digest.js +5 -121
- package/scripts/gds/autobongos-grade-cap.js +5 -186
- package/scripts/gds/autobongos-loop.js +5 -208
- package/scripts/gds/autobongos-run.js +5 -1359
- package/scripts/gds/autobongos-service.cmd +8 -49
- package/scripts/gds/autobongos-service.ps1 +8 -270
- package/scripts/gds/autobongos-tweak-lane.js +5 -261
- package/scripts/gds/autobongos-verify.js +5 -616
- package/scripts/gds/autonomy-gate.js +5 -133
- package/scripts/gds/autonomy-gauge-statusline.js +5 -122
- package/scripts/gds/autonomy-gauge.js +5 -82
- package/scripts/gds/backfill-cost.js +6 -175
- package/scripts/gds/backfill-disciplines.js +5 -142
- package/scripts/gds/backfill-session-earnings.js +5 -121
- package/scripts/gds/backfill-session-types.js +5 -85
- package/scripts/gds/backfill-sessions.js +5 -409
- package/scripts/gds/backfill-subagent-rewards.js +5 -483
- package/scripts/gds/backfill-task-rewards.js +5 -411
- package/scripts/gds/backlog-review.js +6 -398
- package/scripts/gds/backup-dropin-sweep.sh +7 -94
- package/scripts/gds/backup.js +6 -115
- package/scripts/gds/baseline-staleness.js +5 -215
- package/scripts/gds/bfg-principal-token.js +6 -64
- package/scripts/gds/bug-attachment-audit.js +5 -147
- package/scripts/gds/bug-attachment-recover.js +5 -196
- package/scripts/gds/bug-triage.js +6 -291
- package/scripts/gds/build-bongos.js +5 -92
- package/scripts/gds/bump-version.js +5 -219
- package/scripts/gds/capture.js +6 -480
- package/scripts/gds/category-advisory-guard.js +5 -205
- package/scripts/gds/ci-grade.js +6 -81
- package/scripts/gds/claim-recall.js +6 -111
- package/scripts/gds/claim.js +6 -788
- package/scripts/gds/classify-discipline.js +6 -152
- package/scripts/gds/claude-materialize.js +5 -1198
- package/scripts/gds/claude-md-template.js +5 -140
- package/scripts/gds/cleanup-orphans.js +6 -73
- package/scripts/gds/cli-lib.js +6 -1204
- package/scripts/gds/client-baseurl-guard.js +5 -114
- package/scripts/gds/codemod-rename-src-gds.js +6 -144
- package/scripts/gds/conductor-dispatch.js +6 -534
- package/scripts/gds/context-pack.js +6 -325
- package/scripts/gds/control-manifest.js +5 -197
- package/scripts/gds/copy-apply.js +5 -756
- package/scripts/gds/copy-inventory.js +5 -569
- package/scripts/gds/core-origin-follow.js +5 -184
- package/scripts/gds/core-pin-sync.js +5 -258
- package/scripts/gds/coreB-carve-proof.sh +7 -724
- package/scripts/gds/cost-report.js +6 -62
- package/scripts/gds/cost.js +6 -46
- package/scripts/gds/credential-presence.js +5 -294
- package/scripts/gds/cutover-codemod.js +5 -239
- package/scripts/gds/db-backup-nightly.sh +7 -231
- package/scripts/gds/db-backup-offsite.sh +7 -266
- package/scripts/gds/demote.js +6 -44
- package/scripts/gds/deploy-divergence.js +6 -445
- package/scripts/gds/deploy-main-audit-gate.sh +7 -96
- package/scripts/gds/design-sync.js +5 -10
- package/scripts/gds/dev-box-guard.js +5 -164
- package/scripts/gds/dev-lib.js +5 -721
- package/scripts/gds/dev.js +5 -643
- package/scripts/gds/device-flow-help.js +5 -70
- package/scripts/gds/diagnose-achievements.js +5 -116
- package/scripts/gds/diagram-facts.js +6 -355
- package/scripts/gds/discord-channels.js +5 -75
- package/scripts/gds/do-api.js +6 -109
- package/scripts/gds/doc-cli-guard.js +5 -266
- package/scripts/gds/doc-comment-coverage.js +5 -137
- package/scripts/gds/doc-control-claims.js +5 -166
- package/scripts/gds/docs-entropy.js +5 -443
- package/scripts/gds/doctor.js +6 -492
- package/scripts/gds/enroll-control-plane.js +5 -99
- package/scripts/gds/exec-path-guard.js +5 -562
- package/scripts/gds/feedback-send.js +5 -247
- package/scripts/gds/fetch-art-key.js +5 -104
- package/scripts/gds/fetch-sound-prefs.js +5 -124
- package/scripts/gds/figma-design-sync.js +5 -9
- package/scripts/gds/find-untested.js +5 -369
- package/scripts/gds/fitness-checks-error-envelope.js +5 -133
- package/scripts/gds/fitness-checks-identity.js +5 -342
- package/scripts/gds/fitness-checks-packaging.js +5 -131
- package/scripts/gds/fitness-checks-route-pins.js +5 -75
- package/scripts/gds/fitness-checks-vocabulary.js +5 -391
- package/scripts/gds/fitness-checks-write-validation.js +5 -156
- package/scripts/gds/fitness-lib.js +5 -126
- package/scripts/gds/fitness-migration-contraction.js +5 -49
- package/scripts/gds/fitness-ratchets.js +5 -563
- package/scripts/gds/fitness.js +5 -1493
- package/scripts/gds/gate-review.js +5 -328
- package/scripts/gds/gating.js +5 -346
- package/scripts/gds/gds-literal-scan.js +5 -194
- package/scripts/gds/gen-api-client.js +5 -555
- package/scripts/gds/gen-api-docs.js +5 -1100
- package/scripts/gds/gen-atlas.js +5 -364
- package/scripts/gds/gen-diagrams.js +6 -607
- package/scripts/gds/gen-file-map.js +5 -335
- package/scripts/gds/gen-freshness.js +5 -31
- package/scripts/gds/gen-interaction-posture.js +5 -120
- package/scripts/gds/gen-repo-map.js +5 -538
- package/scripts/gds/gen-role-responsibilities.js +5 -133
- package/scripts/gds/gen-session-index.js +5 -241
- package/scripts/gds/gen-sounds.js +5 -174
- package/scripts/gds/git-merge-regen.js +6 -291
- package/scripts/gds/go-live.js +5 -1069
- package/scripts/gds/goal-names.js +5 -100
- package/scripts/gds/goal.js +6 -271
- package/scripts/gds/government-walk.js +5 -1475
- package/scripts/gds/grade-correlation-audit.js +5 -308
- package/scripts/gds/grade-replay.js +5 -235
- package/scripts/gds/grade-smoke.js +6 -204
- package/scripts/gds/home-isolation-guard.js +5 -125
- package/scripts/gds/hooks/pre-push.js +5 -209
- package/scripts/gds/howto.js +5 -143
- package/scripts/gds/http-api-client.js +6 -81
- package/scripts/gds/identity-strip.js +5 -74
- package/scripts/gds/init.js +5 -1157
- package/scripts/gds/install-git-hooks.js +5 -198
- package/scripts/gds/instance-apex.js +5 -37
- package/scripts/gds/intent-retry.js +5 -51
- package/scripts/gds/key-card.js +6 -221
- package/scripts/gds/key-status.js +5 -124
- package/scripts/gds/land-watch.js +5 -199
- package/scripts/gds/leak-scan-allowlist.js +5 -291
- package/scripts/gds/learning-capture.js +6 -144
- package/scripts/gds/lib.sh +7 -73
- package/scripts/gds/linkify-refs.js +6 -654
- package/scripts/gds/lint-infra-exec.js +5 -68
- package/scripts/gds/lint-migrations.js +5 -100
- package/scripts/gds/lint-workflow-exec.js +5 -61
- package/scripts/gds/local-preview-lib.js +6 -128
- package/scripts/gds/local-preview.js +6 -81
- package/scripts/gds/login.js +5 -358
- package/scripts/gds/main-audit.js +5 -623
- package/scripts/gds/me.js +6 -96
- package/scripts/gds/memory-map.js +5 -174
- package/scripts/gds/merge-lock.js +6 -70
- package/scripts/gds/migration-namespace.js +5 -311
- package/scripts/gds/mirror-lineage-check.js +5 -341
- package/scripts/gds/mirror-redact.js +5 -348
- package/scripts/gds/module-artifact.js +6 -289
- package/scripts/gds/module-assess-docs.js +6 -237
- package/scripts/gds/module-assess-installs.js +6 -227
- package/scripts/gds/module-assess-score.js +6 -110
- package/scripts/gds/module-assess-security.js +6 -251
- package/scripts/gds/module-assess-tests.js +6 -277
- package/scripts/gds/module-assess-version.js +6 -91
- package/scripts/gds/module-error-report.js +5 -146
- package/scripts/gds/module-test-runner.js +6 -413
- package/scripts/gds/module.js +5 -1374
- package/scripts/gds/move-escalation.js +5 -140
- package/scripts/gds/newcomer-floor.js +6 -420
- package/scripts/gds/newcomer-floor.test.js +6 -234
- package/scripts/gds/next-number.js +6 -162
- package/scripts/gds/oauth-secret.js +5 -200
- package/scripts/gds/onboard.js +5 -265
- package/scripts/gds/onboarding-analyze.js +6 -225
- package/scripts/gds/onboarding-config.js +6 -179
- package/scripts/gds/onboarding-ship.js +6 -91
- package/scripts/gds/pack-env-prefix.js +5 -72
- package/scripts/gds/package-core.js +5 -1102
- package/scripts/gds/page-inventory.js +5 -346
- package/scripts/gds/page-reader.js +5 -720
- package/scripts/gds/paste-token.js +6 -211
- package/scripts/gds/plain-cards.js +5 -350
- package/scripts/gds/portability-smoke-art.sh +7 -84
- package/scripts/gds/portability-smoke-memory.sh +7 -175
- package/scripts/gds/preflight.js +5 -212
- package/scripts/gds/probe-cache.js +5 -244
- package/scripts/gds/prove-strict-versioning.js +6 -283
- package/scripts/gds/provision-auto-upgrade.js +5 -161
- package/scripts/gds/provision-byo-host.js +5 -67
- package/scripts/gds/provision-capacity.js +5 -78
- package/scripts/gds/provision-caps.js +5 -62
- package/scripts/gds/provision-config.js +5 -232
- package/scripts/gds/provision-core-upgrade.js +5 -1165
- package/scripts/gds/provision-disconnect.js +5 -87
- package/scripts/gds/provision-github-setup.js +5 -167
- package/scripts/gds/provision-net.js +5 -356
- package/scripts/gds/provision-pin-key.js +5 -175
- package/scripts/gds/provision-pin-replay.js +5 -125
- package/scripts/gds/provision-process.js +5 -169
- package/scripts/gds/provision-render.js +5 -200
- package/scripts/gds/provision-repo-auth.js +5 -163
- package/scripts/gds/provision-repo-private.js +5 -97
- package/scripts/gds/provision-repo.js +5 -1336
- package/scripts/gds/provision-teardown.js +5 -105
- package/scripts/gds/provision-units.js +5 -468
- package/scripts/gds/provision.js +5 -1477
- package/scripts/gds/publish-credential-check.js +6 -65
- package/scripts/gds/publish-integration-gate.js +5 -140
- package/scripts/gds/publish-manifest.js +5 -437
- package/scripts/gds/publish-watch.js +5 -266
- package/scripts/gds/pulse.js +6 -335
- package/scripts/gds/push-main.js +5 -54
- package/scripts/gds/push-path-brief.js +5 -98
- package/scripts/gds/read-session-export.js +5 -357
- package/scripts/gds/reauth.js +6 -154
- package/scripts/gds/recall.js +6 -182
- package/scripts/gds/redteam-patrol.js +5 -435
- package/scripts/gds/regen-instance-docs.js +5 -45
- package/scripts/gds/release-core.js +5 -78
- package/scripts/gds/release-notes.js +5 -270
- package/scripts/gds/release.js +6 -138
- package/scripts/gds/rename-goals.js +5 -107
- package/scripts/gds/rename-history-check.js +5 -367
- package/scripts/gds/rename-ledger-prose.js +5 -480
- package/scripts/gds/render-api.js +5 -196
- package/scripts/gds/render-check.js +5 -204
- package/scripts/gds/render-ideas.js +6 -225
- package/scripts/gds/render-payload.js +5 -84
- package/scripts/gds/repo-metrics.js +6 -362
- package/scripts/gds/review-sheet.js +5 -106
- package/scripts/gds/role-pack-guard.js +5 -141
- package/scripts/gds/route-shadow-guard.js +5 -173
- package/scripts/gds/routine-schedule.js +5 -281
- package/scripts/gds/run-routine.js +5 -255
- package/scripts/gds/run-unit-tests.js +6 -659
- package/scripts/gds/runner-drift.js +5 -149
- package/scripts/gds/sandbox-stage.js +6 -458
- package/scripts/gds/scope-map-guard.js +5 -299
- package/scripts/gds/scope-roster-guard.js +5 -117
- package/scripts/gds/seam-wiring-guard.js +5 -274
- package/scripts/gds/search-ingest-db.js +6 -287
- package/scripts/gds/search-ingest-md.js +6 -268
- package/scripts/gds/seed-adopt-tasks.js +6 -74
- package/scripts/gds/seed-api-contract-goal-tasks.js +6 -140
- package/scripts/gds/seed-board-room-tasks.js +6 -196
- package/scripts/gds/seed-bongos-app-tasks.js +6 -293
- package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +6 -80
- package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +6 -99
- package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +6 -306
- package/scripts/gds/seed-bongos-module-system-tasks.js +6 -345
- package/scripts/gds/seed-bongos-tasks.js +6 -213
- package/scripts/gds/seed-bongos-v1-idea-routing-tasks.js +6 -152
- package/scripts/gds/seed-bongos-v1-seo-tasks.js +6 -104
- package/scripts/gds/seed-bv1-community-tasks.js +6 -131
- package/scripts/gds/seed-bv1-privacy-invites-tasks.js +6 -133
- package/scripts/gds/seed-bv1-profile-page-tasks.js +6 -161
- package/scripts/gds/seed-bv1-profiles-tasks.js +6 -135
- package/scripts/gds/seed-bv1-r01-delta-tasks.js +6 -154
- package/scripts/gds/seed-bv2-ideator-surface-tasks.js +6 -390
- package/scripts/gds/seed-bv2-tweak-mode-tasks.js +6 -277
- package/scripts/gds/seed-gds-v4-tasks.js +6 -623
- package/scripts/gds/seed-governance-tasks.js +6 -339
- package/scripts/gds/seed-medusa-tasks.js +6 -439
- package/scripts/gds/seed-module-upstreaming.js +5 -217
- package/scripts/gds/seed-productization-tasks.js +6 -234
- package/scripts/gds/seed-project-admin-console-tasks.js +6 -88
- package/scripts/gds/seed-provisioning-tasks.js +6 -82
- package/scripts/gds/seed-staging.sh +7 -116
- package/scripts/gds/seed-strict-versioning-tasks.js +6 -274
- package/scripts/gds/seed-v2-world-tasks.js +6 -282
- package/scripts/gds/seed-verify-criteria.js +6 -124
- package/scripts/gds/sequence.js +6 -596
- package/scripts/gds/session-cost.js +6 -429
- package/scripts/gds/session-digest-build.js +6 -293
- package/scripts/gds/session-digest.js +6 -199
- package/scripts/gds/session-eval.js +6 -630
- package/scripts/gds/session-transcript-build.js +6 -155
- package/scripts/gds/session-transcript-upload.js +6 -29
- package/scripts/gds/session.js +6 -403
- package/scripts/gds/setup.js +6 -645
- package/scripts/gds/ship-check.js +5 -85
- package/scripts/gds/ship-deploy-target.js +5 -392
- package/scripts/gds/ship-escalation.js +5 -166
- package/scripts/gds/ship-finish.js +5 -419
- package/scripts/gds/ship-flow.js +5 -1216
- package/scripts/gds/ship-git.js +5 -99
- package/scripts/gds/ship-grade-steps.js +5 -546
- package/scripts/gds/ship-grade.js +5 -425
- package/scripts/gds/ship-honesty.js +5 -312
- package/scripts/gds/ship-io.js +5 -138
- package/scripts/gds/ship-land.js +5 -1129
- package/scripts/gds/ship-memory-sync.js +5 -248
- package/scripts/gds/ship-merge-gate.js +5 -224
- package/scripts/gds/ship-merge.js +5 -465
- package/scripts/gds/ship-mode-ask.js +5 -137
- package/scripts/gds/ship-mode-manual.js +5 -53
- package/scripts/gds/ship-preflight-steps.js +5 -398
- package/scripts/gds/ship-regen.js +5 -313
- package/scripts/gds/ship-resume.js +5 -200
- package/scripts/gds/ship-session-upload.js +5 -312
- package/scripts/gds/ship-state.js +5 -109
- package/scripts/gds/ship-surprise.js +5 -83
- package/scripts/gds/ship-visual.js +5 -74
- package/scripts/gds/ship.js +5 -380
- package/scripts/gds/shipping-mode.js +5 -69
- package/scripts/gds/skill-lint.js +5 -248
- package/scripts/gds/skill-preflight.js +5 -359
- package/scripts/gds/smoke-batch-claim.sh +7 -237
- package/scripts/gds/smoke-batch-release.sh +7 -315
- package/scripts/gds/smoke-claim-consistency.sh +7 -221
- package/scripts/gds/smoke-dependencies.sh +7 -142
- package/scripts/gds/smoke-gds.js +6 -255
- package/scripts/gds/smoke-write.sh +7 -274
- package/scripts/gds/source-text-test-scan.js +7 -0
- package/scripts/gds/spark.js +6 -293
- package/scripts/gds/stale-worktrees.js +5 -210
- package/scripts/gds/start-goals.js +5 -101
- package/scripts/gds/start.js +6 -1089
- package/scripts/gds/status.js +6 -544
- package/scripts/gds/strand-watch.js +5 -313
- package/scripts/gds/stranded-rows.js +5 -198
- package/scripts/gds/stray-unit-sweep.sh +7 -70
- package/scripts/gds/surface.js +5 -100
- package/scripts/gds/task.js +6 -272
- package/scripts/gds/test-path-guard.js +5 -97
- package/scripts/gds/triage.js +6 -741
- package/scripts/gds/turn-end-sound.js +5 -72
- package/scripts/gds/tweak-halt.js +5 -68
- package/scripts/gds/tweak-renders.js +5 -198
- package/scripts/gds/uat.js +6 -119
- package/scripts/gds/ui-kit-transform.js +5 -41
- package/scripts/gds/update-channel.js +5 -510
- package/scripts/gds/update-sweep.js +5 -827
- package/scripts/gds/upgrade-artist-gate.js +5 -45
- package/scripts/gds/upgrade-commit-identity.js +5 -31
- package/scripts/gds/upgrade-migrate.js +5 -223
- package/scripts/gds/upgrade-operator.js +6 -73
- package/scripts/gds/upgrade-outcome.js +5 -173
- package/scripts/gds/upgrade.js +5 -1497
- package/scripts/gds/validate-design.js +5 -10
- package/scripts/gds/version-close.js +6 -620
- package/scripts/gds/version-literal-guard.js +5 -138
- package/scripts/gds/version-select.js +5 -77
- package/scripts/gds/visual-review-nudge.js +5 -38
- package/scripts/gds/wedge-remedy.js +5 -173
- package/scripts/gds/worktree-claim-guard.js +5 -129
- package/scripts/gds/worktree.js +6 -448
- package/scripts/hall-preview/refresh-fixtures.js +1 -1
- package/scripts/hall-preview/server.js +2 -2
- package/scripts/migrate.sh +3 -3
- package/scripts/public-mirror-export.js +3 -3
- package/scripts/setup-builder.js +7 -7
- package/src/bongos/api-errors.js +1 -0
- package/src/bongos/api-prefix.js +1 -1
- package/src/bongos/auth-github.js +19 -3
- package/src/bongos/auth-idp.js +7 -0
- package/src/bongos/claim-attribution.js +2 -2
- package/src/bongos/core-moves.js +1 -1
- package/src/bongos/core-update.js +3 -3
- package/src/bongos/craft-mode.js +2 -2
- package/src/bongos/db-kernel.js +15 -3
- package/src/bongos/db.js +30 -4
- package/src/bongos/github-repos.js +1 -1
- package/src/bongos/llm-cache.js +1 -1
- package/src/bongos/llm-pricing.js +1 -1
- package/src/bongos/metrics.js +1 -1
- package/src/bongos/middleware/rate-limit.js +2 -2
- package/src/bongos/module-listing.js +93 -1
- package/src/bongos/module-scope-map.js +90 -85
- package/src/bongos/module-store.js +1 -1
- package/src/bongos/module-submissions.js +1 -1
- package/src/bongos/optimizer.js +1 -1
- package/src/bongos/package-registry.js +1 -1
- package/src/bongos/path-match.js +1 -1
- package/src/bongos/permission-path-check.js +3 -3
- package/src/bongos/platform-visibility-gate.js +3 -5
- package/src/bongos/prelaunch-gate.js +7 -6
- package/src/bongos/route-rank-check.js +2 -2
- package/src/bongos/routes/auth.js +15 -2
- package/src/bongos/routes/backup.js +1 -1
- package/src/bongos/routes/builders.js +29 -1
- package/src/bongos/routes/me.js +49 -18
- package/src/bongos/routes/modules.js +29 -9
- package/src/bongos/routes/public.js +3 -72
- package/src/bongos/schema-lag.js +1 -1
- package/src/bongos/sensitive-surfaces.js +1 -1
- package/src/bongos/serve-internal.js +65 -16
- package/src/bongos/software-update.js +2 -2
- package/src/bongos/upgrade-hold.js +3 -3
- package/src/hall-look.js +6 -5
- package/src/module-api.js +3 -3
- package/src/module-loader/catalog.js +1 -1
- package/src/module-loader/error-tally.js +3 -3
- package/src/module-loader/manifest-schema.js +3 -3
- package/src/platform-server.js +10 -0
- package/src/role-responsibilities.js +1 -1
- package/src/stale-timer.js +2 -2
- package/tests/accessibility_replay.mjs +1 -1
- package/tests/activity_rollup_order_db.mjs +1 -1
- package/tests/activity_snapshots_db.mjs +1 -1
- package/tests/adopt_detect.mjs +1 -1
- package/tests/adopt_import.mjs +1 -1
- package/tests/adopt_preflight.mjs +1 -1
- package/tests/adr_0089_scope.mjs +10 -7
- package/tests/adr_0162_citation.mjs +1 -1
- package/tests/adr_0162_gate_citation.mjs +1 -1
- package/tests/agent_invoke.mjs +1 -1
- package/tests/agent_invoke_live.mjs +3 -3
- package/tests/agents_cron_trigger.mjs +2 -2
- package/tests/agents_roster.mjs +1 -1
- package/tests/agents_sync.mjs +4 -4
- package/tests/allow_rule_guard.mjs +20 -20
- package/tests/api_alias_caller_ratchet.mjs +9 -10
- package/tests/api_alias_exceptions.mjs +7 -6
- package/tests/api_artifacts.mjs +214 -0
- package/tests/api_cli_flags.mjs +3 -3
- package/tests/api_client.mjs +56 -54
- package/tests/api_docs.mjs +30 -9
- package/tests/api_error_envelope_buildcheck.mjs +1 -1
- package/tests/api_msys_path_repair.mjs +2 -2
- package/tests/architect.mjs +1 -1
- package/tests/art_stage.mjs +2 -2
- package/tests/artifact_audit.mjs +2 -2
- package/tests/artifact_staleness.mjs +9 -9
- package/tests/atlas.mjs +1 -1
- package/tests/audit_deps.mjs +1 -1
- package/tests/audit_gate.mjs +1 -1
- package/tests/auth_flow_slice1.mjs +3 -3
- package/tests/auth_inactive_builder.mjs +43 -5
- package/tests/auth_session_expiry_db.mjs +16 -4
- package/tests/auth_session_ttl.mjs +23 -0
- package/tests/authorship_audit.mjs +2 -2
- package/tests/autobongos_cadence.mjs +1 -1
- package/tests/autobongos_fence.mjs +1 -1
- package/tests/autobongos_grade_cap.mjs +2 -2
- package/tests/autobongos_heartbeat_head.mjs +1 -1
- package/tests/autobongos_host_access.mjs +3 -3
- package/tests/autobongos_loop.mjs +17 -17
- package/tests/autobongos_service_ps1.mjs +3 -3
- package/tests/autobongos_tweak_lane.mjs +2 -2
- package/tests/autobongos_verify.mjs +2 -2
- package/tests/autonomous_fit_protected_paths.mjs +3 -3
- package/tests/autonomy_config_idle.mjs +1 -1
- package/tests/autonomy_digest.mjs +1 -1
- package/tests/autonomy_gate.mjs +1 -1
- package/tests/autonomy_gauge.mjs +2 -2
- package/tests/autonomy_runner_identity.mjs +1 -1
- package/tests/backfill_sessions.mjs +8 -8
- package/tests/backfill_subagent_rewards.mjs +1 -1
- package/tests/backfill_task_rewards.mjs +2 -2
- package/tests/backlog_review.mjs +3 -3
- package/tests/baseline_staleness.mjs +2 -2
- package/tests/bfg.mjs +11 -5
- package/tests/bfg_write.mjs +20 -11
- package/tests/blockers_hall.mjs +14 -4
- package/tests/blockers_page_ui.mjs +56 -12
- package/tests/bongos_dispatch.mjs +5 -5
- package/tests/bongos_login.mjs +2 -2
- package/tests/bug_attachment_audit.mjs +1 -1
- package/tests/bug_attachment_recover.mjs +2 -2
- package/tests/bug_triage.mjs +3 -3
- package/tests/build_info.mjs +1 -1
- package/tests/builder_tester_tag.mjs +184 -0
- package/tests/bump_version.mjs +3 -3
- package/tests/canonical_profile_url.mjs +1 -1
- package/tests/capture_error_format.mjs +1 -1
- package/tests/capture_goal_routing.mjs +2 -2
- package/tests/category_advisory_guard.mjs +3 -3
- package/tests/claim_error_surface.mjs +2 -2
- package/tests/claim_from_task_and_home.mjs +1 -1
- package/tests/claim_gate_open_blocker.mjs +7 -4
- package/tests/claim_gate_rebase.mjs +12 -8
- package/tests/claim_recall.mjs +4 -4
- package/tests/claim_resolve_worktree_lock.mjs +1 -1
- package/tests/claude_materialize.mjs +58 -58
- package/tests/clawback_confirmed_backlog.mjs +8 -5
- package/tests/cli_allowlist_permissions.mjs +11 -11
- package/tests/cli_dispatcher.mjs +2 -2
- package/tests/cli_err_code.mjs +6 -6
- package/tests/cli_exit_no_abort.mjs +7 -7
- package/tests/cli_lib_formatters.mjs +2 -2
- package/tests/cli_sessions.mjs +5 -5
- package/tests/cli_surface.mjs +15 -15
- package/tests/cli_token_reissue.mjs +2 -2
- package/tests/client_baseurl_guard.mjs +1 -1
- package/tests/client_bundle_route.mjs +35 -4
- package/tests/cloud_bongos_pack.mjs +1 -1
- package/tests/community_leaderboard_db.mjs +1 -1
- package/tests/conductor.mjs +18 -18
- package/tests/conflict_resolve.mjs +14 -16
- package/tests/consumer_layout_boot.mjs +12 -12
- package/tests/context_pack.mjs +6 -6
- package/tests/control_manifest.mjs +4 -4
- package/tests/copy_desk_page_reads.mjs +1 -1
- package/tests/copy_desk_page_release.mjs +192 -0
- package/tests/copy_inventory.mjs +2 -2
- package/tests/core_auto_upgrade.mjs +1 -1
- package/tests/core_move_notice.mjs +2 -2
- package/tests/core_origin_follow.mjs +7 -7
- package/tests/core_pin_sync.mjs +3 -3
- package/tests/core_upgrade_door.mjs +2 -2
- package/tests/core_upgrade_owner_door.mjs +34 -1
- package/tests/core_upgrade_runner.mjs +19 -19
- package/tests/credential_presence.mjs +2 -2
- package/tests/credit_grant.mjs +3 -3
- package/tests/credit_log_single_writer.mjs +5 -5
- package/tests/criterion_ref_status.mjs +2 -2
- package/tests/cross_discipline_priority_direction.mjs +3 -3
- package/tests/cutover_codemod.mjs +2 -4
- package/tests/db_backup_nightly.mjs +1 -1
- package/tests/db_backup_offsite.mjs +1 -1
- package/tests/db_ownership_handover.mjs +2 -2
- package/tests/dead_deps.mjs +3 -3
- package/tests/dependency_advisory.mjs +1 -1
- package/tests/deploy_audit_gate.mjs +4 -4
- package/tests/deploy_divergence_line.mjs +36 -16
- package/tests/deploy_page_projects.mjs +35 -4
- package/tests/dev_lib.mjs +2 -2
- package/tests/dev_windows.mjs +2 -2
- package/tests/diagram_facts_offset.mjs +1 -1
- package/tests/diagram_repo_slug.mjs +1 -1
- package/tests/diff_derived_signals.mjs +2 -2
- package/tests/dns_preflight.mjs +2 -2
- package/tests/do_api.mjs +3 -3
- package/tests/doc_cli_guard.mjs +28 -28
- package/tests/doc_comment_coverage.mjs +1 -1
- package/tests/doc_control_claims.mjs +11 -11
- package/tests/docs_entropy.mjs +2 -2
- package/tests/docs_openapi_route.mjs +8 -6
- package/tests/doctor_hooks.mjs +1 -1
- package/tests/edit_hints.mjs +3 -2
- package/tests/effective_visibility_predicate.mjs +3 -3
- package/tests/env_knobs_neutral_prefix.mjs +13 -13
- package/tests/exec_path_guard.mjs +4 -4
- package/tests/executed_closure.mjs +18 -12
- package/tests/file_map.mjs +1 -1
- package/tests/find_untested.mjs +13 -13
- package/tests/first_admin_bootstrap.mjs +1 -1
- package/tests/fitness.mjs +16 -16
- package/tests/fitness_gds_ratchet.mjs +2 -2
- package/tests/fitness_installed_core.mjs +3 -3
- package/tests/fitness_no_raw_nul.mjs +1 -1
- package/tests/fitness_ratchets.mjs +3 -3
- package/tests/fitness_scope_roster.mjs +2 -2
- package/tests/fitness_two_root.mjs +8 -8
- package/tests/fixtures/accessibility-replay.json +5 -5
- package/tests/fixtures/grade-replay/recorded-panel-grades.json +1 -1
- package/tests/fixtures/ideator-prefold/README.md +1 -1
- package/tests/fixtures/page-ledger.mjs +22 -0
- package/tests/fixtures/session-506-digest.json +5 -5
- package/tests/gate_approvals.mjs +50 -0
- package/tests/gate_review.mjs +8 -8
- package/tests/gating_review_retired.mjs +2 -2
- package/tests/gen_freshness.mjs +3 -3
- package/tests/git_guard.mjs +3 -3
- package/tests/git_merge_regen.mjs +41 -65
- package/tests/github_one_trip.mjs +4 -4
- package/tests/github_pick_up.mjs +2 -2
- package/tests/github_push_merge_driver.mjs +1 -1
- package/tests/go_live.mjs +3 -2
- package/tests/goal_category.mjs +1 -1
- package/tests/goal_cli.mjs +2 -2
- package/tests/goal_create_spec_entry.mjs +1 -1
- package/tests/goal_invite_consent.mjs +3 -1
- package/tests/goal_move.mjs +1 -1
- package/tests/goal_names.mjs +2 -2
- package/tests/goal_working_area.mjs +1 -1
- package/tests/government_agent_asks.mjs +7 -7
- package/tests/government_board_room_copy.mjs +6 -1
- package/tests/government_board_view.mjs +39 -0
- package/tests/government_board_vote_ui.mjs +39 -1
- package/tests/government_config.mjs +2 -2
- package/tests/government_live_proof_shape.mjs +1 -1
- package/tests/government_protected_surfaces.mjs +54 -53
- package/tests/government_require_permission.mjs +9 -1
- package/tests/government_vanilla_boot.mjs +1 -1
- package/tests/government_vocabulary.mjs +2 -2
- package/tests/government_walk.mjs +2 -2
- package/tests/grade_body_limit.mjs +6 -4
- package/tests/grade_correlation_audit.mjs +3 -3
- package/tests/grade_diff_hash.mjs +1 -1
- package/tests/grade_engine_replay.mjs +2 -2
- package/tests/grade_server_authoritative.mjs +1 -1
- package/tests/grade_unavailable_display.mjs +1 -1
- package/tests/grader.mjs +8 -24
- package/tests/grader_generated_provenance.mjs +14 -14
- package/tests/grader_no_artifact.mjs +1 -1
- package/tests/grader_prompt_fencing.mjs +1 -1
- package/tests/grader_quality_window_overflow.mjs +1 -1
- package/tests/grader_reader_lens.mjs +3 -3
- package/tests/grader_regrade_delta.mjs +1 -1
- package/tests/grader_unbacked_score.mjs +2 -2
- package/tests/hall_acclaim_vote_control.mjs +113 -0
- package/tests/hall_asset_cache.mjs +127 -0
- package/tests/hall_audit.mjs +63 -0
- package/tests/hall_board_world.mjs +20 -0
- package/tests/hall_city_card_words.mjs +61 -0
- package/tests/hall_client_request_shape.mjs +5 -1
- package/tests/hall_home_ships_bounded.mjs +160 -0
- package/tests/hall_landing_boot.mjs +15 -2
- package/tests/hall_nav.mjs +33 -0
- package/tests/hall_onboarding_bongos_setup.mjs +1 -1
- package/tests/hall_oversight_world.mjs +44 -4
- package/tests/hall_palette.mjs +12 -9
- package/tests/hall_preview_security.mjs +1 -1
- package/tests/hall_profile_world.mjs +17 -0
- package/tests/hall_reading_world.mjs +16 -1
- package/tests/hall_roster_world.mjs +2 -1
- package/tests/hall_studio_world.mjs +4 -1
- package/tests/hall_work_history_id.mjs +39 -0
- package/tests/held_tweak_reporting.mjs +4 -4
- package/tests/helpers.mjs +3 -3
- package/tests/home_bounded_reads.mjs +1 -1
- package/tests/home_isolation_guard.mjs +1 -1
- package/tests/hook_core_resolve.mjs +7 -7
- package/tests/hook_user_agents.mjs +1 -1
- package/tests/hooks_drain.mjs +2 -2
- package/tests/host_topology_skips.mjs +1 -1
- package/tests/howto_guide.mjs +1 -1
- package/tests/howto_moments.mjs +3 -3
- package/tests/hub_account_page.mjs +1 -1
- package/tests/idea_capture_grades.mjs +2 -2
- package/tests/idea_develop_spark.mjs +1 -1
- package/tests/idea_filed_via.mjs +2 -2
- package/tests/idea_ideate_full.mjs +1 -1
- package/tests/idea_spark_mark.mjs +1 -1
- package/tests/idea_spark_queue.mjs +1 -1
- package/tests/idea_triage.mjs +1 -1
- package/tests/idea_triage_grade.mjs +3 -3
- package/tests/idea_vote_permission.mjs +113 -0
- package/tests/idea_votes_fold_db.mjs +123 -0
- package/tests/infra_exec_paths.mjs +12 -12
- package/tests/init.mjs +2 -2
- package/tests/instance_db_migrated_on_code_move.mjs +5 -5
- package/tests/instance_feedback.mjs +9 -9
- package/tests/instance_mismatch_guard.mjs +2 -2
- package/tests/integration_parked_ratchet.mjs +24 -2
- package/tests/intent_retry.mjs +1 -1
- package/tests/interaction_posture.mjs +3 -3
- package/tests/invite_expiry_db.mjs +1 -1
- package/tests/joinability_invite_only.mjs +1 -1
- package/tests/karma_vote_lists.mjs +270 -0
- package/tests/key-card.mjs +2 -2
- package/tests/key-status.mjs +2 -2
- package/tests/knip_ratchet_ambient.mjs +2 -2
- package/tests/known_failing_ratchet.mjs +1 -1
- package/tests/land_watch.mjs +2 -2
- package/tests/landing_legal_pages.mjs +1 -1
- package/tests/landing_page.mjs +2 -2
- package/tests/leaderboard_roles.mjs +4 -1
- package/tests/leak_scan_allowlist.mjs +8 -8
- package/tests/leak_scan_fail_closed.mjs +1 -1
- package/tests/lib_sh_resolution.mjs +9 -9
- package/tests/lifecycle-card.mjs +7 -7
- package/tests/linkify_check.mjs +2 -2
- package/tests/linkify_refs.mjs +1 -1
- package/tests/llm-cache-route.mjs +1 -1
- package/tests/local_preview.mjs +2 -2
- package/tests/main_audit.mjs +3 -3
- package/tests/main_audit_attestation.mjs +1 -1
- package/tests/main_audit_db_roster.mjs +2 -2
- package/tests/main_worktree_busy_reason.mjs +3 -3
- package/tests/markdown_line_endings.mjs +2 -2
- package/tests/me_streak_leaderboard_queries.mjs +193 -0
- package/tests/membership_kind_lockstep.mjs +1 -1
- package/tests/memory_isolation.mjs +16 -8
- package/tests/memory_map.mjs +2 -2
- package/tests/memory_pull.mjs +33 -25
- package/tests/merge_driver_register.mjs +3 -3
- package/tests/migration_allocation.mjs +2 -2
- package/tests/migration_namespace.mjs +1 -1
- package/tests/migrations_forward_safe.mjs +1 -1
- package/tests/mingle.mjs +1 -1
- package/tests/mirror_lineage_fulltree.mjs +3 -3
- package/tests/mirror_lineage_proof.mjs +2 -2
- package/tests/mirror_redact.mjs +4 -4
- package/tests/missing_dep_classify.mjs +3 -3
- package/tests/module-scope-map.mjs +22 -22
- package/tests/module_api_lazy.mjs +1 -1
- package/tests/module_assess_docs.mjs +2 -2
- package/tests/module_assess_installs.mjs +3 -3
- package/tests/module_assess_price_parity.mjs +5 -5
- package/tests/module_assess_score.mjs +5 -5
- package/tests/module_assess_security.mjs +4 -4
- package/tests/module_assess_tests.mjs +3 -3
- package/tests/module_assessments_migration.mjs +1 -1
- package/tests/module_catalog.mjs +2 -2
- package/tests/module_cli.mjs +3 -3
- package/tests/module_entitlements.mjs +1 -1
- package/tests/module_error_counts.mjs +1 -1
- package/tests/module_install.mjs +4 -4
- package/tests/module_loader.mjs +3 -1
- package/tests/module_owned_tests.mjs +1 -1
- package/tests/module_release_channels.mjs +1 -1
- package/tests/module_store_howto.mjs +3 -3
- package/tests/module_store_listing.mjs +139 -2
- package/tests/module_store_publish.mjs +4 -4
- package/tests/module_store_publish_route.mjs +1 -1
- package/tests/module_store_reassess.mjs +1 -1
- package/tests/module_store_registry_migration.mjs +1 -1
- package/tests/module_test_runner.mjs +3 -3
- package/tests/module_update.mjs +4 -4
- package/tests/module_upgrade_updates.mjs +1 -1
- package/tests/move_escalation.mjs +2 -2
- package/tests/nav_permission_atoms.mjs +3 -2
- package/tests/needs_rebase.mjs +7 -3
- package/tests/newcomer_floor.mjs +1 -1
- package/tests/newcomer_generator.mjs +48 -0
- package/tests/next_number.mjs +1 -1
- package/tests/no_artifact_escalation.mjs +3 -3
- package/tests/npm_release_where.mjs +1 -1
- package/tests/oauth_secret.mjs +2 -2
- package/tests/onboard.mjs +6 -6
- package/tests/onboarding_gate.mjs +2 -2
- package/tests/opt_in_skill_modules.mjs +3 -3
- package/tests/own_scope_guard.mjs +1 -1
- package/tests/own_session_revoke.mjs +4 -1
- package/tests/package_core.mjs +10 -11
- package/tests/page_inventory.mjs +5 -5
- package/tests/page_reader.mjs +7 -7
- package/tests/page_tweak_hold.mjs +6 -6
- package/tests/parallel-load.mjs +1 -1
- package/tests/paste_token_api_base.mjs +1 -1
- package/tests/paste_token_session_store.mjs +2 -2
- package/tests/pending_invite_purge_db.mjs +1 -1
- package/tests/permission_path.mjs +1 -1
- package/tests/pin_replay.mjs +1 -1
- package/tests/pin_write_key.mjs +7 -7
- package/tests/plain_cards.mjs +15 -15
- package/tests/pr_assign.mjs +1 -1
- package/tests/pre_push_hook.mjs +3 -3
- package/tests/preflight_checks.mjs +2 -2
- package/tests/prelaunch_gate.mjs +1 -1
- package/tests/privacy_matrix.mjs +1 -1
- package/tests/probe_cache.mjs +6 -6
- package/tests/profile_connections_ui.mjs +4 -3
- package/tests/profile_fields.mjs +11 -1
- package/tests/profile_privacy_owner_view.mjs +1 -1
- package/tests/profile_role_headline.mjs +10 -9
- package/tests/project_admin_console_model.mjs +1 -1
- package/tests/projects_hub.mjs +1 -1
- package/tests/projects_hub_cloud_hop.mjs +1 -1
- package/tests/promote_goal_id.mjs +6 -6
- package/tests/promotion_sweep.mjs +1 -1
- package/tests/provision.mjs +24 -24
- package/tests/provision_account_identity.mjs +2 -2
- package/tests/provision_byo_host.mjs +1 -1
- package/tests/provision_caddy_wiring.mjs +2 -2
- package/tests/provision_disconnect.mjs +2 -2
- package/tests/provision_dns_first.mjs +1 -1
- package/tests/provision_render.mjs +9 -9
- package/tests/provision_repo_private.mjs +3 -3
- package/tests/provision_resource_caps.mjs +5 -5
- package/tests/provision_restart.mjs +3 -3
- package/tests/provision_settings_apply.mjs +7 -7
- package/tests/provision_teardown_address.mjs +2 -2
- package/tests/provisioning_capacity.mjs +5 -5
- package/tests/provisioning_credential_preflight.mjs +1 -1
- package/tests/provisioning_disconnect.mjs +1 -1
- package/tests/provisioning_error_note_scope.mjs +4 -4
- package/tests/provisioning_paid_shape_gate.mjs +2 -2
- package/tests/provisioning_planet_physics.mjs +16 -0
- package/tests/provisioning_runner_drift_notice.mjs +2 -2
- package/tests/provisioning_settings_env.mjs +1 -1
- package/tests/pruned_lockfile_integrity.mjs +1 -1
- package/tests/public_mirror_export.mjs +1 -1
- package/tests/publish_integration_gate.mjs +2 -2
- package/tests/publish_manifest.mjs +6 -6
- package/tests/publish_watch.mjs +1 -1
- package/tests/push_path_brief.mjs +2 -2
- package/tests/raise.mjs +248 -0
- package/tests/rank_roles_audit.mjs +1 -1
- package/tests/rank_tier_single_source.mjs +2 -2
- package/tests/rate_limit_public.mjs +1 -1
- package/tests/read_default_meter.mjs +2 -2
- package/tests/read_session_export.mjs +1 -1
- package/tests/rebase_gate_set_aside.mjs +1 -1
- package/tests/recall_cli.mjs +1 -1
- package/tests/recall_corpus_health.mjs +3 -2
- package/tests/recall_hints.mjs +1 -1
- package/tests/recruiter_sliver_boundary.mjs +1 -1
- package/tests/redteam_patrol.mjs +2 -2
- package/tests/regrade_actual_minutes.mjs +2 -2
- package/tests/regrade_eligibility.mjs +2 -2
- package/tests/release_core.mjs +2 -2
- package/tests/release_notes.mjs +4 -4
- package/tests/rename_history_restraint.mjs +3 -3
- package/tests/rename_ledger_prose.mjs +6 -6
- package/tests/render_api.mjs +1 -1
- package/tests/render_check.mjs +4 -4
- package/tests/render_deploy.mjs +1 -1
- package/tests/repo_info_binding.mjs +1 -1
- package/tests/repo_map.mjs +5 -5
- package/tests/reward_mode_cost_plus_only.mjs +7 -3
- package/tests/reward_mode_surfacing.mjs +1 -1
- package/tests/role_responsibilities.mjs +1 -1
- package/tests/route_permission_check.mjs +1 -1
- package/tests/route_shadow_guard.mjs +1 -1
- package/tests/route_validation.mjs +1 -1
- package/tests/routine_capture_kind.mjs +6 -6
- package/tests/routine_schedule.mjs +9 -9
- package/tests/run_routine.mjs +5 -5
- package/tests/run_routine_two_root.mjs +5 -5
- package/tests/runner_drift.mjs +17 -17
- package/tests/sandbox_stage.mjs +5 -5
- package/tests/scope_map_guard.mjs +7 -7
- package/tests/scouting_owner_access_and_reach.mjs +1 -1
- package/tests/scripts_gds_forwarders.mjs +224 -0
- package/tests/scrubber_corpus.mjs +2 -2
- package/tests/seam_wiring_guard.mjs +1 -1
- package/tests/search_ingest.mjs +2 -2
- package/tests/search_ingest_db.mjs +1 -1
- package/tests/search_ingest_nul.mjs +6 -6
- package/tests/seed_verify_criteria.mjs +3 -3
- package/tests/sequence.mjs +3 -3
- package/tests/served_paths_shipped.mjs +3 -3
- package/tests/session_506_regression.mjs +1 -1
- package/tests/session_accessibility.mjs +1 -1
- package/tests/session_caps.mjs +1 -1
- package/tests/session_cost.mjs +1 -1
- package/tests/session_digest.mjs +2 -2
- package/tests/session_eval.mjs +6 -6
- package/tests/session_index.mjs +1 -1
- package/tests/session_records.mjs +4 -4
- package/tests/session_rename_fallback.mjs +2 -2
- package/tests/session_reward_on_land.mjs +7 -149
- package/tests/session_reward_on_land_db.mjs +191 -0
- package/tests/session_reward_reconcile.mjs +6 -88
- package/tests/session_reward_reconcile_db.mjs +132 -0
- package/tests/session_transcript.mjs +1 -1
- package/tests/sessions_kit_pager.mjs +2 -1
- package/tests/setup_device_flow_fallback.mjs +2 -2
- package/tests/setup_smoke.mjs +12 -5
- package/tests/setup_status_facts.mjs +54 -12
- package/tests/ship_autolinkify.mjs +2 -2
- package/tests/ship_automerge_injection.mjs +1 -1
- package/tests/ship_base_flag.mjs +1 -1
- package/tests/ship_broadcast_routing.mjs +1 -1
- package/tests/ship_broadcast_server.mjs +2 -2
- package/tests/ship_builder_model.mjs +1 -1
- package/tests/ship_cannot_lie.mjs +9 -9
- package/tests/ship_card.mjs +2 -2
- package/tests/ship_ci_deploy.mjs +7 -7
- package/tests/ship_error_shape.mjs +1 -1
- package/tests/ship_land_ci_not_started.mjs +3 -3
- package/tests/ship_land_conflict.mjs +3 -3
- package/tests/ship_land_proof.mjs +3 -3
- package/tests/ship_land_red_pr.mjs +5 -5
- package/tests/ship_merge_gate.mjs +14 -14
- package/tests/ship_mode.mjs +1 -1
- package/tests/ship_mode_first_ship.mjs +4 -4
- package/tests/ship_mode_hands_off.mjs +8 -8
- package/tests/ship_post_land_verify.mjs +1 -1
- package/tests/ship_preflight.mjs +19 -19
- package/tests/ship_premerge.mjs +1 -1
- package/tests/ship_publish_error.mjs +2 -2
- package/tests/ship_push_diagnosis.mjs +1 -1
- package/tests/ship_regen_copy_inventory.mjs +3 -3
- package/tests/ship_resume.mjs +4 -4
- package/tests/ship_smoke_gate.mjs +1 -1
- package/tests/ship_upload_skip.mjs +1 -1
- package/tests/ship_upstream_deletion.mjs +1 -1
- package/tests/ship_vendored_instance.mjs +8 -8
- package/tests/ship_visual_regrade.mjs +3 -3
- package/tests/ship_zero_commit.mjs +1 -1
- package/tests/skill_docs_unavailable_regrade.mjs +3 -3
- package/tests/skill_friction_kind.mjs +1 -1
- package/tests/skill_grade_recover.mjs +1 -1
- package/tests/skill_grader_health.mjs +1 -1
- package/tests/skill_lint.mjs +1 -1
- package/tests/skill_menu_ruling.mjs +1 -1
- package/tests/skill_preflight.mjs +7 -7
- package/tests/skip_is_not_pass.mjs +22 -1
- package/tests/smoke_dependencies_witness.mjs +2 -2
- package/tests/smoke_preflight.mjs +1 -1
- package/tests/smoke_target.mjs +2 -2
- package/tests/smoke_write_contract.mjs +2 -2
- package/tests/sound_player.mjs +8 -8
- package/tests/source_text_test_ratchet.mjs +97 -0
- package/tests/speciality_corpus_scope.mjs +1 -1
- package/tests/speciality_session_skills.mjs +1 -1
- package/tests/sso_checkin_legacy_field_gone.mjs +4 -2
- package/tests/stale_timer.mjs +3 -3
- package/tests/stale_worktrees.mjs +1 -1
- package/tests/start_env_guard.mjs +1 -1
- package/tests/start_goal_first.mjs +3 -3
- package/tests/start_inbox_count.mjs +1 -1
- package/tests/start_rebase_warning.mjs +1 -1
- package/tests/status_default_version.mjs +3 -3
- package/tests/status_mirror_sync.mjs +1 -1
- package/tests/status_page_no_dead_uptime.mjs +80 -0
- package/tests/stop_refcheck.mjs +1 -1
- package/tests/strand_watch.mjs +1 -1
- package/tests/stranded_rows.mjs +1 -1
- package/tests/stuck_detector.mjs +14 -14
- package/tests/sweep_app_account.mjs +3 -3
- package/tests/task_cli.mjs +2 -2
- package/tests/task_detail_ui.mjs +11 -1
- package/tests/task_discipline_required.mjs +2 -2
- package/tests/task_list_paging.mjs +1 -1
- package/tests/task_visual_slots.mjs +2 -2
- package/tests/terms_acceptance.mjs +1 -1
- package/tests/terms_grandfather_db.mjs +1 -1
- package/tests/test_path_guard.mjs +1 -1
- package/tests/triage_development.mjs +1 -1
- package/tests/tweak_batch_apply.mjs +2 -2
- package/tests/tweak_land_heal.mjs +3 -3
- package/tests/tweak_unattended.mjs +3 -3
- package/tests/ui_design_skills.mjs +2 -2
- package/tests/unit_report_status.mjs +2 -2
- package/tests/unit_runner_serial.mjs +2 -2
- package/tests/unit_runner_teardown_abort.mjs +1 -1
- package/tests/update_channel.mjs +2 -2
- package/tests/update_channel_db.mjs +4 -4
- package/tests/update_subscription_engine.mjs +26 -26
- package/tests/update_sweep_home.mjs +14 -14
- package/tests/upgrade.mjs +11 -11
- package/tests/upgrade_artist_gate.mjs +4 -4
- package/tests/upgrade_commit_identity.mjs +2 -2
- package/tests/upgrade_migrate.mjs +7 -7
- package/tests/upgrade_operator.mjs +2 -2
- package/tests/upgrade_outcome.mjs +2 -2
- package/tests/upgrade_persist_pin.mjs +5 -5
- package/tests/upkeep_home.mjs +1 -1
- package/tests/version_close.mjs +2 -2
- package/tests/version_close_cli.mjs +2 -2
- package/tests/version_close_route.mjs +1 -1
- package/tests/version_literals.mjs +23 -23
- package/tests/visual_review.mjs +5 -5
- package/tests/wedge_remedy.mjs +5 -5
- package/tests/welcome_boot.mjs +116 -0
- package/tests/welcome_boot_browser.mjs +271 -0
- package/tests/wizard_born_first_board.mjs +3 -3
- package/tests/wizard_demo.mjs +1 -1
- package/tests/wizard_one_page.mjs +4 -3
- package/tests/wizard_physics.mjs +3 -1
- package/tests/wizard_physics_more.mjs +42 -3
- package/tests/work_title_wrap.mjs +1 -1
- package/tests/workflow_exec_paths.mjs +6 -6
- package/tests/worktree_claim_guard.mjs +1 -1
- package/tests/worktree_helper.mjs +2 -2
- package/tests/write_validation_gaps.mjs +3 -3
- package/scripts/gds/api.sh +0 -6
- package/scripts/gds/audit-exports.js +0 -128
- package/scripts/gds/resolve-skill-model.js +0 -57
- package/scripts/gds/security-baseline-check.sh +0 -180
- package/scripts/gds/spike-task-map.js +0 -899
- package/scripts/status-probe.mjs +0 -213
- package/src/bongos/uptime-poller.js +0 -93
- package/tests/government_fold_bench.mjs +0 -50
- package/tests/spike_task_map.mjs +0 -422
- package/tests/status-probe.mjs +0 -89
- /package/{scripts/gds → modules/raise}/CLAUDE.md +0 -0
- /package/scripts/{gds → bongos}/cloudbongos-token-isolation.conf +0 -0
- /package/scripts/{gds → bongos}/discipline-modes.json +0 -0
- /package/scripts/{gds → bongos}/retired-core-skills.json +0 -0
package/scripts/gds/module.js
CHANGED
|
@@ -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');
|