@bongos/core 1.17.2 → 1.18.0

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.
Files changed (151) hide show
  1. package/.bongos-core.json +426 -96
  2. package/.devcontainer/healthcheck.sh +0 -0
  3. package/.devcontainer/init-firewall.sh +0 -0
  4. package/.devcontainer/post-create.sh +0 -0
  5. package/GOVERNANCE.md +1 -1
  6. package/README.md +26 -22
  7. package/bin/bongos.js +0 -0
  8. package/clients/bongos-client/README.md +1 -1
  9. package/clients/bongos-client/bongos-client.global.js +2 -0
  10. package/clients/bongos-client/index.cjs +2 -0
  11. package/clients/bongos-client/index.d.ts +4 -2
  12. package/clients/bongos-client/index.mjs +2 -0
  13. package/docker-entrypoint.sh +0 -0
  14. package/docs/adr/0139-platform-history-migration-to-cloudbongos.md +94 -0
  15. package/docs/adr/0140-cloudbongos-standalone-reprovision.md +43 -0
  16. package/docs/adr/README.md +3 -0
  17. package/docs/api/openapi.json +68 -370
  18. package/docs/api-reference.md +7 -18
  19. package/docs/file-map.md +7 -25
  20. package/docs/onboarding/diagrams/05-versioning.mmd +4 -6
  21. package/docs/onboarding/diagrams/assertions.json +5 -9
  22. package/modules/hall-ui/public/builders.js +132 -645
  23. package/modules/hall-ui/public/goal-inbox.js +67 -26
  24. package/modules/hall-ui/public/goals-page.js +102 -177
  25. package/modules/hall-ui/public/goals.css +183 -0
  26. package/modules/hall-ui/public/goals.html +35 -253
  27. package/modules/hall-ui/public/goals.js +7 -2
  28. package/modules/hall-ui/public/hall-kit.js +474 -0
  29. package/modules/hall-ui/public/hall-widgets.js +24 -20
  30. package/modules/hall-ui/public/instances-panel.js +24 -3
  31. package/modules/hall-ui/public/new-project-wizard.js +6 -5
  32. package/modules/hall-ui/public/settings.css +355 -0
  33. package/modules/hall-ui/public/settings.html +86 -414
  34. package/modules/hall-ui/public/settings.js +96 -35
  35. package/modules/hall-ui/public/style.css +156 -0
  36. package/modules/hall-ui/public/watch.css +184 -0
  37. package/modules/hall-ui/public/watch.html +111 -285
  38. package/modules/hall-ui/public/watch.js +59 -21
  39. package/modules/hall-ui/public/work.css +194 -0
  40. package/modules/hall-ui/public/work.html +46 -374
  41. package/modules/hall-ui/public/work.js +137 -102
  42. package/modules/lifecycle/criterion-suggest.js +80 -0
  43. package/modules/lifecycle/db.js +42 -5
  44. package/modules/lifecycle/routes/goals.js +26 -0
  45. package/modules/lifecycle/routes/tasks.js +21 -0
  46. package/package-lock.json +2 -2
  47. package/package.json +1 -1
  48. package/public-landing/create.html +83 -7
  49. package/public-landing/index.html +11 -76
  50. package/scripts/cron/style_guide_audit.sh +0 -0
  51. package/scripts/gds/api.js +0 -0
  52. package/scripts/gds/architect-audit.js +0 -0
  53. package/scripts/gds/audit-authorship.sh +0 -0
  54. package/scripts/gds/audit-replay.sh +0 -0
  55. package/scripts/gds/box.js +0 -0
  56. package/scripts/gds/capture.js +0 -0
  57. package/scripts/gds/conductor-dispatch.js +0 -0
  58. package/scripts/gds/coreB-carve-proof.sh +0 -0
  59. package/scripts/gds/db-backup-nightly.sh +0 -0
  60. package/scripts/gds/db-backup-offsite.sh +0 -0
  61. package/scripts/gds/doctor.js +0 -0
  62. package/scripts/gds/grade-smoke.js +0 -0
  63. package/scripts/gds/hooks/pre-push.js +0 -0
  64. package/scripts/gds/install-git-hooks.js +0 -0
  65. package/scripts/gds/main-audit.js +0 -0
  66. package/scripts/gds/oauth-secret.js +0 -0
  67. package/scripts/gds/onboarding-analyze.js +0 -0
  68. package/scripts/gds/onboarding-ship.js +0 -0
  69. package/scripts/gds/paste-token.js +0 -0
  70. package/scripts/gds/portability-smoke-art.sh +0 -0
  71. package/scripts/gds/portability-smoke-memory.sh +0 -0
  72. package/scripts/gds/provision.js +125 -4
  73. package/scripts/gds/push-main.js +0 -0
  74. package/scripts/gds/render-ideas.js +0 -0
  75. package/scripts/gds/security-baseline-check.sh +0 -0
  76. package/scripts/gds/session.js +0 -0
  77. package/scripts/gds/ship.js +11 -1
  78. package/scripts/gds/smoke-batch-claim.sh +0 -0
  79. package/scripts/gds/smoke-batch-release.sh +0 -0
  80. package/scripts/gds/smoke-box.sh +0 -0
  81. package/scripts/gds/smoke-claim-consistency.sh +0 -0
  82. package/scripts/gds/smoke-dependencies.sh +0 -0
  83. package/scripts/gds/smoke-write.sh +0 -0
  84. package/scripts/hall-preview/README.md +103 -0
  85. package/scripts/hall-preview/fixtures/access-requests.json +20 -0
  86. package/scripts/hall-preview/fixtures/achievements.json +76 -0
  87. package/scripts/hall-preview/fixtures/analytics__builder.json +251 -0
  88. package/scripts/hall-preview/fixtures/audit-log.json +68 -0
  89. package/scripts/hall-preview/fixtures/blockers__detail.json +12 -0
  90. package/scripts/hall-preview/fixtures/box__me.json +5 -0
  91. package/scripts/hall-preview/fixtures/boxes__cost-ledger.json +69 -0
  92. package/scripts/hall-preview/fixtures/builders__active-claims.json +1 -0
  93. package/scripts/hall-preview/fixtures/builders__directory.json +81 -0
  94. package/scripts/hall-preview/fixtures/builders__roster.json +48 -0
  95. package/scripts/hall-preview/fixtures/goals.json +502 -0
  96. package/scripts/hall-preview/fixtures/goals__25.json +96 -0
  97. package/scripts/hall-preview/fixtures/goals__26.json +67 -0
  98. package/scripts/hall-preview/fixtures/goals__3.json +103 -0
  99. package/scripts/hall-preview/fixtures/goals__35.json +49 -0
  100. package/scripts/hall-preview/fixtures/goals__conflicts.json +154 -0
  101. package/scripts/hall-preview/fixtures/goals__detail.json +96 -0
  102. package/scripts/hall-preview/fixtures/goals__inbox.json +5 -0
  103. package/scripts/hall-preview/fixtures/goals__requests.json +3 -0
  104. package/scripts/hall-preview/fixtures/grades__by-builder.json +32 -0
  105. package/scripts/hall-preview/fixtures/inbox.json +330 -0
  106. package/scripts/hall-preview/fixtures/inbox__detail.json +15 -0
  107. package/scripts/hall-preview/fixtures/instance.json +124 -0
  108. package/scripts/hall-preview/fixtures/leaderboard.json +184 -0
  109. package/scripts/hall-preview/fixtures/me.json +476 -0
  110. package/scripts/hall-preview/fixtures/me__art-key__own.json +6 -0
  111. package/scripts/hall-preview/fixtures/me__event-sound-prefs.json +209 -0
  112. package/scripts/hall-preview/fixtures/me__recent-ships.json +304 -0
  113. package/scripts/hall-preview/fixtures/me__render.json +5 -0
  114. package/scripts/hall-preview/fixtures/me__skill-prefs.json +143 -0
  115. package/scripts/hall-preview/fixtures/me__sound-prefs.json +67 -0
  116. package/scripts/hall-preview/fixtures/me__wandering.json +43 -0
  117. package/scripts/hall-preview/fixtures/override-requests.json +15 -0
  118. package/scripts/hall-preview/fixtures/provisioning__fleet.json +1 -0
  119. package/scripts/hall-preview/fixtures/provisioning__fleet__cost-ledger.json +1 -0
  120. package/scripts/hall-preview/fixtures/provisioning__instances.json +1 -0
  121. package/scripts/hall-preview/fixtures/public__analytics__ecosystem.json +516 -0
  122. package/scripts/hall-preview/fixtures/public__bounty-table.json +37 -0
  123. package/scripts/hall-preview/fixtures/public__cost-summary.json +742 -0
  124. package/scripts/hall-preview/fixtures/public__estimation-drift.json +41 -0
  125. package/scripts/hall-preview/fixtures/public__grades.json +50 -0
  126. package/scripts/hall-preview/fixtures/public__progress.json +124 -0
  127. package/scripts/hall-preview/fixtures/public__recent-shipped.json +426 -0
  128. package/scripts/hall-preview/fixtures/public__repo-health.json +160 -0
  129. package/scripts/hall-preview/fixtures/public__repo-info.json +5 -0
  130. package/scripts/hall-preview/fixtures/security__docs.json +10 -0
  131. package/scripts/hall-preview/fixtures/security__reports.json +31 -0
  132. package/scripts/hall-preview/fixtures/sessions__search.json +9 -0
  133. package/scripts/hall-preview/fixtures/tasks.json +2420 -0
  134. package/scripts/hall-preview/fixtures/tasks__claimable.json +2555 -0
  135. package/scripts/hall-preview/fixtures/tasks__detail.json +111 -0
  136. package/scripts/hall-preview/fixtures/tasks__peer-votes__feed.json +330 -0
  137. package/scripts/hall-preview/fixtures/versions.json +89 -0
  138. package/scripts/hall-preview/refresh-fixtures.js +77 -0
  139. package/scripts/hall-preview/server.js +195 -0
  140. package/scripts/migrate.sh +29 -4
  141. package/scripts/migrate_cost_ledger.sh +0 -0
  142. package/scripts/render-diagrams.sh +0 -0
  143. package/scripts/security/dep-audit.js +0 -0
  144. package/scripts/setup-builder.js +0 -0
  145. package/scripts/setup-builder.sh +0 -0
  146. package/scripts/snapshots/maybe-render-on-deploy.sh +0 -0
  147. package/src/bongos/optimizer.js +37 -2
  148. package/src/module-api.js +20 -1
  149. package/tests/criterion_suggest.mjs +106 -0
  150. package/tests/migrate_root_resolution.mjs +97 -0
  151. package/tests/provision.mjs +69 -0
