@bongos/core 1.21.15 → 1.21.17
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 +41 -31
- package/docs/adr/0364-repo-access-is-asked-at-sign-in-and-held-for-the-session.md +30 -0
- package/docs/adr/README.md +1 -0
- package/docs/copy-inventory.md +217 -216
- package/docs/copy-registry.json +252 -243
- package/docs/module-api-changelog.md +4 -0
- package/docs/page-readings.json +499 -508
- package/modules/hall-ui/public/settings.html +10 -0
- package/modules/hall-ui/public/settings.js +6 -4
- package/modules/public-landing/public/account.html +2 -2
- package/modules/public-landing/public/account.probes.json +2 -2
- package/modules/public-landing/public/index.html +1 -1
- package/modules/public-landing/public/projects.html +22 -13
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +12 -0
- package/src/bongos/db.js +7 -6
- package/src/bongos/routes/auth.js +17 -4
- package/src/module-api.js +1 -1
- package/tests/github_token_session_life.mjs +110 -0
- package/tests/hub_account_page.mjs +2 -2
- package/tests/landing_page.mjs +2 -2
- package/tests/projects_hub_pre_uat.mjs +2 -1
- package/tests/sound_player.mjs +25 -5
- package/tests/wizard_draft_resume.mjs +49 -0
- package/tests/wizard_intent_resume.mjs +4 -2
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.21.
|
|
6
|
-
"core_contract": "1.21.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.21.17",
|
|
6
|
+
"core_contract": "1.21.17",
|
|
7
|
+
"source_commit": "82dd9252702fdebafededbe79af3526f2c03e98d",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-10-
|
|
9
|
+
"built_at": "2026-10-02T20:25:38.914Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
12
|
+
"docs_redacted": 580,
|
|
13
13
|
"agent_docs_stubbed": 27,
|
|
14
|
-
"functional_verbatim":
|
|
14
|
+
"functional_verbatim": 2893,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 3501,
|
|
20
|
+
"tree_sha256": "b7aaf5d0dd41a727cb6b8950634f283c3ea7aa2b58a25e7f1e95eba3188c429e",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -2279,10 +2279,15 @@
|
|
|
2279
2279
|
"mode": "0000644",
|
|
2280
2280
|
"sha256": "4feed5892da4fe2fbe148cdf56edeacd2bf7e6c3886a880a4246811e500e6973"
|
|
2281
2281
|
},
|
|
2282
|
+
{
|
|
2283
|
+
"path": "docs/adr/0364-repo-access-is-asked-at-sign-in-and-held-for-the-session.md",
|
|
2284
|
+
"mode": "0000644",
|
|
2285
|
+
"sha256": "ed10b87275d0c3fbaa665467dfd0305274adbbc85556a5162346b3a2537a78ee"
|
|
2286
|
+
},
|
|
2282
2287
|
{
|
|
2283
2288
|
"path": "docs/adr/README.md",
|
|
2284
2289
|
"mode": "0000644",
|
|
2285
|
-
"sha256": "
|
|
2290
|
+
"sha256": "037b81d2507eba161cd12c7daafb32071e6c65bc3383d0174e4ac96aa6ab6dc4"
|
|
2286
2291
|
},
|
|
2287
2292
|
{
|
|
2288
2293
|
"path": "docs/api-reference.md",
|
|
@@ -2317,12 +2322,12 @@
|
|
|
2317
2322
|
{
|
|
2318
2323
|
"path": "docs/copy-inventory.md",
|
|
2319
2324
|
"mode": "0000644",
|
|
2320
|
-
"sha256": "
|
|
2325
|
+
"sha256": "ba802364b88549796f90376281aa4983675437d938b2a275b6a9a3c3dbcae521"
|
|
2321
2326
|
},
|
|
2322
2327
|
{
|
|
2323
2328
|
"path": "docs/copy-registry.json",
|
|
2324
2329
|
"mode": "0000644",
|
|
2325
|
-
"sha256": "
|
|
2330
|
+
"sha256": "680d713c880b52ac4891a351b2155e95788ea9a368e46f481997e170309e1e4d"
|
|
2326
2331
|
},
|
|
2327
2332
|
{
|
|
2328
2333
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2827,7 +2832,7 @@
|
|
|
2827
2832
|
{
|
|
2828
2833
|
"path": "docs/module-api-changelog.md",
|
|
2829
2834
|
"mode": "0000644",
|
|
2830
|
-
"sha256": "
|
|
2835
|
+
"sha256": "b26aca84e0a1b73f1d796b2d8d4062b8df7816766e5bb77942bfd932a910a7e1"
|
|
2831
2836
|
},
|
|
2832
2837
|
{
|
|
2833
2838
|
"path": "docs/modules-contract.md",
|
|
@@ -2917,7 +2922,7 @@
|
|
|
2917
2922
|
{
|
|
2918
2923
|
"path": "docs/page-readings.json",
|
|
2919
2924
|
"mode": "0000644",
|
|
2920
|
-
"sha256": "
|
|
2925
|
+
"sha256": "5e5d53d5e5c44705ace2e2df469cfb444eb534e536d152b35b91127917dc59b0"
|
|
2921
2926
|
},
|
|
2922
2927
|
{
|
|
2923
2928
|
"path": "docs/project-context.template.md",
|
|
@@ -6077,12 +6082,12 @@
|
|
|
6077
6082
|
{
|
|
6078
6083
|
"path": "modules/hall-ui/public/settings.html",
|
|
6079
6084
|
"mode": "0000644",
|
|
6080
|
-
"sha256": "
|
|
6085
|
+
"sha256": "44da21a466633f96c2eca5515a679fad31421b5442adbec9fc2a5c59b152e42b"
|
|
6081
6086
|
},
|
|
6082
6087
|
{
|
|
6083
6088
|
"path": "modules/hall-ui/public/settings.js",
|
|
6084
6089
|
"mode": "0000644",
|
|
6085
|
-
"sha256": "
|
|
6090
|
+
"sha256": "bb282ae096d880185aeb8f0e954286743f49fb256f52a598302d43333e54c56c"
|
|
6086
6091
|
},
|
|
6087
6092
|
{
|
|
6088
6093
|
"path": "modules/hall-ui/public/settings.states.json",
|
|
@@ -8427,12 +8432,12 @@
|
|
|
8427
8432
|
{
|
|
8428
8433
|
"path": "modules/public-landing/public/account.html",
|
|
8429
8434
|
"mode": "0000644",
|
|
8430
|
-
"sha256": "
|
|
8435
|
+
"sha256": "c86bf7e9ca40631cc1b011a915c834a6ce1399d23c4cb7873d9276138c8e5b56"
|
|
8431
8436
|
},
|
|
8432
8437
|
{
|
|
8433
8438
|
"path": "modules/public-landing/public/account.probes.json",
|
|
8434
8439
|
"mode": "0000644",
|
|
8435
|
-
"sha256": "
|
|
8440
|
+
"sha256": "d592e0f97f5415c1b42d8cb508b3bca327a2484640a7ee2aa9bef606d400bfa9"
|
|
8436
8441
|
},
|
|
8437
8442
|
{
|
|
8438
8443
|
"path": "modules/public-landing/public/account.states.json",
|
|
@@ -8992,7 +8997,7 @@
|
|
|
8992
8997
|
{
|
|
8993
8998
|
"path": "modules/public-landing/public/index.html",
|
|
8994
8999
|
"mode": "0000644",
|
|
8995
|
-
"sha256": "
|
|
9000
|
+
"sha256": "4a0f39a8b4ca35d64ee0a66d38c1d56ae90605678483b0e74b3618dcc1722288"
|
|
8996
9001
|
},
|
|
8997
9002
|
{
|
|
8998
9003
|
"path": "modules/public-landing/public/index.probes.json",
|
|
@@ -9037,7 +9042,7 @@
|
|
|
9037
9042
|
{
|
|
9038
9043
|
"path": "modules/public-landing/public/projects.html",
|
|
9039
9044
|
"mode": "0000644",
|
|
9040
|
-
"sha256": "
|
|
9045
|
+
"sha256": "0e6ba49becc74c5a73f3e0b1babec2521d6a84a3b8c48e116c675c05005c2d1e"
|
|
9041
9046
|
},
|
|
9042
9047
|
{
|
|
9043
9048
|
"path": "modules/public-landing/public/projects.probes.json",
|
|
@@ -9762,12 +9767,12 @@
|
|
|
9762
9767
|
{
|
|
9763
9768
|
"path": "package-lock.json",
|
|
9764
9769
|
"mode": "0000644",
|
|
9765
|
-
"sha256": "
|
|
9770
|
+
"sha256": "522b35ff0a0b9e426978402e01750d538e32ee626012172e235929fe6a9f747d"
|
|
9766
9771
|
},
|
|
9767
9772
|
{
|
|
9768
9773
|
"path": "package.json",
|
|
9769
9774
|
"mode": "0000644",
|
|
9770
|
-
"sha256": "
|
|
9775
|
+
"sha256": "2d295364110f1f0fe31941d493b9cff78ed294958fae9b21dda70f63b9e021e0"
|
|
9771
9776
|
},
|
|
9772
9777
|
{
|
|
9773
9778
|
"path": "public-docs/index.html",
|
|
@@ -9787,7 +9792,7 @@
|
|
|
9787
9792
|
{
|
|
9788
9793
|
"path": "release-notes.json",
|
|
9789
9794
|
"mode": "0000644",
|
|
9790
|
-
"sha256": "
|
|
9795
|
+
"sha256": "2f3123e8b496967e1c09515ec7a5325a62be62cc68bad2de41232e622fa849a5"
|
|
9791
9796
|
},
|
|
9792
9797
|
{
|
|
9793
9798
|
"path": "scripts/bongos-mcp.js",
|
|
@@ -11702,7 +11707,7 @@
|
|
|
11702
11707
|
{
|
|
11703
11708
|
"path": "src/bongos/db.js",
|
|
11704
11709
|
"mode": "0000644",
|
|
11705
|
-
"sha256": "
|
|
11710
|
+
"sha256": "29801ce9f6f28fef024f9424ffb1903856e6c1c3a847d16f243634ae6fbb91b0"
|
|
11706
11711
|
},
|
|
11707
11712
|
{
|
|
11708
11713
|
"path": "src/bongos/github-repos.js",
|
|
@@ -11877,7 +11882,7 @@
|
|
|
11877
11882
|
{
|
|
11878
11883
|
"path": "src/bongos/routes/auth.js",
|
|
11879
11884
|
"mode": "0000644",
|
|
11880
|
-
"sha256": "
|
|
11885
|
+
"sha256": "3ba37d575862699c9f300b67761cc88594d4a5bce256e127fa7dedd5709e5917"
|
|
11881
11886
|
},
|
|
11882
11887
|
{
|
|
11883
11888
|
"path": "src/bongos/routes/backup.js",
|
|
@@ -12012,7 +12017,7 @@
|
|
|
12012
12017
|
{
|
|
12013
12018
|
"path": "src/module-api.js",
|
|
12014
12019
|
"mode": "0000644",
|
|
12015
|
-
"sha256": "
|
|
12020
|
+
"sha256": "42075e400f00814de20942f57b81cb7e63d9c31bf655e3500ce9ddf691a6c7c4"
|
|
12016
12021
|
},
|
|
12017
12022
|
{
|
|
12018
12023
|
"path": "src/module-loader/catalog.js",
|
|
@@ -13619,6 +13624,11 @@
|
|
|
13619
13624
|
"mode": "0000644",
|
|
13620
13625
|
"sha256": "66fd3d349445aa00e55fa77589958d6c98980e99f3cdaf4746ff55494202333a"
|
|
13621
13626
|
},
|
|
13627
|
+
{
|
|
13628
|
+
"path": "tests/github_token_session_life.mjs",
|
|
13629
|
+
"mode": "0000644",
|
|
13630
|
+
"sha256": "40975159ab53479398036f9253f01a37e80d41d101195962d3a9b255818b2a0f"
|
|
13631
|
+
},
|
|
13622
13632
|
{
|
|
13623
13633
|
"path": "tests/github_token_store.mjs",
|
|
13624
13634
|
"mode": "0000644",
|
|
@@ -14472,7 +14482,7 @@
|
|
|
14472
14482
|
{
|
|
14473
14483
|
"path": "tests/hub_account_page.mjs",
|
|
14474
14484
|
"mode": "0000644",
|
|
14475
|
-
"sha256": "
|
|
14485
|
+
"sha256": "bf44295f77e302358bd11cc0565bc98bc5d7f35a7fbb7d53405df469caee8c09"
|
|
14476
14486
|
},
|
|
14477
14487
|
{
|
|
14478
14488
|
"path": "tests/hub_cookie_host_only.mjs",
|
|
@@ -14882,7 +14892,7 @@
|
|
|
14882
14892
|
{
|
|
14883
14893
|
"path": "tests/landing_page.mjs",
|
|
14884
14894
|
"mode": "0000644",
|
|
14885
|
-
"sha256": "
|
|
14895
|
+
"sha256": "cfc8139b18524e5b5a10b69aa7eeef13427cc60bd2c0df3d19ce080ccc913fe4"
|
|
14886
14896
|
},
|
|
14887
14897
|
{
|
|
14888
14898
|
"path": "tests/leaderboard_roles.mjs",
|
|
@@ -15812,7 +15822,7 @@
|
|
|
15812
15822
|
{
|
|
15813
15823
|
"path": "tests/projects_hub_pre_uat.mjs",
|
|
15814
15824
|
"mode": "0000644",
|
|
15815
|
-
"sha256": "
|
|
15825
|
+
"sha256": "0344be486a7d4157818929c8adcdf8406f1370ca2e35722ddc2e84a1a9ba7cce"
|
|
15816
15826
|
},
|
|
15817
15827
|
{
|
|
15818
15828
|
"path": "tests/projects_hub_render_connect.mjs",
|
|
@@ -16882,7 +16892,7 @@
|
|
|
16882
16892
|
{
|
|
16883
16893
|
"path": "tests/sound_player.mjs",
|
|
16884
16894
|
"mode": "0000644",
|
|
16885
|
-
"sha256": "
|
|
16895
|
+
"sha256": "d18a3314b7780d09cd221a5791d9a9fb0243f16b2197f4c5de0777c691ae3d02"
|
|
16886
16896
|
},
|
|
16887
16897
|
{
|
|
16888
16898
|
"path": "tests/sound_prefs.mjs",
|
|
@@ -17442,7 +17452,7 @@
|
|
|
17442
17452
|
{
|
|
17443
17453
|
"path": "tests/wizard_draft_resume.mjs",
|
|
17444
17454
|
"mode": "0000644",
|
|
17445
|
-
"sha256": "
|
|
17455
|
+
"sha256": "2a5891107a8ad920ec3badff34ddd1ab96a7685a11884c2709747f944b0d5916"
|
|
17446
17456
|
},
|
|
17447
17457
|
{
|
|
17448
17458
|
"path": "tests/wizard_front_door.mjs",
|
|
@@ -17452,7 +17462,7 @@
|
|
|
17452
17462
|
{
|
|
17453
17463
|
"path": "tests/wizard_intent_resume.mjs",
|
|
17454
17464
|
"mode": "0000644",
|
|
17455
|
-
"sha256": "
|
|
17465
|
+
"sha256": "683dbd4b608b65977e1ebbd1fed4916ff0ed74eead0f379d2309e940779c4b1f"
|
|
17456
17466
|
},
|
|
17457
17467
|
{
|
|
17458
17468
|
"path": "tests/wizard_physics.mjs",
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# ADR 0364 — Repo access is asked at sign-in on the hub, and held for as long as the builder stays signed in
|
|
2
|
+
|
|
3
|
+
- **Status:** Accepted.
|
|
4
|
+
- **Date:** 2026-10-02
|
|
5
|
+
- **Task:** [task 1004549](https://cloudbongos.com/builders#/task/1004549).
|
|
6
|
+
- **Amends:** [ADR 0143](0143-onboarding-repo-picker-oauth-scope.md) (the repo token's short hold) and [ADR 0155](0155-adopt-private-repo-widen-oauth-scope.md) (where the `repo` scope is asked).
|
|
7
|
+
|
|
8
|
+
## Context
|
|
9
|
+
|
|
10
|
+
The owner reported that "Allow repo access" in the create wizard's review step threw them out of the flow, and never seemed to reach GitHub. Both parts were true:
|
|
11
|
+
|
|
12
|
+
- GitHub already held the owner's approval of the `repo` scope, so its authorize step answered at once and bounced straight back. The round-trip looked like a reload.
|
|
13
|
+
- The platform asked again because it kept its copy of the token for one hour only (`GITHUB_TOKEN_TTL_MS`). An owner who signed in from the front page, or more than an hour earlier, was sent away from the middle of the wizard to fetch a grant GitHub already held.
|
|
14
|
+
- The bounce then landed on the wrong screen. With a project created earlier in the same tab, `enter()` passed every arrival to `enterCreated()`, which treats a non-deliberate arrival as "the same visit, show the watched project". So the founder landed on the earlier project's done panel instead of their draft.
|
|
15
|
+
|
|
16
|
+
## Decision
|
|
17
|
+
|
|
18
|
+
**D1 — Every sign-in door on the hub's own pages asks for repo access.** These are the front page, the projects hub (bar, Your-projects gate, manage gate, the wizard's own door and its 401 recoveries) and the account page. All of them carry `repos=1`. It is asked once, when the person signs in, because anyone signing in on the hub is there to create or run a project, which needs it. The builders' hall and the CLI sign-ins stay identity-only. That is ADR 0143's least-privilege default, and it is unchanged where the person may only be joining someone else's project.
|
|
19
|
+
|
|
20
|
+
**D2 — The token lives as long as the session it arrived with.** The callback passes the web session's remaining life (30 days today) to `upsertGithubToken` as its TTL. The one-hour constant remains only as the fallback for when no session expiry is known. A **web** sign-out deletes the token. A CLI logout (bearer header) leaves it alone, because the browser session that granted it is still live. Offboarding and a GitHub-side revocation (401) still delete it, as before.
|
|
21
|
+
|
|
22
|
+
**D3 — A GitHub round-trip never loses the founder's place.** If a draft sits at a wizard step (1–5) beside a stored create, the draft wins on any non-deliberate arrival: a reload, or a return from GitHub. The earlier project stays one click away on the resume line. A deliberate nav and the resume link still go through `enterCreated()` exactly as task 1003503 built it. The review step's "Allow repo access" offer remains as the backup for a session that predates this change.
|
|
23
|
+
|
|
24
|
+
## Consequences
|
|
25
|
+
|
|
26
|
+
- A first-time visitor signing in on the hub now sees GitHub's repository-access wording at sign-in, rather than at the review step. GitHub words it as full control of all their repositories. The wizard's own explanation still sits beside the review step's backup offer. The front page's sign-in pill carries none, which is the cost of asking at the door.
|
|
27
|
+
- The platform holds a powerful credential for up to 30 days instead of one hour. It is still encrypted at rest with secret-box, keyed to one builder and never returned to a client, and it is never stored at all when secret-box is unconfigured. A server compromise during that window exposes more than it did. The owner accepted this explicitly (2026-10-02).
|
|
28
|
+
- Tests: `tests/github_token_session_life.mjs` (D2, over the real auth router), `tests/wizard_draft_resume.mjs` slice 4 (D3), and the updated sign-in href pins in `landing_page`, `hub_account_page` and `projects_hub_pre_uat`.
|
|
29
|
+
|
|
30
|
+
Rejected: keeping the ask inside the wizard and moving it to the first screen. That is still a stop in the middle of a flow, and the owner preferred sign-in. Silently refreshing the token in the background: it needs a GitHub round-trip, which is a navigation, not a background call.
|
package/docs/adr/README.md
CHANGED
|
@@ -482,3 +482,4 @@ These 20 numbers are each shared by exactly two files. They are **accepted histo
|
|
|
482
482
|
| 0361 | [**Merges publish as candidates; Release on /deploy decides what other projects are offered** ([task 1004298](https://cloudbongos.com/builders#/task/1004298), goal 1000090). Amends ADR 0161. **D1:** merges publish under `next` when `PUBLISH_AS_CANDIDATE=1` (ships inert). **D2:** a `release` job in publish.yml moves `latest` (release-core.js: published, stable, newer than the release) over the same OIDC trusted publisher — no npm token. **D3:** /deploy's Release button (`core.pin.move`) dispatches it through the one-function `lifecycle.workflowDispatch` port. **D4:** evidence beside each button — hours on this hall, ever rolled back. **D5:** the banner and the hosted-project runner offer only released versions; the control-plane row follows candidates. Arming: roster follow → npm dist-tag permission → GitHub credential Actions: write → the variable.](0361-merges-publish-as-candidates-release-decides-what-others-are-offered.md) | publish / release / update channel |
|
|
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
|
+
| 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 |
|