@bongos/core 1.19.1014 → 1.19.1015
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 +61 -81
- package/docs/adr/0227-a-task-network-map-is-refused-the-goal-graph-is-the-map.md +4 -1
- package/docs/adr/0331-the-sky-is-the-ideators-home.md +6 -1
- package/docs/copy-inventory.md +139 -110
- package/docs/copy-registry.json +872 -296
- package/docs/module-api-changelog.md +2 -0
- package/modules/hall-ui/public/atlas.html +1 -1
- package/modules/hall-ui/public/blockers.html +1 -1
- package/modules/hall-ui/public/board-room.html +1 -1
- package/modules/hall-ui/public/collab.html +1 -1
- package/modules/hall-ui/public/copy-desk.html +1 -1
- package/modules/hall-ui/public/deploy.html +1 -1
- package/modules/hall-ui/public/diagrams.html +1 -1
- package/modules/hall-ui/public/drachmae.html +1 -1
- package/modules/hall-ui/public/fleet.html +1 -1
- package/modules/hall-ui/public/gate.html +1 -1
- package/modules/hall-ui/public/goal-map.html +125 -52
- package/modules/hall-ui/public/goal-map.states.json +29 -5
- package/modules/hall-ui/public/goals.html +1 -1
- package/modules/hall-ui/public/government.html +1 -1
- package/modules/hall-ui/public/idea.html +1 -1
- package/modules/hall-ui/public/ideas.html +1 -1
- package/modules/hall-ui/public/index.html +1 -1
- package/modules/hall-ui/public/modules.html +1 -1
- package/modules/hall-ui/public/people.html +1 -1
- package/modules/hall-ui/public/primer.html +1 -1
- package/modules/hall-ui/public/profile.html +1 -1
- package/modules/hall-ui/public/project-settings.html +1 -1
- package/modules/hall-ui/public/ranks.html +1 -1
- package/modules/hall-ui/public/roadmap.html +1 -1
- package/modules/hall-ui/public/roster.html +1 -1
- package/modules/hall-ui/public/sessions.html +1 -1
- package/modules/hall-ui/public/settings.html +1 -1
- package/modules/hall-ui/public/shell.js +11 -0
- package/modules/hall-ui/public/sky-data.js +19 -1
- package/modules/hall-ui/public/sky-interaction.js +14 -7
- package/modules/hall-ui/public/sky-layout.js +2 -1
- package/modules/hall-ui/public/sky-tour.js +10 -6
- package/modules/hall-ui/public/studio.html +1 -1
- package/modules/hall-ui/public/task.html +1 -1
- package/modules/hall-ui/public/thinking.css +6 -3
- package/modules/hall-ui/public/thinking.html +16 -10
- package/modules/hall-ui/public/watch.html +1 -1
- package/modules/hall-ui/public/work.html +1 -1
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/bongos/serve-internal.js +4 -0
- package/src/module-api.js +1 -1
- package/tests/goal_map_page.mjs +346 -211
- package/tests/hall_audit.mjs +1 -0
- package/tests/hall_nav.mjs +6 -1
- package/tests/hall_page_gate_map.mjs +3 -2
- package/tests/helpers.mjs +21 -5
- package/tests/nav_permission_atoms.mjs +1 -1
- package/tests/render_check.mjs +6 -4
- package/modules/hall-ui/public/goal-map-lib.js +0 -349
- package/modules/hall-ui/public/goal-map.css +0 -117
- package/modules/hall-ui/public/goal-map.js +0 -232
- package/tests/goal_map_lib.mjs +0 -214
|
@@ -5,10 +5,12 @@
|
|
|
5
5
|
//
|
|
6
6
|
// The prototype's "hover card + shuttle menu", "interaction" and "lenses and
|
|
7
7
|
// toggles" sections, verbatim but for the shared state on `SKY.S`. The one
|
|
8
|
-
// behaviour this part CHANGES on purpose: the
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
8
|
+
// behaviour this part CHANGES on purpose: the lens switcher LEAVES for the
|
|
9
|
+
// other page when the lens asked for is that page's home (part 4, task
|
|
10
|
+
// 1004232) — on /thinking, "the whole project" goes to /goal-map; on
|
|
11
|
+
// /goal-map, "simple" and "your thinking" go to /thinking — instead of
|
|
12
|
+
// switching in place. Every lens survives inside both pages because the tour
|
|
13
|
+
// walks all three. And the "claude layer" pill only appears once part 5's
|
|
12
14
|
// `filed_via` exists on at least one thought; until then it is hidden and
|
|
13
15
|
// every thought shows (the README's "must not ship" row).
|
|
14
16
|
//
|
|
@@ -90,9 +92,14 @@
|
|
|
90
92
|
if (!noFly) { if (l === 'all') SKY.fitAll(); else SKY.fitPresent(); }
|
|
91
93
|
SKY.maybeStart(); SKY.renderRoom(); updateStats(); S.dirty = true;
|
|
92
94
|
}
|
|
93
|
-
|
|
94
|
-
//
|
|
95
|
-
|
|
95
|
+
// The switcher is two doors (part 4, task 1004232): a lens that lives on the
|
|
96
|
+
// OTHER page is reached by going there. /thinking is home to 'simple' and
|
|
97
|
+
// 'mine'; /goal-map is home to 'all'. Inside a page every lens still works
|
|
98
|
+
// (the tour walks all three), so only the button leaves.
|
|
99
|
+
const leave = (p) => location.assign(`${hallBase()}${p}`);
|
|
100
|
+
$('lensSimple').addEventListener('click', () => (S.home === 'all' ? leave('/thinking') : setLens('simple')));
|
|
101
|
+
$('lensMine').addEventListener('click', () => (S.home === 'all' ? leave('/thinking') : setLens('mine')));
|
|
102
|
+
$('lensAll').addEventListener('click', () => (S.home === 'all' ? setLens('all') : leave('/goal-map')));
|
|
96
103
|
$('fitBtn').addEventListener('click', () => (S.lens === 'all' ? SKY.fitAll() : SKY.fitPresent()));
|
|
97
104
|
function togglePill(id, get, set) { $(id).addEventListener('click', () => { set(!get()); $(id).setAttribute('aria-pressed', String(get())); SKY.renderRoom(); updateStats(); S.dirty = true; }); }
|
|
98
105
|
togglePill('recentBtn', () => S.recentOnly, (v) => { S.recentOnly = v; });
|
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
// sky-data.js for the split). The clock draws the sky as it stood on a day —
|
|
7
7
|
// nothing moves position, only what exists changes. Routes are the goal
|
|
8
8
|
// graph's own edges, charted by a shuttle when asked. Explore is the project
|
|
9
|
-
// sky's rule (
|
|
9
|
+
// sky's rule (home at /goal-map since part 4; the tour walks it on /thinking
|
|
10
|
+
// too). The camera is a
|
|
10
11
|
// pan/zoom over world coordinates laid out in sky-data.js.
|
|
11
12
|
|
|
12
13
|
(() => {
|
|
@@ -7,9 +7,12 @@
|
|
|
7
7
|
// prototype's own start-up line. The thirteen steps and their words are the
|
|
8
8
|
// design of record's; the tour opens once per browser (`sky-tour-seen`).
|
|
9
9
|
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
10
|
+
// The tour walks every lens inside whichever page it runs on — steps 7, 8
|
|
11
|
+
// and 10 the project sky's ('all'), steps 1, 11 and 12 the ideator's ('mine'),
|
|
12
|
+
// step 13 'simple' — which is why all three survive in both pages although the
|
|
13
|
+
// switcher leaves for the other page. When it ends it hands back to the page's
|
|
14
|
+
// HOME lens (`S.home`: 'mine' on /thinking, 'all' on /goal-map — part 4, task
|
|
15
|
+
// 1004232), and the boot opens in that lens too.
|
|
13
16
|
|
|
14
17
|
(() => {
|
|
15
18
|
'use strict';
|
|
@@ -43,7 +46,7 @@
|
|
|
43
46
|
function spot(el, add) { if (!add) { S.spotted.forEach((e) => e.classList.remove('spot')); S.spotted = []; } if (el) { el.classList.add('spot'); S.spotted.push(el); } }
|
|
44
47
|
function showStep() { const s = STEPS[S.tourI]; if (!s) return endTour(); spot(null); S.tourSpot = null; s.go(); $('tourN').textContent = `how to read the sky · ${S.tourI + 1} of ${STEPS.length}`; $('tourDots').innerHTML = STEPS.map((_, n) => `<i class="${n === S.tourI ? 'on' : ''}"></i>`).join(''); $('tourH').textContent = s.h; $('tourP').textContent = s.p; $('tourNext').textContent = S.tourI === STEPS.length - 1 ? 'start reading' : 'next'; $('tourBack').hidden = S.tourI === 0; $('tour').hidden = false; S.dirty = true; }
|
|
45
48
|
function startTour() { SKY.pick(null); SKY.toggleRoom(false); SKY.clearCharts(); $('start').hidden = true; S.exploreWas = S.explore.on; S.tourI = 0; showStep(); }
|
|
46
|
-
function endTour() { $('tour').hidden = true; spot(null); S.tourSpot = null; S.tourI = -1; if (S.exploreWas != null) { S.explore.on = S.exploreWas; $('exploreBtn').setAttribute('aria-pressed', String(S.explore.on)); S.exploreWas = null; } store.set('sky-tour-seen', '4'); SKY.setLens(
|
|
49
|
+
function endTour() { $('tour').hidden = true; spot(null); S.tourSpot = null; S.tourI = -1; if (S.exploreWas != null) { S.explore.on = S.exploreWas; $('exploreBtn').setAttribute('aria-pressed', String(S.explore.on)); S.exploreWas = null; } store.set('sky-tour-seen', '4'); SKY.setLens(S.home, true); SKY.clearCharts(); SKY.maybeStart(); S.dirty = true; }
|
|
47
50
|
$('tourNext').addEventListener('click', () => { S.tourI++; showStep(); }); $('tourBack').addEventListener('click', () => { S.tourI = Math.max(0, S.tourI - 1); showStep(); }); $('tourSkip').addEventListener('click', endTour); $('tourBtn').addEventListener('click', startTour);
|
|
48
51
|
|
|
49
52
|
// ---------------------------------------------------------------- the loop
|
|
@@ -68,8 +71,9 @@
|
|
|
68
71
|
// The Full Idea switch needs the template's key to file; without the read there is nothing to file as.
|
|
69
72
|
$('fullToggle').hidden = !S.template;
|
|
70
73
|
S.t0 = performance.now();
|
|
71
|
-
SKY.resize(); SKY.setClock(NOW); SKY.setLens(
|
|
72
|
-
|
|
74
|
+
SKY.resize(); SKY.setClock(NOW); SKY.setLens(S.home, true); SKY.renderPanel(null); $('time').hidden = S.clockHidden;
|
|
75
|
+
// The first frame is the home lens's own fit: the present for your sky, the whole sky for the project's.
|
|
76
|
+
S.cam.k = S.home === 'all' ? SKY.fitRad(S.BANDS[S.BANDS.length - 1].r1 + 100) : SKY.fitRad(S.BANDS[0].r1 + 120);
|
|
73
77
|
document.body.dataset.skyReady = '1';
|
|
74
78
|
requestAnimationFrame(frame);
|
|
75
79
|
if (store.get('sky-tour-seen') !== '4') setTimeout(startTour, 600);
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
|
|
67
67
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
68
68
|
|
|
69
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
69
|
+
<script src="/builders/shell.js?v=2026-09-25-sky4b"></script>
|
|
70
70
|
<script src="/builders/palette.js" defer></script>
|
|
71
71
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
72
72
|
<!-- The kit, for its ONE renderer: the full-size ship-time visual figure
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
|
|
58
58
|
<!-- The app shell (sidebar + top bar + footer). Dependency-free; runs at parse
|
|
59
59
|
time so the chrome exists before the deferred page scripts execute. -->
|
|
60
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
60
|
+
<script src="/builders/shell.js?v=2026-09-25-sky4b"></script>
|
|
61
61
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
62
62
|
<script src="/builders/palette.js" defer></script>
|
|
63
63
|
<!-- shared frontend toolkit (window.OTB) — loaded FIRST so task.js can pull from it. -->
|
|
@@ -4,7 +4,10 @@
|
|
|
4
4
|
prototype as the design of record and this sheet is its pixel contract. It
|
|
5
5
|
deliberately does NOT load the hall's style.css or its tokens — the sky is
|
|
6
6
|
its own surface (black void, Manrope, JetBrains Mono for figures), and the
|
|
7
|
-
template's values are the contract. Keep it one file (the task says so).
|
|
7
|
+
template's values are the contract. Keep it one file (the task says so).
|
|
8
|
+
ONE SHEET, TWO DOORS (part 4, task 1004232): /thinking and /goal-map are the
|
|
9
|
+
same page opened in different lenses, so both bodies are named below and
|
|
10
|
+
nothing in here is per-page. */
|
|
8
11
|
/* The template declared these on :root. They sit on the page's body here,
|
|
9
12
|
with the template's values untouched, because the server splices the
|
|
10
13
|
branding pack's own :root (--ink, --accent, --rule …) into <head> AFTER this
|
|
@@ -14,7 +17,7 @@
|
|
|
14
17
|
its own — tests/hall_reading_world.mjs; color-scheme inherits from body
|
|
15
18
|
too). Same reason `body` below is qualified: a pack backdrop is written as
|
|
16
19
|
`body{background:…}` and the void must win. */
|
|
17
|
-
body[data-page="thinking"] {
|
|
20
|
+
body[data-page="thinking"], body[data-page="goal-map"] {
|
|
18
21
|
color-scheme: dark;
|
|
19
22
|
--void: #000000; --ink: #ffffff; --ink-soft: #c0c0c0; --ink-faint: #a8a8a8; --ink-dim: #65656a; --ink-ghost: #3a3a3f;
|
|
20
23
|
--rule: rgba(255,255,255,.16); --rule-soft: rgba(255,255,255,.08); --glass: rgba(255,255,255,.075); --glass-strong: rgba(255,255,255,.14);
|
|
@@ -23,7 +26,7 @@ body[data-page="thinking"] {
|
|
|
23
26
|
--face: Manrope, "Segoe UI", system-ui, -apple-system, sans-serif;
|
|
24
27
|
}
|
|
25
28
|
html, body { height: 100%; }
|
|
26
|
-
body[data-page="thinking"] { margin: 0; background: var(--void); color: var(--ink); font-family: var(--face); font-size: 15px; line-height: 1.5; overflow: hidden; -webkit-font-smoothing: antialiased; }
|
|
29
|
+
body[data-page="thinking"], body[data-page="goal-map"] { margin: 0; background: var(--void); color: var(--ink); font-family: var(--face); font-size: 15px; line-height: 1.5; overflow: hidden; -webkit-font-smoothing: antialiased; }
|
|
27
30
|
button { font-family: inherit; }
|
|
28
31
|
a { color: var(--accent); }
|
|
29
32
|
.lbl { font: var(--label); letter-spacing: .14em; text-transform: uppercase; color: var(--ink-faint); }
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
links, injected into this head by the server like every hall page's
|
|
13
13
|
(tests/hall_tokens.mjs: no hall page hardcodes a web-font stylesheet).
|
|
14
14
|
The template carried its own Google Fonts link for the same two faces. -->
|
|
15
|
-
<link rel="stylesheet" href="/builders/thinking.css?v=2026-09-25-
|
|
15
|
+
<link rel="stylesheet" href="/builders/thinking.css?v=2026-09-25-sky4">
|
|
16
16
|
</head>
|
|
17
17
|
<!-- THE SKY (task 1004231 / sky part 3 of 5, goal 1000095; ADR 0331, ADR 0227
|
|
18
18
|
§11). This page is docs/design/mocks/sky/sky.template.html — the prototype
|
|
@@ -29,7 +29,13 @@
|
|
|
29
29
|
room survives inside it as the list drawer (L). /sky, the old ambient
|
|
30
30
|
page's URL, 301s here (src/bongos/serve-internal.js). It carries no hall
|
|
31
31
|
chrome on purpose: the sky is a full-screen surface with its own header,
|
|
32
|
-
and the hall's doors (the record, the goal, the task) open from the panel.
|
|
32
|
+
and the hall's doors (the record, the goal, the task) open from the panel.
|
|
33
|
+
|
|
34
|
+
The same markup, sheet and scripts serve THE PROJECT SKY at /goal-map
|
|
35
|
+
(part 4, task 1004232): that body says data-sky-lens="all", so the boot
|
|
36
|
+
opens in "the whole project" and the tour hands back to it. The switcher
|
|
37
|
+
is two doors — "the whole project" leaves for /goal-map from here, and
|
|
38
|
+
"simple" / "your thinking" leave for here from there. -->
|
|
33
39
|
<body data-page="thinking" data-page-title="Your sky">
|
|
34
40
|
|
|
35
41
|
<!-- The one <main> landmark the kit's a11y floor asks of every hall page
|
|
@@ -124,13 +130,13 @@
|
|
|
124
130
|
</div>
|
|
125
131
|
</footer>
|
|
126
132
|
|
|
127
|
-
<script src="/builders/idea-objects.js?v=2026-09-25-
|
|
128
|
-
<script src="/builders/sky-data.js?v=2026-09-25-
|
|
129
|
-
<script src="/builders/sky-layout.js?v=2026-09-25-
|
|
130
|
-
<script src="/builders/sky-draw.js?v=2026-09-25-
|
|
131
|
-
<script src="/builders/sky-interaction.js?v=2026-09-25-
|
|
132
|
-
<script src="/builders/sky-panel.js?v=2026-09-25-
|
|
133
|
-
<script src="/builders/sky-composer.js?v=2026-09-25-
|
|
134
|
-
<script src="/builders/sky-tour.js?v=2026-09-25-
|
|
133
|
+
<script src="/builders/idea-objects.js?v=2026-09-25-sky4"></script>
|
|
134
|
+
<script src="/builders/sky-data.js?v=2026-09-25-sky4"></script>
|
|
135
|
+
<script src="/builders/sky-layout.js?v=2026-09-25-sky4"></script>
|
|
136
|
+
<script src="/builders/sky-draw.js?v=2026-09-25-sky4"></script>
|
|
137
|
+
<script src="/builders/sky-interaction.js?v=2026-09-25-sky4"></script>
|
|
138
|
+
<script src="/builders/sky-panel.js?v=2026-09-25-sky4"></script>
|
|
139
|
+
<script src="/builders/sky-composer.js?v=2026-09-25-sky4"></script>
|
|
140
|
+
<script src="/builders/sky-tour.js?v=2026-09-25-sky4"></script>
|
|
135
141
|
</body>
|
|
136
142
|
</html>
|
|
@@ -162,7 +162,7 @@
|
|
|
162
162
|
|
|
163
163
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
164
164
|
chrome exists before the page script runs. -->
|
|
165
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
165
|
+
<script src="/builders/shell.js?v=2026-09-25-sky4b"></script>
|
|
166
166
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
167
167
|
<script src="/builders/palette.js" defer></script>
|
|
168
168
|
<!-- shared frontend toolkit (window.OTB) — loaded before watch.js, which pulls from it. -->
|
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
|
|
172
172
|
<!-- The app shell (sidebar + top bar + footer). Dependency-free; runs at parse
|
|
173
173
|
time so the chrome exists before the deferred page scripts execute. -->
|
|
174
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
174
|
+
<script src="/builders/shell.js?v=2026-09-25-sky4b"></script>
|
|
175
175
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
176
176
|
<script src="/builders/palette.js" defer></script>
|
|
177
177
|
<!-- shared frontend toolkit (window.OTB) — loaded FIRST so work.js can pull from it. -->
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.1015",
|
|
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.1015",
|
|
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.1015",
|
|
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",
|
|
@@ -1171,6 +1171,10 @@ function mountInternalSurfaces(app) {
|
|
|
1171
1171
|
// task 1003479 (goal 1000089): `goal-map` — the map of which goals wait on which,
|
|
1172
1172
|
// reached from Goals. It reads GET /goals/graph, which is `requireBuilder`, so a
|
|
1173
1173
|
// page gated any lower would show a signed-out visitor an empty shell.
|
|
1174
|
+
// task 1004232 (sky part 4): `goal-map` is now THE PROJECT SKY — the same page
|
|
1175
|
+
// as `thinking`, opened in its "the whole project" lens — and holds the nav
|
|
1176
|
+
// slot under Goals the map was denied (ADR 0227 §11). Same tier: it reads GET
|
|
1177
|
+
// /sky and GET /sky/mine, the sky's own reads, behind the same sign-in.
|
|
1174
1178
|
// task 1004231 (sky part 3): `thinking` is now THE SKY itself — the prototype
|
|
1175
1179
|
// the owner adopted (docs/design/mocks/sky/, ADR 0331) built over GET /sky +
|
|
1176
1180
|
// GET /sky/mine, with the room inside it as the list drawer. The old ambient
|
package/src/module-api.js
CHANGED
|
@@ -71,7 +71,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
|
|
|
71
71
|
// there. scripts/gds/bump-version.js still rewrites the literal below; it appends
|
|
72
72
|
// the entry to that file. Look for a version's history there, not here.
|
|
73
73
|
// ---------------------------------------------------------------------------
|
|
74
|
-
const CORE_VERSION = '1.19.
|
|
74
|
+
const CORE_VERSION = '1.19.1015'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
75
75
|
|
|
76
76
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
77
77
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|