@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,209 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/gds/search-ingest-db.js — DB-prose ingester for the GDS recall layer
|
|
3
|
+
// (task 948, V4.R10 / ADR 0060 §4). The nightly companion to the repo-md
|
|
4
|
+
// ingester (#947): indexes the prose that lives in the DB, not in git — task
|
|
5
|
+
// descriptions + value summaries, learnings, session-log notes, idea inbox,
|
|
6
|
+
// grade notes, done-when criteria, blockers, per-builder memory — plus recent
|
|
7
|
+
// git commit subjects, so "has a parallel/past session already done this?" is
|
|
8
|
+
// answerable (the redundant-work case). source_kind='db'.
|
|
9
|
+
//
|
|
10
|
+
// Runs on a NIGHTLY systemd timer on the droplet (infra/search-index-db.timer,
|
|
11
|
+
// modeled on gds-db-backup) where the GDS Postgres is on the local socket. Idempotent
|
|
12
|
+
// + delta by content_hash (re-runs are cheap), prunes vanished db sources.
|
|
13
|
+
//
|
|
14
|
+
// SECURITY (ADR 0060 §6 / ADR 0016 / ADR 0022):
|
|
15
|
+
// * builder_memory rows are OWNER-SCOPED (owner_builder_id = the builder), so a
|
|
16
|
+
// builder's private memory only ever surfaces to that builder.
|
|
17
|
+
// * security_sensitive tasks are tagged min_rank=metic.
|
|
18
|
+
// * vulnerability_reports + security_reports are EXCLUDED entirely — raw
|
|
19
|
+
// security findings don't belong in a broadly-searchable index.
|
|
20
|
+
// * session-derived + memory text is run through ship.js scrubSecrets (shape +
|
|
21
|
+
// high-entropy redaction) before storage — the index must never hold a
|
|
22
|
+
// leaked credential.
|
|
23
|
+
//
|
|
24
|
+
// Usage:
|
|
25
|
+
// node scripts/gds/search-ingest-db.js # ingest (writes)
|
|
26
|
+
// node scripts/gds/search-ingest-db.js --dry-run # query + report counts, no writes (needs DB)
|
|
27
|
+
|
|
28
|
+
const crypto = require('node:crypto');
|
|
29
|
+
const { execFileSync } = require('node:child_process');
|
|
30
|
+
const path = require('node:path');
|
|
31
|
+
const { chunkMarkdown } = require('../../modules/memory/search-chunker'); // carved in BV1.R72 (ADR 0091 §2)
|
|
32
|
+
const { scrubSecrets } = require('./ship');
|
|
33
|
+
|
|
34
|
+
const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
35
|
+
|
|
36
|
+
function requirePool() {
|
|
37
|
+
// Pool lives in the root src/db.js (see search-ingest-md.js requirePool).
|
|
38
|
+
return require('../../src/bongos/pool').pool;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function sha256(s) {
|
|
42
|
+
return crypto.createHash('sha256').update(s, 'utf8').digest('hex');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Turn one DB record's prose into chunk rows. The title becomes an H1 so the
|
|
46
|
+
// chunker's breadcrumb + FTS title-weighting work the same as for docs. `scrub`
|
|
47
|
+
// runs the body through scrubSecrets first (session/memory/grade text).
|
|
48
|
+
function buildRows({ sourceRef, title, body, minRank = 'xenos', ownerBuilderId = null, scrub = false }) {
|
|
49
|
+
let text = typeof body === 'string' ? body : '';
|
|
50
|
+
if (scrub) text = scrubSecrets(text);
|
|
51
|
+
if (!text || !text.trim()) return [];
|
|
52
|
+
const content = (title ? `# ${title}\n\n` : '') + text;
|
|
53
|
+
const { chunks } = chunkMarkdown({ path: sourceRef, content });
|
|
54
|
+
return chunks.map((c) => ({
|
|
55
|
+
source_ref: sourceRef,
|
|
56
|
+
chunk_index: c.chunk_index,
|
|
57
|
+
heading_path: c.heading_path,
|
|
58
|
+
title: title || sourceRef,
|
|
59
|
+
body: c.body,
|
|
60
|
+
min_rank: minRank,
|
|
61
|
+
owner_builder_id: ownerBuilderId,
|
|
62
|
+
content_hash: sha256(c.body),
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// The prose sources. Each maps DB rows → buildRows() args. Pure given rows, so
|
|
67
|
+
// the mapping is unit-testable without a DB (the queries run in main()).
|
|
68
|
+
// vulnerability_reports + security_reports are deliberately ABSENT (excluded).
|
|
69
|
+
const SOURCES = [
|
|
70
|
+
{
|
|
71
|
+
name: 'tasks',
|
|
72
|
+
query: `SELECT id, title, description, value_summary, security_sensitive FROM tasks`,
|
|
73
|
+
map: (r) => buildRows({
|
|
74
|
+
sourceRef: `task:${r.id}`,
|
|
75
|
+
title: r.title,
|
|
76
|
+
body: [r.description, r.value_summary].filter(Boolean).join('\n\n'),
|
|
77
|
+
minRank: r.security_sensitive ? 'metic' : 'xenos',
|
|
78
|
+
}),
|
|
79
|
+
},
|
|
80
|
+
{ name: 'learnings', query: `SELECT id, title, body_md FROM learnings`,
|
|
81
|
+
map: (r) => buildRows({ sourceRef: `learning:${r.id}`, title: r.title, body: r.body_md }) },
|
|
82
|
+
{ name: 'idea_inbox', query: `SELECT id, title, body_md FROM idea_inbox`,
|
|
83
|
+
map: (r) => buildRows({ sourceRef: `idea:${r.id}`, title: r.title, body: r.body_md }) },
|
|
84
|
+
{ name: 'done_when_criteria', query: `SELECT id, version_id, criterion_id, criterion_md FROM done_when_criteria`,
|
|
85
|
+
map: (r) => buildRows({ sourceRef: `criterion:${r.id}`, title: `Criterion ${r.criterion_id} · ${r.version_id}`, body: r.criterion_md }) },
|
|
86
|
+
{ name: 'blockers', query: `SELECT id, title, body_md, resolution_note FROM blockers`,
|
|
87
|
+
map: (r) => buildRows({ sourceRef: `blocker:${r.id}`, title: r.title, body: [r.body_md, r.resolution_note].filter(Boolean).join('\n\n') }) },
|
|
88
|
+
// Session-derived prose → SCRUB.
|
|
89
|
+
{ name: 'session_logs', query: `SELECT id, task_id, notes_md FROM session_logs WHERE notes_md IS NOT NULL`,
|
|
90
|
+
map: (r) => buildRows({ sourceRef: `session_log:${r.id}`, title: `Session log ${r.id}${r.task_id ? ` · task ${r.task_id}` : ''}`, body: r.notes_md, scrub: true }) },
|
|
91
|
+
{ name: 'task_grades', query: `SELECT id, task_id, notes_md FROM task_grades WHERE notes_md IS NOT NULL`,
|
|
92
|
+
map: (r) => buildRows({ sourceRef: `grade:${r.id}`, title: `Grade · task ${r.task_id}`, body: r.notes_md, scrub: true }) },
|
|
93
|
+
// Per-builder memory → OWNER-SCOPED + scrubbed.
|
|
94
|
+
{ name: 'builder_memory', query: `SELECT builder_id, path, content FROM builder_memory`,
|
|
95
|
+
map: (r) => buildRows({ sourceRef: `memory:${r.builder_id}:${r.path}`, title: r.path, body: r.content, ownerBuilderId: r.builder_id, scrub: true }) },
|
|
96
|
+
];
|
|
97
|
+
|
|
98
|
+
// Recent git commit subjects — the "did a recent session already touch this?"
|
|
99
|
+
// signal. Best-effort (no git / shallow clone → skip).
|
|
100
|
+
function recentCommitRows(limit = 80) {
|
|
101
|
+
let out;
|
|
102
|
+
try {
|
|
103
|
+
out = execFileSync('git', ['-C', REPO_ROOT, 'log', `-${limit}`, '--no-merges', '--format=%H%x09%s'], { encoding: 'utf8' });
|
|
104
|
+
} catch { return []; }
|
|
105
|
+
const rows = [];
|
|
106
|
+
for (const line of out.split('\n')) {
|
|
107
|
+
const tab = line.indexOf('\t');
|
|
108
|
+
if (tab < 0) continue;
|
|
109
|
+
const sha = line.slice(0, tab).trim();
|
|
110
|
+
const subject = line.slice(tab + 1).trim();
|
|
111
|
+
if (!sha || !subject) continue;
|
|
112
|
+
rows.push(...buildRows({ sourceRef: `commit:${sha.slice(0, 12)}`, title: subject, body: subject }));
|
|
113
|
+
}
|
|
114
|
+
return rows;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async function ingestRows(client, rows, sourceRef) {
|
|
118
|
+
const stats = { inserted: 0, updated: 0, unchanged: 0, pruned: 0 };
|
|
119
|
+
for (const r of rows) {
|
|
120
|
+
const res = await client.query(
|
|
121
|
+
`INSERT INTO search_chunks
|
|
122
|
+
(source_kind, source_ref, chunk_index, heading_path, title, body, min_rank, owner_builder_id, content_hash, updated_at)
|
|
123
|
+
VALUES ('db', $1, $2, $3, $4, $5, $6, $7, $8, now())
|
|
124
|
+
ON CONFLICT (source_kind, source_ref, chunk_index) DO UPDATE
|
|
125
|
+
SET heading_path = EXCLUDED.heading_path, title = EXCLUDED.title, body = EXCLUDED.body,
|
|
126
|
+
min_rank = EXCLUDED.min_rank, owner_builder_id = EXCLUDED.owner_builder_id,
|
|
127
|
+
content_hash = EXCLUDED.content_hash, updated_at = now()
|
|
128
|
+
WHERE search_chunks.content_hash IS DISTINCT FROM EXCLUDED.content_hash
|
|
129
|
+
OR search_chunks.min_rank IS DISTINCT FROM EXCLUDED.min_rank
|
|
130
|
+
OR search_chunks.owner_builder_id IS DISTINCT FROM EXCLUDED.owner_builder_id
|
|
131
|
+
RETURNING (xmax = 0) AS inserted`,
|
|
132
|
+
[sourceRef, r.chunk_index, r.heading_path, r.title, r.body, r.min_rank, r.owner_builder_id, r.content_hash]
|
|
133
|
+
);
|
|
134
|
+
if (res.rowCount === 0) stats.unchanged += 1;
|
|
135
|
+
else if (res.rows[0].inserted) stats.inserted += 1;
|
|
136
|
+
else stats.updated += 1;
|
|
137
|
+
}
|
|
138
|
+
const prune = await client.query(
|
|
139
|
+
`DELETE FROM search_chunks WHERE source_kind='db' AND source_ref=$1 AND chunk_index >= $2`,
|
|
140
|
+
[sourceRef, rows.length]
|
|
141
|
+
);
|
|
142
|
+
stats.pruned = prune.rowCount || 0;
|
|
143
|
+
return stats;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
async function main() {
|
|
147
|
+
const dryRun = process.argv.includes('--dry-run');
|
|
148
|
+
const pool = requirePool();
|
|
149
|
+
const client = await pool.connect();
|
|
150
|
+
const totals = { inserted: 0, updated: 0, unchanged: 0, pruned: 0, deleted: 0, sources: 0 };
|
|
151
|
+
const presentRefs = [];
|
|
152
|
+
try {
|
|
153
|
+
// Gather every source's rows first (read-only), grouped by source_ref.
|
|
154
|
+
const byRef = new Map(); // source_ref -> rows[]
|
|
155
|
+
const add = (rows) => {
|
|
156
|
+
for (const row of rows) {
|
|
157
|
+
if (!byRef.has(row.source_ref)) byRef.set(row.source_ref, []);
|
|
158
|
+
byRef.get(row.source_ref).push(row);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
for (const src of SOURCES) {
|
|
162
|
+
const { rows } = await client.query(src.query);
|
|
163
|
+
for (const rec of rows) add(src.map(rec));
|
|
164
|
+
}
|
|
165
|
+
add(recentCommitRows());
|
|
166
|
+
for (const ref of byRef.keys()) presentRefs.push(ref);
|
|
167
|
+
totals.sources = byRef.size;
|
|
168
|
+
const totalChunks = [...byRef.values()].reduce((n, a) => n + a.length, 0);
|
|
169
|
+
console.log(`search-ingest-db: ${byRef.size} db source(s), ${totalChunks} chunk(s)`);
|
|
170
|
+
|
|
171
|
+
if (dryRun) {
|
|
172
|
+
console.log('--dry-run: no writes.');
|
|
173
|
+
const owned = [...byRef.values()].flat().filter((r) => r.owner_builder_id != null).length;
|
|
174
|
+
const metic = [...byRef.values()].flat().filter((r) => r.min_rank === 'metic').length;
|
|
175
|
+
console.log(` owner-scoped chunks: ${owned} · metic-tagged chunks: ${metic}`);
|
|
176
|
+
client.release(); await pool.end().catch(() => {});
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
await client.query('BEGIN');
|
|
181
|
+
for (const [ref, rows] of byRef) {
|
|
182
|
+
const s = await ingestRows(client, rows, ref);
|
|
183
|
+
totals.inserted += s.inserted; totals.updated += s.updated;
|
|
184
|
+
totals.unchanged += s.unchanged; totals.pruned += s.pruned;
|
|
185
|
+
}
|
|
186
|
+
// Delete db chunks whose source no longer exists (a deleted task/idea/etc.).
|
|
187
|
+
const del = await client.query(
|
|
188
|
+
`DELETE FROM search_chunks WHERE source_kind='db' AND NOT (source_ref = ANY($1::text[]))`,
|
|
189
|
+
[presentRefs]
|
|
190
|
+
);
|
|
191
|
+
totals.deleted = del.rowCount || 0;
|
|
192
|
+
await client.query('COMMIT');
|
|
193
|
+
} catch (e) {
|
|
194
|
+
await client.query('ROLLBACK').catch(() => {});
|
|
195
|
+
console.error('search-ingest-db: FAILED, rolled back:', e.message);
|
|
196
|
+
process.exitCode = 1;
|
|
197
|
+
client.release(); await pool.end().catch(() => {});
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
client.release();
|
|
201
|
+
await pool.end().catch(() => {});
|
|
202
|
+
console.log(`search-ingest-db: inserted=${totals.inserted} updated=${totals.updated} unchanged=${totals.unchanged} pruned=${totals.pruned} deleted=${totals.deleted} across ${totals.sources} sources`);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (require.main === module) {
|
|
206
|
+
main().catch((e) => { console.error('search-ingest-db: error', e); process.exit(1); });
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
module.exports = { buildRows, recentCommitRows, SOURCES, requirePool };
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// scripts/gds/search-ingest-md.js — repo-markdown ingester for the GDS recall
|
|
3
|
+
// layer (task 947, V4.R09 / ADR 0060 §4). Walks the repo's markdown, chunks each
|
|
4
|
+
// file (src/bongos/search-chunker.js), and upserts into search_chunks — DELTA-DRIVEN
|
|
5
|
+
// by content_hash so an unchanged chunk is never rewritten. Vanished sources are
|
|
6
|
+
// deleted, so the index tracks the tree.
|
|
7
|
+
//
|
|
8
|
+
// DEPLOY HOOK: a step in the prod deploy (scripts/deploy/deploy-prod.sh, mirrored
|
|
9
|
+
// in the droplet's ~/deploy.sh) runs this AFTER the code update + migrate, where
|
|
10
|
+
// the new markdown + the DB are both on disk. Best-effort there: an ingest hiccup
|
|
11
|
+
// must never fail a deploy (the next deploy / a manual run catches up).
|
|
12
|
+
//
|
|
13
|
+
// SCOPING (ADR 0060 §6): a doc that documents a permission-core surface is tagged
|
|
14
|
+
// min_rank='metic' so a sub-Metic search can never surface it (the search route's
|
|
15
|
+
// SQL filter, #949/#950, enforces it). Everything else is 'xenos' (shared). Docs
|
|
16
|
+
// are never owner-scoped (owner_builder_id stays NULL) — that's for DB-prose
|
|
17
|
+
// memory (#948).
|
|
18
|
+
//
|
|
19
|
+
// Usage:
|
|
20
|
+
// node scripts/gds/search-ingest-md.js # ingest (writes)
|
|
21
|
+
// node scripts/gds/search-ingest-md.js --dry-run # report what WOULD change, no writes
|
|
22
|
+
// node scripts/gds/search-ingest-md.js --root DIR # override the repo root (tests)
|
|
23
|
+
|
|
24
|
+
const fs = require('node:fs');
|
|
25
|
+
const path = require('node:path');
|
|
26
|
+
const crypto = require('node:crypto');
|
|
27
|
+
const { chunkMarkdown } = require('../../modules/memory/search-chunker'); // carved in BV1.R72 (ADR 0091 §2)
|
|
28
|
+
const { matchProtected } = require('../../src/bongos/permission-path-check');
|
|
29
|
+
|
|
30
|
+
const REPO_ROOT = path.resolve(__dirname, '..', '..');
|
|
31
|
+
// Directories we never index: deps, git internals, parallel worktrees, and the
|
|
32
|
+
// web front-ends (assets, not project knowledge). Both web surfaces now live under
|
|
33
|
+
// modules/<key>/public/ — the status surface at modules/status-ui/public/ (BV1.R84)
|
|
34
|
+
// and the hall at modules/hall-ui/public/ (BV1.R85) — so both are already covered
|
|
35
|
+
// by the `public` basename below.
|
|
36
|
+
const EXCLUDE_DIRS = new Set(['node_modules', '.git', 'public']);
|
|
37
|
+
// .claude/worktrees holds throwaway parallel checkouts — skip by path fragment.
|
|
38
|
+
const EXCLUDE_PATH_RE = /(^|\/)\.claude\/worktrees\//;
|
|
39
|
+
|
|
40
|
+
// Permission-core / read-sensitive DOCUMENTATION surfaces → min_rank='metic'
|
|
41
|
+
// (ADR 0060 §6 / ADR 0043 "sub-Metic must not read deeply into … trust-boundary
|
|
42
|
+
// docs"). The PROTECTED_GLOBS in permission-path-check are WRITE-protection over
|
|
43
|
+
// CODE paths; READ-gating in the index is a DIFFERENT axis, so we curate the doc
|
|
44
|
+
// surfaces a sub-Metic search must not surface: the security/audit corpus, the
|
|
45
|
+
// permissions authority doc, and the two trust-boundary ADRs. A trailing '/' is
|
|
46
|
+
// a subtree. (CLAUDE.md is write-protected but READ-PUBLIC — see minRankForDoc.)
|
|
47
|
+
const SENSITIVE_DOC_GLOBS = [
|
|
48
|
+
'docs/canonical-permissions.md', // the rank-ladder / authority reference
|
|
49
|
+
'docs/security/', // threat models + red-team reports
|
|
50
|
+
'docs/audits/', // security + architecture audit findings
|
|
51
|
+
'docs/adr/0016-trust-boundary-server-enforced-permissions.md',
|
|
52
|
+
'docs/adr/0043-git-ssh-trust-boundary-and-rank-floor-on-permission-paths.md',
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
function relPath(abs) {
|
|
56
|
+
return path.relative(REPO_ROOT, abs).split(path.sep).join('/');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function minRankForDoc(rel) {
|
|
60
|
+
// CLAUDE.md is in permission-path-check's PROTECTED_GLOBS, but that's
|
|
61
|
+
// WRITE-protection (sub-Metic can't EDIT it). For RECALL it's the universal
|
|
62
|
+
// onboarding index every rank reads at session start — read-public. Carve it
|
|
63
|
+
// out so a Xenos search still surfaces it (it links to the gated detail docs,
|
|
64
|
+
// which stay metic via the curated list below).
|
|
65
|
+
if (rel === 'CLAUDE.md') return 'xenos';
|
|
66
|
+
// Curated read-sensitive documentation surfaces → metic.
|
|
67
|
+
for (const g of SENSITIVE_DOC_GLOBS) {
|
|
68
|
+
if (g.endsWith('/') ? rel.startsWith(g) : rel === g) return 'metic';
|
|
69
|
+
}
|
|
70
|
+
// Defensive: any OTHER markdown that physically lives under a protected CODE
|
|
71
|
+
// surface (e.g. a future README inside src/bongos/) → metic. matchProtected over
|
|
72
|
+
// an md path only ever matches CLAUDE.md today (carved out above) or such a
|
|
73
|
+
// nested doc, so this is a forward-looking guard, not a second CLAUDE.md hit.
|
|
74
|
+
if (matchProtected([rel]).length > 0) return 'metic';
|
|
75
|
+
return 'xenos';
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Recursively collect *.md files under root, honoring the exclusions.
|
|
79
|
+
function collectMarkdown(dir, root, out = []) {
|
|
80
|
+
let entries;
|
|
81
|
+
try { entries = fs.readdirSync(dir, { withFileTypes: true }); } catch { return out; }
|
|
82
|
+
for (const e of entries) {
|
|
83
|
+
const abs = path.join(dir, e.name);
|
|
84
|
+
if (e.isDirectory()) {
|
|
85
|
+
if (EXCLUDE_DIRS.has(e.name)) continue;
|
|
86
|
+
const rel = relPath(abs);
|
|
87
|
+
if (EXCLUDE_PATH_RE.test(rel + '/')) continue;
|
|
88
|
+
collectMarkdown(abs, root, out);
|
|
89
|
+
} else if (e.isFile() && e.name.toLowerCase().endsWith('.md')) {
|
|
90
|
+
const rel = relPath(abs);
|
|
91
|
+
if (EXCLUDE_PATH_RE.test(rel)) continue;
|
|
92
|
+
out.push(abs);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return out;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function sha256(s) {
|
|
99
|
+
return crypto.createHash('sha256').update(s, 'utf8').digest('hex');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// The pg Pool lives in the ROOT src/db.js — src/bongos/db.js USES it but does NOT
|
|
103
|
+
// re-export it (src/bongos/search.js requires '../db' for the same reason). Pulled
|
|
104
|
+
// into an exported helper so a unit test pins the path: the original
|
|
105
|
+
// require('../../src/bongos/db') returned no `pool`, crashing only on the DB path
|
|
106
|
+
// (which the pure tests + --dry-run never exercised). task 1156.
|
|
107
|
+
function requirePool() {
|
|
108
|
+
const { pool } = require('../../src/bongos/pool');
|
|
109
|
+
return pool;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Build the per-file chunk rows (pure — no DB). Exported for the dry-run report
|
|
113
|
+
// + tests.
|
|
114
|
+
function chunkFile(abs) {
|
|
115
|
+
const rel = relPath(abs);
|
|
116
|
+
const content = fs.readFileSync(abs, 'utf8');
|
|
117
|
+
const { title, chunks } = chunkMarkdown({ path: rel, content });
|
|
118
|
+
const min_rank = minRankForDoc(rel);
|
|
119
|
+
return chunks.map((c) => ({
|
|
120
|
+
source_kind: 'doc',
|
|
121
|
+
source_ref: rel,
|
|
122
|
+
chunk_index: c.chunk_index,
|
|
123
|
+
heading_path: c.heading_path,
|
|
124
|
+
title: title || rel,
|
|
125
|
+
body: c.body,
|
|
126
|
+
min_rank,
|
|
127
|
+
content_hash: sha256(c.body),
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Upsert one file's chunks in a transaction: delta-update changed chunks, prune
|
|
132
|
+
// any trailing chunks (file shrank). Returns { inserted, updated, unchanged, pruned }.
|
|
133
|
+
async function ingestFile(client, rows, sourceRef) {
|
|
134
|
+
const stats = { inserted: 0, updated: 0, unchanged: 0, pruned: 0 };
|
|
135
|
+
for (const r of rows) {
|
|
136
|
+
const res = await client.query(
|
|
137
|
+
`INSERT INTO search_chunks
|
|
138
|
+
(source_kind, source_ref, chunk_index, heading_path, title, body, min_rank, owner_builder_id, content_hash, updated_at)
|
|
139
|
+
VALUES ('doc', $1, $2, $3, $4, $5, $6, NULL, $7, now())
|
|
140
|
+
ON CONFLICT (source_kind, source_ref, chunk_index) DO UPDATE
|
|
141
|
+
SET heading_path = EXCLUDED.heading_path,
|
|
142
|
+
title = EXCLUDED.title,
|
|
143
|
+
body = EXCLUDED.body,
|
|
144
|
+
min_rank = EXCLUDED.min_rank,
|
|
145
|
+
content_hash = EXCLUDED.content_hash,
|
|
146
|
+
updated_at = now()
|
|
147
|
+
WHERE search_chunks.content_hash IS DISTINCT FROM EXCLUDED.content_hash
|
|
148
|
+
OR search_chunks.min_rank IS DISTINCT FROM EXCLUDED.min_rank
|
|
149
|
+
RETURNING (xmax = 0) AS inserted`,
|
|
150
|
+
[sourceRef, r.chunk_index, r.heading_path, r.title, r.body, r.min_rank, r.content_hash]
|
|
151
|
+
);
|
|
152
|
+
if (res.rowCount === 0) stats.unchanged += 1; // WHERE skipped the update (no change)
|
|
153
|
+
else if (res.rows[0].inserted) stats.inserted += 1; // fresh row
|
|
154
|
+
else stats.updated += 1; // changed row rewritten
|
|
155
|
+
}
|
|
156
|
+
// Prune chunks beyond the new count (file shrank / sections removed).
|
|
157
|
+
const pruneRes = await client.query(
|
|
158
|
+
`DELETE FROM search_chunks WHERE source_kind='doc' AND source_ref=$1 AND chunk_index >= $2`,
|
|
159
|
+
[sourceRef, rows.length]
|
|
160
|
+
);
|
|
161
|
+
stats.pruned = pruneRes.rowCount || 0;
|
|
162
|
+
return stats;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async function main() {
|
|
166
|
+
const args = process.argv.slice(2);
|
|
167
|
+
const dryRun = args.includes('--dry-run');
|
|
168
|
+
const rootIdx = args.indexOf('--root');
|
|
169
|
+
const root = rootIdx >= 0 ? path.resolve(args[rootIdx + 1]) : REPO_ROOT;
|
|
170
|
+
|
|
171
|
+
const files = collectMarkdown(root, root).sort();
|
|
172
|
+
const allRows = [];
|
|
173
|
+
let metic = 0;
|
|
174
|
+
for (const abs of files) {
|
|
175
|
+
const rows = chunkFile(abs);
|
|
176
|
+
if (rows.some((r) => r.min_rank === 'metic')) metic += 1;
|
|
177
|
+
allRows.push({ sourceRef: relPath(abs), rows });
|
|
178
|
+
}
|
|
179
|
+
const totalChunks = allRows.reduce((n, f) => n + f.rows.length, 0);
|
|
180
|
+
console.log(`search-ingest-md: ${files.length} markdown file(s), ${totalChunks} chunk(s), ${metic} file(s) tagged min_rank=metic`);
|
|
181
|
+
|
|
182
|
+
if (dryRun) {
|
|
183
|
+
console.log('--dry-run: no writes. Sample of metic-tagged sources:');
|
|
184
|
+
for (const f of allRows.filter((f) => f.rows[0] && f.rows[0].min_rank === 'metic').slice(0, 10)) {
|
|
185
|
+
console.log(` metic ${f.sourceRef} (${f.rows.length} chunk(s))`);
|
|
186
|
+
}
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const pool = requirePool();
|
|
191
|
+
const client = await pool.connect();
|
|
192
|
+
const totals = { inserted: 0, updated: 0, unchanged: 0, pruned: 0, deleted: 0 };
|
|
193
|
+
try {
|
|
194
|
+
await client.query('BEGIN');
|
|
195
|
+
for (const f of allRows) {
|
|
196
|
+
const s = await ingestFile(client, f.rows, f.sourceRef);
|
|
197
|
+
totals.inserted += s.inserted; totals.updated += s.updated;
|
|
198
|
+
totals.unchanged += s.unchanged; totals.pruned += s.pruned;
|
|
199
|
+
}
|
|
200
|
+
// Delete chunks for doc sources that no longer exist in the tree.
|
|
201
|
+
const present = allRows.map((f) => f.sourceRef);
|
|
202
|
+
const del = await client.query(
|
|
203
|
+
`DELETE FROM search_chunks WHERE source_kind='doc' AND NOT (source_ref = ANY($1::text[]))`,
|
|
204
|
+
[present]
|
|
205
|
+
);
|
|
206
|
+
totals.deleted = del.rowCount || 0;
|
|
207
|
+
await client.query('COMMIT');
|
|
208
|
+
} catch (e) {
|
|
209
|
+
await client.query('ROLLBACK').catch(() => {});
|
|
210
|
+
console.error('search-ingest-md: FAILED, rolled back:', e.message);
|
|
211
|
+
process.exitCode = 1;
|
|
212
|
+
client.release();
|
|
213
|
+
await pool.end().catch(() => {});
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
client.release();
|
|
217
|
+
await pool.end().catch(() => {});
|
|
218
|
+
console.log(`search-ingest-md: inserted=${totals.inserted} updated=${totals.updated} unchanged=${totals.unchanged} pruned=${totals.pruned} deleted_sources_chunks=${totals.deleted}`);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (require.main === module) {
|
|
222
|
+
main().catch((e) => { console.error('search-ingest-md: error', e); process.exit(1); });
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
module.exports = { chunkFile, minRankForDoc, collectMarkdown, ingestFile, requirePool, SENSITIVE_DOC_GLOBS };
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# scripts/gds/security-baseline-check.sh — V3.R44 (#253).
|
|
3
|
+
#
|
|
4
|
+
# The enforceable read of docs/security-baseline.md. Walks eight categories
|
|
5
|
+
# and prints PASS / FAIL / pending for each. Exit 0 if no FAILs (pendings are
|
|
6
|
+
# OK); exit 1 if any FAIL.
|
|
7
|
+
#
|
|
8
|
+
# Intended caller: the /merge-mode skill, before landing a non-Archon claim.
|
|
9
|
+
# Also runs cleanly by hand: `bash scripts/gds/security-baseline-check.sh`.
|
|
10
|
+
#
|
|
11
|
+
# Pure check — no writes, no network calls. The point is to be cheap enough to
|
|
12
|
+
# run on every merge.
|
|
13
|
+
|
|
14
|
+
set -uo pipefail
|
|
15
|
+
|
|
16
|
+
# Anchor to repo root regardless of where the script was invoked from.
|
|
17
|
+
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|
18
|
+
cd "$REPO_ROOT"
|
|
19
|
+
|
|
20
|
+
PASS_COUNT=0
|
|
21
|
+
FAIL_COUNT=0
|
|
22
|
+
PENDING_COUNT=0
|
|
23
|
+
FAILED_ITEMS=()
|
|
24
|
+
|
|
25
|
+
# emit <status> <label> <detail>
|
|
26
|
+
emit() {
|
|
27
|
+
local status=$1; shift
|
|
28
|
+
local label=$1; shift
|
|
29
|
+
local detail=$*
|
|
30
|
+
case "$status" in
|
|
31
|
+
PASS) PASS_COUNT=$((PASS_COUNT+1)); printf ' \033[32mPASS\033[0m %s — %s\n' "$label" "$detail" ;;
|
|
32
|
+
FAIL) FAIL_COUNT=$((FAIL_COUNT+1)); FAILED_ITEMS+=("$label"); printf ' \033[31mFAIL\033[0m %s — %s\n' "$label" "$detail" ;;
|
|
33
|
+
PENDING) PENDING_COUNT=$((PENDING_COUNT+1)); printf ' \033[33mpending\033[0m %s — %s\n' "$label" "$detail" ;;
|
|
34
|
+
esac
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
echo "security-baseline-check — walking 8 categories"
|
|
38
|
+
echo "(repo: $REPO_ROOT)"
|
|
39
|
+
echo ""
|
|
40
|
+
|
|
41
|
+
# ---- 1. input validation on every write route -------------------------------
|
|
42
|
+
# Every router file that defines POST/PATCH/PUT/DELETE must reference
|
|
43
|
+
# validateOrRespond. A router with only GETs is exempt.
|
|
44
|
+
miss=()
|
|
45
|
+
for f in src/bongos/routes/*.js; do
|
|
46
|
+
if grep -qE "router\.(post|patch|put|delete)\b" "$f"; then
|
|
47
|
+
if ! grep -q "validateOrRespond" "$f"; then
|
|
48
|
+
miss+=("$f")
|
|
49
|
+
fi
|
|
50
|
+
fi
|
|
51
|
+
done
|
|
52
|
+
if [ ${#miss[@]} -eq 0 ]; then
|
|
53
|
+
emit PASS "1. input-validation" "every write-bearing router uses validateOrRespond"
|
|
54
|
+
else
|
|
55
|
+
emit FAIL "1. input-validation" "missing in: ${miss[*]}"
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
# ---- 2. auth-token hygiene --------------------------------------------------
|
|
59
|
+
# Schema migration 035 is the floor. db.js must export the revocation helpers.
|
|
60
|
+
if [ -f migrations/035_auth_token_hygiene.sql ] && \
|
|
61
|
+
grep -q "revokeSessionById" src/bongos/db.js && \
|
|
62
|
+
grep -q "revokeAllSessionsForBuilder" src/bongos/db.js; then
|
|
63
|
+
emit PASS "2. auth-token-hygiene" "migration 035 present, revocation helpers exported"
|
|
64
|
+
else
|
|
65
|
+
emit FAIL "2. auth-token-hygiene" "migration 035 or revocation helpers missing"
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
# ---- 3. rate limits on write paths ------------------------------------------
|
|
69
|
+
# Caddy directive + Express middleware file (V3.R34 / #255 — still in flight
|
|
70
|
+
# at the time this script was written; emit pending if not yet shipped).
|
|
71
|
+
caddy_ok=0; mw_ok=0
|
|
72
|
+
[ -f infra/Caddyfile ] && grep -q "rate_limit" infra/Caddyfile && caddy_ok=1
|
|
73
|
+
[ -d src/bongos/middleware ] && find src/bongos/middleware -name "*rate*.js" -print -quit | grep -q . && mw_ok=1
|
|
74
|
+
if [ "$caddy_ok" = "1" ] && [ "$mw_ok" = "1" ]; then
|
|
75
|
+
emit PASS "3. rate-limits" "Caddyfile + middleware/*rate*.js both present"
|
|
76
|
+
elif [ "$caddy_ok" = "0" ] && [ "$mw_ok" = "0" ]; then
|
|
77
|
+
emit PENDING "3. rate-limits" "V3.R34 (#255) not yet shipped — neither Caddy directive nor middleware present"
|
|
78
|
+
else
|
|
79
|
+
emit FAIL "3. rate-limits" "partial implementation (caddy=$caddy_ok middleware=$mw_ok); finish or revert"
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
# ---- 4. audit logging on every authenticated write --------------------------
|
|
83
|
+
if [ -f migrations/033_audit_log.sql ] && [ -f src/bongos/middleware/audit.js ]; then
|
|
84
|
+
emit PASS "4. audit-logging" "migration 033 + middleware/audit.js present"
|
|
85
|
+
elif [ -f migrations/033_audit_log.sql ]; then
|
|
86
|
+
emit FAIL "4. audit-logging" "migration 033 present but src/bongos/middleware/audit.js missing"
|
|
87
|
+
else
|
|
88
|
+
emit FAIL "4. audit-logging" "migration 033 missing"
|
|
89
|
+
fi
|
|
90
|
+
|
|
91
|
+
# ---- 5. dependency scanning in CI + nightly ---------------------------------
|
|
92
|
+
ci_ok=0; cron_ok=0; scan_ok=0
|
|
93
|
+
[ -f .github/workflows/dep-audit.yml ] && ci_ok=1
|
|
94
|
+
[ -f .claude/scheduled-tasks/dep-audit-nightly/SKILL.md ] && cron_ok=1
|
|
95
|
+
[ -f scripts/security/dep-audit.js ] && scan_ok=1
|
|
96
|
+
if [ "$ci_ok" = "1" ] && [ "$cron_ok" = "1" ] && [ "$scan_ok" = "1" ]; then
|
|
97
|
+
emit PASS "5. dep-scanning" "CI workflow + nightly cron + scan script all present"
|
|
98
|
+
else
|
|
99
|
+
emit FAIL "5. dep-scanning" "missing: ci=$ci_ok cron=$cron_ok scan=$scan_ok"
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
# ---- 6. no secrets in repo --------------------------------------------------
|
|
103
|
+
hook_ok=0
|
|
104
|
+
[ -f .husky/pre-commit ] && grep -qE "secret|trufflehog|gitleaks|secrets-scan" .husky/pre-commit && hook_ok=1
|
|
105
|
+
[ "$hook_ok" = "0" ] && [ -f .git/hooks/pre-commit ] && grep -qE "secret|trufflehog|gitleaks|secrets-scan" .git/hooks/pre-commit && hook_ok=1
|
|
106
|
+
# .env.local must be in .gitignore so it can't be staged accidentally.
|
|
107
|
+
gitignore_ok=0
|
|
108
|
+
[ -f .gitignore ] && grep -qE "^\.env\.local$|^\.env\.local\b" .gitignore && gitignore_ok=1
|
|
109
|
+
if [ "$hook_ok" = "1" ] && [ "$gitignore_ok" = "1" ]; then
|
|
110
|
+
emit PASS "6. no-secrets-in-repo" "pre-commit secrets scan present + .env.local gitignored"
|
|
111
|
+
elif [ "$gitignore_ok" = "1" ]; then
|
|
112
|
+
emit FAIL "6. no-secrets-in-repo" ".env.local gitignored OK, but no pre-commit secrets scan detected"
|
|
113
|
+
else
|
|
114
|
+
emit FAIL "6. no-secrets-in-repo" "missing: pre-commit=$hook_ok gitignore=$gitignore_ok"
|
|
115
|
+
fi
|
|
116
|
+
|
|
117
|
+
# ---- 7. observability dashboards --------------------------------------------
|
|
118
|
+
# The status dashboard surface moved to modules/status-ui/public/ in BV1.R84.
|
|
119
|
+
status_ok=0; grafana_ok=0
|
|
120
|
+
[ -d modules/status-ui/public ] && status_ok=1
|
|
121
|
+
[ -d docs/grafana ] && find docs/grafana -name "*.json" -print -quit 2>/dev/null | grep -q . && grafana_ok=1
|
|
122
|
+
if [ "$status_ok" = "1" ] && [ "$grafana_ok" = "1" ]; then
|
|
123
|
+
emit PASS "7. observability" "modules/status-ui/public/ + docs/grafana/*.json present"
|
|
124
|
+
elif [ "$status_ok" = "1" ]; then
|
|
125
|
+
emit PENDING "7. observability" "V3.R42 (#263) not yet shipped — status dashboard OK, no provisioned grafana JSON yet"
|
|
126
|
+
else
|
|
127
|
+
emit FAIL "7. observability" "modules/status-ui/public/ missing"
|
|
128
|
+
fi
|
|
129
|
+
|
|
130
|
+
# ---- 8. rank-check audit on every route -------------------------------------
|
|
131
|
+
# Each router.<verb> declaration must EITHER have a 'rank:' comment within 5
|
|
132
|
+
# lines above OR reference requireBuilder/requireRank in the middleware chain
|
|
133
|
+
# of that declaration line. Routes that fail this surface explicitly so the
|
|
134
|
+
# fix is local to the offending router file.
|
|
135
|
+
ungated=()
|
|
136
|
+
while read -r line; do
|
|
137
|
+
file="${line%%:*}"
|
|
138
|
+
rest="${line#*:}"
|
|
139
|
+
lineno="${rest%%:*}"
|
|
140
|
+
# capture the verb declaration line
|
|
141
|
+
decl=$(sed -n "${lineno}p" "$file")
|
|
142
|
+
# check the declaration line itself for auth.* middleware
|
|
143
|
+
if echo "$decl" | grep -qE "auth\.(requireBuilder|requireRank)"; then
|
|
144
|
+
continue
|
|
145
|
+
fi
|
|
146
|
+
# otherwise check the 5 lines above for a `rank:` comment OR a multi-line
|
|
147
|
+
# router definition where the middleware chain spans lines (the closing
|
|
148
|
+
# paren of router.<verb>(... can be many lines down). Search up to 20 lines
|
|
149
|
+
# forward for auth.require* in the same router(...) block.
|
|
150
|
+
start=$((lineno > 5 ? lineno - 5 : 1))
|
|
151
|
+
before=$(sed -n "${start},${lineno}p" "$file")
|
|
152
|
+
if echo "$before" | grep -qE "rank:|RANK:"; then
|
|
153
|
+
continue
|
|
154
|
+
fi
|
|
155
|
+
end=$((lineno + 20))
|
|
156
|
+
after=$(sed -n "${lineno},${end}p" "$file")
|
|
157
|
+
if echo "$after" | grep -qE "auth\.(requireBuilder|requireRank)"; then
|
|
158
|
+
continue
|
|
159
|
+
fi
|
|
160
|
+
ungated+=("$file:$lineno")
|
|
161
|
+
done < <(grep -nE "router\.(get|post|patch|put|delete)\(" src/bongos/routes/*.js)
|
|
162
|
+
if [ ${#ungated[@]} -eq 0 ]; then
|
|
163
|
+
emit PASS "8. rank-check-audit" "every route either rank-commented or uses requireBuilder/requireRank"
|
|
164
|
+
else
|
|
165
|
+
emit FAIL "8. rank-check-audit" "ungated routes: ${ungated[*]}"
|
|
166
|
+
fi
|
|
167
|
+
|
|
168
|
+
# ---- summary ----------------------------------------------------------------
|
|
169
|
+
echo ""
|
|
170
|
+
echo "summary: PASS=$PASS_COUNT pending=$PENDING_COUNT FAIL=$FAIL_COUNT"
|
|
171
|
+
if [ "$FAIL_COUNT" -gt 0 ]; then
|
|
172
|
+
echo "FAILED items:"
|
|
173
|
+
for it in "${FAILED_ITEMS[@]}"; do echo " - $it"; done
|
|
174
|
+
echo ""
|
|
175
|
+
echo "Fix the FAILED items (or escalate to Archon for an audit-logged override) before /merge-mode lands a non-Archon claim."
|
|
176
|
+
exit 1
|
|
177
|
+
fi
|
|
178
|
+
echo ""
|
|
179
|
+
echo "OK — baseline green. Non-Archon merges may proceed."
|
|
180
|
+
exit 0
|