@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,88 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Render Mermaid (.mmd) diagram sources to SVG + PNG.
|
|
3
|
+
#
|
|
4
|
+
# Usage:
|
|
5
|
+
# scripts/render-diagrams.sh # render every docs/onboarding/diagrams/*.mmd
|
|
6
|
+
# scripts/render-diagrams.sh a.mmd b.mmd ... # render only the given sources
|
|
7
|
+
#
|
|
8
|
+
# Each <name>.mmd renders to BOTH:
|
|
9
|
+
# <name>.svg — vector; the crisp, pannable/zoomable asset the /builders viewer
|
|
10
|
+
# (modules/hall-ui/public/diagram-viewer.js) loads and injects inline.
|
|
11
|
+
# <name>.png — 2x raster; the <img> fallback (no-JS / SVG-fetch failure) and
|
|
12
|
+
# for external embeds (README, OG images).
|
|
13
|
+
# Keep node labels free of literal "[]" — the renderer's font shows it as a
|
|
14
|
+
# missing-glyph box; write "dependencies"/"touches" instead.
|
|
15
|
+
#
|
|
16
|
+
# Chromium (ADR 0110 pt.3 / task 2027): mermaid-cli drives puppeteer, which by
|
|
17
|
+
# DEFAULT downloads its own headless Chromium on first run — a multi-minute
|
|
18
|
+
# network fetch that STALLS the small prod droplet. So this script prefers an
|
|
19
|
+
# already-installed browser and forbids the download when it finds one; it only
|
|
20
|
+
# falls back to puppeteer's own download where nothing is installed (a dev
|
|
21
|
+
# laptop, where that fetch works fine). This is what makes render-at-deploy
|
|
22
|
+
# viable (deploy-prod.sh + infra/box-source-fetch.sh call this).
|
|
23
|
+
set -euo pipefail
|
|
24
|
+
|
|
25
|
+
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
26
|
+
DIAGRAM_DIR="$REPO_ROOT/docs/onboarding/diagrams"
|
|
27
|
+
# Shared Mermaid config (generous spacing for all diagrams — task 1066).
|
|
28
|
+
CONFIG="$DIAGRAM_DIR/render-config.json"
|
|
29
|
+
# Puppeteer launch config — carries --no-sandbox, required for headless Chrome as
|
|
30
|
+
# the non-root deploy user on Ubuntu 24.04 (restricted unprivileged user
|
|
31
|
+
# namespaces break Chrome's own sandbox); harmless on a dev laptop.
|
|
32
|
+
PPTR_CONFIG="$DIAGRAM_DIR/puppeteer-config.json"
|
|
33
|
+
CONFIG_ARGS=()
|
|
34
|
+
[ -f "$CONFIG" ] && CONFIG_ARGS+=(-c "$CONFIG")
|
|
35
|
+
[ -f "$PPTR_CONFIG" ] && CONFIG_ARGS+=(-p "$PPTR_CONFIG")
|
|
36
|
+
|
|
37
|
+
# Resolve a headless Chromium once. Honor a caller-provided
|
|
38
|
+
# PUPPETEER_EXECUTABLE_PATH; otherwise auto-detect a common system browser. When
|
|
39
|
+
# one is found, export PUPPETEER_SKIP_DOWNLOAD so puppeteer never tries to fetch
|
|
40
|
+
# its own (the droplet-stalling download). When none is found we say so and let
|
|
41
|
+
# puppeteer download — the dev-laptop path, unchanged.
|
|
42
|
+
if [ -z "${PUPPETEER_EXECUTABLE_PATH:-}" ]; then
|
|
43
|
+
for b in google-chrome-stable google-chrome chromium chromium-browser; do
|
|
44
|
+
p="$(command -v "$b" 2>/dev/null || true)"
|
|
45
|
+
if [ -n "$p" ]; then export PUPPETEER_EXECUTABLE_PATH="$p"; break; fi
|
|
46
|
+
done
|
|
47
|
+
fi
|
|
48
|
+
if [ -n "${PUPPETEER_EXECUTABLE_PATH:-}" ]; then
|
|
49
|
+
export PUPPETEER_SKIP_DOWNLOAD=1
|
|
50
|
+
echo "render-diagrams: using installed Chromium at $PUPPETEER_EXECUTABLE_PATH (no browser download)"
|
|
51
|
+
else
|
|
52
|
+
echo "render-diagrams: no system Chromium found — puppeteer will download its own (ok on a dev laptop; stalls a small droplet — install Google Chrome there, see ADR 0122)"
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
# Prefer a mmdc already on PATH (a global/CI install — no per-run npx fetch);
|
|
56
|
+
# else npx with a PINNED major so a mermaid-cli breaking release can't silently
|
|
57
|
+
# change the renders.
|
|
58
|
+
if command -v mmdc >/dev/null 2>&1; then
|
|
59
|
+
MMDC=(mmdc)
|
|
60
|
+
else
|
|
61
|
+
MMDC=(npx -y @mermaid-js/mermaid-cli@11)
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
if [ "$#" -gt 0 ]; then
|
|
65
|
+
SOURCES=("$@")
|
|
66
|
+
else
|
|
67
|
+
SOURCES=()
|
|
68
|
+
while IFS= read -r f; do SOURCES+=("$f"); done < <(find "$DIAGRAM_DIR" -name '*.mmd' | sort)
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
if [ "${#SOURCES[@]}" -eq 0 ]; then
|
|
72
|
+
echo "render-diagrams: no .mmd sources found"
|
|
73
|
+
exit 0
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
for src in "${SOURCES[@]}"; do
|
|
77
|
+
[ -f "$src" ] || { echo "render-diagrams: skip missing $src"; continue; }
|
|
78
|
+
svg="${src%.mmd}.svg"
|
|
79
|
+
png="${src%.mmd}.png"
|
|
80
|
+
echo "render-diagrams: $src -> $svg + $png"
|
|
81
|
+
# SVG first (vector, scale-independent — the interactive viewer's primary
|
|
82
|
+
# asset), then PNG at 2x (the static fallback). White background so both read
|
|
83
|
+
# correctly on the parchment page and don't show through as transparent.
|
|
84
|
+
"${MMDC[@]}" -i "$src" -o "$svg" -b white "${CONFIG_ARGS[@]}" >/dev/null 2>&1
|
|
85
|
+
"${MMDC[@]}" -i "$src" -o "$png" -s 2 -b white "${CONFIG_ARGS[@]}" >/dev/null 2>&1
|
|
86
|
+
done
|
|
87
|
+
|
|
88
|
+
echo "render-diagrams: done (${#SOURCES[@]} source(s))"
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Dependency vulnerability scan — single source of truth for both CI and the
|
|
3
|
+
// droplet nightly cron (V3.R37 / #258).
|
|
4
|
+
//
|
|
5
|
+
// Two scans are run, in order:
|
|
6
|
+
// 1. `npm audit --audit-level=high --json` against the root package.json.
|
|
7
|
+
// 2. `python3 -m pip_audit -r art/pipeline/requirements.txt --format json`.
|
|
8
|
+
//
|
|
9
|
+
// The script parses both outputs and emits ONE deterministic JSON report on
|
|
10
|
+
// stdout containing every high/critical finding. A short, builder-readable
|
|
11
|
+
// summary goes to stderr so a CI log is skim-able.
|
|
12
|
+
//
|
|
13
|
+
// Two modes:
|
|
14
|
+
//
|
|
15
|
+
// --report-mode=ci (default; used by .github/workflows/dep-audit.yml)
|
|
16
|
+
// exit 1 if ANY finding is high or critical.
|
|
17
|
+
// exit 0 if both scans clean.
|
|
18
|
+
//
|
|
19
|
+
// --report-mode=nightly (used by .claude/scheduled-tasks/dep-audit-nightly)
|
|
20
|
+
// ALWAYS exit 0 — a nightly cron must not block the
|
|
21
|
+
// droplet's other routines. The skill consumes the
|
|
22
|
+
// JSON, posts to the team chat-inbox, and creates a
|
|
23
|
+
// vulnerability_report row in the Archon security
|
|
24
|
+
// view via src/bongos/security.js.
|
|
25
|
+
//
|
|
26
|
+
// Tool resolution:
|
|
27
|
+
// - npm is required (CI image has it; droplet has it).
|
|
28
|
+
// - pip-audit is resolved as `python3 -m pip_audit` (works whether installed
|
|
29
|
+
// via pip, pipx, or pip --user — module form is the most portable).
|
|
30
|
+
// If neither is found, the script reports `tool_missing: pip-audit` and the
|
|
31
|
+
// mode decides whether to fail.
|
|
32
|
+
//
|
|
33
|
+
// Output schema (stdout, always valid JSON, even on failure):
|
|
34
|
+
// {
|
|
35
|
+
// "ran_at": "<ISO timestamp>",
|
|
36
|
+
// "mode": "ci" | "nightly",
|
|
37
|
+
// "npm": { "ok": true|false, "tool_missing": false|true, "findings": [...] },
|
|
38
|
+
// "pip": { "ok": true|false, "tool_missing": false|true, "findings": [...] },
|
|
39
|
+
// "high_or_critical_count": <int>,
|
|
40
|
+
// "exit_code": <int>
|
|
41
|
+
// }
|
|
42
|
+
//
|
|
43
|
+
// A "finding" has at minimum: { ecosystem, package, severity, id, summary, fix }.
|
|
44
|
+
|
|
45
|
+
'use strict';
|
|
46
|
+
|
|
47
|
+
const { spawnSync } = require('node:child_process');
|
|
48
|
+
const path = require('node:path');
|
|
49
|
+
const fs = require('node:fs');
|
|
50
|
+
|
|
51
|
+
const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
52
|
+
const PIP_REQUIREMENTS = path.join(REPO_ROOT, 'art', 'pipeline', 'requirements.txt');
|
|
53
|
+
|
|
54
|
+
// CLI args ----------------------------------------------------------------
|
|
55
|
+
|
|
56
|
+
function parseArgs(argv) {
|
|
57
|
+
const out = { mode: 'ci' };
|
|
58
|
+
for (const a of argv.slice(2)) {
|
|
59
|
+
if (a === '--report-mode=ci') out.mode = 'ci';
|
|
60
|
+
else if (a === '--report-mode=nightly') out.mode = 'nightly';
|
|
61
|
+
else if (a === '--help' || a === '-h') out.help = true;
|
|
62
|
+
else {
|
|
63
|
+
console.error(`dep-audit: unknown arg "${a}"`);
|
|
64
|
+
out.help = true;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function printHelp() {
|
|
71
|
+
console.error(`Usage: node scripts/security/dep-audit.js [--report-mode=ci|nightly]
|
|
72
|
+
|
|
73
|
+
--report-mode=ci (default) exit non-zero on any high/critical finding
|
|
74
|
+
--report-mode=nightly always exit 0; emit JSON for the nightly skill
|
|
75
|
+
`);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// npm audit ---------------------------------------------------------------
|
|
79
|
+
|
|
80
|
+
// npm audit emits a JSON document. `--audit-level=high` controls the EXIT CODE
|
|
81
|
+
// only — the JSON still contains every level. We parse the full set, then we
|
|
82
|
+
// filter to high+critical ourselves so the threshold is consistent across both
|
|
83
|
+
// scanners.
|
|
84
|
+
function runNpmAudit() {
|
|
85
|
+
const res = spawnSync('npm', ['audit', '--audit-level=high', '--json'], {
|
|
86
|
+
cwd: REPO_ROOT,
|
|
87
|
+
encoding: 'utf8',
|
|
88
|
+
maxBuffer: 32 * 1024 * 1024,
|
|
89
|
+
});
|
|
90
|
+
// npm audit exits 1 when findings >= the threshold, 0 otherwise. Both cases
|
|
91
|
+
// still produce JSON on stdout. We don't trust the exit code; we read the
|
|
92
|
+
// JSON and decide for ourselves.
|
|
93
|
+
if (res.error) {
|
|
94
|
+
return { ok: false, tool_missing: true, findings: [], raw_error: String(res.error.message || res.error) };
|
|
95
|
+
}
|
|
96
|
+
let parsed;
|
|
97
|
+
try {
|
|
98
|
+
parsed = JSON.parse(res.stdout || '{}');
|
|
99
|
+
} catch (e) {
|
|
100
|
+
return {
|
|
101
|
+
ok: false, tool_missing: false, findings: [],
|
|
102
|
+
raw_error: `npm audit JSON parse failed: ${e.message}; stderr=${res.stderr.slice(0, 500)}`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const findings = extractNpmFindings(parsed);
|
|
106
|
+
return { ok: true, tool_missing: false, findings };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// npm audit v7+ JSON shape: `vulnerabilities` is an object keyed by package
|
|
110
|
+
// name; each entry has { severity, via, fixAvailable, name, ... }. `via` is
|
|
111
|
+
// either a string (the upstream package whose advisory chains here) or an
|
|
112
|
+
// array of advisory objects { source, name, dependency, title, url, severity,
|
|
113
|
+
// cwe, cvss, range }. We only surface high+critical at the top level.
|
|
114
|
+
function extractNpmFindings(parsed) {
|
|
115
|
+
const out = [];
|
|
116
|
+
const vulns = (parsed && parsed.vulnerabilities) || {};
|
|
117
|
+
for (const [pkg, entry] of Object.entries(vulns)) {
|
|
118
|
+
const sev = entry.severity;
|
|
119
|
+
if (sev !== 'high' && sev !== 'critical') continue;
|
|
120
|
+
// Pull the most informative advisory we can find.
|
|
121
|
+
let advisory = null;
|
|
122
|
+
const via = Array.isArray(entry.via) ? entry.via : [];
|
|
123
|
+
for (const v of via) {
|
|
124
|
+
if (v && typeof v === 'object' && (v.severity === 'high' || v.severity === 'critical')) {
|
|
125
|
+
advisory = v;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
out.push({
|
|
130
|
+
ecosystem: 'npm',
|
|
131
|
+
package: pkg,
|
|
132
|
+
severity: sev,
|
|
133
|
+
id: advisory ? (advisory.source || advisory.url || advisory.name) : null,
|
|
134
|
+
summary: advisory ? (advisory.title || advisory.name) : `${pkg} has a ${sev}-severity advisory`,
|
|
135
|
+
fix: entry.fixAvailable ? (
|
|
136
|
+
typeof entry.fixAvailable === 'object'
|
|
137
|
+
? `${entry.fixAvailable.name}@${entry.fixAvailable.version}${entry.fixAvailable.isSemVerMajor ? ' (major bump)' : ''}`
|
|
138
|
+
: 'available'
|
|
139
|
+
) : 'no fix available',
|
|
140
|
+
url: advisory ? advisory.url : null,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// pip-audit ---------------------------------------------------------------
|
|
147
|
+
|
|
148
|
+
function runPipAudit() {
|
|
149
|
+
if (!fs.existsSync(PIP_REQUIREMENTS)) {
|
|
150
|
+
return {
|
|
151
|
+
ok: false, tool_missing: false, findings: [],
|
|
152
|
+
raw_error: `requirements file not found: ${PIP_REQUIREMENTS}`,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const res = spawnSync('python3', [
|
|
156
|
+
'-m', 'pip_audit',
|
|
157
|
+
'-r', PIP_REQUIREMENTS,
|
|
158
|
+
'--format', 'json',
|
|
159
|
+
'--vulnerability-service', 'pypi',
|
|
160
|
+
], {
|
|
161
|
+
cwd: REPO_ROOT,
|
|
162
|
+
encoding: 'utf8',
|
|
163
|
+
maxBuffer: 32 * 1024 * 1024,
|
|
164
|
+
});
|
|
165
|
+
if (res.error) {
|
|
166
|
+
return { ok: false, tool_missing: true, findings: [], raw_error: String(res.error.message || res.error) };
|
|
167
|
+
}
|
|
168
|
+
if (res.status !== 0 && res.status !== 1) {
|
|
169
|
+
// pip-audit exits 0 on clean, 1 on findings. Anything else (missing module,
|
|
170
|
+
// bad requirements file) is a tool problem.
|
|
171
|
+
const stderr = (res.stderr || '').slice(0, 1000);
|
|
172
|
+
const missing = /No module named ['"]?pip_audit/.test(stderr);
|
|
173
|
+
return {
|
|
174
|
+
ok: false, tool_missing: missing, findings: [],
|
|
175
|
+
raw_error: `pip-audit exit=${res.status}; stderr=${stderr}`,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
let parsed;
|
|
179
|
+
try {
|
|
180
|
+
parsed = JSON.parse(res.stdout || '{}');
|
|
181
|
+
} catch (e) {
|
|
182
|
+
return {
|
|
183
|
+
ok: false, tool_missing: false, findings: [],
|
|
184
|
+
raw_error: `pip-audit JSON parse failed: ${e.message}; stderr=${res.stderr.slice(0, 500)}`,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
const findings = extractPipFindings(parsed);
|
|
188
|
+
return { ok: true, tool_missing: false, findings };
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// pip-audit JSON shape: { "dependencies": [ { "name", "version",
|
|
192
|
+
// "vulns": [ { "id", "fix_versions": [], "description", "aliases": [] } ] } ] }
|
|
193
|
+
// pip-audit does NOT classify severity itself — PyPI/OSV advisories carry it
|
|
194
|
+
// in `aliases` (CVE IDs) plus a `description` field. To stay conservative, we
|
|
195
|
+
// treat EVERY pip-audit finding as high — by the time PyPI's advisory DB has
|
|
196
|
+
// picked it up, the project's posture is "fix or document." This is the same
|
|
197
|
+
// stance the GitHub `pip-audit-action` takes by default.
|
|
198
|
+
function extractPipFindings(parsed) {
|
|
199
|
+
const out = [];
|
|
200
|
+
const deps = (parsed && parsed.dependencies) || [];
|
|
201
|
+
for (const dep of deps) {
|
|
202
|
+
const vulns = Array.isArray(dep.vulns) ? dep.vulns : [];
|
|
203
|
+
for (const v of vulns) {
|
|
204
|
+
out.push({
|
|
205
|
+
ecosystem: 'pypi',
|
|
206
|
+
package: dep.name,
|
|
207
|
+
version: dep.version,
|
|
208
|
+
severity: 'high', // see note above
|
|
209
|
+
id: v.id || (Array.isArray(v.aliases) && v.aliases[0]) || null,
|
|
210
|
+
summary: (v.description || '').split('\n')[0].slice(0, 240) || `${dep.name} ${dep.version}: ${v.id}`,
|
|
211
|
+
fix: Array.isArray(v.fix_versions) && v.fix_versions.length
|
|
212
|
+
? `upgrade to ${v.fix_versions.join(' / ')}`
|
|
213
|
+
: 'no fix available',
|
|
214
|
+
url: v.id ? `https://osv.dev/vulnerability/${v.id}` : null,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return out;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Main --------------------------------------------------------------------
|
|
222
|
+
|
|
223
|
+
function main() {
|
|
224
|
+
const args = parseArgs(process.argv);
|
|
225
|
+
if (args.help) { printHelp(); process.exit(2); }
|
|
226
|
+
|
|
227
|
+
const ranAt = new Date().toISOString();
|
|
228
|
+
const npm = runNpmAudit();
|
|
229
|
+
const pip = runPipAudit();
|
|
230
|
+
|
|
231
|
+
const allFindings = [...npm.findings, ...pip.findings];
|
|
232
|
+
const highCount = allFindings.filter(f => f.severity === 'high' || f.severity === 'critical').length;
|
|
233
|
+
|
|
234
|
+
// CI mode: a tool being entirely missing in a CI environment is a build
|
|
235
|
+
// problem, not a security problem — fail loudly so we don't ship blind.
|
|
236
|
+
const toolProblem = (npm.tool_missing || pip.tool_missing) && args.mode === 'ci';
|
|
237
|
+
|
|
238
|
+
let exitCode = 0;
|
|
239
|
+
if (toolProblem) exitCode = 2;
|
|
240
|
+
else if (args.mode === 'ci' && highCount > 0) exitCode = 1;
|
|
241
|
+
// nightly mode → always 0.
|
|
242
|
+
|
|
243
|
+
const report = {
|
|
244
|
+
ran_at: ranAt,
|
|
245
|
+
mode: args.mode,
|
|
246
|
+
npm,
|
|
247
|
+
pip,
|
|
248
|
+
high_or_critical_count: highCount,
|
|
249
|
+
findings: allFindings,
|
|
250
|
+
exit_code: exitCode,
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
// Human summary to stderr.
|
|
254
|
+
const lines = [];
|
|
255
|
+
lines.push(`dep-audit [${args.mode}] @ ${ranAt}`);
|
|
256
|
+
lines.push(` npm: ${npm.tool_missing ? 'TOOL MISSING' : (npm.ok ? `${npm.findings.length} high/critical` : `ERROR — ${npm.raw_error}`)}`);
|
|
257
|
+
lines.push(` pip-audit: ${pip.tool_missing ? 'TOOL MISSING' : (pip.ok ? `${pip.findings.length} high/critical` : `ERROR — ${pip.raw_error}`)}`);
|
|
258
|
+
if (allFindings.length) {
|
|
259
|
+
lines.push(` findings:`);
|
|
260
|
+
for (const f of allFindings) {
|
|
261
|
+
lines.push(` - [${f.ecosystem}/${f.severity}] ${f.package}${f.version ? '@' + f.version : ''} — ${f.id || '(no id)'} — ${f.summary} (fix: ${f.fix})`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
lines.push(` exit_code: ${exitCode}`);
|
|
265
|
+
process.stderr.write(lines.join('\n') + '\n');
|
|
266
|
+
|
|
267
|
+
// Machine-readable report to stdout.
|
|
268
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
269
|
+
process.exit(exitCode);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (require.main === module) main();
|
|
273
|
+
|
|
274
|
+
// Exported for unit testing / for the nightly skill if it ever wants to drive
|
|
275
|
+
// the scan in-process instead of via spawn.
|
|
276
|
+
module.exports = { runNpmAudit, runPipAudit, extractNpmFindings, extractPipFindings };
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// setup-builder.js — one-command bootstrap for a new OTB builder (#673).
|
|
3
|
+
//
|
|
4
|
+
// The cross-platform port of setup-builder.sh: node is the project's guaranteed
|
|
5
|
+
// runtime, so this runs identically on Windows, macOS, and Linux, whereas the
|
|
6
|
+
// bash original could not run at all on a Windows box without Git Bash. The
|
|
7
|
+
// bootstrap a new builder runs right after cloning:
|
|
8
|
+
//
|
|
9
|
+
// node scripts/setup-builder.js
|
|
10
|
+
// node scripts/setup-builder.js --skip-keys # don't prompt for API keys
|
|
11
|
+
// node scripts/setup-builder.js --no-auth # skip the GDS Device Flow step
|
|
12
|
+
// node scripts/setup-builder.js --help
|
|
13
|
+
//
|
|
14
|
+
// Idempotent: safe to re-run; each step checks before acting and reports
|
|
15
|
+
// "already done" rather than clobbering. What it does, in order:
|
|
16
|
+
// 1. Verify Node >= 22 and Python >= 3.10 (the two required toolchains).
|
|
17
|
+
// 2. `npm ci` to install JS dependencies.
|
|
18
|
+
// 3. Copy .env.local.example -> .env.local (if absent) + optionally prompt
|
|
19
|
+
// for the Google AI Studio key (--skip-keys / non-TTY takes placeholders).
|
|
20
|
+
// 4. `node scripts/gds/setup.js` — GitHub Device Flow auth (--no-auth skips).
|
|
21
|
+
// 5. Print the "ready" banner pointing at /builder-start.
|
|
22
|
+
//
|
|
23
|
+
// Audience: a brand-new builder with nothing else configured. Every error
|
|
24
|
+
// prints the exact remediation command to paste — no fishing.
|
|
25
|
+
|
|
26
|
+
const fs = require('node:fs');
|
|
27
|
+
const path = require('node:path');
|
|
28
|
+
const readline = require('node:readline');
|
|
29
|
+
const { spawnSync } = require('node:child_process');
|
|
30
|
+
|
|
31
|
+
const REPO_ROOT = path.resolve(__dirname, '..');
|
|
32
|
+
const IS_WIN = process.platform === 'win32';
|
|
33
|
+
|
|
34
|
+
// ---- arg parsing ----
|
|
35
|
+
const argv = process.argv.slice(2);
|
|
36
|
+
let SKIP_KEYS = false;
|
|
37
|
+
let NO_AUTH = false;
|
|
38
|
+
for (const a of argv) {
|
|
39
|
+
if (a === '--skip-keys') SKIP_KEYS = true;
|
|
40
|
+
else if (a === '--no-auth') NO_AUTH = true;
|
|
41
|
+
else if (a === '-h' || a === '--help') {
|
|
42
|
+
console.log(`setup-builder.js — one-command bootstrap for a new OTB builder.
|
|
43
|
+
|
|
44
|
+
Usage:
|
|
45
|
+
node scripts/setup-builder.js
|
|
46
|
+
node scripts/setup-builder.js --skip-keys # don't prompt for API keys
|
|
47
|
+
node scripts/setup-builder.js --no-auth # skip the GDS Device Flow step
|
|
48
|
+
node scripts/setup-builder.js --help
|
|
49
|
+
|
|
50
|
+
Runs: toolchain checks (Node>=22, Python>=3.10) -> npm ci -> .env.local -> GDS auth.`);
|
|
51
|
+
process.exit(0);
|
|
52
|
+
} else {
|
|
53
|
+
console.error(`Unknown argument: ${a}`);
|
|
54
|
+
console.error('Run with --help for usage.');
|
|
55
|
+
process.exit(2);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ---- color helpers (no color when stdout isn't a TTY) ----
|
|
60
|
+
const TTY = process.stdout.isTTY;
|
|
61
|
+
const C = {
|
|
62
|
+
green: TTY ? '\x1b[32m' : '', red: TTY ? '\x1b[31m' : '',
|
|
63
|
+
dim: TTY ? '\x1b[2m' : '', bold: TTY ? '\x1b[1m' : '', reset: TTY ? '\x1b[0m' : '',
|
|
64
|
+
};
|
|
65
|
+
const ok = (m) => console.log(` ${C.green}ok${C.reset} ${m}`);
|
|
66
|
+
const skip = (m) => console.log(` ${C.dim}--${C.reset} ${m}`);
|
|
67
|
+
const fail = (m) => console.error(` ${C.red}!!${C.reset} ${m}`);
|
|
68
|
+
const step = (m) => { console.log(''); console.log(`${C.bold}${m}${C.reset}`); };
|
|
69
|
+
|
|
70
|
+
// Run a command, inheriting stdio. `shell` is an EXPLICIT opt-in (default off)
|
|
71
|
+
// and never spread from caller-supplied opts: shell:true on Windows runs the
|
|
72
|
+
// args through cmd.exe expansion, so it's used ONLY for `npm` (a .cmd shim that
|
|
73
|
+
// can't be spawned without a shell) and ONLY with hardcoded args — never with
|
|
74
|
+
// anything caller- or user-controlled. Returns the exit status (null on spawn fail).
|
|
75
|
+
function run(cmd, args, { shell = false } = {}) {
|
|
76
|
+
const r = spawnSync(cmd, args, {
|
|
77
|
+
cwd: REPO_ROOT, stdio: 'inherit', shell, windowsHide: true,
|
|
78
|
+
});
|
|
79
|
+
return r.status;
|
|
80
|
+
}
|
|
81
|
+
// Capture a command's output (stdout+stderr) without inheriting; null if it
|
|
82
|
+
// can't spawn. No shell: node/python/py launchers are real executables that
|
|
83
|
+
// spawnSync resolves directly on every OS (incl. .exe on Windows), so there's
|
|
84
|
+
// no cmd.exe expansion surface here at all.
|
|
85
|
+
function capture(cmd, args) {
|
|
86
|
+
const r = spawnSync(cmd, args, { cwd: REPO_ROOT, encoding: 'utf8', windowsHide: true });
|
|
87
|
+
if (r.error) return null;
|
|
88
|
+
return `${r.stdout || ''}${r.stderr || ''}`.trim();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
// 1. Toolchain checks
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
function checkToolchain() {
|
|
95
|
+
step('1/5 Checking toolchain');
|
|
96
|
+
|
|
97
|
+
// Node >= 22 — we're running in node, so just inspect the running version.
|
|
98
|
+
const nodeMajor = Number((process.versions.node || '0').split('.')[0]);
|
|
99
|
+
if (!Number.isFinite(nodeMajor) || nodeMajor < 22) {
|
|
100
|
+
fail(`Node ${process.version} found, but >= 22 is required.`);
|
|
101
|
+
console.error('');
|
|
102
|
+
console.error(' Upgrade with:');
|
|
103
|
+
console.error(' brew install node@22 && brew link --overwrite --force node@22 (macOS)');
|
|
104
|
+
console.error(' nvm install 22 && nvm use 22 (nvm, any OS)');
|
|
105
|
+
console.error(' or download from https://nodejs.org/ (Windows/Linux)');
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
ok(`Node ${process.version} (>= 22)`);
|
|
109
|
+
|
|
110
|
+
// Python >= 3.10. Candidate launchers differ by OS: `py` is the Windows
|
|
111
|
+
// launcher; python3/python cover macOS/Linux (and some Windows installs).
|
|
112
|
+
const candidates = IS_WIN ? ['py', 'python', 'python3'] : ['python3', 'python'];
|
|
113
|
+
let pyVer = null;
|
|
114
|
+
let pyCmd = null;
|
|
115
|
+
for (const c of candidates) {
|
|
116
|
+
const out = capture(c, ['--version']);
|
|
117
|
+
const m = out && /Python\s+(\d+)\.(\d+)/.exec(out);
|
|
118
|
+
if (m) { pyCmd = c; pyVer = { major: Number(m[1]), minor: Number(m[2]), raw: `${m[1]}.${m[2]}` }; break; }
|
|
119
|
+
}
|
|
120
|
+
if (!pyVer) {
|
|
121
|
+
fail('Python is not installed (or not on PATH).');
|
|
122
|
+
console.error('');
|
|
123
|
+
console.error(' Install it with:');
|
|
124
|
+
console.error(' brew install python@3.11 (macOS)');
|
|
125
|
+
console.error(' or download from https://www.python.org/downloads/ (Windows/Linux — tick "Add to PATH")');
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
if (pyVer.major < 3 || (pyVer.major === 3 && pyVer.minor < 10)) {
|
|
129
|
+
fail(`Python ${pyVer.raw} found, but >= 3.10 is required.`);
|
|
130
|
+
console.error('');
|
|
131
|
+
console.error(' Upgrade with:');
|
|
132
|
+
console.error(' brew install python@3.11 (macOS)');
|
|
133
|
+
console.error(' pyenv install 3.11 && pyenv global 3.11 (pyenv, any OS)');
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
ok(`Python ${pyVer.raw} (>= 3.10) [${pyCmd}]`);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// ---------------------------------------------------------------------------
|
|
140
|
+
// 2. npm ci
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
function npmCi() {
|
|
143
|
+
step('2/5 Installing JS dependencies (npm ci)');
|
|
144
|
+
if (!fs.existsSync(path.join(REPO_ROOT, 'package-lock.json'))) {
|
|
145
|
+
fail('package-lock.json missing — refusing to run npm ci.');
|
|
146
|
+
console.error(" Run 'npm install' once to generate a lockfile, then re-run setup.");
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
// npm is `npm.cmd` on Windows — it can't be spawned without a shell, so this
|
|
150
|
+
// is the one shell:true call; args are hardcoded (no injection surface).
|
|
151
|
+
const status = run('npm', ['ci', '--no-audit', '--no-fund'], { shell: IS_WIN });
|
|
152
|
+
if (status === 0) {
|
|
153
|
+
ok('Dependencies installed');
|
|
154
|
+
} else {
|
|
155
|
+
fail('npm ci failed. Common fixes:');
|
|
156
|
+
console.error(' rm -rf node_modules && npm ci (delete node_modules then retry)');
|
|
157
|
+
console.error(' or check your network / proxy settings');
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
// 3. .env.local
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
function ask(question) {
|
|
166
|
+
return new Promise((resolve) => {
|
|
167
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
168
|
+
rl.question(question, (answer) => { rl.close(); resolve(answer); });
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
async function envLocal() {
|
|
173
|
+
step('3/5 Local environment (.env.local)');
|
|
174
|
+
const example = path.join(REPO_ROOT, '.env.local.example');
|
|
175
|
+
const target = path.join(REPO_ROOT, '.env.local');
|
|
176
|
+
if (!fs.existsSync(example)) {
|
|
177
|
+
fail('.env.local.example is missing from this checkout.');
|
|
178
|
+
console.error(' Pull the latest main, or restore: git checkout main -- .env.local.example');
|
|
179
|
+
process.exit(1);
|
|
180
|
+
}
|
|
181
|
+
if (fs.existsSync(target)) {
|
|
182
|
+
ok('.env.local already exists — leaving it alone');
|
|
183
|
+
skip('to start over, back it up and re-run: mv .env.local .env.local.bak && node scripts/setup-builder.js');
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
fs.copyFileSync(example, target);
|
|
187
|
+
ok('Created .env.local from .env.local.example');
|
|
188
|
+
|
|
189
|
+
// Prompt for the Google AI Studio key only with a TTY and without --skip-keys.
|
|
190
|
+
// An empty value is not fatal — the pipeline also resolves the key from
|
|
191
|
+
// ~/.config/otb/env, so it just means art-pipeline calls raise the standard
|
|
192
|
+
// "GOOGLE_AI_STUDIO_KEY not found" error until set.
|
|
193
|
+
if (SKIP_KEYS) {
|
|
194
|
+
skip('--skip-keys set; leaving GOOGLE_AI_STUDIO_KEY blank in .env.local');
|
|
195
|
+
skip('you can edit .env.local later, or set it in ~/.config/otb/env');
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (!process.stdin.isTTY) {
|
|
199
|
+
skip('no TTY; leaving GOOGLE_AI_STUDIO_KEY blank in .env.local');
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
console.log('');
|
|
203
|
+
console.log(` ${C.dim}Google AI Studio key for the pixel-art pipeline.`);
|
|
204
|
+
console.log(' Get one at https://aistudio.google.com/app/apikey .');
|
|
205
|
+
console.log(` Press Enter to skip — you can always edit .env.local later.${C.reset}`);
|
|
206
|
+
// Strip CR/LF so a pasted value with a stray newline can't inject extra
|
|
207
|
+
// lines into the builder's .env.local; trim handles surrounding whitespace.
|
|
208
|
+
const input = (await ask(' GOOGLE_AI_STUDIO_KEY: ')).replace(/[\r\n]+/g, '').trim();
|
|
209
|
+
if (input) {
|
|
210
|
+
const contents = fs.readFileSync(target, 'utf8');
|
|
211
|
+
// Function replacement (not a string): String.replace treats $&, $1, $$ etc.
|
|
212
|
+
// in a replacement STRING as special, which would silently corrupt a key
|
|
213
|
+
// containing a bare `$`. A function return value is spliced verbatim.
|
|
214
|
+
const next = contents.replace(/^GOOGLE_AI_STUDIO_KEY=.*$/m, () => `GOOGLE_AI_STUDIO_KEY=${input}`);
|
|
215
|
+
fs.writeFileSync(target, next);
|
|
216
|
+
ok('Saved GOOGLE_AI_STUDIO_KEY to .env.local');
|
|
217
|
+
} else {
|
|
218
|
+
skip('left GOOGLE_AI_STUDIO_KEY blank — edit .env.local when you have one');
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// ---------------------------------------------------------------------------
|
|
223
|
+
// 4. GitHub Device Flow auth
|
|
224
|
+
// ---------------------------------------------------------------------------
|
|
225
|
+
function gdsAuth() {
|
|
226
|
+
step('4/5 GDS session (GitHub Device Flow)');
|
|
227
|
+
if (NO_AUTH) {
|
|
228
|
+
skip('--no-auth set; skipping GDS Device Flow');
|
|
229
|
+
console.log(' Authenticate on first connect with: node scripts/gds/setup.js (or /builder-setup)');
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
// setup.js is idempotent (pre-flights GET /me, short-circuits if still valid).
|
|
233
|
+
// process.execPath (not bare 'node') resolves on Windows cmd.exe regardless of PATH.
|
|
234
|
+
console.log(' Handing off to scripts/gds/setup.js ...');
|
|
235
|
+
console.log('');
|
|
236
|
+
const setupArgs = [path.join(REPO_ROOT, 'scripts', 'gds', 'setup.js')];
|
|
237
|
+
if (SKIP_KEYS) setupArgs.push('--skip-keys');
|
|
238
|
+
const status = run(process.execPath, setupArgs); // shell defaults off
|
|
239
|
+
if (status === 0) {
|
|
240
|
+
ok('GDS session ready');
|
|
241
|
+
} else {
|
|
242
|
+
fail(`scripts/gds/setup.js exited with status ${status}`);
|
|
243
|
+
console.error(' Re-run just this step with: node scripts/gds/setup.js --force');
|
|
244
|
+
console.error(' Or run the doctor: node scripts/gds/doctor.js');
|
|
245
|
+
process.exit(status || 1);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// ---------------------------------------------------------------------------
|
|
250
|
+
// 5. Ready banner
|
|
251
|
+
// ---------------------------------------------------------------------------
|
|
252
|
+
function banner() {
|
|
253
|
+
step('5/5 Done');
|
|
254
|
+
console.log('');
|
|
255
|
+
console.log(` ${C.green}${C.bold}You're ready.${C.reset}`);
|
|
256
|
+
console.log('');
|
|
257
|
+
console.log(` Next step: open Claude Code and run ${C.bold}/builder-start${C.reset}`);
|
|
258
|
+
console.log(' to see what tasks you can claim.');
|
|
259
|
+
console.log('');
|
|
260
|
+
console.log(` ${C.dim}Project memory lives in CLAUDE.md — read it before editing code.${C.reset}`);
|
|
261
|
+
console.log('');
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
(async () => {
|
|
265
|
+
checkToolchain();
|
|
266
|
+
npmCi();
|
|
267
|
+
await envLocal();
|
|
268
|
+
gdsAuth();
|
|
269
|
+
banner();
|
|
270
|
+
process.exit(0);
|
|
271
|
+
})().catch((err) => {
|
|
272
|
+
fail(`setup-builder: unexpected error: ${err && err.message ? err.message : err}`);
|
|
273
|
+
process.exit(1);
|
|
274
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# setup-builder.sh — thin compatibility shim (#673).
|
|
3
|
+
#
|
|
4
|
+
# The bootstrap logic now lives in scripts/setup-builder.js (Node), so it runs
|
|
5
|
+
# on Windows/macOS/Linux alike. This shim stays so existing references keep
|
|
6
|
+
# working on Mac/Linux — README, the onboarding primer, and the devcontainer's
|
|
7
|
+
# post-create.sh all invoke `./scripts/setup-builder.sh` / `bash scripts/
|
|
8
|
+
# setup-builder.sh ...`. It simply forwards all arguments to the Node script.
|
|
9
|
+
#
|
|
10
|
+
# On Windows (no Git Bash), run the Node entry directly instead:
|
|
11
|
+
# node scripts/setup-builder.js [--skip-keys] [--no-auth] [--help]
|
|
12
|
+
#
|
|
13
|
+
# Usage (Mac/Linux):
|
|
14
|
+
# ./scripts/setup-builder.sh [--skip-keys] [--no-auth] [--help]
|
|
15
|
+
#
|
|
16
|
+
# Run this from INSIDE a clone of the repo. If you don't have the code yet,
|
|
17
|
+
# do "Step 0 — get the project onto your machine" first (see README.md):
|
|
18
|
+
# git clone https://github.com/lars589/amazonprimea.git && cd amazonprimea
|
|
19
|
+
set -uo pipefail
|
|
20
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
21
|
+
# Guard: this shim must run from inside the repo (where setup-builder.js lives).
|
|
22
|
+
if [ ! -f "$SCRIPT_DIR/setup-builder.js" ]; then
|
|
23
|
+
echo "setup-builder: can't find setup-builder.js next to this script." >&2
|
|
24
|
+
echo "Did you clone the repo and cd into it? See README.md 'Step 0 — get the project onto your machine'." >&2
|
|
25
|
+
echo " git clone https://github.com/lars589/amazonprimea.git && cd amazonprimea" >&2
|
|
26
|
+
exit 1
|
|
27
|
+
fi
|
|
28
|
+
exec node "$SCRIPT_DIR/setup-builder.js" "$@"
|