@bongos/core 1.21.174 → 1.21.176
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.bongos-core.json +3565 -1515
- 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 +1389 -1437
- package/docs/copy-registry.json +2160 -2634
- 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 +6 -2
- 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 +25 -1
- package/docs/page-readings.json +4388 -4602
- 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 +6 -4
- package/modules/hall-ui/public/blockers.js +39 -27
- package/modules/hall-ui/public/board-room.css +5 -12
- package/modules/hall-ui/public/board-room.html +6 -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-inbox.js +69 -86
- 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-ask.css +57 -0
- package/modules/hall-ui/public/hall-ask.js +50 -0
- 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 +15 -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 +33 -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 +178 -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 +17 -5
- 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_attention_cards.mjs +2 -0
- 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/rot_inbox.mjs +10 -7
- 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
|
@@ -0,0 +1,1200 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
// scripts/bongos/package-core.js — produce the Cloud Bongos CORE as a versioned,
|
|
5
|
+
// installable, PINNABLE artifact a downstream project vendors.
|
|
6
|
+
// GDS-V4 R84 (task 1688), implementing ADR 0100 §1 (the two-repo instance model).
|
|
7
|
+
//
|
|
8
|
+
// This is the FIRST step of the R84 → R85 → R86 spine: package the core (here) →
|
|
9
|
+
// stand Mercury up on a pinned core (R85, #1689) → make `bongos upgrade` a real
|
|
10
|
+
// update-consumption channel (R86, #1690). A Cloud Bongos *instance* may be a
|
|
11
|
+
// SEPARATE repository that installs a pinned version of this core and layers its
|
|
12
|
+
// own content/branding/modules on top (the physical realization of ADR 0062 §1).
|
|
13
|
+
//
|
|
14
|
+
// WHAT "the core" IS — reused, never re-defined:
|
|
15
|
+
// The core is exactly the subtree scripts/bongos/publish-manifest.isPublishable()
|
|
16
|
+
// already defines (ADR 0098) — the portable methodology + platform + neutral
|
|
17
|
+
// branding. There is NO second allow-list here; this tool CONSUMES that one.
|
|
18
|
+
//
|
|
19
|
+
// HOW IT DIFFERS FROM public-mirror-export.js (R72 / ADR 0099):
|
|
20
|
+
// - The mirror is the DELAYED (≈6-month), redacted, PUBLIC open-source surface —
|
|
21
|
+
// a whole separate git repo, published on a schedule. Its job is transparency,
|
|
22
|
+
// so it REDACTS every file (topology + brand kept out of a world-readable repo).
|
|
23
|
+
// - This artifact is a CURRENT, versioned, installable UNIT a downstream repo
|
|
24
|
+
// vendors + pins to a version. Its job is dependency consumption. No lag. It must
|
|
25
|
+
// BOOT, so functional files ship VERBATIM — redacting them corrupts npm integrity
|
|
26
|
+
// hashes + SQL identifiers (the R88 boot failure; task 1824). Only DOCS (.md) are
|
|
27
|
+
// genericized; brand/topology in code ships as-is (public, not secrets).
|
|
28
|
+
// The two share the same file SELECTION (isPublishable) and REUSE the same redaction
|
|
29
|
+
// primitives (redactBlob/findLeaks), but apply them differently — see processCoreFile.
|
|
30
|
+
//
|
|
31
|
+
// ONE FAIL-CLOSED PASS (task 1824 — docs redacted, functional verbatim):
|
|
32
|
+
// 1. Resolve the source ref → commit; enumerate its tree (git ls-tree).
|
|
33
|
+
// 2. PARTITION through isPublishable() — the single source of truth.
|
|
34
|
+
// 3. Per file, IN MEMORY (processCoreFile): DOCS (.md) are genericized + secret-scrubbed
|
|
35
|
+
// like the mirror; FUNCTIONAL files are kept VERBATIM and scanned only for an exact
|
|
36
|
+
// live-credential leak (brand/IP hits are non-fatal ADVISORIES, surfaced for a human).
|
|
37
|
+
// 3b. RELEASE NOTES (task 1004218): release-notes.json — what each release brought in,
|
|
38
|
+
// generated from the ref's HISTORY (scripts/bongos/release-notes.js), its prose redacted
|
|
39
|
+
// exactly like a doc, and pinned like every other file. Skipped, with a line saying
|
|
40
|
+
// so, where there is no history to read (--from-worktree, a shallow clone).
|
|
41
|
+
// 4. NO-LEAK GATE (fail-closed): if any DOC leaks post-redaction, or any FUNCTIONAL file
|
|
42
|
+
// carries a live credential verbatim, PRODUCE NOTHING — dist/ is never touched. The
|
|
43
|
+
// in-memory pass makes the abort atomic (same discipline as the mirror export).
|
|
44
|
+
// 5. Only when the whole set is clean: write the tree to
|
|
45
|
+
// dist/bongos-core-<version>/, the .tgz, and the pin MANIFEST.
|
|
46
|
+
//
|
|
47
|
+
// THE VERSION STAMP is the platform version — src/module-api.js CORE_VERSION,
|
|
48
|
+
// read via the SAME fail-soft accessor scripts/bongos/module.js + bongos upgrade use
|
|
49
|
+
// (task 1203). That shared coordinate is what keeps the R84→R86 spine coherent.
|
|
50
|
+
//
|
|
51
|
+
// THE PIN is `tree_sha256` in the manifest: a canonical hash over the redacted
|
|
52
|
+
// core files (path\0mode\0filehash per line, sorted). It is INDEPENDENT of the
|
|
53
|
+
// tar/gzip byte layout, so a consumer pins on { core_version, source_commit,
|
|
54
|
+
// tree_sha256 } and verifies an install by recomputing it from the unpacked tree.
|
|
55
|
+
// The manifest ALSO records tarball.sha256 to verify the exact downloaded bytes.
|
|
56
|
+
//
|
|
57
|
+
// USAGE:
|
|
58
|
+
// node scripts/bongos/package-core.js [--ref <git-ref> | --from-worktree] [--out-dir dist]
|
|
59
|
+
// [--version <v>] [--droplet-ip <ip>] [--self-verify [--self-verify-boot]] [--publish [--live]]
|
|
60
|
+
// Defaults: --ref HEAD, --out-dir dist, --version = platform CORE_VERSION.
|
|
61
|
+
// --from-worktree build from the files ON DISK instead of a commit, for a core checkout
|
|
62
|
+
// that carries no git history — which is exactly what the shipped
|
|
63
|
+
// self-host image is (.dockerignore excludes .git by design), and the
|
|
64
|
+
// only way the provisioning scaffold inside it can vendor a core into a
|
|
65
|
+
// child instance (task 1003995). Selection is unchanged (isPublishable);
|
|
66
|
+
// the artifact simply has no commit to anchor to, so source_commit is null
|
|
67
|
+
// and the tree_sha256 pin is the whole lineage. It packages what is ON DISK,
|
|
68
|
+
// which in the image is exactly what `COPY . .` put there — so on a DEV
|
|
69
|
+
// checkout prefer the ref build: measured on this repo the two select an
|
|
70
|
+
// IDENTICAL 2793-file set, but a Windows working tree hands back CRLF where
|
|
71
|
+
// the blob is LF, which changes every text file's hash and would ship a
|
|
72
|
+
// CRLF shebang. That is why rung 4 in provision-repo.js is reached only
|
|
73
|
+
// when there is no history to build from.
|
|
74
|
+
// --self-verify after building, prove the artifact reproduces its pin (unpack the .tgz,
|
|
75
|
+
// recompute tree_sha256 == manifest + verify tarball.sha256). Fatal on mismatch.
|
|
76
|
+
// (task 1002218 / audit H3) — deterministic + network-free.
|
|
77
|
+
// --self-verify-boot ALSO `npm install <tgz>` into a throwaway consumer + boot /healthz
|
|
78
|
+
// (reuses tests/consumer_layout_boot.mjs; needs npm/registry access).
|
|
79
|
+
// --no-leak-scan THE ONLY ESCAPE from the post-build leak scan: skips it entirely.
|
|
80
|
+
// The scan is FAIL-CLOSED by default — an un-allowlisted prior-instance
|
|
81
|
+
// literal in the built artifact aborts the build (task 1003870 / H6).
|
|
82
|
+
// --leak-scan-strict accepted as an explicit no-op; fatal IS the default since task
|
|
83
|
+
// 1003870. Kept so CI can state the intent it relies on out loud.
|
|
84
|
+
// Outputs (nothing is committed — dist/ is gitignored):
|
|
85
|
+
// dist/bongos-core-<version>/ the redacted core tree (inspectable)
|
|
86
|
+
// dist/bongos-core-<version>.tgz the installable unit
|
|
87
|
+
// dist/bongos-core-<version>.manifest.json the PIN (tree hash + per-file hashes)
|
|
88
|
+
// --publish after building, `npm publish` the .tgz as a PUBLIC scoped
|
|
89
|
+
// package (--access public). DRY-RUN unless --live is added
|
|
90
|
+
// (task 1003872 / ADR 0283, superseding ADR 0134's restricted
|
|
91
|
+
// posture). Needs `npm login` as a member of the @bongos org;
|
|
92
|
+
// this script holds no token.
|
|
93
|
+
|
|
94
|
+
const fs = require('node:fs');
|
|
95
|
+
const os = require('node:os');
|
|
96
|
+
const path = require('node:path');
|
|
97
|
+
const zlib = require('node:zlib');
|
|
98
|
+
const crypto = require('node:crypto');
|
|
99
|
+
const { execFileSync, spawnSync } = require('node:child_process');
|
|
100
|
+
|
|
101
|
+
const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
102
|
+
|
|
103
|
+
// Reuse — never re-type. The core definition, the redaction, and the tree parser
|
|
104
|
+
// all already exist and are unit-tested at their homes.
|
|
105
|
+
const { isPublishable, PUBLISH_ALLOWLIST } = require(path.join(REPO_ROOT, 'scripts/bongos/publish-manifest.js'));
|
|
106
|
+
const { sha256hex, canonicalTreeHash, normalizeMode, octal, tarChecksum, ustarHeader, splitUstarName, buildTar } = require('./artifact-format');
|
|
107
|
+
const {
|
|
108
|
+
buildRedactionRules, collectSensitiveLiterals, findLeaks,
|
|
109
|
+
} = require(path.join(REPO_ROOT, 'scripts/bongos/mirror-redact.js'));
|
|
110
|
+
const { collectEnvSecrets } = require(path.join(REPO_ROOT, 'modules/security/secret-scrub.js'));
|
|
111
|
+
const { redactBlob, parseLsTree } = require(path.join(REPO_ROOT, 'scripts/public-mirror-export.js'));
|
|
112
|
+
const { partitionHits, unusedEntries } = require(path.join(REPO_ROOT, 'scripts/bongos/leak-scan-allowlist.js'));
|
|
113
|
+
// The release notes shipped beside package.json (task 1004218). Required by a literal path:
|
|
114
|
+
// the module is pure and requires nothing, so it adds no computed require to this file's
|
|
115
|
+
// executed closure (tests/executed_closure.mjs counts those).
|
|
116
|
+
const {
|
|
117
|
+
RELEASE_NOTES_FILE, RELEASE_NOTES_MAX_BYTES, generateReleaseNotes, boundReleaseNotes, serializeReleaseNotes,
|
|
118
|
+
} = require('./release-notes.js');
|
|
119
|
+
|
|
120
|
+
// The generated API spec, reference and typed client (task 1004866): gitignored, so never
|
|
121
|
+
// in a ref's tree — generated into every tarball by generateApiArtifacts() below.
|
|
122
|
+
const { API_ARTIFACT_PATHS } = require('./api-artifacts.js');
|
|
123
|
+
|
|
124
|
+
const MANIFEST_SCHEMA = 1;
|
|
125
|
+
const ARTIFACT_NAME = 'bongos-core';
|
|
126
|
+
// The tar internal root MUST be `package/` — that is the one hardcoded npm
|
|
127
|
+
// convention for an installable tarball (`npm install ./x.tgz` / `npm pack`
|
|
128
|
+
// output both use it; npm does not read the directory name to find package.json,
|
|
129
|
+
// it always looks for `package/package.json`). The ARTIFACT_NAME-named on-disk
|
|
130
|
+
// stage dir (stageDirName, below) is unrelated — that is just a local inspection
|
|
131
|
+
// path, not what ships inside the .tgz (ADR 0108 §2, task 1882).
|
|
132
|
+
const TAR_ROOT = 'package/';
|
|
133
|
+
// The self-describing manifest carried INSIDE the artifact (minus tarball.* — a
|
|
134
|
+
// file cannot contain its own hash). The authoritative PIN is the side-car next
|
|
135
|
+
// to the .tgz, which adds tarball.{sha256,bytes}.
|
|
136
|
+
const INNER_MANIFEST = `${TAR_ROOT}.bongos-core.json`;
|
|
137
|
+
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
// The platform version — read CORE_VERSION via the doorway, lazily + fail-soft,
|
|
140
|
+
// mirroring scripts/bongos/module.js:coreVersion() so this artifact stamps the SAME
|
|
141
|
+
// coordinate `bongos upgrade` and the module loader compare against (task 1203).
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
function coreVersion() {
|
|
144
|
+
try { return require(path.join(REPO_ROOT, 'src/module-api')).CORE_VERSION; }
|
|
145
|
+
catch { return '1.0.0'; }
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
// Pure helpers (exported for tests — no I/O, no git, no network)
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// CONSUMER-CORE extraction policy (task 1824) — the file-classification layer.
|
|
155
|
+
//
|
|
156
|
+
// The R84 packager wrongly reused the PUBLIC-MIRROR redaction (redactBlob) over EVERY
|
|
157
|
+
// file, which CORRUPTED the functional core: the secret scrubber blanks npm integrity
|
|
158
|
+
// hashes (base64 → looks secret) + Postgres identifiers (matched an env-secret substring),
|
|
159
|
+
// which broke `npm ci` and turned 63 migrations into `CREATE FUNCTION <redacted>()` SQL
|
|
160
|
+
// errors — the R88 boot failure (proof: docs/reviews/2026-07-03-cloud-bongos-separation-proof.md).
|
|
161
|
+
//
|
|
162
|
+
// The correction: the consumer core takes FUNCTIONAL files (code, SQL, JSON, lockfiles —
|
|
163
|
+
// everything that is not a .md doc) VERBATIM. Redaction stays a DOCS + public-mirror
|
|
164
|
+
// concern (ADR 0099). Brand identity (domain/owner/world) and the droplet IP legitimately
|
|
165
|
+
// pepper the functional core — hall-link comments (`example.com/builders#/task/N`), the
|
|
166
|
+
// `DROPLET` deploy constant in ship.js, seed migrations — and are PUBLIC, not secrets, so
|
|
167
|
+
// they ship as-is (a downstream instance rebrands via config) and are only WARNED about,
|
|
168
|
+
// never scrubbed or aborted-on. Aborting on them would fail ~189 files and the extraction
|
|
169
|
+
// would never succeed. The ONE hard gate on a functional file is an exact live-CREDENTIAL
|
|
170
|
+
// match (an env-secret VALUE appearing verbatim) — that IS a real leak. Genuine secrets are
|
|
171
|
+
// already kept out at SOURCE (husky + CI TruffleHog) and .env* is manifest-excluded, so this
|
|
172
|
+
// gate has ~zero false positives (a real high-entropy token never appears by accident).
|
|
173
|
+
// ---------------------------------------------------------------------------
|
|
174
|
+
const DOC_RE = /\.(md|markdown)$/i;
|
|
175
|
+
function isDocPath(p) { return DOC_RE.test(String(p || '')); }
|
|
176
|
+
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
// Agent-doc STUB (task 2121; surfaced by the 2026-07-08 demo task-creation audit).
|
|
179
|
+
// Claude Code AUTO-LOADS the nearest file named CLAUDE.md (or AGENTS.md) into the
|
|
180
|
+
// live session whenever an agent opens a sibling file. In a CONSUMER instance the
|
|
181
|
+
// core installs at node_modules/@bongos/core/, so the core repo's OWN CLAUDE.md tree
|
|
182
|
+
// (root + scripts/bongos + src/bongos + every module) would silently inject the
|
|
183
|
+
// platform's project memory — wrong project title, hundreds of lines, dangling links
|
|
184
|
+
// — into the instance's context the moment an agent reads any core file.
|
|
185
|
+
// The PUBLIC MIRROR deliberately publishes CLAUDE.md as the portable methodology
|
|
186
|
+
// (ADR 0065 §4), so this cannot live in the shared publish-manifest — it is a
|
|
187
|
+
// package-core-only transform. We keep the files PRESENT (nothing that probes for
|
|
188
|
+
// them by path breaks) but replace their body with a tiny, brand-free stub, turning
|
|
189
|
+
// the auto-load into a harmless "this doesn't govern you" redirect.
|
|
190
|
+
const AGENT_DOC_RE = /(^|\/)(CLAUDE|AGENTS)\.md$/i;
|
|
191
|
+
function isAgentDoc(p) { return AGENT_DOC_RE.test(String(p || '')); }
|
|
192
|
+
const CORE_AGENT_DOC_STUB = `# @bongos/core — installed platform dependency (not your project's CLAUDE.md)
|
|
193
|
+
|
|
194
|
+
This file is a placeholder shipped inside the **@bongos/core** package. The core's own
|
|
195
|
+
internal agent notes are intentionally omitted from the published artifact so they cannot
|
|
196
|
+
load into your instance's context.
|
|
197
|
+
|
|
198
|
+
**It does not govern this repository.** Your own root \`CLAUDE.md\`, your \`.claude/\`
|
|
199
|
+
directory, and the live Bongos database are the source of truth for how work happens here
|
|
200
|
+
and who may do what.
|
|
201
|
+
|
|
202
|
+
You are seeing this only because an agent opened a file under \`node_modules/@bongos/core/\`.
|
|
203
|
+
Nothing in here needs to be read to use the platform — run \`bongos help\` for commands.
|
|
204
|
+
|
|
205
|
+
_To work ON the platform core itself, use the standalone @bongos/core source repository,
|
|
206
|
+
not this vendored copy._
|
|
207
|
+
`;
|
|
208
|
+
|
|
209
|
+
// Fail-loud gate for a FUNCTIONAL file: only an exact live-credential value (an env-secret
|
|
210
|
+
// VALUE present verbatim, >= 8 chars) is a real leak. The sample is withheld (it's a secret).
|
|
211
|
+
function functionalSecretLeaks(view, envSecrets) {
|
|
212
|
+
const out = [];
|
|
213
|
+
for (const s of envSecrets || []) {
|
|
214
|
+
if (typeof s === 'string' && s.length >= 8 && view.includes(s)) out.push({ label: 'live-credential' });
|
|
215
|
+
}
|
|
216
|
+
return out;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Classify + process one publishable file → { buf, leaks, advisories, kind }.
|
|
220
|
+
// * DOC (.md): genericized + secret-scrubbed like the mirror (redactBlob), gated with the
|
|
221
|
+
// full detector — a downstream's vendored ADRs/recipes should not carry this brand. Any
|
|
222
|
+
// residual leak after redaction is FATAL (`leaks`).
|
|
223
|
+
// * FUNCTIONAL: VERBATIM buffer. `leaks` = exact live-credential matches only (FATAL).
|
|
224
|
+
// `advisories` = brand-identity substrings + public IPs that ship as-is (non-fatal, for
|
|
225
|
+
// human awareness) — REUSES findLeaks so the detector is defined once.
|
|
226
|
+
function processCoreFile({ pathRel, raw, rules, sensitiveLiterals, envSecrets, knownDocNames }) {
|
|
227
|
+
// An auto-loaded agent doc (CLAUDE.md/AGENTS.md) → ship a brand-free stub, never the
|
|
228
|
+
// core's own project memory (task 2121). The stub is brand-free by construction, so it
|
|
229
|
+
// needs no redaction and can never leak — it short-circuits ahead of the doc path.
|
|
230
|
+
if (isAgentDoc(pathRel)) {
|
|
231
|
+
return { buf: Buffer.from(CORE_AGENT_DOC_STUB, 'utf8'), leaks: [], advisories: [], kind: 'stub' };
|
|
232
|
+
}
|
|
233
|
+
if (isDocPath(pathRel)) {
|
|
234
|
+
const r = redactBlob({ buf: raw, rules, sensitiveLiterals, envSecrets, knownDocNames });
|
|
235
|
+
const leaks = r.leaks.map((l) => ({ label: `doc:${l.label}`, sample: l.sample }));
|
|
236
|
+
if (r.secret) leaks.push({ label: 'doc:secret-shape' });
|
|
237
|
+
return { buf: r.buf, leaks, advisories: [], kind: 'doc' };
|
|
238
|
+
}
|
|
239
|
+
const view = raw.toString('latin1'); // ASCII-safe byte view for both text + binary
|
|
240
|
+
return {
|
|
241
|
+
buf: raw,
|
|
242
|
+
leaks: functionalSecretLeaks(view, envSecrets),
|
|
243
|
+
advisories: findLeaks(view, sensitiveLiterals),
|
|
244
|
+
kind: 'functional',
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// ---------------------------------------------------------------------------
|
|
249
|
+
// npm-STRIPPED special files (idea 1000543) — the file-SELECTION gate that keeps
|
|
250
|
+
// the pin HONEST about what a consumer actually installs.
|
|
251
|
+
//
|
|
252
|
+
// `npm install <tgz>` never materializes certain special files into the installed
|
|
253
|
+
// package — most notably `.gitignore` (confirmed live: installing the 1.18.1 core
|
|
254
|
+
// .tgz drops exactly one file, ./.gitignore), plus `.npmignore` and `.npmrc`. But
|
|
255
|
+
// package-core enumerates the GIT tree, so isPublishable() happily selects a tracked
|
|
256
|
+
// `.gitignore`. If it lands in the manifest files[] + tree_sha256 pin, the tree a
|
|
257
|
+
// consumer recomputes over node_modules/@bongos/core is MISSING it → verifyInstalledPin
|
|
258
|
+
// (upgrade.js) reports `missing installed file: .gitignore` → hash mismatch → the bump
|
|
259
|
+
// auto-rolls-back. That breaks EVERY vendored `bongos upgrade` with pin-verify ON, and
|
|
260
|
+
// the unattended auto-upgrade subscription (task 2150 / ADR 0136) has no way to pass
|
|
261
|
+
// --skip-pin-verify — so it would roll back every patch (the fix reported in idea 1000543).
|
|
262
|
+
//
|
|
263
|
+
// The manifest must describe exactly what npm installs, so these files are dropped BEFORE
|
|
264
|
+
// they enter the tarball, filesMeta, or the pin (main(), below). Matched by BASENAME at any
|
|
265
|
+
// depth — npm strips nested ones too. The asymmetry is deliberately safe: excluding a file
|
|
266
|
+
// npm WOULD have kept only slightly weakens the pin (verifyInstalledPin iterates the manifest
|
|
267
|
+
// files[], so an un-pinned file is simply not checked); FAILING to exclude one npm strips is
|
|
268
|
+
// FATAL. And these files are useless inside a vendored dependency anyway.
|
|
269
|
+
const NPM_STRIPPED_BASENAMES = new Set(['.gitignore', '.npmignore', '.npmrc']);
|
|
270
|
+
function isNpmStripped(pathRel) {
|
|
271
|
+
const base = String(pathRel || '').split('/').pop();
|
|
272
|
+
return NPM_STRIPPED_BASENAMES.has(base);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// ---------------------------------------------------------------------------
|
|
276
|
+
// The CORE's own package.json + package-lock.json (task 1882, ADR 0108 §2).
|
|
277
|
+
//
|
|
278
|
+
// The source repo's package.json/package-lock.json (isPublishable() includes
|
|
279
|
+
// both) are GAME-heavy — colyseus/phaser/sharp/discord.js plus the repo's own
|
|
280
|
+
// name/version — and are not what a downstream `npm install @bongos/core`
|
|
281
|
+
// should see. These two files are SYNTHESIZED here (never copied verbatim from
|
|
282
|
+
// git) and staged in their place. Everything else still ships through the
|
|
283
|
+
// normal isPublishable()/processCoreFile path.
|
|
284
|
+
//
|
|
285
|
+
// Core deps are express + pg + pino (+ an undici pin) — ADR 0108 §Context.
|
|
286
|
+
// pino joined the core boot path with the structured logger (task 1003130:
|
|
287
|
+
// platform-server → serve-internal → routes → middleware/audit → logger); a
|
|
288
|
+
// published core without it crashes MODULE_NOT_FOUND at startup (task 1003160).
|
|
289
|
+
// discord.js (+ its undici requirement) is an OPTIONAL MODULE dependency, not
|
|
290
|
+
// core; a consumer that enables the discord module installs it itself.
|
|
291
|
+
const CORE_DEP_NAMES = ['express', 'pg', 'pino'];
|
|
292
|
+
|
|
293
|
+
// Pure — takes the source package.json's `dependencies`/`overrides` as plain
|
|
294
|
+
// objects so this is unit-testable with no disk I/O. Throws if a required core
|
|
295
|
+
// dep is missing from the source (a real inconsistency, not a silent drop).
|
|
296
|
+
function buildPackageJson({ version, sourceDeps, sourceOverrides }) {
|
|
297
|
+
const dependencies = {};
|
|
298
|
+
for (const name of CORE_DEP_NAMES) {
|
|
299
|
+
const range = sourceDeps && sourceDeps[name];
|
|
300
|
+
if (!range) throw new Error(`package-core: source package.json is missing required core dependency "${name}"`);
|
|
301
|
+
dependencies[name] = range;
|
|
302
|
+
}
|
|
303
|
+
const pkg = {
|
|
304
|
+
name: '@bongos/core',
|
|
305
|
+
version,
|
|
306
|
+
description: 'Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).',
|
|
307
|
+
license: 'AGPL-3.0-or-later',
|
|
308
|
+
main: 'src/platform-server.js',
|
|
309
|
+
bin: { bongos: 'bin/bongos.js' },
|
|
310
|
+
// Named exports a consumer imports directly, alongside the default entry
|
|
311
|
+
// (buildPlatformApp, from `main`). Two groups:
|
|
312
|
+
// • the platform surface — serve-internal (the shared host-routing surface
|
|
313
|
+
// both server.js and platform-server.js call) + the module-api doorway a
|
|
314
|
+
// module's routes/seams are authored against.
|
|
315
|
+
// • the GAME-HOST KIT (rehearsal F3, task 2161) — the core internals a
|
|
316
|
+
// game-bearing instance's own entrypoint (server.js, kept host per task
|
|
317
|
+
// 2134) wires directly: the API-404 shaping, the uptime poller, the module
|
|
318
|
+
// loader, the enabled-module gate, and the seam registry. A game-less
|
|
319
|
+
// instance boots via `.`/platform-server.js and never imports these; a game
|
|
320
|
+
// instance's server.js requires them, and the cutover codemod
|
|
321
|
+
// (scripts/bongos/cutover-codemod.js) rewrites its relative `./src/*` requires
|
|
322
|
+
// to exactly these subpaths. Every subpath the codemod's CORE_INTERNAL_MAP
|
|
323
|
+
// targets MUST appear here or the rewritten require won't resolve.
|
|
324
|
+
exports: {
|
|
325
|
+
'.': './src/platform-server.js',
|
|
326
|
+
'./serve-internal': './src/bongos/serve-internal.js',
|
|
327
|
+
'./module-api': './src/module-api.js',
|
|
328
|
+
'./bongos/api-path-404': './src/bongos/api-path-404.js',
|
|
329
|
+
'./module-loader/loader': './src/module-loader/loader.js',
|
|
330
|
+
'./modules': './src/modules.js',
|
|
331
|
+
'./module-seams': './src/module-seams.js',
|
|
332
|
+
},
|
|
333
|
+
engines: { node: '>=22' },
|
|
334
|
+
// Distribution posture: PUBLIC (task 1003872, ADR 0283 — supersedes ADR 0134's
|
|
335
|
+
// pre-launch `restricted`). The private posture existed so a pre-launch artifact
|
|
336
|
+
// could not leak; what it actually cost was that a tokenless `npm install` 404s,
|
|
337
|
+
// which broke every co-tenant upgrade, the nightly auto-upgrade sweep (silently,
|
|
338
|
+
// since 2026-08-25), and every newly scaffolded instance.
|
|
339
|
+
//
|
|
340
|
+
// The safety this replaces is NOT "nobody can read it" — it is the three gates
|
|
341
|
+
// that now run on every build: the branding/credential no-leak gate, the
|
|
342
|
+
// prior-instance leak scan (fatal by default since task 1003870), and the
|
|
343
|
+
// fixture confirmation of task 1003871. Those decide what is IN the tarball;
|
|
344
|
+
// access decides who may fetch it. Do not re-conflate them.
|
|
345
|
+
publishConfig: { access: 'public' },
|
|
346
|
+
dependencies,
|
|
347
|
+
};
|
|
348
|
+
if (sourceOverrides && sourceOverrides.undici) pkg.overrides = { undici: sourceOverrides.undici };
|
|
349
|
+
return pkg;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// ---------------------------------------------------------------------------
|
|
353
|
+
// package-lock.json pruning — restrict the shipped lockfile to the CORE's own
|
|
354
|
+
// dependency closure (express + pg), dropping the game's ~225 other transitive
|
|
355
|
+
// packages. Pure + OFFLINE: walks the EXISTING (already-resolved) lockfile
|
|
356
|
+
// graph with the same node_modules lookup order Node's own require() uses
|
|
357
|
+
// (check "<pkgPath>/node_modules/<dep>", then walk up stripping the trailing
|
|
358
|
+
// "node_modules/<segment>" and retry, up to the top-level "node_modules/<dep>")
|
|
359
|
+
// rather than re-resolving against the npm registry — so packaging never needs
|
|
360
|
+
// network access, and can never disagree with how the source lockfile itself
|
|
361
|
+
// was resolved (verified against the live 307-package lockfile: an 82-package
|
|
362
|
+
// closure, including the nested send/node_modules/ms version-conflict case).
|
|
363
|
+
// ---------------------------------------------------------------------------
|
|
364
|
+
|
|
365
|
+
// Resolve `depName` as required FROM `fromPath` (a "node_modules/..." packages
|
|
366
|
+
// key, or '' for the root) against `packages` — returns the matching key, or
|
|
367
|
+
// undefined if genuinely absent.
|
|
368
|
+
function resolveLockDep(packages, fromPath, depName) {
|
|
369
|
+
const segments = fromPath ? fromPath.split('/node_modules/') : [];
|
|
370
|
+
for (let i = segments.length; i >= 0; i--) {
|
|
371
|
+
const prefix = segments.slice(0, i).join('/node_modules/');
|
|
372
|
+
const candidate = prefix ? `${prefix}/node_modules/${depName}` : `node_modules/${depName}`;
|
|
373
|
+
if (packages[candidate]) return candidate;
|
|
374
|
+
}
|
|
375
|
+
return undefined;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// BFS the dependency + optionalDependency closure of `rootDepNames` from the
|
|
379
|
+
// lockfile root. Throws on an unresolvable dependency — a real lockfile
|
|
380
|
+
// inconsistency, not something to silently drop from the shipped artifact.
|
|
381
|
+
function lockfileClosure(packages, rootDepNames) {
|
|
382
|
+
const keep = new Set();
|
|
383
|
+
const queue = [];
|
|
384
|
+
for (const name of rootDepNames) {
|
|
385
|
+
const key = resolveLockDep(packages, '', name);
|
|
386
|
+
if (!key) throw new Error(`package-core: lockfile has no resolved entry for root dependency "${name}"`);
|
|
387
|
+
queue.push(key);
|
|
388
|
+
}
|
|
389
|
+
while (queue.length) {
|
|
390
|
+
const key = queue.shift();
|
|
391
|
+
if (keep.has(key)) continue;
|
|
392
|
+
keep.add(key);
|
|
393
|
+
const deps = { ...(packages[key].dependencies || {}), ...(packages[key].optionalDependencies || {}) };
|
|
394
|
+
for (const depName of Object.keys(deps)) {
|
|
395
|
+
const depKey = resolveLockDep(packages, key, depName);
|
|
396
|
+
if (!depKey) throw new Error(`package-core: lockfile has no resolved entry for "${depName}" required by "${key}"`);
|
|
397
|
+
if (!keep.has(depKey)) queue.push(depKey);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return keep;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// Pure — takes the already-parsed source lockfile + the CORE's own
|
|
404
|
+
// name/version/dependency-ranges (the same ranges buildPackageJson emitted, so
|
|
405
|
+
// the two files never drift). `rootDepNames` defaults to CORE_DEP_NAMES.
|
|
406
|
+
function prunePackageLock(sourceLock, { name, version, rootRanges, rootDepNames = CORE_DEP_NAMES }) {
|
|
407
|
+
const packages = sourceLock.packages || {};
|
|
408
|
+
const keep = lockfileClosure(packages, rootDepNames);
|
|
409
|
+
const prunedPackages = {
|
|
410
|
+
'': { name, version, license: 'AGPL-3.0-or-later', dependencies: { ...rootRanges } },
|
|
411
|
+
};
|
|
412
|
+
for (const key of [...keep].sort()) prunedPackages[key] = packages[key];
|
|
413
|
+
return {
|
|
414
|
+
name,
|
|
415
|
+
version,
|
|
416
|
+
lockfileVersion: sourceLock.lockfileVersion,
|
|
417
|
+
requires: true,
|
|
418
|
+
packages: prunedPackages,
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// The PIN (canonicalTreeHash) and normalizeMode live in scripts/bongos/artifact-format.js
|
|
423
|
+
// (task 1004271) — the module store verifies with the same functions.
|
|
424
|
+
|
|
425
|
+
// The pin manifest (WITHOUT tarball.* — added by withTarballInfo for the side-car).
|
|
426
|
+
function buildCoreManifest({
|
|
427
|
+
version, coreContract, sourceCommit, sourceRef, builtAtIso, files, treeHash, redaction,
|
|
428
|
+
}) {
|
|
429
|
+
return {
|
|
430
|
+
artifact: ARTIFACT_NAME,
|
|
431
|
+
manifest_schema: MANIFEST_SCHEMA,
|
|
432
|
+
generator: 'scripts/bongos/package-core.js',
|
|
433
|
+
// core_version is the PIN coordinate (the platform version, task 1203).
|
|
434
|
+
// core_contract is the module-doorway semver (src/module-api CORE_VERSION);
|
|
435
|
+
// equal to core_version unless --version overrides. A module pinned to
|
|
436
|
+
// "^core_contract" is guaranteed to load against this core.
|
|
437
|
+
core_version: version,
|
|
438
|
+
core_contract: coreContract,
|
|
439
|
+
source_commit: sourceCommit,
|
|
440
|
+
source_ref: sourceRef,
|
|
441
|
+
built_at: builtAtIso,
|
|
442
|
+
redaction: redaction || null,
|
|
443
|
+
file_count: files.length,
|
|
444
|
+
// tree_sha256 is the authoritative integrity pin (see canonicalTreeHash).
|
|
445
|
+
tree_sha256: treeHash,
|
|
446
|
+
files: files.map((f) => ({ path: f.path, mode: normalizeMode(f.mode), sha256: f.sha256 })),
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// The side-car pin = the inner manifest + the exact-bytes coordinate of THIS .tgz.
|
|
451
|
+
function withTarballInfo(manifest, tarball) {
|
|
452
|
+
return { ...manifest, tarball };
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
function tarballName(version) { return `${ARTIFACT_NAME}-${version}.tgz`; }
|
|
456
|
+
function manifestName(version) { return `${ARTIFACT_NAME}-${version}.manifest.json`; }
|
|
457
|
+
function stageDirName(version) { return `${ARTIFACT_NAME}-${version}`; }
|
|
458
|
+
|
|
459
|
+
// The ustar+gzip writer (buildTar and its header helpers) lives in
|
|
460
|
+
// scripts/bongos/artifact-format.js (task 1004271), shared with the module store.
|
|
461
|
+
|
|
462
|
+
// ---- the git-LESS source: enumerate the working tree (task 1003995) --------
|
|
463
|
+
//
|
|
464
|
+
// Everything below the enumeration step is already git-free, so the ONE thing that
|
|
465
|
+
// makes package-core unrunnable without history is `git ls-tree`. That matters because
|
|
466
|
+
// the shipped self-host image IS a core checkout with no `.git` (.dockerignore excludes
|
|
467
|
+
// it by design), and the provisioning scaffold inside it has no other way to build the
|
|
468
|
+
// tarball it vendors into a child instance — the fourth rung of the ladder in
|
|
469
|
+
// scripts/bongos/provision-repo.js.
|
|
470
|
+
//
|
|
471
|
+
// The walk starts at PUBLISH_ALLOWLIST's own entries rather than the repo root. The
|
|
472
|
+
// allowlist is already the single source of truth for what the core is, so starting
|
|
473
|
+
// there means node_modules/ and dist/ are never descended into at all. Selection still
|
|
474
|
+
// runs through isPublishable() in main(), so the denylist applies exactly as it does on
|
|
475
|
+
// the git path — this function only decides what is OFFERED, never what is kept.
|
|
476
|
+
//
|
|
477
|
+
// Rows match parseLsTree's shape ({ path, type, mode }) minus `sha`: there is no object
|
|
478
|
+
// to name, so main() reads these blobs off disk instead. Mode is derived the way git
|
|
479
|
+
// derives it — the executable bit and nothing else. fs injectable for tests.
|
|
480
|
+
function walkWorktreeEntries(root, { allow = PUBLISH_ALLOWLIST, fsImpl = fs } = {}) {
|
|
481
|
+
const out = [];
|
|
482
|
+
const addFile = (rel) => {
|
|
483
|
+
let st;
|
|
484
|
+
try { st = fsImpl.statSync(path.join(root, rel)); } catch { return; } // absent here → simply not in the core set
|
|
485
|
+
if (st.isFile()) out.push({ path: rel, type: 'blob', mode: (st.mode & 0o111) ? '100755' : '100644' });
|
|
486
|
+
};
|
|
487
|
+
const walk = (rel) => {
|
|
488
|
+
let children;
|
|
489
|
+
try { children = fsImpl.readdirSync(path.join(root, rel), { withFileTypes: true }); } catch { return; }
|
|
490
|
+
for (const child of children) {
|
|
491
|
+
const childRel = `${rel}/${child.name}`;
|
|
492
|
+
if (child.isDirectory()) walk(childRel);
|
|
493
|
+
else if (child.isFile()) addFile(childRel);
|
|
494
|
+
}
|
|
495
|
+
};
|
|
496
|
+
for (const entry of allow) {
|
|
497
|
+
if (entry.endsWith('/')) walk(entry.replace(/\/$/, ''));
|
|
498
|
+
else addFile(entry);
|
|
499
|
+
}
|
|
500
|
+
return out.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// ---- generated API artifacts (task 1004866) -------------------------------
|
|
504
|
+
// The spec, reference and typed client are gitignored, so neither a ref's tree nor a fresh
|
|
505
|
+
// worktree carries them — yet every project is built from this tarball (ADR 0292) and serves
|
|
506
|
+
// /docs + /lib/bongos-client.js from it. So the build GENERATES them, from the very source
|
|
507
|
+
// files it is packing: those files are written to a throwaway tree, and the generators THAT
|
|
508
|
+
// tree carries (gen-api-docs.js, then gen-api-client.js) run there. A --ref build therefore
|
|
509
|
+
// documents the ref's routes, never whatever the working tree happens to hold.
|
|
510
|
+
//
|
|
511
|
+
// Fail-closed: a generator that exits non-zero, or a run that leaves any of the eight
|
|
512
|
+
// missing or empty, throws — the caller aborts the build rather than ship a core whose docs
|
|
513
|
+
// and client are silently absent. `run`, `fsImpl`, `tmpRoot` and `env` are injectable for tests.
|
|
514
|
+
//
|
|
515
|
+
// Executed path: the scripts run out of the throwaway tree, a runtime path. That is the point
|
|
516
|
+
// (a --ref build must document the ref's routes with the ref's generators), and it is safe for
|
|
517
|
+
// the same reason the build is: every byte in that tree is the source being packed, chosen by
|
|
518
|
+
// the maintainer running this CLI — nothing request-derived, and this never runs in the server
|
|
519
|
+
// (exec-path-guard.js scans the server tree only). *_INSTANCE_ROOT is stripped from the env.
|
|
520
|
+
function generateApiArtifacts(sources, {
|
|
521
|
+
run = (cmd, args, opts) => spawnSync(cmd, args, opts),
|
|
522
|
+
fsImpl = fs,
|
|
523
|
+
tmpRoot = os.tmpdir(),
|
|
524
|
+
env = process.env,
|
|
525
|
+
} = {}) {
|
|
526
|
+
const dir = fsImpl.mkdtempSync(path.join(tmpRoot, 'package-core-api-'));
|
|
527
|
+
try {
|
|
528
|
+
for (const { path: rel, buf } of sources) {
|
|
529
|
+
const abs = path.join(dir, rel);
|
|
530
|
+
fsImpl.mkdirSync(path.dirname(abs), { recursive: true });
|
|
531
|
+
fsImpl.writeFileSync(abs, buf);
|
|
532
|
+
}
|
|
533
|
+
// Strip any *_INSTANCE_ROOT pointer: it would redirect the generators' docs root out
|
|
534
|
+
// of the throwaway tree (the same hardening conflict-resolve.js applies).
|
|
535
|
+
const childEnv = {};
|
|
536
|
+
for (const [k, v] of Object.entries(env)) if (!/_INSTANCE_ROOT$/.test(k)) childEnv[k] = v;
|
|
537
|
+
for (const script of ['scripts/bongos/gen-api-docs.js', 'scripts/bongos/gen-api-client.js']) {
|
|
538
|
+
const r = run(process.execPath, [path.join(dir, script)], { cwd: dir, env: childEnv, encoding: 'utf8' });
|
|
539
|
+
if (!r || r.error || r.status !== 0) {
|
|
540
|
+
const why = r && r.error ? r.error.message : `exit ${r ? r.status : '?'}`;
|
|
541
|
+
const detail = r && r.stderr ? `: ${String(r.stderr).trim().split('\n').slice(-3).join(' | ')}` : '';
|
|
542
|
+
throw new Error(`${script} failed (${why})${detail}`);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
const out = [];
|
|
546
|
+
for (const rel of API_ARTIFACT_PATHS) {
|
|
547
|
+
let buf;
|
|
548
|
+
try { buf = fsImpl.readFileSync(path.join(dir, rel)); } catch { throw new Error(`generation left no ${rel}`); }
|
|
549
|
+
if (!buf || buf.length === 0) throw new Error(`generation left ${rel} empty`);
|
|
550
|
+
out.push({ path: rel, buf });
|
|
551
|
+
}
|
|
552
|
+
return out;
|
|
553
|
+
} finally {
|
|
554
|
+
try { fsImpl.rmSync(dir, { recursive: true, force: true }); } catch { /* best effort */ }
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
// ---- git plumbing (impure) ------------------------------------------------
|
|
559
|
+
function git(args) {
|
|
560
|
+
return execFileSync('git', ['-C', REPO_ROOT, ...args], { encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 });
|
|
561
|
+
}
|
|
562
|
+
function gitBuf(args) {
|
|
563
|
+
return execFileSync('git', ['-C', REPO_ROOT, ...args], { maxBuffer: 256 * 1024 * 1024 });
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
function arg(name, fallback = null) {
|
|
567
|
+
const i = process.argv.indexOf(name);
|
|
568
|
+
return i >= 0 && i + 1 < process.argv.length ? process.argv[i + 1] : fallback;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
// npm is `npm.cmd` on Windows and can't be execFile'd bare; unix uses `npm`.
|
|
572
|
+
const NPM_BIN = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
573
|
+
|
|
574
|
+
// Pure — the exact `npm publish` argv for the built core tarball. The package
|
|
575
|
+
// publishes PUBLIC via publishConfig.access:"public" (buildPackageJson); we ALSO
|
|
576
|
+
// pass `--access public` so the posture is stated at the call site and a stray
|
|
577
|
+
// `publishConfig` edit can't silently take it back to restricted — the same
|
|
578
|
+
// belt-and-braces the restricted era used, pointed the other way (task 1003872).
|
|
579
|
+
//
|
|
580
|
+
// NOTE for whoever reads this after a failed rollout: `--access` on publish governs
|
|
581
|
+
// what THIS publish declares. A package that is already `private` on the registry
|
|
582
|
+
// also needs the one-time, registry-side `npm access set status=public @bongos/core`
|
|
583
|
+
// — the flag alone has historically been a no-op on re-publish. ADR 0283 records
|
|
584
|
+
// that flip as a separate, deliberate owner step for exactly that reason.
|
|
585
|
+
// `--dry-run` unless `live` (the permanent owner step).
|
|
586
|
+
function publishArgs(tgzPath, live) {
|
|
587
|
+
const a = ['publish', tgzPath, '--access', 'public'];
|
|
588
|
+
if (!live) a.push('--dry-run');
|
|
589
|
+
return a;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
// Publish (or dry-run) the built .tgz to npm. Auth is npm's own concern — this
|
|
593
|
+
// never holds a token; it shells out to `npm publish` and the owner's `npm login`
|
|
594
|
+
// provides it. The package is PUBLIC (task 1003872, ADR 0283), so no paid org plan
|
|
595
|
+
// is involved — a public scoped publish needs none.
|
|
596
|
+
// The child's stdout is routed to OUR stderr so main()'s machine-readable pin on
|
|
597
|
+
// stdout stays clean for CI capture.
|
|
598
|
+
function publishTarball({ tgzPath, live }) {
|
|
599
|
+
const args = publishArgs(tgzPath, live);
|
|
600
|
+
console.error('');
|
|
601
|
+
console.error(`[package-core] ${live ? 'PUBLISH (permanent)' : 'publish DRY-RUN'} → ${NPM_BIN} ${args.join(' ')}`);
|
|
602
|
+
if (!live) {
|
|
603
|
+
console.error(' Dry-run: nothing is uploaded. To publish for real: re-run with --publish --live.');
|
|
604
|
+
console.error(' That is PERMANENT and PUBLIC (ADR 0283) — anyone can fetch it, and a version is never');
|
|
605
|
+
console.error(' reusable once taken. It requires `npm login`; no paid org plan (the package is public).');
|
|
606
|
+
}
|
|
607
|
+
const r = spawnSync(NPM_BIN, args, { cwd: REPO_ROOT, stdio: ['inherit', process.stderr, 'inherit'] });
|
|
608
|
+
if (r.error || r.status !== 0) {
|
|
609
|
+
console.error(`[package-core] npm publish ${live ? '' : '--dry-run '}FAILED (${r.error ? r.error.message : `exit ${r.status}`}).`);
|
|
610
|
+
if (live) console.error(' Common causes: not logged in (`npm login`), no publish rights on the @bongos scope, that version already taken, or 2FA.');
|
|
611
|
+
process.exit(r.status || 1);
|
|
612
|
+
}
|
|
613
|
+
console.error(`[package-core] npm publish ${live ? 'succeeded — @bongos/core is live and PUBLIC on the registry.' : 'dry-run OK — the tarball is publishable.'}`);
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
// The neutral FLOOR — customer-zero identity tokens a portable core must never carry (task 1002220
|
|
617
|
+
// / H6 + task 1002217 / H4, finding F2). When packaging from the NEUTRAL trunk there is no
|
|
618
|
+
// config/branding.json, so the branding-DERIVED redaction + gate see ZERO literals and report
|
|
619
|
+
// "clean" while stripping nothing. This fixed floor closes that gap two ways, both keyed off ONE
|
|
620
|
+
// definition:
|
|
621
|
+
// • DOC path (H4, fail-closed): injected as `extra` {tokens, owners} into buildRedactionRules +
|
|
622
|
+
// collectSensitiveLiterals, so the existing doc-redaction STRIPS these from published docs
|
|
623
|
+
// (tokens→NEUTRAL_TOKEN, owners→NEUTRAL_OWNER) and the fail-closed no-leak gate ABORTS the build
|
|
624
|
+
// if one SURVIVES — even with no branding.json. The floor lives HERE and is injected at call
|
|
625
|
+
// time, so mirror-redact.js stays literal-free (its self-leak invariant holds); functional files
|
|
626
|
+
// still ship VERBATIM (the R88 fix) and are covered by the H6 advisory below, not this gate.
|
|
627
|
+
// • SCAN path (H6, advisory): scanArtifactForLeaks measures the flat list across the WHOLE artifact.
|
|
628
|
+
// findLeaks' public-IP floor separately catches the old droplet IP.
|
|
629
|
+
const PRIOR_INSTANCE_FLOOR = { tokens: ['amazonprimea', 'off the boats'], owners: ['lars589'] };
|
|
630
|
+
const PRIOR_INSTANCE_LITERALS = [...PRIOR_INSTANCE_FLOOR.tokens, ...PRIOR_INSTANCE_FLOOR.owners];
|
|
631
|
+
|
|
632
|
+
// High-signal committed-credential shapes for the secret WARNING (task 1002220 / audit H6, finding
|
|
633
|
+
// F3). Deliberately NARROW — well-known provider token prefixes + PEM private-key headers + an
|
|
634
|
+
// explicit secret=<literal> assignment — rather than the generic entropy catch-all, which fires on
|
|
635
|
+
// ordinary long identifiers / base64 data and buries a real hit (an early cut warned on 339 files,
|
|
636
|
+
// ~all benign). A match is a WARNING to eyeball; the HARD gate against live env-secret VALUES is
|
|
637
|
+
// functionalSecretLeaks in the build loop. Scans functional files (docs are redacted + gated already).
|
|
638
|
+
const CREDENTIAL_SHAPE_PATTERNS = [
|
|
639
|
+
['anthropic-key', /\bsk-ant-[A-Za-z0-9_-]{16,}/],
|
|
640
|
+
['openai-key', /\bsk-[A-Za-z0-9]{24,}/],
|
|
641
|
+
['github-token', /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{20,}\b|\bgithub_pat_[A-Za-z0-9_]{20,}/],
|
|
642
|
+
['aws-access-key-id', /\b(?:AKIA|ASIA)[A-Z0-9]{16}\b/],
|
|
643
|
+
['google-api-key', /\bAIza[A-Za-z0-9_-]{30,}/],
|
|
644
|
+
['slack-token', /\bxox[baprs]-[A-Za-z0-9-]{10,}/],
|
|
645
|
+
['private-key-pem', /-----BEGIN (?:RSA |EC |OPENSSH |DSA |PGP )?PRIVATE KEY-----/],
|
|
646
|
+
['secret-assignment', /\b(?:api[_-]?key|secret|password|passwd|access[_-]?token|auth[_-]?token)\b\s*[:=]\s*['"][^'"\s]{16,}['"]/i],
|
|
647
|
+
];
|
|
648
|
+
function credentialShapeHits(text) {
|
|
649
|
+
const names = [];
|
|
650
|
+
for (const [name, re] of CREDENTIAL_SHAPE_PATTERNS) if (re.test(text)) names.push(name);
|
|
651
|
+
return names;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
// classify a shipped path for the scan — mirrors processCoreFile's doc/stub/functional split.
|
|
655
|
+
function scanKindOf(pathRel) {
|
|
656
|
+
if (isAgentDoc(pathRel)) return 'stub';
|
|
657
|
+
if (isDocPath(pathRel)) return 'doc';
|
|
658
|
+
return 'functional';
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
// The post-build leak scan's POLICY, split out of main() so a test can plant a literal and prove
|
|
662
|
+
// the build refuses without running a full 2-minute package (task 1003870). Pure: argv in, verdict
|
|
663
|
+
// out. Fail-closed — any un-allowlisted prior-instance literal is fatal unless the operator has
|
|
664
|
+
// explicitly said --no-leak-scan, which skips the scan altogether rather than downgrading it.
|
|
665
|
+
// `--leak-scan-strict` is honoured as a no-op: it named this behaviour before it became default.
|
|
666
|
+
function leakScanVerdict(remainingLiteralHits, argv = process.argv) {
|
|
667
|
+
if (argv.includes('--no-leak-scan')) return { run: false, fatal: false, reason: 'skipped' };
|
|
668
|
+
const n = (remainingLiteralHits || []).length;
|
|
669
|
+
if (n === 0) return { run: true, fatal: false, reason: 'clean' };
|
|
670
|
+
return { run: true, fatal: true, reason: 'prior-instance-literals' };
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
// Independent post-build leak scan over the built core file set (task 1002220 / audit H6). Two layers:
|
|
674
|
+
// • INSTANCE LITERALS — findLeaks() over PRIOR_INSTANCE_LITERALS (+ the public-IP floor) across
|
|
675
|
+
// EVERY shipped file: brand/owner/history that must not ship in a portable core. This is the
|
|
676
|
+
// "prove no leak" measurement the neutral trunk was missing (F2).
|
|
677
|
+
// • CREDENTIAL SHAPES — credentialShapeHits() over FUNCTIONAL files only (docs are redacted+gated
|
|
678
|
+
// already): a high-signal WARNING that a committed credential shape shipped.
|
|
679
|
+
// `files` = [{ path, content }]. Pure — returns findings; the caller decides warn vs fatal.
|
|
680
|
+
function scanArtifactForLeaks(files, { literals = PRIOR_INSTANCE_LITERALS } = {}) {
|
|
681
|
+
const literalHits = []; // { path, label, sample }
|
|
682
|
+
const secretWarnings = []; // { path, shapes }
|
|
683
|
+
for (const f of files || []) {
|
|
684
|
+
const text = Buffer.isBuffer(f.content) ? f.content.toString('utf8') : String(f.content == null ? '' : f.content);
|
|
685
|
+
for (const lk of findLeaks(text, literals)) literalHits.push({ path: f.path, label: lk.label, sample: lk.sample });
|
|
686
|
+
if (scanKindOf(f.path) === 'functional') {
|
|
687
|
+
const shapes = credentialShapeHits(text);
|
|
688
|
+
if (shapes.length) secretWarnings.push({ path: f.path, shapes });
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
return { literalHits, secretWarnings };
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
// release-notes.json — the one file the core carries that is derived from HISTORY rather
|
|
695
|
+
// than from a committed file (task 1004218). It only exists where the history does, which
|
|
696
|
+
// is the CI pack (publish.yml checks out at fetch-depth 0). main() stages it into the SAME
|
|
697
|
+
// staged/filesMeta arrays as package.json, so the pin manifest covers it and --self-verify
|
|
698
|
+
// reproduces it; a file written into the stage dir behind the manifest's back would fail
|
|
699
|
+
// self-verify at publish time.
|
|
700
|
+
//
|
|
701
|
+
// ITS PROSE IS TREATED AS A DOC. These are merge summaries — builder-authored sentences — so
|
|
702
|
+
// the neutral floor applies exactly as it does to a shipped .md: redacted with the same rules
|
|
703
|
+
// (redactBlob), and any residue after redaction is a fatal no-leak failure. Not optional:
|
|
704
|
+
// ten of the 1,399 summaries in the history (measured 2026-09-25) name a prior instance or
|
|
705
|
+
// its owner, and history cannot be edited — shipped verbatim, they would fail the fail-closed
|
|
706
|
+
// post-build scan on EVERY pack from now on, and the lane would never publish again. That
|
|
707
|
+
// scan still reads the finished file, as it reads every staged one.
|
|
708
|
+
//
|
|
709
|
+
// Pure: notes + the rules main() already built in, `{ buf, notes, dropped, summaries,
|
|
710
|
+
// redacted, leaks }` out.
|
|
711
|
+
function releaseNotesArtifact(notes, { rules, sensitiveLiterals, envSecrets, knownDocNames, maxBytes = RELEASE_NOTES_MAX_BYTES }) {
|
|
712
|
+
const leaks = [];
|
|
713
|
+
let redacted = 0;
|
|
714
|
+
const clean = {};
|
|
715
|
+
for (const [version, entries] of Object.entries(notes || {})) {
|
|
716
|
+
clean[version] = entries.map((e) => {
|
|
717
|
+
const r = redactBlob({ buf: Buffer.from(e.text, 'utf8'), rules, sensitiveLiterals, envSecrets, knownDocNames });
|
|
718
|
+
for (const l of r.leaks) leaks.push({ label: `doc:${l.label}`, sample: l.sample });
|
|
719
|
+
if (r.secret) leaks.push({ label: 'doc:secret-shape' });
|
|
720
|
+
const text = r.buf.toString('utf8');
|
|
721
|
+
if (text !== e.text) redacted++;
|
|
722
|
+
return e.id ? { id: e.id, text } : { text };
|
|
723
|
+
});
|
|
724
|
+
}
|
|
725
|
+
const bounded = boundReleaseNotes(clean, maxBytes);
|
|
726
|
+
const summaries = Object.values(bounded.notes).reduce((n, list) => n + list.length, 0);
|
|
727
|
+
return { buf: serializeReleaseNotes(bounded.notes), notes: bounded.notes, dropped: bounded.dropped, summaries, redacted, leaks };
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
// Self-verify the built artifact (task 1002218 / audit H3, findings F1+F5). The packager
|
|
731
|
+
// claims a consumer "verifies an install by recomputing [the pin] from the unpacked tree" —
|
|
732
|
+
// this proves the packager's OWN output actually does, at build time, on the produce side:
|
|
733
|
+
// 1. REPRODUCE THE PIN (always; deterministic, network-free): unpack the built .tgz and
|
|
734
|
+
// recompute tree_sha256 over the unpacked tree, asserting it equals the manifest — plus
|
|
735
|
+
// the on-disk .tgz bytes vs manifest.tarball.sha256. Catches a tar-writer bug, a corrupt
|
|
736
|
+
// write, or pin drift BEFORE the artifact is trusted or published (the R88 failure class).
|
|
737
|
+
// 2. BARE-INSTALL BOOT (opt-in --self-verify-boot; needs npm/registry): `npm install <tgz>`
|
|
738
|
+
// into a throwaway consumer and boot /healthz, by reusing the proven consumer-layout
|
|
739
|
+
// harness (tests/consumer_layout_boot.mjs) with CORE_TGZ set — no duplication. The deeper
|
|
740
|
+
// standing CI gate is task 1002221; this is the packager's own quick smoke.
|
|
741
|
+
// Fatal (exit 1) on a reproduce mismatch or a boot failure — a self-verify that finds a
|
|
742
|
+
// problem must stop the build, never warn-and-ship.
|
|
743
|
+
// Pure recompute — read each pinned file from an unpacked tree, rebuild the canonical tree
|
|
744
|
+
// hash (using the manifest's already-canonical modes), and compare to the manifest, plus the
|
|
745
|
+
// on-disk .tgz bytes vs manifest.tarball.sha256. No process.exit / no spawn → unit-testable.
|
|
746
|
+
// Returns { ok, problems, fileCount }.
|
|
747
|
+
function reproducePinFromTree({ treeRoot, sidecar, tgzPath }, fsImpl = fs) {
|
|
748
|
+
const problems = [];
|
|
749
|
+
const recomputed = [];
|
|
750
|
+
for (const f of sidecar.files || []) {
|
|
751
|
+
const abs = path.join(treeRoot, ...String(f.path).split('/'));
|
|
752
|
+
let buf;
|
|
753
|
+
try { buf = fsImpl.readFileSync(abs); } catch { problems.push(`missing in artifact: ${f.path}`); continue; }
|
|
754
|
+
const sha = sha256hex(buf);
|
|
755
|
+
if (sha !== f.sha256) problems.push(`content mismatch: ${f.path}`);
|
|
756
|
+
recomputed.push({ path: f.path, mode: f.mode, sha256: sha });
|
|
757
|
+
}
|
|
758
|
+
const treeHash = canonicalTreeHash(recomputed);
|
|
759
|
+
if (problems.length === 0 && treeHash !== sidecar.tree_sha256) {
|
|
760
|
+
problems.push(`recomputed tree_sha256 ${treeHash.slice(0, 12)}… ≠ manifest ${String(sidecar.tree_sha256).slice(0, 12)}…`);
|
|
761
|
+
}
|
|
762
|
+
if (tgzPath && sidecar.tarball && sidecar.tarball.sha256) {
|
|
763
|
+
const tgzSha = sha256hex(fsImpl.readFileSync(tgzPath));
|
|
764
|
+
if (tgzSha !== sidecar.tarball.sha256) {
|
|
765
|
+
problems.push(`on-disk .tgz sha256 ${tgzSha.slice(0, 12)}… ≠ manifest.tarball.sha256 ${String(sidecar.tarball.sha256).slice(0, 12)}…`);
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
return { ok: problems.length === 0, problems, fileCount: (sidecar.files || []).length };
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
function selfVerify({ tgzPath, sidecar, outDir, boot }) {
|
|
772
|
+
console.error('');
|
|
773
|
+
console.error('[self-verify] verifying the built artifact reproduces its pin …');
|
|
774
|
+
|
|
775
|
+
// 1. reproduce the pin from the built .tgz.
|
|
776
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'bongos-selfverify-'));
|
|
777
|
+
try {
|
|
778
|
+
let treeRoot;
|
|
779
|
+
const x = spawnSync('tar', ['-xzf', tgzPath, '-C', tmp], { encoding: 'utf8' });
|
|
780
|
+
if (!x.error && x.status === 0) {
|
|
781
|
+
treeRoot = path.join(tmp, TAR_ROOT.replace(/\/$/, '')); // the `package/` root inside the tarball
|
|
782
|
+
} else {
|
|
783
|
+
// tar unavailable — fall back to the on-disk stage dir (the SAME staged buffers written
|
|
784
|
+
// to the .tgz), so the pin is still recomputed from a materialized tree. Less faithful
|
|
785
|
+
// (won't catch a tar-writer bug), so it's a loud warning, not silent.
|
|
786
|
+
treeRoot = path.join(outDir, stageDirName(sidecar.core_version));
|
|
787
|
+
console.error(`[self-verify] ! tar unavailable (${x.error ? x.error.message : 'exit ' + x.status}); recomputing over the stage dir ${path.relative(REPO_ROOT, treeRoot)} instead of the unpacked .tgz.`);
|
|
788
|
+
if (!fs.existsSync(treeRoot)) { console.error('[self-verify] FAILED — neither `tar` nor the stage dir is available to recompute the pin.'); process.exit(1); }
|
|
789
|
+
}
|
|
790
|
+
const rep = reproducePinFromTree({ treeRoot, sidecar, tgzPath });
|
|
791
|
+
if (!rep.ok) {
|
|
792
|
+
console.error(`[self-verify] FAILED — the built artifact does NOT reproduce its pin (${rep.problems.length} problem(s)):`);
|
|
793
|
+
for (const p of rep.problems.slice(0, 20)) console.error(' ' + p);
|
|
794
|
+
if (rep.problems.length > 20) console.error(` … +${rep.problems.length - 20} more`);
|
|
795
|
+
process.exit(1);
|
|
796
|
+
}
|
|
797
|
+
console.error(`[self-verify] ✓ pin reproduced — tree_sha256 + tarball.sha256 match the manifest (${rep.fileCount} files).`);
|
|
798
|
+
} finally {
|
|
799
|
+
try { fs.rmSync(tmp, { recursive: true, force: true }); } catch { /* best-effort */ }
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
// 2. bare-install boot (opt-in) — reuse the proven consumer-layout harness with CORE_TGZ.
|
|
803
|
+
if (boot) {
|
|
804
|
+
const harness = path.join(REPO_ROOT, 'tests', 'consumer_layout_boot.mjs');
|
|
805
|
+
if (!fs.existsSync(harness)) {
|
|
806
|
+
console.error('[self-verify] • bare-install boot skipped — tests/consumer_layout_boot.mjs not present (packaging from an installed core, where tests/ is not shipped).');
|
|
807
|
+
return;
|
|
808
|
+
}
|
|
809
|
+
console.error('[self-verify] bare-install boot: `npm install <tgz>` + boot /healthz (via consumer_layout_boot, CORE_TGZ set) …');
|
|
810
|
+
const r = spawnSync(process.execPath, [harness], {
|
|
811
|
+
cwd: REPO_ROOT, encoding: 'utf8', maxBuffer: 256 * 1024 * 1024,
|
|
812
|
+
env: { ...process.env, CORE_TGZ: tgzPath }, stdio: ['ignore', process.stderr, process.stderr],
|
|
813
|
+
});
|
|
814
|
+
if (r.error || r.status !== 0) {
|
|
815
|
+
console.error(`[self-verify] FAILED — the packaged core did not install + boot (${r.error ? r.error.message : 'exit ' + r.status}).`);
|
|
816
|
+
process.exit(1);
|
|
817
|
+
}
|
|
818
|
+
console.error('[self-verify] ✓ bare-install boot OK — the packaged core installs and serves /healthz.');
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
function main() {
|
|
823
|
+
// --from-worktree: build from the files on disk instead of a commit (task 1003995).
|
|
824
|
+
// The lineage anchor of such a build is the tree hash alone — there is no commit to
|
|
825
|
+
// name — so source_commit is null and source_ref says where it came from.
|
|
826
|
+
const fromWorktree = process.argv.includes('--from-worktree');
|
|
827
|
+
const ref = fromWorktree ? '(worktree)' : arg('--ref', 'HEAD');
|
|
828
|
+
const outDir = path.resolve(REPO_ROOT, arg('--out-dir', 'dist'));
|
|
829
|
+
const version = arg('--version', coreVersion());
|
|
830
|
+
const contract = coreVersion();
|
|
831
|
+
const dropletIp = arg('--droplet-ip', process.env.DROPLET_IP || null);
|
|
832
|
+
|
|
833
|
+
// 1. Resolve the source ref → commit SHA (the lineage anchor of this artifact).
|
|
834
|
+
let sha = null;
|
|
835
|
+
if (!fromWorktree) {
|
|
836
|
+
try { sha = git(['rev-parse', ref]).trim(); }
|
|
837
|
+
catch (e) { console.error(`refusing: could not resolve --ref "${ref}": ${e.message}`); process.exit(2); }
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
// 2. Enumerate + partition the tree through the manifest (single source of truth).
|
|
841
|
+
// package.json/package-lock.json are SYNTHESIZED (task 1882, ADR 0108 §2) —
|
|
842
|
+
// isPublishable() still selects them (they're not manifest-excluded, the mirror
|
|
843
|
+
// ships them verbatim), but the core package needs its OWN identity + a pruned
|
|
844
|
+
// dependency set, not the game's. Pulled out of the generic per-file loop below.
|
|
845
|
+
const SYNTHESIZED_PATHS = new Set(['package.json', 'package-lock.json']);
|
|
846
|
+
const entries = fromWorktree
|
|
847
|
+
? walkWorktreeEntries(REPO_ROOT)
|
|
848
|
+
: parseLsTree(git(['ls-tree', '-r', sha])).filter((e) => e.type === 'blob');
|
|
849
|
+
// A blob is named by its git object on the ref path and by its own path on the
|
|
850
|
+
// worktree path; everything downstream just wants the bytes.
|
|
851
|
+
// Generated API artifacts (task 1004866) carry their bytes in `buf`; every other entry
|
|
852
|
+
// is a git object on the ref path and a file on disk on the worktree path.
|
|
853
|
+
const readBlob = (e) => (e.buf ? e.buf : fromWorktree ? fs.readFileSync(path.join(REPO_ROOT, e.path)) : gitBuf(['cat-file', 'blob', e.sha]));
|
|
854
|
+
// Any copy of the eight generated API files that IS on hand (a stale untracked one in a
|
|
855
|
+
// worktree, or one committed on an older ref) is dropped: the copy that ships is the one
|
|
856
|
+
// generated in 2a from the routes being packed.
|
|
857
|
+
const API_GENERATED = new Set(API_ARTIFACT_PATHS);
|
|
858
|
+
const selected = entries.filter((e) => isPublishable(e.path) && !SYNTHESIZED_PATHS.has(e.path) && !API_GENERATED.has(e.path));
|
|
859
|
+
// Drop npm-never-installed files (.gitignore, .npmignore, .npmrc) so the manifest +
|
|
860
|
+
// tree_sha256 pin describe exactly what `npm install` materializes — otherwise the
|
|
861
|
+
// consumer's verifyInstalledPin fails on the missing file and the vendored upgrade
|
|
862
|
+
// auto-rolls-back (idea 1000543). Done here, so they never reach the tarball or the pin.
|
|
863
|
+
const npmStripped = selected.filter((e) => isNpmStripped(e.path));
|
|
864
|
+
const publishable = selected.filter((e) => !isNpmStripped(e.path));
|
|
865
|
+
// The worktree walk is already allowlist-scoped and never offers the two synthesized
|
|
866
|
+
// paths, so only the ref path discounts them from what it enumerated.
|
|
867
|
+
const excludedCount = entries.length - selected.length - (fromWorktree ? 0 : SYNTHESIZED_PATHS.size);
|
|
868
|
+
console.error(`[package-core] ${ref}${sha ? ` = ${sha.slice(0, 12)}` : ''} — ${entries.length} files, ${publishable.length} in the core (+2 synthesized), ${excludedCount} excluded.`);
|
|
869
|
+
if (npmStripped.length) {
|
|
870
|
+
console.error(`[package-core] dropped ${npmStripped.length} npm-never-installed file(s) from the pin (npm strips these on install; idea 1000543): ${npmStripped.map((e) => e.path).join(', ')}`);
|
|
871
|
+
}
|
|
872
|
+
if (publishable.length === 0) {
|
|
873
|
+
console.error('refusing: the core set is EMPTY — almost certainly a manifest/ref mismatch, not intentional. Aborting.');
|
|
874
|
+
process.exit(1);
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
// 2a. Generate the API spec, reference and typed client from the routes being packed
|
|
878
|
+
// (task 1004866). Fatal on failure: a core without them serves no /docs and no client.
|
|
879
|
+
// gen-api-docs stamps the spec with the version in package.json, so the throwaway
|
|
880
|
+
// tree gets the SOURCE package.json beside the packed files.
|
|
881
|
+
{
|
|
882
|
+
const sources = publishable.map((e) => ({ path: e.path, buf: readBlob(e) }));
|
|
883
|
+
const pkgEntry = fromWorktree ? null : entries.find((e) => e.path === 'package.json');
|
|
884
|
+
const pkgPath = path.join(REPO_ROOT, 'package.json');
|
|
885
|
+
const pkg = fromWorktree ? (fs.existsSync(pkgPath) ? fs.readFileSync(pkgPath) : null) : (pkgEntry ? readBlob(pkgEntry) : null);
|
|
886
|
+
if (pkg) sources.push({ path: 'package.json', buf: pkg });
|
|
887
|
+
let generated;
|
|
888
|
+
try { generated = generateApiArtifacts(sources); }
|
|
889
|
+
catch (err) {
|
|
890
|
+
console.error(`refusing: generating the API spec + client FAILED — ${err.message}. A core without them serves no /docs and no /lib/bongos-client.js. Nothing was built.`);
|
|
891
|
+
process.exit(1);
|
|
892
|
+
}
|
|
893
|
+
for (const g of generated) {
|
|
894
|
+
if (!isPublishable(g.path)) {
|
|
895
|
+
console.error(`refusing: generated ${g.path} is not in the publish allowlist (scripts/bongos/publish-manifest.js).`);
|
|
896
|
+
process.exit(1);
|
|
897
|
+
}
|
|
898
|
+
publishable.push({ path: g.path, type: 'blob', mode: '100644', buf: g.buf });
|
|
899
|
+
}
|
|
900
|
+
// Joined to `publishable`, so the eight go through EVERYTHING below exactly like a
|
|
901
|
+
// committed file: processCoreFile (doc redaction + the fail-closed no-leak gate), the
|
|
902
|
+
// pin manifest, the tarball, and the post-build scanArtifactForLeaks over `staged`.
|
|
903
|
+
publishable.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
|
|
904
|
+
console.error(`[package-core] generated ${generated.length} API artifact(s) from the packed routes: ${generated.map((g) => g.path).join(', ')}.`);
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
// 2b. Synthesize the core's own package.json + pruned package-lock.json from the
|
|
908
|
+
// SOURCE files at this ref (never the live working tree, so --ref stays
|
|
909
|
+
// reproducible) — express+pg only, name @bongos/core, version = the
|
|
910
|
+
// platform version being packaged.
|
|
911
|
+
// On the worktree path there is no ref to stay reproducible against, so the two
|
|
912
|
+
// files come off disk beside everything else in the build.
|
|
913
|
+
const sourceRootFile = (rel) => {
|
|
914
|
+
if (fromWorktree) {
|
|
915
|
+
const abs = path.join(REPO_ROOT, rel);
|
|
916
|
+
return fs.existsSync(abs) ? fs.readFileSync(abs) : null;
|
|
917
|
+
}
|
|
918
|
+
const blob = entries.find((e) => e.path === rel);
|
|
919
|
+
return blob ? gitBuf(['cat-file', 'blob', blob.sha]) : null;
|
|
920
|
+
};
|
|
921
|
+
const pkgJsonRaw = sourceRootFile('package.json');
|
|
922
|
+
const pkgLockRaw = sourceRootFile('package-lock.json');
|
|
923
|
+
if (!pkgJsonRaw || !pkgLockRaw) {
|
|
924
|
+
console.error(`refusing: source package.json/package-lock.json not found at ${fromWorktree ? 'the repo root' : 'this ref'} — cannot synthesize the core package.`);
|
|
925
|
+
process.exit(1);
|
|
926
|
+
}
|
|
927
|
+
const sourcePkgJson = JSON.parse(pkgJsonRaw.toString('utf8'));
|
|
928
|
+
const sourcePkgLock = JSON.parse(pkgLockRaw.toString('utf8'));
|
|
929
|
+
const corePkgJson = buildPackageJson({ version, sourceDeps: sourcePkgJson.dependencies, sourceOverrides: sourcePkgJson.overrides });
|
|
930
|
+
const corePkgLock = prunePackageLock(sourcePkgLock, {
|
|
931
|
+
name: corePkgJson.name, version, rootRanges: { express: corePkgJson.dependencies.express, pg: corePkgJson.dependencies.pg },
|
|
932
|
+
});
|
|
933
|
+
console.error(`[package-core] synthesized package.json (${Object.keys(corePkgJson.dependencies).join(', ')}) + pruned package-lock.json (${Object.keys(corePkgLock.packages).length - 1} of ${Object.keys(sourcePkgLock.packages).length - 1} locked packages kept).`);
|
|
934
|
+
|
|
935
|
+
// 3. Redaction rules from THIS instance's branding (current HEAD) + the droplet
|
|
936
|
+
// IP as an exact extra literal (sourced here, never written into a file).
|
|
937
|
+
let branding = {};
|
|
938
|
+
try { branding = JSON.parse(fs.readFileSync(path.join(REPO_ROOT, 'config/branding.json'), 'utf8')); }
|
|
939
|
+
catch { /* vanilla instance: derive from the public-IP floor only */ }
|
|
940
|
+
const ownerAliases = String(process.env.OWNER_ALIASES || '').split(',').map((s) => s.trim()).filter(Boolean);
|
|
941
|
+
// The NEUTRAL FLOOR (task 1002217 / audit H4): always inject the fixed prior-instance tokens so
|
|
942
|
+
// docs de-brand + the no-leak gate fires against them EVEN WITH NO branding.json (the F2 gap).
|
|
943
|
+
// Merged on top of this instance's own branding — for a branded instance the floor is harmless
|
|
944
|
+
// extra; for the neutral trunk it is the only thing standing between a doc and customer-zero's name.
|
|
945
|
+
const extra = {
|
|
946
|
+
owners: [...ownerAliases, ...PRIOR_INSTANCE_FLOOR.owners],
|
|
947
|
+
tokens: [...PRIOR_INSTANCE_FLOOR.tokens],
|
|
948
|
+
literals: dropletIp ? [dropletIp] : [],
|
|
949
|
+
};
|
|
950
|
+
const rules = buildRedactionRules(branding, extra);
|
|
951
|
+
const sensitiveLiterals = collectSensitiveLiterals(branding, extra);
|
|
952
|
+
const envSecrets = collectEnvSecrets();
|
|
953
|
+
console.error(`[package-core] ${rules.length} redaction rule(s), ${sensitiveLiterals.length} gate literal(s) + public-IP floor + ${envSecrets.length} env-secret literal(s) (incl. the neutral floor).`);
|
|
954
|
+
|
|
955
|
+
// 4. Process every file IN MEMORY (processCoreFile: docs redacted, functional verbatim)
|
|
956
|
+
// + the fail-closed no-leak gate. Nothing touches dist/ until the ENTIRE set is proven
|
|
957
|
+
// clean (atomic abort). Brand/topology in functional files are non-fatal ADVISORIES.
|
|
958
|
+
// task 1002460 — the doc-link allowlist. The entropy sweep cannot tell a long
|
|
959
|
+
// ADR filename from a secret by shape, so it collapsed every one of them to
|
|
960
|
+
// <redacted>.md on the way out. This is the set of names actually being
|
|
961
|
+
// published, so a name in it is a FILE and not a guess; anything else, secrets
|
|
962
|
+
// included, is redacted exactly as before.
|
|
963
|
+
const knownDocNames = new Set(
|
|
964
|
+
publishable.map((e) => e.path.split('/').pop()).filter((n) => /\.(md|sql)$/i.test(n)),
|
|
965
|
+
);
|
|
966
|
+
const staged = []; // { name, mode, buf } (name includes TAR_ROOT)
|
|
967
|
+
const filesMeta = []; // { path, mode, sha256 } (source files only — the pin domain)
|
|
968
|
+
const leaks = [];
|
|
969
|
+
const advisories = []; // { path, label, sample } — non-fatal (brand/IP that ships verbatim)
|
|
970
|
+
let docCount = 0;
|
|
971
|
+
let funcCount = 0;
|
|
972
|
+
let stubCount = 0; // agent docs (CLAUDE.md/AGENTS.md) replaced with the brand-free stub (task 2121)
|
|
973
|
+
for (const e of publishable) {
|
|
974
|
+
let raw;
|
|
975
|
+
try { raw = readBlob(e); }
|
|
976
|
+
catch (err) { leaks.push({ path: e.path, label: `read-failed:${err.message}` }); continue; }
|
|
977
|
+
const { buf, leaks: fileLeaks, advisories: fileAdvisories, kind } =
|
|
978
|
+
processCoreFile({ pathRel: e.path, raw, rules, sensitiveLiterals, envSecrets, knownDocNames });
|
|
979
|
+
for (const l of fileLeaks) leaks.push({ path: e.path, label: l.label, sample: l.sample });
|
|
980
|
+
for (const a of fileAdvisories) advisories.push({ path: e.path, label: a.label, sample: a.sample });
|
|
981
|
+
if (kind === 'doc') docCount++; else if (kind === 'stub') stubCount++; else funcCount++;
|
|
982
|
+
filesMeta.push({ path: e.path, mode: e.mode, sha256: sha256hex(buf) });
|
|
983
|
+
staged.push({ name: TAR_ROOT + e.path, mode: parseInt(normalizeMode(e.mode), 8), buf });
|
|
984
|
+
}
|
|
985
|
+
funcCount += 2; // the two synthesized files below, staged outside the leak-gated loop
|
|
986
|
+
|
|
987
|
+
// The two synthesized files (2b above) carry no source content — no OTB brand,
|
|
988
|
+
// no secrets — so they need no redaction/leak scan; stage them directly into
|
|
989
|
+
// the same filesMeta/staged arrays the pin + tarball are built from.
|
|
990
|
+
for (const [relPath, obj] of [['package.json', corePkgJson], ['package-lock.json', corePkgLock]]) {
|
|
991
|
+
const buf = Buffer.from(`${JSON.stringify(obj, null, 2)}\n`, 'utf8');
|
|
992
|
+
filesMeta.push({ path: relPath, mode: '100644', sha256: sha256hex(buf) });
|
|
993
|
+
staged.push({ name: TAR_ROOT + relPath, mode: 0o644, buf });
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
// 4b. The release notes (task 1004218): what each release brought in, generated from this
|
|
997
|
+
// ref's history, redacted as a doc, and staged into the same arrays so the pin covers
|
|
998
|
+
// them. A worktree build or a shallow clone has no history to read, so it ships without
|
|
999
|
+
// — and an upgrade onto it says its notes are unavailable rather than listing nothing.
|
|
1000
|
+
const notesGen = fromWorktree
|
|
1001
|
+
? { skipped: 'built from the working tree, which carries no history' }
|
|
1002
|
+
: generateReleaseNotes({ git, ref: sha, version });
|
|
1003
|
+
let notesStaged = false;
|
|
1004
|
+
if (notesGen.skipped) {
|
|
1005
|
+
console.error(`[package-core] ! ${RELEASE_NOTES_FILE} not generated — ${notesGen.skipped}.`);
|
|
1006
|
+
} else {
|
|
1007
|
+
const art = releaseNotesArtifact(notesGen.notes, { rules, sensitiveLiterals, envSecrets, knownDocNames });
|
|
1008
|
+
for (const l of art.leaks) leaks.push({ path: RELEASE_NOTES_FILE, label: l.label, sample: l.sample });
|
|
1009
|
+
filesMeta.push({ path: RELEASE_NOTES_FILE, mode: '100644', sha256: sha256hex(art.buf) });
|
|
1010
|
+
staged.push({ name: TAR_ROOT + RELEASE_NOTES_FILE, mode: 0o644, buf: art.buf });
|
|
1011
|
+
notesStaged = true;
|
|
1012
|
+
const kept = Object.keys(art.notes);
|
|
1013
|
+
const trimmed = art.dropped.length
|
|
1014
|
+
? ` — the ${art.dropped.length} oldest release(s) DROPPED to stay under ${RELEASE_NOTES_MAX_BYTES / 1024} KiB`
|
|
1015
|
+
: '';
|
|
1016
|
+
console.error(`[package-core] ${RELEASE_NOTES_FILE}: ${kept.length} release(s) ${kept[0]} → ${kept[kept.length - 1]}, ${art.summaries} summaries (${art.redacted} redacted), ${(art.buf.length / 1024).toFixed(1)} KiB${trimmed}.`);
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
if (leaks.length > 0) {
|
|
1020
|
+
console.error(`\n[package-core] NO-LEAK GATE FAILED — ${leaks.length} real leak(s) (doc redaction residue or a live credential in a functional file). PRODUCING NOTHING (fail-closed):`);
|
|
1021
|
+
for (const l of leaks.slice(0, 50)) {
|
|
1022
|
+
// Never print a secret sample; a redaction-residue instance literal is safe to show.
|
|
1023
|
+
const shown = (l.label === 'live-credential' || l.label === 'doc:secret-shape')
|
|
1024
|
+
? '' : (l.sample ? ` (“${String(l.sample).slice(0, 40)}”)` : '');
|
|
1025
|
+
console.error(` ${l.path}: ${l.label}${shown}`);
|
|
1026
|
+
}
|
|
1027
|
+
if (leaks.length > 50) console.error(` … +${leaks.length - 50} more`);
|
|
1028
|
+
console.error('\nFix: for a DOC leak, extend scripts/bongos/mirror-redact.js (rules) or scripts/bongos/publish-manifest.js (exclusions);');
|
|
1029
|
+
console.error(' for a live-credential leak, remove the secret at SOURCE (it should never be committed). Then re-run. dist/ was NOT touched.');
|
|
1030
|
+
process.exit(1);
|
|
1031
|
+
}
|
|
1032
|
+
console.error(`[package-core] no-leak gate PASSED — ${staged.length} files clean (${docCount} docs redacted, ${stubCount} agent-docs stubbed, ${funcCount} functional verbatim${notesStaged ? `, ${RELEASE_NOTES_FILE} generated` : ''}).`);
|
|
1033
|
+
|
|
1034
|
+
// Advisory: brand-identity + public-IP literals that ship VERBATIM inside functional
|
|
1035
|
+
// files. Not a leak (these are public, not secrets; a downstream rebrands via config) —
|
|
1036
|
+
// surfaced so a human can see what instance-specific strings the consumer core carries.
|
|
1037
|
+
if (advisories.length > 0) {
|
|
1038
|
+
const byLabel = {};
|
|
1039
|
+
for (const a of advisories) { const k = a.sample || a.label; byLabel[k] = (byLabel[k] || 0) + 1; }
|
|
1040
|
+
const summary = Object.entries(byLabel).sort((x, y) => y[1] - x[1]).map(([k, n]) => `${k}×${n}`).join(', ');
|
|
1041
|
+
console.error(`[package-core] advisory — ${advisories.length} brand/topology string(s) ship verbatim in functional files (public, not secrets): ${summary}.`);
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
// 5. Build the pin manifest, then materialize dist/ (only reached when clean).
|
|
1045
|
+
filesMeta.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
|
|
1046
|
+
const treeHash = canonicalTreeHash(filesMeta);
|
|
1047
|
+
const innerManifest = buildCoreManifest({
|
|
1048
|
+
version, coreContract: contract, sourceCommit: sha, sourceRef: ref,
|
|
1049
|
+
builtAtIso: new Date().toISOString(), files: filesMeta, treeHash,
|
|
1050
|
+
redaction: {
|
|
1051
|
+
model: 'docs-redacted+functional-verbatim', // task 1824
|
|
1052
|
+
docs_redacted: docCount,
|
|
1053
|
+
agent_docs_stubbed: stubCount, // CLAUDE.md/AGENTS.md → brand-free stub (task 2121)
|
|
1054
|
+
functional_verbatim: funcCount,
|
|
1055
|
+
rules: rules.length,
|
|
1056
|
+
gate_literals: sensitiveLiterals.length,
|
|
1057
|
+
gate: 'passed',
|
|
1058
|
+
},
|
|
1059
|
+
});
|
|
1060
|
+
|
|
1061
|
+
// The self-describing manifest travels INSIDE the artifact too (minus tarball.*).
|
|
1062
|
+
const innerJson = Buffer.from(JSON.stringify(innerManifest, null, 2) + '\n', 'utf8');
|
|
1063
|
+
staged.push({ name: INNER_MANIFEST, mode: 0o644, buf: innerJson });
|
|
1064
|
+
|
|
1065
|
+
const tgz = buildTar(staged);
|
|
1066
|
+
const sidecar = withTarballInfo(innerManifest, {
|
|
1067
|
+
name: tarballName(version), sha256: sha256hex(tgz), bytes: tgz.length,
|
|
1068
|
+
});
|
|
1069
|
+
|
|
1070
|
+
// Write: a fresh versioned stage dir (inspectable tree) + the .tgz + the pin.
|
|
1071
|
+
fs.mkdirSync(outDir, { recursive: true });
|
|
1072
|
+
const stageDir = path.join(outDir, stageDirName(version));
|
|
1073
|
+
fs.rmSync(stageDir, { recursive: true, force: true });
|
|
1074
|
+
for (const f of staged) {
|
|
1075
|
+
// strip the TAR_ROOT prefix for the on-disk tree
|
|
1076
|
+
const rel = f.name.startsWith(TAR_ROOT) ? f.name.slice(TAR_ROOT.length) : f.name;
|
|
1077
|
+
const dest = path.join(stageDir, rel);
|
|
1078
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
1079
|
+
fs.writeFileSync(dest, f.buf, { mode: f.mode });
|
|
1080
|
+
}
|
|
1081
|
+
const tgzPath = path.join(outDir, tarballName(version));
|
|
1082
|
+
const manifestPath = path.join(outDir, manifestName(version));
|
|
1083
|
+
fs.writeFileSync(tgzPath, tgz);
|
|
1084
|
+
fs.writeFileSync(manifestPath, JSON.stringify(sidecar, null, 2) + '\n');
|
|
1085
|
+
|
|
1086
|
+
console.error('');
|
|
1087
|
+
console.error(`[package-core] Cloud Bongos core v${version} packaged (contract ^${contract}).`);
|
|
1088
|
+
console.error(` source_commit ${sha || '(none — built from the working tree)'}`);
|
|
1089
|
+
console.error(` file_count ${filesMeta.length}`);
|
|
1090
|
+
console.error(` tree_sha256 ${treeHash}`);
|
|
1091
|
+
console.error(` tarball ${path.relative(REPO_ROOT, tgzPath)} (${(tgz.length / 1024).toFixed(1)} KiB, sha256 ${sidecar.tarball.sha256.slice(0, 12)}…)`);
|
|
1092
|
+
console.error(` manifest ${path.relative(REPO_ROOT, manifestPath)} ← the PIN a downstream repo records`);
|
|
1093
|
+
console.error(` tree ${path.relative(REPO_ROOT, stageDir)}/`);
|
|
1094
|
+
|
|
1095
|
+
// Optional self-verify leg (task 1002218 / audit H3): prove the built artifact reproduces
|
|
1096
|
+
// its pin (+ optionally installs & boots) BEFORE it can be trusted or published. Runs after
|
|
1097
|
+
// the artifact is written; a failure exits non-zero so an unverified/broken artifact never
|
|
1098
|
+
// reaches the publish leg below or a downstream consumer.
|
|
1099
|
+
if (process.argv.includes('--self-verify')) {
|
|
1100
|
+
selfVerify({ tgzPath, sidecar, outDir, boot: process.argv.includes('--self-verify-boot') });
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1103
|
+
// Post-build leak scan (task 1002220 / audit H6): independent verification that the BUILT
|
|
1104
|
+
// artifact carries no prior-instance identity, + a warn-level secret-shape scan over functional
|
|
1105
|
+
// files. Runs on every build and is FAIL-CLOSED: an un-allowlisted prior-instance literal aborts
|
|
1106
|
+
// the build. The trunk sweep (task 1003869) cleared the residue those literals used to represent,
|
|
1107
|
+
// so warning instead of failing would only let it creep back (task 1003870). --no-leak-scan is
|
|
1108
|
+
// the sole escape. A secret-shape hit stays a non-fatal warning — those 14 files were each
|
|
1109
|
+
// confirmed a test fixture (task 1003871) and the R88 functional-verbatim fix is preserved.
|
|
1110
|
+
if (!process.argv.includes('--no-leak-scan')) {
|
|
1111
|
+
const scanFiles = staged.map((s) => ({ path: s.name.startsWith(TAR_ROOT) ? s.name.slice(TAR_ROOT.length) : s.name, content: s.buf }));
|
|
1112
|
+
const scan = scanArtifactForLeaks(scanFiles);
|
|
1113
|
+
// Named, reasoned exceptions (task 1003869). A detector must carry the pattern it
|
|
1114
|
+
// detects and a "public IPs are flagged" test must be handed a public IP, so those
|
|
1115
|
+
// hits are real but not leaks. Each is listed per (file, literal) with its reason in
|
|
1116
|
+
// scripts/bongos/leak-scan-allowlist.js — never per bare file, which would let a NEW
|
|
1117
|
+
// leak ride into an already-listed file unseen.
|
|
1118
|
+
const { allowed, remaining } = partitionHits(scan.literalHits);
|
|
1119
|
+
if (allowed.length) {
|
|
1120
|
+
const byFile = [...new Set(allowed.map((h) => h.path))];
|
|
1121
|
+
console.error(`[leak-scan] ${allowed.length} hit(s) across ${byFile.length} file(s) covered by a named exception (scripts/bongos/leak-scan-allowlist.js).`);
|
|
1122
|
+
}
|
|
1123
|
+
const stale = unusedEntries(scan.literalHits);
|
|
1124
|
+
if (stale.length) {
|
|
1125
|
+
console.error(`[leak-scan] ! ${stale.length} allowlist entr(ies) matched nothing — the trunk got cleaner, so prune them:`);
|
|
1126
|
+
for (const e of stale) console.error(` ${e.path} [${e.literal}]`);
|
|
1127
|
+
}
|
|
1128
|
+
scan.literalHits = remaining;
|
|
1129
|
+
const verdict = leakScanVerdict(scan.literalHits);
|
|
1130
|
+
if (scan.literalHits.length) {
|
|
1131
|
+
const byLit = {};
|
|
1132
|
+
for (const h of scan.literalHits) byLit[h.sample] = (byLit[h.sample] || 0) + 1;
|
|
1133
|
+
const summary = Object.entries(byLit).sort((a, b) => b[1] - a[1]).map(([k, n]) => `${k}×${n}`).join(', ');
|
|
1134
|
+
const files = [...new Set(scan.literalHits.map((h) => h.path))];
|
|
1135
|
+
console.error('');
|
|
1136
|
+
console.error(`[leak-scan] FAILED — ${scan.literalHits.length} prior-instance literal hit(s) across ${files.length} shipped file(s): ${summary}`);
|
|
1137
|
+
for (const p of files.slice(0, 30)) console.error(` ${p}`);
|
|
1138
|
+
if (files.length > 30) console.error(` … +${files.length - 30} more file(s)`);
|
|
1139
|
+
console.error('[leak-scan] refusing to certify a leaky artifact. Either remove the literal at SOURCE (check what');
|
|
1140
|
+
console.error('[leak-scan] REGENERATES the file — a generator re-leaks on every run, task 1003911), or, if the hit is');
|
|
1141
|
+
console.error('[leak-scan] a detector carrying its own pattern, add a named (path, class) reason to');
|
|
1142
|
+
console.error('[leak-scan] scripts/bongos/leak-scan-allowlist.js. --no-leak-scan skips this gate entirely.');
|
|
1143
|
+
if (verdict.fatal) process.exit(1);
|
|
1144
|
+
} else {
|
|
1145
|
+
console.error('[leak-scan] ✓ no prior-instance literals in the built artifact.');
|
|
1146
|
+
}
|
|
1147
|
+
if (scan.secretWarnings.length) {
|
|
1148
|
+
console.error(`[leak-scan] ! ${scan.secretWarnings.length} functional file(s) carry a credential SHAPE (WARNING, not fatal — confirm none is a real credential; a real one must be removed at SOURCE):`);
|
|
1149
|
+
for (const w of scan.secretWarnings.slice(0, 20)) console.error(` ${w.path} [${w.shapes.join(', ')}]`);
|
|
1150
|
+
if (scan.secretWarnings.length > 20) console.error(` … +${scan.secretWarnings.length - 20} more`);
|
|
1151
|
+
} else {
|
|
1152
|
+
console.error('[leak-scan] ✓ no committed-credential shapes in functional files.');
|
|
1153
|
+
}
|
|
1154
|
+
}
|
|
1155
|
+
|
|
1156
|
+
// Optional publish leg (task 2089): --publish runs `npm publish` on the built
|
|
1157
|
+
// tarball. DRY-RUN by default; the real, permanent publish needs --publish --live
|
|
1158
|
+
// (+ npm auth). Kept AFTER the artifact is written so a publish failure never
|
|
1159
|
+
// costs the build; runs BEFORE the stdout pin so that pin stays the last line out.
|
|
1160
|
+
if (process.argv.includes('--publish')) {
|
|
1161
|
+
publishTarball({ tgzPath, live: process.argv.includes('--live') });
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
// stdout carries the machine-readable pin (so CI / R85 can capture it).
|
|
1165
|
+
process.stdout.write(JSON.stringify({ core_version: version, source_commit: sha, tree_sha256: treeHash, tarball: sidecar.tarball }) + '\n');
|
|
1166
|
+
process.exit(0);
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
module.exports = {
|
|
1170
|
+
MANIFEST_SCHEMA, ARTIFACT_NAME, TAR_ROOT, INNER_MANIFEST,
|
|
1171
|
+
coreVersion, sha256hex, canonicalTreeHash, normalizeMode,
|
|
1172
|
+
buildCoreManifest, withTarballInfo, tarballName, manifestName, stageDirName,
|
|
1173
|
+
octal, tarChecksum, ustarHeader, splitUstarName, buildTar,
|
|
1174
|
+
// task 1824 — the consumer-core file-classification layer (pure; unit-tested)
|
|
1175
|
+
isDocPath, functionalSecretLeaks, processCoreFile,
|
|
1176
|
+
// idea 1000543 — npm-never-installed files dropped from the pin so vendored `bongos upgrade` pin-verify matches
|
|
1177
|
+
isNpmStripped, NPM_STRIPPED_BASENAMES,
|
|
1178
|
+
// task 1004866 — the gitignored API spec/reference/client, generated into every tarball
|
|
1179
|
+
generateApiArtifacts,
|
|
1180
|
+
// task 2121 — agent-doc (CLAUDE.md/AGENTS.md) stub so a consumer's node_modules can't auto-load core memory
|
|
1181
|
+
isAgentDoc, CORE_AGENT_DOC_STUB,
|
|
1182
|
+
// task 1882 (ADR 0108 §2) — the real installable npm package
|
|
1183
|
+
CORE_DEP_NAMES, buildPackageJson, resolveLockDep, lockfileClosure, prunePackageLock,
|
|
1184
|
+
// task 2089 (ADR 0134) — the npm publish argv; PUBLIC since task 1003872 / ADR 0283
|
|
1185
|
+
publishArgs,
|
|
1186
|
+
// task 1002218 (audit H3) — build-time self-verify (reproduce pin + optional bare-install boot)
|
|
1187
|
+
selfVerify, reproducePinFromTree,
|
|
1188
|
+
// task 1002220 (audit H6) — post-build leak scan (prior-instance literals + functional secret shapes)
|
|
1189
|
+
scanArtifactForLeaks, PRIOR_INSTANCE_LITERALS,
|
|
1190
|
+
// task 1003870 — the fail-closed verdict the build acts on (pure, so a test can plant a literal)
|
|
1191
|
+
leakScanVerdict,
|
|
1192
|
+
// task 1002217 (audit H4) — the fixed neutral floor injected into the doc-redaction + fail-closed gate
|
|
1193
|
+
PRIOR_INSTANCE_FLOOR,
|
|
1194
|
+
// task 1003995 — --from-worktree's enumerator, for a core checkout with no git history
|
|
1195
|
+
walkWorktreeEntries,
|
|
1196
|
+
// task 1004218 — release-notes.json: the history-derived file, redacted as a doc and bounded
|
|
1197
|
+
releaseNotesArtifact,
|
|
1198
|
+
};
|
|
1199
|
+
|
|
1200
|
+
if (require.main === module) main();
|