@bongos/core 1.21.174 → 1.21.175
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 +42 -27
- package/docs/copy-inventory.md +55 -62
- package/docs/copy-registry.json +82 -156
- package/docs/module-api-changelog.md +2 -0
- package/docs/page-inventory.json +5 -0
- package/docs/page-readings.json +32 -30
- package/modules/hall-ui/public/blockers.html +2 -0
- package/modules/hall-ui/public/blockers.js +13 -0
- package/modules/hall-ui/public/board-room.css +5 -0
- package/modules/hall-ui/public/board-room.html +1 -0
- package/modules/hall-ui/public/board-room.js +2 -2
- package/modules/hall-ui/public/goal-inbox.js +69 -86
- package/modules/hall-ui/public/hall-ask.css +57 -0
- package/modules/hall-ui/public/hall-ask.js +50 -0
- package/modules/hall-ui/public/index.html +3 -0
- package/modules/hall-ui/records/hall-ask-card.md +24 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/src/module-api.js +1 -1
- package/tests/blockers_hall.mjs +3 -1
- package/tests/home_attention_cards.mjs +2 -0
- package/tests/rot_inbox.mjs +10 -7
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# The city's ask card, in the hall — every action a builder answers in place (task 1004820)
|
|
2
|
+
|
|
3
|
+
Criterion `wa6-hall-reads-like-home` of goal 1000095 (owner ask 2026-10-23): the buttons a builder acts
|
|
4
|
+
on inside the hall use the card template the city view built (`street-deck.css` `.ask`, task 1004702).
|
|
5
|
+
|
|
6
|
+
- **One builder, one sheet.** `hall-ask.js` (`window.OTBAsk.html`) draws the card — where it sits, the
|
|
7
|
+
question, what was said, each answer as a one-tap option chip with its result line — and
|
|
8
|
+
`hall-ask.css` styles it under its own `hask` prefix on the hall's tokens, light and twice dark. The
|
|
9
|
+
city keeps `.ask`; a page loading both never cascades one into the other.
|
|
10
|
+
- **No second action path.** An option carries the same `data-*` the page's delegated handler already
|
|
11
|
+
read, so switching a row to the card changes how it looks, never what it calls. An option with `href`
|
|
12
|
+
is a link, for an act that needs its own panel (resolving a blocker opens its overlay).
|
|
13
|
+
- **Where it is applied.** Home's attention inbox (join invitations, join requests, the nod, "was this
|
|
14
|
+
removed?", untouched work, and the blocker slice — which had NO action and now has "Resolve it"),
|
|
15
|
+
the Blockers page's closed reviewer rows (Resolve it / Link a task; the open forms are unchanged), and
|
|
16
|
+
the Board Room's vote (Vote yes / Object as the card's chips).
|
|
17
|
+
- **Rows keep `.ginbox__item`**, because `OTBAttention.refresh()` counts them; `hall-ask.css` makes the
|
|
18
|
+
card's own box win over the ledger row.
|
|
19
|
+
- **Wording follows the Home rebuild:** a question, not a label ("Join X?", "Let Ana join?"), and every
|
|
20
|
+
answer says what it does.
|
|
21
|
+
|
|
22
|
+
Left for the page tasks of the same criterion (1004821–1004829), which each re-lay a whole page: the
|
|
23
|
+
task page's lifecycle buttons, Goals' row claim/release, collab, gate, profile connections and the
|
|
24
|
+
government forms.
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.21.
|
|
3
|
+
"version": "1.21.175",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.21.
|
|
9
|
+
"version": "1.21.175",
|
|
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.21.
|
|
3
|
+
"version": "1.21.175",
|
|
4
4
|
"description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"main": "src/platform-server.js",
|
package/release-notes.json
CHANGED
|
@@ -10130,5 +10130,11 @@
|
|
|
10130
10130
|
"id": "1004819",
|
|
10131
10131
|
"text": "Every version now has an artist review goal, holding all copywriting and Artist Studio work, with two standing checks: every page reviewed by an artist before the version closes, and every page simple to read and use. New page"
|
|
10132
10132
|
}
|
|
10133
|
+
],
|
|
10134
|
+
"1.21.175": [
|
|
10135
|
+
{
|
|
10136
|
+
"id": "1004820",
|
|
10137
|
+
"text": "Actions in the hall now use the city's ask card: a question, then one big button per answer that says what it does. Home's inbox (join invites and requests, the nod, removals, stale work) and the Blockers page and Board Room v"
|
|
10138
|
+
}
|
|
10133
10139
|
]
|
|
10134
10140
|
}
|
package/src/module-api.js
CHANGED
|
@@ -75,7 +75,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
|
|
|
75
75
|
// MAJOR (see allowBoxScope below): passes the request through untouched.
|
|
76
76
|
function deprecatedNoopMiddleware(_req, _res, next) { next(); }
|
|
77
77
|
|
|
78
|
-
const CORE_VERSION = '1.21.
|
|
78
|
+
const CORE_VERSION = '1.21.175'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
79
79
|
|
|
80
80
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
81
81
|
// Usage: const log = api.logger('discord'); log.info('mounted');
|
package/tests/blockers_hall.mjs
CHANGED
|
@@ -54,7 +54,9 @@ test('goal-inbox.js renders blocker rows through the SHARED lib, not a re-implem
|
|
|
54
54
|
});
|
|
55
55
|
|
|
56
56
|
test('the blocker row carries .ginbox__item, so the card\'s count-pill and visibility include it', () => {
|
|
57
|
-
|
|
57
|
+
// task 1004820: the row is the city's ask card, drawn by OTBAsk with the item class
|
|
58
|
+
assert.match(GOAL_INBOX_SRC, /function blockerRowHtml[\s\S]*?OTBAsk\.html\(\{[\s\S]*?cls: 'ginbox__item'/);
|
|
59
|
+
assert.match(GOAL_INBOX_SRC, /function blockerRowHtml[\s\S]*?label: 'Resolve it'/, 'the home blocker row is actionable');
|
|
58
60
|
});
|
|
59
61
|
|
|
60
62
|
test('the mount() boot sequence actually calls loadBlockers(), in its place in the order', () => {
|
|
@@ -16,6 +16,7 @@ const require = createRequire(import.meta.url);
|
|
|
16
16
|
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
17
17
|
const lib = require(path.join(ROOT, 'modules', 'ui-design', 'kit', 'lib.js'));
|
|
18
18
|
const GOAL_INBOX = fs.readFileSync(path.join(ROOT, 'modules', 'hall-ui', 'public', 'goal-inbox.js'), 'utf8');
|
|
19
|
+
const HALL_ASK = fs.readFileSync(path.join(ROOT, 'modules', 'hall-ui', 'public', 'hall-ask.js'), 'utf8');
|
|
19
20
|
|
|
20
21
|
let browser = null;
|
|
21
22
|
try { browser = await lib.launchBrowser(); } catch (e) { if (!(e instanceof lib.NoBrowserError)) throw e; }
|
|
@@ -48,6 +49,7 @@ async function bootInbox() {
|
|
|
48
49
|
const page = await ctx.newPage();
|
|
49
50
|
await page.setContent(PAGE);
|
|
50
51
|
await page.addScriptTag({ content: STUBS });
|
|
52
|
+
await page.addScriptTag({ content: HALL_ASK }); // task 1004820: the rows are OTBAsk cards
|
|
51
53
|
await page.addScriptTag({ content: GOAL_INBOX });
|
|
52
54
|
await page.evaluate(() => window.__widget.mount(document.getElementById('attention-scroll')));
|
|
53
55
|
await page.waitForFunction(() => document.querySelectorAll('.attn-card').length === 2);
|
package/tests/rot_inbox.mjs
CHANGED
|
@@ -593,14 +593,14 @@ test('the slice lands in the EXISTING attention card — never a new Home card',
|
|
|
593
593
|
});
|
|
594
594
|
|
|
595
595
|
test('rot rows carry .ginbox__item, so the card\'s count-pill and visibility include them', () => {
|
|
596
|
-
assert.match(GOAL_INBOX_SRC, /function rotRowHtml[\s\S]*?
|
|
596
|
+
assert.match(GOAL_INBOX_SRC, /function rotRowHtml[\s\S]*?cls: 'ginbox__item'/,
|
|
597
597
|
'a rot row that does not carry the shared item class would be invisible to OTBAttention.refresh()');
|
|
598
598
|
});
|
|
599
599
|
|
|
600
600
|
test('the client renders SERVER-declared verbs rather than a hardcoded button list', () => {
|
|
601
601
|
assert.match(GOAL_INBOX_SRC, /\(Array\.isArray\(r\.verbs\) \? r\.verbs : \[\]\)\.map/,
|
|
602
602
|
'the buttons must come from the row\'s verbs array — a hardcoded list is a second copy of the tier→verb mapping');
|
|
603
|
-
assert.match(GOAL_INBOX_SRC, /data-rot-path
|
|
603
|
+
assert.match(GOAL_INBOX_SRC, /'data-rot-path':/, 'each button carries the server-declared path');
|
|
604
604
|
});
|
|
605
605
|
|
|
606
606
|
test('row builders emit the CSS classes style.css actually defines, not ginbox__main/ginbox__acts (task 1003284)', () => {
|
|
@@ -610,10 +610,10 @@ test('row builders emit the CSS classes style.css actually defines, not ginbox__
|
|
|
610
610
|
'.ginbox__main is undefined in style.css — with it the row title and sub-line run together inline instead of stacking');
|
|
611
611
|
assert.doesNotMatch(GOAL_INBOX_SRC, /ginbox__acts\b/,
|
|
612
612
|
'.ginbox__acts is undefined in style.css — with it the action button loses its flex sizing');
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
613
|
+
// task 1004820: the nod and rot rows are the city's ask card, whose classes hall-ask.css defines
|
|
614
|
+
for (const fn of ['nodRowHtml', 'rotRowHtml']) {
|
|
615
|
+
assert.match(GOAL_INBOX_SRC, new RegExp(`function ${fn}[\\s\\S]*?OTBAsk\\.html\\(`), `${fn} draws the ask card`);
|
|
616
|
+
}
|
|
617
617
|
});
|
|
618
618
|
|
|
619
619
|
test('the nod, removal and rot lists use the defined .ginbox list class, not ginbox__list (task 1003982)', () => {
|
|
@@ -635,6 +635,9 @@ test('rotRowHtml escapes the row href like every sibling field (task 1003631)',
|
|
|
635
635
|
const start = GOAL_INBOX_SRC.indexOf('function rotRowHtml');
|
|
636
636
|
const body = GOAL_INBOX_SRC.slice(start, GOAL_INBOX_SRC.indexOf('\n }\n', start));
|
|
637
637
|
assert.ok(start > 0, 'rotRowHtml exists');
|
|
638
|
-
|
|
638
|
+
// task 1004820: the href is handed to OTBAsk, which escapes every attribute
|
|
639
|
+
assert.match(body, /qHref: href/, 'href is handed to OTBAsk');
|
|
640
|
+
const ask = require('../modules/hall-ui/public/hall-ask.js');
|
|
641
|
+
assert.match(ask.html({ q: 'x', qHref: '/t?a="<b>' }), /href="\/t\?a="<b>"/, 'OTBAsk escapes the href');
|
|
639
642
|
assert.doesNotMatch(body, /href="\$\{href\}"/, 'no raw href interpolation');
|
|
640
643
|
});
|