@bongos/core 1.19.980 → 1.19.981
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 +15 -15
- package/docs/copy-inventory.md +24 -24
- package/docs/copy-registry.json +31 -31
- package/docs/module-api-changelog.md +2 -0
- package/modules/hall-ui/public/blockers-lib.js +14 -19
- package/modules/hall-ui/public/blockers.js +7 -5
- package/modules/hall-ui/public/goal-inbox.js +2 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/module-api.js +1 -1
- package/tests/blockers_lib.mjs +22 -14
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.981",
|
|
6
|
+
"core_contract": "1.19.981",
|
|
7
|
+
"source_commit": "018bb8c74892d8238a446218a32b25947983c006",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-23T16:
|
|
9
|
+
"built_at": "2026-09-23T16:52:01.988Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 517,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 2929,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "c4ced9fc5bb738b53b0207833ec3c2addc0a17cce09b47ff5d521bc797760cf9",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -2172,12 +2172,12 @@
|
|
|
2172
2172
|
{
|
|
2173
2173
|
"path": "docs/copy-inventory.md",
|
|
2174
2174
|
"mode": "0000644",
|
|
2175
|
-
"sha256": "
|
|
2175
|
+
"sha256": "0c319dd9e06fc1c6fab7a5eb20319993dd02015c3a51cb1924770e28f57daac4"
|
|
2176
2176
|
},
|
|
2177
2177
|
{
|
|
2178
2178
|
"path": "docs/copy-registry.json",
|
|
2179
2179
|
"mode": "0000644",
|
|
2180
|
-
"sha256": "
|
|
2180
|
+
"sha256": "36bc1923290e3897906a023f819393ec2501d5cdeed98b3ff286d0ff692a2689"
|
|
2181
2181
|
},
|
|
2182
2182
|
{
|
|
2183
2183
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -2707,7 +2707,7 @@
|
|
|
2707
2707
|
{
|
|
2708
2708
|
"path": "docs/module-api-changelog.md",
|
|
2709
2709
|
"mode": "0000644",
|
|
2710
|
-
"sha256": "
|
|
2710
|
+
"sha256": "1a1932aba6781ae1e457f39e077e0a08cb2ae77104502fdcd1b1a7592ee01563"
|
|
2711
2711
|
},
|
|
2712
2712
|
{
|
|
2713
2713
|
"path": "docs/modules-contract.md",
|
|
@@ -4712,7 +4712,7 @@
|
|
|
4712
4712
|
{
|
|
4713
4713
|
"path": "modules/hall-ui/public/blockers-lib.js",
|
|
4714
4714
|
"mode": "0000644",
|
|
4715
|
-
"sha256": "
|
|
4715
|
+
"sha256": "c251924697bf5f1157f3660b4b236c21c73d6b30394d6a3385dc8a4426c64d59"
|
|
4716
4716
|
},
|
|
4717
4717
|
{
|
|
4718
4718
|
"path": "modules/hall-ui/public/blockers.html",
|
|
@@ -4722,7 +4722,7 @@
|
|
|
4722
4722
|
{
|
|
4723
4723
|
"path": "modules/hall-ui/public/blockers.js",
|
|
4724
4724
|
"mode": "0000644",
|
|
4725
|
-
"sha256": "
|
|
4725
|
+
"sha256": "ad3e3ea63283c31a6602a06695a9248444bd7306fa3624b53f8687c4534e4171"
|
|
4726
4726
|
},
|
|
4727
4727
|
{
|
|
4728
4728
|
"path": "modules/hall-ui/public/board-lib.js",
|
|
@@ -4927,7 +4927,7 @@
|
|
|
4927
4927
|
{
|
|
4928
4928
|
"path": "modules/hall-ui/public/goal-inbox.js",
|
|
4929
4929
|
"mode": "0000644",
|
|
4930
|
-
"sha256": "
|
|
4930
|
+
"sha256": "d5466b9d9717ed3bcb4919b1d05c338945d73ad185fdfc7efffea5db382a2f7e"
|
|
4931
4931
|
},
|
|
4932
4932
|
{
|
|
4933
4933
|
"path": "modules/hall-ui/public/goal-map-lib.js",
|
|
@@ -8147,12 +8147,12 @@
|
|
|
8147
8147
|
{
|
|
8148
8148
|
"path": "package-lock.json",
|
|
8149
8149
|
"mode": "0000644",
|
|
8150
|
-
"sha256": "
|
|
8150
|
+
"sha256": "3fe1046e4b14418fa25562f1b78f77553cf779c22ebcf8ebdb304ab5c7f2ecda"
|
|
8151
8151
|
},
|
|
8152
8152
|
{
|
|
8153
8153
|
"path": "package.json",
|
|
8154
8154
|
"mode": "0000644",
|
|
8155
|
-
"sha256": "
|
|
8155
|
+
"sha256": "84645116d170a5ce768873bd4e5502d2e36d574c6a64186a5abd38ca721499c2"
|
|
8156
8156
|
},
|
|
8157
8157
|
{
|
|
8158
8158
|
"path": "public-docs/index.html",
|
|
@@ -10177,7 +10177,7 @@
|
|
|
10177
10177
|
{
|
|
10178
10178
|
"path": "src/module-api.js",
|
|
10179
10179
|
"mode": "0000644",
|
|
10180
|
-
"sha256": "
|
|
10180
|
+
"sha256": "bd7aa6c3b14ef450c5af424082416994f194af841d7c64a0ce1c67704dd9bf56"
|
|
10181
10181
|
},
|
|
10182
10182
|
{
|
|
10183
10183
|
"path": "src/module-loader/catalog.js",
|
|
@@ -10707,7 +10707,7 @@
|
|
|
10707
10707
|
{
|
|
10708
10708
|
"path": "tests/blockers_lib.mjs",
|
|
10709
10709
|
"mode": "0000644",
|
|
10710
|
-
"sha256": "
|
|
10710
|
+
"sha256": "74ace2b06e545cf110094ad46e141e545dc00daff63292bdfeda9fa286e45c43"
|
|
10711
10711
|
},
|
|
10712
10712
|
{
|
|
10713
10713
|
"path": "tests/blockers_page_ui.mjs",
|
package/docs/copy-inventory.md
CHANGED
|
@@ -39,7 +39,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
39
39
|
| `0fbe47b01d2c` | 10x | Reading the project… | modules/public-landing/public/projects.html:706, modules/public-landing/public/projects.html:743, modules/public-landing/public/projects.html:757 |
|
|
40
40
|
| `8c234d5c8bd4` | 8x | Could not save. Try again. | modules/hall-ui/public/settings-interaction.js:96, modules/hall-ui/public/settings-render.js:108, modules/hall-ui/public/settings.js:101 |
|
|
41
41
|
| `eeda19200aeb` | 7x | Cloud Bongos | modules/public-landing/public/projects.html:399, modules/public-landing/public/projects.html:501, modules/public-landing/public/projects.html:546 |
|
|
42
|
-
| `5a2b73968b36` | 6x | Blocker # | modules/hall-ui/public/blockers.js:
|
|
42
|
+
| `5a2b73968b36` | 6x | Blocker # | modules/hall-ui/public/blockers.js:364, modules/hall-ui/public/blockers.js:368, modules/hall-ui/public/blockers.js:371 |
|
|
43
43
|
| `4d8ee7d68974` | 6x | task {…} | modules/hall-ui/public/gate.js:157, modules/hall-ui/public/hall-render.js:669, modules/hall-ui/public/idea.js:207 |
|
|
44
44
|
| `5df2baabf82e` | 6x | ← Back | modules/public-landing/public/projects.html:1083, modules/public-landing/public/projects.html:1114, modules/public-landing/public/projects.html:1153 |
|
|
45
45
|
| `afe83bbbd0d4` | 5x | A non-profit, capture-resistant commons. | modules/public-landing/public/contact.html:71, modules/public-landing/public/index.html:900, modules/public-landing/public/privacy.html:80 |
|
|
@@ -95,7 +95,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
95
95
|
| `a4614c0b8eb5` | certain | (or use the Claude Code CLI) and open the project. | `modules/hall-ui/public/hall-render.js:864` |
|
|
96
96
|
| `1eee272d5ff4` | certain | (the droplet) is both the authority and production; | `modules/hall-ui/public/diagrams.html:74` |
|
|
97
97
|
| `c7aecadc8133` | certain | (with {…}) | `modules/hall-ui/public/goals-render.js:592` |
|
|
98
|
-
| `650c0b90a095` | certain | + File a blocker | `modules/hall-ui/public/blockers.js:
|
|
98
|
+
| `650c0b90a095` | certain | + File a blocker | `modules/hall-ui/public/blockers.js:303` |
|
|
99
99
|
| `27d9721f358f` | certain | + Invite | `modules/hall-ui/public/goals-render.js:1210` |
|
|
100
100
|
| `646fab1157fe` | certain | + {…} more project{…} not publicly listed. | `modules/hall-ui/public/profile.js:320` |
|
|
101
101
|
| `05da3082c8c5` | certain | +{…} more | `modules/hall-ui/public/gate.js:149` |
|
|
@@ -137,7 +137,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
137
137
|
| `a3185a43c230` | certain | A sound plays at each turn of your work — a gentle chime when Claude finishes, a flourish when a task ships or | `modules/hall-ui/public/settings.html:371` |
|
|
138
138
|
| `83b1274f9088` | certain | A tally of recorded work sessions, and the latest five. The full record lives on the Sessions page. | `modules/hall-ui/public/watch.html:96` |
|
|
139
139
|
| `0b9adf029094` | certain | A task cannot wait for itself. | `modules/hall-ui/public/task.js:890` |
|
|
140
|
-
| `0aaa0f2c4bdc` | certain | A title is required. | `modules/hall-ui/public/blockers.js:
|
|
140
|
+
| `0aaa0f2c4bdc` | certain | A title is required. | `modules/hall-ui/public/blockers.js:347` |
|
|
141
141
|
| `daf73127afff` | certain | A word on why | `modules/hall-ui/public/hall-render.js:294` |
|
|
142
142
|
| `996edffc1966` | certain | Access requests | `modules/hall-ui/public/watch.html:46` |
|
|
143
143
|
| `996edffc1966` | certain | Access requests | `modules/hall-ui/public/watch.html:61` |
|
|
@@ -198,15 +198,15 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
198
198
|
| `ef2fab4901d6` | certain | Back to tasks | `modules/hall-ui/public/task.html:34` |
|
|
199
199
|
| `f6bb75b08e98` | certain | Back to {…} | `modules/hall-ui/public/task.js:217` |
|
|
200
200
|
| `f6bb75b08e98` | certain | Back to {…} | `modules/hall-ui/public/task.js:226` |
|
|
201
|
-
| `5a2b73968b36` | certain | Blocker # | `modules/hall-ui/public/blockers.js:
|
|
202
|
-
| `5a2b73968b36` | certain | Blocker # | `modules/hall-ui/public/blockers.js:
|
|
203
|
-
| `5a2b73968b36` | certain | Blocker # | `modules/hall-ui/public/blockers.js:
|
|
204
|
-
| `5a2b73968b36` | certain | Blocker # | `modules/hall-ui/public/blockers.js:
|
|
205
|
-
| `5a2b73968b36` | certain | Blocker # | `modules/hall-ui/public/blockers.js:
|
|
201
|
+
| `5a2b73968b36` | certain | Blocker # | `modules/hall-ui/public/blockers.js:364` |
|
|
202
|
+
| `5a2b73968b36` | certain | Blocker # | `modules/hall-ui/public/blockers.js:368` |
|
|
203
|
+
| `5a2b73968b36` | certain | Blocker # | `modules/hall-ui/public/blockers.js:371` |
|
|
204
|
+
| `5a2b73968b36` | certain | Blocker # | `modules/hall-ui/public/blockers.js:413` |
|
|
205
|
+
| `5a2b73968b36` | certain | Blocker # | `modules/hall-ui/public/blockers.js:417` |
|
|
206
206
|
| `5a2b73968b36` | certain | Blocker # | `modules/hall-ui/public/task-detail.js:226` |
|
|
207
207
|
| `cadad7e5dc2b` | certain | Blockers — {{worldName}} | `modules/hall-ui/public/blockers.html:6` |
|
|
208
208
|
| `cadad7e5dc2b` | certain | Blockers — {{worldName}} | `modules/hall-ui/public/blockers.html:6` |
|
|
209
|
-
| `aad792e2b480` | certain | Blocking task # (optional) | `modules/hall-ui/public/blockers.js:
|
|
209
|
+
| `aad792e2b480` | certain | Blocking task # (optional) | `modules/hall-ui/public/blockers.js:310` |
|
|
210
210
|
| `118026595c16` | certain | Board Room | `modules/hall-ui/public/board-room.html:19` |
|
|
211
211
|
| `118026595c16` | certain | Board Room | `modules/hall-ui/public/board-room.html:19` |
|
|
212
212
|
| `118026595c16` | certain | Board Room | `modules/hall-ui/public/board-room.html:31` |
|
|
@@ -314,7 +314,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
314
314
|
| `9912c3835136` | certain | Could not load requests — reload to try again. | `modules/hall-ui/public/collab.js:551` |
|
|
315
315
|
| `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:399` |
|
|
316
316
|
| `7775fec0fa85` | certain | Could not load sessions. | `modules/hall-ui/public/sessions.js:437` |
|
|
317
|
-
| `a2f2e8babef5` | certain | Could not load that page. Try again. | `modules/hall-ui/public/blockers.js:
|
|
317
|
+
| `a2f2e8babef5` | certain | Could not load that page. Try again. | `modules/hall-ui/public/blockers.js:276` |
|
|
318
318
|
| `b2147cc90e36` | certain | Could not load the idea template. Reload, or file from the terminal with capture.js. | `modules/hall-ui/public/ideas.js:926` |
|
|
319
319
|
| `7604af13c40e` | certain | Could not load the profile. | `modules/hall-ui/public/profile.js:873` |
|
|
320
320
|
| `8b69e445592a` | certain | Could not load the question labels; showing the answers as stored. | `modules/hall-ui/public/idea.js:431` |
|
|
@@ -368,7 +368,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
368
368
|
| `a48e9f098392` | certain | Could not {…} just now. | `modules/hall-ui/public/goals-render.js:1348` |
|
|
369
369
|
| `cb09ee26014f` | certain | Could not {…}: {…} | `modules/hall-ui/public/government.js:314` |
|
|
370
370
|
| `f53f7aaa189f` | certain | Couldn’t load this goal’s task dependencies right now. | `modules/hall-ui/public/goal-forest-render.js:85` |
|
|
371
|
-
| `737bef533845` | certain | Couldn’t refresh the queue — try reloading the page. | `modules/hall-ui/public/blockers.js:
|
|
371
|
+
| `737bef533845` | certain | Couldn’t refresh the queue — try reloading the page. | `modules/hall-ui/public/blockers.js:285` |
|
|
372
372
|
| `28ec06f6060a` | certain | Counted, not judged: each question is worth the same, and earns its share in proportion to how much real text | `modules/hall-ui/public/ideas.html:194` |
|
|
373
373
|
| `38827a954f3b` | certain | Create a custom rank first. | `modules/hall-ui/public/government.js:459` |
|
|
374
374
|
| `20459b66303a` | certain | Create one | `modules/hall-ui/public/settings.html:264` |
|
|
@@ -440,15 +440,15 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
440
440
|
| `de62f4cc7d2e` | certain | File a bug or idea | `modules/hall-ui/public/ideas.html:59` |
|
|
441
441
|
| `db2a9415fde4` | certain | File a thought | `modules/hall-ui/public/sky.js:457` |
|
|
442
442
|
| `db2a9415fde4` | certain | File a thought | `modules/hall-ui/public/thinking.js:310` |
|
|
443
|
-
| `0f166311ff3f` | certain | File it | `modules/hall-ui/public/blockers.js:
|
|
443
|
+
| `0f166311ff3f` | certain | File it | `modules/hall-ui/public/blockers.js:313` |
|
|
444
444
|
| `0f166311ff3f` | certain | File it | `modules/hall-ui/public/ideas.html:119` |
|
|
445
445
|
| `0c4632f983db` | certain | File the change | `modules/hall-ui/public/copy-desk.html:173` |
|
|
446
446
|
| `536a7e99640a` | certain | File the flag | `modules/hall-ui/public/copy-desk.html:108` |
|
|
447
447
|
| `077cf99f49f6` | certain | File this idea | `modules/hall-ui/public/ideas.html:171` |
|
|
448
448
|
| `a7bdd4706975` | certain | Filed as task {…} — this review is closed against it. | `modules/hall-ui/public/studio.js:446` |
|
|
449
449
|
| `6430ee350486` | certain | Filed to the inbox. | `modules/hall-ui/public/ideas.js:765` |
|
|
450
|
-
| `0f10a69cabb7` | certain | Filed. | `modules/hall-ui/public/blockers.js:
|
|
451
|
-
| `08ba8e3c1701` | certain | Filing is open to anyone. Linking to a task needs Metic+ — if you name one and aren’t, the blocker still files | `modules/hall-ui/public/blockers.js:
|
|
450
|
+
| `0f10a69cabb7` | certain | Filed. | `modules/hall-ui/public/blockers.js:373` |
|
|
451
|
+
| `08ba8e3c1701` | certain | Filing is open to anyone. Linking to a task needs Metic+ — if you name one and aren’t, the blocker still files | `modules/hall-ui/public/blockers.js:320` |
|
|
452
452
|
| `e8dd9a8f3a7e` | certain | Filter sessions by kind | `modules/hall-ui/public/sessions.html:67` |
|
|
453
453
|
| `1def0e7c716e` | certain | Find something to flag | `modules/hall-ui/public/copy-desk.html:64` |
|
|
454
454
|
| `1109aec05482` | certain | First install | `modules/hall-ui/public/hall-render.js:890` |
|
|
@@ -590,7 +590,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
590
590
|
| `f192ff6563f9` | certain | Leave your GitHub username and an Archon will let you in. No coding needed to start — once you're approved, si | `modules/hall-ui/public/hall-render.js:294` |
|
|
591
591
|
| `d6a78b9e5368` | certain | Let it be for now | `modules/hall-ui/public/studio.js:204` |
|
|
592
592
|
| `d6a78b9e5368` | certain | Let it be for now | `modules/hall-ui/public/studio.js:219` |
|
|
593
|
-
| `b8ba1fa4457c` | certain | Link a task | `modules/hall-ui/public/blockers.js:
|
|
593
|
+
| `b8ba1fa4457c` | certain | Link a task | `modules/hall-ui/public/blockers.js:148` |
|
|
594
594
|
| `43660902bf79` | certain | Link copied. | `modules/hall-ui/public/drachmae.js:332` |
|
|
595
595
|
| `a53e0cde7ff7` | certain | Link first — your rank role is set the moment you join. | `modules/hall-ui/public/settings.js:840` |
|
|
596
596
|
| `64e85f1691f9` | certain | Link your Discord account and you're added to the {{worldName}} server with your rank role already set — no in | `modules/hall-ui/public/settings.html:61` |
|
|
@@ -651,7 +651,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
651
651
|
| `5e8199266a8a` | certain | Name unvouched | `modules/hall-ui/public/watch.js:374` |
|
|
652
652
|
| `83197947ee8d` | certain | Needed by | `modules/hall-ui/public/goal-forest-render.js:120` |
|
|
653
653
|
| `3970d299c95a` | certain | Needs work | `modules/hall-ui/public/studio.js:162` |
|
|
654
|
-
| `7def635421ea` | certain | Needs your attention | `modules/hall-ui/public/goal-inbox.js:
|
|
654
|
+
| `7def635421ea` | certain | Needs your attention | `modules/hall-ui/public/goal-inbox.js:559` |
|
|
655
655
|
| `87f09d983f6c` | certain | New category label | `modules/hall-ui/public/project-settings.js:138` |
|
|
656
656
|
| `d427d9dab01c` | certain | New claims are paused: {…} confirmed {…} can't land yet, so {…} reward is pending. Rebase and re-ship, or rele | `modules/hall-ui/public/hall-render.js:674` |
|
|
657
657
|
| `7fcc2583c372` | certain | New custom rank | `modules/hall-ui/public/government.html:79` |
|
|
@@ -862,7 +862,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
862
862
|
| `a030881168b5` | certain | Reset to default | `modules/hall-ui/public/government.js:267` |
|
|
863
863
|
| `fd89b5be9d3b` | certain | Reset zoom to fit | `modules/hall-ui/public/diagram-viewer.js:97` |
|
|
864
864
|
| `9d9567d1dead` | certain | Reset {…} to its default permissions?\n\nEvery change you've made to this rank is discarded, and it takes effe | `modules/hall-ui/public/government.js:293` |
|
|
865
|
-
| `10d8f8c501b0` | certain | Resolution note (optional) | `modules/hall-ui/public/blockers.js:
|
|
865
|
+
| `10d8f8c501b0` | certain | Resolution note (optional) | `modules/hall-ui/public/blockers.js:131` |
|
|
866
866
|
| `10d8f8c501b0` | certain | Resolution note (optional) | `modules/hall-ui/public/task-detail.js:207` |
|
|
867
867
|
| `3ef9382d4726` | certain | Resolved — the copy was changed | `modules/hall-ui/public/copy-desk.html:122` |
|
|
868
868
|
| `0887725744f2` | certain | Restricted. | `modules/hall-ui/public/board-room.js:521` |
|
|
@@ -972,7 +972,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
972
972
|
| `1e40f33483eb` | certain | Switch theme | `modules/hall-ui/public/shell.js:486` |
|
|
973
973
|
| `93fa2e97dd35` | certain | System default for this skill | `modules/hall-ui/public/settings.js:72` |
|
|
974
974
|
| `4894b1d9b0de` | certain | System oversight: people, operations and security. | `modules/hall-ui/public/watch.js:1335` |
|
|
975
|
-
| `e604fc3ace79` | certain | Task # | `modules/hall-ui/public/blockers.js:
|
|
975
|
+
| `e604fc3ace79` | certain | Task # | `modules/hall-ui/public/blockers.js:139` |
|
|
976
976
|
| `a0f384b022fd` | certain | Task dependencies | `modules/hall-ui/public/goals.html:140` |
|
|
977
977
|
| `91576eb7c880` | certain | Task dependency forest — scrolls sideways inside this box | `modules/hall-ui/public/goal-forest-render.js:120` |
|
|
978
978
|
| `dfc967a63d57` | certain | Task lifecycle from backlog to shipped, showing states and transitions and the edge where credits are awarded. | `modules/hall-ui/public/diagrams.html:51` |
|
|
@@ -1149,7 +1149,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1149
1149
|
| `a17692a923fa` | certain | What you filed, and what became of it | `modules/hall-ui/public/thinking.html:40` |
|
|
1150
1150
|
| `1d5bfd09068c` | certain | What you saw | `modules/hall-ui/public/studio.js:162` |
|
|
1151
1151
|
| `b8743d16eab8` | certain | What {…} unlocks | `modules/hall-ui/public/hall-render.js:82` |
|
|
1152
|
-
| `ecfd34bf5e6f` | certain | What’s stuck (optional) | `modules/hall-ui/public/blockers.js:
|
|
1152
|
+
| `ecfd34bf5e6f` | certain | What’s stuck (optional) | `modules/hall-ui/public/blockers.js:308` |
|
|
1153
1153
|
| `ec1a438eee3f` | certain | Where each comes from and where each goes. {{Currency}} = credits; karma is a separate peer-trust signal, not | `modules/hall-ui/public/diagrams.html:68` |
|
|
1154
1154
|
| `c44892e8870d` | certain | Where it went | `modules/hall-ui/public/drachmae.js:218` |
|
|
1155
1155
|
| `5999540bb2da` | certain | Where the asks stand | `modules/hall-ui/public/collab.html:43` |
|
|
@@ -1240,7 +1240,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1240
1240
|
| `137b07b42203` | certain | Zoom in | `modules/hall-ui/public/diagram-viewer.js:98` |
|
|
1241
1241
|
| `0d0bfa651b36` | certain | Zoom out | `modules/hall-ui/public/diagram-viewer.js:96` |
|
|
1242
1242
|
| `cc361cc7333a` | certain | \s?/.test(raw)) { const quoteLines = []; while (i | `modules/hall-ui/public/md-reader.js:189` |
|
|
1243
|
-
| `8fdcb0439d2f` | certain | a sentence of context | `modules/hall-ui/public/blockers.js:
|
|
1243
|
+
| `8fdcb0439d2f` | certain | a sentence of context | `modules/hall-ui/public/blockers.js:309` |
|
|
1244
1244
|
| `a02616e47d11` | certain | a year of qualifying ships, in your timezone \u00b7 only you see this one | `modules/hall-ui/public/profile-charts.js:288` |
|
|
1245
1245
|
| `44e6e402db94` | certain | account, then open | `modules/hall-ui/public/hall-render.js:825` |
|
|
1246
1246
|
| `ae43396446ed` | certain | account. | `modules/hall-ui/public/hall-render.js:825` |
|
|
@@ -1347,7 +1347,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1347
1347
|
| `5e7a2220c6a9` | certain | of {…} | `modules/hall-ui/public/roadmap.js:288` |
|
|
1348
1348
|
| `759c12b5f983` | certain | oldest first | `modules/hall-ui/public/hall-widgets.js:134` |
|
|
1349
1349
|
| `9d8619202c7f` | certain | open space | `modules/hall-ui/public/sky.js:407` |
|
|
1350
|
-
| `cbaf58cdbe35` | certain | open the queue | `modules/hall-ui/public/goal-inbox.js:
|
|
1350
|
+
| `cbaf58cdbe35` | certain | open the queue | `modules/hall-ui/public/goal-inbox.js:523` |
|
|
1351
1351
|
| `af3a8e0fe6a8` | certain | open your goals | `modules/hall-ui/public/goal-inbox.js:121` |
|
|
1352
1352
|
| `4f279d68175f` | certain | open, on the Security tab | `modules/hall-ui/public/watch.html:47` |
|
|
1353
1353
|
| `7b85e6494596` | certain | opens a new tab | `modules/hall-ui/public/palette.js:190` |
|
|
@@ -1406,9 +1406,9 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1406
1406
|
| `1711516b4411` | certain | waiting for a nod | `modules/hall-ui/public/thinking.js:130` |
|
|
1407
1407
|
| `35be9e0923da` | certain | walks the whole path in plain language. | `modules/hall-ui/public/hall-render.js:890` |
|
|
1408
1408
|
| `17705daf7b85` | certain | what counts as passing | `modules/hall-ui/public/government.html:55` |
|
|
1409
|
-
| `96a8971a5c44` | certain | what got un-stuck | `modules/hall-ui/public/blockers.js:
|
|
1409
|
+
| `96a8971a5c44` | certain | what got un-stuck | `modules/hall-ui/public/blockers.js:132` |
|
|
1410
1410
|
| `96a8971a5c44` | certain | what got un-stuck | `modules/hall-ui/public/task-detail.js:208` |
|
|
1411
|
-
| `3126bb540c89` | certain | what needs the owner’s decision | `modules/hall-ui/public/blockers.js:
|
|
1411
|
+
| `3126bb540c89` | certain | what needs the owner’s decision | `modules/hall-ui/public/blockers.js:307` |
|
|
1412
1412
|
| `b1c5eaa20a9d` | certain | what the idea is, in one line | `modules/hall-ui/public/ideas.html:150` |
|
|
1413
1413
|
| `e72c90163726` | certain | what's blocking | `modules/hall-ui/public/goals-render.js:169` |
|
|
1414
1414
|
| `81f05d9b2bbf` | certain | what's wrong, or what you'd like to see | `modules/hall-ui/public/ideas.html:69` |
|
|
@@ -1506,7 +1506,7 @@ Identical copy within one surface. Sometimes right (a repeated button), sometime
|
|
|
1506
1506
|
| `f16717b3e122` | certain | …{…} more awaiting an answer. | `modules/hall-ui/public/goal-inbox.js:358` |
|
|
1507
1507
|
| `616fb9adf3cf` | certain | …{…} more going quiet. | `modules/hall-ui/public/goal-inbox.js:447` |
|
|
1508
1508
|
| `e35f11bdc5d7` | certain | …{…} more open ideas — triage clears them one at a time. | `modules/hall-ui/public/builders.js:895` |
|
|
1509
|
-
| `5f1d914ad45e` | certain | …{…} more — | `modules/hall-ui/public/goal-inbox.js:
|
|
1509
|
+
| `5f1d914ad45e` | certain | …{…} more — | `modules/hall-ui/public/goal-inbox.js:523` |
|
|
1510
1510
|
| `de8fa5223aee` | certain | ‹ Prev | `modules/hall-ui/public/hall-kit.js:74` |
|
|
1511
1511
|
| `d4b84b7fbdeb` | certain | ← All goals | `modules/hall-ui/public/goals.html:83` |
|
|
1512
1512
|
| `7926e30955d2` | certain | ← Back to goal | `modules/hall-ui/public/goals.html:199` |
|
package/docs/copy-registry.json
CHANGED
|
@@ -93,11 +93,11 @@
|
|
|
93
93
|
"text": "Blocker #",
|
|
94
94
|
"occurrences": 6,
|
|
95
95
|
"at": [
|
|
96
|
-
"modules/hall-ui/public/blockers.js:
|
|
97
|
-
"modules/hall-ui/public/blockers.js:
|
|
98
|
-
"modules/hall-ui/public/blockers.js:
|
|
99
|
-
"modules/hall-ui/public/blockers.js:
|
|
100
|
-
"modules/hall-ui/public/blockers.js:
|
|
96
|
+
"modules/hall-ui/public/blockers.js:364",
|
|
97
|
+
"modules/hall-ui/public/blockers.js:368",
|
|
98
|
+
"modules/hall-ui/public/blockers.js:371",
|
|
99
|
+
"modules/hall-ui/public/blockers.js:413",
|
|
100
|
+
"modules/hall-ui/public/blockers.js:417",
|
|
101
101
|
"modules/hall-ui/public/task-detail.js:226"
|
|
102
102
|
]
|
|
103
103
|
},
|
|
@@ -866,7 +866,7 @@
|
|
|
866
866
|
"text": "File it",
|
|
867
867
|
"occurrences": 2,
|
|
868
868
|
"at": [
|
|
869
|
-
"modules/hall-ui/public/blockers.js:
|
|
869
|
+
"modules/hall-ui/public/blockers.js:313",
|
|
870
870
|
"modules/hall-ui/public/ideas.html:119"
|
|
871
871
|
]
|
|
872
872
|
},
|
|
@@ -1326,7 +1326,7 @@
|
|
|
1326
1326
|
"text": "Resolution note (optional)",
|
|
1327
1327
|
"occurrences": 2,
|
|
1328
1328
|
"at": [
|
|
1329
|
-
"modules/hall-ui/public/blockers.js:
|
|
1329
|
+
"modules/hall-ui/public/blockers.js:131",
|
|
1330
1330
|
"modules/hall-ui/public/task-detail.js:207"
|
|
1331
1331
|
]
|
|
1332
1332
|
},
|
|
@@ -1776,7 +1776,7 @@
|
|
|
1776
1776
|
"text": "what got un-stuck",
|
|
1777
1777
|
"occurrences": 2,
|
|
1778
1778
|
"at": [
|
|
1779
|
-
"modules/hall-ui/public/blockers.js:
|
|
1779
|
+
"modules/hall-ui/public/blockers.js:132",
|
|
1780
1780
|
"modules/hall-ui/public/task-detail.js:208"
|
|
1781
1781
|
]
|
|
1782
1782
|
},
|
|
@@ -2024,7 +2024,7 @@
|
|
|
2024
2024
|
"surface": "builders-hall",
|
|
2025
2025
|
"text": "+ File a blocker",
|
|
2026
2026
|
"file": "modules/hall-ui/public/blockers.js",
|
|
2027
|
-
"line":
|
|
2027
|
+
"line": 303,
|
|
2028
2028
|
"origin": "js-markup",
|
|
2029
2029
|
"confidence": "certain"
|
|
2030
2030
|
},
|
|
@@ -2402,7 +2402,7 @@
|
|
|
2402
2402
|
"surface": "builders-hall",
|
|
2403
2403
|
"text": "A title is required.",
|
|
2404
2404
|
"file": "modules/hall-ui/public/blockers.js",
|
|
2405
|
-
"line":
|
|
2405
|
+
"line": 347,
|
|
2406
2406
|
"origin": "js-text-assign",
|
|
2407
2407
|
"confidence": "certain"
|
|
2408
2408
|
},
|
|
@@ -2951,7 +2951,7 @@
|
|
|
2951
2951
|
"surface": "builders-hall",
|
|
2952
2952
|
"text": "Blocker #",
|
|
2953
2953
|
"file": "modules/hall-ui/public/blockers.js",
|
|
2954
|
-
"line":
|
|
2954
|
+
"line": 364,
|
|
2955
2955
|
"origin": "js-notice",
|
|
2956
2956
|
"confidence": "certain"
|
|
2957
2957
|
},
|
|
@@ -2960,7 +2960,7 @@
|
|
|
2960
2960
|
"surface": "builders-hall",
|
|
2961
2961
|
"text": "Blocker #",
|
|
2962
2962
|
"file": "modules/hall-ui/public/blockers.js",
|
|
2963
|
-
"line":
|
|
2963
|
+
"line": 368,
|
|
2964
2964
|
"origin": "js-notice",
|
|
2965
2965
|
"confidence": "certain"
|
|
2966
2966
|
},
|
|
@@ -2969,7 +2969,7 @@
|
|
|
2969
2969
|
"surface": "builders-hall",
|
|
2970
2970
|
"text": "Blocker #",
|
|
2971
2971
|
"file": "modules/hall-ui/public/blockers.js",
|
|
2972
|
-
"line":
|
|
2972
|
+
"line": 371,
|
|
2973
2973
|
"origin": "js-notice",
|
|
2974
2974
|
"confidence": "certain"
|
|
2975
2975
|
},
|
|
@@ -2978,7 +2978,7 @@
|
|
|
2978
2978
|
"surface": "builders-hall",
|
|
2979
2979
|
"text": "Blocker #",
|
|
2980
2980
|
"file": "modules/hall-ui/public/blockers.js",
|
|
2981
|
-
"line":
|
|
2981
|
+
"line": 413,
|
|
2982
2982
|
"origin": "js-notice",
|
|
2983
2983
|
"confidence": "certain"
|
|
2984
2984
|
},
|
|
@@ -2987,7 +2987,7 @@
|
|
|
2987
2987
|
"surface": "builders-hall",
|
|
2988
2988
|
"text": "Blocker #",
|
|
2989
2989
|
"file": "modules/hall-ui/public/blockers.js",
|
|
2990
|
-
"line":
|
|
2990
|
+
"line": 417,
|
|
2991
2991
|
"origin": "js-notice",
|
|
2992
2992
|
"confidence": "certain"
|
|
2993
2993
|
},
|
|
@@ -3023,7 +3023,7 @@
|
|
|
3023
3023
|
"surface": "builders-hall",
|
|
3024
3024
|
"text": "Blocking task # (optional)",
|
|
3025
3025
|
"file": "modules/hall-ui/public/blockers.js",
|
|
3026
|
-
"line":
|
|
3026
|
+
"line": 310,
|
|
3027
3027
|
"origin": "js-markup",
|
|
3028
3028
|
"confidence": "certain"
|
|
3029
3029
|
},
|
|
@@ -3995,7 +3995,7 @@
|
|
|
3995
3995
|
"surface": "builders-hall",
|
|
3996
3996
|
"text": "Could not load that page. Try again.",
|
|
3997
3997
|
"file": "modules/hall-ui/public/blockers.js",
|
|
3998
|
-
"line":
|
|
3998
|
+
"line": 276,
|
|
3999
3999
|
"origin": "js-notice",
|
|
4000
4000
|
"confidence": "certain"
|
|
4001
4001
|
},
|
|
@@ -4481,7 +4481,7 @@
|
|
|
4481
4481
|
"surface": "builders-hall",
|
|
4482
4482
|
"text": "Couldn’t refresh the queue — try reloading the page.",
|
|
4483
4483
|
"file": "modules/hall-ui/public/blockers.js",
|
|
4484
|
-
"line":
|
|
4484
|
+
"line": 285,
|
|
4485
4485
|
"origin": "js-notice",
|
|
4486
4486
|
"confidence": "certain"
|
|
4487
4487
|
},
|
|
@@ -5129,7 +5129,7 @@
|
|
|
5129
5129
|
"surface": "builders-hall",
|
|
5130
5130
|
"text": "File it",
|
|
5131
5131
|
"file": "modules/hall-ui/public/blockers.js",
|
|
5132
|
-
"line":
|
|
5132
|
+
"line": 313,
|
|
5133
5133
|
"origin": "js-markup",
|
|
5134
5134
|
"confidence": "certain"
|
|
5135
5135
|
},
|
|
@@ -5192,7 +5192,7 @@
|
|
|
5192
5192
|
"surface": "builders-hall",
|
|
5193
5193
|
"text": "Filed.",
|
|
5194
5194
|
"file": "modules/hall-ui/public/blockers.js",
|
|
5195
|
-
"line":
|
|
5195
|
+
"line": 373,
|
|
5196
5196
|
"origin": "js-notice",
|
|
5197
5197
|
"confidence": "certain"
|
|
5198
5198
|
},
|
|
@@ -5201,7 +5201,7 @@
|
|
|
5201
5201
|
"surface": "builders-hall",
|
|
5202
5202
|
"text": "Filing is open to anyone. Linking to a task needs Metic+ — if you name one and aren’t, the blocker still files and a Metic+ can link it.",
|
|
5203
5203
|
"file": "modules/hall-ui/public/blockers.js",
|
|
5204
|
-
"line":
|
|
5204
|
+
"line": 320,
|
|
5205
5205
|
"origin": "js-markup",
|
|
5206
5206
|
"confidence": "certain"
|
|
5207
5207
|
},
|
|
@@ -6479,7 +6479,7 @@
|
|
|
6479
6479
|
"surface": "builders-hall",
|
|
6480
6480
|
"text": "Link a task",
|
|
6481
6481
|
"file": "modules/hall-ui/public/blockers.js",
|
|
6482
|
-
"line":
|
|
6482
|
+
"line": 148,
|
|
6483
6483
|
"origin": "js-markup",
|
|
6484
6484
|
"confidence": "certain"
|
|
6485
6485
|
},
|
|
@@ -7028,7 +7028,7 @@
|
|
|
7028
7028
|
"surface": "builders-hall",
|
|
7029
7029
|
"text": "Needs your attention",
|
|
7030
7030
|
"file": "modules/hall-ui/public/goal-inbox.js",
|
|
7031
|
-
"line":
|
|
7031
|
+
"line": 559,
|
|
7032
7032
|
"origin": "js-markup",
|
|
7033
7033
|
"confidence": "certain"
|
|
7034
7034
|
},
|
|
@@ -8927,7 +8927,7 @@
|
|
|
8927
8927
|
"surface": "builders-hall",
|
|
8928
8928
|
"text": "Resolution note (optional)",
|
|
8929
8929
|
"file": "modules/hall-ui/public/blockers.js",
|
|
8930
|
-
"line":
|
|
8930
|
+
"line": 131,
|
|
8931
8931
|
"origin": "js-markup",
|
|
8932
8932
|
"confidence": "certain"
|
|
8933
8933
|
},
|
|
@@ -9917,7 +9917,7 @@
|
|
|
9917
9917
|
"surface": "builders-hall",
|
|
9918
9918
|
"text": "Task #",
|
|
9919
9919
|
"file": "modules/hall-ui/public/blockers.js",
|
|
9920
|
-
"line":
|
|
9920
|
+
"line": 139,
|
|
9921
9921
|
"origin": "js-markup",
|
|
9922
9922
|
"confidence": "certain"
|
|
9923
9923
|
},
|
|
@@ -11510,7 +11510,7 @@
|
|
|
11510
11510
|
"surface": "builders-hall",
|
|
11511
11511
|
"text": "What’s stuck (optional)",
|
|
11512
11512
|
"file": "modules/hall-ui/public/blockers.js",
|
|
11513
|
-
"line":
|
|
11513
|
+
"line": 308,
|
|
11514
11514
|
"origin": "js-markup",
|
|
11515
11515
|
"confidence": "certain"
|
|
11516
11516
|
},
|
|
@@ -12329,7 +12329,7 @@
|
|
|
12329
12329
|
"surface": "builders-hall",
|
|
12330
12330
|
"text": "a sentence of context",
|
|
12331
12331
|
"file": "modules/hall-ui/public/blockers.js",
|
|
12332
|
-
"line":
|
|
12332
|
+
"line": 309,
|
|
12333
12333
|
"origin": "js-markup",
|
|
12334
12334
|
"confidence": "certain"
|
|
12335
12335
|
},
|
|
@@ -13292,7 +13292,7 @@
|
|
|
13292
13292
|
"surface": "builders-hall",
|
|
13293
13293
|
"text": "open the queue",
|
|
13294
13294
|
"file": "modules/hall-ui/public/goal-inbox.js",
|
|
13295
|
-
"line":
|
|
13295
|
+
"line": 523,
|
|
13296
13296
|
"origin": "js-markup",
|
|
13297
13297
|
"confidence": "certain"
|
|
13298
13298
|
},
|
|
@@ -13823,7 +13823,7 @@
|
|
|
13823
13823
|
"surface": "builders-hall",
|
|
13824
13824
|
"text": "what got un-stuck",
|
|
13825
13825
|
"file": "modules/hall-ui/public/blockers.js",
|
|
13826
|
-
"line":
|
|
13826
|
+
"line": 132,
|
|
13827
13827
|
"origin": "js-markup",
|
|
13828
13828
|
"confidence": "certain"
|
|
13829
13829
|
},
|
|
@@ -13841,7 +13841,7 @@
|
|
|
13841
13841
|
"surface": "builders-hall",
|
|
13842
13842
|
"text": "what needs the owner’s decision",
|
|
13843
13843
|
"file": "modules/hall-ui/public/blockers.js",
|
|
13844
|
-
"line":
|
|
13844
|
+
"line": 307,
|
|
13845
13845
|
"origin": "js-markup",
|
|
13846
13846
|
"confidence": "certain"
|
|
13847
13847
|
},
|
|
@@ -14723,7 +14723,7 @@
|
|
|
14723
14723
|
"surface": "builders-hall",
|
|
14724
14724
|
"text": "…{…} more —",
|
|
14725
14725
|
"file": "modules/hall-ui/public/goal-inbox.js",
|
|
14726
|
-
"line":
|
|
14726
|
+
"line": 523,
|
|
14727
14727
|
"origin": "js-markup",
|
|
14728
14728
|
"confidence": "certain"
|
|
14729
14729
|
},
|
|
@@ -2434,5 +2434,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
2434
2434
|
landed since 1.19.978 with no explicit bump. run 35887876013. (task 1002620)
|
|
2435
2435
|
1.19.980 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2436
2436
|
landed since 1.19.979 with no explicit bump. run 35889261972. (task 1002620)
|
|
2437
|
+
1.19.981 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2438
|
+
landed since 1.19.980 with no explicit bump. run 35891635199. (task 1002620)
|
|
2437
2439
|
---------------------------------------------------------------------------
|
|
2438
2440
|
```
|
|
@@ -28,25 +28,12 @@
|
|
|
28
28
|
}(typeof self !== 'undefined' ? self : this, function () {
|
|
29
29
|
'use strict';
|
|
30
30
|
|
|
31
|
-
function esc(s) {
|
|
32
|
-
return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) {
|
|
33
|
-
return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c];
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function fmtDate(iso) {
|
|
38
|
-
if (!iso) return '';
|
|
39
|
-
var d = new Date(iso);
|
|
40
|
-
if (isNaN(d.getTime())) return '';
|
|
41
|
-
return d.toLocaleDateString(undefined, { day: 'numeric', month: 'short', year: 'numeric' });
|
|
42
|
-
}
|
|
43
|
-
|
|
44
31
|
// A blocker's body_md is the owner's own words, quoted the way goal-inbox.js's
|
|
45
32
|
// invitation/join rows already quote a note (the SAME convention, not a new
|
|
46
33
|
// one). It can run to a paragraph, and the row is a summary, so it is clipped —
|
|
47
34
|
// CSS line-clamp handles visual overflow on both surfaces, this just keeps one
|
|
48
35
|
// enormous blocker from making the row's own text node absurd.
|
|
49
|
-
function noteHtml(bodyMd, noteClass) {
|
|
36
|
+
function noteHtml(bodyMd, noteClass, esc) {
|
|
50
37
|
var t = String(bodyMd || '').trim();
|
|
51
38
|
if (!t) return '';
|
|
52
39
|
var clipped = t.length > 240 ? t.slice(0, 239).replace(/\s+$/, '') + '…' : t;
|
|
@@ -55,8 +42,9 @@
|
|
|
55
42
|
|
|
56
43
|
// `taskHref(id)` is the caller's own link builder (window.OTBTaskDetail.href on
|
|
57
44
|
// a live page) — kept OUT of this pure module the way hall-kit.js stays
|
|
58
|
-
// date-agnostic: the lib never learns what a task URL looks like.
|
|
59
|
-
|
|
45
|
+
// date-agnostic: the lib never learns what a task URL looks like. `esc` is the
|
|
46
|
+
// caller's too (OTBKit.esc): the lib owns no formatter of its own (task 1003984).
|
|
47
|
+
function blockingLine(b, taskHref, esc) {
|
|
60
48
|
var ids = Array.isArray(b.blocking_task_ids) ? b.blocking_task_ids : [];
|
|
61
49
|
if (!ids.length) return 'Blocking nothing yet';
|
|
62
50
|
var links = ids.map(function (id) {
|
|
@@ -76,11 +64,18 @@
|
|
|
76
64
|
// the "reachable only by typing the URL" bug this task
|
|
77
65
|
// fixes is exactly that overlay having no door INTO it).
|
|
78
66
|
// taskHref(id) — see blockingLine above.
|
|
67
|
+
// esc(s), fmtDate(iso) — REQUIRED; callers pass OTBKit.esc / OTBKit.fmtAbsDate
|
|
68
|
+
// so the hall keeps ONE definition of each (task 1003984).
|
|
79
69
|
// Returns { titleHtml, noteHtml, factsHtml } — fragments, not a wrapped row;
|
|
80
70
|
// each caller nests them in its OWN <li> (goal-inbox.js's .ginbox__item,
|
|
81
71
|
// blockers.js's .ov-row), the goalRenderFacts idiom.
|
|
82
72
|
function blockerFacts(b, opts) {
|
|
83
73
|
opts = opts || {};
|
|
74
|
+
var esc = opts.esc;
|
|
75
|
+
var fmtDate = opts.fmtDate;
|
|
76
|
+
if (typeof esc !== 'function' || typeof fmtDate !== 'function') {
|
|
77
|
+
throw new TypeError('blockerFacts: opts.esc and opts.fmtDate are required (pass OTBKit.esc / OTBKit.fmtAbsDate)');
|
|
78
|
+
}
|
|
84
79
|
var titleClass = opts.titleClass || 'ov-row__title';
|
|
85
80
|
var noteClass = opts.noteClass || 'ov-row__sub';
|
|
86
81
|
var whenClass = opts.whenClass || 'ov-row__when';
|
|
@@ -96,15 +91,15 @@
|
|
|
96
91
|
// join multiple facts into a single .ov-row__when span the same way) rather
|
|
97
92
|
// than several sibling spans, which need a flex-gapped parent to space
|
|
98
93
|
// themselves and the attention-inbox context (.ginbox__sub) is not one.
|
|
99
|
-
var facts = 'Filed ' + esc(fmtDate(b.created_at)) + ' · ' + blockingLine(b, taskHref);
|
|
94
|
+
var facts = 'Filed ' + esc(fmtDate(b.created_at)) + ' · ' + blockingLine(b, taskHref, esc);
|
|
100
95
|
var factsHtml = '<span class="' + esc(whenClass) + '">' + facts + '</span>';
|
|
101
96
|
|
|
102
97
|
return {
|
|
103
98
|
titleHtml: titleHtml,
|
|
104
|
-
noteHtml: noteHtml(b.body_md, noteClass),
|
|
99
|
+
noteHtml: noteHtml(b.body_md, noteClass, esc),
|
|
105
100
|
factsHtml: factsHtml,
|
|
106
101
|
};
|
|
107
102
|
}
|
|
108
103
|
|
|
109
|
-
return {
|
|
104
|
+
return { blockingLine: blockingLine, blockerFacts: blockerFacts };
|
|
110
105
|
}));
|
|
@@ -120,12 +120,14 @@
|
|
|
120
120
|
whenClass: 'ov-row__when',
|
|
121
121
|
blockerHref: blockerHref,
|
|
122
122
|
taskHref: taskHref,
|
|
123
|
+
esc: kit.esc,
|
|
124
|
+
fmtDate: kit.fmtAbsDate,
|
|
123
125
|
});
|
|
124
126
|
var right = '';
|
|
125
127
|
if (isReviewer()) {
|
|
126
128
|
var id = String(b.id);
|
|
127
129
|
if (openRow && String(openRow.id) === id && openRow.mode === 'resolve') {
|
|
128
|
-
right = '<div class="ov-row__right"><form class="td-form" data-resolve-form="' +
|
|
130
|
+
right = '<div class="ov-row__right"><form class="td-form" data-resolve-form="' + kit.esc(id) + '">'
|
|
129
131
|
+ '<label class="td-field td-field--wide"><span>Resolution note (optional)</span>'
|
|
130
132
|
+ '<input type="text" name="note" maxlength="1000" placeholder="what got un-stuck"></label>'
|
|
131
133
|
+ '<div class="td-actions">'
|
|
@@ -133,7 +135,7 @@
|
|
|
133
135
|
+ '<button type="button" class="td-btn" data-row-cancel>Cancel</button>'
|
|
134
136
|
+ '</div><p class="td-action-note" data-err></p></form></div>';
|
|
135
137
|
} else if (openRow && String(openRow.id) === id && openRow.mode === 'link') {
|
|
136
|
-
right = '<div class="ov-row__right"><form class="td-form" data-link-form="' +
|
|
138
|
+
right = '<div class="ov-row__right"><form class="td-form" data-link-form="' + kit.esc(id) + '">'
|
|
137
139
|
+ '<label class="td-field td-field--wide"><span>Task #</span>'
|
|
138
140
|
+ '<input type="number" name="taskId" min="1" required placeholder="e.g. 1002980"></label>'
|
|
139
141
|
+ '<div class="td-actions">'
|
|
@@ -142,8 +144,8 @@
|
|
|
142
144
|
+ '</div><p class="td-action-note" data-err></p></form></div>';
|
|
143
145
|
} else {
|
|
144
146
|
right = '<div class="ov-row__right"><div class="ov-row__actions">'
|
|
145
|
-
+ '<button type="button" class="btn-ghost" data-resolve-open="' +
|
|
146
|
-
+ '<button type="button" class="btn-ghost" data-link-open="' +
|
|
147
|
+
+ '<button type="button" class="btn-ghost" data-resolve-open="' + kit.esc(id) + '">Resolve</button>'
|
|
148
|
+
+ '<button type="button" class="btn-ghost" data-link-open="' + kit.esc(id) + '">Link a task</button>'
|
|
147
149
|
+ '</div></div>';
|
|
148
150
|
}
|
|
149
151
|
}
|
|
@@ -154,7 +156,7 @@
|
|
|
154
156
|
// three-column grid (auto minmax(0,1fr) auto) would misread the actions
|
|
155
157
|
// column as the row's middle content and pin it beside the text on a
|
|
156
158
|
// phone instead of dropping it beneath.
|
|
157
|
-
return '<li class="ov-row" data-id="' +
|
|
159
|
+
return '<li class="ov-row" data-id="' + kit.esc(String(b.id)) + '">'
|
|
158
160
|
+ '<div class="ov-row__main">'
|
|
159
161
|
+ facts.titleHtml
|
|
160
162
|
+ facts.noteHtml
|
|
@@ -495,6 +495,8 @@
|
|
|
495
495
|
whenClass: 'ginbox__sub',
|
|
496
496
|
// The SAME overlay task-detail.js has rendered since task 1003066's
|
|
497
497
|
// predecessor — this slice is what gives it its first door in.
|
|
498
|
+
esc: window.OTBKit.esc,
|
|
499
|
+
fmtDate: window.OTBKit.fmtAbsDate,
|
|
498
500
|
blockerHref: (id) => `#/blocker/${encodeURIComponent(id)}`,
|
|
499
501
|
taskHref: (id) => (window.OTBTaskDetail ? window.OTBTaskDetail.href(id) : `/task/${encodeURIComponent(id)}`),
|
|
500
502
|
});
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.981",
|
|
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.981",
|
|
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.981",
|
|
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/src/module-api.js
CHANGED
|
@@ -71,7 +71,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
|
|
|
71
71
|
// there. scripts/gds/bump-version.js still rewrites the literal below; it appends
|
|
72
72
|
// the entry to that file. Look for a version's history there, not here.
|
|
73
73
|
// ---------------------------------------------------------------------------
|
|
74
|
-
const CORE_VERSION = '1.19.
|
|
74
|
+
const CORE_VERSION = '1.19.981'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
75
75
|
|
|
76
76
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
77
77
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|
package/tests/blockers_lib.mjs
CHANGED
|
@@ -16,31 +16,35 @@ import { createRequire } from 'node:module';
|
|
|
16
16
|
|
|
17
17
|
const require = createRequire(import.meta.url);
|
|
18
18
|
const lib = require('../modules/hall-ui/public/blockers-lib.js');
|
|
19
|
+
// The lib owns no esc/fmtDate — callers pass the kit's (task 1003984).
|
|
20
|
+
const kit = require('../modules/hall-ui/public/hall-kit.js');
|
|
21
|
+
const F = { esc: kit.esc, fmtDate: kit.fmtAbsDate };
|
|
19
22
|
|
|
20
23
|
test('loads standalone via require() — no window, no DOM (Node-require-safe like hall-kit.js)', () => {
|
|
21
24
|
assert.ok(lib, 'module.exports must be set');
|
|
22
|
-
for (const k of ['
|
|
25
|
+
for (const k of ['blockingLine', 'blockerFacts']) {
|
|
23
26
|
assert.ok(k in lib, `missing export: ${k}`);
|
|
24
27
|
}
|
|
28
|
+
for (const k of ['esc', 'fmtDate']) assert.ok(!(k in lib), `lib must not re-own ${k}`);
|
|
25
29
|
});
|
|
26
30
|
|
|
27
31
|
test('blockerFacts: title links into the SAME #/blocker/N overlay task-detail.js renders', () => {
|
|
28
32
|
const b = { id: 42, title: 'Need the owner’s AWS card on file', created_at: '2026-08-30T00:00:00.000Z', blocking_task_ids: [] };
|
|
29
|
-
const { titleHtml } = lib.blockerFacts(b, { blockerHref: (id) => `#/blocker/${id}` });
|
|
33
|
+
const { titleHtml } = lib.blockerFacts(b, { ...F, blockerHref: (id) => `#/blocker/${id}` });
|
|
30
34
|
assert.match(titleHtml, /href="#\/blocker\/42"/);
|
|
31
35
|
assert.match(titleHtml, /Need the owner/);
|
|
32
36
|
});
|
|
33
37
|
|
|
34
38
|
test('blockerFacts: with no blockerHref, the title renders as plain text, not a dead link', () => {
|
|
35
39
|
const b = { id: 42, title: 'Something stuck', created_at: null, blocking_task_ids: [] };
|
|
36
|
-
const { titleHtml } = lib.blockerFacts(b);
|
|
40
|
+
const { titleHtml } = lib.blockerFacts(b, F);
|
|
37
41
|
assert.doesNotMatch(titleHtml, /<a /);
|
|
38
42
|
assert.match(titleHtml, /<span/);
|
|
39
43
|
});
|
|
40
44
|
|
|
41
45
|
test('blockerFacts: the caller-supplied classes land on the right fragments', () => {
|
|
42
46
|
const b = { id: 1, title: 'x', body_md: 'a reason', created_at: '2026-08-30T00:00:00.000Z', blocking_task_ids: [] };
|
|
43
|
-
const { titleHtml, noteHtml, factsHtml } = lib.blockerFacts(b, {
|
|
47
|
+
const { titleHtml, noteHtml, factsHtml } = lib.blockerFacts(b, { ...F,
|
|
44
48
|
titleClass: 'ginbox__goal', noteClass: 'ginbox__note', whenClass: 'ginbox__sub',
|
|
45
49
|
});
|
|
46
50
|
assert.match(titleHtml, /class="ginbox__goal"/);
|
|
@@ -49,19 +53,19 @@ test('blockerFacts: the caller-supplied classes land on the right fragments', ()
|
|
|
49
53
|
});
|
|
50
54
|
|
|
51
55
|
test('blockingLine: no linked tasks reads honestly, not as a false "0 tasks"', () => {
|
|
52
|
-
assert.equal(lib.blockingLine({ blocking_task_ids: [] }, null), 'Blocking nothing yet');
|
|
53
|
-
assert.equal(lib.blockingLine({}, null), 'Blocking nothing yet');
|
|
56
|
+
assert.equal(lib.blockingLine({ blocking_task_ids: [] }, null, kit.esc), 'Blocking nothing yet');
|
|
57
|
+
assert.equal(lib.blockingLine({}, null, kit.esc), 'Blocking nothing yet');
|
|
54
58
|
});
|
|
55
59
|
|
|
56
60
|
test('blockingLine: singular/plural noun agreement, and every id becomes a link when taskHref is given', () => {
|
|
57
|
-
const one = lib.blockingLine({ blocking_task_ids: [5] }, (id) => `/task/${id}
|
|
61
|
+
const one = lib.blockingLine({ blocking_task_ids: [5] }, (id) => `/task/${id}`, kit.esc);
|
|
58
62
|
assert.equal(one, 'Blocking 1 task: <a href="/task/5">#5</a>');
|
|
59
|
-
const many = lib.blockingLine({ blocking_task_ids: [5, 6] }, (id) => `/task/${id}
|
|
63
|
+
const many = lib.blockingLine({ blocking_task_ids: [5, 6] }, (id) => `/task/${id}`, kit.esc);
|
|
60
64
|
assert.equal(many, 'Blocking 2 tasks: <a href="/task/5">#5</a>, <a href="/task/6">#6</a>');
|
|
61
65
|
});
|
|
62
66
|
|
|
63
67
|
test('blockingLine: with no taskHref the ids still render, as plain text — never a dead link', () => {
|
|
64
|
-
const line = lib.blockingLine({ blocking_task_ids: [5] }, null);
|
|
68
|
+
const line = lib.blockingLine({ blocking_task_ids: [5] }, null, kit.esc);
|
|
65
69
|
assert.equal(line, 'Blocking 1 task: #5');
|
|
66
70
|
assert.doesNotMatch(line, /<a /);
|
|
67
71
|
});
|
|
@@ -71,21 +75,21 @@ test('blockerFacts: the facts line is ONE `·`-joined span, not several ungapped
|
|
|
71
75
|
// between them (unlike .ov-row__facts, which is a flex container) and would
|
|
72
76
|
// render Filed-date and Blocking-line running together with no separator.
|
|
73
77
|
const b = { id: 1, title: 'x', created_at: '2026-08-30T00:00:00.000Z', blocking_task_ids: [7] };
|
|
74
|
-
const { factsHtml } = lib.blockerFacts(b, { taskHref: (id) => `/task/${id}` });
|
|
78
|
+
const { factsHtml } = lib.blockerFacts(b, { ...F, taskHref: (id) => `/task/${id}` });
|
|
75
79
|
assert.equal((factsHtml.match(/<span/g) || []).length, 1, 'exactly one wrapping span');
|
|
76
80
|
assert.match(factsHtml, /Filed .* · Blocking 1 task/);
|
|
77
81
|
});
|
|
78
82
|
|
|
79
83
|
test('blockerFacts: body_md becomes a quoted note; an empty one renders nothing', () => {
|
|
80
|
-
const withNote = lib.blockerFacts({ id: 1, title: 'x', body_md: 'reason', blocking_task_ids: [] });
|
|
84
|
+
const withNote = lib.blockerFacts({ id: 1, title: 'x', body_md: 'reason', blocking_task_ids: [] }, F);
|
|
81
85
|
assert.match(withNote.noteHtml, /<p class="ov-row__sub">“reason”<\/p>/);
|
|
82
|
-
const noNote = lib.blockerFacts({ id: 1, title: 'x', body_md: ' ', blocking_task_ids: [] });
|
|
86
|
+
const noNote = lib.blockerFacts({ id: 1, title: 'x', body_md: ' ', blocking_task_ids: [] }, F);
|
|
83
87
|
assert.equal(noNote.noteHtml, '');
|
|
84
88
|
});
|
|
85
89
|
|
|
86
90
|
test('blockerFacts: a very long body_md is clipped, so one enormous blocker cannot blow up the row', () => {
|
|
87
91
|
const long = 'x'.repeat(500);
|
|
88
|
-
const { noteHtml } = lib.blockerFacts({ id: 1, title: 't', body_md: long, blocking_task_ids: [] });
|
|
92
|
+
const { noteHtml } = lib.blockerFacts({ id: 1, title: 't', body_md: long, blocking_task_ids: [] }, F);
|
|
89
93
|
assert.ok(noteHtml.length < 500, 'clipped well below the source length');
|
|
90
94
|
assert.match(noteHtml, /…”<\/p>$/);
|
|
91
95
|
});
|
|
@@ -95,8 +99,12 @@ test('blockerFacts: HTML in a title/body/task id is escaped, not injected', () =
|
|
|
95
99
|
id: 1, title: '<script>alert(1)</script>', body_md: '<img onerror=alert(1)>',
|
|
96
100
|
created_at: '2026-08-30T00:00:00.000Z', blocking_task_ids: [1],
|
|
97
101
|
};
|
|
98
|
-
const { titleHtml, noteHtml, factsHtml } = lib.blockerFacts(b, { taskHref: (id) => `/task/"><script>${id}` });
|
|
102
|
+
const { titleHtml, noteHtml, factsHtml } = lib.blockerFacts(b, { ...F, taskHref: (id) => `/task/"><script>${id}` });
|
|
99
103
|
assert.doesNotMatch(titleHtml, /<script>/);
|
|
100
104
|
assert.doesNotMatch(noteHtml, /<img /);
|
|
101
105
|
assert.doesNotMatch(factsHtml, /<script>/);
|
|
102
106
|
});
|
|
107
|
+
|
|
108
|
+
test('blockerFacts: refuses to render without the caller-supplied esc/fmtDate', () => {
|
|
109
|
+
assert.throws(() => lib.blockerFacts({ id: 1, title: 'x' }), /opts.esc and opts.fmtDate are required/);
|
|
110
|
+
});
|