Skip to content

Commit 372de0e

Browse files
committed
feat: promote planner controls and lock command deck shell
1 parent b2ffafa commit 372de0e

13 files changed

Lines changed: 535 additions & 551 deletions

File tree

apps/dashboard/README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,12 @@ repository is already a finished consumer product.
4242

4343
- PM workspace: registry-driven task-pack selection plus `execution_plan_report`
4444
preview before execution starts.
45-
- Planner desk: a first-class planner-facing route that pulls `planning_wave_plan`,
46-
`planning_worker_prompt_contracts`, `planning_unblock_tasks`, and
47-
`completion_governance_report` back into one read-only planning surface
48-
instead of leaving them trapped inside PM sidebars and run detail.
45+
- Planner desk: a first-class planner-facing triage route that pulls
46+
`planning_wave_plan`, `planning_worker_prompt_contracts`,
47+
`planning_unblock_tasks`, and `completion_governance_report` into one
48+
planning control desk, now with inline queue / dispatch controls so planners
49+
can act on the next contract instead of only reading artifacts and clicking
50+
away to other desks.
4951
- Agents: the first-screen role catalog now also hosts a repo-owned role
5052
configuration desk for previewing and saving future compiled defaults
5153
(`system_prompt_ref`, bundle refs, and role-level runtime binding) while

apps/dashboard/app/globals.tokens.css

Lines changed: 62 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -2,77 +2,77 @@
22
@import "./globals.responsive.css";
33

44
/* =========================================
5-
CortexPilot Command Tower Command Center — Design Tokens
6-
Light-first, clean white aesthetic
5+
OpenVibeCoding Command Tower — Design Tokens
6+
Dark-neutral command deck baseline
77
========================================= */
88

