@bongos/core 1.19.104 → 1.19.105

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 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.104",
6
- "core_contract": "1.19.104",
7
- "source_commit": "3c2a0481a031c30a0afdd9294b2510373ffe960f",
5
+ "core_version": "1.19.105",
6
+ "core_contract": "1.19.105",
7
+ "source_commit": "e17befb90a1b0010369b049bfe92c597f46feaa1",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-08-14T00:14:10.093Z",
9
+ "built_at": "2026-08-14T00:47:52.457Z",
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": "8257863293fa7660b41b1617777db22fadd851349106de278c846a482dd31a66",
20
+ "tree_sha256": "0bd2c06a8df30c32d74aae5a437dc8e71707e2201560e7275d066136aa1f0a63",
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": "ef0ed51dd00b72093c6deac7c061dc0fddf88b0135d2d1981c00d37cdb7a9345"
4150
+ "sha256": "1180a81b8034f5e25bb1da6370b91e69575b653dc6f459e16d20dc6764c38e71"
4151
4151
  },
4152
4152
  {
4153
4153
  "path": "package.json",
4154
4154
  "mode": "0000644",
4155
- "sha256": "64f2fc25cfe4707562314bef85b1a22c3b3027e6b43d74644fd37fbc61daa539"
4155
+ "sha256": "ebcbf2f1c4b4479c82525349cb2f2aacf659c80eab6876112947bff44600b718"
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": "f70211d0d2bfe21fa7000ab82d0adcaa97df1f28763e366965da2b92847b31b6"
4415
+ "sha256": "9e6d99f0a54a6189f7295b799c3061c4b23b69569d15e0dd1e1d2e6e8c8671fc"
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": "c8a86a1c119d7da3b4baf912eb2d228f83be18b07fbce6c104858a00027efbda"
5730
+ "sha256": "452383073e87173fa0a4f56df5a3a126ab888807dd416df4939ba951a0a0cf43"
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": "d8fd9759b99b2136f8b438727b74b15346db7cbd8f0ef8b67aec3049f059df2b"
7255
+ "sha256": "d57dbc4d5b06d2302211d73d1d41c7edf025b38fca433b30df37cf8afc898da9"
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.104",
3
+ "version": "1.19.105",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.104",
9
+ "version": "1.19.105",
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.104",
3
+ "version": "1.19.105",
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>
@@ -208,6 +192,30 @@ try{var _m=localStorage.getItem('cb-color-mode');if(_m==='light'||_m==='dark')do
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,10 @@ 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)
638
640
  // ---------------------------------------------------------------------------
639
- const CORE_VERSION = '1.19.104'; // CI auto-patch carrier (ADR 0161); see changelog above
641
+ const CORE_VERSION = '1.19.105'; // CI auto-patch carrier (ADR 0161); see changelog above
640
642
 
641
643
  // A namespaced logger so a module's log lines are attributable + consistent.
642
644
  // Usage: const log = api.logger('dev-box'); log.info('mounted');
@@ -453,3 +453,67 @@ 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
+ });