Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
d9676fa
Input ownership: a waiting read gets its answer, however soon it is t…
raiseCatError Oct 15, 2026
d21ebb4
Waiting for input: its own color, the question, and one instruction
raiseCatError Oct 15, 2026
3907848
/copy: the bytes the program printed, tabs and final newline included
raiseCatError Oct 15, 2026
4cb32e3
Exact copy: read the final line break from the parser, not a backtrac…
raiseCatError Oct 15, 2026
6230516
Merge fix/v019-input-ownership into v0.20 stabilization
raiseCatError Oct 15, 2026
a3bec80
Queue: see what runs next and in what order; resume and approve in place
raiseCatError Oct 15, 2026
ce63a57
Paste review: name NMSh commands that would reach the shell as text
raiseCatError Oct 15, 2026
bbb7b38
Paste review: an NMSh command label never masks what the shell would run
raiseCatError Oct 15, 2026
3f946be
Task bar: readable at rest, finished tasks let go, menu selection, al…
raiseCatError Oct 15, 2026
968f297
Claude plugins: changing them from NMSh is off in this release; the i…
raiseCatError Oct 15, 2026
afd8811
Setup: previews that show the real result; Chroma says what hides it
raiseCatError Oct 15, 2026
1ea6ba8
Merge fix/v019-queue-ux: queue preview, contextual resume and approva…
raiseCatError Oct 15, 2026
1179936
Merge fix/v019-setup-ux: real previews, Chroma clarity, activity word…
raiseCatError Oct 15, 2026
2b2311b
Merge stabilize/v0.19.0 into v0.20 stabilization
raiseCatError Oct 15, 2026
36b6eb8
Merge fix/v020-task-ux: task bar readable at rest, finished tasks let…
raiseCatError Oct 15, 2026
a35db3e
Merge fix/v020-claude-defer: Claude plugin changes off in this release
raiseCatError Oct 15, 2026
f9ed173
Merge stabilize/v0.19.0 into v0.20 stabilization
raiseCatError Oct 15, 2026
ef7a319
Theme Bridge policy test: Setup's Chroma preview follows the setting;…
raiseCatError Oct 15, 2026
b4943a8
Merge fix/v019-input-ownership: Ctrl+C ends a waiting question
raiseCatError Oct 15, 2026
36858e7
Merge fix/v020-stabilization
raiseCatError Oct 15, 2026
fb39550
Input: Ctrl+C or Ctrl+Z ends a waiting question; what is typed next i…
raiseCatError Oct 15, 2026
839c508
Merge fix/v019-input-ownership into v0.20 stabilization: Ctrl+C ends …
raiseCatError Oct 15, 2026
bcc8e76
Merge fix/v019-setup-ux: Theme Bridge policy test follows the Setup p…
raiseCatError Oct 15, 2026
7f18d76
Claude plugins: word the deferral note so the portable-mod gate's she…
raiseCatError Oct 15, 2026
aff3f8c
Merge fix/v020-claude-defer: deferral note keeps the portable-mod gate
raiseCatError Oct 15, 2026
23fcb4f
Input ownership test: wait for this run's journal record before count…
raiseCatError Oct 15, 2026
4cd49e0
Merge fix/v019-input-ownership into v0.20 stabilization: test waits f…
raiseCatError Oct 15, 2026
fb31151
Merge stabilize/v0.19.0 into v0.20 stabilization
raiseCatError Oct 15, 2026
adfce9c
Merge fix/v019-input-ownership: input ownership test waits for its jo…
raiseCatError Oct 15, 2026
2f00b30
Merge fix/v020-stabilization
raiseCatError Oct 15, 2026
e2ab71d
Setup: Look → Prompt → Motion; Chroma chosen in Look only
raiseCatError Oct 16, 2026
1aeb05c
Merge fix/v019-setup-order: Setup order Look → Prompt → Motion
raiseCatError Oct 16, 2026
91343ec
Merge stabilize/v0.19.0: Setup order Look → Prompt → Motion
raiseCatError Oct 16, 2026
199127f
Workspace sidebar and detail panel: experimental, Off by default
raiseCatError Oct 16, 2026
891ee58
Merge fix/v020-workspace-experimental: workspace regions experimental…
raiseCatError Oct 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

