@bongos/core 1.21.57 → 1.21.58
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 +82 -47
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +6 -0
- package/clients/bongos-client/index.cjs +6 -0
- package/clients/bongos-client/index.d.ts +13 -2
- package/clients/bongos-client/index.mjs +6 -0
- package/docs/adr/0336-a-guilds-record-is-the-sum-of-what-its-members-already-show.md +2 -0
- package/docs/adr/0365-a-guild-engages-a-project-through-each-members-own-door.md +58 -0
- package/docs/adr/README.md +1 -0
- package/docs/api/openapi.json +233 -6
- package/docs/api-reference.md +8 -5
- package/docs/copy-inventory.md +360 -352
- package/docs/copy-registry.json +479 -397
- package/docs/file-map.md +3 -0
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-inventory.json +7 -1
- package/docs/page-readings.json +828 -811
- package/modules/platform-identity/application-echo.js +11 -5
- package/modules/platform-identity/guild-engagements.js +255 -0
- package/modules/platform-identity/guilds.js +3 -1
- package/modules/platform-identity/migrations/platform_identity_030_guild_engagements.sql +64 -0
- package/modules/platform-identity/routes/guilds.js +35 -1
- package/modules/platform-identity/routes/my-projects.js +27 -3
- package/modules/platform-identity/routes/projects.js +44 -0
- package/modules/platform-identity/routes/sso.js +21 -3
- package/modules/public-landing/public/assets/cosmos.css +7 -0
- package/modules/public-landing/public/guild.html +64 -2
- package/modules/public-landing/public/guild.probes.json +13 -3
- package/modules/public-landing/public/guild.states.json +10 -5
- package/modules/public-landing/public/projects.html +252 -16
- package/modules/public-landing/public/projects.probes.json +26 -1
- package/modules/public-landing/public/projects.states.json +4 -0
- package/modules/ui-design/kit/fixtures/me__guild-engagements.json +7 -0
- package/modules/ui-design/kit/serve.js +54 -5
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/scripts/gds/run-unit-tests.js +5 -0
- package/src/module-api.js +1 -1
- package/tests/applicant_profile_boundary.mjs +104 -1
- package/tests/application_echo.mjs +91 -5
- package/tests/guild_engagement.mjs +881 -0
- package/tests/guild_engagement_db.mjs +240 -0
- package/tests/hub_engagement_cards.mjs +307 -0
- package/tests/hub_guild_page.mjs +94 -7
- package/tests/privacy_matrix.mjs +99 -9
- package/tests/project_invite_ui.mjs +187 -3
package/docs/adr/README.md
CHANGED
|
@@ -483,3 +483,4 @@ These 20 numbers are each shared by exactly two files. They are **accepted histo
|
|
|
483
483
|
| 0362 | [**The governor's docket is collected from sources each module contributes, scoped by each source's own atom** ([task 1004523](https://cloudbongos.com/builders#/task/1004523), goal 1000125). **D1:** one contribution point, `governor.docket`; each owner contributes its source on the read its own list route serves. **D2:** a source declares its list route's atom and the collector enforces it (gated out = `not_yours`, no rows; no gate = dropped). **D3:** nothing invented: `coming` / `off` / `unavailable`. **D4:** the board's needs-you is the /me summons rule. **D5:** `GET /government/docket` gates on `board.vote.cast`.](0362-the-governor-docket-is-collected-from-contributed-sources.md) | government / Governor City |
|
|
484
484
|
| 0363 | [**Who decides what is a per-project table, changed only by a passed amendment** ([task 1004529](https://cloudbongos.com/builders#/task/1004529), goal 1000125). **D1:** `government_decision_rules`, one row per building: `gate` (as today), `board` (the charter only), `nobody` (vacant) or a membership predicate with decide / first / consent / majority / unanimous / sign-off. **D2:** the seeded defaults are today, and a malformed row reads as its default. **D3:** written only inside the transaction that closes a `decision_rules` amendment as passed; JS guard + SQL condition + trigger; no settings route. **D4:** eight building matters join the board's three subjects, openable only where a row names a sitting; sign-off is the author rule. **D5:** People's rank assignments defer to People's row (`checkActAlone`); a passed People matter acts. **D6:** the docket's buildings carry who decides.](0363-who-decides-what-is-a-table-changed-only-by-amendment.md) | government / Governor City |
|
|
485
485
|
| 0364 | [**Repo access is asked at sign-in on the hub, and held for as long as the builder stays signed in** ([task 1004549](https://cloudbongos.com/builders#/task/1004549)). Amends ADR 0143 and 0155. **D1:** every sign-in door on the hub's own pages carries `repos=1`; the hall and CLI stay identity-only. **D2:** the repo token's TTL is the web session's remaining life; a web sign-out deletes it, a CLI logout does not. **D3:** a draft at a wizard step beside a stored create keeps its place on a reload or a GitHub round-trip.](0364-repo-access-is-asked-at-sign-in-and-held-for-the-session.md) | auth / GitHub / create wizard |
|
|
486
|
+
| 0365 | [**A guild engages a project through each member's own door** ([task 1002303](https://cloudbongos.com/builders#/task/1002303)). Amends ADR 0336 D7's invite half after ADR 0353. **D1:** the engagement row as D7 specified, plus `guild_id` on the echo (the latest application decides the label). **D2:** a guild applies = each member applies as themselves through the relay, naming the engagement. **D3:** a project invites a guild = the hub records it and returns one hall hand-off link per public-roster member; no hub-written invites, the one-step relay stays deferred. **D4:** a project is named only when on the map and public, for both kinds. **D5:** the label rides the applicant-profile read; the queue is R28's. **D6:** the D4.4 guild cards are their own task.](0365-a-guild-engages-a-project-through-each-members-own-door.md) | guilds / invites / applications |
|
package/docs/api/openapi.json
CHANGED
|
@@ -9819,6 +9819,69 @@
|
|
|
9819
9819
|
]
|
|
9820
9820
|
}
|
|
9821
9821
|
},
|
|
9822
|
+
"/guilds/{slug}/engagements": {
|
|
9823
|
+
"post": {
|
|
9824
|
+
"operationId": "post_guilds_slug_engagements",
|
|
9825
|
+
"tags": [
|
|
9826
|
+
"guilds"
|
|
9827
|
+
],
|
|
9828
|
+
"summary": "POST /guilds/:slug/engagements",
|
|
9829
|
+
"description": "owner: file \"this guild is applying to P\" (ADR 0365 D2, task 1002303). Each member then sees it in their own inbox and applies as themselves; filing applies for nobody, the owner included. P unknown, inactive, or not on the map and Public is ONE 404 — no oracle on a private project. The owner test is re-asserted inside the INSERT. Re-filing restarts the 30-day window.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
9830
|
+
"x-rank": "any-builder",
|
|
9831
|
+
"x-source": "modules/platform-identity/routes/guilds.js",
|
|
9832
|
+
"parameters": [
|
|
9833
|
+
{
|
|
9834
|
+
"name": "slug",
|
|
9835
|
+
"in": "path",
|
|
9836
|
+
"required": true,
|
|
9837
|
+
"schema": {
|
|
9838
|
+
"type": "string"
|
|
9839
|
+
},
|
|
9840
|
+
"description": "Path parameter `slug`."
|
|
9841
|
+
}
|
|
9842
|
+
],
|
|
9843
|
+
"requestBody": {
|
|
9844
|
+
"required": true,
|
|
9845
|
+
"content": {
|
|
9846
|
+
"application/json": {
|
|
9847
|
+
"schema": {
|
|
9848
|
+
"$ref": "#/components/schemas/PostGuildsSlugEngagementsRequest"
|
|
9849
|
+
}
|
|
9850
|
+
}
|
|
9851
|
+
},
|
|
9852
|
+
"x-validated": true
|
|
9853
|
+
},
|
|
9854
|
+
"responses": {
|
|
9855
|
+
"200": {
|
|
9856
|
+
"description": "Success.",
|
|
9857
|
+
"content": {
|
|
9858
|
+
"application/json": {
|
|
9859
|
+
"schema": {
|
|
9860
|
+
"$ref": "#/components/schemas/PostGuildsSlugEngagementsResponse"
|
|
9861
|
+
}
|
|
9862
|
+
}
|
|
9863
|
+
}
|
|
9864
|
+
},
|
|
9865
|
+
"400": {
|
|
9866
|
+
"$ref": "#/components/responses/ValidationFailed"
|
|
9867
|
+
},
|
|
9868
|
+
"401": {
|
|
9869
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
9870
|
+
},
|
|
9871
|
+
"403": {
|
|
9872
|
+
"$ref": "#/components/responses/Forbidden"
|
|
9873
|
+
},
|
|
9874
|
+
"404": {
|
|
9875
|
+
"$ref": "#/components/responses/NotFound"
|
|
9876
|
+
}
|
|
9877
|
+
},
|
|
9878
|
+
"security": [
|
|
9879
|
+
{
|
|
9880
|
+
"builderSession": []
|
|
9881
|
+
}
|
|
9882
|
+
]
|
|
9883
|
+
}
|
|
9884
|
+
},
|
|
9822
9885
|
"/guilds/{slug}/invites": {
|
|
9823
9886
|
"post": {
|
|
9824
9887
|
"operationId": "post_guilds_slug_invites",
|
|
@@ -12293,6 +12356,44 @@
|
|
|
12293
12356
|
]
|
|
12294
12357
|
}
|
|
12295
12358
|
},
|
|
12359
|
+
"/me/guild-engagements": {
|
|
12360
|
+
"get": {
|
|
12361
|
+
"operationId": "get_me_guild_engagements",
|
|
12362
|
+
"tags": [
|
|
12363
|
+
"me"
|
|
12364
|
+
],
|
|
12365
|
+
"summary": "GET /me/guild-engagements",
|
|
12366
|
+
"description": "MY inbox of guild engagements (ADR 0365): \"G is applying to P\" and \"P invited G\", for guilds I belong to, inside 30 days, naming only projects on the map and Public, an invite only if I was a member when it was sent, and never a project I already build on, hold an invite to, or applied to. count is the array's own length; client_id never crosses.\n\n**Rank:** `any-builder` — Any authenticated builder (row-level ownership enforced in-handler).",
|
|
12367
|
+
"x-rank": "any-builder",
|
|
12368
|
+
"x-source": "modules/platform-identity/routes/guilds.js",
|
|
12369
|
+
"responses": {
|
|
12370
|
+
"200": {
|
|
12371
|
+
"description": "Success.",
|
|
12372
|
+
"content": {
|
|
12373
|
+
"application/json": {
|
|
12374
|
+
"schema": {
|
|
12375
|
+
"$ref": "#/components/schemas/GetMeGuildEngagementsResponse"
|
|
12376
|
+
}
|
|
12377
|
+
}
|
|
12378
|
+
}
|
|
12379
|
+
},
|
|
12380
|
+
"400": {
|
|
12381
|
+
"$ref": "#/components/responses/BadRequest"
|
|
12382
|
+
},
|
|
12383
|
+
"401": {
|
|
12384
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
12385
|
+
},
|
|
12386
|
+
"403": {
|
|
12387
|
+
"$ref": "#/components/responses/Forbidden"
|
|
12388
|
+
}
|
|
12389
|
+
},
|
|
12390
|
+
"security": [
|
|
12391
|
+
{
|
|
12392
|
+
"builderSession": []
|
|
12393
|
+
}
|
|
12394
|
+
]
|
|
12395
|
+
}
|
|
12396
|
+
},
|
|
12296
12397
|
"/me/guild-requests": {
|
|
12297
12398
|
"get": {
|
|
12298
12399
|
"operationId": "get_me_guild_requests",
|
|
@@ -15484,6 +15585,58 @@
|
|
|
15484
15585
|
]
|
|
15485
15586
|
}
|
|
15486
15587
|
},
|
|
15588
|
+
"/projects/invite-guild": {
|
|
15589
|
+
"post": {
|
|
15590
|
+
"operationId": "post_projects_invite_guild",
|
|
15591
|
+
"tags": [
|
|
15592
|
+
"projects"
|
|
15593
|
+
],
|
|
15594
|
+
"summary": "POST /projects/invite-guild",
|
|
15595
|
+
"description": "own-or-metic in effect, the SAME gate as POST /projects/invite above and for the same reasons (a non-inviter gets that route's unchanged refusal, identical whether or not the project exists): a project invites a PUBLIC guild (task 1002303, ADR 0365 D3, amending ADR 0336 D7). IT WRITES NO INVITES (ADR 0353). It records the `invited` engagement — so members the inviter could not see get a \"P invited this guild\" notice and may apply themselves, and only while P is on the map and Public (ADR 0365 D4) — and answers one hall hand-off link per member on the guild's PUBLIC roster at this moment. The inviter sends each from the project's hall, so every invite is the project's own row. Members who join later inherit nothing. An unlisted guild cannot be addressed, so it answers the unknown-guild 404 byte for byte.\n\n**Rank:** `metic+archon` — Metic or Archon rank (review/triage powers).\n\n**Permissions:** `project.curate` (all required).",
|
|
15596
|
+
"x-rank": "metic+archon",
|
|
15597
|
+
"x-source": "modules/platform-identity/routes/projects.js",
|
|
15598
|
+
"x-permissions": [
|
|
15599
|
+
"project.curate"
|
|
15600
|
+
],
|
|
15601
|
+
"requestBody": {
|
|
15602
|
+
"required": true,
|
|
15603
|
+
"content": {
|
|
15604
|
+
"application/json": {
|
|
15605
|
+
"schema": {
|
|
15606
|
+
"$ref": "#/components/schemas/PostProjectsInviteGuildRequest"
|
|
15607
|
+
}
|
|
15608
|
+
}
|
|
15609
|
+
},
|
|
15610
|
+
"x-validated": true
|
|
15611
|
+
},
|
|
15612
|
+
"responses": {
|
|
15613
|
+
"200": {
|
|
15614
|
+
"description": "Success.",
|
|
15615
|
+
"content": {
|
|
15616
|
+
"application/json": {
|
|
15617
|
+
"schema": {
|
|
15618
|
+
"$ref": "#/components/schemas/PostProjectsInviteGuildResponse"
|
|
15619
|
+
}
|
|
15620
|
+
}
|
|
15621
|
+
}
|
|
15622
|
+
},
|
|
15623
|
+
"400": {
|
|
15624
|
+
"$ref": "#/components/responses/ValidationFailed"
|
|
15625
|
+
},
|
|
15626
|
+
"401": {
|
|
15627
|
+
"$ref": "#/components/responses/Unauthorized"
|
|
15628
|
+
},
|
|
15629
|
+
"403": {
|
|
15630
|
+
"$ref": "#/components/responses/Forbidden"
|
|
15631
|
+
}
|
|
15632
|
+
},
|
|
15633
|
+
"security": [
|
|
15634
|
+
{
|
|
15635
|
+
"builderSession": []
|
|
15636
|
+
}
|
|
15637
|
+
]
|
|
15638
|
+
}
|
|
15639
|
+
},
|
|
15487
15640
|
"/projects/{id}/featured": {
|
|
15488
15641
|
"patch": {
|
|
15489
15642
|
"operationId": "patch_projects_id_featured",
|
|
@@ -20539,7 +20692,7 @@
|
|
|
20539
20692
|
"sso"
|
|
20540
20693
|
],
|
|
20541
20694
|
"summary": "POST /sso/applicant-profile",
|
|
20542
|
-
"description": "POST /sso/applicant-profile — a federated instance resolves ONE applicant's profile view for its own reviewer queue, LIVE at render (privacy spec D7, task 1002972). Server-to-server, client_id+client_secret auth, like the two routes above. Answers { profile: null | { view:'public', … } | { view: 'sliver', … } } — the D7 rule, decided entirely inside ../applicant-profile.js. WHY A POST FOR A READ. The same reason /sso/activity/rollup is one: the credentials are in the body, and a client_secret in a query string lands in access logs and proxy history. Nothing is written. THE ECHO IS THE GATE, AND IT IS THE WHOLE SECURITY ARGUMENT (ADR 0205, security report 1000027). Client credentials prove WHICH PROJECT is calling and nothing about WHO the github_id is, so authenticating the caller is not enough: without a per-subject witness this route is a bulk disclosure oracle over every account on the platform, private ones included, readable by any registered project holding only its own secret. applicationBacksProfileRead demands a HUB-WRITTEN echo for exactly (this account, this client) inside the 30-day window — a row only the hub's own join relay creates, and only after the project accepted the relayed application. A project may therefore read the profile of someone who applied TO IT, and of nobody else. 404, never 403, when the echo is absent — the /scouting/:handle posture. A 403 would confirm that the github_id names a real account, which is the disclosure the whole rule exists to withhold. An account that exists but discloses nothing (provisional, terms never accepted) answers the SAME { profile: null } as one that consented but is simply not readable, so the caller cannot tell those apart either (ADR 0171 D4). NOT AUTHORITY (ADR 0016). The answer is descriptive; the project's own admission gate reads status='invited' and never this. rank: public — authenticated by client_id + client_secret, not a builder rank. The limiter runs BEFORE the client lookup, so a refused probe costs no DB work — the accountExistenceReadRateLimit posture.\n\n**Rank:** `public` — No authentication — any caller.",
|
|
20695
|
+
"description": "POST /sso/applicant-profile — a federated instance resolves ONE applicant's profile view for its own reviewer queue, LIVE at render (privacy spec D7, task 1002972). Server-to-server, client_id+client_secret auth, like the two routes above. Answers { profile: null | { view:'public', … } | { view: 'sliver', … }, guild } — the D7 rule, decided entirely inside ../applicant-profile.js, plus the guild the applicant applied with (ADR 0365 D5): { slug, name } while they are still a member of it (slug null for an unlisted guild), else null. A project on an older core reads only `profile` and ignores the rest (the ADR 0201 D2.2 compatibility rule). WHY A POST FOR A READ. The same reason /sso/activity/rollup is one: the credentials are in the body, and a client_secret in a query string lands in access logs and proxy history. Nothing is written. THE ECHO IS THE GATE, AND IT IS THE WHOLE SECURITY ARGUMENT (ADR 0205, security report 1000027). Client credentials prove WHICH PROJECT is calling and nothing about WHO the github_id is, so authenticating the caller is not enough: without a per-subject witness this route is a bulk disclosure oracle over every account on the platform, private ones included, readable by any registered project holding only its own secret. applicationBacksProfileRead demands a HUB-WRITTEN echo for exactly (this account, this client) inside the 30-day window — a row only the hub's own join relay creates, and only after the project accepted the relayed application. A project may therefore read the profile of someone who applied TO IT, and of nobody else. 404, never 403, when the echo is absent — the /scouting/:handle posture. A 403 would confirm that the github_id names a real account, which is the disclosure the whole rule exists to withhold. An account that exists but discloses nothing (provisional, terms never accepted) answers the SAME { profile: null } as one that consented but is simply not readable, so the caller cannot tell those apart either (ADR 0171 D4). NOT AUTHORITY (ADR 0016). The answer is descriptive; the project's own admission gate reads status='invited' and never this. rank: public — authenticated by client_id + client_secret, not a builder rank. The limiter runs BEFORE the client lookup, so a refused probe costs no DB work — the accountExistenceReadRateLimit posture.\n\n**Rank:** `public` — No authentication — any caller.",
|
|
20543
20696
|
"x-rank": "public",
|
|
20544
20697
|
"x-source": "modules/platform-identity/routes/sso.js",
|
|
20545
20698
|
"requestBody": {
|
|
@@ -25312,6 +25465,17 @@
|
|
|
25312
25465
|
"events"
|
|
25313
25466
|
]
|
|
25314
25467
|
},
|
|
25468
|
+
"GetMeGuildEngagementsResponse": {
|
|
25469
|
+
"type": "object",
|
|
25470
|
+
"properties": {
|
|
25471
|
+
"engagements": {},
|
|
25472
|
+
"count": {}
|
|
25473
|
+
},
|
|
25474
|
+
"required": [
|
|
25475
|
+
"engagements",
|
|
25476
|
+
"count"
|
|
25477
|
+
]
|
|
25478
|
+
},
|
|
25315
25479
|
"GetMeGuildRequestsResponse": {
|
|
25316
25480
|
"type": "object",
|
|
25317
25481
|
"properties": {
|
|
@@ -29506,6 +29670,28 @@
|
|
|
29506
29670
|
"guild"
|
|
29507
29671
|
]
|
|
29508
29672
|
},
|
|
29673
|
+
"PostGuildsSlugEngagementsRequest": {
|
|
29674
|
+
"type": "object",
|
|
29675
|
+
"properties": {
|
|
29676
|
+
"origin": {
|
|
29677
|
+
"type": "string",
|
|
29678
|
+
"maxLength": 512
|
|
29679
|
+
}
|
|
29680
|
+
},
|
|
29681
|
+
"required": [
|
|
29682
|
+
"origin"
|
|
29683
|
+
],
|
|
29684
|
+
"additionalProperties": false
|
|
29685
|
+
},
|
|
29686
|
+
"PostGuildsSlugEngagementsResponse": {
|
|
29687
|
+
"type": "object",
|
|
29688
|
+
"properties": {
|
|
29689
|
+
"engagement": {}
|
|
29690
|
+
},
|
|
29691
|
+
"required": [
|
|
29692
|
+
"engagement"
|
|
29693
|
+
]
|
|
29694
|
+
},
|
|
29509
29695
|
"PostGuildsSlugInvitesRequest": {
|
|
29510
29696
|
"type": "object",
|
|
29511
29697
|
"properties": {
|
|
@@ -30198,6 +30384,10 @@
|
|
|
30198
30384
|
"note": {
|
|
30199
30385
|
"type": "string",
|
|
30200
30386
|
"maxLength": 400
|
|
30387
|
+
},
|
|
30388
|
+
"guild": {
|
|
30389
|
+
"type": "string",
|
|
30390
|
+
"maxLength": 39
|
|
30201
30391
|
}
|
|
30202
30392
|
},
|
|
30203
30393
|
"required": [
|
|
@@ -30378,6 +30568,41 @@
|
|
|
30378
30568
|
"images"
|
|
30379
30569
|
]
|
|
30380
30570
|
},
|
|
30571
|
+
"PostProjectsInviteGuildRequest": {
|
|
30572
|
+
"type": "object",
|
|
30573
|
+
"properties": {
|
|
30574
|
+
"client_id": {
|
|
30575
|
+
"type": "string",
|
|
30576
|
+
"maxLength": 200
|
|
30577
|
+
},
|
|
30578
|
+
"guild": {
|
|
30579
|
+
"type": "string",
|
|
30580
|
+
"maxLength": 39
|
|
30581
|
+
}
|
|
30582
|
+
},
|
|
30583
|
+
"required": [
|
|
30584
|
+
"client_id",
|
|
30585
|
+
"guild"
|
|
30586
|
+
],
|
|
30587
|
+
"additionalProperties": false
|
|
30588
|
+
},
|
|
30589
|
+
"PostProjectsInviteGuildResponse": {
|
|
30590
|
+
"type": "object",
|
|
30591
|
+
"properties": {
|
|
30592
|
+
"invited": {
|
|
30593
|
+
"type": "boolean"
|
|
30594
|
+
},
|
|
30595
|
+
"guild": {},
|
|
30596
|
+
"invites": {},
|
|
30597
|
+
"count": {}
|
|
30598
|
+
},
|
|
30599
|
+
"required": [
|
|
30600
|
+
"invited",
|
|
30601
|
+
"guild",
|
|
30602
|
+
"invites",
|
|
30603
|
+
"count"
|
|
30604
|
+
]
|
|
30605
|
+
},
|
|
30381
30606
|
"PostProjectsInviteRequest": {
|
|
30382
30607
|
"type": "object",
|
|
30383
30608
|
"properties": {
|
|
@@ -31490,10 +31715,12 @@
|
|
|
31490
31715
|
"PostSsoApplicantProfileResponse": {
|
|
31491
31716
|
"type": "object",
|
|
31492
31717
|
"properties": {
|
|
31493
|
-
"profile": {}
|
|
31718
|
+
"profile": {},
|
|
31719
|
+
"guild": {}
|
|
31494
31720
|
},
|
|
31495
31721
|
"required": [
|
|
31496
|
-
"profile"
|
|
31722
|
+
"profile",
|
|
31723
|
+
"guild"
|
|
31497
31724
|
]
|
|
31498
31725
|
},
|
|
31499
31726
|
"PostSsoDevicePollRequest": {
|
|
@@ -32857,9 +33084,9 @@
|
|
|
32857
33084
|
"description": "A required dependency/feature is not configured or is temporarily down."
|
|
32858
33085
|
}
|
|
32859
33086
|
},
|
|
32860
|
-
"x-endpoint-count":
|
|
32861
|
-
"x-schema-count":
|
|
33087
|
+
"x-endpoint-count": 515,
|
|
33088
|
+
"x-schema-count": 554,
|
|
32862
33089
|
"x-undocumented-bodies": 12,
|
|
32863
|
-
"x-response-schemas":
|
|
33090
|
+
"x-response-schemas": 367,
|
|
32864
33091
|
"x-generated-by": "scripts/gds/gen-api-docs.js"
|
|
32865
33092
|
}
|
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. 515 endpoints across 93 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/0016-trust-boundary-server-enforced-permissions.md)): `public` < `any-builder` < `metic+archon` < `archon`.
|
|
@@ -379,7 +379,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
379
379
|
| POST | `/api/bongos/guild-requests/:id/accept` | `any-builder` | `visibility`, `counted_in_totals` | accept an invite addressed to ME, or (as the guild's owner) a request to join it. |
|
|
380
380
|
| POST | `/api/bongos/guild-requests/:id/decline` | `any-builder` | — | decline an invite to ME, or (as owner) a request to my guild. |
|
|
381
381
|
|
|
382
|
-
## `guilds` (
|
|
382
|
+
## `guilds` (14)
|
|
383
383
|
|
|
384
384
|
| Method | Path | Rank | Body | Description |
|
|
385
385
|
|---|---|---|---|---|
|
|
@@ -388,6 +388,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
388
388
|
| GET | `/api/bongos/guilds/:slug` | `public` | — | a public guild's page data. |
|
|
389
389
|
| PATCH | `/api/bongos/guilds/:slug` | `any-builder` | `name`, `description`, `visibility` | owner: edit name, description or visibility. |
|
|
390
390
|
| DELETE | `/api/bongos/guilds/:slug` | `any-builder` | — | owner: dissolve. |
|
|
391
|
+
| POST | `/api/bongos/guilds/:slug/engagements` | `any-builder` | `origin` | owner: file "this guild is applying to P" (ADR 0365 D2, task 1002303). |
|
|
391
392
|
| POST | `/api/bongos/guilds/:slug/invites` | `any-builder` | `handles` | owner: invite up to INVITE_BATCH_MAX builders by handle, each an ordinary individual invite (ADR 0336 D3). |
|
|
392
393
|
| GET | `/api/bongos/guilds/:slug/members` | `any-builder` | — | the members' roster, for members only (the own-scope door to an unlisted guild, ADR 0336 D4). |
|
|
393
394
|
| DELETE | `/api/bongos/guilds/:slug/members/:handle` | `any-builder` | — | owner: remove a member (never the owner). |
|
|
@@ -471,7 +472,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
471
472
|
| POST | `/api/bongos/llm-cache/lookup` | `metic+archon` | `cache_key`, `tokens_saved_est` | POST /llm-cache/lookup — hit/miss + atomic hit_count bump. |
|
|
472
473
|
| POST | `/api/bongos/llm-cache/store` | `metic+archon` | `spec`, `result_stdout`, `result_cost_usd` | POST /llm-cache/store — upsert a freshly-produced result. |
|
|
473
474
|
|
|
474
|
-
## `me` (
|
|
475
|
+
## `me` (35)
|
|
475
476
|
|
|
476
477
|
| Method | Path | Rank | Body | Description |
|
|
477
478
|
|---|---|---|---|---|
|
|
@@ -486,6 +487,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
486
487
|
| PATCH | `/api/bongos/me/display-name` | `any-builder` | _undocumented_ | PATCH the display name. |
|
|
487
488
|
| GET | `/api/bongos/me/event-sound-prefs` | `any-builder` | — | Per-builder per-event sound variant selection (task 582, migration 164). |
|
|
488
489
|
| PATCH | `/api/bongos/me/event-sound-prefs` | `any-builder` | _undocumented_ | PATCH a partial set of event sound overrides. |
|
|
490
|
+
| GET | `/api/bongos/me/guild-engagements` | `any-builder` | — | MY inbox of guild engagements (ADR 0365): "G is applying to P" and "P invited G", for guilds I belong to, inside 30 days, naming only pro… |
|
|
489
491
|
| GET | `/api/bongos/me/guild-requests` | `any-builder` | — | MY queue: invites addressed to me, each carrying the card (the guild's current visibility, which an accept must echo back), and the join … |
|
|
490
492
|
| GET | `/api/bongos/me/guilds` | `any-builder` | — | MY guilds, each with my own two switches. |
|
|
491
493
|
| PATCH | `/api/bongos/me/handle` | `any-builder` | `handle` | rename the caller's OWN handle (own data, keyed on the authenticated github_id). |
|
|
@@ -551,7 +553,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
551
553
|
| POST | `/api/bongos/my-projects/:clientId/leave` | `any-builder` | — | leave a project from the caller's OWN membership list. |
|
|
552
554
|
| GET | `/api/bongos/my-projects/invites` | `any-builder` | — | the caller's OWN pending invitations (ADR 0141 §5). |
|
|
553
555
|
| POST | `/api/bongos/my-projects/invites/:clientId/decline` | `any-builder` | — | decline an invite (delete the pending row) for the caller's OWN account. |
|
|
554
|
-
| POST | `/api/bongos/my-projects/join` | `any-builder` | `origin`, `note` | request to join a project. |
|
|
556
|
+
| POST | `/api/bongos/my-projects/join` | `any-builder` | `origin`, `note`, `guild` | request to join a project. |
|
|
555
557
|
|
|
556
558
|
## `npm-release` (8)
|
|
557
559
|
|
|
@@ -600,7 +602,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
600
602
|
| GET | `/api/bongos/project-settings` | `metic+archon` | — | GET /project-settings — all five rows in ONE read. |
|
|
601
603
|
| PATCH | `/api/bongos/project-settings/rot-days` | `metic+archon` | `days` | PATCH /project-settings/rot-days — body { days }. |
|
|
602
604
|
|
|
603
|
-
## `projects` (
|
|
605
|
+
## `projects` (8)
|
|
604
606
|
|
|
605
607
|
| Method | Path | Rank | Body | Description |
|
|
606
608
|
|---|---|---|---|---|
|
|
@@ -611,6 +613,7 @@ Base path: `/api/bongos`. Ranks (enforced server-side, [ADR 0016](adr/0016-trust
|
|
|
611
613
|
| POST | `/api/bongos/projects/:projectId/specialities` | `any-builder` | `name`, `discipline`, `summary`, `contract_md`, `visibility`, `sellable`, `skills` | POST /projects/:projectId/specialities — author one OWNED BY A PROJECT. |
|
|
612
614
|
| GET | `/api/bongos/projects/featured` | `public` | — | the public map of projects; no auth by design. |
|
|
613
615
|
| POST | `/api/bongos/projects/invite` | `metic+archon` | `client_id`, `github_login` | own-or-metic in effect: where to invite a builder into a project, asked by a `project.curate` holder OR the project's OWN OWNER (task 100… |
|
|
616
|
+
| POST | `/api/bongos/projects/invite-guild` | `metic+archon` | `client_id`, `guild` | own-or-metic in effect, the SAME gate as POST /projects/invite above and for the same reasons (a non-inviter gets that route's unchanged … |
|
|
614
617
|
|
|
615
618
|
## `provisioning` (42)
|
|
616
619
|
|