@@ -0,0 +1,355 @@
1
+ /* settings.css — page-local styles for Settings (task 2172; extracted from
2
+ settings.html's old inline <style> per the hall placement rules). Components
3
+ layered on the shared design system (style.css) — the rail (.section-rail /
4
+ .rail-link) and buttons derive from the shared tokens so instance theme
5
+ packs reskin this page too. */
6
+
7
+ /* ---- grouped layout: left sub-nav rail + one visible group (task 1723) ---- */
8
+ .settings-layout {
9
+ display: grid;
10
+ grid-template-columns: 180px minmax(0, 1fr);
11
+ gap: 20px;
12
+ align-items: start;
13
+ }
14
+ .settings-layout[hidden] { display: none !important; }
15
+ /* Only the active group's sections render. Each grouped element is a direct
16
+ child of .settings-groups carrying data-group; a section's own [hidden]
17
+ attribute always wins (the !important rule below), so the per-section
18
+ reveal logic in settings.js is unchanged. */
19
+ .settings-groups > [data-group] { display: none; }
20
+ .settings-groups[data-active="account"] > [data-group="account"],
21
+ .settings-groups[data-active="devbox"] > [data-group="devbox"],
22
+ .settings-groups[data-active="access"] > [data-group="access"],
23
+ .settings-groups[data-active="preferences"] > [data-group="preferences"],
24
+ .settings-groups[data-active="sound"] > [data-group="sound"],
25
+ .settings-groups[data-active="extensions"] > [data-group="extensions"] { display: block; }
26
+ .settings-groups > [data-group][hidden] { display: none !important; }
27
+
28
+ /* task 2172 density pass — standard panel anatomy (title → one-line purpose →
29
+ control → save-semantics note) in a tighter card: less padding + stacking
30
+ margin than the default .scroll, ledes clamped to one visual line's worth. */
31
+ .settings-groups .scroll { padding: 16px 18px; margin: 0 0 12px; }
32
+ .settings-groups .scroll__lede { font-size: 13px; margin-bottom: 10px; }
33
+
34
+ @media (max-width: 768px) {
35
+ /* Collapse to one column; the shared .section-rail ≤768px rules turn the
36
+ rail into a sticky horizontal chip strip just under the top bar. */
37
+ .settings-layout { grid-template-columns: minmax(0, 1fr); }
38
+ }
39
+
40
+ .settings-status {
41
+ font-size: 13px;
42
+ color: var(--ink-soft);
43
+ min-height: 1.2em;
44
+ margin-top: 8px;
45
+ }
46
+ .section-note {
47
+ color: var(--ink-faint);
48
+ font-size: 12.5px;
49
+ margin-top: 10px;
50
+ margin-bottom: 0;
51
+ }
52
+
53
+ /* ---- Voices (per-skill model picker) ---- */
54
+ .voices-scroll { /* keep many rows compact within a bounded, scrollable box */ }
55
+ .voices-wrap {
56
+ max-height: 460px;
57
+ overflow-y: auto;
58
+ margin-top: 6px;
59
+ border: 1px solid var(--border);
60
+ border-radius: var(--radius-sm);
61
+ }
62
+ table.voices {
63
+ width: 100%;
64
+ border-collapse: collapse;
65
+ font-size: 13px;
66
+ color: var(--ink);
67
+ }
68
+ table.voices th, table.voices td {
69
+ padding: 7px 12px;
70
+ text-align: left;
71
+ border-bottom: 1px solid var(--rule-soft);
72
+ vertical-align: middle;
73
+ }
74
+ table.voices th {
75
+ /* sticks inside .voices-wrap's own scroller, not the window — top:0 is
76
+ relative to the wrap, so no --topbar-h offset needed here */
77
+ position: sticky;
78
+ top: 0;
79
+ z-index: 1;
80
+ background: var(--surface);
81
+ font-size: 11px;
82
+ font-weight: 600;
83
+ letter-spacing: 0.06em;
84
+ text-transform: uppercase;
85
+ color: var(--ink-faint);
86
+ border-bottom: 1px solid var(--border-strong);
87
+ }
88
+ table.voices tr:last-child td { border-bottom: none; }
89
+ table.voices tbody tr:hover td { background: var(--surface-2); }
90
+ .voices__skill code {
91
+ font-size: 12.5px;
92
+ color: var(--info);
93
+ }
94
+ .voices__default {
95
+ font-size: 12.5px;
96
+ color: var(--ink-soft);
97
+ }
98
+ select.voices__select { min-width: 140px; }
99
+ .voices-empty, .craft-empty {
100
+ color: var(--ink-faint);
101
+ font-style: italic;
102
+ font-size: 13px;
103
+ padding: 10px 0;
104
+ }
105
+
106
+ /* ---- Sounds (per-sound on/off toggles) ---- */
107
+ .sound-rows { margin-top: 8px; }
108
+ .sound-row {
109
+ display: flex;
110
+ align-items: center;
111
+ justify-content: space-between;
112
+ gap: 16px;
113
+ padding: 9px 0;
114
+ border-bottom: 1px solid var(--rule-soft);
115
+ }
116
+ .sound-row:last-child { border-bottom: none; }
117
+ .sound-row__text { min-width: 0; }
118
+ .sound-row__label {
119
+ font-size: 13.5px;
120
+ color: var(--ink);
121
+ font-weight: 600;
122
+ }
123
+ .sound-row__desc {
124
+ font-size: 12.5px;
125
+ color: var(--ink-soft);
126
+ margin-top: 2px;
127
+ }
128
+ button.sound-toggle {
129
+ font-family: var(--font-body);
130
+ font-size: 12.5px;
131
+ font-weight: 600;
132
+ padding: 5px 16px;
133
+ min-width: 72px;
134
+ border-radius: 999px;
135
+ border: 1px solid var(--border-strong);
136
+ background: var(--surface);
137
+ color: var(--ink-soft);
138
+ cursor: pointer;
139
+ flex-shrink: 0;
140
+ }
141
+ button.sound-toggle[data-on="1"] {
142
+ background: var(--accent);
143
+ border-color: var(--accent);
144
+ color: #fff;
145
+ }
146
+ button.sound-toggle:disabled { opacity: 0.5; cursor: default; }
147
+ .sound-volume {
148
+ display: flex;
149
+ align-items: center;
150
+ gap: 14px;
151
+ padding: 4px 0 12px;
152
+ border-bottom: 1px solid var(--border);
153
+ margin-bottom: 4px;
154
+ }
155
+ .sound-volume__label {
156
+ font-size: 11px;
157
+ font-weight: 600;
158
+ text-transform: uppercase;
159
+ letter-spacing: 0.06em;
160
+ color: var(--ink-faint);
161
+ flex-shrink: 0;
162
+ }
163
+ .sound-volume input[type="range"] {
164
+ flex: 1;
165
+ accent-color: var(--accent);
166
+ cursor: pointer;
167
+ }
168
+ .sound-volume__pct {
169
+ font-size: 13px;
170
+ color: var(--ink);
171
+ min-width: 3.2em;
172
+ text-align: right;
173
+ font-variant-numeric: tabular-nums;
174
+ }
175
+
176
+ /* ---- Event sounds (per-event variant dropdowns, task 582) ---- */
177
+ .event-sound-rows { margin-top: 8px; }
178
+ .event-sound-row {
179
+ display: flex;
180
+ align-items: center;
181
+ justify-content: space-between;
182
+ gap: 16px;
183
+ padding: 9px 0;
184
+ border-bottom: 1px solid var(--rule-soft);
185
+ }
186
+ .event-sound-row:last-child { border-bottom: none; }
187
+ .event-sound-row__text { flex: 1; min-width: 0; }
188
+ .event-sound-row__label {
189
+ font-size: 13.5px;
190
+ color: var(--ink);
191
+ font-weight: 600;
192
+ }
193
+ .event-sound-row__desc {
194
+ font-size: 12.5px;
195
+ color: var(--ink-soft);
196
+ margin-top: 2px;
197
+ }
198
+ .event-sound-row__controls {
199
+ display: flex;
200
+ align-items: center;
201
+ gap: 8px;
202
+ flex-shrink: 0;
203
+ }
204
+ .event-sound-select { cursor: pointer; }
205
+ .event-sound-preview {
206
+ font-family: var(--font-body);
207
+ font-size: 12px;
208
+ font-weight: 600;
209
+ padding: 5px 12px;
210
+ border-radius: 999px;
211
+ border: 1px solid var(--border-strong);
212
+ background: transparent;
213
+ color: var(--ink-soft);
214
+ cursor: pointer;
215
+ }
216
+ .event-sound-preview:active { opacity: 0.7; }
217
+
218
+ /* ---- Disciplines (preference chips) ---- */
219
+ .craft-chips {
220
+ display: flex;
221
+ flex-wrap: wrap;
222
+ gap: 10px;
223
+ margin-top: 8px;
224
+ }
225
+ .craft-chip {
226
+ display: inline-flex;
227
+ align-items: center;
228
+ gap: 8px;
229
+ font-size: 13.5px;
230
+ color: var(--ink);
231
+ background: var(--surface);
232
+ border: 1px solid var(--border-strong);
233
+ border-radius: 999px;
234
+ padding: 6px 14px;
235
+ cursor: pointer;
236
+ user-select: none;
237
+ text-transform: capitalize;
238
+ }
239
+ .craft-chip:hover { background: var(--surface-2); }
240
+ .craft-chip input { cursor: pointer; }
241
+ .craft-chip[data-on="1"] {
242
+ background: var(--accent);
243
+ border-color: var(--accent);
244
+ color: #fff;
245
+ }
246
+ .craft-actions {
247
+ display: flex;
248
+ align-items: center;
249
+ gap: 14px;
250
+ margin-top: 14px;
251
+ flex-wrap: wrap;
252
+ }
253
+
254
+ /* ---- Buttons (Save / card actions) ---- */
255
+ button.craft-save, .settings-btn {
256
+ font-family: var(--font-body);
257
+ font-size: 13px;
258
+ font-weight: 600;
259
+ padding: 7px 16px;
260
+ border: 1px solid var(--accent);
261
+ background: var(--surface);
262
+ color: var(--accent-text);
263
+ border-radius: var(--radius-sm);
264
+ cursor: pointer;
265
+ display: inline-block;
266
+ text-decoration: none;
267
+ }
268
+ button.craft-save:hover:not(:disabled), .settings-btn:hover:not(:disabled) {
269
+ background: var(--accent);
270
+ color: #fff;
271
+ text-decoration: none;
272
+ }
273
+ button.craft-save:disabled, .settings-btn:disabled { opacity: 0.5; cursor: default; }
274
+ /* Discord brand button — keeps its blurple so it's recognisable. */
275
+ .settings-btn--discord {
276
+ background: #5865F2;
277
+ border-color: #4853c4;
278
+ color: #fff;
279
+ }
280
+ .settings-btn--discord:hover { background: #4853c4; color: #fff; }
281
+ .settings-btn--quiet {
282
+ border-color: var(--border-strong);
283
+ color: var(--ink-soft);
284
+ }
285
+ .settings-btn--quiet:hover:not(:disabled) { background: var(--surface-2); color: var(--ink); }
286
+
287
+ /* ---- Display name (single editable field, task 1669) ---- */
288
+ .display-name-row {
289
+ display: flex;
290
+ flex-wrap: wrap;
291
+ align-items: center;
292
+ gap: 12px;
293
+ margin-top: 8px;
294
+ }
295
+ input.display-name-input {
296
+ flex: 1 1 280px;
297
+ min-width: 0;
298
+ }
299
+
300
+ /* ---- Connections + CLI access cards ---- */
301
+ .settings-card {
302
+ margin-top: 8px;
303
+ display: flex;
304
+ flex-wrap: wrap;
305
+ align-items: center;
306
+ gap: 12px;
307
+ }
308
+ .settings-card__hint { color: var(--ink-soft); font-size: 13px; }
309
+ .settings-card__ok { font-weight: 600; color: var(--ok); }
310
+ .cli-result { flex-basis: 100%; margin-top: 4px; }
311
+ .cli-result pre {
312
+ background: var(--bg-deep);
313
+ color: var(--ink);
314
+ padding: 10px 12px;
315
+ border: 1px solid var(--border);
316
+ border-radius: var(--radius-sm);
317
+ overflow-x: auto;
318
+ font-size: 12.5px;
319
+ margin: 6px 0;
320
+ }
321
+
322
+ /* ---- Image key (task 1013) — the "we cover it" / "action needed" banner
323
+ uses the shared semantic status tokens. ---- */
324
+ .artkey-banner {
325
+ border-radius: var(--radius-sm);
326
+ padding: 10px 14px;
327
+ font-size: 13px;
328
+ line-height: 1.45;
329
+ border: 1px solid var(--border);
330
+ margin-bottom: 10px;
331
+ }
332
+ .artkey-banner--covered {
333
+ background: var(--ok-weak);
334
+ border-color: color-mix(in srgb, var(--ok) 45%, var(--border));
335
+ color: var(--ok);
336
+ }
337
+ .artkey-banner--action {
338
+ background: var(--warn-weak);
339
+ border-color: color-mix(in srgb, var(--warn) 45%, var(--border));
340
+ color: var(--warn);
341
+ }
342
+ .artkey-entry-row { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; flex-basis: 100%; }
343
+ .artkey-input {
344
+ flex: 1 1 280px;
345
+ min-width: 0;
346
+ padding: 7px 10px;
347
+ border: 1px solid var(--border-strong);
348
+ border-radius: var(--radius-sm);
349
+ background: var(--surface);
350
+ color: var(--ink);
351
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
352
+ font-size: 13px;
353
+ }
354
+ .artkey-actions { display: flex; gap: 10px; flex-wrap: wrap; }
355
+ #artkey-entry { flex-basis: 100%; }