@bongos/core 1.20.44 → 1.20.45
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 +103 -63
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +4 -0
- package/clients/bongos-client/index.cjs +4 -0
- package/clients/bongos-client/index.d.ts +5 -0
- package/clients/bongos-client/index.mjs +4 -0
- package/docs/api/openapi.json +56 -3
- package/docs/api-reference.md +7 -1
- package/docs/copy-inventory.md +46 -16
- package/docs/copy-registry.json +351 -20
- package/docs/module-api-changelog.md +2 -0
- package/docs/onboarding/slash-commands.md +12 -56
- package/docs/page-inventory.json +33 -4
- package/docs/page-readings.json +992 -957
- 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/commands-lib.js +142 -0
- package/modules/hall-ui/public/commands.css +98 -0
- package/modules/hall-ui/public/commands.html +65 -0
- package/modules/hall-ui/public/commands.js +52 -0
- package/modules/hall-ui/public/commands.states.json +14 -0
- 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/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/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 +3 -0
- package/modules/hall-ui/public/studio.html +1 -1
- package/modules/hall-ui/public/task.html +1 -1
- package/modules/hall-ui/public/thinking.html +1 -1
- package/modules/hall-ui/public/tweak-editor.html +1 -1
- package/modules/hall-ui/public/watch.html +1 -1
- package/modules/hall-ui/public/work.html +1 -1
- package/modules/hall-ui/records/commands.md +11 -0
- package/modules/specialities/skills.js +6 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +6 -0
- package/src/bongos/routes/cli-commands.js +49 -0
- package/src/bongos/routes.js +3 -0
- package/src/bongos/serve-internal.js +4 -1
- package/src/module-api.js +1 -1
- package/tests/hall_commands.mjs +162 -0
- package/tests/hall_nav.mjs +3 -1
- package/tests/hall_page_gate_map.mjs +3 -0
- package/tests/hall_tweak_editor.mjs +1 -1
- package/tests/nav_permission_atoms.mjs +1 -1
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
|
|
92
92
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
93
93
|
|
|
94
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
94
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
95
95
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
96
96
|
<script src="/builders/palette.js" defer></script>
|
|
97
97
|
<script src="/builders/atlas.js?v=2026-09-02-index" defer></script>
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
|
|
51
51
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
52
52
|
chrome exists before the page script runs. -->
|
|
53
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
53
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
54
54
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
55
55
|
<script src="/builders/palette.js" defer></script>
|
|
56
56
|
<!-- shared frontend toolkit (window.OTB — rank labels, number formats) + the
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
|
|
61
61
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
62
62
|
|
|
63
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
63
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
64
64
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
65
65
|
<script src="/builders/palette.js" defer></script>
|
|
66
66
|
<script src="/builders/dom-utils.js?v=2026-06-16-board"></script>
|
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
|
|
149
149
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
150
150
|
|
|
151
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
151
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
152
152
|
<script src="/builders/palette.js" defer></script>
|
|
153
153
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
154
154
|
<script src="/builders/collab-lib.js?v=2026-09-24-archive"></script>
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// commands-lib.js — the Commands page's PURE helpers (task 1004473), exposed as
|
|
2
|
+
// window.OTBCommandsLib and, under Node, as module.exports (the blockers-lib.js
|
|
3
|
+
// pattern), so a test can feed it the real skills and the real CLI verbs and
|
|
4
|
+
// check what the page would print.
|
|
5
|
+
//
|
|
6
|
+
// NOTHING HERE IS A LIST OF COMMANDS. The rows come from the two live sources
|
|
7
|
+
// the page fetches — every skill this instance has (GET
|
|
8
|
+
// /specialities/installed-skills, read from disk) and every CLI verb (GET
|
|
9
|
+
// /cli/commands, read from bin/bongos.js). The only hand-written thing is which
|
|
10
|
+
// GROUP a skill sits under, and a skill no group names still gets a row, under
|
|
11
|
+
// "Everything else", so a new skill can never fall off the page.
|
|
12
|
+
|
|
13
|
+
(function (root) {
|
|
14
|
+
'use strict';
|
|
15
|
+
|
|
16
|
+
// The groups, in page order. `names` places a skill by name; `modules` places
|
|
17
|
+
// every skill a module contributes (their source is `module:<key>`).
|
|
18
|
+
const SKILL_GROUPS = [
|
|
19
|
+
{
|
|
20
|
+
key: 'loop', label: 'Your daily loop',
|
|
21
|
+
blurb: 'Picking a task, doing it and handing it in.',
|
|
22
|
+
names: ['builder-start', 'builder-claim', 'fix-task', 'builder-sequence', 'builder-stage', 'ship-check', 'builder-ship', 'builder-release', 'builder-end'],
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
key: 'find', label: 'Finding things out and working with others',
|
|
26
|
+
blurb: 'Looking up what the project already knows, asking for help, and passing work on.',
|
|
27
|
+
names: ['status', 'recall', 'ask-for-help', 'collab-review', 'session-handoff', 'read-session-export', 'feedback'],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
key: 'owner', label: 'Owner routines',
|
|
31
|
+
blurb: 'The regular reviews and planning that keep the project on course. Most need Metic rank or above.',
|
|
32
|
+
names: ['owner-review', 'backlog-review', 'bug-triage', 'idea-triage', 'priority-session', 'blocker-review', 'blocker-solve',
|
|
33
|
+
'goal-create', 'goal-close', 'goal-uat', 'goal-review', 'planning-session', 'grade-sweep', 'grader-health', 'grade-audit', 'builder-exit'],
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
key: 'design', label: 'Design and the look',
|
|
37
|
+
blurb: 'How pages look and read, and the art pipeline where the project runs one.',
|
|
38
|
+
names: ['design', 'design-sync', 'figma-design-sync', 'tweak'],
|
|
39
|
+
modules: ['design-styles', 'pixel-art', 'ui-design'],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
key: 'safety', label: 'Safety nets and repairs',
|
|
43
|
+
blurb: 'For when something went wrong, or before something risky.',
|
|
44
|
+
names: ['grade-recover', 'strand-fix', 'merge-mode', 'worktree-clean', 'builder-backup', 'scan-before-install', 'builder-redteam', 'bongos-feedback'],
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
key: 'setup', label: 'Your account and new projects',
|
|
48
|
+
blurb: 'Signing in, keys, costs, and starting a project from scratch.',
|
|
49
|
+
names: ['builder-setup', 'builder-reauth', 'builder-key', 'builder-cost', 'new-project'],
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
const OTHER_GROUP = { key: 'other', label: 'Everything else', blurb: 'Skills this project has that no group above names yet.' };
|
|
53
|
+
|
|
54
|
+
function groupKeyOf(skill) {
|
|
55
|
+
const name = String((skill && skill.name) || '');
|
|
56
|
+
const src = String((skill && skill.source) || '');
|
|
57
|
+
for (const g of SKILL_GROUPS) if (g.names.includes(name)) return g.key;
|
|
58
|
+
const mod = src.startsWith('module:') ? src.slice('module:'.length) : null;
|
|
59
|
+
if (mod) for (const g of SKILL_GROUPS) if ((g.modules || []).includes(mod)) return g.key;
|
|
60
|
+
return OTHER_GROUP.key;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Within a group, rows follow the order the group names them (the daily loop
|
|
64
|
+
// reads start -> claim -> ship), and anything placed by module or unnamed
|
|
65
|
+
// follows A–Z.
|
|
66
|
+
function rowOrder(groupKey) {
|
|
67
|
+
const g = SKILL_GROUPS.find((x) => x.key === groupKey);
|
|
68
|
+
const names = g ? g.names : [];
|
|
69
|
+
return (a, b) => {
|
|
70
|
+
const ia = names.indexOf(a.name); const ib = names.indexOf(b.name);
|
|
71
|
+
if (ia !== ib) return (ia < 0 ? Infinity : ia) - (ib < 0 ? Infinity : ib);
|
|
72
|
+
return a.name.localeCompare(b.name);
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Skills -> [{ key, label, blurb, skills }] in page order, empty groups dropped. */
|
|
77
|
+
function groupSkills(skills) {
|
|
78
|
+
const all = [...SKILL_GROUPS, OTHER_GROUP].map((g) => ({ key: g.key, label: g.label, blurb: g.blurb, skills: [] }));
|
|
79
|
+
const byKey = new Map(all.map((g) => [g.key, g]));
|
|
80
|
+
for (const s of Array.isArray(skills) ? skills : []) if (s && s.name) byKey.get(groupKeyOf(s)).skills.push(s);
|
|
81
|
+
for (const g of all) g.skills.sort(rowOrder(g.key));
|
|
82
|
+
return all.filter((g) => g.skills.length);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function moduleNote(skill, esc) {
|
|
86
|
+
const src = String(skill.source || '');
|
|
87
|
+
if (!src.startsWith('module:')) return '';
|
|
88
|
+
return `<span class="cmd-from">from the ${esc(src.slice('module:'.length))} module</span>`;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function howPill(skill) {
|
|
92
|
+
return skill.listed === false
|
|
93
|
+
? '<span class="fact-pill cmd-how cmd-how--typed" title="Hidden from Claude\'s menu: type the slash command yourself">Type it yourself</span>'
|
|
94
|
+
: '<span class="fact-pill fact-pill--info cmd-how cmd-how--listed" title="Claude sees it and can start it when you ask in plain words">Shown to Claude</span>';
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// One table per group. The cells carry data-label so the phone layout can
|
|
98
|
+
// stack each row as a small card with its column names beside the values.
|
|
99
|
+
function skillsTableHtml(groups, { esc }) {
|
|
100
|
+
return groups.map((g) => `
|
|
101
|
+
<div class="cmd-group" id="skills-${esc(g.key)}">
|
|
102
|
+
<h3 class="cmd-group__h">${esc(g.label)} <span class="cmd-group__n">${g.skills.length}</span></h3>
|
|
103
|
+
<p class="cmd-group__blurb">${esc(g.blurb)}</p>
|
|
104
|
+
<div class="cmd-table-wrap">
|
|
105
|
+
<table class="ledger cmd-table">
|
|
106
|
+
<thead><tr><th scope="col">Command</th><th scope="col">What it does</th><th scope="col">When to reach for it</th><th scope="col">What it costs</th><th scope="col">How you start it</th></tr></thead>
|
|
107
|
+
<tbody>${g.skills.map((s) => `
|
|
108
|
+
<tr data-skill="${esc(s.name)}">
|
|
109
|
+
<th scope="row" class="cmd-name" data-label="Command"><code>/${esc(s.name)}</code>${moduleNote(s, esc)}</th>
|
|
110
|
+
<td data-label="What it does">${esc(s.does || '')}</td>
|
|
111
|
+
<td data-label="When to reach for it">${esc(s.reachFor || '')}</td>
|
|
112
|
+
<td data-label="What it costs">${esc(s.cost || '')}</td>
|
|
113
|
+
<td data-label="How you start it">${howPill(s)}</td>
|
|
114
|
+
</tr>`).join('')}
|
|
115
|
+
</tbody>
|
|
116
|
+
</table>
|
|
117
|
+
</div>
|
|
118
|
+
</div>`).join('');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function cliTableHtml(groups, { esc }) {
|
|
122
|
+
return (Array.isArray(groups) ? groups : []).filter((g) => g && Array.isArray(g.commands) && g.commands.length).map((g) => `
|
|
123
|
+
<div class="cmd-group" id="cli-${esc(g.key)}">
|
|
124
|
+
<h3 class="cmd-group__h">${esc(g.label)} <span class="cmd-group__n">${g.commands.length}</span></h3>
|
|
125
|
+
<div class="cmd-table-wrap">
|
|
126
|
+
<table class="ledger cmd-table cmd-table--cli">
|
|
127
|
+
<thead><tr><th scope="col">Command</th><th scope="col">What it does</th></tr></thead>
|
|
128
|
+
<tbody>${g.commands.map((c) => `
|
|
129
|
+
<tr data-verb="${esc(c.verb)}">
|
|
130
|
+
<th scope="row" class="cmd-name" data-label="Command"><code>bongos ${esc(c.verb)}</code></th>
|
|
131
|
+
<td data-label="What it does">${esc(c.summary || '')}</td>
|
|
132
|
+
</tr>`).join('')}
|
|
133
|
+
</tbody>
|
|
134
|
+
</table>
|
|
135
|
+
</div>
|
|
136
|
+
</div>`).join('');
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const lib = { SKILL_GROUPS, OTHER_GROUP, groupKeyOf, groupSkills, skillsTableHtml, cliTableHtml };
|
|
140
|
+
if (typeof module !== 'undefined' && module.exports) module.exports = lib;
|
|
141
|
+
if (root) root.OTBCommandsLib = lib;
|
|
142
|
+
})(typeof window !== 'undefined' ? window : null);
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/* commands.css — the Commands page (task 1004473): every skill and every
|
|
2
|
+
bongos CLI command, as ledger tables grouped under small heads. It rides the
|
|
3
|
+
shell's .scroll panel and .ledger table; this sheet holds only what a command
|
|
4
|
+
row has that no other ledger does — the group head, the module note, the
|
|
5
|
+
start-it pill — and the phone layout. Every colour is a shell token. */
|
|
6
|
+
|
|
7
|
+
.cmd-group + .cmd-group { margin-top: var(--sp-lg); }
|
|
8
|
+
.cmd-group__h {
|
|
9
|
+
margin: 0 0 4px;
|
|
10
|
+
font-size: 15px;
|
|
11
|
+
font-weight: 600;
|
|
12
|
+
color: var(--ink);
|
|
13
|
+
}
|
|
14
|
+
.cmd-group__n {
|
|
15
|
+
margin-left: 6px;
|
|
16
|
+
font-weight: 400;
|
|
17
|
+
font-size: 12.5px;
|
|
18
|
+
color: var(--ink-faint);
|
|
19
|
+
font-variant-numeric: tabular-nums;
|
|
20
|
+
}
|
|
21
|
+
.cmd-group__blurb {
|
|
22
|
+
margin: 0 0 var(--sp-xs);
|
|
23
|
+
font-size: 13px;
|
|
24
|
+
color: var(--ink-soft);
|
|
25
|
+
max-width: var(--measure);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* The name column is a row header (th scope=row) so a screen reader announces
|
|
29
|
+
each cell against its command. It keeps the body voice, not the label voice
|
|
30
|
+
the column heads use. */
|
|
31
|
+
.cmd-table tbody th {
|
|
32
|
+
position: static;
|
|
33
|
+
background: none;
|
|
34
|
+
padding: 14px 12px 14px 0;
|
|
35
|
+
border-bottom: 1px solid var(--rule-soft);
|
|
36
|
+
vertical-align: top;
|
|
37
|
+
text-align: left;
|
|
38
|
+
font: inherit;
|
|
39
|
+
letter-spacing: normal;
|
|
40
|
+
text-transform: none;
|
|
41
|
+
color: var(--ink);
|
|
42
|
+
z-index: auto;
|
|
43
|
+
}
|
|
44
|
+
.cmd-table tr:last-child th { border-bottom: none; }
|
|
45
|
+
.cmd-table tbody tr:hover th { background: var(--glass); }
|
|
46
|
+
.cmd-name code { white-space: nowrap; font-size: 13px; }
|
|
47
|
+
.cmd-from {
|
|
48
|
+
display: block;
|
|
49
|
+
margin-top: 4px;
|
|
50
|
+
font-size: 12px;
|
|
51
|
+
color: var(--ink-faint);
|
|
52
|
+
}
|
|
53
|
+
.cmd-table td { color: var(--ink-soft); }
|
|
54
|
+
.cmd-table td:nth-of-type(1) { color: var(--ink); }
|
|
55
|
+
.cmd-table:not(.cmd-table--cli) td:nth-of-type(1),
|
|
56
|
+
.cmd-table:not(.cmd-table--cli) td:nth-of-type(2),
|
|
57
|
+
.cmd-table:not(.cmd-table--cli) td:nth-of-type(3) { width: 26%; }
|
|
58
|
+
.cmd-how--typed { color: var(--ink-soft); }
|
|
59
|
+
/* The CLI tables are two columns in three groups; a fixed command column keeps
|
|
60
|
+
the help lines aligned from one group to the next. */
|
|
61
|
+
.cmd-table--cli { table-layout: fixed; }
|
|
62
|
+
.cmd-table--cli thead th:first-child { width: 220px; }
|
|
63
|
+
|
|
64
|
+
.cmd-legend {
|
|
65
|
+
display: flex;
|
|
66
|
+
flex-wrap: wrap;
|
|
67
|
+
gap: var(--sp-hair) var(--sp-sm);
|
|
68
|
+
align-items: center;
|
|
69
|
+
margin: 0 0 var(--sp-md);
|
|
70
|
+
font-size: 13px;
|
|
71
|
+
color: var(--ink-soft);
|
|
72
|
+
}
|
|
73
|
+
.cmd-note { margin: var(--sp-sm) 0 0; font-size: 13px; color: var(--ink-faint); max-width: var(--measure); }
|
|
74
|
+
.cmd-error { color: var(--ink-soft); font-size: 13.5px; }
|
|
75
|
+
|
|
76
|
+
/* At phone width a five-column table cannot fit, and a sideways-scrolling one
|
|
77
|
+
hides the costs. Each row becomes a small card instead: the command on top,
|
|
78
|
+
then each cell with its column name above it (read from data-label). */
|
|
79
|
+
@media (max-width: 760px) {
|
|
80
|
+
.cmd-table, .cmd-table tbody, .cmd-table tr, .cmd-table th, .cmd-table td { display: block; width: auto !important; }
|
|
81
|
+
/* The column names move onto each cell (td::before), so the head row goes. */
|
|
82
|
+
.cmd-table thead { display: none; }
|
|
83
|
+
.cmd-table tr { padding: var(--sp-sm) 0; border-bottom: 1px solid var(--rule-soft); }
|
|
84
|
+
.cmd-table tr:last-child { border-bottom: none; }
|
|
85
|
+
.cmd-table tbody th, .cmd-table td { padding: 0; border-bottom: none; }
|
|
86
|
+
.cmd-table td { margin-top: var(--sp-hair); }
|
|
87
|
+
.cmd-table td::before {
|
|
88
|
+
content: attr(data-label);
|
|
89
|
+
display: block;
|
|
90
|
+
font-family: var(--label-face);
|
|
91
|
+
font-size: var(--label-size);
|
|
92
|
+
letter-spacing: var(--label-space);
|
|
93
|
+
text-transform: var(--label-case);
|
|
94
|
+
color: var(--ink-faint);
|
|
95
|
+
}
|
|
96
|
+
.cmd-table tbody tr:hover th, .cmd-table tbody tr:hover td { background: none; }
|
|
97
|
+
.cmd-name code { white-space: normal; overflow-wrap: anywhere; }
|
|
98
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>Commands — {{worldName}}</title>
|
|
7
|
+
<meta name="description" content="Every slash command (skill) and every bongos terminal command this project has: what each does, when to reach for it and what it costs.">
|
|
8
|
+
<link rel="icon" href="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><text x='16' y='24' font-size='24' text-anchor='middle' font-family='sans-serif'>⌂</text></svg>">
|
|
9
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
10
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
11
|
+
<link rel="stylesheet" href="/builders/style.css?v=2026-07-02-shell1">
|
|
12
|
+
<link rel="stylesheet" href="/builders/commands.css">
|
|
13
|
+
</head>
|
|
14
|
+
<body data-page="commands" data-page-title="Commands">
|
|
15
|
+
|
|
16
|
+
<div class="app">
|
|
17
|
+
<aside class="app-sidebar" id="app-sidebar" aria-label="Primary"></aside>
|
|
18
|
+
<div class="app-scrim" id="app-scrim" hidden></div>
|
|
19
|
+
<div class="app-body">
|
|
20
|
+
<header class="app-topbar" id="app-topbar"></header>
|
|
21
|
+
<div class="app-content">
|
|
22
|
+
<!-- task 1004473: a reference page, so it takes the room's head like
|
|
23
|
+
Ranks. Both tables below are filled from live sources — nothing in
|
|
24
|
+
this file names a command. -->
|
|
25
|
+
<div class="page-head page-head--room">
|
|
26
|
+
<p class="page-head__eyebrow">Docs</p>
|
|
27
|
+
<h1 class="page-head__h">Commands</h1>
|
|
28
|
+
<p class="page-head__sub">Every slash command and every terminal command this project has, with what each does, when to reach for it and what it costs. The list is read from the project itself, so it is always current.</p>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<main id="hall-main">
|
|
32
|
+
<section class="scroll" id="skills-scroll" aria-labelledby="skills-h">
|
|
33
|
+
<h2 id="skills-h" class="scroll__h">Slash commands in Claude Code</h2>
|
|
34
|
+
<p class="scroll__lede">Type these in a Claude Code session on this project. Most also start when you simply say what you want in plain words.</p>
|
|
35
|
+
<div class="cmd-legend" aria-label="What the start-it markers mean">
|
|
36
|
+
<span><span class="fact-pill fact-pill--info">Shown to Claude</span> Claude can start it when you ask in plain words.</span>
|
|
37
|
+
<span><span class="fact-pill cmd-how--typed">Type it yourself</span> Kept out of Claude's menu to save room; type <code>/name</code> to run it.</span>
|
|
38
|
+
</div>
|
|
39
|
+
<div id="skills-body" aria-live="polite"><p class="cmd-error">Loading the slash commands…</p></div>
|
|
40
|
+
<p class="cmd-note">Having a command does not give you permission to use it: some refuse below a certain rank, and that is checked every time it runs.</p>
|
|
41
|
+
</section>
|
|
42
|
+
|
|
43
|
+
<section class="scroll" id="cli-scroll" aria-labelledby="cli-h">
|
|
44
|
+
<h2 id="cli-h" class="scroll__h">Terminal commands (bongos)</h2>
|
|
45
|
+
<p class="scroll__lede">The same work from any terminal, outside Claude Code. Run <code>bongos help</code> to see this list there.</p>
|
|
46
|
+
<div id="cli-body" aria-live="polite"><p class="cmd-error">Loading the terminal commands…</p></div>
|
|
47
|
+
</section>
|
|
48
|
+
</main>
|
|
49
|
+
|
|
50
|
+
<footer class="app-foot" id="app-foot"></footer>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
56
|
+
|
|
57
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
58
|
+
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
59
|
+
<script src="/builders/palette.js" defer></script>
|
|
60
|
+
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
61
|
+
<script src="/builders/hall-kit.js"></script>
|
|
62
|
+
<script src="/builders/commands-lib.js"></script>
|
|
63
|
+
<script src="/builders/commands.js"></script>
|
|
64
|
+
</body>
|
|
65
|
+
</html>
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// commands.js — the hall's Commands page (/builders/commands, task 1004473).
|
|
2
|
+
//
|
|
3
|
+
// Two reads, two tables, nothing typed by hand:
|
|
4
|
+
// * GET /api/bongos/specialities/installed-skills — every skill this instance
|
|
5
|
+
// has, read from disk (core + instance + ENABLED modules), each with its
|
|
6
|
+
// plain / reach-for / cost words and whether Claude is shown it;
|
|
7
|
+
// * GET /api/bongos/cli/commands — bin/bongos.js VERBS, grouped the way
|
|
8
|
+
// `bongos --help` groups them.
|
|
9
|
+
// The grouping and the table markup are OTBCommandsLib's (commands-lib.js), so a
|
|
10
|
+
// test can render the real lists without a browser. Each half fails on its own:
|
|
11
|
+
// a missing skills list does not take the CLI table down with it.
|
|
12
|
+
|
|
13
|
+
(() => {
|
|
14
|
+
'use strict';
|
|
15
|
+
|
|
16
|
+
const lib = window.OTBCommandsLib;
|
|
17
|
+
const esc = (window.OTBKit && window.OTBKit.esc) || ((s) => String(s == null ? '' : s)
|
|
18
|
+
.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, '''));
|
|
19
|
+
|
|
20
|
+
async function getJson(url) {
|
|
21
|
+
const r = await fetch(url, { credentials: 'same-origin' });
|
|
22
|
+
if (!r.ok) { const e = new Error(`HTTP ${r.status}`); e.status = r.status; throw e; }
|
|
23
|
+
return r.json();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function fail(el, what, err) {
|
|
27
|
+
const why = err && err.status === 404
|
|
28
|
+
? `The ${what} list is not available on this project.`
|
|
29
|
+
: `Could not load the ${what} list. Try reloading the page.`;
|
|
30
|
+
el.innerHTML = `<p class="cmd-error">${esc(why)}</p>`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function loadSkills() {
|
|
34
|
+
const el = document.getElementById('skills-body');
|
|
35
|
+
try {
|
|
36
|
+
const data = await getJson('/api/bongos/specialities/installed-skills');
|
|
37
|
+
const groups = lib.groupSkills(data.skills);
|
|
38
|
+
el.innerHTML = groups.length ? lib.skillsTableHtml(groups, { esc }) : '<p class="cmd-error">This project has no slash commands yet.</p>';
|
|
39
|
+
} catch (err) { fail(el, 'slash command', err); }
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async function loadCli() {
|
|
43
|
+
const el = document.getElementById('cli-body');
|
|
44
|
+
try {
|
|
45
|
+
const data = await getJson('/api/bongos/cli/commands');
|
|
46
|
+
el.innerHTML = lib.cliTableHtml(data.groups, { esc }) || '<p class="cmd-error">No terminal commands found.</p>';
|
|
47
|
+
} catch (err) { fail(el, 'terminal command', err); }
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
loadSkills();
|
|
51
|
+
loadCli();
|
|
52
|
+
})();
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_": "The Commands page (task 1004473): every skill and every bongos CLI verb as two grouped ledgers, filled from GET /specialities/installed-skills and GET /cli/commands. Against the kit's stub both reads 404, so the page renders its 'not available' state, which the floors must hold too. The populated look was verified against a real local server (bongos dev), since both lists are read from disk.",
|
|
3
|
+
"page": "/builders/commands",
|
|
4
|
+
"surface": "hall-ui",
|
|
5
|
+
"stub": { "prefix": "/builders/" },
|
|
6
|
+
"modeQuery": false,
|
|
7
|
+
"ignoreRequests": ["/api/(gds|bongos)/me$", "/api/(gds|bongos)/me/", "/api/(gds|bongos)/goals", "/api/(gds|bongos)/inbox/", "/api/(gds|bongos)/specialities/installed-skills", "/api/(gds|bongos)/cli/commands"],
|
|
8
|
+
"ignoreConsole": ["/api/(gds|bongos)/", "\\b401\\b", "\\b404\\b", "Unauthorized", "Not Found", "load failed"],
|
|
9
|
+
"states": {
|
|
10
|
+
"in": { "auth": true, "actions": [["wait", 600]], "expect": { "visible": ["#skills-scroll", "#cli-scroll"] } },
|
|
11
|
+
"out": { "auth": false }
|
|
12
|
+
},
|
|
13
|
+
"reducedMotion": { "auth": true, "actions": [["wait", 600]] }
|
|
14
|
+
}
|
|
@@ -177,7 +177,7 @@
|
|
|
177
177
|
|
|
178
178
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
179
179
|
|
|
180
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
180
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
181
181
|
<script src="/builders/palette.js" defer></script>
|
|
182
182
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
183
183
|
<script src="/builders/hall-kit.js"></script>
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
|
|
75
75
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
76
76
|
|
|
77
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
77
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
78
78
|
<script src="/builders/palette.js" defer></script>
|
|
79
79
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
80
80
|
<script src="/builders/hall-kit.js"></script>
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
|
|
98
98
|
<!-- The app shell (sidebar + top bar + footer). Dependency-free; runs at parse
|
|
99
99
|
time so the chrome exists before the deferred page scripts execute. -->
|
|
100
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
100
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
101
101
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
102
102
|
<script src="/builders/palette.js" defer></script>
|
|
103
103
|
<script src="/builders/diagram-viewer.js?v=2026-06-14-diagviewer-1" defer></script>
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
|
|
99
99
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
100
100
|
|
|
101
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
101
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
102
102
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
103
103
|
<script src="/builders/palette.js" defer></script>
|
|
104
104
|
<script src="/builders/md-reader.js?v=2026-09-02-mdreader-2"></script>
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
|
|
55
55
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
56
56
|
|
|
57
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
57
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
58
58
|
<script src="/builders/palette.js" defer></script>
|
|
59
59
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
60
60
|
<script src="/builders/hall-kit.js"></script>
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
<div id="gate-modal-root"></div>
|
|
77
77
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
78
78
|
|
|
79
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
79
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
80
80
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
81
81
|
<script src="/builders/palette.js" defer></script>
|
|
82
82
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
@@ -235,7 +235,7 @@
|
|
|
235
235
|
|
|
236
236
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
237
237
|
|
|
238
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
238
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
239
239
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
240
240
|
<script src="/builders/palette.js" defer></script>
|
|
241
241
|
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
@@ -134,7 +134,7 @@
|
|
|
134
134
|
|
|
135
135
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
136
136
|
|
|
137
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
137
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
138
138
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
139
139
|
<script src="/builders/palette.js" defer></script>
|
|
140
140
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
|
|
53
53
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
54
54
|
|
|
55
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
55
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
56
56
|
<script src="/builders/palette.js" defer></script>
|
|
57
57
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib" defer></script>
|
|
58
58
|
<!-- task-detail.js still owns the #/idea/N and #/blocker/N overlay, so a ref
|
|
@@ -225,7 +225,7 @@
|
|
|
225
225
|
|
|
226
226
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
227
227
|
|
|
228
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
228
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
229
229
|
<script src="/builders/palette.js" defer></script>
|
|
230
230
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
231
231
|
<!-- task 1003069 (R08) — the quick-filing form's routed result links a task
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
<script src="/builders/brand-apply.js?v=2026-06-27-r75" defer></script>
|
|
107
107
|
<!-- The app shell (sidebar + top bar + view router). Dependency-free; loaded
|
|
108
108
|
BEFORE builders.js so the chrome ids exist when events are wired. -->
|
|
109
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
109
|
+
<script src="/builders/shell.js?v=2026-09-30-commands" defer></script>
|
|
110
110
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
111
111
|
<script src="/builders/palette.js" defer></script>
|
|
112
112
|
<!-- task 2166: the shared component kit (window.OTBKit) — pager/ledger/rail.
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
|
|
81
81
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
82
82
|
|
|
83
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
83
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
84
84
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
85
85
|
<script src="/builders/palette.js" defer></script>
|
|
86
86
|
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
|
|
116
116
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
117
117
|
|
|
118
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
118
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
119
119
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
120
120
|
<script src="/builders/palette.js" defer></script>
|
|
121
121
|
<!-- the shared markdown reader (window.OTBMdReader) — primer.js renders through
|
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
|
|
188
188
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
189
189
|
chrome exists before the page script runs. -->
|
|
190
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
190
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
191
191
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
192
192
|
<script src="/builders/palette.js" defer></script>
|
|
193
193
|
<!-- shared frontend toolkit (window.OTB) — loaded before profile.js, which pulls from it. -->
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
|
|
59
59
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
60
60
|
|
|
61
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
61
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
62
62
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
63
63
|
<script src="/builders/palette.js" defer></script>
|
|
64
64
|
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
|
|
69
69
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
70
70
|
chrome exists before the page script runs. -->
|
|
71
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
71
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
72
72
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
73
73
|
<script src="/builders/palette.js" defer></script>
|
|
74
74
|
<!-- shared frontend toolkit (window.OTB) — loaded before ranks.js, which pulls from it. -->
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
|
|
42
42
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
43
43
|
|
|
44
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
44
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
45
45
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
46
46
|
<script src="/builders/palette.js" defer></script>
|
|
47
47
|
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
|
|
51
51
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
52
52
|
chrome exists before the page script runs. -->
|
|
53
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
53
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
54
54
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
55
55
|
<script src="/builders/palette.js" defer></script>
|
|
56
56
|
<!-- shared frontend toolkit (window.OTB — rank labels, number formats) + the
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
|
|
100
100
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
101
101
|
chrome exists before the page script runs. -->
|
|
102
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
102
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
103
103
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
104
104
|
<script src="/builders/palette.js" defer></script>
|
|
105
105
|
<!-- shared frontend toolkit (window.OTB) — loaded BEFORE sessions.js so it can pull from it. -->
|
|
@@ -400,7 +400,7 @@
|
|
|
400
400
|
|
|
401
401
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
402
402
|
chrome exists before the page scripts run. -->
|
|
403
|
-
<script src="/builders/shell.js?v=2026-09-
|
|
403
|
+
<script src="/builders/shell.js?v=2026-09-30-commands"></script>
|
|
404
404
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
405
405
|
<script src="/builders/palette.js" defer></script>
|
|
406
406
|
<!-- shared frontend toolkit (window.OTB) — loaded before consuming IIFEs. -->
|