@bongos/core 1.21.175 → 1.21.177
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 +3371 -1636
- 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 +15 -15
- 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/config/scheduled-routines.json +3 -8
- package/docs/adr/0029-status-page-outage-resilience.md +6 -6
- package/docs/adr/0091-bounding-the-kernel-and-db-carve.md +1 -1
- package/docs/adr/0093-tranche-2-core-carve-sequence.md +1 -1
- 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 +4 -4
- package/docs/copy-inventory.md +1370 -1411
- package/docs/copy-registry.json +2136 -2536
- package/docs/design/demonolith-plan.md +6 -6
- package/docs/design/modular-architecture/00-research-report.md +1 -1
- package/docs/design/project-startup-direction.md +2 -2
- package/docs/design/projects-hub-direction-v2.md +1 -1
- package/docs/design/reviews/hall-v2/README.md +2 -2
- package/docs/design/vanilla-hall-ui-redesign-scope.md +1 -1
- package/docs/file-map.md +92 -96
- package/docs/handoff-template.md +5 -5
- package/docs/module-api-changelog.md +7 -3
- package/docs/modules-contract.md +8 -7
- package/docs/onboarding/diagrams/01-task-lifecycle.mmd +1 -1
- package/docs/onboarding/diagrams/02-rank-ladder.mmd +1 -1
- package/docs/onboarding/diagrams/03-drachmae-karma.mmd +1 -1
- package/docs/onboarding/diagrams/04-architecture.mmd +1 -1
- package/docs/onboarding/diagrams/05-versioning.mmd +1 -1
- package/docs/onboarding/diagrams/README.md +5 -9
- package/docs/onboarding/diagrams/assertions.json +3 -3
- package/docs/onboarding/slash-commands.md +2 -2
- package/docs/packs/artist.md +4 -4
- package/docs/packs/engineer.md +11 -10
- package/docs/packs/ideator.md +7 -7
- package/docs/page-inventory.json +20 -1
- package/docs/page-readings.json +4387 -4603
- package/docs/recipes/README.md +1 -1
- package/docs/recipes/audit-replay.md +4 -4
- package/docs/recipes/autobongos-windows-host.md +6 -6
- package/docs/recipes/bongos-cli-release.md +2 -2
- package/docs/recipes/claude-design-loop.md +7 -7
- package/docs/recipes/core-release-pipeline.md +19 -19
- package/docs/recipes/failed-ship-recovery-proof.md +2 -2
- package/docs/recipes/figma-design-loop.md +6 -6
- package/docs/recipes/gds-db-backup.md +9 -9
- package/docs/recipes/instance-deploy.md +3 -3
- package/docs/recipes/instance-first-run.md +1 -1
- package/docs/recipes/multi-builder-merge.md +2 -2
- package/docs/recipes/ops-gotchas.md +13 -10
- 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/db.js +9 -0
- package/modules/autonomy/gauge.js +1 -1
- package/modules/autonomy/governor-docket.js +2 -2
- package/modules/autonomy/module.json +2 -2
- package/modules/autonomy/pollers/daily-checks.js +262 -0
- package/modules/autonomy/pollers/routine-timers.js +9 -7
- package/modules/autonomy/rank-roles.js +64 -0
- package/modules/autonomy/routes/autonomy.js +3 -3
- package/modules/autonomy/server-schedule.js +37 -0
- package/modules/builder-settings/interaction-prefs.js +1 -1
- package/modules/builder-settings/render-prefs.js +1 -1
- package/modules/builder-settings/routes/settings.js +1 -1
- package/modules/builder-settings/skill-prefs.js +2 -2
- package/modules/builder-settings/wandering-prefs.js +2 -2
- package/modules/copy-desk/module.json +2 -2
- package/modules/copy-desk/page-data.js +5 -5
- package/modules/copy-desk/page-decisions.js +13 -1
- package/modules/copy-desk/proposals.js +4 -4
- package/modules/copy-desk/registry.js +2 -2
- package/modules/copy-desk/routes/copy-desk-release.js +119 -0
- package/modules/copy-desk/routes/copy-desk.js +3 -12
- package/modules/copy-desk/skills/tweak/SKILL.md +12 -12
- package/modules/copy-desk/tests/copy_flags.mjs +1 -1
- package/modules/copy-desk/tests/copy_no_cms.mjs +7 -3
- package/modules/copy-desk/tests/copy_proposals.mjs +2 -2
- package/modules/copy-desk/tests/copy_queue.mjs +1 -1
- package/modules/design-styles/skills/README.md +4 -4
- package/modules/design-styles/skills/imagegen-frontend-mobile/SKILL.md +1 -1
- package/modules/design-styles/skills/imagegen-frontend-web/SKILL.md +1 -1
- package/modules/discord/bug-attachments.js +1 -1
- package/modules/discord/ship-broadcast.js +1 -1
- package/modules/economy/achievements.js +49 -7
- package/modules/economy/cost-classify.js +6 -6
- package/modules/economy/cost-report.js +1 -1
- package/modules/economy/cost.js +1 -1
- package/modules/economy/credits.js +2 -1
- package/modules/economy/idea-size.js +2 -2
- package/modules/economy/reward.js +2 -0
- package/modules/economy/routes/cost.js +1 -1
- package/modules/economy/streak.js +43 -4
- package/modules/government/asks.js +1 -1
- package/modules/government/board.js +19 -2
- package/modules/government/catalog.js +3 -0
- package/modules/government/migrations/government_033_idea_vote.sql +46 -0
- package/modules/government/protected-surfaces.json +48 -47
- package/modules/government/recommendations.js +6 -2
- package/modules/government/routes/government.js +1 -1
- package/modules/grading/generated-provenance.js +13 -5
- package/modules/grading/grade-engine.js +1 -1
- package/modules/grading/grader-rubric.json +1 -1
- package/modules/grading/grader-score.js +1 -1
- package/modules/grading/grader-workers/index.js +1 -1
- package/modules/grading/grader.js +1 -1
- package/modules/grading/routes/grade.js +1 -1
- package/modules/hall-ui/public/atlas.html +5 -7
- package/modules/hall-ui/public/atlas.js +1 -1
- package/modules/hall-ui/public/atlas.states.json +1 -1
- package/modules/hall-ui/public/blockers.css +9 -0
- package/modules/hall-ui/public/blockers.html +4 -4
- package/modules/hall-ui/public/blockers.js +29 -30
- package/modules/hall-ui/public/board-room.css +5 -17
- package/modules/hall-ui/public/board-room.html +5 -6
- package/modules/hall-ui/public/board-room.js +41 -23
- package/modules/hall-ui/public/board-room.states.json +1 -1
- package/modules/hall-ui/public/brand-apply.js +1 -1
- package/modules/hall-ui/public/brand-holes.js +1 -1
- package/modules/hall-ui/public/builders.js +40 -86
- package/modules/hall-ui/public/city-decide.js +18 -4
- package/modules/hall-ui/public/city.html +1 -1
- package/modules/hall-ui/public/collab.html +1 -1
- package/modules/hall-ui/public/commands.html +6 -9
- package/modules/hall-ui/public/copy-desk.html +1 -1
- package/modules/hall-ui/public/copy-desk.js +2 -2
- package/modules/hall-ui/public/craft-mode.js +4 -0
- package/modules/hall-ui/public/deploy.html +6 -2
- package/modules/hall-ui/public/deploy.js +21 -13
- package/modules/hall-ui/public/diagrams.css +1 -1
- package/modules/hall-ui/public/diagrams.html +5 -8
- package/modules/hall-ui/public/diagrams.states.json +1 -1
- package/modules/hall-ui/public/drachmae.html +3 -7
- package/modules/hall-ui/public/fleet.html +3 -2
- package/modules/hall-ui/public/fleet.js +0 -4
- package/modules/hall-ui/public/gate.html +7 -7
- package/modules/hall-ui/public/gate.js +58 -77
- package/modules/hall-ui/public/goal-map.html +1 -1
- package/modules/hall-ui/public/goals-page.js +5 -5
- package/modules/hall-ui/public/goals-render.js +10 -11
- package/modules/hall-ui/public/goals.css +10 -0
- package/modules/hall-ui/public/goals.html +14 -7
- package/modules/hall-ui/public/government.html +3 -5
- package/modules/hall-ui/public/government.js +1 -5
- package/modules/hall-ui/public/hall-render.js +117 -57
- package/modules/hall-ui/public/hall-widgets.js +11 -11
- package/modules/hall-ui/public/idea.html +1 -1
- package/modules/hall-ui/public/ideas.html +3 -1
- package/modules/hall-ui/public/ideas.js +1 -0
- package/modules/hall-ui/public/index.html +12 -6
- package/modules/hall-ui/public/index.states.json +1 -1
- package/modules/hall-ui/public/mine-lens.js +1 -1
- package/modules/hall-ui/public/modules.html +7 -10
- package/modules/hall-ui/public/modules.js +0 -2
- package/modules/hall-ui/public/my-agents.html +1 -1
- package/modules/hall-ui/public/palette.js +5 -5
- package/modules/hall-ui/public/primer.html +4 -9
- package/modules/hall-ui/public/profile-connections.js +10 -2
- package/modules/hall-ui/public/profile-roles.js +3 -10
- package/modules/hall-ui/public/profile.html +12 -10
- package/modules/hall-ui/public/profile.js +13 -17
- package/modules/hall-ui/public/project-settings.html +3 -4
- package/modules/hall-ui/public/project-settings.js +0 -3
- package/modules/hall-ui/public/ranks.html +5 -11
- package/modules/hall-ui/public/ranks.js +6 -8
- package/modules/hall-ui/public/roadmap.css +0 -2
- package/modules/hall-ui/public/roadmap.html +1 -1
- package/modules/hall-ui/public/roadmap.js +16 -51
- package/modules/hall-ui/public/roster.html +1 -1
- package/modules/hall-ui/public/sessions.html +6 -8
- package/modules/hall-ui/public/sessions.js +7 -7
- package/modules/hall-ui/public/settings.html +1 -1
- package/modules/hall-ui/public/shell-trail.js +1 -1
- package/modules/hall-ui/public/shell.js +17 -17
- package/modules/hall-ui/public/street-deck.css +2 -1
- package/modules/hall-ui/public/street-deck.js +10 -2
- package/modules/hall-ui/public/street-desk.js +16 -5
- package/modules/hall-ui/public/street.html +1 -1
- package/modules/hall-ui/public/studio-lib.js +4 -0
- package/modules/hall-ui/public/studio.css +2 -0
- package/modules/hall-ui/public/studio.html +1 -1
- package/modules/hall-ui/public/studio.js +27 -1
- package/modules/hall-ui/public/style.css +43 -26
- package/modules/hall-ui/public/task-detail.js +10 -7
- package/modules/hall-ui/public/task.css +2 -0
- package/modules/hall-ui/public/task.html +3 -1
- package/modules/hall-ui/public/task.js +23 -7
- package/modules/hall-ui/public/thinking.html +1 -1
- package/modules/hall-ui/public/tweak-editor.html +1 -1
- package/modules/hall-ui/public/vote-control.js +208 -0
- package/modules/hall-ui/public/watch.html +3 -5
- package/modules/hall-ui/public/watch.js +5 -4
- package/modules/hall-ui/public/welcome-boot.css +130 -0
- package/modules/hall-ui/public/welcome-boot.js +334 -0
- package/modules/hall-ui/public/welcome-day.webp +0 -0
- package/modules/hall-ui/public/welcome-night.webp +0 -0
- package/modules/hall-ui/public/work-summary.js +1 -1
- package/modules/hall-ui/public/work.css +1 -0
- package/modules/hall-ui/public/work.html +3 -1
- package/modules/hall-ui/public/work.js +2 -1
- package/modules/hall-ui/records/accomplishments.md +16 -0
- package/modules/hall-ui/records/hall-ask-card.md +9 -0
- package/modules/hall-ui/records/karma-vote-control.md +13 -0
- package/modules/hall-ui/records/oversight-family.md +1 -1
- package/modules/hall-ui/records/profile-connections.md +2 -0
- package/modules/hall-ui/records/profile-roles.md +1 -1
- package/modules/hall-ui/records/reading-rooms.md +1 -1
- package/modules/hall-ui/records/welcome-tower.md +50 -0
- package/modules/ideas/migrations/ideas_011_idea_votes.sql +31 -0
- package/modules/ideas/projection.js +1 -1
- package/modules/ideas/routes/blockers.js +3 -3
- package/modules/ideas/routes/inbox.js +29 -1
- package/modules/ideas/routes/ratify-goal.js +1 -1
- package/modules/ideas/routing.js +1 -1
- package/modules/ideas/templates.js +1 -1
- package/modules/ideas/trail-descent.js +1 -1
- package/modules/ideas/trail-size.js +1 -1
- package/modules/ideas/votes.js +93 -0
- package/modules/lifecycle/abandon-leftovers.js +1 -1
- package/modules/lifecycle/cascade.js +1 -1
- package/modules/lifecycle/conflict-resolve.js +13 -21
- package/modules/lifecycle/criterion-ref.js +1 -1
- package/modules/lifecycle/db-analytics.js +57 -4
- package/modules/lifecycle/db-deps-criteria.js +1 -1
- package/modules/lifecycle/db-ship.js +2 -2
- package/modules/lifecycle/db-tasks.js +2 -2
- package/modules/lifecycle/db-versions.js +1 -1
- package/modules/lifecycle/db.js +2 -0
- package/modules/lifecycle/dead-deps.js +3 -3
- package/modules/lifecycle/dependency-advisory.js +3 -3
- package/modules/lifecycle/goal-category.js +1 -1
- package/modules/lifecycle/goal-forest.js +1 -1
- package/modules/lifecycle/goal-task-relevance-advisory.js +1 -1
- package/modules/lifecycle/kickoff-checklist.js +1 -1
- package/modules/lifecycle/kickoff-seed.js +1 -1
- package/modules/lifecycle/lifecycle.js +2 -0
- package/modules/lifecycle/merge-reach.js +29 -15
- package/modules/lifecycle/missing-dep-classify.js +3 -3
- package/modules/lifecycle/module.json +2 -1
- package/modules/lifecycle/page-tweak-approve.js +85 -1
- package/modules/lifecycle/page-tweak-hold.js +1 -1
- package/modules/lifecycle/publish-reconciler.js +1 -2
- package/modules/lifecycle/rot.js +1 -1
- package/modules/lifecycle/routes/artist-gate.js +1 -1
- package/modules/lifecycle/routes/gate-approvals.js +22 -1
- package/modules/lifecycle/routes/goals.js +1 -1
- package/modules/lifecycle/routes/task-route-helpers.js +1 -1
- package/modules/lifecycle/routes/task-votes.js +54 -0
- package/modules/lifecycle/routes/task-write-routes.js +1 -1
- package/modules/lifecycle/routes/tasks.js +2 -2
- package/modules/lifecycle/routes/versions.js +2 -2
- package/modules/lifecycle/ship-card.js +4 -4
- package/modules/lifecycle/ship-preflight.js +1 -1
- package/modules/lifecycle/task-classifier.js +1 -1
- package/modules/lifecycle/task-status.js +1 -1
- package/modules/lifecycle/task-visual-db.js +1 -1
- package/modules/memory/learnings.js +1 -1
- package/modules/memory/pollers/search-index.js +2 -2
- package/modules/memory/routes/learnings.js +1 -1
- package/modules/memory/routes/memory.js +1 -1
- package/modules/memory/search.js +2 -2
- package/modules/npm-release/release.js +1 -1
- package/modules/onboarding/howto-moments.js +1 -1
- package/modules/onboarding/newcomer-restock.js +3 -3
- package/modules/onboarding/onboarding.js +1 -1
- package/modules/pixel-art/skills/otb-tile-generate/SKILL.md +1 -1
- package/modules/platform-identity/origin-containment.js +1 -1
- package/modules/platform-identity/publish-gate.js +1 -1
- package/modules/platform-identity/tests/platform-identity.mjs +1 -1
- package/modules/provisioning/capacity.js +1 -1
- package/modules/provisioning/core-upgrade.js +15 -9
- package/modules/provisioning/credential-preflight.js +3 -3
- package/modules/provisioning/disconnect.js +1 -1
- package/modules/provisioning/dns-resolves.js +1 -1
- package/modules/provisioning/module.json +1 -1
- package/modules/provisioning/onboard-plan.js +1 -1
- package/modules/provisioning/paid-shape-gate.js +2 -2
- package/modules/provisioning/planet-physics.js +11 -2
- package/modules/provisioning/pollers/liveness-sweep.js +1 -1
- package/modules/provisioning/pollers/runner-drift-notify.js +5 -5
- package/modules/provisioning/provisioning.js +2 -2
- package/modules/provisioning/render-lookup.js +1 -1
- package/modules/provisioning/render-standup.js +3 -3
- package/modules/provisioning/repo-private.js +1 -1
- package/modules/provisioning/routes/callback-page.js +1 -1
- package/modules/provisioning/routes/core-upgrade.js +23 -3
- package/modules/provisioning/routes/provisioning.js +2 -2
- package/modules/provisioning/routes/render-standup.js +1 -1
- package/modules/provisioning/routes/repo-private.js +1 -1
- package/modules/provisioning/soft-limits.js +1 -1
- package/modules/provisioning/starter-bundles.js +4 -2
- package/modules/provisioning/tests/provisioning.mjs +1 -1
- package/modules/public-landing/public/account.html +4 -6
- package/modules/public-landing/public/assets/cosmos.css +13 -6
- package/modules/public-landing/public/connections.html +4 -6
- package/modules/public-landing/public/contact.html +4 -6
- package/modules/public-landing/public/guild.html +4 -6
- package/modules/public-landing/public/index.html +11 -9
- package/modules/public-landing/public/invitations.html +4 -6
- package/modules/public-landing/public/privacy.html +4 -6
- package/modules/public-landing/public/projects.html +168 -46
- package/modules/public-landing/public/terms.html +4 -6
- package/modules/raise/content/copy.json +40 -0
- package/modules/raise/content/nda.html +39 -0
- package/modules/raise/content/settings.json +49 -0
- package/modules/raise/db.js +95 -0
- package/modules/raise/migrations/raise_001_tables.sql +71 -0
- package/modules/raise/module.json +28 -0
- package/modules/raise/page.js +194 -0
- package/modules/raise/public/edit.js +152 -0
- package/modules/raise/public/favicon.svg +1 -0
- package/modules/raise/public/logo-ink.svg +1 -0
- package/modules/raise/public/logo-night.svg +1 -0
- package/modules/raise/public/mode.js +8 -0
- package/modules/raise/public/raise.css +234 -0
- package/modules/raise/public/raise.js +91 -0
- package/modules/raise/raise.js +174 -0
- package/modules/raise/routes/raise.js +152 -0
- package/modules/raise/views/gate.html +39 -0
- package/modules/raise/views/nda.html +21 -0
- package/modules/raise/views/page.html +133 -0
- package/modules/raise/web.js +72 -0
- package/modules/render-deploy/deploys.js +1 -1
- package/modules/render-deploy/render.js +2 -2
- package/modules/security/secret-scrub.js +3 -3
- package/modules/security/security.js +1 -1
- package/modules/security/tests/artifact_scan.mjs +1 -1
- package/modules/security/tests/mirror.mjs +1 -1
- package/modules/security/tests/scan_store.mjs +1 -1
- package/modules/sessions/db.js +2 -2
- package/modules/sessions/pulse.js +2 -2
- package/modules/sessions/routes/sessions.js +1 -1
- package/modules/specialities/specialities.js +1 -1
- package/modules/status-ui/public/README.md +3 -4
- package/modules/status-ui/public/index.html +5 -31
- package/modules/status-ui/public/status.js +6 -174
- package/modules/status-ui/public/style.css +4 -133
- package/modules/ui-design/docs/design-contract.md +3 -3
- package/modules/ui-design/kit/README.md +1 -1
- package/modules/ui-design/kit/serve.js +13 -4
- package/modules/ui-design/scripts/design-sync.js +1 -1
- package/modules/ui-design/scripts/figma-design-sync.js +1 -1
- package/modules/ui-design/scripts/validate-design.js +1 -1
- package/package-lock.json +27 -11
- package/package.json +2 -3
- package/release-notes.json +186 -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/ask.js +231 -0
- package/scripts/bongos/audit-authorship.sh +324 -0
- package/scripts/bongos/audit-deps.js +189 -0
- package/scripts/bongos/audit-gate.js +121 -0
- package/scripts/bongos/audit-rank-roles.js +131 -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/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 +380 -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/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 +332 -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.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 +338 -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-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 +318 -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-bongos-v1-idea-routing-tasks.js +152 -0
- package/scripts/bongos/seed-bv1-profiles-tasks.js +135 -0
- package/scripts/bongos/seed-bv2-ideator-surface-tasks.js +390 -0
- package/scripts/bongos/seed-staging.sh +117 -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 +291 -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/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/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/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/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.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-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-bongos-v1-idea-routing-tasks.js +6 -152
- package/scripts/gds/seed-bv1-profiles-tasks.js +6 -135
- package/scripts/gds/seed-bv2-ideator-surface-tasks.js +6 -390
- package/scripts/gds/seed-staging.sh +7 -116
- 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/security/dep-audit.js +50 -124
- 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/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_daily_checks.mjs +201 -0
- package/tests/autonomy_digest.mjs +1 -1
- package/tests/autonomy_gate.mjs +1 -1
- package/tests/autonomy_gauge.mjs +2 -2
- package/tests/autonomy_runner_identity.mjs +1 -1
- package/tests/backfill_sessions.mjs +8 -8
- package/tests/backfill_subagent_rewards.mjs +1 -1
- package/tests/backfill_task_rewards.mjs +2 -2
- package/tests/backlog_review.mjs +3 -3
- package/tests/baseline_staleness.mjs +2 -2
- package/tests/bfg.mjs +11 -5
- package/tests/bfg_write.mjs +20 -11
- package/tests/blockers_hall.mjs +14 -4
- package/tests/blockers_page_ui.mjs +56 -12
- package/tests/bongos_dispatch.mjs +5 -5
- package/tests/bongos_login.mjs +2 -2
- package/tests/bug_attachment_audit.mjs +1 -1
- package/tests/bug_attachment_recover.mjs +2 -2
- package/tests/bug_triage.mjs +3 -3
- package/tests/build_info.mjs +1 -1
- package/tests/builder_tester_tag.mjs +184 -0
- package/tests/bump_version.mjs +3 -3
- package/tests/canonical_profile_url.mjs +1 -1
- package/tests/capture_error_format.mjs +1 -1
- package/tests/capture_goal_routing.mjs +2 -2
- package/tests/category_advisory_guard.mjs +3 -3
- package/tests/claim_error_surface.mjs +2 -2
- package/tests/claim_from_task_and_home.mjs +1 -1
- package/tests/claim_gate_open_blocker.mjs +7 -4
- package/tests/claim_gate_rebase.mjs +12 -8
- package/tests/claim_recall.mjs +4 -4
- package/tests/claim_resolve_worktree_lock.mjs +1 -1
- package/tests/claude_materialize.mjs +68 -68
- 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 +1 -19
- 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_working_area.mjs +1 -1
- package/tests/government_agent_asks.mjs +7 -7
- package/tests/government_board_room_copy.mjs +6 -1
- package/tests/government_board_view.mjs +39 -0
- package/tests/government_board_vote_ui.mjs +39 -1
- package/tests/government_config.mjs +2 -2
- package/tests/government_live_proof_shape.mjs +1 -1
- package/tests/government_protected_surfaces.mjs +54 -53
- package/tests/government_require_permission.mjs +9 -1
- package/tests/government_vanilla_boot.mjs +1 -1
- package/tests/government_vocabulary.mjs +2 -2
- package/tests/government_walk.mjs +2 -2
- package/tests/grade_body_limit.mjs +6 -4
- package/tests/grade_correlation_audit.mjs +3 -3
- package/tests/grade_diff_hash.mjs +1 -1
- package/tests/grade_engine_replay.mjs +2 -2
- package/tests/grade_server_authoritative.mjs +1 -1
- package/tests/grade_unavailable_display.mjs +1 -1
- package/tests/grader.mjs +8 -24
- package/tests/grader_generated_provenance.mjs +14 -14
- package/tests/grader_no_artifact.mjs +1 -1
- package/tests/grader_prompt_fencing.mjs +1 -1
- package/tests/grader_quality_window_overflow.mjs +1 -1
- package/tests/grader_reader_lens.mjs +3 -3
- package/tests/grader_regrade_delta.mjs +1 -1
- package/tests/grader_unbacked_score.mjs +2 -2
- package/tests/hall_acclaim_vote_control.mjs +113 -0
- package/tests/hall_asset_cache.mjs +127 -0
- package/tests/hall_audit.mjs +63 -0
- package/tests/hall_board_world.mjs +20 -0
- package/tests/hall_city_card_words.mjs +61 -0
- package/tests/hall_client_request_shape.mjs +5 -1
- package/tests/hall_home_ships_bounded.mjs +160 -0
- package/tests/hall_landing_boot.mjs +15 -2
- package/tests/hall_nav.mjs +33 -0
- package/tests/hall_onboarding_bongos_setup.mjs +1 -1
- package/tests/hall_oversight_world.mjs +44 -4
- package/tests/hall_palette.mjs +12 -9
- package/tests/hall_preview_security.mjs +1 -1
- package/tests/hall_profile_world.mjs +17 -0
- package/tests/hall_reading_world.mjs +16 -1
- package/tests/hall_roster_world.mjs +2 -1
- package/tests/hall_studio_world.mjs +4 -1
- package/tests/hall_work_history_id.mjs +39 -0
- package/tests/held_tweak_reporting.mjs +4 -4
- package/tests/helpers.mjs +3 -3
- package/tests/home_bounded_reads.mjs +1 -1
- package/tests/home_isolation_guard.mjs +1 -1
- package/tests/hook_core_resolve.mjs +7 -7
- package/tests/hook_user_agents.mjs +1 -1
- package/tests/hooks_drain.mjs +2 -2
- package/tests/host_topology_skips.mjs +1 -1
- package/tests/howto_guide.mjs +1 -1
- package/tests/howto_moments.mjs +3 -3
- package/tests/hub_account_page.mjs +1 -1
- package/tests/idea_capture_grades.mjs +2 -2
- package/tests/idea_develop_spark.mjs +1 -1
- package/tests/idea_filed_via.mjs +2 -2
- package/tests/idea_ideate_full.mjs +1 -1
- package/tests/idea_spark_mark.mjs +1 -1
- package/tests/idea_spark_queue.mjs +1 -1
- package/tests/idea_triage.mjs +1 -1
- package/tests/idea_triage_grade.mjs +3 -3
- package/tests/idea_vote_permission.mjs +113 -0
- package/tests/idea_votes_fold_db.mjs +123 -0
- package/tests/infra_exec_paths.mjs +12 -12
- package/tests/init.mjs +2 -2
- package/tests/instance_db_migrated_on_code_move.mjs +5 -5
- package/tests/instance_feedback.mjs +9 -9
- package/tests/instance_mismatch_guard.mjs +2 -2
- package/tests/integration_parked_ratchet.mjs +24 -2
- package/tests/intent_retry.mjs +1 -1
- package/tests/interaction_posture.mjs +3 -3
- package/tests/invite_expiry_db.mjs +1 -1
- package/tests/joinability_invite_only.mjs +1 -1
- package/tests/karma_vote_lists.mjs +270 -0
- package/tests/key-card.mjs +2 -2
- package/tests/key-status.mjs +2 -2
- package/tests/knip_ratchet_ambient.mjs +2 -2
- package/tests/known_failing_ratchet.mjs +1 -1
- package/tests/land_watch.mjs +2 -2
- package/tests/landing_legal_pages.mjs +1 -1
- package/tests/landing_page.mjs +2 -2
- package/tests/leaderboard_roles.mjs +4 -1
- package/tests/leak_scan_allowlist.mjs +8 -8
- package/tests/leak_scan_fail_closed.mjs +1 -1
- package/tests/lib_sh_resolution.mjs +9 -9
- package/tests/lifecycle-card.mjs +7 -7
- package/tests/linkify_check.mjs +2 -2
- package/tests/linkify_refs.mjs +1 -1
- package/tests/llm-cache-route.mjs +1 -1
- package/tests/local_preview.mjs +2 -2
- package/tests/main_audit.mjs +3 -3
- package/tests/main_audit_attestation.mjs +1 -1
- package/tests/main_audit_db_roster.mjs +2 -2
- package/tests/main_worktree_busy_reason.mjs +3 -3
- package/tests/markdown_line_endings.mjs +2 -2
- package/tests/me_streak_leaderboard_queries.mjs +193 -0
- package/tests/membership_kind_lockstep.mjs +1 -1
- package/tests/memory_isolation.mjs +16 -8
- package/tests/memory_map.mjs +2 -2
- package/tests/memory_pull.mjs +33 -25
- package/tests/merge_driver_register.mjs +3 -3
- package/tests/migration_allocation.mjs +2 -2
- package/tests/migration_namespace.mjs +1 -1
- package/tests/migrations_forward_safe.mjs +1 -1
- package/tests/mingle.mjs +1 -1
- package/tests/mirror_lineage_fulltree.mjs +3 -3
- package/tests/mirror_lineage_proof.mjs +2 -2
- package/tests/mirror_redact.mjs +4 -4
- package/tests/missing_dep_classify.mjs +3 -3
- package/tests/module-scope-map.mjs +22 -22
- package/tests/module_api_lazy.mjs +1 -1
- package/tests/module_assess_docs.mjs +2 -2
- package/tests/module_assess_installs.mjs +3 -3
- package/tests/module_assess_price_parity.mjs +5 -5
- package/tests/module_assess_score.mjs +5 -5
- package/tests/module_assess_security.mjs +4 -4
- package/tests/module_assess_tests.mjs +3 -3
- package/tests/module_assessments_migration.mjs +1 -1
- package/tests/module_catalog.mjs +2 -2
- package/tests/module_cli.mjs +3 -3
- package/tests/module_entitlements.mjs +1 -1
- package/tests/module_error_counts.mjs +1 -1
- package/tests/module_install.mjs +4 -4
- package/tests/module_loader.mjs +3 -1
- package/tests/module_owned_tests.mjs +1 -1
- package/tests/module_release_channels.mjs +1 -1
- package/tests/module_store_howto.mjs +3 -3
- package/tests/module_store_listing.mjs +139 -2
- package/tests/module_store_publish.mjs +4 -4
- package/tests/module_store_publish_route.mjs +1 -1
- package/tests/module_store_reassess.mjs +1 -1
- package/tests/module_store_registry_migration.mjs +1 -1
- package/tests/module_test_runner.mjs +3 -3
- package/tests/module_update.mjs +4 -4
- package/tests/module_upgrade_updates.mjs +1 -1
- package/tests/move_escalation.mjs +2 -2
- package/tests/nav_permission_atoms.mjs +3 -2
- package/tests/needs_rebase.mjs +7 -3
- package/tests/newcomer_floor.mjs +1 -1
- package/tests/next_number.mjs +1 -1
- package/tests/no_artifact_escalation.mjs +3 -3
- package/tests/npm_release_where.mjs +1 -1
- package/tests/oauth_secret.mjs +2 -2
- package/tests/onboard.mjs +6 -6
- package/tests/onboarding_gate.mjs +2 -2
- package/tests/opt_in_skill_modules.mjs +3 -3
- package/tests/own_scope_guard.mjs +1 -1
- package/tests/own_session_revoke.mjs +4 -1
- package/tests/package_core.mjs +10 -11
- package/tests/page_inventory.mjs +5 -5
- package/tests/page_reader.mjs +7 -7
- package/tests/page_tweak_hold.mjs +6 -6
- package/tests/parallel-load.mjs +1 -1
- package/tests/paste_token_api_base.mjs +1 -1
- package/tests/paste_token_session_store.mjs +2 -2
- package/tests/pending_invite_purge_db.mjs +1 -1
- package/tests/permission_path.mjs +1 -1
- package/tests/pin_replay.mjs +1 -1
- package/tests/pin_write_key.mjs +7 -7
- package/tests/plain_cards.mjs +15 -15
- package/tests/pr_assign.mjs +1 -1
- package/tests/pre_push_hook.mjs +3 -3
- package/tests/preflight_checks.mjs +2 -2
- package/tests/prelaunch_gate.mjs +1 -1
- package/tests/privacy_matrix.mjs +1 -1
- package/tests/probe_cache.mjs +6 -6
- package/tests/profile_connections_ui.mjs +4 -3
- package/tests/profile_fields.mjs +11 -1
- package/tests/profile_privacy_owner_view.mjs +1 -1
- package/tests/profile_role_headline.mjs +10 -9
- package/tests/project_admin_console_model.mjs +1 -1
- package/tests/projects_hub.mjs +1 -1
- package/tests/projects_hub_cloud_hop.mjs +1 -1
- package/tests/promote_goal_id.mjs +6 -6
- package/tests/promotion_sweep.mjs +1 -1
- package/tests/provision.mjs +24 -24
- package/tests/provision_account_identity.mjs +2 -2
- package/tests/provision_byo_host.mjs +1 -1
- package/tests/provision_caddy_wiring.mjs +2 -2
- package/tests/provision_disconnect.mjs +2 -2
- package/tests/provision_dns_first.mjs +1 -1
- package/tests/provision_render.mjs +9 -9
- package/tests/provision_repo_private.mjs +3 -3
- package/tests/provision_resource_caps.mjs +5 -5
- package/tests/provision_restart.mjs +3 -3
- package/tests/provision_settings_apply.mjs +7 -7
- package/tests/provision_teardown_address.mjs +2 -2
- package/tests/provisioning_capacity.mjs +5 -5
- package/tests/provisioning_credential_preflight.mjs +1 -1
- package/tests/provisioning_disconnect.mjs +1 -1
- package/tests/provisioning_error_note_scope.mjs +4 -4
- package/tests/provisioning_paid_shape_gate.mjs +2 -2
- package/tests/provisioning_planet_physics.mjs +16 -0
- package/tests/provisioning_runner_drift_notice.mjs +2 -2
- package/tests/provisioning_settings_env.mjs +1 -1
- package/tests/pruned_lockfile_integrity.mjs +1 -1
- package/tests/public_mirror_export.mjs +1 -1
- package/tests/publish_integration_gate.mjs +2 -2
- package/tests/publish_manifest.mjs +6 -6
- package/tests/publish_watch.mjs +1 -1
- package/tests/push_path_brief.mjs +2 -2
- package/tests/raise.mjs +248 -0
- package/tests/rank_roles_audit.mjs +1 -1
- package/tests/rank_tier_single_source.mjs +2 -2
- package/tests/rate_limit_public.mjs +1 -1
- package/tests/read_default_meter.mjs +2 -2
- package/tests/read_session_export.mjs +1 -1
- package/tests/rebase_gate_set_aside.mjs +1 -1
- package/tests/recall_cli.mjs +1 -1
- package/tests/recall_corpus_health.mjs +3 -2
- package/tests/recall_hints.mjs +1 -1
- package/tests/recruiter_sliver_boundary.mjs +1 -1
- package/tests/redteam_patrol.mjs +2 -2
- package/tests/regrade_actual_minutes.mjs +2 -2
- package/tests/regrade_eligibility.mjs +2 -2
- package/tests/release_core.mjs +2 -2
- package/tests/release_notes.mjs +4 -4
- package/tests/rename_history_restraint.mjs +3 -3
- package/tests/rename_ledger_prose.mjs +6 -6
- package/tests/render_api.mjs +1 -1
- package/tests/render_check.mjs +4 -4
- package/tests/render_deploy.mjs +1 -1
- package/tests/repo_info_binding.mjs +1 -1
- package/tests/repo_map.mjs +5 -5
- package/tests/reward_mode_cost_plus_only.mjs +7 -3
- package/tests/reward_mode_surfacing.mjs +1 -1
- package/tests/role_responsibilities.mjs +1 -1
- package/tests/route_permission_check.mjs +1 -1
- package/tests/route_shadow_guard.mjs +1 -1
- package/tests/route_validation.mjs +1 -1
- package/tests/routine_capture_kind.mjs +24 -13
- package/tests/routine_schedule.mjs +51 -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/artifact-staleness.js +0 -267
- package/scripts/gds/audit-exports.js +0 -128
- package/scripts/gds/classify-discipline.js +0 -153
- package/scripts/gds/codemod-rename-src-gds.js +0 -145
- package/scripts/gds/coreB-carve-proof.sh +0 -725
- package/scripts/gds/goal-names.js +0 -102
- package/scripts/gds/rename-goals.js +0 -109
- package/scripts/gds/resolve-skill-model.js +0 -57
- package/scripts/gds/security-baseline-check.sh +0 -180
- package/scripts/gds/seed-adopt-tasks.js +0 -75
- package/scripts/gds/seed-api-contract-goal-tasks.js +0 -141
- package/scripts/gds/seed-board-room-tasks.js +0 -196
- package/scripts/gds/seed-bongos-app-tasks.js +0 -294
- package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +0 -81
- package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +0 -100
- package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +0 -307
- package/scripts/gds/seed-bongos-module-system-tasks.js +0 -346
- package/scripts/gds/seed-bongos-tasks.js +0 -214
- package/scripts/gds/seed-bongos-v1-seo-tasks.js +0 -104
- package/scripts/gds/seed-bv1-community-tasks.js +0 -131
- package/scripts/gds/seed-bv1-privacy-invites-tasks.js +0 -133
- package/scripts/gds/seed-bv1-profile-page-tasks.js +0 -161
- package/scripts/gds/seed-bv1-r01-delta-tasks.js +0 -154
- package/scripts/gds/seed-bv2-tweak-mode-tasks.js +0 -277
- package/scripts/gds/seed-gds-v4-tasks.js +0 -624
- package/scripts/gds/seed-governance-tasks.js +0 -340
- package/scripts/gds/seed-medusa-tasks.js +0 -440
- package/scripts/gds/seed-module-upstreaming.js +0 -219
- package/scripts/gds/seed-productization-tasks.js +0 -235
- package/scripts/gds/seed-project-admin-console-tasks.js +0 -88
- package/scripts/gds/seed-provisioning-tasks.js +0 -83
- package/scripts/gds/seed-strict-versioning-tasks.js +0 -275
- package/scripts/gds/seed-v2-world-tasks.js +0 -283
- package/scripts/gds/spike-task-map.js +0 -899
- package/scripts/migrate_cost_ledger.sh +0 -178
- package/scripts/status-probe.mjs +0 -213
- package/src/bongos/uptime-poller.js +0 -93
- package/tests/artifact_staleness.mjs +0 -207
- package/tests/goal_names.mjs +0 -120
- package/tests/government_fold_bench.mjs +0 -50
- package/tests/spike_task_map.mjs +0 -422
- package/tests/status-probe.mjs +0 -89
- /package/{scripts/gds → modules/raise}/CLAUDE.md +0 -0
- /package/scripts/{gds → bongos}/cloudbongos-token-isolation.conf +0 -0
- /package/scripts/{gds → bongos}/discipline-modes.json +0 -0
- /package/scripts/{gds → bongos}/retired-core-skills.json +0 -0
|
@@ -0,0 +1,1226 @@
|
|
|
1
|
+
// Shared helpers for GDS CLI scripts (the things the builder-* slash commands invoke).
|
|
2
|
+
// Renamed from PMS in V3.R01.
|
|
3
|
+
//
|
|
4
|
+
// - Reads / writes the session token at ~/.config/otb/gds-session.json
|
|
5
|
+
// (resolved via os.homedir(), so this works for any user on any machine).
|
|
6
|
+
// The legacy path ~/.config/otb/pms-session.json is still accepted on read,
|
|
7
|
+
// purely so any existing pre-rename session keeps working through the
|
|
8
|
+
// rollout — that's read-only back-compat, not a personalization.
|
|
9
|
+
// - Provides apiCall(method, path, body) with the auth header
|
|
10
|
+
// - Provides format helpers for terminal output (no deps; this isn't a TTY app,
|
|
11
|
+
// it's text the slash command consumes)
|
|
12
|
+
|
|
13
|
+
const fs = require('node:fs');
|
|
14
|
+
const fsp = require('node:fs/promises');
|
|
15
|
+
const path = require('node:path');
|
|
16
|
+
const os = require('node:os');
|
|
17
|
+
const { execSync } = require('node:child_process');
|
|
18
|
+
const ic = require('../../src/instance-config');
|
|
19
|
+
|
|
20
|
+
// Session token filenames, NEWEST FIRST. The WRITE target is the configured
|
|
21
|
+
// instance dir (~/.config/<configDir>/bongos-session.json; OTB → ~/.config/otb,
|
|
22
|
+
// unchanged). On READ we try each name across every config read dir (configured +
|
|
23
|
+
// legacy otb) — so a pre-rename session, or one written by a differently-
|
|
24
|
+
// namespaced instance, still resolves (R61 / task 1200). os.homedir() keeps it
|
|
25
|
+
// per-user on any machine.
|
|
26
|
+
//
|
|
27
|
+
// WHY THE OLD NAMES STAY READABLE. This file is on disk on every builder machine.
|
|
28
|
+
// Renaming it with no fallback signs all of them out at once and every /builder-*
|
|
29
|
+
// command dies with 'no Bongos session'. So a read that resolves through a
|
|
30
|
+
// superseded name MIGRATES forward (see loadSession), and the old file is
|
|
31
|
+
// deliberately LEFT IN PLACE — a builder may roll back to an older CLI, which
|
|
32
|
+
// can only see the old name. Part 4 (task 1003706) deletes it behind a
|
|
33
|
+
// test of its absence. (task 1003704)
|
|
34
|
+
//
|
|
35
|
+
// Order is FILENAME-major, not directory-major: the newest name found in ANY read
|
|
36
|
+
// dir beats an older name in the configured dir. That is the precedence a rename
|
|
37
|
+
// wants, and it is the order the two-name version of this list already used.
|
|
38
|
+
// The list itself lives in instance-config (the lowest module that reads the
|
|
39
|
+
// file, and the only one cli-lib and paste-token.js can both import).
|
|
40
|
+
// Destructured, not read off `ic` as a member: knip cannot trace a namespace-only
|
|
41
|
+
// property access on this module and reports the export dead (the same blind spot
|
|
42
|
+
// task 1003703 closed for two other instance-config exports).
|
|
43
|
+
const { SESSION_FILENAMES } = require('../../src/instance-config');
|
|
44
|
+
const SESSION_PATH = ic.configPath(SESSION_FILENAMES[0]);
|
|
45
|
+
const SESSION_READ_PATHS = SESSION_FILENAMES.flatMap((n) => ic.configReadPaths(n));
|
|
46
|
+
// The API base every CLI call targets, resolved ONCE through the single source of
|
|
47
|
+
// truth in instance-config: <PREFIX>_API_BASE (then legacy GDS_/OTB_/PMS_) → the
|
|
48
|
+
// persisted session's api_base → THIS instance's publicOrigin from the branding
|
|
49
|
+
// pack. Override for local dev / staging:
|
|
50
|
+
// CLOUDBONGOS_API_BASE=http://localhost:3000 node scripts/bongos/start.js
|
|
51
|
+
// No CLI script hard-codes another instance's URL (task 1002201; pre-ADR-0139 the
|
|
52
|
+
// founder instance's apex was baked in literally at four sites here). The session
|
|
53
|
+
// leg was added at task 1002427 — this const previously stopped at the branding
|
|
54
|
+
// default, so module-level consumers (reauth's Settings URL, the hall links
|
|
55
|
+
// hallBase() prints) named the checkout's own instance instead of the one the
|
|
56
|
+
// builder is signed into.
|
|
57
|
+
const API_BASE = ic.resolveApiBase();
|
|
58
|
+
|
|
59
|
+
// User-Agent for the GDS CLI's HTTP calls — the branding-derived neutral platform UA
|
|
60
|
+
// from the single source, src/branding.js userAgent() (`<repo.name|envPrefix>-gds/1.0`,
|
|
61
|
+
// neutral fallback `cloud-bongos-gds/1.0`), matching the `cloud-bongos-` convention the
|
|
62
|
+
// hooks use (tests/hook_user_agents.mjs). Was a hardcoded '<founder-instance>-gds-cli/1.0'
|
|
63
|
+
// at both fetch sites — task 1002234. Resolved once so apiCall + cliClient never diverge
|
|
64
|
+
// and branding is read a single time; falls back neutrally if branding is unreadable.
|
|
65
|
+
const CLI_USER_AGENT = (() => {
|
|
66
|
+
try { return require('../../src/branding').userAgent(); }
|
|
67
|
+
catch (_) { return 'cloud-bongos-gds/1.0'; }
|
|
68
|
+
})();
|
|
69
|
+
|
|
70
|
+
// productName() — the instance's product name for user-facing CLI copy, from the
|
|
71
|
+
// branding pack (task 1002428). Was hardcoded as the founder brand at several
|
|
72
|
+
// print sites, so a non-OTB instance told ITS builders about someone else's
|
|
73
|
+
// product. Neutral fallback, never a foreign brand.
|
|
74
|
+
function productName() {
|
|
75
|
+
try {
|
|
76
|
+
const id = require('../../src/branding').branding().identity || {};
|
|
77
|
+
if (id.productName) return id.productName;
|
|
78
|
+
} catch (_) { /* fall through */ }
|
|
79
|
+
return 'Cloud Bongos';
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// rewardPolicy() — the instance's RESOLVED reward policy (ADR 0146), for CLI copy
|
|
83
|
+
// that prints a task's `credits_reward`. On a `cost-plus-only` instance that
|
|
84
|
+
// number is an advertised GUIDE and is never paid; the cost-plus session reward
|
|
85
|
+
// is the sole stream. Printing it bare reads as a promise, and a builder who
|
|
86
|
+
// then ships and sees `+0` reasonably concludes the payout broke (it cost a real
|
|
87
|
+
// session on 2026-07-26 — task 1002469).
|
|
88
|
+
//
|
|
89
|
+
// PREFER THE SERVER'S ANSWER. The mode is INSTANCE config, and an instance's
|
|
90
|
+
// config/branding.json is NOT in the builder's checkout — a laptop resolving
|
|
91
|
+
// locally sees only config/branding.neutral.json and would report the paying
|
|
92
|
+
// default on the very instance that withholds. So callers pass the `reward`
|
|
93
|
+
// block the server sends (GET /me, POST /claims); the local read is a fallback
|
|
94
|
+
// for an older server that doesn't send one, and the ADR default is the floor.
|
|
95
|
+
// Resolution itself is always economy's (ADR 0146) — never re-derived here.
|
|
96
|
+
function rewardPolicy(fromServer) {
|
|
97
|
+
if (fromServer && typeof fromServer.mode === 'string') {
|
|
98
|
+
return { mode: fromServer.mode, perTaskCredit: fromServer.perTaskCredit !== false };
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
// economy's PURE resolver + our own branding read, NOT ./credits (task
|
|
102
|
+
// 1003676): credits.js imports { pool, branding } from src/module-api at
|
|
103
|
+
// module scope, so this one fallback require used to drag Postgres + auth +
|
|
104
|
+
// db-kernel into EVERY CLI subcommand's closure — which is what stopped the
|
|
105
|
+
// CLI shipping as a public, client-only package. Same resolver, same answer,
|
|
106
|
+
// no server. The CLI is not a module, so reading src/branding directly here
|
|
107
|
+
// is allowed where it would not be inside modules/ (ADR 0083).
|
|
108
|
+
const { rewardPolicy: resolve } = require('../../modules/economy/reward-policy');
|
|
109
|
+
let raw = {};
|
|
110
|
+
try { raw = (require('../../src/branding').branding().reward) || {}; } catch (_) { raw = {}; }
|
|
111
|
+
const p = resolve(raw);
|
|
112
|
+
if (p && typeof p.mode === 'string') return p;
|
|
113
|
+
} catch (_) { /* fall through */ }
|
|
114
|
+
return { mode: 'cost-plus-and-estimate', perTaskCredit: true };
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// The one-line builder-facing explanation shown wherever an estimate is
|
|
118
|
+
// displayed on a cost-plus-only instance. Returns null on a paying instance so
|
|
119
|
+
// every call site is a no-op there. Single source for the wording so claim /
|
|
120
|
+
// start / ship say the SAME thing (task 1002469).
|
|
121
|
+
function costPlusOnlyNote(fromServer) {
|
|
122
|
+
if (rewardPolicy(fromServer).perTaskCredit) return null;
|
|
123
|
+
return 'This instance pays cost-plus only: you earn real session cost + 20%, not the estimate above.';
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// hallBase(base) — the instance's builders' hall root for a given API base, e.g.
|
|
127
|
+
// https://cloudbongos.com/builders. Derived from the RESOLVED base (env → session →
|
|
128
|
+
// branding default), never a hardcoded host — so a CLI-printed link always points at
|
|
129
|
+
// the instance the command is actually talking to, not the founder instance's box
|
|
130
|
+
// (task 1002233; the printed-link twin of the task-1002201 default-base fix). Falls
|
|
131
|
+
// back to `${base}/builders` when base isn't a parseable absolute URL.
|
|
132
|
+
function hallBase(base = API_BASE) {
|
|
133
|
+
try { return `${new URL(base).origin}/builders`; }
|
|
134
|
+
catch { return `${String(base || '').replace(/\/+$/, '')}/builders`; }
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Node-24-on-Windows workaround: every CLI invocation here is a short-lived
|
|
138
|
+
// process that makes one or a handful of requests, but a kept-alive socket can
|
|
139
|
+
// still be mid-close when the caller's process.exit() runs, tripping a
|
|
140
|
+
// UV_HANDLE_CLOSING assertion that corrupts piped JSON stdout. Connection reuse
|
|
141
|
+
// buys these one-shot processes nothing, so route requests through a dispatcher
|
|
142
|
+
// with keep-alive effectively disabled. Degrades to the default dispatcher if
|
|
143
|
+
// undici can't be required.
|
|
144
|
+
//
|
|
145
|
+
// task 1002734 — THIS ALONE IS NOT ENOUGH, and the measurements say so: with the
|
|
146
|
+
// dispatcher wired in and undici resolving fine, `node scripts/bongos/api.js GET
|
|
147
|
+
// /tasks/<id>` still aborted 5/5 on Windows 11 / Node 24. The dispatcher removes
|
|
148
|
+
// one contributing handle; the actual trigger is calling process.exit() at all
|
|
149
|
+
// while the request machinery is still tearing down. A minimal synthetic
|
|
150
|
+
// fetch-then-exit does NOT reproduce, so it takes the real stack (the dynamic ESM
|
|
151
|
+
// client import + the Agent + any child spawn / consumed stdin) to line up — which
|
|
152
|
+
// is exactly why hunting the single guilty handle is a dead end.
|
|
153
|
+
//
|
|
154
|
+
// The rule for every CLI here: after a request, DO NOT call process.exit().
|
|
155
|
+
// Set process.exitCode and return, and let the loop drain — see cliExit below.
|
|
156
|
+
// Verified: the pre-push gate went 8/8 aborting to 0/8 on that change alone
|
|
157
|
+
// (task 1002725), and api.js 5/5 to 0/5 (this task).
|
|
158
|
+
let _noKeepAliveDispatcher;
|
|
159
|
+
let _noKeepAliveTried = false;
|
|
160
|
+
function noKeepAliveDispatcher() {
|
|
161
|
+
if (_noKeepAliveTried) return _noKeepAliveDispatcher;
|
|
162
|
+
_noKeepAliveTried = true;
|
|
163
|
+
try {
|
|
164
|
+
const { Agent } = require('undici');
|
|
165
|
+
_noKeepAliveDispatcher = new Agent({ keepAliveTimeout: 1, keepAliveMaxTimeout: 1 });
|
|
166
|
+
} catch { _noKeepAliveDispatcher = undefined; }
|
|
167
|
+
return _noKeepAliveDispatcher;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// task 1002670 — the vendored Agent above is only valid as a `dispatcher` for
|
|
171
|
+
// Node's built-in fetch when the two undici copies speak the same internal
|
|
172
|
+
// handler protocol. Node 26 bundles undici 8 while package.json overrides pin
|
|
173
|
+
// the vendored copy at ^6, so built-in fetch rejects the v6 Agent with
|
|
174
|
+
// InvalidArgumentError('invalid onError method') / UND_ERR_INVALID_ARG *before
|
|
175
|
+
// any network I/O* — and every CLI then misreported a pure client-side bug as
|
|
176
|
+
// "this instance isn't reachable yet". The pairing can't be predicted from
|
|
177
|
+
// version numbers alone (a v6 Agent works fine under Node 24's undici 7), so
|
|
178
|
+
// the selection is empirical: try the vendored Agent, and on the first
|
|
179
|
+
// incompat rejection drop it for the rest of the process and retry the request
|
|
180
|
+
// once on the default dispatcher.
|
|
181
|
+
function isDispatcherIncompatError(err) {
|
|
182
|
+
const seen = new Set();
|
|
183
|
+
for (let e = err; e && typeof e === 'object' && !seen.has(e); e = e.cause) {
|
|
184
|
+
seen.add(e);
|
|
185
|
+
if (e.code === 'UND_ERR_INVALID_ARG' || e.name === 'InvalidArgumentError') return true;
|
|
186
|
+
}
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Test-only: reset the tried-once singleton so tests/cli_dispatcher.mjs can
|
|
191
|
+
// exercise the selection/fallback from a clean slate regardless of what earlier
|
|
192
|
+
// (real) requests did to it on this Node version.
|
|
193
|
+
function _noKeepAliveResetForTest() {
|
|
194
|
+
_noKeepAliveDispatcher = undefined;
|
|
195
|
+
_noKeepAliveTried = false;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
async function dispatchedFetch(url, init = {}, fetchImpl = fetch) {
|
|
199
|
+
const injected = init.dispatcher !== undefined && init.dispatcher === _noKeepAliveDispatcher;
|
|
200
|
+
try {
|
|
201
|
+
return await fetchImpl(url, init);
|
|
202
|
+
} catch (err) {
|
|
203
|
+
if (!injected || !isDispatcherIncompatError(err)) throw err;
|
|
204
|
+
// The vendored Agent is incompatible with this Node's built-in fetch.
|
|
205
|
+
// Stop offering it process-wide, then retry on the default dispatcher.
|
|
206
|
+
_noKeepAliveDispatcher = undefined;
|
|
207
|
+
const retry = { ...init };
|
|
208
|
+
delete retry.dispatcher;
|
|
209
|
+
return fetchImpl(url, retry);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// cliExit(code) — the post-request replacement for process.exit(code). Records the
|
|
214
|
+
// exit status and lets node exit naturally once the loop drains, which is what
|
|
215
|
+
// keeps the UV_HANDLE_CLOSING abort above from firing. Callers must `return` after
|
|
216
|
+
// calling it: unlike process.exit() it does NOT stop execution.
|
|
217
|
+
//
|
|
218
|
+
// Gotcha (learned in task 1002725): a hard exit MASKS leaked timers/handles. Once a
|
|
219
|
+
// CLI exits naturally, anything still armed — an uncleared setTimeout, an open
|
|
220
|
+
// interval — keeps the process alive. Clear them, or the CLI hangs instead of
|
|
221
|
+
// crashing.
|
|
222
|
+
function cliExit(code = 0) {
|
|
223
|
+
process.exitCode = code;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
async function readSessionFile(p) {
|
|
227
|
+
try {
|
|
228
|
+
const raw = await fsp.readFile(p, 'utf8');
|
|
229
|
+
return JSON.parse(raw);
|
|
230
|
+
} catch (err) {
|
|
231
|
+
if (err.code === 'ENOENT') return null;
|
|
232
|
+
throw err;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Copy a session that resolved through a SUPERSEDED path forward to SESSION_PATH,
|
|
237
|
+
// so the next command reads the new name directly instead of walking the fallback
|
|
238
|
+
// list forever. The old file is left in place on purpose (see SESSION_FILENAMES).
|
|
239
|
+
//
|
|
240
|
+
// BEST-EFFORT BY DESIGN: a read-only home, a full disk, or a permissions problem
|
|
241
|
+
// must never turn a working loadSession() into a failing command. The caller
|
|
242
|
+
// already holds a valid session; failing to write the copy changes nothing about
|
|
243
|
+
// this invocation. So every error is swallowed and the session is still returned.
|
|
244
|
+
async function migrateSessionFile(session) {
|
|
245
|
+
try {
|
|
246
|
+
await fsp.mkdir(path.dirname(SESSION_PATH), { recursive: true });
|
|
247
|
+
await fsp.writeFile(SESSION_PATH, JSON.stringify(session, null, 2), { mode: 0o600 });
|
|
248
|
+
return true;
|
|
249
|
+
} catch (_) {
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
async function loadSession() {
|
|
255
|
+
// Try each read path in priority order (configured dir's bongos-session.json,
|
|
256
|
+
// legacy otb dir, then each superseded filename across the same dirs). A hit on
|
|
257
|
+
// anything OTHER than SESSION_PATH is migrated forward — SESSION_READ_PATHS[0]
|
|
258
|
+
// IS SESSION_PATH (configReadDirs puts the configured dir first), so the common
|
|
259
|
+
// case writes nothing.
|
|
260
|
+
for (const p of SESSION_READ_PATHS) {
|
|
261
|
+
const s = await readSessionFile(p);
|
|
262
|
+
if (s) {
|
|
263
|
+
if (p !== SESSION_PATH) await migrateSessionFile(s);
|
|
264
|
+
return s;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// ---- the shared session store (task 1003741, ADR 0269) ---------------------
|
|
271
|
+
// ONE FILE PER INSTANCE, at a FIXED anchor — deliberately NOT configHome().
|
|
272
|
+
//
|
|
273
|
+
// WHY A FIXED ANCHOR. configHome() is brand-derived, and the brand is read out of whatever checkout
|
|
274
|
+
// the process is standing in. That gave the CLI exactly one session slot, and the slot MOVED: run
|
|
275
|
+
// standalone (the then-public @cloudbongos/cli's whole situation; ADR 0324 retired it) the brand
|
|
276
|
+
// cannot resolve, so every
|
|
277
|
+
// instance shared one gds-session.json and signing into a second DESTROYED the first; run from
|
|
278
|
+
// inside an instance repo and the session landed in ~/.config/<slug>/ where the standalone CLI
|
|
279
|
+
// could never find it. The owner's own config dir carries a hand-made `hermeslines-clobber` backup
|
|
280
|
+
// from the first mode.
|
|
281
|
+
//
|
|
282
|
+
// WHY HERE AND NOT instance-config.js. That module is generic config-path machinery shared with the
|
|
283
|
+
// server; a CLI session store is not its concern, and cli-lib already owns SESSION_PATH and
|
|
284
|
+
// SESSION_READ_PATHS. Keeping the two together means one file describes where a session lives.
|
|
285
|
+
function sessionStoreDir() {
|
|
286
|
+
// Directory name deliberately NOT 'sessions': that is a live module key, and ADR 0083
|
|
287
|
+
// §Decision #4 forbids naming one in shared machinery. 'instances' is the truer name anyway —
|
|
288
|
+
// one file per instance is exactly what this holds.
|
|
289
|
+
return path.join(os.homedir(), '.config', ic.FALLBACK_DIR, 'instances');
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// The store's filename for an instance, derived from its api_base host. Returns null when the base
|
|
293
|
+
// names no host — an unkeyable session is simply not stored, never stored under a guessed name.
|
|
294
|
+
function sessionHostKey(apiBase) {
|
|
295
|
+
const raw = String(apiBase || '').trim();
|
|
296
|
+
if (!raw) return null;
|
|
297
|
+
let host = null;
|
|
298
|
+
try { host = new URL(raw).host; } catch (_) { host = null; }
|
|
299
|
+
if (!host) return null;
|
|
300
|
+
// Filename-safe, and collision-free for real hosts: ':' (a port) is the only character a valid
|
|
301
|
+
// host adds beyond the safe set, and it maps to '_' which cannot otherwise appear in one.
|
|
302
|
+
const safe = host.replace(/[^A-Za-z0-9._-]/g, '_');
|
|
303
|
+
return safe && safe !== '.' && safe !== '..' ? safe : null;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function sessionStorePath(apiBase) {
|
|
307
|
+
const key = sessionHostKey(apiBase);
|
|
308
|
+
return key ? path.join(sessionStoreDir(), `${key}.json`) : null;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// Write one session into the shared, host-keyed store. No-op when the session names no host —
|
|
312
|
+
// an unkeyable session is skipped, never filed under a guessed name.
|
|
313
|
+
async function writeSessionToStore(session) {
|
|
314
|
+
const target = session && sessionStorePath(session.api_base);
|
|
315
|
+
if (!target) return null;
|
|
316
|
+
await fsp.mkdir(path.dirname(target), { recursive: true });
|
|
317
|
+
await fsp.chmod(path.dirname(target), 0o700).catch(() => {});
|
|
318
|
+
await fsp.writeFile(target, JSON.stringify(session, null, 2), { mode: 0o600 });
|
|
319
|
+
return target;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// Every instance's session is kept, not just the last one (task 1003741).
|
|
323
|
+
//
|
|
324
|
+
// This used to write ONE file, so `bongos login <another-instance>` silently DESTROYED the session
|
|
325
|
+
// you already had — the owner's own config dir carries a hand-made `hermeslines-clobber` backup
|
|
326
|
+
// from exactly that. Three steps now, and the order matters:
|
|
327
|
+
//
|
|
328
|
+
// 1. archive the OUTGOING session first. That is what rescues a session written before the store
|
|
329
|
+
// existed: it was never in the store, so without this step the very first login after
|
|
330
|
+
// upgrading would still lose it.
|
|
331
|
+
// 2. store the incoming one under its own host.
|
|
332
|
+
// 3. write the ACTIVE pointer exactly where it has always gone, so every existing reader —
|
|
333
|
+
// in-repo skills and hooks — behaves identically.
|
|
334
|
+
async function saveSession(session) {
|
|
335
|
+
const dir = path.dirname(SESSION_PATH);
|
|
336
|
+
await fsp.mkdir(dir, { recursive: true });
|
|
337
|
+
|
|
338
|
+
try {
|
|
339
|
+
const prev = await loadSession();
|
|
340
|
+
const prevKey = prev && prev.token ? sessionHostKey(prev.api_base) : null;
|
|
341
|
+
const nextKey = sessionHostKey(session && session.api_base);
|
|
342
|
+
if (prevKey && prevKey !== nextKey) await writeSessionToStore(prev);
|
|
343
|
+
} catch (_) {
|
|
344
|
+
// Archiving is best-effort — a lost previous session must never block a real sign-in.
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
await writeSessionToStore(session).catch(() => null);
|
|
348
|
+
await fsp.writeFile(SESSION_PATH, JSON.stringify(session, null, 2), { mode: 0o600 });
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// The stored session for one instance, or null. Used by `bongos login` to switch back to an
|
|
352
|
+
// instance you are already signed into without a fresh device flow.
|
|
353
|
+
async function loadStoredSession(apiBase) {
|
|
354
|
+
const target = sessionStorePath(apiBase);
|
|
355
|
+
if (!target) return null;
|
|
356
|
+
return readSessionFile(target);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Every instance this machine has a stored session for — so the CLI can say which one it is
|
|
360
|
+
// targeting and what else it remembers. Sorted for a stable listing; never throws.
|
|
361
|
+
function listStoredSessions() {
|
|
362
|
+
let names = [];
|
|
363
|
+
try { names = fs.readdirSync(sessionStoreDir()); } catch (_) { return []; }
|
|
364
|
+
const out = [];
|
|
365
|
+
for (const name of names) {
|
|
366
|
+
if (!name.endsWith('.json')) continue;
|
|
367
|
+
try {
|
|
368
|
+
const j = JSON.parse(fs.readFileSync(path.join(sessionStoreDir(), name), 'utf8'));
|
|
369
|
+
if (j && j.token) {
|
|
370
|
+
out.push({
|
|
371
|
+
host: name.slice(0, -5),
|
|
372
|
+
api_base: j.api_base || null,
|
|
373
|
+
login: (j.builder && j.builder.github_login) || null,
|
|
374
|
+
instance: (j.instance && j.instance.name) || null,
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
} catch (_) { /* a corrupt entry is skipped, never fatal */ }
|
|
378
|
+
}
|
|
379
|
+
return out.sort((a, b) => a.host.localeCompare(b.host));
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
function loadSessionSync() {
|
|
383
|
+
for (const p of SESSION_READ_PATHS) {
|
|
384
|
+
if (!fs.existsSync(p)) continue;
|
|
385
|
+
try {
|
|
386
|
+
return JSON.parse(fs.readFileSync(p, 'utf8'));
|
|
387
|
+
} catch (_) {
|
|
388
|
+
/* try next */
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
return null;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// ---- argv helpers (C11) ---------------------------------------------------
|
|
395
|
+
// One home for the flag parsing every GDS CLI rolled by hand. Two contracts:
|
|
396
|
+
// arg(name) → the flag's VALUE ('--out x' or '--out=x'), else null
|
|
397
|
+
// hasFlag(name) → boolean presence ('--json', '--no-write')
|
|
398
|
+
// Both default `args` to process.argv.slice(2). arg() accepts BOTH the space and
|
|
399
|
+
// `=` forms (the superset — space-only callers gain `=` for free, harmlessly).
|
|
400
|
+
// A presence flag wants hasFlag(), NOT arg() — they are opposite contracts
|
|
401
|
+
// (repo-metrics.js learned this the hard way; do not collapse the two).
|
|
402
|
+
function arg(name, args = process.argv.slice(2)) {
|
|
403
|
+
const eq = args.find((a) => a.startsWith(`${name}=`));
|
|
404
|
+
if (eq != null) return eq.slice(name.length + 1);
|
|
405
|
+
const i = args.indexOf(name);
|
|
406
|
+
return i >= 0 ? args[i + 1] : null;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
function hasFlag(name, args = process.argv.slice(2)) {
|
|
410
|
+
return args.includes(name);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// stripBom(s) — remove a leading UTF-8 BOM (U+FEFF), the artifact PowerShell's
|
|
414
|
+
// `Out-File`/`>` redirection writes. JSON.parse does not strip it, so a
|
|
415
|
+
// --body-file written from PS 5.1 fails to parse unless this runs first.
|
|
416
|
+
// Non-string input passes through unchanged. Extracted (rather than left
|
|
417
|
+
// inline in api.js) so it's unit-testable — api.js itself has no exports.
|
|
418
|
+
function stripBom(s) {
|
|
419
|
+
if (typeof s !== 'string') return s;
|
|
420
|
+
return s.charCodeAt(0) === 0xfeff ? s.slice(1) : s;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// argText(name, args, io) — resolve prose passed EITHER inline (`--notes "..."`)
|
|
424
|
+
// or from a file (`--notes-file path`, or `-` for stdin). Returns
|
|
425
|
+
// { value, source, error }: `value` is a string ('' when neither flag is
|
|
426
|
+
// present), `source` is 'inline' | 'file' | 'stdin' | 'none', and `error` is a
|
|
427
|
+
// caller-printable string when the request was refused or unreadable.
|
|
428
|
+
//
|
|
429
|
+
// WHY THIS EXISTS (learning 1000197). Prose handed to a CLI inline goes through
|
|
430
|
+
// the SHELL first. A handoff note containing backticks — which technical prose
|
|
431
|
+
// constantly does — is command-substituted by bash before node ever runs: the
|
|
432
|
+
// backticked span executes, its output replaces it, and the rest of the argument
|
|
433
|
+
// list is truncated. That is not a theoretical hazard; it silently shipped a task
|
|
434
|
+
// with EMPTY notes and no summary, so the ledger recorded nothing about a session
|
|
435
|
+
// that had happened. A file argument is the only form the shell cannot rewrite.
|
|
436
|
+
//
|
|
437
|
+
// BOTH-GIVEN IS AN ERROR, never a silent precedence. Picking one would mean the
|
|
438
|
+
// caller's other input vanished without a word — the same class of quiet loss
|
|
439
|
+
// this helper exists to end (the capture.js --spark/--full refusal precedent).
|
|
440
|
+
function argText(name, args = process.argv.slice(2), io = {}) {
|
|
441
|
+
const readFile = io.readFile || ((f) => require('fs').readFileSync(f, 'utf8'));
|
|
442
|
+
const readStdin = io.readStdin || (() => require('fs').readFileSync(0, 'utf8'));
|
|
443
|
+
const fileFlag = `${name}-file`;
|
|
444
|
+
const inline = arg(name, args);
|
|
445
|
+
// arg() returns undefined (not null) for a flag present as the LAST token, so
|
|
446
|
+
// presence must be tested separately — otherwise `--notes-file` with no path
|
|
447
|
+
// slips past the null check and resolves to an empty string, which is the very
|
|
448
|
+
// silent-empty outcome this helper exists to prevent.
|
|
449
|
+
const filePresent = args.includes(fileFlag) || args.some((a) => a.startsWith(`${fileFlag}=`));
|
|
450
|
+
const file = filePresent ? arg(fileFlag, args) : null;
|
|
451
|
+
|
|
452
|
+
if (inline != null && filePresent) {
|
|
453
|
+
return {
|
|
454
|
+
value: '', source: 'none',
|
|
455
|
+
error: `${name} and ${fileFlag} were both given. Pass one — ${fileFlag} is the safe form for prose `
|
|
456
|
+
+ '(a shell rewrites backticks in an inline value before node sees it). Refusing rather than '
|
|
457
|
+
+ 'silently picking one, so nothing you wrote is dropped without a word.',
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
if (filePresent) {
|
|
461
|
+
if (file == null || file === '' || file.startsWith('--')) {
|
|
462
|
+
return { value: '', source: 'none', error: `${fileFlag} needs a path (or - for stdin).` };
|
|
463
|
+
}
|
|
464
|
+
try {
|
|
465
|
+
const raw = file === '-' ? readStdin() : readFile(file);
|
|
466
|
+
return { value: stripBom(String(raw)), source: file === '-' ? 'stdin' : 'file', error: null };
|
|
467
|
+
} catch (err) {
|
|
468
|
+
return { value: '', source: 'none', error: `could not read ${fileFlag} ${file}: ${err.message}` };
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
if (inline != null) return { value: inline, source: 'inline', error: null };
|
|
472
|
+
return { value: '', source: 'none', error: null };
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
// resolveQuiet(args, env) — true when api.js's stderr status banner should be
|
|
476
|
+
// suppressed: the --quiet flag or the GDS_QUIET env var. Both default to the
|
|
477
|
+
// live process, matching hasFlag()'s own default-args contract. Default OFF —
|
|
478
|
+
// existing pipelines that scrape the banner off stderr are unaffected.
|
|
479
|
+
function resolveQuiet(args = process.argv.slice(2), env = process.env) {
|
|
480
|
+
return hasFlag('--quiet', args) || !!env.GDS_QUIET;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// readSessionToken() — the { token, apiBase } a token-only raw fetch needs, read
|
|
484
|
+
// synchronously from the session file. apiBase resolves the one way every base
|
|
485
|
+
// resolution does — <PREFIX>_API_BASE (incl. legacy GDS_/PMS_) || session.api_base
|
|
486
|
+
// || the branding default — via ic.resolveApiBase, passing the session we already
|
|
487
|
+
// loaded so it needs no second disk read (task 1002427). Returns null when not
|
|
488
|
+
// signed in. Callers that must FAIL OPEN (e.g. the sound player) use this + their
|
|
489
|
+
// own fetch rather than apiCall (which exits on 401).
|
|
490
|
+
function readSessionToken() {
|
|
491
|
+
const j = loadSessionSync();
|
|
492
|
+
if (!j || !j.token) return null;
|
|
493
|
+
return {
|
|
494
|
+
token: j.token,
|
|
495
|
+
apiBase: ic.resolveApiBase({ session: j }),
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
// Track whether we've already surfaced an auth-broken message this process so
|
|
500
|
+
// repeated calls (e.g. a script that fires several apiCalls in a row) only
|
|
501
|
+
// print the helpful guidance once before exiting.
|
|
502
|
+
let _unauthExitInFlight = false;
|
|
503
|
+
|
|
504
|
+
function printUnauthGuidanceAndExit() {
|
|
505
|
+
// Stable, single-screen guidance. Builders should see exactly this when
|
|
506
|
+
// their CLI session breaks — no raw API JSON, no stack trace.
|
|
507
|
+
console.error('');
|
|
508
|
+
console.error('✖ Your Bongos CLI session is no longer valid.');
|
|
509
|
+
console.error('');
|
|
510
|
+
if (isTerminalSurface()) {
|
|
511
|
+
// No checkout here, so `node scripts/bongos/*.js` is not a path this reader has (task 1003730).
|
|
512
|
+
console.error(` Recover the fast (UI-first) way — run ${surfaceAction('reauth')}`);
|
|
513
|
+
console.error(' (opens your Settings page; under "CLI Access" click "Re-issue CLI');
|
|
514
|
+
console.error(' token", copy the one-liner, paste it back — no terminal Device Flow.)');
|
|
515
|
+
console.error(' Fallback (browser sign-in): npx bongos login <instance-url>');
|
|
516
|
+
} else {
|
|
517
|
+
console.error(' Recover the fast (UI-first) way — run /builder-reauth, or:');
|
|
518
|
+
console.error(' node scripts/bongos/reauth.js');
|
|
519
|
+
console.error(' (opens your Settings page; under "CLI Access" click "Re-issue CLI');
|
|
520
|
+
console.error(' token", copy the one-liner, paste it back — no terminal Device Flow.)');
|
|
521
|
+
console.error(' Fallback (terminal Device Flow): node scripts/bongos/setup.js --force');
|
|
522
|
+
}
|
|
523
|
+
console.error('');
|
|
524
|
+
console.error(' Possible causes:');
|
|
525
|
+
console.error(' - Your token was revoked — by you ("Sign out everywhere") or by an Archon');
|
|
526
|
+
console.error(' - A recent deploy applied an auth-changing migration (see deploy banner)');
|
|
527
|
+
console.error(' - This instance is older than ADR 0294 and still expires idle CLI sessions');
|
|
528
|
+
console.error('');
|
|
529
|
+
console.error(' Once re-authed, re-run whichever command you were trying.');
|
|
530
|
+
// `doctor` is checkout-only — it is not one of the public CLI's verbs (ADR 0258).
|
|
531
|
+
if (!isTerminalSurface()) console.error(' For a full diagnosis, run: node scripts/bongos/doctor.js');
|
|
532
|
+
for (const line of plainCardLines('session_invalid')) console.error(line);
|
|
533
|
+
console.error('');
|
|
534
|
+
process.exit(2);
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
// ---- fail-closed instance guard (task 2102) --------------------------------
|
|
539
|
+
// A half-configured instance folder used to fail THROUGH: with no local session
|
|
540
|
+
// for ITS OWN origin, the CLI fell back to whatever instance the machine last
|
|
541
|
+
// signed into (session.api_base, else the prod default) and acted THERE. On
|
|
542
|
+
// 2026-07-08 a fresh `demo` clone (config/branding → demo.cloudbongos.com), with
|
|
543
|
+
// no demo session on the machine, borrowed the founder instance's session
|
|
544
|
+
// and offered to write a task into the wrong LIVE backlog. A wrong-instance write
|
|
545
|
+
// is a data-integrity hazard, so we fail CLOSED: if the session we'd authenticate
|
|
546
|
+
// with belongs to a different instance than THIS repo is configured for, refuse
|
|
547
|
+
// and point at the fix. (Inert for a correctly-signed-in instance — OTB's session
|
|
548
|
+
// api_base and branding publicOrigin share a host, so this never fires there.)
|
|
549
|
+
|
|
550
|
+
function safeBranding() {
|
|
551
|
+
try { return require('../../src/branding').branding() || {}; }
|
|
552
|
+
catch { return {}; }
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
// True when THIS checkout declares an instance identity — i.e. config/branding.json
|
|
556
|
+
// exists. A NEUTRAL checkout (the portable core, or a fresh template carrying only
|
|
557
|
+
// branding.neutral.json) returns false: its resolved publicOrigin is just the neutral
|
|
558
|
+
// placeholder, not a real declared instance, so there is nothing to enforce a session
|
|
559
|
+
// against. Injectable so the pure guard stays unit-testable. (task 1002399, area 2)
|
|
560
|
+
function defaultHasInstanceConfig() {
|
|
561
|
+
try {
|
|
562
|
+
const { INSTANCE_PATH } = require('../../src/branding');
|
|
563
|
+
return !!(INSTANCE_PATH && fs.existsSync(INSTANCE_PATH));
|
|
564
|
+
} catch { return false; }
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
// Host of an origin string, or null if unparseable. Comparing HOSTS (not full
|
|
568
|
+
// origins) tolerates scheme / trailing-slash noise between branding + session.
|
|
569
|
+
function instanceOriginHost(origin) {
|
|
570
|
+
try { return new URL(String(origin)).host || null; }
|
|
571
|
+
catch { return null; }
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// PURE + exported for tests. Decide whether the session we'd use targets a
|
|
575
|
+
// DIFFERENT instance than this repo is configured for. Fails OPEN (no mismatch)
|
|
576
|
+
// when: an explicit <PREFIX>_API_BASE override is set (dev/staging — the operator
|
|
577
|
+
// is deliberately steering the base); OR there is no session (nothing to borrow —
|
|
578
|
+
// the no-session/401 path handles that); OR this checkout is NEUTRAL (no
|
|
579
|
+
// config/branding.json — no declared instance to enforce, so trust the session:
|
|
580
|
+
// this is what lets a neutral core checkout run every /builder-* command with NO
|
|
581
|
+
// <PREFIX>_API_BASE prefix — task 1002399); OR the repo declares no publicOrigin
|
|
582
|
+
// (unknown identity — you can't assert a mismatch you can't define). Otherwise the
|
|
583
|
+
// mismatch is expectedHost !== sessionHost — the guard that still fires for a
|
|
584
|
+
// BRANDED checkout whose session points at a different instance (the 2026-07-08
|
|
585
|
+
// hazard).
|
|
586
|
+
function detectInstanceMismatch({ session, brand = safeBranding(), env = process.env, hasInstanceConfig = defaultHasInstanceConfig } = {}) {
|
|
587
|
+
if (ic.resolveEnv('API_BASE', { env })) return { mismatch: false };
|
|
588
|
+
if (!session || !session.api_base) return { mismatch: false };
|
|
589
|
+
if (!hasInstanceConfig()) return { mismatch: false };
|
|
590
|
+
const expected = brand && brand.domains && brand.domains.publicOrigin;
|
|
591
|
+
if (!expected) return { mismatch: false };
|
|
592
|
+
const expectedHost = instanceOriginHost(expected);
|
|
593
|
+
const actualHost = instanceOriginHost(session.api_base);
|
|
594
|
+
if (!expectedHost || !actualHost) return { mismatch: false };
|
|
595
|
+
return { mismatch: expectedHost !== actualHost, expected, actual: session.api_base };
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
let _instanceMismatchExitInFlight = false;
|
|
599
|
+
|
|
600
|
+
function printInstanceMismatchAndExit({ expected, actual }) {
|
|
601
|
+
const pfx = ic.envPrefix();
|
|
602
|
+
console.error('');
|
|
603
|
+
console.error('✖ Wrong instance — refusing to act.');
|
|
604
|
+
console.error(' This project is configured for one Cloud Bongos instance, but your signed-in');
|
|
605
|
+
console.error(' session belongs to a different one. Acting would write to the wrong place, so');
|
|
606
|
+
console.error(' I stop here (a wrong-instance write is worse than doing nothing).');
|
|
607
|
+
console.error('');
|
|
608
|
+
console.error(` This project (config/branding.json): ${expected}`);
|
|
609
|
+
console.error(` Your session is signed in to: ${actual}`);
|
|
610
|
+
console.error('');
|
|
611
|
+
console.error(' Sign in to THIS instance, then re-run your command:');
|
|
612
|
+
console.error(` npx bongos login ${expected}`);
|
|
613
|
+
console.error(` (or, from a checkout without the bongos bin: node scripts/bongos/login.js ${expected})`);
|
|
614
|
+
console.error('');
|
|
615
|
+
console.error(' Intentionally targeting another instance? Set the base explicitly, e.g.');
|
|
616
|
+
console.error(` ${pfx}_API_BASE=${actual} <your command>`);
|
|
617
|
+
for (const line of plainCardLines('instance_mismatch')) console.error(line);
|
|
618
|
+
console.error('');
|
|
619
|
+
process.exit(3); // 3 = instance mismatch (distinct from 2 = unauth)
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
// Fail-closed instance guard for RAW-fetch READ commands (task 2124 / demo-audit C2).
|
|
623
|
+
// apiCall + cliClient guard themselves, but a command that reaches the API through its
|
|
624
|
+
// OWN fetch bypasses that — the 2026-07-08 demo hit exactly this: `bongos status` used a
|
|
625
|
+
// raw fetch(API_BASE/…) and happily printed the MAIN instance's progress while sitting in
|
|
626
|
+
// the demo repo, giving false confidence, while the write path correctly refused. Such a
|
|
627
|
+
// command must call this first. Inert when there is no session, when API_BASE is overridden,
|
|
628
|
+
// or when the session's instance matches this repo's branding — it only fires on a genuine
|
|
629
|
+
// wrong-instance session. Reuses the same detector + message as the write-side guard.
|
|
630
|
+
async function assertInstanceMatch({ allowInstanceMismatch = false } = {}) {
|
|
631
|
+
if (allowInstanceMismatch || _instanceMismatchExitInFlight) return;
|
|
632
|
+
const session = await loadSession();
|
|
633
|
+
const mm = detectInstanceMismatch({ session });
|
|
634
|
+
if (mm.mismatch) {
|
|
635
|
+
_instanceMismatchExitInFlight = true;
|
|
636
|
+
printInstanceMismatchAndExit(mm);
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/**
|
|
641
|
+
* Make an authenticated request to the GDS API.
|
|
642
|
+
*
|
|
643
|
+
* Default behavior on HTTP 401: print clear actionable guidance and exit(2).
|
|
644
|
+
* Callers can opt out by passing { allowUnauthenticated: true } when 401 is a
|
|
645
|
+
* legitimate response they want to handle (e.g. setup.js pre-flighting /me to
|
|
646
|
+
* decide whether to re-auth automatically).
|
|
647
|
+
*/
|
|
648
|
+
async function apiCall(method, urlPath, body = null, opts = {}) {
|
|
649
|
+
const { allowUnauthenticated = false, allowInstanceMismatch = false } = opts;
|
|
650
|
+
const session = await loadSession();
|
|
651
|
+
// Fail CLOSED (task 2102) if the session we'd authenticate with belongs to a
|
|
652
|
+
// different instance than this repo is configured for — never silently borrow
|
|
653
|
+
// another instance's credentials. Opt out with { allowInstanceMismatch: true }
|
|
654
|
+
// for a deliberate cross-instance caller (login.js talks to other instances via
|
|
655
|
+
// its own fetch, so it never reaches here).
|
|
656
|
+
if (!allowInstanceMismatch && !_instanceMismatchExitInFlight) {
|
|
657
|
+
const mm = detectInstanceMismatch({ session });
|
|
658
|
+
if (mm.mismatch) {
|
|
659
|
+
_instanceMismatchExitInFlight = true;
|
|
660
|
+
printInstanceMismatchAndExit(mm);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
// Instance-agnostic base (V4.R83 / task 1250): `bongos login <instance>` writes
|
|
664
|
+
// that instance's origin to session.api_base, so every later command targets it.
|
|
665
|
+
// Precedence mirrors readSessionToken: an explicit <PREFIX>_API_BASE env wins
|
|
666
|
+
// (local dev / staging override), then the logged-in instance, then prod. OTB
|
|
667
|
+
// sessions already store the founder instance's api_base, so this is a no-op
|
|
668
|
+
// for the OTB instance and only bites once someone logs in to a different one.
|
|
669
|
+
const base = ic.resolveApiBase({ session: session || null });
|
|
670
|
+
const headers = {
|
|
671
|
+
'Content-Type': 'application/json',
|
|
672
|
+
'User-Agent': CLI_USER_AGENT,
|
|
673
|
+
};
|
|
674
|
+
if (session && session.token) {
|
|
675
|
+
headers['Authorization'] = `Bearer ${session.token}`;
|
|
676
|
+
}
|
|
677
|
+
// The Anthropic-identity pin was removed (task 1039, idea 258): we no longer
|
|
678
|
+
// send X-Anthropic-User, because the server no longer cross-checks it. The
|
|
679
|
+
// reward is a uniform server-side valuation (ADR 0054), not per-Anthropic-
|
|
680
|
+
// account billing, so identity is not an auth boundary. anthropic_user_id is
|
|
681
|
+
// still kept in the session as cosmetic attribution; it is simply not
|
|
682
|
+
// transmitted as a header.
|
|
683
|
+
// opts.rawBody (a Buffer) + opts.contentType send bytes instead of JSON — a
|
|
684
|
+
// UAT recording upload (task 1004392), whose route reads a raw video body.
|
|
685
|
+
if (opts.rawBody) headers['Content-Type'] = opts.contentType || 'application/octet-stream';
|
|
686
|
+
const res = await dispatchedFetch(`${base}${urlPath}`, {
|
|
687
|
+
method,
|
|
688
|
+
headers,
|
|
689
|
+
body: opts.rawBody ? opts.rawBody : (body ? JSON.stringify(body) : null),
|
|
690
|
+
dispatcher: noKeepAliveDispatcher(),
|
|
691
|
+
});
|
|
692
|
+
const text = await res.text();
|
|
693
|
+
let data;
|
|
694
|
+
try {
|
|
695
|
+
data = text ? JSON.parse(text) : null;
|
|
696
|
+
} catch (_) {
|
|
697
|
+
data = { raw: text };
|
|
698
|
+
}
|
|
699
|
+
if (res.status === 401 && !allowUnauthenticated && !_unauthExitInFlight) {
|
|
700
|
+
_unauthExitInFlight = true;
|
|
701
|
+
printUnauthGuidanceAndExit();
|
|
702
|
+
}
|
|
703
|
+
return { status: res.status, ok: res.ok, data };
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
// task 1996 (R09): the ONE HTTP client. cliClient() returns the generated typed
|
|
707
|
+
// client (clients/bongos-client — ADR 0118) configured for the CLI:
|
|
708
|
+
// • baseUrl — the session-resolved instance origin + the versioned API prefix
|
|
709
|
+
// (/api/bongos/v1), so paths are the spec-relative /tasks/… form.
|
|
710
|
+
// • token — the session bearer.
|
|
711
|
+
// • throwOnError:false — every call resolves to { status, ok, data } (never
|
|
712
|
+
// throws on HTTP status; network errors still reject), so the long-standing
|
|
713
|
+
// apiCall contract holds and status-inspecting callers port 1:1.
|
|
714
|
+
// • fetch — a wrapper that keeps apiCall's behavior: the founder CLI
|
|
715
|
+
// User-Agent, plus the 401 auto-exit guidance.
|
|
716
|
+
// Named methods (api.tasks.getTasksId({ id })) replace hand-built apiCall paths;
|
|
717
|
+
// api.request(method, path, opts) is the escape hatch for non-spec routes.
|
|
718
|
+
// The generated client is ESM; we import() it once and cache per (base, token,
|
|
719
|
+
// opts) — CommonJS callers just `const api = await cliClient()`.
|
|
720
|
+
let _clientModPromise = null;
|
|
721
|
+
const _clientCache = new Map();
|
|
722
|
+
|
|
723
|
+
// Generate the typed client into this core's own root when it is missing (task 1004866:
|
|
724
|
+
// gitignored; a fresh clone has no copy). Only when MISSING: an installed core ships its
|
|
725
|
+
// packaged copy and may sit on a read-only path, and a dev checkout's copy is refreshed by
|
|
726
|
+
// `node scripts/bongos/api-artifacts.js`. A failure is left to the import below to report.
|
|
727
|
+
function ensureCliClientFile({ root = path.resolve(__dirname, '..', '..'), exists = fs.existsSync, ensure } = {}) {
|
|
728
|
+
if (exists(path.join(root, 'clients', 'bongos-client', 'index.mjs'))) return false;
|
|
729
|
+
try {
|
|
730
|
+
(ensure || require('./api-artifacts.js').ensureApiArtifacts)({ root });
|
|
731
|
+
return true;
|
|
732
|
+
} catch (e) {
|
|
733
|
+
console.error(`bongos: could not generate the API client (${e.message}) — run \`node scripts/bongos/api-artifacts.js\`.`);
|
|
734
|
+
return false;
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
async function cliClient(opts = {}) {
|
|
738
|
+
const { allowUnauthenticated = false, allowInstanceMismatch = false } = opts;
|
|
739
|
+
const session = await loadSession();
|
|
740
|
+
// Fail CLOSED (task 2102) — the same guard as apiCall, on the OTHER HTTP entry
|
|
741
|
+
// point. cliClient() is the typed client (api.js + newer scripts route through
|
|
742
|
+
// it), and it resolves the base identically, so it can silently target the wrong
|
|
743
|
+
// instance too. Guard both, or the hole just moves. Opt out with
|
|
744
|
+
// { allowInstanceMismatch: true } for a deliberate cross-instance caller.
|
|
745
|
+
if (!allowInstanceMismatch && !_instanceMismatchExitInFlight) {
|
|
746
|
+
const mm = detectInstanceMismatch({ session });
|
|
747
|
+
if (mm.mismatch) {
|
|
748
|
+
_instanceMismatchExitInFlight = true;
|
|
749
|
+
printInstanceMismatchAndExit(mm);
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
const base = ic.resolveApiBase({ session: session || null });
|
|
753
|
+
const token = (session && session.token) || null;
|
|
754
|
+
const key = `${base}|${token || ''}|${allowUnauthenticated}`;
|
|
755
|
+
if (_clientCache.has(key)) return _clientCache.get(key);
|
|
756
|
+
if (!_clientModPromise) {
|
|
757
|
+
// task 1004866: the client is gitignored, so a fresh core checkout has none until it
|
|
758
|
+
// is generated (an installed core carries it — package-core packs it). Build it from
|
|
759
|
+
// the routes into the core root first; a no-op when it is already current.
|
|
760
|
+
ensureCliClientFile();
|
|
761
|
+
_clientModPromise = import('../../clients/bongos-client/index.mjs');
|
|
762
|
+
}
|
|
763
|
+
const { createClient } = await _clientModPromise;
|
|
764
|
+
const authedFetch = async (url, init) => {
|
|
765
|
+
init = init || {};
|
|
766
|
+
init.headers = Object.assign({ 'User-Agent': CLI_USER_AGENT }, init.headers);
|
|
767
|
+
if (init.dispatcher === undefined) init.dispatcher = noKeepAliveDispatcher();
|
|
768
|
+
const res = await dispatchedFetch(url, init);
|
|
769
|
+
if (res.status === 401 && !allowUnauthenticated && !_unauthExitInFlight) {
|
|
770
|
+
_unauthExitInFlight = true;
|
|
771
|
+
printUnauthGuidanceAndExit();
|
|
772
|
+
}
|
|
773
|
+
return res;
|
|
774
|
+
};
|
|
775
|
+
const client = createClient({ baseUrl: `${base}/api/bongos/v1`, token, fetch: authedFetch, throwOnError: false });
|
|
776
|
+
_clientCache.set(key, client);
|
|
777
|
+
return client;
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
async function requireSession() {
|
|
781
|
+
const s = await loadSession();
|
|
782
|
+
if (!s || !s.token) {
|
|
783
|
+
console.error(`No Bongos session found at ${SESSION_PATH}.`);
|
|
784
|
+
console.error(`You're not signed in yet — pick the line that fits:`);
|
|
785
|
+
if (isTerminalSurface()) {
|
|
786
|
+
// A terminal reader may have no instance configured at all — naming one is the whole point
|
|
787
|
+
// of `login`, and `/builder-*` does not exist outside a Claude Code session (task 1003730).
|
|
788
|
+
console.error(` • First time here → run npx bongos login <instance-url> (sign in with a browser click)`);
|
|
789
|
+
console.error(` • Signed in before / expired → run npx bongos reauth (re-issue your CLI token)`);
|
|
790
|
+
} else {
|
|
791
|
+
console.error(` • First time on the project → run /builder-setup (one-time GitHub sign-in that also registers you)`);
|
|
792
|
+
console.error(` • Signed in before / expired → run /builder-reauth (fast UI re-issue of your CLI token)`);
|
|
793
|
+
}
|
|
794
|
+
for (const line of plainCardLines('no_session')) console.error(line);
|
|
795
|
+
process.exit(2);
|
|
796
|
+
}
|
|
797
|
+
return s;
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
// -------------------------------------------------------------------------
|
|
801
|
+
// Output helpers (text, structured for the slash command to relay)
|
|
802
|
+
// -------------------------------------------------------------------------
|
|
803
|
+
|
|
804
|
+
function fmtMinutes(m) {
|
|
805
|
+
if (m == null) return '—';
|
|
806
|
+
if (m < 60) return `${m}m`;
|
|
807
|
+
const h = Math.floor(m / 60);
|
|
808
|
+
const rem = m % 60;
|
|
809
|
+
return rem ? `${h}h${rem}m` : `${h}h`;
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
function fmtUsd(n) {
|
|
813
|
+
if (n == null) return '—';
|
|
814
|
+
return `$${Number(n).toFixed(2)}`;
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
function fmtTouches(arr) {
|
|
818
|
+
if (!arr || arr.length === 0) return '—';
|
|
819
|
+
if (arr.length <= 3) return arr.join(', ');
|
|
820
|
+
return `${arr.slice(0, 3).join(', ')} +${arr.length - 3}`;
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
// Estimate display: prefer the calibrated minutes (per-kind median × raw est).
|
|
824
|
+
// When calibration differs meaningfully from the raw input we show both as
|
|
825
|
+
// `~5m (raw 90m)` so the gap is visible. When raw == calibrated (small task,
|
|
826
|
+
// no historical data, or differs by <20%) we collapse to a single number.
|
|
827
|
+
// Migration 015 added est_minutes_calibrated to /tasks/claimable + getTask.
|
|
828
|
+
function fmtEstimate(t) {
|
|
829
|
+
const raw = t.est_minutes;
|
|
830
|
+
const cal = t.est_minutes_calibrated;
|
|
831
|
+
if (cal == null) return fmtMinutes(raw);
|
|
832
|
+
if (raw == null || raw === cal) return fmtMinutes(cal);
|
|
833
|
+
const diff = Math.abs(cal - raw) / raw;
|
|
834
|
+
if (diff < 0.2) return fmtMinutes(cal);
|
|
835
|
+
return `~${fmtMinutes(cal)} (raw ${fmtMinutes(raw)})`;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
function tableTask(t) {
|
|
839
|
+
// Version chip — eg `[V1]` / `[PMS-V2]`.
|
|
840
|
+
const versionChip = `[${t.version_id}]`;
|
|
841
|
+
return [
|
|
842
|
+
`#${t.id}`,
|
|
843
|
+
versionChip,
|
|
844
|
+
`P${t.priority ?? '?'}`,
|
|
845
|
+
fmtEstimate(t),
|
|
846
|
+
`${fmtUsd(t.est_cost_usd)}`,
|
|
847
|
+
`M${t.manual_degree ?? '?'}`,
|
|
848
|
+
`${t.credits_reward ?? 0}c`,
|
|
849
|
+
t.automation_tag ? `[${t.automation_tag}]` : '',
|
|
850
|
+
t.title,
|
|
851
|
+
]
|
|
852
|
+
.filter(Boolean)
|
|
853
|
+
.join(' ');
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
// -------------------------------------------------------------------------
|
|
857
|
+
// Free-text session-request parser
|
|
858
|
+
// -------------------------------------------------------------------------
|
|
859
|
+
//
|
|
860
|
+
// Pure function. Returns { timeBudgetMin, mode, parallel } where each field
|
|
861
|
+
// may be null if not detected. Returns null when *no* fields parsed (so the
|
|
862
|
+
// CLI can fall through to the interactive prompt).
|
|
863
|
+
//
|
|
864
|
+
// Time: \d+\s*(h|hr|hrs|hour|hours|min|m|minutes?)
|
|
865
|
+
// Mode: overnight|autonomous|async → 'autonomous'
|
|
866
|
+
// active|focused → 'active'
|
|
867
|
+
// check[\s-]?in|intermittent → 'check-in'
|
|
868
|
+
// Parallel: parallel\s*\d+, \d+\s*sessions?, max\s*\d+
|
|
869
|
+
|
|
870
|
+
// V3.R13 (#237): one-line "next: <stage>" nudge for newcomers.
|
|
871
|
+
//
|
|
872
|
+
// Given the /api/bongos/me response, print a banner pointing at the next
|
|
873
|
+
// uncleared onboarding stage. Silent when the builder has graduated or has
|
|
874
|
+
// already cleared first_ship (the post-newcomer threshold) — gates lift
|
|
875
|
+
// after the first ship, so the nudge is too. Also silent when the
|
|
876
|
+
// onboarding payload is missing (older API, network glitch) — we'd rather
|
|
877
|
+
// say nothing than print noise.
|
|
878
|
+
//
|
|
879
|
+
// Maps stage -> a concrete CLI/web action the builder can take RIGHT NOW.
|
|
880
|
+
// Stage-internal hints (STAGE_HINTS in src/bongos/onboarding-state.js) are
|
|
881
|
+
// the canonical description; the per-CLI commands are the action verbs.
|
|
882
|
+
// The nudges name an action the reader can run. Which spelling is right depends on who is
|
|
883
|
+
// reading — see scripts/bongos/surface.js (task 1003680). Fail-open: a missing surface module must
|
|
884
|
+
// never break a nudge.
|
|
885
|
+
//
|
|
886
|
+
// Both helpers are `function` declarations so they hoist — the guidance printers above (which run
|
|
887
|
+
// far earlier in the file) call them, and moving them up would churn the nudge block they belong to.
|
|
888
|
+
function surfaceAction(verb, arg) {
|
|
889
|
+
try { return require('./surface').action(verb, arg); }
|
|
890
|
+
catch (_) { return `/builder-${verb}${arg == null ? '' : ` ${arg}`}`; }
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
// Is a person at a console reading this, rather than a Claude Code session? Fails open to AGENT,
|
|
894
|
+
// so a missing/broken surface module leaves the agent contract byte-identical (task 1003730).
|
|
895
|
+
function isTerminalSurface() {
|
|
896
|
+
try { return require('./surface').isTerminal(); }
|
|
897
|
+
catch (_) { return false; }
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
// The same refusal in plain words, for an agent to relay (task 1003989). Same fail-open
|
|
901
|
+
// shape as the two helpers above: a guidance printer must never die on its own footnote.
|
|
902
|
+
function plainCardLines(code) {
|
|
903
|
+
try { return require('./plain-cards').plainCardLines(code); }
|
|
904
|
+
catch (_) { return []; }
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
function nudgeActionForStage(stage) {
|
|
908
|
+
switch (stage) {
|
|
909
|
+
case 'auth_complete':
|
|
910
|
+
return 'Run node scripts/bongos/setup.js to authenticate.';
|
|
911
|
+
case 'pick_disciplines':
|
|
912
|
+
return `Choose the work that calls you — open the hall at ${hallBase()} and pick engineer, artist, ideator, or any mix.`;
|
|
913
|
+
case 'first_start':
|
|
914
|
+
return `Run ${surfaceAction('start')} to survey what you can claim.`;
|
|
915
|
+
case 'first_claim':
|
|
916
|
+
return `Pick a task from ${surfaceAction('start')} and claim it with ${surfaceAction('claim', 'N')}.`;
|
|
917
|
+
case 'ship_three':
|
|
918
|
+
return `Carry three tasks through with ${surfaceAction('ship')} — the third makes you a Thetes.`;
|
|
919
|
+
default:
|
|
920
|
+
return null;
|
|
921
|
+
}
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
function printOnboardingNudge(meBody) {
|
|
925
|
+
if (!meBody || typeof meBody !== 'object') return;
|
|
926
|
+
const onboarding = meBody.onboarding;
|
|
927
|
+
if (!onboarding || typeof onboarding !== 'object') return;
|
|
928
|
+
if (onboarding.graduated) return;
|
|
929
|
+
const cleared = new Set(Array.isArray(onboarding.completed_stages) ? onboarding.completed_stages : []);
|
|
930
|
+
// Reached the ship-three milestone (= graduated to Thetes): no further nagging.
|
|
931
|
+
if (cleared.has('ship_three')) return;
|
|
932
|
+
const stage = onboarding.current_stage;
|
|
933
|
+
if (!stage || stage === 'graduated') return;
|
|
934
|
+
const action = nudgeActionForStage(stage);
|
|
935
|
+
if (!action) return;
|
|
936
|
+
// Use a recognizable prefix so the slash command and any UI surface can
|
|
937
|
+
// detect/strip the line if needed. Ascii-only — these scripts must work
|
|
938
|
+
// in low-fidelity terminals.
|
|
939
|
+
const stages = Array.isArray(onboarding.stages) ? onboarding.stages : [];
|
|
940
|
+
const stageMeta = stages.find((s) => s.id === stage);
|
|
941
|
+
const label = (stageMeta && stageMeta.label) || stage;
|
|
942
|
+
console.log(`Next: ${label} — ${action}`);
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
// V3.R84 (#302), criterion C3: the CLI-side budget "ping". Prints a prominent
|
|
946
|
+
// soft-cap (warn) or hard-cap (over) line from the /me `cost` object. The CLI is
|
|
947
|
+
// the builder's private surface, so this is where the budget warning reaches
|
|
948
|
+
// them — not Discord (shared mirror). No-op when under budget or when the server
|
|
949
|
+
// didn't return a cost status (older deploy / read error → fail-quiet).
|
|
950
|
+
function printCostWarning(meBody) {
|
|
951
|
+
const cost = meBody && meBody.cost;
|
|
952
|
+
if (!cost || typeof cost !== 'object') return;
|
|
953
|
+
if (cost.level === 'over') {
|
|
954
|
+
console.log(`⚠ BUDGET EXCEEDED — $${cost.spend_mtd_usd} of $${cost.budget_mtd_usd} this month (${cost.pct_used}%). Cost-incurring actions (ship, art pipeline) are blocked until a Metic or Archon raises your budget.`);
|
|
955
|
+
} else if (cost.level === 'warn') {
|
|
956
|
+
console.log(`⚠ Budget at ${cost.pct_used}% — $${cost.spend_mtd_usd} of $${cost.budget_mtd_usd} this month. You'll be blocked from cost-incurring actions at 100%.`);
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
|
|
960
|
+
// task 1013 / ADR 0073: the CLI half of the consistent "the system needs an input
|
|
961
|
+
// from you" signal. Given the /api/bongos/me response, print a short line for each
|
|
962
|
+
// `needs` item in the action_needed state — the builder's private surface is the
|
|
963
|
+
// right place to tell them an input is missing (mirrors printCostWarning). Silent
|
|
964
|
+
// when nothing needs action (covered / satisfied items don't nag) or when the
|
|
965
|
+
// payload is absent (older API / network glitch). One line per item, with the
|
|
966
|
+
// concrete place to fix it. The hall Standing card renders the same `needs` data.
|
|
967
|
+
const HALL_BASE = hallBase();
|
|
968
|
+
function printNeedsNudge(meBody) {
|
|
969
|
+
if (!meBody || typeof meBody !== 'object') return;
|
|
970
|
+
const needs = meBody.needs;
|
|
971
|
+
if (!needs || !Array.isArray(needs.items)) return;
|
|
972
|
+
const action = needs.items.filter((n) => n && n.state === 'action_needed');
|
|
973
|
+
if (action.length === 0) return;
|
|
974
|
+
const noun = action.length === 1 ? 'thing needs' : 'things need';
|
|
975
|
+
console.log(`⚠ ${action.length} ${noun} your input:`);
|
|
976
|
+
for (const n of action) {
|
|
977
|
+
const where = n.action && n.action.href ? ` — ${HALL_BASE}${n.action.href}` : '';
|
|
978
|
+
console.log(` • ${n.title}: ${n.message}${where}`);
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
function parseSessionRequest(text) {
|
|
983
|
+
if (!text || typeof text !== 'string') return null;
|
|
984
|
+
const s = text.toLowerCase();
|
|
985
|
+
|
|
986
|
+
let timeBudgetMin = null;
|
|
987
|
+
let mode = null;
|
|
988
|
+
let parallel = null;
|
|
989
|
+
|
|
990
|
+
// Parallel — try the most specific patterns first so a "3 sessions" form
|
|
991
|
+
// doesn't get clobbered by an earlier "\d+\s*h" match on the same digits.
|
|
992
|
+
let mParallel =
|
|
993
|
+
s.match(/parallel\s*[:=]?\s*(\d+)/) ||
|
|
994
|
+
s.match(/(\d+)\s*sessions?\b/) ||
|
|
995
|
+
s.match(/max\s*[:=]?\s*(\d+)/);
|
|
996
|
+
if (mParallel) parallel = Number(mParallel[1]);
|
|
997
|
+
|
|
998
|
+
// Time — accept hours and minutes in any combination ("6h", "90 min",
|
|
999
|
+
// "1 hour", "2hr30min"). Sum them. (?![a-z]) instead of \b so digit-suffix
|
|
1000
|
+
// compounds like "2hr30min" still match the hour group.
|
|
1001
|
+
const hourRe = /(\d+)\s*(hours|hour|hrs|hr|h)(?![a-z])/g;
|
|
1002
|
+
const minRe = /(\d+)\s*(minutes|minute|min|m)(?![a-z])/g;
|
|
1003
|
+
let total = 0;
|
|
1004
|
+
let matched = false;
|
|
1005
|
+
// Hours pass first.
|
|
1006
|
+
let m;
|
|
1007
|
+
while ((m = hourRe.exec(s)) !== null) {
|
|
1008
|
+
total += Number(m[1]) * 60;
|
|
1009
|
+
matched = true;
|
|
1010
|
+
}
|
|
1011
|
+
// Minutes pass — but only count "m" alone if it's not eaten by hour.
|
|
1012
|
+
// Strip already-matched hour spans so "2hr30min" doesn't double-count.
|
|
1013
|
+
let minSearch = s.replace(hourRe, ' ');
|
|
1014
|
+
while ((m = minRe.exec(minSearch)) !== null) {
|
|
1015
|
+
total += Number(m[1]);
|
|
1016
|
+
matched = true;
|
|
1017
|
+
}
|
|
1018
|
+
if (matched) timeBudgetMin = total;
|
|
1019
|
+
|
|
1020
|
+
// Mode — most-specific wins. check-in patterns first because they overlap
|
|
1021
|
+
// with nothing; then autonomous (overnight/async), then active.
|
|
1022
|
+
if (/\bcheck[\s-]?in\b|\bintermittent\b/.test(s)) {
|
|
1023
|
+
mode = 'check-in';
|
|
1024
|
+
} else if (/\bovernight\b|\bautonomous\b|\basync\b/.test(s)) {
|
|
1025
|
+
mode = 'autonomous';
|
|
1026
|
+
} else if (/\bactive\b|\bfocused\b/.test(s)) {
|
|
1027
|
+
mode = 'active';
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
if (timeBudgetMin == null && mode == null && parallel == null) return null;
|
|
1031
|
+
return { timeBudgetMin, mode, parallel };
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
// task 1002809: Git Bash (MSYS) rewrites a leading-slash argument into a Windows
|
|
1035
|
+
// path under the Git install root BEFORE node sees it — `/tasks/123` arrives as
|
|
1036
|
+
// `C:/Program Files/Git/tasks/123` — unless the builder remembers
|
|
1037
|
+
// MSYS_NO_PATHCONV=1. Undo it here so no one needs the env prefix. EXEPATH (set
|
|
1038
|
+
// by Git Bash) points INSIDE the install (`…\Git\bin`), while the mangled prefix
|
|
1039
|
+
// is the install root (`…\Git`), so we strip the LONGEST ancestor of EXEPATH
|
|
1040
|
+
// that prefixes the arg — never the bare drive root (that would "repair"
|
|
1041
|
+
// arbitrary Windows paths). Case-insensitive, both slash styles. Pure + exported
|
|
1042
|
+
// for tests/api_msys_path_repair.mjs; no-op off win32 or without EXEPATH.
|
|
1043
|
+
function repairMsysMangledPath(raw, { exepath = process.env.EXEPATH, platform = process.platform } = {}) {
|
|
1044
|
+
if (!raw || raw.startsWith('/')) return raw;
|
|
1045
|
+
if (platform !== 'win32' || !exepath) return raw;
|
|
1046
|
+
const rawFwd = String(raw).replace(/\\/g, '/');
|
|
1047
|
+
const rawLower = rawFwd.toLowerCase();
|
|
1048
|
+
let ancestor = String(exepath).replace(/\\/g, '/').replace(/\/+$/, '');
|
|
1049
|
+
let best = null;
|
|
1050
|
+
while (ancestor.includes('/')) {
|
|
1051
|
+
// Stop before the bare drive root ("C:" after the last slice).
|
|
1052
|
+
if (/^[a-z]:$/i.test(ancestor)) break;
|
|
1053
|
+
if (rawLower.startsWith(ancestor.toLowerCase() + '/') && (best === null || ancestor.length > best.length)) {
|
|
1054
|
+
best = ancestor;
|
|
1055
|
+
}
|
|
1056
|
+
ancestor = ancestor.slice(0, ancestor.lastIndexOf('/'));
|
|
1057
|
+
}
|
|
1058
|
+
if (best === null) return raw;
|
|
1059
|
+
return rawFwd.slice(best.length);
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
// detectWorktreeName — which linked git worktree is this process running in?
|
|
1063
|
+
// Moved here from claim.js in task 1003767 so the CLAIM and the RESOLVE agree on
|
|
1064
|
+
// one answer: the server keys both the one-active-claim guard and (now) the
|
|
1065
|
+
// resolve lock on the WORKING TREE rather than the shared auth session, and two
|
|
1066
|
+
// copies of this detector drifting apart would strand a ship with a name
|
|
1067
|
+
// mismatch. One definition, both callers.
|
|
1068
|
+
//
|
|
1069
|
+
// Only names a LINKED worktree — git-dir != git-common-dir, i.e. a real
|
|
1070
|
+
// `.claude/worktrees/<name>` checkout — using its top-level directory basename
|
|
1071
|
+
// (the `<name>` the convention already uses). The MAIN checkout returns null,
|
|
1072
|
+
// which the server reads as "no tree named" and falls back to the session
|
|
1073
|
+
// compare. Best-effort: any git hiccup yields null, so this can never break a
|
|
1074
|
+
// claim or a ship.
|
|
1075
|
+
function detectWorktreeName() {
|
|
1076
|
+
try {
|
|
1077
|
+
const gitDir = execSync('git rev-parse --git-dir', { encoding: 'utf8' }).trim();
|
|
1078
|
+
const commonDir = execSync('git rev-parse --git-common-dir', { encoding: 'utf8' }).trim();
|
|
1079
|
+
// Same dir → the main checkout, not a linked worktree → leave unnamed.
|
|
1080
|
+
if (path.resolve(gitDir) === path.resolve(commonDir)) return null;
|
|
1081
|
+
const top = execSync('git rev-parse --show-toplevel', { encoding: 'utf8' }).trim();
|
|
1082
|
+
const name = path.basename(top);
|
|
1083
|
+
return name || null;
|
|
1084
|
+
} catch (_) {
|
|
1085
|
+
return null;
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
// ---- card richness (task 1002518) ------------------------------------------
|
|
1090
|
+
//
|
|
1091
|
+
// The one place a CLI turns a /me payload into "what should this card look
|
|
1092
|
+
// like": three booleans — print the card at all, write the widget, open its
|
|
1093
|
+
// summary — that emitCard consumes directly.
|
|
1094
|
+
//
|
|
1095
|
+
// WHY THIS READS THE PAYLOAD AND NEVER require()s render-prefs.js. The ladder
|
|
1096
|
+
// lives in modules/builder-settings/render-prefs.js, and a CLI reaches a
|
|
1097
|
+
// module's logic through the server, never by require — the module may be
|
|
1098
|
+
// disabled on the instance, and a require would couple every CLI to one
|
|
1099
|
+
// module's internals. So the server resolves the rung and ships the answers on
|
|
1100
|
+
// `render.flags`; this function only picks them up.
|
|
1101
|
+
//
|
|
1102
|
+
// TWO SERVER SHAPES, deliberately. `render.flags` is the ladder (task 1002518);
|
|
1103
|
+
// `render.widgets_enabled` is the boolean that predates it. A CLI newer than the
|
|
1104
|
+
// instance it is pointed at sees only the boolean — the /me payload is not
|
|
1105
|
+
// version-negotiated — so the fallback is not defensive padding, it is the
|
|
1106
|
+
// supported path against a pinned instance, and it reconstructs exactly what
|
|
1107
|
+
// that boolean has always meant: card always, widget iff true, never expanded.
|
|
1108
|
+
// An absent or failed /me lands on the same default.
|
|
1109
|
+
function cardFlagsFromMe(me) {
|
|
1110
|
+
const render = me && me.data && me.data.render;
|
|
1111
|
+
const f = render && render.flags;
|
|
1112
|
+
if (f && typeof f === 'object') {
|
|
1113
|
+
return {
|
|
1114
|
+
level: typeof f.level === 'string' ? f.level : null,
|
|
1115
|
+
showCard: f.showCard !== false,
|
|
1116
|
+
showWidget: f.showWidget === true,
|
|
1117
|
+
expanded: f.expanded === true,
|
|
1118
|
+
};
|
|
1119
|
+
}
|
|
1120
|
+
const enabled = !render || render.widgets_enabled !== false;
|
|
1121
|
+
return { level: null, showCard: true, showWidget: enabled, expanded: false };
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
// ---------------------------------------------------------------------------
|
|
1125
|
+
// errCode — read the error slug out of an ADR 0116 response envelope.
|
|
1126
|
+
// ---------------------------------------------------------------------------
|
|
1127
|
+
// ADR 0116 standardised every failure on a NESTED envelope:
|
|
1128
|
+
//
|
|
1129
|
+
// { "error": { "code": "task_not_found", "message": "…", "details": … } }
|
|
1130
|
+
//
|
|
1131
|
+
// so the obvious-looking `r.data.error === 'task_not_found'` compares an OBJECT to a
|
|
1132
|
+
// STRING and is never true. That is not a cosmetic bug: each such comparison guards a
|
|
1133
|
+
// helpful, specific message, so against a live server every one of those branches is
|
|
1134
|
+
// unreachable and the user falls through to the raw `(409): [object Object]` dump —
|
|
1135
|
+
// the failure looks like a tooling crash rather than the clear refusal the server sent.
|
|
1136
|
+
//
|
|
1137
|
+
// Verified live 2026-09-22 against cloudbongos.com:
|
|
1138
|
+
// POST /api/bongos/tasks/1003846/abandon
|
|
1139
|
+
// -> 409 {"error":{"code":"cannot_abandon_shipped","message":"shipped tasks are immutable history"}}
|
|
1140
|
+
//
|
|
1141
|
+
// The flat-string fallback is deliberate, not defensive padding: some older routes and
|
|
1142
|
+
// every non-envelope transport error (a proxy's plain-text body, a pre-0116 instance an
|
|
1143
|
+
// upgraded CLI is talking to) still surface `error` as a bare string. Reading both is
|
|
1144
|
+
// what makes one helper safe to use everywhere.
|
|
1145
|
+
//
|
|
1146
|
+
// Fixed in ship.js under task 1002789; extracted here under task 1003658 so the next
|
|
1147
|
+
// caller cannot reintroduce the same comparison. Pure — tests/cli_err_code.mjs.
|
|
1148
|
+
function errCode(data) {
|
|
1149
|
+
const e = data && data.error;
|
|
1150
|
+
if (typeof e === 'string') return e;
|
|
1151
|
+
if (e && typeof e === 'object' && typeof e.code === 'string') return e.code;
|
|
1152
|
+
return null;
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
// errDetails — the structured payload beside the slug, same envelope.
|
|
1156
|
+
//
|
|
1157
|
+
// This matters as much as errCode and is easy to miss: the sibling fields moved WITH
|
|
1158
|
+
// the code. demote.js printed `r.data.current_status` beside its message; ADR 0116 put
|
|
1159
|
+
// that at `error.details.current_status`, so a fix that changed only the comparison
|
|
1160
|
+
// would have restored the branch and then printed "it is 'undefined', not 'ready'" —
|
|
1161
|
+
// a half-fix that looks like a whole one. Verified live 2026-09-22:
|
|
1162
|
+
//
|
|
1163
|
+
// POST /api/bongos/tasks/1003846/demote
|
|
1164
|
+
// -> 409 {"error":{"code":"cannot_demote","details":{"current_status":"shipped"}}}
|
|
1165
|
+
//
|
|
1166
|
+
// Falls back to the top-level body so a pre-0116 flat response still resolves.
|
|
1167
|
+
function errDetails(data) {
|
|
1168
|
+
const e = data && data.error;
|
|
1169
|
+
if (e && typeof e === 'object' && e.details && typeof e.details === 'object') return e.details;
|
|
1170
|
+
return (data && typeof data === 'object') ? data : {};
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1173
|
+
module.exports = {
|
|
1174
|
+
errCode,
|
|
1175
|
+
errDetails,
|
|
1176
|
+
API_BASE,
|
|
1177
|
+
detectWorktreeName,
|
|
1178
|
+
hallBase,
|
|
1179
|
+
productName,
|
|
1180
|
+
rewardPolicy,
|
|
1181
|
+
costPlusOnlyNote,
|
|
1182
|
+
SESSION_PATH,
|
|
1183
|
+
SESSION_FILENAMES,
|
|
1184
|
+
SESSION_READ_PATHS,
|
|
1185
|
+
loadSession,
|
|
1186
|
+
loadSessionSync,
|
|
1187
|
+
saveSession,
|
|
1188
|
+
sessionStoreDir,
|
|
1189
|
+
sessionHostKey,
|
|
1190
|
+
sessionStorePath,
|
|
1191
|
+
loadStoredSession,
|
|
1192
|
+
listStoredSessions,
|
|
1193
|
+
arg,
|
|
1194
|
+
argText,
|
|
1195
|
+
hasFlag,
|
|
1196
|
+
stripBom,
|
|
1197
|
+
repairMsysMangledPath,
|
|
1198
|
+
resolveQuiet,
|
|
1199
|
+
readSessionToken,
|
|
1200
|
+
CLI_USER_AGENT,
|
|
1201
|
+
apiCall,
|
|
1202
|
+
cliExit,
|
|
1203
|
+
isDispatcherIncompatError,
|
|
1204
|
+
dispatchedFetch,
|
|
1205
|
+
noKeepAliveDispatcher,
|
|
1206
|
+
_noKeepAliveResetForTest,
|
|
1207
|
+
cliClient,
|
|
1208
|
+
ensureCliClientFile,
|
|
1209
|
+
requireSession,
|
|
1210
|
+
surfaceAction,
|
|
1211
|
+
isTerminalSurface,
|
|
1212
|
+
printUnauthGuidanceAndExit,
|
|
1213
|
+
detectInstanceMismatch,
|
|
1214
|
+
assertInstanceMatch,
|
|
1215
|
+
instanceOriginHost,
|
|
1216
|
+
fmtMinutes,
|
|
1217
|
+
fmtUsd,
|
|
1218
|
+
fmtTouches,
|
|
1219
|
+
fmtEstimate,
|
|
1220
|
+
tableTask,
|
|
1221
|
+
parseSessionRequest,
|
|
1222
|
+
printOnboardingNudge,
|
|
1223
|
+
printCostWarning,
|
|
1224
|
+
printNeedsNudge,
|
|
1225
|
+
cardFlagsFromMe,
|
|
1226
|
+
};
|