@bongos/core 1.19.209 → 1.19.211
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 +32 -27
- 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 +7 -0
- package/clients/bongos-client/index.mjs +4 -0
- package/docs/api/openapi.json +146 -4
- package/docs/api-reference.md +5 -3
- package/modules/dev-box/app/src/vendor/bongos-client.cjs +4 -0
- package/modules/provisioning/routes/provisioning.js +18 -14
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/public-landing/assets/cosmos.css +5 -2
- package/public-landing/projects.html +330 -32
- package/src/bongos/github-repos.js +61 -1
- package/src/bongos/routes/github.js +86 -1
- package/src/module-api.js +5 -1
- package/tests/github_repo_visibility.mjs +168 -0
- package/tests/github_repos_helpers.mjs +49 -0
- package/tests/projects_hub.mjs +158 -9
- package/tests/provisioning_settings.mjs +30 -1
- package/tests/public_landing_projects.mjs +24 -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.211",
|
|
6
|
+
"core_contract": "1.19.211",
|
|
7
|
+
"source_commit": "348da70b502ddf8be58aa20aeb71dcf7be94ec7c",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-
|
|
9
|
+
"built_at": "2026-08-17T23:14:01.398Z",
|
|
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": 1301,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 1632,
|
|
20
|
+
"tree_sha256": "5d3eac725354ec0e3bd3c1d91f38bcc539a355b8e2b137de56de74ddfbe2572f",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-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": "81ffa13d3b249b46c4ed62be26cf8e985102697f090a3cfbe7491ff728976028"
|
|
351
351
|
},
|
|
352
352
|
{
|
|
353
353
|
"path": "clients/bongos-client/bongos-client.global.js",
|
|
354
354
|
"mode": "0000644",
|
|
355
|
-
"sha256": "
|
|
355
|
+
"sha256": "23b9f9be8ed1276fa2422cb74ae185c0e37813672e83196aeb6810f091815c12"
|
|
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": "0e38267f075a54b3695a40da4a54f366d5b42827027e4e3614713e6bcc19ca4a"
|
|
366
366
|
},
|
|
367
367
|
{
|
|
368
368
|
"path": "clients/bongos-client/index.d.ts",
|
|
369
369
|
"mode": "0000644",
|
|
370
|
-
"sha256": "
|
|
370
|
+
"sha256": "004ad81d92eab45d5384876ce355b8f9208c32e202289f5c4fb1117932d27a14"
|
|
371
371
|
},
|
|
372
372
|
{
|
|
373
373
|
"path": "clients/bongos-client/index.mjs",
|
|
374
374
|
"mode": "0000644",
|
|
375
|
-
"sha256": "
|
|
375
|
+
"sha256": "661cd90af7bd8d0190cf9cef5614fee48dc48858d3cf9dea681da8b3fc99d170"
|
|
376
376
|
},
|
|
377
377
|
{
|
|
378
378
|
"path": "clients/bongos-client/package.json",
|
|
@@ -1367,12 +1367,12 @@
|
|
|
1367
1367
|
{
|
|
1368
1368
|
"path": "docs/api-reference.md",
|
|
1369
1369
|
"mode": "0000644",
|
|
1370
|
-
"sha256": "
|
|
1370
|
+
"sha256": "43f6538485af5153a0ce0fb82f103431fa869cc7d996f5b6694577c474b0f0fe"
|
|
1371
1371
|
},
|
|
1372
1372
|
{
|
|
1373
1373
|
"path": "docs/api/openapi.json",
|
|
1374
1374
|
"mode": "0000644",
|
|
1375
|
-
"sha256": "
|
|
1375
|
+
"sha256": "274bd57fc6c0b83aba02cedb5cc6daa2fca4a9d74ae5268e527a81ebc10b50e0"
|
|
1376
1376
|
},
|
|
1377
1377
|
{
|
|
1378
1378
|
"path": "docs/architecture.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": "0e38267f075a54b3695a40da4a54f366d5b42827027e4e3614713e6bcc19ca4a"
|
|
2686
2686
|
},
|
|
2687
2687
|
{
|
|
2688
2688
|
"path": "modules/dev-box/app/test/unit.mjs",
|
|
@@ -3982,7 +3982,7 @@
|
|
|
3982
3982
|
{
|
|
3983
3983
|
"path": "modules/provisioning/routes/provisioning.js",
|
|
3984
3984
|
"mode": "0000644",
|
|
3985
|
-
"sha256": "
|
|
3985
|
+
"sha256": "a4419bdd0693d0e1168051bd640721b615bf400b25f26478d786b9aac908ab5e"
|
|
3986
3986
|
},
|
|
3987
3987
|
{
|
|
3988
3988
|
"path": "modules/provisioning/tests/liveness.mjs",
|
|
@@ -4282,12 +4282,12 @@
|
|
|
4282
4282
|
{
|
|
4283
4283
|
"path": "package-lock.json",
|
|
4284
4284
|
"mode": "0000644",
|
|
4285
|
-
"sha256": "
|
|
4285
|
+
"sha256": "aa3d213f3f3548f655bee0361f01e43ee380b54e958f8d11683ba7d94a098d2b"
|
|
4286
4286
|
},
|
|
4287
4287
|
{
|
|
4288
4288
|
"path": "package.json",
|
|
4289
4289
|
"mode": "0000644",
|
|
4290
|
-
"sha256": "
|
|
4290
|
+
"sha256": "368f9931ba9dc39483dc3a9c488fb8df45342cccccab65d34b9a4d083fa530ed"
|
|
4291
4291
|
},
|
|
4292
4292
|
{
|
|
4293
4293
|
"path": "public-docs/index.html",
|
|
@@ -4527,7 +4527,7 @@
|
|
|
4527
4527
|
{
|
|
4528
4528
|
"path": "public-landing/assets/cosmos.css",
|
|
4529
4529
|
"mode": "0000644",
|
|
4530
|
-
"sha256": "
|
|
4530
|
+
"sha256": "bb8a74eaadebf0adf8e59dd03cab87f9c3cbd7faf21d1d6a5d47b460c032c28b"
|
|
4531
4531
|
},
|
|
4532
4532
|
{
|
|
4533
4533
|
"path": "public-landing/assets/verro-medallion.png",
|
|
@@ -4547,7 +4547,7 @@
|
|
|
4547
4547
|
{
|
|
4548
4548
|
"path": "public-landing/projects.html",
|
|
4549
4549
|
"mode": "0000644",
|
|
4550
|
-
"sha256": "
|
|
4550
|
+
"sha256": "790034f4256a31da114969853e14fdf47b43b0ad35907b4fcc14ff98897ec7d1"
|
|
4551
4551
|
},
|
|
4552
4552
|
{
|
|
4553
4553
|
"path": "public-landing/world/assets/clouds/cloud-island-large.png",
|
|
@@ -5682,7 +5682,7 @@
|
|
|
5682
5682
|
{
|
|
5683
5683
|
"path": "src/bongos/github-repos.js",
|
|
5684
5684
|
"mode": "0000644",
|
|
5685
|
-
"sha256": "
|
|
5685
|
+
"sha256": "f34518361f15a20c4dc60a936878e72b4c81d99e41e00180270919dcbbd83008"
|
|
5686
5686
|
},
|
|
5687
5687
|
{
|
|
5688
5688
|
"path": "src/bongos/goal-scope-check.js",
|
|
@@ -5807,7 +5807,7 @@
|
|
|
5807
5807
|
{
|
|
5808
5808
|
"path": "src/bongos/routes/github.js",
|
|
5809
5809
|
"mode": "0000644",
|
|
5810
|
-
"sha256": "
|
|
5810
|
+
"sha256": "d8674cd2358b63f8463d91484495feaa38219fafdc0d925ad52ddb206a2cc84a"
|
|
5811
5811
|
},
|
|
5812
5812
|
{
|
|
5813
5813
|
"path": "src/bongos/routes/healthz.js",
|
|
@@ -5902,7 +5902,7 @@
|
|
|
5902
5902
|
{
|
|
5903
5903
|
"path": "src/module-api.js",
|
|
5904
5904
|
"mode": "0000644",
|
|
5905
|
-
"sha256": "
|
|
5905
|
+
"sha256": "5998d6f2561e88ca21f3f764a48fd496767d0b2f16aeaf1a1e7cf981333c4faf"
|
|
5906
5906
|
},
|
|
5907
5907
|
{
|
|
5908
5908
|
"path": "src/module-loader/catalog.js",
|
|
@@ -6734,10 +6734,15 @@
|
|
|
6734
6734
|
"mode": "0000644",
|
|
6735
6735
|
"sha256": "850113ed91babc9eb54dc22231f194d283fd3f94cee9deef1e6e0bf6f3a969c2"
|
|
6736
6736
|
},
|
|
6737
|
+
{
|
|
6738
|
+
"path": "tests/github_repo_visibility.mjs",
|
|
6739
|
+
"mode": "0000644",
|
|
6740
|
+
"sha256": "c2c428ade3a7cf802dfc46415c1d3c1e09fe826e223df71101e81d014cb5d69e"
|
|
6741
|
+
},
|
|
6737
6742
|
{
|
|
6738
6743
|
"path": "tests/github_repos_helpers.mjs",
|
|
6739
6744
|
"mode": "0000644",
|
|
6740
|
-
"sha256": "
|
|
6745
|
+
"sha256": "a450e5248b3b97ddaa11b1b9c79d768779df24b11cd1177174390ae80f5fe624"
|
|
6741
6746
|
},
|
|
6742
6747
|
{
|
|
6743
6748
|
"path": "tests/github_token_store.mjs",
|
|
@@ -7522,7 +7527,7 @@
|
|
|
7522
7527
|
{
|
|
7523
7528
|
"path": "tests/projects_hub.mjs",
|
|
7524
7529
|
"mode": "0000644",
|
|
7525
|
-
"sha256": "
|
|
7530
|
+
"sha256": "963b745e4b4ecd6a786f88758d57aee8680edd49d25f0cc84e3b563a5125be3b"
|
|
7526
7531
|
},
|
|
7527
7532
|
{
|
|
7528
7533
|
"path": "tests/provision.mjs",
|
|
@@ -7552,7 +7557,7 @@
|
|
|
7552
7557
|
{
|
|
7553
7558
|
"path": "tests/provisioning_settings.mjs",
|
|
7554
7559
|
"mode": "0000644",
|
|
7555
|
-
"sha256": "
|
|
7560
|
+
"sha256": "a525fdcfa2fde8edd2be3198ca7213b9b6bc43a12f748a718a570b7f993972b6"
|
|
7556
7561
|
},
|
|
7557
7562
|
{
|
|
7558
7563
|
"path": "tests/provisioning_slug_available.mjs",
|
|
@@ -7572,7 +7577,7 @@
|
|
|
7572
7577
|
{
|
|
7573
7578
|
"path": "tests/public_landing_projects.mjs",
|
|
7574
7579
|
"mode": "0000644",
|
|
7575
|
-
"sha256": "
|
|
7580
|
+
"sha256": "266f5936675c0f6eb8d64af713d215edea2b88bcab50153497ef2d23fec1ff65"
|
|
7576
7581
|
},
|
|
7577
7582
|
{
|
|
7578
7583
|
"path": "tests/public_mirror_export.mjs",
|
|
@@ -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
|
+
- 280 operations across 46 resource groups
|
|
9
9
|
|
|
10
10
|
## Install
|
|
11
11
|
|
|
@@ -283,6 +283,10 @@ function createClient(opts = {}) {
|
|
|
283
283
|
postGateApprovalsPrApprove: (args) => request("POST", "/gate-approvals/{pr}/approve", { hasBody: true }, args),
|
|
284
284
|
},
|
|
285
285
|
"github": {
|
|
286
|
+
// GET /github/repo — rank: any-builder — GET /github/repo
|
|
287
|
+
getGithubRepo: (args) => request("GET", "/github/repo", { hasBody: false }, args),
|
|
288
|
+
// POST /github/repo/visibility — rank: any-builder — POST /github/repo/visibility
|
|
289
|
+
postGithubRepoVisibility: (args) => request("POST", "/github/repo/visibility", { hasBody: true }, args),
|
|
286
290
|
// GET /github/repos — rank: any-builder — GET /github/repos
|
|
287
291
|
getGithubRepos: (args) => request("GET", "/github/repos", { hasBody: false }, args),
|
|
288
292
|
// POST /github/repos — rank: any-builder — POST /github/repos
|
|
@@ -282,6 +282,10 @@ function createClient(opts = {}) {
|
|
|
282
282
|
postGateApprovalsPrApprove: (args) => request("POST", "/gate-approvals/{pr}/approve", { hasBody: true }, args),
|
|
283
283
|
},
|
|
284
284
|
"github": {
|
|
285
|
+
// GET /github/repo — rank: any-builder — GET /github/repo
|
|
286
|
+
getGithubRepo: (args) => request("GET", "/github/repo", { hasBody: false }, args),
|
|
287
|
+
// POST /github/repo/visibility — rank: any-builder — POST /github/repo/visibility
|
|
288
|
+
postGithubRepoVisibility: (args) => request("POST", "/github/repo/visibility", { hasBody: true }, args),
|
|
285
289
|
// GET /github/repos — rank: any-builder — GET /github/repos
|
|
286
290
|
getGithubRepos: (args) => request("GET", "/github/repos", { hasBody: false }, args),
|
|
287
291
|
// POST /github/repos — rank: any-builder — POST /github/repos
|
|
@@ -35,6 +35,7 @@ export interface GetBuildersMePendingRankChangeResponse { change: unknown; greet
|
|
|
35
35
|
export interface GetBuildersRosterResponse { builders: unknown; stale_hours: unknown }
|
|
36
36
|
export interface GetDiscordChannelsPlanResponse { ok: boolean; guild_id: unknown; op_count: unknown; ops: unknown; warnings: unknown }
|
|
37
37
|
export interface GetDoneWhenPendingReviewResponse { criteria: unknown; count: unknown }
|
|
38
|
+
export interface GetGithubRepoResponse { ok: boolean; repo: unknown; private_deployable: boolean }
|
|
38
39
|
export interface GetGithubReposResponse { repos: unknown }
|
|
39
40
|
export interface GetGoalsIdConflictsResponse { ok: boolean; goal_id: unknown; conflicts: unknown; cross_goals_considered: unknown }
|
|
40
41
|
export interface GetGoalsIdRequestsResponse { requests: unknown }
|
|
@@ -199,6 +200,8 @@ export interface PostDoneWhenCriterionIdSatisfyRequest { satisfied_by_task_id?:
|
|
|
199
200
|
export interface PostDoneWhenCriterionIdSatisfyResponse { criterion: unknown; goal_achieved: unknown; goal: unknown }
|
|
200
201
|
export interface PostDoneWhenCriterionIdUnsatisfyResponse { criterion: unknown }
|
|
201
202
|
export interface PostGateApprovalsPrApproveResponse { ok: boolean; pr: unknown; already_clear?: boolean; message: unknown; head_sha?: unknown; status_set?: boolean; recheck?: unknown }
|
|
203
|
+
export interface PostGithubRepoVisibilityRequest { repo: string; visibility: "public" | "private" }
|
|
204
|
+
export interface PostGithubRepoVisibilityResponse { ok: boolean; repo: unknown; private_deployable: boolean }
|
|
202
205
|
export interface PostGithubReposRequest { name: string }
|
|
203
206
|
export interface PostGithubReposResponse { repo: unknown }
|
|
204
207
|
export interface PostGoalsIdArchiveResponse { ok: boolean; goal: unknown }
|
|
@@ -530,6 +533,10 @@ export interface BongosClient {
|
|
|
530
533
|
postGateApprovalsPrApprove(args?: RequestArgs): Promise<PostGateApprovalsPrApproveResponse>;
|
|
531
534
|
};
|
|
532
535
|
"github": {
|
|
536
|
+
/** GET /github/repo — rank: any-builder */
|
|
537
|
+
getGithubRepo(args?: RequestArgs): Promise<GetGithubRepoResponse>;
|
|
538
|
+
/** POST /github/repo/visibility — rank: any-builder */
|
|
539
|
+
postGithubRepoVisibility(args: RequestArgs & { body: PostGithubRepoVisibilityRequest }): Promise<PostGithubRepoVisibilityResponse>;
|
|
533
540
|
/** GET /github/repos — rank: any-builder */
|
|
534
541
|
getGithubRepos(args?: RequestArgs): Promise<GetGithubReposResponse>;
|
|
535
542
|
/** POST /github/repos — rank: any-builder */
|
|
@@ -279,6 +279,10 @@ export function createClient(opts = {}) {
|
|
|
279
279
|
postGateApprovalsPrApprove: (args) => request("POST", "/gate-approvals/{pr}/approve", { hasBody: true }, args),
|
|
280
280
|
},
|
|
281
281
|
"github": {
|
|
282
|
+
// GET /github/repo — rank: any-builder — GET /github/repo
|
|
283
|
+
getGithubRepo: (args) => request("GET", "/github/repo", { hasBody: false }, args),
|
|
284
|
+
// POST /github/repo/visibility — rank: any-builder — POST /github/repo/visibility
|
|
285
|
+
postGithubRepoVisibility: (args) => request("POST", "/github/repo/visibility", { hasBody: true }, args),
|
|
282
286
|
// GET /github/repos — rank: any-builder — GET /github/repos
|
|
283
287
|
getGithubRepos: (args) => request("GET", "/github/repos", { hasBody: false }, args),
|
|
284
288
|
// POST /github/repos — rank: any-builder — POST /github/repos
|
package/docs/api/openapi.json
CHANGED
|
@@ -3641,6 +3641,93 @@
|
|
|
3641
3641
|
]
|
|
3642
3642
|
}
|
|
3643
3643
|
},
|
|
3644
|
+
"/github/repo": {
|
|
3645
|
+
"get": {
|
|
3646
|
+
"operationId": "get_github_repo",
|
|
3647
|
+
"tags": [
|
|
3648
|
+
"github"
|
|
3649
|
+
],
|
|
3650
|
+
"summary": "GET /github/repo",
|
|
3651
|
+
"description": "reads one repo AS the caller's own GitHub credential sees it (the manage page's repo-visibility read, task 1003045). GitHub's 404 covers both \"no such repo\" and \"no access\" — forwarded as-is, no existence leak.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
3652
|
+
"x-rank": "any-builder",
|
|
3653
|
+
"x-source": "src/bongos/routes/github.js",
|
|
3654
|
+
"responses": {
|
|
3655
|
+
"200": {
|
|
3656
|
+
"description": "Success.",
|
|
3657
|
+
"content": {
|
|
3658
|
+
"application/json": {
|
|
3659
|
+
"schema": {
|
|
3660
|
+
"$ref": "#/components/schemas/GetGithubRepoResponse"
|
|
3661
|
+
}
|
|
3662
|
+
}
|
|
3663
|
+
}
|
|
3664
|
+
},
|
|
3665
|
+
"400": {
|
|
3666
|
+
"$ref": "#/components/responses/BadRequest"
|
|
3667
|
+
},
|
|
3668
|
+
"401": {
|
|
3669
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
3670
|
+
},
|
|
3671
|
+
"403": {
|
|
3672
|
+
"$ref": "#/components/responses/Forbidden"
|
|
3673
|
+
}
|
|
3674
|
+
},
|
|
3675
|
+
"security": [
|
|
3676
|
+
{
|
|
3677
|
+
"builderSession": []
|
|
3678
|
+
}
|
|
3679
|
+
]
|
|
3680
|
+
}
|
|
3681
|
+
},
|
|
3682
|
+
"/github/repo/visibility": {
|
|
3683
|
+
"post": {
|
|
3684
|
+
"operationId": "post_github_repo_visibility",
|
|
3685
|
+
"tags": [
|
|
3686
|
+
"github"
|
|
3687
|
+
],
|
|
3688
|
+
"summary": "POST /github/repo/visibility",
|
|
3689
|
+
"description": "flips one of the caller's repos PUBLIC, with their own credential. The private direction is REFUSED here, before GitHub is ever called: the deploy pull still runs as the shared deploy key that cannot read a private repo (walk finding N4), so flipping private would break the project's next deploy — the refusal is the honest leg task 1003045 ships.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
3690
|
+
"x-rank": "any-builder",
|
|
3691
|
+
"x-source": "src/bongos/routes/github.js",
|
|
3692
|
+
"requestBody": {
|
|
3693
|
+
"required": true,
|
|
3694
|
+
"content": {
|
|
3695
|
+
"application/json": {
|
|
3696
|
+
"schema": {
|
|
3697
|
+
"$ref": "#/components/schemas/PostGithubRepoVisibilityRequest"
|
|
3698
|
+
}
|
|
3699
|
+
}
|
|
3700
|
+
},
|
|
3701
|
+
"x-validated": true
|
|
3702
|
+
},
|
|
3703
|
+
"responses": {
|
|
3704
|
+
"200": {
|
|
3705
|
+
"description": "Success.",
|
|
3706
|
+
"content": {
|
|
3707
|
+
"application/json": {
|
|
3708
|
+
"schema": {
|
|
3709
|
+
"$ref": "#/components/schemas/PostGithubRepoVisibilityResponse"
|
|
3710
|
+
}
|
|
3711
|
+
}
|
|
3712
|
+
}
|
|
3713
|
+
},
|
|
3714
|
+
"400": {
|
|
3715
|
+
"$ref": "#/components/responses/ValidationFailed"
|
|
3716
|
+
},
|
|
3717
|
+
"401": {
|
|
3718
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
3719
|
+
},
|
|
3720
|
+
"403": {
|
|
3721
|
+
"$ref": "#/components/responses/Forbidden"
|
|
3722
|
+
}
|
|
3723
|
+
},
|
|
3724
|
+
"security": [
|
|
3725
|
+
{
|
|
3726
|
+
"builderSession": []
|
|
3727
|
+
}
|
|
3728
|
+
]
|
|
3729
|
+
}
|
|
3730
|
+
},
|
|
3644
3731
|
"/github/repos": {
|
|
3645
3732
|
"get": {
|
|
3646
3733
|
"operationId": "get_github_repos",
|
|
@@ -8725,7 +8812,7 @@
|
|
|
8725
8812
|
"provisioning"
|
|
8726
8813
|
],
|
|
8727
8814
|
"summary": "GET /provisioning/instances/:id",
|
|
8728
|
-
"description": "GET /provisioning/instances/:id — read one
|
|
8815
|
+
"description": "GET /provisioning/instances/:id — read one instance (the manage page's read). rank: any authenticated builder (own resource; archon may read any — task 1003041). 404 otherwise — does not leak another owner's instance existence.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
8729
8816
|
"x-rank": "any-builder",
|
|
8730
8817
|
"x-source": "modules/provisioning/routes/provisioning.js",
|
|
8731
8818
|
"parameters": [
|
|
@@ -13020,6 +13107,23 @@
|
|
|
13020
13107
|
"count"
|
|
13021
13108
|
]
|
|
13022
13109
|
},
|
|
13110
|
+
"GetGithubRepoResponse": {
|
|
13111
|
+
"type": "object",
|
|
13112
|
+
"properties": {
|
|
13113
|
+
"ok": {
|
|
13114
|
+
"type": "boolean"
|
|
13115
|
+
},
|
|
13116
|
+
"repo": {},
|
|
13117
|
+
"private_deployable": {
|
|
13118
|
+
"type": "boolean"
|
|
13119
|
+
}
|
|
13120
|
+
},
|
|
13121
|
+
"required": [
|
|
13122
|
+
"ok",
|
|
13123
|
+
"repo",
|
|
13124
|
+
"private_deployable"
|
|
13125
|
+
]
|
|
13126
|
+
},
|
|
13023
13127
|
"GetGithubReposResponse": {
|
|
13024
13128
|
"type": "object",
|
|
13025
13129
|
"properties": {
|
|
@@ -15323,6 +15427,44 @@
|
|
|
15323
15427
|
"message"
|
|
15324
15428
|
]
|
|
15325
15429
|
},
|
|
15430
|
+
"PostGithubRepoVisibilityRequest": {
|
|
15431
|
+
"type": "object",
|
|
15432
|
+
"properties": {
|
|
15433
|
+
"repo": {
|
|
15434
|
+
"type": "string",
|
|
15435
|
+
"maxLength": 140
|
|
15436
|
+
},
|
|
15437
|
+
"visibility": {
|
|
15438
|
+
"type": "string",
|
|
15439
|
+
"enum": [
|
|
15440
|
+
"public",
|
|
15441
|
+
"private"
|
|
15442
|
+
]
|
|
15443
|
+
}
|
|
15444
|
+
},
|
|
15445
|
+
"required": [
|
|
15446
|
+
"repo",
|
|
15447
|
+
"visibility"
|
|
15448
|
+
],
|
|
15449
|
+
"additionalProperties": false
|
|
15450
|
+
},
|
|
15451
|
+
"PostGithubRepoVisibilityResponse": {
|
|
15452
|
+
"type": "object",
|
|
15453
|
+
"properties": {
|
|
15454
|
+
"ok": {
|
|
15455
|
+
"type": "boolean"
|
|
15456
|
+
},
|
|
15457
|
+
"repo": {},
|
|
15458
|
+
"private_deployable": {
|
|
15459
|
+
"type": "boolean"
|
|
15460
|
+
}
|
|
15461
|
+
},
|
|
15462
|
+
"required": [
|
|
15463
|
+
"ok",
|
|
15464
|
+
"repo",
|
|
15465
|
+
"private_deployable"
|
|
15466
|
+
]
|
|
15467
|
+
},
|
|
15326
15468
|
"PostGithubReposRequest": {
|
|
15327
15469
|
"type": "object",
|
|
15328
15470
|
"properties": {
|
|
@@ -17587,9 +17729,9 @@
|
|
|
17587
17729
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
17588
17730
|
}
|
|
17589
17731
|
},
|
|
17590
|
-
"x-endpoint-count":
|
|
17591
|
-
"x-schema-count":
|
|
17732
|
+
"x-endpoint-count": 280,
|
|
17733
|
+
"x-schema-count": 317,
|
|
17592
17734
|
"x-undocumented-bodies": 8,
|
|
17593
|
-
"x-response-schemas":
|
|
17735
|
+
"x-response-schemas": 214,
|
|
17594
17736
|
"x-generated-by": "scripts/gds/gen-api-docs.js"
|
|
17595
17737
|
}
|
package/docs/api-reference.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# Bongos API reference
|
|
4
4
|
|
|
5
|
-
> **Generated from the live route files** — the route file is authoritative.
|
|
5
|
+
> **Generated from the live route files** — the route file is authoritative. 280 endpoints across 46 route files.
|
|
6
6
|
> Machine-readable spec: [`docs/api/openapi.json`](api/openapi.json) (OpenAPI 3.1). Rendered docs site: **`/docs`** (e.g. `cloudbongos.com/docs`).
|
|
7
7
|
|
|
8
8
|
Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>.md)): `public` < `any-builder` < `metic+archon` < `archon`.
|
|
@@ -178,10 +178,12 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
|
|
|
178
178
|
| GET | `/api/bongos/gate-approvals` | `metic+archon` | — | GET /gate-approvals — open PRs awaiting owner approval (gate-review red), with the verdict + per-file reasons + changed files + diff link. |
|
|
179
179
|
| POST | `/api/bongos/gate-approvals/:pr/approve` | `archon` | — | POST /gate-approvals/:pr/approve — record owner approval for a stuck gate PR and re-run the gate-review check so it clears. |
|
|
180
180
|
|
|
181
|
-
## `github` (
|
|
181
|
+
## `github` (4)
|
|
182
182
|
|
|
183
183
|
| Method | Path | Rank | Body | Description |
|
|
184
184
|
|---|---|---|---|---|
|
|
185
|
+
| GET | `/api/bongos/github/repo` | `any-builder` | — | reads one repo AS the caller's own GitHub credential sees it (the manage page's repo-visibility read, task 1003045). |
|
|
186
|
+
| POST | `/api/bongos/github/repo/visibility` | `any-builder` | `repo`, `visibility` | flips one of the caller's repos PUBLIC, with their own credential. |
|
|
185
187
|
| GET | `/api/bongos/github/repos` | `any-builder` | — | acts only on the caller's OWN GitHub identity (the token they granted). |
|
|
186
188
|
| POST | `/api/bongos/github/repos` | `any-builder` | `name` | creates a repo in the caller's OWN account. |
|
|
187
189
|
|
|
@@ -380,7 +382,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/<redacted>
|
|
|
380
382
|
| GET | `/api/bongos/provisioning/health` | `public` | — | GET /provisioning/health — liveness + the core version this module mounted against. |
|
|
381
383
|
| GET | `/api/bongos/provisioning/instances` | `any-builder` | — | GET /provisioning/instances — the caller's own instances + each open intent. |
|
|
382
384
|
| POST | `/api/bongos/provisioning/instances` | `any-builder` | `slug`, `target_ref`, `hosting_shape`, `domain`, `no_address`, `tier`, `onboard_mode`, `type` | POST /provisioning/instances — request a new instance. |
|
|
383
|
-
| GET | `/api/bongos/provisioning/instances/:id` | `any-builder` | — | GET /provisioning/instances/:id — read one
|
|
385
|
+
| GET | `/api/bongos/provisioning/instances/:id` | `any-builder` | — | GET /provisioning/instances/:id — read one instance (the manage page's read). |
|
|
384
386
|
| POST | `/api/bongos/provisioning/instances/:id/domain` | `any-builder` | `domain` | POST /provisioning/instances/:id/domain — give the caller's OWN instance its address (task 1002692, gap 5: no path existed to add a domai… |
|
|
385
387
|
| POST | `/api/bongos/provisioning/instances/:id/force-teardown` | `metic+archon` | — | POST /provisioning/instances/:id/force-teardown — Archon tears down ANY instance. |
|
|
386
388
|
| POST | `/api/bongos/provisioning/instances/:id/github-app` | `any-builder` | `account` | POST /provisioning/instances/:id/github-app — mint a GitHub-App-Manifest onboarding link for the caller's OWN instance (task 2080, ADR 01… |
|
|
@@ -282,6 +282,10 @@ function createClient(opts = {}) {
|
|
|
282
282
|
postGateApprovalsPrApprove: (args) => request("POST", "/gate-approvals/{pr}/approve", { hasBody: true }, args),
|
|
283
283
|
},
|
|
284
284
|
"github": {
|
|
285
|
+
// GET /github/repo — rank: any-builder — GET /github/repo
|
|
286
|
+
getGithubRepo: (args) => request("GET", "/github/repo", { hasBody: false }, args),
|
|
287
|
+
// POST /github/repo/visibility — rank: any-builder — POST /github/repo/visibility
|
|
288
|
+
postGithubRepoVisibility: (args) => request("POST", "/github/repo/visibility", { hasBody: true }, args),
|
|
285
289
|
// GET /github/repos — rank: any-builder — GET /github/repos
|
|
286
290
|
getGithubRepos: (args) => request("GET", "/github/repos", { hasBody: false }, args),
|
|
287
291
|
// POST /github/repos — rank: any-builder — POST /github/repos
|
|
@@ -569,15 +569,25 @@ module.exports = function provisioningRoutes() {
|
|
|
569
569
|
}
|
|
570
570
|
});
|
|
571
571
|
|
|
572
|
-
//
|
|
573
|
-
//
|
|
574
|
-
//
|
|
572
|
+
// Own-scoped with an Archon override: an owner manages their own project; an
|
|
573
|
+
// Archon may act on any (fleet support). 404 for everyone else — no existence
|
|
574
|
+
// leak. Guards the per-id read (the manage page, task 1003041) and both
|
|
575
|
+
// settings routes (task 1003040).
|
|
576
|
+
function instanceAccessDenied(inst, builder) {
|
|
577
|
+
if (!inst) return true;
|
|
578
|
+
if (builder.rank === 'archon') return false;
|
|
579
|
+
return String(inst.owner_builder_id) !== String(builder.id);
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
// GET /provisioning/instances/:id — read one instance (the manage page's read).
|
|
583
|
+
// rank: any authenticated builder (own resource; archon may read any — task
|
|
584
|
+
// 1003041). 404 otherwise — does not leak another owner's instance existence.
|
|
575
585
|
router.get('/provisioning/instances/:id', auth.requireBuilder, async (req, res) => {
|
|
576
586
|
const id = parseId(req, res); // (req, res) — parseId sends 400 bad_id + returns null on failure
|
|
577
587
|
if (!id) return;
|
|
578
588
|
try {
|
|
579
589
|
const inst = await provisioning.getInstanceById(pool, id);
|
|
580
|
-
if (
|
|
590
|
+
if (instanceAccessDenied(inst, req.builder)) {
|
|
581
591
|
return res.fail('instance_not_found', 404);
|
|
582
592
|
}
|
|
583
593
|
const open = await provisioning.getOpenIntent(pool, id);
|
|
@@ -594,14 +604,8 @@ module.exports = function provisioningRoutes() {
|
|
|
594
604
|
// ── Per-project settings (task 1003040, goal 1000058) ─────────────────────
|
|
595
605
|
// The foundation the manage-page wave hangs off: effective settings are the
|
|
596
606
|
// DEFAULTS (today's behavior — public surfaces, apply-to-join) overlaid with
|
|
597
|
-
// the instance's stored keys.
|
|
598
|
-
//
|
|
599
|
-
// for everyone else — no existence leak (the GET-by-id precedent).
|
|
600
|
-
function settingsAccessDenied(inst, builder) {
|
|
601
|
-
if (!inst) return true;
|
|
602
|
-
if (builder.rank === 'archon') return false;
|
|
603
|
-
return String(inst.owner_builder_id) !== String(builder.id);
|
|
604
|
-
}
|
|
607
|
+
// the instance's stored keys. Access: instanceAccessDenied above (own-scoped,
|
|
608
|
+
// Archon override, 404 otherwise — no existence leak).
|
|
605
609
|
|
|
606
610
|
// GET /provisioning/instances/:id/settings — read a project's effective
|
|
607
611
|
// settings + the allowed values (so a form can render its choices).
|
|
@@ -611,7 +615,7 @@ module.exports = function provisioningRoutes() {
|
|
|
611
615
|
if (!id) return;
|
|
612
616
|
try {
|
|
613
617
|
const inst = await provisioning.getInstanceById(pool, id);
|
|
614
|
-
if (
|
|
618
|
+
if (instanceAccessDenied(inst, req.builder)) return res.fail('instance_not_found', 404);
|
|
615
619
|
res.json({ ok: true, settings: provisioning.effectiveSettings(inst), options: provisioning.SETTINGS_VOCAB });
|
|
616
620
|
} catch (err) {
|
|
617
621
|
console.error('[provisioning] GET /provisioning/instances/:id/settings', err);
|
|
@@ -640,7 +644,7 @@ module.exports = function provisioningRoutes() {
|
|
|
640
644
|
}
|
|
641
645
|
try {
|
|
642
646
|
const inst = await provisioning.getInstanceById(pool, id);
|
|
643
|
-
if (
|
|
647
|
+
if (instanceAccessDenied(inst, req.builder)) return res.fail('instance_not_found', 404);
|
|
644
648
|
const updated = await provisioning.updateInstanceSettings(pool, id, patch);
|
|
645
649
|
await provisioning.recordEvent(pool, {
|
|
646
650
|
instanceId: id, ownerBuilderId: inst.owner_builder_id, event: 'settings',
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.211",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.19.
|
|
9
|
+
"version": "1.19.211",
|
|
10
10
|
"license": "AGPL-3.0-or-later",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"express": "^4.21.2",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.211",
|
|
4
4
|
"description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"main": "src/platform-server.js",
|
|
@@ -299,8 +299,6 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
|
|
|
299
299
|
card is there for — and the ghosted .orb stays the graphic cue. */
|
|
300
300
|
.proj.gone{border-color:color-mix(in srgb,var(--line) 55%,var(--bg-card));}
|
|
301
301
|
.proj.gone .projName{color:var(--ink-soft);}
|
|
302
|
-
/* click-to-manage landing glow: the sky's owned orb hands focus to this card */
|
|
303
|
-
.proj.anchored{border-color:var(--accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 30%,transparent);}
|
|
304
302
|
.projBody{flex:1;min-width:0;}
|
|
305
303
|
.projHead{display:flex;align-items:center;gap:12px;flex-wrap:wrap;}
|
|
306
304
|
.projName{font-family:var(--font-display);font-weight:700;font-size:19px;letter-spacing:-0.3px;}
|
|
@@ -319,6 +317,11 @@ h1{font-family:var(--font-display);font-weight:700;font-size:clamp(24px,3.4vw,32
|
|
|
319
317
|
.projMsg.ok{color:var(--ok);}
|
|
320
318
|
.projMsg.err{color:var(--err);}
|
|
321
319
|
.projMsg a{color:var(--link-ink);font-weight:700;text-decoration:none;}
|
|
320
|
+
/* the manage view (task 1003041): its back link, meta repo link and the
|
|
321
|
+
honest empty-state links speak the same link ink as every other surface */
|
|
322
|
+
.projMeta a{color:var(--link-ink);font-weight:700;text-decoration:none;}
|
|
323
|
+
.backRow a{color:var(--link-ink);font-weight:700;text-decoration:none;}
|
|
324
|
+
.empty p a{color:var(--link-ink);font-weight:700;text-decoration:none;}
|
|
322
325
|
.projMsg a:hover{text-decoration:underline;}
|
|
323
326
|
.projMsg details{margin-top:8px;}
|
|
324
327
|
.projMsg summary{cursor:pointer;font-size:12.5px;font-weight:700;color:var(--ink-faint);}
|