@bongos/core 1.19.1073 → 1.19.1074
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 +320 -465
- package/.claude/skills/feedback/SKILL.md +2 -2
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +4 -60
- package/clients/bongos-client/index.cjs +4 -60
- package/clients/bongos-client/index.d.ts +5 -90
- package/clients/bongos-client/index.mjs +4 -60
- package/config/branding.neutral.json +1 -5
- package/config/modules.neutral.json +2 -3
- package/config/scheduled-routines.json +0 -2
- package/docs/adr/0145-free-hosted-project-tier-isolation-and-domain-separation.md +1 -0
- package/docs/adr/0285-a-shared-box-holds-about-twelve-projects-per-gb-and-memory-is-the-wall.md +1 -0
- package/docs/adr/0323-hosting-is-three-shapes-and-we-are-not-the-landlord.md +1 -1
- package/docs/adr/0327-a-cloud-host-runs-on-the-owners-account-and-the-key-is-borrowed.md +1 -1
- package/docs/adr/0341-the-page-is-the-unit-of-tweak-mode.md +2 -0
- package/docs/adr/0345-we-host-every-projects-hall-and-its-app-deploys-where-the-owner-chooses.md +94 -0
- package/docs/adr/README.md +1 -0
- package/docs/api/openapi.json +171 -1661
- package/docs/api-reference.md +9 -41
- package/docs/architecture.md +16 -1
- package/docs/branding-contract.md +0 -3
- package/docs/copy-inventory.md +454 -479
- package/docs/copy-registry.json +746 -978
- package/docs/file-map.md +5 -34
- package/docs/module-api-changelog.md +2 -0
- package/docs/modules-contract.md +13 -1
- package/docs/onboarding/diagrams/04-architecture.mmd +11 -22
- package/docs/onboarding/diagrams/README.md +3 -3
- package/docs/onboarding/diagrams/assertions.json +2 -22
- package/docs/onboarding/primer.md +9 -28
- package/docs/page-inventory.json +4 -1
- package/docs/page-readings.json +1032 -1077
- package/docs/recipes/render-pilot.md +29 -10
- package/migrations/core_257_module_store_registry.sql +87 -0
- package/migrations/core_258_drop_dev_box_tables.sql +55 -0
- package/modules/agents/module.json +1 -0
- package/modules/autonomy/module.json +1 -0
- package/modules/builder-settings/module.json +1 -0
- package/modules/builder-settings/render-prefs.js +4 -5
- package/modules/copy-desk/docx.js +78 -5
- package/modules/copy-desk/module.json +1 -0
- package/modules/copy-desk/routes/copy-desk.js +9 -9
- package/modules/copy-desk/tests/copy_docx.mjs +107 -1
- package/modules/copy-desk/tests/fixtures/word-docx.mjs +30 -0
- package/modules/discord/module.json +1 -0
- package/modules/economy/module.json +1 -0
- package/modules/economy/routes/credits.js +1 -2
- package/modules/government/catalog.js +13 -17
- package/modules/government/migrations/government_019_retire_box_permissions.sql +33 -0
- package/modules/government/module.json +1 -0
- package/modules/government/protected-surfaces.json +3 -11
- package/modules/government/resolver.js +3 -46
- package/modules/government/routes/government.js +0 -2
- package/modules/government/session-scopes.js +43 -83
- package/modules/government/session-scopes.json +8 -18
- package/modules/grading/module.json +1 -0
- package/modules/hall-ui/module.json +1 -0
- package/modules/hall-ui/public/board-lib.js +2 -2
- package/modules/hall-ui/public/builders.js +29 -40
- package/modules/hall-ui/public/collab.html +1 -1
- package/modules/hall-ui/public/collab.js +1 -1
- package/modules/hall-ui/public/diagrams.html +3 -3
- package/modules/hall-ui/public/dom-utils.js +1 -1
- package/modules/hall-ui/public/gate.js +2 -2
- package/modules/hall-ui/public/gate.states.json +1 -1
- package/modules/hall-ui/public/hall-render.js +43 -79
- package/modules/hall-ui/public/index.html +5 -1
- package/modules/hall-ui/public/modules.js +1 -0
- package/modules/hall-ui/public/oversight.css +5 -5
- package/modules/hall-ui/public/palette.js +0 -11
- package/modules/hall-ui/public/primer.js +1 -1
- package/modules/hall-ui/public/sessions.html +1 -1
- package/modules/hall-ui/public/settings-sessions.js +1 -1
- package/modules/hall-ui/public/settings.css +0 -1
- package/modules/hall-ui/public/settings.html +4 -33
- package/modules/hall-ui/public/settings.js +3 -33
- package/modules/hall-ui/public/settings.states.json +2 -2
- package/modules/hall-ui/public/studio.html +1 -1
- package/modules/hall-ui/public/style.css +10 -13
- package/modules/hall-ui/public/task.html +4 -1
- package/modules/hall-ui/public/task.js +36 -1
- package/modules/hall-ui/public/tweak-editor-lib.js +18 -1
- package/modules/hall-ui/public/tweak-editor.css +16 -0
- package/modules/hall-ui/public/tweak-editor.html +26 -3
- package/modules/hall-ui/public/tweak-editor.js +32 -1
- package/modules/hall-ui/public/work.js +1 -1
- package/modules/hall-ui/records/tweak-editor.md +1 -0
- package/modules/ideas/module.json +1 -0
- package/modules/lifecycle/db-claim-reads.js +1 -58
- package/modules/lifecycle/db-ship.js +0 -5
- package/modules/lifecycle/db.js +0 -4
- package/modules/lifecycle/kickoff-checklist.js +0 -4
- package/modules/lifecycle/lifecycle.js +0 -8
- package/modules/lifecycle/module.json +1 -0
- package/modules/lifecycle/routes/tasks.js +5 -7
- package/modules/memory/module.json +1 -0
- package/modules/npm-release/module.json +1 -0
- package/modules/onboarding/module.json +1 -0
- package/modules/onboarding/onboarding-state.js +17 -36
- package/modules/onboarding/routes/access-requests.js +3 -3
- package/modules/platform-identity/module.json +1 -0
- package/modules/platform-identity/platform-identity.js +13 -5
- package/modules/platform-identity/routes/sso.js +2 -2
- package/modules/platform-identity/tests/platform-identity.mjs +17 -3
- package/modules/provisioning/module.json +1 -0
- package/modules/provisioning/provisioning.js +2 -2
- package/modules/provisioning/starter-bundles.js +5 -25
- package/modules/public-landing/module.json +1 -0
- package/modules/public-landing/public/assets/cosmos.css +1 -1
- package/modules/public-landing/public/contact.html +1 -1
- package/modules/public-landing/public/privacy.html +1 -1
- package/modules/public-landing/public/projects.html +101 -32
- package/modules/public-landing/public/projects.probes.json +2 -2
- package/modules/public-landing/public/projects.states.json +4 -3
- package/modules/public-landing/public/terms.html +1 -1
- package/modules/security/module.json +1 -0
- package/modules/sessions/module.json +1 -0
- package/modules/specialities/module.json +1 -0
- package/modules/status-ui/module.json +1 -0
- package/modules/ui-design/module.json +1 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +78 -0
- package/scripts/gds/artifact-format.js +203 -0
- package/scripts/gds/audit-authorship.sh +1 -13
- package/scripts/gds/claim.js +0 -15
- package/scripts/gds/cli-lib.js +8 -8
- package/scripts/gds/diagram-facts.js +12 -23
- package/scripts/gds/do-api.js +13 -80
- package/scripts/gds/doc-cli-guard.js +2 -0
- package/scripts/gds/doctor.js +1 -1
- package/scripts/gds/feedback-latest.js +139 -9
- package/scripts/gds/fitness-checks-identity.js +2 -7
- package/scripts/gds/fitness-checks-write-validation.js +4 -0
- package/scripts/gds/fitness-ratchets.js +4 -4
- package/scripts/gds/fitness.js +10 -10
- package/scripts/gds/gen-diagrams.js +49 -71
- package/scripts/gds/http-api-client.js +12 -19
- package/scripts/gds/init.js +1 -1
- package/scripts/gds/lint-infra-exec.js +1 -1
- package/scripts/gds/local-preview-lib.js +8 -39
- package/scripts/gds/local-preview.js +2 -15
- package/scripts/gds/migration-namespace.js +3 -3
- package/scripts/gds/module-artifact.js +212 -0
- package/scripts/gds/module.js +95 -6
- package/scripts/gds/package-core.js +5 -116
- package/scripts/gds/provision-config.js +2 -2
- package/scripts/gds/provision-net.js +2 -3
- package/scripts/gds/provision.js +9 -9
- package/scripts/gds/publish-manifest.js +1 -2
- package/scripts/gds/regen-instance-docs.js +1 -1
- package/scripts/gds/run-unit-tests.js +2 -16
- package/scripts/gds/sandbox-stage.js +39 -341
- package/scripts/gds/ship-flow.js +6 -6
- package/scripts/gds/ship-land.js +3 -4
- package/scripts/gds/ship-regen.js +10 -41
- package/scripts/gds/ship.js +4 -24
- package/scripts/gds/start.js +0 -15
- package/scripts/hall-preview/README.md +5 -5
- package/scripts/hall-preview/server.js +6 -6
- package/scripts/render-diagrams.sh +1 -1
- package/src/bongos/api-errors.js +1 -1
- package/src/bongos/auth-github.js +2 -3
- package/src/bongos/auth.js +51 -126
- package/src/bongos/db-kernel.js +2 -3
- package/src/bongos/db.js +5 -28
- package/src/bongos/module-scope-map.js +14 -29
- package/src/bongos/module-store.js +141 -0
- package/src/bongos/route-rank-check.js +3 -16
- package/src/bongos/routes/auth.js +0 -116
- package/src/bongos/routes/builders.js +5 -15
- package/src/bongos/routes/instance.js +8 -14
- package/src/bongos/routes/me.js +6 -22
- package/src/bongos/routes/modules.js +83 -0
- package/src/bongos/routes.js +5 -0
- package/src/module-api.js +13 -6
- package/src/module-loader/catalog.js +3 -0
- package/src/module-loader/loader.js +4 -4
- package/src/module-loader/manifest-schema.js +15 -7
- package/src/module-seams.js +2 -3
- package/src/modules.js +42 -14
- package/tests/agents_spend_guard.mjs +1 -1
- package/tests/api_client.mjs +0 -15
- package/tests/auth_page_gate.mjs +10 -10
- package/tests/canonical_profile_url.mjs +1 -3
- package/tests/claim_action.mjs +4 -1
- package/tests/claim_from_task_and_home.mjs +127 -0
- package/tests/consumer_layout_boot.mjs +2 -0
- package/tests/copy_desk_page_docx.mjs +33 -2
- package/tests/core_upgrade_runner.mjs +6 -6
- package/tests/deploy_divergence_line.mjs +11 -11
- package/tests/diagram_facts_offset.mjs +1 -1
- package/tests/do_api.mjs +106 -0
- package/tests/feedback_latest.mjs +122 -0
- package/tests/fitness.mjs +44 -42
- package/tests/gate_approvals.mjs +0 -1
- package/tests/go_live.mjs +3 -3
- package/tests/government_abuse_matrix.mjs +20 -19
- package/tests/government_ownership_scope.mjs +33 -35
- package/tests/government_parity.mjs +2 -2
- package/tests/government_protected_surfaces.mjs +56 -37
- package/tests/government_require_permission.mjs +3 -3
- package/tests/government_seed.mjs +37 -4
- package/tests/government_session_scope.mjs +92 -366
- package/tests/hall_error_envelope.mjs +4 -0
- package/tests/hall_landing_boot.mjs +4 -1
- package/tests/hall_palette.mjs +1 -16
- package/tests/hall_record_world.mjs +6 -0
- package/tests/hall_tweak_editor.mjs +52 -1
- package/tests/host_topology_skips.mjs +1 -2
- package/tests/html_comment_nesting.mjs +137 -0
- package/tests/infra_exec_paths.mjs +9 -10
- package/tests/init.mjs +4 -5
- package/tests/instance_manifest.mjs +18 -25
- package/tests/kickoff_checklist.mjs +1 -1
- package/tests/lib_sh_resolution.mjs +0 -221
- package/tests/local_preview.mjs +0 -12
- package/tests/module-scope-map.mjs +9 -9
- package/tests/module_catalog.mjs +1 -1
- package/tests/module_cli.mjs +15 -15
- package/tests/module_contributions.mjs +6 -6
- package/tests/module_loader.mjs +6 -6
- package/tests/module_manifest.mjs +13 -4
- package/tests/module_store_publish.mjs +307 -0
- package/tests/module_store_publish_route.mjs +121 -0
- package/tests/module_store_registry_migration.mjs +70 -0
- package/tests/modules.mjs +56 -26
- package/tests/onboarding_route_signals.mjs +21 -31
- package/tests/onboarding_state.mjs +35 -49
- package/tests/permission_path.mjs +0 -3
- package/tests/platform_boot.mjs +1 -2
- package/tests/profile_route.mjs +1 -6
- package/tests/projects_hub.mjs +5 -5
- package/tests/projects_hub_app_step.mjs +138 -0
- package/tests/projects_hub_module_picker.mjs +2 -2
- package/tests/projects_hub_pre_uat.mjs +4 -5
- package/tests/provision.mjs +7 -7
- package/tests/provisioning_starter_bundles.mjs +0 -22
- package/tests/publish_branch_route.mjs +10 -18
- package/tests/publish_manifest.mjs +1 -2
- package/tests/rank_tier_single_source.mjs +1 -13
- package/tests/repo_map.mjs +3 -4
- package/tests/runner_drift.mjs +3 -21
- package/tests/sandbox_stage.mjs +57 -390
- package/tests/session_rename_fallback.mjs +0 -21
- package/tests/ship_error_shape.mjs +1 -1
- package/tests/task_visual_slots.mjs +31 -0
- package/tests/terms_acceptance.mjs +1 -1
- package/tests/upgrade.mjs +4 -4
- package/tests/watch_sealed_floor.mjs +0 -1
- package/tests/wizard_draft_resume.mjs +2 -2
- package/tests/wizard_intent_resume.mjs +21 -10
- package/tests/wizard_preselect_why.mjs +18 -18
- package/docs/onboarding/browser-terminal-guide.md +0 -73
- package/docs/recipes/managed-settings-remote-control.md +0 -416
- package/modules/dev-box/CLAUDE.md +0 -15
- package/modules/dev-box/box-access.js +0 -623
- package/modules/dev-box/box-credential.js +0 -94
- package/modules/dev-box/box-onboard.js +0 -486
- package/modules/dev-box/boxes.js +0 -1038
- package/modules/dev-box/db.js +0 -39
- package/modules/dev-box/module.json +0 -19
- package/modules/dev-box/routes/box.js +0 -1223
- package/scripts/gds/box-auth-check.js +0 -160
- package/scripts/gds/box-infra.js +0 -321
- package/scripts/gds/box-sync.js +0 -216
- package/scripts/gds/box.js +0 -1332
- package/scripts/gds/cf-tunnel.js +0 -558
- package/scripts/gds/smoke-box.sh +0 -150
- package/scripts/gds/tree-preflight.js +0 -241
- package/src/bongos/app-pair.js +0 -172
- package/tests/app_pair.mjs +0 -168
- package/tests/box_access.mjs +0 -578
- package/tests/box_auth_check.mjs +0 -114
- package/tests/box_code_staleness.mjs +0 -129
- package/tests/box_connect_e2e.mjs +0 -196
- package/tests/box_cost.mjs +0 -70
- package/tests/box_credential.mjs +0 -125
- package/tests/box_dns_repoint.mjs +0 -153
- package/tests/box_env.mjs +0 -64
- package/tests/box_host_keys.mjs +0 -126
- package/tests/box_infra_resolve.mjs +0 -246
- package/tests/box_onboard.mjs +0 -317
- package/tests/box_scope_session.mjs +0 -119
- package/tests/box_sweep_docs.mjs +0 -119
- package/tests/box_sync.mjs +0 -55
- package/tests/box_sync_scope_report.mjs +0 -126
- package/tests/box_task_scope.mjs +0 -169
- package/tests/box_task_scope_pause.mjs +0 -66
- package/tests/box_terminal_ssrf.mjs +0 -96
- package/tests/boxes.mjs +0 -1585
- package/tests/cf_ruleset_preflight.mjs +0 -142
- package/tests/cf_tunnel.mjs +0 -496
- package/tests/docs_scrubber_damage.mjs +0 -111
- package/tests/module_scope_active_claims.mjs +0 -94
- package/tests/ship_api_client_pathspec.mjs +0 -100
- package/tests/tree_preflight.mjs +0 -243
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
"key": "memory",
|
|
3
3
|
"title": "Memory & recall",
|
|
4
4
|
"description": "Per-builder session memory, the lexical recall/search retrieval layer (ADR 0060), and durable learnings. A core-domain module carved out of the GDS core in BV1.R72 (ADR 0091); default-on because every instance needs the build system's memory.",
|
|
5
|
+
"version": "1.0.0",
|
|
5
6
|
"coreVersion": "^1.5.0",
|
|
6
7
|
"default": true,
|
|
7
8
|
"maintenance": {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
"key": "npm-release",
|
|
3
3
|
"title": "npm release",
|
|
4
4
|
"description": "The deploy page for a project that publishes an npm package from its GitHub repo — where every recently shipped task has got to (not merged, merged, in a version, live, released) and each version's list of work, read from the release notes the package itself carries (task 1002622) — and the same line on a task's own page (task 1004301). Built for the Bongos hall, which publishes @bongos/core; off everywhere else.",
|
|
5
|
+
"version": "1.0.0",
|
|
5
6
|
"coreVersion": "^1.19.0",
|
|
6
7
|
"default": false,
|
|
7
8
|
"author": "Cloud Bongos",
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
"key": "onboarding",
|
|
3
3
|
"title": "Onboarding (admission · setup · newcomer floor)",
|
|
4
4
|
"description": "The newcomer ADMISSION + ORIENTATION domain — the public access-request → Archon-approval gate, the server-ticked onboarding state machine (the 'Path into the City' checklist that graduates a Xenos to Thetes), the friction analyzer (feedback-without-asking on consented onboarding transcripts), and the evergreen newcomer-chore restock (a fresh first-builder task is always waiting). A core-domain module carved out of the GDS core in BV1.R81 (ADR 0093 §1); default-on because every instance onboards its own builders. The access-requests admission routes mount here; the core lifecycle (db.js claim/ship), auth callbacks, and the me/builders profile readers resolve the `onboarding` kernel PORT for the state-machine + restock surface they need — never importing the module.",
|
|
5
|
+
"version": "1.0.0",
|
|
5
6
|
"coreVersion": "^1.19.532",
|
|
6
7
|
"default": true,
|
|
7
8
|
"maintenance": { "status": "core-maintained" },
|
|
@@ -81,8 +81,8 @@ const ALL_STAGES = [...STAGES, GRADUATED];
|
|
|
81
81
|
|
|
82
82
|
// The pre-auth, INFORMATIONAL step that sits AHEAD of auth_complete (task 470).
|
|
83
83
|
// The state machine's first ENGINE stage is auth_complete, but the genuine
|
|
84
|
-
// first action a newcomer takes is "obtain the repo" — clone it locally
|
|
85
|
-
//
|
|
84
|
+
// first action a newcomer takes is "obtain the repo" — clone it locally. That
|
|
85
|
+
// step is manual/external
|
|
86
86
|
// (there is no server event for it) and intentionally NOT a member of STAGES, so
|
|
87
87
|
// it never gates graduation, never advances current_stage, and never appears in
|
|
88
88
|
// shapeForApi's tracked checklist. It exists purely so the system's own model of
|
|
@@ -92,7 +92,7 @@ const ALL_STAGES = [...STAGES, GRADUATED];
|
|
|
92
92
|
const PRE_AUTH_STEP = {
|
|
93
93
|
id: 'obtain_repo',
|
|
94
94
|
label: 'Obtain the repo',
|
|
95
|
-
hint: 'Clone the project to thy machine
|
|
95
|
+
hint: 'Clone the project to thy machine. The build commands live inside the repo, so this comes first.',
|
|
96
96
|
informational: true,
|
|
97
97
|
};
|
|
98
98
|
|
|
@@ -126,10 +126,10 @@ const STAGE_LABELS = {
|
|
|
126
126
|
// onboarding model never named that step, so the hint now points at it ahead of
|
|
127
127
|
// the sign-in itself. See PRE_AUTH_STEP below for the standalone representation.
|
|
128
128
|
const STAGE_HINTS = {
|
|
129
|
-
auth_complete: 'First obtain the repo — clone it
|
|
129
|
+
auth_complete: 'First obtain the repo — clone it — then sign in via GitHub Device Flow or the web sign-in.',
|
|
130
130
|
pick_disciplines: 'Pick the work that calls thee — engineer, artist, ideator, or any mix.',
|
|
131
131
|
first_start: 'Run /builder-start to see claimable works.',
|
|
132
|
-
first_claim: 'Claim a task with /builder-claim N —
|
|
132
|
+
first_claim: 'Claim a task with /builder-claim N — it is thine alone until thou shippest it.',
|
|
133
133
|
ship_three: 'Carry three tasks through with /builder-ship — the third makes thee a Thetes.',
|
|
134
134
|
graduated: '',
|
|
135
135
|
};
|
|
@@ -147,28 +147,16 @@ function isKnownStage(stage) {
|
|
|
147
147
|
// hall renders — a short, action-only orientation path for a brand-new Xenos.
|
|
148
148
|
// Every step auto-detects (#777, per Lars: no manual ticks — "the city watches"):
|
|
149
149
|
//
|
|
150
|
-
// 1.
|
|
151
|
-
// their dev box, i.e. a running `claude` process is seen
|
|
152
|
-
// on the box. Backed by builder_boxes.first_connected_at
|
|
153
|
-
// (stamped write-once by boxes.bumpActivity on the first
|
|
154
|
-
// claude_active=true heartbeat); passed in as
|
|
155
|
-
// `boxConnected` (boxes.hasEverConnected). FIRST because
|
|
156
|
-
// nothing else can happen until the box works — its hint
|
|
157
|
-
// points the newcomer at the welcome panel's setup steps
|
|
158
|
-
// (#823). `source: 'box'`.
|
|
159
|
-
// 2. join_discord — cleared by a live Discord link (discord.linked). The
|
|
150
|
+
// 1. join_discord — cleared by a live Discord link (discord.linked). The
|
|
160
151
|
// hall's "Connect Discord & join" button runs the
|
|
161
152
|
// existing OAuth flow (auto-join + rank role); linking
|
|
162
153
|
// clears the step. `source: 'discord'`.
|
|
163
|
-
//
|
|
164
|
-
//
|
|
165
|
-
// (ran /builder-setup,
|
|
166
|
-
//
|
|
167
|
-
//
|
|
168
|
-
//
|
|
169
|
-
// box; setup signs the GDS in so /builder-* works (Lars,
|
|
170
|
-
// #823: "both have a place"). `source: 'cli'`.
|
|
171
|
-
// 5. ship_three — the real engine stage. Auto, live "N of 3" counter,
|
|
154
|
+
// 2. pick_disciplines — the real engine stage, cleared by the craft picker.
|
|
155
|
+
// 3. cli_setup — cleared once the builder has authenticated the CLI
|
|
156
|
+
// (ran /builder-setup, which mints a source='cli'
|
|
157
|
+
// session). Detected via db.hasCliSession; passed in as
|
|
158
|
+
// `cliAuthed`. `source: 'cli'`.
|
|
159
|
+
// 4. ship_three — the real engine stage. Auto, live "N of 3" counter,
|
|
172
160
|
// clears at 3 ships (= the xenos->thetes promotion).
|
|
173
161
|
//
|
|
174
162
|
// The old 'auth_complete' (GitHub web sign-in) is intentionally NOT shown — a
|
|
@@ -181,7 +169,6 @@ function isKnownStage(stage) {
|
|
|
181
169
|
// derive `cleared` for each step. NONE of these are members of STAGES, so none
|
|
182
170
|
// affect nextStage/graduation — they are display-only.
|
|
183
171
|
const DISPLAY_STEPS = [
|
|
184
|
-
{ id: 'box_connect', source: 'box' },
|
|
185
172
|
{ id: 'join_discord', source: 'discord' },
|
|
186
173
|
{ id: 'pick_disciplines', source: 'stage' },
|
|
187
174
|
{ id: 'cli_setup', source: 'cli' },
|
|
@@ -189,18 +176,16 @@ const DISPLAY_STEPS = [
|
|
|
189
176
|
];
|
|
190
177
|
|
|
191
178
|
const DISPLAY_LABELS = {
|
|
192
|
-
box_connect: 'Connect to thy dev box',
|
|
193
179
|
join_discord: 'Join the Discord server',
|
|
194
180
|
pick_disciplines: 'Choose thy craft — engineer, artist, or ideator',
|
|
195
|
-
cli_setup: 'Run /builder-setup
|
|
181
|
+
cli_setup: 'Run /builder-setup',
|
|
196
182
|
ship_three: 'Ship three works — and rise to Thetes',
|
|
197
183
|
};
|
|
198
184
|
|
|
199
185
|
const DISPLAY_HINTS = {
|
|
200
|
-
box_connect: 'Follow the steps in the welcome scroll above to get Claude running on thy dev box — this ticks itself the moment thou art connected.',
|
|
201
186
|
join_discord: 'Connect Discord — thou art auto-joined to the city\'s server and given thy rank.',
|
|
202
187
|
pick_disciplines: 'Pick the work that calls thee — engineer, artist, ideator, or any mix.',
|
|
203
|
-
cli_setup: 'Sign the
|
|
188
|
+
cli_setup: 'Sign the CLI in with /builder-setup — this ticks itself once thou art signed in.',
|
|
204
189
|
ship_three: 'Carry three tasks through with /builder-ship — the third makes thee a Thetes.',
|
|
205
190
|
};
|
|
206
191
|
|
|
@@ -454,25 +439,21 @@ function stageDetail(stageId, shipCount) {
|
|
|
454
439
|
// → the counter isn't rendered.
|
|
455
440
|
// opts.discordLinked — whether the builder has a live Discord link. Clears the
|
|
456
441
|
// 'join_discord' step (the OAuth flow sets the link).
|
|
457
|
-
// opts.boxConnected — whether the builder's dev box has ever reported a live
|
|
458
|
-
// Claude process (boxes.hasEverConnected → first_connected_at).
|
|
459
|
-
// Clears the 'box_connect' step (#823).
|
|
460
442
|
// opts.cliAuthed — whether the builder has ever authenticated the GDS CLI
|
|
461
443
|
// (db.hasCliSession). Clears the 'cli_setup' step.
|
|
462
|
-
function shapeForApi(state, { shipCount = null, discordLinked = false,
|
|
444
|
+
function shapeForApi(state, { shipCount = null, discordLinked = false, cliAuthed = false } = {}) {
|
|
463
445
|
const completed = new Set((state && state.completed_stages) || []);
|
|
464
446
|
const currentReal = (state && state.current_stage) || STAGES[0];
|
|
465
447
|
const graduated = currentReal === GRADUATED;
|
|
466
448
|
|
|
467
449
|
// Per-step cleared resolution, by `source`. 'stage' mirrors hasCleared (in
|
|
468
|
-
// completed_stages, OR the engine advanced past it). 'discord'/'
|
|
469
|
-
//
|
|
450
|
+
// completed_stages, OR the engine advanced past it). 'discord'/'cli' derive
|
|
451
|
+
// from live signals passed by the route. A graduated builder has cleared
|
|
470
452
|
// everything by definition (keeps the displayed list coherent even though the
|
|
471
453
|
// panel hides on graduation — a roster/profile read could still surface this).
|
|
472
454
|
const stepCleared = (step) => {
|
|
473
455
|
if (graduated) return true;
|
|
474
456
|
if (step.source === 'discord') return !!discordLinked;
|
|
475
|
-
if (step.source === 'box') return !!boxConnected;
|
|
476
457
|
if (step.source === 'cli') return !!cliAuthed;
|
|
477
458
|
// 'stage'
|
|
478
459
|
if (completed.has(step.id)) return true;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// src/bongos/routes/access-requests.js — onboarding cold-start (2026-05-30).
|
|
2
2
|
//
|
|
3
3
|
// The hall is gated: a brand-new person can't enter until an Archon admits
|
|
4
|
-
// them. Admission is the ONLY gate
|
|
5
|
-
//
|
|
6
|
-
//
|
|
4
|
+
// them. Admission is the ONLY gate sign-in applies — there is no GitHub repo-
|
|
5
|
+
// access / collaborator check in it (2026-06-07). 'invited' just means
|
|
6
|
+
// "Archon-approved for the hall"; the web sign-in (auth.js) checks
|
|
7
7
|
// exactly that one flag. This router is how they ask and how the Archon
|
|
8
8
|
// answers:
|
|
9
9
|
//
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
"key": "platform-identity",
|
|
3
3
|
"title": "Platform identity (hub IdP)",
|
|
4
4
|
"description": "The Cloud Bongos hub identity-provider surface (ADR 0141): platform accounts, an SSO client registry, and an OAuth authorization-code login handoff so one platform account reaches any hosted project's builders hall with no second GitHub sign-in. Identity ONLY — the hub never mints or carries rank/credits/admission (the ADR 0016 trust boundary). Enabled ONLY on the hub instance (cloudbongos.com); ordinary hosted + self-hosted instances leave it off, so it adds zero attack surface for the common case.",
|
|
5
|
+
"version": "1.0.0",
|
|
5
6
|
"coreVersion": "^1.14.0",
|
|
6
7
|
"default": false,
|
|
7
8
|
"author": "Cloud Bongos",
|
|
@@ -87,14 +87,21 @@ function clientSecretValid(client, presentedSecret) {
|
|
|
87
87
|
// Decide whether a RESOLVED hub session may complete the SSO handoff. resolveSession
|
|
88
88
|
// (the raw resolver the browser leg uses so it can redirect-to-sign-in rather than
|
|
89
89
|
// 401) does NOT apply the deny gates requireBuilder does (src/bongos/auth.js) — so
|
|
90
|
-
// this replicates them: a deactivated account (status 'inactive'), a
|
|
91
|
-
//
|
|
92
|
-
//
|
|
93
|
-
//
|
|
90
|
+
// this replicates them: a deactivated account (status 'inactive'), a session whose
|
|
91
|
+
// source the kernel's session-source registry does not declare, and any non-human
|
|
92
|
+
// service principal (system_role set) must NOT federate. Pure + exported so the
|
|
93
|
+
// gate is unit-tested directly. Returns { ok, reason }.
|
|
94
|
+
//
|
|
95
|
+
// FEDERATION_SOURCES mirrors modules/government/session-scopes.json — a module may
|
|
96
|
+
// not read another module's files, and the doorway exports no lookup for it — and
|
|
97
|
+
// tests/platform-identity.mjs pins the two lists equal, so a source declared or
|
|
98
|
+
// retired there without the same edit here fails the build instead of drifting.
|
|
99
|
+
const FEDERATION_SOURCES = Object.freeze(['cli', 'web', null]);
|
|
94
100
|
function sessionUsableForFederation(session) {
|
|
95
101
|
if (!session) return { ok: false, reason: 'no_session' };
|
|
96
102
|
if (session.status === 'inactive') return { ok: false, reason: 'inactive' };
|
|
97
|
-
|
|
103
|
+
const source = session.source === undefined ? null : session.source;
|
|
104
|
+
if (!FEDERATION_SOURCES.includes(source)) return { ok: false, reason: 'session_scope' };
|
|
98
105
|
if (session.system_role) return { ok: false, reason: 'service_principal' };
|
|
99
106
|
return { ok: true, reason: null };
|
|
100
107
|
}
|
|
@@ -1395,6 +1402,7 @@ module.exports = {
|
|
|
1395
1402
|
clientSecretValid,
|
|
1396
1403
|
redirectUriAllowed,
|
|
1397
1404
|
sessionUsableForFederation,
|
|
1405
|
+
FEDERATION_SOURCES,
|
|
1398
1406
|
safeAvatarUrl,
|
|
1399
1407
|
// accounts
|
|
1400
1408
|
upsertAccount,
|
|
@@ -265,8 +265,8 @@ module.exports = function ssoRoutes() {
|
|
|
265
265
|
}
|
|
266
266
|
const msg = usable.reason === 'inactive'
|
|
267
267
|
? 'This account is no longer active. Ask an Archon on the hub if you believe this is an error.'
|
|
268
|
-
: usable.reason === '
|
|
269
|
-
? '
|
|
268
|
+
: usable.reason === 'session_scope'
|
|
269
|
+
? 'This kind of session cannot be used for cross-project sign-in. Sign in from a browser or run /builder-reauth.'
|
|
270
270
|
: 'This session type cannot be used for cross-project sign-in.';
|
|
271
271
|
return res.status(403).type('text/html').send(errorPage(msg));
|
|
272
272
|
}
|
|
@@ -119,9 +119,23 @@ t('a deactivated account may NOT federate (mirrors requireBuilder status gate)',
|
|
|
119
119
|
assert.deepEqual(r, { ok: false, reason: 'inactive' });
|
|
120
120
|
});
|
|
121
121
|
|
|
122
|
-
t('a dev-box
|
|
123
|
-
|
|
124
|
-
|
|
122
|
+
t('a session of an undeclared source (a leftover dev-box token) may NOT federate', () => {
|
|
123
|
+
for (const source of ['box', 'not-a-source']) {
|
|
124
|
+
const r = P.sessionUsableForFederation({ github_id: 1, status: 'active', source });
|
|
125
|
+
assert.deepEqual(r, { ok: false, reason: 'session_scope' }, source);
|
|
126
|
+
}
|
|
127
|
+
// cli, web and the legacy sourceless row still federate.
|
|
128
|
+
for (const source of ['cli', 'web', null, undefined]) {
|
|
129
|
+
assert.equal(P.sessionUsableForFederation({ github_id: 1, status: 'active', source }).ok, true, String(source));
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
t('FEDERATION_SOURCES is exactly the kernel session-source registry', () => {
|
|
134
|
+
// platform-identity may not read the government module, so it mirrors the list;
|
|
135
|
+
// this pin is what stops the copy drifting from modules/government/session-scopes.json.
|
|
136
|
+
const reg = JSON.parse(readFileSync(new URL('../../government/session-scopes.json', import.meta.url), 'utf8'));
|
|
137
|
+
const declared = reg.scopes.map((r) => (r.source === undefined ? null : r.source));
|
|
138
|
+
assert.deepEqual([...P.FEDERATION_SOURCES].sort(), declared.sort());
|
|
125
139
|
});
|
|
126
140
|
|
|
127
141
|
t('a service principal (system_role set) may NOT federate', () => {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
"key": "provisioning",
|
|
3
3
|
"title": "Instance provisioning",
|
|
4
4
|
"description": "Stand up + operate a Cloud Bongos instance's own infrastructure (server, database, domain, DNS, TLS) via the API, so an owner does not manage infra by hand (ADR 0111). Owns the web-tier REQUEST + STATE surface only: it enqueues provisioning intents + reads instance state \u2014 it holds NO cloud-provider tokens and calls NO cloud API. A separate control-plane runner (scripts/gds/provision.js, task P3) is the sole token-holder that drains the intents. Distinct from the `hosting` module (ADR 0092), which brokers compute WORKLOADS.",
|
|
5
|
+
"version": "1.0.0",
|
|
5
6
|
"coreVersion": "^1.14.0",
|
|
6
7
|
"default": false,
|
|
7
8
|
"author": "Cloud Bongos",
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
// intents. The control-plane runner (scripts/gds/provision.js, task P3) is the sole
|
|
8
8
|
// token-holder that drains provisioning_intents and does the real infra work.
|
|
9
9
|
//
|
|
10
|
-
// `db` is dependency-INJECTED (passed in as the first arg),
|
|
11
|
-
//
|
|
10
|
+
// `db` is dependency-INJECTED (passed in as the first arg), so this file has NO
|
|
11
|
+
// core require and is trivially
|
|
12
12
|
// unit-testable with a fake `{ query }`. The route factory passes the doorway pool.
|
|
13
13
|
'use strict';
|
|
14
14
|
|
|
@@ -75,21 +75,6 @@ const ALWAYS_ON_CORE = Object.freeze([
|
|
|
75
75
|
// own npm package is a later, deliberate removal from this list — with picker copy.
|
|
76
76
|
const HUB_ONLY_MODULES = Object.freeze(['platform-identity', 'provisioning', 'npm-release']);
|
|
77
77
|
|
|
78
|
-
// Modules that were once offered and are being WITHDRAWN. A retired key is still
|
|
79
|
-
// a module on disk — its manifest, routes and tables are deleted by later tasks —
|
|
80
|
-
// but it must stop being OFFERED the moment the withdrawal starts, or an owner
|
|
81
|
-
// creating a project today opts into something that is on its way out.
|
|
82
|
-
//
|
|
83
|
-
// WHY A LIST AND NOT JUST DELETING THE ROW. The integrity test below pins
|
|
84
|
-
// OPTIONAL_MODULES against the on-disk `default: false` manifests, so that a new
|
|
85
|
-
// opt-in module cannot ship without owner-facing copy. Dropping a row while its
|
|
86
|
-
// manifest is still on disk would trip exactly that guard. Naming the withdrawal
|
|
87
|
-
// keeps the guard honest in both directions: the catalog may omit a RETIRED
|
|
88
|
-
// module and may omit nothing else. The entry is deleted when the module is
|
|
89
|
-
// (goal 1000091, task 1003892) — at which point the manifest is gone and the
|
|
90
|
-
// plain drift check covers it again.
|
|
91
|
-
const RETIRED_MODULES = Object.freeze(['dev-box']);
|
|
92
|
-
|
|
93
78
|
// The OPT-IN catalog as the creation picker renders it (BV1.R20, task 1002339):
|
|
94
79
|
// every module an owner may actually choose, in the order the picker lists them,
|
|
95
80
|
// with copy written for someone who has met none of them.
|
|
@@ -159,9 +144,7 @@ const OPTIONAL_MODULE_KEYS = Object.freeze(OPTIONAL_MODULES.map((m) => m.key));
|
|
|
159
144
|
//
|
|
160
145
|
// Deliberately tiny: ADR 0237 already made the per-type preset the opinion, and
|
|
161
146
|
// today's opt-in catalog is two modules wide — so this table's job is to correct
|
|
162
|
-
// a preset the owner's answer contradicts, not to re-derive it.
|
|
163
|
-
// added and removed `dev-box` by team shape went with the module (task 1003886):
|
|
164
|
-
// a rule about a module nobody can select adjusts nothing.
|
|
147
|
+
// a preset the owner's answer contradicts, not to re-derive it.
|
|
165
148
|
//
|
|
166
149
|
// A rule may only ever name an OPT-IN module. Adding or removing an always-on one
|
|
167
150
|
// would be a toggle that toggles nothing (ADR 0237 §3's argument, and
|
|
@@ -193,10 +176,8 @@ const RULED_TEAM_SHAPES = Object.freeze([...new Set(TEAM_SHAPE_RULES.map((r) =>
|
|
|
193
176
|
// The lists are SHORT on purpose. A preselect an owner has to audit is worse than
|
|
194
177
|
// none, and today's opt-in catalog is genuinely small (`agents`, `discord`); a
|
|
195
178
|
// bundle grows as the catalog does, which is exactly why this is a declaration and
|
|
196
|
-
// not a rule engine.
|
|
197
|
-
//
|
|
198
|
-
// bundles one module wide, which is the floor working as intended, not a gap to
|
|
199
|
-
// backfill with a module an owner did not ask for.
|
|
179
|
+
// not a rule engine. A bundle one module wide is the floor working as intended,
|
|
180
|
+
// not a gap to backfill with a module an owner did not ask for.
|
|
200
181
|
const STARTER_BUNDLES = Object.freeze({
|
|
201
182
|
game: Object.freeze({
|
|
202
183
|
label: 'Game starter',
|
|
@@ -287,8 +268,8 @@ function adjustBundle(bundle, teamShape) {
|
|
|
287
268
|
for (const rule of TEAM_SHAPE_RULES) {
|
|
288
269
|
if (rule.teamShape !== teamShape) continue;
|
|
289
270
|
if (rule.effect === 'add' && !held.has(rule.module)) held.add(rule.module);
|
|
290
|
-
// `remove` is declared but named by no live rule
|
|
291
|
-
//
|
|
271
|
+
// `remove` is declared but named by no live rule today. Kept for the next
|
|
272
|
+
// rule that needs it.
|
|
292
273
|
else if (rule.effect === 'remove' && held.has(rule.module)) held.delete(rule.module);
|
|
293
274
|
else continue;
|
|
294
275
|
adjustments.push({ rule: rule.id, effect: rule.effect, module: rule.module, reason: rule.reason });
|
|
@@ -404,7 +385,6 @@ function effectiveModules(row) {
|
|
|
404
385
|
module.exports = {
|
|
405
386
|
ALWAYS_ON_CORE,
|
|
406
387
|
HUB_ONLY_MODULES,
|
|
407
|
-
RETIRED_MODULES,
|
|
408
388
|
OPTIONAL_MODULES,
|
|
409
389
|
STARTER_BUNDLES,
|
|
410
390
|
TEAM_SHAPE_RULES,
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
"key": "public-landing",
|
|
3
3
|
"title": "The front door",
|
|
4
4
|
"description": "The instance's public front door served at the APEX ROOT — the landing page (/), the projects hub (/projects, and the /create redirect into its ?view=new wizard), the three footer doors (/privacy, /terms, /contact) and every asset behind them. The third WEB-SURFACE core-domain module after status-ui (BV1.R84) and hall-ui (BV1.R85), carved in task 1003322 (ADR 0218; named in ADR 0197 §8 — the front door keeps its own key, because a customer of the ui-design capability is not part of it). default-on: an instance ships its front door like it ships its hall. Registers no port and contributes no routes — it declares a webSurface, and where hall-ui and status-ui name a Host PREFIX this one declares apexRoot:true, since the apex is whatever host is left once the subdomains are taken (ADR 0218 §2; host:\"\" is rejected, because every host string startsWith \"\"). Like the hall, the declaration is the discovery + scope-map + window.__MODULES__ record: the bytes are served by platform-server.js's dedicated landing block, which keeps the apex-only sentinel strip, the branding-token stamp and the ?v= content stamp and only re-points its root at this module's public/ dir. Disabling the module removes the front door outright — the apex then answers the game-less 404 tail. The world it renders (DESIGN.md, the token contract, the direction records) is the INSTANCE's; the method for building one stays in modules/ui-design/.",
|
|
5
|
+
"version": "1.0.0",
|
|
5
6
|
"coreVersion": "^1.19.0",
|
|
6
7
|
"default": true,
|
|
7
8
|
"maintenance": { "status": "core-maintained" },
|
|
@@ -1598,7 +1598,7 @@ p.sec-p{font-size:var(--fs-lede);font-weight:500;color:var(--ink-soft);line-heig
|
|
|
1598
1598
|
/* the six-step strip as the rail: six hairlines, a 7px dot, one lit step on the
|
|
1599
1599
|
accent with its halo, the number in the display voice, the name in the label
|
|
1600
1600
|
face; a step already answered (role=button) stays a way back */
|
|
1601
|
-
#view-new .steps{display:grid;grid-template-columns:repeat(
|
|
1601
|
+
#view-new .steps{display:grid;grid-template-columns:repeat(8,1fr);gap:0 10px;align-items:start;margin:0 0 40px;}
|
|
1602
1602
|
#view-new .steps li{display:block;position:relative;border-top:1px solid var(--rule);padding:12px 0 0;gap:0;}
|
|
1603
1603
|
#view-new .steps li::before{content:"";position:absolute;top:-4px;left:0;right:auto;width:7px;height:7px;margin:0;border-radius:50%;border:1px solid var(--rule);background:var(--bg);}
|
|
1604
1604
|
#view-new .steps .snum{display:block;width:auto;height:auto;border:0;border-radius:0;background:none;font-family:var(--font-display);font-weight:300;font-size:22px;letter-spacing:-.02em;line-height:1.1;color:var(--ink-faint);margin-bottom:2px;}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
6
|
<!-- Server-stamped like index.html and projects.html (task 1003251): the {{…}}
|
|
7
7
|
tokens are filled by landingPage() (src/platform-server.js) from the
|
|
8
|
-
instance's own branding, and every
|
|
8
|
+
instance's own branding, and every apex-only:start/end region is REMOVED off
|
|
9
9
|
the hub — a claim about the platform must not ship in a child project's
|
|
10
10
|
page (task 1002748). The baked values are the NEUTRAL pack's.
|
|
11
11
|
Both doors here are token-stamped: a pack that names no repository loses
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
6
|
<!-- Server-stamped like index.html and projects.html (task 1003251): the {{…}}
|
|
7
7
|
tokens are filled by landingPage() (src/platform-server.js) from the
|
|
8
|
-
instance's own branding, and every
|
|
8
|
+
instance's own branding, and every apex-only:start/end region is REMOVED off
|
|
9
9
|
the hub — a claim about the platform must not ship in a child project's
|
|
10
10
|
page (task 1002748). The baked values are the NEUTRAL pack's. -->
|
|
11
11
|
<title>{{productName}} — Privacy</title>
|