@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,1090 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Builder start — what can I claim right now?
|
|
3
|
+
//
|
|
4
|
+
// Usage:
|
|
5
|
+
// node scripts/bongos/start.js [--version V1|PMS-V1] [--discipline engineer|artist|ideator|unclassified] [--all-disciplines] [--fit autonomous|parallel] [--limit N] [--full] [--widget] [--json]
|
|
6
|
+
//
|
|
7
|
+
// --fit narrows the claimable list to what the autonomous overnight
|
|
8
|
+
// session-runner (#358) may pick up:
|
|
9
|
+
// autonomous — overnight-safe + manual_degree<=2 + unblocked (canonical
|
|
10
|
+
// tasks_session_fit 'autonomous' mode). The runner takes
|
|
11
|
+
// claimable[0] as the next task by priority.
|
|
12
|
+
// parallel — autonomous AND tasks.parallel_safe = true (safe to run
|
|
13
|
+
// alongside other tasks). The runner fills its parallel slots
|
|
14
|
+
// from the top of this list.
|
|
15
|
+
//
|
|
16
|
+
// Output is a deterministic "card" (task 1273): one quiet status line, the
|
|
17
|
+
// builder's identity, their holdings, a clean claimable table (# / Version /
|
|
18
|
+
// Type / Reward / Est. / What it is), and a next-step line — identical every session.
|
|
19
|
+
// --widget : emit the card as self-contained HTML on stdout (private warnings
|
|
20
|
+
// to stderr) for the app's widget renderer (show_widget). This is
|
|
21
|
+
// the surface the /builder-start skill renders — BUT it honours the
|
|
22
|
+
// builder's per-builder "render widgets" knob (task 1279): if that
|
|
23
|
+
// builder has widgets off, --widget degrades to the markdown card so
|
|
24
|
+
// no HTML is ever emitted/relayed. Default ON. The skill detects
|
|
25
|
+
// which form it got (HTML starts with '<') and renders accordingly.
|
|
26
|
+
// (default): the markdown form of the same card — the fallback when the
|
|
27
|
+
// client can't draw widgets (raw terminal, cron, other tools).
|
|
28
|
+
// --full : add the detailed ambient widgets + context pack (markdown).
|
|
29
|
+
// --json : unchanged machine interface the autonomous runner reads.
|
|
30
|
+
//
|
|
31
|
+
// --discipline filters the claimable list by builder interest area
|
|
32
|
+
// (orthogonal to kind). engineer = code/infra/gameplay/bugs; artist =
|
|
33
|
+
// pixel art / sprites / the art pipeline; ideator = scoping/research/
|
|
34
|
+
// docs/narrative/lore.
|
|
35
|
+
//
|
|
36
|
+
// DISCIPLINE ROUTING (V3.R81 / #299): by default — when no explicit
|
|
37
|
+
// --discipline is passed — the claimable list is narrowed to the builder's
|
|
38
|
+
// preferred_disciplines (builders.preferred_disciplines, set via
|
|
39
|
+
// /me/disciplines per migrations 027 + 086). An artist shouldn't be shown
|
|
40
|
+
// only engineer tasks. Two escape hatches:
|
|
41
|
+
// --all-disciplines — ignore preferences, show every lane.
|
|
42
|
+
// --discipline X — explicit single-lane filter (overrides preferences).
|
|
43
|
+
// A builder with no stated preference (empty preferred_disciplines) sees
|
|
44
|
+
// everything by default — there is no lane to narrow to.
|
|
45
|
+
//
|
|
46
|
+
// Below the main list, a "You might enjoy" section surfaces up to 3 claimable
|
|
47
|
+
// tasks OUTSIDE the builder's disciplines, ranked by relevance. The ranking
|
|
48
|
+
// mirrors rankCrossDisciplineRecommendations in modules/lifecycle/db-tasks.js
|
|
49
|
+
// (the canonical server-side home for this logic — kept in sync deliberately;
|
|
50
|
+
// start.js is a pure HTTP client and cannot import the server db module).
|
|
51
|
+
//
|
|
52
|
+
//
|
|
53
|
+
// Returns JSON if --json is passed (for the slash command to parse cleanly).
|
|
54
|
+
|
|
55
|
+
const { cliClient, errCode, errDetails, requireSession, fmtUsd, printOnboardingNudge, printCostWarning, printNeedsNudge, hallBase, API_BASE, rewardPolicy, costPlusOnlyNote, isDispatcherIncompatError, cardFlagsFromMe } = require('./cli-lib');
|
|
56
|
+
const { plainCardLines } = require('./plain-cards');
|
|
57
|
+
const { contextPack, formatContextPackCompact } = require('./context-pack');
|
|
58
|
+
const { depsFinding } = require('./preflight');
|
|
59
|
+
|
|
60
|
+
// task 1284: the card shows only the top N claimable rows. The table is the bulk
|
|
61
|
+
// of the widget HTML the model relays verbatim, so fewer rows = fewer tokens +
|
|
62
|
+
// faster render; the true total sits in the header and a "N more — show all"
|
|
63
|
+
// affordance covers the rest. --json is unchanged (full list for the runner).
|
|
64
|
+
const CARD_ROWS = 5;
|
|
65
|
+
|
|
66
|
+
// ---------- header widget helpers ----------
|
|
67
|
+
|
|
68
|
+
// Compact ascii progress bar. Width 10. Filled = █, empty = ░.
|
|
69
|
+
function progressBar(percent, width = 10) {
|
|
70
|
+
const p = Math.max(0, Math.min(100, Number(percent) || 0));
|
|
71
|
+
const filled = Math.round((p / 100) * width);
|
|
72
|
+
return '█'.repeat(filled) + '░'.repeat(width - filled);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function formatVersionsRow(progress) {
|
|
76
|
+
if (!Array.isArray(progress) || progress.length === 0) return null;
|
|
77
|
+
// Only show versions currently building (status==='building').
|
|
78
|
+
// Fall back to non-shipped if none are flagged building.
|
|
79
|
+
let active = progress.filter((v) => v.status === 'building');
|
|
80
|
+
if (active.length === 0) active = progress.filter((v) => v.status !== 'shipped');
|
|
81
|
+
if (active.length === 0) return null;
|
|
82
|
+
const parts = active.map((v) => `${v.version_id} ${progressBar(v.percent_complete)} ${v.percent_complete}%`);
|
|
83
|
+
return parts.join(' · ');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function formatCostRow(cost) {
|
|
87
|
+
if (!cost || typeof cost !== 'object') return null;
|
|
88
|
+
const spent = Number(cost.total_usd) || 0;
|
|
89
|
+
const credits = Number(cost.total_value_credits) || 0;
|
|
90
|
+
// No verdict. The old line computed `credits >= spent` and printed
|
|
91
|
+
// "value > cost ✓" — comparing unitless reward drachmae against USD, so it
|
|
92
|
+
// was green by unit mismatch, not by economics (spike #482 audit, F2). It was
|
|
93
|
+
// also resting on an incomplete cost figure: cost_log captures almost no LLM
|
|
94
|
+
// spend (audit F1; api category was $0.60). Until spend is captured honestly
|
|
95
|
+
// (#483/#486) and given a real value basis, we show the two ledgers plainly
|
|
96
|
+
// and labelled for what they are — logged spend vs reward credits — and let
|
|
97
|
+
// them stand without a manufactured ✓/✗.
|
|
98
|
+
return `${fmtUsd(spent)} logged spend · ${credits}c reward shipped`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// inboxOpenCount — how many ideas are OPEN in the inbox, from a GET /inbox response.
|
|
102
|
+
//
|
|
103
|
+
// WHY THIS IS NOT ideas.length (task 1003454). GET /inbox answers
|
|
104
|
+
// { ideas, open_count }, where `ideas` is a PAGE (default 50 rows) and
|
|
105
|
+
// `open_count` is the real total, counted server-side under the same rank gate
|
|
106
|
+
// as the rows. Reading the array length therefore reported the page size: the
|
|
107
|
+
// card said "50 ideas in inbox" while the payload said 99, and once the queue
|
|
108
|
+
// passed one page the figure pinned at exactly 50 forever — a number that looks
|
|
109
|
+
// plausible, never moves, and understates the backlog the card exists to make
|
|
110
|
+
// visible. capture.js already destructured open_count correctly, which is what
|
|
111
|
+
// made this an oversight rather than a convention.
|
|
112
|
+
//
|
|
113
|
+
// The page length stays as a FALLBACK so an older core that predates open_count
|
|
114
|
+
// still renders a figure rather than "N/A". Returns null when neither is
|
|
115
|
+
// readable, which the callers render as "ideas: N/A".
|
|
116
|
+
function inboxOpenCount(inboxRes) {
|
|
117
|
+
if (!inboxRes || !inboxRes.ok) return null;
|
|
118
|
+
const data = inboxRes.data;
|
|
119
|
+
if (data && typeof data.open_count === 'number') return data.open_count;
|
|
120
|
+
if (data && Array.isArray(data.ideas)) return data.ideas.length;
|
|
121
|
+
if (data && typeof data.count === 'number') return data.count;
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function formatRecentRow({ recentShipped, inboxCount, blockerCount }) {
|
|
126
|
+
const bits = [];
|
|
127
|
+
// "1 ship in last 24h" — recent_shipped returns tasks shipped within
|
|
128
|
+
// a recent window; we re-filter to strictly <24h for the header.
|
|
129
|
+
if (Array.isArray(recentShipped)) {
|
|
130
|
+
const cutoff = Date.now() - 24 * 60 * 60 * 1000;
|
|
131
|
+
const last24 = recentShipped.filter((t) => {
|
|
132
|
+
const ts = t.shipped_at ? Date.parse(t.shipped_at) : 0;
|
|
133
|
+
return ts && ts >= cutoff;
|
|
134
|
+
}).length;
|
|
135
|
+
bits.push(`${last24} ship${last24 === 1 ? '' : 's'} in last 24h`);
|
|
136
|
+
} else {
|
|
137
|
+
bits.push('ships: N/A');
|
|
138
|
+
}
|
|
139
|
+
bits.push(inboxCount == null ? 'ideas: N/A' : `${inboxCount} idea${inboxCount === 1 ? '' : 's'} in inbox`);
|
|
140
|
+
bits.push(blockerCount == null ? 'blockers: N/A' : `${blockerCount} open blocker${blockerCount === 1 ? '' : 's'}`);
|
|
141
|
+
return bits.join(' · ');
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// ---------- card helpers (task 1273) ----------
|
|
145
|
+
// The default /builder-start view is a single deterministic "card" rendered as
|
|
146
|
+
// markdown: a quiet status line, identity, holdings, a clean claimable table,
|
|
147
|
+
// and a next-step line. Same shape every session — the skill relays this stdout
|
|
148
|
+
// verbatim, which is what removes the per-session re-summarizing drift.
|
|
149
|
+
|
|
150
|
+
// Shared status selection — single source of truth for what the quiet status
|
|
151
|
+
// line shows, so the markdown line and the widget render the same thing.
|
|
152
|
+
// Surfaces the versions with real momentum: drop not-yet-started (0%) ones,
|
|
153
|
+
// lead with the most-progressed, so a dormant planning version doesn't crowd
|
|
154
|
+
// out the one actually being built.
|
|
155
|
+
function statusParts({ progress, recentShipped, inboxCount, blockerCount }) {
|
|
156
|
+
let versions = [];
|
|
157
|
+
if (Array.isArray(progress) && progress.length) {
|
|
158
|
+
let active = progress.filter((v) => v.status === 'building');
|
|
159
|
+
if (active.length === 0) active = progress.filter((v) => v.status !== 'shipped');
|
|
160
|
+
versions = active
|
|
161
|
+
.filter((v) => Number(v.percent_complete) > 0)
|
|
162
|
+
.sort((a, b) => Number(b.percent_complete) - Number(a.percent_complete))
|
|
163
|
+
.slice(0, 2)
|
|
164
|
+
.map((v) => ({ id: v.version_id, pct: Number(v.percent_complete) }));
|
|
165
|
+
}
|
|
166
|
+
let ships24 = null;
|
|
167
|
+
if (Array.isArray(recentShipped)) {
|
|
168
|
+
const cutoff = Date.now() - 24 * 60 * 60 * 1000;
|
|
169
|
+
ships24 = recentShipped.filter((t) => t.shipped_at && Date.parse(t.shipped_at) >= cutoff).length;
|
|
170
|
+
}
|
|
171
|
+
return { versions, ships24, ideas: inboxCount, blockers: blockerCount };
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// One muted line of ambient status (markdown). Italic so the feed renders it
|
|
175
|
+
// quiet. null if empty.
|
|
176
|
+
function quietStatusLine(header) {
|
|
177
|
+
const { versions, ships24, ideas, blockers } = statusParts(header);
|
|
178
|
+
const parts = [];
|
|
179
|
+
for (const v of versions) parts.push(`${v.id} ${progressBar(v.pct, 8)} ${v.pct}%`);
|
|
180
|
+
if (ships24 != null) parts.push(`${ships24} ship${ships24 === 1 ? '' : 's'}/24h`);
|
|
181
|
+
if (ideas != null) parts.push(`${ideas} idea${ideas === 1 ? '' : 's'} in inbox`);
|
|
182
|
+
if (blockers != null) parts.push(`${blockers} open blocker${blockers === 1 ? '' : 's'}`);
|
|
183
|
+
if (parts.length === 0) return null;
|
|
184
|
+
return surface.em(parts.join(' · '));
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Calibrated estimate, compact: ~8m / ~2h / ~1.5h.
|
|
188
|
+
function estimateShort(t) {
|
|
189
|
+
const m = t.est_minutes_calibrated != null ? t.est_minutes_calibrated : t.est_minutes;
|
|
190
|
+
if (m == null) return '—';
|
|
191
|
+
if (m < 60) return `~${m}m`;
|
|
192
|
+
const h = m / 60;
|
|
193
|
+
return Number.isInteger(h) ? `~${h}h` : `~${h.toFixed(1)}h`;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function clip(s, n) {
|
|
197
|
+
s = String(s == null ? '' : s).replace(/\s+/g, ' ').trim();
|
|
198
|
+
return s.length > n ? s.slice(0, n - 1) + '…' : s;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Escape pipes so a title can't break the markdown table.
|
|
202
|
+
function cell(s) {
|
|
203
|
+
return String(s == null ? '' : s).replace(/\|/g, '\\|');
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Per-column values, shared by the markdown table and the widget. Version
|
|
207
|
+
// (V2 / GDS-V4) is its own column; Type is the work lane (Engineer / Artist /
|
|
208
|
+
// Ideator), its own column rather than baked into the title.
|
|
209
|
+
// task 1003936: ONE word for this axis — Role, per ADR 0174 Decision 5. The hall's
|
|
210
|
+
// copy of this lives in modules/hall-ui/public/dom-utils.js (OTB.roleLabel); this
|
|
211
|
+
// card is a separate runtime and cannot read it, so the word is restated here and
|
|
212
|
+
// nowhere else in this file. 'ui' keeps its upper case, as the hall's does.
|
|
213
|
+
const ROLE_AXIS_LABEL = 'Role';
|
|
214
|
+
function roleLabel(t) {
|
|
215
|
+
const d = t.discipline;
|
|
216
|
+
if (!d || d === 'unclassified') return '';
|
|
217
|
+
return d === 'ui' ? 'UI' : d.charAt(0).toUpperCase() + d.slice(1);
|
|
218
|
+
}
|
|
219
|
+
// Per-lane accent — the OTB palette (sea / terracotta / olive); mid-ramp hexes
|
|
220
|
+
// that read in both light and dark. Colours the Type column so the work lane
|
|
221
|
+
// reads at a glance (task 1273 follow-up: "spice up the view").
|
|
222
|
+
function disciplineColor(d) {
|
|
223
|
+
if (d === 'engineer') return '#1D9E75'; // sea-teal
|
|
224
|
+
if (d === 'artist') return '#D85A30'; // terracotta
|
|
225
|
+
if (d === 'ideator') return '#639922'; // olive
|
|
226
|
+
return '#888780'; // unclassified — neutral gray
|
|
227
|
+
}
|
|
228
|
+
function whatItIs(t) {
|
|
229
|
+
return clip(t.title, 64);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// The claimable table — # / Version / Type / Reward / Est. / What it is.
|
|
233
|
+
// Ids are emitted as hall links (renders as a clean #N) — a bare "#NNN" in a
|
|
234
|
+
// relayed chat message autolinks to GitHub and 404s (CLAUDE.md ref rule).
|
|
235
|
+
const surface = require('./surface');
|
|
236
|
+
const startGoals = require('./start-goals');
|
|
237
|
+
const HALL_TASK = `${hallBase()}#/task/`;
|
|
238
|
+
function claimableTable(rows, rewardFromServer, goals) {
|
|
239
|
+
// On a cost-plus-only instance the Reward column is an advertised estimate that
|
|
240
|
+
// is never paid — say so in the header so the column can't read as a promise,
|
|
241
|
+
// and footnote what IS paid below the table (task 1002469).
|
|
242
|
+
const perTask = rewardPolicy(rewardFromServer).perTaskCredit;
|
|
243
|
+
const rewardHead = perTask ? 'Reward' : 'Reward (est.)';
|
|
244
|
+
const headers = ['#', 'Version', ROLE_AXIS_LABEL, rewardHead, 'Est.', 'What it is'];
|
|
245
|
+
const rowCells = (t) => [
|
|
246
|
+
surface.taskRef(t.id, HALL_TASK),
|
|
247
|
+
cell(t.version_id || '?'),
|
|
248
|
+
cell(roleLabel(t) || '—'),
|
|
249
|
+
`${t.credits_reward ?? 0}c`,
|
|
250
|
+
estimateShort(t),
|
|
251
|
+
cell(whatItIs(t)),
|
|
252
|
+
];
|
|
253
|
+
// task 1002852: one table per goal, each under its goal's name; goal-less work
|
|
254
|
+
// last under "Other work". An empty goal list (a failed read) still groups by id.
|
|
255
|
+
const out = [];
|
|
256
|
+
for (const g of startGoals.groupByGoal(rows, goals)) {
|
|
257
|
+
if (out.length) out.push('');
|
|
258
|
+
out.push(surface.strong(g.title) + (g.joined ? ' · your goal' : ''), surface.table(headers, g.rows.map(rowCells)));
|
|
259
|
+
}
|
|
260
|
+
const cpNote = costPlusOnlyNote(rewardFromServer);
|
|
261
|
+
if (cpNote) out.push('', surface.em(cpNote));
|
|
262
|
+
return out.join('\n');
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// ---------- widget renderer (task 1273) ----------
|
|
266
|
+
// `--widget` emits this self-contained HTML on stdout; the skill pipes it
|
|
267
|
+
// straight to the app's widget renderer (show_widget). Script-owned markup =
|
|
268
|
+
// the same card every time, app-native. Falls back to the markdown card when
|
|
269
|
+
// the client can't draw widgets. Design system: flat, 0.5px borders, CSS
|
|
270
|
+
// theme vars (light/dark), Tabler icons, no emoji.
|
|
271
|
+
const hesc = (s) => String(s == null ? '' : s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
272
|
+
const jsq = (s) => String(s == null ? '' : s).replace(/\\/g, '\\\\').replace(/'/g, "\\'").replace(/\n/g, ' ');
|
|
273
|
+
|
|
274
|
+
function miniBar(pct) {
|
|
275
|
+
// Fill tinted OTB sea-teal so the status line carries a little of the brand.
|
|
276
|
+
// Class-based (task 1279 efficiency pass): the .bs-* rules live in WIDGET_STYLE,
|
|
277
|
+
// so this markup is only meaningful inside the widget renderWidget emits.
|
|
278
|
+
return `<span class="bs-bar"><span class="bs-barfill" style="width:${pct}%;"></span></span>`;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// ---------- owed-rebase warning (ADR 0120 part 5) ----------
|
|
282
|
+
// The builder's un-landed confirmed tasks the publish-reconciler flagged
|
|
283
|
+
// needs_rebase (part 2). They GATE new claims (part 3: claimTask refuses with
|
|
284
|
+
// REBASE_REQUIRED) and their per-task reward now lands only on ship (part 1),
|
|
285
|
+
// so this is the single most urgent thing to show at session start — rendered
|
|
286
|
+
// prominently, before the claimable table, in both the markdown card and the
|
|
287
|
+
// widget. /me carries them as `needs_rebase_tasks` (each { id, title, … }).
|
|
288
|
+
// Refs use the `task N` form, NEVER a bare "#N" (a bare #N in relayed chat
|
|
289
|
+
// autolinks to GitHub issues and 404s — the CLAUDE.md linkify rule).
|
|
290
|
+
|
|
291
|
+
// Normalize the /me list into a small render model, or null when nothing is
|
|
292
|
+
// owed. Shared by the markdown + widget renderers and unit-tested directly
|
|
293
|
+
// (no live server needed).
|
|
294
|
+
function rebaseWarningModel(needsRebaseTasks) {
|
|
295
|
+
const owed = Array.isArray(needsRebaseTasks)
|
|
296
|
+
? needsRebaseTasks.filter((t) => t && t.id != null)
|
|
297
|
+
: [];
|
|
298
|
+
if (owed.length === 0) return null;
|
|
299
|
+
const n = owed.length;
|
|
300
|
+
return {
|
|
301
|
+
count: n,
|
|
302
|
+
refs: owed.map((t) => `task ${t.id}`).join(', '),
|
|
303
|
+
noun: n === 1 ? 'task' : 'tasks',
|
|
304
|
+
pronoun: n === 1 ? 'it' : 'them',
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// The markdown warning line (prominent, before the claimable table), or null
|
|
309
|
+
// when nothing is owed.
|
|
310
|
+
function rebaseWarningMarkdown(needsRebaseTasks) {
|
|
311
|
+
const w = rebaseWarningModel(needsRebaseTasks);
|
|
312
|
+
if (!w) return null;
|
|
313
|
+
return `⚠️ ${surface.strong('Land owed — your queue is GATED.')} ${w.count} ${w.noun} can't land and block new claims`
|
|
314
|
+
+ ` until you ${surface.code('git merge origin/main')} + re-ship (or ${surface.code(surface.action('release'))}) ${w.pronoun}: ${w.refs}.`
|
|
315
|
+
+ ' Merge, never rebase — a published branch that is rewritten cannot be pushed again (task 1002788).';
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// The widget warning block (Tabler alert icon, danger-tinted), or '' when none.
|
|
319
|
+
function rebaseWarningWidget(needsRebaseTasks) {
|
|
320
|
+
const w = rebaseWarningModel(needsRebaseTasks);
|
|
321
|
+
if (!w) return '';
|
|
322
|
+
return `<div class="bs-warn"><i class="ti ti-alert-triangle" aria-hidden="true"></i>`
|
|
323
|
+
+ `<span><strong>Land owed — your queue is GATED.</strong> ${w.count} ${w.noun} can't land and block new claims until you <code>git merge origin/main</code> + re-ship (or /builder-release) ${w.pronoun}: ${hesc(w.refs)}. Merge, never rebase — a published branch that is rewritten cannot be pushed again (task 1002788).</span></div>`;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Run console.log-based helpers (printCostWarning/printOnboardingNudge) without
|
|
327
|
+
// polluting stdout (which must be pure HTML in --widget mode); return the lines.
|
|
328
|
+
function captureLog(fn) {
|
|
329
|
+
const orig = console.log;
|
|
330
|
+
const lines = [];
|
|
331
|
+
console.log = (...a) => lines.push(a.join(' '));
|
|
332
|
+
try { fn(); } finally { console.log = orig; }
|
|
333
|
+
return lines;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// task 1282: reinforce the relay contract IN-BAND, not just in the skill. The
|
|
337
|
+
// rule — render/print the card verbatim, then stop; don't rebuild it into prose
|
|
338
|
+
// + tables + a recommendation — used to live ONLY in SKILL.md (advisory), so a
|
|
339
|
+
// model in old habits (or a stale checkout's old skill) reverted to hand-built
|
|
340
|
+
// tables. This emits a one-line `[otb-card]` directive on STDERR (stdout stays
|
|
341
|
+
// pure HTML/markdown, so the show_widget pipe + the skill's first-char branch
|
|
342
|
+
// are untouched). The skill treats `[otb-card]` stderr lines as instructions
|
|
343
|
+
// for itself and never relays them to the user. Mirrors the ship card.
|
|
344
|
+
const CARD_DIRECTIVE = {
|
|
345
|
+
html: '[otb-card] stdout is the finished /builder-start card (HTML). Render it verbatim via show_widget, then stop — no extra tables, recommendation, nudge, or recap.',
|
|
346
|
+
markdown: '[otb-card] stdout is the finished /builder-start card (markdown). Output it verbatim as your reply, then stop — no rebuilt table, recommendation, nudge, or recap.',
|
|
347
|
+
};
|
|
348
|
+
function emitCardDirective(form) {
|
|
349
|
+
// Addressed to the model, not the reader. A terminal user has no card to relay and no
|
|
350
|
+
// show_widget to call, so this line is pure confusion there (task 1003680).
|
|
351
|
+
if (surface.isTerminal()) return;
|
|
352
|
+
process.stderr.write(CARD_DIRECTIVE[form] + '\n');
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// task 1279 efficiency pass: the /builder-start widget used to inline a full
|
|
356
|
+
// style="…" on every one of its ~30+ elements — the 7×N claimable grid was the
|
|
357
|
+
// bulk — making the HTML the agent must relay verbatim ~18.7KB. Hoisting the
|
|
358
|
+
// repeated rules into one class block (the pattern the ship card already uses)
|
|
359
|
+
// cuts that markup substantially with byte-identical rendering. Classes are
|
|
360
|
+
// `.bs-*` (builder-start) so they can't collide with the ship card's `.cc-*`.
|
|
361
|
+
const WIDGET_STYLE = `<style>
|
|
362
|
+
.bs-sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;}
|
|
363
|
+
.bs-card{background:var(--color-background-primary);border:0.5px solid var(--color-border-tertiary);border-radius:var(--border-radius-lg);padding:1rem 1.25rem;font-family:var(--font-sans);}
|
|
364
|
+
.bs-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;}
|
|
365
|
+
.bs-brand{display:inline-flex;align-items:center;gap:8px;}
|
|
366
|
+
.bs-title{font-size:16px;font-weight:500;}
|
|
367
|
+
.bs-title i{font-size:16px;vertical-align:-2px;margin-right:6px;color:#D85A30;}
|
|
368
|
+
.bs-meta{font-size:13px;color:var(--color-text-secondary);}
|
|
369
|
+
.bs-status{font-size:13px;color:var(--color-text-secondary);margin-top:8px;display:flex;flex-wrap:wrap;gap:4px 12px;align-items:center;}
|
|
370
|
+
.bs-dot{color:var(--color-text-tertiary);}
|
|
371
|
+
.bs-bar{display:inline-block;width:34px;height:5px;border-radius:3px;background:var(--color-border-tertiary);overflow:hidden;vertical-align:middle;}
|
|
372
|
+
.bs-barfill{display:block;height:100%;background:#1D9E75;}
|
|
373
|
+
.bs-warn{display:flex;gap:8px;align-items:flex-start;font-size:13px;margin-top:8px;padding:8px 10px;border-radius:var(--border-radius-md);background:var(--color-background-danger);color:var(--color-text-danger);}
|
|
374
|
+
.bs-warn i{font-size:15px;flex:none;margin-top:1px;}
|
|
375
|
+
.bs-line{font-size:13px;color:var(--color-text-secondary);margin-top:8px;}
|
|
376
|
+
.bs-line i{font-size:14px;vertical-align:-2px;margin-right:4px;}
|
|
377
|
+
.bs-holditem{margin-top:4px;padding-left:18px;}
|
|
378
|
+
.bs-link{color:var(--color-text-secondary);}
|
|
379
|
+
.bs-menuh{font-size:13px;color:var(--color-text-primary);margin-top:14px;margin-bottom:2px;font-weight:500;}
|
|
380
|
+
.bs-table{width:100%;border-collapse:collapse;table-layout:fixed;font-size:13px;margin-top:4px;}
|
|
381
|
+
.bs-thead{text-align:left;color:var(--color-text-tertiary);font-size:12px;}
|
|
382
|
+
.bs-th{padding:0 6px 4px;font-weight:400;}
|
|
383
|
+
.bs-tr{cursor:pointer;}
|
|
384
|
+
.bs-group td{padding:10px 0 4px;font-size:12px;font-weight:500;color:var(--color-text-secondary);}
|
|
385
|
+
.bs-td{padding:7px 6px;border-top:0.5px solid var(--color-border-tertiary);}
|
|
386
|
+
.bs-id{color:var(--color-text-secondary);font-family:var(--font-mono);font-size:12px;}
|
|
387
|
+
.bs-nowrap{white-space:nowrap;}
|
|
388
|
+
.bs-ellip{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
|
389
|
+
.bs-ellip-sub{color:var(--color-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
|
|
390
|
+
.bs-sub{color:var(--color-text-secondary);}
|
|
391
|
+
.bs-lane{display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:6px;vertical-align:middle;}
|
|
392
|
+
.bs-foot{font-size:13px;color:var(--color-text-tertiary);margin-top:12px;}
|
|
393
|
+
</style>`;
|
|
394
|
+
|
|
395
|
+
function renderWidget({ builder, claims, claimable, total, streak, recommendations, header, routingByPreference, preferred, filters, readyToClose, needsRebaseTasks, goals, yourGoals }) {
|
|
396
|
+
const b = builder || {};
|
|
397
|
+
// ADR 0120 part 5: the owed-rebase gate warning, rendered at the top of the
|
|
398
|
+
// card (before status/holdings) since it blocks new claims. '' when none owed.
|
|
399
|
+
const rebaseRow = rebaseWarningWidget(needsRebaseTasks);
|
|
400
|
+
// Streak badge — warm amber, the one bold pop of colour + the motivational
|
|
401
|
+
// stat. Shown only on an active (>0) streak; tooltip carries the record.
|
|
402
|
+
// (Singular element — left inline; the savings live in the repeated grid.)
|
|
403
|
+
const streakBadge = (streak && Number(streak.current) > 0)
|
|
404
|
+
? `<span title="Longest streak: ${Number(streak.longest) || 0} days" style="display:inline-flex;align-items:center;gap:4px;background:var(--color-background-warning);color:var(--color-text-warning);font-size:12px;font-weight:500;padding:2px 8px;border-radius:var(--border-radius-md);"><i class="ti ti-flame" aria-hidden="true" style="font-size:13px;"></i>${Number(streak.current)}-day streak</span>`
|
|
405
|
+
: '';
|
|
406
|
+
const rank = b.rank ? b.rank[0].toUpperCase() + b.rank.slice(1) : 'Thetes';
|
|
407
|
+
const disc = (b.preferred_disciplines && b.preferred_disciplines.length) ? b.preferred_disciplines.join(' + ') : 'all disciplines';
|
|
408
|
+
const credits = Number(b.total_credits || 0).toLocaleString();
|
|
409
|
+
const TH = (label) => `<th class="bs-th">${label}</th>`;
|
|
410
|
+
const TD = (inner, cls = '') => `<td class="bs-td${cls ? ' ' + cls : ''}">${inner}</td>`;
|
|
411
|
+
|
|
412
|
+
// status line
|
|
413
|
+
const { versions, ships24, ideas, blockers } = statusParts(header);
|
|
414
|
+
const sBits = [];
|
|
415
|
+
for (const v of versions) sBits.push(`${hesc(v.id)} ${miniBar(v.pct)} ${v.pct}%`);
|
|
416
|
+
if (ships24 != null) sBits.push(`${ships24} ship${ships24 === 1 ? '' : 's'}/24h`);
|
|
417
|
+
if (ideas != null) sBits.push(`${ideas} idea${ideas === 1 ? '' : 's'}`);
|
|
418
|
+
if (blockers != null) sBits.push(`${blockers} blocker${blockers === 1 ? '' : 's'}`);
|
|
419
|
+
const statusRow = sBits.length
|
|
420
|
+
? `<div class="bs-status">${sBits.join('<span class="bs-dot">·</span>')}</div>`
|
|
421
|
+
: '';
|
|
422
|
+
|
|
423
|
+
// holdings — each held task gets quick actions off it (ship / release /
|
|
424
|
+
// open). Parallel sessions under one builder are normal, so this informs.
|
|
425
|
+
const hallUrl = (id) => `${hallBase()}#/task/${encodeURIComponent(id)}`;
|
|
426
|
+
const dot = '<span class="bs-dot"> · </span>';
|
|
427
|
+
const act = (label, msg) => `<a href="#" onclick="event.preventDefault();sendPrompt('${jsq(msg)}')" class="bs-link">${label} ↗</a>`;
|
|
428
|
+
const actionsFor = (c) => `${act('Ship', 'Ship task ' + c.task_id)}${dot}${act('Release', 'Release task ' + c.task_id)}${dot}<a href="${hesc(hallUrl(c.task_id))}" class="bs-link">Open ↗</a>`;
|
|
429
|
+
let holdings = '';
|
|
430
|
+
if (claims.length === 1) {
|
|
431
|
+
const c = claims[0];
|
|
432
|
+
holdings = `<div class="bs-line"><i class="ti ti-bookmark" aria-hidden="true"></i>Holding #${hesc(c.task_id)} — ${hesc(clip(c.title, 44))}${dot}${actionsFor(c)}</div>`;
|
|
433
|
+
} else if (claims.length > 1) {
|
|
434
|
+
const items = claims.map((c) => `<div class="bs-holditem">#${hesc(c.task_id)} — ${hesc(clip(c.title, 38))}${dot}${actionsFor(c)}</div>`).join('');
|
|
435
|
+
holdings = `<div class="bs-line"><i class="ti ti-bookmark" aria-hidden="true"></i>Holding ${claims.length} claims (parallel sessions OK):${items}</div>`;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// version-close banner (rare, Archon action)
|
|
439
|
+
const closeBanner = (readyToClose || []).map((s) =>
|
|
440
|
+
`<div class="bs-line"><i class="ti ti-flag" aria-hidden="true"></i>${hesc(s.versionId)} looks ready to close (${s.criteriaSatisfied}/${s.criteriaTotal} criteria, ${s.percentComplete}%) — <a href="#" onclick="event.preventDefault();sendPrompt('${jsq('/builder-version-close ' + s.versionId)}')" class="bs-link">close it ↗</a></div>`
|
|
441
|
+
).join('');
|
|
442
|
+
|
|
443
|
+
// menu header note
|
|
444
|
+
const matched = routingByPreference ? ` matched to ${hesc(preferred.join(' + '))}` : '';
|
|
445
|
+
const fBits = [
|
|
446
|
+
filters.version && `in ${filters.version}`,
|
|
447
|
+
filters.discipline && `discipline=${filters.discipline}`,
|
|
448
|
+
filters.fit && `fit=${filters.fit}`,
|
|
449
|
+
].filter(Boolean);
|
|
450
|
+
const fNote = fBits.length ? ` (${hesc(fBits.join(', '))})` : '';
|
|
451
|
+
|
|
452
|
+
// rows — click to claim. Columns: # / Version / Type / Reward /
|
|
453
|
+
// Est. / What it is (the work lane is its own column, not baked into the title).
|
|
454
|
+
const taskRow = (t) => {
|
|
455
|
+
const claimMsg = jsq(`Claim task ${t.id}`);
|
|
456
|
+
const titleAttr = hesc(`Claim #${t.id}: ${t.title || ''}`);
|
|
457
|
+
const d = t.discipline;
|
|
458
|
+
const laneDot = (d && d !== 'unclassified')
|
|
459
|
+
? `<span class="bs-lane" style="background:${disciplineColor(d)};"></span>`
|
|
460
|
+
: '';
|
|
461
|
+
return `<tr class="bs-tr" role="button" tabindex="0" title="${titleAttr}" onclick="sendPrompt('${claimMsg}')" onkeydown="if(event.key==='Enter'||event.key===' '){event.preventDefault();sendPrompt('${claimMsg}')}">`
|
|
462
|
+
+ TD(`#${hesc(t.id)}`, 'bs-id')
|
|
463
|
+
+ TD(hesc(t.version_id || '?'), 'bs-nowrap')
|
|
464
|
+
+ TD(`${laneDot}${hesc(roleLabel(t) || '—')}`, 'bs-ellip-sub')
|
|
465
|
+
+ TD(hesc((t.credits_reward ?? 0) + 'c'))
|
|
466
|
+
+ TD(hesc(estimateShort(t)), 'bs-sub')
|
|
467
|
+
+ TD(hesc(t.title || ''), 'bs-ellip')
|
|
468
|
+
+ `</tr>`;
|
|
469
|
+
};
|
|
470
|
+
// task 1002852: the same rows, grouped under each task's goal ("Other work" last).
|
|
471
|
+
const rows = startGoals.groupByGoal(claimable, goals).map((g) =>
|
|
472
|
+
`<tr class="bs-group"><td colspan="6">${hesc(g.title)}${g.joined ? '<span class="bs-sub"> · your goal</span>' : ''}</td></tr>`
|
|
473
|
+
+ g.rows.map(taskRow).join('')).join('');
|
|
474
|
+
// task 1002852: the goals this builder joined, ABOVE the table (never instead of it).
|
|
475
|
+
const goalsBlock = yourGoals.goals.length
|
|
476
|
+
? `<div class="bs-menuh">Your goals</div>${yourGoals.goals.map((g) =>
|
|
477
|
+
`<div class="bs-line"><i class="ti ti-target" aria-hidden="true"></i>${hesc(clip(g.title, 60))}<span class="bs-dot"> · </span><span class="bs-sub">${hesc(startGoals.claimableWord(g.claimable))}</span></div>`).join('')}${yourGoals.more ? `<div class="bs-line bs-sub">and ${yourGoals.more} more</div>` : ''}`
|
|
478
|
+
: '';
|
|
479
|
+
|
|
480
|
+
const menu = claimable.length
|
|
481
|
+
? `<table class="bs-table">
|
|
482
|
+
<colgroup><col style="width:44px;"><col style="width:52px;"><col style="width:68px;"><col style="width:48px;"><col style="width:44px;"><col></colgroup>
|
|
483
|
+
<thead><tr class="bs-thead">${TH('#')}${TH('Version')}${TH(ROLE_AXIS_LABEL)}${TH('Reward')}${TH('Est.')}${TH('What it is')}</tr></thead>
|
|
484
|
+
<tbody>${rows}</tbody>
|
|
485
|
+
</table>`
|
|
486
|
+
: `<div class="bs-line">Nothing claimable right now — everything is in flight, blocked, or shipped. <a href="#" onclick="event.preventDefault();sendPrompt('Run blocker-review')" class="bs-link">See what's stuck ↗</a></div>`;
|
|
487
|
+
|
|
488
|
+
// footer actions: a "more" link when the list was capped, then the
|
|
489
|
+
// cross-lane pointer. (The old "just exploring" link was dropped — not
|
|
490
|
+
// picking is already "not claiming"; task 1273 follow-up.)
|
|
491
|
+
const moreCount = Math.max(0, (total || claimable.length) - claimable.length);
|
|
492
|
+
const moreLink = moreCount > 0
|
|
493
|
+
? ` · <a href="#" onclick="event.preventDefault();sendPrompt('${jsq('Show me all ' + (total || '') + ' claimable tasks, not just the top ' + claimable.length)}')" class="bs-link">${moreCount} more — show all ↗</a>`
|
|
494
|
+
: '';
|
|
495
|
+
let crossLane = '';
|
|
496
|
+
if (recommendations.length > 0) {
|
|
497
|
+
const ids = recommendations.map((t) => '#' + t.id).join(', ');
|
|
498
|
+
crossLane = ` · <a href="#" onclick="event.preventDefault();sendPrompt('${jsq('Show me the tasks outside my disciplines: ' + ids)}')" class="bs-link">Outside your roles: ${hesc(ids)} ↗</a>`;
|
|
499
|
+
} else if (routingByPreference) {
|
|
500
|
+
crossLane = ` · <a href="#" onclick="event.preventDefault();sendPrompt('Show me every role, not just mine')" class="bs-link">Show all roles ↗</a>`;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
const summary = `builder-start: ${claimable.length} task${claimable.length === 1 ? '' : 's'} you can claim now, plus your current build status. Click a task to claim it.`;
|
|
504
|
+
return `${WIDGET_STYLE}
|
|
505
|
+
<h2 class="bs-sr">${hesc(summary)}</h2>
|
|
506
|
+
<div class="bs-card">
|
|
507
|
+
<div class="bs-head">
|
|
508
|
+
<span class="bs-brand"><span class="bs-title"><i class="ti ti-player-play" aria-hidden="true"></i>builder-start</span>${streakBadge}</span>
|
|
509
|
+
<span class="bs-meta">${hesc(b.github_login)} · ${hesc(rank)} · ${hesc(credits)} credits · ${hesc(disc)}</span>
|
|
510
|
+
</div>
|
|
511
|
+
${rebaseRow}
|
|
512
|
+
${statusRow}
|
|
513
|
+
${holdings}
|
|
514
|
+
${closeBanner}
|
|
515
|
+
${goalsBlock}
|
|
516
|
+
<div class="bs-menuh">Claim one to start — ${total || claimable.length} ready for you right now${matched}${fNote}</div>
|
|
517
|
+
${menu}
|
|
518
|
+
<div class="bs-foot">Click a task to claim it${moreLink}${crossLane}</div>
|
|
519
|
+
</div>`;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
// Cross-discipline recommendations — mirror of
|
|
523
|
+
// rankCrossDisciplineRecommendations in modules/lifecycle/db-tasks.js (the
|
|
524
|
+
// canonical copy; it moved there from src/bongos/db.js in the twelve-unit
|
|
525
|
+
// carve). Given the full claimable list and the builder's
|
|
526
|
+
// preferred_disciplines, return up to `limit` tasks whose discipline is OUTSIDE
|
|
527
|
+
// the builder's preferences, ranked:
|
|
528
|
+
// priority ASC (unset last), credits/min DESC, est_minutes ASC, id ASC.
|
|
529
|
+
// Priority 1 is the MOST urgent — the DB's own convention (CHECK (priority
|
|
530
|
+
// BETWEEN 1 AND 5), weighted 6 - COALESCE(priority, 5)); an unset priority
|
|
531
|
+
// sorts after an explicit P5, never ahead of a P1.
|
|
532
|
+
// 'unclassified' tasks are excluded (un-triaged, not a real lane). Empty
|
|
533
|
+
// preferences → [] (everything is already in the main list; nothing outside).
|
|
534
|
+
// This copy and the canonical one are pinned together by
|
|
535
|
+
// tests/cross_discipline_priority_direction.mjs — change one, change the other.
|
|
536
|
+
function rankCrossDisciplineRecommendations(claimable, preferredDisciplines, limit = 3) {
|
|
537
|
+
const rows = Array.isArray(claimable) ? claimable : [];
|
|
538
|
+
const prefs = Array.isArray(preferredDisciplines) ? preferredDisciplines : [];
|
|
539
|
+
if (prefs.length === 0) return [];
|
|
540
|
+
const prefSet = new Set(prefs);
|
|
541
|
+
const cpm = (t) => {
|
|
542
|
+
const credits = Number(t.credits_reward) || 0;
|
|
543
|
+
const mins = Number(t.est_minutes_calibrated ?? t.est_minutes) || 0;
|
|
544
|
+
return mins > 0 ? credits / mins : 0;
|
|
545
|
+
};
|
|
546
|
+
// `ASC NULLS LAST` in JS — an absent/blank/non-numeric priority sorts after
|
|
547
|
+
// every explicit 1..5. Not `Number(t.priority) || 0`: that maps NULL to 0,
|
|
548
|
+
// which under an ascending sort outranks a P1.
|
|
549
|
+
const prio = (t) => {
|
|
550
|
+
if (t.priority === null || t.priority === undefined || t.priority === '') return Infinity;
|
|
551
|
+
const n = Number(t.priority);
|
|
552
|
+
return Number.isFinite(n) ? n : Infinity;
|
|
553
|
+
};
|
|
554
|
+
const outside = rows.filter(
|
|
555
|
+
(t) => t.discipline && t.discipline !== 'unclassified' && !prefSet.has(t.discipline)
|
|
556
|
+
);
|
|
557
|
+
outside.sort((a, b) => {
|
|
558
|
+
const pa = prio(a);
|
|
559
|
+
const pb = prio(b);
|
|
560
|
+
if (pa !== pb) return pa - pb;
|
|
561
|
+
const ca = cpm(a);
|
|
562
|
+
const cb = cpm(b);
|
|
563
|
+
if (cb !== ca) return cb - ca;
|
|
564
|
+
const ma = Number(a.est_minutes_calibrated ?? a.est_minutes) || Infinity;
|
|
565
|
+
const mb = Number(b.est_minutes_calibrated ?? b.est_minutes) || Infinity;
|
|
566
|
+
if (ma !== mb) return ma - mb;
|
|
567
|
+
return (Number(a.id) || 0) - (Number(b.id) || 0);
|
|
568
|
+
});
|
|
569
|
+
return outside.slice(0, Math.max(0, limit));
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
// ---------- environment guard (task 1002403 / goal 1000052) ----------
|
|
573
|
+
// /builder-start is often the FIRST command run in a freshly-cloned instance —
|
|
574
|
+
// before the local server has ever been brought up. When the API can't be
|
|
575
|
+
// reached, guide the builder to the one-command bring-up instead of dying with a
|
|
576
|
+
// raw fetch stack trace (the old failure). The generated client REJECTS on a
|
|
577
|
+
// network error even under throwOnError:false (see clients/bongos-client), so the
|
|
578
|
+
// Promise.all in main() throws into the guard below. Wrong-instance (exit 3) and
|
|
579
|
+
// no-session (exit 2) are handled upstream in cliClient()/apiCall, and the
|
|
580
|
+
// builder-start skill routes those + the pre-install "bongos not found" case.
|
|
581
|
+
function isConnectionError(err) {
|
|
582
|
+
if (!err) return false;
|
|
583
|
+
// task 1002670: a dispatcher/argument bug (e.g. a vendored undici Agent the
|
|
584
|
+
// built-in fetch rejects with UND_ERR_INVALID_ARG) throws before any network
|
|
585
|
+
// I/O. That is a CLIENT bug — never present it as "instance isn't reachable".
|
|
586
|
+
if (isDispatcherIncompatError(err)) return false;
|
|
587
|
+
const codes = ['ECONNREFUSED', 'ENOTFOUND', 'ECONNRESET', 'EAI_AGAIN', 'ETIMEDOUT', 'UND_ERR_CONNECT_TIMEOUT', 'UND_ERR_SOCKET'];
|
|
588
|
+
const code = err.code || (err.cause && err.cause.code) || '';
|
|
589
|
+
if (codes.includes(code)) return true;
|
|
590
|
+
const msg = `${err.message || ''} ${(err.cause && err.cause.message) || ''}`;
|
|
591
|
+
return /fetch failed|ECONNREFUSED|ENOTFOUND|EAI_AGAIN|network|socket hang up/i.test(msg);
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
// isLocalOrigin — does this origin name a server THIS MACHINE is supposed to run?
|
|
595
|
+
// The whole shape of the unreachable-instance advice turns on it, so it is its own
|
|
596
|
+
// named predicate rather than an inline regex (task 1003675). Anything that is not
|
|
597
|
+
// recognisably loopback is treated as REMOTE: guessing "local" for a hosted board
|
|
598
|
+
// is the failure this exists to prevent, and the remote branch degrades gracefully
|
|
599
|
+
// (it points at a URL) while the local branch would tell someone to stand up a
|
|
600
|
+
// second, empty instance.
|
|
601
|
+
function isLocalOrigin(origin) {
|
|
602
|
+
if (!origin) return true; // nothing to go on → the old local-first wording
|
|
603
|
+
let host;
|
|
604
|
+
try { host = new URL(origin).hostname.toLowerCase(); } catch (_) { return false; }
|
|
605
|
+
return host === 'localhost' || host.endsWith('.localhost')
|
|
606
|
+
|| host === '127.0.0.1' || host.startsWith('127.') || host === '::1' || host === '[::1]';
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
// The guided "instance isn't running" card. Markdown (never leads with `<`), so
|
|
610
|
+
// the builder-start skill relays it verbatim even in --widget mode.
|
|
611
|
+
//
|
|
612
|
+
// It branches on WHERE THE BOARD LIVES, because the same words are actively
|
|
613
|
+
// harmful in the two cases (task 1003675 — the owner hit this twice on a hosted
|
|
614
|
+
// instance). A HOSTED instance is not this machine's server to start: `bongos dev`
|
|
615
|
+
// would stand up a separate LOCAL instance with its OWN EMPTY DATABASE, so a
|
|
616
|
+
// builder who follows it obediently arrives at a board that is not theirs and the
|
|
617
|
+
// real outage stays hidden behind it. The hosted branch therefore leads with the
|
|
618
|
+
// thing that needs nothing installed — the board is a website — and offers the
|
|
619
|
+
// health probe instead of a bring-up.
|
|
620
|
+
//
|
|
621
|
+
// The local branch is unchanged, and still tailors its first step to whether deps
|
|
622
|
+
// are installed: a fresh clone needs `npm install` before the `bongos` CLI (which
|
|
623
|
+
// ships inside the PRIVATE @bongos/core package) even exists.
|
|
624
|
+
function instanceNotRunningCard({ origin, depsMissing } = {}) {
|
|
625
|
+
const out = [];
|
|
626
|
+
out.push(surface.strong("builder-start — this instance isn't reachable yet"));
|
|
627
|
+
out.push('');
|
|
628
|
+
|
|
629
|
+
if (!isLocalOrigin(origin)) {
|
|
630
|
+
out.push(`I couldn't reach ${surface.code(origin)}. That instance is ${surface.strong('hosted')} — it isn't this machine's server to start, so there's nothing to bring up here.`);
|
|
631
|
+
out.push('');
|
|
632
|
+
out.push(`1. ${surface.strong('The board is a website, and it needs nothing installed')} — open ${origin}/builders to see and claim work right now.`);
|
|
633
|
+
out.push(`2. If that doesn't load either, the instance itself is down: \`curl -sI ${origin}/healthz\` says whether it's answering.`);
|
|
634
|
+
out.push(`3. Once it answers, re-run ${surface.code(surface.action('start'))}.`);
|
|
635
|
+
out.push('');
|
|
636
|
+
out.push(`${surface.strong(`Don't run ${surface.code(surface.cli('dev'))} for this.`)} It stands up a separate local instance with its own empty database — it cannot show you this board, and it would hide the outage behind an empty one.`);
|
|
637
|
+
if (depsMissing) {
|
|
638
|
+
out.push('');
|
|
639
|
+
out.push(`(The ${surface.code('bongos')} CLI isn't installed here. It's optional — the website above is the same board. ${surface.code('@bongos/core')} is ${surface.strong('public')} on npm, so ${surface.code('npm install @bongos/core')} needs no token or login; a failure here is a real error, not the expected tokenless 404 it used to be.)`);
|
|
640
|
+
}
|
|
641
|
+
return out.join('\n');
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
out.push(`I couldn't reach the Cloud Bongos instance${origin ? ` at \`${origin}\`` : ''}. On a freshly-cloned project that almost always just means it hasn't been brought up yet. To start it locally:`);
|
|
645
|
+
out.push('');
|
|
646
|
+
let n = 1;
|
|
647
|
+
if (depsMissing) {
|
|
648
|
+
out.push(`${n++}. \`npm install\` — installs the toolchain first (the \`bongos\` CLI ships inside \`@bongos/core\`, so nothing else runs until this does).`);
|
|
649
|
+
}
|
|
650
|
+
out.push(`${n++}. ${surface.code(surface.cli('dev'))} — one command: starts Postgres, builds the tables, runs the server, and signs you in.`);
|
|
651
|
+
out.push(`${n++}. Re-run ${surface.code(surface.action('start'))}.`);
|
|
652
|
+
out.push('');
|
|
653
|
+
out.push(`Meant to work on a *different* instance that's already running? Sign in to it with ${surface.code(surface.cli('login <url>'))} first.`);
|
|
654
|
+
return out.join('\n');
|
|
655
|
+
}
|
|
656
|
+
function emitInstanceNotRunningCard(opts) {
|
|
657
|
+
console.log(instanceNotRunningCard(opts));
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
async function main() {
|
|
661
|
+
await requireSession();
|
|
662
|
+
const args = process.argv.slice(2);
|
|
663
|
+
const json = args.includes('--json');
|
|
664
|
+
const versionIdx = args.indexOf('--version');
|
|
665
|
+
const version = versionIdx >= 0 ? args[versionIdx + 1] : null;
|
|
666
|
+
const disciplineIdx = args.indexOf('--discipline');
|
|
667
|
+
const discipline = disciplineIdx >= 0 ? args[disciplineIdx + 1] : null;
|
|
668
|
+
const allDisciplines = args.includes('--all-disciplines');
|
|
669
|
+
const fitIdx = args.indexOf('--fit');
|
|
670
|
+
const fit = fitIdx >= 0 ? args[fitIdx + 1] : null;
|
|
671
|
+
const limitIdx = args.indexOf('--limit');
|
|
672
|
+
const limit = limitIdx >= 0 ? Number(args[limitIdx + 1]) : 10;
|
|
673
|
+
// --full restores the detailed ambient widgets + context pack that the lean
|
|
674
|
+
// card omits (task 1273). Default is the lean card.
|
|
675
|
+
const full = args.includes('--full');
|
|
676
|
+
// --widget emits the card as self-contained HTML on stdout for the app's
|
|
677
|
+
// widget renderer (task 1273). Private warnings go to stderr so stdout stays
|
|
678
|
+
// pure HTML the skill can pipe verbatim.
|
|
679
|
+
const widget = args.includes('--widget');
|
|
680
|
+
// --hook (task 1288): machine envelope for the builder-start-card hook — both
|
|
681
|
+
// card forms (HTML + markdown) + the private warnings from a single fetch, so
|
|
682
|
+
// the hook can hand the model a finished card it only has to render. Not a
|
|
683
|
+
// user surface; stdout is the JSON envelope only.
|
|
684
|
+
const hookMode = args.includes('--hook');
|
|
685
|
+
|
|
686
|
+
// Server-side filtering: only push an explicit --discipline (single-lane
|
|
687
|
+
// override). Preference-based routing is done client-side below, because
|
|
688
|
+
// (a) a builder can prefer BOTH disciplines and the server filter takes a
|
|
689
|
+
// single value, and (b) the "You might enjoy" section needs the full
|
|
690
|
+
// claimable set (across all disciplines) to compute recommendations from.
|
|
691
|
+
const claimableQuery = {};
|
|
692
|
+
if (version) claimableQuery.version = version;
|
|
693
|
+
if (discipline) claimableQuery.discipline = discipline;
|
|
694
|
+
if (fit) claimableQuery.fit = fit;
|
|
695
|
+
|
|
696
|
+
// Fire everything in parallel. Header widgets are non-critical — if any
|
|
697
|
+
// endpoint fails, that widget degrades to "N/A" rather than killing
|
|
698
|
+
// /builder-start.
|
|
699
|
+
const api = await cliClient();
|
|
700
|
+
let me, r, closeRes, progressRes, costRes, recentRes, inboxRes, blockersRes, goalsRes;
|
|
701
|
+
try {
|
|
702
|
+
[me, r, closeRes, progressRes, costRes, recentRes, inboxRes, blockersRes, goalsRes] = await Promise.all([
|
|
703
|
+
api.me.getMe(),
|
|
704
|
+
api.tasks.getTasksClaimable({ query: claimableQuery }),
|
|
705
|
+
api.versions.getVersionsCloseSuggestions(),
|
|
706
|
+
api.public.getPublicProgress(),
|
|
707
|
+
api.public.getPublicCostSummary(),
|
|
708
|
+
api.public.getPublicRecentShipped(),
|
|
709
|
+
api.inbox.getInbox({ query: { status: 'open' } }),
|
|
710
|
+
api.blockers.getBlockers(),
|
|
711
|
+
// task 1002852: best-effort — a failed goals read leaves the table flat-grouped by id.
|
|
712
|
+
api.goals.getGoals({ query: { status: 'open' } }).catch(() => ({ ok: false })),
|
|
713
|
+
]);
|
|
714
|
+
} catch (err) {
|
|
715
|
+
// A fresh-clone instance that was never brought up refuses the connection.
|
|
716
|
+
// Human modes get a guided bring-up card + clean exit; machine modes (--json,
|
|
717
|
+
// --hook) keep the throw so the autonomous runner still sees the failure.
|
|
718
|
+
if (isConnectionError(err) && !json && !hookMode) {
|
|
719
|
+
let depsMissing = false;
|
|
720
|
+
try { depsMissing = depsFinding({ repoRoot: process.cwd() }).level !== 'ok'; } catch (_) { /* best-effort */ }
|
|
721
|
+
let origin = '';
|
|
722
|
+
try { origin = new URL(API_BASE).origin; } catch (_) { origin = API_BASE || ''; }
|
|
723
|
+
emitInstanceNotRunningCard({ origin, depsMissing });
|
|
724
|
+
process.exit(0);
|
|
725
|
+
}
|
|
726
|
+
throw err;
|
|
727
|
+
}
|
|
728
|
+
// #766: the primer-read gate on the claimable endpoint was removed, so a
|
|
729
|
+
// newcomer no longer gets a 403 stage_required here. A generic stage_required
|
|
730
|
+
// (any future onboarding gate) still renders cleanly rather than crashing.
|
|
731
|
+
// ADR 0116 nests the slug and its payload — see the note in cli-lib errCode (task
|
|
732
|
+
// 1003658). The onboarding copy lives in error.details, so reading it off the top
|
|
733
|
+
// level rendered an empty prompt even when the branch fired.
|
|
734
|
+
if (r.status === 403 && errCode(r.data) === 'stage_required') {
|
|
735
|
+
const d = errDetails(r.data);
|
|
736
|
+
console.log('');
|
|
737
|
+
console.log(d.what_to_do || `Clear "${d.required_stage_label || d.required_stage}" before the work queue opens.`);
|
|
738
|
+
for (const line of plainCardLines('stage_required')) console.log(line);
|
|
739
|
+
console.log('');
|
|
740
|
+
process.exit(0);
|
|
741
|
+
}
|
|
742
|
+
if (!r.ok) {
|
|
743
|
+
console.error(`failed (${r.status}):`, r.data);
|
|
744
|
+
for (const line of plainCardLines('board_unavailable')) console.error(line);
|
|
745
|
+
process.exit(1);
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
// Full claimable set as returned by the server (already filtered for
|
|
749
|
+
// touches[] safety, version/fit, and any explicit --discipline).
|
|
750
|
+
const rawClaimable = r.data.claimable || [];
|
|
751
|
+
|
|
752
|
+
// Discipline routing (V3.R81 / #299). preferred_disciplines lives on the
|
|
753
|
+
// builder row (migration 027), surfaced via /api/bongos/me.
|
|
754
|
+
const preferred = (me.ok && Array.isArray(me.data?.builder?.preferred_disciplines))
|
|
755
|
+
? me.data.builder.preferred_disciplines
|
|
756
|
+
: [];
|
|
757
|
+
// Apply preference narrowing unless the builder explicitly opted out
|
|
758
|
+
// (--all-disciplines), explicitly chose a single lane (--discipline X,
|
|
759
|
+
// already applied server-side), or stated no preference.
|
|
760
|
+
const routingByPreference = !allDisciplines && !discipline && preferred.length > 0;
|
|
761
|
+
const filtered = routingByPreference
|
|
762
|
+
? rawClaimable.filter((t) => preferred.includes(t.discipline))
|
|
763
|
+
: rawClaimable;
|
|
764
|
+
// task 1002852: goal-first. The open goals (with the server's viewer_is_member)
|
|
765
|
+
// group the table and put the builder's joined goals' rows ahead of the cap.
|
|
766
|
+
const goals = goalsRes && goalsRes.ok && Array.isArray(goalsRes.data?.goals) ? goalsRes.data.goals : [];
|
|
767
|
+
const claimable = startGoals.joinedFirst(filtered, goals).slice(0, limit);
|
|
768
|
+
|
|
769
|
+
// "You might enjoy" — up to 3 claimable tasks outside the builder's lanes.
|
|
770
|
+
// Computed from the FULL set so it can reach across disciplines. Suppressed
|
|
771
|
+
// when an explicit single-lane --discipline filter is in play (the builder
|
|
772
|
+
// asked to see exactly one lane) — but shown for --all-disciplines and the
|
|
773
|
+
// default preference-routed view.
|
|
774
|
+
const recommendations = discipline
|
|
775
|
+
? []
|
|
776
|
+
: rankCrossDisciplineRecommendations(rawClaimable, preferred, 3);
|
|
777
|
+
|
|
778
|
+
// Close-suggestions endpoint is non-critical; if it fails (e.g. older
|
|
779
|
+
// server without the route), surface no banner rather than blowing up.
|
|
780
|
+
const closeSuggestions = closeRes.ok && Array.isArray(closeRes.data?.suggestions)
|
|
781
|
+
? closeRes.data.suggestions
|
|
782
|
+
: [];
|
|
783
|
+
const readyToClose = closeSuggestions.filter((s) => s.ready);
|
|
784
|
+
const yourGoals = startGoals.yourGoals(goals, filtered);
|
|
785
|
+
|
|
786
|
+
// Header widget data (each independently optional).
|
|
787
|
+
const progress = progressRes.ok && Array.isArray(progressRes.data?.progress) ? progressRes.data.progress : null;
|
|
788
|
+
const cost = costRes.ok ? costRes.data : null;
|
|
789
|
+
const recentShipped = recentRes.ok && Array.isArray(recentRes.data?.tasks) ? recentRes.data.tasks : null;
|
|
790
|
+
const inboxCount = inboxOpenCount(inboxRes);
|
|
791
|
+
const blockerCount = blockersRes.ok && Array.isArray(blockersRes.data?.blockers)
|
|
792
|
+
? blockersRes.data.blockers.filter((b) => b.status === 'open' || !b.status).length
|
|
793
|
+
: null;
|
|
794
|
+
|
|
795
|
+
// ADR 0120 part 5: the confirmed tasks this builder owes a rebase on (they
|
|
796
|
+
// GATE new claims; the reward lands only on ship). Shared by every card form;
|
|
797
|
+
// already present verbatim in --json via me.data.needs_rebase_tasks below.
|
|
798
|
+
const needsRebaseTasks = me.ok && Array.isArray(me.data?.needs_rebase_tasks)
|
|
799
|
+
? me.data.needs_rebase_tasks
|
|
800
|
+
: [];
|
|
801
|
+
|
|
802
|
+
if (json) {
|
|
803
|
+
console.log(JSON.stringify(
|
|
804
|
+
{
|
|
805
|
+
me: me.data,
|
|
806
|
+
claimable,
|
|
807
|
+
recommendations,
|
|
808
|
+
your_goals: yourGoals.goals,
|
|
809
|
+
discipline_routing: {
|
|
810
|
+
preferred_disciplines: preferred,
|
|
811
|
+
applied: routingByPreference,
|
|
812
|
+
all_disciplines: allDisciplines,
|
|
813
|
+
explicit_discipline: discipline || null,
|
|
814
|
+
},
|
|
815
|
+
close_suggestions: closeSuggestions,
|
|
816
|
+
header: {
|
|
817
|
+
progress,
|
|
818
|
+
cost,
|
|
819
|
+
recent_shipped: recentShipped,
|
|
820
|
+
inbox_count: inboxCount,
|
|
821
|
+
blocker_count: blockerCount,
|
|
822
|
+
},
|
|
823
|
+
},
|
|
824
|
+
null, 2
|
|
825
|
+
));
|
|
826
|
+
return;
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
// ---------- widget (HTML for the app renderer) ----------
|
|
830
|
+
// task 1279 / 1002518: the per-builder card-richness level. Below the widget
|
|
831
|
+
// rung, even an explicit --widget request degrades to the markdown card below
|
|
832
|
+
// — so no HTML is emitted, read, or re-relayed (a real token saving, not just
|
|
833
|
+
// a visual change). /me carries the resolved level; an older instance carries
|
|
834
|
+
// only the boolean and cardFlagsFromMe reads either. Headless/cron callers
|
|
835
|
+
// don't pass --widget at all (no renderer), so they're unaffected.
|
|
836
|
+
//
|
|
837
|
+
// The `minimal` rung lands on the markdown card here rather than on nothing:
|
|
838
|
+
// the lifecycle card has a guaranteed one-line confirmation to fall back to,
|
|
839
|
+
// and this card — the list of what you can claim — has no such floor. Dropping
|
|
840
|
+
// it would leave a session opening with no answer to the question it asked.
|
|
841
|
+
const widgetsPref = me.ok ? cardFlagsFromMe(me).showWidget : true;
|
|
842
|
+
if (widget && widgetsPref) {
|
|
843
|
+
const myClaims = me.ok ? (me.data.active_claims || (me.data.active_claim ? [me.data.active_claim] : [])) : [];
|
|
844
|
+
// Private warnings (budget / onboarding next-stage) → stderr, so stdout
|
|
845
|
+
// stays pure HTML the skill can pipe straight into show_widget.
|
|
846
|
+
if (me.ok) {
|
|
847
|
+
const warnings = captureLog(() => { printOnboardingNudge(me.data); printCostWarning(me.data); printNeedsNudge(me.data); });
|
|
848
|
+
for (const w of warnings) process.stderr.write(w + '\n');
|
|
849
|
+
}
|
|
850
|
+
emitCardDirective('html');
|
|
851
|
+
process.stdout.write(renderWidget({
|
|
852
|
+
builder: me.ok ? me.data.builder : {},
|
|
853
|
+
claims: myClaims,
|
|
854
|
+
claimable: claimable.slice(0, CARD_ROWS),
|
|
855
|
+
total: filtered.length,
|
|
856
|
+
streak: me.ok ? me.data.streak : null,
|
|
857
|
+
recommendations,
|
|
858
|
+
header: { progress, recentShipped, inboxCount, blockerCount },
|
|
859
|
+
routingByPreference,
|
|
860
|
+
preferred,
|
|
861
|
+
filters: { version, discipline, fit },
|
|
862
|
+
readyToClose,
|
|
863
|
+
needsRebaseTasks,
|
|
864
|
+
goals,
|
|
865
|
+
yourGoals,
|
|
866
|
+
}) + '\n');
|
|
867
|
+
return;
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
// ---------- the card (default) ----------
|
|
871
|
+
// task 1288: the markdown card body, lifted into a closure so the --hook
|
|
872
|
+
// envelope can capture it (via captureLog) next to the widget HTML from the
|
|
873
|
+
// single fetch above; the normal markdown path just calls it below. The body
|
|
874
|
+
// is kept VERBATIM (same indentation) so this stays a pure wrap+call with zero
|
|
875
|
+
// change to the shipped card. Closes over the locals computed above. (task
|
|
876
|
+
// 1273: relaying this verbatim is what keeps the card identical every session;
|
|
877
|
+
// `--full` adds the ambient widgets + context pack.)
|
|
878
|
+
const emitMarkdownCard = () => {
|
|
879
|
+
// V3.R13 (#237): one-line "next stage" nudge for newcomers. Silent for
|
|
880
|
+
// graduated builders and anyone past first_ship.
|
|
881
|
+
if (me.ok) printOnboardingNudge(me.data);
|
|
882
|
+
// task 1013 / ADR 0073: flag any input the system needs from the builder
|
|
883
|
+
// (e.g. their own image-generation key once free coverage ends). Silent unless
|
|
884
|
+
// something is in the action_needed state.
|
|
885
|
+
if (me.ok) printNeedsNudge(me.data);
|
|
886
|
+
|
|
887
|
+
// identity line
|
|
888
|
+
if (me.ok) {
|
|
889
|
+
const b = me.data.builder;
|
|
890
|
+
const rankLabel = b.rank ? b.rank.charAt(0).toUpperCase() + b.rank.slice(1) : 'Thetes';
|
|
891
|
+
const discLabel = Array.isArray(b.preferred_disciplines) && b.preferred_disciplines.length
|
|
892
|
+
? b.preferred_disciplines.join(' + ')
|
|
893
|
+
: 'all disciplines';
|
|
894
|
+
const credits = Number(b.total_credits || 0).toLocaleString();
|
|
895
|
+
console.log(`${surface.strong('builder-start')} · ${b.github_login} (${rankLabel}) · ${credits} credits · ${discLabel}`);
|
|
896
|
+
const sk = me.data.streak;
|
|
897
|
+
if (sk && Number(sk.current) > 0) {
|
|
898
|
+
console.log(`🔥 ${sk.current}-day streak${Number(sk.longest) > Number(sk.current) ? ` · longest ${sk.longest}` : ''}`);
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
// ADR 0120 part 5: the owed-rebase gate warning — rendered directly under the
|
|
903
|
+
// identity line and before the claimable table, since it BLOCKS new claims
|
|
904
|
+
// until the builder lands (`git merge origin/main` + re-ship — task 1002788:
|
|
905
|
+
// MERGE, because the branch is already published and the server's publish is
|
|
906
|
+
// append-only, so a rebase makes it permanently un-pushable) or releases them.
|
|
907
|
+
const rebaseLine = rebaseWarningMarkdown(needsRebaseTasks);
|
|
908
|
+
if (rebaseLine) {
|
|
909
|
+
console.log('');
|
|
910
|
+
console.log(rebaseLine);
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
// ambient status: one quiet line by default; the full widgets + context pack
|
|
914
|
+
// under --full.
|
|
915
|
+
if (full) {
|
|
916
|
+
const rows = [
|
|
917
|
+
formatVersionsRow(progress),
|
|
918
|
+
formatCostRow(cost),
|
|
919
|
+
formatRecentRow({ recentShipped, inboxCount, blockerCount }),
|
|
920
|
+
].filter(Boolean);
|
|
921
|
+
if (rows.length) console.log(rows.join('\n'));
|
|
922
|
+
// Worktree root (the #1 wrong-path footgun) + API prefix/enums. Also printed
|
|
923
|
+
// at /builder-claim, where it matters most; here it's --full-only detail.
|
|
924
|
+
try {
|
|
925
|
+
console.log('');
|
|
926
|
+
console.log(formatContextPackCompact(contextPack()));
|
|
927
|
+
} catch (_) { /* fail-open */ }
|
|
928
|
+
} else {
|
|
929
|
+
const status = quietStatusLine({ progress, recentShipped, inboxCount, blockerCount });
|
|
930
|
+
if (status) console.log(status);
|
|
931
|
+
}
|
|
932
|
+
console.log('');
|
|
933
|
+
|
|
934
|
+
// V3.R84 (#302), criterion C3: private session-start budget ping. The CLI is
|
|
935
|
+
// the builder's private channel, so the soft-cap (80%) warning / hard-cap
|
|
936
|
+
// (100%) refusal surface here rather than via Discord (a shared mirror).
|
|
937
|
+
if (me.ok) printCostWarning(me.data);
|
|
938
|
+
|
|
939
|
+
// your holdings — calm + factual, with quick actions off each held task.
|
|
940
|
+
// Parallel sessions under one builder are normal, so this informs (it does
|
|
941
|
+
// not block — feedback_parallel_sessions). Ids are hall links (ref rule).
|
|
942
|
+
if (me.ok) {
|
|
943
|
+
const myClaims = me.data.active_claims || (me.data.active_claim ? [me.data.active_claim] : []);
|
|
944
|
+
const heldActions = (id) => ` → ship: ${surface.code(surface.action('ship', id))}`
|
|
945
|
+
+ ` · release: ${surface.code(surface.action('release', id))}`
|
|
946
|
+
+ ` · open: ${surface.taskRef(id, HALL_TASK)}`;
|
|
947
|
+
if (myClaims.length === 1) {
|
|
948
|
+
const c = myClaims[0];
|
|
949
|
+
console.log(`You're holding ${surface.taskRef(c.task_id, HALL_TASK)} — ${clip(c.title, 56)}`);
|
|
950
|
+
console.log(heldActions(c.task_id));
|
|
951
|
+
console.log('');
|
|
952
|
+
} else if (myClaims.length > 1) {
|
|
953
|
+
console.log(`You're holding ${myClaims.length} claims (parallel sessions OK):`);
|
|
954
|
+
for (const c of myClaims) {
|
|
955
|
+
console.log(` ${surface.taskRef(c.task_id, HALL_TASK)} — ${clip(c.title, 50)}`);
|
|
956
|
+
console.log(heldActions(c.task_id));
|
|
957
|
+
}
|
|
958
|
+
console.log('');
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
// Version-close gate banner — informational; fires rarely (an Archon action)
|
|
963
|
+
// when a building version is >= 80% weighted AND every criterion is satisfied.
|
|
964
|
+
for (const s of readyToClose) {
|
|
965
|
+
console.log(
|
|
966
|
+
`🚦 ${s.versionId} looks ready to close ` +
|
|
967
|
+
`(${s.criteriaSatisfied}/${s.criteriaTotal} criteria, ${s.percentComplete}% weighted; ` +
|
|
968
|
+
`${s.tasksShipped} shipped, ${s.tasksCarryOver} carry-over). Run ${surface.action('version-close', s.versionId)}.`
|
|
969
|
+
);
|
|
970
|
+
console.log('');
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
// ---------- the menu ----------
|
|
974
|
+
const matched = routingByPreference ? ` matched to ${preferred.join(' + ')}` : '';
|
|
975
|
+
const filterBits = [
|
|
976
|
+
version && `in ${version}`,
|
|
977
|
+
discipline && `discipline=${discipline}`,
|
|
978
|
+
fit && `fit=${fit}`,
|
|
979
|
+
].filter(Boolean);
|
|
980
|
+
const filterNote = filterBits.length ? ` (${filterBits.join(', ')})` : '';
|
|
981
|
+
// task 1002852: the goals this builder joined, above the table (never instead of it).
|
|
982
|
+
if (yourGoals.goals.length) {
|
|
983
|
+
console.log(surface.strong('Your goals'));
|
|
984
|
+
for (const g of yourGoals.goals) console.log(` ${clip(g.title, 60)} · ${startGoals.claimableWord(g.claimable)}`);
|
|
985
|
+
if (yourGoals.more) console.log(` and ${yourGoals.more} more`);
|
|
986
|
+
console.log('');
|
|
987
|
+
}
|
|
988
|
+
console.log(`${surface.strong('Claim one to start')} — ${filtered.length} ready for you right now${matched}${filterNote}:`);
|
|
989
|
+
console.log('');
|
|
990
|
+
if (claimable.length) {
|
|
991
|
+
const cardRows = claimable.slice(0, CARD_ROWS);
|
|
992
|
+
console.log(claimableTable(cardRows, me.ok ? me.data?.reward : null, goals));
|
|
993
|
+
const moreN = filtered.length - cardRows.length;
|
|
994
|
+
if (moreN > 0) {
|
|
995
|
+
console.log('');
|
|
996
|
+
console.log(surface.em(`…and ${moreN} more — say "show all", or run with --limit 30.`));
|
|
997
|
+
}
|
|
998
|
+
} else {
|
|
999
|
+
console.log(surface.em(
|
|
1000
|
+
"Nothing claimable right now — everything is in flight, blocked, or shipped."
|
|
1001
|
+
+ (surface.isTerminal() ? '' : " Run /blocker-review to see what's stuck.")
|
|
1002
|
+
));
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
// Cross-discipline pointer (one line) — only when preference-routed.
|
|
1006
|
+
if (recommendations.length > 0) {
|
|
1007
|
+
const ids = recommendations.map((t) => `#${t.id}`).join(', ');
|
|
1008
|
+
console.log('');
|
|
1009
|
+
console.log(`Outside your roles: ${ids} — say the word to see them, or run with \`--all-disciplines\`.`);
|
|
1010
|
+
} else if (routingByPreference) {
|
|
1011
|
+
console.log('');
|
|
1012
|
+
console.log('_Showing your roles — run with `--all-disciplines` to see every role._');
|
|
1013
|
+
}
|
|
1014
|
+
|
|
1015
|
+
// ---------- next ----------
|
|
1016
|
+
console.log('');
|
|
1017
|
+
console.log(`→ ${surface.isTerminal() ? `Claim one with ${surface.code(surface.cli('claim <id>'))} in a checkout` : `${surface.strong('Tell me a number')} to claim it`}.`);
|
|
1018
|
+
if (full) {
|
|
1019
|
+
console.log('');
|
|
1020
|
+
console.log('Commands:');
|
|
1021
|
+
console.log(' claim: node scripts/bongos/claim.js <task-id> [--worktree NAME]');
|
|
1022
|
+
console.log(' ship: node scripts/bongos/ship.js <task-id> --notes "..." --summary "..."');
|
|
1023
|
+
console.log(' release: node scripts/bongos/release.js <task-id>');
|
|
1024
|
+
}
|
|
1025
|
+
};
|
|
1026
|
+
|
|
1027
|
+
// --hook (task 1288): a UserPromptSubmit hook can neither render UI, call
|
|
1028
|
+
// show_widget, nor detect whether that tool exists — only the model can. So
|
|
1029
|
+
// the hook runs THIS script and injects the finished card + a one-step
|
|
1030
|
+
// directive; the model's only remaining job is to emit it. Emit BOTH forms
|
|
1031
|
+
// (+ the private budget/onboarding warnings) from the single fetch above as a
|
|
1032
|
+
// machine envelope; stdout carries nothing else.
|
|
1033
|
+
if (hookMode) {
|
|
1034
|
+
const myClaims = me.ok ? (me.data.active_claims || (me.data.active_claim ? [me.data.active_claim] : [])) : [];
|
|
1035
|
+
const html = widgetsPref
|
|
1036
|
+
? renderWidget({
|
|
1037
|
+
builder: me.ok ? me.data.builder : {},
|
|
1038
|
+
claims: myClaims,
|
|
1039
|
+
claimable: claimable.slice(0, CARD_ROWS),
|
|
1040
|
+
total: filtered.length,
|
|
1041
|
+
streak: me.ok ? me.data.streak : null,
|
|
1042
|
+
recommendations,
|
|
1043
|
+
header: { progress, recentShipped, inboxCount, blockerCount },
|
|
1044
|
+
routingByPreference,
|
|
1045
|
+
preferred,
|
|
1046
|
+
filters: { version, discipline, fit },
|
|
1047
|
+
readyToClose,
|
|
1048
|
+
needsRebaseTasks,
|
|
1049
|
+
goals,
|
|
1050
|
+
yourGoals,
|
|
1051
|
+
})
|
|
1052
|
+
: null;
|
|
1053
|
+
const markdown = captureLog(emitMarkdownCard).join('\n');
|
|
1054
|
+
const warnings = me.ok
|
|
1055
|
+
? captureLog(() => { printOnboardingNudge(me.data); printCostWarning(me.data); printNeedsNudge(me.data); })
|
|
1056
|
+
: [];
|
|
1057
|
+
process.stdout.write(JSON.stringify({ widgets_enabled: widgetsPref, html, markdown, warnings }) + '\n');
|
|
1058
|
+
return;
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
// Markdown card path — default invocation, `--full`, or `--widget` with the
|
|
1062
|
+
// widgets knob off. The relay directive goes to stderr (task 1282); the card
|
|
1063
|
+
// body to stdout.
|
|
1064
|
+
emitCardDirective('markdown');
|
|
1065
|
+
emitMarkdownCard();
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1068
|
+
// Only auto-run when invoked directly (`node start.js …`); a `require()` (the
|
|
1069
|
+
// unit test) imports the pure render helpers without executing the fetch flow —
|
|
1070
|
+
// the claim.js precedent. The owed-rebase warning helpers (ADR 0120 part 5) are
|
|
1071
|
+
// exported so they can be unit-tested without a live server, and so is
|
|
1072
|
+
// rankCrossDisciplineRecommendations — the mirror test executes THIS copy
|
|
1073
|
+
// alongside the canonical one rather than pattern-matching the source.
|
|
1074
|
+
if (require.main === module) {
|
|
1075
|
+
main().catch((err) => {
|
|
1076
|
+
console.error('fatal:', err);
|
|
1077
|
+
process.exit(1);
|
|
1078
|
+
});
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
module.exports = {
|
|
1082
|
+
inboxOpenCount,
|
|
1083
|
+
rankCrossDisciplineRecommendations,
|
|
1084
|
+
rebaseWarningModel,
|
|
1085
|
+
rebaseWarningMarkdown,
|
|
1086
|
+
rebaseWarningWidget,
|
|
1087
|
+
isConnectionError,
|
|
1088
|
+
instanceNotRunningCard,
|
|
1089
|
+
isLocalOrigin,
|
|
1090
|
+
};
|