@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,504 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Builder setup — runs the GitHub Device Flow and stores the session token.
|
|
3
|
+
//
|
|
4
|
+
// Usage:
|
|
5
|
+
// node scripts/gds/setup.js run interactively, perform the auth
|
|
6
|
+
// node scripts/gds/setup.js --force re-auth even if a valid session exists
|
|
7
|
+
// node scripts/gds/setup.js --skip-keys skip the per-builder Gemini-key prompt
|
|
8
|
+
// (for CI / batch onboarding / builders
|
|
9
|
+
// who don't need the art pipeline)
|
|
10
|
+
// node scripts/gds/setup.js --dry-run print every step that *would* run, without
|
|
11
|
+
// contacting the API, writing files, or
|
|
12
|
+
// prompting. Useful for newcomers who want
|
|
13
|
+
// a preview before running it for real.
|
|
14
|
+
//
|
|
15
|
+
// Prints the user_code and verification_uri, then polls until the user
|
|
16
|
+
// completes auth (or expires/denies). On success, writes
|
|
17
|
+
// ~/.config/otb/gds-session.json (resolved from os.homedir(), so this works for
|
|
18
|
+
// any user on any machine; no path is hardcoded to a particular developer's
|
|
19
|
+
// home directory) and prints the builder profile.
|
|
20
|
+
|
|
21
|
+
const readline = require('readline');
|
|
22
|
+
const { cliClient, saveSession, SESSION_PATH, loadSession, printOnboardingNudge, API_BASE } = require('./cli-lib');
|
|
23
|
+
const onboardingConfig = require('./onboarding-config');
|
|
24
|
+
|
|
25
|
+
const DRY_RUN = process.argv.includes('--dry-run');
|
|
26
|
+
// --skip-keys mirrors the same flag on scripts/setup-builder.sh — when set,
|
|
27
|
+
// the Gemini-key prompt is skipped entirely. Used by CI / batch onboarding /
|
|
28
|
+
// builders who don't intend to run the art pipeline.
|
|
29
|
+
const SKIP_KEYS = process.argv.includes('--skip-keys');
|
|
30
|
+
|
|
31
|
+
// Tiny helper so the dry-run output reads as a clear plan rather than a wall
|
|
32
|
+
// of identical-looking log lines.
|
|
33
|
+
function dryRunStep(msg) {
|
|
34
|
+
console.log(`[dry-run] ${msg}`);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Ask the new builder for their own Google AI Studio key — used by the
|
|
38
|
+
// pixel-art pipeline (gen_api.py). V3.R11 (#91): each builder pays their own
|
|
39
|
+
// Gemini bill, so spend is attributable per-builder on the public dashboard.
|
|
40
|
+
//
|
|
41
|
+
// Stored as gemini_api_key in ~/.config/otb/gds-session.json (mode 600, same
|
|
42
|
+
// file as the GitHub session token). gen_api.py reads this location before
|
|
43
|
+
// falling back to ~/.config/otb/env or .env.local.
|
|
44
|
+
//
|
|
45
|
+
// Behavior:
|
|
46
|
+
// - Non-TTY shells: skip silently. Builder can edit the session file later.
|
|
47
|
+
// - --skip-keys flag: skip silently. CI/batch onboarding.
|
|
48
|
+
// - Existing key on file: show last-4, ask "overwrite? [y/N]". Default no.
|
|
49
|
+
// - Empty input: leave whatever was there. Don't blank a working key by
|
|
50
|
+
// accident.
|
|
51
|
+
async function promptGeminiKey() {
|
|
52
|
+
if (SKIP_KEYS) return;
|
|
53
|
+
if (!process.stdin.isTTY) return;
|
|
54
|
+
|
|
55
|
+
const fs = require('node:fs/promises');
|
|
56
|
+
let session;
|
|
57
|
+
try {
|
|
58
|
+
session = JSON.parse(await fs.readFile(SESSION_PATH, 'utf8'));
|
|
59
|
+
} catch (_) {
|
|
60
|
+
// saveSession just wrote it; if it's not readable something's badly wrong.
|
|
61
|
+
// Better to bail than to silently lose a key the builder is about to type.
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const existing = session.gemini_api_key;
|
|
66
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
67
|
+
const ask = (q) => new Promise((resolve) => rl.question(q, resolve));
|
|
68
|
+
try {
|
|
69
|
+
console.log('');
|
|
70
|
+
console.log('Google AI Studio key for the pixel-art pipeline (per-builder, optional).');
|
|
71
|
+
console.log(' Get one at https://aistudio.google.com/app/apikey');
|
|
72
|
+
console.log(' (Or skip this and add it later with browser clicks: hall Settings →');
|
|
73
|
+
console.log(' https://amazonprimea.com/builders/settings#art-key — stored encrypted, ADR 0073.)');
|
|
74
|
+
console.log(' Each builder pays their own Gemini bill so spend is attributed to them');
|
|
75
|
+
console.log(' on https://status.amazonprimea.com.');
|
|
76
|
+
let prompt;
|
|
77
|
+
if (existing && typeof existing === 'string' && existing.length >= 4) {
|
|
78
|
+
const last4 = existing.slice(-4);
|
|
79
|
+
const overwrite = (await ask(` Key on file ending …${last4}. Overwrite? [y/N] `)).trim().toLowerCase();
|
|
80
|
+
if (!(overwrite === 'y' || overwrite === 'yes')) {
|
|
81
|
+
console.log(' Kept the existing key.');
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
prompt = ' New GOOGLE_AI_STUDIO_KEY (press Enter to clear): ';
|
|
85
|
+
} else {
|
|
86
|
+
prompt = ' GOOGLE_AI_STUDIO_KEY (press Enter to skip): ';
|
|
87
|
+
}
|
|
88
|
+
const input = (await ask(prompt)).trim();
|
|
89
|
+
if (!input) {
|
|
90
|
+
if (existing) {
|
|
91
|
+
// The user asked to overwrite, then entered nothing → clear it.
|
|
92
|
+
delete session.gemini_api_key;
|
|
93
|
+
await fs.writeFile(SESSION_PATH, JSON.stringify(session, null, 2), { mode: 0o600 });
|
|
94
|
+
console.log(' Cleared the key.');
|
|
95
|
+
} else {
|
|
96
|
+
console.log(' Skipped — set it later by re-running setup.js or editing the session file.');
|
|
97
|
+
}
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
session.gemini_api_key = input;
|
|
101
|
+
await fs.writeFile(SESSION_PATH, JSON.stringify(session, null, 2), { mode: 0o600 });
|
|
102
|
+
console.log(` Saved Gemini key to ${SESSION_PATH} (mode 600).`);
|
|
103
|
+
} finally {
|
|
104
|
+
rl.close();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// V3.R10 (#235), criterion C3 — link the builder's Anthropic account.
|
|
109
|
+
//
|
|
110
|
+
// Claude Code is the trusted agent on the builder's machine: it writes its own
|
|
111
|
+
// signed-in account to ~/.claude.json under `oauthAccount` (emailAddress +
|
|
112
|
+
// accountUuid). We read that, ask the builder to confirm the email, and on a
|
|
113
|
+
// match store the attested pair on their builder row via POST /me/anthropic-link.
|
|
114
|
+
// The accountUuid is then written into the local session file as cosmetic
|
|
115
|
+
// attribution. (The X-Anthropic-User identity pin was removed in task 1039 /
|
|
116
|
+
// idea 258, so it is no longer sent or cross-checked.)
|
|
117
|
+
//
|
|
118
|
+
// "Setup refuses to proceed on email mismatch" (done-when): if the typed email
|
|
119
|
+
// doesn't match what Claude Code reports, we REFUSE to link — nothing is stored
|
|
120
|
+
// and the builder is told to fix it. (The GDS GitHub session itself is already
|
|
121
|
+
// saved and stays valid; only the Anthropic attestation is withheld.)
|
|
122
|
+
//
|
|
123
|
+
// Skips gracefully (no error) when: not a TTY, no ~/.claude.json, or the file
|
|
124
|
+
// has no oauthAccount/emailAddress (e.g. API-key auth, or a box without local
|
|
125
|
+
// Claude creds). Attestation is best-effort onboarding polish, never a setup
|
|
126
|
+
// blocker for builders whose environment can't produce it.
|
|
127
|
+
function readLocalAnthropicAccount() {
|
|
128
|
+
const fs = require('node:fs');
|
|
129
|
+
const os = require('node:os');
|
|
130
|
+
const path = require('node:path');
|
|
131
|
+
try {
|
|
132
|
+
const p = path.join(os.homedir(), '.claude.json');
|
|
133
|
+
const oa = JSON.parse(fs.readFileSync(p, 'utf8'))?.oauthAccount;
|
|
134
|
+
if (oa && typeof oa.emailAddress === 'string' && typeof oa.accountUuid === 'string') {
|
|
135
|
+
return { email: oa.emailAddress, userId: oa.accountUuid };
|
|
136
|
+
}
|
|
137
|
+
} catch (_) { /* missing/unreadable/non-JSON → no local account */ }
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
async function promptAnthropicLink() {
|
|
142
|
+
if (!process.stdin.isTTY) return;
|
|
143
|
+
const local = readLocalAnthropicAccount();
|
|
144
|
+
if (!local) {
|
|
145
|
+
console.log('');
|
|
146
|
+
console.log('Anthropic account linking skipped — no local Claude Code account found');
|
|
147
|
+
console.log(' (~/.claude.json oauthAccount). Re-run setup from a machine signed into');
|
|
148
|
+
console.log(' Claude Code to attest your Anthropic identity for cost + authorship.');
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const fs = require('node:fs/promises');
|
|
153
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
154
|
+
const ask = (q) => new Promise((resolve) => rl.question(q, resolve));
|
|
155
|
+
try {
|
|
156
|
+
console.log('');
|
|
157
|
+
console.log('Link your Anthropic account (so cost + authorship are attributed to you).');
|
|
158
|
+
console.log(' Claude Code on this machine is signed in as: ' + local.email);
|
|
159
|
+
const typed = (await ask(' Confirm your Anthropic email [Enter = the address above]: ')).trim();
|
|
160
|
+
const confirmed = typed || local.email;
|
|
161
|
+
if (confirmed.toLowerCase() !== local.email.toLowerCase()) {
|
|
162
|
+
// done-when: refuse to proceed on mismatch. Store nothing.
|
|
163
|
+
console.error(' ❌ Email mismatch — "' + confirmed + '" does not match the Anthropic');
|
|
164
|
+
console.error(' account Claude Code is signed into (' + local.email + ').');
|
|
165
|
+
console.error(' Not linking. Re-run setup once the addresses agree, or sign Claude');
|
|
166
|
+
console.error(' Code into the correct account first.');
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const resp = await (await cliClient()).me.postMeAnthropicLink({
|
|
170
|
+
body: {
|
|
171
|
+
anthropic_email: confirmed,
|
|
172
|
+
anthropic_user_id: local.userId,
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
if (!resp.ok) {
|
|
176
|
+
console.error(` Could not link Anthropic account (${resp.status}). You can re-run setup later.`);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
// Persist the attested id into the local session as cosmetic attribution.
|
|
180
|
+
// (No longer sent as X-Anthropic-User — the identity pin was removed,
|
|
181
|
+
// task 1039 / idea 258.)
|
|
182
|
+
try {
|
|
183
|
+
const session = JSON.parse(await fs.readFile(SESSION_PATH, 'utf8'));
|
|
184
|
+
session.anthropic_email = confirmed;
|
|
185
|
+
session.anthropic_user_id = local.userId;
|
|
186
|
+
await fs.writeFile(SESSION_PATH, JSON.stringify(session, null, 2), { mode: 0o600 });
|
|
187
|
+
} catch (_) { /* the server has the link; a session-file write hiccup is non-fatal */ }
|
|
188
|
+
console.log(' ✓ Anthropic account linked. Future calls attest this identity.');
|
|
189
|
+
} finally {
|
|
190
|
+
rl.close();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Ask the new builder which disciplines they want the work queue tilted
|
|
195
|
+
// toward, then persist via PATCH /me/disciplines (migration 024 / V3.R80).
|
|
196
|
+
// Non-interactive shells (no TTY) skip the prompt and leave the default {}.
|
|
197
|
+
async function promptDisciplines() {
|
|
198
|
+
if (!process.stdin.isTTY) return;
|
|
199
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
200
|
+
const ask = (q) => new Promise((resolve) => rl.question(q, resolve));
|
|
201
|
+
try {
|
|
202
|
+
console.log('');
|
|
203
|
+
console.log('Which kind of work do you want surfaced first?');
|
|
204
|
+
console.log(' 1) engineer — code, gameplay mechanics, infra, the GDS itself, perf, bugs');
|
|
205
|
+
console.log(' 2) artist — pixel-art tiles, sprites, icons, avatars, the art pipeline');
|
|
206
|
+
console.log(' 3) ideator — idea capture, scoping, research, docs/briefs, narrative, lore');
|
|
207
|
+
console.log(' 4) all of them');
|
|
208
|
+
console.log(' 5) skip for now (you can set this later on /builders)');
|
|
209
|
+
const choice = (await ask('Choose [1-5]: ')).trim();
|
|
210
|
+
const map = {
|
|
211
|
+
1: ['engineer'], 2: ['artist'], 3: ['ideator'],
|
|
212
|
+
4: ['engineer', 'artist', 'ideator'], 5: null,
|
|
213
|
+
};
|
|
214
|
+
const disciplines = map[choice];
|
|
215
|
+
if (disciplines === undefined) {
|
|
216
|
+
console.log('Unrecognized choice — leaving disciplines unset. Edit later on /builders.');
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if (disciplines === null) return;
|
|
220
|
+
const resp = await (await cliClient()).me.patchMeDisciplines({ body: { preferred_disciplines: disciplines } });
|
|
221
|
+
if (resp.ok) {
|
|
222
|
+
console.log(`Preferred disciplines set: ${disciplines.join(', ')}`);
|
|
223
|
+
} else {
|
|
224
|
+
console.error(`Could not save disciplines (${resp.status}). Set them later on /builders.`);
|
|
225
|
+
}
|
|
226
|
+
} finally {
|
|
227
|
+
rl.close();
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Onboarding-friction consent (V3.R79 / #298, criterion C1 — feedback without
|
|
232
|
+
// asking). Instead of interrogating new builders about what was confusing, we
|
|
233
|
+
// offer to read their onboarding session transcripts and mine them for
|
|
234
|
+
// friction automatically. This is opt-in and time-boxed: consent opens a short
|
|
235
|
+
// onboarding window, after which the pipeline no-ops. Raw transcripts never
|
|
236
|
+
// leave the machine — only a distilled friction signal is filed to the GDS.
|
|
237
|
+
// Non-interactive shells skip the prompt and record no consent (safe default).
|
|
238
|
+
async function promptOnboardingConsent() {
|
|
239
|
+
if (!process.stdin.isTTY) return;
|
|
240
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
241
|
+
const ask = (q) => new Promise((resolve) => rl.question(q, resolve));
|
|
242
|
+
try {
|
|
243
|
+
console.log('');
|
|
244
|
+
console.log('To improve onboarding, we can read your onboarding session logs and');
|
|
245
|
+
console.log('automatically surface where the system tripped you up — no survey needed.');
|
|
246
|
+
console.log('Only a distilled friction summary is shared; your raw transcripts stay on');
|
|
247
|
+
console.log(`this machine. It runs for the first ${onboardingConfig.windowDays()} days, then stops on its own.`);
|
|
248
|
+
const answer = (await ask('May we read your onboarding session logs to improve the system? [Y/n] ')).trim().toLowerCase();
|
|
249
|
+
// Default (empty) is yes — the prompt advertises [Y/n].
|
|
250
|
+
const consent = answer === '' || answer === 'y' || answer === 'yes';
|
|
251
|
+
const record = onboardingConfig.writeConsent({ consent });
|
|
252
|
+
if (consent) {
|
|
253
|
+
console.log(`Thanks — onboarding-log analysis is on until ${new Date(onboardingConfig.windowExpiry(record)).toISOString().slice(0, 10)}.`);
|
|
254
|
+
} else {
|
|
255
|
+
console.log('No problem — onboarding-log analysis stays off.');
|
|
256
|
+
}
|
|
257
|
+
} catch (err) {
|
|
258
|
+
// Never let a consent-write hiccup block auth completion.
|
|
259
|
+
console.error(`(Could not record onboarding-log preference: ${err.message})`);
|
|
260
|
+
} finally {
|
|
261
|
+
rl.close();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
(async () => {
|
|
266
|
+
const forceFlag = process.argv.includes('--force');
|
|
267
|
+
|
|
268
|
+
// --dry-run: describe every side effect the real flow would perform, without
|
|
269
|
+
// doing any of them. No API calls, no file writes, no TTY prompts. Suitable
|
|
270
|
+
// for a newcomer to read before running for real. Intentionally calls
|
|
271
|
+
// loadSession() — which is read-only — so the preview tells them whether the
|
|
272
|
+
// real run would short-circuit on a pre-existing session.
|
|
273
|
+
if (DRY_RUN) {
|
|
274
|
+
console.log('Dry run — no API calls will be made and no files will be written.');
|
|
275
|
+
console.log('');
|
|
276
|
+
const preExisting = await loadSession();
|
|
277
|
+
if (preExisting && preExisting.token && !forceFlag) {
|
|
278
|
+
dryRunStep(`Would verify existing session at ${SESSION_PATH} via GET /api/gds/me.`);
|
|
279
|
+
dryRunStep('If the token is valid: on an interactive shell, would ASK whether to continue as that builder or set up as a different one ([1] continue / [2] sign in again, replacing the saved session). Non-interactive shells keep the existing session. (--force skips the question and re-auths directly.)');
|
|
280
|
+
dryRunStep('If the token is rejected (401), would fall through to the Device Flow.');
|
|
281
|
+
} else if (preExisting && forceFlag) {
|
|
282
|
+
dryRunStep(`Existing session found at ${SESSION_PATH}, but --force is set; would skip verification.`);
|
|
283
|
+
} else {
|
|
284
|
+
dryRunStep(`No existing session at ${SESSION_PATH}; would proceed straight to Device Flow.`);
|
|
285
|
+
}
|
|
286
|
+
dryRunStep('Would POST /api/gds/auth/device/start to get a user_code + verification_uri from GitHub.');
|
|
287
|
+
dryRunStep('Would print the verification_uri and user_code, then poll /api/gds/auth/device/poll every few seconds until the user approves or the code expires.');
|
|
288
|
+
dryRunStep(`On approval, would write the bearer token + builder profile to ${SESSION_PATH} (chmod 600).`);
|
|
289
|
+
if (SKIP_KEYS) {
|
|
290
|
+
dryRunStep('Would skip the Gemini-key prompt (--skip-keys set).');
|
|
291
|
+
} else {
|
|
292
|
+
dryRunStep(`Would prompt for a per-builder GOOGLE_AI_STUDIO_KEY on TTY shells and store it as gemini_api_key in ${SESSION_PATH} (mode 600). Used by modules/art-pipeline/pipeline/gen_api.py for per-builder cost attribution.`);
|
|
293
|
+
}
|
|
294
|
+
dryRunStep('Would read ~/.claude.json oauthAccount and, on a TTY, prompt to confirm the Anthropic email; on a match would POST /api/gds/me/anthropic-link and store anthropic_user_id in the session (kept as cosmetic attribution; the identity pin was removed — task 1039 / idea 258). On mismatch would REFUSE to link.');
|
|
295
|
+
dryRunStep('Would prompt for preferred disciplines (creative / engineering / both / skip) and PATCH /api/gds/me/disciplines on TTY shells.');
|
|
296
|
+
dryRunStep(`Would prompt for onboarding-friction consent (Y/n) and record the decision to ${onboardingConfig.CONSENT_PATH} on TTY shells.`);
|
|
297
|
+
dryRunStep('Would print "Authenticated as <github_login>" and exit 0.');
|
|
298
|
+
process.exit(0);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
const existing = await loadSession();
|
|
302
|
+
|
|
303
|
+
// PRE-FLIGHT: don't trust the local session file's existence alone — the
|
|
304
|
+
// token can be expired (mig 035 1h TTL), revoked, or belong to a different
|
|
305
|
+
// builder identity. Verify against the live API before declaring "already
|
|
306
|
+
// authenticated". Three branches:
|
|
307
|
+
// 200 (token works) → keep current session unless --force
|
|
308
|
+
// 401 (token rejected) → fall through to Device Flow automatically
|
|
309
|
+
// network error / non-200/401 → require --force to proceed; otherwise abort
|
|
310
|
+
if (existing && existing.token && !forceFlag) {
|
|
311
|
+
let verify;
|
|
312
|
+
try {
|
|
313
|
+
// allowUnauthenticated: a 401 here is a legitimate "session is stale,
|
|
314
|
+
// fall through to re-auth" signal, not the global "exit 2" failure mode.
|
|
315
|
+
verify = await (await cliClient({ allowUnauthenticated: true })).me.getMe();
|
|
316
|
+
} catch (err) {
|
|
317
|
+
console.error(`(Could not reach the GDS to verify the session: ${err.message})`);
|
|
318
|
+
console.error('Pass --force if you want to re-authenticate without verification.');
|
|
319
|
+
process.exit(1);
|
|
320
|
+
}
|
|
321
|
+
if (verify.status === 200) {
|
|
322
|
+
const b = verify.data?.builder || {};
|
|
323
|
+
const who = `${b.github_login || '(unknown)'} (id #${b.id || '?'}, rank=${b.rank || '?'})`;
|
|
324
|
+
|
|
325
|
+
// A valid session already exists on this machine. Don't silently adopt
|
|
326
|
+
// it. The session file is a single global path
|
|
327
|
+
// (~/.config/otb/gds-session.json), so a second person setting up on a
|
|
328
|
+
// shared device — or the same person onboarding a different account,
|
|
329
|
+
// e.g. for testing — would otherwise be invisibly bound to whoever set
|
|
330
|
+
// up first. On an interactive shell, confirm before continuing; the gate
|
|
331
|
+
// runs BEFORE we exit, so switching is always reachable without the
|
|
332
|
+
// builder needing to know about --force. (Fix A — multiple builders on
|
|
333
|
+
// one device, #533.)
|
|
334
|
+
if (!process.stdin.isTTY) {
|
|
335
|
+
// Non-interactive (CI / batch / piped input): can't ask. Keep the safe
|
|
336
|
+
// default — adopt the existing valid session rather than clobber it.
|
|
337
|
+
// A caller who needs a different identity passes --force.
|
|
338
|
+
console.log(`Already authenticated as ${who}. No setup needed.`);
|
|
339
|
+
// Intentionally do NOT advertise --force / account-switching here. The
|
|
340
|
+
// session is valid; surfacing "sign in as a different account" to every
|
|
341
|
+
// already-authenticated builder positions switching as an expected next
|
|
342
|
+
// step (and reads as "switch to a more privileged account"). --force
|
|
343
|
+
// still works for anyone who explicitly needs it; it just isn't pitched.
|
|
344
|
+
process.exit(0);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
console.log('');
|
|
348
|
+
console.log(`This device already has a builder session for ${who}.`);
|
|
349
|
+
console.log('Make sure that is the account you mean to build under.');
|
|
350
|
+
console.log(' [1] Continue as this builder');
|
|
351
|
+
console.log(' [2] Set up as a DIFFERENT builder (sign in again — replaces the saved session)');
|
|
352
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
353
|
+
const ask = (q) => new Promise((resolve) => rl.question(q, resolve));
|
|
354
|
+
let choice;
|
|
355
|
+
try {
|
|
356
|
+
choice = (await ask('Choose [1/2] (default 1): ')).trim();
|
|
357
|
+
} finally {
|
|
358
|
+
rl.close();
|
|
359
|
+
}
|
|
360
|
+
if (choice === '2') {
|
|
361
|
+
console.log('');
|
|
362
|
+
console.log('Setting up as a different builder — the saved session will be replaced once you finish signing in...');
|
|
363
|
+
// Fall through to the Device Flow below, which calls saveSession() and
|
|
364
|
+
// overwrites ~/.config/otb/gds-session.json with the new identity.
|
|
365
|
+
} else {
|
|
366
|
+
console.log(`Continuing as ${who}.`);
|
|
367
|
+
process.exit(0);
|
|
368
|
+
}
|
|
369
|
+
} else if (verify.status === 401) {
|
|
370
|
+
console.log(`Session file present at ${SESSION_PATH}, but the token is no longer valid.`);
|
|
371
|
+
console.log('Falling through to Device Flow to re-authenticate automatically...');
|
|
372
|
+
// Intentional: do NOT require --force here. The on-disk session is dead;
|
|
373
|
+
// re-auth is the only forward path and forcing the builder to re-run with
|
|
374
|
+
// a flag adds friction with zero value.
|
|
375
|
+
} else {
|
|
376
|
+
console.error(`Could not verify session (HTTP ${verify.status}). Pass --force to re-auth anyway.`);
|
|
377
|
+
process.exit(1);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
console.log('Starting GitHub Device Flow...');
|
|
382
|
+
const start = await (await cliClient()).auth.postAuthDeviceStart();
|
|
383
|
+
if (!start.ok) {
|
|
384
|
+
console.error(`device/start failed (${start.status}):`, start.data);
|
|
385
|
+
if (start.data?.error === 'auth_not_configured') {
|
|
386
|
+
console.error('');
|
|
387
|
+
console.error('The server does not yet have GitHub OAuth credentials.');
|
|
388
|
+
console.error('An Archon needs to register the GitHub OAuth App and provision credentials on the server.');
|
|
389
|
+
console.error('See blockers/blockers.md#github-oauth-app for the operator-side checklist.');
|
|
390
|
+
}
|
|
391
|
+
process.exit(1);
|
|
392
|
+
}
|
|
393
|
+
const { device_code, user_code, verification_uri, expires_in, interval } = start.data;
|
|
394
|
+
console.log('');
|
|
395
|
+
console.log(' ┌──────────────────────────────────────────────┐');
|
|
396
|
+
console.log(` │ 1. Open: ${verification_uri.padEnd(36)} │`);
|
|
397
|
+
console.log(` │ 2. Enter code: ${user_code.padEnd(30)} │`);
|
|
398
|
+
console.log(' └──────────────────────────────────────────────┘');
|
|
399
|
+
console.log('');
|
|
400
|
+
console.log(`Polling every ${interval}s for up to ${Math.round(expires_in / 60)} minutes...`);
|
|
401
|
+
|
|
402
|
+
const deadline = Date.now() + expires_in * 1000;
|
|
403
|
+
let pollInterval = interval * 1000;
|
|
404
|
+
while (Date.now() < deadline) {
|
|
405
|
+
await new Promise((r) => setTimeout(r, pollInterval));
|
|
406
|
+
const poll = await (await cliClient()).auth.postAuthDevicePoll({ body: { device_code } });
|
|
407
|
+
// Admission gate (SR-19 / task #1000): a first-time GitHub account that an
|
|
408
|
+
// Archon hasn't approved is refused (HTTP 403, state:'not_approved'). Print a
|
|
409
|
+
// clear, friendly explanation rather than a raw "poll failed" dump — this is
|
|
410
|
+
// expected, not a server error. (Mirrors the web flow's NOT_APPROVED page.)
|
|
411
|
+
if (poll.data && poll.data.state === 'not_approved') {
|
|
412
|
+
console.error('');
|
|
413
|
+
console.error('This GitHub account has not been approved yet.');
|
|
414
|
+
console.error('Off the Boats admits new builders by invitation: an Archon must');
|
|
415
|
+
console.error('approve your access request before you can enroll.');
|
|
416
|
+
console.error(' → Ask an Archon to invite you / approve your access request,');
|
|
417
|
+
console.error(' then re-run /builder-setup (or: node scripts/gds/setup.js).');
|
|
418
|
+
process.exit(1);
|
|
419
|
+
}
|
|
420
|
+
if (!poll.ok) {
|
|
421
|
+
console.error(`poll failed (${poll.status}):`, poll.data);
|
|
422
|
+
process.exit(1);
|
|
423
|
+
}
|
|
424
|
+
const state = poll.data.state;
|
|
425
|
+
if (state === 'pending') {
|
|
426
|
+
process.stdout.write('.');
|
|
427
|
+
continue;
|
|
428
|
+
}
|
|
429
|
+
if (state === 'slow_down') {
|
|
430
|
+
pollInterval = (poll.data.interval || interval) * 1000;
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
if (state === 'denied') {
|
|
434
|
+
console.error('\nAuthentication denied by GitHub.');
|
|
435
|
+
process.exit(1);
|
|
436
|
+
}
|
|
437
|
+
if (state === 'expired') {
|
|
438
|
+
console.error('\nDevice code expired before approval.');
|
|
439
|
+
process.exit(1);
|
|
440
|
+
}
|
|
441
|
+
if (state === 'ok') {
|
|
442
|
+
const { token, builder } = poll.data;
|
|
443
|
+
await saveSession({ token, builder, api_base: API_BASE });
|
|
444
|
+
console.log('');
|
|
445
|
+
console.log('');
|
|
446
|
+
console.log(`Authenticated as ${builder.github_login} (#${builder.id})`);
|
|
447
|
+
console.log(`Display name: ${builder.display_name}`);
|
|
448
|
+
console.log(`Total credits: ${builder.total_credits}`);
|
|
449
|
+
console.log(`Session saved to ${SESSION_PATH}`);
|
|
450
|
+
// SEC #863: activate the project git hooks (core.hooksPath → .husky) so
|
|
451
|
+
// the pre-commit secrets guard AND the pre-push permission gate run. Best
|
|
452
|
+
// effort — an activation hiccup must never fail an otherwise-good setup;
|
|
453
|
+
// the post-push main audit is the fail-closed net regardless.
|
|
454
|
+
try {
|
|
455
|
+
const { activate } = require('./install-git-hooks');
|
|
456
|
+
const r = activate();
|
|
457
|
+
if (r.status === 'activated') console.log('Git hooks activated (pre-commit secrets guard + pre-push permission gate)');
|
|
458
|
+
else if (r.status === 'already-active') console.log('Git hooks already active (pre-commit + pre-push gates)');
|
|
459
|
+
else console.log(`Note: ${r.message}`);
|
|
460
|
+
} catch (e) {
|
|
461
|
+
console.log(`Note: could not activate git hooks (${e.message}); run: git config core.hooksPath .husky`);
|
|
462
|
+
}
|
|
463
|
+
await promptGeminiKey();
|
|
464
|
+
// #1281: deliver the GDS shared art key to entitled newcomers right now, so
|
|
465
|
+
// a brand-new Xenos's first art task works without waiting for the next
|
|
466
|
+
// session start. Best-effort, bounded — never block setup. (Phase 2 will
|
|
467
|
+
// make the promptGeminiKey copy above rank-aware — "we cover your first art
|
|
468
|
+
// tasks; add your own key when you reach Thetes".)
|
|
469
|
+
try {
|
|
470
|
+
const { spawnSync } = require('node:child_process');
|
|
471
|
+
const path = require('node:path');
|
|
472
|
+
spawnSync(process.execPath, [path.join(__dirname, 'fetch-art-key.js')],
|
|
473
|
+
{ stdio: 'ignore', timeout: 8000 });
|
|
474
|
+
} catch (_) { /* non-fatal — the session-start sync will deliver it later */ }
|
|
475
|
+
await promptAnthropicLink();
|
|
476
|
+
await promptDisciplines();
|
|
477
|
+
await promptOnboardingConsent();
|
|
478
|
+
// #766: explicit "what's next?" footer. The Xenos path is action-only —
|
|
479
|
+
// no primer to read first — so a newcomer goes straight from setup to
|
|
480
|
+
// surveying the works. Ship three and the city makes you a Thetes.
|
|
481
|
+
try {
|
|
482
|
+
const meRes = await (await cliClient()).me.getMe();
|
|
483
|
+
if (meRes.ok) {
|
|
484
|
+
console.log('');
|
|
485
|
+
printOnboardingNudge(meRes.data);
|
|
486
|
+
console.log('');
|
|
487
|
+
console.log('Newcomer path:');
|
|
488
|
+
console.log(' 1. Choose thy craft: open https://amazonprimea.com/builders (creative / engineering)');
|
|
489
|
+
console.log(' 2. Survey work: /builder-start');
|
|
490
|
+
console.log(' 3. Claim + ship: /builder-claim N → /builder-ship');
|
|
491
|
+
console.log(' 4. Ship three works and you rise to Thetes — the whole queue opens.');
|
|
492
|
+
}
|
|
493
|
+
} catch (_) {
|
|
494
|
+
// never let a UX footer break a successful setup
|
|
495
|
+
}
|
|
496
|
+
process.exit(0);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
console.error('\nTimed out waiting for approval.');
|
|
500
|
+
process.exit(1);
|
|
501
|
+
})().catch((err) => {
|
|
502
|
+
console.error('fatal:', err);
|
|
503
|
+
process.exit(1);
|
|
504
|
+
});
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/gds/shell.js — `bongos shell` (GDS-V4 · V4.R80 · task 1247).
|
|
3
|
+
//
|
|
4
|
+
// Opens a terminal on the builder's cloud dev box. Wakes/provisions it first
|
|
5
|
+
// (POST /box/ensure), ensures the local SSH key exists + is registered, pins the
|
|
6
|
+
// box host key, then `ssh -t root@<host>` into /workspace. On the FIRST connect to
|
|
7
|
+
// a given box it runs an interactive `claude` so the one-time /login (Trusted
|
|
8
|
+
// Devices enrollment, interactive-only by design — ADR 0038) is completed; silent
|
|
9
|
+
// after that.
|
|
10
|
+
//
|
|
11
|
+
// bongos shell interactive shell on the cloud box
|
|
12
|
+
// bongos shell -- <cmd...> run <cmd> on the box (non-interactive)
|
|
13
|
+
// bongos shell --login force the first-run `claude` /login handoff
|
|
14
|
+
// bongos shell --local open a shell on the LOCAL clone (Metic+ only)
|
|
15
|
+
|
|
16
|
+
'use strict';
|
|
17
|
+
|
|
18
|
+
const os = require('node:os');
|
|
19
|
+
const path = require('node:path');
|
|
20
|
+
const { spawnSync, execFileSync } = require('node:child_process');
|
|
21
|
+
const lib = require('./box-connect-lib');
|
|
22
|
+
|
|
23
|
+
function repoRoot() {
|
|
24
|
+
try {
|
|
25
|
+
return execFileSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf8' }).trim();
|
|
26
|
+
} catch (_) {
|
|
27
|
+
return process.cwd();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function runLocal({ remoteCmd, log }) {
|
|
32
|
+
const rank = await lib.fetchRank();
|
|
33
|
+
if (!lib.rankAtLeast(rank, 'metic')) {
|
|
34
|
+
console.error(
|
|
35
|
+
`✖ \`--local\` is a Metic+ convenience (your rank: ${rank || 'unknown'}). ` +
|
|
36
|
+
'The standard environment is the cloud box: run `bongos shell` without `--local`.'
|
|
37
|
+
);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const root = repoRoot();
|
|
41
|
+
log(`▸ Local clone: ${root.replace(os.homedir(), '~')}`);
|
|
42
|
+
const isDevcontainer = require('node:fs').existsSync(path.join(root, '.devcontainer', 'devcontainer.json'));
|
|
43
|
+
if (isDevcontainer) {
|
|
44
|
+
log(' (a .devcontainer is present — open it in VS Code with `bongos code --local`, then "Reopen in Container".)');
|
|
45
|
+
}
|
|
46
|
+
if (remoteCmd) {
|
|
47
|
+
const r = spawnSync(remoteCmd[0], remoteCmd.slice(1), { cwd: root, stdio: 'inherit', shell: process.platform === 'win32' });
|
|
48
|
+
process.exit(r.status == null ? 1 : r.status);
|
|
49
|
+
}
|
|
50
|
+
const shell = process.env.SHELL || (process.platform === 'win32' ? process.env.COMSPEC || 'cmd.exe' : 'bash');
|
|
51
|
+
const r = spawnSync(shell, process.platform === 'win32' ? [] : ['-l'], { cwd: root, stdio: 'inherit' });
|
|
52
|
+
process.exit(r.status == null ? 1 : r.status);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function main() {
|
|
56
|
+
const argv = process.argv.slice(2);
|
|
57
|
+
const local = argv.includes('--local');
|
|
58
|
+
const forceLogin = argv.includes('--login');
|
|
59
|
+
let rest = argv.filter((a) => a !== '--local' && a !== '--login');
|
|
60
|
+
if (rest[0] === '--') rest = rest.slice(1);
|
|
61
|
+
const remoteCmd = rest.length ? rest : null;
|
|
62
|
+
const log = console.log;
|
|
63
|
+
|
|
64
|
+
if (local) return runLocal({ remoteCmd, log });
|
|
65
|
+
|
|
66
|
+
if (!lib.binPresent('ssh', ['-V'])) {
|
|
67
|
+
console.error('✖ The `ssh` client was not found. Install OpenSSH (macOS/Linux ship it; on Windows enable the "OpenSSH Client" optional feature) and re-run.');
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
console.log('▸ Connecting to your Amazonprimea dev box…');
|
|
72
|
+
const { box, keyPath } = await lib.prepareConnection({ log });
|
|
73
|
+
const host = box.hostname;
|
|
74
|
+
|
|
75
|
+
const sshArgs = ['-t', '-i', keyPath, '-o', 'IdentitiesOnly=yes', '-o', 'StrictHostKeyChecking=accept-new', `${lib.BOX_USER}@${host}`];
|
|
76
|
+
let firstRun = false;
|
|
77
|
+
if (remoteCmd) {
|
|
78
|
+
// Everything after the host IS the remote command (ssh option parsing stops
|
|
79
|
+
// at the destination), so pass the tokens directly — no `--` separator, which
|
|
80
|
+
// ssh would forward to the remote shell as a bogus first word.
|
|
81
|
+
sshArgs.push(...remoteCmd);
|
|
82
|
+
} else {
|
|
83
|
+
firstRun = forceLogin || lib.isFirstLogin(host);
|
|
84
|
+
sshArgs.push(lib.buildRemoteShellCommand({ firstRun }));
|
|
85
|
+
console.log(`▸ Opening a shell on ${host} (${lib.WORKSPACE})…`);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const r = spawnSync('ssh', sshArgs, { stdio: 'inherit' });
|
|
89
|
+
if (r.error) {
|
|
90
|
+
console.error(`✖ ssh failed to launch: ${r.error.message}`);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
if (firstRun && r.status === 0) lib.markLoginDone(host);
|
|
94
|
+
process.exit(r.status == null ? 1 : r.status);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
main().catch((err) => {
|
|
98
|
+
console.error(`✖ ${err.message}`);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
});
|