@bongos/core 1.19.519 → 1.19.521
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 +18 -18
- package/docs/copy-inventory.md +13 -13
- package/docs/copy-registry.json +13 -13
- package/docs/module-api-changelog.md +4 -0
- package/modules/hall-ui/public/builders.js +8 -4
- package/modules/hall-ui/public/copy-desk.css +5 -5
- package/modules/hall-ui/public/style.css +24 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/fetch-sound-prefs.js +4 -1
- package/src/module-api.js +1 -1
- package/tests/hall_audit.mjs +143 -0
- package/tests/hall_collab_world.mjs +6 -3
- package/tests/memory_pull.mjs +24 -5
package/.bongos-core.json
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
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.521",
|
|
6
|
+
"core_contract": "1.19.521",
|
|
7
|
+
"source_commit": "e4f2e1b87d89acb6c50a86896af501eff629a49f",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-
|
|
9
|
+
"built_at": "2026-09-03T22:32:55.137Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 431,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 2424,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "5cf629aad21665a1b205bb6529f9103bde6140bdaa5d5bb8bb950677b588c058",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -1747,12 +1747,12 @@
|
|
|
1747
1747
|
{
|
|
1748
1748
|
"path": "docs/copy-inventory.md",
|
|
1749
1749
|
"mode": "0000644",
|
|
1750
|
-
"sha256": "
|
|
1750
|
+
"sha256": "804238f39cba79b0503aee0079bde0272398c96b713e26c4f32298cd1db0fc06"
|
|
1751
1751
|
},
|
|
1752
1752
|
{
|
|
1753
1753
|
"path": "docs/copy-registry.json",
|
|
1754
1754
|
"mode": "0000644",
|
|
1755
|
-
"sha256": "
|
|
1755
|
+
"sha256": "2df6e1780324aa67c25e347010082441d8267ff754ca3bb76c4071228f0c579d"
|
|
1756
1756
|
},
|
|
1757
1757
|
{
|
|
1758
1758
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2597,7 +2597,7 @@
|
|
|
2597
2597
|
{
|
|
2598
2598
|
"path": "docs/module-api-changelog.md",
|
|
2599
2599
|
"mode": "0000644",
|
|
2600
|
-
"sha256": "
|
|
2600
|
+
"sha256": "f19fae1616ebe6fcb885f54592364bc673ed8df8ac23c857377c7959490c87b6"
|
|
2601
2601
|
},
|
|
2602
2602
|
{
|
|
2603
2603
|
"path": "docs/modules-contract.md",
|
|
@@ -4517,7 +4517,7 @@
|
|
|
4517
4517
|
{
|
|
4518
4518
|
"path": "modules/hall-ui/public/builders.js",
|
|
4519
4519
|
"mode": "0000644",
|
|
4520
|
-
"sha256": "
|
|
4520
|
+
"sha256": "b9cf0c5dc9e0df09eb16a8c14b3d50d9d8ebcf899da5c7b10318f81fe5615d45"
|
|
4521
4521
|
},
|
|
4522
4522
|
{
|
|
4523
4523
|
"path": "modules/hall-ui/public/chime.wav",
|
|
@@ -4552,7 +4552,7 @@
|
|
|
4552
4552
|
{
|
|
4553
4553
|
"path": "modules/hall-ui/public/copy-desk.css",
|
|
4554
4554
|
"mode": "0000644",
|
|
4555
|
-
"sha256": "
|
|
4555
|
+
"sha256": "d67e5be0a1f2497d5c28d8daa2206cccf1eb81c8aaa2c41b4e41230e88a4baac"
|
|
4556
4556
|
},
|
|
4557
4557
|
{
|
|
4558
4558
|
"path": "modules/hall-ui/public/copy-desk.html",
|
|
@@ -5077,7 +5077,7 @@
|
|
|
5077
5077
|
{
|
|
5078
5078
|
"path": "modules/hall-ui/public/style.css",
|
|
5079
5079
|
"mode": "0000644",
|
|
5080
|
-
"sha256": "
|
|
5080
|
+
"sha256": "41aae0ec3164d3f0e4d485ad029c98980b2d18e791a04aa4e7714ba94e776ef9"
|
|
5081
5081
|
},
|
|
5082
5082
|
{
|
|
5083
5083
|
"path": "modules/hall-ui/public/task-detail.js",
|
|
@@ -7297,12 +7297,12 @@
|
|
|
7297
7297
|
{
|
|
7298
7298
|
"path": "package-lock.json",
|
|
7299
7299
|
"mode": "0000644",
|
|
7300
|
-
"sha256": "
|
|
7300
|
+
"sha256": "b18f028ece28c2fd6605db03201f068504d5b57a2a402d79f2f28bad551e2ddc"
|
|
7301
7301
|
},
|
|
7302
7302
|
{
|
|
7303
7303
|
"path": "package.json",
|
|
7304
7304
|
"mode": "0000644",
|
|
7305
|
-
"sha256": "
|
|
7305
|
+
"sha256": "d6b8d673c517a74dc369500ba850c49d367d860455f97c3a265525c5588057a4"
|
|
7306
7306
|
},
|
|
7307
7307
|
{
|
|
7308
7308
|
"path": "public-docs/index.html",
|
|
@@ -7702,7 +7702,7 @@
|
|
|
7702
7702
|
{
|
|
7703
7703
|
"path": "scripts/gds/fetch-sound-prefs.js",
|
|
7704
7704
|
"mode": "0000644",
|
|
7705
|
-
"sha256": "
|
|
7705
|
+
"sha256": "ea36d22031b18f2682ca2e1475a556b21fc2b5817de1f94d872e947247553144"
|
|
7706
7706
|
},
|
|
7707
7707
|
{
|
|
7708
7708
|
"path": "scripts/gds/figma-design-sync.js",
|
|
@@ -8972,7 +8972,7 @@
|
|
|
8972
8972
|
{
|
|
8973
8973
|
"path": "src/module-api.js",
|
|
8974
8974
|
"mode": "0000644",
|
|
8975
|
-
"sha256": "
|
|
8975
|
+
"sha256": "192a36ccb6a9fb1b60332dda5c8ad12c5b53d104d9f9554d72505645ed66d7d3"
|
|
8976
8976
|
},
|
|
8977
8977
|
{
|
|
8978
8978
|
"path": "src/module-loader/catalog.js",
|
|
@@ -10357,7 +10357,7 @@
|
|
|
10357
10357
|
{
|
|
10358
10358
|
"path": "tests/hall_audit.mjs",
|
|
10359
10359
|
"mode": "0000644",
|
|
10360
|
-
"sha256": "
|
|
10360
|
+
"sha256": "de4b33fd78de12daf1b6e07eeb3834ffd19e912ea81c1d2ba91a129a19e7382a"
|
|
10361
10361
|
},
|
|
10362
10362
|
{
|
|
10363
10363
|
"path": "tests/hall_board_world.mjs",
|
|
@@ -10372,7 +10372,7 @@
|
|
|
10372
10372
|
{
|
|
10373
10373
|
"path": "tests/hall_collab_world.mjs",
|
|
10374
10374
|
"mode": "0000644",
|
|
10375
|
-
"sha256": "
|
|
10375
|
+
"sha256": "b597173a0d280286f0f5ff5d13e0065b2c1dc311024d1f13b5c2d0c3915daf45"
|
|
10376
10376
|
},
|
|
10377
10377
|
{
|
|
10378
10378
|
"path": "tests/hall_error_envelope.mjs",
|
|
@@ -10822,7 +10822,7 @@
|
|
|
10822
10822
|
{
|
|
10823
10823
|
"path": "tests/memory_pull.mjs",
|
|
10824
10824
|
"mode": "0000644",
|
|
10825
|
-
"sha256": "
|
|
10825
|
+
"sha256": "d05b6e354ac08cf5512a62b76b213df44ab1ef8639a1ba635319e9b5e8511a5c"
|
|
10826
10826
|
},
|
|
10827
10827
|
{
|
|
10828
10828
|
"path": "tests/merge_lease.mjs",
|
package/docs/copy-inventory.md
CHANGED
|
@@ -132,7 +132,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
132
132
|
| `1b326b0be1a4` | certain | A {…} — you are a {…}. Mingle pairs across crafts. | `modules/hall-ui/public/collab.js:173` |
|
|
133
133
|
| `996edffc1966` | certain | Access requests | `modules/hall-ui/public/watch.html:46` |
|
|
134
134
|
| `996edffc1966` | certain | Access requests | `modules/hall-ui/public/watch.html:61` |
|
|
135
|
-
| `303f8d90266f` | certain | Achievements could not be loaded. | `modules/hall-ui/public/builders.js:
|
|
135
|
+
| `303f8d90266f` | certain | Achievements could not be loaded. | `modules/hall-ui/public/builders.js:1154` |
|
|
136
136
|
| `6ca31dd5eb91` | certain | Acknowledge the primer | `modules/hall-ui/public/primer.html:99` |
|
|
137
137
|
| `4461b13f95c2` | certain | Actions apply at once. Closing stops and deletes the box; you can start a fresh one anytime. | `modules/hall-ui/public/settings.html:209` |
|
|
138
138
|
| `524188fe0078` | certain | Active sessions | `modules/hall-ui/public/settings.html:162` |
|
|
@@ -365,7 +365,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
365
365
|
| `541127601291` | certain | Download for Mac | `modules/hall-ui/public/settings.html:224` |
|
|
366
366
|
| `2ed2fd8376c0` | certain | Download for Windows | `modules/hall-ui/public/settings.html:225` |
|
|
367
367
|
| `c7af57097d94` | certain | Download the Dev Box app: | `modules/hall-ui/public/hall-render.js:750` |
|
|
368
|
-
| `9cf07334a5a9` | certain | Downvote (−1) | `modules/hall-ui/public/builders.js:
|
|
368
|
+
| `9cf07334a5a9` | certain | Downvote (−1) | `modules/hall-ui/public/builders.js:739` |
|
|
369
369
|
| `9c728558d6e7` | certain | Drachmae & karma | `modules/hall-ui/public/drachmae.html:22` |
|
|
370
370
|
| `9c728558d6e7` | certain | Drachmae & karma | `modules/hall-ui/public/drachmae.html:22` |
|
|
371
371
|
| `9c728558d6e7` | certain | Drachmae & karma | `modules/hall-ui/public/drachmae.html:37` |
|
|
@@ -474,7 +474,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
474
474
|
| `a4ff1e9c34e3` | certain | Idea {…} | `modules/hall-ui/public/idea.js:267` |
|
|
475
475
|
| `ba82ec56f1e3` | certain | Idea — {{worldName}} | `modules/hall-ui/public/idea.html:6` |
|
|
476
476
|
| `ba82ec56f1e3` | certain | Idea — {{worldName}} | `modules/hall-ui/public/idea.html:6` |
|
|
477
|
-
| `e181637c5a5e` | certain | Ideas awaiting triage | `modules/hall-ui/public/builders.js:
|
|
477
|
+
| `e181637c5a5e` | certain | Ideas awaiting triage | `modules/hall-ui/public/builders.js:859` |
|
|
478
478
|
| `d4e21769ce1c` | certain | Ideas filed, and what became of them | `modules/hall-ui/public/profile.html:152` |
|
|
479
479
|
| `379b20d548ad` | certain | Ideas whose author has said "I had the thought but not the full picture". Anyone can develop one — the author | `modules/hall-ui/public/ideas.html:42` |
|
|
480
480
|
| `ef224c9de7c8` | certain | Ideas — {{worldName}} | `modules/hall-ui/public/ideas.html:6` |
|
|
@@ -509,7 +509,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
509
509
|
| `93c17262bacf` | certain | Key storage is being set up by an Archon — check back shortly. {…} | `modules/hall-ui/public/settings.js:1072` |
|
|
510
510
|
| `2a3c9e501f8e` | certain | Key storage isn't set up yet. As an Archon you can turn it on now — the server generates and safely stores the | `modules/hall-ui/public/settings.js:1068` |
|
|
511
511
|
| `7d6eaa8d4514` | certain | Kinds of work shipped | `modules/hall-ui/public/hall-render.js:1165` |
|
|
512
|
-
| `81f62e066dbf` | certain | Last 14 days: {…} / 10 average across {…} graded work{…} ({…} passed). | `modules/hall-ui/public/builders.js:
|
|
512
|
+
| `81f62e066dbf` | certain | Last 14 days: {…} / 10 average across {…} graded work{…} ({…} passed). | `modules/hall-ui/public/builders.js:595` |
|
|
513
513
|
| `35a15eb0a117` | certain | Last 30 days | `modules/hall-ui/public/hall-widgets.js:129` |
|
|
514
514
|
| `9be8b839eff8` | certain | Last 7 days | `modules/hall-ui/public/hall-widgets.js:129` |
|
|
515
515
|
| `59f0bc78a28f` | certain | Last 90 days | `modules/hall-ui/public/hall-widgets.js:130` |
|
|
@@ -552,7 +552,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
552
552
|
| `df335a1224ae` | certain | Member since {…} | `modules/hall-ui/public/hall-render.js:499` |
|
|
553
553
|
| `df335a1224ae` | certain | Member since {…} | `modules/hall-ui/public/profile.js:65` |
|
|
554
554
|
| `c7a670e9552d` | certain | Merged into | `modules/hall-ui/public/profile.js:377` |
|
|
555
|
-
| `7637613c231b` | certain | Metic rank and above may vote | `modules/hall-ui/public/builders.js:
|
|
555
|
+
| `7637613c231b` | certain | Metic rank and above may vote | `modules/hall-ui/public/builders.js:743` |
|
|
556
556
|
| `1c485c956f90` | certain | Mingle pairs you with someone from a different craft. Saying no costs nothing at all — no rank, no karma, no s | `modules/hall-ui/public/collab.html:57` |
|
|
557
557
|
| `d7ce4a3bb745` | certain | Minimize the welcome panel | `modules/hall-ui/public/hall-widgets.js:52` |
|
|
558
558
|
| `19b0ed5781ae` | certain | Minimum rank required to claim this task | `modules/hall-ui/public/task-lib.js:65` |
|
|
@@ -873,7 +873,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
873
873
|
| `381f29be7497` | certain | The most recently shipped tasks. | `modules/hall-ui/public/work.html:108` |
|
|
874
874
|
| `82479c539fca` | certain | The name shown beside your work — in the roster, the leaderboard, and the work feed. Your sign-in and the cred | `modules/hall-ui/public/settings.html:75` |
|
|
875
875
|
| `b88dd8b96b72` | certain | The next person to notice this sentence reads your note instead of re-litigating it. | `modules/hall-ui/public/copy-desk.html:135` |
|
|
876
|
-
| `aa716f3dd551` | certain | The page could not be loaded. Try again. | `modules/hall-ui/public/builders.js:
|
|
876
|
+
| `aa716f3dd551` | certain | The page could not be loaded. Try again. | `modules/hall-ui/public/builders.js:1396` |
|
|
877
877
|
| `74bc22f38140` | certain | The platform confirmed this request came from the account it names. | `modules/hall-ui/public/watch.js:349` |
|
|
878
878
|
| `6c3d88de42de` | certain | The primer | `modules/hall-ui/public/primer.html:41` |
|
|
879
879
|
| `dea378cd4837` | certain | The primer did not load | `modules/hall-ui/public/primer.html:88` |
|
|
@@ -935,14 +935,14 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
935
935
|
| `1a64679fbb42` | certain | Typo or grammar | `modules/hall-ui/public/copy-desk.html:94` |
|
|
936
936
|
| `2c1c20785a6e` | certain | Unclear — a person would not know what to do | `modules/hall-ui/public/copy-desk.html:91` |
|
|
937
937
|
| `aa445f06cc5e` | certain | Unlink failed: {…} | `modules/hall-ui/public/settings.js:944` |
|
|
938
|
-
| `67fbc770b3b3` | certain | Upvote (+1) | `modules/hall-ui/public/builders.js:
|
|
938
|
+
| `67fbc770b3b3` | certain | Upvote (+1) | `modules/hall-ui/public/builders.js:739` |
|
|
939
939
|
| `6200bac6bdca` | certain | View all sessions | `modules/hall-ui/public/watch.html:106` |
|
|
940
940
|
| `9b92aa01516d` | certain | View all {…} {…} → | `modules/hall-ui/public/goals-render.js:585` |
|
|
941
941
|
| `4babdfeaf27f` | certain | View full standing → | `modules/hall-ui/public/hall-widgets.js:86` |
|
|
942
942
|
| `f8546b3e285e` | certain | View tasks {…} | `modules/hall-ui/public/roadmap.js:134` |
|
|
943
943
|
| `71c09cda8246` | certain | Voice for {…} | `modules/hall-ui/public/settings.js:76` |
|
|
944
944
|
| `2940b7828d26` | certain | Volume {…}%. | `modules/hall-ui/public/settings.js:218` |
|
|
945
|
-
| `6905f2ee5702` | certain | Vote on this work | `modules/hall-ui/public/builders.js:
|
|
945
|
+
| `6905f2ee5702` | certain | Vote on this work | `modules/hall-ui/public/builders.js:739` |
|
|
946
946
|
| `b2937e14ee9b` | certain | Vote yes | `modules/hall-ui/public/government.js:962` |
|
|
947
947
|
| `8cc425582984` | certain | Vulnerability reports | `modules/hall-ui/public/watch.html:128` |
|
|
948
948
|
| `b1e63e33f739` | certain | Vulnerability reports, engagement reports, override requests, and the audit log. | `modules/hall-ui/public/watch.html:125` |
|
|
@@ -1069,7 +1069,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1069
1069
|
| `89cc9754d633` | certain | e.g. runaway cost — paused pending review | `modules/hall-ui/public/harbor.js:148` |
|
|
1070
1070
|
| `12a23cc46ace` | certain | ends every session including this one — you will be asked to sign in again. | `modules/hall-ui/public/settings.html:172` |
|
|
1071
1071
|
| `5321f9da0841` | certain | exists in schema, no behavior yet | `modules/hall-ui/public/diagrams.html:44` |
|
|
1072
|
-
| `df941da50c7c` | certain | fell short | `modules/hall-ui/public/builders.js:
|
|
1072
|
+
| `df941da50c7c` | certain | fell short | `modules/hall-ui/public/builders.js:572` |
|
|
1073
1073
|
| `31735e119a04` | certain | first vote | `modules/hall-ui/public/government.js:584` |
|
|
1074
1074
|
| `9563bd9f4971` | certain | first — your username is all we need. | `modules/hall-ui/public/hall-render.js:284` |
|
|
1075
1075
|
| `2e111f3a4912` | certain | flagged by | `modules/hall-ui/public/copy-desk.js:148` |
|
|
@@ -1114,8 +1114,8 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1114
1114
|
| `33ca71bef112` | certain | no tasks yet | `modules/hall-ui/public/goals-render.js:163` |
|
|
1115
1115
|
| `739a4bd6bd83` | certain | node scripts/setup-builder.js | `modules/hall-ui/public/hall-render.js:817` |
|
|
1116
1116
|
| `61f0f4b2f4ab` | certain | not categorised yet | `modules/hall-ui/public/goals-page.js:277` |
|
|
1117
|
-
| `01a3d68d80c1` | certain | not graded (grader outage) | `modules/hall-ui/public/builders.js:
|
|
1118
|
-
| `d43b9bbb8d4d` | certain | not graded (quality lens unavailable) | `modules/hall-ui/public/builders.js:
|
|
1117
|
+
| `01a3d68d80c1` | certain | not graded (grader outage) | `modules/hall-ui/public/builders.js:567` |
|
|
1118
|
+
| `d43b9bbb8d4d` | certain | not graded (quality lens unavailable) | `modules/hall-ui/public/builders.js:569` |
|
|
1119
1119
|
| `3916a3dc8e98` | certain | not started | `modules/hall-ui/public/roadmap.js:108` |
|
|
1120
1120
|
| `3916a3dc8e98` | certain | not started | `modules/hall-ui/public/roadmap.js:263` |
|
|
1121
1121
|
| `b5567b42fa52` | certain | not yet | `modules/hall-ui/public/not-ready.html:25` |
|
|
@@ -1240,7 +1240,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1240
1240
|
| `3d74668f69e5` | certain | {…}{…} · {…} | `modules/hall-ui/public/task.js:546` |
|
|
1241
1241
|
| `9588652a7aff` | certain | · follows your profile setting | `modules/hall-ui/public/settings.js:636` |
|
|
1242
1242
|
| `4a5ff4f662df` | certain | — ${…} of ${…} this month ({…}%). {…} | `modules/hall-ui/public/hall-render.js:461` |
|
|
1243
|
-
| `a6ae9cbdee30` | certain | — all builders — | `modules/hall-ui/public/builders.js:
|
|
1243
|
+
| `a6ae9cbdee30` | certain | — all builders — | `modules/hall-ui/public/builders.js:675` |
|
|
1244
1244
|
| `729d4ce22b99` | certain | — any — | `modules/hall-ui/public/hall-widgets.js:132` |
|
|
1245
1245
|
| `9ac518dfa95e` | certain | — none (the version's general bucket) — | `modules/hall-ui/public/task-detail.js:320` |
|
|
1246
1246
|
| `da9962dc1729` | certain | — or open any diagram fullscreen. | `modules/hall-ui/public/diagrams.html:33` |
|
|
@@ -1253,7 +1253,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1253
1253
|
| `5b9fa7cb4fb0` | certain | …and {…} more waiting — | `modules/hall-ui/public/goal-inbox.js:121` |
|
|
1254
1254
|
| `b2a04abfead0` | certain | …{…} more awaiting a nod. | `modules/hall-ui/public/goal-inbox.js:264` |
|
|
1255
1255
|
| `616fb9adf3cf` | certain | …{…} more going quiet. | `modules/hall-ui/public/goal-inbox.js:353` |
|
|
1256
|
-
| `e35f11bdc5d7` | certain | …{…} more open ideas — triage clears them one at a time. | `modules/hall-ui/public/builders.js:
|
|
1256
|
+
| `e35f11bdc5d7` | certain | …{…} more open ideas — triage clears them one at a time. | `modules/hall-ui/public/builders.js:857` |
|
|
1257
1257
|
| `de8fa5223aee` | certain | ‹ Prev | `modules/hall-ui/public/hall-kit.js:71` |
|
|
1258
1258
|
| `d4b84b7fbdeb` | certain | ← All goals | `modules/hall-ui/public/goals.html:80` |
|
|
1259
1259
|
| `7926e30955d2` | certain | ← Back to goal | `modules/hall-ui/public/goals.html:184` |
|
package/docs/copy-registry.json
CHANGED
|
@@ -2099,7 +2099,7 @@
|
|
|
2099
2099
|
"surface": "builders-hall",
|
|
2100
2100
|
"text": "Achievements could not be loaded.",
|
|
2101
2101
|
"file": "modules/hall-ui/public/builders.js",
|
|
2102
|
-
"line":
|
|
2102
|
+
"line": 1154,
|
|
2103
2103
|
"origin": "js-markup",
|
|
2104
2104
|
"confidence": "certain"
|
|
2105
2105
|
},
|
|
@@ -4196,7 +4196,7 @@
|
|
|
4196
4196
|
"surface": "builders-hall",
|
|
4197
4197
|
"text": "Downvote (−1)",
|
|
4198
4198
|
"file": "modules/hall-ui/public/builders.js",
|
|
4199
|
-
"line":
|
|
4199
|
+
"line": 739,
|
|
4200
4200
|
"origin": "js-markup",
|
|
4201
4201
|
"confidence": "certain"
|
|
4202
4202
|
},
|
|
@@ -5177,7 +5177,7 @@
|
|
|
5177
5177
|
"surface": "builders-hall",
|
|
5178
5178
|
"text": "Ideas awaiting triage",
|
|
5179
5179
|
"file": "modules/hall-ui/public/builders.js",
|
|
5180
|
-
"line":
|
|
5180
|
+
"line": 859,
|
|
5181
5181
|
"origin": "js-markup",
|
|
5182
5182
|
"confidence": "certain"
|
|
5183
5183
|
},
|
|
@@ -5492,7 +5492,7 @@
|
|
|
5492
5492
|
"surface": "builders-hall",
|
|
5493
5493
|
"text": "Last 14 days: {…} / 10 average across {…} graded work{…} ({…} passed).",
|
|
5494
5494
|
"file": "modules/hall-ui/public/builders.js",
|
|
5495
|
-
"line":
|
|
5495
|
+
"line": 595,
|
|
5496
5496
|
"origin": "js-text-assign",
|
|
5497
5497
|
"confidence": "certain"
|
|
5498
5498
|
},
|
|
@@ -5879,7 +5879,7 @@
|
|
|
5879
5879
|
"surface": "builders-hall",
|
|
5880
5880
|
"text": "Metic rank and above may vote",
|
|
5881
5881
|
"file": "modules/hall-ui/public/builders.js",
|
|
5882
|
-
"line":
|
|
5882
|
+
"line": 743,
|
|
5883
5883
|
"origin": "js-markup",
|
|
5884
5884
|
"confidence": "certain"
|
|
5885
5885
|
},
|
|
@@ -8768,7 +8768,7 @@
|
|
|
8768
8768
|
"surface": "builders-hall",
|
|
8769
8769
|
"text": "The page could not be loaded. Try again.",
|
|
8770
8770
|
"file": "modules/hall-ui/public/builders.js",
|
|
8771
|
-
"line":
|
|
8771
|
+
"line": 1396,
|
|
8772
8772
|
"origin": "js-notice",
|
|
8773
8773
|
"confidence": "certain"
|
|
8774
8774
|
},
|
|
@@ -9326,7 +9326,7 @@
|
|
|
9326
9326
|
"surface": "builders-hall",
|
|
9327
9327
|
"text": "Upvote (+1)",
|
|
9328
9328
|
"file": "modules/hall-ui/public/builders.js",
|
|
9329
|
-
"line":
|
|
9329
|
+
"line": 739,
|
|
9330
9330
|
"origin": "js-markup",
|
|
9331
9331
|
"confidence": "certain"
|
|
9332
9332
|
},
|
|
@@ -9389,7 +9389,7 @@
|
|
|
9389
9389
|
"surface": "builders-hall",
|
|
9390
9390
|
"text": "Vote on this work",
|
|
9391
9391
|
"file": "modules/hall-ui/public/builders.js",
|
|
9392
|
-
"line":
|
|
9392
|
+
"line": 739,
|
|
9393
9393
|
"origin": "js-markup",
|
|
9394
9394
|
"confidence": "certain"
|
|
9395
9395
|
},
|
|
@@ -10532,7 +10532,7 @@
|
|
|
10532
10532
|
"surface": "builders-hall",
|
|
10533
10533
|
"text": "fell short",
|
|
10534
10534
|
"file": "modules/hall-ui/public/builders.js",
|
|
10535
|
-
"line":
|
|
10535
|
+
"line": 572,
|
|
10536
10536
|
"origin": "js-markup",
|
|
10537
10537
|
"confidence": "certain"
|
|
10538
10538
|
},
|
|
@@ -10937,7 +10937,7 @@
|
|
|
10937
10937
|
"surface": "builders-hall",
|
|
10938
10938
|
"text": "not graded (grader outage)",
|
|
10939
10939
|
"file": "modules/hall-ui/public/builders.js",
|
|
10940
|
-
"line":
|
|
10940
|
+
"line": 567,
|
|
10941
10941
|
"origin": "js-markup",
|
|
10942
10942
|
"confidence": "certain"
|
|
10943
10943
|
},
|
|
@@ -10946,7 +10946,7 @@
|
|
|
10946
10946
|
"surface": "builders-hall",
|
|
10947
10947
|
"text": "not graded (quality lens unavailable)",
|
|
10948
10948
|
"file": "modules/hall-ui/public/builders.js",
|
|
10949
|
-
"line":
|
|
10949
|
+
"line": 569,
|
|
10950
10950
|
"origin": "js-markup",
|
|
10951
10951
|
"confidence": "certain"
|
|
10952
10952
|
},
|
|
@@ -12071,7 +12071,7 @@
|
|
|
12071
12071
|
"surface": "builders-hall",
|
|
12072
12072
|
"text": "— all builders —",
|
|
12073
12073
|
"file": "modules/hall-ui/public/builders.js",
|
|
12074
|
-
"line":
|
|
12074
|
+
"line": 675,
|
|
12075
12075
|
"origin": "js-markup",
|
|
12076
12076
|
"confidence": "certain"
|
|
12077
12077
|
},
|
|
@@ -12188,7 +12188,7 @@
|
|
|
12188
12188
|
"surface": "builders-hall",
|
|
12189
12189
|
"text": "…{…} more open ideas — triage clears them one at a time.",
|
|
12190
12190
|
"file": "modules/hall-ui/public/builders.js",
|
|
12191
|
-
"line":
|
|
12191
|
+
"line": 857,
|
|
12192
12192
|
"origin": "js-markup",
|
|
12193
12193
|
"confidence": "certain"
|
|
12194
12194
|
},
|
|
@@ -1475,5 +1475,9 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
1475
1475
|
landed since 1.19.517 with no explicit bump. run 33801792364. (task 1002620)
|
|
1476
1476
|
1.19.519 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1477
1477
|
landed since 1.19.518 with no explicit bump. run 33802471495. (task 1002620)
|
|
1478
|
+
1.19.520 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1479
|
+
landed since 1.19.519 with no explicit bump. run 33810716476. (task 1002620)
|
|
1480
|
+
1.19.521 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
1481
|
+
landed since 1.19.520 with no explicit bump. run 33813285951. (task 1002620)
|
|
1478
1482
|
---------------------------------------------------------------------------
|
|
1479
1483
|
```
|
|
@@ -559,13 +559,17 @@
|
|
|
559
559
|
// is likewise not a judgment: the score is the surviving axis, not a fail.
|
|
560
560
|
const isLensOut = !isOutage && !!g.rubric_scores && g.rubric_scores.code_quality === null;
|
|
561
561
|
const score = isOutage || isLensOut ? '—' : Number(g.score).toFixed(1);
|
|
562
|
+
// A verdict is verification state: it wears the fixed vocabulary through
|
|
563
|
+
// .ledger__verdict--* (style.css), never an inline colour. The literals
|
|
564
|
+
// that stood here painted `passed` from a --olive that is not a token of
|
|
565
|
+
// the world, so every hall ever rendered it as the fallback (task 1003495).
|
|
562
566
|
const verdict = isOutage
|
|
563
|
-
? `<span
|
|
567
|
+
? `<span class="ledger__verdict--none">not graded (grader outage)</span>`
|
|
564
568
|
: isLensOut
|
|
565
|
-
? `<span
|
|
569
|
+
? `<span class="ledger__verdict--none">not graded (quality lens unavailable)</span>`
|
|
566
570
|
: g.passed
|
|
567
|
-
? `<span
|
|
568
|
-
: `<span
|
|
571
|
+
? `<span class="ledger__verdict--ok">passed</span>`
|
|
572
|
+
: `<span class="ledger__verdict--danger">fell short</span>`;
|
|
569
573
|
return `
|
|
570
574
|
<tr>
|
|
571
575
|
<td class="ledger__num">#${g.task_id}</td>
|
|
@@ -68,12 +68,12 @@
|
|
|
68
68
|
.cd-search-count { margin: 0 0 14px; }
|
|
69
69
|
|
|
70
70
|
/* The three dialogs are the family modal on a native <dialog>: bg-card, one rule
|
|
71
|
-
hairline, no shadow. The backdrop is
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
in
|
|
71
|
+
hairline, no shadow. The backdrop is a SCRIM — it has to darken what is behind
|
|
72
|
+
it in EITHER mode, so it can take no ground token and no mix of --ink (which is
|
|
73
|
+
white on black). That is why it was a literal; task 1003495 gave the value a
|
|
74
|
+
home in style.css as --scrim instead, so the sheet keeps none. */
|
|
75
75
|
.cd-dialog { width: min(480px, calc(100vw - 32px)); color: var(--ink); }
|
|
76
|
-
.cd-dialog::backdrop { background:
|
|
76
|
+
.cd-dialog::backdrop { background: var(--scrim); }
|
|
77
77
|
.cd-dialog .ov-form { margin: 14px 0 0; }
|
|
78
78
|
.cd-dialog textarea { resize: vertical; line-height: 1.5; }
|
|
79
79
|
.ov-modal .cd-dialog__err { min-height: 18px; margin: 8px 0 0; font-size: 13px; line-height: 1.45; color: var(--danger); }
|
|
@@ -146,6 +146,12 @@
|
|
|
146
146
|
its own edge over whatever it lands on. ---- */
|
|
147
147
|
--focus: color-mix(in srgb, var(--accent-deep) 82%, #3a1400);
|
|
148
148
|
|
|
149
|
+
/* ---- derived: the modal scrim. A backdrop DARKENS whatever is behind it
|
|
150
|
+
in BOTH modes, so it cannot be mixed from --ink (white on black) —
|
|
151
|
+
it is black with alpha, and lives here so no sheet keeps its own
|
|
152
|
+
literal. Both modes take this one value (task 1003495). ---- */
|
|
153
|
+
--scrim: rgba(0, 0, 0, .55);
|
|
154
|
+
|
|
149
155
|
/* ---- derived: the label face flips. Mono caps read as precise on paper and
|
|
150
156
|
thin on black, so light takes the mono and dark takes the body face.
|
|
151
157
|
Take the token, never the family. ---- */
|
|
@@ -1476,6 +1482,13 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
1476
1482
|
.ledger__date { color: var(--ink-soft); white-space: nowrap; font-variant-numeric: tabular-nums; }
|
|
1477
1483
|
.ledger__rank { white-space: nowrap; }
|
|
1478
1484
|
.ledger__note { font-size: 12.5px; color: var(--ink-faint); margin: 10px 0 0; }
|
|
1485
|
+
/* A grade verdict is verification STATE, so it wears the fixed vocabulary
|
|
1486
|
+
(--ok / --danger / --ink-soft) the same way .rec-pill does on the record
|
|
1487
|
+
pages — never a page-local literal, and never a hex fallback standing in
|
|
1488
|
+
for a token the world does not define (task 1003495). */
|
|
1489
|
+
.ledger__verdict--ok { color: var(--ok); font-weight: 600; }
|
|
1490
|
+
.ledger__verdict--danger { color: var(--danger); font-weight: 600; }
|
|
1491
|
+
.ledger__verdict--none { color: var(--ink-soft); }
|
|
1479
1492
|
.ledger th.ledger__sortable { cursor: pointer; user-select: none; }
|
|
1480
1493
|
.ledger th.ledger__sortable:hover { color: var(--ink); }
|
|
1481
1494
|
.ledger th.ledger__sortable[aria-sort="ascending"]::after { content: " ↑"; }
|
|
@@ -3190,6 +3203,17 @@ a.stat-tile:hover .stat-tile__sub { color: var(--ink-soft); }
|
|
|
3190
3203
|
outline: none;
|
|
3191
3204
|
}
|
|
3192
3205
|
.palette__input::placeholder { color: var(--ink-faint); }
|
|
3206
|
+
/* palette.js auto-focuses this on open, so the ring is the first thing a
|
|
3207
|
+
keyboard user needs — and it had none. .palette__panel clips (overflow:
|
|
3208
|
+
hidden), which ate the world's ring (a 3px-offset outline inside an 8px
|
|
3209
|
+
halo) and is why the outline was dropped here in the first place. So the
|
|
3210
|
+
indication moves INSIDE the input's own box — the same inset form the 64px
|
|
3211
|
+
rail's items use, for the same reason (task 1003496). */
|
|
3212
|
+
.palette__input:focus-visible {
|
|
3213
|
+
outline: 2px solid var(--focus);
|
|
3214
|
+
outline-offset: -2px;
|
|
3215
|
+
box-shadow: none;
|
|
3216
|
+
}
|
|
3193
3217
|
.palette__list {
|
|
3194
3218
|
list-style: none;
|
|
3195
3219
|
margin: 0;
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.521",
|
|
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.521",
|
|
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.521",
|
|
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",
|
|
@@ -85,4 +85,7 @@ async function main() {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
// No process.exit: calling it while undici is still tearing down the fetches above
|
|
89
|
+
// aborts this hook on Windows with the win/async.c UV_HANDLE_CLOSING assertion, so
|
|
90
|
+
// SessionStart reports a hook error. Nothing else holds the loop — it exits on its own.
|
|
91
|
+
main().catch(() => {});
|
package/src/module-api.js
CHANGED
|
@@ -45,7 +45,7 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
|
|
|
45
45
|
// there. scripts/gds/bump-version.js still rewrites the literal below; it appends
|
|
46
46
|
// the entry to that file. Look for a version's history there, not here.
|
|
47
47
|
// ---------------------------------------------------------------------------
|
|
48
|
-
const CORE_VERSION = '1.19.
|
|
48
|
+
const CORE_VERSION = '1.19.521'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
49
49
|
|
|
50
50
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
51
51
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|
package/tests/hall_audit.mjs
CHANGED
|
@@ -384,3 +384,146 @@ test('no page declares a private copy of a pack color var', () => {
|
|
|
384
384
|
}
|
|
385
385
|
assert.deepEqual(offenders, [], 'palette comes from style.css + the instance pack (themeMarkup), never from a page');
|
|
386
386
|
});
|
|
387
|
+
|
|
388
|
+
// ---- 9. verification state wears the token tier (task 1003495) ------------
|
|
389
|
+
|
|
390
|
+
// The walk (task 1003309) found Standing's grade column painting its verdicts
|
|
391
|
+
// with inline literals — including a `var(--olive, #5b7a4d)` whose token the
|
|
392
|
+
// world never defined, so every hall that ever rendered it showed the fallback.
|
|
393
|
+
// A colour in a DECLARATION VALUE is the thing worth catching; a bare `#807`
|
|
394
|
+
// in a comment is a task reference, which is why this matches a colour property
|
|
395
|
+
// and not a hash. style.css is the token tier itself and is where literals
|
|
396
|
+
// belong; the two exceptions below carry their reason.
|
|
397
|
+
const LITERAL_EXEMPT = {
|
|
398
|
+
'style.css': 'the token tier — this is the ONE file whose job is to hold the literals',
|
|
399
|
+
'settings.css': 'the Discord button wears Discord\'s brand colour (#5865F2); a third-party mark is not a theme colour',
|
|
400
|
+
};
|
|
401
|
+
const COLOUR_PROPS = 'color|background|background-color|border|border-color|border-top-color|border-bottom-color|fill|stroke|outline|outline-color|box-shadow|text-shadow';
|
|
402
|
+
const colourLiteralRe = () =>
|
|
403
|
+
new RegExp(`(?:^|[;{"'\\s(])(${COLOUR_PROPS})\\s*:\\s*[^;{}"'\\n]*?(#[0-9a-fA-F]{3,8}\\b|\\b(?:rgb|rgba|hsl|hsla)\\()`, 'g');
|
|
404
|
+
|
|
405
|
+
function literalOffenders(files) {
|
|
406
|
+
const out = [];
|
|
407
|
+
for (const f of files) {
|
|
408
|
+
if (LITERAL_EXEMPT[f]) continue;
|
|
409
|
+
for (const m of read(f).matchAll(colourLiteralRe())) out.push(`${f}: ${m[1]}: … ${m[2]}`);
|
|
410
|
+
}
|
|
411
|
+
return out;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
const hallSources = () =>
|
|
415
|
+
fs.readdirSync(HALL).filter((f) => /\.(css|js|html)$/.test(f)).sort();
|
|
416
|
+
|
|
417
|
+
test('no hall sheet or script paints from a colour literal — style.css holds them', () => {
|
|
418
|
+
assert.deepEqual(literalOffenders(hallSources()), [],
|
|
419
|
+
'a colour in a declaration value belongs to the token tier (style.css), not to a page');
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
test('the colour-literal guard CATCHES a reintroduction, and tolerates a task ref', () => {
|
|
423
|
+
const re = colourLiteralRe();
|
|
424
|
+
assert.ok('a { color: #a04040; }'.match(re), 'a bare hex in a colour value is caught');
|
|
425
|
+
assert.ok('x = \'<span style="color:var(--olive,#5b7a4d)">\''.match(colourLiteralRe()),
|
|
426
|
+
'a hex FALLBACK behind a var() is caught — that is how --olive hid');
|
|
427
|
+
assert.equal('// #807: the dev-box panel'.match(colourLiteralRe()), null,
|
|
428
|
+
'a task reference in a comment is not a colour');
|
|
429
|
+
assert.equal('a { color: var(--ok); }'.match(colourLiteralRe()), null,
|
|
430
|
+
'a token is exactly what this rule wants');
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
test("Standing's grade column renders its three verdicts through the vocabulary", () => {
|
|
434
|
+
const js = read('builders.js');
|
|
435
|
+
const start = js.indexOf('function renderRecentGrades');
|
|
436
|
+
assert.ok(start > 0, 'renderRecentGrades present');
|
|
437
|
+
const body = js.slice(start, js.indexOf('\n }', start));
|
|
438
|
+
for (const cls of ['ledger__verdict--ok', 'ledger__verdict--danger', 'ledger__verdict--none']) {
|
|
439
|
+
assert.ok(body.includes(cls), `the grade column uses .${cls}`);
|
|
440
|
+
}
|
|
441
|
+
assert.equal(/style="color:/.test(body), false, 'no inline colour survives in the grade column');
|
|
442
|
+
assert.equal(/var\(\s*--olive/.test(js), false, 'nothing PAINTS from --olive — the world never defined it (naming it in a comment is the point)');
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
test('the verdict classes and the scrim exist in the token tier, in both modes', () => {
|
|
446
|
+
const css = read('style.css');
|
|
447
|
+
// A verdict wears --ok / --danger / --ink-soft, which style.css redefines per
|
|
448
|
+
// mode — so pinning the RULE pins both modes at once.
|
|
449
|
+
assert.match(css, /\.ledger__verdict--ok\s*\{[^}]*var\(--ok\)/, 'passed → --ok');
|
|
450
|
+
assert.match(css, /\.ledger__verdict--danger\s*\{[^}]*var\(--danger\)/, 'fell short → --danger');
|
|
451
|
+
assert.match(css, /\.ledger__verdict--none\s*\{[^}]*var\(--ink-soft\)/, 'not graded → --ink-soft');
|
|
452
|
+
assert.match(css, /--scrim:/, 'the modal scrim is a token, not a sheet-local literal');
|
|
453
|
+
assert.match(read('copy-desk.css'), /::backdrop\s*\{[^}]*var\(--scrim\)/, 'the copy-desk backdrop takes it');
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
// ---- 10. an outline: none always names its replacement (task 1003496) -----
|
|
457
|
+
|
|
458
|
+
// The walk (task 1003309) found the command palette's input dropping the
|
|
459
|
+
// world's focus ring with nothing put back — and palette.js AUTO-FOCUSES it on
|
|
460
|
+
// open, so a keyboard user landed in a field with no indication of where they
|
|
461
|
+
// were. A rule may drop the outline; it may not drop the INDICATION. The
|
|
462
|
+
// exceptions are selectors that are not keyboard stops at all.
|
|
463
|
+
const OUTLINE_NONE_EXEMPT = {
|
|
464
|
+
main: 'the skip link\'s programmatic target — main takes tabindex="-1" focus so the reader lands past the nav, and ringing the whole page would be noise, not information',
|
|
465
|
+
};
|
|
466
|
+
|
|
467
|
+
// Innermost rule blocks only, so a rule inside @media is read as itself and the
|
|
468
|
+
// wrapping at-rule is never mistaken for a selector.
|
|
469
|
+
function rulesDeclaring(css, decl) {
|
|
470
|
+
const out = [];
|
|
471
|
+
const clean = css.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
472
|
+
for (const m of clean.matchAll(/([^{}]+)\{([^{}]*)\}/g)) {
|
|
473
|
+
if (decl.test(m[2])) out.push(m[1].trim().replace(/\s+/g, ' '));
|
|
474
|
+
}
|
|
475
|
+
return out;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
const OUTLINE_OFF = /outline\s*:\s*(none|0)\s*[;}]|outline\s*:\s*(none|0)\s*$/;
|
|
479
|
+
// The base a focus rule would be written against: `.x:focus` and `.x` both want
|
|
480
|
+
// a `.x:focus-visible`.
|
|
481
|
+
const baseSelectors = (sel) =>
|
|
482
|
+
sel.split(',').map((s) => s.trim().replace(/:(focus-visible|focus-within|focus|hover|active)\b/g, '').trim()).filter(Boolean);
|
|
483
|
+
|
|
484
|
+
function unringed(sheets) {
|
|
485
|
+
const all = sheets.map(([, css]) => css).join('\n');
|
|
486
|
+
const offenders = [];
|
|
487
|
+
for (const [file, css] of sheets) {
|
|
488
|
+
for (const rule of rulesDeclaring(css, OUTLINE_OFF)) {
|
|
489
|
+
for (const base of baseSelectors(rule)) {
|
|
490
|
+
if (OUTLINE_NONE_EXEMPT[base]) continue;
|
|
491
|
+
// The replacement may live in any hall sheet — they all load together.
|
|
492
|
+
if (all.includes(base + ':focus-visible')) continue;
|
|
493
|
+
offenders.push(`${file}: "${rule}" drops the outline with no ${base}:focus-visible`);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
return offenders;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
const hallSheets = () =>
|
|
501
|
+
fs.readdirSync(HALL).filter((f) => f.endsWith('.css')).sort().map((f) => [f, read(f)]);
|
|
502
|
+
|
|
503
|
+
test('no hall sheet drops a focus ring without putting an indication back', () => {
|
|
504
|
+
assert.deepEqual(unringed(hallSheets()), [],
|
|
505
|
+
'outline: none is allowed only next to a :focus-visible replacement for the same selector');
|
|
506
|
+
});
|
|
507
|
+
|
|
508
|
+
test('the focus-ring guard CATCHES a suppression, and reads a replacement', () => {
|
|
509
|
+
const bad = [['x.css', '.thing { outline: none; }']];
|
|
510
|
+
assert.equal(unringed(bad).length, 1, 'a bare suppression is caught');
|
|
511
|
+
const paired = [['x.css', '.thing { outline: none; }\n.thing:focus-visible { outline: 2px solid var(--focus); }']];
|
|
512
|
+
assert.deepEqual(unringed(paired), [], 'a replacement in the same sheet satisfies it');
|
|
513
|
+
const crossSheet = [['a.css', '.thing { outline: none; }'], ['b.css', '.thing:focus-visible { outline: 2px solid var(--focus); }']];
|
|
514
|
+
assert.deepEqual(unringed(crossSheet), [], 'the hall loads its sheets together, so the replacement may sit in another one');
|
|
515
|
+
const media = [['x.css', '@media (min-width: 900px) { .thing { outline: none; } }']];
|
|
516
|
+
assert.equal(unringed(media).length, 1, 'a rule inside @media is read as itself, not as the at-rule');
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
test('the command palette input rings from the token tier, inside its own box', () => {
|
|
520
|
+
const css = read('style.css');
|
|
521
|
+
const rule = /\.palette__input:focus-visible\s*\{([^}]*)\}/.exec(css);
|
|
522
|
+
assert.ok(rule, '.palette__input:focus-visible exists');
|
|
523
|
+
assert.match(rule[1], /var\(--focus\)/, 'the ring is the world\'s --focus, which style.css redefines per mode');
|
|
524
|
+
// .palette__panel clips (overflow: hidden), which is WHY the global ring — a
|
|
525
|
+
// 3px-offset outline inside an 8px halo — was suppressed here. The
|
|
526
|
+
// replacement has to sit INSIDE the input's box or the panel eats it.
|
|
527
|
+
assert.match(css, /\.palette__panel\s*\{[^}]*overflow:\s*hidden/, 'the panel still clips, so the inset form is still the right one');
|
|
528
|
+
assert.match(rule[1], /outline-offset:\s*-|inset/, 'the indication sits inside the input, not outside it');
|
|
529
|
+
});
|
|
@@ -46,11 +46,14 @@ test('the page sheets spend only the fifteen, in px, and never opacity', () => {
|
|
|
46
46
|
assert.ok(!/opacity\s*:/.test(css), `${p}.css carries state as colour, never opacity`);
|
|
47
47
|
assert.ok(!/border-left/.test(css), `${p}.css paints no coloured band`);
|
|
48
48
|
}
|
|
49
|
-
// The
|
|
49
|
+
// The copy desk's last literal was the native dialog's scrim. A scrim still
|
|
50
|
+
// cannot be mixed from a ground token — it darkens in BOTH modes — but the
|
|
51
|
+
// value now has a home in style.css as --scrim, so this sheet keeps none
|
|
52
|
+
// (task 1003495).
|
|
50
53
|
const cd = read('copy-desk.css');
|
|
51
54
|
const literals = cd.match(/rgba?\([^)]*\)/g) || [];
|
|
52
|
-
assert.deepEqual(literals, [
|
|
53
|
-
assert.match(cd, /\.cd-dialog::backdrop \{ background:
|
|
55
|
+
assert.deepEqual(literals, [], 'not even the scrim is a literal here any more');
|
|
56
|
+
assert.match(cd, /\.cd-dialog::backdrop \{ background: var\(--scrim\); \}/, 'the backdrop spends the token');
|
|
54
57
|
});
|
|
55
58
|
|
|
56
59
|
test('every list is the family\'s row, and the card-in-a-card is gone', () => {
|
package/tests/memory_pull.mjs
CHANGED
|
@@ -23,9 +23,11 @@ import { createRequire } from 'node:module';
|
|
|
23
23
|
import fs from 'node:fs';
|
|
24
24
|
import path from 'node:path';
|
|
25
25
|
import os from 'node:os';
|
|
26
|
+
import { spawnSync } from 'node:child_process';
|
|
26
27
|
|
|
27
28
|
const require = createRequire(import.meta.url);
|
|
28
29
|
const pull = require('../.claude/hooks/pull-memory.js');
|
|
30
|
+
const hookPath = require.resolve('../.claude/hooks/pull-memory.js');
|
|
29
31
|
|
|
30
32
|
let passed = 0;
|
|
31
33
|
let failed = 0;
|
|
@@ -186,6 +188,17 @@ test('encodeProjectPath: replaces / and . with -', () => {
|
|
|
186
188
|
assert.equal(pull.encodeProjectPath('/Users/x/Desktop/Claude-OTB'), '-Users-x-Desktop-Claude-OTB');
|
|
187
189
|
});
|
|
188
190
|
|
|
191
|
+
// The old /[/.]/ class silently no-opped on a Windows path — separator, drive
|
|
192
|
+
// colon and spaces all survived, so resolveMemoryDir built a path with a drive
|
|
193
|
+
// letter buried mid-string that no mkdir could create and every file "failed"
|
|
194
|
+
// (task 1003567). Must match the encoder in scripts/gds/ship-memory-sync.js.
|
|
195
|
+
test('encodeProjectPath: Windows path — separator, drive colon and spaces all become -', () => {
|
|
196
|
+
assert.equal(
|
|
197
|
+
pull.encodeProjectPath(String.raw`C:\Users\x\Desktop\Cloud Bongos\cloud-bongos`),
|
|
198
|
+
'C--Users-x-Desktop-Cloud-Bongos-cloud-bongos',
|
|
199
|
+
);
|
|
200
|
+
});
|
|
201
|
+
|
|
189
202
|
test('tsToMs: ISO string, epoch ms, Date, and garbage', () => {
|
|
190
203
|
assert.equal(pull.tsToMs('2026-05-30T00:00:00Z'), Date.parse('2026-05-30T00:00:00Z'));
|
|
191
204
|
assert.equal(pull.tsToMs(1234), 1234);
|
|
@@ -413,14 +426,20 @@ await testAsync('pullMemory: 0 written + skips → summary does not read like a
|
|
|
413
426
|
});
|
|
414
427
|
|
|
415
428
|
await testAsync('pullMemory: no session → silent null', async () => {
|
|
429
|
+
// cli-lib freezes its session-file paths at require time, so an in-process
|
|
430
|
+
// HOME swap cannot unsee a real session — this must run in a FRESH process
|
|
431
|
+
// with a stubbed home, or it silently passes only where no session exists
|
|
432
|
+
// (i.e. CI) and fires a REAL network pull on a signed-in box (task 1003567).
|
|
416
433
|
const tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'otb-pull-nosess-'));
|
|
417
|
-
const origHome = process.env.HOME;
|
|
418
|
-
process.env.HOME = tmpHome;
|
|
419
434
|
try {
|
|
420
|
-
const
|
|
421
|
-
|
|
435
|
+
const child = spawnSync(
|
|
436
|
+
process.execPath,
|
|
437
|
+
['-e', 'require(process.argv[1]).pullMemory({ startCwd: process.argv[2] }).then((r) => console.log(JSON.stringify(r)))', hookPath, process.cwd()],
|
|
438
|
+
{ env: { ...process.env, HOME: tmpHome, USERPROFILE: tmpHome }, encoding: 'utf8' },
|
|
439
|
+
);
|
|
440
|
+
assert.equal(child.status, 0, `child exited ${child.status}: ${child.stderr}`);
|
|
441
|
+
assert.equal(child.stdout.trim(), 'null', `expected null, got: ${child.stdout.trim()}`);
|
|
422
442
|
} finally {
|
|
423
|
-
process.env.HOME = origHome;
|
|
424
443
|
fs.rmSync(tmpHome, { recursive: true, force: true });
|
|
425
444
|
}
|
|
426
445
|
});
|