99
:root {
10-
color-scheme: light;
10+
color-scheme: dark;
1111

1212
/* ── Core Palette ── */
13-
--color-bg: #f9fafb;
14-
--color-bg-elevated: #ffffff;
15-
--color-bg-surface: #f3f4f6;
16-
--color-surface-subtle: #f3f4f6;
17-
--color-surface-hover: #e5e7eb;
18-
19-
--color-text-primary: #111827;
20-
--color-text-secondary: #4b5563;
21-
--color-text-muted: #4b5563;
22-
--color-text-tertiary: #52525b;
23-
24-
--color-primary: #2563eb;
25-
--color-primary-hover: #1d4ed8;
26-
--color-primary-soft: rgba(37, 99, 235, 0.08);
27-
--color-primary-muted: rgba(37, 99, 235, 0.04);
28-
29-
--color-border: #e5e7eb;
30-
--color-border-strong: #d1d5db;
31-
--color-border-subtle: #f3f4f6;
32-
--color-focus-ring: #2563eb;
13+
--color-bg: #0b1220;
14+
--color-bg-elevated: #111a2e;
15+
--color-bg-surface: #17233b;
16+
--color-surface-subtle: #142038;
17+
--color-surface-hover: #1b2a45;
18+
19+
--color-text-primary: #e8eef8;
20+
--color-text-secondary: #b7c6db;
21+
--color-text-muted: #9fb0c8;
22+
--color-text-tertiary: #8396b3;
23+
24+
--color-primary: #1fb981;
25+
--color-primary-hover: #17a16f;
26+
--color-primary-soft: rgba(31, 185, 129, 0.12);
27+
--color-primary-muted: rgba(31, 185, 129, 0.06);
28+
29+
--color-border: rgba(159, 176, 200, 0.16);
30+
--color-border-strong: rgba(159, 176, 200, 0.28);
31+
--color-border-subtle: rgba(159, 176, 200, 0.1);
32+
--color-focus-ring: #1fb981;
3333

3434
/* ── Semantic Status ── */
35-
--color-success: #059669;
36-
--color-success-bg: rgba(5, 150, 105, 0.06);
37-
--color-success-ink: #065f46;
38-
--color-warning: #d97706;
39-
--color-warning-bg: rgba(217, 119, 6, 0.06);
40-
--color-warning-ink: #92400e;
41-
--color-danger: #dc2626;
42-
--color-danger-bg: rgba(220, 38, 38, 0.05);
43-
--color-danger-ink: #b91c1c;
44-
--color-info-bg: rgba(37, 99, 235, 0.05);
45-
--color-bg-glass: rgba(249, 250, 251, 0.85);
46-
--color-bg-overlay: rgba(0, 0, 0, 0.2);
47-
--color-text-on-primary: #ffffff;
48-
--color-border-success-soft: rgba(5, 150, 105, 0.2);
49-
--color-border-primary-soft: rgba(37, 99, 235, 0.2);
50-
--color-border-danger-soft: rgba(220, 38, 38, 0.2);
51-
--color-border-warning-soft: rgba(217, 119, 6, 0.2);
52-
--color-border-danger-mid: rgba(239, 68, 68, 0.3);
53-
--color-border-warning-mid: rgba(234, 179, 8, 0.3);
54-
--color-border-info-mid: rgba(59, 130, 246, 0.3);
55-
--color-border-primary-mid: rgba(59, 130, 246, 0.4);
56-
--color-border-success-mid: rgba(34, 197, 94, 0.3);
57-
--color-border-success-strong: rgba(34, 197, 94, 0.4);
58-
--color-gradient-primary-soft: linear-gradient(160deg, rgba(37, 99, 235, 0.015) 0%, transparent 50%);
35+
--color-success: #1fb981;
36+
--color-success-bg: rgba(31, 185, 129, 0.12);
37+
--color-success-ink: #7fe0b7;
38+
--color-warning: #e59a2f;
39+
--color-warning-bg: rgba(229, 154, 47, 0.12);
40+
--color-warning-ink: #f2c27d;
41+
--color-danger: #d95c5c;
42+
--color-danger-bg: rgba(217, 92, 92, 0.12);
43+
--color-danger-ink: #f0aaaa;
44+
--color-info-bg: rgba(31, 185, 129, 0.08);
45+
--color-bg-glass: rgba(17, 26, 46, 0.84);
46+
--color-bg-overlay: rgba(8, 12, 22, 0.5);
47+
--color-text-on-primary: #08131c;
48+
--color-border-success-soft: rgba(31, 185, 129, 0.28);
49+
--color-border-primary-soft: rgba(31, 185, 129, 0.24);
50+
--color-border-danger-soft: rgba(217, 92, 92, 0.24);
51+
--color-border-warning-soft: rgba(229, 154, 47, 0.24);
52+
--color-border-danger-mid: rgba(217, 92, 92, 0.34);
53+
--color-border-warning-mid: rgba(229, 154, 47, 0.34);
54+
--color-border-info-mid: rgba(31, 185, 129, 0.3);
55+
--color-border-primary-mid: rgba(31, 185, 129, 0.4);
56+
--color-border-success-mid: rgba(31, 185, 129, 0.4);
57+
--color-border-success-strong: rgba(31, 185, 129, 0.5);
58+
--color-gradient-primary-soft: linear-gradient(160deg, rgba(31, 185, 129, 0.08) 0%, transparent 55%);
5959
--color-gradient-dark-overlay: linear-gradient(160deg, rgba(255, 255, 255, 0.04) 0%, transparent 50%);
60-
--color-app-bg-radial-indigo: color-mix(in srgb, var(--color-primary) 16%, transparent);
61-
--color-app-bg-radial-cyan: color-mix(in srgb, var(--color-success) 14%, transparent);
62-
--color-app-bg-base-start: color-mix(in srgb, var(--color-bg-elevated) 88%, var(--color-bg));
63-
--color-app-bg-base-mid: color-mix(in srgb, var(--color-bg-surface) 56%, var(--color-bg-elevated));
64-
--color-app-bg-base-end: var(--color-bg-surface);
65-
--color-app-grid-line: color-mix(in srgb, var(--color-border) 18%, transparent);
66-
--shadow-pulse-start: 0 0 0 0 rgba(59, 130, 246, 0.25);
67-
--shadow-pulse-mid: 0 0 0 8px rgba(59, 130, 246, 0);
68-
--shadow-pulse-end: 0 0 0 0 rgba(59, 130, 246, 0);
60+
--color-app-bg-radial-indigo: color-mix(in srgb, var(--color-primary) 18%, transparent);
61+
--color-app-bg-radial-cyan: color-mix(in srgb, var(--color-warning) 10%, transparent);
62+
--color-app-bg-base-start: color-mix(in srgb, var(--color-bg-elevated) 94%, var(--color-bg));
63+
--color-app-bg-base-mid: color-mix(in srgb, var(--color-bg-surface) 64%, var(--color-bg-elevated));
64+
--color-app-bg-base-end: var(--color-bg);
65+
--color-app-grid-line: color-mix(in srgb, var(--color-border) 55%, transparent);
66+
--shadow-pulse-start: 0 0 0 0 rgba(31, 185, 129, 0.25);
67+
--shadow-pulse-mid: 0 0 0 8px rgba(31, 185, 129, 0);
68+
--shadow-pulse-end: 0 0 0 0 rgba(31, 185, 129, 0);
6969

7070
/* ── Shadows ── */
71-
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
72-
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.07), 0 2px 4px -2px rgba(0, 0, 0, 0.05);
73-
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -4px rgba(0, 0, 0, 0.04);
74-
--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.08), 0 8px 10px -6px rgba(0, 0, 0, 0.04);
75-
--shadow-glow-primary: 0 0 20px rgba(37, 99, 235, 0.08);
71+
--shadow-sm: 0 1px 2px rgba(4, 7, 13, 0.38), 0 0 0 1px rgba(232, 238, 248, 0.03);
72+
--shadow-md: 0 6px 18px rgba(4, 7, 13, 0.42), 0 0 0 1px rgba(232, 238, 248, 0.04);
73+
--shadow-lg: 0 14px 36px rgba(4, 7, 13, 0.48), 0 0 0 1px rgba(232, 238, 248, 0.05);
74+
--shadow-xl: 0 24px 54px rgba(4, 7, 13, 0.55);
75+
--shadow-glow-primary: 0 0 18px rgba(31, 185, 129, 0.14);
7676