## [0.20.0] - Unreleased (release candidate)

**Workspace, background tasks & native modules.** A workspace sidebar and detail panel sit beside the transcript; long-running commands run as background tasks beside the shell instead of in front of it; the native module catalog covers twelve more runtimes and tools; and Claude Code managed targets gain native model, effort and mod controls. Every region, task and control is reached through an explicit command or an opt-in key, and the persistent shell, the queue and program input keep their behavior.
**Workspace, background tasks & native modules.** An experimental workspace sidebar and detail panel (Off by default) can sit beside the transcript; long-running commands run as background tasks beside the shell instead of in front of it; the native module catalog covers twelve more runtimes and tools; and Claude Code managed targets gain native model, effort and mod controls. Every region, task and control is reached through an explicit command or an opt-in key, and the persistent shell, the queue and program input keep their behavior.

This release candidate is built on the **unpublished v0.19.0 release candidate**; neither is published until its physical-terminal QA passes ([v0.20 physical QA checklist](docs/testing/v020-physical-qa.md)).

### Added

#### Workspace sidebar and detail panel ([#330](https://github.com/raiseCatError/notMyShell/issues/330)–[#335](https://github.com/raiseCatError/notMyShell/issues/335))
- `/sidebar` lists tmux panes of the server NMSh runs inside, this repository's worktrees and links to `/github`, `/agents` and `/sessions`; `/panel` explains the selected item. `/sidebar focus` and `/panel focus` give them the keyboard; Esc returns, Tab moves between regions, a click focuses a region.
#### Workspace sidebar and detail panel — experimental, Off by default ([#330](https://github.com/raiseCatError/notMyShell/issues/330)–[#335](https://github.com/raiseCatError/notMyShell/issues/335))
- **Experimental and Off by default.** Turn it on in Settings → Layout → Workspace sidebar & panel (or Setup → Editor). While Off, `/sidebar` and `/panel` say how to turn it on and open nothing, and `keymap.json` workspace bindings are kept but take no key (`/keys` says so). Turning it Off closes open regions and gives the shell every column again. `/worktrees`, `/sessions`, `/github` and `/background` never depend on it. The docked layout is expected to be replaced by integrations with dedicated Git tools in a later release.
- When on, `/sidebar` lists tmux panes of the server NMSh runs inside, this repository's worktrees and links to `/github`, `/agents` and `/sessions`; `/panel` explains the selected item. `/sidebar focus` and `/panel focus` give them the keyboard; Esc returns, Tab moves between regions, a click focuses a region.
- On a wide terminal the regions dock beside the transcript and the shell is sized to the middle; on a narrow one a region opens as a drawer over the transcript only while it has the keyboard, and the shell keeps its width. Fullscreen programs and idle visuals hide them.
- Opening a worktree stages its `cd` in an empty composer; tmux navigation selects panes and windows by id through tmux from fixed system locations. Nothing runs by itself.
- `keymap.json` binds workspace keys, opt-in and validated (composer keys must say what they replace); `/keys` shows the keys in effect, problems in the file and keys the terminal or tmux may take first; `/keys reload` reads it again.
Expand All @@ -33,7 +34,7 @@ This release candidate is built on the **unpublished v0.19.0 release candidate**

#### Managed Claude Code ([#347](https://github.com/raiseCatError/notMyShell/pull/347))
- `/model` and `/effort` as native pickers over Claude's documented control requests; a change shows as requested until Claude reports it.
- Claude mods with their real types and states per launch identity; enable and disable go through Claude's own `claude plugin` command at the installed scope, then running managed sessions reload. NMSh never edits Claude's settings files.
- Claude mods with their real types and states per launch identity (read only). Turning a Claude plugin on or off from NMSh is **off in this release**: it was never verified against a live account and it would write your Claude settings, so the row names the `claude plugin enable|disable … --scope …` command to run yourself. Behind the experimental `NMSH_EXPERIMENTAL_CLAUDE_PLUGIN_TOGGLE=1`, it goes through Claude's own command at the installed scope and running managed sessions reload. NMSh never edits Claude's settings files. Managed Claude stays beta; its physical QA was deferred for this release.
- A context panel beside the agent conversation, provenance on every runtime fact, and Markdown rendering for agent output that reveals real link destinations and refuses smuggled characters.

