@bongos/core 1.19.457 → 1.19.458
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 +40 -30
- package/docs/copy-inventory.md +160 -177
- package/docs/copy-registry.json +445 -606
- package/docs/file-map.md +1 -1
- package/docs/module-api-changelog.md +2 -0
- package/modules/hall-ui/public/gate.css +20 -88
- package/modules/hall-ui/public/gate.html +24 -12
- package/modules/hall-ui/public/gate.js +77 -60
- package/modules/hall-ui/public/gate.states.json +19 -1
- package/modules/hall-ui/public/government.css +96 -154
- package/modules/hall-ui/public/government.html +80 -52
- package/modules/hall-ui/public/government.js +227 -136
- package/modules/hall-ui/public/government.states.json +71 -1
- package/modules/hall-ui/public/harbor.css +9 -120
- package/modules/hall-ui/public/harbor.html +23 -11
- package/modules/hall-ui/public/harbor.js +109 -83
- package/modules/hall-ui/public/harbor.states.json +19 -1
- package/modules/hall-ui/public/oversight.css +296 -0
- package/modules/hall-ui/public/watch.css +56 -170
- package/modules/hall-ui/public/watch.html +48 -37
- package/modules/hall-ui/public/watch.js +363 -298
- package/modules/hall-ui/public/watch.states.json +48 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/module-api.js +1 -1
- package/tests/hall_oversight_world.mjs +118 -0
|
@@ -46,6 +46,52 @@
|
|
|
46
46
|
},
|
|
47
47
|
"out": {
|
|
48
48
|
"auth": false
|
|
49
|
+
},
|
|
50
|
+
"operations": {
|
|
51
|
+
"auth": true,
|
|
52
|
+
"actions": [
|
|
53
|
+
[
|
|
54
|
+
"wait",
|
|
55
|
+
700
|
|
56
|
+
],
|
|
57
|
+
[
|
|
58
|
+
"click",
|
|
59
|
+
"#tab-operations"
|
|
60
|
+
],
|
|
61
|
+
[
|
|
62
|
+
"wait",
|
|
63
|
+
300
|
|
64
|
+
]
|
|
65
|
+
],
|
|
66
|
+
"expect": {
|
|
67
|
+
"visible": [
|
|
68
|
+
"#pane-operations",
|
|
69
|
+
"#sessions-stats"
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"security": {
|
|
74
|
+
"auth": true,
|
|
75
|
+
"actions": [
|
|
76
|
+
[
|
|
77
|
+
"wait",
|
|
78
|
+
700
|
|
79
|
+
],
|
|
80
|
+
[
|
|
81
|
+
"click",
|
|
82
|
+
"#tab-security"
|
|
83
|
+
],
|
|
84
|
+
[
|
|
85
|
+
"wait",
|
|
86
|
+
300
|
|
87
|
+
]
|
|
88
|
+
],
|
|
89
|
+
"expect": {
|
|
90
|
+
"visible": [
|
|
91
|
+
"#pane-security",
|
|
92
|
+
"#watch-scroll"
|
|
93
|
+
]
|
|
94
|
+
}
|
|
49
95
|
}
|
|
50
96
|
},
|
|
51
97
|
"reducedMotion": {
|
|
@@ -56,5 +102,6 @@
|
|
|
56
102
|
600
|
|
57
103
|
]
|
|
58
104
|
]
|
|
59
|
-
}
|
|
105
|
+
},
|
|
106
|
+
"_states": "task 1003469: the three tabs are three states, so the Operations figure bands and the recent-sessions ledger, and the Security panel's four groups, are each measured and not only the People tab the page opens on."
|
|
60
107
|
}
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.458",
|
|
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.458",
|
|
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.458",
|
|
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
|
@@ -33,7 +33,7 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
|
|
|
33
33
|
// there. scripts/gds/bump-version.js still rewrites the literal below; it appends
|
|
34
34
|
// the entry to that file. Look for a version's history there, not here.
|
|
35
35
|
// ---------------------------------------------------------------------------
|
|
36
|
-
const CORE_VERSION = '1.19.
|
|
36
|
+
const CORE_VERSION = '1.19.458'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
37
37
|
|
|
38
38
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
39
39
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// tests/hall_oversight_world.mjs — the oversight family in the chrome world
|
|
2
|
+
// (task 1003469, goal 1000081): government, watch, harbor and gate share one
|
|
3
|
+
// archetype sheet (oversight.css) the way the records share record.css and the
|
|
4
|
+
// reading rooms room.css. These are static pins over the shipped source: the
|
|
5
|
+
// family sheet is linked and spends only the fifteen, every page renders the
|
|
6
|
+
// family's row, Watch has no page-local table, the facts the audit found thrown
|
|
7
|
+
// away (a rank's description, the five recent sessions) are rendered, the
|
|
8
|
+
// coloured bands are gone, the shared modal has no shadow, and the one control
|
|
9
|
+
// the shell does not style (a number input) clears the 24px floor.
|
|
10
|
+
import test from 'node:test';
|
|
11
|
+
import assert from 'node:assert/strict';
|
|
12
|
+
import fs from 'node:fs';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
|
|
16
|
+
const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
17
|
+
const PUB = path.join(ROOT, 'modules', 'hall-ui', 'public');
|
|
18
|
+
const read = (f) => fs.readFileSync(path.join(PUB, f), 'utf8').replace(/\r\n/g, '\n');
|
|
19
|
+
const PAGES = ['government', 'watch', 'harbor', 'gate'];
|
|
20
|
+
|
|
21
|
+
test('every oversight page links the family sheet, before its own', () => {
|
|
22
|
+
for (const p of PAGES) {
|
|
23
|
+
const html = read(`${p}.html`);
|
|
24
|
+
const fam = html.indexOf('/builders/oversight.css');
|
|
25
|
+
const own = html.indexOf(`/builders/${p}.css`);
|
|
26
|
+
assert.ok(fam > 0, `${p}.html links oversight.css`);
|
|
27
|
+
assert.ok(own > fam, `${p}.html links its own sheet after the family's`);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('the family sheet spends only the fifteen: no literal colour', () => {
|
|
32
|
+
const css = read('oversight.css');
|
|
33
|
+
const hexes = css.match(/#[0-9a-f]{3,8}\b/gi) || [];
|
|
34
|
+
assert.deepEqual(hexes, [], `oversight.css carries literal colours: ${hexes.join(', ')}`);
|
|
35
|
+
assert.ok(!/rgba?\(/.test(css), 'no rgb() literal either');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test('the row is the family\'s archetype, and every page renders it', () => {
|
|
39
|
+
const css = read('oversight.css');
|
|
40
|
+
for (const cls of ['.ov-row', '.ov-row__title', '.ov-row__sub', '.ov-row__facts', '.ov-row__right',
|
|
41
|
+
'.ov-group__head', '.ov-figs', '.ov-modal', '.ov-form', '.ov-toggle', '.ov-lines', '.ov-prose']) {
|
|
42
|
+
assert.ok(new RegExp(`^${cls.replace(/[.]/g, '\\.')}[\\s,{]`, 'm').test(css), `oversight.css defines ${cls}`);
|
|
43
|
+
}
|
|
44
|
+
for (const p of PAGES) assert.match(read(`${p}.js`), /class="ov-row/, `${p}.js renders .ov-row`);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('Watch has no page-local table: every list is the kit ledger', () => {
|
|
48
|
+
const js = read('watch.js');
|
|
49
|
+
assert.ok(!/renderTable\(/.test(js), 'renderTable is gone');
|
|
50
|
+
assert.ok(!/<table class="watch"/.test(js), 'no <table class="watch"> is emitted');
|
|
51
|
+
assert.ok(!/table\.watch/.test(read('watch.css')), 'watch.css no longer styles table.watch');
|
|
52
|
+
const sites = (js.match(/\bledger\((?:target|body|group|locEl|filesEl|recentEl)/g) || []).length;
|
|
53
|
+
assert.ok(sites >= 9, `the nine lists ride makeLedger (found ${sites} sites)`);
|
|
54
|
+
// A list that pages re-renders its rows on a flip, so its actions are
|
|
55
|
+
// delegated to the section, not attached to a row that will be replaced.
|
|
56
|
+
for (const sel of ['[data-rep-action]', '[data-ovr-action]']) {
|
|
57
|
+
assert.match(js, new RegExp(`delegate\\(target, '${sel.replace(/[[\]]/g, '\\$&')}'`), `${sel} is delegated`);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('Watch renders the five recent sessions it fetches, not only the totals', () => {
|
|
62
|
+
const js = read('watch.js');
|
|
63
|
+
const fn = js.slice(js.indexOf('function renderSessions'), js.indexOf('function loadSessions'));
|
|
64
|
+
assert.match(fn, /data\.sessions/, 'the rows are read');
|
|
65
|
+
assert.match(fn, /sessions-recent/, 'and rendered into their own mount');
|
|
66
|
+
assert.match(read('watch.html'), /id="sessions-recent"/, 'the mount exists in the markup');
|
|
67
|
+
assert.match(js, /limit=5/, 'the request still asks for five');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test('Government renders the rank description the create form collects', () => {
|
|
71
|
+
const js = read('government.js');
|
|
72
|
+
const fn = js.slice(js.indexOf('function renderRanks'), js.indexOf('// ---- render: permission grid'));
|
|
73
|
+
assert.match(fn, /rank\.description/, 'renderRanks reads the description');
|
|
74
|
+
assert.match(fn, /ov-row__sub/, 'and renders it as the row\'s sub line');
|
|
75
|
+
assert.match(read('government.html'), /id="gov-create-desc"/, 'the form still collects it');
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test('Harbor and Gate carry no coloured band: state is a pill', () => {
|
|
79
|
+
for (const p of ['harbor', 'gate']) {
|
|
80
|
+
assert.ok(!/__roof|__seal/.test(read(`${p}.js`)), `${p}.js emits no roof or seal band`);
|
|
81
|
+
assert.ok(!/__roof|__seal/.test(read(`${p}.css`)), `${p}.css has no band rule`);
|
|
82
|
+
assert.match(read(`${p}.js`), /fact-pill fact-pill--/, `${p}.js paints state as a .fact-pill`);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test('the shared confirm modal sits on --z-modal, closed by one hairline and no shadow', () => {
|
|
87
|
+
const css = read('oversight.css');
|
|
88
|
+
const bg = css.slice(css.indexOf('.ov-modal-bg {'), css.indexOf('.ov-modal {'));
|
|
89
|
+
assert.match(bg, /z-index: var\(--z-modal\)/, 'the shell layer, not a guessed number');
|
|
90
|
+
const modal = css.slice(css.indexOf('.ov-modal {'), css.indexOf('.ov-modal .scroll__h'));
|
|
91
|
+
assert.ok(!/box-shadow/.test(modal), 'no shadow under the dialog');
|
|
92
|
+
assert.match(modal, /border: var\(--line\) solid var\(--rule\)/, 'one rule hairline');
|
|
93
|
+
for (const p of ['harbor', 'gate']) {
|
|
94
|
+
assert.match(read(`${p}.js`), /className = 'ov-modal-bg'/, `${p}.js opens the family modal`);
|
|
95
|
+
assert.ok(!/-modal-bg/.test(read(`${p}.css`)), `${p}.css no longer styles a modal of its own`);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test('a number input inside a family field clears the 24px floor', () => {
|
|
100
|
+
const css = read('oversight.css');
|
|
101
|
+
const i = css.indexOf('.ov-field input, .ov-field select, .ov-field textarea {');
|
|
102
|
+
assert.ok(i > 0, 'the field rule exists');
|
|
103
|
+
assert.match(css.slice(i, i + 500), /min-height: 30px/, 'the field restates the shell\'s 30px pill');
|
|
104
|
+
assert.match(read('government.html'), /id="gov-assign-builder" type="number"/, 'the builder id is still a number input');
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
test('the sealed state is a panel with the floor written from the pack, on all four pages', () => {
|
|
108
|
+
for (const p of PAGES) {
|
|
109
|
+
assert.match(read(`${p}.html`), /class="scroll" id="[a-z-]*sealed(-scroll)?" /, `${p}.html seals with a .scroll panel`);
|
|
110
|
+
assert.match(read(`${p}.js`), /rankLabel\('metic'\)/, `${p}.js writes the floor from the pack's rank label`);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
test('the vocabulary wall holds: the family is named oversight on the government surface', () => {
|
|
115
|
+
for (const f of ['government.js', 'government.html', 'government.css', 'oversight.css']) {
|
|
116
|
+
assert.ok(!/governance/i.test(read(f)), `${f} does not say the pre-ADR-0174 word`);
|
|
117
|
+
}
|
|
118
|
+
});
|