Skip to content

Commit a968cdc

Browse files
NagyViktNagyViktclaude
authored
Brand the cockpit welcome screen with a GUARDEX wordmark and l/p hints (#525)
Phase 2 of the dmux-style cockpit plan: replace the legacy `gx` ASCII robot motif with a 5-line `GUARDEX` wordmark plus a `guarded multi-agent cockpit` strapline, and extend the welcome `Next actions` block to advertise the new `l logs` and `p projects` hotkeys landed in phase 1. Stays ASCII-only for plain-terminal safety. Co-authored-by: NagyVikt <nagy.viktordp@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 2b58920 commit a968cdc

5 files changed

Lines changed: 116 additions & 10 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# dmux-style cockpit — Phase 2: branded welcome screen
2+
3+
## Why
4+
5+
Phase 1 wired the dmux-style top-bar shortcuts (`[n]ew agent`,
6+
`[t]erminal`, `[l]ogs`, `[p]rojects`). The welcome screen still shows
7+
the original `gx` ASCII robot motif and lists only the legacy `n`/`t`/
8+
`s` next-actions. To match the dmux look users asked for and to
9+
advertise the new shortcuts on first launch, the welcome page needs a
10+
proper gitguardex brand block and an updated next-actions list.
11+
12+
## What changes
13+
14+
- Replace the 5-line `GUARD_MOTIF` (`/ _)`, `/ gx \`) with a 5-line
15+
ASCII `GUARDEX` wordmark plus a single `guarded multi-agent cockpit`
16+
strapline.
17+
- Add `l logs` and `p projects` to the welcome screen's `Next actions`
18+
block so users see all four primary shortcuts immediately.
19+
- Keep the existing box, status rows (Repo / Branch / Safety / Hooks /
20+
Locks / Agents), and shortcut block intact.
21+
22+
## Impact
23+
24+
- New constants `GITGUARDEX_BRAND` and `GITGUARDEX_STRAPLINE` in
25+
`src/cockpit/welcome.js`.
26+
- 2 lines added to the next-actions block.
27+
- Tests:
28+
- `renderWelcomePage snapshots the empty cockpit welcome strings`
29+
extended to assert `l logs`, `p projects`, and the strapline.
30+
- `renderWelcomePage stays width bounded and plain terminal safe`
31+
swaps the obsolete `/ _)` / `/ gx \` motif assertions for the
32+
new strapline + brand-marker checks.
33+
- ASCII-only constraint preserved (no unicode block or box-drawing
34+
chars, so plain terminals stay safe).
35+
- No behavior change to safety model, branches, worktrees, locks, or
36+
PR-only finish flow.
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
## ADDED Requirements
2+
3+
### Requirement: Welcome screen renders the gitguardex brand and strapline
4+
The cockpit welcome screen SHALL render a multi-line ASCII gitguardex
5+
brand block followed by a single-line `guarded multi-agent cockpit`
6+
strapline, in place of the previous `gx` ASCII robot motif.
7+
8+
#### Scenario: Brand and strapline appear on the empty welcome
9+
- **WHEN** `renderWelcomePage` is invoked with no active sessions
10+
- **THEN** the rendered output contains the `\____|` marker from the
11+
bottom of the ASCII brand
12+
- **AND** the output contains the substring `guarded multi-agent cockpit`.
13+
14+
### Requirement: Welcome screen advertises all four primary shortcuts
15+
The cockpit welcome screen's `Next actions` block SHALL list `n`, `t`,
16+
`l`, `p`, and `s` so users see all four primary dmux-style shortcuts on
17+
first launch alongside the existing settings hint.
18+
19+
#### Scenario: Next actions list includes l and p
20+
- **WHEN** `renderWelcomePage` is invoked with any state
21+
- **THEN** the rendered output contains the substrings `l logs` and
22+
`p projects` in addition to the existing `n new agent`, `t terminal`,
23+
and `s settings` lines.
24+
25+
### Requirement: Welcome screen stays ASCII-only
26+
The cockpit welcome screen SHALL remain plain-terminal safe: every
27+
character in the rendered output (including the new brand block) MUST
28+
fall within the printable ASCII range so terminals without unicode box
29+
or block glyphs render correctly.
30+
31+
#### Scenario: No characters above U+007F appear in the output
32+
- **WHEN** `renderWelcomePage` is invoked with any state
33+
- **THEN** the rendered output contains no character in the range
34+
`[€-￿]`.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Tasks
2+
3+
## 1. Spec
4+
- [x] 1.1 Capture proposal in `proposal.md`
5+
- [x] 1.2 Capture spec delta in `specs/cockpit-welcome/spec.md`
6+
7+
## 2. Tests
8+
- [x] 2.1 Extend the empty-welcome snapshot test to assert `l logs`,
9+
`p projects`, and the `guarded multi-agent cockpit` strapline.
10+
- [x] 2.2 Replace the obsolete `/ _)` / `/ gx \` motif assertions
11+
in the width-bounded test with strapline + brand-marker checks.
12+
13+
## 3. Implementation
14+
- [x] 3.1 Replace `GUARD_MOTIF` with `GITGUARDEX_BRAND` (5-line ASCII
15+
wordmark for `GUARDEX`).
16+
- [x] 3.2 Add `GITGUARDEX_STRAPLINE = 'guarded multi-agent cockpit'`.
17+
- [x] 3.3 Wire the new brand and strapline into `renderWelcomePage`
18+
in place of `GUARD_MOTIF.forEach(...)`.
19+
- [x] 3.4 Add `l logs` and `p projects` rows to the `Next actions`
20+
block.
21+
22+
## 4. Cleanup
23+
- [ ] 4.1 Commit changes on the agent branch.
24+
- [ ] 4.2 Push branch and open a PR.
25+
- [ ] 4.3 Run `gx branch finish ... --via-pr --wait-for-merge --cleanup`.
26+
- [ ] 4.4 Record PR URL and `MERGED` evidence.

src/cockpit/welcome.js

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ const MIN_WIDTH = 48;
99
const MAX_WIDTH = 88;
1010

1111
const DEFAULT_AGENTS = ['codex', 'claude', 'opencode', 'cursor', 'gemini'];
12-
const GUARD_MOTIF = [
13-
' __',
14-
' / _)',
15-
' .-^^^-/',
16-
'/ gx \\',
17-
'|_|--|_|',
12+
const GITGUARDEX_BRAND = [
13+
' ____ _ _ _ ___ ___ _____ __',
14+
' / ___|| | | | / \\ | _ \\ | _ \\ | ____|\\ \\/ /',
15+
'| | _ | | | |/ _ \\| |_) || | | || _| \\ /',
16+
'| |_| || |_| / ___ \\ _ < | |_| || |___ / \\',
17+
' \\____| \\___/_/ \\_\\_| \\_\\____/ |_____|/_/\\_\\',
1818
];
19+
const GITGUARDEX_STRAPLINE = 'guarded multi-agent cockpit';
1920

2021
function stringValue(value, fallback = '') {
2122
if (typeof value === 'string') {
@@ -222,9 +223,13 @@ function renderWelcomePage(state = {}, settings = {}) {
222223
emptyLine(width),
223224
];
224225

225-
GUARD_MOTIF.forEach((motifLine) => {
226-
lines.push(themedBoxedLine(motifLine, width, 'accent', theme));
226+
GITGUARDEX_BRAND.forEach((brandLine) => {
227+
lines.push(themedBoxedLine(brandLine, width, 'accent', theme));
227228
});
229+
lines.push(
230+
emptyLine(width),
231+
themedBoxedLine(GITGUARDEX_STRAPLINE, width, 'heading', theme),
232+
);
228233

229234
lines.push(
230235
emptyLine(width),
@@ -247,6 +252,8 @@ function renderWelcomePage(state = {}, settings = {}) {
247252
themedBoxedLine('Next actions', width, 'heading', theme),
248253
themedBoxedLine(' n new agent - start a guarded agent lane', width, 'secondary', theme),
249254
themedBoxedLine(' t terminal - open a repo terminal', width, 'secondary', theme),
255+
themedBoxedLine(' l logs - tail apps/logs/*.log and lane events', width, 'secondary', theme),
256+
themedBoxedLine(' p projects - switch repo (no lane selected)', width, 'secondary', theme),
250257
themedBoxedLine(' s settings - tune cockpit defaults', width, 'secondary', theme),
251258
colorize(divider(width), 'border', theme),
252259
);

test/cockpit-welcome.test.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,13 @@ test('renderWelcomePage snapshots the empty cockpit welcome strings', () => {
2828
assert.match(output, /Agents:\s+codex, claude/);
2929
assert.match(output, /n new agent/);
3030
assert.match(output, /t terminal/);
31+
assert.match(output, /l logs/);
32+
assert.match(output, /p projects/);
3133
assert.match(output, /s settings/);
3234
assert.match(output, /\? shortcuts/);
3335
assert.match(output, /q quit/);
3436
assert.match(output, /Next actions/);
37+
assert.match(output, /guarded multi-agent cockpit/);
3538
assert.equal(output.endsWith('\n'), true);
3639
});
3740

@@ -54,8 +57,8 @@ test('renderWelcomePage stays width bounded and plain terminal safe', () => {
5457
assert.equal(line.length <= width, true, `line exceeded ${width}: ${line}`);
5558
}
5659

57-
assert.match(output, /\/ _\)/);
58-
assert.match(output, /\/ gx \\/);
60+
assert.match(output, /guarded multi-agent cockpit/);
61+
assert.match(output, /\\____\|/);
5962
assert.match(output, /Locks:\s+5/);
6063
assert.match(output, /Agents:\s+codex, gemini/);
6164
assert.doesNotMatch(output, /[\u0080-\uffff]/);

0 commit comments

Comments
 (0)