From 20459e6e3756bc6928dcfb0e62fc188bfe47b2d2 Mon Sep 17 00:00:00 2001 From: raiseCatError <315733358+raiseCatError@users.noreply.github.com> Date: Wed, 21 Oct 2026 06:43:45 +0530 Subject: [PATCH] Website: sync the published v0.22.0 release --- .../src/content/reference/accessibility.md | 2 +- website/src/content/reference/architecture.md | 4 +- .../src/content/reference/background-tasks.md | 2 +- website/src/content/reference/changelog.md | 117 +++++++++++++++++- .../reference/configured-completion.md | 2 +- .../src/content/reference/context-modules.md | 3 +- website/src/content/reference/contributing.md | 5 +- website/src/content/reference/copy-actions.md | 2 +- .../src/content/reference/github-workspace.md | 2 +- website/src/content/reference/onboarding.md | 2 +- .../src/content/reference/optional-tools.md | 2 +- website/src/content/reference/physical-qa.md | 2 +- website/src/content/reference/platforms.md | 2 +- website/src/content/reference/privacy.md | 2 +- .../content/reference/prompt-customization.md | 2 +- website/src/content/reference/security.md | 7 +- .../content/reference/session-interaction.md | 2 +- .../src/content/reference/shell-adapter.md | 2 +- .../content/reference/terminal-workflow.md | 2 +- website/src/content/reference/theme-bridge.md | 2 +- website/src/content/reference/verification.md | 2 +- .../src/content/reference/workspace-keymap.md | 2 +- website/src/content/releases/v0.22.0.md | 31 +++++ website/src/data/launch.json | 12 +- website/src/data/release.json | 20 +-- website/src/data/upstream.json | 64 +++++----- 26 files changed, 222 insertions(+), 75 deletions(-) create mode 100644 website/src/content/releases/v0.22.0.md diff --git a/website/src/content/reference/accessibility.md b/website/src/content/reference/accessibility.md index afbcbc8f..b7183b0f 100644 --- a/website/src/content/reference/accessibility.md +++ b/website/src/content/reference/accessibility.md @@ -1,6 +1,6 @@ --- title: "Accessibility baseline" -description: "Canonical accessibility baseline from the v0.20.0 published source." +description: "Canonical accessibility baseline from the v0.22.0 published source." group: Technical reference order: 110 source: "docs/accessibility/baseline.md" diff --git a/website/src/content/reference/architecture.md b/website/src/content/reference/architecture.md index 82d66b3d..136a3626 100644 --- a/website/src/content/reference/architecture.md +++ b/website/src/content/reference/architecture.md @@ -1,6 +1,6 @@ --- title: "Runtime architecture" -description: "Canonical runtime architecture from the v0.20.0 published source." +description: "Canonical runtime architecture from the v0.22.0 published source." group: Technical reference order: 100 source: "ARCHITECTURE.md" @@ -301,6 +301,8 @@ Optional **local understanding** can help interpret requests when enabled. Auto Model text is not directly executed as a shell command or filesystem operation. Configuration, mutation, and installation require confirmation of the exact action in Ask; destructive suggestions are Copy/Insert only. Copying or inserting a suggested command does not execute it. File plans and supported configuration still use their normal path, hash, and ownership checks. +**Command suggestions** are optional and Off by default. When the person turns them on (Settings → Ask → Command suggestions → Local model), a request Ask's own resolver cannot place (never one it refused) may get one shell command from the local model. The model receives only the request text, the shell and the OS family; its answer is validated strictly (one plain line, no control or escape sequences), labelled by NMSh's own command classifier rather than the model, and offered for Copy or Insert only. Inserting places it in the composer unsent; only the person's Enter runs it. + ## 20. Configuration and persistence Let `` mean the directory selected by the shared path resolver: diff --git a/website/src/content/reference/background-tasks.md b/website/src/content/reference/background-tasks.md index 90b310ca..3ec772c9 100644 --- a/website/src/content/reference/background-tasks.md +++ b/website/src/content/reference/background-tasks.md @@ -1,6 +1,6 @@ --- title: "Background task architecture" -description: "Canonical background task architecture from the v0.20.0 published source." +description: "Canonical background task architecture from the v0.22.0 published source." group: Technical reference order: 117 source: "docs/design/background-tasks.md" diff --git a/website/src/content/reference/changelog.md b/website/src/content/reference/changelog.md index 6204a8ec..9bbb8c42 100644 --- a/website/src/content/reference/changelog.md +++ b/website/src/content/reference/changelog.md @@ -1,6 +1,6 @@ --- title: "Canonical changelog" -description: "Canonical canonical changelog from the v0.20.0 published source." +description: "Canonical canonical changelog from the v0.22.0 published source." group: Technical reference order: 115 source: "CHANGELOG.md" @@ -12,6 +12,118 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ## [Unreleased] +## [0.22.0] - 2026-10-21 + +**Native viewing and editing, Semantic Output, `/track` and input you can trust.** NMSh still runs your real zsh, Bash or Fish in one persistent session. This release reads files and completed output without leaving it (`/view`), makes a quick edit to a small text file (`/edit`) or opens it in your own editor, puts a test run's or a build's counts and failures in one row above its raw output (Semantic Output), and keeps one live, refreshed result of a command in the transcript (`/track`). Typing while a command runs now goes where it belongs on evidence only: a password is never shown, queued or run as a command because NMSh could not yet tell who reads it, and a slow prompt hook no longer eats the next command. Up and Down step through history one command at a time with the position shown, Ask can suggest a command from your local model (never run for you), and there are Bun, Nix shell and container modules, `/modules explain` and five more theme families. + +v0.21.0 was prepared as a release candidate ([#429](https://github.com/raiseCatError/notMyShell/pull/429)) but never published; its work first ships here, so this section lists everything since v0.20.0. + +**How this release was verified.** Automated: hosted CI (unit and real-PTY suites on macOS and Ubuntu, Node 22 and 26, a Fedora portability subset and the timing smokes) on the exact release commit, in a pull-request run and a dispatched run, both green. The maintainer accepted that hosted run in place of a local `npm run verify:release` on an 8 GB machine; the one local full run made (3,730 of 3,741 passing) had 11 load-sensitive live-terminal non-passes that passed when rerun alone, which is recorded here as that and not as a clean pass. **Physical: not performed for the nine required passes and the final-addition passes (multiline modes, images, text sizing, the document workspace, `/browser`, the arcade). The maintainer decided to release without them and accepted that risk; that is an acceptance, not a test result.** State, evidence and every open risk are in the [v0.22 physical QA record](docs/testing/v022-physical-qa.md) and the [v0.22 ledger](docs/development/v022-ledger.md). + +### Added + +- **Reviewed multiline pastes run three ways** ([design](docs/design/multiline-execution-modes.md)). *Review commands* now uses NMSh's shared panel components (a mode strip, the selection band, the standard controls) instead of bracketed options. **One at a time** (the default; each command waits in the composer for your Enter), **Queue all** (one confirmation, then the commands run in order; shell commands go through the session's queue and its failure policy, NMSh commands such as `/modules`, `/track` and `/view` run in NMSh and never reach the shell; it stops on a failure, a paused or cleared queue, or Esc, and never types into a running program) and **Run as block** (a shell-only paste as one original submission, with a warning that shells may read a block differently; not offered when NMSh commands are in the list, with the reason). A paste that cannot be separated safely offers Run as block, Edit and Cancel, with Edit as the default. Nothing runs until Enter on a mode. +- **Real images in NMSh** ([design](docs/design/graphics-service.md)). `/view image.png` (PNG, JPEG, GIF first frame, WebP through a converter already on the machine such as `sips`) opens the image in the viewer's own frame: fit with aspect kept, zoom 150–400% with pan, `n`/`p` through the folder's images, `c` copies the path. Markdown and HTML documents draw local images where they are written (inside the document's folder or git project); remote, `data:` and escaping references are never fetched and show `[image: alt]` with the reason; `i` opens a document's image. One graphics service decides how: Kitty graphics with Unicode placeholders where the terminal answers the protocol query, iTerm2 inline images (known host), Sixel where the terminal reports it, and quadrant-block character art everywhere else (Zed, Terminal.app, tmux, SSH, `NO_COLOR`). Settings → General → Images (Auto, Kitty graphics, iTerm2 inline, Sixel, Unicode, Off); `/doctor` shows what was detected and why. SVG is never drawn. +- **Larger headings where the terminal can scale text** ([design](docs/design/typography.md)). Kitty's text sizing protocol (OSC 66) is detected with the specification's cursor-position test, scale and width separately, and used for Markdown `#` and HTML `

`–`

