@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,389 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// GDS Doctor — one-shot health check for a builder's local machine.
|
|
3
|
+
//
|
|
4
|
+
// Usage:
|
|
5
|
+
// node scripts/gds/doctor.js
|
|
6
|
+
//
|
|
7
|
+
// No arguments. Prints a green/red checklist covering:
|
|
8
|
+
// - Session validity (file present, /me returns 200, identity + rank)
|
|
9
|
+
// - Toolchain (Node >= 22; the `claude` CLI the grader spawns is launchable —
|
|
10
|
+
// this is the check that would have surfaced Xenos's Windows grader failure
|
|
11
|
+
// up front instead of after a deep manual dig)
|
|
12
|
+
// - Git plumbing (core.hooksPath resolves to a real directory, hook executable)
|
|
13
|
+
// - Repo state (on a known branch, no uncommitted matches against a held
|
|
14
|
+
// claim's touches[])
|
|
15
|
+
// - Environment (.env.local present in main checkout, art-pipeline key
|
|
16
|
+
// present at ~/.config/otb/env)
|
|
17
|
+
//
|
|
18
|
+
// Exits 0 if every check passes, 1 if any red finding (so it's safe to wire
|
|
19
|
+
// into hooks or CI smoke). Intended to be run by a builder when something
|
|
20
|
+
// feels off ("am I authed? are my hooks installed? is my worktree clean?")
|
|
21
|
+
// and to be the single command we point new builders at first.
|
|
22
|
+
//
|
|
23
|
+
// Designed not to throw — every check catches its own exceptions and renders
|
|
24
|
+
// a red row with the error message rather than blowing up the whole report.
|
|
25
|
+
|
|
26
|
+
const fs = require('node:fs');
|
|
27
|
+
const path = require('node:path');
|
|
28
|
+
const os = require('node:os');
|
|
29
|
+
const { execSync, spawnSync } = require('node:child_process');
|
|
30
|
+
const { cliClient, SESSION_PATH, loadSession } = require('./cli-lib');
|
|
31
|
+
|
|
32
|
+
// ANSI helpers (only if stdout is a TTY; otherwise emit plain text)
|
|
33
|
+
const TTY = process.stdout.isTTY;
|
|
34
|
+
const C = {
|
|
35
|
+
green: TTY ? '\x1b[32m' : '',
|
|
36
|
+
red: TTY ? '\x1b[31m' : '',
|
|
37
|
+
yellow: TTY ? '\x1b[33m' : '',
|
|
38
|
+
bold: TTY ? '\x1b[1m' : '',
|
|
39
|
+
reset: TTY ? '\x1b[0m' : '',
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// Accumulate findings across all checks. Each finding has a status (ok / warn /
|
|
43
|
+
// fail), a section name, and a one-line description. Only "fail" rows count
|
|
44
|
+
// toward the non-zero exit code; "warn" is for things that are mildly off but
|
|
45
|
+
// the builder can still work (e.g. art-pipeline key missing — only matters if
|
|
46
|
+
// they touch the pipeline).
|
|
47
|
+
const findings = [];
|
|
48
|
+
|
|
49
|
+
function ok(section, msg) {
|
|
50
|
+
findings.push({ status: 'ok', section, msg });
|
|
51
|
+
console.log(` ${C.green}✓${C.reset} ${msg}`);
|
|
52
|
+
}
|
|
53
|
+
function warn(section, msg) {
|
|
54
|
+
findings.push({ status: 'warn', section, msg });
|
|
55
|
+
console.log(` ${C.yellow}!${C.reset} ${msg}`);
|
|
56
|
+
}
|
|
57
|
+
function fail(section, msg) {
|
|
58
|
+
findings.push({ status: 'fail', section, msg });
|
|
59
|
+
console.log(` ${C.red}✖${C.reset} ${msg}`);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function section(title) {
|
|
63
|
+
console.log('');
|
|
64
|
+
console.log(`${C.bold}${title}${C.reset}`);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function gitOut(cmd, opts = {}) {
|
|
68
|
+
try {
|
|
69
|
+
return execSync(cmd, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'], ...opts }).trim();
|
|
70
|
+
} catch (_) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// --------------------------------------------------------------------------
|
|
76
|
+
// Check 1 — Session
|
|
77
|
+
// --------------------------------------------------------------------------
|
|
78
|
+
async function checkSession() {
|
|
79
|
+
section('Session');
|
|
80
|
+
let s;
|
|
81
|
+
try {
|
|
82
|
+
s = await loadSession();
|
|
83
|
+
} catch (err) {
|
|
84
|
+
fail('session', `Could not read session file: ${err.message}`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (!s || !s.token) {
|
|
88
|
+
fail('session', `No session file at ${SESSION_PATH} (or the legacy fallback).`);
|
|
89
|
+
fail('session', `Recover with: node scripts/gds/setup.js`);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
ok('session', `Session file present (${SESSION_PATH.replace(os.homedir(), '~')})`);
|
|
93
|
+
// Ping /me with allowUnauthenticated so we can render a red row instead of
|
|
94
|
+
// exiting via the global 401 short-circuit.
|
|
95
|
+
let me;
|
|
96
|
+
try {
|
|
97
|
+
const api = await cliClient({ allowUnauthenticated: true });
|
|
98
|
+
me = await api.me.getMe();
|
|
99
|
+
} catch (err) {
|
|
100
|
+
fail('session', `Could not reach the GDS to verify the token: ${err.message}`);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (me.status === 401) {
|
|
104
|
+
fail('session', `Token rejected (HTTP 401). Recover with: node scripts/gds/setup.js --force`);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (me.status !== 200) {
|
|
108
|
+
fail('session', `Unexpected /me response (HTTP ${me.status}). Try: node scripts/gds/setup.js --force`);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const b = me.data?.builder || {};
|
|
112
|
+
ok('session', `Authenticated as ${b.github_login} (id #${b.id}, rank=${b.rank}, ${b.total_credits ?? 0} credits)`);
|
|
113
|
+
ok('session', `Session is rolling: every authenticated request resets the 1h TTL.`);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// --------------------------------------------------------------------------
|
|
117
|
+
// Check 2 — Toolchain (Node + the claude CLI the grader spawns)
|
|
118
|
+
// --------------------------------------------------------------------------
|
|
119
|
+
//
|
|
120
|
+
// The grader (src/bongos/grader.js) spawns one `claude` subprocess per worker. If
|
|
121
|
+
// that binary can't be launched, every ship fails the grade with
|
|
122
|
+
// SUBAGENT_SPAWN_FAILED (can't launch) or SUBAGENT_NONZERO_EXIT (launches but
|
|
123
|
+
// misbehaves — e.g. the Windows "App execution alias" desktop stub). On Windows
|
|
124
|
+
// this bit a real builder twice and was only diagnosed after a long manual dig.
|
|
125
|
+
// This check makes it the FIRST thing doctor reports, with the one-line fix.
|
|
126
|
+
//
|
|
127
|
+
// Resolution mirrors the grader EXACTLY (OTB_CLAUDE_BIN / CLAUDE_BIN / 'claude',
|
|
128
|
+
// shell:true on win32 so a `claude.cmd` shim resolves) so a green row here means
|
|
129
|
+
// the grader's spawn will work too. Mac/Linux: shell:false, identical to today.
|
|
130
|
+
function checkToolchain() {
|
|
131
|
+
section('Toolchain');
|
|
132
|
+
|
|
133
|
+
// Node — setup-builder.sh requires >= 22; the scripts assume modern Node.
|
|
134
|
+
const nodeMajor = Number((process.versions.node || '0').split('.')[0]);
|
|
135
|
+
if (nodeMajor >= 22) {
|
|
136
|
+
ok('toolchain', `Node ${process.version} (>= 22 required).`);
|
|
137
|
+
} else {
|
|
138
|
+
fail('toolchain', `Node ${process.version} is below the required v22. Upgrade Node (e.g. nvm install 22, or https://nodejs.org).`);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// claude CLI — same resolution order the grader uses.
|
|
142
|
+
const fromEnv = process.env.OTB_CLAUDE_BIN
|
|
143
|
+
? ' (via OTB_CLAUDE_BIN)'
|
|
144
|
+
: process.env.CLAUDE_BIN
|
|
145
|
+
? ' (via CLAUDE_BIN)'
|
|
146
|
+
: '';
|
|
147
|
+
const bin = process.env.OTB_CLAUDE_BIN || process.env.CLAUDE_BIN || 'claude';
|
|
148
|
+
let r;
|
|
149
|
+
try {
|
|
150
|
+
r = spawnSync(bin, ['--version'], {
|
|
151
|
+
encoding: 'utf8',
|
|
152
|
+
shell: process.platform === 'win32',
|
|
153
|
+
windowsHide: true,
|
|
154
|
+
timeout: 15000,
|
|
155
|
+
});
|
|
156
|
+
} catch (err) {
|
|
157
|
+
r = { error: err };
|
|
158
|
+
}
|
|
159
|
+
if (r && !r.error && r.status === 0) {
|
|
160
|
+
const ver = (r.stdout || '').trim().split('\n')[0] || 'present';
|
|
161
|
+
ok('toolchain', `claude CLI launches${fromEnv}: ${ver} — the grader can spawn its workers.`);
|
|
162
|
+
// Windows-only: warn if the resolved binary is the desktop "App execution
|
|
163
|
+
// alias" stub. It can pass --version yet misbehave under the grader's
|
|
164
|
+
// stdio redirection (SUBAGENT_NONZERO_EXIT). Learning #42.
|
|
165
|
+
if (process.platform === 'win32' && !process.env.OTB_CLAUDE_BIN && !process.env.CLAUDE_BIN) {
|
|
166
|
+
try {
|
|
167
|
+
const where = spawnSync('where', ['claude'], { encoding: 'utf8', shell: true, timeout: 8000 });
|
|
168
|
+
if (where.status === 0 && /WindowsApps/i.test(where.stdout || '')) {
|
|
169
|
+
warn('toolchain', `claude resolves to the WindowsApps desktop alias, which can fail headless grading (SUBAGENT_NONZERO_EXIT). Prefer a real CLI: npm i -g @anthropic-ai/claude-code (learning #42).`);
|
|
170
|
+
}
|
|
171
|
+
} catch (_) { /* best-effort */ }
|
|
172
|
+
}
|
|
173
|
+
} else {
|
|
174
|
+
const why = r && r.error ? (r.error.code || r.error.message) : `exited ${r ? r.status : '?'}`;
|
|
175
|
+
fail('toolchain', `claude CLI not launchable (${bin}: ${why}). The grader spawns it per worker — without it, ships fail grading with SUBAGENT_SPAWN_FAILED.`);
|
|
176
|
+
fail('toolchain', `Fix: npm i -g @anthropic-ai/claude-code (puts a real claude on PATH). If it lives elsewhere, set OTB_CLAUDE_BIN to its full path and re-run.`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// --------------------------------------------------------------------------
|
|
181
|
+
// Check 3 — Git plumbing
|
|
182
|
+
// --------------------------------------------------------------------------
|
|
183
|
+
function checkGitPlumbing() {
|
|
184
|
+
section('Git plumbing');
|
|
185
|
+
const hooksPath = gitOut('git config --get core.hooksPath');
|
|
186
|
+
if (!hooksPath) {
|
|
187
|
+
fail('git', `core.hooksPath is unset. Activate the pre-commit secrets guard with:\n git config core.hooksPath .husky`);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
// Resolve relative to current worktree root (git's behavior for relative
|
|
191
|
+
// hooksPath values). Absolute paths resolve as-is.
|
|
192
|
+
let resolved = hooksPath;
|
|
193
|
+
if (!path.isAbsolute(hooksPath)) {
|
|
194
|
+
const top = gitOut('git rev-parse --show-toplevel');
|
|
195
|
+
if (top) resolved = path.join(top, hooksPath);
|
|
196
|
+
}
|
|
197
|
+
if (!fs.existsSync(resolved)) {
|
|
198
|
+
fail('git', `core.hooksPath="${hooksPath}" resolves to a non-existent path: ${resolved}`);
|
|
199
|
+
fail('git', `Reset with: git config core.hooksPath .husky`);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
ok('git', `core.hooksPath="${hooksPath}" → ${resolved} (exists)`);
|
|
203
|
+
const preCommit = path.join(resolved, 'pre-commit');
|
|
204
|
+
if (!fs.existsSync(preCommit)) {
|
|
205
|
+
warn('git', `No pre-commit file at ${preCommit} — secrets-guard hook will not fire.`);
|
|
206
|
+
} else {
|
|
207
|
+
try {
|
|
208
|
+
fs.accessSync(preCommit, fs.constants.X_OK);
|
|
209
|
+
ok('git', `pre-commit hook is executable.`);
|
|
210
|
+
} catch (_) {
|
|
211
|
+
warn('git', `pre-commit exists but is not executable: ${preCommit}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// --------------------------------------------------------------------------
|
|
217
|
+
// Check 4 — Repo state
|
|
218
|
+
// --------------------------------------------------------------------------
|
|
219
|
+
async function checkRepoState() {
|
|
220
|
+
section('Repo state');
|
|
221
|
+
const branch = gitOut('git rev-parse --abbrev-ref HEAD');
|
|
222
|
+
if (!branch) {
|
|
223
|
+
fail('repo', `Could not determine current git branch. Are we inside a git repo?`);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
if (branch === 'HEAD') {
|
|
227
|
+
warn('repo', `Detached HEAD — most workflows expect a named branch.`);
|
|
228
|
+
} else {
|
|
229
|
+
ok('repo', `On branch ${branch}.`);
|
|
230
|
+
}
|
|
231
|
+
// If we have a session AND an active claim, optionally surface a touches[]
|
|
232
|
+
// drift hint. Skip silently if we don't (the /me data is already lost by
|
|
233
|
+
// this point of the check sequence; we'd have to re-fetch and that's more
|
|
234
|
+
// failure surface area for marginal value).
|
|
235
|
+
// (Left as a quiet ok-row to keep the section honest.)
|
|
236
|
+
const porcelain = gitOut('git status --porcelain');
|
|
237
|
+
if (!porcelain) {
|
|
238
|
+
ok('repo', `Working tree clean.`);
|
|
239
|
+
} else {
|
|
240
|
+
const lines = porcelain.split('\n').filter(Boolean);
|
|
241
|
+
warn('repo', `${lines.length} uncommitted change(s) in the working tree.`);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// --------------------------------------------------------------------------
|
|
246
|
+
// Check 5 — Environment
|
|
247
|
+
// --------------------------------------------------------------------------
|
|
248
|
+
function checkEnvironment() {
|
|
249
|
+
section('Environment');
|
|
250
|
+
// Find the main checkout root via the shared common-dir trick (works from
|
|
251
|
+
// any worktree, survives folder renames).
|
|
252
|
+
const commonDir = gitOut('git rev-parse --git-common-dir');
|
|
253
|
+
if (!commonDir) {
|
|
254
|
+
warn('env', `Could not resolve git common-dir; skipping .env.local check.`);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
const mainRoot = path.dirname(path.resolve(commonDir));
|
|
258
|
+
const envLocal = path.join(mainRoot, '.env.local');
|
|
259
|
+
if (fs.existsSync(envLocal)) {
|
|
260
|
+
ok('env', `.env.local present in main checkout (${mainRoot.replace(os.homedir(), '~')}/.env.local)`);
|
|
261
|
+
} else {
|
|
262
|
+
warn('env', `No .env.local in the main checkout. If you need local secrets, run /builder-setup.`);
|
|
263
|
+
}
|
|
264
|
+
// Art-pipeline key — survives worktree churn at ~/.config/otb/env
|
|
265
|
+
const otbEnv = path.join(os.homedir(), '.config/otb/env');
|
|
266
|
+
if (fs.existsSync(otbEnv)) {
|
|
267
|
+
ok('env', `Art-pipeline env present (~/.config/otb/env)`);
|
|
268
|
+
} else {
|
|
269
|
+
warn('env', `No ~/.config/otb/env — art pipeline calls will fail if you try them.`);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// --------------------------------------------------------------------------
|
|
274
|
+
// Check — Deploy tooling (the GitHub CLI the 'ci' deploy mode spawns)
|
|
275
|
+
//
|
|
276
|
+
// #857 / ADR 0042: in 'ci' deploy mode, ship.js's ciLand opens a PR + enables
|
|
277
|
+
// auto-merge via the `gh` CLI on THIS machine. If gh is missing or not
|
|
278
|
+
// authenticated, the ship reaches `confirmed` then fails to land with a cryptic
|
|
279
|
+
// `gh pr create` error. Surface it here as an actionable row so a builder fixes
|
|
280
|
+
// it before shipping. In 'laptop' mode gh isn't used → informational only.
|
|
281
|
+
// (The eventual fix that drops this dependency — server-mediated PR creation —
|
|
282
|
+
// is tracked separately; until then this check is the guardrail.)
|
|
283
|
+
function checkDeployTooling() {
|
|
284
|
+
section('Deploy tooling');
|
|
285
|
+
|
|
286
|
+
// Resolve the mode exactly as ship.js will (env > committed config > laptop).
|
|
287
|
+
// Lazy + guarded require so doctor never throws if ship.js's load changes.
|
|
288
|
+
let mode = 'laptop';
|
|
289
|
+
try {
|
|
290
|
+
mode = require('./ship.js').resolveDeployMode();
|
|
291
|
+
} catch (_) {
|
|
292
|
+
/* keep the safe default; ship.js load is not doctor's concern */
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
if (mode !== 'ci') {
|
|
296
|
+
ok('deploy', `Deploy mode: laptop — the operator lands ships; the gh CLI is not required here.`);
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// ADR 0055 / task 1025: in ci mode there are two publish paths. A machine with
|
|
301
|
+
// no GitHub push credential (a dev box) ships SERVER-MEDIATED — it uploads its
|
|
302
|
+
// branch to the GDS, which pushes + opens the PR with the server's credential —
|
|
303
|
+
// so gh is NOT needed here. Resolve the same path ship.js will take and skip the
|
|
304
|
+
// gh requirement when it's server-mediated.
|
|
305
|
+
let via = 'local';
|
|
306
|
+
try {
|
|
307
|
+
via = require('./ship.js').pushVia();
|
|
308
|
+
} catch (_) {
|
|
309
|
+
/* keep 'local'; the gh checks below are the safe, stricter default */
|
|
310
|
+
}
|
|
311
|
+
if (via === 'server') {
|
|
312
|
+
ok('deploy', `Deploy mode: ci (server-mediated publish) — this machine has no GitHub push credential, so the GDS pushes your branch + opens the PR for you. gh is not required here. NOTE: on a dev box, run /builder-reauth (browser) first so your session is a real cli session, not the box-scoped one.`);
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// ci mode, local push path → gh is on the critical path for this builder's own ship.
|
|
317
|
+
let installed = false;
|
|
318
|
+
try {
|
|
319
|
+
const v = spawnSync('gh', ['--version'], {
|
|
320
|
+
encoding: 'utf8',
|
|
321
|
+
shell: process.platform === 'win32',
|
|
322
|
+
windowsHide: true,
|
|
323
|
+
timeout: 15000,
|
|
324
|
+
});
|
|
325
|
+
installed = !!v && !v.error && v.status === 0;
|
|
326
|
+
} catch (_) {
|
|
327
|
+
installed = false;
|
|
328
|
+
}
|
|
329
|
+
if (!installed) {
|
|
330
|
+
fail('deploy', `Deploy mode is 'ci' but the GitHub CLI (gh) is not launchable. ci-mode ship opens a PR via gh — install it (https://cli.github.com) then 'gh auth login', or ships will reach confirmed and fail to land.`);
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
let authed = false;
|
|
335
|
+
try {
|
|
336
|
+
const a = spawnSync('gh', ['auth', 'status'], {
|
|
337
|
+
encoding: 'utf8',
|
|
338
|
+
shell: process.platform === 'win32',
|
|
339
|
+
windowsHide: true,
|
|
340
|
+
timeout: 15000,
|
|
341
|
+
});
|
|
342
|
+
authed = !!a && !a.error && a.status === 0;
|
|
343
|
+
} catch (_) {
|
|
344
|
+
authed = false;
|
|
345
|
+
}
|
|
346
|
+
if (authed) {
|
|
347
|
+
ok('deploy', `Deploy mode: ci — gh CLI present + authenticated; ci-mode ship can open + auto-merge its PR.`);
|
|
348
|
+
} else {
|
|
349
|
+
fail('deploy', `Deploy mode is 'ci' and gh is installed but NOT authenticated. Run 'gh auth login' (needs repo scope) or ci-mode ships will fail at 'gh pr create'.`);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// --------------------------------------------------------------------------
|
|
354
|
+
// main
|
|
355
|
+
// --------------------------------------------------------------------------
|
|
356
|
+
(async () => {
|
|
357
|
+
console.log(`${C.bold}GDS Doctor${C.reset} — local-machine health check`);
|
|
358
|
+
await checkSession();
|
|
359
|
+
checkToolchain();
|
|
360
|
+
checkDeployTooling();
|
|
361
|
+
checkGitPlumbing();
|
|
362
|
+
await checkRepoState();
|
|
363
|
+
checkEnvironment();
|
|
364
|
+
|
|
365
|
+
const fails = findings.filter((f) => f.status === 'fail').length;
|
|
366
|
+
const warns = findings.filter((f) => f.status === 'warn').length;
|
|
367
|
+
const oks = findings.filter((f) => f.status === 'ok').length;
|
|
368
|
+
|
|
369
|
+
console.log('');
|
|
370
|
+
if (fails === 0 && warns === 0) {
|
|
371
|
+
console.log(`${C.green}All ${oks} checks green.${C.reset}`);
|
|
372
|
+
process.exit(0);
|
|
373
|
+
}
|
|
374
|
+
const parts = [];
|
|
375
|
+
if (fails > 0) parts.push(`${C.red}${fails} fail${C.reset}`);
|
|
376
|
+
if (warns > 0) parts.push(`${C.yellow}${warns} warn${C.reset}`);
|
|
377
|
+
parts.push(`${oks} ok`);
|
|
378
|
+
console.log(`Summary: ${parts.join(', ')}.`);
|
|
379
|
+
if (fails > 0) {
|
|
380
|
+
console.log(`Address the fail rows above before continuing builder work.`);
|
|
381
|
+
process.exit(1);
|
|
382
|
+
}
|
|
383
|
+
process.exit(0);
|
|
384
|
+
})().catch((err) => {
|
|
385
|
+
// Doctor's job is to NEVER throw — every check catches its own exceptions.
|
|
386
|
+
// If we got here, something is genuinely wrong with the doctor itself.
|
|
387
|
+
console.error('doctor: unexpected fatal:', err);
|
|
388
|
+
process.exit(1);
|
|
389
|
+
});
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/gds/feedback-latest.js — R13 (BV1.R13): the engine behind the
|
|
3
|
+
// /feedback Claude Code slash command.
|
|
4
|
+
//
|
|
5
|
+
// Resolves the LATEST feedback bundle the Bongos app wrote to
|
|
6
|
+
// ~/CloudBongos/feedback/ (via the shared `latest` pointer in
|
|
7
|
+
// bongos-app/src/handoff.js) and prints it for a Claude Code session:
|
|
8
|
+
//
|
|
9
|
+
// 1. the full prompt.md body (the model-agnostic transcript + ask, R11), and
|
|
10
|
+
// 2. the ABSOLUTE path of every attached frame, on its own line, so Claude's
|
|
11
|
+
// Read tool can load each image directly.
|
|
12
|
+
//
|
|
13
|
+
// This sidesteps the CLI's unreliable clipboard-image paste: Claude reads the
|
|
14
|
+
// frames from disk by path instead of from a pasted blob.
|
|
15
|
+
//
|
|
16
|
+
// Usage:
|
|
17
|
+
// node scripts/gds/feedback-latest.js # human/agent-readable dump
|
|
18
|
+
// node scripts/gds/feedback-latest.js --json # { id, dir, promptMarkdown, imagePaths }
|
|
19
|
+
// node scripts/gds/feedback-latest.js --base DIR # override bundle base dir (tests)
|
|
20
|
+
//
|
|
21
|
+
// Local + read-only: it reads files under your home dir. No GDS session, no
|
|
22
|
+
// network — so it works on any machine the Bongos app runs on.
|
|
23
|
+
|
|
24
|
+
'use strict';
|
|
25
|
+
|
|
26
|
+
const path = require('node:path');
|
|
27
|
+
const { resolveLatest, feedbackBaseDir } = require(
|
|
28
|
+
path.join(__dirname, '..', '..', 'bongos-app', 'src', 'handoff.js'),
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
function parseArgs(argv) {
|
|
32
|
+
const out = { json: false, base: undefined };
|
|
33
|
+
for (let i = 0; i < argv.length; i++) {
|
|
34
|
+
const a = argv[i];
|
|
35
|
+
if (a === '--json') out.json = true;
|
|
36
|
+
else if (a === '--base') out.base = argv[++i];
|
|
37
|
+
else if (a.startsWith('--base=')) out.base = a.slice('--base='.length);
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async function main() {
|
|
43
|
+
const args = parseArgs(process.argv.slice(2));
|
|
44
|
+
const baseDir = args.base || feedbackBaseDir();
|
|
45
|
+
|
|
46
|
+
const latest = await resolveLatest(baseDir);
|
|
47
|
+
|
|
48
|
+
if (!latest) {
|
|
49
|
+
if (args.json) {
|
|
50
|
+
process.stdout.write(`${JSON.stringify({ ok: false, reason: 'no_bundle', baseDir })}\n`);
|
|
51
|
+
} else {
|
|
52
|
+
process.stdout.write(
|
|
53
|
+
`No feedback bundle found under ${baseDir}.\n`
|
|
54
|
+
+ 'Record a walkthrough in the Bongos app and stop the capture — that '
|
|
55
|
+
+ 'writes a bundle here — then run /feedback again.\n',
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (args.json) {
|
|
62
|
+
process.stdout.write(`${JSON.stringify({
|
|
63
|
+
ok: true,
|
|
64
|
+
id: latest.id,
|
|
65
|
+
dir: latest.dir,
|
|
66
|
+
promptPath: latest.promptPath,
|
|
67
|
+
imagePaths: latest.imagePaths,
|
|
68
|
+
promptMarkdown: latest.promptMarkdown,
|
|
69
|
+
}, null, 2)}\n`);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const lines = [];
|
|
74
|
+
lines.push(`# Latest Bongos feedback bundle — ${latest.id}`);
|
|
75
|
+
lines.push(`# dir: ${latest.dir}`);
|
|
76
|
+
lines.push('');
|
|
77
|
+
lines.push('---- prompt.md ----');
|
|
78
|
+
lines.push('');
|
|
79
|
+
lines.push(latest.promptMarkdown.trimEnd());
|
|
80
|
+
lines.push('');
|
|
81
|
+
lines.push('---- attached frames (Read each path to see the screenshots) ----');
|
|
82
|
+
if (latest.imagePaths.length === 0) {
|
|
83
|
+
lines.push('(none — this session had no salient frames or markup)');
|
|
84
|
+
} else {
|
|
85
|
+
for (const p of latest.imagePaths) lines.push(p);
|
|
86
|
+
}
|
|
87
|
+
lines.push('');
|
|
88
|
+
process.stdout.write(`${lines.join('\n')}\n`);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
main().catch((err) => {
|
|
92
|
+
process.stderr.write(`feedback-latest: ${err.message}\n`);
|
|
93
|
+
process.exitCode = 1;
|
|
94
|
+
});
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/gds/fetch-art-key.js — mirror the GDS-delivered SHARED Gemini key into
|
|
3
|
+
// the local session file so a newcomer's art pipeline can use it (task 1281).
|
|
4
|
+
//
|
|
5
|
+
// The art pipeline (modules/art-pipeline/pipeline/gen_api.py) runs LOCALLY and can't call the API
|
|
6
|
+
// per generation, so SessionStart runs this once: GET /api/gds/me/art-key and,
|
|
7
|
+
// based on the builder's live rank, write or remove the `shared_gemini_api_key`
|
|
8
|
+
// field in ~/.config/otb/gds-session.json. gen_api.py reads that field as a
|
|
9
|
+
// fallback BELOW the builder's own key — so own key always wins, and a newcomer
|
|
10
|
+
// with no own key falls back to the shared one we pay for.
|
|
11
|
+
//
|
|
12
|
+
// This is the SELF-HEALING source of truth for that slot, re-derived every
|
|
13
|
+
// session from the server's rank check:
|
|
14
|
+
// entitled (xenos) + key delivered → write shared_gemini_api_key
|
|
15
|
+
// not entitled (thetes+) → remove it (promotion withdraws the key)
|
|
16
|
+
// entitled but server has no key → no-op (pipeline shows its normal message)
|
|
17
|
+
//
|
|
18
|
+
// Best-effort by construction (mirrors fetch-sound-prefs.js):
|
|
19
|
+
// - No session / not signed in → no-op.
|
|
20
|
+
// - API down / timeout / any error → leave the file untouched, no-op.
|
|
21
|
+
// - Read-modify-write preserves every other session field (token, own key, …):
|
|
22
|
+
// we loadSession() the full object, change ONE field, saveSession() it back.
|
|
23
|
+
|
|
24
|
+
'use strict';
|
|
25
|
+
|
|
26
|
+
const { loadSession, saveSession, API_BASE } = require('./cli-lib');
|
|
27
|
+
|
|
28
|
+
const FETCH_TIMEOUT_MS = 4000;
|
|
29
|
+
const SHARED_FIELD = 'shared_gemini_api_key';
|
|
30
|
+
// The builder's OWN key (task 1013) lands in the same local slot the pipeline
|
|
31
|
+
// already prefers — gemini_api_key. We tag it `_managed` so that REMOVING the key
|
|
32
|
+
// on the server withdraws OUR copy on the next sync WITHOUT clobbering a legacy
|
|
33
|
+
// key a builder hand-entered locally via the CLI (which carries no marker).
|
|
34
|
+
const OWN_FIELD = 'gemini_api_key';
|
|
35
|
+
const OWN_MANAGED_FLAG = 'gemini_api_key_managed';
|
|
36
|
+
|
|
37
|
+
async function main() {
|
|
38
|
+
const session = await loadSession();
|
|
39
|
+
if (!session || !session.token) return; // not signed in — nothing to manage
|
|
40
|
+
|
|
41
|
+
const base = session.api_base || API_BASE;
|
|
42
|
+
const ctrl = new AbortController();
|
|
43
|
+
const timer = setTimeout(() => ctrl.abort(), FETCH_TIMEOUT_MS);
|
|
44
|
+
let data = null;
|
|
45
|
+
try {
|
|
46
|
+
const res = await fetch(`${base}/api/gds/me/art-key`, {
|
|
47
|
+
headers: {
|
|
48
|
+
Authorization: `Bearer ${session.token}`,
|
|
49
|
+
'User-Agent': 'amazonprimea-fetch-art-key/1.0',
|
|
50
|
+
},
|
|
51
|
+
signal: ctrl.signal,
|
|
52
|
+
});
|
|
53
|
+
if (!res.ok) return; // 401 / 5xx — leave any existing key alone
|
|
54
|
+
data = await res.json();
|
|
55
|
+
} catch (_) {
|
|
56
|
+
return; // network/timeout — no-op
|
|
57
|
+
} finally {
|
|
58
|
+
clearTimeout(timer);
|
|
59
|
+
}
|
|
60
|
+
if (!data || typeof data !== 'object') return;
|
|
61
|
+
|
|
62
|
+
// Decide the change against the current file contents.
|
|
63
|
+
let changed = false;
|
|
64
|
+
if (data.entitled && typeof data.shared_key === 'string' && data.shared_key) {
|
|
65
|
+
// Entitled and a key was delivered → store it (only if different).
|
|
66
|
+
if (session[SHARED_FIELD] !== data.shared_key) {
|
|
67
|
+
session[SHARED_FIELD] = data.shared_key;
|
|
68
|
+
changed = true;
|
|
69
|
+
}
|
|
70
|
+
} else if (data.entitled === false) {
|
|
71
|
+
// Explicitly not entitled (e.g. promoted to Thetes) → withdraw the key.
|
|
72
|
+
if (Object.prototype.hasOwnProperty.call(session, SHARED_FIELD)) {
|
|
73
|
+
delete session[SHARED_FIELD];
|
|
74
|
+
changed = true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// entitled but no key delivered (configured:false) → leave the file as-is.
|
|
78
|
+
|
|
79
|
+
// The builder's OWN server-stored key (task 1013 / ADR 0073). Mirrors the
|
|
80
|
+
// shared-key logic but writes the gemini_api_key slot (which wins over the
|
|
81
|
+
// shared key in the pipeline cascade) and only ever removes a copy WE wrote.
|
|
82
|
+
if (typeof data.own_key === 'string' && data.own_key) {
|
|
83
|
+
if (session[OWN_FIELD] !== data.own_key || session[OWN_MANAGED_FLAG] !== true) {
|
|
84
|
+
session[OWN_FIELD] = data.own_key;
|
|
85
|
+
session[OWN_MANAGED_FLAG] = true;
|
|
86
|
+
changed = true;
|
|
87
|
+
}
|
|
88
|
+
} else if (data.own_key_set === false && session[OWN_MANAGED_FLAG] === true) {
|
|
89
|
+
// Server says no own key, and the local copy is one we manage → withdraw it.
|
|
90
|
+
delete session[OWN_FIELD];
|
|
91
|
+
delete session[OWN_MANAGED_FLAG];
|
|
92
|
+
changed = true;
|
|
93
|
+
}
|
|
94
|
+
// own_key_set true but no plaintext delivered (storage not configured), or a
|
|
95
|
+
// legacy local key with no marker → leave the file as-is.
|
|
96
|
+
|
|
97
|
+
if (changed) {
|
|
98
|
+
try {
|
|
99
|
+
await saveSession(session); // writes the full object back, mode 600
|
|
100
|
+
} catch (_) {
|
|
101
|
+
/* best-effort — a failed write just leaves the pipeline to fall through */
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
main().then(() => process.exit(0)).catch(() => process.exit(0));
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/gds/fetch-sound-prefs.js — mirror the builder's per-sound prefs to a
|
|
3
|
+
// local file the offline player reads (V3.R91 / #786).
|
|
4
|
+
//
|
|
5
|
+
// The toggle lives server-side (builders.sound_prefs), but the sound plays from
|
|
6
|
+
// a LOCAL Stop hook + ship.js via .claude/sounds/play.js — which can't make a
|
|
7
|
+
// network call on every turn. So SessionStart runs this once: fetch
|
|
8
|
+
// GET /api/gds/me/sound-prefs and write its effective_map to
|
|
9
|
+
// ~/.config/otb/sound-prefs.json. play.js reads that file and skips muted sounds.
|
|
10
|
+
//
|
|
11
|
+
// Best-effort by construction:
|
|
12
|
+
// - No session token / not signed in → no-op (player fails OPEN = plays all).
|
|
13
|
+
// - API down / timeout / any error → leave any existing file untouched, no-op.
|
|
14
|
+
// - A stale file is harmless: it just reflects the builder's last-known prefs
|
|
15
|
+
// until the next successful session start refreshes it.
|
|
16
|
+
//
|
|
17
|
+
// Mirrors the auth + atomic-write patterns in pull-memory.js.
|
|
18
|
+
|
|
19
|
+
'use strict';
|
|
20
|
+
|
|
21
|
+
const fs = require('node:fs');
|
|
22
|
+
const os = require('node:os');
|
|
23
|
+
const path = require('node:path');
|
|
24
|
+
const { readSessionToken } = require('./cli-lib');
|
|
25
|
+
|
|
26
|
+
const FETCH_TIMEOUT_MS = 4000;
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
const PREFS_PATH = require('../../src/instance-config').configPath('sound-prefs.json');
|
|
30
|
+
|
|
31
|
+
function writeAtomic(targetPath, contents) {
|
|
32
|
+
const dir = path.dirname(targetPath);
|
|
33
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
34
|
+
const tmp = path.join(dir, `.sound-prefs.${process.pid}.tmp`);
|
|
35
|
+
fs.writeFileSync(tmp, contents);
|
|
36
|
+
fs.renameSync(tmp, targetPath);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async function main() {
|
|
40
|
+
const sess = readSessionToken();
|
|
41
|
+
if (!sess) return; // not signed in — player fails open
|
|
42
|
+
|
|
43
|
+
const ctrl = new AbortController();
|
|
44
|
+
const timer = setTimeout(() => ctrl.abort(), FETCH_TIMEOUT_MS);
|
|
45
|
+
let soundData = null;
|
|
46
|
+
let eventData = null;
|
|
47
|
+
try {
|
|
48
|
+
// Fetch both prefs in parallel; a failure on either leaves both at their
|
|
49
|
+
// existing cached state (fail-open).
|
|
50
|
+
const [soundRes, eventRes] = await Promise.all([
|
|
51
|
+
fetch(`${sess.apiBase}/api/gds/me/sound-prefs`, {
|
|
52
|
+
headers: { Authorization: `Bearer ${sess.token}`, 'User-Agent': 'amazonprimea-fetch-sound-prefs/1.0' },
|
|
53
|
+
signal: ctrl.signal,
|
|
54
|
+
}),
|
|
55
|
+
fetch(`${sess.apiBase}/api/gds/me/event-sound-prefs`, {
|
|
56
|
+
headers: { Authorization: `Bearer ${sess.token}`, 'User-Agent': 'amazonprimea-fetch-sound-prefs/1.0' },
|
|
57
|
+
signal: ctrl.signal,
|
|
58
|
+
}),
|
|
59
|
+
]);
|
|
60
|
+
if (!soundRes.ok && !eventRes.ok) return;
|
|
61
|
+
if (soundRes.ok) soundData = await soundRes.json();
|
|
62
|
+
if (eventRes.ok) eventData = await eventRes.json();
|
|
63
|
+
} catch (_) {
|
|
64
|
+
return; // network/timeout — no-op
|
|
65
|
+
} finally {
|
|
66
|
+
clearTimeout(timer);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// effective_map is { <sound>: <bool> } for every known sound (defaults
|
|
70
|
+
// already applied server-side); volume is the master 0-100 (#788). The local
|
|
71
|
+
// file shape is { sounds: {...}, volume: N, event_sounds: {...} } — play.js
|
|
72
|
+
// reads both (and still tolerates the legacy flat { <sound>: <bool> } shape).
|
|
73
|
+
const map = soundData && soundData.effective_map;
|
|
74
|
+
if (!map || typeof map !== 'object') return;
|
|
75
|
+
const volume = typeof soundData.volume === 'number' ? soundData.volume : 100;
|
|
76
|
+
// event_sounds: { <eventId>: <wavName> } — resolved wav per event so the
|
|
77
|
+
// hook can call playSound(wavName) without knowing the variant→wav mapping.
|
|
78
|
+
const eventSounds = (eventData && typeof eventData.effective_wav === 'object')
|
|
79
|
+
? eventData.effective_wav
|
|
80
|
+
: {};
|
|
81
|
+
try {
|
|
82
|
+
writeAtomic(PREFS_PATH, JSON.stringify({ sounds: map, volume, event_sounds: eventSounds }));
|
|
83
|
+
} catch (_) {
|
|
84
|
+
/* best-effort — a failed write just leaves the player to fail open */
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
main().then(() => process.exit(0)).catch(() => process.exit(0));
|