@bongos/core 1.17.0
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 +5727 -0
- package/.claude/skills/blocker-review/SKILL.md +91 -0
- package/.claude/skills/blocker-solve/SKILL.md +96 -0
- package/.claude/skills/builder-backup/SKILL.md +54 -0
- package/.claude/skills/builder-box/SKILL.md +45 -0
- package/.claude/skills/builder-claim/SKILL.md +76 -0
- package/.claude/skills/builder-connect/SKILL.md +59 -0
- package/.claude/skills/builder-cost/SKILL.md +47 -0
- package/.claude/skills/builder-end/SKILL.md +81 -0
- package/.claude/skills/builder-exit/SKILL.md +88 -0
- package/.claude/skills/builder-key/SKILL.md +40 -0
- package/.claude/skills/builder-reauth/SKILL.md +50 -0
- package/.claude/skills/builder-redteam/SKILL.md +109 -0
- package/.claude/skills/builder-release/SKILL.md +41 -0
- package/.claude/skills/builder-setup/SKILL.md +62 -0
- package/.claude/skills/builder-ship/SKILL.md +79 -0
- package/.claude/skills/builder-stage/SKILL.md +51 -0
- package/.claude/skills/builder-start/SKILL.md +46 -0
- package/.claude/skills/close-box/SKILL.md +43 -0
- package/.claude/skills/design-sync/SKILL.md +69 -0
- package/.claude/skills/dev/SKILL.md +49 -0
- package/.claude/skills/feedback/SKILL.md +32 -0
- package/.claude/skills/figma-design-sync/SKILL.md +74 -0
- package/.claude/skills/goal-review/SKILL.md +89 -0
- package/.claude/skills/idea-triage/SKILL.md +144 -0
- package/.claude/skills/ideate/SKILL.md +82 -0
- package/.claude/skills/merge-mode/SKILL.md +169 -0
- package/.claude/skills/new-project/SKILL.md +108 -0
- package/.claude/skills/otb-character-review/SKILL.md +71 -0
- package/.claude/skills/otb-design-review/SKILL.md +47 -0
- package/.claude/skills/otb-feedback-capture/SKILL.md +45 -0
- package/.claude/skills/otb-figma-sync/SKILL.md +54 -0
- package/.claude/skills/otb-tile-generate/SKILL.md +45 -0
- package/.claude/skills/paint/SKILL.md +70 -0
- package/.claude/skills/planning-session/SKILL.md +299 -0
- package/.claude/skills/priority-session/SKILL.md +134 -0
- package/.claude/skills/read-session-export/SKILL.md +58 -0
- package/.claude/skills/recall/SKILL.md +52 -0
- package/.claude/skills/session-handoff/SKILL.md +46 -0
- package/.claude/skills/status/SKILL.md +33 -0
- package/.devcontainer/Dockerfile +69 -0
- package/.devcontainer/README.md +73 -0
- package/.devcontainer/devcontainer-lock.json +19 -0
- package/.devcontainer/devcontainer.json +93 -0
- package/.devcontainer/healthcheck.sh +84 -0
- package/.devcontainer/init-firewall.sh +198 -0
- package/.devcontainer/post-create.sh +153 -0
- package/.dockerignore +36 -0
- package/.env.local.example +32 -0
- package/.gitattributes +83 -0
- package/.gitignore +91 -0
- package/CLAUDE.md +242 -0
- package/CODE_OF_CONDUCT.md +46 -0
- package/CONTRIBUTING.md +51 -0
- package/Dockerfile +46 -0
- package/GOVERNANCE.md +44 -0
- package/LICENSE +661 -0
- package/README.md +88 -0
- package/bin/bongos.js +222 -0
- package/clients/bongos-client/README.md +48 -0
- package/clients/bongos-client/bongos-client.global.js +617 -0
- package/clients/bongos-client/examples/hello-world.mjs +62 -0
- package/clients/bongos-client/index.cjs +619 -0
- package/clients/bongos-client/index.d.ts +793 -0
- package/clients/bongos-client/index.mjs +614 -0
- package/clients/bongos-client/package.json +32 -0
- package/config/branding.neutral.json +60 -0
- package/config/design-tokens.neutral.json +51 -0
- package/config/design-tokens.schema.json +96 -0
- package/config/modules.neutral.json +9 -0
- package/docker-compose.yml +52 -0
- package/docker-entrypoint.sh +30 -0
- package/docs/adr/0001-stack-choice-single-vps.md +45 -0
- package/docs/adr/0002-digitalocean-over-hetzner.md +27 -0
- package/docs/adr/0003-cloudflare-origin-cert-over-letsencrypt.md +35 -0
- package/docs/adr/0004-amazonprimea-name-and-trademark-acceptance.md +45 -0
- package/docs/adr/0005-invisible-other-players-in-v1.md +37 -0
- package/docs/adr/0006-singleton-worldroom-plus-queueroom.md +30 -0
- package/docs/adr/0007-persistent-identity-via-localstorage-uuid.md +31 -0
- package/docs/adr/0008-family-based-tile-generation.md +86 -0
- package/docs/adr/0008-google-chat-oauth-user-auth.md +37 -0
- package/docs/adr/0009-autotile-architecture.md +181 -0
- package/docs/adr/0010-pms-architecture.md +70 -0
- package/docs/adr/0011-terrain-id-rendering-model.md +174 -0
- package/docs/adr/0012-ground-object-cell-split.md +208 -0
- package/docs/adr/0013-paths-as-object-overlays-with-autotile-dispatch.md +158 -0
- package/docs/adr/0014-families-canonical-over-vocabulary.md +103 -0
- package/docs/adr/0015-task-dependencies-and-auto-promotion.md +125 -0
- package/docs/adr/0016-trust-boundary-server-enforced-permissions.md +132 -0
- package/docs/adr/0017-code-simplification-and-repo-cleanliness.md +74 -0
- package/docs/adr/0018-three-rank-model-goes-live.md +97 -0
- package/docs/adr/0019-red-team-bounty-payout-table.md +52 -0
- package/docs/adr/0020-security-model-public-stub.md +70 -0
- package/docs/adr/0021-per-builder-skill-model-preferences.md +99 -0
- package/docs/adr/0022-secrets-policy.md +124 -0
- package/docs/adr/0023-kind-multipliers-and-idea-bonus.md +118 -0
- package/docs/adr/0024-cloneable-repo-local-first-memory.md +277 -0
- package/docs/adr/0024-multi-agent-system-architecture.md +125 -0
- package/docs/adr/0025-offsite-backup-vendor-digitalocean-spaces.md +59 -0
- package/docs/adr/0025-structured-criterion-task-link.md +44 -0
- package/docs/adr/0026-bfg-memory-hygiene-and-cross-builder-learning.md +117 -0
- package/docs/adr/0027-bfg-session-inefficiency-evaluator.md +170 -0
- package/docs/adr/0028-honest-llm-spend-accounting.md +109 -0
- package/docs/adr/0029-status-page-outage-resilience.md +59 -0
- package/docs/adr/0030-builders-hall-live-updates.md +59 -0
- package/docs/adr/0031-cloud-dev-environments-for-builders.md +222 -0
- package/docs/adr/0032-discord-mirror-of-gds.md +50 -0
- package/docs/adr/0033-discord-bot-service-principal.md +82 -0
- package/docs/adr/0034-thetes-graduated-newcomer-rank.md +53 -0
- package/docs/adr/0035-builder-onboarding-three-paths.md +128 -0
- package/docs/adr/0036-builders-subdomain-and-ui-reorg.md +40 -0
- package/docs/adr/0037-discord-channel-management.md +51 -0
- package/docs/adr/0038-chromebook-ttyd-cloudflare-tunnel.md +111 -0
- package/docs/adr/0039-setup-first-onboarding-ux.md +49 -0
- package/docs/adr/0040-remote-control-default-browser-onramp.md +47 -0
- package/docs/adr/0041-temporary-grader-bypass-killswitch.md +40 -0
- package/docs/adr/0042-builder-self-deploy-ci-auto-merge.md +82 -0
- package/docs/adr/0043-git-ssh-trust-boundary-and-rank-floor-on-permission-paths.md +74 -0
- package/docs/adr/0044-mediterranean-palette-replacement.md +73 -0
- package/docs/adr/0044-per-box-live-game-preview.md +57 -0
- package/docs/adr/0045-devbox-desktop-app.md +133 -0
- package/docs/adr/0046-sandbox-first-review-gate.md +72 -0
- package/docs/adr/0047-discord-bugs-intake-anti-abuse.md +36 -0
- package/docs/adr/0048-works-in-progress-ia-split.md +32 -0
- package/docs/adr/0049-split-parallel-safety-contract.md +46 -0
- package/docs/adr/0050-device-flow-admission-invite-gated-by-default.md +43 -0
- package/docs/adr/0051-full-session-transcript-corpus.md +57 -0
- package/docs/adr/0052-sandbox-for-everyone-game-only-preview.md +70 -0
- package/docs/adr/0053-scoped-dev-box-session.md +55 -0
- package/docs/adr/0054-session-token-reward-cost-plus.md +63 -0
- package/docs/adr/0055-server-mediated-branch-publish.md +47 -0
- package/docs/adr/0056-prod-deploy-script-mirror-and-healthcheck-retry.md +62 -0
- package/docs/adr/0057-container-cost-ledger.md +28 -0
- package/docs/adr/0057-discord-archon-approval-channels.md +64 -0
- package/docs/adr/0058-automatic-gate-surface-gatekeeper.md +64 -0
- package/docs/adr/0059-single-approval-remove-devbox-approval-gate.md +37 -0
- package/docs/adr/0060-gds-retrieval-layer.md +97 -0
- package/docs/adr/0061-context-layer-decomposition.md +61 -0
- package/docs/adr/0062-medusa-instance-model-decoupling.md +107 -0
- package/docs/adr/0063-generated-repo-map-symbol-skeleton.md +44 -0
- package/docs/adr/0064-rename-medusa-to-cloud-bongos.md +49 -0
- package/docs/adr/0065-agpl-nonprofit-ai-first-governance.md +69 -0
- package/docs/adr/0066-generated-file-map-sections.md +51 -0
- package/docs/adr/0067-session-start-fast-forward-pull.md +43 -0
- package/docs/adr/0068-shared-art-key-for-newcomers.md +38 -0
- package/docs/adr/0069-hall-live-channel-sse-decouple.md +35 -0
- package/docs/adr/0070-deterministic-session-card-delivery.md +44 -0
- package/docs/adr/0071-box-confirm-before-destroyed-and-drift-reconcile.md +59 -0
- package/docs/adr/0072-bongos-app-mac-signed-first-windows-deferred.md +35 -0
- package/docs/adr/0072-dev-box-code-staleness-visibility.md +39 -0
- package/docs/adr/0073-builder-needs-signal-and-byok-gemini-key.md +64 -0
- package/docs/adr/0073-secrets-scan-exclude-uri-detector.md +37 -0
- package/docs/adr/0074-memory-map-stays-light.md +32 -0
- package/docs/adr/0075-per-system-cost-attribution.md +37 -0
- package/docs/adr/0076-in-session-deterministic-compaction.md +58 -0
- package/docs/adr/0077-content-addressed-llm-cache.md +32 -0
- package/docs/adr/0078-deterministic-first-cron.md +48 -0
- package/docs/adr/0079-value-gated-autonomous-engagement.md +39 -0
- package/docs/adr/0080-llm-cache-api-transport-and-trust-model.md +46 -0
- package/docs/adr/0081-tool-agnostic-design-layer.md +62 -0
- package/docs/adr/0082-productized-key-storage-provisioning.md +32 -0
- package/docs/adr/0082-server-side-merge-conflict-auto-resolution.md +55 -0
- package/docs/adr/0083-modular-architecture-strangler-build-plan.md +143 -0
- package/docs/adr/0084-auto-derived-per-task-rank-floor.md +86 -0
- package/docs/adr/0085-remove-default-per-builder-spend-cap.md +39 -0
- package/docs/adr/0086-goal-scoped-work-hierarchy.md +123 -0
- package/docs/adr/0087-bongos-app-architecture-and-handoff-contract.md +49 -0
- package/docs/adr/0087-compete-on-governance-not-tooling-cursor.md +65 -0
- package/docs/adr/0088-consistent-character-generative-animation.md +169 -0
- package/docs/adr/0089-modular-multi-model-adversarial-grader.md +179 -0
- package/docs/adr/0090-metic-task-authoring.md +73 -0
- package/docs/adr/0091-bounding-the-kernel-and-db-carve.md +106 -0
- package/docs/adr/0092-hosting-module-and-on-prem-target.md +117 -0
- package/docs/adr/0093-tranche-2-core-carve-sequence.md +72 -0
- package/docs/adr/0094-repo-atlas-self-drawing-codebase-map.md +49 -0
- package/docs/adr/0095-borrowed-memory-and-retrieval-concepts.md +65 -0
- package/docs/adr/0095-cross-agent-context-management.md +58 -0
- package/docs/adr/0096-require-reward-before-workable.md +209 -0
- package/docs/adr/0097-one-active-claim-per-session-and-worktree-binding.md +46 -0
- package/docs/adr/0097-retroactive-reward-backfill.md +124 -0
- package/docs/adr/0098-public-mirror-publish-manifest.md +92 -0
- package/docs/adr/0099-delayed-redacted-mirror-export.md +55 -0
- package/docs/adr/0100-two-repo-instance-model.md +60 -0
- package/docs/adr/0101-goal-hierarchy-phase-5-judge-membership-reward.md +90 -0
- package/docs/adr/0102-finish-bounding-the-kernel.md +36 -0
- package/docs/adr/0103-core-first-extraction-cloud-bongos-trunk.md +70 -0
- package/docs/adr/0103-gdsv4-bongos-consolidation.md +28 -0
- package/docs/adr/0104-trust-gds-api-channel-in-auto-mode.md +42 -0
- package/docs/adr/0105-instance-seed-migrations-out-of-core.md +47 -0
- package/docs/adr/0106-goal-owner-manager-authority.md +84 -0
- package/docs/adr/0107-module-upstreaming-contribution-to-core-catalog.md +83 -0
- package/docs/adr/0108-instance-composition-configurable-root.md +87 -0
- package/docs/adr/0109-self-describing-openapi-and-hosted-docs.md +44 -0
- package/docs/adr/0110-untrack-whole-file-generated-nav-docs.md +49 -0
- package/docs/adr/0111-instance-hosting-provisioning-module.md +135 -0
- package/docs/adr/0112-private-goals-invitations-join-requests.md +72 -0
- package/docs/adr/0113-sandbox-studio-descope-superseded-by-0044-0052.md +41 -0
- package/docs/adr/0114-instance-docs-discovery-contract.md +32 -0
- package/docs/adr/0115-scheduled-routines-portability.md +31 -0
- package/docs/adr/0116-api-error-envelope-and-code-taxonomy.md +62 -0
- package/docs/adr/0117-api-versioning-and-deprecation-policy.md +50 -0
- package/docs/adr/0118-api-contract-source-of-truth-code-first.md +47 -0
- package/docs/adr/0119-api-pagination-contract.md +34 -0
- package/docs/adr/0120-pay-on-land-and-builder-owned-rebase-gate.md +108 -0
- package/docs/adr/0121-greenfield-vs-brownfield-onboarding-adopt-existing-repo.md +97 -0
- package/docs/adr/0122-onboarding-diagram-renders-deploy-rendered-off-git.md +43 -0
- package/docs/adr/0123-box-idle-sweep-autosave-before-destroy.md +36 -0
- package/docs/adr/0124-typed-api-response-bodies.md +37 -0
- package/docs/adr/0125-control-plane-scaffolds-standalone-instance-repo.md +36 -0
- package/docs/adr/0126-dedicated-cloudbongos-control-plane-droplet.md +30 -0
- package/docs/adr/0127-cross-box-fleet-observability.md +64 -0
- package/docs/adr/0128-provisioning-runner-privilege-and-db-auth-model.md +46 -0
- package/docs/adr/0129-cloudbongos-control-plane-pull-deploy.md +34 -0
- package/docs/adr/0130-provision-remote-exec-over-ssh.md +61 -0
- package/docs/adr/0131-rank-scoped-skill-visibility.md +47 -0
- package/docs/adr/0132-cohost-fleet-control-plane-migration.md +54 -0
- package/docs/adr/0133-github-app-manifest-onboarding-signin.md +42 -0
- package/docs/adr/0134-private-first-npm-distribution.md +38 -0
- package/docs/adr/README.md +208 -0
- package/docs/api/openapi.json +13720 -0
- package/docs/api-reference.md +437 -0
- package/docs/architecture.md +244 -0
- package/docs/branding-contract.md +66 -0
- package/docs/branding-fill-prompt.md +25 -0
- package/docs/canonical-permissions.md +241 -0
- package/docs/design/container-exterior-tiles.md +49 -0
- package/docs/design/container-exterior.md +81 -0
- package/docs/design/container-interior.md +77 -0
- package/docs/design/modular-architecture/00-research-report.md +107 -0
- package/docs/design/modular-architecture/01-architecture.md +125 -0
- package/docs/design/modular-architecture/02-module-map.md +116 -0
- package/docs/design/modular-architecture/03-builder-flows.md +104 -0
- package/docs/design/modular-architecture/04-module-lifecycle.md +62 -0
- package/docs/design/modular-architecture/README.md +27 -0
- package/docs/design/vanilla-hall-ui-redesign-scope.md +284 -0
- package/docs/design/world-map-scroll.md +41 -0
- package/docs/design-contract.md +320 -0
- package/docs/file-map.md +418 -0
- package/docs/handoff-template.md +92 -0
- package/docs/modules-contract.md +293 -0
- package/docs/onboarding/browser-terminal-guide.md +73 -0
- package/docs/onboarding/diagrams/01-task-lifecycle.mmd +28 -0
- package/docs/onboarding/diagrams/02-rank-ladder.mmd +54 -0
- package/docs/onboarding/diagrams/03-drachmae-karma.mmd +37 -0
- package/docs/onboarding/diagrams/04-architecture.mmd +51 -0
- package/docs/onboarding/diagrams/05-versioning.mmd +29 -0
- package/docs/onboarding/diagrams/README.md +94 -0
- package/docs/onboarding/diagrams/assertions.json +170 -0
- package/docs/onboarding/diagrams/puppeteer-config.json +1 -0
- package/docs/onboarding/diagrams/render-config.json +9 -0
- package/docs/onboarding/drachmae-and-karma.md +178 -0
- package/docs/onboarding/primer.md +202 -0
- package/docs/project-context.template.md +67 -0
- package/docs/recipes/README.md +35 -0
- package/docs/recipes/audit-replay.md +100 -0
- package/docs/recipes/bongos-cli-release.md +66 -0
- package/docs/recipes/builder-box-lifecycle.md +152 -0
- package/docs/recipes/claude-design-loop.md +143 -0
- package/docs/recipes/claude-gemini-bongos-doors.md +155 -0
- package/docs/recipes/cloudbongos-staging-gate.md +139 -0
- package/docs/recipes/cloudbongos-standup.md +111 -0
- package/docs/recipes/devbox-app-release.md +93 -0
- package/docs/recipes/devbox-app-windows-test.md +128 -0
- package/docs/recipes/failed-ship-recovery-proof.md +102 -0
- package/docs/recipes/figma-design-loop.md +129 -0
- package/docs/recipes/gds-db-backup.md +255 -0
- package/docs/recipes/instance-deploy.md +37 -0
- package/docs/recipes/managed-settings-remote-control.md +416 -0
- package/docs/recipes/memory-backup.md +71 -0
- package/docs/recipes/memory-sync-conflicts.md +98 -0
- package/docs/recipes/multi-builder-merge.md +78 -0
- package/docs/recipes/ops-gotchas.md +212 -0
- package/docs/recipes/overnight-builder.md +53 -0
- package/docs/recipes/packaging-the-core.md +49 -0
- package/docs/recipes/parallel-load-results-2026-05-30.md +63 -0
- package/docs/recipes/parallel-load-test.md +32 -0
- package/docs/recipes/pixel-art-pipeline.md +411 -0
- package/docs/recipes/private-npm-distribution.md +79 -0
- package/docs/recipes/search-index-ingestion.md +67 -0
- package/docs/recipes/self-host.md +60 -0
- package/docs/recipes/ship-and-regrade.md +72 -0
- package/docs/recipes/staging-data.md +50 -0
- package/docs/recipes/staging-environment.md +215 -0
- package/docs/recipes/upgrading-the-core.md +58 -0
- package/docs/research/cursor-competitive-analysis.md +255 -0
- package/docs/research/llm-model-agnostic-and-cheaper-grader.md +227 -0
- package/migrations/003_pms.sql +284 -0
- package/migrations/004_pms_cost_idempotency.sql +13 -0
- package/migrations/005_pms_smoke_filter.sql +44 -0
- package/migrations/006_pms_v2.sql +378 -0
- package/migrations/007_pms_v2_hierarchy_trigger.sql +59 -0
- package/migrations/008_pms_v2_migration_allocator.sql +27 -0
- package/migrations/009_pms_v2_blockers_table.sql +68 -0
- package/migrations/010_uptime.sql +29 -0
- package/migrations/011_backfill_v2_v3_done_when.sql +20 -0
- package/migrations/012_pms_v2_task_lifecycle_states.sql +82 -0
- package/migrations/013_claim_locking.sql +22 -0
- package/migrations/014_pms_task_discipline.sql +86 -0
- package/migrations/015_pms_estimation_calibration.sql +140 -0
- package/migrations/016_pms_task_grades.sql +60 -0
- package/migrations/017_version_progress_exclude_abandoned.sql +49 -0
- package/migrations/019_rename_pms_v3_to_gds_v3.sql +65 -0
- package/migrations/020_task_dependencies.sql +99 -0
- package/migrations/021_v3_renumber_and_deps.sql +224 -0
- package/migrations/022_v3_reconcile_dep_gated_status.sql +41 -0
- package/migrations/023_pms_rank.sql +30 -0
- package/migrations/025_builder_exit_status.sql +15 -0
- package/migrations/027_builders_preferred_disciplines.sql +46 -0
- package/migrations/028_tasks_parallel_safe.sql +71 -0
- package/migrations/029_rank_three_live.sql +32 -0
- package/migrations/030_vulnerability_reports.sql +61 -0
- package/migrations/031_reward_simplification.sql +57 -0
- package/migrations/032_repo_health_snapshots.sql +56 -0
- package/migrations/033_audit_log.sql +64 -0
- package/migrations/034_lifecycle_breakdown_leaf_only.sql +62 -0
- package/migrations/035_auth_token_hygiene.sql +66 -0
- package/migrations/037_builder_skill_model_prefs.sql +44 -0
- package/migrations/038_task_override_requests.sql +51 -0
- package/migrations/039_newcomer_friendly_column.sql +124 -0
- package/migrations/040_builder_karma.sql +58 -0
- package/migrations/041_kind_multipliers_and_idea_bonus.sql +42 -0
- package/migrations/042_criterion_proposal_workflow.sql +78 -0
- package/migrations/043_builder_onboarding_observability.sql +66 -0
- package/migrations/044_tasks_requires_rank.sql +97 -0
- package/migrations/045_builder_onboarding_state.sql +147 -0
- package/migrations/046_cost_log_builder_attribution.sql +42 -0
- package/migrations/054_builder_memory.sql +108 -0
- package/migrations/055_task_criteria.sql +90 -0
- package/migrations/058_peer_votes.sql +41 -0
- package/migrations/059_onboarding_pick_disciplines.sql +59 -0
- package/migrations/060_access_requests.sql +46 -0
- package/migrations/061_backfill_override_ship_attribution.sql +29 -0
- package/migrations/062_session_records.sql +34 -0
- package/migrations/063_session_records_tool_errors_idx.sql +11 -0
- package/migrations/064_grade_attempts.sql +18 -0
- package/migrations/065_bfg_principal.sql +58 -0
- package/migrations/066_live_notify_triggers.sql +69 -0
- package/migrations/067_builder_boxes.sql +117 -0
- package/migrations/067_discord_bot_foundation.sql +69 -0
- package/migrations/068_thetes_requires_rank.sql +27 -0
- package/migrations/069_builder_ssh_keys.sql +66 -0
- package/migrations/070_box_intents.sql +101 -0
- package/migrations/071_box_first_provision_approval.sql +46 -0
- package/migrations/072_onboarding_ship_three_remove_primer.sql +80 -0
- package/migrations/073_box_terminal_access.sql +46 -0
- package/migrations/075_builder_sound_prefs.sql +28 -0
- package/migrations/078_box_claude_active.sql +22 -0
- package/migrations/079_box_first_connected_at.sql +20 -0
- package/migrations/081_tasks_needs_migration.sql +34 -0
- package/migrations/084_tasks_security_sensitive.sql +24 -0
- package/migrations/085_security_engagement_docs.sql +34 -0
- package/migrations/086_rename_disciplines.sql +125 -0
- package/migrations/088_builders_anthropic_link.sql +28 -0
- package/migrations/089_builders_monthly_budget.sql +19 -0
- package/migrations/090_box_scoped_sessions.sql +38 -0
- package/migrations/091_session_token_reward.sql +44 -0
- package/migrations/093_tasks_sandbox_review.sql +22 -0
- package/migrations/102_remove_box_first_provision_approval.sql +58 -0
- package/migrations/103_search_chunks.sql +90 -0
- package/migrations/104_builder_box_blocked.sql +34 -0
- package/migrations/105_box_host_keys.sql +35 -0
- package/migrations/111_medusa_customer0_framing.sql +35 -0
- package/migrations/112_drop_track_check.sql +25 -0
- package/migrations/113_merge_lease.sql +16 -0
- package/migrations/114_cloudbongos_rename_live_strings.sql +32 -0
- package/migrations/118_currency_label_decoupling.sql +23 -0
- package/migrations/119_builder_behavior_prefs.sql +31 -0
- package/migrations/121_box_code_version.sql +37 -0
- package/migrations/122_builder_gemini_key.sql +30 -0
- package/migrations/123_cost_log_tiers.sql +33 -0
- package/migrations/124_cost_baseline.sql +45 -0
- package/migrations/125_llm_cache.sql +54 -0
- package/migrations/126_autonomy_runs.sql +33 -0
- package/migrations/143_cost_calibration.sql +63 -0
- package/migrations/145_backfill_task_requires_rank.sql +84 -0
- package/migrations/160_goal_tier.sql +88 -0
- package/migrations/163_polymorphic_dependencies.sql +187 -0
- package/migrations/164_event_sound_prefs.sql +20 -0
- package/migrations/165_task_module_key.sql +15 -0
- package/migrations/171_claims_published_head_sha.sql +24 -0
- package/migrations/174_close_orphaned_claims_on_terminal_tasks.sql +30 -0
- package/migrations/175_task_grades_diff_hash.sql +9 -0
- package/migrations/176_promotion_respects_open_blockers.sql +58 -0
- package/migrations/176_ui_discipline.sql +40 -0
- package/migrations/177_require_reward_before_workable.sql +76 -0
- package/migrations/178_reward_gate_auto_assign_revert_autopromote.sql +61 -0
- package/migrations/179_search_chunk_usefulness.sql +33 -0
- package/migrations/180_one_active_claim_per_session.sql +54 -0
- package/migrations/181_cost_log_skill_name.sql +33 -0
- package/migrations/184_claim_release_requested.sql +25 -0
- package/migrations/185_module_upstreaming_goal_wiring.sql +59 -0
- package/migrations/187_goal_sort_order.sql +30 -0
- package/migrations/187_tasks_kind_check_add_verify.sql +21 -0
- package/migrations/README.md +88 -0
- package/migrations/core_188_goal_visibility_and_membership_requests.sql +71 -0
- package/migrations/core_189_core_upgrades_ledger.sql +37 -0
- package/migrations/core_189_credit_log_task_id_index.sql +19 -0
- package/migrations/core_190_rebuild_claimable_task_views.sql +71 -0
- package/migrations/instance/018_pms_v3_planning_seed.sql +131 -0
- package/migrations/instance/080_gds_v4_planning_seed.sql +75 -0
- package/migrations/instance/110_medusa_planning_seed.sql +70 -0
- package/migrations/instance/120_bongos_v1_planning_seed.sql +69 -0
- package/migrations/instance/144_bongos_v1_module_system_criterion.sql +26 -0
- package/migrations/instance/159_bongos_v1_goal_hierarchy_criterion.sql +29 -0
- package/migrations/instance/172_v2_world_planning_seed.sql +163 -0
- package/migrations/instance/173_bongos_v1_c7_core_modularized.sql +33 -0
- package/migrations/instance/182_gdsv4_bongos_consolidation.sql +132 -0
- package/migrations/instance/183_gdsv4_carryover_themed_goals.sql +116 -0
- package/migrations/instance/186_bongos_v1_governance_planning_seed.sql +69 -0
- package/modules/autonomy/CLAUDE.md +49 -0
- package/modules/autonomy/db.js +50 -0
- package/modules/autonomy/module.json +13 -0
- package/modules/autonomy/pollers/routine-timers.js +146 -0
- package/modules/autonomy/routes/autonomy.js +37 -0
- package/modules/builder-settings/CLAUDE.md +58 -0
- package/modules/builder-settings/builder-needs.js +115 -0
- package/modules/builder-settings/db.js +168 -0
- package/modules/builder-settings/display-name.js +84 -0
- package/modules/builder-settings/event-sound-prefs.js +169 -0
- package/modules/builder-settings/interaction-prefs.js +201 -0
- package/modules/builder-settings/model-alloc-prefs.js +147 -0
- package/modules/builder-settings/module.json +10 -0
- package/modules/builder-settings/render-prefs.js +103 -0
- package/modules/builder-settings/routes/settings.js +417 -0
- package/modules/builder-settings/settings.js +52 -0
- package/modules/builder-settings/skill-prefs.js +196 -0
- package/modules/builder-settings/sound-prefs.js +178 -0
- package/modules/builder-settings/wandering-prefs.js +282 -0
- package/modules/dev-box/CLAUDE.md +38 -0
- package/modules/dev-box/box-access.js +275 -0
- package/modules/dev-box/box-credential.js +94 -0
- package/modules/dev-box/box-onboard.js +486 -0
- package/modules/dev-box/boxes.js +842 -0
- package/modules/dev-box/db.js +39 -0
- package/modules/dev-box/module.json +14 -0
- package/modules/dev-box/routes/box.js +977 -0
- package/modules/discord/CLAUDE.md +50 -0
- package/modules/discord/auth.js +54 -0
- package/modules/discord/bug-attachments.js +210 -0
- package/modules/discord/db.js +96 -0
- package/modules/discord/discord-approvals.js +145 -0
- package/modules/discord/discord-audit.js +29 -0
- package/modules/discord/discord-bot.js +545 -0
- package/modules/discord/discord-bugs.js +257 -0
- package/modules/discord/discord-channels.js +412 -0
- package/modules/discord/discord-inbound.js +147 -0
- package/modules/discord/discord-message-buffer.js +54 -0
- package/modules/discord/discord-reaction.js +186 -0
- package/modules/discord/discord-role-sync.js +318 -0
- package/modules/discord/module.json +14 -0
- package/modules/discord/pollers/discord-bot.js +19 -0
- package/modules/discord/routes/bug-attachments.js +44 -0
- package/modules/discord/routes/discord.js +102 -0
- package/modules/discord/ship-broadcast.js +78 -0
- package/modules/discord/webhook.js +74 -0
- package/modules/economy/CLAUDE.md +48 -0
- package/modules/economy/achievements.js +594 -0
- package/modules/economy/cost-classify.js +331 -0
- package/modules/economy/cost-summary-shape.js +90 -0
- package/modules/economy/cost.js +438 -0
- package/modules/economy/credits.js +430 -0
- package/modules/economy/migrations/economy_001_fix_gds_shipper_description.sql +91 -0
- package/modules/economy/module.json +10 -0
- package/modules/economy/reward.js +61 -0
- package/modules/economy/routes/cost.js +97 -0
- package/modules/economy/routes/leaderboard.js +26 -0
- package/modules/economy/routes/reward.js +42 -0
- package/modules/economy/streak.js +285 -0
- package/modules/grading/CLAUDE.md +42 -0
- package/modules/grading/db.js +39 -0
- package/modules/grading/grader-rubric.json +151 -0
- package/modules/grading/grader-workers/efficiency.js +213 -0
- package/modules/grading/grader-workers/extract-json.js +80 -0
- package/modules/grading/grader-workers/fence.js +100 -0
- package/modules/grading/grader-workers/hacker.js +239 -0
- package/modules/grading/grader-workers/index.js +183 -0
- package/modules/grading/grader-workers/narc.js +207 -0
- package/modules/grading/grader-workers/quality.js +198 -0
- package/modules/grading/grader-workers/rubric.js +20 -0
- package/modules/grading/grader-workers/worker-prompt.js +89 -0
- package/modules/grading/grader-workers/worker-verdict.js +50 -0
- package/modules/grading/grader.js +1790 -0
- package/modules/grading/module.json +12 -0
- package/modules/grading/routes/grade.js +51 -0
- package/modules/hall-ui/CLAUDE.md +61 -0
- package/modules/hall-ui/module.json +14 -0
- package/modules/hall-ui/public/atlas.html +180 -0
- package/modules/hall-ui/public/atlas.js +336 -0
- package/modules/hall-ui/public/box-panel.js +423 -0
- package/modules/hall-ui/public/brand-apply.js +117 -0
- package/modules/hall-ui/public/builders.js +3028 -0
- package/modules/hall-ui/public/chime.wav +0 -0
- package/modules/hall-ui/public/copy-on-click.js +174 -0
- package/modules/hall-ui/public/cursors/arrow.png +0 -0
- package/modules/hall-ui/public/cursors/hand-pointer.png +0 -0
- package/modules/hall-ui/public/cursors/magnifier-out.png +0 -0
- package/modules/hall-ui/public/cursors/magnifier.png +0 -0
- package/modules/hall-ui/public/diagram-viewer.css +125 -0
- package/modules/hall-ui/public/diagram-viewer.js +330 -0
- package/modules/hall-ui/public/diagrams.html +113 -0
- package/modules/hall-ui/public/dom-utils.js +212 -0
- package/modules/hall-ui/public/drachmae.html +68 -0
- package/modules/hall-ui/public/drachmae.js +136 -0
- package/modules/hall-ui/public/gate.html +143 -0
- package/modules/hall-ui/public/gate.js +228 -0
- package/modules/hall-ui/public/goals-page.js +1297 -0
- package/modules/hall-ui/public/goals.html +376 -0
- package/modules/hall-ui/public/goals.js +119 -0
- package/modules/hall-ui/public/hall-widgets.js +189 -0
- package/modules/hall-ui/public/harbor.html +167 -0
- package/modules/hall-ui/public/harbor.js +335 -0
- package/modules/hall-ui/public/index.html +116 -0
- package/modules/hall-ui/public/instances-panel.js +172 -0
- package/modules/hall-ui/public/md-reader.js +234 -0
- package/modules/hall-ui/public/modules.html +119 -0
- package/modules/hall-ui/public/modules.js +154 -0
- package/modules/hall-ui/public/new-project-wizard.js +186 -0
- package/modules/hall-ui/public/not-ready.html +48 -0
- package/modules/hall-ui/public/pair.html +119 -0
- package/modules/hall-ui/public/pair.js +132 -0
- package/modules/hall-ui/public/primer.css +404 -0
- package/modules/hall-ui/public/primer.html +85 -0
- package/modules/hall-ui/public/primer.js +641 -0
- package/modules/hall-ui/public/profile.html +85 -0
- package/modules/hall-ui/public/profile.js +236 -0
- package/modules/hall-ui/public/ranks.html +69 -0
- package/modules/hall-ui/public/ranks.js +206 -0
- package/modules/hall-ui/public/roadmap.html +209 -0
- package/modules/hall-ui/public/roadmap.js +375 -0
- package/modules/hall-ui/public/sessions.html +92 -0
- package/modules/hall-ui/public/sessions.js +222 -0
- package/modules/hall-ui/public/settings.html +640 -0
- package/modules/hall-ui/public/settings.js +1219 -0
- package/modules/hall-ui/public/shell.js +495 -0
- package/modules/hall-ui/public/style.css +1748 -0
- package/modules/hall-ui/public/task-detail.js +253 -0
- package/modules/hall-ui/public/task.html +83 -0
- package/modules/hall-ui/public/task.js +326 -0
- package/modules/hall-ui/public/watch.html +333 -0
- package/modules/hall-ui/public/watch.js +859 -0
- package/modules/hall-ui/public/work.html +469 -0
- package/modules/hall-ui/public/work.js +1292 -0
- package/modules/ideas/CLAUDE.md +37 -0
- package/modules/ideas/blockers.js +100 -0
- package/modules/ideas/inbox.js +459 -0
- package/modules/ideas/module.json +10 -0
- package/modules/ideas/routes/blockers.js +120 -0
- package/modules/ideas/routes/inbox.js +230 -0
- package/modules/lifecycle/CLAUDE.md +63 -0
- package/modules/lifecycle/conflict-resolve.js +436 -0
- package/modules/lifecycle/db.js +4970 -0
- package/modules/lifecycle/done-when.js +355 -0
- package/modules/lifecycle/github-push.js +969 -0
- package/modules/lifecycle/goal-conflicts.js +133 -0
- package/modules/lifecycle/hierarchy.js +104 -0
- package/modules/lifecycle/lifecycle.js +58 -0
- package/modules/lifecycle/merge-lock.js +261 -0
- package/modules/lifecycle/migrations/lifecycle_001_goal_first_leads.sql +28 -0
- package/modules/lifecycle/migrations/lifecycle_002_backfill_orphan_task_goals.sql +36 -0
- package/modules/lifecycle/module.json +13 -0
- package/modules/lifecycle/pollers/publish-reconciler.js +20 -0
- package/modules/lifecycle/publish-reconciler.js +418 -0
- package/modules/lifecycle/routes/analytics.js +63 -0
- package/modules/lifecycle/routes/claims.js +506 -0
- package/modules/lifecycle/routes/dependencies.js +82 -0
- package/modules/lifecycle/routes/done-when.js +136 -0
- package/modules/lifecycle/routes/gate-approvals.js +197 -0
- package/modules/lifecycle/routes/goals.js +1419 -0
- package/modules/lifecycle/routes/lifecycle.js +43 -0
- package/modules/lifecycle/routes/tasks.js +1703 -0
- package/modules/lifecycle/routes/versions.js +128 -0
- package/modules/lifecycle/ship-card.js +505 -0
- package/modules/lifecycle/ship-preflight.js +225 -0
- package/modules/lifecycle/task-classifier.js +512 -0
- package/modules/lifecycle/version-close.js +106 -0
- package/modules/memory/CLAUDE.md +40 -0
- package/modules/memory/learnings.js +275 -0
- package/modules/memory/memory.js +572 -0
- package/modules/memory/module.json +12 -0
- package/modules/memory/routes/learnings.js +90 -0
- package/modules/memory/routes/memory.js +916 -0
- package/modules/memory/routes/search.js +188 -0
- package/modules/memory/search-chunker.js +252 -0
- package/modules/memory/search.js +320 -0
- package/modules/onboarding/CLAUDE.md +55 -0
- package/modules/onboarding/approval-broadcast.js +59 -0
- package/modules/onboarding/db.js +54 -0
- package/modules/onboarding/module.json +10 -0
- package/modules/onboarding/newcomer-restock.js +212 -0
- package/modules/onboarding/onboarding-state.js +532 -0
- package/modules/onboarding/onboarding.js +508 -0
- package/modules/onboarding/port.js +63 -0
- package/modules/onboarding/routes/access-requests.js +208 -0
- package/modules/onboarding/routes/onboarding.js +54 -0
- package/modules/security/CLAUDE.md +44 -0
- package/modules/security/module.json +10 -0
- package/modules/security/routes/reports.js +251 -0
- package/modules/security/secret-scrub.js +201 -0
- package/modules/security/security.js +294 -0
- package/modules/sessions/CLAUDE.md +39 -0
- package/modules/sessions/bfg.js +357 -0
- package/modules/sessions/db.js +326 -0
- package/modules/sessions/module.json +10 -0
- package/modules/sessions/pulse.js +149 -0
- package/modules/sessions/routes/sessions.js +331 -0
- package/modules/status-ui/CLAUDE.md +47 -0
- package/modules/status-ui/module.json +14 -0
- package/modules/status-ui/public/README.md +29 -0
- package/modules/status-ui/public/cursors/arrow.png +0 -0
- package/modules/status-ui/public/cursors/hand-pointer.png +0 -0
- package/modules/status-ui/public/index.html +363 -0
- package/modules/status-ui/public/snapshots/.gitkeep +0 -0
- package/modules/status-ui/public/status.js +1375 -0
- package/modules/status-ui/public/style.css +1342 -0
- package/package-lock.json +975 -0
- package/package.json +28 -0
- package/public-docs/index.html +35 -0
- package/public-docs/redoc.standalone.js +1838 -0
- package/public-docs/redoc.standalone.js.LICENSE.txt +102 -0
- package/public-landing/buddha.png +0 -0
- package/public-landing/create.html +868 -0
- package/public-landing/index.html +168 -0
- package/scripts/bongos-mcp.js +28 -0
- package/scripts/cron/style_guide_audit.sh +134 -0
- package/scripts/discord/README.md +52 -0
- package/scripts/discord/lib.js +80 -0
- package/scripts/discord/post.js +51 -0
- package/scripts/gds/CLAUDE.md +144 -0
- package/scripts/gds/abandon.js +58 -0
- package/scripts/gds/adopt-detect.js +123 -0
- package/scripts/gds/adopt-import.js +111 -0
- package/scripts/gds/adopt-preflight.js +121 -0
- package/scripts/gds/api.js +78 -0
- package/scripts/gds/architect-audit.js +288 -0
- package/scripts/gds/art-stage.js +152 -0
- package/scripts/gds/audit-authorship.sh +243 -0
- package/scripts/gds/audit-deps.js +121 -0
- package/scripts/gds/audit-exports.js +128 -0
- package/scripts/gds/audit-replay.sh +161 -0
- package/scripts/gds/audit-ships.js +251 -0
- package/scripts/gds/autonomy-gate.js +135 -0
- package/scripts/gds/backfill-cost.js +165 -0
- package/scripts/gds/backfill-sessions.js +351 -0
- package/scripts/gds/backfill-task-rewards.js +408 -0
- package/scripts/gds/backup.js +94 -0
- package/scripts/gds/bfg-principal-token.js +65 -0
- package/scripts/gds/box-auth-check.js +160 -0
- package/scripts/gds/box-connect-lib.js +453 -0
- package/scripts/gds/box.js +1258 -0
- package/scripts/gds/build-bongos.js +94 -0
- package/scripts/gds/capture.js +123 -0
- package/scripts/gds/cf-tunnel.js +419 -0
- package/scripts/gds/ci-grade.js +82 -0
- package/scripts/gds/claim-recall.js +112 -0
- package/scripts/gds/claim.js +333 -0
- package/scripts/gds/classify-discipline.js +153 -0
- package/scripts/gds/claude-materialize.js +176 -0
- package/scripts/gds/cleanup-orphans.js +74 -0
- package/scripts/gds/cli-lib.js +518 -0
- package/scripts/gds/code.js +101 -0
- package/scripts/gds/codemod-rename-src-gds.js +145 -0
- package/scripts/gds/conductor-dispatch.js +426 -0
- package/scripts/gds/context-pack.js +228 -0
- package/scripts/gds/coreB-carve-proof.sh +716 -0
- package/scripts/gds/cost.js +47 -0
- package/scripts/gds/db-backup-nightly.sh +160 -0
- package/scripts/gds/db-backup-offsite.sh +152 -0
- package/scripts/gds/demote.js +40 -0
- package/scripts/gds/design-sync.js +62 -0
- package/scripts/gds/diagnose-achievements.js +118 -0
- package/scripts/gds/diagram-facts.js +319 -0
- package/scripts/gds/discipline-modes.json +25 -0
- package/scripts/gds/discord-channels.js +66 -0
- package/scripts/gds/do-api.js +176 -0
- package/scripts/gds/docs-entropy.js +403 -0
- package/scripts/gds/doctor.js +389 -0
- package/scripts/gds/feedback-latest.js +94 -0
- package/scripts/gds/fetch-art-key.js +106 -0
- package/scripts/gds/fetch-sound-prefs.js +88 -0
- package/scripts/gds/figma-design-sync.js +61 -0
- package/scripts/gds/fitness.js +1446 -0
- package/scripts/gds/gate-review.js +322 -0
- package/scripts/gds/gating.js +325 -0
- package/scripts/gds/gds-db-backup.service +24 -0
- package/scripts/gds/gds-db-backup.timer +20 -0
- package/scripts/gds/gds-db-offsite.service +29 -0
- package/scripts/gds/gds-db-offsite.timer +18 -0
- package/scripts/gds/gen-api-client.js +508 -0
- package/scripts/gds/gen-api-docs.js +1037 -0
- package/scripts/gds/gen-atlas.js +366 -0
- package/scripts/gds/gen-diagrams.js +608 -0
- package/scripts/gds/gen-file-map.js +196 -0
- package/scripts/gds/gen-repo-map.js +519 -0
- package/scripts/gds/gen-session-index.js +210 -0
- package/scripts/gds/git-merge-regen.js +147 -0
- package/scripts/gds/grade-smoke.js +205 -0
- package/scripts/gds/hooks/pre-push.js +169 -0
- package/scripts/gds/http-api-client.js +88 -0
- package/scripts/gds/init.js +903 -0
- package/scripts/gds/install-git-hooks.js +114 -0
- package/scripts/gds/key-card.js +213 -0
- package/scripts/gds/key-status.js +126 -0
- package/scripts/gds/land-watch.js +168 -0
- package/scripts/gds/learning-capture.js +145 -0
- package/scripts/gds/lib.sh +44 -0
- package/scripts/gds/linkify-refs.js +473 -0
- package/scripts/gds/local-preview-lib.js +159 -0
- package/scripts/gds/local-preview.js +95 -0
- package/scripts/gds/login.js +225 -0
- package/scripts/gds/main-audit.js +279 -0
- package/scripts/gds/me.js +88 -0
- package/scripts/gds/memory-map.js +174 -0
- package/scripts/gds/merge-lock.js +71 -0
- package/scripts/gds/migration-namespace.js +200 -0
- package/scripts/gds/mirror-lineage-check.js +319 -0
- package/scripts/gds/mirror-redact.js +305 -0
- package/scripts/gds/module.js +482 -0
- package/scripts/gds/newcomer-floor.config.json +13 -0
- package/scripts/gds/newcomer-floor.js +415 -0
- package/scripts/gds/newcomer-floor.templates.json +86 -0
- package/scripts/gds/newcomer-floor.test.js +235 -0
- package/scripts/gds/next-number.js +163 -0
- package/scripts/gds/oauth-secret.js +197 -0
- package/scripts/gds/onboard.js +217 -0
- package/scripts/gds/onboarding-analyze.js +226 -0
- package/scripts/gds/onboarding-config.js +178 -0
- package/scripts/gds/onboarding-ship.js +92 -0
- package/scripts/gds/package-core.js +684 -0
- package/scripts/gds/paste-token.js +131 -0
- package/scripts/gds/portability-smoke-art.sh +85 -0
- package/scripts/gds/portability-smoke-memory.sh +147 -0
- package/scripts/gds/provision.js +1324 -0
- package/scripts/gds/publish-manifest.js +307 -0
- package/scripts/gds/pulse.js +309 -0
- package/scripts/gds/push-main.js +45 -0
- package/scripts/gds/read-session-export.js +359 -0
- package/scripts/gds/reauth.js +149 -0
- package/scripts/gds/recall.js +135 -0
- package/scripts/gds/release.js +71 -0
- package/scripts/gds/render-ideas.js +173 -0
- package/scripts/gds/repo-metrics.js +363 -0
- package/scripts/gds/resolve-skill-model.js +57 -0
- package/scripts/gds/run-routine.js +197 -0
- package/scripts/gds/run-unit-tests.js +178 -0
- package/scripts/gds/sandbox-stage.js +653 -0
- package/scripts/gds/search-ingest-db.js +209 -0
- package/scripts/gds/search-ingest-md.js +225 -0
- package/scripts/gds/security-baseline-check.sh +180 -0
- package/scripts/gds/seed-adopt-tasks.js +75 -0
- package/scripts/gds/seed-api-contract-goal-tasks.js +141 -0
- package/scripts/gds/seed-bongos-app-tasks.js +294 -0
- package/scripts/gds/seed-bongos-coreB-tranche1-tasks.js +81 -0
- package/scripts/gds/seed-bongos-coreB-tranche2-tasks.js +100 -0
- package/scripts/gds/seed-bongos-goal-hierarchy-tasks.js +307 -0
- package/scripts/gds/seed-bongos-module-system-tasks.js +346 -0
- package/scripts/gds/seed-bongos-tasks.js +214 -0
- package/scripts/gds/seed-gds-v4-tasks.js +624 -0
- package/scripts/gds/seed-governance-tasks.js +340 -0
- package/scripts/gds/seed-medusa-tasks.js +440 -0
- package/scripts/gds/seed-module-upstreaming.js +219 -0
- package/scripts/gds/seed-productization-tasks.js +235 -0
- package/scripts/gds/seed-provisioning-tasks.js +83 -0
- package/scripts/gds/seed-staging.sh +104 -0
- package/scripts/gds/seed-v2-world-tasks.js +283 -0
- package/scripts/gds/seed-v3-tasks.js +1981 -0
- package/scripts/gds/session-cost.js +393 -0
- package/scripts/gds/session-digest.js +179 -0
- package/scripts/gds/session-eval.js +576 -0
- package/scripts/gds/session.js +404 -0
- package/scripts/gds/setup.js +504 -0
- package/scripts/gds/shell.js +100 -0
- package/scripts/gds/ship.js +3618 -0
- package/scripts/gds/smoke-batch-claim.sh +213 -0
- package/scripts/gds/smoke-batch-release.sh +296 -0
- package/scripts/gds/smoke-box.sh +150 -0
- package/scripts/gds/smoke-claim-consistency.sh +212 -0
- package/scripts/gds/smoke-dependencies.sh +84 -0
- package/scripts/gds/smoke-gds.js +125 -0
- package/scripts/gds/smoke-write.sh +168 -0
- package/scripts/gds/start.js +782 -0
- package/scripts/gds/status.js +365 -0
- package/scripts/gds/triage.js +366 -0
- package/scripts/gds/upgrade.js +421 -0
- package/scripts/gds/validate-design.js +254 -0
- package/scripts/gds/version-close.js +549 -0
- package/scripts/migrate.sh +183 -0
- package/scripts/migrate_cost_ledger.sh +178 -0
- package/scripts/public-mirror-export.js +291 -0
- package/scripts/render-diagrams.sh +88 -0
- package/scripts/security/dep-audit.js +276 -0
- package/scripts/setup-builder.js +274 -0
- package/scripts/setup-builder.sh +28 -0
- package/scripts/snapshots/backfill-history.mjs +292 -0
- package/scripts/snapshots/maybe-render-on-deploy.sh +66 -0
- package/scripts/snapshots/render-pre-art-eras.mjs +329 -0
- package/scripts/snapshots/render-world.mjs +322 -0
- package/scripts/status-mirror-sync.js +192 -0
- package/scripts/status-probe.mjs +185 -0
- package/server.js +212 -0
- package/src/asset-version.js +71 -0
- package/src/bongos/CLAUDE.md +64 -0
- package/src/bongos/api-errors.js +281 -0
- package/src/bongos/api-path-404.js +67 -0
- package/src/bongos/api-prefix.js +38 -0
- package/src/bongos/app-pair.js +172 -0
- package/src/bongos/auth.js +979 -0
- package/src/bongos/cascade-dispatch.js +123 -0
- package/src/bongos/db-kernel.js +252 -0
- package/src/bongos/db.js +911 -0
- package/src/bongos/goal-scope-check.js +120 -0
- package/src/bongos/hierarchy-config.js +189 -0
- package/src/bongos/live-channel.js +145 -0
- package/src/bongos/llm-cache.js +260 -0
- package/src/bongos/llm-pricing.js +220 -0
- package/src/bongos/metrics.js +286 -0
- package/src/bongos/middleware/audit.js +274 -0
- package/src/bongos/middleware/error-envelope.js +93 -0
- package/src/bongos/middleware/rate-limit.js +195 -0
- package/src/bongos/module-scope-map.js +271 -0
- package/src/bongos/optimizer.js +166 -0
- package/src/bongos/path-match.js +47 -0
- package/src/bongos/permission-path-check.js +248 -0
- package/src/bongos/pool.js +55 -0
- package/src/bongos/repo-info.js +91 -0
- package/src/bongos/route-rank-check.js +420 -0
- package/src/bongos/routes/CLAUDE.md +43 -0
- package/src/bongos/routes/_helpers.js +369 -0
- package/src/bongos/routes/audit-log.js +59 -0
- package/src/bongos/routes/auth.js +755 -0
- package/src/bongos/routes/backup.js +104 -0
- package/src/bongos/routes/builders.js +526 -0
- package/src/bongos/routes/healthz.js +16 -0
- package/src/bongos/routes/instance.js +129 -0
- package/src/bongos/routes/live.js +125 -0
- package/src/bongos/routes/llm-cache.js +119 -0
- package/src/bongos/routes/me.js +380 -0
- package/src/bongos/routes/modules.js +131 -0
- package/src/bongos/routes/optimizer.js +54 -0
- package/src/bongos/routes/public.js +476 -0
- package/src/bongos/routes/security.js +207 -0
- package/src/bongos/routes.js +166 -0
- package/src/bongos/secret-box.js +177 -0
- package/src/bongos/sensitive-surfaces.js +30 -0
- package/src/bongos/serve-internal.js +889 -0
- package/src/bongos/uptime-poller.js +90 -0
- package/src/bongos-downloads.js +70 -0
- package/src/branding.js +182 -0
- package/src/build-info.js +77 -0
- package/src/devbox-downloads.js +67 -0
- package/src/instance-config.js +200 -0
- package/src/module-api.js +366 -0
- package/src/module-loader/loader.js +268 -0
- package/src/module-loader/manifest-schema.js +140 -0
- package/src/module-loader/provenance.js +28 -0
- package/src/module-loader/semver.js +100 -0
- package/src/module-seams.js +291 -0
- package/src/modules.js +254 -0
- package/src/platform-server.js +135 -0
- package/src/ui/adapters/claude-design/index.js +333 -0
- package/src/ui/adapters/figma/index.js +328 -0
- package/tests/abandon_task.mjs +138 -0
- package/tests/achievements_reconcile.mjs +167 -0
- package/tests/adopt_detect.mjs +141 -0
- package/tests/adopt_import.mjs +132 -0
- package/tests/adopt_preflight.mjs +105 -0
- package/tests/anti_grid.mjs +89 -0
- package/tests/api_client.mjs +231 -0
- package/tests/api_docs.mjs +283 -0
- package/tests/api_error_envelope_buildcheck.mjs +56 -0
- package/tests/api_error_envelope_middleware.mjs +99 -0
- package/tests/api_error_registry.mjs +108 -0
- package/tests/api_pagination_contract.mjs +51 -0
- package/tests/api_path_404.mjs +96 -0
- package/tests/app_pair.mjs +168 -0
- package/tests/architect.mjs +140 -0
- package/tests/art_key.mjs +121 -0
- package/tests/art_stage.mjs +121 -0
- package/tests/asset_version.mjs +94 -0
- package/tests/atlas.mjs +69 -0
- package/tests/audit_deps.mjs +74 -0
- package/tests/audit_middleware.mjs +385 -0
- package/tests/auth_admission_gate.mjs +164 -0
- package/tests/auth_anthropic_identity.mjs +95 -0
- package/tests/auth_duplicate_cookie.mjs +56 -0
- package/tests/auth_error_brand.mjs +77 -0
- package/tests/auth_flow_slice1.mjs +223 -0
- package/tests/auth_inactive_builder.mjs +94 -0
- package/tests/auth_page_gate.mjs +92 -0
- package/tests/auth_session_ttl.mjs +155 -0
- package/tests/autonomous_fit_protected_paths.mjs +115 -0
- package/tests/autonomy_gate.mjs +85 -0
- package/tests/autotile_variants.mjs +256 -0
- package/tests/autotile_xverify.mjs +133 -0
- package/tests/backfill_sessions.mjs +101 -0
- package/tests/backfill_task_rewards.mjs +152 -0
- package/tests/backup_cli.mjs +104 -0
- package/tests/bfg.mjs +327 -0
- package/tests/bfg_write.mjs +423 -0
- package/tests/bongos_box_connect.mjs +89 -0
- package/tests/bongos_dispatch.mjs +74 -0
- package/tests/bongos_downloads.mjs +118 -0
- package/tests/bongos_login.mjs +34 -0
- package/tests/box_access.mjs +186 -0
- package/tests/box_auth_check.mjs +114 -0
- package/tests/box_code_staleness.mjs +116 -0
- package/tests/box_connect_e2e.mjs +196 -0
- package/tests/box_cost.mjs +70 -0
- package/tests/box_dns_repoint.mjs +151 -0
- package/tests/box_host_keys.mjs +102 -0
- package/tests/box_onboard.mjs +317 -0
- package/tests/box_scope_session.mjs +115 -0
- package/tests/box_ship_permissions.mjs +71 -0
- package/tests/box_terminal_ssrf.mjs +90 -0
- package/tests/boxes.mjs +1255 -0
- package/tests/branding.mjs +88 -0
- package/tests/bug_attachments.mjs +189 -0
- package/tests/build_info.mjs +88 -0
- package/tests/builder_needs.mjs +99 -0
- package/tests/cap_newcomer_tasks.mjs +114 -0
- package/tests/cascade-dispatch.mjs +95 -0
- package/tests/cf_tunnel.mjs +459 -0
- package/tests/claim_recall.mjs +150 -0
- package/tests/claims_bind_session.mjs +47 -0
- package/tests/claude_materialize.mjs +148 -0
- package/tests/cli_box_scope.mjs +52 -0
- package/tests/cli_lib_formatters.mjs +87 -0
- package/tests/cli_token_reissue.mjs +147 -0
- package/tests/client_bundle_route.mjs +47 -0
- package/tests/cloud_bongos_pack.mjs +85 -0
- package/tests/conductor.mjs +496 -0
- package/tests/confirm_attribution.mjs +156 -0
- package/tests/conflict_resolve.mjs +462 -0
- package/tests/context_pack.mjs +240 -0
- package/tests/cost.mjs +94 -0
- package/tests/cost_audit.mjs +122 -0
- package/tests/cost_budget_status.mjs +78 -0
- package/tests/cost_reconcile.mjs +102 -0
- package/tests/cost_summary_shape.mjs +94 -0
- package/tests/credit_grant.mjs +376 -0
- package/tests/criterion_progress.mjs +220 -0
- package/tests/criterion_proposal.mjs +109 -0
- package/tests/criterion_ref_parse.mjs +53 -0
- package/tests/currency_label.mjs +119 -0
- package/tests/day_cycle.mjs +197 -0
- package/tests/dependencies_migration.mjs +77 -0
- package/tests/dependencies_polymorphic.mjs +212 -0
- package/tests/deploy_instance.mjs +78 -0
- package/tests/devbox_downloads.mjs +122 -0
- package/tests/diff_derived_signals.mjs +115 -0
- package/tests/discord_approvals.mjs +174 -0
- package/tests/discord_autojoin.mjs +158 -0
- package/tests/discord_bot.mjs +94 -0
- package/tests/discord_bugs.mjs +297 -0
- package/tests/discord_channels.mjs +337 -0
- package/tests/discord_foundation.mjs +76 -0
- package/tests/discord_inbound.mjs +190 -0
- package/tests/discord_message_buffer.mjs +87 -0
- package/tests/discord_oauth.mjs +55 -0
- package/tests/discord_reaction.mjs +170 -0
- package/tests/discord_role_sync.mjs +151 -0
- package/tests/display_name.mjs +123 -0
- package/tests/dns_preflight.mjs +74 -0
- package/tests/event_sound_prefs.mjs +194 -0
- package/tests/eviction_policy.mjs +279 -0
- package/tests/figma_adapter.mjs +199 -0
- package/tests/file_map.mjs +91 -0
- package/tests/first_admin_bootstrap.mjs +40 -0
- package/tests/fitness.mjs +435 -0
- package/tests/fitness_two_root.mjs +104 -0
- package/tests/fixtures/session-506-digest.json +34 -0
- package/tests/gate_approvals.mjs +451 -0
- package/tests/gate_review.mjs +152 -0
- package/tests/git_merge_regen.mjs +151 -0
- package/tests/github_push_ancestry.mjs +119 -0
- package/tests/github_push_land_proof.mjs +127 -0
- package/tests/github_push_merge_driver.mjs +175 -0
- package/tests/goal_abuse_matrix.mjs +187 -0
- package/tests/goal_achievement.mjs +146 -0
- package/tests/goal_conflicts.mjs +305 -0
- package/tests/goal_dependencies_read.mjs +73 -0
- package/tests/goal_member_roles.mjs +420 -0
- package/tests/goal_membership_requests.mjs +332 -0
- package/tests/goal_routes.mjs +203 -0
- package/tests/goal_scope_check.mjs +167 -0
- package/tests/goal_tier.mjs +312 -0
- package/tests/goal_wall_proof.mjs +112 -0
- package/tests/grade_attempts.mjs +73 -0
- package/tests/grade_attribution.mjs +117 -0
- package/tests/grade_diff_hash.mjs +191 -0
- package/tests/grade_server_authoritative.mjs +305 -0
- package/tests/grade_unavailable_display.mjs +66 -0
- package/tests/grader.mjs +1960 -0
- package/tests/grader_bypass.mjs +57 -0
- package/tests/grader_panel.mjs +252 -0
- package/tests/grader_prompt_fencing.mjs +192 -0
- package/tests/helpers.mjs +52 -0
- package/tests/hierarchy-config.mjs +81 -0
- package/tests/init.mjs +463 -0
- package/tests/instance_config.mjs +76 -0
- package/tests/instance_manifest.mjs +110 -0
- package/tests/interaction_prefs.mjs +72 -0
- package/tests/key-card.mjs +110 -0
- package/tests/key-status.mjs +45 -0
- package/tests/land_watch.mjs +115 -0
- package/tests/lifecycle-card.mjs +145 -0
- package/tests/lifecycle_breakdown_view.mjs +236 -0
- package/tests/linkify_refs.mjs +264 -0
- package/tests/live_channel.mjs +128 -0
- package/tests/live_sse.mjs +122 -0
- package/tests/llm-cache-route.mjs +110 -0
- package/tests/llm-cache.mjs +140 -0
- package/tests/llm-pricing.mjs +152 -0
- package/tests/local_preview.mjs +136 -0
- package/tests/main_audit.mjs +137 -0
- package/tests/memory_isolation.mjs +431 -0
- package/tests/memory_map.mjs +107 -0
- package/tests/memory_pull.mjs +429 -0
- package/tests/merge_lease.mjs +100 -0
- package/tests/merge_lock.mjs +312 -0
- package/tests/metrics.mjs +147 -0
- package/tests/migration_allocation.mjs +146 -0
- package/tests/migration_namespace.mjs +185 -0
- package/tests/migrations_fresh_replay_guard.mjs +38 -0
- package/tests/mirror_lineage_fulltree.mjs +45 -0
- package/tests/mirror_lineage_proof.mjs +72 -0
- package/tests/mirror_redact.mjs +193 -0
- package/tests/model_alloc_prefs.mjs +63 -0
- package/tests/module-scope-map.mjs +88 -0
- package/tests/module_api.mjs +110 -0
- package/tests/module_cli.mjs +292 -0
- package/tests/module_contributions.mjs +148 -0
- package/tests/module_loader.mjs +286 -0
- package/tests/module_manifest.mjs +194 -0
- package/tests/module_owned_tests.mjs +105 -0
- package/tests/module_provenance.mjs +34 -0
- package/tests/module_route_rank.mjs +147 -0
- package/tests/module_seams.mjs +68 -0
- package/tests/modules.mjs +156 -0
- package/tests/modules_route.mjs +38 -0
- package/tests/newcomer_floor.mjs +17 -0
- package/tests/newcomer_restock.mjs +80 -0
- package/tests/next_number.mjs +154 -0
- package/tests/oauth_secret.mjs +60 -0
- package/tests/onboard.mjs +70 -0
- package/tests/onboarding_gate.mjs +267 -0
- package/tests/onboarding_observability.mjs +344 -0
- package/tests/onboarding_route_signals.mjs +175 -0
- package/tests/onboarding_state.mjs +346 -0
- package/tests/one_active_claim_per_session.mjs +111 -0
- package/tests/orphaned_claim_ship.mjs +135 -0
- package/tests/override_attribution.mjs +142 -0
- package/tests/override_request_ownership.mjs +235 -0
- package/tests/package_core.mjs +435 -0
- package/tests/parallel-load.mjs +402 -0
- package/tests/path_match.mjs +62 -0
- package/tests/permission_path.mjs +151 -0
- package/tests/platform_boot.mjs +167 -0
- package/tests/pre_compact.mjs +60 -0
- package/tests/preview_server.mjs +127 -0
- package/tests/profile_route.mjs +197 -0
- package/tests/provision.mjs +805 -0
- package/tests/provisioning_github_app_routes.mjs +98 -0
- package/tests/public_mirror_export.mjs +124 -0
- package/tests/public_task_resolver.mjs +112 -0
- package/tests/publish_branch_route.mjs +422 -0
- package/tests/publish_manifest.mjs +184 -0
- package/tests/publish_reconciler.mjs +728 -0
- package/tests/rank_gate.mjs +463 -0
- package/tests/rate_limit_public.mjs +217 -0
- package/tests/read_session_export.mjs +89 -0
- package/tests/recall_cli.mjs +82 -0
- package/tests/recall_hints.mjs +119 -0
- package/tests/recent_shipped_window.mjs +80 -0
- package/tests/regrade_eligibility.mjs +202 -0
- package/tests/render_prefs.mjs +122 -0
- package/tests/repo_map.mjs +92 -0
- package/tests/reward_gate.mjs +284 -0
- package/tests/route_rank_check.mjs +243 -0
- package/tests/route_validation.mjs +490 -0
- package/tests/routine_timers.mjs +72 -0
- package/tests/rubric_fixtures.mjs +140 -0
- package/tests/run_routine.mjs +69 -0
- package/tests/sandbox_stage.mjs +582 -0
- package/tests/scrubber_corpus.mjs +257 -0
- package/tests/search_chunker.mjs +209 -0
- package/tests/search_ingest.mjs +96 -0
- package/tests/search_ingest_db.mjs +88 -0
- package/tests/search_isolation.mjs +204 -0
- package/tests/search_route.mjs +95 -0
- package/tests/secret_box.mjs +189 -0
- package/tests/security_docs.mjs +186 -0
- package/tests/security_route.mjs +108 -0
- package/tests/served_paths_shipped.mjs +118 -0
- package/tests/session-cards.mjs +142 -0
- package/tests/session_506_regression.mjs +69 -0
- package/tests/session_caps.mjs +238 -0
- package/tests/session_cost.mjs +133 -0
- package/tests/session_digest.mjs +73 -0
- package/tests/session_eval.mjs +386 -0
- package/tests/session_index.mjs +105 -0
- package/tests/session_records.mjs +369 -0
- package/tests/session_search.mjs +78 -0
- package/tests/session_start_freshness.mjs +123 -0
- package/tests/setup_smoke.mjs +154 -0
- package/tests/ship_autolinkify.mjs +60 -0
- package/tests/ship_automerge_injection.mjs +174 -0
- package/tests/ship_broadcast_routing.mjs +125 -0
- package/tests/ship_broadcast_server.mjs +175 -0
- package/tests/ship_card.mjs +280 -0
- package/tests/ship_ci_deploy.mjs +374 -0
- package/tests/ship_preflight.mjs +368 -0
- package/tests/ship_premerge.mjs +75 -0
- package/tests/ship_resume.mjs +129 -0
- package/tests/ship_upload_skip.mjs +89 -0
- package/tests/ship_zero_commit.mjs +60 -0
- package/tests/single_host_hall.mjs +98 -0
- package/tests/skill_prefs.mjs +150 -0
- package/tests/smoke_preflight.mjs +66 -0
- package/tests/snapshot_picker.mjs +233 -0
- package/tests/sound_prefs.mjs +198 -0
- package/tests/sprite_facing.mjs +35 -0
- package/tests/status-probe.mjs +89 -0
- package/tests/status_backfill.mjs +94 -0
- package/tests/stop_refcheck.mjs +127 -0
- package/tests/streak.mjs +175 -0
- package/tests/subdomain_auth.mjs +58 -0
- package/tests/task_classifier_vocab.mjs +41 -0
- package/tests/task_create_idempotency.mjs +96 -0
- package/tests/task_goal_link.mjs +93 -0
- package/tests/task_ownership_gate.mjs +125 -0
- package/tests/terrain_picker.mjs +298 -0
- package/tests/touches_overlap.mjs +75 -0
- package/tests/triage_development.mjs +140 -0
- package/tests/turn_in_place.mjs +280 -0
- package/tests/upgrade.mjs +357 -0
- package/tests/verify_task_guard.mjs +64 -0
- package/tests/version_close.mjs +76 -0
- package/tests/versions_route.mjs +93 -0
- package/tests/walkability.mjs +188 -0
- package/tests/wandering_prefs.mjs +176 -0
- package/tests/worktree_disambiguation.mjs +105 -0
- package/tests/worktree_guard.mjs +90 -0
|
@@ -0,0 +1,532 @@
|
|
|
1
|
+
// GDS onboarding state machine — V3.R75 (#294).
|
|
2
|
+
//
|
|
3
|
+
// New builders shouldn't have to track where they are in onboarding. This
|
|
4
|
+
// module ticks off a small checklist for them as events fire on the server:
|
|
5
|
+
//
|
|
6
|
+
// 1. auth_complete — Device Flow OR web auth callback completed.
|
|
7
|
+
// 2. pick_disciplines — the builder chose the kind of work they want
|
|
8
|
+
// (any mix of engineer/artist/ideator) via the
|
|
9
|
+
// hall's discipline picker (PATCH /me/disciplines).
|
|
10
|
+
// 3. first_start — the builder ran /builder-start (GET claimable).
|
|
11
|
+
// 4. first_claim — they claimed their first task.
|
|
12
|
+
// 5. ship_three — they shipped THREE tasks. Clears at the same
|
|
13
|
+
// threshold that auto-promotes a Xenos to Thetes
|
|
14
|
+
// (db.THETES_GRADUATION_THRESHOLD / #692), so the
|
|
15
|
+
// checklist's graduation == the xenos→thetes
|
|
16
|
+
// promotion. The live "N of 3" counter the hall
|
|
17
|
+
// renders comes from shapeForApi(state, {shipCount})
|
|
18
|
+
// — the stage itself is binary.
|
|
19
|
+
// 6. graduated — all five above cleared. Terminal stage. Fires a
|
|
20
|
+
// one-time team-chat broadcast on transition.
|
|
21
|
+
//
|
|
22
|
+
// History:
|
|
23
|
+
// * A 'first_vote_received' stage sat after first_ship until 2026-05-30 — it
|
|
24
|
+
// gated graduation on a peer upvote (too much to ask of a newcomer). Removed
|
|
25
|
+
// and 'pick_disciplines' added in its place (migration 059).
|
|
26
|
+
// * A 'primer_read' stage sat after auth_complete until #766 — it made
|
|
27
|
+
// newcomers read the citizen's primer before working. Removed (migration
|
|
28
|
+
// 072): the Xenos path is now purely action-based. The primer page stays
|
|
29
|
+
// for Metic+ citizens; only the newcomer requirement is gone.
|
|
30
|
+
// * 'first_ship' (one ship) was renamed to 'ship_three' (three ships) in #766
|
|
31
|
+
// so the checklist finishes exactly when the builder becomes a Thetes.
|
|
32
|
+
//
|
|
33
|
+
// Why a separate file from src/bongos/onboarding.js: that module is the V3.R79
|
|
34
|
+
// FRICTION ANALYZER (transcript-side feedback-without-asking pipeline). Same
|
|
35
|
+
// "onboarding" word, totally different responsibility. Keeping them apart is
|
|
36
|
+
// the future-proofing — they'll grow independently. The CLAUDE.md handoff for
|
|
37
|
+
// this task explicitly notes "extend OR new file — check first"; new file is
|
|
38
|
+
// the right call here.
|
|
39
|
+
//
|
|
40
|
+
// The state machine is a thin convenience wrapper over the
|
|
41
|
+
// builder_onboarding_state table (migration 045). Three operations matter:
|
|
42
|
+
//
|
|
43
|
+
// * markStage(client, builderId, stage)
|
|
44
|
+
// Idempotent. Upserts the builder's row if missing, appends the stage to
|
|
45
|
+
// completed_stages[] if not already there, advances current_stage to the
|
|
46
|
+
// next uncompleted one in canonical order, and sets completed_at when
|
|
47
|
+
// the transition is to 'graduated'. Returns { state, justGraduated }.
|
|
48
|
+
//
|
|
49
|
+
// * getState(client, builderId)
|
|
50
|
+
// Read the builder's row, returning null if missing (some legacy state
|
|
51
|
+
// where the backfill row was never created — caller treats that as
|
|
52
|
+
// "nothing done yet").
|
|
53
|
+
//
|
|
54
|
+
// * broadcastGraduation(builder)
|
|
55
|
+
// Fire-and-forget Discord post. Same shape as builders.js fireDiscordBroadcast
|
|
56
|
+
// — best-effort, non-blocking, dry-run-aware.
|
|
57
|
+
//
|
|
58
|
+
// markStage takes a pg client (NOT a pool) so callers can run it inside the
|
|
59
|
+
// transaction that created the underlying event (e.g. shipTask's BEGIN/COMMIT
|
|
60
|
+
// block). When the caller has no transaction handy, it passes the pool — the
|
|
61
|
+
// queries are short enough that a single round trip per stage is cheap.
|
|
62
|
+
|
|
63
|
+
const path = require('node:path');
|
|
64
|
+
const { execFile } = require('node:child_process');
|
|
65
|
+
|
|
66
|
+
const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
67
|
+
|
|
68
|
+
// Canonical stage order. The first stage that ISN'T in completed_stages is
|
|
69
|
+
// the one rendered to the builder as "next up". markStage uses this order to
|
|
70
|
+
// advance current_stage and to detect graduation (all six prior cleared).
|
|
71
|
+
const STAGES = [
|
|
72
|
+
'auth_complete',
|
|
73
|
+
'pick_disciplines',
|
|
74
|
+
'first_start',
|
|
75
|
+
'first_claim',
|
|
76
|
+
'ship_three',
|
|
77
|
+
];
|
|
78
|
+
|
|
79
|
+
const GRADUATED = 'graduated';
|
|
80
|
+
const ALL_STAGES = [...STAGES, GRADUATED];
|
|
81
|
+
|
|
82
|
+
// The pre-auth, INFORMATIONAL step that sits AHEAD of auth_complete (task 470).
|
|
83
|
+
// The state machine's first ENGINE stage is auth_complete, but the genuine
|
|
84
|
+
// first action a newcomer takes is "obtain the repo" — clone it locally, or open
|
|
85
|
+
// the hosted dev box where it is already cloned. That step is manual/external
|
|
86
|
+
// (there is no server event for it) and intentionally NOT a member of STAGES, so
|
|
87
|
+
// it never gates graduation, never advances current_stage, and never appears in
|
|
88
|
+
// shapeForApi's tracked checklist. It exists purely so the system's own model of
|
|
89
|
+
// "the path into the city" begins where the path really begins. The hall renders
|
|
90
|
+
// it as a static lead-in line on the displayed checklist; the auth_complete hint
|
|
91
|
+
// above also surfaces the same clone instruction.
|
|
92
|
+
const PRE_AUTH_STEP = {
|
|
93
|
+
id: 'obtain_repo',
|
|
94
|
+
label: 'Obtain the repo',
|
|
95
|
+
hint: 'Clone the project to thy machine — or open thy hosted dev box, where it is already cloned. The build commands live inside the repo, so this comes first.',
|
|
96
|
+
informational: true,
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// How many shipped tasks the terminal 'ship_three' stage requires. Kept in
|
|
100
|
+
// lockstep with db.THETES_GRADUATION_THRESHOLD (#692 / ADR 0034) so the
|
|
101
|
+
// checklist's graduation coincides with the xenos→thetes promotion. Used only
|
|
102
|
+
// to render the "N of 3" counter in shapeForApi — the stage clears server-side
|
|
103
|
+
// in db.shipTask, which owns the authoritative threshold check.
|
|
104
|
+
const SHIP_GRADUATION_TARGET = 3;
|
|
105
|
+
|
|
106
|
+
// Human-readable label per stage. Echoed back from the API so the UI doesn't
|
|
107
|
+
// have to mirror this list in JS. The Mediterranean tone matches the rest of
|
|
108
|
+
// the hall ("Bear the seal", not "Sign in") — see modules/hall-ui/public/style.css
|
|
109
|
+
// vocabulary and the builders.js welcome line.
|
|
110
|
+
const STAGE_LABELS = {
|
|
111
|
+
auth_complete: 'Bear the city\'s seal',
|
|
112
|
+
pick_disciplines: 'Choose thy craft — engineer, artist, or ideator',
|
|
113
|
+
first_start: 'Survey the works on offer',
|
|
114
|
+
first_claim: 'Claim thy first work',
|
|
115
|
+
ship_three: 'Ship three works — and rise to Thetes',
|
|
116
|
+
graduated: 'Welcomed as a full citizen',
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
// Optional short hint shown on the locked stage tile. Empty hints render as
|
|
120
|
+
// just the label — keep these concise.
|
|
121
|
+
//
|
|
122
|
+
// auth_complete's hint surfaces the clone/obtain-repo instruction (task 470).
|
|
123
|
+
// The very first real action into the city is getting the project onto the
|
|
124
|
+
// machine you'll build from — the /builder-* commands live INSIDE the repo, so
|
|
125
|
+
// nothing (not even sign-in via the CLI) can happen before it exists. The
|
|
126
|
+
// onboarding model never named that step, so the hint now points at it ahead of
|
|
127
|
+
// the sign-in itself. See PRE_AUTH_STEP below for the standalone representation.
|
|
128
|
+
const STAGE_HINTS = {
|
|
129
|
+
auth_complete: 'First obtain the repo — clone it (or open thy hosted dev box, where it is already cloned) — then sign in via GitHub Device Flow or the web sign-in.',
|
|
130
|
+
pick_disciplines: 'Pick the work that calls thee — engineer, artist, ideator, or any mix.',
|
|
131
|
+
first_start: 'Run /builder-start to see claimable works.',
|
|
132
|
+
first_claim: 'Claim a task with /builder-claim N.',
|
|
133
|
+
ship_three: 'Carry three tasks through with /builder-ship — the third makes thee a Thetes.',
|
|
134
|
+
graduated: '',
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
function isKnownStage(stage) {
|
|
138
|
+
return typeof stage === 'string' && ALL_STAGES.includes(stage);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// ---- displayed checklist ("The Path into the City") --------------------------
|
|
142
|
+
//
|
|
143
|
+
// The DISPLAYED checklist is deliberately split from the graduation engine
|
|
144
|
+
// above. STAGES (and nextStage/markStage/graduation) are untouched, so the
|
|
145
|
+
// xenos->thetes promotion stays driven SOLELY by ship-count (#692) and the
|
|
146
|
+
// graduation broadcast timing is unchanged. The list below is purely what the
|
|
147
|
+
// hall renders — a short, action-only orientation path for a brand-new Xenos.
|
|
148
|
+
// Every step auto-detects (#777, per Lars: no manual ticks — "the city watches"):
|
|
149
|
+
//
|
|
150
|
+
// 1. box_connect — cleared the moment the builder PROPERLY connects to
|
|
151
|
+
// their dev box, i.e. a running `claude` process is seen
|
|
152
|
+
// on the box. Backed by builder_boxes.first_connected_at
|
|
153
|
+
// (stamped write-once by boxes.bumpActivity on the first
|
|
154
|
+
// claude_active=true heartbeat); passed in as
|
|
155
|
+
// `boxConnected` (boxes.hasEverConnected). FIRST because
|
|
156
|
+
// nothing else can happen until the box works — its hint
|
|
157
|
+
// points the newcomer at the welcome panel's setup steps
|
|
158
|
+
// (#823). `source: 'box'`.
|
|
159
|
+
// 2. join_discord — cleared by a live Discord link (discord.linked). The
|
|
160
|
+
// hall's "Connect Discord & join" button runs the
|
|
161
|
+
// existing OAuth flow (auto-join + rank role); linking
|
|
162
|
+
// clears the step. `source: 'discord'`.
|
|
163
|
+
// 3. pick_disciplines — the real engine stage, cleared by the craft picker.
|
|
164
|
+
// 4. cli_setup — cleared once the builder has authenticated the GDS CLI
|
|
165
|
+
// (ran /builder-setup, or the box-connect bootstrap — both
|
|
166
|
+
// mint a source='cli' session). Detected via
|
|
167
|
+
// db.hasCliSession; passed in as `cliAuthed`. Distinct
|
|
168
|
+
// from box_connect: connecting gets Claude running on the
|
|
169
|
+
// box; setup signs the GDS in so /builder-* works (Lars,
|
|
170
|
+
// #823: "both have a place"). `source: 'cli'`.
|
|
171
|
+
// 5. ship_three — the real engine stage. Auto, live "N of 3" counter,
|
|
172
|
+
// clears at 3 ships (= the xenos->thetes promotion).
|
|
173
|
+
//
|
|
174
|
+
// The old 'auth_complete' (GitHub web sign-in) is intentionally NOT shown — a
|
|
175
|
+
// builder signed in with GitHub to even reach this page, so it's redundant.
|
|
176
|
+
// 'first_start'/'first_claim' are also dropped from display (implied by shipping)
|
|
177
|
+
// to keep the list short. All three still fire server-side and keep driving the
|
|
178
|
+
// graduation engine; they're simply not rendered.
|
|
179
|
+
|
|
180
|
+
// The displayed checklist, in product order. `source` tells shapeForApi how to
|
|
181
|
+
// derive `cleared` for each step. NONE of these are members of STAGES, so none
|
|
182
|
+
// affect nextStage/graduation — they are display-only.
|
|
183
|
+
const DISPLAY_STEPS = [
|
|
184
|
+
{ id: 'box_connect', source: 'box' },
|
|
185
|
+
{ id: 'join_discord', source: 'discord' },
|
|
186
|
+
{ id: 'pick_disciplines', source: 'stage' },
|
|
187
|
+
{ id: 'cli_setup', source: 'cli' },
|
|
188
|
+
{ id: 'ship_three', source: 'stage' },
|
|
189
|
+
];
|
|
190
|
+
|
|
191
|
+
const DISPLAY_LABELS = {
|
|
192
|
+
box_connect: 'Connect to thy dev box',
|
|
193
|
+
join_discord: 'Join the Discord server',
|
|
194
|
+
pick_disciplines: 'Choose thy craft — engineer, artist, or ideator',
|
|
195
|
+
cli_setup: 'Run /builder-setup on thy dev box',
|
|
196
|
+
ship_three: 'Ship three works — and rise to Thetes',
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
const DISPLAY_HINTS = {
|
|
200
|
+
box_connect: 'Follow the steps in the welcome scroll above to get Claude running on thy dev box — this ticks itself the moment thou art connected.',
|
|
201
|
+
join_discord: 'Connect Discord — thou art auto-joined to the city\'s server and given thy rank.',
|
|
202
|
+
pick_disciplines: 'Pick the work that calls thee — engineer, artist, ideator, or any mix.',
|
|
203
|
+
cli_setup: 'Sign the GDS in on thy dev box with /builder-setup — this ticks itself once thou art signed in.',
|
|
204
|
+
ship_three: 'Carry three tasks through with /builder-ship — the third makes thee a Thetes.',
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
// Pick the first uncompleted stage from STAGES (canonical order), or
|
|
208
|
+
// GRADUATED if all six are done. Mirrors the migration 045 backfill CASE so
|
|
209
|
+
// app-layer behaviour matches DB-layer reconstruction.
|
|
210
|
+
function nextStage(completedStages) {
|
|
211
|
+
const have = new Set(Array.isArray(completedStages) ? completedStages : []);
|
|
212
|
+
for (const s of STAGES) {
|
|
213
|
+
if (!have.has(s)) return s;
|
|
214
|
+
}
|
|
215
|
+
return GRADUATED;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Has the builder cleared this stage? A stage counts as cleared when EITHER
|
|
219
|
+
// it's in completed_stages[] OR the builder's current_stage is past it in
|
|
220
|
+
// canonical order. The OR matters for legacy/backfill rows: a builder who
|
|
221
|
+
// shipped before R75 landed has completed_stages = ['auth_complete',
|
|
222
|
+
// 'first_claim', 'ship_three'] but current_stage skipped ahead (migration 045
|
|
223
|
+
// parked them at the last gate; migration 059 grandfathers those to
|
|
224
|
+
// 'graduated') — and we don't want to retroactively gate them on a stage they
|
|
225
|
+
// never had the chance to clear (e.g. pick_disciplines).
|
|
226
|
+
function hasCleared(state, stage) {
|
|
227
|
+
if (!state) return false;
|
|
228
|
+
if (!STAGES.includes(stage)) return false;
|
|
229
|
+
if (Array.isArray(state.completed_stages) && state.completed_stages.includes(stage)) {
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
const stageIdx = STAGES.indexOf(stage);
|
|
233
|
+
const current = state.current_stage;
|
|
234
|
+
if (current === GRADUATED) return true;
|
|
235
|
+
const currentIdx = STAGES.indexOf(current);
|
|
236
|
+
return currentIdx > stageIdx;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Express middleware factory. Refuses the request when the builder hasn't
|
|
240
|
+
// cleared `stage`. Always bypasses for builders who have cleared
|
|
241
|
+
// `bypassAfter` (default: 'ship_three') — once they've graduated, the
|
|
242
|
+
// onboarding gates are done with them. Returns a 403 with a structured
|
|
243
|
+
// body the CLI can render as friendly guidance instead of "forbidden".
|
|
244
|
+
//
|
|
245
|
+
// Usage:
|
|
246
|
+
// router.get('/some-gated-route',
|
|
247
|
+
// auth.requireBuilder,
|
|
248
|
+
// onboardingState.requireStageCleared(pool, 'first_claim'),
|
|
249
|
+
// handler);
|
|
250
|
+
//
|
|
251
|
+
// `pool` is taken as a constructor arg so this module stays test-friendly
|
|
252
|
+
// (the unit tests can inject a mock pool/client). General-purpose middleware:
|
|
253
|
+
// the primer gate that once used it was removed in #766, but the helper stays
|
|
254
|
+
// so future onboarding stages can gate routes without re-deriving the logic.
|
|
255
|
+
function requireStageCleared(pool, stage, { bypassAfter = 'ship_three' } = {}) {
|
|
256
|
+
if (!STAGES.includes(stage)) {
|
|
257
|
+
throw new Error(`requireStageCleared: unknown stage "${stage}"`);
|
|
258
|
+
}
|
|
259
|
+
return async function stageGate(req, res, next) {
|
|
260
|
+
try {
|
|
261
|
+
const builderId = req.builder && req.builder.id;
|
|
262
|
+
if (!builderId) {
|
|
263
|
+
// Shouldn't happen — caller forgot requireBuilder upstream. Fail
|
|
264
|
+
// loud so it's caught in dev rather than silently allowing.
|
|
265
|
+
return res.fail('stage_gate_misconfigured', { status: 500, message: 'requireStageCleared called without requireBuilder upstream' });
|
|
266
|
+
}
|
|
267
|
+
const state = await getState(pool, builderId);
|
|
268
|
+
if (hasCleared(state, bypassAfter)) return next();
|
|
269
|
+
if (hasCleared(state, stage)) return next();
|
|
270
|
+
const currentStage = (state && state.current_stage) || STAGES[0];
|
|
271
|
+
return res.fail('stage_required', 403, { required_stage: stage, required_stage_label: STAGE_LABELS[stage], required_stage_hint: STAGE_HINTS[stage], current_stage: currentStage, current_stage_label: STAGE_LABELS[currentStage], current_stage_hint: STAGE_HINTS[currentStage], what_to_do: `Clear "${STAGE_LABELS[stage]}" before continuing — ${STAGE_HINTS[stage]}` });
|
|
272
|
+
} catch (err) {
|
|
273
|
+
console.error('[gds] requireStageCleared failed:', err);
|
|
274
|
+
// Fail open on infra errors — onboarding plumbing must never block a
|
|
275
|
+
// builder if the DB query itself errors out. The cost of a missed
|
|
276
|
+
// gate is small; the cost of bricking the API is large.
|
|
277
|
+
return next();
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Read the state row for a builder. Returns null when the row doesn't exist
|
|
283
|
+
// (older builders pre-migration-045 who haven't had any event fire yet —
|
|
284
|
+
// markStage will create the row on the next event).
|
|
285
|
+
async function getState(clientOrPool, builderId) {
|
|
286
|
+
if (!Number.isFinite(Number(builderId))) return null;
|
|
287
|
+
const { rows } = await clientOrPool.query(
|
|
288
|
+
`SELECT builder_id, current_stage, completed_stages, started_at, completed_at
|
|
289
|
+
FROM builder_onboarding_state
|
|
290
|
+
WHERE builder_id = $1`,
|
|
291
|
+
[builderId]
|
|
292
|
+
);
|
|
293
|
+
if (rows.length === 0) return null;
|
|
294
|
+
return rows[0];
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Idempotent. Records that `stage` has been cleared for `builderId`. Creates
|
|
298
|
+
// the row on first call (started_at = now()). If the stage is already in
|
|
299
|
+
// completed_stages, this is a no-op (no DB write). When the new state's
|
|
300
|
+
// completed_stages contains all six STAGES, current_stage flips to
|
|
301
|
+
// 'graduated' and completed_at is set.
|
|
302
|
+
//
|
|
303
|
+
// Returns:
|
|
304
|
+
// { state, justGraduated, alreadyCleared }
|
|
305
|
+
//
|
|
306
|
+
// state — the updated row (or the existing row if no change)
|
|
307
|
+
// justGraduated — true iff this call transitioned current_stage to
|
|
308
|
+
// 'graduated' (used by the caller to fire the broadcast)
|
|
309
|
+
// alreadyCleared — true iff `stage` was already in completed_stages
|
|
310
|
+
//
|
|
311
|
+
// The function is safe to call from inside an in-progress transaction by
|
|
312
|
+
// passing the client; it doesn't BEGIN/COMMIT itself.
|
|
313
|
+
async function markStage(clientOrPool, builderId, stage) {
|
|
314
|
+
if (!Number.isFinite(Number(builderId))) {
|
|
315
|
+
return { state: null, justGraduated: false, alreadyCleared: false };
|
|
316
|
+
}
|
|
317
|
+
if (!STAGES.includes(stage)) {
|
|
318
|
+
// 'graduated' isn't a stage you mark directly — it's the consequence of
|
|
319
|
+
// marking the last STAGE. Anything else is a programmer error and we
|
|
320
|
+
// throw so it's loud in dev, but in prod the caller wraps in try/catch
|
|
321
|
+
// so onboarding failures never block the underlying event.
|
|
322
|
+
throw new Error(`onboarding-state: unknown stage "${stage}"`);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// Insert-or-update in one statement. ON CONFLICT lets us upsert. The
|
|
326
|
+
// array_append is conditional on the stage not already being in the array
|
|
327
|
+
// — a CASE expression keeps the write idempotent without a separate read.
|
|
328
|
+
//
|
|
329
|
+
// For determining current_stage / completed_at we need the post-update
|
|
330
|
+
// completed_stages to apply the nextStage logic. The simplest correct
|
|
331
|
+
// shape is: read first inside the txn (to know what to write), write the
|
|
332
|
+
// computed result. That's two round trips per event — fine for a
|
|
333
|
+
// user-facing event rate (<<1/sec).
|
|
334
|
+
const existing = await getState(clientOrPool, builderId);
|
|
335
|
+
if (existing) {
|
|
336
|
+
const already = Array.isArray(existing.completed_stages)
|
|
337
|
+
&& existing.completed_stages.includes(stage);
|
|
338
|
+
if (already) {
|
|
339
|
+
return { state: existing, justGraduated: false, alreadyCleared: true };
|
|
340
|
+
}
|
|
341
|
+
const completed = [...existing.completed_stages, stage];
|
|
342
|
+
const next = nextStage(completed);
|
|
343
|
+
const justGraduated = next === GRADUATED && existing.current_stage !== GRADUATED;
|
|
344
|
+
const { rows } = await clientOrPool.query(
|
|
345
|
+
`UPDATE builder_onboarding_state
|
|
346
|
+
SET completed_stages = $2,
|
|
347
|
+
current_stage = $3,
|
|
348
|
+
completed_at = CASE WHEN $4::boolean THEN now() ELSE completed_at END
|
|
349
|
+
WHERE builder_id = $1
|
|
350
|
+
RETURNING builder_id, current_stage, completed_stages, started_at, completed_at`,
|
|
351
|
+
[builderId, completed, next, justGraduated]
|
|
352
|
+
);
|
|
353
|
+
return { state: rows[0], justGraduated, alreadyCleared: false };
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// No row yet — create it with the single stage already cleared.
|
|
357
|
+
const completed = [stage];
|
|
358
|
+
const next = nextStage(completed); // can't be GRADUATED from one stage
|
|
359
|
+
const { rows } = await clientOrPool.query(
|
|
360
|
+
`INSERT INTO builder_onboarding_state (builder_id, current_stage, completed_stages, started_at)
|
|
361
|
+
VALUES ($1, $2, $3, now())
|
|
362
|
+
ON CONFLICT (builder_id) DO NOTHING
|
|
363
|
+
RETURNING builder_id, current_stage, completed_stages, started_at, completed_at`,
|
|
364
|
+
[builderId, next, completed]
|
|
365
|
+
);
|
|
366
|
+
if (rows.length === 0) {
|
|
367
|
+
// Lost an insert race — re-read and recurse once. The recursion can't
|
|
368
|
+
// loop because the row now exists, so the next call lands in the
|
|
369
|
+
// existing-row branch above.
|
|
370
|
+
return markStage(clientOrPool, builderId, stage);
|
|
371
|
+
}
|
|
372
|
+
return { state: rows[0], justGraduated: false, alreadyCleared: false };
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// Fire-and-forget Discord broadcast on graduation. Mirrors fireDiscordBroadcast in
|
|
376
|
+
// src/bongos/routes/builders.js — kept as a local copy here so this module
|
|
377
|
+
// stays self-contained (the rank-change broadcast lives next to its router;
|
|
378
|
+
// the graduation broadcast lives next to its state machine). Outbound moved
|
|
379
|
+
// from Google Chat to Discord #ship-news per ADR 0032 / #607 (scripts/chat/
|
|
380
|
+
// is inbound-only now). CHAT_DRY_RUN=1 still short-circuits for the smoke path
|
|
381
|
+
// (the name is a legacy artifact — it gates all broadcast transports, not just Chat).
|
|
382
|
+
//
|
|
383
|
+
// builder is the row from db.getBuilderById — we use display_name or
|
|
384
|
+
// github_login for the name.
|
|
385
|
+
function broadcastGraduation(builder) {
|
|
386
|
+
const who = (builder && (builder.display_name || builder.github_login)) || 'a builder';
|
|
387
|
+
// "Citizens of <worldName>" from the branding pack (via the doorway), never a
|
|
388
|
+
// hardcoded host brand (ADR 0062 §3) — a non-OTB instance greets its own world.
|
|
389
|
+
const worldName = (() => { try { return require('../../src/module-api').branding().identity?.worldName || 'the city'; } catch { return 'the city'; } })();
|
|
390
|
+
const text = `Citizens of ${worldName} — ${who} has completed onboarding.`;
|
|
391
|
+
if (process.env.CHAT_DRY_RUN === '1') {
|
|
392
|
+
console.log(`[gds] [broadcast dry-run] would post: ${text}`);
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
try {
|
|
396
|
+
execFile(
|
|
397
|
+
'node',
|
|
398
|
+
['scripts/discord/post.js', text],
|
|
399
|
+
{ cwd: REPO_ROOT, timeout: 10_000 },
|
|
400
|
+
(err, _stdout, stderr) => {
|
|
401
|
+
if (err) {
|
|
402
|
+
console.log('[gds] graduation broadcast failed (non-blocking):', err.message);
|
|
403
|
+
if (stderr) console.log('[gds] discord stderr:', stderr.toString().trim());
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
);
|
|
407
|
+
} catch (e) {
|
|
408
|
+
console.log('[gds] graduation broadcast spawn failed (non-blocking):', e && e.message);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// Helper for routes: mark a stage and, on graduation, kick off the Discord
|
|
413
|
+
// broadcast. Swallows errors so onboarding plumbing never breaks an
|
|
414
|
+
// underlying event. Returns the markStage result (or null on failure).
|
|
415
|
+
async function safeMarkStage(clientOrPool, builderId, stage, builderForBroadcast = null) {
|
|
416
|
+
try {
|
|
417
|
+
const result = await markStage(clientOrPool, builderId, stage);
|
|
418
|
+
if (result.justGraduated && builderForBroadcast) {
|
|
419
|
+
broadcastGraduation(builderForBroadcast);
|
|
420
|
+
}
|
|
421
|
+
return result;
|
|
422
|
+
} catch (err) {
|
|
423
|
+
console.log(
|
|
424
|
+
`[gds] onboarding markStage(${builderId}, ${stage}) failed (non-blocking):`,
|
|
425
|
+
err && err.message
|
|
426
|
+
);
|
|
427
|
+
return null;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// Build the per-stage "detail" line. Only the terminal 'ship_three' stage has
|
|
432
|
+
// one: a live "N of 3" counter so the builder watches their progress toward
|
|
433
|
+
// Thetes with each ship. `shipCount` is the builder's shipped-task count
|
|
434
|
+
// (passed by the route); null means "not supplied" → no counter rendered.
|
|
435
|
+
function stageDetail(stageId, shipCount) {
|
|
436
|
+
if (stageId !== 'ship_three') return '';
|
|
437
|
+
if (shipCount == null || !Number.isFinite(Number(shipCount))) return '';
|
|
438
|
+
const n = Math.min(Math.max(0, Number(shipCount)), SHIP_GRADUATION_TARGET);
|
|
439
|
+
return `${n} of ${SHIP_GRADUATION_TARGET} works shipped`;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// Shape the API response for one builder. Used by GET /builders/:id/onboarding
|
|
443
|
+
// and embedded in the /me payload. When the row is missing (legacy builder,
|
|
444
|
+
// no event fired yet), we synthesize a "nothing cleared" view so the client
|
|
445
|
+
// never gets null.
|
|
446
|
+
//
|
|
447
|
+
// Returns the DISPLAYED checklist (DISPLAY_STEPS), not the raw engine STAGES —
|
|
448
|
+
// see the displayed-checklist block above for why they're split. `graduated`
|
|
449
|
+
// and `current_stage` still reflect the engine (so the welcome panel's
|
|
450
|
+
// dismissal index and the panel-hide-on-graduation behaviour are unchanged).
|
|
451
|
+
//
|
|
452
|
+
// opts.shipCount — the builder's count of successfully shipped tasks. Drives
|
|
453
|
+
// the 'ship_three' step's live "N of 3" counter. Omit/null
|
|
454
|
+
// → the counter isn't rendered.
|
|
455
|
+
// opts.discordLinked — whether the builder has a live Discord link. Clears the
|
|
456
|
+
// 'join_discord' step (the OAuth flow sets the link).
|
|
457
|
+
// opts.boxConnected — whether the builder's dev box has ever reported a live
|
|
458
|
+
// Claude process (boxes.hasEverConnected → first_connected_at).
|
|
459
|
+
// Clears the 'box_connect' step (#823).
|
|
460
|
+
// opts.cliAuthed — whether the builder has ever authenticated the GDS CLI
|
|
461
|
+
// (db.hasCliSession). Clears the 'cli_setup' step.
|
|
462
|
+
function shapeForApi(state, { shipCount = null, discordLinked = false, boxConnected = false, cliAuthed = false } = {}) {
|
|
463
|
+
const completed = new Set((state && state.completed_stages) || []);
|
|
464
|
+
const currentReal = (state && state.current_stage) || STAGES[0];
|
|
465
|
+
const graduated = currentReal === GRADUATED;
|
|
466
|
+
|
|
467
|
+
// Per-step cleared resolution, by `source`. 'stage' mirrors hasCleared (in
|
|
468
|
+
// completed_stages, OR the engine advanced past it). 'discord'/'box'/'cli'
|
|
469
|
+
// derive from live signals passed by the route. A graduated builder has cleared
|
|
470
|
+
// everything by definition (keeps the displayed list coherent even though the
|
|
471
|
+
// panel hides on graduation — a roster/profile read could still surface this).
|
|
472
|
+
const stepCleared = (step) => {
|
|
473
|
+
if (graduated) return true;
|
|
474
|
+
if (step.source === 'discord') return !!discordLinked;
|
|
475
|
+
if (step.source === 'box') return !!boxConnected;
|
|
476
|
+
if (step.source === 'cli') return !!cliAuthed;
|
|
477
|
+
// 'stage'
|
|
478
|
+
if (completed.has(step.id)) return true;
|
|
479
|
+
const i = STAGES.indexOf(step.id);
|
|
480
|
+
const c = STAGES.indexOf(currentReal);
|
|
481
|
+
return i >= 0 && c > i;
|
|
482
|
+
};
|
|
483
|
+
|
|
484
|
+
const display = DISPLAY_STEPS.map((step) => ({
|
|
485
|
+
id: step.id,
|
|
486
|
+
source: step.source,
|
|
487
|
+
label: DISPLAY_LABELS[step.id],
|
|
488
|
+
hint: DISPLAY_HINTS[step.id],
|
|
489
|
+
detail: stageDetail(step.id, shipCount),
|
|
490
|
+
cleared: stepCleared(step),
|
|
491
|
+
}));
|
|
492
|
+
|
|
493
|
+
// is_current = the first uncleared DISPLAYED step, so the hall highlights
|
|
494
|
+
// exactly one "do this next". None is current once graduated.
|
|
495
|
+
const firstGap = display.find((s) => !s.cleared);
|
|
496
|
+
for (const s of display) {
|
|
497
|
+
s.is_current = !graduated && !!firstGap && s.id === firstGap.id;
|
|
498
|
+
}
|
|
499
|
+
const clearedCount = display.filter((s) => s.cleared).length;
|
|
500
|
+
|
|
501
|
+
return {
|
|
502
|
+
current_stage: currentReal,
|
|
503
|
+
completed_stages: (state && state.completed_stages) || [],
|
|
504
|
+
started_at: state ? state.started_at : null,
|
|
505
|
+
completed_at: state ? state.completed_at : null,
|
|
506
|
+
progress: { cleared: clearedCount, total: DISPLAY_STEPS.length },
|
|
507
|
+
stages: display,
|
|
508
|
+
graduated,
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
module.exports = {
|
|
513
|
+
STAGES,
|
|
514
|
+
GRADUATED,
|
|
515
|
+
ALL_STAGES,
|
|
516
|
+
PRE_AUTH_STEP,
|
|
517
|
+
SHIP_GRADUATION_TARGET,
|
|
518
|
+
STAGE_LABELS,
|
|
519
|
+
STAGE_HINTS,
|
|
520
|
+
DISPLAY_STEPS,
|
|
521
|
+
DISPLAY_LABELS,
|
|
522
|
+
DISPLAY_HINTS,
|
|
523
|
+
isKnownStage,
|
|
524
|
+
nextStage,
|
|
525
|
+
hasCleared,
|
|
526
|
+
getState,
|
|
527
|
+
markStage,
|
|
528
|
+
safeMarkStage,
|
|
529
|
+
broadcastGraduation,
|
|
530
|
+
shapeForApi,
|
|
531
|
+
requireStageCleared,
|
|
532
|
+
};
|