#### Worktrees and controls
Expand All @@ -55,11 +56,11 @@ This release candidate is built on the **unpublished v0.19.0 release candidate**
- The tmux section of the sidebar needs tmux in `/opt/homebrew/bin`, `/usr/local/bin`, `/usr/bin` or `/bin`.

### Upgrade notes
- Nothing new is on after the upgrade: the sidebar and panel are opened by command, the composer binds no workspace keys, and background suggestions are off.
- Nothing new is on after the upgrade: the experimental sidebar and panel are Off (a configuration without the new `workspacePanels` setting reads as Off, and nothing else in it changes), the composer binds no workspace keys, and background suggestions are off.
- Restart the session service (or start a new session) to use background tasks.

### Known limitations
- **Physical-terminal QA has not been performed** for the workspace regions, drawers, background tasks, keymap host notes or the new modules; automated tests and real-PTY suites cover them.
- **Physical-terminal QA has not been performed** for the background tasks or the new modules; automated tests and real-PTY suites cover them. The experimental workspace regions, drawers and keymap host notes are not part of this release's physical QA gate (only their Off state is checked) and are not physically tested.
- Clicks focus a region but do not select sidebar rows; the mouse wheel scrolls the transcript wherever the pointer is.
- The sidebar lists tmux and worktrees only; NMSh sessions and managed targets as rows, and module diagnostics in the detail panel (they stay in `/modules` details), are not included.
- Background tasks run in a separate shell: aliases, functions and unexported variables of the live shell are not available. A service restart ends the tasks it owned. Output kept by the task owner is 5,000 lines or 2 MiB per task.
Expand Down Expand Up @@ -114,6 +115,9 @@ Verification: automated CI (unit and real-PTY suites on macOS and Ubuntu, Node 2
- Ruby and PHP version modules read the project's own files and the install location, never running an interpreter. The Gemfile `ruby` declaration is parsed in linear time.
- `/theme` imports **Starship** configurations as Native themes from their static colors only; format strings and custom commands are never evaluated, and the preview lists what was not carried over.

### Changed
- **Setup Cat order: Look → Prompt → Motion.** The first steps after Terminal are now **Look** (formerly Appearance): theme family, variant, accent, theme text, UI chrome, then Chroma (the only place Setup chooses it) with its dependent rows under it; **Prompt**, which shows Chroma as a read-only line that goes to Look; and **Motion**, which now starts with Reduced Motion, Decorative effects, Shimmer and Milestone effects above the motion rows they govern. Cursor follows Motion. Every setting stays reachable and saved values are unchanged; `/setup look` opens Look (`/setup appearance` and `/setup chroma` still work).

### Fixed
- **Single-key prompts:** answering a single-key question through the composer no longer sends a stray Enter that answered the next question with its default.
- **Passwords:** text typed at a password prompt is no longer drawn in the composer.
Expand Down
43 changes: 38 additions & 5 deletions docs/design/input-awareness.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ against the kernel's documented `/proc` formats, but it has not been run on a Li
|---|---|---|---|
| Kernel | A foreground thread is blocked in `read()` on this terminal (`/proc/PID/task/TID/syscall` plus the fd's link). If every thread is blocked elsewhere, that vetoes the other layers. | Linux | confirmed |
| Terminal line settings | `stty -a` on the PTY device: echo off with line input on means a hidden line (password). Line input off with a prompt left open on the cursor's line means single keys (`e2fsck`, `read -k`, `read -n1`). | macOS, Linux | confirmed |
| The shell holds its terminal | While a command runs, the shell itself (the terminal's session leader, ps state `s`) is the foreground group: one of its builtins has the terminal. Line input off there means single keys (`read -k 1`, `read -n 1`, no prompt needed); ordinary line settings with the shell idle across two samples (the second 100 ms after the first) mean a line read (`read -r reply`). A loop's shell between commands is seen for one sample only and is not a request. | macOS, Linux | confirmed (keys), likely (line) |
| Prompt evidence | A question-shaped line left open (ends in `?`, `:`, `]`, `)`, `>`), written once and never rewritten or cursor-drawn, output quiet for 0.7 s or more, and the foreground group idle across two samples (nothing running on a CPU, no CPU time gained). | macOS, Linux | likely |

Raw mode alone is never a request: spinners and terminal proxies (`docker run -it`) set it without asking anything. A
Expand All @@ -39,7 +40,10 @@ that end with a newline.
process), so the open question plus an idle process is the best available evidence.

**Not detected generically:**
- Line reads on macOS whose prompt ends with a newline, or that print no prompt at all.
- Line reads on macOS by programs other than the shell whose prompt ends with a newline, or that print no prompt at all
(`cat`, Python `input()` with no prompt). The shell's own `read` is detected with or without a prompt.
- On macOS, a `wait` builtin looks like a line read (the shell holds the terminal, idle); it is shown as "Probably".
Linux's kernel report tells them apart.
- Programs reading through `poll`/`select` on macOS.
- Programs that own the terminal. Fish 4's own `read` is one: it is fish's line editor, with bracketed paste and OSC 133
marks, so NMSh hands it the terminal and fish answers natively. It is not reported as waiting.
Expand All @@ -55,6 +59,20 @@ In all of these cases NMSh shows "Running", as before.
- **Questions printed as ordinary output:** later output ends the wait at once.
- **Interactive full-screen or inline programs:** they own the terminal.

### Looking on demand

Probes back off (every 10 s after a minute of quiet), and the first look comes 150–400 ms after a command starts. A key
typed in that time would be routed on no evidence. So the frontend holds the keys that decide where typing goes, the
first key of a draft and an Enter that would queue, and asks the session to look now (`input-look`, answered by
`input-looked` after any `input-state` the look produced). Keys typed right after Enter wait for the shell's exec first.
The hold ends when the look is done, when evidence arrives, or after 800 ms, and the keys are then routed on what is
known, in the order typed. A program that took the terminal meanwhile (Fish's reader) gets them as raw keys. Ctrl+C is
never held, and typing right after Ctrl+C or Ctrl+Z stays type-ahead for the prompt. Both ends negotiate the feature;
an older service is never asked and behaves as before.

When an answer goes to the program (a key in key mode, Enter otherwise), the frontend counts the question as answered
until the session reports again, so the next command typed at speed is routed on fresh evidence.

### Cost

Probes start only after a running command's output goes quiet:
Expand All @@ -68,7 +86,7 @@ probe that started before newer output is discarded.
## States and time

- **Running:** no credible request. The line keeps its shimmer and adds `· waited 18s` once the command has waited.
- **Waiting for input** (◆, accent and weight) or **Probably waiting for input** (◇): the attention line plus the open
- **Waiting for input** (◆, attention color and weight) or **Probably waiting for input** (◇): the attention line plus the open
question.
- **Running again:** after an answer (a key in key mode, Enter otherwise, or Ctrl+C or Ctrl+D), or when the program
writes again.
Expand All @@ -92,12 +110,27 @@ so nothing new is reserved and the PTY never resizes:

```
◆ Waiting for input · e2fsck · 18.0s · 1m 40s total
Padding at end of inode bitmap is not set. Fix<y>? · each key goes straight to e2fsck
❯ Keys go straight to e2fsck
Padding at end of inode bitmap is not set. Fix<y>?
❯ Press a key · it goes straight to e2fsck · Ctrl+Q queues a command
```

A read that left no question says what it reads, and the composer says how to answer, once:

```
◇ Probably waiting for input · zsh · 3.2s
zsh is probably reading a line
❯ Type your answer · Enter sends it to zsh · Ctrl+Q queues a command
```

Hidden input: `Hidden input · nothing you type is shown · Enter sends it to sudo · Ctrl+Q queues a command`. Nothing
typed is drawn, not even as dots.

- **Its own color:** the attention hue (cyan) on the headline and the composer's `❯`, apart from running (lavender
shimmer), paused (amber), failed (red) and done (green). `/sessions` and `/resume` rows for a waiting session use it
too. The instruction reads at secondary contrast, not the subtle tier.
- **Said once:** the activity rows carry the state and the question; the composer carries the instruction.
- **The question stays in view** however far the transcript has scrolled or folded.
- **Narrow widths:** the line drops detail first (total time, then program name); the question outranks the hint.
- **Narrow widths:** the line drops detail first (total time, then program name); the question keeps its row.
- **No animation:** no shimmer and no flashing. The timer only counts.
- **NO_COLOR:** keeps the weight and the glyph.
- **Safe glyphs:** `!` for confirmed and `?` for likely.
Expand Down
26 changes: 22 additions & 4 deletions docs/testing/v020-physical-qa.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@

| Pass | Host and version | OS | Shell and version | Commit (`--version`) | Result | Notes |
|---|---|---|---|---|---|---|
| 1 Workspace regions | Ghostty | macOS | zsh | | Not run | |
| 1 Workspace regions | Terminal.app | macOS | zsh | | Not run | |
| 1 Workspace regions | Ghostty inside tmux | macOS | zsh | | Not run | |
| 1 Workspace regions Off (default) | Ghostty | macOS | zsh | | Not run | |
| 1 Workspace regions Off (default) | Terminal.app | macOS | zsh | | Not run | |
| 1E Experimental regions (optional, not a release gate) | Ghostty, Terminal.app, tmux | macOS | zsh | | Deferred | experimental, Off by default |
| 2 Background tasks | Ghostty | macOS | zsh | | Not run | |
| 2 Background tasks | physical Linux terminal | Linux | Fish 3.7 or Bash | | Not run | |
| 3 Modules and worktrees | Ghostty | macOS | zsh | | Not run | |
Expand All @@ -27,6 +27,23 @@

## Pass 1 — workspace regions

The docked sidebar and detail panel are **experimental and Off by default** in v0.20 (maintainer decision,
`workspace-ui-decision.md`). The release gate is that Off is really off and that turning them on and off is safe;
the docked regions themselves (1E) are not a release feature and are recorded as **Deferred** unless someone runs
them. A 1E result never counts as release evidence for anything else.

- [ ] 1.0a Fresh QA home: `/sidebar`, `/panel`, `/sidebar focus`: each prints that the regions are experimental and
Off and names Settings → Layout → Workspace sidebar & panel; nothing opens, the composer keeps the keyboard, and
`tput cols` is the full width before and after.
- [ ] 1.0b Settings → Layout shows **Workspace sidebar & panel Off** with its experimental description; Setup → Editor
shows the same row. `/keys` says the workspace bindings take no key while it is Off. `/worktrees`, `/sessions`,
`/github` and `/background` work as usual.
- [ ] 1.0c Turn it On in Settings, `/sidebar` then `/panel focus` at 160 columns: both dock and `tput cols` is the
middle width. Turn it Off in Settings: both close at once, focus is back in the composer, and `tput cols` is the full
width again; `/sidebar` opens nothing until it is turned on again.

### 1E — experimental regions (optional; turn the setting On first; not a release gate)

- [ ] 1.1 At 200, 120, 100, 89, 80, 70 and 40 columns: `/sidebar`, then `/panel`. Wide: both dock, the transcript
rewraps to the middle and `tput cols` in the shell matches the middle width. 70 and below: `/sidebar` opens a drawer
with the keyboard; `tput cols` is unchanged (opening a drawer never resizes the shell); Esc tucks it and the
Expand Down Expand Up @@ -76,7 +93,8 @@
## Pass 5 — v0.19 core on the integrated build

Repeat items 1.1–1.15 of [v019-physical-qa.md](v019-physical-qa.md) once on this build in Terminal.app with Bash or
Fish, with the sidebar docked for half of them.
Fish, with the default settings (the experimental workspace regions Off). Running half of them again with the
regions docked belongs to 1E and is optional.

## After the pass

Expand Down
Loading
Loading