@bongos/core 1.24.90 → 1.24.92
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 +43 -38
- package/.claude/skills/builder-reauth/SKILL.md +23 -25
- package/clients/bongos-client/index.d.ts +2 -1
- package/docs/adr/0396-google-sign-in-a-stand-in-login-and-a-browser-approved-cli-sign-in.md +8 -0
- package/docs/api/openapi.json +22 -2
- package/docs/api-reference.md +1 -1
- package/docs/copy-inventory.md +7 -7
- package/docs/copy-registry.json +7 -7
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-readings.json +35 -35
- package/modules/hall-ui/public/city.css +6 -2
- package/modules/hall-ui/public/city.js +44 -2
- package/modules/hall-ui/public/shell-game.css +23 -13
- package/modules/hall-ui/public/shell-game.js +5 -4
- package/modules/hall-ui/public/visor.js +18 -3
- package/modules/hall-ui/records/start-screen.md +2 -0
- package/modules/hall-ui/records/visor.md +7 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +14 -0
- package/scripts/bongos/cli-lib.js +7 -6
- package/scripts/bongos/login.js +14 -3
- package/scripts/bongos/plain-cards.js +1 -1
- package/scripts/bongos/reauth.js +100 -50
- package/src/bongos/routes/auth-google.js +5 -3
- package/src/bongos/routes/auth.js +3 -3
- package/src/bongos/sign-in-pages.js +1 -2
- package/src/module-api.js +1 -1
- package/tests/cli_reauth_browser.mjs +157 -0
- package/tests/hall_city.mjs +41 -1
- package/tests/hall_city_living.mjs +2 -0
- package/tests/hall_start_screen.mjs +2 -1
- package/tests/hall_visor.mjs +27 -1
package/docs/page-readings.json
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"surface": "builders",
|
|
13
13
|
"title": "Studio",
|
|
14
14
|
"states_read": ["pick","describe","make","waiting","result","result-own","failed","balance","balance-all","out"],
|
|
15
|
-
"files_hash": "
|
|
15
|
+
"files_hash": "4d3ddcf70c72e2d8",
|
|
16
16
|
"reading_hash": "d9e0e85bcee4aff4",
|
|
17
17
|
"counts": {"lines":106,"placed":41,"shared":7,"unplaced":58},
|
|
18
18
|
"omitted": {"data":17},
|
|
@@ -131,7 +131,7 @@
|
|
|
131
131
|
"surface": "builders",
|
|
132
132
|
"title": "Repo Atlas",
|
|
133
133
|
"states_read": ["map","truth","detail","index","out"],
|
|
134
|
-
"files_hash": "
|
|
134
|
+
"files_hash": "5ccfecad1f11842c",
|
|
135
135
|
"reading_hash": "6934dead335b2507",
|
|
136
136
|
"counts": {"lines":25,"placed":14,"shared":7,"unplaced":4},
|
|
137
137
|
"omitted": {"data":5},
|
|
@@ -169,7 +169,7 @@
|
|
|
169
169
|
"surface": "builders",
|
|
170
170
|
"title": "Blockers",
|
|
171
171
|
"states_read": ["default"],
|
|
172
|
-
"files_hash": "
|
|
172
|
+
"files_hash": "3edd4c9a8287965e",
|
|
173
173
|
"reading_hash": "60d73d854ced958a",
|
|
174
174
|
"counts": {"lines":36,"placed":17,"shared":7,"unplaced":12},
|
|
175
175
|
"omitted": {"data":51},
|
|
@@ -218,7 +218,7 @@
|
|
|
218
218
|
"surface": "builders",
|
|
219
219
|
"title": "Board Room",
|
|
220
220
|
"states_read": ["room","out","sitting-meta","objection-form"],
|
|
221
|
-
"files_hash": "
|
|
221
|
+
"files_hash": "797b50d46b74f122",
|
|
222
222
|
"reading_hash": "0260b797b8dc1526",
|
|
223
223
|
"counts": {"lines":52,"placed":21,"shared":7,"unplaced":24},
|
|
224
224
|
"omitted": {"data":17},
|
|
@@ -283,7 +283,7 @@
|
|
|
283
283
|
"surface": "builders",
|
|
284
284
|
"title": "The city",
|
|
285
285
|
"states_read": ["city","fullscreen","focus","pins","living","card","card-ask"],
|
|
286
|
-
"files_hash": "
|
|
286
|
+
"files_hash": "2b261787034bce4e",
|
|
287
287
|
"reading_hash": "277096d903879a57",
|
|
288
288
|
"counts": {"lines":26,"placed":9,"shared":6,"unplaced":11},
|
|
289
289
|
"omitted": {"data":7},
|
|
@@ -322,7 +322,7 @@
|
|
|
322
322
|
"surface": "builders",
|
|
323
323
|
"title": "Collab",
|
|
324
324
|
"states_read": ["board","out"],
|
|
325
|
-
"files_hash": "
|
|
325
|
+
"files_hash": "6bd34870e07488b0",
|
|
326
326
|
"reading_hash": "e6452bf92231656f",
|
|
327
327
|
"counts": {"lines":82,"placed":36,"shared":6,"unplaced":40},
|
|
328
328
|
"omitted": {"data":23},
|
|
@@ -417,7 +417,7 @@
|
|
|
417
417
|
"surface": "builders",
|
|
418
418
|
"title": "Commands",
|
|
419
419
|
"states_read": ["in","out"],
|
|
420
|
-
"files_hash": "
|
|
420
|
+
"files_hash": "19b25bb84e65c93a",
|
|
421
421
|
"reading_hash": "ecc452689a8ee9d7",
|
|
422
422
|
"counts": {"lines":71,"placed":49,"shared":7,"unplaced":15},
|
|
423
423
|
"omitted": {"data":177},
|
|
@@ -501,7 +501,7 @@
|
|
|
501
501
|
"surface": "builders",
|
|
502
502
|
"title": "Copy desk",
|
|
503
503
|
"states_read": ["queue","out","search","composer","closer","proposer"],
|
|
504
|
-
"files_hash": "
|
|
504
|
+
"files_hash": "3598688fde8da13f",
|
|
505
505
|
"reading_hash": "3819ef6fa8f6fb7c",
|
|
506
506
|
"counts": {"lines":72,"placed":36,"shared":7,"unplaced":29},
|
|
507
507
|
"omitted": {"data":94},
|
|
@@ -586,7 +586,7 @@
|
|
|
586
586
|
"surface": "builders",
|
|
587
587
|
"title": "Deploy",
|
|
588
588
|
"states_read": ["work","out"],
|
|
589
|
-
"files_hash": "
|
|
589
|
+
"files_hash": "f66bb9f77832d5fe",
|
|
590
590
|
"reading_hash": "3770e8b2fa56bee1",
|
|
591
591
|
"counts": {"lines":14,"placed":5,"shared":7,"unplaced":2},
|
|
592
592
|
"omitted": {"data":5},
|
|
@@ -613,7 +613,7 @@
|
|
|
613
613
|
"surface": "builders",
|
|
614
614
|
"title": "The sky",
|
|
615
615
|
"states_read": ["tour","sky","wells","ledger","full","full-back","out"],
|
|
616
|
-
"files_hash": "
|
|
616
|
+
"files_hash": "0e5090070ad1a630",
|
|
617
617
|
"reading_hash": "4a879397a84631e3",
|
|
618
618
|
"counts": {"lines":50,"placed":25,"shared":6,"unplaced":19},
|
|
619
619
|
"omitted": {"data":10},
|
|
@@ -676,7 +676,7 @@
|
|
|
676
676
|
"surface": "builders",
|
|
677
677
|
"title": "Goals",
|
|
678
678
|
"states_read": ["list","filters","cards","detail","dependencies","out","uat","uat-panel","author"],
|
|
679
|
-
"files_hash": "
|
|
679
|
+
"files_hash": "e0237363305a997e",
|
|
680
680
|
"reading_hash": "13a5d07b3804b627",
|
|
681
681
|
"counts": {"lines":187,"placed":61,"shared":7,"unplaced":119},
|
|
682
682
|
"omitted": {"data":315},
|
|
@@ -876,7 +876,7 @@
|
|
|
876
876
|
"surface": "builders",
|
|
877
877
|
"title": "Government",
|
|
878
878
|
"states_read": ["constitution","out","permissions","board","constitution-tab"],
|
|
879
|
-
"files_hash": "
|
|
879
|
+
"files_hash": "cee3223b05313772",
|
|
880
880
|
"reading_hash": "37c6878d60447fd6",
|
|
881
881
|
"counts": {"lines":65,"placed":27,"shared":7,"unplaced":31},
|
|
882
882
|
"omitted": {"data":276},
|
|
@@ -954,8 +954,8 @@
|
|
|
954
954
|
"surface": "builders",
|
|
955
955
|
"title": "Builders' Hall",
|
|
956
956
|
"states_read": ["home","out","founding","genesis","decide","demo"],
|
|
957
|
-
"files_hash": "
|
|
958
|
-
"reading_hash": "
|
|
957
|
+
"files_hash": "8f04eab06feba493",
|
|
958
|
+
"reading_hash": "42901560779fc4d1",
|
|
959
959
|
"counts": {"lines":32,"placed":12,"shared":8,"unplaced":12},
|
|
960
960
|
"omitted": {"data":5},
|
|
961
961
|
"notes": ["founding: an action failed (page.focus: Timeout 6000ms exceeded.); read as it stood"],
|
|
@@ -977,7 +977,7 @@
|
|
|
977
977
|
{"key":"L0015","section":"Needs your attention13","text":"Ideas awaiting triage","placement":"placed","file":"modules/hall-ui/public/builders.js","line":320,"string_id":"e181637c5a5e"},
|
|
978
978
|
{"key":"L0016","section":"Needs your attention13","text":"Requires project {…} fix","placement":"unplaced"},
|
|
979
979
|
{"key":"L0017","section":"footer","text":"Sign out","placement":"shared","file":"modules/hall-ui/public/shell.js","line":514,"string_id":"1883ad7f07fc"},
|
|
980
|
-
{"key":"L0018","section":"Needs your attention13","text":"core 1.24.
|
|
980
|
+
{"key":"L0018","section":"Needs your attention13","text":"core 1.24.90","placement":"unplaced"},
|
|
981
981
|
{"key":"L0019","section":"Needs your attention13","text":"Skip","placement":"unplaced"},
|
|
982
982
|
{"key":"L0020","section":"Needs your attention13","text":"Built on","placement":"placed","file":"modules/hall-ui/public/welcome-boot.js","line":183,"string_id":"fef59346ffee"},
|
|
983
983
|
{"key":"L0021","section":"Needs your attention13","text":"cloudbongos.com","placement":"unplaced"},
|
|
@@ -999,7 +999,7 @@
|
|
|
999
999
|
"surface": "builders",
|
|
1000
1000
|
"title": "Idea",
|
|
1001
1001
|
"states_read": ["record","missing"],
|
|
1002
|
-
"files_hash": "
|
|
1002
|
+
"files_hash": "d657a33a67bc8f3b",
|
|
1003
1003
|
"reading_hash": "f7d644748c87e426",
|
|
1004
1004
|
"counts": {"lines":52,"placed":25,"shared":8,"unplaced":19},
|
|
1005
1005
|
"omitted": {"data":25},
|
|
@@ -1064,7 +1064,7 @@
|
|
|
1064
1064
|
"surface": "builders",
|
|
1065
1065
|
"title": "Ideas",
|
|
1066
1066
|
"states_read": ["compose","full","develop"],
|
|
1067
|
-
"files_hash": "
|
|
1067
|
+
"files_hash": "64316b241e5de273",
|
|
1068
1068
|
"reading_hash": "a62c05dcef3bf87f",
|
|
1069
1069
|
"counts": {"lines":68,"placed":34,"shared":7,"unplaced":27},
|
|
1070
1070
|
"omitted": {"data":118},
|
|
@@ -1145,7 +1145,7 @@
|
|
|
1145
1145
|
"surface": "builders",
|
|
1146
1146
|
"title": "Market Watch",
|
|
1147
1147
|
"states_read": ["desk","settings","out"],
|
|
1148
|
-
"files_hash": "
|
|
1148
|
+
"files_hash": "c19fa516071448c1",
|
|
1149
1149
|
"reading_hash": "30512dda207b5ea6",
|
|
1150
1150
|
"counts": {"lines":23,"placed":11,"shared":7,"unplaced":5},
|
|
1151
1151
|
"omitted": {"data":5},
|
|
@@ -1181,7 +1181,7 @@
|
|
|
1181
1181
|
"surface": "builders",
|
|
1182
1182
|
"title": "Market Watch",
|
|
1183
1183
|
"states_read": ["dossier","out","propose","correct","filtered"],
|
|
1184
|
-
"files_hash": "
|
|
1184
|
+
"files_hash": "9f574f36d050ecb4",
|
|
1185
1185
|
"reading_hash": "129bff28c4e4ed6d",
|
|
1186
1186
|
"counts": {"lines":24,"placed":12,"shared":7,"unplaced":5},
|
|
1187
1187
|
"omitted": {"data":5},
|
|
@@ -1218,7 +1218,7 @@
|
|
|
1218
1218
|
"surface": "builders",
|
|
1219
1219
|
"title": "Market Watch rules",
|
|
1220
1220
|
"states_read": ["in","scoring","names","propose","out"],
|
|
1221
|
-
"files_hash": "
|
|
1221
|
+
"files_hash": "04757fe324f6331f",
|
|
1222
1222
|
"reading_hash": "ca0c62e8dce51c8b",
|
|
1223
1223
|
"counts": {"lines":36,"placed":12,"shared":7,"unplaced":17},
|
|
1224
1224
|
"omitted": {"data":20},
|
|
@@ -1267,7 +1267,7 @@
|
|
|
1267
1267
|
"surface": "builders",
|
|
1268
1268
|
"title": "Modules",
|
|
1269
1269
|
"states_read": ["browse","search-empty","lens","details","out"],
|
|
1270
|
-
"files_hash": "
|
|
1270
|
+
"files_hash": "bb880eb91b5bffa2",
|
|
1271
1271
|
"reading_hash": "6a12e9306bba5622",
|
|
1272
1272
|
"counts": {"lines":59,"placed":29,"shared":7,"unplaced":23},
|
|
1273
1273
|
"omitted": {"data":107},
|
|
@@ -1339,7 +1339,7 @@
|
|
|
1339
1339
|
"surface": "builders",
|
|
1340
1340
|
"title": "Money",
|
|
1341
1341
|
"states_read": ["money","hosting","out"],
|
|
1342
|
-
"files_hash": "
|
|
1342
|
+
"files_hash": "eab833a98ae63570",
|
|
1343
1343
|
"reading_hash": "e355d5466b123e07",
|
|
1344
1344
|
"counts": {"lines":83,"placed":28,"shared":7,"unplaced":48},
|
|
1345
1345
|
"omitted": {"data":27},
|
|
@@ -1435,7 +1435,7 @@
|
|
|
1435
1435
|
"surface": "builders",
|
|
1436
1436
|
"title": "My agents",
|
|
1437
1437
|
"states_read": ["desk","factory","saved","what-it-knows","speciality-walk","speciality-forms","nobody"],
|
|
1438
|
-
"files_hash": "
|
|
1438
|
+
"files_hash": "f9fd9939a04db900",
|
|
1439
1439
|
"reading_hash": "5347e0496b38727d",
|
|
1440
1440
|
"counts": {"lines":100,"placed":33,"shared":7,"unplaced":60},
|
|
1441
1441
|
"omitted": {"data":38},
|
|
@@ -1548,7 +1548,7 @@
|
|
|
1548
1548
|
"surface": "builders",
|
|
1549
1549
|
"title": "Primer",
|
|
1550
1550
|
"states_read": ["in","toc-open","jump","out"],
|
|
1551
|
-
"files_hash": "
|
|
1551
|
+
"files_hash": "bab434369863a9c0",
|
|
1552
1552
|
"reading_hash": "85790bd421e5c387",
|
|
1553
1553
|
"counts": {"lines":487,"placed":57,"shared":7,"unplaced":423},
|
|
1554
1554
|
"omitted": {"data":18},
|
|
@@ -2048,7 +2048,7 @@
|
|
|
2048
2048
|
"surface": "builders",
|
|
2049
2049
|
"title": "Profile",
|
|
2050
2050
|
"states_read": ["own","works","activity","yours","activity-artist","activity-artist-ideas","other","artist","artist-ideas","out"],
|
|
2051
|
-
"files_hash": "
|
|
2051
|
+
"files_hash": "a1e1acb3badc9e27",
|
|
2052
2052
|
"reading_hash": "3ff8d703d17e8c2a",
|
|
2053
2053
|
"counts": {"lines":232,"placed":84,"shared":7,"unplaced":141},
|
|
2054
2054
|
"omitted": {"data":263},
|
|
@@ -2293,7 +2293,7 @@
|
|
|
2293
2293
|
"surface": "builders",
|
|
2294
2294
|
"title": "Project settings",
|
|
2295
2295
|
"states_read": ["default"],
|
|
2296
|
-
"files_hash": "
|
|
2296
|
+
"files_hash": "bf4ce03972123088",
|
|
2297
2297
|
"reading_hash": "283df27d0d5bfc1b",
|
|
2298
2298
|
"counts": {"lines":43,"placed":25,"shared":7,"unplaced":11},
|
|
2299
2299
|
"omitted": {"data":33},
|
|
@@ -2349,7 +2349,7 @@
|
|
|
2349
2349
|
"surface": "builders",
|
|
2350
2350
|
"title": "Builders",
|
|
2351
2351
|
"states_read": ["roster","artists","search","out"],
|
|
2352
|
-
"files_hash": "
|
|
2352
|
+
"files_hash": "c4f41160afeaf87f",
|
|
2353
2353
|
"reading_hash": "665ac2e36339f5d3",
|
|
2354
2354
|
"counts": {"lines":56,"placed":17,"shared":7,"unplaced":32},
|
|
2355
2355
|
"omitted": {"data":137},
|
|
@@ -2418,7 +2418,7 @@
|
|
|
2418
2418
|
"surface": "builders",
|
|
2419
2419
|
"title": "Options",
|
|
2420
2420
|
"states_read": ["account","access","preferences","install-reports","sound","update"],
|
|
2421
|
-
"files_hash": "
|
|
2421
|
+
"files_hash": "0f1849a1dab98d9a",
|
|
2422
2422
|
"reading_hash": "898a13fda24c3c90",
|
|
2423
2423
|
"counts": {"lines":162,"placed":104,"shared":7,"unplaced":51},
|
|
2424
2424
|
"omitted": {"data":23},
|
|
@@ -2593,7 +2593,7 @@
|
|
|
2593
2593
|
"surface": "builders",
|
|
2594
2594
|
"title": "The street",
|
|
2595
2595
|
"states_read": ["street","fullscreen","card","focus","here","inside-rules","inside-disputes","inside-people","inside-planning","inside-automation","inside-review","inside-release","inside-treasury","floor","amend","district","desk","desk-facts","desk-quiet","desk-people-builders","desk-people-tier","desk-disputes","desk-automation-goals","desk-release-core","desk-rules","desk-rules-category","desk-planning-priorities","desk-planning-ideas","desk-planning-blockers","pins","pins-pager","living","deck","deck-treasury","sitting","object","voted","admission","settled","blocker","blocker-more","report","report-more","core","core-more","recheck","recheck-more","idea","idea-more","queue","queue-more","automation","automation-more"],
|
|
2596
|
-
"files_hash": "
|
|
2596
|
+
"files_hash": "6768ffb4c12c21ac",
|
|
2597
2597
|
"reading_hash": "e788e6bf4be8d68c",
|
|
2598
2598
|
"counts": {"lines":325,"placed":54,"shared":6,"unplaced":265},
|
|
2599
2599
|
"omitted": {"data":240},
|
|
@@ -2931,7 +2931,7 @@
|
|
|
2931
2931
|
"surface": "builders",
|
|
2932
2932
|
"title": "Studio",
|
|
2933
2933
|
"states_read": ["home","out","flow","flow-pick","status","words-offer","words-edit","reviews","full","full-back","approvals","approvals-before","approvals-phone","approvals-note","approved","sent-back","approvals-page"],
|
|
2934
|
-
"files_hash": "
|
|
2934
|
+
"files_hash": "8afa7e332b24559f",
|
|
2935
2935
|
"reading_hash": "c4e3b4188c1db755",
|
|
2936
2936
|
"counts": {"lines":51,"placed":29,"shared":7,"unplaced":15},
|
|
2937
2937
|
"omitted": {"data":23},
|
|
@@ -2995,7 +2995,7 @@
|
|
|
2995
2995
|
"surface": "builders",
|
|
2996
2996
|
"title": "Task",
|
|
2997
2997
|
"states_read": ["record","from-goal","missing"],
|
|
2998
|
-
"files_hash": "
|
|
2998
|
+
"files_hash": "b839c7b452afbfbe",
|
|
2999
2999
|
"reading_hash": "8dd803b6934e6388",
|
|
3000
3000
|
"counts": {"lines":151,"placed":46,"shared":9,"unplaced":96},
|
|
3001
3001
|
"omitted": {"data":111},
|
|
@@ -3159,7 +3159,7 @@
|
|
|
3159
3159
|
"surface": "builders",
|
|
3160
3160
|
"title": "Your thinking",
|
|
3161
3161
|
"states_read": ["tour","sky","list","simple","full-idea","full","full-list","full-back","out"],
|
|
3162
|
-
"files_hash": "
|
|
3162
|
+
"files_hash": "5b659820f85a7141",
|
|
3163
3163
|
"reading_hash": "b73f848b46b0f9b8",
|
|
3164
3164
|
"counts": {"lines":50,"placed":25,"shared":6,"unplaced":19},
|
|
3165
3165
|
"omitted": {"data":10},
|
|
@@ -3222,7 +3222,7 @@
|
|
|
3222
3222
|
"surface": "builders",
|
|
3223
3223
|
"title": "Tweak a page",
|
|
3224
3224
|
"states_read": ["doc","typed","chrome","submitted","picking","out"],
|
|
3225
|
-
"files_hash": "
|
|
3225
|
+
"files_hash": "6fc3e45b7cc82f9f",
|
|
3226
3226
|
"reading_hash": "f521f8d9a7147557",
|
|
3227
3227
|
"counts": {"lines":26,"placed":18,"shared":2,"unplaced":6},
|
|
3228
3228
|
"omitted": {"data":19},
|
|
@@ -3261,7 +3261,7 @@
|
|
|
3261
3261
|
"surface": "builders",
|
|
3262
3262
|
"title": "Watch",
|
|
3263
3263
|
"states_read": ["board","out","operations","security","sessions","autobongos"],
|
|
3264
|
-
"files_hash": "
|
|
3264
|
+
"files_hash": "4e769b3c76d5f3b8",
|
|
3265
3265
|
"reading_hash": "1961a0c06b9d8477",
|
|
3266
3266
|
"counts": {"lines":72,"placed":33,"shared":7,"unplaced":32},
|
|
3267
3267
|
"omitted": {"data":52},
|
|
@@ -3346,7 +3346,7 @@
|
|
|
3346
3346
|
"surface": "builders",
|
|
3347
3347
|
"title": "Tasks",
|
|
3348
3348
|
"states_read": ["ready","in-progress","backlog","completed","filters-open","out","founding"],
|
|
3349
|
-
"files_hash": "
|
|
3349
|
+
"files_hash": "cb9ac65fd6baed84",
|
|
3350
3350
|
"reading_hash": "e9b412d1ec59ceee",
|
|
3351
3351
|
"counts": {"lines":122,"placed":49,"shared":7,"unplaced":66},
|
|
3352
3352
|
"omitted": {"data":323},
|
|
@@ -88,8 +88,12 @@ html:has(body[data-page="city"]) { height: 100%; }
|
|
|
88
88
|
the home above and below measures from the stage instead of the window. */
|
|
89
89
|
.city-main { position: fixed; top: var(--topbar-h, 56px); left: var(--sidebar-w-rail, 64px); right: 0; bottom: 0; max-width: none; margin: 0; contain: layout paint; z-index: 1; }
|
|
90
90
|
html[data-fullscreen="on"] .city-main { top: 0; left: 0; }
|
|
91
|
-
/* tasks 1005148 and
|
|
92
|
-
|
|
91
|
+
/* tasks 1005148, 1005195 and 1005209: with the visor up (game mode), the door (now its line alone) rises clear of the
|
|
92
|
+
foot row, whose one button is centred too, even when the key hints wrap onto a second line. */
|
|
93
|
+
html.visor-on .city-door { bottom: 224px; }
|
|
94
|
+
/* task 1005209 (ADR 0403): with the visor up the door's button and the archived links are the
|
|
95
|
+
visor's (D on the glass, the rest in its Actions sheet), so the scene carries none of its own. */
|
|
96
|
+
html.visor-on .city-start, html.visor-on .city-archived { display: none; }
|
|
93
97
|
@media (max-width: 768px) { .city-main { left: 0; } }
|
|
94
98
|
/* The full-screen switch floats top right over the stage, where the sun/moon
|
|
95
99
|
switch sits; the strip steps in by the button's width so nothing sits under it.
|
|
@@ -411,6 +411,7 @@
|
|
|
411
411
|
start.setAttribute('href', model.cta.href);
|
|
412
412
|
start.setAttribute('aria-label', model.cta.aria);
|
|
413
413
|
}
|
|
414
|
+
if (model.cta) registerScene(model.cta);
|
|
414
415
|
drawPlaque(model.plaque || null);
|
|
415
416
|
if (openKey) renderCard(openKey);
|
|
416
417
|
return model;
|
|
@@ -759,6 +760,47 @@
|
|
|
759
760
|
window.GovCityPage.ready = boot();
|
|
760
761
|
// task 1005148: the Governor City as the visor's scene. No camera until R13, so no movement
|
|
761
762
|
// actions (ADR 0399 §2.2); the card's own keys are listed for the sheet.
|
|
762
|
-
|
|
763
|
-
|
|
763
|
+
// task 1005209 (ADR 0403): in game mode the city's door and its two archived links are the
|
|
764
|
+
// visor's. The door is the lead action, on the glass as a key hint with D; the archived
|
|
765
|
+
// links are in the sheet's "This place" list. city.css takes them off the scene under
|
|
766
|
+
// html.visor-on; in classic mode they stay where they were and these do nothing new.
|
|
767
|
+
function doorLabel(cta) { return cta && cta.label ? String(cta.label) : 'start governing'; }
|
|
768
|
+
function sceneFor(cta) {
|
|
769
|
+
var label = doorLabel(cta);
|
|
770
|
+
return {
|
|
771
|
+
name: 'city', place: 'Governor city',
|
|
772
|
+
actions: [
|
|
773
|
+
{ label: label.charAt(0).toUpperCase() + label.slice(1), key: 'd', bind: true, lead: true, run: function () {
|
|
774
|
+
if (window.GovCityDecide && window.GovDeck) openDecide(null);
|
|
775
|
+
else if (window.location) window.location.hash = '#decide';
|
|
776
|
+
} },
|
|
777
|
+
].concat(archivedActions()),
|
|
778
|
+
keys: [{ label: 'On a card: answer', key: '1–9' }, { label: 'On a card: next', key: '← →' }],
|
|
779
|
+
};
|
|
780
|
+
}
|
|
781
|
+
// The archived links, read off the page's own line (city.html), so the sheet says and opens
|
|
782
|
+
// exactly what the line does: "Archived: Street", "Archived: Building Level Views".
|
|
783
|
+
function archivedActions() {
|
|
784
|
+
var line = document.querySelector ? document.querySelector('.city-archived') : null;
|
|
785
|
+
var links = line && line.querySelectorAll ? Array.prototype.slice.call(line.querySelectorAll('a[href]')) : [];
|
|
786
|
+
return links.map(function (a) {
|
|
787
|
+
var href = a.getAttribute('href');
|
|
788
|
+
return { label: 'Archived: ' + a.textContent, run: function () { window.location.assign(href); } };
|
|
789
|
+
});
|
|
790
|
+
}
|
|
791
|
+
// Registered once per door label: draw() calls this on every poll, and only a new label
|
|
792
|
+
// (a different streak, say) rebuilds the scene and reads the archived links again.
|
|
793
|
+
// Order matters here: boot() ran above and its first draw() has normally registered
|
|
794
|
+
// already, with the real door label. sceneLabel deliberately has no initial value, so the
|
|
795
|
+
// line after this function only registers the fallback when that draw did not register.
|
|
796
|
+
var sceneLabel;
|
|
797
|
+
function registerScene(cta) {
|
|
798
|
+
var label = doorLabel(cta);
|
|
799
|
+
if (label === sceneLabel) return;
|
|
800
|
+
sceneLabel = label;
|
|
801
|
+
var next = sceneFor(cta);
|
|
802
|
+
window.__visorScene = next;
|
|
803
|
+
if (window.OTBVisor) window.OTBVisor.scene(next);
|
|
804
|
+
}
|
|
805
|
+
if (sceneLabel == null) registerScene(null);
|
|
764
806
|
}());
|
|
@@ -63,14 +63,15 @@ html.gs-open { overflow: hidden; }
|
|
|
63
63
|
/* the ring sits inside the row: the focus colour on the edge, a band of the night inside it, so
|
|
64
64
|
one of the two reads on the accent bar as well as on the panel */
|
|
65
65
|
.gs__item:focus-visible { outline: 0; border-radius: var(--press-radius); box-shadow: var(--press-focus); }
|
|
66
|
-
/*
|
|
67
|
-
|
|
66
|
+
/* One thing is lit: Start on the menu, the view Enter takes on the chooser (task 1005206).
|
|
67
|
+
The accent bar under its dark ink, with the key that takes it */
|
|
68
|
+
.gs__item[data-gs="start"], .gs__item--lit {
|
|
68
69
|
background: var(--accent); color: var(--accent-on); border-bottom-color: transparent;
|
|
69
70
|
font-weight: var(--name-weight-lit); box-shadow: var(--accent-glow);
|
|
70
71
|
}
|
|
71
|
-
.gs__item[data-gs="start"]:hover { background: var(--accent-lift); color: var(--accent-on); }
|
|
72
|
-
.gs__item[data-gs="start"]:focus-visible { box-shadow: var(--press-focus), var(--accent-glow); }
|
|
73
|
-
.gs__item[data-gs="start"]::after {
|
|
72
|
+
.gs__item[data-gs="start"]:hover, .gs__item--lit:hover { background: var(--accent-lift); color: var(--accent-on); }
|
|
73
|
+
.gs__item[data-gs="start"]:focus-visible, .gs__item--lit:focus-visible { box-shadow: var(--press-focus), var(--accent-glow); }
|
|
74
|
+
.gs__item[data-gs="start"]::after, .gs__item--lit::after {
|
|
74
75
|
content: "Enter"; padding: 0 var(--ds-space-hair);
|
|
75
76
|
border: var(--line-strong) solid currentColor;
|
|
76
77
|
font-size: var(--ds-text-md); letter-spacing: var(--label-space);
|
|
@@ -85,16 +86,25 @@ html.gs-open { overflow: hidden; }
|
|
|
85
86
|
.gs__foot { padding: var(--ds-space-md) var(--ds-space-lg) 0; border-top: var(--line-strong) solid var(--rule); }
|
|
86
87
|
.gs__line, .gs__note { margin: 0; font-size: var(--ds-text-lg); line-height: 1.5; text-wrap: pretty; color: var(--ink-soft); }
|
|
87
88
|
.gs__note { margin-top: var(--ds-space-xs); color: var(--ink); }
|
|
88
|
-
/* the view chooser in front of the menu (task 1005200)
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
/* the view chooser in front of the menu (task 1005200), in the start menu's own shape (task
|
|
90
|
+
1005206, the Helm start-screen mock-up): Game or Classic as two rows, each with one line
|
|
91
|
+
saying what it is. The view Enter takes (last time's, else Game) is the accent bar with its
|
|
92
|
+
key, as Start is; the other is a quiet row on a hairline. Last time's says so. */
|
|
93
|
+
.gs__ask {
|
|
94
|
+
margin: 0; padding: 0 var(--ds-space-lg) var(--ds-space-sm);
|
|
95
|
+
font-family: var(--name-face); font-size: var(--label-size); font-weight: var(--name-weight);
|
|
96
|
+
letter-spacing: var(--label-space); text-transform: var(--name-case); color: var(--ink-soft);
|
|
97
|
+
}
|
|
92
98
|
.gs__ask[hidden] { display: none; }
|
|
93
|
-
.gs__item--view {
|
|
94
|
-
|
|
99
|
+
.gs__item--view {
|
|
100
|
+
position: relative; flex-direction: column; align-items: flex-start; justify-content: center;
|
|
101
|
+
gap: var(--ds-space-hair); padding-top: var(--ds-space-sm); padding-bottom: var(--ds-space-sm);
|
|
102
|
+
}
|
|
103
|
+
.gs__item--view.gs__item--lit::after { position: absolute; right: var(--ds-space-md); top: 50%; transform: translateY(-50%); }
|
|
95
104
|
.gs__view { display: inline-flex; align-items: baseline; gap: var(--ds-space-sm); }
|
|
96
|
-
.gs__sub { font-family: var(--font-body); font-size: var(--ds-text-md); letter-spacing: 0; text-transform: none; color: var(--ink-soft); }
|
|
97
|
-
.gs__last { font-family: var(--font-body); font-size: var(--label-size); letter-spacing: var(--label-space); text-transform: uppercase; color: var(--accent); }
|
|
105
|
+
.gs__sub { font-family: var(--font-body); font-size: var(--ds-text-md); font-weight: 400; letter-spacing: 0; text-transform: none; color: var(--ink-soft); }
|
|
106
|
+
.gs__last { font-family: var(--font-body); font-size: var(--label-size); font-weight: 400; letter-spacing: var(--label-space); text-transform: uppercase; color: var(--accent); }
|
|
107
|
+
.gs__item--lit .gs__sub, .gs__item--lit .gs__last { color: var(--accent-on); }
|
|
98
108
|
.gs__note[hidden] { display: none; }
|
|
99
109
|
|
|
100
110
|
/* the load screen: the week it is showing, a segment per week, the city, and the tip under it */
|
|
@@ -134,15 +134,16 @@
|
|
|
134
134
|
return '<li><button type="button"' + inner + (m.id === 'extras' ? ' aria-expanded="false" aria-controls="gs-extras"' : '') + '>' + esc(m.label) + '</button></li>';
|
|
135
135
|
}
|
|
136
136
|
// The chooser in front of the start screen (task 1005200): game or classic, the view
|
|
137
|
-
// chosen last time marked and focused, so Enter keeps it.
|
|
137
|
+
// chosen last time marked and focused, so Enter keeps it. In the Helm look (task 1005206) the
|
|
138
|
+
// view Enter takes is the lit row, as Start is on the menu: last time's, else Game.
|
|
138
139
|
var VIEWS = [
|
|
139
140
|
{ id: 'game', label: 'Game', sub: 'The city, full screen' },
|
|
140
141
|
{ id: 'classic', label: 'Classic', sub: 'The hall with its sidebar' },
|
|
141
142
|
];
|
|
142
143
|
function lastView() { var v = read('localStorage', KEY); return v === 'on' ? 'game' : v === 'off' ? 'classic' : null; }
|
|
143
144
|
function viewHtml(v) {
|
|
144
|
-
var last = lastView() === v.id;
|
|
145
|
-
return '<li><button type="button" class="gs__item gs__item--view' + (last ? ' gs__item--last' : '') + '" data-gs="view-' + v.id + '">' +
|
|
145
|
+
var last = lastView() === v.id, lit = (lastView() || 'game') === v.id;
|
|
146
|
+
return '<li><button type="button" class="gs__item gs__item--view' + (lit ? ' gs__item--lit' : '') + (last ? ' gs__item--last' : '') + '" data-gs="view-' + v.id + '">' +
|
|
146
147
|
'<span class="gs__view">' + esc(v.label) + (last ? '<span class="gs__last">Last time</span>' : '') + '</span>' +
|
|
147
148
|
'<span class="gs__sub">' + esc(v.sub) + '</span></button></li>';
|
|
148
149
|
}
|
|
@@ -360,7 +361,7 @@
|
|
|
360
361
|
document.addEventListener('keydown', onKey, true);
|
|
361
362
|
document.body.appendChild(root);
|
|
362
363
|
document.documentElement.classList.add('gs-open');
|
|
363
|
-
var first = root.querySelector('.gs__item--
|
|
364
|
+
var first = root.querySelector('.gs__item--lit') || root.querySelector('.gs__item');
|
|
364
365
|
if (first && first.focus) first.focus();
|
|
365
366
|
return true;
|
|
366
367
|
}
|
|
@@ -133,12 +133,18 @@
|
|
|
133
133
|
var scene = null;
|
|
134
134
|
// A scene says what it is and, if it has a camera, the actions that move it (ADR 0399
|
|
135
135
|
// §2.2). `keys` are lines for the sheet's "this place" list: keys the scene already binds.
|
|
136
|
+
// An action's `key` is a key the scene already binds, shown beside it; with `bind: true`
|
|
137
|
+
// the visor binds it instead (in game mode, after the character's keys), for a scene button
|
|
138
|
+
// that had no key of its own. `lead: true` puts the action on the glass as the first key
|
|
139
|
+
// hint (ADR 0403: in game mode the scene's buttons are the visor's; task 1005209).
|
|
136
140
|
function registerScene(s) {
|
|
137
141
|
if (!s || typeof s !== 'object') return;
|
|
138
142
|
scene = {
|
|
139
143
|
name: String(s.name || ''),
|
|
140
144
|
place: String(s.place || ''),
|
|
141
|
-
actions: (Array.isArray(s.actions) ? s.actions : []).filter(function (a) { return a && a.label && typeof a.run === 'function'; })
|
|
145
|
+
actions: (Array.isArray(s.actions) ? s.actions : []).filter(function (a) { return a && a.label && typeof a.run === 'function'; }).map(function (a) {
|
|
146
|
+
return { label: String(a.label), key: a.key ? String(a.key).toLowerCase() : '', bind: !!a.bind, lead: !!a.lead, run: a.run };
|
|
147
|
+
}),
|
|
142
148
|
keys: (Array.isArray(s.keys) ? s.keys : []).filter(function (k) { return k && k.label && k.key; }),
|
|
143
149
|
};
|
|
144
150
|
render();
|
|
@@ -174,6 +180,10 @@
|
|
|
174
180
|
function hintHtml(a) {
|
|
175
181
|
return '<a class="visor__hint" data-visor-act="' + esc(a.id) + '" ' + actionAttrs(a) + '>' + keyHtml(a.key) + '<span>' + esc(a.label) + '</span></a>';
|
|
176
182
|
}
|
|
183
|
+
// The scene's lead action, as the first quiet hint (task 1005209).
|
|
184
|
+
function placeHintHtml(a, i) {
|
|
185
|
+
return '<button class="visor__hint visor__hint--place" type="button" data-visor-scene="' + i + '">' + (a.key ? keyHtml(a.key) : '') + '<span>' + esc(a.label) + '</span></button>';
|
|
186
|
+
}
|
|
177
187
|
function actionAttrs(a) {
|
|
178
188
|
return a.href ? 'href="' + esc(hallHref(a.href)) + '"' : 'href="#" role="button"';
|
|
179
189
|
}
|
|
@@ -192,7 +202,7 @@
|
|
|
192
202
|
'</div>' +
|
|
193
203
|
'<a class="visor__main" data-visor-act="' + esc(main.id) + '" ' + actionAttrs(main) + '>' +
|
|
194
204
|
'<span>' + esc(main.label) + '</span>' + keyHtml(main.key) + '</a>' +
|
|
195
|
-
'<div class="visor__hints">' + acts.slice(1).map(hintHtml).join('') +
|
|
205
|
+
'<div class="visor__hints">' + scene.actions.map(function (a, i) { return a.lead ? placeHintHtml(a, i) : ''; }).join('') + acts.slice(1).map(hintHtml).join('') +
|
|
196
206
|
'<button class="visor__hint visor__hint--sheet" type="button" data-visor-sheet aria-expanded="false" aria-controls="visor-sheet">' +
|
|
197
207
|
'<span class="visor__dots" aria-hidden="true"></span>' + keyHtml(SHEET_KEY) + '<span>Actions</span></button>' +
|
|
198
208
|
'<a class="visor__hint visor__hint--options" href="' + esc(hallHref('/settings')) + '">' + keyHtml('Esc') + '<span>Options</span></a>' +
|
|
@@ -297,6 +307,7 @@
|
|
|
297
307
|
// ---------- running an action ----------
|
|
298
308
|
function run(a) {
|
|
299
309
|
if (!a) return;
|
|
310
|
+
if (typeof a.run === 'function') { a.run(); return; }
|
|
300
311
|
if (a.tool) {
|
|
301
312
|
var C = craft();
|
|
302
313
|
if (C && typeof C.openTool === 'function') C.openTool(a.tool);
|
|
@@ -342,11 +353,15 @@
|
|
|
342
353
|
if (k === SHEET_KEY) return 'sheet';
|
|
343
354
|
var acts = actionsFor(id);
|
|
344
355
|
for (var i = 0; i < acts.length; i++) if (acts[i].key === k) return acts[i];
|
|
356
|
+
// then the keys the visor binds for the place (task 1005209); the character's win a clash
|
|
357
|
+
var own = scene ? scene.actions : [];
|
|
358
|
+
for (var j = 0; j < own.length; j++) if (own[j].bind && own[j].key === k) return own[j];
|
|
345
359
|
return null;
|
|
346
360
|
}
|
|
347
361
|
// Bubble, on window: a scene or pop-up that used the key has called preventDefault by now.
|
|
348
362
|
function onKey(e) {
|
|
349
|
-
|
|
363
|
+
// The glass is game mode's alone (visor.css); outside it, its keys are not bound either.
|
|
364
|
+
if (!shown() || document.documentElement.dataset.game !== 'on' || inField(e.target) || busy()) return;
|
|
350
365
|
var hit = keyFor(character(), e);
|
|
351
366
|
if (!hit) return;
|
|
352
367
|
e.preventDefault();
|
|
@@ -27,3 +27,5 @@ Tests: `tests/hall_start_screen.mjs` (the hand-off and pure parts in a vm; both
|
|
|
27
27
|
## The view chooser (task 1005200, owner 2026-11-11)
|
|
28
28
|
|
|
29
29
|
Every sign-in now opens on a chooser before the start screen: **Game** or **Classic**, each with one line saying what it is. The view chosen last time (the browser's `hall-game` copy) is marked "Last time", lit with the accent on its edge, and focused, so Enter keeps it. Game goes on to the start screen as before; Classic closes the screen and the hall is as it always was. Either choice is saved to the account (`PATCH /api/bongos/me/hall-view`). The Extras list lost The docs: it is not a game place. Tests: `tests/hall_start_screen.mjs`.
|
|
30
|
+
|
|
31
|
+
**In the start menu's shape (task 1005206, owner 2026-11-11, from the V3 Helm start-screen mock-up).** The chooser is drawn like the menu it leads to: "How do you want to see it?" is a small label in the name voice, and the view Enter takes (last time's, else Game) is the accent bar with its "Enter" key, exactly as Start is (`.gs__item--lit` shares Start's rules); the other view is a quiet row on a hairline. Each row keeps its one line; on the lit bar the line and the "Last time" tag take `--accent-on`. Focus starts on the lit row.
|
|
@@ -4,7 +4,13 @@ Covers: `visor.js` + `visor.css`, loaded on Home, `/city`, `/goal-map` and `/thi
|
|
|
4
4
|
|
|
5
5
|
## The rule every game page keeps (ADR 0403, owner 2026-11-11)
|
|
6
6
|
|
|
7
|
-
The visor is the control and the scene is the view: every main call to action in game mode is on the glass (the accent button, the key hints, the Actions sheet), and a scene carries none of its own. A scene that has something to do registers it with `OTBVisor.scene({ actions, keys })`. ADR 0403 §3 lists the scenes that do not keep it yet.
|
|
7
|
+
The visor is the control and the scene is the view: every main call to action in game mode is on the glass (the accent button, the key hints, the Actions sheet), and a scene carries none of its own. A scene that has something to do registers it with `OTBVisor.scene({ actions, keys })`. ADR 0403 §3 lists the scenes that do not keep it yet; the Governor City keeps it since task 1005209 (below).
|
|
8
|
+
|
|
9
|
+
## A place's own buttons on the glass (task 1005209, the Governor City first)
|
|
10
|
+
|
|
11
|
+
- **The scene contract grew two flags.** A scene action's `key` is still a key the scene binds itself, shown beside it in the sheet. With `bind: true` the visor binds that key instead, after the character's keys (a clash goes to the character), for a scene button that had no key of its own. With `lead: true` the action is also the first quiet key hint on the glass (`.visor__hint--place`). Every scene action is still a row under "This place" in the sheet.
|
|
12
|
+
- **The glass binds keys in game mode only.** `onKey` now returns unless `html[data-game="on"]`: the glass was never drawn outside game mode, so its keys no longer act there either (before, a held character's letter keys still ran on a classic page).
|
|
13
|
+
- **The Governor City keeps ADR 0403.** In game mode (`html.visor-on`) the door's button (`#cityStart`) and the archived Street links leave the scene (`city.css`). The door is the lead action, on D, in the door's own words ("Decide 37 in a row", or "Start governing"); it re-registers only when those words change. The archived links are rows in the sheet ("Archived: Street", "Archived: Building Level Views"), read off the page's own archived line so the words and the addresses cannot drift; reached by A and the keyboard. The city line stays on the scene as words, raised to `bottom: 224px` because the extra hint wraps the hints onto a second line at a desk width and the centred accent button rises with it. A building's card is a pop-up, not the scene, and keeps its own buttons and keys. Classic mode is as it was.
|
|
8
14
|
|
|
9
15
|
## The minimal visor (Helm look 3, task 1005195)
|
|
10
16
|
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.24.
|
|
3
|
+
"version": "1.24.92",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.24.
|
|
9
|
+
"version": "1.24.92",
|
|
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.24.
|
|
3
|
+
"version": "1.24.92",
|
|
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",
|
package/release-notes.json
CHANGED
|
@@ -11643,5 +11643,19 @@
|
|
|
11643
11643
|
"id": "1005207",
|
|
11644
11644
|
"text": "In the game view the Artist's feedback tab no longer sits on the screen; the Artist opens the feedback sheet from the visor, and only the Artist can open it."
|
|
11645
11645
|
}
|
|
11646
|
+
],
|
|
11647
|
+
"1.24.92": [
|
|
11648
|
+
{
|
|
11649
|
+
"id": "1005209",
|
|
11650
|
+
"text": "In game mode the Governor City no longer has a button of its own: \"Decide N in a row\" is now on the visor (press D), and the archived Street links are in the visor's Actions list. Classic mode is unchanged."
|
|
11651
|
+
},
|
|
11652
|
+
{
|
|
11653
|
+
"id": "1005118",
|
|
11654
|
+
"text": "Signing the command line back in is now one Approve click in the browser — no copying, no pasting, and the sign-in key never appears in the chat."
|
|
11655
|
+
},
|
|
11656
|
+
{
|
|
11657
|
+
"id": "1005206",
|
|
11658
|
+
"text": "The screen you land on after signing in, where you pick Game or Classic, now looks like the V3 game start menu: your usual choice is the bright salmon bar with its Enter key, the other a quiet row."
|
|
11659
|
+
}
|
|
11646
11660
|
]
|
|
11647
11661
|
}
|