@bongos/core 1.19.205 → 1.19.207
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 +46 -36
- package/.claude/skills/new-project/SKILL.md +3 -1
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +4 -0
- package/clients/bongos-client/index.cjs +4 -0
- package/clients/bongos-client/index.d.ts +8 -1
- package/clients/bongos-client/index.mjs +4 -0
- package/docs/adr/0055-server-mediated-branch-publish.md +2 -0
- package/docs/adr/0133-github-app-manifest-onboarding-signin.md +2 -2
- package/docs/api/openapi.json +160 -5
- package/docs/api-reference.md +4 -2
- package/docs/recipes/ops-gotchas.md +8 -1
- package/modules/dev-box/app/src/vendor/bongos-client.cjs +4 -0
- package/modules/lifecycle/github-push.js +130 -18
- package/modules/lifecycle/publish-reconciler.js +44 -1
- package/modules/lifecycle/routes/tasks.js +21 -4
- package/modules/provisioning/migrations/provisioning_009_project_settings.sql +19 -0
- package/modules/provisioning/onboard-plan.js +1 -0
- package/modules/provisioning/provisioning.js +59 -10
- package/modules/provisioning/routes/provisioning.js +67 -0
- package/modules/provisioning/tests/provisioning.mjs +43 -3
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/public-landing/projects.html +19 -2
- package/scripts/gds/onboard.js +11 -3
- package/scripts/gds/provision.js +27 -4
- package/src/module-api.js +5 -1
- package/tests/onboard.mjs +5 -1
- package/tests/provision.mjs +30 -2
- package/tests/provisioning_settings.mjs +200 -0
- package/tests/publish_branch_route.mjs +153 -2
- package/tests/publish_reconciler.mjs +63 -0
package/.bongos-core.json
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.19.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.207",
|
|
6
|
+
"core_contract": "1.19.207",
|
|
7
|
+
"source_commit": "f67179175e23c7d9144c3ede28fd365783eed34f",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-
|
|
9
|
+
"built_at": "2026-08-17T20:29:20.492Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 310,
|
|
13
13
|
"agent_docs_stubbed": 21,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 1298,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 1629,
|
|
20
|
+
"tree_sha256": "fb6abbc6818ae6e399e4154a08816d3aeeaf4d9cd65ab89ff1bb3ce3f33428b5",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
{
|
|
188
188
|
"path": ".claude/skills/new-project/SKILL.md",
|
|
189
189
|
"mode": "0000644",
|
|
190
|
-
"sha256": "
|
|
190
|
+
"sha256": "9b36d441850c335fa634d892088e4c15a2a87acaa9e52808b74a8b2e6e9af39f"
|
|
191
191
|
},
|
|
192
192
|
{
|
|
193
193
|
"path": ".claude/skills/otb-character-review/SKILL.md",
|
|
@@ -347,12 +347,12 @@
|
|
|
347
347
|
{
|
|
348
348
|
"path": "clients/bongos-client/README.md",
|
|
349
349
|
"mode": "0000644",
|
|
350
|
-
"sha256": "
|
|
350
|
+
"sha256": "2755203dec4a1450c5950c39a767bc093d1d1227f952193001cdfa94205e995f"
|
|
351
351
|
},
|
|
352
352
|
{
|
|
353
353
|
"path": "clients/bongos-client/bongos-client.global.js",
|
|
354
354
|
"mode": "0000644",
|
|
355
|
-
"sha256": "
|
|
355
|
+
"sha256": "7b4e5ecf6c6d12a3c9e603a0f5b4bd28ba8cd991399ed8941181b6aeae53772d"
|
|
356
356
|
},
|
|
357
357
|
{
|
|
358
358
|
"path": "clients/bongos-client/examples/hello-world.mjs",
|
|
@@ -362,17 +362,17 @@
|
|
|
362
362
|
{
|
|
363
363
|
"path": "clients/bongos-client/index.cjs",
|
|
364
364
|
"mode": "0000644",
|
|
365
|
-
"sha256": "
|
|
365
|
+
"sha256": "a92355ef21073634500f6806f1e495c955a0b67e889cf07264ed8d1169b119be"
|
|
366
366
|
},
|
|
367
367
|
{
|
|
368
368
|
"path": "clients/bongos-client/index.d.ts",
|
|
369
369
|
"mode": "0000644",
|
|
370
|
-
"sha256": "
|
|
370
|
+
"sha256": "8fe97a3daefdceb9bf40a15a19dffb81fb6387c0acbe20041e58e63b24e80dd1"
|
|
371
371
|
},
|
|
372
372
|
{
|
|
373
373
|
"path": "clients/bongos-client/index.mjs",
|
|
374
374
|
"mode": "0000644",
|
|
375
|
-
"sha256": "
|
|
375
|
+
"sha256": "adb2a36a9598c543adbf7c8011f36585f7c394bac7f4961718359ee7a29cb1dd"
|
|
376
376
|
},
|
|
377
377
|
{
|
|
378
378
|
"path": "clients/bongos-client/package.json",
|
|
@@ -707,7 +707,7 @@
|
|
|
707
707
|
{
|
|
708
708
|
"path": "docs/adr/0055-server-mediated-branch-publish.md",
|
|
709
709
|
"mode": "0000644",
|
|
710
|
-
"sha256": "
|
|
710
|
+
"sha256": "11ee013554922e0f9dadb582373c22d4aaa6433ddcb14af28386c4843a39497f"
|
|
711
711
|
},
|
|
712
712
|
{
|
|
713
713
|
"path": "docs/adr/0056-prod-deploy-script-mirror-and-healthcheck-retry.md",
|
|
@@ -1137,7 +1137,7 @@
|
|
|
1137
1137
|
{
|
|
1138
1138
|
"path": "docs/adr/0133-github-app-manifest-onboarding-signin.md",
|
|
1139
1139
|
"mode": "0000644",
|
|
1140
|
-
"sha256": "
|
|
1140
|
+
"sha256": "dbd5b30d75631ba2754f4e7da0d43c03b1ed998b4082e8df23de0d7e7d5c5305"
|
|
1141
1141
|
},
|
|
1142
1142
|
{
|
|
1143
1143
|
"path": "docs/adr/0134-private-first-npm-distribution.md",
|
|
@@ -1367,12 +1367,12 @@
|
|
|
1367
1367
|
{
|
|
1368
1368
|
"path": "docs/api-reference.md",
|
|
1369
1369
|
"mode": "0000644",
|
|
1370
|
-
"sha256": "
|
|
1370
|
+
"sha256": "52554cf7c8e5355c59594c872f30975581eb6c1b9a5bcb63efa1a1a19f2d3877"
|
|
1371
1371
|
},
|
|
1372
1372
|
{
|
|
1373
1373
|
"path": "docs/api/openapi.json",
|
|
1374
1374
|
"mode": "0000644",
|
|
1375
|
-
"sha256": "
|
|
1375
|
+
"sha256": "825af2c499836301a34cff79192e41556cc863fe9a5378d9e5134c862769c2fa"
|
|
1376
1376
|
},
|
|
1377
1377
|
{
|
|
1378
1378
|
"path": "docs/architecture.md",
|
|
@@ -1672,7 +1672,7 @@
|
|
|
1672
1672
|
{
|
|
1673
1673
|
"path": "docs/recipes/ops-gotchas.md",
|
|
1674
1674
|
"mode": "0000644",
|
|
1675
|
-
"sha256": "
|
|
1675
|
+
"sha256": "d9956abefe8496cbbb8bbc94361431d40823c3a9d1fa8f4145e8b48999b54672"
|
|
1676
1676
|
},
|
|
1677
1677
|
{
|
|
1678
1678
|
"path": "docs/recipes/overnight-builder.md",
|
|
@@ -2682,7 +2682,7 @@
|
|
|
2682
2682
|
{
|
|
2683
2683
|
"path": "modules/dev-box/app/src/vendor/bongos-client.cjs",
|
|
2684
2684
|
"mode": "0000644",
|
|
2685
|
-
"sha256": "
|
|
2685
|
+
"sha256": "a92355ef21073634500f6806f1e495c955a0b67e889cf07264ed8d1169b119be"
|
|
2686
2686
|
},
|
|
2687
2687
|
{
|
|
2688
2688
|
"path": "modules/dev-box/app/test/unit.mjs",
|
|
@@ -3567,7 +3567,7 @@
|
|
|
3567
3567
|
{
|
|
3568
3568
|
"path": "modules/lifecycle/github-push.js",
|
|
3569
3569
|
"mode": "0000644",
|
|
3570
|
-
"sha256": "
|
|
3570
|
+
"sha256": "127b6666bfbc4b85baebe85b0bf5501ad73b517faf4dafbc1a76a5535ac04ebc"
|
|
3571
3571
|
},
|
|
3572
3572
|
{
|
|
3573
3573
|
"path": "modules/lifecycle/goal-advisory.js",
|
|
@@ -3622,7 +3622,7 @@
|
|
|
3622
3622
|
{
|
|
3623
3623
|
"path": "modules/lifecycle/publish-reconciler.js",
|
|
3624
3624
|
"mode": "0000644",
|
|
3625
|
-
"sha256": "
|
|
3625
|
+
"sha256": "1cca02e8eff2b0a7fdc1fa06ad6be2f633e25a29bdd10dddf6147610fdae087a"
|
|
3626
3626
|
},
|
|
3627
3627
|
{
|
|
3628
3628
|
"path": "modules/lifecycle/routes/analytics.js",
|
|
@@ -3662,7 +3662,7 @@
|
|
|
3662
3662
|
{
|
|
3663
3663
|
"path": "modules/lifecycle/routes/tasks.js",
|
|
3664
3664
|
"mode": "0000644",
|
|
3665
|
-
"sha256": "
|
|
3665
|
+
"sha256": "95193b64dcf1121f10fbc871a07cb7997a27a64d3f7b2176957abdae28979729"
|
|
3666
3666
|
},
|
|
3667
3667
|
{
|
|
3668
3668
|
"path": "modules/lifecycle/routes/versions.js",
|
|
@@ -3949,6 +3949,11 @@
|
|
|
3949
3949
|
"mode": "0000644",
|
|
3950
3950
|
"sha256": "8dc04a18ad77563a2bd73029bf13cab03fb5dadd1b62850fddbde475257e6a76"
|
|
3951
3951
|
},
|
|
3952
|
+
{
|
|
3953
|
+
"path": "modules/provisioning/migrations/provisioning_009_project_settings.sql",
|
|
3954
|
+
"mode": "0000644",
|
|
3955
|
+
"sha256": "de17cfb74f8684044abfb03e56698f91fa5aa813608f3a19d2ddf81d113e897e"
|
|
3956
|
+
},
|
|
3952
3957
|
{
|
|
3953
3958
|
"path": "modules/provisioning/module.json",
|
|
3954
3959
|
"mode": "0000644",
|
|
@@ -3957,7 +3962,7 @@
|
|
|
3957
3962
|
{
|
|
3958
3963
|
"path": "modules/provisioning/onboard-plan.js",
|
|
3959
3964
|
"mode": "0000644",
|
|
3960
|
-
"sha256": "
|
|
3965
|
+
"sha256": "de7927d2a3c1aac0d40ec5b1ac6c2e98e87cb593c4d3d2bd6ddfe3696371bff6"
|
|
3961
3966
|
},
|
|
3962
3967
|
{
|
|
3963
3968
|
"path": "modules/provisioning/pollers/liveness-sweep.js",
|
|
@@ -3967,7 +3972,7 @@
|
|
|
3967
3972
|
{
|
|
3968
3973
|
"path": "modules/provisioning/provisioning.js",
|
|
3969
3974
|
"mode": "0000644",
|
|
3970
|
-
"sha256": "
|
|
3975
|
+
"sha256": "b9d4ee116eb4b213b084408868f727a4587876faa5fae78f4d2f64cb2fe12231"
|
|
3971
3976
|
},
|
|
3972
3977
|
{
|
|
3973
3978
|
"path": "modules/provisioning/rate-limit.js",
|
|
@@ -3977,7 +3982,7 @@
|
|
|
3977
3982
|
{
|
|
3978
3983
|
"path": "modules/provisioning/routes/provisioning.js",
|
|
3979
3984
|
"mode": "0000644",
|
|
3980
|
-
"sha256": "
|
|
3985
|
+
"sha256": "78c89017e17dfba57ade2330fce293e6422aab316e9311f8215ff3eb9fdc3fe5"
|
|
3981
3986
|
},
|
|
3982
3987
|
{
|
|
3983
3988
|
"path": "modules/provisioning/tests/liveness.mjs",
|
|
@@ -3987,7 +3992,7 @@
|
|
|
3987
3992
|
{
|
|
3988
3993
|
"path": "modules/provisioning/tests/provisioning.mjs",
|
|
3989
3994
|
"mode": "0000644",
|
|
3990
|
-
"sha256": "
|
|
3995
|
+
"sha256": "3db404b6ad50e01de0b1d73131cefc01ab8fe939eee18157ba6aa8f28a05fb7f"
|
|
3991
3996
|
},
|
|
3992
3997
|
{
|
|
3993
3998
|
"path": "modules/provisioning/ui/.gitkeep",
|
|
@@ -4277,12 +4282,12 @@
|
|
|
4277
4282
|
{
|
|
4278
4283
|
"path": "package-lock.json",
|
|
4279
4284
|
"mode": "0000644",
|
|
4280
|
-
"sha256": "
|
|
4285
|
+
"sha256": "fc64c06226801735546c101af64db40d30492a4ce855303e538bac1111a18930"
|
|
4281
4286
|
},
|
|
4282
4287
|
{
|
|
4283
4288
|
"path": "package.json",
|
|
4284
4289
|
"mode": "0000644",
|
|
4285
|
-
"sha256": "
|
|
4290
|
+
"sha256": "d3457496b5c76bab949eb1693518d88745db75eb7bd3afb4299d68e545cdb0bd"
|
|
4286
4291
|
},
|
|
4287
4292
|
{
|
|
4288
4293
|
"path": "public-docs/index.html",
|
|
@@ -4542,7 +4547,7 @@
|
|
|
4542
4547
|
{
|
|
4543
4548
|
"path": "public-landing/projects.html",
|
|
4544
4549
|
"mode": "0000644",
|
|
4545
|
-
"sha256": "
|
|
4550
|
+
"sha256": "494d1aa1a6ff006a8e8f239c29d90c052f735919937c9dc6fb6b8eeff4902e91"
|
|
4546
4551
|
},
|
|
4547
4552
|
{
|
|
4548
4553
|
"path": "public-landing/world/assets/clouds/cloud-island-large.png",
|
|
@@ -5152,7 +5157,7 @@
|
|
|
5152
5157
|
{
|
|
5153
5158
|
"path": "scripts/gds/onboard.js",
|
|
5154
5159
|
"mode": "0000644",
|
|
5155
|
-
"sha256": "
|
|
5160
|
+
"sha256": "71ee037f1e893a1bcbcaca95e6bdc80c5eb4f5d3e613b59b95e1272d673d3d12"
|
|
5156
5161
|
},
|
|
5157
5162
|
{
|
|
5158
5163
|
"path": "scripts/gds/onboarding-analyze.js",
|
|
@@ -5197,7 +5202,7 @@
|
|
|
5197
5202
|
{
|
|
5198
5203
|
"path": "scripts/gds/provision.js",
|
|
5199
5204
|
"mode": "0000644",
|
|
5200
|
-
"sha256": "
|
|
5205
|
+
"sha256": "242f51c3e2ae991dc8a02d7285c829d3cd7b2a4022c516b218d259cac14b855f"
|
|
5201
5206
|
},
|
|
5202
5207
|
{
|
|
5203
5208
|
"path": "scripts/gds/publish-credential-check.js",
|
|
@@ -5892,7 +5897,7 @@
|
|
|
5892
5897
|
{
|
|
5893
5898
|
"path": "src/module-api.js",
|
|
5894
5899
|
"mode": "0000644",
|
|
5895
|
-
"sha256": "
|
|
5900
|
+
"sha256": "167ead50611054c2a0d46ebb14510c993e7c05e9c86428cad2d15d78aae0bad4"
|
|
5896
5901
|
},
|
|
5897
5902
|
{
|
|
5898
5903
|
"path": "src/module-loader/catalog.js",
|
|
@@ -7377,7 +7382,7 @@
|
|
|
7377
7382
|
{
|
|
7378
7383
|
"path": "tests/onboard.mjs",
|
|
7379
7384
|
"mode": "0000644",
|
|
7380
|
-
"sha256": "
|
|
7385
|
+
"sha256": "c6823a6f0f81bcb4f01ccbd2364d6dcf76eb21e3ff10972738f792438939dee0"
|
|
7381
7386
|
},
|
|
7382
7387
|
{
|
|
7383
7388
|
"path": "tests/onboarding_gate.mjs",
|
|
@@ -7517,7 +7522,7 @@
|
|
|
7517
7522
|
{
|
|
7518
7523
|
"path": "tests/provision.mjs",
|
|
7519
7524
|
"mode": "0000644",
|
|
7520
|
-
"sha256": "
|
|
7525
|
+
"sha256": "30b55efaa97e695603875ec057901d5333977d41705fc862fc831a424c4e2674"
|
|
7521
7526
|
},
|
|
7522
7527
|
{
|
|
7523
7528
|
"path": "tests/provisioning_default_domain.mjs",
|
|
@@ -7539,6 +7544,11 @@
|
|
|
7539
7544
|
"mode": "0000644",
|
|
7540
7545
|
"sha256": "7749df454ac3cca7c7e5ea1acc94ead15d1c9f87b38fe2028a1c93c8adf31bcf"
|
|
7541
7546
|
},
|
|
7547
|
+
{
|
|
7548
|
+
"path": "tests/provisioning_settings.mjs",
|
|
7549
|
+
"mode": "0000644",
|
|
7550
|
+
"sha256": "bb800d2e15045efbac4fadbc62996054d33e163eb86e6a5e09087d409cc7fbfa"
|
|
7551
|
+
},
|
|
7542
7552
|
{
|
|
7543
7553
|
"path": "tests/provisioning_slug_available.mjs",
|
|
7544
7554
|
"mode": "0000644",
|
|
@@ -7572,7 +7582,7 @@
|
|
|
7572
7582
|
{
|
|
7573
7583
|
"path": "tests/publish_branch_route.mjs",
|
|
7574
7584
|
"mode": "0000644",
|
|
7575
|
-
"sha256": "
|
|
7585
|
+
"sha256": "485b2b965bcf44a515571de43851c42a32f278dcdd02510f0d3cd9f6ac53e61c"
|
|
7576
7586
|
},
|
|
7577
7587
|
{
|
|
7578
7588
|
"path": "tests/publish_manifest.mjs",
|
|
@@ -7582,7 +7592,7 @@
|
|
|
7582
7592
|
{
|
|
7583
7593
|
"path": "tests/publish_reconciler.mjs",
|
|
7584
7594
|
"mode": "0000644",
|
|
7585
|
-
"sha256": "
|
|
7595
|
+
"sha256": "1dfca44ba378b69041894371c1a3765eba40edbdec18570d7b67cc849bcb9e8a"
|
|
7586
7596
|
},
|
|
7587
7597
|
{
|
|
7588
7598
|
"path": "tests/rank_gate.mjs",
|
|
@@ -9,7 +9,7 @@ You are guiding a new owner from **zero to a live, owned Cloud Bongos instance**
|
|
|
9
9
|
|
|
10
10
|
A new instance is **standalone** (ADR 0108): it runs from its **own git repo** with `@cloudbongos/core` installed as a **pinned npm dependency**, not a fork of this monorepo. Central updates are a `bongos upgrade` version-pin bump, not a merge. Every step below assumes this shape (`hosting_shape=standalone`).
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
Five steps are **irreducibly human** and must be rendered as **precise, UI-first, copy-paste-safe prompts** (a non-technical owner does them with browser clicks, no terminal guessing): (1) create the GitHub repo, (2) approve the pre-filled **GitHub App** for sign-in (ONE click — the App Manifest flow, task 2080; no secret to paste), (3) install that App on the repo (ONE click — the publish credential, task 1003049), (4) own a domain, (5) the first sign-in. Everything else is automated. Never ask the owner to do in a terminal what they can do with a click.
|
|
13
13
|
|
|
14
14
|
## The canonical sequence
|
|
15
15
|
|
|
@@ -85,6 +85,8 @@ node scripts/gds/oauth-secret.js place <slug> --client-id <id> --client-secret <
|
|
|
85
85
|
|
|
86
86
|
> **Guidance the standup learned:** do **NOT** hand-edit `web.env` with a shell `read -s` — during the Emersonian standup that silently left a 26-char truncated secret that broke sign-in with no obvious cause. `oauth-secret` validates the length/format (catching that truncation), rewrites the env line via Node, restarts the service, then **probes `/healthz` for `auth_configured:true`** before it reports success. If it refuses, the creds are wrong — recheck them; do not proceed.
|
|
87
87
|
|
|
88
|
+
**Human-only — install the GitHub App on the repo (task 1003049, ADR 0055).** The one-click App doubles as the instance's **publish credential**: the manifest requests Contents rw + PR rw + Actions read, the runner places `GITHUB_APP_ID` + `GITHUB_APP_PRIVATE_KEY` in `web.env`, and the server discovers the installation id on its own — but only an **installed** App can mint push tokens. One click: the wizard's **Install the app on your repo** button (`github.com/apps/<slug>/installations/new`), or GitHub → Settings → Developer settings → GitHub Apps → your app → **Install App** → the project repo. Skip it and every ship strands at `confirmed` behind a manual merge. (Manual OAuth-app path instead? Set a fine-grained `GITHUB_PUSH_TOKEN` in `web.env` — ADR 0055.)
|
|
89
|
+
|
|
88
90
|
**Human-only — first sign-in.** The owner opens `https://<domain>` and signs in with GitHub **once**. This seats the **founding Archon** — config alone seats no one, so this step is inherent and cannot be automated.
|
|
89
91
|
|
|
90
92
|
### 7. Verify
|
|
@@ -5,7 +5,7 @@ A **generated**, zero-dependency typed client for the Bongos API — produced fr
|
|
|
5
5
|
by hand; it regenerates when the spec changes, so it can never drift from the routes.
|
|
6
6
|
|
|
7
7
|
- API version: **v1** (served at `/api/bongos/v1`)
|
|
8
|
-
-
|
|
8
|
+
- 278 operations across 46 resource groups
|
|
9
9
|
|
|
10
10
|
## Install
|
|
11
11
|
|
|
@@ -543,6 +543,10 @@ function createClient(opts = {}) {
|
|
|
543
543
|
postProvisioningInstancesIdForceTeardown: (args) => request("POST", "/provisioning/instances/{id}/force-teardown", { hasBody: true }, args),
|
|
544
544
|
// POST /provisioning/instances/{id}/github-app — rank: any-builder — POST /provisioning/instances/:id/github-app
|
|
545
545
|
postProvisioningInstancesIdGithubApp: (args) => request("POST", "/provisioning/instances/{id}/github-app", { hasBody: true }, args),
|
|
546
|
+
// GET /provisioning/instances/{id}/settings — rank: any-builder — GET /provisioning/instances/:id/settings
|
|
547
|
+
getProvisioningInstancesIdSettings: (args) => request("GET", "/provisioning/instances/{id}/settings", { hasBody: false }, args),
|
|
548
|
+
// PATCH /provisioning/instances/{id}/settings — rank: any-builder — PATCH /provisioning/instances/:id/settings
|
|
549
|
+
patchProvisioningInstancesIdSettings: (args) => request("PATCH", "/provisioning/instances/{id}/settings", { hasBody: true }, args),
|
|
546
550
|
// POST /provisioning/instances/{id}/teardown — rank: any-builder — POST /provisioning/instances/:id/teardown
|
|
547
551
|
postProvisioningInstancesIdTeardown: (args) => request("POST", "/provisioning/instances/{id}/teardown", { hasBody: true }, args),
|
|
548
552
|
// GET /provisioning/onboard-plan — rank: public — GET /provisioning/onboard-plan
|
|
@@ -542,6 +542,10 @@ function createClient(opts = {}) {
|
|
|
542
542
|
postProvisioningInstancesIdForceTeardown: (args) => request("POST", "/provisioning/instances/{id}/force-teardown", { hasBody: true }, args),
|
|
543
543
|
// POST /provisioning/instances/{id}/github-app — rank: any-builder — POST /provisioning/instances/:id/github-app
|
|
544
544
|
postProvisioningInstancesIdGithubApp: (args) => request("POST", "/provisioning/instances/{id}/github-app", { hasBody: true }, args),
|
|
545
|
+
// GET /provisioning/instances/{id}/settings — rank: any-builder — GET /provisioning/instances/:id/settings
|
|
546
|
+
getProvisioningInstancesIdSettings: (args) => request("GET", "/provisioning/instances/{id}/settings", { hasBody: false }, args),
|
|
547
|
+
// PATCH /provisioning/instances/{id}/settings — rank: any-builder — PATCH /provisioning/instances/:id/settings
|
|
548
|
+
patchProvisioningInstancesIdSettings: (args) => request("PATCH", "/provisioning/instances/{id}/settings", { hasBody: true }, args),
|
|
545
549
|
// POST /provisioning/instances/{id}/teardown — rank: any-builder — POST /provisioning/instances/:id/teardown
|
|
546
550
|
postProvisioningInstancesIdTeardown: (args) => request("POST", "/provisioning/instances/{id}/teardown", { hasBody: true }, args),
|
|
547
551
|
// GET /provisioning/onboard-plan — rank: public — GET /provisioning/onboard-plan
|
|
@@ -72,9 +72,10 @@ export interface GetProfilesHandleResponse { account: unknown; cross_project: un
|
|
|
72
72
|
export interface GetProjectsFeaturedResponse { projects: unknown }
|
|
73
73
|
export interface GetProjectsResponse { projects: unknown }
|
|
74
74
|
export interface GetProvisioningFleetResponse { instances: unknown }
|
|
75
|
-
export interface GetProvisioningGithubAppStatusResponse { ok: boolean; status: unknown; ready: unknown; terminal: unknown; domain: unknown; instance_status: unknown }
|
|
75
|
+
export interface GetProvisioningGithubAppStatusResponse { ok: boolean; status: unknown; ready: unknown; terminal: unknown; domain: unknown; instance_status: unknown; app_slug: unknown }
|
|
76
76
|
export interface GetProvisioningHealthResponse { module: unknown; ok: boolean; coreVersion: unknown }
|
|
77
77
|
export interface GetProvisioningInstancesIdResponse { instance: unknown; open_intent: unknown }
|
|
78
|
+
export interface GetProvisioningInstancesIdSettingsResponse { ok: boolean; settings: unknown; options: unknown }
|
|
78
79
|
export interface GetProvisioningInstancesResponse { instances: unknown }
|
|
79
80
|
export interface GetProvisioningOnboardPlanResponse { mode: unknown; steps: unknown }
|
|
80
81
|
export interface GetProvisioningSlugAvailableResponse { slug: unknown; available: unknown; reason: unknown; address: unknown }
|
|
@@ -140,6 +141,8 @@ export interface PatchMeSkillPrefsResponse { prefs: unknown; effective: unknown;
|
|
|
140
141
|
export interface PatchMeSoundPrefsResponse { prefs: unknown; effective: unknown; effective_map: unknown; volume: unknown; defaults: unknown; known_sounds: unknown }
|
|
141
142
|
export interface PatchProjectsIdFeaturedRequest { featured: boolean }
|
|
142
143
|
export interface PatchProjectsIdFeaturedResponse { project: unknown }
|
|
144
|
+
export interface PatchProvisioningInstancesIdSettingsRequest { platform_visibility?: string; joinability?: string }
|
|
145
|
+
export interface PatchProvisioningInstancesIdSettingsResponse { ok: boolean; settings: unknown }
|
|
143
146
|
export interface PatchTasksIdRequest { kind?: string; discipline?: string; requires_rank?: string; module_key?: string; goal_id?: number; parent_task_id?: StringifiableId; parallel_safe?: unknown; newcomer_friendly?: boolean; xenos_claimable?: boolean; security_sensitive?: boolean; automation_tag?: string; needs_migration?: boolean; description?: string; status?: unknown }
|
|
144
147
|
export interface PostAccessRequestsRequest { github_login: string; display_name?: string; note?: string }
|
|
145
148
|
export interface PostAccessRequestsResponse { ok: boolean; request?: unknown; already_pending?: boolean }
|
|
@@ -787,6 +790,10 @@ export interface BongosClient {
|
|
|
787
790
|
postProvisioningInstancesIdForceTeardown(args?: RequestArgs): Promise<PostProvisioningInstancesIdForceTeardownResponse>;
|
|
788
791
|
/** POST /provisioning/instances/{id}/github-app — rank: any-builder */
|
|
789
792
|
postProvisioningInstancesIdGithubApp(args?: RequestArgs & { body?: PostProvisioningInstancesIdGithubAppRequest }): Promise<PostProvisioningInstancesIdGithubAppResponse>;
|
|
793
|
+
/** GET /provisioning/instances/{id}/settings — rank: any-builder */
|
|
794
|
+
getProvisioningInstancesIdSettings(args?: RequestArgs): Promise<GetProvisioningInstancesIdSettingsResponse>;
|
|
795
|
+
/** PATCH /provisioning/instances/{id}/settings — rank: any-builder */
|
|
796
|
+
patchProvisioningInstancesIdSettings(args?: RequestArgs & { body?: PatchProvisioningInstancesIdSettingsRequest }): Promise<PatchProvisioningInstancesIdSettingsResponse>;
|
|
790
797
|
/** POST /provisioning/instances/{id}/teardown — rank: any-builder */
|
|
791
798
|
postProvisioningInstancesIdTeardown(args?: RequestArgs): Promise<PostProvisioningInstancesIdTeardownResponse>;
|
|
792
799
|
/** GET /provisioning/onboard-plan — rank: public */
|
|
@@ -539,6 +539,10 @@ export function createClient(opts = {}) {
|
|
|
539
539
|
postProvisioningInstancesIdForceTeardown: (args) => request("POST", "/provisioning/instances/{id}/force-teardown", { hasBody: true }, args),
|
|
540
540
|
// POST /provisioning/instances/{id}/github-app — rank: any-builder — POST /provisioning/instances/:id/github-app
|
|
541
541
|
postProvisioningInstancesIdGithubApp: (args) => request("POST", "/provisioning/instances/{id}/github-app", { hasBody: true }, args),
|
|
542
|
+
// GET /provisioning/instances/{id}/settings — rank: any-builder — GET /provisioning/instances/:id/settings
|
|
543
|
+
getProvisioningInstancesIdSettings: (args) => request("GET", "/provisioning/instances/{id}/settings", { hasBody: false }, args),
|
|
544
|
+
// PATCH /provisioning/instances/{id}/settings — rank: any-builder — PATCH /provisioning/instances/:id/settings
|
|
545
|
+
patchProvisioningInstancesIdSettings: (args) => request("PATCH", "/provisioning/instances/{id}/settings", { hasBody: true }, args),
|
|
542
546
|
// POST /provisioning/instances/{id}/teardown — rank: any-builder — POST /provisioning/instances/:id/teardown
|
|
543
547
|
postProvisioningInstancesIdTeardown: (args) => request("POST", "/provisioning/instances/{id}/teardown", { hasBody: true }, args),
|
|
544
548
|
// GET /provisioning/onboard-plan — rank: public — GET /provisioning/onboard-plan
|
|
@@ -42,6 +42,8 @@ A **fine-grained GitHub PAT** scoped to the single repo: `Contents: read/write`
|
|
|
42
42
|
>
|
|
43
43
|
> Check it with `node scripts/gds/publish-credential-check.js` on the host — it lists the repo's workflows as a control call first, so `blind` and `readable_no_workflow` are distinguishable. Task 1002724 makes a blind probe non-fatal (the reconciler falls back to the git-history land proof), but a blind credential means the deploy gate is **not being enforced**, only bypassed.
|
|
44
44
|
|
|
45
|
+
> **Update (2026-08-17, task 1003049 — fresh instances get the credential from the manifest App; installation id auto-discovered):** a wizard-born instance had NO publish credential at all — the ADR 0133 manifest requested zero permissions and the conversion's `pem` was discarded — so on every new project the auto-merge + reconciler were dead on arrival and each ship stranded at `confirmed` behind manual archon surgery (gap-list W7, proven live on Spike Harbor). Now: the manifest requests exactly this ADR's scopes (Contents rw + PR rw + Actions read), the control-plane runner places `GITHUB_APP_ID` + `GITHUB_APP_PRIVATE_KEY` into the instance's web.env alongside the OAuth creds, and `github-push.js` **discovers the installation id at runtime** (`GET /repos/{owner}/{repo}/installation` with the App JWT; the env var still wins when set) — so `GITHUB_APP_INSTALLATION_ID` is no longer required. The one human step is installing the App on the repo (the onboarding `app-install` step; the wizard renders the one-click `github.com/apps/<slug>/installations/new` link). <redacted> is a first-class loud state: routes answer a plain-sentence 503 naming the install URL, and the publish-reconciler warns once per streak instead of silently parking ships. **Security trade-off (accepted):** the App is public (the W6 sign-in fix), so third parties can install it on their own repos — those installs sit inside a leaked App key's blast radius even though this server only ever uses its own repo's installation. Mitigation: the reconciler's foreign-install watch (`github-push.foreignInstallations`) warns loudly whenever the App is installed anywhere beyond the repo owner. Pre-existing instances: see the ops-gotchas entry (grant the permissions + generate a key by hand, or use a PAT).
|
|
46
|
+
|
|
45
47
|
## Consequences
|
|
46
48
|
|
|
47
49
|
- A dev-box builder ships end-to-end: `/builder-reauth` → claim → edit → `/builder-stage` ([ADR 0046](<redacted>.md)) → `/builder-ship`, with the GDS doing the push. The box holds no GitHub credential, so the [ADR 0053](0053-scoped-dev-box-session.md) blast-radius argument still holds.
|
|
@@ -31,9 +31,9 @@ The conversion endpoint is unauthenticated (the code is the auth), so the web ti
|
|
|
31
31
|
|
|
32
32
|
### Manifest shape
|
|
33
33
|
|
|
34
|
-
`redirect_url` = the **mothership** callback (the instance can't do the exchange). `callback_urls` = the **instance's** own `/api/gds/auth/web/callback` (what `auth.js` actually builds) **and** the `/api/bongos/...` alias, so sign-in works regardless of which prefix a build emits. `default_permissions: {}`
|
|
34
|
+
`redirect_url` = the **mothership** callback (the instance can't do the exchange). `callback_urls` = the **instance's** own `/api/gds/auth/web/callback` (what `auth.js` actually builds) **and** the `/api/bongos/...` alias, so sign-in works regardless of which prefix a build emits. `default_permissions: { contents: 'write', pull_requests: 'write', actions: 'read' }` — sign-in itself needs none, but the App doubles as the instance's ADR 0055 **publish credential** (task 1003049): the conversion's `pem` + app id land in web.env, and once the owner installs the App on the repo the server mints installation tokens to land shipped work itself. `hook_attributes.active:false`, `public:true`. Personal vs org differs only in the POST URL (derived from the repo owner); the App works for sign-in either way.
|
|
35
35
|
|
|
36
|
-
> **Amended 2026-08-17 (task 1003048, gap-list W6):** the manifest originally set `public:false`. That made every wizard-born project structurally single-builder on the web — GitHub answers a private App's authorize URL for any non-owner account with a bare 404, before the instance is ever involved (reproduced live on Spike Harbor). The App
|
|
36
|
+
> **Amended 2026-08-17 (task 1003048, gap-list W6):** the manifest originally set `public:false`. That made every wizard-born project structurally single-builder on the web — GitHub answers a private App's authorize URL for any non-owner account with a bare 404, before the instance is ever involved (reproduced live on Spike Harbor). The App requested zero permissions at the time, so public cost nothing; the manifest now sets `public:true`. (Task 1003049 later added the ADR 0055 repo scopes, which changes the calculus: a public App with write scopes **can** be installed by third parties on their own repos, and a leaked App private key's blast radius includes those installs — the server itself only ever uses its own repo's installation, but the credential could reach further if compromised. Accepted to keep this fix; mitigated by the publish-reconciler's **foreign-install watch**, which warns loudly whenever the App is installed anywhere beyond the repo owner.) Apps minted before the fix must be flipped by hand (GitHub App settings → Advanced → Make public) — see the ops-gotchas entry.
|
|
37
37
|
|
|
38
38
|
**App name (tasks 2093 → 2095).** GitHub App names are globally unique across all of GitHub, so a bare project slug (e.g. `demo`) is almost always already taken. The auto name is the **instance domain** (e.g. `demo.cloudbongos.com`): a domain is inherently unique (so it never collides) and it reads perfectly on GitHub's sign-in consent screen, where the name is shown as *"`<name>` by `<owner>` … will redirect to `https://<domain>`"* — the name IS the destination. GitHub keeps the dots in the display name (only the internal slug is transformed) and caps it at 34 chars. **Fallback** (no domain, or a domain over 34 chars): brand-qualify the project — `<mothership brand> - <project>`, e.g. `Cloud Bongos - demo`, from the mothership's own `branding().identity.productName` (portable, not hardcoded) — still far less collision-prone than a bare slug. Either way it is only a default the owner can rename on GitHub's confirmation screen.
|
|
39
39
|
|
package/docs/api/openapi.json
CHANGED
|
@@ -8951,6 +8951,119 @@
|
|
|
8951
8951
|
]
|
|
8952
8952
|
}
|
|
8953
8953
|
},
|
|
8954
|
+
"/provisioning/instances/{id}/settings": {
|
|
8955
|
+
"get": {
|
|
8956
|
+
"operationId": "get_provisioning_instances_id_settings",
|
|
8957
|
+
"tags": [
|
|
8958
|
+
"provisioning"
|
|
8959
|
+
],
|
|
8960
|
+
"summary": "GET /provisioning/instances/:id/settings",
|
|
8961
|
+
"description": "GET /provisioning/instances/:id/settings — read a project's effective settings + the allowed values (so a form can render its choices). rank: any authenticated builder (own resource; archon may read any).\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
8962
|
+
"x-rank": "any-builder",
|
|
8963
|
+
"x-source": "modules/provisioning/routes/provisioning.js",
|
|
8964
|
+
"parameters": [
|
|
8965
|
+
{
|
|
8966
|
+
"name": "id",
|
|
8967
|
+
"in": "path",
|
|
8968
|
+
"required": true,
|
|
8969
|
+
"schema": {
|
|
8970
|
+
"type": "string"
|
|
8971
|
+
},
|
|
8972
|
+
"description": "Path parameter `id`."
|
|
8973
|
+
}
|
|
8974
|
+
],
|
|
8975
|
+
"responses": {
|
|
8976
|
+
"200": {
|
|
8977
|
+
"description": "Success.",
|
|
8978
|
+
"content": {
|
|
8979
|
+
"application/json": {
|
|
8980
|
+
"schema": {
|
|
8981
|
+
"$ref": "#/components/schemas/GetProvisioningInstancesIdSettingsResponse"
|
|
8982
|
+
}
|
|
8983
|
+
}
|
|
8984
|
+
}
|
|
8985
|
+
},
|
|
8986
|
+
"400": {
|
|
8987
|
+
"$ref": "#/components/responses/BadRequest"
|
|
8988
|
+
},
|
|
8989
|
+
"401": {
|
|
8990
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
8991
|
+
},
|
|
8992
|
+
"403": {
|
|
8993
|
+
"$ref": "#/components/responses/Forbidden"
|
|
8994
|
+
},
|
|
8995
|
+
"404": {
|
|
8996
|
+
"$ref": "#/components/responses/NotFound"
|
|
8997
|
+
}
|
|
8998
|
+
},
|
|
8999
|
+
"security": [
|
|
9000
|
+
{
|
|
9001
|
+
"builderSession": []
|
|
9002
|
+
}
|
|
9003
|
+
]
|
|
9004
|
+
},
|
|
9005
|
+
"patch": {
|
|
9006
|
+
"operationId": "patch_provisioning_instances_id_settings",
|
|
9007
|
+
"tags": [
|
|
9008
|
+
"provisioning"
|
|
9009
|
+
],
|
|
9010
|
+
"summary": "PATCH /provisioning/instances/:id/settings",
|
|
9011
|
+
"description": "PATCH /provisioning/instances/:id/settings — change a project's settings. Body: any subset of the known keys; strict validation refuses unknown keys and off-vocabulary values. rank: any authenticated builder (own resource; archon may change any — the override is audited via the event's actor).\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
9012
|
+
"x-rank": "any-builder",
|
|
9013
|
+
"x-source": "modules/provisioning/routes/provisioning.js",
|
|
9014
|
+
"parameters": [
|
|
9015
|
+
{
|
|
9016
|
+
"name": "id",
|
|
9017
|
+
"in": "path",
|
|
9018
|
+
"required": true,
|
|
9019
|
+
"schema": {
|
|
9020
|
+
"type": "string"
|
|
9021
|
+
},
|
|
9022
|
+
"description": "Path parameter `id`."
|
|
9023
|
+
}
|
|
9024
|
+
],
|
|
9025
|
+
"requestBody": {
|
|
9026
|
+
"required": false,
|
|
9027
|
+
"content": {
|
|
9028
|
+
"application/json": {
|
|
9029
|
+
"schema": {
|
|
9030
|
+
"$ref": "#/components/schemas/PatchProvisioningInstancesIdSettingsRequest"
|
|
9031
|
+
}
|
|
9032
|
+
}
|
|
9033
|
+
},
|
|
9034
|
+
"x-validated": true
|
|
9035
|
+
},
|
|
9036
|
+
"responses": {
|
|
9037
|
+
"200": {
|
|
9038
|
+
"description": "Success.",
|
|
9039
|
+
"content": {
|
|
9040
|
+
"application/json": {
|
|
9041
|
+
"schema": {
|
|
9042
|
+
"$ref": "#/components/schemas/PatchProvisioningInstancesIdSettingsResponse"
|
|
9043
|
+
}
|
|
9044
|
+
}
|
|
9045
|
+
}
|
|
9046
|
+
},
|
|
9047
|
+
"400": {
|
|
9048
|
+
"$ref": "#/components/responses/ValidationFailed"
|
|
9049
|
+
},
|
|
9050
|
+
"401": {
|
|
9051
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
9052
|
+
},
|
|
9053
|
+
"403": {
|
|
9054
|
+
"$ref": "#/components/responses/Forbidden"
|
|
9055
|
+
},
|
|
9056
|
+
"404": {
|
|
9057
|
+
"$ref": "#/components/responses/NotFound"
|
|
9058
|
+
}
|
|
9059
|
+
},
|
|
9060
|
+
"security": [
|
|
9061
|
+
{
|
|
9062
|
+
"builderSession": []
|
|
9063
|
+
}
|
|
9064
|
+
]
|
|
9065
|
+
}
|
|
9066
|
+
},
|
|
8954
9067
|
"/provisioning/instances/{id}/teardown": {
|
|
8955
9068
|
"post": {
|
|
8956
9069
|
"operationId": "post_provisioning_instances_id_teardown",
|
|
@@ -13402,7 +13515,8 @@
|
|
|
13402
13515
|
"ready": {},
|
|
13403
13516
|
"terminal": {},
|
|
13404
13517
|
"domain": {},
|
|
13405
|
-
"instance_status": {}
|
|
13518
|
+
"instance_status": {},
|
|
13519
|
+
"app_slug": {}
|
|
13406
13520
|
},
|
|
13407
13521
|
"required": [
|
|
13408
13522
|
"ok",
|
|
@@ -13410,7 +13524,8 @@
|
|
|
13410
13524
|
"ready",
|
|
13411
13525
|
"terminal",
|
|
13412
13526
|
"domain",
|
|
13413
|
-
"instance_status"
|
|
13527
|
+
"instance_status",
|
|
13528
|
+
"app_slug"
|
|
13414
13529
|
]
|
|
13415
13530
|
},
|
|
13416
13531
|
"GetProvisioningHealthResponse": {
|
|
@@ -13439,6 +13554,21 @@
|
|
|
13439
13554
|
"open_intent"
|
|
13440
13555
|
]
|
|
13441
13556
|
},
|
|
13557
|
+
"GetProvisioningInstancesIdSettingsResponse": {
|
|
13558
|
+
"type": "object",
|
|
13559
|
+
"properties": {
|
|
13560
|
+
"ok": {
|
|
13561
|
+
"type": "boolean"
|
|
13562
|
+
},
|
|
13563
|
+
"settings": {},
|
|
13564
|
+
"options": {}
|
|
13565
|
+
},
|
|
13566
|
+
"required": [
|
|
13567
|
+
"ok",
|
|
13568
|
+
"settings",
|
|
13569
|
+
"options"
|
|
13570
|
+
]
|
|
13571
|
+
},
|
|
13442
13572
|
"GetProvisioningInstancesResponse": {
|
|
13443
13573
|
"type": "object",
|
|
13444
13574
|
"properties": {
|
|
@@ -14251,6 +14381,31 @@
|
|
|
14251
14381
|
"project"
|
|
14252
14382
|
]
|
|
14253
14383
|
},
|
|
14384
|
+
"PatchProvisioningInstancesIdSettingsRequest": {
|
|
14385
|
+
"type": "object",
|
|
14386
|
+
"properties": {
|
|
14387
|
+
"platform_visibility": {
|
|
14388
|
+
"type": "string"
|
|
14389
|
+
},
|
|
14390
|
+
"joinability": {
|
|
14391
|
+
"type": "string"
|
|
14392
|
+
}
|
|
14393
|
+
},
|
|
14394
|
+
"additionalProperties": false
|
|
14395
|
+
},
|
|
14396
|
+
"PatchProvisioningInstancesIdSettingsResponse": {
|
|
14397
|
+
"type": "object",
|
|
14398
|
+
"properties": {
|
|
14399
|
+
"ok": {
|
|
14400
|
+
"type": "boolean"
|
|
14401
|
+
},
|
|
14402
|
+
"settings": {}
|
|
14403
|
+
},
|
|
14404
|
+
"required": [
|
|
14405
|
+
"ok",
|
|
14406
|
+
"settings"
|
|
14407
|
+
]
|
|
14408
|
+
},
|
|
14254
14409
|
"PatchTasksIdRequest": {
|
|
14255
14410
|
"type": "object",
|
|
14256
14411
|
"properties": {
|
|
@@ -17432,9 +17587,9 @@
|
|
|
17432
17587
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
17433
17588
|
}
|
|
17434
17589
|
},
|
|
17435
|
-
"x-endpoint-count":
|
|
17436
|
-
"x-schema-count":
|
|
17590
|
+
"x-endpoint-count": 278,
|
|
17591
|
+
"x-schema-count": 314,
|
|
17437
17592
|
"x-undocumented-bodies": 8,
|
|
17438
|
-
"x-response-schemas":
|
|
17593
|
+
"x-response-schemas": 212,
|
|
17439
17594
|
"x-generated-by": "scripts/gds/gen-api-docs.js"
|
|
17440
17595
|
}
|