@bongos/core 1.19.104 → 1.19.106
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 +10 -10
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/public-landing/projects.html +25 -17
- package/src/module-api.js +5 -1
- package/tests/projects_hub.mjs +88 -0
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.106",
|
|
6
|
+
"core_contract": "1.19.106",
|
|
7
|
+
"source_commit": "9c4d81635ba2c3b6781454fef02a2b4fd03c313a",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-
|
|
9
|
+
"built_at": "2026-08-14T01:02:38.447Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 301,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 1558,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "8dc050d8d7110c73665132a52cad7e280ab1b8db7053b35778cd87c03a4d9b6e",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -4147,12 +4147,12 @@
|
|
|
4147
4147
|
{
|
|
4148
4148
|
"path": "package-lock.json",
|
|
4149
4149
|
"mode": "0000644",
|
|
4150
|
-
"sha256": "
|
|
4150
|
+
"sha256": "5ac251e031cc6f47a48545e288edb4c894b5832a1a27f80c4ff39abf23f17517"
|
|
4151
4151
|
},
|
|
4152
4152
|
{
|
|
4153
4153
|
"path": "package.json",
|
|
4154
4154
|
"mode": "0000644",
|
|
4155
|
-
"sha256": "
|
|
4155
|
+
"sha256": "ecc9e5581a436fcf4bafb8d8d9d64f688884d0344f7c484e5cfeadace6f4a198"
|
|
4156
4156
|
},
|
|
4157
4157
|
{
|
|
4158
4158
|
"path": "public-docs/index.html",
|
|
@@ -4412,7 +4412,7 @@
|
|
|
4412
4412
|
{
|
|
4413
4413
|
"path": "public-landing/projects.html",
|
|
4414
4414
|
"mode": "0000644",
|
|
4415
|
-
"sha256": "
|
|
4415
|
+
"sha256": "e9fd91527dd347041b35701f67fe4b245e99ec0cbe015a98bbae24cb9fcfea52"
|
|
4416
4416
|
},
|
|
4417
4417
|
{
|
|
4418
4418
|
"path": "public-landing/world/assets/clouds/cloud-island-large.png",
|
|
@@ -5727,7 +5727,7 @@
|
|
|
5727
5727
|
{
|
|
5728
5728
|
"path": "src/module-api.js",
|
|
5729
5729
|
"mode": "0000644",
|
|
5730
|
-
"sha256": "
|
|
5730
|
+
"sha256": "20c85ad2a6dc6be87060b034fb9aaa10712463f9f12164d836588f8a28cf3caf"
|
|
5731
5731
|
},
|
|
5732
5732
|
{
|
|
5733
5733
|
"path": "src/module-loader/catalog.js",
|
|
@@ -7252,7 +7252,7 @@
|
|
|
7252
7252
|
{
|
|
7253
7253
|
"path": "tests/projects_hub.mjs",
|
|
7254
7254
|
"mode": "0000644",
|
|
7255
|
-
"sha256": "
|
|
7255
|
+
"sha256": "1671466fb3301b1b549835ff7e7466a1374079a470f58773cdeddbe81ba3b478"
|
|
7256
7256
|
},
|
|
7257
7257
|
{
|
|
7258
7258
|
"path": "tests/provision.mjs",
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.106",
|
|
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.106",
|
|
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.106",
|
|
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",
|
|
@@ -159,22 +159,6 @@ try{var _m=localStorage.getItem('cb-color-mode');if(_m==='light'||_m==='dark')do
|
|
|
159
159
|
</div>
|
|
160
160
|
<div class="hintbar"><span><kbd>click a project</kbd> open it</span></div>
|
|
161
161
|
</div>
|
|
162
|
-
|
|
163
|
-
<!-- The project card. An OVERLAY inside the map, not a fourth view: opening
|
|
164
|
-
a project must not cost you the sky you were reading (direction §9).
|
|
165
|
-
Real markup, never JS-built (C7) — the same reason every other view
|
|
166
|
-
ships as markup — so its copy is in the document and its ids are stable.
|
|
167
|
-
Filled by openCard(); it carries no project identity of its own. -->
|
|
168
|
-
<div class="cardScrim" id="cardScrim" hidden>
|
|
169
|
-
<div class="projCard" id="projCard" role="dialog" aria-modal="true" aria-labelledby="cardName">
|
|
170
|
-
<button type="button" class="cardX" id="cardClose" aria-label="Close">✕</button>
|
|
171
|
-
<span class="cardDot" id="cardDot"></span>
|
|
172
|
-
<h3 id="cardName"></h3>
|
|
173
|
-
<p class="cardTag" id="cardTag"></p>
|
|
174
|
-
<p class="cardRel" id="cardRel" hidden></p>
|
|
175
|
-
<div class="cardActions" id="cardActions"></div>
|
|
176
|
-
</div>
|
|
177
|
-
</div>
|
|
178
162
|
</div>
|
|
179
163
|
|
|
180
164
|
<div class="wrap viewWrap" id="sub-table-body" hidden>
|
|
@@ -201,13 +185,37 @@ try{var _m=localStorage.getItem('cb-color-mode');if(_m==='light'||_m==='dark')do
|
|
|
201
185
|
<td class="right num" id="selfBuilders">—</td>
|
|
202
186
|
<td class="colTags" id="selfTags">—</td>
|
|
203
187
|
<td class="right colStatus"><span class="chip calm"><span class="cdot"></span>—</span></td>
|
|
204
|
-
<td class="colGo"><a class="btn small ghost" href="
|
|
188
|
+
<td class="colGo"><a class="btn small ghost" href="/">Open →</a></td>
|
|
205
189
|
</tr>
|
|
206
190
|
<!--apex-only:end-->
|
|
207
191
|
</tbody>
|
|
208
192
|
</table>
|
|
209
193
|
<p class="finePrint" style="text-align:center">Click a column to sort.</p>
|
|
210
194
|
</div>
|
|
195
|
+
|
|
196
|
+
<!-- The project card. An OVERLAY inside the map, not a fourth view: opening
|
|
197
|
+
a project must not cost you the sky you were reading (direction §9).
|
|
198
|
+
Real markup, never JS-built (C7) — the same reason every other view
|
|
199
|
+
ships as markup — so its copy is in the document and its ids are stable.
|
|
200
|
+
Filled by openCard(); it carries no project identity of its own.
|
|
201
|
+
|
|
202
|
+
IT MUST STAY A SIBLING OF THE TWO SUB-VIEWS, never a child of either.
|
|
203
|
+
It shipped inside #sub-sky-body, which the table view sets `hidden` on —
|
|
204
|
+
and `[hidden]{display:none !important}` means every descendant stops
|
|
205
|
+
generating a box, so the card opened at 0x0 in table view and was simply
|
|
206
|
+
never seen. position:fixed does not rescue an element inside a
|
|
207
|
+
display:none ancestor. It worked in sky view, which is the default and
|
|
208
|
+
where it was built, so nothing noticed (task 1002780). -->
|
|
209
|
+
<div class="cardScrim" id="cardScrim" hidden>
|
|
210
|
+
<div class="projCard" id="projCard" role="dialog" aria-modal="true" aria-labelledby="cardName">
|
|
211
|
+
<button type="button" class="cardX" id="cardClose" aria-label="Close">✕</button>
|
|
212
|
+
<span class="cardDot" id="cardDot"></span>
|
|
213
|
+
<h3 id="cardName"></h3>
|
|
214
|
+
<p class="cardTag" id="cardTag"></p>
|
|
215
|
+
<p class="cardRel" id="cardRel" hidden></p>
|
|
216
|
+
<div class="cardActions" id="cardActions"></div>
|
|
217
|
+
</div>
|
|
218
|
+
</div>
|
|
211
219
|
</section>
|
|
212
220
|
|
|
213
221
|
<!-- ══════════════════ VIEW · YOUR PROJECTS ════════════════════════════════ -->
|
package/src/module-api.js
CHANGED
|
@@ -635,8 +635,12 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
|
|
|
635
635
|
// landed since 1.19.102 with no explicit bump. run 31754659965. (task 1002620)
|
|
636
636
|
// 1.19.104 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
637
637
|
// landed since 1.19.103 with no explicit bump. run 31756625919. (task 1002620)
|
|
638
|
+
// 1.19.105 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
639
|
+
// landed since 1.19.104 with no explicit bump. run 31758526405. (task 1002620)
|
|
640
|
+
// 1.19.106 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
641
|
+
// landed since 1.19.105 with no explicit bump. run 31759315328. (task 1002620)
|
|
638
642
|
// ---------------------------------------------------------------------------
|
|
639
|
-
const CORE_VERSION = '1.19.
|
|
643
|
+
const CORE_VERSION = '1.19.106'; // CI auto-patch carrier (ADR 0161); see changelog above
|
|
640
644
|
|
|
641
645
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
642
646
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|
package/tests/projects_hub.mjs
CHANGED
|
@@ -453,3 +453,91 @@ test('the platform answers for itself by the same rule it applies to others', ()
|
|
|
453
453
|
assert.match(SCRIPT, /function loadSelfStats/);
|
|
454
454
|
assert.match(SCRIPT, /-system\$/, 'machine accounts are excluded here too, or the platform inflates itself');
|
|
455
455
|
});
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
/* ── The card must RENDER in both sub-views (task 1002780) ──────────────────
|
|
459
|
+
It shipped nested inside #sub-sky-body. The table view sets `hidden` on that
|
|
460
|
+
container, and [hidden]{display:none !important} stops every descendant
|
|
461
|
+
generating a box — so the card "opened" at 0x0 and was never seen. Every
|
|
462
|
+
property said open; only the geometry disagreed.
|
|
463
|
+
|
|
464
|
+
The first attempt at this fix deleted #sub-sky-body's closing tag, which
|
|
465
|
+
re-parented everything after it and left the bug in place while LOOKING
|
|
466
|
+
fixed — regex-proximity checks passed on the broken file. These tests walk
|
|
467
|
+
the real tag depth instead. ── */
|
|
468
|
+
|
|
469
|
+
function mapSection(html) {
|
|
470
|
+
const open = html.indexOf('<section id="view-map">');
|
|
471
|
+
assert.ok(open !== -1, 'view-map section must exist');
|
|
472
|
+
return html.slice(open, html.indexOf('<section id="view-mine"'));
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
test('the map section closes every div it opens', () => {
|
|
476
|
+
// an unclosed div is invisible to a regex check and to `hidden`-flag
|
|
477
|
+
// assertions alike, and silently re-parents everything after it
|
|
478
|
+
const map = mapSection(HUB);
|
|
479
|
+
const opens = (map.match(/<div\b/g) || []).length;
|
|
480
|
+
const closes = (map.match(/<\/div>/g) || []).length;
|
|
481
|
+
assert.equal(opens, closes, 'unbalanced divs re-parent the nodes that follow');
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
// Walk the real tag structure and return the ids of every element still OPEN
|
|
485
|
+
// where `needle` appears. Depth-tracking, NOT regex proximity: the first
|
|
486
|
+
// version of this test took the next `</div>` as proof the outer div had
|
|
487
|
+
// closed, accepted an inner one, and passed on the still-broken file.
|
|
488
|
+
function openAncestorsAt(html, needle) {
|
|
489
|
+
const at = html.indexOf(needle);
|
|
490
|
+
assert.ok(at !== -1, needle + ' not found');
|
|
491
|
+
const stack = [];
|
|
492
|
+
const tag = /<(\/?)(div|section)\b([^>]*)>/g;
|
|
493
|
+
let m;
|
|
494
|
+
while ((m = tag.exec(html)) !== null && m.index < at) {
|
|
495
|
+
if (m[1] === '/') stack.pop();
|
|
496
|
+
else if (!m[3].trim().endsWith('/')) {
|
|
497
|
+
const id = (m[3].match(/id="([^"]+)"/) || [, null])[1];
|
|
498
|
+
stack.push(id);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
return stack.filter(Boolean);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
test('no container the view router hides may be an ancestor of the card', () => {
|
|
505
|
+
const ancestors = openAncestorsAt(HUB, 'id="cardScrim"');
|
|
506
|
+
for (const hidden of ['sub-sky-body', 'sub-table-body']) {
|
|
507
|
+
assert.ok(!ancestors.includes(hidden),
|
|
508
|
+
'#' + hidden + ' is toggled hidden — the card cannot live inside it. open: ' + ancestors.join(' > '));
|
|
509
|
+
}
|
|
510
|
+
assert.ok(ancestors.includes('view-map'), 'it is still the overlay of the map view');
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
test('the table body is a sibling of the sky wrapper, not nested inside it', () => {
|
|
514
|
+
// the same defect seen from the other side — a missing close tag re-parents
|
|
515
|
+
// the table itself, which is what the first fix attempt actually did
|
|
516
|
+
const ancestors = openAncestorsAt(HUB, 'id="sub-table-body"');
|
|
517
|
+
assert.ok(!ancestors.includes('sub-sky-body'),
|
|
518
|
+
'the table must not sit inside the sky wrapper. open: ' + ancestors.join(' > '));
|
|
519
|
+
});
|
|
520
|
+
|
|
521
|
+
/* ── The self row's Open goes somewhere (task 1002777) ──────────────────────
|
|
522
|
+
Task 1002760's static self row shipped its action cell as href="#" with a
|
|
523
|
+
`data-self-open` hook nobody ever wired. The row-click handler deliberately
|
|
524
|
+
ignores clicks inside an <a> so real links keep their jobs — but this link
|
|
525
|
+
had no job, so the click was swallowed AND went nowhere. ── */
|
|
526
|
+
|
|
527
|
+
test('the self row Open is a real link home, not an unwired hook', () => {
|
|
528
|
+
const selfRow = (HUB.match(/<tr id="selfRow">([\s\S]*?)<\/tr>/) || [, ''])[1];
|
|
529
|
+
assert.match(selfRow, /<a[^>]*href="\/"[^>]*>Open/,
|
|
530
|
+
'the platform project IS this site — its Open navigates to /');
|
|
531
|
+
assert.doesNotMatch(selfRow, /target=/,
|
|
532
|
+
'a new tab for the page you are already on is a bug, not a courtesy');
|
|
533
|
+
assert.doesNotMatch(HUB, /data-self-open/, 'the never-wired hook must not survive');
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
test('no anchor in the table ships a placeholder href', () => {
|
|
537
|
+
// href="#" is the shape of this bug: a dead link wearing button clothes
|
|
538
|
+
const table = (HUB.match(/<table[\s\S]*?<\/table>/) || [''])[0];
|
|
539
|
+
assert.ok(table, 'the table must be findable');
|
|
540
|
+
assert.doesNotMatch(table, /href="#"/, 'no anchor in the table may ship href="#"');
|
|
541
|
+
const generated = (SCRIPT.match(/return '<tr data-generated([\s\S]*?)'<\/tr>';/) || [, ''])[1];
|
|
542
|
+
assert.doesNotMatch(generated, /href="#"/, 'generated rows must not ship placeholders either');
|
|
543
|
+
});
|