@bongos/core 1.19.136 → 1.19.138

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.136",
6
- "core_contract": "1.19.136",
7
- "source_commit": "e8baa6b4bb7636ec78d0d37a48fafb861e716dad",
5
+ "core_version": "1.19.138",
6
+ "core_contract": "1.19.138",
7
+ "source_commit": "c881ff7b166e960c529748049090f53ad17276c8",
8
8
  "source_ref": "HEAD",
9
- "built_at": "2026-08-15T14:17:27.560Z",
9
+ "built_at": "2026-08-15T14:53:14.334Z",
10
10
  "redaction": {
11
11
  "model": "docs-redacted+functional-verbatim",
12
12
  "docs_redacted": 303,
@@ -17,7 +17,7 @@
17
17
  "gate": "passed"
18
18
  },
19
19
  "file_count": 1574,
20
- "tree_sha256": "c4c465a8bb9c113e17dd02666d74907f5d4057d06743e14d73bcc57ff7482290",
20
+ "tree_sha256": "09b573285811157440bc46ef823f8ae2adf4735d9a0d559e656a7a68793a0bdf",
21
21
  "files": [
22
22
  {
23
23
  "path": ".claude/skills/blocker-review/SKILL.md",
@@ -3882,7 +3882,7 @@
3882
3882
  {
3883
3883
  "path": "modules/provisioning/routes/provisioning.js",
3884
3884
  "mode": "0000644",
3885
- "sha256": "eddf451d5ee5085563af258b5c605c445776c9e226587341f9b4b8b405492240"
3885
+ "sha256": "903a3324337f8c1f123f81ca176550df0afbdeeea1f18254d41489dc3c4fed5d"
3886
3886
  },
3887
3887
  {
3888
3888
  "path": "modules/provisioning/tests/liveness.mjs",
@@ -4147,7 +4147,7 @@
4147
4147
  {
4148
4148
  "path": "modules/status-ui/public/explore.html",
4149
4149
  "mode": "0000644",
4150
- "sha256": "3406def09eaca3f13eaf4dd19bf5e23c12de75d0929a575a1d742f7db430f765"
4150
+ "sha256": "23348448b4b0912ecf6b4cd8bfc34737117e901c0efcb2d4c42c6bc8bf80e05d"
4151
4151
  },
4152
4152
  {
4153
4153
  "path": "modules/status-ui/public/explore.js",
@@ -4177,12 +4177,12 @@
4177
4177
  {
4178
4178
  "path": "package-lock.json",
4179
4179
  "mode": "0000644",
4180
- "sha256": "8f0f435bc22d3f90b635703d6255ab5707be608c2263b7d62d2a22f84b239401"
4180
+ "sha256": "b3bd34c7f961631c76f810499e202ecf7ff7b28beb3933da63fd89be5b684e6b"
4181
4181
  },
4182
4182
  {
4183
4183
  "path": "package.json",
4184
4184
  "mode": "0000644",
4185
- "sha256": "f67d85ba93fc5babadfce8e44653c771fc0ac07471c0f5ffdcb0b13b0fab244c"
4185
+ "sha256": "470274822238a12b1ad33021c5c9fc233f69beefdb30730fc7208257e01a11ef"
4186
4186
  },
4187
4187
  {
4188
4188
  "path": "public-docs/index.html",
@@ -4437,7 +4437,7 @@
4437
4437
  {
4438
4438
  "path": "public-landing/projects.html",
4439
4439
  "mode": "0000644",
4440
- "sha256": "ac866c928701c41ac7f055f8807590a3db71eb2538502a54a6fca9ac1d79868d"
4440
+ "sha256": "060cfd1249c09576e634c7c84c8470207cf55b93cb0719cc89821c8c59aa2a17"
4441
4441
  },
4442
4442
  {
4443
4443
  "path": "public-landing/world/assets/clouds/cloud-island-large.png",
@@ -5767,7 +5767,7 @@
5767
5767
  {
5768
5768
  "path": "src/module-api.js",
5769
5769
  "mode": "0000644",
5770
- "sha256": "096a5ae6bd847f8cfff0cb8e12ebeae0c99f3116f0420babdaea9e683a2b9fd3"
5770
+ "sha256": "b5bbd063bab04b41b5fa8769f2c8de1e0919c28be09bcdf45345ff9440558205"
5771
5771
  },
5772
5772
  {
5773
5773
  "path": "src/module-loader/catalog.js",
@@ -6367,7 +6367,7 @@
6367
6367
  {
6368
6368
  "path": "tests/design_tokens_sync.mjs",
6369
6369
  "mode": "0000644",
6370
- "sha256": "6d1a9dfba7e6ef7606c68abc9df3fb6e479f1a2939b83ad342f907b338f17f2c"
6370
+ "sha256": "9dcbd0bc8f34f98ec0b0ff63a629780928c9d60199f3d961733e03ab6a7bb4fa"
6371
6371
  },
6372
6372
  {
6373
6373
  "path": "tests/dev_lib.mjs",
@@ -7352,7 +7352,7 @@
7352
7352
  {
7353
7353
  "path": "tests/public_landing_projects.mjs",
7354
7354
  "mode": "0000644",
7355
- "sha256": "7f2fe0290fc0a429b54ca53d449453e9009a57e40bb8003b2718beef33be2309"
7355
+ "sha256": "d0907a08d6b932d25df7b143e82c94d64a15eab66a7bd1df86ba85b1729661b7"
7356
7356
  },
7357
7357
  {
7358
7358
  "path": "tests/public_mirror_export.mjs",
@@ -91,11 +91,22 @@ function esc(s) {
91
91
  ));
92
92
  }
93
93
 
94
- // Cloud Bongos brand styling for the standalone onboarding pages — sunrise palette +
95
- // Baloo 2 / Quicksand (brand/cloud-bongos/tokens.json). Light + dark aware; no external
94
+ // Accent pair resolved from the instance's own branding — the pack is the palette
95
+ // authority (task 1002810); the literal fallbacks are the neutral pack's values, so
96
+ // a branding validation error still paints the current family, never a stale one.
97
+ const ACCENT = (() => {
98
+ try {
99
+ const c = api.branding().theme?.ui?.colors || {};
100
+ return { sun: c.accent || '#ce4806', sun600: c.accentDeep || '#9e3406' };
101
+ } catch { return { sun: '#ce4806', sun600: '#9e3406' }; }
102
+ })();
103
+
104
+ // Brand styling for the standalone onboarding pages — sunrise palette + Baloo 2 /
105
+ // Quicksand (accents from the branding pack, config/branding.neutral.json resolved
106
+ // under the instance's own config/branding.json). Light + dark aware; no external
96
107
  // dependency beyond an optional Google-Fonts link (system fallback if it doesn't load).
97
108
  const PAGE_STYLE = `
98
- :root{color-scheme:light dark;--sun:#f97316;--sun600:#ea580c;--coral:#fb7185;--sky:#38bdf8;--sky600:#0284c7;--ok:#16a34a;--warn:#f59e0b;--ink:#2a1f17;--inkSoft:#6b5d52;--card:#fffdfa;--line:#f0e2cf;--bg1:#fde8c8;--bg2:#fff4e6;--bg3:#fffdfa}
109
+ :root{color-scheme:light dark;--sun:${ACCENT.sun};--sun600:${ACCENT.sun600};--coral:#fb7185;--sky:#38bdf8;--sky600:#0284c7;--ok:#16a34a;--warn:#f59e0b;--ink:#2a1f17;--inkSoft:#6b5d52;--card:#fffdfa;--line:#f0e2cf;--bg1:#fde8c8;--bg2:#fff4e6;--bg3:#fffdfa}
99
110
  @media (prefers-color-scheme:dark){:root{--ink:#f5efe6;--inkSoft:#cbbdad;--card:#241b13;--line:#3a2c1e;--bg1:#2a1d10;--bg2:#1b130b;--bg3:#130d07}}
100
111
  *{box-sizing:border-box}html,body{height:100%}
101
112
  body{margin:0;font-family:"Quicksand",system-ui,-apple-system,"Segoe UI",sans-serif;color:var(--ink);background:linear-gradient(180deg,var(--bg1) 0%,var(--bg2) 45%,var(--bg3) 100%);background-attachment:fixed;display:flex;align-items:center;justify-content:center;padding:1.5rem;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
@@ -8,8 +8,8 @@
8
8
  /* Self-contained so the showcase renders correctly whether or not the host
9
9
  injects theme tokens. Warm Cloud Bongos defaults; overridable by the pack. */
10
10
  :root {
11
- --bg: #fff7ed; --card: #ffffff; --ink: #2a1f17; --ink-soft: #6b5d52;
12
- --rule: #fed7aa; --accent: #ea580c;
11
+ --bg: #f9d9a8; --card: #fffaf2; --ink: #2b170e; --ink-soft: #6d4a33;
12
+ --rule: #e8a463; --accent: #ce4806;
13
13
  }
14
14
  * { box-sizing: border-box; }
15
15
  body {
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@bongos/core",
3
- "version": "1.19.136",
3
+ "version": "1.19.138",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@bongos/core",
9
- "version": "1.19.136",
9
+ "version": "1.19.138",
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.136",
3
+ "version": "1.19.138",
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",
@@ -2668,7 +2668,7 @@ h1[tabindex="-1"]:focus{outline:none;}
2668
2668
  : '<li data-onboard-step="github-repo"><b>Your empty repo is ready</b><p>We created ' + repoLabel + ' on GitHub for you — public (projects here are open by design), empty, and waiting. The scaffold lands there when the build runs; nothing for you to do here.</p></li>';
2669
2669
  }
2670
2670
  var ghNewUrl = githubNewRepoUrl(state.owner, state.repo);
2671
- return '<li' + (landed ? ' class="sdone"' : '') + ' data-onboard-step="github-repo"><b>Create the empty GitHub repo</b><p>Do this first — the build needs the repo to exist. Click below (GitHub opens with the name already filled in), press <strong>Create repository</strong>, and leave it completely empty. GitHub will ask public or private — your choice; both work here, and we never change it. Seeing “repository not found” above? That just means the repo isn’t created yet — make it here.</p>' +
2671
+ return '<li' + (landed ? ' class="sdone"' : '') + ' data-onboard-step="github-repo"><b>Create the empty GitHub repo</b><p>Do this first — the build needs the repo to exist. Click below (GitHub opens with the owner and name already filled in), press <strong>Create repository</strong>, and leave it completely empty. It must land at exactly ' + repoLabel + ' — leave GitHub’s Owner box as prefilled (your personal account), because the build watches that exact address; a repo created under a different owner (an organization, say) is never found. GitHub will ask public or private — your choice; both work here, and we never change it. Seeing “repository not found” above? That just means the repo isn’t created yet — make it here.</p>' +
2672
2672
  '<a class="ghbtn" href="' + esc(ghNewUrl) + '" target="_blank" rel="noopener">' + GH_ICON + 'Create ' + repoLabel + ' on GitHub</a></li>';
2673
2673
  }
2674
2674
 
package/src/module-api.js CHANGED
@@ -699,8 +699,12 @@ const { validateOrRespond, LIMITS, parseId, asyncHandler, corsPublicGet, parsePa
699
699
  // landed since 1.19.134 with no explicit bump. run 31863235867. (task 1002620)
700
700
  // 1.19.136 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
701
701
  // landed since 1.19.135 with no explicit bump. run 31889474899. (task 1002620)
702
+ // 1.19.137 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
703
+ // landed since 1.19.136 with no explicit bump. run 31890033301. (task 1002620)
704
+ // 1.19.138 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
705
+ // landed since 1.19.137 with no explicit bump. run 31891128524. (task 1002620)
702
706
  // ---------------------------------------------------------------------------
703
- const CORE_VERSION = '1.19.136'; // CI auto-patch carrier (ADR 0161); see changelog above
707
+ const CORE_VERSION = '1.19.138'; // CI auto-patch carrier (ADR 0161); see changelog above
704
708
 
705
709
  // A namespaced logger so a module's log lines are attributable + consistent.
706
710
  // Usage: const log = api.logger('dev-box'); log.info('mounted');
@@ -77,3 +77,71 @@ test('the claude-design adapter falls back to the pack accent, never a brand lit
77
77
  `hardcoded colour ${hex} in the claude-design adapter — resolve it from the tokens instead`);
78
78
  }
79
79
  });
80
+
81
+ // ---- page-local palettes stay aligned with the pack (task 1002810) ---------
82
+ //
83
+ // The same drift class one layer up: a page (or served-HTML route) declaring its
84
+ // own colour values silently keeps whatever palette it was born with when the
85
+ // pack moves. tests/hall_audit.mjs §8 already bans hall pages from declaring
86
+ // pack vars at all; these cover the two survivors outside the hall — the
87
+ // status-ui explore page and the provisioning onboarding pages.
88
+
89
+ const RETIRED_ACCENT_FAMILY = ['ea580c', 'c2410c', 'f97316', 'fff7ed', 'fed7aa'];
90
+
91
+ function walk(dir, exts, out = []) {
92
+ for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
93
+ if (e.name === 'node_modules' || e.name.startsWith('.')) continue;
94
+ const p = path.join(dir, e.name);
95
+ if (e.isDirectory()) walk(p, exts, out);
96
+ else if (exts.includes(path.extname(e.name))) out.push(p);
97
+ }
98
+ return out;
99
+ }
100
+
101
+ test('the retired pre-1002749 accent family appears nowhere in served UI code', () => {
102
+ const offenders = [];
103
+ for (const root of ['modules', 'src']) {
104
+ for (const f of walk(path.join(REPO_ROOT, root), ['.html', '.css', '.js'])) {
105
+ const text = fs.readFileSync(f, 'utf8').toLowerCase();
106
+ for (const hex of RETIRED_ACCENT_FAMILY) {
107
+ if (text.includes(`#${hex}`)) offenders.push(`${path.relative(REPO_ROOT, f)}: #${hex}`);
108
+ }
109
+ }
110
+ }
111
+ assert.deepEqual(offenders, [],
112
+ 'a page carrying a retired accent hex is a private palette fork — align it with the pack (task 1002810)');
113
+ });
114
+
115
+ test('the explore page mirrors the pack, var for var', () => {
116
+ const html = fs.readFileSync(path.join(REPO_ROOT, 'modules/status-ui/public/explore.html'), 'utf8');
117
+ const root = html.match(/:root\s*\{([\s\S]*?)\}/);
118
+ assert.ok(root, 'explore.html declares a light :root block');
119
+ const colors = pack.theme.ui.colors;
120
+ const MIRROR = {
121
+ '--bg': colors.bg, '--card': colors.bgCard, '--ink': colors.ink,
122
+ '--ink-soft': colors.inkSoft, '--rule': colors.rule, '--accent': colors.accent,
123
+ };
124
+ for (const [cssVar, packVal] of Object.entries(MIRROR)) {
125
+ const m = root[1].match(new RegExp(`${cssVar}\\s*:\\s*(#[0-9a-fA-F]{6})`));
126
+ assert.ok(m, `explore.html defines ${cssVar}`);
127
+ assert.equal(m[1].toLowerCase(), String(packVal).toLowerCase(),
128
+ `explore.html ${cssVar} must equal the pack value — the injected themeMarkup paints exactly this, ` +
129
+ 'so a divergent fallback renders a different page wherever injection is absent');
130
+ }
131
+ });
132
+
133
+ test('the provisioning onboarding pages resolve their accent pair from branding', () => {
134
+ const source = fs.readFileSync(
135
+ path.join(REPO_ROOT, 'modules/provisioning/routes/provisioning.js'), 'utf8');
136
+ assert.match(source, /--sun:\$\{/, '--sun interpolates a resolved value, never a literal');
137
+ assert.match(source, /--sun600:\$\{/, '--sun600 interpolates a resolved value, never a literal');
138
+ const block = source.match(/const ACCENT =[\s\S]*?\}\)\(\);/);
139
+ assert.ok(block, 'one resolved ACCENT pair (the FALLBACK_ACCENT idiom from the claude-design adapter)');
140
+ assert.match(block[0], /branding\(\)/, 'the pair resolves from the instance branding');
141
+ const allowed = new Set([pack.theme.ui.colors.accent, pack.theme.ui.colors.accentDeep]
142
+ .map((h) => String(h).toLowerCase()));
143
+ for (const hex of block[0].match(/#[0-9a-fA-F]{6}\b/g) || []) {
144
+ assert.ok(allowed.has(hex.toLowerCase()),
145
+ `ACCENT fallback ${hex} must be the pack accent/accentDeep, not a palette of its own`);
146
+ }
147
+ });
@@ -117,6 +117,21 @@ test('the empty state points a new owner at the wizard view — never at a hall'
117
117
  assert.doesNotMatch(body, /Enter the Hall/i);
118
118
  });
119
119
 
120
+ test('the manual-repo step states placement and visibility — the owner never has to ask', async () => {
121
+ // QA walk F7 (task 1002702 → 1002721, owner firsthand): the "Create the empty
122
+ // GitHub repo" step never said WHERE the repo lands, and the owner had to ask
123
+ // "is there somewhere specific I should set it up?" mid-walk. The step must
124
+ // say the repo belongs at the exact prefilled owner/name (changing GitHub's
125
+ // Owner dropdown strands the build watching the wrong address) and must state
126
+ // the visibility choice up front, before GitHub's own radio is the first
127
+ // mention.
128
+ const { body } = await request('/projects', 'game.test.local');
129
+ assert.match(body, /Owner box/, 'the step must name GitHub’s Owner box and say to leave it as prefilled');
130
+ assert.match(body, /exact address|exactly[^<]*repoLabel|land at exactly/,
131
+ 'the step must say the build watches the exact owner/name');
132
+ assert.match(body, /public or private/i, 'visibility must be stated in our copy, not first seen on GitHub');
133
+ });
134
+
120
135
  test('teardown copy states what the runner actually does, per hosting shape (F17)', async () => {
121
136
  const { body } = await request('/projects', 'game.test.local');
122
137
  // the DECIDED policy: shared shapes keep the database; a dedicated machine