@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
package/scripts/gds/init.js
CHANGED
|
@@ -1,1159 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
// scripts/gds/init.js — @bongos-forwarder (task 1004848). Generated by
|
|
3
|
+
// scripts/bongos/codemod-rename-scripts-gds.js; do not edit.
|
|
4
|
+
// The real script is scripts/bongos/init.js. This forwarder keeps callers that still name
|
|
5
|
+
// the old path working, and warns once so they get repointed. Task 1003706 removes it.
|
|
2
6
|
'use strict';
|
|
3
|
-
|
|
4
|
-
// scripts/gds/init.js — `bongos init`: scaffold a NEW Cloud Bongos instance.
|
|
5
|
-
//
|
|
6
|
-
// GDS-V4 · V4.R65 · task 1204 (ADR 0062 §7). The self-serve replacement for the
|
|
7
|
-
// hand-written 35–83 KB seed-*.js-per-version pattern. It:
|
|
8
|
-
// 1. gathers a spec (interactive interview, or --from <spec.json>),
|
|
9
|
-
// 2. writes the instance config — config/branding.json + config/modules.json
|
|
10
|
-
// (lean OVERRIDES; config/*.neutral.json fills the rest, src/branding.js),
|
|
11
|
-
// 3. seeds the first version + its done-when goal via POST /api/bongos/versions
|
|
12
|
-
// (the primitive added in this same task), then files the starter task and
|
|
13
|
-
// the human-only KICKOFF steps as real, tracked tasks via POST /tasks,
|
|
14
|
-
// 4. points the owner at docs/branding-fill-prompt.md for the LOOK (a locked
|
|
15
|
-
// project rule: an owner brands with their OWN LLM — init never generates
|
|
16
|
-
// branding) and prints the remaining manual steps.
|
|
17
|
-
//
|
|
18
|
-
// It deliberately does NOT try to make launch one command: a fresh instance
|
|
19
|
-
// needs irreducibly-manual owner steps (a GitHub OAuth app, first sign-in).
|
|
20
|
-
// init's value is that it writes what it can AND turns the rest into a claimable,
|
|
21
|
-
// tracked checklist so nothing is silently skipped.
|
|
22
|
-
//
|
|
23
|
-
// Infra arm (ADR 0111 §3, task 1946): when the owner opts into production hosting,
|
|
24
|
-
// the interview's infra answers (hosting shape, bring-your-own domain, credential
|
|
25
|
-
// ref, tier) become a real provisioning REQUEST — a POST to the provisioning
|
|
26
|
-
// module's /provisioning/instances, which enqueues a provision intent the
|
|
27
|
-
// control-plane runner drains — instead of only a manual "production topology"
|
|
28
|
-
// task. OAuth-app creation + first sign-in stay guided/manual (no clean API). If
|
|
29
|
-
// the target instance doesn't have the provisioning module enabled, init falls
|
|
30
|
-
// back to filing the manual task (nothing is silently dropped).
|
|
31
|
-
//
|
|
32
|
-
// Safety: refuses to overwrite an existing config/branding.json unless --force
|
|
33
|
-
// (so running it inside an already-configured instance — e.g. OTB — can't
|
|
34
|
-
// clobber it). Use --dry-run to preview every file + API call without doing any.
|
|
35
|
-
//
|
|
36
|
-
// --adopt (brownfield, ADR 0121): the greenfield body above assumes a blank slate —
|
|
37
|
-
// it refuses where config/branding.json exists, and --force OVERWRITES. `--adopt` is
|
|
38
|
-
// the opposite: it LAYERS Cloud Bongos onto an EXISTING repo (app code, git history,
|
|
39
|
-
// a package.json). It writes the lean config only where absent, adds the pinned
|
|
40
|
-
// @bongos/core dependency to the owner's package.json without touching any other
|
|
41
|
-
// field, and materializes .claude/ ADDITIVELY — for any pre-existing file it
|
|
42
|
-
// MERGES-or-LEAVES-AND-REPORTS, it NEVER overwrites, and it does not reuse the --force
|
|
43
|
-
// path. It deliberately does NOT seed a synthetic "V1 — Prove the loop": capturing the
|
|
44
|
-
// repo's real version/goal + importing its backlog is a later real-state step, and the
|
|
45
|
-
// full conflict pre-flight is a later step too — this file lands the mode skeleton +
|
|
46
|
-
// additive config layering (task 2042). Every other onboarding leg is identical.
|
|
47
|
-
//
|
|
48
|
-
// Usage:
|
|
49
|
-
// bongos init interactive interview (greenfield — a NEW instance)
|
|
50
|
-
// bongos init --adopt LAYER onto an existing repo (brownfield; never clobbers).
|
|
51
|
-
// Runs a conflict PRE-FLIGHT + accept-gate: nothing writes
|
|
52
|
-
// until you confirm (interactive y/N) or pass --accept.
|
|
53
|
-
// bongos init --adopt --accept apply the adopt without the interactive prompt (CI / non-interactive)
|
|
54
|
-
// bongos init --from spec.json non-interactive (CI / the C8 self-build proof)
|
|
55
|
-
// bongos init --dry-run print the plan; write nothing, call nothing
|
|
56
|
-
// bongos init --dir <path> target dir for the config files (default: cwd)
|
|
57
|
-
// bongos init --no-seed write config only; skip the version/task seeding
|
|
58
|
-
// bongos init --force overwrite existing config files (greenfield only; ignored by --adopt)
|
|
59
|
-
// bongos init --vendor-core <tgz> greenfield only: vendor the @bongos/core .tgz + pin
|
|
60
|
-
// package.json to file:vendor/… + generate package-lock.json,
|
|
61
|
-
// so the scaffold is `npm ci`-installable (ADR 0108 gap 1/4).
|
|
62
|
-
// Without it the scaffold pins the caret range, which
|
|
63
|
-
// resolves from the public npm registry (--registry-core).
|
|
64
|
-
// bongos init --registry-core greenfield only: keep the caret pin and generate
|
|
65
|
-
// package-lock.json from the registry. @bongos/core is
|
|
66
|
-
// PUBLIC (task 1003872), so this needs no token, no login
|
|
67
|
-
// and no .npmrc — it resolves from the default registry
|
|
68
|
-
// like any other dependency.
|
|
69
|
-
// Mutually exclusive with --vendor-core (registry vs tarball).
|
|
70
|
-
|
|
71
|
-
const fs = require('node:fs');
|
|
72
|
-
const path = require('node:path');
|
|
73
|
-
const readline = require('node:readline');
|
|
74
|
-
const { apiCall, arg, hasFlag } = require('./cli-lib');
|
|
75
|
-
const { DEFAULT_HIERARCHY } = require('../../src/bongos/hierarchy-config');
|
|
76
|
-
const { resolveCoreRoot, FALLBACK_ENV_PREFIX } = require('../../src/instance-config'); // ADR 0108 §1: where the core package lives
|
|
77
|
-
const { materializeClaude } = require('./claude-materialize'); // ADR 0108 §3 (W3): copy .claude/ into the instance
|
|
78
|
-
const { detectStack, formatStackSummary } = require('./adopt-detect'); // ADR 0121 §Decision 4 (task 2043): inspect an existing repo before layering
|
|
79
|
-
const { resolveBacklogTasks, DEFAULT_MAX: BACKLOG_MAX } = require('./adopt-import'); // ADR 0121 §Decision 3 (task 2044): import an existing backlog
|
|
80
|
-
const { preflightAdopt, formatPreflight } = require('./adopt-preflight'); // ADR 0121 §Decision 5 (task 2045): the accept-gated conflict pre-flight
|
|
81
|
-
|
|
82
|
-
const KNOWN_MODULES = ['game', 'art-pipeline', 'discord'];
|
|
83
|
-
|
|
84
|
-
// The provisioning hosting shapes — a small mirror of modules/provisioning's
|
|
85
|
-
// HOSTING_SHAPES. init deliberately does NOT import the (optional) provisioning
|
|
86
|
-
// module: it stays self-contained and lets the server be the authority on a
|
|
87
|
-
// request (POST /provisioning/instances validates slug/shape, and returns 404 when
|
|
88
|
-
// the module isn't enabled on the target instance — init then falls back to filing
|
|
89
|
-
// the manual production-topology task). ADR 0111 §3.
|
|
90
|
-
// ADR 0323: 'byo-host' is the free front door and the default; 'co-tenant' is RETIRED
|
|
91
|
-
// and the server refuses it outright, so it is absent here DELIBERATELY. Leaving it in
|
|
92
|
-
// would let init write a spec the create route then 403s — a local list that accepts
|
|
93
|
-
// more than the server does is worse than no list, because the refusal arrives a step
|
|
94
|
-
// later with no useful message. Dropping it means `--shape co-tenant` fails here, naming
|
|
95
|
-
// the shapes that work.
|
|
96
|
-
//
|
|
97
|
-
// 'dedicated' left for the same reason, one step further on: ADR 0327 decision 4 deleted
|
|
98
|
-
// the shape outright, so it is not merely refused but unstorable (migration
|
|
99
|
-
// provisioning_027 folded its value into 'cloud-host'). 'standalone' was renamed to
|
|
100
|
-
// 'cloud-host' by the same migration. Both were requestable from here until task 1004182.
|
|
101
|
-
const HOSTING_SHAPES = ['byo-host', 'cloud-host'];
|
|
102
|
-
|
|
103
|
-
// The Cloud Bongos core npm package an instance pins as a dependency (ADR 0108).
|
|
104
|
-
// `bongos init --adopt` LAYERS this onto an existing repo's package.json; `bongos
|
|
105
|
-
// upgrade` later re-pins it to a vendored `file:` tarball. Named so the adopt
|
|
106
|
-
// layering and the upgrade re-pin agree on the dependency name.
|
|
107
|
-
const CORE_PKG = '@bongos/core';
|
|
108
|
-
|
|
109
|
-
const isObj = (v) => v && typeof v === 'object' && !Array.isArray(v);
|
|
110
|
-
|
|
111
|
-
// The version RANGE `--adopt` writes for the core dep: a caret over the running
|
|
112
|
-
// core's CORE_VERSION — the declared intent. The CONCRETE artifact (a registry
|
|
113
|
-
// install, or the vendored `file:` tarball a `bongos upgrade` pins) is resolved by
|
|
114
|
-
// provisioning / upgrade per ADR 0108, not by init. Falls back to a safe floor if
|
|
115
|
-
// module-api can't be resolved (e.g. a partial checkout).
|
|
116
|
-
function coreDepRange() {
|
|
117
|
-
let v;
|
|
118
|
-
try { v = require('../../src/module-api').CORE_VERSION; } catch { v = null; }
|
|
119
|
-
return `^${v || '1.0.0'}`;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// The running core's bare version (no caret) — for deriving the vendored tarball name
|
|
123
|
-
// when `--vendor-core`'s tarball is non-canonically named. Fail-soft like coreDepRange().
|
|
124
|
-
function coreVersionSafe() {
|
|
125
|
-
try { return require('../../src/module-api').CORE_VERSION; } catch { return null; }
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// The npm scripts a STANDALONE greenfield instance runs. They MIRROR how the control
|
|
129
|
-
// plane runs a standalone instance (scripts/gds/provision.js): `hall` = the systemd
|
|
130
|
-
// ExecStart (`node <core>/src/platform-server.js`), `migrate` = standaloneMigrateCmd
|
|
131
|
-
// (`bash <core>/scripts/migrate.sh`). Keeping them identical means `npm run hall` /
|
|
132
|
-
// `npm run migrate` on the instance behave like production, and `bongos upgrade`'s
|
|
133
|
-
// `npm run migrate` step resolves to the core's migrate.sh (ADR 0108).
|
|
134
|
-
// The hall is deliberately NOT `start` (task 1004484): `npm start` belongs to the
|
|
135
|
-
// project's own app, and a host like Render reads it as "how this app starts" — given the
|
|
136
|
-
// hall there, the deploy has no database and times out. Nothing runs an instance's
|
|
137
|
-
// `npm start`: the box unit and `bongos dev` both start platform-server.js directly.
|
|
138
|
-
const INSTANCE_CORE_PKG_DIR = 'node_modules/@bongos/core';
|
|
139
|
-
const INSTANCE_HALL_SCRIPT = `node ${INSTANCE_CORE_PKG_DIR}/src/platform-server.js`;
|
|
140
|
-
const INSTANCE_MIGRATE_SCRIPT = `bash ${INSTANCE_CORE_PKG_DIR}/scripts/migrate.sh`;
|
|
141
|
-
|
|
142
|
-
// PURE (exported for tests) — build/augment the greenfield instance package.json so a
|
|
143
|
-
// fresh instance is `npm ci`-installable and runnable (ADR 0108 greenfield gap 1/4,
|
|
144
|
-
// task 2053): the @bongos/core dependency (the `file:` tarball pin when a tarball is
|
|
145
|
-
// vendored, else the declared caret range — the CARET RESOLVES NOWHERE on npm, which is
|
|
146
|
-
// exactly why the vendored path pins `file:`) plus the hall/migrate npm scripts a
|
|
147
|
-
// standalone instance runs. Preserves any pre-existing fields + scripts (fills only what
|
|
148
|
-
// is missing); greenfield OWNS the core dep, so it is always (re)set to `coreDep`. Never
|
|
149
|
-
// spawns npm — generating the lockfile is a separate imperative step in main().
|
|
150
|
-
// `moduleDeps` (ADR 0138 / task 2160): the merged external npm deps of the modules this
|
|
151
|
-
// instance ENABLES. @bongos/core ships lean (express+pg, ADR 0108), so a bundled module that
|
|
152
|
-
// needs more (e.g. discord → discord.js) declares it in its module.json `dependencies`, and the
|
|
153
|
-
// consumer's package.json must carry it or boot crashes on the missing module (rehearsal F2).
|
|
154
|
-
// Precedence: module deps FILL gaps, an explicit pre-existing pin WINS over them, @bongos/core
|
|
155
|
-
// is always (re)set. With no moduleDeps this is byte-identical to before.
|
|
156
|
-
function buildInstancePackageJson(existing, { name = 'cloudbongos-instance', coreDep, moduleDeps } = {}) {
|
|
157
|
-
const dep = coreDep || coreDepRange();
|
|
158
|
-
const pkg = isObj(existing) ? { ...existing } : {};
|
|
159
|
-
if (!pkg.name) pkg.name = name;
|
|
160
|
-
if (pkg.private === undefined) pkg.private = true;
|
|
161
|
-
pkg.scripts = { ...(isObj(pkg.scripts) ? pkg.scripts : {}) };
|
|
162
|
-
// A scaffold from before task 1004484 wrote the hall as `start`; move exactly that
|
|
163
|
-
// command (never an owner's own start) to `hall`, unless they already have a `hall`.
|
|
164
|
-
if (pkg.scripts.start === INSTANCE_HALL_SCRIPT && !pkg.scripts.hall) {
|
|
165
|
-
pkg.scripts.hall = pkg.scripts.start;
|
|
166
|
-
delete pkg.scripts.start;
|
|
167
|
-
}
|
|
168
|
-
if (!pkg.scripts.hall) pkg.scripts.hall = INSTANCE_HALL_SCRIPT;
|
|
169
|
-
if (!pkg.scripts.migrate) pkg.scripts.migrate = INSTANCE_MIGRATE_SCRIPT;
|
|
170
|
-
pkg.dependencies = {
|
|
171
|
-
...(isObj(moduleDeps) ? moduleDeps : {}),
|
|
172
|
-
...(isObj(pkg.dependencies) ? pkg.dependencies : {}),
|
|
173
|
-
[CORE_PKG]: dep,
|
|
174
|
-
};
|
|
175
|
-
return pkg;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
// The external npm deps a single module declares in its module.json `dependencies` (ADR 0138).
|
|
179
|
-
// I/O (reads the core-package module manifest); fail-soft → {} when absent/unreadable.
|
|
180
|
-
function moduleDeclaredDeps(moduleKey, { coreRoot = resolveCoreRoot(), fsImpl = fs } = {}) {
|
|
181
|
-
try {
|
|
182
|
-
const mj = JSON.parse(fsImpl.readFileSync(path.join(coreRoot, 'modules', moduleKey, 'module.json'), 'utf8'));
|
|
183
|
-
return isObj(mj.dependencies) ? mj.dependencies : {};
|
|
184
|
-
} catch {
|
|
185
|
-
return {};
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// Merge the declared deps of every ENABLED module (modulesConfig = { modules: { key: bool } })
|
|
190
|
-
// into one object. PURE — `readDeps(key)` is injected (defaults to moduleDeclaredDeps) so this is
|
|
191
|
-
// testable with no disk. A later-enabled module's range wins on a key collision (rare).
|
|
192
|
-
function enabledModuleDeps(modulesConfig, { readDeps = (k) => moduleDeclaredDeps(k) } = {}) {
|
|
193
|
-
const enabled = isObj(modulesConfig) && isObj(modulesConfig.modules) ? modulesConfig.modules : {};
|
|
194
|
-
const out = {};
|
|
195
|
-
for (const [key, on] of Object.entries(enabled)) {
|
|
196
|
-
if (on === true) Object.assign(out, readDeps(key));
|
|
197
|
-
}
|
|
198
|
-
return out;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// ---------------------------------------------------------------------------
|
|
202
|
-
// Pure builders (exported for tests — no I/O, no network)
|
|
203
|
-
// ---------------------------------------------------------------------------
|
|
204
|
-
|
|
205
|
-
// A url-safe slug for a criterion_id derived from a short label.
|
|
206
|
-
function slugify(s, fallback = 'goal') {
|
|
207
|
-
const out = String(s || '')
|
|
208
|
-
.toLowerCase()
|
|
209
|
-
.replace(/[^a-z0-9]+/g, '-')
|
|
210
|
-
.replace(/^-+|-+$/g, '')
|
|
211
|
-
.slice(0, 48);
|
|
212
|
-
return out || fallback;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
// The DNS/db-safe instance slug a provisioning request carries — derived from an
|
|
216
|
-
// explicit spec.provisioning.slug or the product name, lowercased/dashed, then
|
|
217
|
-
// clamped to the module's 2–40-char rule (the server validates it too). Pure.
|
|
218
|
-
function provisioningSlug(spec) {
|
|
219
|
-
const p = (spec && spec.provisioning) || {};
|
|
220
|
-
const base = p.slug || (spec && spec.identity && spec.identity.productName) || '';
|
|
221
|
-
return slugify(base, 'instance').slice(0, 40).replace(/-+$/, '');
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// The POST /api/bongos/provisioning/instances body built from the interview's infra
|
|
225
|
-
// answers — or null when the owner didn't opt into provisioning (no spec.provisioning
|
|
226
|
-
// block). THE ADR 0111 §3 ARM: infra answers become a real provisioning REQUEST (a
|
|
227
|
-
// provisioning_intents row the control-plane runner drains) instead of only a manual
|
|
228
|
-
// runbook task. Pure — no I/O; the caller POSTs it. Shape defaults to the cheapest
|
|
229
|
-
// byo-host ($0 to us — the owner supplies the host) per the budget DNA (ADR 0323).
|
|
230
|
-
function provisioningRequest(spec) {
|
|
231
|
-
const p = spec && spec.provisioning;
|
|
232
|
-
if (!isObj(p)) return null;
|
|
233
|
-
const shape = HOSTING_SHAPES.includes(p.shape) ? p.shape : 'byo-host';
|
|
234
|
-
const body = { slug: provisioningSlug(spec), hosting_shape: shape };
|
|
235
|
-
if (p.domain) body.domain = String(p.domain).trim();
|
|
236
|
-
if (p.targetRef) body.target_ref = String(p.targetRef).trim();
|
|
237
|
-
if (p.tier) body.tier = String(p.tier).trim();
|
|
238
|
-
return body;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// The kickoff checklist itself (and the production-topology step the provisioning
|
|
242
|
-
// module can automate) now live in modules/lifecycle/kickoff-checklist.js — ONE list shared
|
|
243
|
-
// with the lifecycle module, which files the same steps at the founder's first
|
|
244
|
-
// sign-in on the control-plane path (task 1003239). init keeps its names.
|
|
245
|
-
const { kickoffChecklist, productionTopologyKickoff } = require('../../modules/lifecycle/kickoff-checklist');
|
|
246
|
-
|
|
247
|
-
// The lean instance branding.json: ONLY the fields the owner supplied. Everything
|
|
248
|
-
// else (theme, copy, rank labels, box subdomain pattern) resolves from
|
|
249
|
-
// config/branding.neutral.json via src/branding.js. Writing less keeps an
|
|
250
|
-
// instance's overrides legible and lets vanilla defaults flow through.
|
|
251
|
-
function buildBrandingConfig(spec) {
|
|
252
|
-
const id = spec.identity || {};
|
|
253
|
-
const productName = id.productName;
|
|
254
|
-
const origin = (spec.domains && spec.domains.publicOrigin) || 'http://localhost:3000';
|
|
255
|
-
const branding = {
|
|
256
|
-
_note: `${productName} — instance brand pack (overrides over config/branding.neutral.json). ` +
|
|
257
|
-
'Authored by `bongos init`. Fill the LOOK (palette/fonts/wordmark) with your own LLM via docs/branding-fill-prompt.md.',
|
|
258
|
-
identity: {
|
|
259
|
-
productName,
|
|
260
|
-
worldName: id.worldName || productName,
|
|
261
|
-
company: { name: (id.company && id.company.name) || '', site: (id.company && id.company.site) || '' },
|
|
262
|
-
},
|
|
263
|
-
llmProjectName: productName,
|
|
264
|
-
domains: {
|
|
265
|
-
publicOrigin: origin,
|
|
266
|
-
buildersOrigin: origin,
|
|
267
|
-
statusOrigin: origin,
|
|
268
|
-
oauthOrigin: origin,
|
|
269
|
-
},
|
|
270
|
-
repo: { owner: spec.repo.owner, name: spec.repo.name },
|
|
271
|
-
firstAdmin: spec.firstAdmin,
|
|
272
|
-
currency: { label: (spec.currency && spec.currency.label) || 'credits', symbol: (spec.currency && spec.currency.symbol) || '' },
|
|
273
|
-
envPrefix: spec.envPrefix || FALLBACK_ENV_PREFIX,
|
|
274
|
-
// Every instance gets its OWN session/config dir (task 1002626). Without
|
|
275
|
-
// this, instance-config.js falls back to the shared 'cloudbongos' dir, so
|
|
276
|
-
// every un-branded instance on a machine reads/writes the SAME
|
|
277
|
-
// ~/.config/cloudbongos/bongos-session.json — signing in to one silently
|
|
278
|
-
// evicts the CLI session of every other, including the hub. Same slug
|
|
279
|
-
// family as the package name + provisioning slug.
|
|
280
|
-
configDir: spec.configDir ? String(spec.configDir).trim() : slugify(productName, 'instance'),
|
|
281
|
-
};
|
|
282
|
-
if (spec.tagline) branding.copy = { tagline: spec.tagline };
|
|
283
|
-
return branding;
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
// modules.json — every known module, explicit boolean. Default OFF (vanilla).
|
|
287
|
-
function buildModulesConfig(spec) {
|
|
288
|
-
const on = new Set(Array.isArray(spec.modules) ? spec.modules : []);
|
|
289
|
-
const modules = {};
|
|
290
|
-
for (const m of KNOWN_MODULES) modules[m] = on.has(m);
|
|
291
|
-
return { modules };
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
// hierarchy.json — the work-tier preset (ADR 0086 §1). The six-tier default with
|
|
295
|
-
// the instance's optional overrides applied: spec.hierarchy.labels ({tierKey:
|
|
296
|
-
// label}), spec.hierarchy.enabled ({tierKey: bool}), spec.hierarchy.roles
|
|
297
|
-
// ({scope/membership/criteria: tierKey}). Most instances keep the canonical six
|
|
298
|
-
// tiers, so this writes them explicitly (self-documenting), resolved over the
|
|
299
|
-
// baked DEFAULT_HIERARCHY by src/bongos/hierarchy-config.js at load.
|
|
300
|
-
function buildHierarchyConfig(spec) {
|
|
301
|
-
const h = isObj(spec.hierarchy) ? spec.hierarchy : {};
|
|
302
|
-
const labels = isObj(h.labels) ? h.labels : {};
|
|
303
|
-
const enabled = isObj(h.enabled) ? h.enabled : {};
|
|
304
|
-
const tiers = DEFAULT_HIERARCHY.tiers.map((t) => ({
|
|
305
|
-
key: t.key,
|
|
306
|
-
label: typeof labels[t.key] === 'string' && labels[t.key].trim() ? labels[t.key].trim() : t.label,
|
|
307
|
-
enabled: typeof enabled[t.key] === 'boolean' ? enabled[t.key] : t.enabled,
|
|
308
|
-
}));
|
|
309
|
-
const roles = { ...DEFAULT_HIERARCHY.roles, ...(isObj(h.roles) ? h.roles : {}) };
|
|
310
|
-
const productName = (spec.identity && spec.identity.productName) || 'Instance';
|
|
311
|
-
return {
|
|
312
|
-
_note: `${productName} — work-hierarchy tiers (ADR 0086 §1): per-tier label/enabled + roles ` +
|
|
313
|
-
'(which tier carries scope_modules / members / done-when criteria), resolved over the six-tier ' +
|
|
314
|
-
'default in src/bongos/hierarchy-config.js. Authored by `bongos init`.',
|
|
315
|
-
tiers,
|
|
316
|
-
roles,
|
|
317
|
-
};
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// PURE — layer the pinned core dependency into a parsed package.json (ADR 0121
|
|
321
|
-
// §Decision 2 / task 2042). NEVER clobbers: if `@bongos/core` is already a dep
|
|
322
|
-
// (in dependencies OR devDependencies) it returns the object untouched with
|
|
323
|
-
// action:'present'; if there is no package.json at all it MINTS a minimal one
|
|
324
|
-
// (action:'created'); otherwise it ADDS the dep, preserving every existing field and
|
|
325
|
-
// key order (action:'added'). The `--force`-overwrite path is never involved. The
|
|
326
|
-
// caller only writes the file for 'added'/'created' — 'present' stays byte-untouched.
|
|
327
|
-
function mergeCoreDependency(pkg, { corePkg = CORE_PKG, coreRange, name = 'cloudbongos-instance' } = {}) {
|
|
328
|
-
const range = coreRange || coreDepRange();
|
|
329
|
-
if (!isObj(pkg)) {
|
|
330
|
-
return { pkg: { name, private: true, dependencies: { [corePkg]: range } }, action: 'created' };
|
|
331
|
-
}
|
|
332
|
-
const already = (isObj(pkg.dependencies) && pkg.dependencies[corePkg]) ||
|
|
333
|
-
(isObj(pkg.devDependencies) && pkg.devDependencies[corePkg]);
|
|
334
|
-
if (already) return { pkg, action: 'present' };
|
|
335
|
-
// Spread keeps the original key order — `dependencies` stays where it was (or is
|
|
336
|
-
// appended if absent). We add exactly one key; we never reorder or drop theirs.
|
|
337
|
-
const next = { ...pkg, dependencies: { ...(isObj(pkg.dependencies) ? pkg.dependencies : {}), [corePkg]: range } };
|
|
338
|
-
return { pkg: next, action: 'added' };
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
// The kickoff checklist, as tasks — the steps init CANNOT do for you (the shared
|
|
342
|
-
// list, self-host shape). Production topology is omitted when the owner opted into
|
|
343
|
-
// provisioning: the control-plane runner covers that leg (ADR 0111 §3).
|
|
344
|
-
function kickoffTasks(spec) {
|
|
345
|
-
return kickoffChecklist(spec, { provisioned: !!provisioningRequest(spec) });
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
// Normalize a raw spec (from --from or the interview) to canonical shape +
|
|
349
|
-
// defaults. Pure.
|
|
350
|
-
function normalizeSpec(raw = {}) {
|
|
351
|
-
const spec = { ...raw };
|
|
352
|
-
spec.identity = spec.identity || {};
|
|
353
|
-
spec.repo = spec.repo || {};
|
|
354
|
-
spec.version = spec.version || {};
|
|
355
|
-
spec.modules = Array.isArray(spec.modules) ? spec.modules.filter((m) => KNOWN_MODULES.includes(m)) : [];
|
|
356
|
-
if (!spec.version.status) spec.version.status = 'building';
|
|
357
|
-
// Provisioning (ADR 0111 §3) — a block ⇒ the owner opted in. Coerce the shape to a
|
|
358
|
-
// known value (default byo-host, the free front door) and trim the free-text refs; drop the
|
|
359
|
-
// block entirely when absent so provisioningRequest() reads it as "not requested".
|
|
360
|
-
if (isObj(spec.provisioning)) {
|
|
361
|
-
const p = spec.provisioning;
|
|
362
|
-
spec.provisioning = {
|
|
363
|
-
shape: HOSTING_SHAPES.includes(p.shape) ? p.shape : 'byo-host',
|
|
364
|
-
...(p.slug ? { slug: String(p.slug).trim() } : {}),
|
|
365
|
-
...(p.domain ? { domain: String(p.domain).trim() } : {}),
|
|
366
|
-
...(p.targetRef ? { targetRef: String(p.targetRef).trim() } : {}),
|
|
367
|
-
...(p.tier ? { tier: String(p.tier).trim() } : {}),
|
|
368
|
-
};
|
|
369
|
-
} else {
|
|
370
|
-
delete spec.provisioning;
|
|
371
|
-
}
|
|
372
|
-
return spec;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
// Validate a normalized spec → array of human-readable error strings ([] = ok).
|
|
376
|
-
// Version fields are required whenever init will SEED — greenfield always, and
|
|
377
|
-
// `--adopt` too (task 2044: adopt reflects the repo's REAL current version/goal, not
|
|
378
|
-
// a synthetic V1). Only `--adopt --no-seed` (layering-only, the task-2042 skeleton
|
|
379
|
-
// behavior) skips them, since it files nothing.
|
|
380
|
-
function validateSpec(spec, { adopt = false, noSeed = false } = {}) {
|
|
381
|
-
const errs = [];
|
|
382
|
-
if (!spec.identity || !spec.identity.productName) errs.push('identity.productName is required');
|
|
383
|
-
if (!spec.repo || !spec.repo.owner || !spec.repo.name) errs.push('repo.owner and repo.name are required');
|
|
384
|
-
if (!spec.firstAdmin) errs.push('firstAdmin (the founding owner GitHub login) is required');
|
|
385
|
-
const seeds = !(adopt && noSeed);
|
|
386
|
-
if (seeds) {
|
|
387
|
-
const noun = adopt ? 'your current version/milestone' : 'the first version';
|
|
388
|
-
if (!spec.version || !spec.version.id) errs.push(`version.id is required (e.g. "V1") — ${noun}`);
|
|
389
|
-
if (!spec.version || !spec.version.name) errs.push('version.name is required');
|
|
390
|
-
if (!spec.version || !spec.version.done_when) errs.push(`version.done_when is required (what "done" means for ${noun})`);
|
|
391
|
-
}
|
|
392
|
-
for (const m of spec.modules || []) {
|
|
393
|
-
if (!KNOWN_MODULES.includes(m)) errs.push(`unknown module "${m}" (known: ${KNOWN_MODULES.join(', ')})`);
|
|
394
|
-
}
|
|
395
|
-
if (spec.provisioning) {
|
|
396
|
-
if (!HOSTING_SHAPES.includes(spec.provisioning.shape)) {
|
|
397
|
-
errs.push(`provisioning.shape must be one of: ${HOSTING_SHAPES.join(', ')}`);
|
|
398
|
-
}
|
|
399
|
-
if (provisioningSlug(spec).length < 2) {
|
|
400
|
-
errs.push('provisioning: could not derive a valid instance slug (need ≥2 chars of [a-z0-9-]) — set identity.productName or provisioning.slug');
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
return errs;
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
// Build the POST /api/bongos/versions body from the spec (pure). The first version's
|
|
407
|
-
// done_when goal becomes both the version blurb and one done-when criterion, so
|
|
408
|
-
// /status has a finish line to roll up from day one.
|
|
409
|
-
function versionPayload(spec) {
|
|
410
|
-
const v = spec.version;
|
|
411
|
-
return {
|
|
412
|
-
id: v.id,
|
|
413
|
-
name: v.name,
|
|
414
|
-
status: v.status || 'building',
|
|
415
|
-
done_when: v.done_when,
|
|
416
|
-
criteria: [{ criterion_id: v.criterion_id ? slugify(v.criterion_id) : 'first-goal', criterion_md: v.done_when }],
|
|
417
|
-
};
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
// ---------------------------------------------------------------------------
|
|
421
|
-
// Interview (interactive)
|
|
422
|
-
// ---------------------------------------------------------------------------
|
|
423
|
-
|
|
424
|
-
function ask(rl, question, def) {
|
|
425
|
-
const suffix = def ? ` [${def}]` : '';
|
|
426
|
-
return new Promise((resolve) => rl.question(`${question}${suffix}\n> `, (a) => resolve((a || '').trim() || def || '')));
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
async function interview({ adopt = false } = {}) {
|
|
430
|
-
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
431
|
-
try {
|
|
432
|
-
console.log(adopt
|
|
433
|
-
? "\nLet's adopt Cloud Bongos onto your existing repo.\n (layering only — pre-existing files are left untouched, never overwritten)\n"
|
|
434
|
-
: "\nLet's stand up a new Cloud Bongos instance.\n");
|
|
435
|
-
const productName = await ask(rl, 'Project name?');
|
|
436
|
-
const tagline = await ask(rl, 'One-line tagline? (optional)');
|
|
437
|
-
const repoRaw = await ask(rl, 'GitHub repo the work lands in? (owner/name)');
|
|
438
|
-
const firstAdmin = await ask(rl, 'First owner (GitHub login)?');
|
|
439
|
-
const currency = await ask(rl, 'Name for the reward currency?', 'credits');
|
|
440
|
-
const publicOrigin = await ask(rl, 'Where will it run?', 'http://localhost:3000');
|
|
441
|
-
|
|
442
|
-
const modules = [];
|
|
443
|
-
console.log('\nFeature modules (all off = plain build platform):');
|
|
444
|
-
for (const m of KNOWN_MODULES) {
|
|
445
|
-
const yn = (await ask(rl, ` Enable "${m}"? (y/N)`, 'N')).toLowerCase();
|
|
446
|
-
if (yn === 'y' || yn === 'yes') modules.push(m);
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
// The version + goal. Greenfield seeds a SYNTHETIC first version; --adopt reflects
|
|
450
|
-
// the repo's REAL current version/milestone + open goal (ADR 0121 §Decision 3 /
|
|
451
|
-
// task 2044) — same questions, real-state framing, no "Prove the loop" default.
|
|
452
|
-
console.log(adopt ? '\nYour CURRENT version / milestone (adopt reflects real state):' : '\nYour first version:');
|
|
453
|
-
const versionId = await ask(rl, ' Version id?', adopt ? '' : 'V1');
|
|
454
|
-
const versionName = await ask(rl, ' Version name?', adopt ? '' : `${versionId} — Prove the loop`);
|
|
455
|
-
const doneWhen = await ask(rl, adopt ? ' What is the current goal — what does "done" mean right now?' : ` What does "done" mean for ${versionName}?`,
|
|
456
|
-
adopt ? '' : 'A task goes claim → grade → ship, with credits, on this instance.');
|
|
457
|
-
// Greenfield asks for one optional starter; --adopt IMPORTS the existing backlog
|
|
458
|
-
// (GitHub issues / a local TODO·ROADMAP·BACKLOG file) at seed time, so instead it
|
|
459
|
-
// just offers to point at a backlog file when auto-detection might miss it.
|
|
460
|
-
const starter = adopt ? '' : await ask(rl, ' First starter task to claim? (optional)');
|
|
461
|
-
const backlogFile = adopt ? await ask(rl, ' Path to a backlog file to import? (optional — blank = auto-detect TODO/ROADMAP/BACKLOG or GitHub issues)') : '';
|
|
462
|
-
|
|
463
|
-
// Production hosting (ADR 0111 §3) — opt-in. When the owner answers these infra
|
|
464
|
-
// questions, init files a real provisioning REQUEST via the API (not just a manual
|
|
465
|
-
// runbook task). Default N: most inits are localhost/dev and shouldn't queue infra.
|
|
466
|
-
console.log('\nProduction hosting (optional — needs the provisioning module + control-plane credentials):');
|
|
467
|
-
let provisioning;
|
|
468
|
-
const wantProv = (await ask(rl, ' Provision production hosting now? (y/N)', 'N')).toLowerCase();
|
|
469
|
-
if (wantProv === 'y' || wantProv === 'yes') {
|
|
470
|
-
// Describes each shape by WHAT IT DOES and never by its owner-facing product
|
|
471
|
-
// name. The stored value → owner-facing label translation lives in exactly one
|
|
472
|
-
// place — SHAPE_LABEL in modules/public-landing/public/projects.html (ADR 0323,
|
|
473
|
-
// and this module's CLAUDE.md says so) — so glossing '"cloud host"' here would
|
|
474
|
-
// be a second copy of it, in a file no designer renaming the product would
|
|
475
|
-
// think to open. A CLI prompt naming the stored value it is about to write is
|
|
476
|
-
// the right register anyway: this asks for a column value, not for a purchase.
|
|
477
|
-
const shape = (await ask(rl, ' Hosting shape? (byo-host = you run it on your own host / cloud-host = its own repo + pinned @bongos/core, stood up for you)', 'byo-host')).toLowerCase();
|
|
478
|
-
const domain = await ask(rl, ' Domain you own — bring-your-own (blank = the platform assigns <slug>.<its apex> when configured)?');
|
|
479
|
-
const targetRef = await ask(rl, ' Target credential ref? (which control-plane creds the runner should use; optional)');
|
|
480
|
-
// No tier question any more. It existed only for 'dedicated', which ADR 0327
|
|
481
|
-
// decision 4 deleted: on the owner's own platform account a bigger plan is a
|
|
482
|
-
// setting they choose, not a hosting shape we model. `tier` stays in the spec
|
|
483
|
-
// shape below because a previously-written spec may still carry one.
|
|
484
|
-
const tier = '';
|
|
485
|
-
provisioning = {
|
|
486
|
-
shape: HOSTING_SHAPES.includes(shape) ? shape : 'byo-host',
|
|
487
|
-
domain: domain || undefined,
|
|
488
|
-
targetRef: targetRef || undefined,
|
|
489
|
-
tier: tier || undefined,
|
|
490
|
-
};
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
const [owner, name] = repoRaw.includes('/') ? repoRaw.split('/') : [repoRaw, ''];
|
|
494
|
-
const spec = {
|
|
495
|
-
identity: { productName },
|
|
496
|
-
tagline: tagline || undefined,
|
|
497
|
-
repo: { owner, name },
|
|
498
|
-
firstAdmin,
|
|
499
|
-
currency: { label: currency },
|
|
500
|
-
domains: { publicOrigin },
|
|
501
|
-
modules,
|
|
502
|
-
};
|
|
503
|
-
spec.version = { id: versionId, name: versionName, done_when: doneWhen };
|
|
504
|
-
if (starter) spec.starterTasks = [{ title: starter, kind: 'unclassified' }];
|
|
505
|
-
if (backlogFile) spec.backlogFile = backlogFile;
|
|
506
|
-
if (provisioning) spec.provisioning = provisioning;
|
|
507
|
-
return spec;
|
|
508
|
-
} finally {
|
|
509
|
-
rl.close();
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
// ---------------------------------------------------------------------------
|
|
514
|
-
// Write + seed
|
|
515
|
-
// ---------------------------------------------------------------------------
|
|
516
|
-
|
|
517
|
-
// PURE (exported for tests) — the root START-HERE guide (task 1002404, goal
|
|
518
|
-
// 1000052; task 1003881 made it LAYER onto an existing README instead of
|
|
519
|
-
// skipping one — see layerReadme below). A freshly-CLONED instance must tell a human what to run FIRST: the
|
|
520
|
-
// `bongos` CLI ships INSIDE the not-yet-installed @bongos/core package, so
|
|
521
|
-
// `npm install` has to come before any `bongos` command (including `bongos dev`).
|
|
522
|
-
// `bongos init` runs npm install during scaffolding, but a later `git clone` of
|
|
523
|
-
// the committed instance repo skips that — so this file is the signpost the clone
|
|
524
|
-
// carries. Owner-friendly and plain-language (the owner may not be an engineer).
|
|
525
|
-
function buildReadme(branding = {}) {
|
|
526
|
-
const identity = branding.identity || {};
|
|
527
|
-
const name = identity.productName || 'This Cloud Bongos instance';
|
|
528
|
-
const origin = (branding.domains && branding.domains.publicOrigin) || '';
|
|
529
|
-
const loginLine = origin
|
|
530
|
-
? `3. \`bongos login ${origin}\` — only if you're signed in to a *different* instance (\`bongos dev\` signs you in the first time).`
|
|
531
|
-
: `3. \`bongos login <your-instance-url>\` — only if you're signed in to a *different* instance (\`bongos dev\` signs you in the first time).`;
|
|
532
|
-
return [
|
|
533
|
-
`# ${name}`,
|
|
534
|
-
'',
|
|
535
|
-
'A **Cloud Bongos** instance — an AI-first build platform: AI agents claim tasks and write the code; a human owner sets scope and the gates.',
|
|
536
|
-
'',
|
|
537
|
-
'## Start here (first run)',
|
|
538
|
-
'',
|
|
539
|
-
'Just cloned this repo? Run these **in order**. The `bongos` CLI ships *inside* the `@bongos/core` dependency, so step 1 comes first — until it runs there is no `bongos` command:',
|
|
540
|
-
'',
|
|
541
|
-
'1. `npm install` — installs the toolchain (this is what creates the `bongos` command).',
|
|
542
|
-
'2. `bongos dev` — one command to run this instance locally: starts Postgres, builds the tables, launches the server, and signs you in.',
|
|
543
|
-
loginLine,
|
|
544
|
-
'4. `bongos start` — see what you can work on. (Inside Claude Code, the same thing is `/builder-start`.)',
|
|
545
|
-
'',
|
|
546
|
-
'Requires Node >= 22 and Postgres installed locally (macOS/Linux; on Windows use WSL). If anything looks off, `bongos doctor` checks your setup and prints the fix.',
|
|
547
|
-
'',
|
|
548
|
-
'## Where to look next',
|
|
549
|
-
'',
|
|
550
|
-
'- `CLAUDE.md` — how this project is built (the operating manual agents read first).',
|
|
551
|
-
'- `bongos --help` — the full CLI: claim, ship, status, recall, and more.',
|
|
552
|
-
'',
|
|
553
|
-
].join('\n');
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
// The START-HERE content as an APPENDABLE section, for a repo that already has a
|
|
557
|
-
// README of its own. Fenced by a stable marker so re-running init is idempotent and so
|
|
558
|
-
// an owner can find (and delete) the block we added.
|
|
559
|
-
//
|
|
560
|
-
// WHY this is not just buildReadme: an ADOPTED repo always has a README, and the
|
|
561
|
-
// write-if-absent rule below therefore skipped the first-run guide on every single adopt
|
|
562
|
-
// — silently, logging "already present — left untouched" as though nothing were owed.
|
|
563
|
-
// That removed the one human-facing instruction to run `npm install`, without which the
|
|
564
|
-
// repo has no `bongos` command at all. Appending mirrors how the adopt path already
|
|
565
|
-
// treats .gitignore: keep what the owner wrote, add only what the instance needs.
|
|
566
|
-
const README_MARKER = '<!-- cloud-bongos:start-here -->';
|
|
567
|
-
|
|
568
|
-
function buildReadmeSection(branding = {}) {
|
|
569
|
-
const guide = buildReadme(branding);
|
|
570
|
-
// Reuse the canonical guide, demoted one heading level so it nests under the owner's
|
|
571
|
-
// own README, and drop its H1 title (their README already has one).
|
|
572
|
-
const body = guide
|
|
573
|
-
.split('\n')
|
|
574
|
-
.slice(1) // drop "# <product>"
|
|
575
|
-
.join('\n')
|
|
576
|
-
.replace(/^## /gm, '### ')
|
|
577
|
-
.trim();
|
|
578
|
-
return `${README_MARKER}\n\n## Working on this project (Cloud Bongos)\n\n${body}\n`;
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
// Append the START-HERE section to an existing README unless it is already there.
|
|
582
|
-
// PURE (text in → text out) so the idempotence is unit-testable without fs.
|
|
583
|
-
// Returns { text, action } where action is 'appended' | 'present'.
|
|
584
|
-
function appendReadmeSection(existing, section) {
|
|
585
|
-
const prev = String(existing == null ? '' : existing);
|
|
586
|
-
if (prev.includes(README_MARKER)) return { text: prev, action: 'present' };
|
|
587
|
-
return { text: `${prev.replace(/\n*$/, '\n')}\n---\n\n${section}`, action: 'appended' };
|
|
588
|
-
}
|
|
589
|
-
|
|
590
|
-
// Put the first-run guide in the repo's README whichever state it is in: mint the whole
|
|
591
|
-
// guide when there is no README, else append the marked section. Shared by the greenfield
|
|
592
|
-
// and adopt paths so neither can silently owe it. Returns the action taken.
|
|
593
|
-
function layerReadme(branding, { dir, dryRun, log = console.log } = {}) {
|
|
594
|
-
const readmePath = path.join(dir, 'README.md');
|
|
595
|
-
if (!fs.existsSync(readmePath)) {
|
|
596
|
-
if (dryRun) { log(` [dry-run] would write README.md (first-run START-HERE)`); return 'created'; }
|
|
597
|
-
fs.writeFileSync(readmePath, buildReadme(branding));
|
|
598
|
-
log(` ✓ wrote README.md (first-run START-HERE)`);
|
|
599
|
-
return 'created';
|
|
600
|
-
}
|
|
601
|
-
const { text, action } = appendReadmeSection(fs.readFileSync(readmePath, 'utf8'), buildReadmeSection(branding));
|
|
602
|
-
if (action === 'present') {
|
|
603
|
-
log(' • README.md already carries the Cloud Bongos start-here section — left untouched.');
|
|
604
|
-
return 'present';
|
|
605
|
-
}
|
|
606
|
-
if (dryRun) { log(' [dry-run] would append the Cloud Bongos start-here section to the existing README.md'); return 'appended'; }
|
|
607
|
-
fs.writeFileSync(readmePath, text);
|
|
608
|
-
log(' ✓ appended the Cloud Bongos start-here section to README.md (your own content is untouched)');
|
|
609
|
-
return 'appended';
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
function writeConfigs(spec, { dir, force, dryRun, coreDep, log = console.log }) {
|
|
613
|
-
const configDir = path.join(dir, 'config');
|
|
614
|
-
const brandingPath = path.join(configDir, 'branding.json');
|
|
615
|
-
const modulesPath = path.join(configDir, 'modules.json');
|
|
616
|
-
const hierarchyPath = path.join(configDir, 'hierarchy.json');
|
|
617
|
-
const pkgPath = path.join(dir, 'package.json');
|
|
618
|
-
const readmePath = path.join(dir, 'README.md');
|
|
619
|
-
const branding = buildBrandingConfig(spec);
|
|
620
|
-
const modules = buildModulesConfig(spec);
|
|
621
|
-
const hierarchy = buildHierarchyConfig(spec);
|
|
622
|
-
// Greenfield OWNS package.json (ADR 0108 gap 1/4, task 2053): mint it — or augment one
|
|
623
|
-
// from a prior --force run — so the scaffold is `npm ci`-installable + runnable. Augment,
|
|
624
|
-
// never blind-overwrite, so a re-run keeps any hand-added fields/scripts.
|
|
625
|
-
const pkgName = slugify((spec.identity && spec.identity.productName) || '', 'cloudbongos-instance');
|
|
626
|
-
let existingPkg = null;
|
|
627
|
-
if (fs.existsSync(pkgPath)) { try { existingPkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')); } catch { existingPkg = null; } }
|
|
628
|
-
// Compose the deps of the ENABLED modules (ADR 0138 / task 2160) so an instance that turns a
|
|
629
|
-
// bundled module on gets that module's npm deps (e.g. discord → discord.js) in its package.json,
|
|
630
|
-
// rather than crashing at boot on a dep @bongos/core deliberately doesn't carry (rehearsal F2).
|
|
631
|
-
const moduleDeps = enabledModuleDeps(modules);
|
|
632
|
-
const pkg = buildInstancePackageJson(existingPkg, { name: pkgName, coreDep, moduleDeps });
|
|
633
|
-
const pinNote = pkg.dependencies[CORE_PKG];
|
|
634
|
-
|
|
635
|
-
if (dryRun) {
|
|
636
|
-
log(`\n[dry-run] would write ${brandingPath}:`);
|
|
637
|
-
log(JSON.stringify(branding, null, 2));
|
|
638
|
-
log(`\n[dry-run] would write ${modulesPath}:`);
|
|
639
|
-
log(JSON.stringify(modules, null, 2));
|
|
640
|
-
log(`\n[dry-run] would write ${hierarchyPath}:`);
|
|
641
|
-
log(JSON.stringify(hierarchy, null, 2));
|
|
642
|
-
log(`\n[dry-run] would write ${pkgPath} (pins ${CORE_PKG} → ${pinNote}):`);
|
|
643
|
-
log(JSON.stringify(pkg, null, 2));
|
|
644
|
-
log(`\n[dry-run] would write ${readmePath} (root START-HERE first-run guide) if absent`);
|
|
645
|
-
return { brandingPath, modulesPath, hierarchyPath, pkgPath, readmePath, wrote: false };
|
|
646
|
-
}
|
|
647
|
-
if (fs.existsSync(brandingPath) && !force) {
|
|
648
|
-
throw new Error(`${brandingPath} already exists — refusing to overwrite. Use --force to replace, or run init in a fresh --dir.`);
|
|
649
|
-
}
|
|
650
|
-
fs.mkdirSync(configDir, { recursive: true });
|
|
651
|
-
fs.writeFileSync(brandingPath, JSON.stringify(branding, null, 2) + '\n');
|
|
652
|
-
fs.writeFileSync(modulesPath, JSON.stringify(modules, null, 2) + '\n');
|
|
653
|
-
fs.writeFileSync(hierarchyPath, JSON.stringify(hierarchy, null, 2) + '\n');
|
|
654
|
-
fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
|
|
655
|
-
log(` ✓ wrote ${path.relative(dir, brandingPath)}`);
|
|
656
|
-
log(` ✓ wrote ${path.relative(dir, modulesPath)}`);
|
|
657
|
-
log(` ✓ wrote ${path.relative(dir, hierarchyPath)}`);
|
|
658
|
-
log(` ✓ wrote ${path.relative(dir, pkgPath)} (pins ${CORE_PKG} → ${pinNote})`);
|
|
659
|
-
// README START-HERE (task 1002404, layering added by task 1003881): mint it when
|
|
660
|
-
// absent, else APPEND the marked section. Never a blind overwrite — an owner's own
|
|
661
|
-
// README content always survives, which is why the guide stopped being skipped.
|
|
662
|
-
layerReadme(branding, { dir, dryRun: false, log });
|
|
663
|
-
return { brandingPath, modulesPath, hierarchyPath, pkgPath, readmePath, wrote: true };
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
// `--adopt` config layering (ADR 0121 §Decision 2 / task 2042). The additive
|
|
667
|
-
// sibling of writeConfigs: it does NOT refuse where config/branding.json exists and
|
|
668
|
-
// it NEVER overwrites. For each lean config file it WRITES only when absent, and
|
|
669
|
-
// LEAVES-AND-REPORTS when present. The greenfield writeConfigs — with its --force
|
|
670
|
-
// overwrite — is deliberately not reused: a brownfield repo is exactly where an
|
|
671
|
-
// overwrite is expensive. Returns { wrote:[names], left:[names] }.
|
|
672
|
-
function layerConfigs(spec, { dir, dryRun, log = console.log }) {
|
|
673
|
-
const configDir = path.join(dir, 'config');
|
|
674
|
-
const targets = [
|
|
675
|
-
['branding.json', buildBrandingConfig(spec)],
|
|
676
|
-
['modules.json', buildModulesConfig(spec)],
|
|
677
|
-
['hierarchy.json', buildHierarchyConfig(spec)],
|
|
678
|
-
];
|
|
679
|
-
const wrote = [];
|
|
680
|
-
const left = [];
|
|
681
|
-
for (const [name, content] of targets) {
|
|
682
|
-
const p = path.join(configDir, name);
|
|
683
|
-
if (fs.existsSync(p)) {
|
|
684
|
-
left.push(name);
|
|
685
|
-
log(` • config/${name} already present — left untouched (adopt never overwrites).`);
|
|
686
|
-
continue;
|
|
687
|
-
}
|
|
688
|
-
wrote.push(name);
|
|
689
|
-
if (dryRun) { log(` [dry-run] would write config/${name}`); continue; }
|
|
690
|
-
fs.mkdirSync(configDir, { recursive: true });
|
|
691
|
-
fs.writeFileSync(p, JSON.stringify(content, null, 2) + '\n');
|
|
692
|
-
log(` ✓ wrote config/${name}`);
|
|
693
|
-
}
|
|
694
|
-
return { wrote, left };
|
|
695
|
-
}
|
|
696
|
-
|
|
697
|
-
// `--adopt` package.json layering (ADR 0121 §Decision 2 / task 2042): add the
|
|
698
|
-
// pinned @bongos/core dependency to the owner's EXISTING package.json without
|
|
699
|
-
// touching any other field, or MINT a minimal one when the repo has none. When the
|
|
700
|
-
// dep is already present the file is left byte-untouched (no reserialize). An
|
|
701
|
-
// unparseable package.json is left alone with a report — adopt never risks
|
|
702
|
-
// corrupting a file it can't safely rewrite. Returns { action, path }.
|
|
703
|
-
function layerPackageJson(spec, { dir, dryRun, log = console.log, coreRange = coreDepRange() } = {}) {
|
|
704
|
-
const p = path.join(dir, 'package.json');
|
|
705
|
-
let existing = null;
|
|
706
|
-
if (fs.existsSync(p)) {
|
|
707
|
-
try { existing = JSON.parse(fs.readFileSync(p, 'utf8')); }
|
|
708
|
-
catch (e) {
|
|
709
|
-
log(` • package.json exists but is not valid JSON (${e.message}) — left untouched; add "${CORE_PKG}": "${coreRange}" to its dependencies by hand.`);
|
|
710
|
-
return { action: 'unparseable', path: p };
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
const name = slugify((spec.identity && spec.identity.productName) || '', 'cloudbongos-instance');
|
|
714
|
-
const { pkg, action } = mergeCoreDependency(existing, { coreRange, name });
|
|
715
|
-
if (action === 'present') {
|
|
716
|
-
log(` • ${CORE_PKG} already a dependency — package.json left untouched.`);
|
|
717
|
-
return { action, path: p };
|
|
718
|
-
}
|
|
719
|
-
const verb = action === 'created' ? 'create package.json pinning' : 'add';
|
|
720
|
-
const tail = action === 'added' ? ' to dependencies (existing fields preserved)' : '';
|
|
721
|
-
if (dryRun) { log(` [dry-run] would ${verb} ${CORE_PKG}@${coreRange}${tail}`); return { action, path: p }; }
|
|
722
|
-
fs.writeFileSync(p, JSON.stringify(pkg, null, 2) + '\n');
|
|
723
|
-
log(` ✓ ${action === 'created' ? 'created package.json pinning' : 'added'} ${CORE_PKG}@${coreRange}${tail}`);
|
|
724
|
-
return { action, path: p };
|
|
725
|
-
}
|
|
726
|
-
|
|
727
|
-
async function seedViaApi(spec, { dryRun, log = console.log, api = apiCall } = {}) {
|
|
728
|
-
const vp = versionPayload(spec);
|
|
729
|
-
const starters = Array.isArray(spec.starterTasks) ? spec.starterTasks : [];
|
|
730
|
-
const kickoff = kickoffTasks(spec);
|
|
731
|
-
const pr = provisioningRequest(spec); // ADR 0111 §3 — null unless the owner opted in
|
|
732
|
-
|
|
733
|
-
if (dryRun) {
|
|
734
|
-
log(`\n[dry-run] would POST /api/bongos/versions:`);
|
|
735
|
-
log(JSON.stringify(vp, null, 2));
|
|
736
|
-
log(`\n[dry-run] would create ${starters.length} starter + ${kickoff.length} kickoff task(s) under ${vp.id}.`);
|
|
737
|
-
if (pr) {
|
|
738
|
-
log(`\n[dry-run] would POST /api/bongos/provisioning/instances:`);
|
|
739
|
-
log(JSON.stringify(pr, null, 2));
|
|
740
|
-
log(` (queues a 'provision' intent; the control-plane runner stands up hosting — ADR 0111 §2/§3.`);
|
|
741
|
-
log(` production-topology is left OFF the kickoff list since it's now automated.)`);
|
|
742
|
-
}
|
|
743
|
-
return { seeded: false };
|
|
744
|
-
}
|
|
745
|
-
|
|
746
|
-
// 1. version + first goal
|
|
747
|
-
const vres = await api('POST', '/api/bongos/versions', vp);
|
|
748
|
-
if (!vres.ok && vres.status !== 409) {
|
|
749
|
-
throw new Error(`POST /versions failed (${vres.status}): ${JSON.stringify(vres.data)}`);
|
|
750
|
-
}
|
|
751
|
-
// The version's first goal — every task below needs its id (BV1.R11 refuses a
|
|
752
|
-
// goal-less task, and R03 refuses creating a goal on a version that is already
|
|
753
|
-
// 'building', which is what versionPayload makes). POST /versions now returns it
|
|
754
|
-
// alongside the version (task 1003701); on the 409 re-run path the version is
|
|
755
|
-
// already there, so read its goals back instead.
|
|
756
|
-
let goalId = vres.ok && vres.data && vres.data.goal ? vres.data.goal.id : null;
|
|
757
|
-
if (vres.status === 409) {
|
|
758
|
-
log(` • version ${vp.id} already exists — continuing.`);
|
|
759
|
-
const gres = await api('GET', `/api/bongos/goals?version=${encodeURIComponent(vp.id)}`);
|
|
760
|
-
const goals = gres.ok ? (Array.isArray(gres.data) ? gres.data : (gres.data && gres.data.goals) || []) : [];
|
|
761
|
-
const open = goals.find((g) => g && g.status === 'open' && !g.is_maintenance) || goals.find((g) => g && g.status === 'open');
|
|
762
|
-
goalId = open ? open.id : null;
|
|
763
|
-
} else {
|
|
764
|
-
log(` ✓ created version ${vp.id} + its first goal`);
|
|
765
|
-
}
|
|
766
|
-
// Fail LOUD rather than filing a wave of tasks the server will refuse one by one:
|
|
767
|
-
// with no goal every POST below returns 400 goal_id_required, and the run would
|
|
768
|
-
// report a pile of identical failures instead of the single reason behind them.
|
|
769
|
-
if (goalId == null) {
|
|
770
|
-
throw new Error(
|
|
771
|
-
`could not determine a goal for version ${vp.id} — every task needs one (goal_id_required). ` +
|
|
772
|
-
`The version exists but has no open goal to file under; create one and re-run.`
|
|
773
|
-
);
|
|
774
|
-
}
|
|
775
|
-
const criterionId = vp.criteria[0].criterion_id;
|
|
776
|
-
|
|
777
|
-
// A tracked kickoff/starter task (status ready). Returns true on success.
|
|
778
|
-
// The whole point of filing these is "nothing is silently skipped" — so a
|
|
779
|
-
// rejected POST must be LOUD: every failure is collected with its reason and
|
|
780
|
-
// reported against the expected count, never absorbed into a smaller total.
|
|
781
|
-
let attempted = 0;
|
|
782
|
-
const failures = [];
|
|
783
|
-
const postTask = async (t, extra = {}) => {
|
|
784
|
-
attempted++;
|
|
785
|
-
const res = await api('POST', '/api/bongos/tasks', {
|
|
786
|
-
version_id: vp.id, goal_id: goalId, title: t.title, description: t.description || '', status: 'ready',
|
|
787
|
-
kind: t.kind || 'infra', discipline: t.discipline || 'engineer', source: 'bongos-init', ...extra,
|
|
788
|
-
});
|
|
789
|
-
if (!res.ok) failures.push({ title: t.title, status: res.status, detail: JSON.stringify(res.data) });
|
|
790
|
-
return res.ok;
|
|
791
|
-
};
|
|
792
|
-
|
|
793
|
-
// 2. starter task(s) — linked to the first goal so /status rolls them up
|
|
794
|
-
let created = 0;
|
|
795
|
-
for (const t of starters) {
|
|
796
|
-
// task 1002988: `discipline: undefined` used to sit in this extras object, and
|
|
797
|
-
// because `...extra` spreads AFTER postTask's own `t.discipline || 'engineer'`
|
|
798
|
-
// it clobbered that default back to nothing — which is why a freshly scaffolded
|
|
799
|
-
// instance was born with role-less starter tasks. Dropped, so starters inherit
|
|
800
|
-
// the same default every other seeded task already got.
|
|
801
|
-
if (await postTask(t, { kind: t.kind || 'unclassified', criterion_ids: [criterionId] })) created++;
|
|
802
|
-
}
|
|
803
|
-
// 3. kickoff steps as tracked tasks
|
|
804
|
-
for (const t of kickoff) {
|
|
805
|
-
if (await postTask(t)) created++;
|
|
806
|
-
}
|
|
807
|
-
|
|
808
|
-
// 4. Provisioning arm (ADR 0111 §3): the infra answers become a real provisioning
|
|
809
|
-
// REQUEST, not just a manual runbook task. kickoffTasks already omitted the
|
|
810
|
-
// production-topology step when pr is set — so if the request can't be enqueued
|
|
811
|
-
// (module not enabled on the target instance → 404, or a transient failure), we
|
|
812
|
-
// re-file that manual step here so the leg is never silently dropped.
|
|
813
|
-
let provisioned = false;
|
|
814
|
-
if (pr) {
|
|
815
|
-
const pres = await api('POST', '/api/bongos/provisioning/instances', pr);
|
|
816
|
-
if (pres.ok) {
|
|
817
|
-
provisioned = true;
|
|
818
|
-
const inst = (pres.data && pres.data.instance) || {};
|
|
819
|
-
const cost = Number(inst.cost_estimate_usd || 0);
|
|
820
|
-
// Report the ROW's domain, not the request's: the server may have
|
|
821
|
-
// auto-assigned <slug>.<instanceBase> to a domainless request (task
|
|
822
|
-
// 1002704) — the operator must hear the address they actually got.
|
|
823
|
-
const addr = inst.domain
|
|
824
|
-
? `, ${inst.domain}${pr.domain ? '' : ' (auto-assigned — attach your own domain any time to replace it)'}`
|
|
825
|
-
: ', no address yet';
|
|
826
|
-
log(` ✓ requested provisioning of instance "${pr.slug}" (${pr.hosting_shape}${addr})` +
|
|
827
|
-
`${cost ? ` — est. $${cost}/mo` : ''} — a provision intent is queued for the control-plane runner`);
|
|
828
|
-
} else {
|
|
829
|
-
const why = pres.status === 404
|
|
830
|
-
? 'the provisioning module is not enabled on this instance'
|
|
831
|
-
: `the provisioning request failed (${pres.status}: ${JSON.stringify(pres.data)})`;
|
|
832
|
-
log(` • ${why} — filing the manual production-topology task instead`);
|
|
833
|
-
if (await postTask(productionTopologyKickoff())) created++;
|
|
834
|
-
}
|
|
835
|
-
}
|
|
836
|
-
|
|
837
|
-
const kickoffLabel = provisioned ? `${kickoff.length} kickoff + provisioning request` : `${kickoff.length} kickoff`;
|
|
838
|
-
if (failures.length) {
|
|
839
|
-
log(` ✗ ${failures.length} of ${attempted} task(s) FAILED to file — the checklist below is INCOMPLETE:`);
|
|
840
|
-
for (const f of failures) log(` ✗ "${f.title}" (${f.status}): ${f.detail}`);
|
|
841
|
-
}
|
|
842
|
-
log(` ${failures.length ? '⚠' : '✓'} filed ${created} of ${attempted} task(s) (${starters.length} starter + ${kickoffLabel})`);
|
|
843
|
-
return { seeded: true, created, attempted, failures, provisioned };
|
|
844
|
-
}
|
|
845
|
-
|
|
846
|
-
// ---------------------------------------------------------------------------
|
|
847
|
-
// adopt (brownfield) — LAYER onto an existing repo (ADR 0121 / task 2042)
|
|
848
|
-
// ---------------------------------------------------------------------------
|
|
849
|
-
|
|
850
|
-
// Interactive accept-gate for the pre-flight (ADR 0121 §Decision 5). Default No, so a
|
|
851
|
-
// bare Enter never writes. Only reached when there are no BLOCKING findings (those hard-
|
|
852
|
-
// stop before the prompt). Split out for testability (injectable input/output).
|
|
853
|
-
function confirmProceed({ input = process.stdin, output = process.stdout } = {}) {
|
|
854
|
-
const rl = readline.createInterface({ input, output });
|
|
855
|
-
return new Promise((resolve) => rl.question('\nProceed with layering + seeding onto this repo? (y/N) ', (a) => { rl.close(); resolve(/^y(es)?$/i.test((a || '').trim())); }));
|
|
856
|
-
}
|
|
857
|
-
|
|
858
|
-
// The brownfield sibling of main()'s greenfield body: LAYER Cloud Bongos onto an
|
|
859
|
-
// EXISTING repo without clobbering, then reflect its REAL state. It (1) detects the
|
|
860
|
-
// stack (task 2043), (2) runs an accept-gated conflict PRE-FLIGHT (task 2045) — nothing
|
|
861
|
-
// is written until the owner accepts — then, on accept, (3) writes the lean config where
|
|
862
|
-
// absent + adds the pinned core dep + copies .claude/ ADDITIVELY (task 2042) and (4)
|
|
863
|
-
// seeds the repo's REAL version/goal + IMPORTS its existing backlog (task 2044), NOT a
|
|
864
|
-
// synthetic "V1 — Prove the loop". `--dry-run` previews everything and writes nothing;
|
|
865
|
-
// `--no-seed` layers without seeding. Returns a process exit code.
|
|
866
|
-
// `coreDep`/`vendorPlan` (task 1002562): adopt used to ALWAYS write the caret range,
|
|
867
|
-
// which resolves NOWHERE on npm — so an adopted repo could not `npm ci --omit=dev`, the
|
|
868
|
-
// exact command the provisioner runs on the box. Greenfield already had --vendor-core for
|
|
869
|
-
// this; passing the same resolved pin through here makes an adopted repo equally
|
|
870
|
-
// installable. Omitted (a plain `bongos init --adopt` on a laptop) → the caret, unchanged.
|
|
871
|
-
async function runAdopt(spec, { dir, dryRun, noSeed = false, accept = false, coreDep = null, vendorPlan = null, log = console.log }) {
|
|
872
|
-
log(`\nAdopting Cloud Bongos onto the existing repo at "${dir}"${dryRun ? ' (dry run — nothing will be written or created)' : ''}:`);
|
|
873
|
-
log(' Layering — pre-existing files are left untouched; nothing is overwritten.');
|
|
874
|
-
|
|
875
|
-
// Inspect the tree BEFORE writing anything (ADR 0121 §Decision 4 / task 2043) so
|
|
876
|
-
// layering fits what is already here.
|
|
877
|
-
const stack = detectStack({ dir });
|
|
878
|
-
log('\nDetected stack + layout:');
|
|
879
|
-
for (const line of formatStackSummary(stack)) log(` • ${line}`);
|
|
880
|
-
|
|
881
|
-
// Conflict PRE-FLIGHT (ADR 0121 §Decision 5 / task 2045): report the blast radius, then
|
|
882
|
-
// gate the writes on the owner's acceptance. --dry-run previews without writing, so it
|
|
883
|
-
// needs no gate; a real run proceeds only on --accept or an interactive yes.
|
|
884
|
-
const report = preflightAdopt({ dir, stack });
|
|
885
|
-
log('\nConflict pre-flight (nothing is written until you accept):');
|
|
886
|
-
for (const line of formatPreflight(report)) log(line);
|
|
887
|
-
log(` → ${report.counts.blocking} blocking · ${report.counts.warning} warning · ${report.counts.info} ok`);
|
|
888
|
-
if (!dryRun) {
|
|
889
|
-
// A BLOCKING finding (e.g. a migration that WILL collide) is a hard stop — it can't
|
|
890
|
-
// be waved through with --accept; the owner must resolve it and re-run.
|
|
891
|
-
if (report.hasBlocking) {
|
|
892
|
-
log(`\n✗ ${report.counts.blocking} BLOCKING conflict(s) above — resolve them, then re-run. Nothing was written.`);
|
|
893
|
-
return 2;
|
|
894
|
-
}
|
|
895
|
-
const proceed = accept || (process.stdin.isTTY ? await confirmProceed() : false);
|
|
896
|
-
if (!proceed) {
|
|
897
|
-
log('\nPre-flight only — nothing was written. Re-run with --accept (or confirm interactively) to apply.');
|
|
898
|
-
return 0;
|
|
899
|
-
}
|
|
900
|
-
}
|
|
901
|
-
|
|
902
|
-
const cfg = layerConfigs(spec, { dir, dryRun, log });
|
|
903
|
-
const pkg = layerPackageJson(spec, { dir, dryRun, log, ...(coreDep ? { coreRange: coreDep } : {}) });
|
|
904
|
-
// The first-run guide, which adopt used to skip entirely: an adopted repo always has a
|
|
905
|
-
// README, so the greenfield write-if-absent rule never fired and the one instruction to
|
|
906
|
-
// run `npm install` was silently owed on every adopt.
|
|
907
|
-
layerReadme(buildBrandingConfig(spec), { dir, dryRun, log });
|
|
908
|
-
|
|
909
|
-
// Vendor the pinned core tarball + generate the lockfile, mirroring the greenfield
|
|
910
|
-
// --vendor-core steps, so the adopted repo is `npm ci --omit=dev`-installable (ADR 0108).
|
|
911
|
-
// Skipped when layerPackageJson found the dep ALREADY present — re-pinning someone's
|
|
912
|
-
// existing declaration is an overwrite, and adopt never overwrites.
|
|
913
|
-
if (vendorPlan && pkg.action !== 'present' && pkg.action !== 'unparseable') {
|
|
914
|
-
const upgrade = require('./upgrade');
|
|
915
|
-
if (dryRun) {
|
|
916
|
-
log(`\n [dry-run] would vendor ${vendorPlan.tgz} → ${vendorPlan.vendorRel} and run \`npm install\` to generate package-lock.json`);
|
|
917
|
-
} else {
|
|
918
|
-
log('\nVendoring the pinned @bongos/core + generating the lockfile:');
|
|
919
|
-
upgrade.vendorTarball({ instanceDir: dir, fromTgz: vendorPlan.tgz, targetVersion: vendorPlan.version });
|
|
920
|
-
log(` ✓ vendored ${vendorPlan.vendorRel}`);
|
|
921
|
-
const inst = upgrade.npmInstall(dir);
|
|
922
|
-
if (!inst.ok) {
|
|
923
|
-
log(` ! npm install failed (${inst.reason || 'exit ' + inst.code}) — package-lock.json not generated; run \`npm install\` in ${dir} by hand before provisioning.`);
|
|
924
|
-
} else {
|
|
925
|
-
log(' ✓ npm install → package-lock.json generated (node_modules/@bongos/core installed)');
|
|
926
|
-
}
|
|
927
|
-
}
|
|
928
|
-
} else if (vendorPlan && pkg.action === 'present') {
|
|
929
|
-
log(` • ${CORE_PKG} was already declared — left as-is; the vendored tarball was NOT pinned over it.`);
|
|
930
|
-
}
|
|
931
|
-
|
|
932
|
-
log('\nMaterializing the .claude/ methodology surface (additive — existing files left untouched):');
|
|
933
|
-
const claude = materializeClaude({ coreRoot: resolveCoreRoot(), instanceDir: dir, dryRun, overwrite: false, log });
|
|
934
|
-
|
|
935
|
-
// Reflect REAL state (ADR 0121 §Decision 3 / task 2044): import the existing backlog,
|
|
936
|
-
// then seed the repo's REAL version/goal + the imported tasks + the (identical) human-
|
|
937
|
-
// only kickoff steps via the same seedViaApi greenfield uses — so the ledger starts
|
|
938
|
-
// truthful, not empty. `--no-seed` layers only (the task-2042 skeleton behavior).
|
|
939
|
-
let backlog = { source: 'none', tasks: [], truncated: false };
|
|
940
|
-
if (!noSeed) {
|
|
941
|
-
const githubToken = process.env.GITHUB_TOKEN || process.env.GH_TOKEN || null;
|
|
942
|
-
backlog = await resolveBacklogTasks({ dir, repo: spec.repo, githubToken, backlogFile: spec.backlogFile, onWarn: (m) => log(` • ${m}`) });
|
|
943
|
-
// Imported tasks ride in as starterTasks so seedViaApi links them to the goal's criterion.
|
|
944
|
-
if (backlog.tasks.length) spec.starterTasks = [...(spec.starterTasks || []), ...backlog.tasks];
|
|
945
|
-
const importNote = backlog.tasks.length
|
|
946
|
-
? `${backlog.tasks.length} imported task(s) from ${backlog.source}${backlog.truncated ? ` (capped at ${BACKLOG_MAX})` : ''}`
|
|
947
|
-
: 'no backlog found (capture tasks later)';
|
|
948
|
-
log(`\nReflecting real state — seeding version "${spec.version && spec.version.id}" + goal + ${importNote}:`);
|
|
949
|
-
const seedResult = (await seedViaApi(spec, { dryRun, log })) || {};
|
|
950
|
-
if (Array.isArray(seedResult.failures) && seedResult.failures.length) {
|
|
951
|
-
log(`\n ⚠ ${seedResult.failures.length} seed task(s) failed to file (details above) — re-file them by hand or re-run the seed; the tracked checklist is incomplete until they exist.`);
|
|
952
|
-
}
|
|
953
|
-
} else {
|
|
954
|
-
log('\n (--no-seed: layered config only; skipped real-state seeding)');
|
|
955
|
-
}
|
|
956
|
-
|
|
957
|
-
const leftFiles = cfg.left.length
|
|
958
|
-
+ (Array.isArray(claude.skippedFiles) ? claude.skippedFiles.length : 0)
|
|
959
|
-
+ (pkg.action === 'present' || pkg.action === 'unparseable' ? 1 : 0);
|
|
960
|
-
|
|
961
|
-
log(`\n${dryRun ? 'Dry run complete — re-run without --dry-run (and --accept) to apply.' : 'Adopted.'} Next:`);
|
|
962
|
-
if (report.counts.warning > 0) log(` • ${report.counts.warning} pre-flight warning(s) above — reconcile them (esp. migrations / CI check names) as you settle in.`);
|
|
963
|
-
if (leftFiles > 0) log(` • ${leftFiles} pre-existing file(s) were left untouched — reconcile them against what a fresh instance ships.`);
|
|
964
|
-
log(' • fill the look: hand docs/branding-fill-prompt.md to your own LLM (or keep your existing branding).');
|
|
965
|
-
log(` • sign in as ${spec.firstAdmin} to seat yourself as the founding owner.`);
|
|
966
|
-
return 0;
|
|
967
|
-
}
|
|
968
|
-
|
|
969
|
-
// ---------------------------------------------------------------------------
|
|
970
|
-
// main
|
|
971
|
-
// ---------------------------------------------------------------------------
|
|
972
|
-
|
|
973
|
-
async function main(argv) {
|
|
974
|
-
const args = argv.slice(2);
|
|
975
|
-
const fromPath = arg('--from', args);
|
|
976
|
-
const dir = path.resolve(arg('--dir', args) || process.cwd());
|
|
977
|
-
const dryRun = hasFlag('--dry-run', args);
|
|
978
|
-
const force = hasFlag('--force', args);
|
|
979
|
-
const noSeed = hasFlag('--no-seed', args);
|
|
980
|
-
const adopt = hasFlag('--adopt', args); // brownfield: LAYER onto an existing repo (ADR 0121)
|
|
981
|
-
const accept = hasFlag('--accept', args) || hasFlag('--yes', args) || hasFlag('-y', args); // adopt pre-flight accept-gate (§Decision 5)
|
|
982
|
-
const vendorCore = arg('--vendor-core', args); // greenfield: vendor + file:-pin a core .tgz, then generate the lockfile (ADR 0108 gap 1/4, task 2053)
|
|
983
|
-
const registryCore = hasFlag('--registry-core', args); // greenfield: keep the caret pin and generate the lockfile from the public registry (task 1003878)
|
|
984
|
-
|
|
985
|
-
if (adopt && force) {
|
|
986
|
-
console.error('init: --force is a greenfield-only overwrite; --adopt never overwrites, so --force is ignored.');
|
|
987
|
-
}
|
|
988
|
-
if (vendorCore && registryCore) {
|
|
989
|
-
console.error('init: --vendor-core and --registry-core are mutually exclusive — the vendored tarball and the registry pull are two ways to resolve the same core dependency. Pick one.');
|
|
990
|
-
return 1;
|
|
991
|
-
}
|
|
992
|
-
|
|
993
|
-
let raw;
|
|
994
|
-
if (fromPath) {
|
|
995
|
-
try {
|
|
996
|
-
raw = JSON.parse(fs.readFileSync(path.resolve(fromPath), 'utf8'));
|
|
997
|
-
} catch (e) {
|
|
998
|
-
console.error(`init: could not read spec ${fromPath}: ${e.message}`);
|
|
999
|
-
return 1;
|
|
1000
|
-
}
|
|
1001
|
-
} else {
|
|
1002
|
-
raw = await interview({ adopt });
|
|
1003
|
-
}
|
|
1004
|
-
|
|
1005
|
-
const spec = normalizeSpec(raw);
|
|
1006
|
-
const errs = validateSpec(spec, { adopt, noSeed });
|
|
1007
|
-
if (errs.length) {
|
|
1008
|
-
console.error('\ninit: the spec is incomplete:');
|
|
1009
|
-
for (const e of errs) console.error(` • ${e}`);
|
|
1010
|
-
return 1;
|
|
1011
|
-
}
|
|
1012
|
-
|
|
1013
|
-
// Core-dep resolution (ADR 0108 gap 1/4, task 2053). With --vendor-core, pin
|
|
1014
|
-
// package.json to the vendored `file:` tarball (the caret range resolves NOWHERE on npm,
|
|
1015
|
-
// so a caret-only scaffold can't `npm ci`); the tarball is copied + the lockfile generated
|
|
1016
|
-
// below. Without it, the scaffold carries the declared caret (a local/dev scaffold the
|
|
1017
|
-
// owner resolves another way). Reuses the bongos-upgrade vendoring + install steps.
|
|
1018
|
-
//
|
|
1019
|
-
// Resolved BEFORE the adopt branch (task 1002562) because BOTH paths need it: an adopted
|
|
1020
|
-
// repo has to be `npm ci`-installable by the provisioner exactly like a scaffolded one.
|
|
1021
|
-
const upgrade = require('./upgrade');
|
|
1022
|
-
let coreDep = null; // null → writeConfigs/layerPackageJson write the caret range
|
|
1023
|
-
let vendorPlan = null;
|
|
1024
|
-
if (vendorCore) {
|
|
1025
|
-
const tgz = path.resolve(vendorCore);
|
|
1026
|
-
if (!fs.existsSync(tgz)) {
|
|
1027
|
-
console.error(`init: --vendor-core tarball not found: ${tgz}`);
|
|
1028
|
-
return 1;
|
|
1029
|
-
}
|
|
1030
|
-
const version = upgrade.versionFromTgzPath(tgz) || coreVersionSafe();
|
|
1031
|
-
if (!version) {
|
|
1032
|
-
console.error(`init: could not derive the core version from ${path.basename(tgz)} — expected a tarball named ${upgrade.ARTIFACT}-<version>.tgz (produced by \`node scripts/gds/package-core.js\`).`);
|
|
1033
|
-
return 1;
|
|
1034
|
-
}
|
|
1035
|
-
const vendorRel = upgrade.vendorRelFor(version);
|
|
1036
|
-
coreDep = `file:${vendorRel}`;
|
|
1037
|
-
vendorPlan = { tgz, version, vendorRel };
|
|
1038
|
-
}
|
|
1039
|
-
|
|
1040
|
-
// Brownfield (ADR 0121): a distinct LAYER + real-state path — never the greenfield
|
|
1041
|
-
// scaffold/overwrite below. Its own report + next-steps live in runAdopt.
|
|
1042
|
-
if (adopt) return await runAdopt(spec, { dir, dryRun, noSeed, accept, coreDep, vendorPlan });
|
|
1043
|
-
|
|
1044
|
-
console.log(`\nScaffolding "${spec.identity.productName}"${dryRun ? ' (dry run — nothing will be written or created)' : ''}:`);
|
|
1045
|
-
writeConfigs(spec, { dir, force, dryRun, coreDep });
|
|
1046
|
-
|
|
1047
|
-
// Vendor the pinned @bongos/core tarball + generate the lockfile so the scaffold is
|
|
1048
|
-
// `npm ci --omit=dev`-installable by the provisioner (ADR 0108 gap 1/4, task 2053). The
|
|
1049
|
-
// `npm install` here is the ONLY heavy step — it CREATES package-lock.json from the file:
|
|
1050
|
-
// tarball; the provisioner later runs `npm ci` against that committed lockfile.
|
|
1051
|
-
if (vendorPlan) {
|
|
1052
|
-
if (dryRun) {
|
|
1053
|
-
console.log(`\n[dry-run] would vendor ${vendorPlan.tgz} → ${vendorPlan.vendorRel} and run \`npm install\` to generate package-lock.json`);
|
|
1054
|
-
} else {
|
|
1055
|
-
console.log('\nVendoring the pinned @bongos/core + generating the lockfile:');
|
|
1056
|
-
upgrade.vendorTarball({ instanceDir: dir, fromTgz: vendorPlan.tgz, targetVersion: vendorPlan.version });
|
|
1057
|
-
console.log(` ✓ vendored ${vendorPlan.vendorRel}`);
|
|
1058
|
-
const inst = upgrade.npmInstall(dir);
|
|
1059
|
-
if (!inst.ok) {
|
|
1060
|
-
console.error(` ! npm install failed (${inst.reason || 'exit ' + inst.code}) — package-lock.json not generated; run \`npm install\` in ${dir} by hand before provisioning.`);
|
|
1061
|
-
} else {
|
|
1062
|
-
console.log(' ✓ npm install → package-lock.json generated (node_modules/@bongos/core installed)');
|
|
1063
|
-
}
|
|
1064
|
-
}
|
|
1065
|
-
}
|
|
1066
|
-
|
|
1067
|
-
// Registry-install path: keep the caret pin writeConfigs wrote and generate
|
|
1068
|
-
// package-lock.json from the registry, so a later `npm ci` is reproducible.
|
|
1069
|
-
//
|
|
1070
|
-
// This used to write an env-fed npm auth file and skip the lockfile when no credential was
|
|
1071
|
-
// present, because @bongos/core published PRIVATE. It is public now (task 1003872), so it
|
|
1072
|
-
// resolves from the default registry like any other dependency: no auth file, no credential,
|
|
1073
|
-
// and no tokenless-404 branch to explain (task 1003878).
|
|
1074
|
-
if (registryCore) {
|
|
1075
|
-
if (dryRun) {
|
|
1076
|
-
console.log('\n[dry-run] would run `npm install` to generate package-lock.json from the registry');
|
|
1077
|
-
} else {
|
|
1078
|
-
console.log('\nWiring the registry-install path:');
|
|
1079
|
-
const inst = upgrade.npmInstall(dir);
|
|
1080
|
-
if (!inst.ok) {
|
|
1081
|
-
console.error(` ! npm install failed (${inst.reason || 'exit ' + inst.code}) — package-lock.json not generated. @bongos/core is public, so this is a real failure (network, registry outage, or an unpublished version), not a missing credential.`);
|
|
1082
|
-
} else {
|
|
1083
|
-
console.log(' ✓ npm install → package-lock.json generated (pulled @bongos/core from the registry)');
|
|
1084
|
-
}
|
|
1085
|
-
}
|
|
1086
|
-
}
|
|
1087
|
-
|
|
1088
|
-
// Materialize the .claude/ methodology surface (ADR 0108 §3 / W3): Claude Code reads skills +
|
|
1089
|
-
// hooks + settings.json from the project root, never node_modules, so init copies them from the
|
|
1090
|
-
// core package into the instance and rewrites `node scripts/gds/<x>.js` → the `bongos` bin.
|
|
1091
|
-
// A no-op when the instance dir IS the core checkout (self-copy guard).
|
|
1092
|
-
console.log('\nMaterializing the .claude/ methodology surface:');
|
|
1093
|
-
materializeClaude({ coreRoot: resolveCoreRoot(), instanceDir: dir, dryRun, log: console.log });
|
|
1094
|
-
|
|
1095
|
-
// Regenerate the per-instance API artifacts (OpenAPI spec + api-reference + typed
|
|
1096
|
-
// client) from the PINNED core's routes so this fresh consumer's COMMITTED artifacts
|
|
1097
|
-
// match its core from day one — not the core package's build-time snapshot (task 2141).
|
|
1098
|
-
// They ship as CORE starters (task 2078 — the hall/docs must render before first regen)
|
|
1099
|
-
// yet are per-instance GENERATED; `bongos upgrade` does the same on a bump, this closes
|
|
1100
|
-
// the gap at standup. Best-effort: a hiccup warns, never fails init — the instance-root
|
|
1101
|
-
// drift guard (fitness `gen-api-docs --check` + the api_client byte-identity test)
|
|
1102
|
-
// catches any lag on the consumer's first CI.
|
|
1103
|
-
if (dryRun) {
|
|
1104
|
-
console.log('\n[dry-run] would regenerate the API artifacts (OpenAPI spec + reference + typed client) from the pinned core');
|
|
1105
|
-
console.log('[dry-run] would seed the whole-file navigation docs (session-log index) from the pinned core');
|
|
1106
|
-
} else {
|
|
1107
|
-
console.log('\nRegenerating the API artifacts from the pinned core (OpenAPI spec + reference + typed client):');
|
|
1108
|
-
const regen = upgrade.regenerateApiArtifacts({ instanceDir: dir, coreRoot: resolveCoreRoot() });
|
|
1109
|
-
if (regen.ok) console.log(` ✓ regenerated (${regen.ran.join(', ')}) → docs/api/ + docs/api-reference.md + clients/bongos-client/`);
|
|
1110
|
-
else console.error(` ! API-artifact regen skipped (${regen.reason}) — regenerate in ${dir} by hand; the instance-root fitness gate flags the lag otherwise.`);
|
|
1111
|
-
// Seed the whole-file navigation docs (session-log index) so a fresh instance's docs/ isn't
|
|
1112
|
-
// empty before its first deploy-regen (ADR 0110 / task 1002314). Gitignored on the instance —
|
|
1113
|
-
// this is a local seed; the ongoing refresh is regen-instance-docs.js on deploy + `bongos
|
|
1114
|
-
// upgrade`. Best-effort, mirrors the api-artifacts line: a hiccup warns, never fails init.
|
|
1115
|
-
console.log('\nSeeding the navigation docs from the pinned core (session-log index):');
|
|
1116
|
-
const nav = upgrade.regenerateNavDocs({ instanceDir: dir, coreRoot: resolveCoreRoot() });
|
|
1117
|
-
if (nav.ok) console.log(` ✓ seeded (${nav.ran.join(', ')}) → docs/`);
|
|
1118
|
-
else console.error(` ! nav-doc seed incomplete (failed: ${nav.failed.map((f) => f.gen).join(', ')}) — the deploy regen (regen-instance-docs.js) retries.`);
|
|
1119
|
-
}
|
|
1120
|
-
|
|
1121
|
-
let seedResult = {};
|
|
1122
|
-
if (!noSeed) seedResult = (await seedViaApi(spec, { dryRun })) || {};
|
|
1123
|
-
else console.log(' (--no-seed: skipped version/task seeding)');
|
|
1124
|
-
|
|
1125
|
-
console.log(`\n${dryRun ? 'Dry run complete.' : 'Done.'} Next:`);
|
|
1126
|
-
if (Array.isArray(seedResult.failures) && seedResult.failures.length) {
|
|
1127
|
-
console.log(` ⚠ ${seedResult.failures.length} seed task(s) failed to file (details above) — re-file them by hand or re-run the seed; the tracked checklist is incomplete until they exist.`);
|
|
1128
|
-
}
|
|
1129
|
-
console.log(' • fill the look: hand docs/branding-fill-prompt.md to your own LLM');
|
|
1130
|
-
console.log(` • sign in as ${spec.firstAdmin} to become the owner, then run \`bongos start\` to see the kickoff tasks`);
|
|
1131
|
-
console.log(' • work through the kickoff tasks the way you would any task: claim → ship');
|
|
1132
|
-
if (seedResult.provisioned) {
|
|
1133
|
-
console.log(` • the control-plane runner (\`bongos provision run-intents --apply\`) will stand up your hosting — watch it in the hall's Instances panel`);
|
|
1134
|
-
} else if (provisioningRequest(spec) && !dryRun) {
|
|
1135
|
-
console.log(' • provisioning wasn\'t enqueued (module off / request failed) — the manual production-topology task is in your queue');
|
|
1136
|
-
}
|
|
1137
|
-
return 0;
|
|
1138
|
-
}
|
|
1139
|
-
|
|
1140
|
-
module.exports = {
|
|
1141
|
-
buildBrandingConfig, buildModulesConfig, buildHierarchyConfig, buildReadme, kickoffTasks, normalizeSpec,
|
|
1142
|
-
validateSpec, versionPayload, slugify, writeConfigs, seedViaApi, interview, main,
|
|
1143
|
-
provisioningSlug, provisioningRequest, productionTopologyKickoff,
|
|
1144
|
-
// --adopt (brownfield layering, ADR 0121 / task 2042)
|
|
1145
|
-
mergeCoreDependency, coreDepRange, layerConfigs, layerPackageJson, runAdopt,
|
|
1146
|
-
buildReadmeSection, appendReadmeSection, layerReadme, README_MARKER,
|
|
1147
|
-
KNOWN_MODULES, HOSTING_SHAPES, CORE_PKG,
|
|
1148
|
-
// greenfield installability (ADR 0108 gap 1/4, task 2053)
|
|
1149
|
-
buildInstancePackageJson, coreVersionSafe, INSTANCE_HALL_SCRIPT, INSTANCE_MIGRATE_SCRIPT,
|
|
1150
|
-
// enabled-module dep composition (ADR 0138 / task 2160)
|
|
1151
|
-
moduleDeclaredDeps, enabledModuleDeps,
|
|
1152
|
-
};
|
|
1153
|
-
|
|
1154
|
-
if (require.main === module) {
|
|
1155
|
-
main(process.argv).then((code) => process.exit(code)).catch((err) => {
|
|
1156
|
-
console.error(`init: ${err.message}`);
|
|
1157
|
-
process.exit(1);
|
|
1158
|
-
});
|
|
1159
|
-
}
|
|
7
|
+
require('../bongos/forwarder.js').forward(module, 'init.js');
|