@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,217 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
//
|
|
4
|
+
// scripts/gds/onboard.js — `bongos onboard`: the interactive CLI FORM over the
|
|
5
|
+
// canonical onboarding runbook (BONGOS-V1 goal 35, task 1982). Self-serve for a
|
|
6
|
+
// terminal-comfortable owner; drives the SAME step sequence the /new-project skill
|
|
7
|
+
// (task 1981) defines and the hall wizard (task 1983) renders — so all three stay in
|
|
8
|
+
// lockstep. It EXTENDS `bongos init` (which only writes config) with the scaffold →
|
|
9
|
+
// provision → OAuth → verify → brand legs. Standalone model only (ADR 0108).
|
|
10
|
+
//
|
|
11
|
+
// It automates what it can (DNS token preflight, OAuth-cred validation, /healthz
|
|
12
|
+
// verify) and renders the four irreducibly-human steps (create the GitHub repo, the
|
|
13
|
+
// OAuth app + secret, own the domain, first sign-in) as precise, copy-paste-safe
|
|
14
|
+
// prompts. It does NOT hold cloud tokens: the actual provision runs on the control
|
|
15
|
+
// plane (it prints the exact `provision.js` command), preserving the trust boundary.
|
|
16
|
+
|
|
17
|
+
const readline = require('node:readline');
|
|
18
|
+
const path = require('node:path');
|
|
19
|
+
|
|
20
|
+
const provision = require(path.join(__dirname, 'provision.js')); // checkDnsTokenScope, zoneForDomain
|
|
21
|
+
const oauth = require(path.join(__dirname, 'oauth-secret.js')); // validateClientId/Secret
|
|
22
|
+
|
|
23
|
+
// ── PURE core (exported for tests) ───────────────────────────────────────────
|
|
24
|
+
|
|
25
|
+
// The canonical step sequence — the SINGLE source of truth the skill + hall wizard
|
|
26
|
+
// mirror. `kind: 'human'` steps are the irreducibly-manual ones (UI-first prompts).
|
|
27
|
+
// The sequence branches at exactly ONE leg — scaffold — into greenfield (`bongos init`,
|
|
28
|
+
// a fresh empty repo) vs brownfield (`bongos init --adopt`, LAYER onto an existing repo;
|
|
29
|
+
// ADR 0121 §Decision 1 / task 2046). Every other leg is identical, so passing `mode`
|
|
30
|
+
// only relabels the github-repo / init / scaffold steps.
|
|
31
|
+
function onboardPlan(mode = 'greenfield') {
|
|
32
|
+
const adopt = mode === 'adopt';
|
|
33
|
+
return [
|
|
34
|
+
{ key: 'name-address', kind: 'auto', label: 'Decide name + address (interview)' },
|
|
35
|
+
{ key: 'github-repo', kind: 'human', label: adopt ? 'Use your EXISTING GitHub repository' : 'Create the empty GitHub repository' },
|
|
36
|
+
{ key: 'dns-preflight', kind: 'auto', label: 'DNS token preflight — before the address step (task 1980)' },
|
|
37
|
+
{ key: 'init', kind: 'auto', label: adopt ? 'bongos init --adopt — LAYER onto the existing repo (pre-flight + accept)' : 'bongos init — scaffold the instance config' },
|
|
38
|
+
{ key: 'scaffold', kind: 'auto', label: adopt ? 'Layer config + pinned @cloudbongos/core onto the existing repo (no clobber)' : 'Scaffold the standalone repo (own repo + pinned @cloudbongos/core)' },
|
|
39
|
+
{ key: 'provision', kind: 'auto', label: 'Provision core + DB + address + service (standalone, task 1978)' },
|
|
40
|
+
{ key: 'oauth-app', kind: 'human', label: 'Wire GitHub sign-in — one-click GitHub App (task 2080), or a manual OAuth app' },
|
|
41
|
+
{ key: 'oauth-place', kind: 'auto', label: 'Place the OAuth secret — auto via the Manifest flow, or verified manual (task 1979)' },
|
|
42
|
+
{ key: 'first-sign-in', kind: 'human', label: 'First sign-in (seats the founding Archon)' },
|
|
43
|
+
{ key: 'verify', kind: 'auto', label: 'Verify /healthz auth_configured' },
|
|
44
|
+
{ key: 'brand', kind: 'auto', label: 'Brand the instance look' },
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// The exact GitHub OAuth-app values for a domain. The callback is PINNED to the apex
|
|
49
|
+
// /api/gds/auth/web/callback (auth.js WEB_REDIRECT_ORIGIN — a sign-in begun on a
|
|
50
|
+
// builders. subdomain still calls back to the apex). PURE.
|
|
51
|
+
function oauthAppInstructions(domain) {
|
|
52
|
+
const origin = `https://${domain}`;
|
|
53
|
+
return {
|
|
54
|
+
location: "GitHub → your ACCOUNT's Settings → Developer settings → OAuth Apps → New OAuth App",
|
|
55
|
+
homepageUrl: origin,
|
|
56
|
+
callbackUrl: `${origin}/api/gds/auth/web/callback`,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Build the `bongos init` spec from the interview answers (standalone shape). PURE.
|
|
61
|
+
function buildInitSpec(a = {}) {
|
|
62
|
+
const spec = {
|
|
63
|
+
identity: { productName: a.productName, worldName: a.worldName || a.productName, company: a.company ? { name: a.company } : {} },
|
|
64
|
+
repo: { owner: a.repoOwner, name: a.repoName },
|
|
65
|
+
firstAdmin: a.firstAdmin || a.repoOwner,
|
|
66
|
+
version: { id: a.versionId || 'V1', name: a.versionName || `${a.versionId || 'V1'} — Prove the loop`, done_when: a.doneWhen || 'The loop is proven end-to-end.' },
|
|
67
|
+
};
|
|
68
|
+
if (a.domain) spec.domains = { publicOrigin: `https://${a.domain}` };
|
|
69
|
+
if (a.domain || a.slug) spec.provisioning = { shape: 'standalone', domain: a.domain || null, slug: a.slug || null };
|
|
70
|
+
return spec;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function healthzUrl(domain) { return `https://${domain}/healthz`; }
|
|
74
|
+
|
|
75
|
+
// ── Interactive shell ────────────────────────────────────────────────────────
|
|
76
|
+
|
|
77
|
+
function ask(rl, q, dflt) {
|
|
78
|
+
const suffix = dflt ? ` [${dflt}]` : '';
|
|
79
|
+
return new Promise((res) => rl.question(` ${q}${suffix} `, (ans) => res((ans || '').trim() || dflt || '')));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function run() {
|
|
83
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
84
|
+
const log = (m = '') => console.log(m);
|
|
85
|
+
try {
|
|
86
|
+
log('\nbongos onboard — stand up a STANDALONE Cloud Bongos instance (ADR 0108).');
|
|
87
|
+
log('The canonical sequence; the /new-project skill + hall wizard drive the same steps.\n');
|
|
88
|
+
|
|
89
|
+
// Greenfield vs adopt — the one branch in the sequence (ADR 0121 §Decision 1). Greenfield
|
|
90
|
+
// scaffolds a fresh empty repo; adopt LAYERS onto an existing repo (its own pre-flight + accept).
|
|
91
|
+
const modeAns = (await ask(rl, 'Greenfield (a NEW empty repo) or adopt (an EXISTING repo)?', 'greenfield')).toLowerCase();
|
|
92
|
+
const adopt = modeAns.startsWith('a');
|
|
93
|
+
const a = { mode: adopt ? 'adopt' : 'greenfield' };
|
|
94
|
+
|
|
95
|
+
// Step 1 — name + address
|
|
96
|
+
a.productName = await ask(rl, 'Product name?');
|
|
97
|
+
a.worldName = await ask(rl, 'World name?', a.productName);
|
|
98
|
+
a.company = await ask(rl, 'Company (optional)?');
|
|
99
|
+
a.repoOwner = await ask(rl, 'GitHub repo owner?');
|
|
100
|
+
a.repoName = await ask(rl, 'GitHub repo name?');
|
|
101
|
+
a.firstAdmin = await ask(rl, 'First admin (GitHub login — the founding Archon)?', a.repoOwner);
|
|
102
|
+
a.slug = await ask(rl, 'Instance slug? (DNS/db-safe, e.g. mercury)');
|
|
103
|
+
a.domain = await ask(rl, 'Domain you own (bring-your-own; blank = decide later)?');
|
|
104
|
+
|
|
105
|
+
// Step 2 — human: the GitHub repo (create empty for greenfield; use existing for adopt)
|
|
106
|
+
if (adopt) {
|
|
107
|
+
log('\n① Use your EXISTING GitHub repository:');
|
|
108
|
+
log(` ${a.repoOwner}/${a.repoName} — the repo you're bringing under Cloud Bongos. Nothing is created or emptied.`);
|
|
109
|
+
await ask(rl, 'Press Enter once you have that repo checked out locally…');
|
|
110
|
+
} else {
|
|
111
|
+
log('\n① Create the GitHub repository (empty):');
|
|
112
|
+
log(` github.com → New repository → name it "${a.repoName}" under ${a.repoOwner}, leave it empty, Create.`);
|
|
113
|
+
await ask(rl, 'Press Enter once the empty repo exists…');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Step 3 — DNS token preflight (before committing the address)
|
|
117
|
+
if (a.domain) {
|
|
118
|
+
log('\n② DNS token preflight…');
|
|
119
|
+
const scope = await provision.checkDnsTokenScope(a.domain);
|
|
120
|
+
if (scope.reachable) {
|
|
121
|
+
log(` ✓ the DNS token can reach zone ${scope.zone}.`);
|
|
122
|
+
} else {
|
|
123
|
+
log(` ✖ ${scope.reason}`);
|
|
124
|
+
log(` → ${scope.guidance}`);
|
|
125
|
+
log(' Resolve this BEFORE provisioning, then re-run `bongos onboard`. Stopping here.');
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
} else {
|
|
129
|
+
log('\n② DNS preflight skipped (no domain yet) — add one before provisioning, then `bongos provision dns-check <domain>`.');
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Step 4 — bongos init (greenfield: scaffold from a spec; adopt: LAYER onto the existing repo)
|
|
133
|
+
if (adopt) {
|
|
134
|
+
log('\n③ Layer Cloud Bongos onto the existing repo with `bongos init --adopt`:');
|
|
135
|
+
log(` cd into your ${a.repoOwner}/${a.repoName} checkout, then: node bin/bongos.js init --adopt`);
|
|
136
|
+
log(' It detects your stack, shows a conflict PRE-FLIGHT (migration / CI / protected-path / boundary), and writes');
|
|
137
|
+
log(' NOTHING until you accept (interactive y/N, or --accept). It captures your CURRENT version + imports your existing');
|
|
138
|
+
log(' backlog (GitHub issues / a TODO·ROADMAP·BACKLOG file) — never a synthetic V1, and it never overwrites a file.');
|
|
139
|
+
await ask(rl, 'Press Enter once `bongos init --adopt` reports "Adopted."…');
|
|
140
|
+
} else {
|
|
141
|
+
const spec = buildInitSpec(a);
|
|
142
|
+
log('\n③ Scaffold the instance config with `bongos init`:');
|
|
143
|
+
log(` node bin/bongos.js init --from <spec.json> (shape: standalone)`);
|
|
144
|
+
log(' Spec built from your answers:');
|
|
145
|
+
log(' ' + JSON.stringify(spec));
|
|
146
|
+
await ask(rl, 'Press Enter once `bongos init` has written config/…');
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Step 5 — the standalone repo (greenfield scaffolds it; adopt already layered it in ③)
|
|
150
|
+
if (adopt) {
|
|
151
|
+
log('\n④ Your repo is now the standalone instance (ADR 0108):');
|
|
152
|
+
log(' `bongos init --adopt` already layered config/ + .claude/ + the pinned @cloudbongos/core dep onto it.');
|
|
153
|
+
log(` Commit + push ${a.repoOwner}/${a.repoName}. That checkout is what the service runs.`);
|
|
154
|
+
await ask(rl, 'Press Enter once the layered repo is committed + pushed…');
|
|
155
|
+
} else {
|
|
156
|
+
log('\n④ Scaffold the STANDALONE repo (ADR 0108):');
|
|
157
|
+
log(` Clone ${a.repoOwner}/${a.repoName} to the control-plane standalone root, add the config/ + .claude/`);
|
|
158
|
+
log(' from init, pin @cloudbongos/core in its package.json, commit + push. That checkout is what the service runs.');
|
|
159
|
+
await ask(rl, 'Press Enter once the standalone repo is pushed…');
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Step 6 — provision (control plane; trust boundary → print the command)
|
|
163
|
+
log('\n⑤ Provision (runs on the control plane — it alone holds the cloud tokens):');
|
|
164
|
+
log(` node scripts/gds/provision.js provision ${a.slug || '<slug>'} --apply`);
|
|
165
|
+
log(' (standalone: pull + npm ci → createdb + instance-root migrate → web.env → systemd → DNS → Caddy → /healthz)');
|
|
166
|
+
await ask(rl, 'Press Enter once provisioning reports the instance active…');
|
|
167
|
+
|
|
168
|
+
// Step 7 — human: GitHub sign-in. The ONE-CLICK GitHub App Manifest flow (task 2080)
|
|
169
|
+
// is the recommended path when a control-plane hall is provisioning this instance —
|
|
170
|
+
// no OAuth app to hand-create, no secret to paste. This terminal CLI keeps the manual
|
|
171
|
+
// OAuth-app path below for the standalone/no-hall case.
|
|
172
|
+
if (a.domain) {
|
|
173
|
+
const oa = oauthAppInstructions(a.domain);
|
|
174
|
+
log('\n⑥ Wire GitHub sign-in:');
|
|
175
|
+
log(' RECOMMENDED — one click: in the control-plane hall, open “Start a project” →');
|
|
176
|
+
log(' “Set up GitHub sign-in”. Approve the pre-filled GitHub App; the control plane');
|
|
177
|
+
log(' places the credentials automatically (no secret to paste). Then skip to ⑦.');
|
|
178
|
+
log(' — or, to create an OAuth app BY HAND —');
|
|
179
|
+
log(` ${oa.location}`);
|
|
180
|
+
log(' (Developer settings is under your ACCOUNT, not the repository.)');
|
|
181
|
+
log(` Homepage URL: ${oa.homepageUrl}`);
|
|
182
|
+
log(` Authorization callback URL: ${oa.callbackUrl}`);
|
|
183
|
+
log(' Copy the Client ID; Generate a new client secret and copy it (shown once).');
|
|
184
|
+
const clientId = await ask(rl, 'Paste the OAuth Client ID:');
|
|
185
|
+
const clientSecret = await ask(rl, 'Paste the OAuth Client Secret:');
|
|
186
|
+
const idV = oauth.validateClientId(clientId);
|
|
187
|
+
const secV = oauth.validateClientSecret(clientSecret);
|
|
188
|
+
if (!idV.ok || !secV.ok) {
|
|
189
|
+
if (!idV.ok) log(` ✖ client id: ${idV.reason}`);
|
|
190
|
+
if (!secV.ok) log(` ✖ client secret: ${secV.reason}`);
|
|
191
|
+
log(' These look wrong — recheck the OAuth app and re-run. Stopping (nothing placed).');
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
log(' ✓ creds validated. Place them VERIFIED on the control plane:');
|
|
195
|
+
log(` node scripts/gds/oauth-secret.js place ${a.slug || '<slug>'} --client-id ${clientId} --client-secret <secret> --apply`);
|
|
196
|
+
log(' (validates + rewrites web.env via Node + restarts + probes /healthz auth_configured — never hand-edit web.env.)');
|
|
197
|
+
await ask(rl, 'Press Enter once oauth-secret reports auth_configured=true…');
|
|
198
|
+
|
|
199
|
+
// Step 8/9 — first sign-in + verify
|
|
200
|
+
log('\n⑦ First sign-in (seats the founding Archon):');
|
|
201
|
+
log(` Open ${oauthAppInstructions(a.domain).homepageUrl} and sign in with GitHub once.`);
|
|
202
|
+
await ask(rl, 'Press Enter once you are signed in…');
|
|
203
|
+
log('\n⑧ Verify:');
|
|
204
|
+
log(` curl -s ${healthzUrl(a.domain)} → expect {"ok":true,"auth_configured":true}`);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Step 10 — brand
|
|
208
|
+
log('\n⑨ Brand the instance look — fill theme/palette/fonts in config/branding.json (docs/branding-fill-prompt.md).');
|
|
209
|
+
log('\n✓ onboard walkthrough complete. Your standalone instance is live and owned.\n');
|
|
210
|
+
} finally {
|
|
211
|
+
rl.close();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (require.main === module) run().catch((e) => { console.error('onboard failed:', e && e.message ? e.message : e); process.exit(1); });
|
|
216
|
+
|
|
217
|
+
module.exports = { onboardPlan, oauthAppInstructions, buildInitSpec, healthzUrl };
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Passive onboarding-friction analysis (V3.R79 / #298, criterion C1).
|
|
3
|
+
//
|
|
4
|
+
// Reads each spooled onboarding transcript, asks an Opus subagent to flag
|
|
5
|
+
// moments of confusion (long unresolved responses, repeated prompts, error
|
|
6
|
+
// recovery), and files one idea_inbox row per flagged session — tagged with
|
|
7
|
+
// onboarding.ONBOARDING_FRICTION_TAG so triage can find them. "Passive" means
|
|
8
|
+
// no human in the loop: it's kicked detached from the SessionStart hook.
|
|
9
|
+
//
|
|
10
|
+
// The pure brains (parse, signals, prompt, validate, payload) live in
|
|
11
|
+
// src/bongos/onboarding.js; the subagent subprocess is reused from src/bongos/grader.js
|
|
12
|
+
// (same `claude -p --model opus` invocation that the quality grader uses).
|
|
13
|
+
//
|
|
14
|
+
// Usage:
|
|
15
|
+
// node scripts/gds/onboarding-analyze.js [--dry-run] [--only-flagged]
|
|
16
|
+
// [--max N] [--force] [--quiet]
|
|
17
|
+
//
|
|
18
|
+
// --dry-run parse + compute signals + print; no subagent, no POST.
|
|
19
|
+
// --only-flagged only spend a subagent call on transcripts whose
|
|
20
|
+
// deterministic signals already flagged (cost control).
|
|
21
|
+
// --max N cap transcripts analyzed this run (default 5).
|
|
22
|
+
// --force ignore the consent/window gate (testing).
|
|
23
|
+
//
|
|
24
|
+
// Bounded by design: at most --max per run, a lockfile prevents concurrent
|
|
25
|
+
// runs, and it no-ops instantly when the builder hasn't consented.
|
|
26
|
+
|
|
27
|
+
const fs = require('node:fs');
|
|
28
|
+
const zlib = require('node:zlib');
|
|
29
|
+
const path = require('node:path');
|
|
30
|
+
const cfg = require('./onboarding-config');
|
|
31
|
+
// The friction analyzer carved into modules/onboarding/ (BV1.R81 / ADR 0093 §1);
|
|
32
|
+
// scripts are outside the kernel boundary, so this CLI requires the module file
|
|
33
|
+
// directly (the grader.js / session-eval.js precedent — the line below already
|
|
34
|
+
// does the same for grading).
|
|
35
|
+
const onboarding = require('../../modules/onboarding/onboarding');
|
|
36
|
+
const grader = require('../../modules/grading/grader');
|
|
37
|
+
const llmCache = require('../../src/bongos/llm-cache'); // System 5 (task 1360): re-analyzing an immutable session is 100% idempotent
|
|
38
|
+
const { apiCall, cliClient, requireSession, arg } = require('./cli-lib');
|
|
39
|
+
llmCache.setApiFallback(apiCall); // task 1381: runs on a builder machine (no DB pool) → reach the cache via the GDS API
|
|
40
|
+
|
|
41
|
+
const DRY_RUN = process.argv.includes('--dry-run');
|
|
42
|
+
const ONLY_FLAGGED = process.argv.includes('--only-flagged');
|
|
43
|
+
const FORCE = process.argv.includes('--force');
|
|
44
|
+
const QUIET = process.argv.includes('--quiet');
|
|
45
|
+
const MAX_PER_RUN = Math.max(1, Number(arg('--max')) || 5);
|
|
46
|
+
const LOCK_PATH = path.join(cfg.SPOOL_DIR, '.analyze.lock');
|
|
47
|
+
const LOCK_STALE_MS = 30 * 60 * 1000;
|
|
48
|
+
|
|
49
|
+
function log(...a) {
|
|
50
|
+
if (!QUIET) console.log(...a);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Best-effort single-writer lock. Returns true if we hold it.
|
|
54
|
+
function acquireLock() {
|
|
55
|
+
cfg.ensureDir(cfg.SPOOL_DIR);
|
|
56
|
+
try {
|
|
57
|
+
fs.writeFileSync(LOCK_PATH, String(process.pid), { flag: 'wx' });
|
|
58
|
+
return true;
|
|
59
|
+
} catch (err) {
|
|
60
|
+
if (err.code !== 'EEXIST') throw err;
|
|
61
|
+
// Steal a stale lock (a crashed prior run).
|
|
62
|
+
try {
|
|
63
|
+
const st = fs.statSync(LOCK_PATH);
|
|
64
|
+
if (Date.now() - st.mtimeMs > LOCK_STALE_MS) {
|
|
65
|
+
fs.writeFileSync(LOCK_PATH, String(process.pid));
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
} catch (_) {
|
|
69
|
+
/* fall through */
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function releaseLock() {
|
|
75
|
+
try {
|
|
76
|
+
fs.unlinkSync(LOCK_PATH);
|
|
77
|
+
} catch (_) {
|
|
78
|
+
/* ignore */
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function analyzeOne(name, entry) {
|
|
83
|
+
let jsonl;
|
|
84
|
+
try {
|
|
85
|
+
jsonl = zlib.gunzipSync(fs.readFileSync(entry.gz)).toString('utf8');
|
|
86
|
+
} catch (err) {
|
|
87
|
+
return { name, status: 'unreadable', error: err.message };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const { turns, meta } = onboarding.parseTranscript(jsonl);
|
|
91
|
+
const signals = onboarding.detectFrictionSignals(turns);
|
|
92
|
+
|
|
93
|
+
if (DRY_RUN) {
|
|
94
|
+
return { name, status: 'dry-run', meta, signals, turns: turns.length };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (ONLY_FLAGGED && !signals.flagged) {
|
|
98
|
+
return { name, status: 'skipped-clean', signals };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Run the Opus subagent on the transcript.
|
|
102
|
+
const prompt = onboarding.buildAnalysisPrompt({
|
|
103
|
+
sessionMeta: meta,
|
|
104
|
+
signals,
|
|
105
|
+
turns,
|
|
106
|
+
});
|
|
107
|
+
let analysis;
|
|
108
|
+
try {
|
|
109
|
+
// System 5 (task 1360): a session transcript is immutable, so re-analysis is
|
|
110
|
+
// 100% idempotent — cache on the session id so a re-run replays at $0.
|
|
111
|
+
const cache = llmCache.makeCacheSpec({
|
|
112
|
+
prompt, model: grader.DEFAULT_GRADER_MODEL, task_type: 'onboarding-analyze', scope_sha: String(name),
|
|
113
|
+
});
|
|
114
|
+
const { stdout } = await grader.runSubagentCached({
|
|
115
|
+
prompt,
|
|
116
|
+
opts: { cwd: process.cwd() },
|
|
117
|
+
cache,
|
|
118
|
+
});
|
|
119
|
+
const result = grader.extractAssistantResult(stdout);
|
|
120
|
+
analysis = onboarding.validateAnalysis(result);
|
|
121
|
+
} catch (err) {
|
|
122
|
+
// Subagent failed. Fall back to deterministic signals: if they flagged
|
|
123
|
+
// strongly, still file with a low-confidence note; otherwise leave it.
|
|
124
|
+
if (signals.flagged) {
|
|
125
|
+
analysis = {
|
|
126
|
+
ok: false,
|
|
127
|
+
flagged: true,
|
|
128
|
+
confidence: 0.3,
|
|
129
|
+
summary: `Subagent unavailable (${err.code || err.message}); filed from deterministic signals only.`,
|
|
130
|
+
friction_moments: [],
|
|
131
|
+
};
|
|
132
|
+
} else {
|
|
133
|
+
return { name, status: 'subagent-failed-clean', error: err.code || err.message, signals };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (!analysis.flagged) {
|
|
138
|
+
return { name, status: 'not-flagged', signals, summary: analysis.summary };
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const payload = onboarding.buildIdeaPayload({ sessionMeta: meta, analysis, signals });
|
|
142
|
+
const api = await cliClient();
|
|
143
|
+
const resp = await api.inbox.postInbox({
|
|
144
|
+
body: {
|
|
145
|
+
title: payload.title,
|
|
146
|
+
body_md: payload.body_md,
|
|
147
|
+
kind: payload.kind,
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
if (!resp.ok) {
|
|
151
|
+
return { name, status: 'file-failed', http: resp.status, body: resp.data };
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
name,
|
|
155
|
+
status: 'filed',
|
|
156
|
+
idea_id: resp.data?.idea?.id ?? null,
|
|
157
|
+
moments: analysis.friction_moments.length,
|
|
158
|
+
confidence: analysis.confidence,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
(async () => {
|
|
163
|
+
const consent = cfg.readConsent();
|
|
164
|
+
if (!FORCE && !cfg.onboardingActive(consent)) {
|
|
165
|
+
process.exit(0); // silent no-op
|
|
166
|
+
}
|
|
167
|
+
if (!DRY_RUN) {
|
|
168
|
+
await requireSession(); // need a token to POST /inbox
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (!acquireLock()) {
|
|
172
|
+
log('[onboarding] another analysis run holds the lock — skipping.');
|
|
173
|
+
process.exit(0);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
try {
|
|
177
|
+
const manifest = cfg.readManifest();
|
|
178
|
+
const pending = Object.entries(manifest.entries || {})
|
|
179
|
+
.filter(([, e]) => e && e.gz && !e.analyzed && fs.existsSync(e.gz));
|
|
180
|
+
|
|
181
|
+
if (pending.length === 0) {
|
|
182
|
+
log('[onboarding] nothing to analyze.');
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
let analyzed = 0;
|
|
187
|
+
for (const [name, entry] of pending) {
|
|
188
|
+
if (analyzed >= MAX_PER_RUN) {
|
|
189
|
+
log(`[onboarding] hit --max ${MAX_PER_RUN}; ${pending.length - analyzed} left for next run.`);
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
const result = await analyzeOne(name, entry);
|
|
193
|
+
analyzed += 1;
|
|
194
|
+
|
|
195
|
+
if (DRY_RUN) {
|
|
196
|
+
log(`[onboarding] DRY ${name}: turns=${result.turns} flagged(det)=${result.signals?.flagged} ` +
|
|
197
|
+
`signals=${JSON.stringify(result.signals && {
|
|
198
|
+
longThenCorrection: result.signals.longThenCorrection,
|
|
199
|
+
repeatedSimilarPrompts: result.signals.repeatedSimilarPrompts,
|
|
200
|
+
errorRecoveryAttempts: result.signals.errorRecoveryAttempts,
|
|
201
|
+
})}`);
|
|
202
|
+
continue; // don't mutate manifest in dry-run
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Record terminal outcome so we never re-analyze the same snapshot.
|
|
206
|
+
manifest.entries[name] = {
|
|
207
|
+
...entry,
|
|
208
|
+
analyzed: true,
|
|
209
|
+
analyzed_at: new Date().toISOString(),
|
|
210
|
+
outcome: result.status,
|
|
211
|
+
idea_id: result.idea_id ?? null,
|
|
212
|
+
};
|
|
213
|
+
cfg.writeManifest(manifest);
|
|
214
|
+
log(`[onboarding] ${name}: ${result.status}` +
|
|
215
|
+
(result.idea_id ? ` → idea #${result.idea_id} (${result.moments} moment(s))` : '') +
|
|
216
|
+
(result.error ? ` (${result.error})` : ''));
|
|
217
|
+
}
|
|
218
|
+
} finally {
|
|
219
|
+
releaseLock();
|
|
220
|
+
}
|
|
221
|
+
process.exit(0);
|
|
222
|
+
})().catch((err) => {
|
|
223
|
+
releaseLock();
|
|
224
|
+
console.error('[onboarding] fatal:', err.message);
|
|
225
|
+
process.exit(1);
|
|
226
|
+
});
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
// Local config + spool I/O for the onboarding-friction pipeline (V3.R79 / #298).
|
|
2
|
+
//
|
|
3
|
+
// Three on-disk artifacts, all under ~/.config/otb/ (same dir as the GDS
|
|
4
|
+
// session token), so they survive worktree churn:
|
|
5
|
+
//
|
|
6
|
+
// onboarding.json — the builder's consent decision + onboarding window
|
|
7
|
+
// onboarding-spool/ — gzipped copies of session transcripts to analyze
|
|
8
|
+
// onboarding-spool/manifest.json — what's been spooled + analyzed (dedupe)
|
|
9
|
+
//
|
|
10
|
+
// This module is deliberately pure I/O + small predicates; the analysis brains
|
|
11
|
+
// live in src/bongos/onboarding.js. Both onboarding-ship.js and onboarding-analyze.js
|
|
12
|
+
// (and scripts/gds/setup.js for the consent write) import from here so the
|
|
13
|
+
// paths and window math have a single source of truth.
|
|
14
|
+
|
|
15
|
+
const fs = require('node:fs');
|
|
16
|
+
const path = require('node:path');
|
|
17
|
+
const os = require('node:os');
|
|
18
|
+
const ic = require('../../src/instance-config');
|
|
19
|
+
|
|
20
|
+
// The instance config dir (OTB → ~/.config/otb, unchanged; a fresh instance →
|
|
21
|
+
// its neutral dir). R61 / task 1200.
|
|
22
|
+
const CONFIG_DIR = ic.configHome();
|
|
23
|
+
const CONSENT_PATH = path.join(CONFIG_DIR, 'onboarding.json');
|
|
24
|
+
const SPOOL_DIR = path.join(CONFIG_DIR, 'onboarding-spool');
|
|
25
|
+
const MANIFEST_PATH = path.join(SPOOL_DIR, 'manifest.json');
|
|
26
|
+
|
|
27
|
+
// How long the onboarding window stays open after the consent decision.
|
|
28
|
+
// Friction-mining is for the first stretch of a builder's life; after that
|
|
29
|
+
// they're not "onboarding" and shipping their transcripts would be noise (and
|
|
30
|
+
// a privacy overreach). Override for tests via OTB_ONBOARDING_WINDOW_DAYS.
|
|
31
|
+
const DEFAULT_WINDOW_DAYS = 14;
|
|
32
|
+
|
|
33
|
+
function windowDays() {
|
|
34
|
+
const env = Number(process.env.OTB_ONBOARDING_WINDOW_DAYS);
|
|
35
|
+
return Number.isFinite(env) && env > 0 ? env : DEFAULT_WINDOW_DAYS;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function ensureDir(dir) {
|
|
39
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// -------------------------------------------------------------------------
|
|
43
|
+
// Consent
|
|
44
|
+
// -------------------------------------------------------------------------
|
|
45
|
+
|
|
46
|
+
function readConsent() {
|
|
47
|
+
try {
|
|
48
|
+
return JSON.parse(fs.readFileSync(CONSENT_PATH, 'utf8'));
|
|
49
|
+
} catch (_) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Persist the consent decision. consent=false is recorded too (so we never
|
|
55
|
+
// re-prompt and the pipeline reliably no-ops). Window starts at decision time.
|
|
56
|
+
function writeConsent({ consent }) {
|
|
57
|
+
ensureDir(CONFIG_DIR);
|
|
58
|
+
const now = new Date().toISOString();
|
|
59
|
+
const record = {
|
|
60
|
+
consent: consent === true,
|
|
61
|
+
decided_at: now,
|
|
62
|
+
window_started_at: now,
|
|
63
|
+
window_days: windowDays(),
|
|
64
|
+
};
|
|
65
|
+
fs.writeFileSync(CONSENT_PATH, JSON.stringify(record, null, 2), { mode: 0o600 });
|
|
66
|
+
return record;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function windowExpiry(record) {
|
|
70
|
+
if (!record?.window_started_at) return null;
|
|
71
|
+
const start = new Date(record.window_started_at).getTime();
|
|
72
|
+
if (!Number.isFinite(start)) return null;
|
|
73
|
+
const days = Number(record.window_days) || windowDays();
|
|
74
|
+
return start + days * 24 * 60 * 60 * 1000;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The single gate the whole pipeline checks: consent given AND still inside
|
|
78
|
+
// the onboarding window. Everything no-ops to false otherwise.
|
|
79
|
+
function onboardingActive(record = readConsent(), now = Date.now()) {
|
|
80
|
+
if (!record || record.consent !== true) return false;
|
|
81
|
+
const expiry = windowExpiry(record);
|
|
82
|
+
if (expiry == null) return false;
|
|
83
|
+
return now < expiry;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// -------------------------------------------------------------------------
|
|
87
|
+
// Transcript discovery
|
|
88
|
+
//
|
|
89
|
+
// Claude Code stores session transcripts as JSONL under
|
|
90
|
+
// ~/.claude/projects/<encoded-cwd>/<session-uuid>.jsonl
|
|
91
|
+
// where <encoded-cwd> is the absolute project path with every non-alphanumeric
|
|
92
|
+
// char replaced by '-' (e.g. "/Users/x/Desktop/Claude - OTB" becomes
|
|
93
|
+
// "-Users-x-Desktop-Claude---OTB"). We derive the dir from a given cwd so the
|
|
94
|
+
// pipeline works in any worktree without needing the hook's stdin payload.
|
|
95
|
+
// -------------------------------------------------------------------------
|
|
96
|
+
|
|
97
|
+
function encodeProjectPath(absPath) {
|
|
98
|
+
return String(absPath).replace(/[^a-zA-Z0-9]/g, '-');
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function transcriptDirForCwd(cwd) {
|
|
102
|
+
return path.join(os.homedir(), '.claude', 'projects', encodeProjectPath(cwd));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// List transcript files (newest first by mtime) for a project dir.
|
|
106
|
+
function listTranscripts(dir) {
|
|
107
|
+
let entries;
|
|
108
|
+
try {
|
|
109
|
+
entries = fs.readdirSync(dir);
|
|
110
|
+
} catch (_) {
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
const files = [];
|
|
114
|
+
for (const name of entries) {
|
|
115
|
+
if (!name.endsWith('.jsonl')) continue;
|
|
116
|
+
const full = path.join(dir, name);
|
|
117
|
+
let st;
|
|
118
|
+
try {
|
|
119
|
+
st = fs.statSync(full);
|
|
120
|
+
} catch (_) {
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (!st.isFile()) continue;
|
|
124
|
+
files.push({ name, path: full, size: st.size, mtimeMs: st.mtimeMs });
|
|
125
|
+
}
|
|
126
|
+
files.sort((a, b) => b.mtimeMs - a.mtimeMs);
|
|
127
|
+
return files;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// -------------------------------------------------------------------------
|
|
131
|
+
// Spool manifest
|
|
132
|
+
//
|
|
133
|
+
// Keyed by transcript basename. We record the size+mtime we spooled so an
|
|
134
|
+
// updated transcript (same session continued in a later run) re-spools and
|
|
135
|
+
// re-analyzes. `analyzed` flips once the analyzer has filed (or decided not to
|
|
136
|
+
// file) for that snapshot.
|
|
137
|
+
// -------------------------------------------------------------------------
|
|
138
|
+
|
|
139
|
+
function readManifest() {
|
|
140
|
+
try {
|
|
141
|
+
return JSON.parse(fs.readFileSync(MANIFEST_PATH, 'utf8'));
|
|
142
|
+
} catch (_) {
|
|
143
|
+
return { entries: {} };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function writeManifest(manifest) {
|
|
148
|
+
ensureDir(SPOOL_DIR);
|
|
149
|
+
fs.writeFileSync(MANIFEST_PATH, JSON.stringify(manifest, null, 2), { mode: 0o600 });
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// A transcript snapshot is "fresh" (needs re-spooling) when we haven't seen it
|
|
153
|
+
// or its size changed since we last spooled it.
|
|
154
|
+
function needsSpool(manifest, file) {
|
|
155
|
+
const e = manifest.entries[file.name];
|
|
156
|
+
if (!e) return true;
|
|
157
|
+
return e.size !== file.size;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
module.exports = {
|
|
161
|
+
CONFIG_DIR,
|
|
162
|
+
CONSENT_PATH,
|
|
163
|
+
SPOOL_DIR,
|
|
164
|
+
MANIFEST_PATH,
|
|
165
|
+
DEFAULT_WINDOW_DAYS,
|
|
166
|
+
windowDays,
|
|
167
|
+
ensureDir,
|
|
168
|
+
readConsent,
|
|
169
|
+
writeConsent,
|
|
170
|
+
windowExpiry,
|
|
171
|
+
onboardingActive,
|
|
172
|
+
encodeProjectPath,
|
|
173
|
+
transcriptDirForCwd,
|
|
174
|
+
listTranscripts,
|
|
175
|
+
readManifest,
|
|
176
|
+
writeManifest,
|
|
177
|
+
needsSpool,
|
|
178
|
+
};
|