7777
/* ── Radius ── */
7878
--radius-xs: 4px;
@@ -167,61 +167,6 @@
167167
--danger-bg: var(--color-danger-bg);
168168
}
169169

170-
/* ── Dark Mode Override ── */
171-
@media (prefers-color-scheme: dark) {
172-
:root {
173-
color-scheme: dark;
174-
--color-bg: #09090b;
175-
--color-bg-elevated: #0f0f11;
176-
--color-bg-surface: #161618;
177-
--color-surface-subtle: #1c1c1f;
178-
--color-surface-hover: #232326;
179-
--color-text-primary: #fafafa;
180-
--color-text-secondary: #a0a0ab;
181-
--color-text-muted: #8b8b95;
182-
--color-text-tertiary: #a1a1aa;
183-
--color-primary: #3b82f6;
184-
--color-primary-hover: #2563eb;
185-
--color-primary-soft: rgba(59, 130, 246, 0.15);
186-
--color-primary-muted: rgba(59, 130, 246, 0.08);
187-
--color-border: #27272a;
188-
--color-border-strong: #3f3f46;
189-
--color-border-subtle: #1e1e21;
190-
--color-focus-ring: #3b82f6;
191-
--color-success: #22c55e;
192-
--color-success-bg: rgba(34, 197, 94, 0.10);
193-
--color-success-ink: #4ade80;
194-
--color-warning: #eab308;
195-
--color-warning-bg: rgba(234, 179, 8, 0.10);
196-
--color-warning-ink: #facc15;
197-
--color-danger: #ef4444;
198-
--color-danger-bg: rgba(239, 68, 68, 0.10);
199-
--color-danger-ink: #f87171;
200-
--color-info-bg: rgba(59, 130, 246, 0.10);
201-
--color-app-bg-radial-indigo: color-mix(in srgb, var(--color-primary) 22%, transparent);
202-
--color-app-bg-radial-cyan: color-mix(in srgb, var(--color-success) 18%, transparent);
203-
--color-app-bg-base-start: color-mix(in srgb, var(--color-bg-elevated) 92%, var(--color-bg));
204-
--color-app-bg-base-mid: color-mix(in srgb, var(--color-bg-surface) 62%, var(--color-bg-elevated));
205-
--color-app-bg-base-end: var(--color-bg-surface);
206-
--color-app-grid-line: color-mix(in srgb, var(--color-border) 30%, transparent);
207-
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.03);
208-
--shadow-md: 0 4px 16px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.04);
209-
--shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.05);
210-
--shadow-xl: 0 16px 48px rgba(0, 0, 0, 0.6);
211-
--shadow-glow-primary: 0 0 24px rgba(59, 130, 246, 0.15);
212-
}
213-
214-
.topbar {
215-
background: var(--color-bg-elevated);
216-
backdrop-filter: blur(12px) saturate(180%);
217-
-webkit-backdrop-filter: blur(12px) saturate(180%);
218-
}
219-
220-
.metric-card::before {
221-
background: var(--color-gradient-dark-overlay);
222-
}
223-
}
224-
225170
/* =========================================
226171
Global Reset & Base
227172
========================================= */
@@ -236,7 +181,7 @@ html,
236181
body {
237182
margin: 0;
238183
padding: 0;
239-
font-family: var(--font-ui, "Inter"), -apple-system, "PingFang SC", "Microsoft YaHei",
184+
font-family: var(--font-ui, var(--font-manrope, "Manrope")), -apple-system, "PingFang SC", "Microsoft YaHei",
240185
"Noto Sans CJK SC", "Helvetica Neue", sans-serif;
241186
font-feature-settings: "cv02", "cv03", "cv04", "cv11";
242187
font-optical-sizing: auto;

apps/dashboard/app/page.tsx

Lines changed: 0 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -261,12 +261,6 @@ export default async function Home() {
261261
: "metric-value--success";
262262
const warningText =
263263
firstEnglishText(warning) || "The run list is temporarily unavailable. Try again soon.";
264-
const commandDeckTitle =
265-
locale === "zh-CN" ? "先打开实时指挥面" : "Open the live command deck first";
266-
const commandDeckDescription =
267-
locale === "zh-CN"
268-
? "首页先把 Command Tower、Workflow Cases 和 Proof & Replay 顶到第一层。采用路线、生态入口和 package 说明留在后面,不再抢走首屏主语义。"
269-
: "Put Command Tower, Workflow Cases, and Proof & Replay in the first operator read. Adoption routes, ecosystem ladders, and package surfaces come after the command deck, not before it.";
270264
const governanceDeckTitle =
271265
locale === "zh-CN" ? "治理桌与放行控制" : "Governance desks and release controls";
272266
const governanceDeckDescription =
@@ -295,57 +289,6 @@ export default async function Home() {
295289
showFirstTaskGuide={!hasRunHistory}
296290
/>
297291

298-
<section className="app-section" aria-labelledby="dashboard-command-deck-title">
299-
<div className="section-header">
300-
<div>
301-
<h2 id="dashboard-command-deck-title" className="section-title">
302-
{commandDeckTitle}
303-
</h2>
304-
<p>{commandDeckDescription}</p>
305-
</div>
306-
<nav aria-label="Command deck primary actions">
307-
<Button asChild>
308-
<Link href="/command-tower">Open Command Tower</Link>
309-
</Button>
310-
<Button asChild variant="secondary">
311-
<Link href="/workflows">Open Workflow Cases</Link>
312-
</Button>
313-
<Button asChild variant="secondary">
314-
<Link href="/runs">Open Proof &amp; Replay</Link>
315-
</Button>
316-
</nav>
317-
</div>
318-
<div className="quick-grid">
319-
<Link href="/command-tower" className="quick-card">
320-
<span className="quick-card-desc">{locale === "zh-CN" ? "Live cockpit" : "Live cockpit"}</span>
321-
<span className="quick-card-title">Command Tower</span>
322-
<span className="quick-card-desc">
323-
{locale === "zh-CN"
324-
? "先看系统现在在干嘛、风险在哪、下一步该去哪。"
325-
: "See what is moving now, what is risky, and where the next operator action belongs."}
326-
</span>
327-
</Link>
328-
<Link href="/workflows" className="quick-card">
329-
<span className="quick-card-desc">{locale === "zh-CN" ? "Durable case record" : "Durable case record"}</span>
330-
<span className="quick-card-title">Workflow Cases</span>
331-
<span className="quick-card-desc">
332-
{locale === "zh-CN"
333-
? "把 request、queue、verdict、linked runs 和 next action 绑在同一张案例桌上。"
334-
: "Keep request, queue posture, verdict, linked runs, and the next action on one durable case desk."}
335-
</span>
336-
</Link>
337-
<Link href="/runs" className="quick-card">
338-
<span className="quick-card-desc">{locale === "zh-CN" ? "Truth room" : "Truth room"}</span>
339-
<span className="quick-card-title">Proof &amp; Replay</span>
340-
<span className="quick-card-desc">
341-
{locale === "zh-CN"
342-
? "先核证据、compare 和 replay,再决定是否信任或放行结果。"
343-
: "Inspect evidence, compare posture, and replay state before you trust or promote the result."}
344-
</span>
345-
</Link>
346-
</div>
347-
</section>
348-
349292
<section className="app-section" aria-labelledby="dashboard-case-gallery-live-title">
350293
<div className="section-header">
351294
<div>

0 commit comments

Comments
 (0)