Skip to content

Commit 22d4fc3

Browse files
nafeeurclaude
andauthored
Add a dedicated 08 GIT view, remove the small rail GIT tab (#36)
Replaces the old rail widget (a raw `git status --short` dump with no way to act on anything) with a full catalogue view: working tree changes (stage/unstage/discard/commit, with amend and --no-verify), commit log with async diff previews, branches (switch/create/rename/ delete), stash (apply/pop/drop/create), MaskShift checkpoints (restore, reusing the existing runtime APIs) and worktrees (add/remove) — plus push/pull/fetch as global actions from any tab. Every mutating action shells out to `git` directly via runCommand, the same pattern the header's branch readout already used, rather than going through the agent-facing tool registry. Claude-Session: https://claude.ai/code/session_01CXJiAQFDiFvdbDEg5rTL75 Co-authored-by: Claude <noreply@anthropic.com>
1 parent d6bd3df commit 22d4fc3

8 files changed

Lines changed: 981 additions & 54 deletions

File tree

‎README.md‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ interface to edit the core settings without touching the file, or use `maskshift
178178
## The interface
179179

180180
`maskshift` opens a full-screen terminal application built on a bespoke, zero-dependency
181-
renderer, driven equally by keyboard and mouse. Seven views switch with `1`–`7`, `ctrl+b` toggles
181+
renderer, driven equally by keyboard and mouse. Eight views switch with `1`–`8`, `ctrl+b` toggles
182182
the right rail, and `ctrl+k` opens a fuzzy command palette over every action.
183183

184184
| View | Holds |
@@ -190,6 +190,7 @@ the right rail, and `ctrl+k` opens a fuzzy command palette over every action.
190190
| **05 MOD SHOP** | Automations, plugins, agent bridges, browser profiles and background processes |
191191
| **06 TERMINAL** | The host shell |
192192
| **07 BROWSER** | A live, clickable, typeable view of a running browser tab — the same CDP connection the browser tools drive |
193+
| **08 GIT** | Working tree changes (stage/unstage/discard/commit), commit log, branches, stash, MaskShift checkpoints and worktrees — plus push/pull/fetch from anywhere in the view |
193194

194195
Inline images — a Files preview, a chat screenshot result, or the live BROWSER view — render
195196
through whatever the terminal actually supports, picked automatically: the Kitty graphics
@@ -205,11 +206,11 @@ it needs a dependency: the PNG, JPEG and BMP decoders are hand-written against N
205206
</tr>
206207
<tr>
207208
<td width="50%"><img width="100%" alt="Command palette" src="docs/screenshots/palette.svg"><br><sub><b>ctrl+k</b> — every action, nothing buried behind a memorised key</sub></td>
208-
<td width="50%"><img width="100%" alt="Live loadout telemetry" src="docs/screenshots/loadout.svg"><br><sub><b>The rail</b> — plan, loadout telemetry, event bus, Git pulse</sub></td>
209+
<td width="50%"><img width="100%" alt="Live loadout telemetry" src="docs/screenshots/loadout.svg"><br><sub><b>The rail</b> — plan, loadout telemetry, event bus</sub></td>
209210
</tr>
210211
</table>
211212

212-
Below 108 columns the rail hides itself and the header sheds telemetry, so the same seven views
213+
Below 108 columns the rail hides itself and the header sheds telemetry, so the same eight views
213214
work in a narrow split pane. `MASKSHIFT_MOUSE=off` (or `f2`) hands text selection back to the
214215
terminal, and `NO_COLOR`, `MASKSHIFT_COLOR=off` and `MASKSHIFT_ASCII=1` each produce a clean,
215216
aligned fallback.

‎docs/TUI.md‎

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ usable at 80×24.
111111
| **04 NETWORK** | MCP servers: connect, disconnect, add by hand, search the official registry and install from it. |
112112
| **05 MOD SHOP** | Automations, plugins, agent bridges, browsers and processes — each with create, arm/pause, reload and delete. |
113113
| **06 TERMINAL** | The host shell, running with your full account permissions. |
114+
| **07 BROWSER** | A live, clickable, typeable view of a running browser tab — the same CDP connection the browser tools drive. |
115+
| **08 GIT** | Working tree changes, commit log, branches, stash, MaskShift checkpoints and worktrees, each with their own actions — plus push/pull/fetch from any tab. |
114116

115117
![01 HEIST](screenshots/heist.svg)
116118

@@ -132,11 +134,12 @@ indexing and checkpoint behaviour — without editing `config.json` by hand:
132134

133135
![Settings](screenshots/settings.svg)
134136

135-
The right rail carries four sections, spelled out across a single header row so
137+
The right rail carries three sections, spelled out across a single header row so
136138
its first line of content sits on the same screen row as the first line of the
137139
pane it is reporting on: **plan** (live multi-stage plan with progress),
138140
**loadout** (which tools, skills and MCP servers the current run has actually
139-
summoned, plus token flow), **events** (the raw runtime bus) and **git**.
141+
summoned, plus token flow) and **events** (the raw runtime bus). Source control
142+
has its own dedicated view — see **08 GIT** below — rather than a rail summary.
140143

141144
![Live loadout telemetry](screenshots/loadout.svg)
142145

@@ -193,9 +196,9 @@ default.
193196
| `ctrl+g` | Change persona (model) |
194197
| `ctrl+o` | Open a different workspace |
195198
| `ctrl+b` | Show or hide the rail |
196-
| `ctrl+r` | Cycle rail: plan → loadout → events → git |
199+
| `ctrl+r` | Cycle rail: plan → loadout → events |
197200
| `ctrl+y` | Focus the rail |
198-
| `1`…`6`, `alt+1`…`alt+6` | Jump to a view |
201+
| `1`…`8`, `alt+1`…`alt+8` | Jump to a view |
199202
| `f1` or `?` | Key reference |
200203
| `f2` | Settings, including the mouse mode |
201204
| `f5` | Refresh everything |
@@ -231,13 +234,36 @@ cross session or workspace boundaries.
231234
| `delete` | Remove the selected entry |
232235
| `r` | Refresh |
233236

237+
### 08 GIT
238+
239+
Built on the same catalogue chrome as ARSENAL/NETWORK/MOD SHOP above — `/`,
240+
`tab`/`shift+tab`, `→` and `r` all work the same way — plus its own actions,
241+
some of which only apply on the tab named:
242+
243+
| Key | Action |
244+
|---|---|
245+
| `P` / `L` / `F` | Push / pull / fetch — from any tab |
246+
| `space` / `enter` | Stage or unstage a change (CHANGES) · switch branch (BRANCHES) · apply a stash (STASH) · restore a checkpoint (CHECKPOINTS) |
247+
| `a` / `u` | Stage all / unstage all (CHANGES) |
248+
| `c` | Commit, with amend and `--no-verify` toggles (CHANGES) |
249+
| `d` | Discard a change (CHANGES) |
250+
| `n` | New branch / stash / checkpoint / worktree, depending on the active tab |
251+
| `e` | Rename a branch (BRANCHES) |
252+
| `p` | Pop a stash (STASH) |
253+
| `delete` | Delete a branch · drop a stash · remove a worktree |
254+
255+
Diffs and `git show` output load asynchronously into the dossier pane the
256+
moment a row is selected. Every mutating action shells out to the system
257+
`git` binary directly, the same way the header's branch readout always has —
258+
it does not go through the agent-facing tool registry.
259+
234260
## Slash commands
235261

236262
Typed into the composer:
237263

238264
`/new` `/clear` `/model [REF]` `/sessions` `/workspace` `/tools [QUERY]`
239-
`/skills [QUERY]` `/mcp [QUERY]` `/mods` `/files` `/terminal` `/doctor` `/logs`
240-
`/settings` `/help` `/quit`
265+
`/skills [QUERY]` `/mcp [QUERY]` `/mods` `/files` `/terminal` `/browser` `/git`
266+
`/doctor` `/logs` `/settings` `/help` `/quit`
241267

242268
## Terminal requirements
243269

‎scripts/smoke-test.mjs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ try {
136136
});
137137
await app.bootstrap();
138138
const frames = {};
139-
for (const view of ['chat', 'files', 'arsenal', 'network', 'modshop', 'terminal', 'browser']) {
139+
for (const view of ['chat', 'files', 'arsenal', 'network', 'modshop', 'terminal', 'browser', 'git']) {
140140
app.view = view;
141141
app.focus = app.defaultFocus();
142142
app.screen.invalidate();

0 commit comments

Comments
 (0)