@azure-id/orc 1.0.0 → 1.2.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.
- package/CHANGELOG.md +151 -0
- package/README.md +84 -34
- package/bin/cli.js +1110 -0
- package/bin/verify-contracts.js +112 -1
- package/bin/verify-package.js +568 -563
- package/bin/webui/api.js +15 -0
- package/bin/webui/app.html +210 -207
- package/bin/webui/css/panels/wait.css +123 -0
- package/bin/webui/fixtures/index.js +7 -0
- package/bin/webui/fixtures/wait.js +97 -0
- package/bin/webui/i18n/en/nav.json +21 -20
- package/bin/webui/i18n/en/wait.json +41 -0
- package/bin/webui/i18n/id/nav.json +21 -20
- package/bin/webui/i18n/id/wait.json +41 -0
- package/bin/webui/js/01-i18n.js +151 -150
- package/bin/webui/js/panels/wait.js +253 -0
- package/package.json +1 -1
- package/templates/commands/orc-wait.md +19 -0
- package/templates/hooks/orc-statusline.js +227 -1
- package/templates/skills/_shared/phases/execution.md +2 -0
- package/templates/skills/_shared/phases/preflight.md +22 -0
- package/templates/skills/_shared/return-validation.md +222 -145
- package/templates/skills/_shared/wait.md +240 -0
- package/templates/skills/orc/SKILL.md +247 -238
- package/templates/skills/orc-aftermath/SKILL.md +6 -1
- package/templates/skills/orc-analyze/SKILL.md +6 -1
- package/templates/skills/orc-boundary/SKILL.md +6 -1
- package/templates/skills/orc-brainstorm/SKILL.md +6 -1
- package/templates/skills/orc-budget/SKILL.md +6 -1
- package/templates/skills/orc-challenge/SKILL.md +6 -1
- package/templates/skills/orc-claude/SKILL.md +6 -1
- package/templates/skills/orc-diy/SKILL.md +6 -1
- package/templates/skills/orc-doc/SKILL.md +490 -481
- package/templates/skills/orc-explain/SKILL.md +5 -0
- package/templates/skills/orc-export/SKILL.md +5 -0
- package/templates/skills/orc-fast/SKILL.md +222 -215
- package/templates/skills/orc-grill/SKILL.md +6 -1
- package/templates/skills/orc-learn/SKILL.md +6 -1
- package/templates/skills/orc-mini/SKILL.md +252 -244
- package/templates/skills/orc-pact/SKILL.md +6 -1
- package/templates/skills/orc-pattern/SKILL.md +6 -1
- package/templates/skills/orc-poly/SKILL.md +6 -1
- package/templates/skills/orc-quick/SKILL.md +353 -346
- package/templates/skills/orc-retro/SKILL.md +6 -1
- package/templates/skills/orc-route/SKILL.md +6 -1
- package/templates/skills/orc-verify/SKILL.md +6 -1
- package/templates/skills/orc-wait/SKILL.md +163 -0
- package/templates/skills/orc-wiki/SKILL.md +180 -171
package/bin/webui/api.js
CHANGED
|
@@ -237,6 +237,14 @@ const READS = {
|
|
|
237
237
|
// Preview-then-apply: A COUNT IS NOT CONSENT. The Apply button stays disabled
|
|
238
238
|
// until this has been fetched, and it names every entry eviction would touch.
|
|
239
239
|
"/api/gotcha/prune/preview": () => ["gotcha", "prune", "--dry-run"],
|
|
240
|
+
// v1.1.0 — the wait. Three READS, and every one of them is a state the panel
|
|
241
|
+
// renders and never derives: `usage check` 0/1/2 (and `unknown` is a state,
|
|
242
|
+
// not a failure), the lane table, and the run's block. The panel CANNOT start
|
|
243
|
+
// a wait — a wait lives in a Claude Code session, and `orc ui` never runs a
|
|
244
|
+
// lane. It configures the defaults, shows a wait, and cancels one.
|
|
245
|
+
"/api/usage": () => ["usage", "check"],
|
|
246
|
+
"/api/wait/lanes": () => ["wait", "lanes"],
|
|
247
|
+
"/api/wait/status": (q) => (q.slug ? ["wait", "status", String(q.slug)] : ["wait", "status"]),
|
|
240
248
|
"/api/pact": () => ["pact", "status"],
|
|
241
249
|
"/api/boundary": (q) => (q.path ? ["boundary", "status", String(q.path)] : ["boundary", "status"]),
|
|
242
250
|
"/api/handoff": () => ["handoff", "surfaces"],
|
|
@@ -408,6 +416,13 @@ const WRITES = {
|
|
|
408
416
|
if (b.name) argv.push("--preset", String(b.name));
|
|
409
417
|
return argv;
|
|
410
418
|
},
|
|
419
|
+
// v1.1.0 — the only two wait mutations this panel may make, and neither
|
|
420
|
+
// starts one. `unblock` restores a gate the user vetoed; `cancel` ends a wait
|
|
421
|
+
// already running. A BLOCK cannot be created here on purpose: it needs a
|
|
422
|
+
// reason typed in the moment, and a reason typed into a settings page days
|
|
423
|
+
// later is not the record that makes the risk demonstrably the user's.
|
|
424
|
+
"/api/wait/unblock": (b) => (b.slug ? ["wait", "unblock", String(b.slug)] : ["wait", "unblock"]),
|
|
425
|
+
"/api/wait/cancel": (b) => (b.slug ? ["wait", "cancel", String(b.slug)] : ["wait", "cancel"]),
|
|
411
426
|
"/api/wiki/sync": () => ["wiki", "sync"],
|
|
412
427
|
"/api/wiki/usage/rebuild": () => ["wiki", "usage", "--rebuild"],
|
|
413
428
|
"/api/gotcha/prune": () => ["gotcha", "prune"],
|
package/bin/webui/app.html
CHANGED
|
@@ -1,207 +1,210 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en" data-theme="dark">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
-
<meta name="referrer" content="no-referrer">
|
|
7
|
-
<title>orc ui</title>
|
|
8
|
-
<!--
|
|
9
|
-
THE ASSET MANIFEST. This list is the load order, and for CSS the load order is
|
|
10
|
-
the cascade order — which is why the files carry numeric prefixes and why
|
|
11
|
-
06-responsive and 04-motion are last (both override rules from the shell AND
|
|
12
|
-
from panels, and several of their declarations are deliberately not
|
|
13
|
-
!important). One <link> per file, never @import: an @import request carries no
|
|
14
|
-
session token of its own and would 401.
|
|
15
|
-
|
|
16
|
-
A file that is not listed here does not run, and the test suite reads THIS
|
|
17
|
-
list — appJs()/appCss() in test/_helpers.js concatenate exactly what the
|
|
18
|
-
browser loads, so a forgotten entry cannot hide behind a passing suite.
|
|
19
|
-
-->
|
|
20
|
-
<link rel="stylesheet" href="css/00-tokens.css">
|
|
21
|
-
<link rel="stylesheet" href="css/01-base.css">
|
|
22
|
-
<link rel="stylesheet" href="css/02-shell.css">
|
|
23
|
-
<link rel="stylesheet" href="css/03-components.css">
|
|
24
|
-
<link rel="stylesheet" href="css/panels/overview.css">
|
|
25
|
-
<link rel="stylesheet" href="css/05-tour.css">
|
|
26
|
-
<link rel="stylesheet" href="css/panels/settings.css">
|
|
27
|
-
<link rel="stylesheet" href="css/panels/lanes.css">
|
|
28
|
-
<link rel="stylesheet" href="css/panels/runs.css">
|
|
29
|
-
<link rel="stylesheet" href="css/panels/knowledge.css">
|
|
30
|
-
<link rel="stylesheet" href="css/panels/stats.css">
|
|
31
|
-
<link rel="stylesheet" href="css/panels/flow.css">
|
|
32
|
-
<link rel="stylesheet" href="css/panels/crosslink.css">
|
|
33
|
-
<link rel="stylesheet" href="css/panels/learn.css">
|
|
34
|
-
<link rel="stylesheet" href="css/panels/mockrun.css">
|
|
35
|
-
<link rel="stylesheet" href="css/panels/experiment.css">
|
|
36
|
-
<link rel="stylesheet" href="css/panels/maintenance.css">
|
|
37
|
-
<link rel="stylesheet" href="css/panels/pact.css">
|
|
38
|
-
<link rel="stylesheet" href="css/panels/boundary.css">
|
|
39
|
-
<link rel="stylesheet" href="css/panels/
|
|
40
|
-
<link rel="stylesheet" href="css/panels/
|
|
41
|
-
<link rel="stylesheet" href="css/panels/
|
|
42
|
-
<link rel="stylesheet" href="css/panels/
|
|
43
|
-
<link rel="stylesheet" href="css/
|
|
44
|
-
<link rel="stylesheet" href="css/
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
<span class="brand-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
<li><a href="#/
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
which
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
<li><a href="#/
|
|
81
|
-
<li><a href="#/
|
|
82
|
-
<li><a href="#/
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
<li><a href="#/
|
|
98
|
-
<li><a href="#/
|
|
99
|
-
<li><a href="#/
|
|
100
|
-
<li><a href="#/
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
<li><a href="#/
|
|
110
|
-
<li><a href="#/
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
<li><a href="#/
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
<div class="rail-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
<div id="
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
</
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
<
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
<script src="js/
|
|
181
|
-
<script src="js/
|
|
182
|
-
<script src="js/
|
|
183
|
-
<script src="js/
|
|
184
|
-
<script src="js/
|
|
185
|
-
<script src="js/
|
|
186
|
-
<script src="js/
|
|
187
|
-
<script src="js/panels/
|
|
188
|
-
<script src="js/panels/
|
|
189
|
-
<script src="js/panels/
|
|
190
|
-
<script src="js/panels/
|
|
191
|
-
<script src="js/panels/
|
|
192
|
-
<script src="js/panels/
|
|
193
|
-
<script src="js/panels/
|
|
194
|
-
<script src="js/panels/
|
|
195
|
-
<script src="js/panels/
|
|
196
|
-
<script src="js/panels/
|
|
197
|
-
<script src="js/panels/
|
|
198
|
-
<script src="js/panels/
|
|
199
|
-
<script src="js/panels/
|
|
200
|
-
<script src="js/panels/
|
|
201
|
-
<script src="js/panels/
|
|
202
|
-
<script src="js/panels/
|
|
203
|
-
<script src="js/
|
|
204
|
-
<script src="js/
|
|
205
|
-
<script src="js/
|
|
206
|
-
|
|
207
|
-
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en" data-theme="dark">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<meta name="referrer" content="no-referrer">
|
|
7
|
+
<title>orc ui</title>
|
|
8
|
+
<!--
|
|
9
|
+
THE ASSET MANIFEST. This list is the load order, and for CSS the load order is
|
|
10
|
+
the cascade order — which is why the files carry numeric prefixes and why
|
|
11
|
+
06-responsive and 04-motion are last (both override rules from the shell AND
|
|
12
|
+
from panels, and several of their declarations are deliberately not
|
|
13
|
+
!important). One <link> per file, never @import: an @import request carries no
|
|
14
|
+
session token of its own and would 401.
|
|
15
|
+
|
|
16
|
+
A file that is not listed here does not run, and the test suite reads THIS
|
|
17
|
+
list — appJs()/appCss() in test/_helpers.js concatenate exactly what the
|
|
18
|
+
browser loads, so a forgotten entry cannot hide behind a passing suite.
|
|
19
|
+
-->
|
|
20
|
+
<link rel="stylesheet" href="css/00-tokens.css">
|
|
21
|
+
<link rel="stylesheet" href="css/01-base.css">
|
|
22
|
+
<link rel="stylesheet" href="css/02-shell.css">
|
|
23
|
+
<link rel="stylesheet" href="css/03-components.css">
|
|
24
|
+
<link rel="stylesheet" href="css/panels/overview.css">
|
|
25
|
+
<link rel="stylesheet" href="css/05-tour.css">
|
|
26
|
+
<link rel="stylesheet" href="css/panels/settings.css">
|
|
27
|
+
<link rel="stylesheet" href="css/panels/lanes.css">
|
|
28
|
+
<link rel="stylesheet" href="css/panels/runs.css">
|
|
29
|
+
<link rel="stylesheet" href="css/panels/knowledge.css">
|
|
30
|
+
<link rel="stylesheet" href="css/panels/stats.css">
|
|
31
|
+
<link rel="stylesheet" href="css/panels/flow.css">
|
|
32
|
+
<link rel="stylesheet" href="css/panels/crosslink.css">
|
|
33
|
+
<link rel="stylesheet" href="css/panels/learn.css">
|
|
34
|
+
<link rel="stylesheet" href="css/panels/mockrun.css">
|
|
35
|
+
<link rel="stylesheet" href="css/panels/experiment.css">
|
|
36
|
+
<link rel="stylesheet" href="css/panels/maintenance.css">
|
|
37
|
+
<link rel="stylesheet" href="css/panels/pact.css">
|
|
38
|
+
<link rel="stylesheet" href="css/panels/boundary.css">
|
|
39
|
+
<link rel="stylesheet" href="css/panels/wait.css">
|
|
40
|
+
<link rel="stylesheet" href="css/panels/handoff.css">
|
|
41
|
+
<link rel="stylesheet" href="css/panels/challenge.css">
|
|
42
|
+
<link rel="stylesheet" href="css/panels/docs.css">
|
|
43
|
+
<link rel="stylesheet" href="css/panels/extra.css">
|
|
44
|
+
<link rel="stylesheet" href="css/06-responsive.css">
|
|
45
|
+
<link rel="stylesheet" href="css/04-motion.css">
|
|
46
|
+
</head>
|
|
47
|
+
<body>
|
|
48
|
+
|
|
49
|
+
<!--
|
|
50
|
+
The shell is deliberately static and small: every panel is rendered by its own
|
|
51
|
+
function in app.js against its own endpoint, with no shared mutable state, so
|
|
52
|
+
rewriting one panel cannot break another. See the plan, §9.
|
|
53
|
+
No inline <script> or style="" anywhere — the server sends a strict CSP.
|
|
54
|
+
-->
|
|
55
|
+
|
|
56
|
+
<div class="shell">
|
|
57
|
+
|
|
58
|
+
<nav class="rail" aria-label="Panels">
|
|
59
|
+
<div class="brand">
|
|
60
|
+
<span class="brand-mark" aria-hidden="true">◆</span>
|
|
61
|
+
<span class="brand-text">orc<span class="brand-dim"> ui</span></span>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<!--
|
|
65
|
+
data-idx is the keyboard shortcut for that panel; the rail reveals the
|
|
66
|
+
numbers on hover so they are discoverable without a legend.
|
|
67
|
+
data-i18n names the string table entry: the text between the tags is the
|
|
68
|
+
English fallback that ships in the markup, so a failed i18n fetch renders
|
|
69
|
+
a readable English rail rather than a column of empty links.
|
|
70
|
+
-->
|
|
71
|
+
<ul class="nav" id="nav">
|
|
72
|
+
<li><a href="#/overview" data-panel="overview" data-idx="1" data-i18n="nav.overview">Overview</a></li>
|
|
73
|
+
<li><a href="#/settings" data-panel="settings" data-idx="2" data-i18n="nav.settings">Settings</a></li>
|
|
74
|
+
<!--
|
|
75
|
+
v1.0.0 W16. Lanes sits directly under Settings because it answers the
|
|
76
|
+
other half of the same question. Settings says what a key resolves to
|
|
77
|
+
and which lanes read it; this says what those lanes then DO with it —
|
|
78
|
+
which shared phases they run, in order, and which CLI calls they make.
|
|
79
|
+
-->
|
|
80
|
+
<li><a href="#/lanes" data-panel="lanes" data-idx="l" data-i18n="nav.lanes">Lanes</a></li>
|
|
81
|
+
<li><a href="#/runs" data-panel="runs" data-idx="3" data-i18n="nav.runs">Runs</a></li>
|
|
82
|
+
<li><a href="#/knowledge" data-panel="knowledge" data-idx="4" data-i18n="nav.knowledge">Knowledge</a></li>
|
|
83
|
+
<li><a href="#/stats" data-panel="stats" data-idx="5" data-i18n="nav.stats">Stats</a></li>
|
|
84
|
+
<!--
|
|
85
|
+
v0.46.0. Promises and Boundary sit next to Knowledge because they ARE
|
|
86
|
+
knowledge — derived, coverage-anchored, and stale the same way a wiki doc
|
|
87
|
+
is. Self-serve sits last of the three: it is the only panel here aimed at
|
|
88
|
+
somebody who does not read code, and it is the one a developer opens
|
|
89
|
+
least often.
|
|
90
|
+
-->
|
|
91
|
+
<!--
|
|
92
|
+
v0.48.0. Docs sits directly above Challenge because that is the order
|
|
93
|
+
the two are used in: you write a document, then you grade it — and the
|
|
94
|
+
grading has to happen in a different session, which is the one thing
|
|
95
|
+
both panels say out loud.
|
|
96
|
+
-->
|
|
97
|
+
<li><a href="#/docs" data-panel="docs" data-idx="d" data-i18n="nav.docs">Docs</a></li>
|
|
98
|
+
<li><a href="#/challenge" data-panel="challenge" data-idx="c" data-i18n="nav.challenge">Challenge</a></li>
|
|
99
|
+
<li><a href="#/pact" data-panel="pact" data-idx="p" data-i18n="nav.pact">Promises</a></li>
|
|
100
|
+
<li><a href="#/boundary" data-panel="boundary" data-idx="b" data-i18n="nav.boundary">Boundary</a></li>
|
|
101
|
+
<li><a href="#/wait" data-panel="wait" data-idx="w" data-i18n="nav.wait">Wait</a></li>
|
|
102
|
+
<li><a href="#/handoff" data-panel="handoff" data-idx="h" data-i18n="nav.handoff">Self-serve</a></li>
|
|
103
|
+
<!--
|
|
104
|
+
v0.50.0. Extra sits directly above Flow because both answer the same
|
|
105
|
+
question — WHERE does a task run — and this is the one that can send it
|
|
106
|
+
off this machine. It is the last thing above the composer for that
|
|
107
|
+
reason, never buried under the reading panels.
|
|
108
|
+
-->
|
|
109
|
+
<li><a href="#/extra" data-panel="extra" data-idx="e" data-i18n="nav.extra">Extra</a></li>
|
|
110
|
+
<li><a href="#/flow" data-panel="flow" data-idx="6" data-i18n="nav.flow">Flow</a></li>
|
|
111
|
+
<li><a href="#/crosslink" data-panel="crosslink" data-idx="7" data-i18n="nav.crosslink">Crosslink</a></li>
|
|
112
|
+
<li><a href="#/learn" data-panel="learn" data-idx="8" data-i18n="nav.learn">Learn</a></li>
|
|
113
|
+
<!--
|
|
114
|
+
Next to Learn because it is the same kind of thing: reading, not doing.
|
|
115
|
+
The walkthroughs ship with the package, so this panel works on a machine
|
|
116
|
+
with no project at all — the same as Learn and unlike every other panel.
|
|
117
|
+
-->
|
|
118
|
+
<li><a href="#/mockrun" data-panel="mockrun" data-idx="m" data-i18n="nav.mockrun">Mocked Skill Use</a></li>
|
|
119
|
+
<li><a href="#/experiment" data-panel="experiment" data-idx="9" data-i18n="nav.experiment">Experiment</a></li>
|
|
120
|
+
<li><a href="#/maintenance" data-panel="maintenance" data-idx="0" data-i18n="nav.maintenance">Maintenance</a></li>
|
|
121
|
+
</ul>
|
|
122
|
+
|
|
123
|
+
<div class="rail-foot">
|
|
124
|
+
<div class="rail-project" id="rail-project" title="">—</div>
|
|
125
|
+
<div class="rail-version" id="rail-version"></div>
|
|
126
|
+
<div class="rail-buttons">
|
|
127
|
+
<button class="btn btn-ghost btn-sm" id="theme-toggle" type="button">Light</button>
|
|
128
|
+
<button class="btn btn-ghost btn-sm" id="shortcut-hint" type="button" title="Keyboard shortcuts">?</button>
|
|
129
|
+
</div>
|
|
130
|
+
<!--
|
|
131
|
+
Language sits BELOW the theme row on purpose: it is the same class of
|
|
132
|
+
control (a per-browser display preference, never a project setting) and
|
|
133
|
+
it is switched far less often, so it gets the calmer position.
|
|
134
|
+
-->
|
|
135
|
+
<div class="rail-buttons">
|
|
136
|
+
<button class="btn btn-ghost btn-sm lang-btn" id="lang-toggle" type="button">
|
|
137
|
+
<span class="lang-globe" aria-hidden="true">🌐</span><span id="lang-label">English</span>
|
|
138
|
+
</button>
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
</nav>
|
|
142
|
+
|
|
143
|
+
<main class="main">
|
|
144
|
+
<!--
|
|
145
|
+
Global banner slot. The one thing that must be visible on EVERY panel is
|
|
146
|
+
the global-install warning: if ORC is installed globally, the skills that
|
|
147
|
+
actually run may be the global copy reading the global config, while this
|
|
148
|
+
panel edits the project one that nothing reads.
|
|
149
|
+
-->
|
|
150
|
+
<div id="banners" class="banners"></div>
|
|
151
|
+
|
|
152
|
+
<div id="panel" class="panel" aria-live="polite"></div>
|
|
153
|
+
</main>
|
|
154
|
+
|
|
155
|
+
</div>
|
|
156
|
+
|
|
157
|
+
<!-- Single modal host. Every confirmation and preview renders into it. -->
|
|
158
|
+
<div class="modal-host" id="modal-host" hidden>
|
|
159
|
+
<div class="modal-backdrop" id="modal-backdrop"></div>
|
|
160
|
+
<div class="modal" role="dialog" aria-modal="true" aria-labelledby="modal-title">
|
|
161
|
+
<h2 class="modal-title" id="modal-title"></h2>
|
|
162
|
+
<div class="modal-body" id="modal-body"></div>
|
|
163
|
+
<div class="modal-foot" id="modal-foot"></div>
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
<!-- Transient confirmations (a committed setting, a failed write). -->
|
|
168
|
+
<div class="toasts" id="toasts" aria-live="polite"></div>
|
|
169
|
+
|
|
170
|
+
<!--
|
|
171
|
+
Classic scripts in an explicit load order — no type="module" anywhere. An ES
|
|
172
|
+
module `import` carries no query string, so every import would 401 against the
|
|
173
|
+
per-launch token unless static auth were weakened, and weakening it is not on
|
|
174
|
+
the table. Classic scripts also mean every top-level function and const lands
|
|
175
|
+
in ONE shared global scope, so the split needed no import/export and changed
|
|
176
|
+
no call site.
|
|
177
|
+
|
|
178
|
+
99-boot.js is last because boot() is the one call that runs at load time.
|
|
179
|
+
-->
|
|
180
|
+
<script src="js/00-core.js"></script>
|
|
181
|
+
<script src="js/01-i18n.js"></script>
|
|
182
|
+
<script src="js/02-ui.js"></script>
|
|
183
|
+
<script src="js/03-md.js"></script>
|
|
184
|
+
<script src="js/04-router.js"></script>
|
|
185
|
+
<script src="js/05-banners.js"></script>
|
|
186
|
+
<script src="js/06-edit.js"></script>
|
|
187
|
+
<script src="js/panels/overview.js"></script>
|
|
188
|
+
<script src="js/panels/settings.js"></script>
|
|
189
|
+
<script src="js/panels/lanes.js"></script>
|
|
190
|
+
<script src="js/panels/runs.js"></script>
|
|
191
|
+
<script src="js/panels/knowledge.js"></script>
|
|
192
|
+
<script src="js/panels/stats.js"></script>
|
|
193
|
+
<script src="js/panels/flow.js"></script>
|
|
194
|
+
<script src="js/panels/crosslink.js"></script>
|
|
195
|
+
<script src="js/panels/learn.js"></script>
|
|
196
|
+
<script src="js/panels/mockrun.js"></script>
|
|
197
|
+
<script src="js/panels/experiment.js"></script>
|
|
198
|
+
<script src="js/panels/maintenance.js"></script>
|
|
199
|
+
<script src="js/panels/pact.js"></script>
|
|
200
|
+
<script src="js/panels/boundary.js"></script>
|
|
201
|
+
<script src="js/panels/handoff.js"></script>
|
|
202
|
+
<script src="js/panels/challenge.js"></script>
|
|
203
|
+
<script src="js/panels/docs.js"></script>
|
|
204
|
+
<script src="js/panels/extra.js"></script>
|
|
205
|
+
<script src="js/panels/wait.js"></script>
|
|
206
|
+
<script src="js/90-tour.js"></script>
|
|
207
|
+
<script src="js/91-shortcuts.js"></script>
|
|
208
|
+
<script src="js/99-boot.js"></script>
|
|
209
|
+
</body>
|
|
210
|
+
</html>
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/* wait.css — the usage window and the wait.
|
|
2
|
+
Loaded from app.html in manifest order; every colour here is a token from
|
|
3
|
+
00-tokens.css, defined once on bare :root. */
|
|
4
|
+
|
|
5
|
+
/* The window rows. A FLEX COLUMN, not a declared grid: the card's child count
|
|
6
|
+
changes with its state (unknown has no bars at all), and a card whose child
|
|
7
|
+
count changes must not declare its rows — that is the `.ex-tool` 250px
|
|
8
|
+
ellipse, and it hit whichever card had the shortest content. */
|
|
9
|
+
.wait-windows {
|
|
10
|
+
display: flex;
|
|
11
|
+
flex-direction: column;
|
|
12
|
+
gap: 10px;
|
|
13
|
+
margin: 10px 0;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.wait-win {
|
|
17
|
+
display: flex;
|
|
18
|
+
align-items: center;
|
|
19
|
+
gap: 10px;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.wait-win-label {
|
|
23
|
+
flex: 0 0 2.5rem;
|
|
24
|
+
font-size: 12px;
|
|
25
|
+
color: var(--text-dim);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* THE BAR IS A WIDTH INSIDE THE ROW. A proportional bar that shares the row
|
|
29
|
+
with a min-width floor ends up fighting it, and something gets clipped. */
|
|
30
|
+
.wait-bar-wrap {
|
|
31
|
+
flex: 1 1 auto;
|
|
32
|
+
min-width: 0;
|
|
33
|
+
display: flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
gap: 10px;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.wait-bar {
|
|
39
|
+
flex: 1 1 auto;
|
|
40
|
+
min-width: 0;
|
|
41
|
+
height: 8px;
|
|
42
|
+
border-radius: 4px;
|
|
43
|
+
background: var(--surface-2);
|
|
44
|
+
overflow: hidden;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.wait-bar-fill {
|
|
48
|
+
height: 100%;
|
|
49
|
+
background: var(--accent);
|
|
50
|
+
border-radius: 4px;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.wait-bar.low .wait-bar-fill {
|
|
54
|
+
background: var(--warn);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.wait-bar-text {
|
|
58
|
+
flex: 0 0 auto;
|
|
59
|
+
font-size: 12px;
|
|
60
|
+
color: var(--text-dim);
|
|
61
|
+
font-variant-numeric: tabular-nums;
|
|
62
|
+
white-space: nowrap;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* The block. It is a standing decision with a reason, so it reads as a quoted
|
|
66
|
+
record rather than as an error. */
|
|
67
|
+
.wait-block {
|
|
68
|
+
margin-top: 12px;
|
|
69
|
+
padding: 10px 12px;
|
|
70
|
+
border-left: 3px solid var(--warn);
|
|
71
|
+
background: var(--surface-2);
|
|
72
|
+
border-radius: 0 6px 6px 0;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.wait-block-head {
|
|
76
|
+
font-size: 12px;
|
|
77
|
+
font-weight: 600;
|
|
78
|
+
color: var(--text-dim);
|
|
79
|
+
margin-bottom: 4px;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* VERBATIM, and it can be long — a reason nobody can read is not a record. */
|
|
83
|
+
.wait-block-reason {
|
|
84
|
+
font-size: 13px;
|
|
85
|
+
line-height: 1.5;
|
|
86
|
+
overflow-wrap: anywhere;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* The lane table. Every row keeps its slot, including `none`. */
|
|
90
|
+
.wait-lanes {
|
|
91
|
+
display: flex;
|
|
92
|
+
flex-direction: column;
|
|
93
|
+
gap: 8px;
|
|
94
|
+
margin: 10px 0;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.wait-lane {
|
|
98
|
+
display: flex;
|
|
99
|
+
flex-wrap: wrap;
|
|
100
|
+
align-items: center;
|
|
101
|
+
gap: 8px;
|
|
102
|
+
padding: 8px 0;
|
|
103
|
+
border-bottom: 1px solid var(--line-soft);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.wait-lane:last-child {
|
|
107
|
+
border-bottom: 0;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.wait-lane-name {
|
|
111
|
+
flex: 0 0 10rem;
|
|
112
|
+
font-size: 12px;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.wait-lane-safe {
|
|
116
|
+
font-size: 12px;
|
|
117
|
+
color: var(--text-dim);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.wait-lane-detail {
|
|
121
|
+
flex: 1 1 100%;
|
|
122
|
+
margin: 0;
|
|
123
|
+
}
|
|
@@ -26,6 +26,7 @@ const { runs, runDetail, runDetailClosed, aftermath } = require("./runs.js");
|
|
|
26
26
|
const { stats, budgetForecast, budgetRates } = require("./stats.js");
|
|
27
27
|
const { pact } = require("./pact.js");
|
|
28
28
|
const { boundary } = require("./boundary.js");
|
|
29
|
+
const { usage, waitLanes, waitStatus } = require("./wait.js");
|
|
29
30
|
const { handoff } = require("./handoff.js");
|
|
30
31
|
const { exportState, mocks } = require("./maintenance.js");
|
|
31
32
|
const { chGoals, chDims, challengeRoles, challengeCouncil, challengeCycles, challengeList, challengeShow, challengeDiff, challengeDiffMissing, challengeLint } = require("./challenge.js");
|
|
@@ -199,6 +200,12 @@ module.exports.get = function get(route, q) {
|
|
|
199
200
|
return { where, doctor, wiki, patterns: patterns, runs_total: runs.total, waiting: runs.runs.filter((r) => r.status === "waiting").map((r) => ({ slug: r.slug, updated_ms: r.updated_ms, lane: r.lane })), diy, pact, boundary, wiki_debt: wikiDebt, extra_journal: extraJournal };
|
|
200
201
|
case "/api/pact":
|
|
201
202
|
return pact;
|
|
203
|
+
case "/api/usage":
|
|
204
|
+
return usage;
|
|
205
|
+
case "/api/wait/lanes":
|
|
206
|
+
return waitLanes;
|
|
207
|
+
case "/api/wait/status":
|
|
208
|
+
return waitStatus;
|
|
202
209
|
case "/api/boundary":
|
|
203
210
|
return boundary;
|
|
204
211
|
case "/api/handoff":
|