` in `/view` (one 3×, 2×, 1.5× then ordinary-size scale), game titles and celebrations. Body text, code and tables are never enlarged; nothing is sized in a terminal that did not prove it, and sized text is never written to the transcript, a file or the clipboard. Settings → General → Text sizing (Auto, Off, Enhanced). +- **One workspace for Markdown and HTML files** ([design](docs/design/document-workspace.md)). `/view README.md` opens the file's source (read-only navigation); `h` shows the rendered preview, `e` edits the same buffer, `r` refreshes, `Ctrl+S` saves with the editor's atomic save, BOM and line endings kept. The preview shows the *current buffer*, saved or not, and never saves. While typing, `h`, `e` and `r` are text; `Ctrl+O` switches to the preview from anywhere. `/edit file.md` opens the editor directly. A file that cannot be edited safely stays readable in the viewer, with the reason. +- **`/browser`: a real browser in the terminal** ([design](docs/design/browser.md)). Chromium rendering (CSS layout, fonts, animations, JavaScript, SVG, canvas) of a page, shown through the graphics service as Kitty images where the terminal proved them and as character art elsewhere, with tabs, an address bar, back/forward, reload, find, zoom, mouse and keyboard forwarding, and a focus model that never steals typing. It uses a Chrome or Chromium you already have (set `NMSH_BROWSER` for another), starts only when a browser surface opens and stops when idle, in a throwaway profile; nothing is downloaded. Settings → General → Real browser (Auto, Off). With it, the workspace preview is the same Chromium (CSS animations and transitions included, scripts off unless you trust the file with `T`); without it, NMSh's own renderer stays the preview. +- **Vespyr Arcade** ([design](docs/design/arcade.md)). `/games` (also `/game` and `/arcade`; `/game run`, `flight`, `dash`, `sudoku`, `vespyr-doku`): **Vespyr Run**, **Vespyr Flight** and **Vespyr Dash** (endless, deterministic, with course generators proven fair by simulation), **Classic Sudoku** (four difficulties, notes, hints, undo, a unique-solution generator) and **Vespyr Doku** (a cat-placement puzzle on colored regions; one cat per row, column and region, none touching). Colors come from the active theme and Chroma; NO_COLOR, Safe Glyphs and reduced motion are respected; scores and unfinished puzzles stay in a small local file next to the configuration. The arcade never opens over a running command and closes if one starts, so a game can never take a password or a reply meant for a program. + +- **`/view`, a native read-only viewer** for files and completed output ([#397](https://github.com/raiseCatError/notMyShell/issues/397)). `/view README.md` opens a file relative to the shell's directory (`~` for home): Markdown renders (`m` shows the source), source files get syntax colors and line numbers, `.diff`/`.patch` files and `git diff`/`git show` output read as diffs. `/view N` opens completed output N (numbered as `/copy` numbers it) and `/view` the latest; Actions → View output does the same for a block. Find with `/` and `n`/`N`, go to a line with `:`, `w` toggles wrapping (Left/Right scroll sideways), `l` line numbers, `c` copies the whole text, Esc closes. Viewing never changes the file or the transcript. + - **HTML renders natively** ([#454](https://github.com/raiseCatError/notMyShell/issues/454), requested in physical QA): `.html`/`.htm` files, and HTML inside Markdown (a README's ``, ``, `
`, ``), as terminal rows from a supported subset: headings, paragraphs, lists (nested, task boxes), tables, code, quotes, rules, emphasis, links and images. Nothing in it is run, styled by CSS or loaded: scripts, styles, embedded and interactive content are dropped, an image is its alt text (never fetched or read), links follow the same http(s)-only rule, and the parser is linear and bounded. `m` shows the source. Agent replies and other Markdown keep showing tags as text. + - Limits: regular files only (directories, devices and pipes are refused), at most 8 MiB and 200,000 lines (the rest is named, with `less` or an editor as the way to read it), binary and UTF-16 files are refused, invalid UTF-8 is shown with `�` and a note. Control characters, escape sequences and invisible format characters are shown as visible marks, never interpreted. Open in pager, `less`, `bat` and Glow are unchanged. +- **`/edit`, a small native editor** for one text file ([#402](https://github.com/raiseCatError/notMyShell/issues/402)). `/edit notes.md` (or `e` in `/view`) opens the file in a panel: type, select with Shift, Ctrl+Z / Ctrl+Y undo and redo, Ctrl+F find, Ctrl+C / Ctrl+X copy and cut, Ctrl+S save, Esc close (it asks about unsaved changes). A path that does not exist yet is created on the first save. It is for quick edits, not an IDE: `vim`, `nano`, `micro` and your `$EDITOR` still run as usual. + - Safe saving: the new text is written beside the file and renamed over it, keeping its mode, group, line endings, BOM and final newline; a symlink stays a symlink. If the file changed, was replaced or was deleted since you opened it, nothing is written until you choose Keep editing, Overwrite or Reload. A new file never replaces one that appeared meanwhile. + - Limits: your own regular UTF-8 text files up to 1 MiB with one hard link, writable, with one kind of line ending. Others are refused with the reason and stay readable in `/view`. Extended attributes and ACLs are not carried over by a save. Unsaved text is lost if the NMSh window itself is closed. +- **Semantic Output** for test runs and builds ([#386](https://github.com/raiseCatError/notMyShell/issues/386), first phase). A completed block whose output NMSh recognizes gets one overview row with the counts the tool printed (`✔ node --test · 1,772 passed · 0 failed · 25 skipped`, `✘ TypeScript · 3 errors in 2 files`) and, when it listed failures or diagnostics, a details row that opens them, taken verbatim from the output. Recognized: Node's test runner (spec and TAP), Jest, Vitest, pytest, `cargo test`, `go test`, TypeScript, Rust and GCC/Clang diagnostics; anything else stays raw only, and short passing output gets nothing. Details start open when the raw output is folded; click the details row or use Actions → Show or hide details. The output itself, its folding, search, selection and plain `/copy` are unchanged. `/copy --semantic` copies the reading (raw for an output without one, as the note says) and `/copy --both` the raw output and the reading under labelled NMSh separators. Settings → Transcript → Semantic Output turns it off. +- **Native modules: Bun, Nix shell and container** ([#364](https://github.com/raiseCatError/notMyShell/issues/364)). Bun's requested version comes from `.bun-version` or `package.json` (`packageManager`, `engines.bun`) and the active one from its install location; the Nix shell module shows `pure`/`impure` from `IN_NIX_SHELL`; the container module names Docker, Podman, a dev container or Codespaces from marker files and host variables. None runs anything; all are off until enabled in `/modules`, which recommends Bun and Nix when their files are present. +- **`/modules explain` and `/modules timings`** ([#365](https://github.com/raiseCatError/notMyShell/issues/365)) write a plain-text report into the transcript: each configured module's surface, whether it is on screen and why (including when the Context Rail or Status Strip left it out, or shortened it, to fit the width in the last frame), and its sources' state, age and last collection time; or the slowest last collections. They read what the Context Engine already has and collect nothing. +- **Five more bundled theme families** ([#401](https://github.com/raiseCatError/notMyShell/issues/401)): Ayu (Dark, Mirage, Light), Kanagawa (Wave, Dragon, Lotus), Everforest (Dark, Light), Flexoki (Dark, Light) and Night Owl (Night Owl, Light Owl), with colors copied exactly from each project's MIT-licensed source at a recorded revision. They theme NMSh's own prompt fills and chrome only; the terminal's own colors and configuration are never changed. Existing theme ids and saved choices are unchanged, and Lavender stays the default. Theme Studio's Built-in list gains `/` to filter by name, family, or `dark`/`light`. +- **`/track`** keeps one live result of a finite command in the transcript, refreshed in place ([#393](https://github.com/raiseCatError/notMyShell/issues/393)). `/track df -h` or `/track --every 5s -- docker system df` writes the command once, then shows a status row (`live · every 5s · updated 13:49:25 · exit 0`, a failing exit, a timeout, paused, stale, refreshing) and the latest result under it, with a stable height. The shell stays free; nothing accumulates per refresh, and find, selection and `/copy` never include the live rows. `/track copy` copies the latest result, `/track refresh`, `pause`, `resume` and `stop` control it, and stopping leaves the last result in the transcript once. Samples run `sh -c` from the starting directory with your shell's PATH (not its aliases or functions), never overlap, and are bounded (200 kB, a timeout, at most 8 trackers); destructive and unknown commands are refused or need a Yes, as for `/watch`. Trackers stop with the window that started them. `/watch` keeps its manager and its behavior; both share one scheduler, which gains stricter interval parsing, refusals for substitutions, background jobs and heredocs, UTF-8-safe bounded capture, visible timeouts and a stop grace period (from draft #394). +- **From `/view` to your own editor** ([#366](https://github.com/raiseCatError/notMyShell/issues/366)). In `/view` of a file, `o` opens it at the first line on screen through the same bridge as `/open`: Zed or VS Code (around NMSh, or chosen in Open with) opens beside NMSh, and a terminal editor from `$VISUAL`/`$EDITOR` gets its command placed in the composer for you to run, never run for you. A draft already in the composer is never replaced, and with no editor known the viewer says how to set one. A file `/view` shows only in part, or cannot decode, now names this way to the rest. +- **Choose a terminal editor for `/open` when VISUAL and EDITOR are not set** ([#366](https://github.com/raiseCatError/notMyShell/issues/366)). Settings → Terminal editor (also in `/providers`) lists Neovim, Helix, Micro, Vim, nano, Emacs and Kakoune, marks which are installed here, and saves one you have; one that is not installed cannot be chosen, and NMSh never installs an editor. `/open` then puts that editor's command in the composer for you to run, with the line and column in the form that editor documents (`hx file:12:5`, `nano +12,5 file`, `emacs -nw +12:5 file`, `nvim +12 file`). Zed or VS Code (around NMSh or chosen in Open with) and VISUAL/EDITOR still come first. When nothing is set, the message names the editors installed here. +- **Command suggestions in Ask, from your local model** ([#432](https://github.com/raiseCatError/notMyShell/issues/432), first part). Off by default; Settings → Ask → Command suggestions → Local model turns them on. For a shell task Ask does not do itself (`/btw convert every png here to webp`: changing files in bulk, or finding them by size, age or duplicates), or a request it cannot place, your local model (set up in `/llm`) may suggest one shell command; with suggestions off, Ask says it does not run such tasks and where suggestions are turned on. Ask shows it with NMSh's own check (reads only, changes things, installs software, destructive), never the model's, and offers Copy or Insert only: Insert puts it in the composer unsent, and only your Enter runs it. The model is sent the request, the shell and the OS family, nothing else; requests Ask refuses stay refused. Remote providers are not part of this release. + +### Changed + +- **Reviewing a multiline paste starts on One at a time, and `q`, `b` and `o` only choose a mode.** The first Enter on the review no longer queues the commands (v0.22 candidates did); choose Queue all (`q`) and press Enter. The old bracketed options are gone. +- **`/view` on an editable Markdown or HTML file opens its source first** (`h` for the rendered view, `m` is no longer needed). Files the editor refuses (too large, read-only, mixed line endings) still open rendered in the read-only viewer. + +- **A line entered with Enter while a command runs waits for your approval; Ctrl+Q queues a command to run after it** ([#426](https://github.com/raiseCatError/notMyShell/issues/426)). While a command runs and NMSh sees no question, Enter used to queue the line to run by itself after the command. That line can be the command's reply to a read NMSh never saw, and nothing about its text tells the two apart (`yes`, `ls`, a one-time code and `X=1` are all valid replies), so it is now held: the queue shows it as `(typed while make ran)`, never by its text, and it runs only once you approve it at the prompt (Enter reviews it, Tab shows it, Enter approves; `e` edits; `n` pauses the queue). **Ctrl+Q** is the explicit way to queue a command to run after, as before. The composer says so while a command runs: `Enter holds it for approval · Ctrl+Q runs it after · Ctrl+S sends to make`. A line typed right after Ctrl+C or Ctrl+Z is for the prompt the stop brings back: it runs there once the prompt is back. If the program survived the stop, the line goes to it instead (at once if it asks, else when the moment of the stop has passed, about 2 s); what it never reads waits for approval. A line begun while a slow prompt hook holds the prompt back, after the shell said the command is done, runs at the prompt. +- **Up and Down step through history one command at a time, however many lines a command has** ([#389](https://github.com/raiseCatError/notMyShell/issues/389)). Once Up has recalled a command, each Up or Down moves to the next older or newer command, even when the recalled one spans several lines or wraps; before, a recalled five-line command took five extra presses to pass. Typing, pasting, deleting, moving the caret or selecting in a recalled command makes it a draft again, where Up and Down move between its lines as before, and Down past the newest command restores exactly what you had typed. Editing a fresh multi-line draft is unchanged. + - While you step through history, the bottom composer rule shows where you are: `History 2/120`, counted back from the newest command. It sits on a rule that is already there (the top one when the bottom one is not free), in the same subtle color as other text on those rules, and never covers Keep Awake or the prompt. It never adds a row or moves anything; with no free rule, or no room on it, it is not shown. + +### Fixed + +- Multi-line progress displays that redraw their own rows (cursor up and erase line, as concurrent downloads and container pulls do) now update in place instead of leaving a copy of every frame in the transcript ([#388](https://github.com/raiseCatError/notMyShell/issues/388)). A program can redraw only its own recent rows, at most a screen height up, never NMSh's lines or earlier commands; `/copy` copies the final rows once. Rows are the terminal's rows: a line wider than the window counts as the rows it occupies, so a display that redraws over its own wrapped line no longer erases the log lines above it at narrow widths. A status row an installer reserves below a scroll region is not written into the log. Absolute cursor positioning is not mapped. +- Pasting several lines that mix NMSh commands with shell commands no longer sends NMSh's lines to the shell or turns the block into one unknown NMSh command ([#450](https://github.com/raiseCatError/notMyShell/issues/450), found in physical QA: `cd modules/bun-app` then `/modules` gave `zsh: no such file or directory: /modules`; four `/track` lines gave an unknown-command error). Enter on such a block, pasted or typed with Ctrl+J, runs and queues nothing: it opens the reviewed list, and **One at a time** puts each command in the composer, unsent, in order. Each runs on your own Enter, the next is offered only after the one before succeeded, and Esc stops. Multi-line shell text (scripts, heredocs, quotes) is unchanged. +- While a program waits for input, its headline keeps the queue in view and says when queued commands now wait for your approval (`≡ 2 queued · 2 for approval`); on a narrow screen it shortens the headline before dropping the queue to a bare count ([#452](https://github.com/raiseCatError/notMyShell/issues/452), physical QA). +- Ask with your local model no longer answers a shell task with an unrelated screen: `/btw convert every png here to webp` showed the folder listing, because the intent model read it as "list files" and that answer stood ([#446](https://github.com/raiseCatError/notMyShell/issues/446), physical QA). A refusal is never re-read by the intent model either, in Auto or Always. A model that suggests no command now says so. +- Markdown wrapping no longer glues two words together when the second fits only without the space before it (`A calmerterminal`), in every Markdown surface. +- A queued command whose command word was still being classified when the next prompt reported new shell knowledge no longer keeps the unclassified color ([#408](https://github.com/raiseCatError/notMyShell/issues/408)). +- With a slow zsh configuration (one that takes longer than a second and a half to load, as nvm or a large framework can), command colors no longer stop for the rest of the session: the first lookup waited on the configuration, timed out, and ended the helper that tells known commands from unknown ones. +- Paste review and `/track`: a redirect into a file is recognized wherever `>/dev/null` also appears (`echo x > ~/.zshrc 2>/dev/null` was labelled read-only), and `>|` is a redirection, not a pipe. +- `/track` and `/watch` no longer start, without asking, commands that change things through the network or another command: `env `, `NAME=value` prefixes, git's `-c`/`--ext-diff`, `npm publish`/`login`/`x`, `pnpm dlx`, `ssh`, `curl -X POST`/`-d`/`-o file`, plain `wget`; options that write files (`git … --output`, `sort -o`, `jest -u`, `--fix`) are refused. Read-only probes (`ping`, `dig`, `nc -z`, a curl GET) still start at once, and `npm test 2>&1` is no longer refused as a background job ([#393](https://github.com/raiseCatError/notMyShell/issues/393)). +- `/track stop` and a closing window end every process a tracked command left in its process group, including one that ignored TERM; a tracker whose directory disappeared names it instead of reporting `spawn /bin/sh ENOENT`. +- **Fish 3: NMSh no longer interrupts Fish's own output** ([#443](https://github.com/raiseCatError/notMyShell/issues/443)). The shell's terminal size followed NMSh's own layout, so a command starting or ending, a growing composer, a completion menu, a notice or Settings each resized it and signalled the running program (SIGWINCH); Fish 3 does not retry a terminal write that signal interrupts, and lost part of its output (`write: Interrupted system call`). The terminal's size now comes from the window and the configured layout only, and while a command runs only a real change of the window resizes it. Full-screen programs still get the whole window; the transcript can be a few rows shorter than the terminal, as it already was under Dock Top, and shows the newest rows. +- A command typed while the shell was showing its prompt again (after Ctrl+C, or after any command when a prompt hook is slow, as a heavy theme or `nvm` can be) no longer loses its beginning ([#436](https://github.com/raiseCatError/notMyShell/issues/436)). NMSh no longer reads the shell's own prompt hooks as the finished command waiting for input (`Probably waiting for input` while the prompt came back), and a late report of the question Ctrl+C ended no longer turns what you typed after it into a discarded reply; the rest of the line used to run on its own (`cho Y …`, command not found). + +### Security + +- **Images and documents cannot read or reveal what they should not.** Image references from a document are checked lexically and then on the real path against the document's folder or project before any file is opened, so a symlink or `../` out is refused and nothing is learned about paths outside; remote and `data:` references are never fetched; files are read from a checked descriptor with size, pixel and inflation limits; SVG is never rendered; file names are drawn with control characters replaced. +- **The browser preview is isolated.** A document preview is served from memory on a loopback-only server behind an unguessable path, with a Host check, a strict path and file-type allow-list and a restrictive Content-Security-Policy; scripts are off unless you trust the file, and a preview can reach only its own origin (a clicked link is reported, never followed). The browser runs with sandboxing on, no remote debugging port (a pipe), no extensions, downloads and permission prompts denied, a minimal environment and a throwaway profile; previews share no cookies with browsing. +- **A game can never own the keyboard of a running command.** The arcade and the browser refuse to open while a command runs, and close at once if a command starts. +- **Passwords and other replies are never shown, queued or run as a command on a guess.** Typing while a command runs can no longer be shown, queued or run as a command before NMSh knows whether that command reads it ([#426](https://github.com/raiseCatError/notMyShell/issues/426)). On a heavily loaded machine a reply typed right after starting a prompt-less read (`read -r reply`, `read -s`) used to be queued, and a password could be queued as a shell command or shown in the composer. Keys now wait for NMSh's check (`Checking whether … · your typing is kept` after 0.8 s). When the check cannot tell, the typing stays held and hidden — `Can't tell whether is reading your typing` — until you choose: Ctrl+S sends it to the program, Tab shows it in the composer, Esc discards it. Input with echo turned off is never drawn, whatever else NMSh knows. Ctrl+C discards held typing, as a terminal flushes its input. When a command ends while typing is held for its check, including before its prompt returns while the shell's prompt hooks run, typing that may have been a reply or a password is discarded with a note, never run; plain type-ahead that the check cleared at once stays for the next command. After NMSh answers a hidden question, typing that a check still finds next to hidden input may be the reply to a second question with no prompt: if the command ends first, it waits at the prompt, hidden (`held, not run · Tab shows it · Esc discards it`), and only your Tab and Enter run it. A reply typed and entered before a question with no prompt existed is queued like any command (NMSh could not know); once the command asks for input that NMSh sees, hidden or not, the commands queued while it ran wait for your approval instead of running after it. Tab shows held typing as text only: a Ctrl+Q or any other key typed while it was held never queues, sends or runs it. A password typed in the composer before the program printed its prompt (as with `sudo`) leaves the composer when the program asks for hidden input, is never sent as the answer, and is held at the prompt when the command ends; an Enter typed with it is dropped rather than sent as an empty answer. Type-ahead on an idle machine is unchanged. +- **No reply becomes a shell command by itself** ([#426](https://github.com/raiseCatError/notMyShell/issues/426)). A line entered while a command runs, before a question NMSh saw, is held for your approval (see Changed), whatever it looks like: a reply that is itself a command name (`yes`, `sudo`, `ls`), a one-time code or an assignment used to run after the command succeeded when its read gave up unseen. The session's owner enforces the hold, not only the window: such an entry cannot be set to run by itself, and is shown as where it came from until you show it. It is never offered again by Up and never reaches the shell's history or NMSh's journal unless you approve it. Keys held while NMSh checked who reads them, whose command then ended, are held the same way instead of running at the prompt. +- **Typing a command never read cannot reach the shell** ([#426](https://github.com/raiseCatError/notMyShell/issues/426)). Input NMSh delivers to a program (an answer, keys for its own interface) that the program never reads stays in the terminal when its command ends; the shell then read a whole line as its next command and glued a partial one (a password typed into a read that timed out) onto the command NMSh submitted next. Now, when NMSh delivered input to a command, the shell's first prompt hook takes whatever is left out of the terminal (with `stty`, `head` and `od`, before it reads its next command line) and hands it to NMSh, which holds each line for your approval; input that arrives once the shell says the command is done is held and never written. zsh, Bash and Fish. +- **An older session service fails closed** ([#426](https://github.com/raiseCatError/notMyShell/issues/426)). A window attached to a service from an older NMSh (v0.20.0's), which cannot say what its checks saw, holds typing while a command runs, hidden, until you choose (Ctrl+S, Tab or Esc), and a line entered then waits for approval; the window says so, says what remains, and that the service restarts once its sessions end. + +### Compatibility +- Optional: a Chrome or Chromium (version 110 or newer) enables `/browser` and the rendered document preview; NMSh never downloads one, and works fully without. A terminal that answers Kitty's graphics query gets real images; text sizing needs Kitty's OSC 66 (nothing else is scaled). New runtime dependencies: `jpeg-js` (BSD-3, JPEG decoding) and `marked` (MIT, Markdown for the preview; loaded only when a preview opens). +- Node.js 22 or newer; zsh, Bash 4.4+ and Fish, as in v0.20.0. CI covers Node 22 and 26 on Ubuntu, Node 26 on macOS, and a Linux portability subset on Fedora. +- The session protocol is unchanged (version 2): a session service started by v0.20.0 keeps serving the sessions it owns, and new windows attach to it. `/view`, `/edit`, `/track`, Semantic Output, history browsing, the new modules and themes work at once. The input protections (#426, #436) and the background-task fix need a session service and shells started by this release; a window attached to an older service says so. +- `/track` needs `sh` and POSIX process groups (macOS, Linux, WSL 2). Ask's command suggestions need a local model set up in `/llm`. + +### Upgrade notes +- **Reviewed pastes:** press `q` (Queue all) then Enter where you used to press Enter on the review. +- **`/view README.md`** shows the source first; press `h` for the rendered view. +- New settings, all defaulting to Auto: Images, Text sizing, Real browser. Arcade scores are written to `arcade.json` in NMSh's configuration folder only when you play. +- **From v0.20.0** (v0.21.0 was never published): settings, themes, modules, sessions and history carry over; existing theme ids and saved choices are unchanged, and Lavender stays the default. +- Semantic Output is on for every configuration that has not turned it off (Settings → Transcript → Semantic Output). The Bun, Nix shell and container modules are off until enabled in `/modules`; Ask's command suggestions are off until Settings → Ask → Command suggestions → Local model. +- End the sessions of a v0.20 session service (or restart it once they end) to get the input protections and the background-task fix. +- **Queueing while a command runs:** use Ctrl+Q for a command you want to run after the one running. A plain Enter now holds the line for your approval at the prompt. +- Homebrew: `brew upgrade raiseCatError/tap/nmsh` installs whatever version the tap's formula points to; check `nmsh --version`. + +### Known limitations +- `/track` is window-owned: trackers stop with the window that started them, and a resumed session shows the last result, not a live one. Samples run `sh -c` with the shell's PATH, not its aliases or functions. +- Semantic Output is a first phase: built-in recognizers only (no `jc`, `delta` or other external providers), the raw output is not fully collapsed behind the reading, and find searches the raw output only. +- `/edit` does not carry over extended attributes or ACLs, and unsaved text is lost if the window itself closes; the size and file-kind limits are listed under Added. +- Progress redraws: absolute cursor rows (`CSI H`/`f`/`d`) are not mapped and scroll regions are not emulated ([#388](https://github.com/raiseCatError/notMyShell/issues/388)). +- `/modules explain` covers the Context Rail and Status Strip; the Main Prompt has no per-segment truncation trace ([#365](https://github.com/raiseCatError/notMyShell/issues/365)). +- Oxocarbon, GitHub Primer, Material/Palenight and Monokai are deferred, with reasons in `docs/design/theme-families.md` ([#401](https://github.com/raiseCatError/notMyShell/issues/401)). +- **Input while a command runs** ([#426](https://github.com/raiseCatError/notMyShell/issues/426), [#436](https://github.com/raiseCatError/notMyShell/issues/436)). What NMSh can and cannot tell: + - *Nothing typed while a command runs becomes a shell command by itself:* a line entered then waits for approval, typing the command never read is taken back from the terminal when it ends and waits for approval, and a line after Ctrl+C runs only at the prompt the stop brings back. What runs by itself is what you submit at the prompt, queue with Ctrl+Q, or approve. + - *A reply to a read NMSh has not seen yet* (no prompt, echo on, on a loaded machine, or any program's read on macOS) is held for approval instead of reaching the program: the program keeps waiting until you answer it again or send the line with Ctrl+S. A line typed after Ctrl+C for a question the program asks without NMSh seeing it, which then gives up before the program ends, still runs at the prompt. + - *Keys typed into a full-screen or interactive program as it exits* (`:q` then `ls` at once) are the program's: those it never reads are taken back when its command ends and wait for approval, instead of running at the prompt as in a plain terminal. + - *An answer NMSh sends to a question it sees* reaches the terminal at once. If the program stops reading in the same instant (a timed read giving up exactly then), NMSh cannot take back what the kernel already holds, but the shell's prompt hook takes it out before reading its next command, and NMSh holds it. Input sent within the instant between the shell finishing the command and NMSh learning so (well under a millisecond on an idle machine) can still reach the shell; that window is the limit of what a terminal frontend can see. + - *Hidden input* (echo off) is never shown, queued or run on a guess. Typing NMSh cannot place is held until NMSh sees the program's question (then it goes to the program, as its answer) or you choose (while the command runs: Ctrl+S sends it, Tab shows it, Esc discards it; at the prompt: Tab or Esc); a command that ends while typing was held past 0.8 s discards it. + - *History:* typed input reaches your shell's history and NMSh's journal only when it runs as a command (a composer line you submit, a Ctrl+Q entry or one you approve); the transcript also shows what a program echoes back (a visible reply), never hidden input. Held typing and entries waiting for approval stay in memory and are never written to disk. + - *Typing that reaches a finished command's prompt hook in pieces* (fixed in this release): a line typed after the shell said the command was done, and before its prompt, was held as one approval entry per piece the terminal delivered it in, so a slow macOS prompt hook turned `echo NEXT` into about sixteen entries of fragments (`e`, `c`, `h`...). Nothing ever ran by itself, but approving them ran the fragments. The pieces are put back together as the lines typed (corrections such as Backspace reach the text they correct), and a line left without Enter is held once the typing stops. + - *A line entered the instant a queued command is approved:* a window learns what the shell is doing from the shell's events, which reach it a few milliseconds after the shell acts (longer on a loaded machine). A line submitted in that gap, before the window has seen the approved queue entry start, runs after it, once and in order, with nothing lost or run unapproved, but the window attributes the first prompt to the line it submitted: the queued command's transcript record is missing and the submitted line is recorded twice. Found by a live test that typed within about ten milliseconds of the approval; the test now waits for the approved command's record. + - *Prompt hooks:* zsh's single `precmd` function and Fish's other `fish_postexec` handlers run before NMSh's done marker, so a slow hook there can still be read as the command waiting (`Probably waiting for input`). What you type then is held for approval or taken back at the hook, never run by itself. + - *An older session service* (v0.20) has none of the shell-side protections: typing a program receives but never reads can still reach the shell there. This window fails closed (see Security) until the service restarts. +- Keys typed *during* a Fish `read` stay subject to Fish's own editor queries ([#356](https://github.com/raiseCatError/notMyShell/issues/356)). Keys typed after its answer, before the prompt is back, are no longer read by Fish as the next command: they are taken back when the command ends and wait for approval, never lost. +- Ask's command suggestions use your local model only; remote providers are not part of this release ([#432](https://github.com/raiseCatError/notMyShell/issues/432)). A suggestion is only as good as the model: the small recommended model (Qwen3 0.6B) often suggests an imprecise command or none; NMSh labels each one with its own check and never runs it. +- NMSh's own HTML renderer (the fallback preview when no browser is installed or the setting is Off) shows a subset: no CSS layout, forms or embedded media. With a browser installed the preview is Chromium's. +- **Hosted macOS live-terminal tests are intermittent.** Over the last two days about 4 in 10 of the repository's hosted CI runs passed on the first attempt, before and after this integration; the failures were live-PTY tests on macOS (typing-after-read, input ownership, queue ownership) and, before they were fixed, two multiplexer tests. Two causes were found and fixed (test timing assumptions; typing held in pieces after a command was done), but the cause of the remaining macOS failures is not established, and they are not shown to be harmless. A failed hosted job on a pull request that passes on the dispatched run is that known instability and not by itself a regression; a failure that repeats on a rerun is not. +- **Not physically verified (NOT RUN):** Kitty graphics and Unicode placeholders in Ghostty and Kitty, OSC 66 text sizing in any terminal, character art in Zed and Terminal.app, iTerm2 and Sixel output, Chromium frames in any terminal, and play of the five games. Automated tests cover the protocol output, fallbacks and game rules, not how any of it looks or feels in a real terminal. See [v0.22 physical QA](docs/testing/v022-physical-qa.md). +- Ghostty accepts text sizing sequences but is not known to draw scaled glyphs, so Auto leaves it off there; Enhanced is the explicit override. +- Images are never fetched from the network, animated images show their first frame, and WebP needs a converter that is already installed (`sips` on macOS, `dwebp`, ImageMagick or `ffmpeg`). +- Inside tmux, screen and Zellij images are character art and text is not scaled (graphics would need passthrough, which NMSh does not use). +- The browser preview refreshes when you ask (`r`); there is no split view, so no automatic refresh while typing. Leaving the preview closes its page; the scroll position is kept across refreshes only. `/browser` forwards what a terminal can express: no smooth scrolling, gestures or file pickers, and downloads are refused. +- Linux stays beta: automated CI on Ubuntu and Fedora, no physical pass. Everything listed under v0.20.0's known limitations still applies. +- **Linux (beta) with Fish 3** ([#443](https://github.com/raiseCatError/notMyShell/issues/443); shown with Fish 3.7.0 on Ubuntu 24.04). Fish 3 does not retry a terminal write that a window-size change interrupts. NMSh no longer causes one (see Fixed), and its own markers on Fish 3 go through `cat`, which does not lose them ([#449](https://github.com/raiseCatError/notMyShell/pull/449)). A real resize of the window while Fish itself writes output (`echo`, `printf`, `string`) can still lose part of that output, with `write: Interrupted system call` in its place: that is Fish 3's own handling of the signal, which NMSh cannot change and which happens in any terminal. Fish 4, zsh and Bash retry. The new CI stress loop did not reproduce the loss on either build, so the improvement is shown by the removed cause (no signal from NMSh's own layout), not by a measured loss rate. + ## [0.20.0] - 2026-10-18 **Terminal workflow, first-run setup, background tasks & native modules.** The first stable release since v0.18.0. A new first run lets you pick a starting point under a live aurora and review it before anything applies; queued commands read as a chronological timeline with saved summaries; completed output can be selected, copied and acted on from the keyboard; optional tools are discovered, reviewed and installed through one flow; long-running commands can run as background tasks beside the shell; and the native module catalog covers twelve more runtimes and build tools. Every new control is reached through an explicit command, key or review, and the persistent shell, the queue and program input keep their behavior. @@ -614,7 +726,8 @@ Session & Interaction UX, plus the appearance and customization system. ### Fixed - Process cleanup teardown to safely kill detached helper shells and delete temporary configuration directories during testing. -[Unreleased]: https://github.com/raiseCatError/notMyShell/compare/v0.20.0...HEAD +[Unreleased]: https://github.com/raiseCatError/notMyShell/compare/v0.22.0...HEAD +[0.22.0]: https://github.com/raiseCatError/notMyShell/compare/v0.20.0...v0.22.0 [0.20.0]: https://github.com/raiseCatError/notMyShell/compare/v0.18.0...v0.20.0 [0.18.0]: https://github.com/raiseCatError/notMyShell/compare/v0.17.0...v0.18.0 [0.17.0]: https://github.com/raiseCatError/notMyShell/compare/v0.16.0...v0.17.0 diff --git a/website/src/content/reference/configured-completion.md b/website/src/content/reference/configured-completion.md index bb23dc99..2fd6e7cb 100644 --- a/website/src/content/reference/configured-completion.md +++ b/website/src/content/reference/configured-completion.md @@ -1,6 +1,6 @@ --- title: "Configured completion" -description: "Canonical configured completion from the v0.20.0 published source." +description: "Canonical configured completion from the v0.22.0 published source." group: Technical reference order: 107 source: "docs/design/configured-completion.md" diff --git a/website/src/content/reference/context-modules.md b/website/src/content/reference/context-modules.md index a8d7c3ed..c157e66c 100644 --- a/website/src/content/reference/context-modules.md +++ b/website/src/content/reference/context-modules.md @@ -1,10 +1,9 @@ --- title: "Context modules and packs" -description: "Canonical context modules and packs from the v0.20.0 published source." +description: "Canonical context modules and packs from the v0.22.0 published source." group: Technical reference order: 103 source: "docs/architecture/context-modules.md" -editorial: ["The release-status paragraph said the module platform was still pending acceptance. It shipped in v0.18.0 and is part of v0.20.0."] --- NMSh runs around a real persistent zsh, Bash or Fish session. Its native modules diff --git a/website/src/content/reference/contributing.md b/website/src/content/reference/contributing.md index 28166fad..ceee08c7 100644 --- a/website/src/content/reference/contributing.md +++ b/website/src/content/reference/contributing.md @@ -1,10 +1,9 @@ --- title: "Contributing to NMSh" -description: "Canonical contributing to nmsh from the v0.20.0 published source." +description: "Canonical contributing to nmsh from the v0.22.0 published source." group: Technical reference order: 114 source: "CONTRIBUTING.md" -editorial: ["The tagged document linked to a private GitHub Project. The link now points to the public issue tracker."] --- Thank you for your interest in contributing to notMyShell (NMSh)! @@ -27,7 +26,7 @@ Before starting work, check: - **[ARCHITECTURE.md](ARCHITECTURE.md)** — how the pieces fit together; start here before changing a subsystem - **[ROADMAP.md](ROADMAP.md)** — product direction and what is planned - **[GitHub Issues](https://github.com/raiseCatError/notMyShell/issues)** — concrete actionable work; acceptance criteria in each issue are authoritative -- **[v0.20.0 Release](https://github.com/raiseCatError/notMyShell/releases/tag/v0.20.0)** — current stable release, merged through [PR #392](https://github.com/raiseCatError/notMyShell/pull/392) (see [ROADMAP.md](ROADMAP.md)) +- **[v0.22.0 Release](https://github.com/raiseCatError/notMyShell/releases/tag/v0.22.0)** — current stable release, merged through [PR #444](https://github.com/raiseCatError/notMyShell/pull/444) (see [ROADMAP.md](ROADMAP.md)) - **[CHANGELOG.md](CHANGELOG.md)** — the authoritative record of notable changes; see [Changelog](#changelog) below - **GitHub Issues** — [raiseCatError/notMyShell issues](https://github.com/raiseCatError/notMyShell/issues) — public bug reports, proposals and development status diff --git a/website/src/content/reference/copy-actions.md b/website/src/content/reference/copy-actions.md index 07283f24..66697fb3 100644 --- a/website/src/content/reference/copy-actions.md +++ b/website/src/content/reference/copy-actions.md @@ -1,6 +1,6 @@ --- title: "Output selection and Copy Actions" -description: "Canonical output selection and copy actions from the v0.20.0 published source." +description: "Canonical output selection and copy actions from the v0.22.0 published source." group: Technical reference order: 120 source: "docs/development/copy-actions-slice-3.md" diff --git a/website/src/content/reference/github-workspace.md b/website/src/content/reference/github-workspace.md index 0c15b61a..c7c86f49 100644 --- a/website/src/content/reference/github-workspace.md +++ b/website/src/content/reference/github-workspace.md @@ -1,6 +1,6 @@ --- title: "Read-only GitHub workspace" -description: "Canonical read-only github workspace from the v0.20.0 published source." +description: "Canonical read-only github workspace from the v0.22.0 published source." group: Technical reference order: 119 source: "docs/architecture/github-workspace.md" diff --git a/website/src/content/reference/onboarding.md b/website/src/content/reference/onboarding.md index 3286d527..ad1c1f42 100644 --- a/website/src/content/reference/onboarding.md +++ b/website/src/content/reference/onboarding.md @@ -1,6 +1,6 @@ --- title: "First-run behavior and validation" -description: "Canonical first-run behavior and validation from the v0.20.0 published source." +description: "Canonical first-run behavior and validation from the v0.22.0 published source." group: Technical reference order: 121 source: "docs/testing/post-v020-preferences-onboarding.md" diff --git a/website/src/content/reference/optional-tools.md b/website/src/content/reference/optional-tools.md index 36e8989d..a1b66dbc 100644 --- a/website/src/content/reference/optional-tools.md +++ b/website/src/content/reference/optional-tools.md @@ -1,6 +1,6 @@ --- title: "Optional tools and providers" -description: "Canonical optional tools and providers from the v0.20.0 published source." +description: "Canonical optional tools and providers from the v0.22.0 published source." group: Technical reference order: 105 source: "docs/architecture/optional-tools.md" diff --git a/website/src/content/reference/physical-qa.md b/website/src/content/reference/physical-qa.md index 29a526d4..cf7e83b2 100644 --- a/website/src/content/reference/physical-qa.md +++ b/website/src/content/reference/physical-qa.md @@ -1,6 +1,6 @@ --- title: "v0.20 physical QA checklist" -description: "Canonical v0.20 physical qa checklist from the v0.20.0 published source." +description: "Canonical v0.20 physical qa checklist from the v0.22.0 published source." group: Technical reference order: 111 source: "docs/testing/v020-physical-qa.md" diff --git a/website/src/content/reference/platforms.md b/website/src/content/reference/platforms.md index 33ec3f67..ac8941f5 100644 --- a/website/src/content/reference/platforms.md +++ b/website/src/content/reference/platforms.md @@ -1,6 +1,6 @@ --- title: "Platform evidence and limitations" -description: "Canonical platform evidence and limitations from the v0.20.0 published source." +description: "Canonical platform evidence and limitations from the v0.22.0 published source." group: Technical reference order: 102 source: "docs/architecture/platforms.md" diff --git a/website/src/content/reference/privacy.md b/website/src/content/reference/privacy.md index d2c91331..e01d80ae 100644 --- a/website/src/content/reference/privacy.md +++ b/website/src/content/reference/privacy.md @@ -1,6 +1,6 @@ --- title: "Privacy and local data" -description: "Canonical privacy and local data from the v0.20.0 published source." +description: "Canonical privacy and local data from the v0.22.0 published source." group: Technical reference order: 109 source: "docs/privacy.md" diff --git a/website/src/content/reference/prompt-customization.md b/website/src/content/reference/prompt-customization.md index a6ccab44..8d78b69f 100644 --- a/website/src/content/reference/prompt-customization.md +++ b/website/src/content/reference/prompt-customization.md @@ -1,6 +1,6 @@ --- title: "Native prompt customization" -description: "Canonical native prompt customization from the v0.20.0 published source." +description: "Canonical native prompt customization from the v0.22.0 published source." group: Technical reference order: 104 source: "docs/architecture/prompt-customization.md" diff --git a/website/src/content/reference/security.md b/website/src/content/reference/security.md index 31b5f1e9..8fe3f707 100644 --- a/website/src/content/reference/security.md +++ b/website/src/content/reference/security.md @@ -1,6 +1,6 @@ --- title: "Security policy" -description: "Canonical security policy from the v0.20.0 published source." +description: "Canonical security policy from the v0.22.0 published source." group: Technical reference order: 113 source: "SECURITY.md" @@ -10,7 +10,7 @@ Security is critical for NMSh, as it executes and presents shell commands and ha ## Supported Versions -Security fixes target the latest stable release (currently v0.20.0, the `master` branch) and the active development branch. Older releases are not patched separately; update with `/update`. +Security fixes target the latest stable release (currently v0.22.0, the `master` branch) and the active development branch. Older releases are not patched separately; update with `/update`. ## Scope @@ -37,6 +37,9 @@ Reports that break any of these are in scope: - **External prompt providers** (Starship, Oh My Posh, Powerlevel10k) run as bounded, non-interactive helpers with argv only; their output is treated as untrusted display text. - **Context discovery is not execution.** Entering a directory never runs repository-controlled code, sources `.envrc`, runs kubeconfig `exec` plugins, calls the network or reads credential values. Versions come from install layouts and metadata; executables on PATH are never run for context, and one inside the current workspace is not even inspected. - **Context Packs are data.** A pack names capabilities NMSh core implements and describes presentation; it cannot contain commands, code, paths, templates, includes or hooks, gains no authority by being installed, and is never installed or enabled because a repository was opened. +- **Documents and images are data.** Opening a Markdown, HTML or image file never runs it: remote and `data:` image references are never fetched, image paths must stay inside the document's folder or project (checked before any file is opened and again on the real path), images are decoded with size, pixel and inflation limits, SVG is never rendered, and a converter for WebP runs without a shell in a private directory. +- **A real browser is a different trust class from a document.** `/browser` runs ordinary web pages in a sandboxed Chrome or Chromium of yours with no debugging port, no extensions, denied downloads and permissions, and only `http`, `https`, `file` and `about:blank` addresses; a document preview is served from memory on a loopback-only server behind an unguessable path with scripts off unless you trust the file, a restrictive CSP and no access beyond its own origin. NMSh never downloads a browser. +- **Nothing takes the keyboard of a running command.** The arcade and the browser panel do not open while a command runs and close if one starts. - **Terminal text is hostile.** Directory names, Git metadata, pack metadata and agent reports pass one display boundary before reaching the screen or a terminal title: no control characters, escape sequences or bidi formatting. ## Reporting a Vulnerability diff --git a/website/src/content/reference/session-interaction.md b/website/src/content/reference/session-interaction.md index d3949935..fd0d1d44 100644 --- a/website/src/content/reference/session-interaction.md +++ b/website/src/content/reference/session-interaction.md @@ -1,6 +1,6 @@ --- title: "Session interaction design" -description: "Canonical session interaction design from the v0.20.0 published source." +description: "Canonical session interaction design from the v0.22.0 published source." group: Technical reference order: 108 source: "docs/design/session-interaction-ux.md" diff --git a/website/src/content/reference/shell-adapter.md b/website/src/content/reference/shell-adapter.md index de37120e..41eaccec 100644 --- a/website/src/content/reference/shell-adapter.md +++ b/website/src/content/reference/shell-adapter.md @@ -1,6 +1,6 @@ --- title: "ShellAdapter contract" -description: "Canonical shelladapter contract from the v0.20.0 published source." +description: "Canonical shelladapter contract from the v0.22.0 published source." group: Technical reference order: 101 source: "docs/architecture/shell-adapter.md" diff --git a/website/src/content/reference/terminal-workflow.md b/website/src/content/reference/terminal-workflow.md index 6eb42f83..d99ba6a2 100644 --- a/website/src/content/reference/terminal-workflow.md +++ b/website/src/content/reference/terminal-workflow.md @@ -1,6 +1,6 @@ --- title: "Terminal workflow design" -description: "Canonical terminal workflow design from the v0.20.0 published source." +description: "Canonical terminal workflow design from the v0.22.0 published source." group: Technical reference order: 116 source: "docs/design/terminal-workflow.md" diff --git a/website/src/content/reference/theme-bridge.md b/website/src/content/reference/theme-bridge.md index dde8cef0..d6771dcf 100644 --- a/website/src/content/reference/theme-bridge.md +++ b/website/src/content/reference/theme-bridge.md @@ -1,6 +1,6 @@ --- title: "Theme Bridge design and ownership" -description: "Canonical theme bridge design and ownership from the v0.20.0 published source." +description: "Canonical theme bridge design and ownership from the v0.22.0 published source." group: Technical reference order: 106 source: "docs/design/theme-bridge.md" diff --git a/website/src/content/reference/verification.md b/website/src/content/reference/verification.md index 28b8fe88..3b5389e2 100644 --- a/website/src/content/reference/verification.md +++ b/website/src/content/reference/verification.md @@ -1,6 +1,6 @@ --- title: "Development verification" -description: "Canonical development verification from the v0.20.0 published source." +description: "Canonical development verification from the v0.22.0 published source." group: Technical reference order: 112 source: "docs/development-verification.md" diff --git a/website/src/content/reference/workspace-keymap.md b/website/src/content/reference/workspace-keymap.md index 99b3a892..b00a583e 100644 --- a/website/src/content/reference/workspace-keymap.md +++ b/website/src/content/reference/workspace-keymap.md @@ -1,6 +1,6 @@ --- title: "Workspace keymap" -description: "Canonical workspace keymap from the v0.20.0 published source." +description: "Canonical workspace keymap from the v0.22.0 published source." group: Technical reference order: 118 source: "docs/design/workspace-keymap.md" diff --git a/website/src/content/releases/v0.22.0.md b/website/src/content/releases/v0.22.0.md new file mode 100644 index 00000000..b0199ad3 --- /dev/null +++ b/website/src/content/releases/v0.22.0.md @@ -0,0 +1,31 @@ +--- +title: "v0.22.0 — Native viewing, images, a real browser and Vespyr Arcade" +tag: v0.22.0 +date: 2026-10-21 +url: https://github.com/raiseCatError/notMyShell/releases/tag/v0.22.0 +--- +**Native viewing, images, a real browser and Vespyr Arcade.** NMSh still runs your real zsh, Bash or Fish in one persistent session. v0.22.0 is the next stable release after v0.20.0; it includes the v0.21.0 candidate, which was never published separately. + +## What's new + +- **Reviewed multiline pastes run three ways:** One at a time (the default), Queue all (shell and NMSh commands, stopping on a failure) or Run as block (shell commands only, with a warning). Quotes, loops and heredocs stay whole. +- **Real images:** `/view image.png` (PNG, JPEG, GIF first frame, WebP through a converter already installed) and images in Markdown and HTML, drawn with the Kitty graphics protocol where the terminal confirms it, otherwise as character art. Nothing is assumed from the terminal's name; Zed and multiplexers get character art. +- **Larger headings** where the terminal scales text (OSC 66, detected rather than assumed). Saved documents, the clipboard and transcripts never contain the sequences. +- **One workspace for Markdown and HTML:** `/view` opens the source, `h` previews, `e` edits the same buffer, `Ctrl+S` saves. The preview shows unsaved text. With Chrome, Chromium or Edge installed the preview is a real Chromium page (scripts off unless you trust the file); otherwise NMSh's own renderer. +- **`/browser`:** a real browser in the terminal, started only when you open it, in an isolated throwaway profile, with tabs, address bar, find, zoom, forms and mouse. +- **Vespyr Arcade:** `/games` (`/game`, `/arcade`): Vespyr Run, Flight and Dash, Classic Sudoku and Vespyr Doku, with local scores and no accounts. Only the open game reads the keyboard; it never starts over a running command. +- **Native `/view` and `/edit`**, Semantic Output (first phase), `/track`, safer typing while a command runs (passwords are never shown, queued or run as commands), history browsing with its position, Ask command suggestions from your local model, Bun, Nix shell and container modules, `/modules explain` and `timings`, and five more theme families. + +Full details, upgrade notes and compatibility are in the [changelog](https://github.com/raiseCatError/notMyShell/blob/master/CHANGELOG.md#0220---2026-10-21). + +## How this release was verified, and what was not + +- **Automated:** hosted CI on the exact release commit (unit and real-PTY suites on macOS and Ubuntu, Node 22 and 26, a Fedora portability subset and the timing smokes), in a pull-request run and a dispatched run. The maintainer accepted hosted CI in place of a local `npm run verify:release` on an 8 GB machine. The one local full run made had 3,730 of 3,741 tests passing; the 11 other tests are load-sensitive live-terminal tests that passed when rerun alone. +- **Physical terminals: not performed** for the nine required passes and for the final additions (multiline modes, images, text sizing, the document workspace, `/browser`, the arcade). The maintainer decided to release without them and accepted that risk; that is an acceptance, not a test result. Kitty graphics, OSC 66 and Chromium frames have not been seen in a real Ghostty or Kitty. + +## Known limitations + +- Hosted macOS live-terminal tests are intermittent (about 4 in 10 hosted CI runs passed first time over the two days before release). Two causes were found and fixed; the rest are unexplained and not shown to be harmless. +- A line entered in the few milliseconds around a queued command's approval can be attributed to the wrong command in the transcript (nothing is lost, repeated or run unapproved). +- Ghostty accepts text sizing sequences but is not known to draw scaled glyphs, so Auto leaves it off there. Images are never fetched from the network, animated images show their first frame, and WebP needs a converter that is already installed. +- The package is private; nothing is published to npm. Install with Homebrew (`brew upgrade raiseCatError/tap/nmsh`) or from source. diff --git a/website/src/data/launch.json b/website/src/data/launch.json index 9b47019c..38088346 100644 --- a/website/src/data/launch.json +++ b/website/src/data/launch.json @@ -1,9 +1,9 @@ { "state": "published", - "version": "0.20.0", - "ref": "v0.20.0", - "commit": "65e4de55b2d8f1ad3a734a9d415a353b56b81e2c", - "verifiedAt": "2026-10-18", - "date": "2026-10-18", - "url": "https://github.com/raiseCatError/notMyShell/releases/tag/v0.20.0" + "version": "0.22.0", + "ref": "v0.22.0", + "commit": "ef57ff4394b7e960730aafbad0c4fa07780ab311", + "verifiedAt": "2026-10-21", + "date": "2026-10-21", + "url": "https://github.com/raiseCatError/notMyShell/releases/tag/v0.22.0" } diff --git a/website/src/data/release.json b/website/src/data/release.json index be03a10f..e8a8c82d 100644 --- a/website/src/data/release.json +++ b/website/src/data/release.json @@ -1,12 +1,12 @@ { - "verifiedAt": "2026-10-18", - "sourceCommit": "65e4de55b2d8f1ad3a734a9d415a353b56b81e2c", - "tapVersion": "v0.20.0", + "verifiedAt": "2026-10-21", + "sourceCommit": "ef57ff4394b7e960730aafbad0c4fa07780ab311", + "tapVersion": "v0.22.0", "latest": { - "tag": "v0.20.0", - "version": "0.20.0", - "date": "2026-10-18", - "url": "https://github.com/raiseCatError/notMyShell/releases/tag/v0.20.0" + "tag": "v0.22.0", + "version": "0.22.0", + "date": "2026-10-21", + "url": "https://github.com/raiseCatError/notMyShell/releases/tag/v0.22.0" }, "requirements": { "node": "22+", @@ -17,6 +17,12 @@ ] }, "history": [ + { + "tag": "v0.22.0", + "date": "2026-10-21", + "url": "https://github.com/raiseCatError/notMyShell/releases/tag/v0.22.0", + "generatedSha256": "5cd1498d29bb71a243f513d7355e7a04669ce318cdb4534c401f9dd103fb4340" + }, { "tag": "v0.20.0", "date": "2026-10-18", diff --git a/website/src/data/upstream.json b/website/src/data/upstream.json index 38daee7e..7c3fe704 100644 --- a/website/src/data/upstream.json +++ b/website/src/data/upstream.json @@ -1,6 +1,6 @@ { - "commit": "65e4de55b2d8f1ad3a734a9d415a353b56b81e2c", - "version": "0.20.0", + "commit": "ef57ff4394b7e960730aafbad0c4fa07780ab311", + "version": "0.22.0", "state": "published", "routes": { "ARCHITECTURE.md": "architecture", @@ -31,161 +31,155 @@ "path": "ARCHITECTURE.md", "slug": "architecture", "title": "Runtime architecture", - "sourceSha256": "815181b91495f94f32d5b4a5b83a79b7bc0db6a416b1a022e7ab43ccc1f98cc0", - "generatedSha256": "737162f9306db8bf8573e25b25898dd0cd8f9e304383fa3ba5b18b3f46ca89f0" + "sourceSha256": "e5248f1111405e612cc0bda3c12ff88d1af1d5323ff52c9f5967ad3f829320ee", + "generatedSha256": "9b2663309257e2101992e4ea03082c2ed2460a57c8f7a15282259daed88d510d" }, { "path": "docs/architecture/shell-adapter.md", "slug": "shell-adapter", "title": "ShellAdapter contract", "sourceSha256": "6e32125e770f92ec561034364213b95817a2d024e788ada243dd6fafed5099e7", - "generatedSha256": "946c9fab87a15858aa7e99cb86421926db106be23ef9b8838cfb237303bf4d63" + "generatedSha256": "4fd00501cfcb650ad236cd2a53e709a4cfdc8c012e64d094fbced72f45927d9b" }, { "path": "docs/architecture/platforms.md", "slug": "platforms", "title": "Platform evidence and limitations", "sourceSha256": "0973407ce888bf58b226880861fc285657e8f6016267171a12a0464814fa3de4", - "generatedSha256": "7a2f7687cf42560109d72dbc48a01766417d87b499b19a0b63e0eb6d7db7a306" + "generatedSha256": "12d9a2d9da71dd9c8d692f1deeb15f342179df6c6fe6062040fe02d09726cc0e" }, { "path": "docs/architecture/context-modules.md", "slug": "context-modules", "title": "Context modules and packs", - "sourceSha256": "735b91b0fadd0ea2c33b3b9e4a56f530150e083038781e2b89e918e1385f966c", - "generatedSha256": "6e11afae418c6ef80e6f755196731533ae135057acf5ac8d479326095e1370ec", - "editorial": [ - "context-modules-release-status" - ] + "sourceSha256": "5dd120e995ed3dd2e9fac0448523ca8da4b6887b5b70f6a06f06bde5d855ee30", + "generatedSha256": "5419d2425c85e190186b5dd78573b6277d2f69e6412e3223973c9192c619ae9a" }, { "path": "docs/architecture/prompt-customization.md", "slug": "prompt-customization", "title": "Native prompt customization", "sourceSha256": "60d115e99e6d60aca96f626bd7c91dea16145d9cdffc85dd2994b715b93f6ae9", - "generatedSha256": "bb2f1cce5c786975ee70ab5da76b9bed3099373aab34789b469b95452bdcabc8" + "generatedSha256": "38748da9655a921d533c8086ad8cffc1e0ee0d643d3fed0776d8ead26b9d7bbe" }, { "path": "docs/architecture/optional-tools.md", "slug": "optional-tools", "title": "Optional tools and providers", "sourceSha256": "ea3e3d3ee4ba5f7b359eff1fcf2f2164eb8688ed43eab120bb85d251c502c792", - "generatedSha256": "573ec039fb4d52b0d2f0edc6661ff66c5816b6f56949513b07ab5bfeb9296e62" + "generatedSha256": "2d1c6cc2285e9182b041b8f4fc776ab2d3c6f69b61923d68c6e5f4c13dede5af" }, { "path": "docs/design/theme-bridge.md", "slug": "theme-bridge", "title": "Theme Bridge design and ownership", "sourceSha256": "dce83c87b7bfeaaeace9135780eaddeaa682c28de7d4a1f3905a54c09a7e1b94", - "generatedSha256": "2509a9d0cb67f9d80703e6737635deb7d43b4eb628e676114a5f79aa4a42a911" + "generatedSha256": "085844289d874fc96df8963aa94a44e7d18ecac77cf3702e5890a472134f50da" }, { "path": "docs/design/configured-completion.md", "slug": "configured-completion", "title": "Configured completion", "sourceSha256": "c52b36be63d645658ee29343f1e72a68cc0fbafc547d98a119d84b58473a7d63", - "generatedSha256": "ff8aee793816b500e01fb0606ad19703c57639510b2bc9b6dd194b54f5ff269f" + "generatedSha256": "e2a16402fc1cefbbbba2e9140a8218b2a03a7f5d66f37ccbac9be1e6e3524b7c" }, { "path": "docs/design/session-interaction-ux.md", "slug": "session-interaction", "title": "Session interaction design", "sourceSha256": "abfeed3680ebeebf77abf2b2e614fe4f9d1cc220d4e23284f7d6cf29c42bcc9b", - "generatedSha256": "f746d8ebb4b26b4367b1f1824e0d6e62855b841578837ec7dffa39a3925483c6" + "generatedSha256": "9a2a599a579b7eba27d0376e67079e2151726c8a79868ab36aac9f0a0ae83e12" }, { "path": "docs/privacy.md", "slug": "privacy", "title": "Privacy and local data", "sourceSha256": "9be31812270caa5b33e2a1cc57a6a3ac96eac3f4e7efc539a1db242f1363891f", - "generatedSha256": "d6d7c19960ac7cacace27febdb6b10cd1482c55569f6433477fd401484224c86" + "generatedSha256": "6cdac55561ec799268034c1738c42c0c3737eb3b199fe27c713bf31d4c45f42b" }, { "path": "docs/accessibility/baseline.md", "slug": "accessibility", "title": "Accessibility baseline", "sourceSha256": "3992eaac2c2680eeb6c55e021bed7682a1ed2598d235ff29b76be385b2b1bb61", - "generatedSha256": "68271524f35339da2c79efd0cbec2e8a0cf7f82b49aeb7874149f35364b5af7f" + "generatedSha256": "3b7f5df0d5d1b8e47bc99ba288bc5410e85d0e9a6e3f1d8f2686c3f217a3b666" }, { "path": "docs/testing/v020-physical-qa.md", "slug": "physical-qa", "title": "v0.20 physical QA checklist", "sourceSha256": "f8d5934ffb4ecaeafb80743adeb40363cb7f3841f72cf3c3db98eae9db858ae7", - "generatedSha256": "b47f9040353f5ca24ad01ae347435ebc12bdd2450d25b6f2c095af57deeb27e0" + "generatedSha256": "815201fd76aedf2b18ce7c4d2f5f82ea2aefcf096d61c28fcdb1441d51fff955" }, { "path": "docs/development-verification.md", "slug": "verification", "title": "Development verification", "sourceSha256": "5809936f97421a81c1335d3276993e0b42455b365bfc392d40aa7fa6f3f66521", - "generatedSha256": "44da37d18f3c40634e8deae921c8aebee1584de3ef98050d56ef30588d45c6ab" + "generatedSha256": "f26ebc1a3069b47d93f52ee2711936fd6a17638e3e905fd1b4e1e27e9bd7445c" }, { "path": "SECURITY.md", "slug": "security", "title": "Security policy", - "sourceSha256": "ea2418d212293b9a6b1bf7fe186f8527fd6e5bcff32c0321f7773d4d49b015a9", - "generatedSha256": "c3445fc1b4fbc38875d593d6a4bf070c35f85eb7cde58edec1b118da18468522" + "sourceSha256": "53db1acf1505838ae6ad54ef76d5d81b8a0b4af537be94fcc8059aaa8f92b7b2", + "generatedSha256": "5a96fdaf5019ce688a0a8fe3d27ec913ec49fcb2f176c61354c24d8f2c6dd60e" }, { "path": "CONTRIBUTING.md", "slug": "contributing", "title": "Contributing to NMSh", - "sourceSha256": "a08d586847b0a8dc8bc5ba8f93cde805f1021e934e900d30bc4fc099012ee56b", - "generatedSha256": "c42ab4971c3c4651ddc17db918f247dd3bdc0bd06bb4d3beb052bce3d67863d6", - "editorial": [ - "contributing-public-link" - ] + "sourceSha256": "8f98c973703782b22d9014111ab2d7b7fa3270fb5d783a2437f6308f677254c2", + "generatedSha256": "08b0731bf7975961f6a07f94c544c7d3804ff8780542424e2ffa1cfc7d77c389" }, { "path": "CHANGELOG.md", "slug": "changelog", "title": "Canonical changelog", - "sourceSha256": "bd4c766396eb4e3622d371dcb830565bc47b762d8c5a1c6d9ff8f535f600ad75", - "generatedSha256": "bdc1fff8a158630d697b461ffd5145cd26630de192b622b10b54b432ef8e201c" + "sourceSha256": "f7968b90077332de85b0c7ca5550d3742d9436b5a25bad7f87df89fefbb7a075", + "generatedSha256": "ee2c57d0896decfa78ae9bbcbe7b87256c6568d6fdaf5ee7b7ff36e4b3cc2474" }, { "path": "docs/design/terminal-workflow.md", "slug": "terminal-workflow", "title": "Terminal workflow design", "sourceSha256": "755cf1b18ebfd3766f0135b658fbdb93729f6600f5f5638ff21e407e5d2c1fcf", - "generatedSha256": "d2d05c31b386ca60164092e108b6fcbc265cb58f9b8be05fc65df90f7d908174" + "generatedSha256": "756002877a64116fa1ad69ceef3ae70473e69f4de15b8e2ae1e0ea04ace41c03" }, { "path": "docs/design/background-tasks.md", "slug": "background-tasks", "title": "Background task architecture", "sourceSha256": "f2a208586c4b1e8b9c27372f2de43d5e59e03c0643861c12da9ab80299c7eb7c", - "generatedSha256": "434952df38a1a39acc49485b492b948a95eb8e748420ee6821577563c1e386bc" + "generatedSha256": "377b6252a69911ed33e45af2c6612590845d4ec754bd53531df515f464eece29" }, { "path": "docs/design/workspace-keymap.md", "slug": "workspace-keymap", "title": "Workspace keymap", "sourceSha256": "30b8c3abb9fcdee3faeca9a4fe90f20512b9aab34d3f22794e2a7f657bca7286", - "generatedSha256": "bea1d912d5bcc6807d26ed1c92628c80971d0b90416104c3e242ed9d551d6741" + "generatedSha256": "59497e82fd11f4e4ec7eeafbc744cff4952c0d6c05f82dcd43ab92410c165131" }, { "path": "docs/architecture/github-workspace.md", "slug": "github-workspace", "title": "Read-only GitHub workspace", "sourceSha256": "f63d9ef38e3dc660576b31db27d8f6e3eb972d437dae3b9d0cff404f07d5f9b9", - "generatedSha256": "539bf4ad184f0c9840f92d74c617520cb6c4583fc46952b44d5e463dcc6deccd" + "generatedSha256": "72b4f8c1172d5aec0ced35f434bf5a3755b98cf0ee0add2f45b563ed802eb471" }, { "path": "docs/development/copy-actions-slice-3.md", "slug": "copy-actions", "title": "Output selection and Copy Actions", "sourceSha256": "2c013683ce91dfefd32e556919a6904c74e04c616ba14b55f98da5f698cef5d8", - "generatedSha256": "403ec72a9224b68e64369251871e0ebbffed53b9bd139f2be8cca071cbec945e" + "generatedSha256": "5fb59b223fbe2acd288cb76de41b7f9fa7683b0beb23789afe82d6d309b42a33" }, { "path": "docs/testing/post-v020-preferences-onboarding.md", "slug": "onboarding", "title": "First-run behavior and validation", "sourceSha256": "af32af6bd85a2d184f0fa1d754d718fc2d63dc6aed0232a0248c18be30580ddf", - "generatedSha256": "00dd79ebfccf599fa76368d7133fc9dabf24ec51592a36dc60808819728bdfff" + "generatedSha256": "98dae76ee7f1188c6d2393c26f4cd0e06578e5cc190379750d2201c8269b57e2" } ] }