diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..d376e843 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Terminal captures are byte-exact: trailing spaces are part of the rendered frame. +*.ansi -whitespace diff --git a/AGENTS.md b/AGENTS.md index d58bc27c..0fa00eb8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -62,9 +62,15 @@ Released (0.16.0): a real ShellAdapter with zsh, Fish and Bash 4.4+ backends ([d - Installs are typed argv shown before confirmation; special installers are never run by NMSh. - Chroma never reaches generated external artifacts. -## Current surfaces (released in v0.18.0) +## Surfaces released in v0.18.0 Theme Studio (`/theme`), Theme Bridge (`/theme-bridge`), `/providers`, `/tools` with filesystem-detected shell frameworks, `/configure`, `/tmux` Config Studio, `/integrations`, `/dotfiles`, the Oh My Posh provider, and Keep Awake (`/caffeinate`, `/awake`, `/zoomies`, with composer-edge, Status Strip, idle-reminder and screensaver presentation). Context Engine fact metadata, native module routing and Context Rail (v0.17.0), plus capability scheduling, the first-party module catalog, Context Packs (`nmsh packs`), Claude Code agent context (`nmsh agent-status`), `/modules` and Status Strip 2.0 (`/strip`) in v0.18.0. See CHANGELOG.md → 0.18.0. +## Surfaces released in v0.20.0 (from the unpublished v0.19.0 candidate) +Input awareness (waiting-for-input state, hidden and single-key input routed to the program), the command queue (`/queue`, Ctrl+Q, Ctrl+S, queue conditions), `/copy` selections, `/copy ui` and Smart Folding, Copy as Report, `/compare`, output references and F8/Shift+F8 failure navigation, paste review and `/ps`, `/clips`, `/pins` and recipes, Expressive/Classic activity wording, module explain diagnostics, Ruby/PHP modules and Starship theme import. + +## Surfaces released in v0.20.0 +Workspace sidebar and detail panel (`/sidebar`, `/panel`, `/keys`, `keymap.json`; one column plan in `src/app/workspaceHost.ts`/`workspaceFrame.ts`), background tasks (`/background`, `/bg`, task bar; session-owned `SessionTasks`, protocol feature `background-tasks`), native modules for .NET, Swift, Zig, Deno, Elixir, Dart, Flutter, build systems, Mercurial and Jujutsu, managed Claude `/model`, `/effort` and mod toggles, related PRs in `/worktrees`; the first-run starting point (`/startup`, `src/setup/startup/`), the guided setup, the shared optional-tools flow (`src/tools/ToolsPanel.ts`), the execution timeline and Queue settings, queue history and typed summaries (`/queue history`, `/queue save-summary`), queued output folding, multi-line paste choices, `/copy` output navigation and `/actions`, the custom color editor and the per-installation update notice. Physical QA status: [v0.20 record](docs/testing/v020-physical-qa.md). + ## Testing / verification During implementation, run focused affected tests. Use `npm run verify:fast` for ordinary iteration (build, an explicit core test subset, and diff checks); it is @@ -124,7 +130,7 @@ Key references: - [ARCHITECTURE.md](ARCHITECTURE.md) — the human-readable architecture overview (runtime and data flows, repository map); deeper detail in `docs/architecture/` and `docs/design/` - [ROADMAP.md](ROADMAP.md) — product direction and issue index - [GitHub Issues](https://github.com/raiseCatError/notMyShell/issues) — actionable work -- [v0.18.0 Release](https://github.com/raiseCatError/notMyShell/releases/tag/v0.18.0) — current stable release +- [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); v0.19.0 was never published separately - [PR #303](https://github.com/raiseCatError/notMyShell/pull/303) — the merged cumulative v0.16 release - [PR #328](https://github.com/raiseCatError/notMyShell/pull/328) — merged checkpoint on master; included in the published v0.18.0 release through [PR #345](https://github.com/raiseCatError/notMyShell/pull/345) - [GitHub Project](https://github.com/users/raiseCatError/projects/1) — live development status board diff --git a/CHANGELOG.md b/CHANGELOG.md index 90d436fb..7adfa9c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,216 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ## [Unreleased] +## [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. + +**v0.19.0 was never published.** Its terminal workflow (input awareness, command queue, copy and Smart Folding, Copy as Report, Compare output, references, paste review, pins and recipes, activity wording) ships for the first time in this release; there is no v0.19.0 tag or download. Its notes are kept below as [0.19.0 — not released separately](#0190---not-released-included-in-0200). Upgrading from v0.18.0 brings both sections. + +Verification: one full canonical `verify:release` on the release commit (build, the complete unit and real-PTY suite, benchmark typecheck and timing smoke) and exact-commit CI (Ubuntu and macOS shards, Node 22 and 26, Fedora portability subset, both timing smokes). Physical-terminal evidence: the maintainer tested and accepted the first-run starting point, guided Setup and Tools flow on macOS; the formal v0.19 and v0.20 checklists were not completed item by item, and no physical Linux, Omarchy or WSL pass has been made ([v0.20 physical QA record](docs/testing/v020-physical-qa.md)). + +### Added + +#### First run: starting points under a reactive aurora +- A fresh installation opens one starting point: four choices (**NMSh Recommended**, **Minimal Terminal**, **Customize Everything**, **Keep Existing**) under NMSh's real Aurora engine, with Vespyr on the horizon. Highlighting a choice changes the sky's mood in a short cross-fade; nothing applies until you review the choice and press Enter, and Esc asks *Leave setup?* with Stay first. `A` cycles the backdrop through Aurora, Subtle and Off and is saved at once. Reduced Motion, Effects Off, `NO_COLOR` and 16-color terminals get a still or plain sky, and every choice, Apply and Leave stay reachable down to 16 × 6. +- Apply folds the sky into one rule and raises the real composer into place; a genuine first run adds Vespyr's welcome once, whichever starting point it chose. Later applies add one receipt line. +- **Keep Existing** reads your environment read-only (Starship, Powerlevel10k or Oh My Posh, colors and tools) and keeps what it finds; it can also offer NMSh Native or another installed prompt. No file outside NMSh's configuration is changed. +- **Minimal Terminal** starts Two-line (←→ One-line) with a quiet Flow composer and no greeting; an existing greeting is hidden, not deleted. +- **Customize Everything** opens the guided setup in the selector's visual language (route of steps, *Step N of M*, keycaps, a live preview from 96 columns). Esc returns to the choices without closing setup. The guided setup keeps one fixed frame, and editors it opens return to the same step, row and unapplied draft. +- `/startup`, `/setup quick` and Settings → Starting point reopen the selector; `/setup` opens the guided setup directly, and `/setup prompt|look|motion|cursor` stay direct. +- On the first run only, where NMSh can prove the window is its own (Terminal.app; kitty on macOS with a remote-control socket; Hyprland 0.55+ with a Lua configuration), it offers to maximize the window for setup and restores it afterwards if it is still as NMSh left it. Nothing about the offer is saved ([first-run window maximization](docs/testing/first-run-window-maximization.md)). + +#### Optional tools: one discovery and install flow +- `/tools`, Settings → Tools, the guided setup and the starting point's review share one panel and installer. Tools have tiers: **Recommended** (ripgrep, fd, fzf, jq, bat, zoxide, tealdeer) and **Enhanced** (for example eza, gh, lazygit, delta, Atuin, jc, Glow, xh, direnv, ShellCheck, shfmt), plus the rest of the curated catalog. `V` switches the view (Recommended → Recommended + Enhanced → All curated tools; Recommended + Enhanced by default) without changing the selection. +- Space selects one tool, `R` and `E` add the missing Recommended or Recommended + Enhanced tools, `C` clears; keys never type into search (`/` focuses it). Enter reviews the exact package-manager command of every selected tool, then one confirmation with semantic buttons (No first; green *Yes, install*; red *Yes, uninstall*) and per-tool results. +- A check that fails or does not finish reads *Unable to verify*, never Missing, and is never selected or installed; a missing tool without an installer on this system reads *Unsupported here*. Installing zoxide, fzf or Atuin never turns on their shell hooks. Fastfetch stays a supported welcome provider without a tier. + +#### Execution timeline and queue +- Queued commands are shown as a safe chronological timeline: the running command, up to two recent results and up to two upcoming commands, with semantic motion that respects Reduced Motion. +- `/settings queue` and `/queue settings` open one Queue destination: queue behavior, failure policy, the live timeline, recent and upcoming counts, completed-view retention, queued output display and saved summaries. Short forms: `/q`, `/qp` or `/pause` (pause), `/qr` (review, then resume), `/qc` (review, then clear). +- **Queued output folding:** with *Fold queued output*, a successful queued command's long output folds behind a hint and `Ctrl+O` expands or collapses it. Folding is presentation only: copies keep every line, tabs and Unicode. Inline is the default; failures, interruptions and output you are inspecting stay expanded. +- **Queue summaries:** settled chains are kept for review (`/queue history`, newest first, with results on demand) and can be saved as typed, privacy-safe summaries in the session's transcript (`/queue save-summary` after an exact-text review). Saved summaries hold observed facts only; restoring or reattaching never runs anything. +- **Multi-line paste choices:** reviewing a multi-line paste offers Run as block, Queue separately, Edit or Cancel. Separation that would not be safe is refused with the reason; block and edit stay available. + +#### Output selection and Actions +- `/copy` selects completed output from the keyboard: Up/Down moves between outputs, Enter copies, Esc returns to the draft and view. `/actions` (and `/actions N`) opens the actions for a completed output. Saved Quick Copy and picker preferences still apply, and the selected surface stays continuous across prompt segments, wedges and inverse output. + +#### Colors, cursor and updates +- Choosing Custom colors opens a real editor at once: ten presets (Lavender, Purple, Blue, Cyan, Teal, Green, Amber, Orange, Rose, White), a live preview, each stop's hex, `S` to apply and Esc to cancel. The cursor idle effect gets its own colors (Follow cursor effect by default, as before). +- `/cursor` offers Purple, Blue, Green, Classic, Follow theme and Custom Fire colors. Auto uses the portable effect until a supported native integration is configured; the terminal still controls its physical caret color. +- With update notifications set to Notify, a newer stable release shows one short amber notice in the transcript, once per version, with the way to update *this* installation: brew commands for Homebrew, `/update` for a verified source checkout, the release page otherwise. + +#### 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. + +#### Background tasks ([#382](https://github.com/raiseCatError/notMyShell/issues/382)) +- `/background run ` (`/bg run`) starts a long-running command (`adb logcat`, `tail -f`, a dev server) in its own terminal beside the shell, in the shell's directory with its PATH, without the shell's aliases, functions or unexported variables. +- A task bar above the composer: Up from an idle composer (after a shown agent shelf) or Shift+Up focuses it; Enter opens a task's output, `x` stops it (again later: terminate, then kill, paced so a held key cannot jump to SIGKILL), Delete removes a finished one. `/background` lists every task with details and preferences; `/background t3`, `stop`, `kill`, `remove` and `clear` act directly. +- Tasks belong to the session: they keep running while the window is detached, a reattached window shows them and their recent output, and ending the session ends them. Task output never enters the shell, the transcript, copies, reports or comparisons; the transcript gets one line when a task starts and when it fails. +- Suggestions are **off by default**. `/background suggestions on` offers a recognized command's family when you submit it: `b` background once, Enter here as before, `a` always, `n` never ask, Esc back to the draft. + +#### Native modules ([#364](https://github.com/raiseCatError/notMyShell/issues/364)) +- Runtimes: .NET, Swift, Zig and Deno ([#370](https://github.com/raiseCatError/notMyShell/pull/370), which also becomes the canonical Ruby and PHP implementation), Elixir, Dart and Flutter ([#372](https://github.com/raiseCatError/notMyShell/pull/372)). Requested versions come from the project's own files, active versions from the install location; no tool is ever run and a binary inside the workspace is refused. +- One `build` module for Bazel, Gradle, Maven, CMake, Meson and Make with the version the project pins ([#373](https://github.com/raiseCatError/notMyShell/pull/373)). +- Mercurial bookmark or branch and Jujutsu repository state in the version-control extras pack ([#374](https://github.com/raiseCatError/notMyShell/pull/374)). + +#### 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 (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 +- `/worktrees` shows a related pull request only from evidence: the last `/github` listing of the same repository, with the PR's head branch in its own repository exactly the worktree's branch; `p` opens it in `/github` ([#381](https://github.com/raiseCatError/notMyShell/pull/381)). +- A shared action-control renderer whose states are told apart by marks, not color, first used by the `/worktrees` confirmation ([#369](https://github.com/raiseCatError/notMyShell/pull/369)). + +### Changed +- **Fresh defaults are NMSh Recommended:** Lavender Native, Rich motion (Expressive context and events, Sweep launch, Seal completion, cursor travel), Chat transcript with grayscale history, Smart folding, automatic typed queue summaries and a Project + Session window title. Cursor effects start Off with a theme-colored caret (choosing Fire starts on the Classic flame), and Minimal starts Two-line. **Saved configurations keep their behavior:** fields missing from an existing file read as their previous values (no added motion, no cursor effect, Normal transcript, summaries and title Off), and explicit and unknown fields survive saving. +- Setup runs Look → Prompt → Motion, and Chroma is chosen in Look only. Setup previews show the real result (real screen-saver previews, a Chroma preview that follows the setting and says what hides it, a legible activity-wording example). +- Menus share one set of selection glyphs with ASCII forms under Safe glyphs; the selection band marks the cursor only, and status words such as *✓ Selected* carry the selection. Panels opened from Settings return to Settings. +- Confirmations use semantic Yes/No controls: No is focused first, and an install or uninstall names what it will do. +- The background task bar is readable at rest; finished tasks show their outcome briefly (6 s, 30 s after a failure) and then stay listed in `/background`. +- NMSh's own lines (`/copy` confirmations, notices, completion rows) wrap at word boundaries in narrow windows, with continuation rows indented under the text instead of splitting words such as `5 l`/`ines`. Copying a selection still gives the line exactly as stored. Shell output keeps the terminal's column wrapping ([#349](https://github.com/raiseCatError/notMyShell/pull/349)). + +### Fixed +- **Input ownership:** replies to `read`, `read -k 1`, `read -n 1` and hidden reads are no longer queued, left in the composer or lost, however soon they are typed; Ctrl+C or Ctrl+Z ends a waiting question and what you type next is for the prompt. A waiting read is shown in its own color with the program's question and one instruction. +- **Exact `/copy`:** copies are the bytes the program printed, tabs and the final newline included. +- **Composer history while a command runs:** ↑/↓ recall history again while a command that reads nothing is running; a program reading input, a full-screen program or an edited queue entry keeps the keys. Recalled text reaches the queue only through Enter, and `/shell` starts navigation fresh in the new shell. +- Queued, attached and restored commands get the composer's syntax colors once their command word is classified. +- The queue shows what runs next and in what order, and resume and approve are reviewed in place; nothing runs from one key and a typed `y` never approves. Paste review never lets an NMSh command label mask what the shell would run. +- Pausing the queue or declining an approval is acknowledged only once the session owner reports it, and the draft is kept. An interruption (Ctrl+C, exit 130) holds pending queued work. +- The selected surface no longer lets prompt segment backgrounds, Powerline connectors or inverse video punch through it. +- Vespyr is composited pixel by pixel, with no background rectangle behind the cat. +- Tools: recommended tools stay listed once installed, and a tool check's timeout always fires. +- Background tasks signal only their own process group through a task-local guard, never a saved numeric group id, so a reused process id cannot be signalled. +- The Codex app-server adapter sends a cancel made before Codex names the turn as soon as it does (the adapter remains unwired). + +### Security +- Approval prompts show everything they approve: a multi-line command is shown on every line (cut at 600 characters with the remainder counted), so a harmless first line can no longer hide what follows; this fixes the shipped Claude adapter's permission prompts ([#380](https://github.com/raiseCatError/notMyShell/pull/380)). +- Executable Portable Mods stay disabled behind a documented threat model and a regression gate; the only processes the mods code may start are Claude's own `plugin` commands in four reviewed forms, without a shell ([#379](https://github.com/raiseCatError/notMyShell/pull/379)). +- Background tasks: every request, task record and output update crossing the session boundary is validated; task output is sanitized line by line and bounded; signals reach only a task's own process group; the environment is used for the spawn only and never stored. +- Workspace text from tmux, Git and keymap files has whole escape sequences removed before it is drawn. +- Saving a queue summary goes through the same scrollable exact-text review as reports; compact display can never hide persisted command arguments, redacted text cannot be edited in that review, and automatic summaries keep recognized command labels only when the session owner observed that the command is eligible for history. +- Reviewed paste blocks submit exactly the entries you kept, in the order shown; a removed or empty block can never submit the original paste. +- Keep Existing detection and the window-maximization probe are read-only; the probe never changes a window it cannot prove is NMSh's own. + +### Compatibility +- Node.js 22 or newer; zsh, Bash 4.4+ and Fish, as in v0.18.0. CI covers Node 22 and 26 on Ubuntu, Node 26 on macOS, and a Linux portability subset on Fedora. +- Queue history, summaries and acknowledged pause need a session service from this release; a service started by an older NMSh keeps the older queue behavior until it restarts. +- Background tasks need a session service from this release (a service started by an older NMSh says so until it restarts) and POSIX process groups (macOS, Linux, WSL 2). +- The tmux section of the sidebar needs tmux in `/opt/homebrew/bin`, `/usr/local/bin`, `/usr/bin` or `/bin`. + +### Upgrade notes +- **From v0.18.0:** settings, themes, modules, sessions and history carry over. An existing installation does not see the first-run starting point (`/startup` opens it any time) and keeps its saved presentation; fields it never saved read as their previous behavior. The v0.19.0 upgrade notes below also apply: activity wording becomes Expressive and the command queue is on by default. +- With update notifications on Notify, NMSh shows one amber notice per new stable release; Off checks nothing. +- 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, queue history and summaries. +- Homebrew: `brew upgrade raiseCatError/tap/nmsh` installs whatever version the tap's formula points to; check `nmsh --version` (see the README for the tap's status). + +### Known limitations +- **Physical-terminal evidence is partial.** The maintainer tested and accepted the first-run starting point, guided Setup and Tools flow on macOS; physical QA during stabilization found the input-ownership, exact-copy, queue and Setup issues fixed above. The formal checklist passes for background tasks, the new modules, managed Claude and the v0.19 workflow were not recorded item by item. No physical Linux (including Omarchy/Hyprland), WSL 2, iTerm2, kitty, WezTerm or Windows Terminal pass has been made; Linux remains beta on automated CI. The experimental workspace regions, drawers and keymap host notes are not physically tested. +- The first-run window offer on Hyprland/Omarchy and kitty is covered by automated tests only. +- 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. +- The Codex app-server adapter is included but not wired: Codex and OpenCode sessions are shown, not controlled. Claude Remote Control stays unsupported for managed targets. +- Claude mod enable/disable has not been exercised against a live Claude account in this release's verification. +- Everything listed under v0.19.0's known limitations still applies. + +## [0.19.0] - Not released (included in 0.20.0) + +**Terminal workflow.** One command's result becomes useful for the next without NMSh taking execution away from the real shell. NMSh notices when a running command is waiting for you, lets you prepare the next commands while one runs, copies exactly what you choose, turns output into reviewed reports and comparisons, and keeps the commands you reuse. Nothing derived from output, the clipboard, a pin or a recipe runs without an explicit action, and every queued command still runs in your one persistent shell. + +Verification: automated CI (unit and real-PTY suites on macOS and Ubuntu, Node 22 and 26, a Fedora portability subset and the timing smoke) on the integrated head, plus the per-feature canonical, Linux/Fish 3.7 and report/compare/clipboard security gates recorded in [the frontend freeze handoff](https://github.com/raiseCatError/notMyShell/blob/ca26b9be62f2d7eb7f083e05bd6a2fcff9334811/docs/development/workflow-frontend-freeze.md). This candidate was never published on its own: no v0.19.0 tag or release exists, and everything below first ships in v0.20.0. Physical-terminal status is recorded with v0.20.0 ([v0.19 physical QA checklist](docs/testing/v019-physical-qa.md)). + +### Added + +#### Input awareness ([#348](https://github.com/raiseCatError/notMyShell/pull/348)) +- **Input awareness:** a command that waits for an answer is no longer just "Running". NMSh reads the terminal's own state, without touching the program. A password or other no-echo read, or a single-key question such as `e2fsck`'s `Fix?`, is confirmed; on Linux, any blocking read of the terminal is confirmed too. An ordinary line question left open by an idle process is shown as "Probably waiting for input". The question stays visible beside the composer however far the transcript has scrolled, and the window title, `/sessions`, `/resume` and a cross-session notice show the wait. Hidden and single-key input goes straight to the program, keystroke by keystroke, and is never shown or kept. A reply left unsent when the command ends is discarded, never run as a shell command. Waiting time is measured separately from wall-clock time and reported on completion. See `docs/design/input-awareness.md`. +- Fish's own `read` and other builtin readers are recognized from authenticated terminal ownership, and input typed during startup, before the shell is ready, or while a hidden read is open goes only to the program that currently owns the terminal. + +#### Command queue ([#357](https://github.com/raiseCatError/notMyShell/pull/357)) +- Commands typed while another runs are **queued in the same shell** and run after it, one at a time, only when the shell reports it is ready, keeping the directory, variables and functions. Multiline entries keep their meaning (Fish `begin`/`end`, zsh and Bash brace groups). `/queue` shows, edits, reorders, pauses, resumes or clears them; queued command text is drawn, never interpreted. +- When the running program is waiting for an answer, Enter answers it and **Ctrl+Q** composes a queue entry instead. While a program reads keys directly, Ctrl+Q takes the next command for the queue and **Ctrl+S** sends the composer's text to the program. +- A failure or interrupt **pauses** the rest of the queue. Detach and reattach never submit an entry twice; switching shells pauses the queue, and a shell that exits drops its entries instead of replaying them in another shell. Silence is never taken as completion. + +#### Copy and Smart Folding ([#358](https://github.com/raiseCatError/notMyShell/pull/358), [#350](https://github.com/raiseCatError/notMyShell/issues/350)) +- `/copy N`, `/copy -N` (the latest N), ranges `A-B` and lists `1,3,5`; `--status` adds the completion row; `/cp` is the same command in every form. +- `/copy ui` opens an interactive picker; `/copy settings` chooses Quick Copy or the picker by default and whether copies include status. +- A sticky Copy control keeps block actions reachable while a long block's header is scrolled away. +- **Smart Folding** keeps long diagnostics readable; the full output stays stored, and copies include folded lines. + +#### Copy as Report ([#360](https://github.com/raiseCatError/notMyShell/pull/360), [#351](https://github.com/raiseCatError/notMyShell/issues/351)) +- One or several command blocks as a Markdown or plain-text report with command, output, directory and exit status, always shown for review first. Enter copies exactly the reviewed text; cancel leaves the clipboard unchanged. +- Likely secrets and private paths are **redacted** in the review before any Markdown is added; edited text is rescanned, changed lines are marked, and an unredacted choice is labelled. Redaction is best-effort (see Known limitations). + +#### Compare output ([#361](https://github.com/raiseCatError/notMyShell/pull/361), [#352](https://github.com/raiseCatError/notMyShell/issues/352)) +- `/compare` (the latest output with its previous run), `/compare N`, `/compare N M` (numbers as for `/copy`), or Actions → Compare output…: a line diff with counts, hunks and collapsed unchanged regions, side by side from 140 columns and unified below, with labelled whitespace normalization. Output lost while detached is marked incomplete. +- In the comparison, `r` opens the diff as a reviewed, redacted report. `c` copies the sanitized plain diff **directly, without redaction** (it shows a caution when the detector flags a likely secret). + +#### References, paste review, clips, pins and recipes ([#368](https://github.com/raiseCatError/notMyShell/pull/368), [#353](https://github.com/raiseCatError/notMyShell/issues/353)–[#355](https://github.com/raiseCatError/notMyShell/issues/355)) +- Files, links, commits and device names in a block's output can be opened, copied or staged from its Actions; nothing runs by itself. +- **F8 / Shift+F8** walk failed commands (by exit status, not text matching) and keep your draft; the palette offers Previous/Next failed command too. +- **Paste review:** a pasted zsh, Bash or Fish sequence can be split into commands and parse-checked without running anything; confirming queues the reviewed list. `/ps` reads the clipboard only when you run it. +- **Queue conditions:** an entry can wait for its own approval (withdrawn if the entry is edited) or be marked `always` to run even after a plain failure, never after an interrupt. +- `/clips`: text deliberately kept in memory for this window, reviewed before insertion and gone when the window closes. Optional clipboard-change hints on macOS (`/clips suggestions on`, off by default) read only the pasteboard's change counter, never its contents. +- `/pins`: pinned commands with their directory (palette → Pin selected history command) and recipes with quoted placeholders, staged or reviewed and queued, never run automatically. + +#### Activity wording ([#367](https://github.com/raiseCatError/notMyShell/pull/367), [#362](https://github.com/raiseCatError/notMyShell/issues/362)) +- **Expressive** (the new default) gives each running command one stable phrase from a curated 663-pair vocabulary (`✦ Cooking… · 18s`, then `✔ Cooked for 18.0s`), kept across detach and reattach; **Classic** keeps plain Running/Completed wording (Settings → Live activity → Activity wording, and Setup). Failures, interrupts, agents and queued runs keep factual wording, and copies, reports and restored records always store the factual form. + +#### Modules and themes +- Module details explain where a fact came from, its freshness, cache retention and measured collection time, and say when a fact is uncollected or unknown rather than implying it; `/doctor` reports Context Engine health ([#365](https://github.com/raiseCatError/notMyShell/issues/365)). +- 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. +- Startup and termination: a quit or termination signal at any point during startup cleans up the frontend; a prompt that arrives after the window has closed can no longer restart context collection or queue work. +- Reattaching to a fullscreen program gives it the terminal and its size at once, before the session journal is written. +- Native completion accepts readiness that arrives in fragments (LF or CRLF) within its existing bounds. +- The command directory recorded with a command is the shell's authenticated directory at submission, even when asynchronous context collection still describes the previous prompt. +- Restored command and status rows follow the attaching window's NO_COLOR setting. +- `/sessions` refreshes live session facts without losing the selection, query, draft or focus. +- A clipboard write is reported as complete only when the whole payload was delivered and the clipboard tool exited successfully. + +### Security +- Every session socket request (listings, notices, dismiss, rename, kill), not only create and attach, verifies the private runtime directory's ownership before connecting. +- A client cancelled before it started discards output withheld for it instead of exposing it. +- Report and comparison text is redacted before Markdown is added; hostile command, status and directory text (line breaks, backticks) stays enclosed, with bounded delimiter sizing for backtick-rich data. Report review stays readable at extreme terminal widths. +- Comparison chooser headings and pasted-text review show control, bidi and zero-width characters visibly instead of sending them to the terminal. +- The pins panel shows control and bidi characters in labels and prompts instead of writing them to the terminal. + +### Compatibility +- Node.js 22 or newer, as before. CI covers Node 22 and 26 on Ubuntu, Node 26 on macOS, and a Linux portability subset on Fedora. +- zsh, Bash 4.4+ and Fish. Fish 3.7 on Linux is covered by the frontend freeze verification; automated Bash coverage is 5.x, so the 4.4 minimum was not exercised directly. +- The command queue and queue conditions need a session service from this release: a service started by an older NMSh reports the queue as unavailable until it restarts. +- Clipboard-change hints need macOS; Linux has no supported metadata-only clipboard counter. + +### Upgrade notes +- Activity wording becomes **Expressive** by default, including for existing settings. Choose Classic in Settings → Live activity → Activity wording to keep the previous wording. +- The command queue is on by default (Settings can turn it off). Existing session services keep running; restart them (or start a new session) to use the queue. +- Settings, themes, modules and history carry over unchanged. Clipboard suggestions stay off until turned on. + +### Known limitations +- Physical-terminal status for these features is recorded under v0.20.0's known limitations. +- Redaction is pattern-based and can miss custom, encoded or unknown secret forms and private paths; review every report. Comparison `c` and plain `/copy` copy without redaction by design. +- A clipboard tool that fails after it started writing may already have changed the clipboard; NMSh cannot roll it back. +- Fish can drop type-ahead entered while its own `read` is still running, as in any terminal ([#356](https://github.com/raiseCatError/notMyShell/issues/356)). +- Project and branch facts can lag a fast directory change while collection is pending; a failed `/sessions` poll keeps the last validated view. +- A concurrent resize and quit key in native `less` can lose the quit key; synchronized automated tests do not prove arbitrary physical resize timing. +- A forced SIGKILL of the frontend can bypass helper cleanup; normal stop, SIGTERM and SIGHUP clean up owned helpers. +- Exact last-frame module width-compaction explanations and dedicated external source previews are not included ([#365](https://github.com/raiseCatError/notMyShell/issues/365)). +- Ruby and PHP were the candidate's only new runtimes; the full native runtime set (.NET, Swift, Zig, Deno, Elixir, Dart, Flutter, build systems) is part of v0.20.0. + + ## [0.18.0] - 2026-10-13 **Context Engine, Managed Agents & Workspaces.** Context modules become a platform: facts are collected on demand by bounded, privacy-labelled capabilities, the first-party catalog ships as declarative Context Packs, and the Status Strip becomes a full second surface for modules. Claude Code can run as a managed target inside NMSh, with its permission requests and questions answered natively. `/worktrees` and a read-only `/github` workspace are the first delivered slices of the workspace work. The release also carries the fixes from the v0.17 Ghostty physical-QA pass and a set of passthrough, tmux, transcript and Fish correctness fixes. @@ -398,7 +608,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.18.0...HEAD +[Unreleased]: https://github.com/raiseCatError/notMyShell/compare/v0.20.0...HEAD +[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 [0.16.0]: https://github.com/raiseCatError/notMyShell/compare/v0.7.0...v0.16.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 28f4f558..85cada01 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,7 +20,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.18.0 Release](https://github.com/raiseCatError/notMyShell/releases/tag/v0.18.0)** — current stable release, merged through [PR #345](https://github.com/raiseCatError/notMyShell/pull/345) (see [ROADMAP.md](ROADMAP.md)) +- **[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)) - **[CHANGELOG.md](CHANGELOG.md)** — the authoritative record of notable changes; see [Changelog](#changelog) below - **GitHub Project** — [NMSh Development](https://github.com/users/raiseCatError/projects/1) — live development status board diff --git a/README.md b/README.md index d90f76f0..f093da0a 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ **notMyShell (NMSh)** runs your real zsh, Bash or Fish in a persistent session and gives it a better front end: a composer that stays put, semantic highlighting, a readable transcript, live command feedback, sessions that survive closing the window, and themes that can reach the tools you use. -Latest published stable release: [v0.18.0 — Context Engine, Managed Agents & Workspaces](https://github.com/raiseCatError/notMyShell/releases/tag/v0.18.0). The `master` branch includes this released work. See the [changelog](CHANGELOG.md#0180---2026-10-13) for its scope and known limitations; physical-terminal QA for this release is still pending. +Latest stable release: [v0.20.0 — Terminal workflow, first-run setup, background tasks & native modules](https://github.com/raiseCatError/notMyShell/releases/tag/v0.20.0), the first stable release since v0.18.0. It includes the terminal workflow from the v0.19.0 candidate, which was never published separately. The `master` branch includes this released work; see the [changelog](CHANGELOG.md#0200---2026-10-18) for its scope, upgrade notes and known limitations. ## See notMyShell in motion @@ -53,7 +53,8 @@ NMSh is a **frontend**. Your shell stays underneath and does what it always did: - **A composer that stays where you want it** — Bottom, Top or Flow (right after the newest output), one-line or two-line, with true multiline editing. - **Semantic highlighting** — commands, builtins, aliases and functions are classified against your real shell as you type; partial input is never executed. -- **A transcript you can use** — command blocks with status and timing, folding for long output, `/find` and `/filter`, plain-text `/copy`. +- **A transcript you can use** — command blocks with status and timing, folding for long output, `/find` and `/filter`, exact `/copy` with keyboard output selection and `/actions`. +- **A terminal workflow** — NMSh shows when a command is waiting for you, queues the next commands as a readable timeline with saved summaries, turns output into reviewed reports and comparisons, and runs long-lived commands as background tasks beside the shell (`/background`). - **Live sessions** — closing a window detaches the shell instead of killing it; running commands keep going. `/resume` or `nmsh --attach` brings them back. - **Prompt providers** — NMSh Native (Powerline, Soft, Minimal, Outline styles), Starship, Oh My Posh, Powerlevel10k or None. - **Theme Studio and Theme Bridge** — built-in, imported and custom themes in `/theme`; opt-in `/theme-bridge` carries the active theme to fzf, less/man, file listings, bat, tmux, Vim, Neovim and Helix through files NMSh owns and you review. @@ -116,7 +117,7 @@ brew install raiseCatError/tap/nmsh nmsh ``` -The [Homebrew tap](https://github.com/raiseCatError/homebrew-tap) maintains formula updates through its native autobump and test-bot workflows. To update an installed package, use `brew upgrade raiseCatError/tap/nmsh`. +The [Homebrew tap](https://github.com/raiseCatError/homebrew-tap) updates its formula after each release through its own bump and test-bot workflows, so it can lag behind the newest release; `nmsh --version` shows what you have, and [building from source](#build-from-source) gets the current release from `master`. To update an installed package, use `brew upgrade raiseCatError/tap/nmsh`. To uninstall the Homebrew package: @@ -153,13 +154,19 @@ Do not set `nmsh` as your system/login shell with `chsh`. Keep zsh, Bash or Fish **Moving and removing:** `nmsh config export` / `nmsh config import FILE` move settings between machines (preview first, no history or secrets); for source installations, `nmsh uninstall` removes only NMSh's own launcher links (use `brew uninstall nmsh` for Homebrew packages); `nmsh doctor` prints a diagnostic for bug reports. +On a fresh installation NMSh opens its starting point: four choices under a live aurora, with Vespyr on the horizon. **NMSh Recommended** is the full look; **Minimal Terminal** is NMSh's quiet one (Two-line or One-line); **Customize Everything** is a guided tour of every setting; **Keep Existing** keeps your own prompt (Starship, Powerlevel10k or Oh My Posh), colors and tools, after reading your setup without changing anything. Highlighting a choice changes the sky; nothing applies until you review it and press Enter, and Esc asks before leaving. `A` switches the backdrop between Aurora, Subtle and Off. Reduced Motion, Effects Off, NO_COLOR and 16-color terminals get a still or plain version, and every choice stays reachable down to 16 × 6. + +On that first run only, where NMSh can prove the window is its own (Terminal.app; kitty on macOS with a remote-control socket; Hyprland 0.55+ with a Lua configuration, as on Omarchy), it offers to maximize the window for setup and puts it back afterwards. Nothing about it is saved; elsewhere the offer simply never appears. See [first-run window maximization](docs/testing/first-run-window-maximization.md). + +`/startup` reopens the starting point anytime (so do `/setup quick` and Settings → Starting point). `/setup` opens the guided setup directly. Existing saved preferences keep their previous behavior. `/cursor` offers Purple, Blue, Green, Classic, Follow theme and Custom Fire colors; Auto uses the portable effect until a supported native integration is configured. The terminal still controls its physical caret color. + ## Core commands Type `/` in the composer for the full list, or `/help` for everything grouped by area. The ones you will reach for most: | Area | Commands | | --- | --- | -| Settings and setup | `/settings` (`/config`), `/setup`, `/palette` (F1), `/help`, `/status` | +| Settings and setup | `/settings` (`/config`), `/startup`, `/setup`, `/palette` (F1), `/help`, `/status` | | Composer and prompt | `/prompt`, `/modules`, `/layout` (`/composer`), `/transcript`, `/syntax`, `/cursor` | | Look and motion | `/appearance`, `/theme`, `/theme-bridge`, `/chroma`, `/motion`, `/chrome`, `/glyphs`, `/strip`, `/screensaver` | | Tools | `/tools`, `/providers`, `/configure`, `/tmux`, `/integrations`, `/dotfiles` | diff --git a/ROADMAP.md b/ROADMAP.md index 249a49ed..e9d65607 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -4,7 +4,9 @@ | | | |---|---| -| **Current release** | [v0.18.0 — Context Engine, Managed Agents & Workspaces](https://github.com/raiseCatError/notMyShell/releases/tag/v0.18.0) — released; physical QA pending ([checklist](docs/testing/v018-physical-qa.md)) | +| **Current release** | [v0.20.0 — Terminal workflow, first-run setup, background tasks & native modules](https://github.com/raiseCatError/notMyShell/releases/tag/v0.20.0) — released 2026-10-18 through [PR #392](https://github.com/raiseCatError/notMyShell/pull/392); physical QA partial ([record](docs/testing/v020-physical-qa.md)) | +| **Not released separately** | v0.19.0 — Terminal workflow candidate; never tagged or published, its work first ships in v0.20.0 | +| **Previous release** | [v0.18.0 — Context Engine, Managed Agents & Workspaces](https://github.com/raiseCatError/notMyShell/releases/tag/v0.18.0) | | **macOS distribution** | Homebrew: `brew install raiseCatError/tap/nmsh`; source installation remains available | | **Current engineering focus** | [#305 — Native modules / Context Engine](https://github.com/raiseCatError/notMyShell/issues/305) and [#304 — Theme Bridge / semantic terminal](https://github.com/raiseCatError/notMyShell/issues/304); foundation released in v0.17.0, the module platform and further Theme Bridge work released in v0.18.0 | | **Included in v0.18.0** | Context Engine platform (capability scheduling, first-party catalog, Context Packs, Claude Code agent context), `/modules`, Status Strip 2.0 and `/strip`, managed Claude Code targets and `/mods` (#329), `/worktrees` (first slice of #337), read-only `/github` (first slice of #338), terminal title ownership, tmux/passthrough/cursor fixes; merged through [PR #345](https://github.com/raiseCatError/notMyShell/pull/345) (Status Strip 2.0 and the Ghostty physical-QA fixes reached master earlier through [PR #328](https://github.com/raiseCatError/notMyShell/pull/328)), see CHANGELOG → 0.18.0 | @@ -12,7 +14,7 @@ | **Development branch** | `dev` | | **Project board** | [NMSh Development](https://github.com/users/raiseCatError/projects/1) | -GitHub issues define actionable remaining work. Closed issues represent completed work, not a promise that future refinements are finished. The latest published release and package version are 0.18.0. +GitHub issues define actionable remaining work. Closed issues represent completed work, not a promise that future refinements are finished. The latest published release and package version are 0.20.0. ## Current engineering focus — native modules and Context Engine @@ -156,6 +158,21 @@ The work formerly planned as v0.8–v0.15 ships together with v0.16 in one cumul | [#15](https://github.com/raiseCatError/notMyShell/issues/15) | Moved to Future / Backlog; NMSh already degrades by capability in unknown embedded hosts | | [#18](https://github.com/raiseCatError/notMyShell/issues/18) | Code and CI in v0.17; physical Linux/WSL pass moved to a follow-up | +## Released — v0.20.0 Terminal workflow, first-run setup, background tasks & native modules + +Released on 2026-10-18 through [PR #392](https://github.com/raiseCatError/notMyShell/pull/392), built cumulatively on the unpublished v0.19 candidate: the standalone module work merged through +`integration/v020-modules` (#370 → #372 → #373, #374, #369, #381, #379, #380, #375 → #376/#377/#378, #383 → #384), then +#347 and #349, then the frontend wiring of the workspace regions, background tasks and related PRs. Executable +Portable Mods stay disabled (#379); the Codex app-server adapter ships unwired (#380). Physical-QA stabilization of both +candidates (#395, #396) and the post-v0.20 slices then followed on one linear line: the execution timeline, Queue +settings, queue history and summaries, queued output folding and paste choices, output selection and Actions, the +first-run starting point, guided Setup, shared Tools flow, update notice and color editor. See CHANGELOG → 0.20.0; +physical QA is partial ([record](docs/testing/v020-physical-qa.md)). + +## Not released separately — v0.19 Terminal workflow candidate + +Integrated on `release/v0.19.0` from `v0.18.0` with merge commits, preserving history: the frozen workflow stack ([#348](https://github.com/raiseCatError/notMyShell/pull/348) → [#357](https://github.com/raiseCatError/notMyShell/pull/357) → [#358](https://github.com/raiseCatError/notMyShell/pull/358) → [#360](https://github.com/raiseCatError/notMyShell/pull/360) → [#361](https://github.com/raiseCatError/notMyShell/pull/361) → [#368](https://github.com/raiseCatError/notMyShell/pull/368)) and its independent sibling [#367](https://github.com/raiseCatError/notMyShell/pull/367), tracked by [#359](https://github.com/raiseCatError/notMyShell/issues/359). Automated gates are recorded in the release PR; it was never published on its own and first ships in v0.20.0. Deferred to v0.20 or later: exact last-frame module compaction explanations and dedicated external source previews ([#365](https://github.com/raiseCatError/notMyShell/issues/365)), and the full native runtime set ([#364](https://github.com/raiseCatError/notMyShell/issues/364)). + ## Released — v0.18 Context Engine, Managed Agents & Workspaces Released on 2026-10-13 through [PR #345](https://github.com/raiseCatError/notMyShell/pull/345). Physical QA was not performed before publication and remains a follow-up ([checklist](docs/testing/v018-physical-qa.md)). Brings together the module ecosystem previously planned for v0.19.0 ([#305](https://github.com/raiseCatError/notMyShell/issues/305), [#316](https://github.com/raiseCatError/notMyShell/issues/316)–[#321](https://github.com/raiseCatError/notMyShell/issues/321)) together with managed Claude Code targets and `/mods` ([PR #329](https://github.com/raiseCatError/notMyShell/pull/329)), the first slice of the worktree manager ([#337](https://github.com/raiseCatError/notMyShell/issues/337), [PR #342](https://github.com/raiseCatError/notMyShell/pull/342)), the read-only GitHub workspace (first slice of [#338](https://github.com/raiseCatError/notMyShell/issues/338), [PR #343](https://github.com/raiseCatError/notMyShell/pull/343)) and the Theme Bridge work planned for v0.18.0 ([#304](https://github.com/raiseCatError/notMyShell/issues/304)): terminal title ownership (OSC 0/2), host-marker lifecycle refinements, Open in pager, truthful delta status, 16/8-color correctness and Bash/Fish typo correction. Still deferred from #304: delta diff styles (git config), terminal emulator and editor base-theme takeover; physical host QA. See CHANGELOG → 0.18.0. diff --git a/SECURITY.md b/SECURITY.md index 890fcfe4..56f9789a 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,7 +4,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.18.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.20.0, the `master` branch) and the active development branch. Older releases are not patched separately; update with `/update`. ## Scope diff --git a/docs/architecture/context-modules.md b/docs/architecture/context-modules.md index 45ff167a..6153e8dc 100644 --- a/docs/architecture/context-modules.md +++ b/docs/architecture/context-modules.md @@ -8,8 +8,8 @@ without taking over shell execution or running anything the workspace chose. > **Release status.** v0.17.0 shipped the foundation: typed fact metadata, > native module routing and the Context Rail. Everything else described here — > capability scheduling, the first-party module catalog, declarative Context -> Packs, Status Strip routing and Status Strip 2.0, `/modules` and Claude Code agent context — shipped in -> v0.18.0. +> Packs, Status Strip routing and Status Strip 2.0, `/modules` and Claude Code agent context — is in +> the v0.18 development stack, pending acceptance and release. ## From capability to presentation @@ -89,7 +89,11 @@ large repository, with generous p95 budgets enforced in CI. | Capability | Reads | |---|---| | `project.package` | the nearest declarative manifest up to the repository root (`package.json`, `Cargo.toml`, `pyproject.toml`, `go.mod`, `deno.json`, `composer.json`, `pubspec.yaml`, `pom.xml`, `Project.toml`, `setup.cfg`) and lockfile names | +| `project.build` | build files nearest the working directory up to the repository root (`MODULE.bazel`/`WORKSPACE`, `settings.gradle`/`build.gradle`, `pom.xml`, `CMakeLists.txt`, `meson.build`, `Makefile`), `.bazelversion`, the Gradle and Maven wrapper properties' `distributionUrl` (never fetched), and `cmake_minimum_required`/`meson_version` matched as text. No wrapper, Bazelisk or build file is run | | `runtime.node`, `runtime.python`, `runtime.go`, `runtime.rust`, `runtime.java` | version pins (`.nvmrc`, `.python-version`, `go.mod`, `rust-toolchain.toml`, `.java-version`, `.tool-versions`, `mise.toml`, …), virtualenv/conda metadata, rustup settings, and the version of the executable the shell would run **from its install layout** (`node_version.h`, `GOROOT/VERSION`, the JDK `release` file, a versioned interpreter path) — never by running it | +| `runtime.ruby`, `runtime.php`, `runtime.dotnet`, `runtime.swift`, `runtime.zig`, `runtime.deno` | `.ruby-version` and the Gemfile's `ruby "x"`, `.php-version` and `composer.json` `require.php`, `global.json` `sdk.version`, `.swift-version` and the first line of `Package.swift` (`swift-tools-version`), `build.zig.zon` `minimum_zig_version` and `.zigversion`, `.dvmrc`, plus `.tool-versions`/`mise.toml`; the active version only from the executable's install layout (Homebrew, mise, asdf, rbenv, RVM, chruby) — never by running it. Floors (`global.json` without `rollForward: disable`, `swift-tools-version`, `minimum_zig_version`) show as `≥x` and are never judged as a mismatch | +| `runtime.elixir`, `runtime.dart`, `runtime.flutter` | `mix.exs`'s `elixir:` requirement (text, never evaluated), `pubspec.yaml` `environment.sdk`/`environment.flutter` (failsafe YAML), `.fvmrc`/`.fvm/fvm_config.json`, `.tool-versions`/`mise.toml`; the active version from the install layout (Homebrew, asdf, mise, FVM, casks) or the SDK's own metadata (`lib/elixir/ebin/elixir.app`, the Dart SDK's `version`, Flutter's `bin/cache/flutter.version.json`) — never by running `elixir`, `dart` or `flutter`. Flutter applies only to a package that depends on the Flutter SDK or pins one with FVM | +| `vcs.hg`, `vcs.jj` | the nearest `.hg` or `.jj` directory found upward from the working directory (stopping at home when below it): `.hg/branch` and `.hg/bookmarks.current`; whether `.jj/repo` is the store or a secondary workspace's pointer and whether Git is colocated. `hg` and `jj` are never run, hgrc/hooks and jj's binary operation log are never read | | `env.toolVersions` | the `[tools]` table of `mise.toml` or `.tool-versions` lines | | `env.direnv` | whether `.envrc` exists (never its content) and what direnv itself recorded in the shell (`DIRENV_FILE`) | | `infra.kubernetes`, `infra.docker` | `current-context` and contexts of KUBECONFIG files (users and `exec` entries are never read); the Docker CLI's current context | @@ -120,12 +124,12 @@ first-party catalog adds modules through bundled Context Packs: | Pack | Modules | |---|---| -| Project (`nmsh.project`) | Package; Node, Python, Go, Rust, Java (show on command) | +| Project (`nmsh.project`) | Package; Build (Bazel, Gradle, Maven, CMake, Meson, Make); Node, Python, Go, Ruby, PHP, .NET, Swift, Zig, Deno, Elixir, Dart, Flutter, Rust, Java (show on command) | | Environment (`nmsh.environment`) | Tool versions (mise/asdf), direnv | | Infrastructure (`nmsh.infrastructure`) | Terraform/OpenTofu, Helm, Pulumi (show on command) | | Cloud (`nmsh.cloud`) | AWS, Google Cloud, Azure (show on command) | | System (`nmsh.system`) | OS, user/host/SSH, jobs, session duration, time, battery, memory | -| VCS (`nmsh.vcs`) | Git stash, upstream (in a repository) | +| VCS (`nmsh.vcs`) | Git stash, upstream (in a repository); Mercurial bookmark/branch and Jujutsu repository (start hidden) | | Agents (`nmsh.agents`) | Claude Code session, Claude Code limits (show on command) | Show-on-command modules appear while you type a related command (`kubectl`, @@ -169,9 +173,28 @@ fullscreen programs hide it, and it is never written to the transcript. - **Packs** — bundled and installed Context Packs with their verified state; installed packs can be enabled, disabled or removed (with confirmation). +Short detail panels keep the module title visible and scroll through existing rows +with Up/Down or PageUp/PageDown. Resize clamps that temporary view; scrolling +does not edit settings or demand data. + A module's details show what it reads, whether its value may be kept with commands in history, and each fact's current state ("fresh · 3s ago", "last -known, refreshing", "unavailable (timed out after 1500 ms)", "not checked"). +known, refresh waits for demand", "unavailable (timeout)", "not checked"). Trusted source IDs, +scope, freshness TTL, event invalidation and demand-driven refresh policy come +from the capability definition. Failure text excludes raw exception paths and +values. A failed refresh can retain a previous value; the view distinguishes +that from a failure with no cached value, without claiming that new data arrived. + +"Took" measures the last collection's wall time, starting when the scheduler +dispatches it; it excludes time waiting in the queue. An unmeasured collection +has no invented zero. Opening details reads existing snapshots and declarations, +and does not demand collectors. `/doctor` summarizes bounded engine counters. +Routing, provider availability, conditions and priority explain presentation +policy. Enabled means the saved setting, not proof that the module is on screen. +The live condition check is shared with Native rendering; it does not infer +visibility from collection success. Width fitting can compact or omit lower +priority modules; the detail view does not claim to record the last frame's +exact compaction decisions. `/shell` edits the current-shell module's visibility and side. ## Context Packs diff --git a/docs/architecture/mise-project-awareness.md b/docs/architecture/mise-project-awareness.md index c0d55139..083e1f00 100644 --- a/docs/architecture/mise-project-awareness.md +++ b/docs/architecture/mise-project-awareness.md @@ -19,8 +19,9 @@ command and 128 KiB combined stdout/stderr limit. stderr is discarded; failures are generic. JSON parsing retains tool names/versions and task names only. Unknown fields, including `env`, `run`, descriptions and source paths, never enter UI/cache/persistence. Metadata remains in memory, bounded to 32 identities -keyed by canonical cwd, binary and ancestor marker/project stat identity. Config -changes invalidate an identity; explicit refresh reruns inspection. No typing or +keyed by canonical cwd, binary and ancestor marker/project stat identity. Changes to marker filesystem metadata invalidate an identity. A same-size edit +with unchanged timestamps can retain it; NMSh does not read config content to +detect this. Explicit refresh requires renewed consent and reruns inspection. No typing or rendering invocation exists. A failed inspection is cached factually. Task Enter inserts a quoted visible `mise run ''` into the composer. A @@ -39,7 +40,8 @@ Task listing may fetch remote task files and evaluates resolved task directories The consent screen therefore does not describe metadata as side-effect-free. Standard marker coverage is conservative, not a full reimplementation of mise -config selection: `mise.toml`, `.mise.toml`, `.mise/config.toml`, +config selection: `mise.toml`, `.mise.toml`, `mise.local.toml`, `.mise.local.toml`, +`.mise/config.toml`, `.config/mise/config.toml`, `.tool-versions`. Environment-specific/custom config may exist without a detected marker. Metadata inspection remains explicitly available when installed. There is no automatic task argument editor, active diff --git a/docs/architecture/optional-tools.md b/docs/architecture/optional-tools.md index 00a4fd95..6ba8df89 100644 --- a/docs/architecture/optional-tools.md +++ b/docs/architecture/optional-tools.md @@ -21,10 +21,12 @@ credential, zsh hook or environment is healthy. Configured means an installed tool is selected in NMSh settings, not that its shell hooks are active. Hook inspection/setup is deferred and never inferred. Direct shell tools work normally. -Conservative Recommended tools: zoxide, fzf, ripgrep, fd and jq. Other entries are -optional/specialized. First-run discovery follows glyph/prompt setup, defaults -to Skip, and offers Recommended or Choose individually. Both choices only browse; -Recommended filters Discover. No bulk installation or shell-hook modification. +Recommended tools: ripgrep, fd, fzf, jq, bat, zoxide and tealdeer. Enhanced +tools are optional improvements; other entries (Fastfetch, frameworks, prompt +engines, environment tools) stay curated and supported without a tier. Discover +shows Recommended, Recommended + Enhanced (the default) or all curated tools (V). +Installs are explicit: tools are selected (Space, or the R/E presets), reviewed +with their exact commands, and confirmed once. Shell hooks are never modified. Legacy completed onboarding remains complete. The additive `toolsSetupComplete` boolean uses the existing normalizer/atomic NMSh preference writer. diff --git a/docs/architecture/shell-adapter.md b/docs/architecture/shell-adapter.md index c6e5bf2c..9cc79f64 100644 --- a/docs/architecture/shell-adapter.md +++ b/docs/architecture/shell-adapter.md @@ -21,7 +21,7 @@ ZshAdapter FishAdapter BashAdapter | Member | Purpose | |---|---| | `launch(context)` | Write private bootstrap files into a per-session directory and return argv + env. The user's own startup files load first. | -| marker grammar | Every adapter emits the same authenticated OSC 777 markers: `;` when a command finished (or the shell became ready) and `exec2;<0\|1>;` before a command runs. `ShellProtocolDecoder` is shared. | +| marker grammar | Every adapter emits the same authenticated OSC 777 markers: `;` when a command finished (or the shell became ready) and `exec2;<0\|1>;` before a command runs. Fish also emits `reader` from `fish_read` before builtin input starts. `ShellProtocolDecoder` is shared. | | `editorChrome` | `none` (zsh with ZLE off, Bash `--noediting`): everything after readiness is output. `prompt-to-exec` (Fish): bytes between readiness and exec are Fish's own line editor redrawing, and are dropped. | | `scrubCommandStart`, `answerQueries` | Fish turns bracketed paste off as it hands the terminal to a command; that byte sequence is removed from the start of command output so it can never reach the host in passthrough. Fish 4 waits for a primary-device-attributes reply while idle; NMSh, being its terminal, answers minimally. | | `capabilities` | What the backend can honestly provide: completion richness and descriptions, live names, history import, the shell's private-history rule, job counting. The frontend degrades on absent capabilities instead of faking them. | diff --git a/docs/captures/sticky-1-beginning.png b/docs/captures/sticky-1-beginning.png new file mode 100644 index 00000000..0c7a12c6 Binary files /dev/null and b/docs/captures/sticky-1-beginning.png differ diff --git a/docs/captures/sticky-2-middle.png b/docs/captures/sticky-2-middle.png new file mode 100644 index 00000000..ed247979 Binary files /dev/null and b/docs/captures/sticky-2-middle.png differ diff --git a/docs/captures/sticky-3-end.png b/docs/captures/sticky-3-end.png new file mode 100644 index 00000000..7274d8dc Binary files /dev/null and b/docs/captures/sticky-3-end.png differ diff --git a/docs/captures/sticky-4-transition.png b/docs/captures/sticky-4-transition.png new file mode 100644 index 00000000..7274d8dc Binary files /dev/null and b/docs/captures/sticky-4-transition.png differ diff --git a/docs/captures/sticky-5-next-block.png b/docs/captures/sticky-5-next-block.png new file mode 100644 index 00000000..1e5b994e Binary files /dev/null and b/docs/captures/sticky-5-next-block.png differ diff --git a/docs/captures/sticky-controls.gif b/docs/captures/sticky-controls.gif new file mode 100644 index 00000000..783321c5 Binary files /dev/null and b/docs/captures/sticky-controls.gif differ diff --git a/docs/design/activity-vocabulary.md b/docs/design/activity-vocabulary.md new file mode 100644 index 00000000..0787ddb8 --- /dev/null +++ b/docs/design/activity-vocabulary.md @@ -0,0 +1,24 @@ +# Expressive activity wording + +Tracked by [#362](https://github.com/raiseCatError/notMyShell/issues/362) and +[#367](https://github.com/raiseCatError/notMyShell/pull/367). + +Expressive is the default. Classic remains available in Activity settings and Setup; +both persist and transfer with the existing `idle` settings category. + +The dictionary contains paired active/completed phrases. Quality checks reject technical +outcome claims, NMSh feature names, repeated phrases, incorrect conjugation and excessive +width. The phrases describe decoration; shell exit codes, interruption and measured +timing decide the actual lifecycle. Waiting-input and failure displays remain factual. +Stored lifecycle text, reports and clipboard copies use factual wording. + +A command selects its pair before rendering. Selection uses its text and start time, +avoiding the preceding pair. The live journal stores dictionary indices for the running +and preceding choices, so redraws and reattachment with that journal retain the choice. +These indices have no effect on execution or status. Invalid indices are ignored. An old +or missing journal falls back to deterministic selection; it cannot reconstruct a +previously displaced choice. Archived completed transcripts display factual wording. + +Automated coverage includes forced adjacent-choice collisions, settings persistence and +transfer, live detach/reattach, factual clipboard bytes, failures, interruption, dictionary +quality and narrow widths. Physical terminal appearance still requires human QA. diff --git a/docs/design/agent-workspace-controls.md b/docs/design/agent-workspace-controls.md new file mode 100644 index 00000000..7f283120 --- /dev/null +++ b/docs/design/agent-workspace-controls.md @@ -0,0 +1,85 @@ +# Agent workspace: native controls, Claude mods and the context panel + +Continues [Managed Targets, agent UI, and unified mods](claude-managed-targets-agent-ui.md). Verified against +Claude Code 2.1.295 (2026-10-08) and its documentation on 2026-10-09. + +## Principles + +- **NMSh owns its interface; Claude owns its state.** Pickers, lists, confirmation and feedback are NMSh's. Every + change goes through a mechanism Claude documents: control requests on the managed stream-json channel, or Claude's + own `claude plugin …` commands. NMSh never edits Claude's settings files and never types into Claude's text menus. +- **Nothing is claimed without evidence.** Each fact carries its provenance (`provider`, `requested`, `observed`, + `estimate`) and age. A change is "requested" until Claude reports it; an estimate says it is one; an unreported value + is said in words, never shown as 0% or a guessed level. +- **A command beginning with `/` is not automatically NMSh's.** `isSlashInput()` is the single rule: a first word with + a `/` after the leading one is a path and belongs to the shell. In a managed agent composer only exact NMSh forms + (`/model`, `/effort`, `/panel`, `/context`, `/approval`, `/copy`) are intercepted; a leading space sends text verbatim. + +## Mechanisms + +| Need | Mechanism | Takes effect | +|---|---|---| +| Model | control request `set_model` | from Claude's next model call, mid-turn included; confirmed when `system/init` reports it | +| Effort | `apply_flag_settings {effortLevel}` (`null` = model default) | next turn, this session only | +| Launch effort | `--effort` flag from a launch profile (only when `--help` documents it) | the whole session | +| Context breakdown | `get_context_usage` (`summary`) | on request (`/context`) | +| Plugin inventory | `claude plugin list --json` per launch identity (`CLAUDE_CONFIG_DIR`) | read | +| Plugin contents | manifest files read as bounded JSON: `.claude-plugin/plugin.json`, `hooks/hooks.json`, component folders | read; nothing imported or run | +| Enable / disable | `claude plugin enable\|disable --scope --json` | settings; then `reload_plugins` to running managed sessions of that account | +| Inspect | `claude plugin details `, `claude plugin validate ` (static) | read | + +Claude's `plugin enable` accepts an id that is not installed and writes it into settings. NMSh only sends ids from the +current listing, and reads the listing again afterwards as evidence. + +## What is operational, what is representation, what is unsupported + +**Operational (real provider effect, verified by tests against the documented wire format and by the 2.1.295 probe):** + +- `/model` picker and `/model `: `set_model`, acknowledgement awaited, refusal kept beside the rows. +- `/effort` picker and `/effort `: `apply_flag_settings`, only the running model's `supportedEffortLevels`. +- `/context`: Claude's own breakdown in the right panel (categories, headroom to auto-compact). +- Plugin enable/disable at the installed scope and account, with listing re-read and live `reload_plugins`. +- Absolute executable paths in the shell composer, verified end to end on zsh, Bash and Fish. + +**Representation of provider facts (display only, with provenance):** + +- Header model and effort; right panel context meter (estimate between breakdowns), plan (TodoWrite), files read and + edited with line counts, subagents and tasks, compactions, usage limits near their cap, estimated cost. +- Plugin type, components, dependencies, scope conflicts, project overrides, "Loaded in" (from a target's own report). +- What a plugin does in a managed session: per Claude's docs, under `claude -p` a mod's hooks run but nothing it draws + appears (skins, filetree panes, terminal-browser, replay-theater's viewer); skills, agents, commands, settings hooks, + MCP and LSP servers load as usual. + +**Unsupported, said in the UI rather than faked:** + +- The effort level in effect is never reported by headless Claude; NMSh shows the acknowledged request, launch flag or + settings value, labelled as such. +- Personal skills (`skills/` folder) and settings hooks have no Claude command to toggle; they are listed with the reason. +- A plugin decided by the project's `.claude/settings(.local).json` is not toggled at user scope; the override is named. +- Mod panes, bands and restyled rows: not hosted by NMSh (no NMSh sandbox exists or is implied). +- Claude's own terminal sessions see a plugin change after `/reload-plugins` or a restart. + +## Research conclusions applied + +Two research passes (coding-agent interfaces and context tooling; workspace navigation and TUI craft) are summarized in +the PR. The decisions they drove: + +- **Two tiers of context.** A quiet pressure snapshot (bar, used of window, headroom, source and age) always in the + panel; the attribution report only on request. Never `null → 0%` (Claude HUD #330/#576); name the source because + Claude's own figures differ by denominator (CC #63015). +- **Model and effort pickers converge on one shape** (Claude Code, Codex): catalog rows with current/default marks, + per-model effort levels, explicit timing. NMSh adds provenance and keeps Enter as the only action. +- **Show the target of every file activity** (CC #21151): the panel lists paths with `+a -r` or `read`. +- **Plan only when the provider emits one**: task tools are off by default on 5.5-generation models. +- **Panels give way before the conversation does.** Right panel by default from 120 columns, on request from 72, + bounded to 30–46 columns; below that the conversation is full width. Breakpoints follow Herdr and lazygit practice. +- **State before decoration.** No transcript parsing or network on the render path (status-line tools' CPU and 429 + storms); everything comes from events NMSh already receives. + +## Next steps (not in this change) + +- Left workspace sidebar (projects, shell sessions, managed targets, worktrees, PRs) with Herdr's state vocabulary + (blocked / working / done-unseen / idle / unknown, worst-state roll-up) and selection ≠ preview ≠ activation. +- Per-turn diff source in the right panel from the provider's `structuredPatch` hunks already retained. +- MCP server status and session toggles in the panel (`mcp_status`, `mcp_toggle` are implemented in the adapter). +- Prompt-to-prompt navigation (`{` / `}`) in the agent transcript, matching Claude Code's transcript view. diff --git a/docs/design/archive/first-run-onboarding-2026-10/INVENTORY.md b/docs/design/archive/first-run-onboarding-2026-10/INVENTORY.md new file mode 100755 index 00000000..0453a3aa --- /dev/null +++ b/docs/design/archive/first-run-onboarding-2026-10/INVENTORY.md @@ -0,0 +1,342 @@ +# Inventory of the first-run onboarding design archive + +Every file in `/Volumes/T7 Shield/NMSh Design Archive/first-run-onboarding-2026-10-17` except this inventory, `MANIFEST.sha256` and macOS AppleDouble metadata. Full hashes are in `MANIFEST.sha256`. + +| Kind | Files | Size | +| --- | ---: | ---: | +| Archive documents | 1 | 7 KiB | +| Ending filmstrip frames | 20 | 1.8 MiB | +| Review pages and tools (original) | 6 | 9.1 MiB | +| Derived images and page checks | 69 | 4.8 MiB | +| Capture logs and benchmarks | 5 | 5 KiB | +| Stills | 70 | 8.6 MiB | +| Motion clips | 4 | 3.5 MiB | +| Prototype source (original) | 8 | 110 KiB | +| Version-controlled folder (portable copy) | 31 | 891 KiB | +| Packaged review | 1 | 11.7 MiB | +| Superseded implementation | 54 | 76.3 MiB | +| **Total** | **269** | **116.7 MiB** | + +### Archive documents + +| File | Size | SHA-256 (first 16) | +| --- | ---: | --- | +| `README.md` | 7 KiB | `294333c83e956193` | + +### Ending filmstrip frames + +| File | Size | SHA-256 (first 16) | +| --- | ---: | --- | +| `derived/ending-frames/end-19.30.png` | 4 KiB | `2877a1581d241f35` | +| `derived/ending-frames/end-19.50.png` | 80 KiB | `bdae92345efc908d` | +| `derived/ending-frames/end-19.62.png` | 103 KiB | `ba0aefdde23d9906` | +| `derived/ending-frames/end-19.75.png` | 123 KiB | `077e202ab3d44e0e` | +| `derived/ending-frames/end-19.88.png` | 131 KiB | `cbf1e985498ba5e2` | +| `derived/ending-frames/end-20.00.png` | 131 KiB | `7f73781105502d76` | +| `derived/ending-frames/end-20.20.png` | 132 KiB | `f412dec46e84e88e` | +| `derived/ending-frames/end-20.45.png` | 131 KiB | `4aa96f36502cab04` | +| `derived/ending-frames/end-20.80.png` | 131 KiB | `4aa96f36502cab04` | +| `derived/ending-frames/end-21.50.png` | 131 KiB | `4aa96f36502cab04` | +| `derived/ending-frames/fold-18.55.png` | 228 KiB | `496e3c68900481b8` | +| `derived/ending-frames/fold-18.70.png` | 228 KiB | `f84ed0470274c8ca` | +| `derived/ending-frames/fold-18.80.png` | 34 KiB | `ebce824be168c923` | +| `derived/ending-frames/fold-18.90.png` | 23 KiB | `12fa2b33d4a67118` | +| `derived/ending-frames/fold-19.00.png` | 19 KiB | `a255e5014c1b776f` | +| `derived/ending-frames/fold-19.10.png` | 4 KiB | `2877a1581d241f35` | +| `derived/ending-frames/fold-19.20.png` | 4 KiB | `2877a1581d241f35` | +| `derived/ending-frames/fold-19.30.png` | 4 KiB | `2877a1581d241f35` | +| `derived/ending-frames/fold.png` | 147 KiB | `bdc0fcabca76c35b` | +| `derived/ending-frames/strip.png` | 90 KiB | `4088035a138d3044` | + +### Review pages and tools (original) + +| File | Size | SHA-256 (first 16) | +| --- | ---: | --- | +| `design-concepts/build-embedded.mjs` | 2 KiB | `3490f36c4e1e1d99` | +| `design-concepts/capture.mjs` | 8 KiB | `bead4b929cc9f2f9` | +| `design-concepts/package.json` | 135 B | `9c525e3337d835ec` | +| `design-concepts/review-embedded.html` | 9.0 MiB | `54e538163ee0d771` | +| `design-concepts/review.html` | 66 KiB | `5040fb819f67a434` | +| `design-concepts/run.sh` | 481 B | `16b074c942bf4810` | + +### Derived images and page checks + +| File | Size | SHA-256 (first 16) | +| --- | ---: | --- | +| `design-concepts/build/captures_horizon_backdrop-off-standard.png` | 48 KiB | `0764cb15dbc372f9` | +| `design-concepts/build/captures_horizon_backdrop-subtle-standard.png` | 50 KiB | `e639148e62011250` | +| `design-concepts/build/captures_horizon_confirm-wide.png` | 63 KiB | `4985c513bbdfe7a0` | +| `design-concepts/build/captures_horizon_customize-wide.png` | 47 KiB | `29ffe564f5435058` | +| `design-concepts/build/captures_horizon_keep-custom-wide.png` | 75 KiB | `00358d594c0b5256` | +| `design-concepts/build/captures_horizon_keep-multi-wide.png` | 71 KiB | `61b89f258f4f940f` | +| `design-concepts/build/captures_horizon_kept-standard.png` | 14 KiB | `ecfde9bfb927b7e8` | +| `design-concepts/build/captures_horizon_nocolor-standard.png` | 46 KiB | `601e9d9ec78054a0` | +| `design-concepts/build/captures_horizon_pick-1-narrow.png` | 26 KiB | `a8c82a27f56b0ade` | +| `design-concepts/build/captures_horizon_pick-1-standard.png` | 51 KiB | `cde566147f21462c` | +| `design-concepts/build/captures_horizon_pick-1-wide.png` | 63 KiB | `1d8a62916b12789f` | +| `design-concepts/build/captures_horizon_pick-2-medium.png` | 30 KiB | `1965699c3574d1de` | +| `design-concepts/build/captures_horizon_pick-2-wide.png` | 63 KiB | `ba8d77cfd36a9982` | +| `design-concepts/build/captures_horizon_pick-3-wide.png` | 58 KiB | `ebeb46b08856108b` | +| `design-concepts/build/captures_horizon_pick-4-small.png` | 21 KiB | `b4ca1a25052c0111` | +| `design-concepts/build/captures_horizon_pick-4-wide.png` | 70 KiB | `65a1435ea4210a7d` | +| `design-concepts/build/captures_horizon_review-1-wide.png` | 61 KiB | `53cf1438e611db35` | +| `design-concepts/build/captures_horizon_review-4-wide.png` | 63 KiB | `311a326a7e6b01dd` | +| `design-concepts/build/captures_horizon_theme-ocean-standard.png` | 57 KiB | `41eaf842bf3c559a` | +| `design-concepts/build/captures_horizon_welcome-wide.png` | 38 KiB | `9bb65111072a5066` | +| `design-concepts/build/captures_prompt_backdrop-off-standard.png` | 47 KiB | `feae5a2927ed3631` | +| `design-concepts/build/captures_prompt_backdrop-subtle-standard.png` | 51 KiB | `8adaef0a260dc327` | +| `design-concepts/build/captures_prompt_confirm-wide.png` | 50 KiB | `7e84138d8bd41b1a` | +| `design-concepts/build/captures_prompt_customize-wide.png` | 58 KiB | `1ccaebf206bd1325` | +| `design-concepts/build/captures_prompt_keep-custom-wide.png` | 70 KiB | `0140353975b1134f` | +| `design-concepts/build/captures_prompt_keep-multi-wide.png` | 66 KiB | `a6911770046816d6` | +| `design-concepts/build/captures_prompt_kept-standard.png` | 13 KiB | `4360bbf366723cf3` | +| `design-concepts/build/captures_prompt_nocolor-standard.png` | 47 KiB | `0cc88674a0d01ab0` | +| `design-concepts/build/captures_prompt_pick-1-narrow.png` | 35 KiB | `8fc1df4757ec62b9` | +| `design-concepts/build/captures_prompt_pick-1-standard.png` | 49 KiB | `f9be0663099f333b` | +| `design-concepts/build/captures_prompt_pick-1-wide.png` | 53 KiB | `2671fe401074d513` | +| `design-concepts/build/captures_prompt_pick-2-medium.png` | 37 KiB | `786453620be6d172` | +| `design-concepts/build/captures_prompt_pick-2-wide.png` | 50 KiB | `41fb78acf25421e5` | +| `design-concepts/build/captures_prompt_pick-3-wide.png` | 55 KiB | `78bb913b0156cd22` | +| `design-concepts/build/captures_prompt_pick-4-small.png` | 18 KiB | `070ee97ae8496fdb` | +| `design-concepts/build/captures_prompt_pick-4-wide.png` | 52 KiB | `f2b5e1de65de157b` | +| `design-concepts/build/captures_prompt_review-1-wide.png` | 55 KiB | `0b1b1cc52a149bb1` | +| `design-concepts/build/captures_prompt_review-4-wide.png` | 56 KiB | `e361a600d0ef06fa` | +| `design-concepts/build/captures_prompt_theme-ocean-standard.png` | 55 KiB | `6a92f0744a24987c` | +| `design-concepts/build/captures_prompt_welcome-wide.png` | 44 KiB | `cfb4905864b26278` | +| `design-concepts/build/captures_reactive_pick-1-wide.png` | 63 KiB | `86030567a9afaac5` | +| `design-concepts/build/captures_reactive_pick-2-wide.png` | 61 KiB | `aa70a14d963896c4` | +| `design-concepts/build/captures_reactive_pick-3-wide.png` | 59 KiB | `639b501bb93c5d50` | +| `design-concepts/build/captures_reactive_pick-4-wide.png` | 60 KiB | `f1aecf7a68b37d00` | +| `design-concepts/build/captures_stage_backdrop-off-standard.png` | 38 KiB | `c681aa953d2cbf55` | +| `design-concepts/build/captures_stage_backdrop-subtle-standard.png` | 45 KiB | `9bc7d525494a684e` | +| `design-concepts/build/captures_stage_confirm-wide.png` | 36 KiB | `e97b997dd816ac41` | +| `design-concepts/build/captures_stage_customize-wide.png` | 43 KiB | `357a62b8921f9450` | +| `design-concepts/build/captures_stage_keep-custom-wide.png` | 82 KiB | `9ad95156ee1ac3b9` | +| `design-concepts/build/captures_stage_keep-multi-wide.png` | 76 KiB | `2b0b8532a9775186` | +| `design-concepts/build/captures_stage_kept-standard.png` | 14 KiB | `ecfde9bfb927b7e8` | +| `design-concepts/build/captures_stage_nocolor-standard.png` | 36 KiB | `36383cfb8f355704` | +| `design-concepts/build/captures_stage_pick-1-narrow.png` | 22 KiB | `bea714fd27d08fe1` | +| `design-concepts/build/captures_stage_pick-1-standard.png` | 46 KiB | `a9c8c42a15273680` | +| `design-concepts/build/captures_stage_pick-1-wide.png` | 55 KiB | `edddfa94de76884c` | +| `design-concepts/build/captures_stage_pick-2-medium.png` | 26 KiB | `56fdd695e481967b` | +| `design-concepts/build/captures_stage_pick-2-wide.png` | 53 KiB | `058e9555a60ad75c` | +| `design-concepts/build/captures_stage_pick-3-wide.png` | 59 KiB | `92dd39290932082c` | +| `design-concepts/build/captures_stage_pick-4-small.png` | 9 KiB | `5e5d3fac8abb22cc` | +| `design-concepts/build/captures_stage_pick-4-wide.png` | 62 KiB | `a0b51d5e01c547b8` | +| `design-concepts/build/captures_stage_review-1-wide.png` | 53 KiB | `7d956cd2257c5483` | +| `design-concepts/build/captures_stage_review-4-wide.png` | 63 KiB | `65c8e1499c9950bf` | +| `design-concepts/build/captures_stage_theme-ocean-standard.png` | 49 KiB | `bf399c533900b9da` | +| `design-concepts/build/captures_stage_welcome-wide.png` | 41 KiB | `7c208259724c0311` | +| `design-concepts/build/clip-reactive-10.png` | 212 KiB | `bc88d796979a1c40` | +| `design-concepts/build/clip-stage-20.png` | 166 KiB | `038d13d5cb2b549f` | +| `design-concepts/build/q-test.png` | 55 KiB | `edddfa94de76884c` | +| `design-concepts/build/review-desktop.png` | 1.0 MiB | `0849c50b2c013d2f` | +| `design-concepts/build/review-phone.png` | 288 KiB | `3010a3703a19226a` | + +### Capture logs and benchmarks + +| File | Size | SHA-256 (first 16) | +| --- | ---: | --- | +| `design-concepts/captures/bench.jsonl` | 3 KiB | `04d2ee8c1a5e740c` | +| `design-concepts/captures/horizon-run.log` | 782 B | `d6016d9c13a5a131` | +| `design-concepts/captures/prompt-run.log` | 761 B | `3f1769f1f637f544` | +| `design-concepts/captures/reactive-run.log` | 221 B | `d65a5b32b4119f19` | +| `design-concepts/captures/stage-run.log` | 740 B | `3b660bc5f1d68b01` | + +### Stills + +| File | Size | SHA-256 (first 16) | +| --- | ---: | --- | +| `design-concepts/captures/horizon/backdrop-off-standard.png` | 119 KiB | `ab00d2f015f27243` | +| `design-concepts/captures/horizon/backdrop-subtle-standard.png` | 130 KiB | `298d6785cb46190a` | +| `design-concepts/captures/horizon/confirm-wide.png` | 161 KiB | `ddc7feda6d90706b` | +| `design-concepts/captures/horizon/customize-wide.png` | 119 KiB | `27cafcd8ff949e04` | +| `design-concepts/captures/horizon/keep-custom-wide.png` | 201 KiB | `c67422615500a9e9` | +| `design-concepts/captures/horizon/keep-multi-wide.png` | 189 KiB | `a3d318ccea1ccd39` | +| `design-concepts/captures/horizon/kept-standard.png` | 28 KiB | `c28abecec0964d24` | +| `design-concepts/captures/horizon/nocolor-standard.png` | 110 KiB | `58e982fd2815665f` | +| `design-concepts/captures/horizon/pick-1-narrow.png` | 65 KiB | `42163aa49c8f11b7` | +| `design-concepts/captures/horizon/pick-1-standard.png` | 134 KiB | `fb8e1b3e439fa8d8` | +| `design-concepts/captures/horizon/pick-1-wide.png` | 171 KiB | `8d0385f83863b121` | +| `design-concepts/captures/horizon/pick-2-medium.png` | 77 KiB | `8022c64c18a7b6ee` | +| `design-concepts/captures/horizon/pick-2-wide.png` | 172 KiB | `498d912173e96f06` | +| `design-concepts/captures/horizon/pick-3-wide.png` | 157 KiB | `891b35789bfa3d34` | +| `design-concepts/captures/horizon/pick-4-small.png` | 52 KiB | `ebe8fecc398d672b` | +| `design-concepts/captures/horizon/pick-4-standard.png` | 151 KiB | `50f050a8bdc8bcae` | +| `design-concepts/captures/horizon/pick-4-wide.png` | 187 KiB | `417c2914bf409aba` | +| `design-concepts/captures/horizon/review-1-wide.png` | 163 KiB | `bd3e559b0a9fd44f` | +| `design-concepts/captures/horizon/review-4-wide.png` | 168 KiB | `d64585dcc2610ce0` | +| `design-concepts/captures/horizon/theme-ocean-standard.png` | 151 KiB | `1e4cd8cc56f24dae` | +| `design-concepts/captures/horizon/welcome-wide.png` | 91 KiB | `d9f305c9725e17cb` | +| `design-concepts/captures/lab/sky-bands.png` | 96 KiB | `a1914961ac1e9c0c` | +| `design-concepts/captures/prompt/backdrop-off-standard.png` | 112 KiB | `c10a36ff000cebec` | +| `design-concepts/captures/prompt/backdrop-subtle-standard.png` | 124 KiB | `e1340a44e36970b1` | +| `design-concepts/captures/prompt/confirm-wide.png` | 132 KiB | `3a32fe2a97acae87` | +| `design-concepts/captures/prompt/customize-wide.png` | 152 KiB | `d40d9027386eddca` | +| `design-concepts/captures/prompt/keep-custom-wide.png` | 184 KiB | `99eb5793fedeb61f` | +| `design-concepts/captures/prompt/keep-multi-wide.png` | 178 KiB | `24e4dc62abc145ee` | +| `design-concepts/captures/prompt/kept-standard.png` | 28 KiB | `664e01a13114fb2a` | +| `design-concepts/captures/prompt/nocolor-standard.png` | 104 KiB | `369f97374401c85b` | +| `design-concepts/captures/prompt/pick-1-narrow.png` | 85 KiB | `61abce7378922de2` | +| `design-concepts/captures/prompt/pick-1-standard.png` | 129 KiB | `cb0fb7a1c484ca14` | +| `design-concepts/captures/prompt/pick-1-wide.png` | 141 KiB | `459c1a54292a01cf` | +| `design-concepts/captures/prompt/pick-2-medium.png` | 85 KiB | `a6f6a079f6af4ef0` | +| `design-concepts/captures/prompt/pick-2-wide.png` | 129 KiB | `fdfb232c0be938f7` | +| `design-concepts/captures/prompt/pick-3-wide.png` | 145 KiB | `b41b6d7bd2750273` | +| `design-concepts/captures/prompt/pick-4-small.png` | 44 KiB | `e01b83258f9d3b0d` | +| `design-concepts/captures/prompt/pick-4-standard.png` | 125 KiB | `462ad417cb8b802d` | +| `design-concepts/captures/prompt/pick-4-wide.png` | 137 KiB | `69862d985a2ecedf` | +| `design-concepts/captures/prompt/review-1-wide.png` | 149 KiB | `939a3fe31f8824f9` | +| `design-concepts/captures/prompt/review-4-wide.png` | 148 KiB | `d5ff1738dc229661` | +| `design-concepts/captures/prompt/theme-ocean-standard.png` | 141 KiB | `755fd9252ec8c1e2` | +| `design-concepts/captures/prompt/welcome-wide.png` | 117 KiB | `885425e54b580b51` | +| `design-concepts/captures/reactive/pick-1-wide.png` | 171 KiB | `0032086e5e715ba5` | +| `design-concepts/captures/reactive/pick-2-standard.png` | 127 KiB | `c82f409674ff5bf8` | +| `design-concepts/captures/reactive/pick-2-wide.png` | 147 KiB | `66783830a9bf1ed3` | +| `design-concepts/captures/reactive/pick-3-wide.png` | 157 KiB | `9090d2052694d0f1` | +| `design-concepts/captures/reactive/pick-4-standard.png` | 136 KiB | `8cfa6aa5a5909ceb` | +| `design-concepts/captures/reactive/pick-4-wide.png` | 141 KiB | `1a2526c6a28d04e3` | +| `design-concepts/captures/stage/backdrop-off-standard.png` | 95 KiB | `fbf00f8fbda456cc` | +| `design-concepts/captures/stage/backdrop-subtle-standard.png` | 119 KiB | `d01eaaef89f04b44` | +| `design-concepts/captures/stage/confirm-wide.png` | 84 KiB | `a09f39daefd32a2b` | +| `design-concepts/captures/stage/customize-wide.png` | 103 KiB | `d371ff03dec64b2a` | +| `design-concepts/captures/stage/keep-custom-wide.png` | 203 KiB | `f261fd6efc3878ea` | +| `design-concepts/captures/stage/keep-multi-wide.png` | 189 KiB | `a75e17c06bf66744` | +| `design-concepts/captures/stage/kept-standard.png` | 28 KiB | `c28abecec0964d24` | +| `design-concepts/captures/stage/nocolor-standard.png` | 86 KiB | `fbf8f00d45ed7000` | +| `design-concepts/captures/stage/pick-1-narrow.png` | 58 KiB | `9ce5f5fce5cf6e58` | +| `design-concepts/captures/stage/pick-1-standard.png` | 127 KiB | `61398672589ef492` | +| `design-concepts/captures/stage/pick-1-wide.png` | 156 KiB | `66e4641b46c5633e` | +| `design-concepts/captures/stage/pick-2-medium.png` | 63 KiB | `8f64d15d878f6b9d` | +| `design-concepts/captures/stage/pick-2-wide.png` | 126 KiB | `eb7863d49c6a6cbf` | +| `design-concepts/captures/stage/pick-3-wide.png` | 159 KiB | `9c97252e1a391db6` | +| `design-concepts/captures/stage/pick-4-small.png` | 18 KiB | `b3a111cbd09b4896` | +| `design-concepts/captures/stage/pick-4-standard.png` | 145 KiB | `dd5d5ff1bfaca538` | +| `design-concepts/captures/stage/pick-4-wide.png` | 152 KiB | `c01f23321bcb8121` | +| `design-concepts/captures/stage/review-1-wide.png` | 146 KiB | `697775a7e73498ab` | +| `design-concepts/captures/stage/review-4-wide.png` | 153 KiB | `7c4514d06fe60e09` | +| `design-concepts/captures/stage/theme-ocean-standard.png` | 138 KiB | `7ce71a96f92bf385` | +| `design-concepts/captures/stage/welcome-wide.png` | 104 KiB | `a21c7b04657ff837` | + +### Motion clips + +| File | Size | SHA-256 (first 16) | +| --- | ---: | --- | +| `design-concepts/captures/horizon/motion.mp4` | 817 KiB | `b7b378fe171f2c86` | +| `design-concepts/captures/prompt/motion.mp4` | 755 KiB | `c45454ea13823e1f` | +| `design-concepts/captures/reactive/motion.mp4` | 812 KiB | `2f3e980cab3b3d1f` | +| `design-concepts/captures/stage/motion.mp4` | 1.2 MiB | `df98eb749499dd96` | + +### Prototype source (original) + +| File | Size | SHA-256 (first 16) | +| --- | ---: | --- | +| `design-concepts/proto/bench.ts` | 2 KiB | `5d22abe7fdf2d327` | +| `design-concepts/proto/firstprompt.ts` | 18 KiB | `546d3c08862f854e` | +| `design-concepts/proto/horizon.ts` | 25 KiB | `4a67432fc3a177fd` | +| `design-concepts/proto/kit.ts` | 30 KiB | `7be5931967a81f4d` | +| `design-concepts/proto/main.ts` | 7 KiB | `2e8e4fc3d7ab9618` | +| `design-concepts/proto/skylab.ts` | 1 KiB | `55e6ed207d5da96a` | +| `design-concepts/proto/src.ts` | 4 KiB | `8806909c9d3d565e` | +| `design-concepts/proto/stage.ts` | 23 KiB | `dcbc8979e11aaf05` | + +### Version-controlled folder (portable copy) + +| File | Size | SHA-256 (first 16) | +| --- | ---: | --- | +| `repo-folder/README.md` | 7 KiB | `294333c83e956193` | +| `repo-folder/prototypes/build-embedded.mjs` | 2 KiB | `7a2f34356590048a` | +| `repo-folder/prototypes/capture.mjs` | 8 KiB | `541188ca60481a96` | +| `repo-folder/prototypes/package.json` | 135 B | `9c525e3337d835ec` | +| `repo-folder/prototypes/proto/bench.ts` | 2 KiB | `5d22abe7fdf2d327` | +| `repo-folder/prototypes/proto/firstprompt.ts` | 18 KiB | `546d3c08862f854e` | +| `repo-folder/prototypes/proto/horizon.ts` | 25 KiB | `4a67432fc3a177fd` | +| `repo-folder/prototypes/proto/kit.ts` | 30 KiB | `7be5931967a81f4d` | +| `repo-folder/prototypes/proto/main.ts` | 7 KiB | `2e8e4fc3d7ab9618` | +| `repo-folder/prototypes/proto/skylab.ts` | 1 KiB | `55e6ed207d5da96a` | +| `repo-folder/prototypes/proto/src.ts` | 3 KiB | `8464527987c27a35` | +| `repo-folder/prototypes/proto/stage.ts` | 23 KiB | `dcbc8979e11aaf05` | +| `repo-folder/prototypes/review.html` | 66 KiB | `5040fb819f67a434` | +| `repo-folder/prototypes/run.sh` | 755 B | `1d77d50f1da88e8d` | +| `repo-folder/reference/alternative-first-prompt.png` | 53 KiB | `2671fe401074d513` | +| `repo-folder/reference/alternative-stage.png` | 55 KiB | `edddfa94de76884c` | +| `repo-folder/reference/approved-customize.png` | 59 KiB | `639b501bb93c5d50` | +| `repo-folder/reference/approved-ending-fold-filmstrip.png` | 56 KiB | `2195d6b233ecd900` | +| `repo-folder/reference/approved-ending-welcome-filmstrip.png` | 34 KiB | `8ade214fbedb83b6` | +| `repo-folder/reference/approved-guided-tour.png` | 47 KiB | `29ffe564f5435058` | +| `repo-folder/reference/approved-keep-existing-review.png` | 63 KiB | `311a326a7e6b01dd` | +| `repo-folder/reference/approved-keep-existing.png` | 60 KiB | `f1aecf7a68b37d00` | +| `repo-folder/reference/approved-leave-confirmation.png` | 63 KiB | `4985c513bbdfe7a0` | +| `repo-folder/reference/approved-minimal.png` | 61 KiB | `aa70a14d963896c4` | +| `repo-folder/reference/approved-recommended.png` | 63 KiB | `86030567a9afaac5` | +| `repo-folder/reference/approved-welcome.png` | 38 KiB | `9bb65111072a5066` | +| `repo-folder/reference/aurora-moods.png` | 39 KiB | `4f04d08e01932d28` | +| `repo-folder/tools/create-t7-archive.sh` | 3 KiB | `ee7481318a1a820c` | +| `repo-folder/tools/inventory.mjs` | 3 KiB | `cd234fd84b72620f` | +| `repo-folder/tools/prepare-pinned-checkout.sh` | 1 KiB | `00bc19b110288577` | +| `repo-folder/tools/verify-t7-archive.sh` | 535 B | `40e3cd1503417f43` | + +### Packaged review + +| File | Size | SHA-256 (first 16) | +| --- | ---: | --- | +| `review-package/design-review.zip` | 11.7 MiB | `699a23924d380567` | + +### Superseded implementation + +| File | Size | SHA-256 (first 16) | +| --- | ---: | --- | +| `superseded/notMyShell-13a47f8.bundle` | 75.5 MiB | `61e0cd9e1ba0e37b` | +| `superseded/source-13a47f8/docs/design/post-v020-preferences-onboarding.md` | 7 KiB | `79029ad55feed753` | +| `superseded/source-13a47f8/docs/testing/post-v020-preferences-onboarding.md` | 18 KiB | `0edc31fbde0b949d` | +| `superseded/source-13a47f8/scripts/dev/post-v020-previews.ts` | 8 KiB | `4b4a0ebdda6ea2ff` | +| `superseded/source-13a47f8/src/cursor/palette.ts` | 5 KiB | `e96f03de81b2a9f5` | +| `superseded/source-13a47f8/src/idle/catSprite.ts` | 3 KiB | `b5d7ed61b8f1787c` | +| `superseded/source-13a47f8/src/idle/scenes.ts` | 30 KiB | `d422fefa5b4416cb` | +| `superseded/source-13a47f8/src/output/Welcome.ts` | 8 KiB | `6337e5c55efd69fc` | +| `superseded/source-13a47f8/src/prompt/configuration.ts` | 80 KiB | `09ba5362478b846d` | +| `superseded/source-13a47f8/src/setup/SetupCat.ts` | 76 KiB | `c864a7dbe3cde6e0` | +| `superseded/source-13a47f8/src/setup/SetupPreview.ts` | 9 KiB | `e97e2354c371f1ce` | +| `superseded/source-13a47f8/tests/postV020Onboarding.test.ts` | 21 KiB | `5dd16ea27626b637` | +| `superseded/source-13a47f8/tests/postV020Preferences.test.ts` | 16 KiB | `e0cac90691ece57a` | +| `superseded/source-13a47f8/tests/setupQuickPreview.test.ts` | 2 KiB | `709a2399f4088362` | +| `superseded/static-modal-captures.mts` | 4 KiB | `96fd8c638289c4a2` | +| `superseded/static-modal-captures/confirm-120x40.ansi` | 25 KiB | `70b30f70ec1ac19f` | +| `superseded/static-modal-captures/confirm-16x6.ansi` | 72 B | `0125b6aa00036b51` | +| `superseded/static-modal-captures/confirm-200x50.ansi` | 52 KiB | `9bb0c98599159ec5` | +| `superseded/static-modal-captures/confirm-32x12.ansi` | 2 KiB | `aa657fef504562a8` | +| `superseded/static-modal-captures/confirm-50x16.ansi` | 4 KiB | `61045452cf3f2320` | +| `superseded/static-modal-captures/confirm-80x24.ansi` | 9 KiB | `526835a8c54a462d` | +| `superseded/static-modal-captures/confirm-exit-120x40.ansi` | 25 KiB | `0bda74523ef77bb4` | +| `superseded/static-modal-captures/confirm-exit-16x6.ansi` | 72 B | `a3ed0c3b25c8bd16` | +| `superseded/static-modal-captures/confirm-exit-200x50.ansi` | 52 KiB | `8575516b8ea3c2f3` | +| `superseded/static-modal-captures/confirm-exit-32x12.ansi` | 2 KiB | `a315f123bafacb04` | +| `superseded/static-modal-captures/confirm-exit-50x16.ansi` | 4 KiB | `90e17c101e5b1a4f` | +| `superseded/static-modal-captures/confirm-exit-80x24.ansi` | 9 KiB | `71da00293c151901` | +| `superseded/static-modal-captures/customize-manual-120x40.ansi` | 2 KiB | `90346f904370a19d` | +| `superseded/static-modal-captures/customize-manual-16x6.ansi` | 248 B | `4d1234c90c6df9fe` | +| `superseded/static-modal-captures/customize-manual-200x50.ansi` | 3 KiB | `f4576256dfc47fd4` | +| `superseded/static-modal-captures/customize-manual-32x12.ansi` | 848 B | `4be4861980b3f488` | +| `superseded/static-modal-captures/customize-manual-50x16.ansi` | 1 KiB | `89f50c7bb0cc2c30` | +| `superseded/static-modal-captures/customize-manual-80x24.ansi` | 2 KiB | `52129fb2c98197f8` | +| `superseded/static-modal-captures/picker-minimal-120x40.ansi` | 23 KiB | `24ea117567e77b41` | +| `superseded/static-modal-captures/picker-minimal-16x6.ansi` | 95 B | `8404933403257b4d` | +| `superseded/static-modal-captures/picker-minimal-200x50.ansi` | 50 KiB | `ac98bff52d048d31` | +| `superseded/static-modal-captures/picker-minimal-32x12.ansi` | 2 KiB | `9353d310916607e5` | +| `superseded/static-modal-captures/picker-minimal-50x16.ansi` | 3 KiB | `e0ce7fb525b14ce5` | +| `superseded/static-modal-captures/picker-minimal-80x24.ansi` | 7 KiB | `44101a6776a24f9c` | +| `superseded/static-modal-captures/picker-off-80x24.ansi` | 3 KiB | `dd02611e72750e01` | +| `superseded/static-modal-captures/picker-recommended-120x40.ansi` | 23 KiB | `4159c0064db5615d` | +| `superseded/static-modal-captures/picker-recommended-16x6.ansi` | 75 B | `64dabbda068ca1ef` | +| `superseded/static-modal-captures/picker-recommended-200x50.ansi` | 50 KiB | `439450eb4fc949af` | +| `superseded/static-modal-captures/picker-recommended-32x12.ansi` | 2 KiB | `7c15b2850fd05497` | +| `superseded/static-modal-captures/picker-recommended-50x16.ansi` | 4 KiB | `251abd3f1235994d` | +| `superseded/static-modal-captures/picker-recommended-80x24.ansi` | 8 KiB | `6ccb67fdc65076e2` | +| `superseded/static-modal-captures/picker-subtle-80x24.ansi` | 7 KiB | `2993d956ec79e9ae` | +| `superseded/static-modal-captures/review-minimal-120x40.ansi` | 24 KiB | `5fcbf957b5d3f7a3` | +| `superseded/static-modal-captures/review-minimal-16x6.ansi` | 47 B | `606bce84fbc75aa1` | +| `superseded/static-modal-captures/review-minimal-200x50.ansi` | 52 KiB | `1b555a6791703723` | +| `superseded/static-modal-captures/review-minimal-32x12.ansi` | 2 KiB | `6435de0dbba1e36e` | +| `superseded/static-modal-captures/review-minimal-50x16.ansi` | 3 KiB | `4d9bea6eff60b131` | +| `superseded/static-modal-captures/review-minimal-80x24.ansi` | 9 KiB | `c8dfdaa0dac58813` | +| `superseded/static-modal-captures/summary.txt` | 13 KiB | `96c7867bfe849bf7` | diff --git a/docs/design/archive/first-run-onboarding-2026-10/MANIFEST.sha256 b/docs/design/archive/first-run-onboarding-2026-10/MANIFEST.sha256 new file mode 100755 index 00000000..c6f6ec6b --- /dev/null +++ b/docs/design/archive/first-run-onboarding-2026-10/MANIFEST.sha256 @@ -0,0 +1,269 @@ +294333c83e956193d11bd3ef33c4ade21692bc9450b0439a6a55ce67dfb1c5de ./README.md +2877a1581d241f35b8f4639a14bbf2106319b0f234a221db7897cc3c8668198f ./derived/ending-frames/end-19.30.png +bdae92345efc908d4b9acf8a7ac0816f7cc44582706cb44da2709a404d58d4cd ./derived/ending-frames/end-19.50.png +ba0aefdde23d990663d1f7ab25da65fcfeae57abca502529191159cfca51fff7 ./derived/ending-frames/end-19.62.png +077e202ab3d44e0ef856156d05c5c3b388f6c00f22a9f070c3b0aa5828d4b426 ./derived/ending-frames/end-19.75.png +cbf1e985498ba5e2d261826835a42a2d4f488f1e0c3f8d7b1b4962408de2f770 ./derived/ending-frames/end-19.88.png +7f73781105502d76548d9e5a8ecaf89a30d74550830ef2cc11ce02183ca8f9af ./derived/ending-frames/end-20.00.png +f412dec46e84e88e16d71ca783f31c15f33eecae6de6ae8ead39914c63c374d0 ./derived/ending-frames/end-20.20.png +4aa96f36502cab04e0a8ecd71a9fa869335d73c62ad522855b3eb17883a0483c ./derived/ending-frames/end-20.45.png +4aa96f36502cab04e0a8ecd71a9fa869335d73c62ad522855b3eb17883a0483c ./derived/ending-frames/end-20.80.png +4aa96f36502cab04e0a8ecd71a9fa869335d73c62ad522855b3eb17883a0483c ./derived/ending-frames/end-21.50.png +496e3c68900481b85ad7505af8dd251ef23f15a966cf862f38aac6010cf5c532 ./derived/ending-frames/fold-18.55.png +f84ed0470274c8cad73d26067167612e771b21ec881e906720da3dbfdeb28d1a ./derived/ending-frames/fold-18.70.png +ebce824be168c92358f7ac954fe490097e9f396410d0182d6f04d6f302cac247 ./derived/ending-frames/fold-18.80.png +12fa2b33d4a6711891abb1a76b537795f827b26762d2db776748e94229b76c41 ./derived/ending-frames/fold-18.90.png +a255e5014c1b776fac1c9b8b38b86509f1fd9a4810431e97338ead78baac2d3c ./derived/ending-frames/fold-19.00.png +2877a1581d241f35b8f4639a14bbf2106319b0f234a221db7897cc3c8668198f ./derived/ending-frames/fold-19.10.png +2877a1581d241f35b8f4639a14bbf2106319b0f234a221db7897cc3c8668198f ./derived/ending-frames/fold-19.20.png +2877a1581d241f35b8f4639a14bbf2106319b0f234a221db7897cc3c8668198f ./derived/ending-frames/fold-19.30.png +bdc0fcabca76c35bd9e50a8bda1ff84242d49a0b0e1c69ee561b2282b241ca3a ./derived/ending-frames/fold.png +4088035a138d30443ffb94bbf9de8d19ed5431efed2af9acfcfe3a2f16117b59 ./derived/ending-frames/strip.png +3490f36c4e1e1d9969209dd320af75c95910f6a383ce7affe0fd8af08ff10ac2 ./design-concepts/build-embedded.mjs +0764cb15dbc372f9f078bf8fa304d4d11bfb602abdf0d261389466075f77935b ./design-concepts/build/captures_horizon_backdrop-off-standard.png +e639148e620112505be4d0f1a14174af4cd7751830f97fa055699091a1160c1d ./design-concepts/build/captures_horizon_backdrop-subtle-standard.png +4985c513bbdfe7a038436f2d38c7ffb7d03919575f23bab4b9f23d2459150e2c ./design-concepts/build/captures_horizon_confirm-wide.png +29ffe564f543505890c03e077c66af7dc4d730f1e1e931df785ce7abb974d790 ./design-concepts/build/captures_horizon_customize-wide.png +00358d594c0b5256b72c4771d3232004853a96a0c901893f85b1790e57b1048f ./design-concepts/build/captures_horizon_keep-custom-wide.png +61b89f258f4f940f401bb60a51a0bf630a09eb9553f95a59f9bcfd6cfdaea697 ./design-concepts/build/captures_horizon_keep-multi-wide.png +ecfde9bfb927b7e886dc41fb0ffdaf6ee0fe48f6a71ee152ea219bb357f78eca ./design-concepts/build/captures_horizon_kept-standard.png +601e9d9ec78054a057596559d25b54b3e846e526611342c12477f6c491eefd76 ./design-concepts/build/captures_horizon_nocolor-standard.png +a8c82a27f56b0ade36a22744cb9f34c7df254207dcd4c6468b2f4dfabd69aa41 ./design-concepts/build/captures_horizon_pick-1-narrow.png +cde566147f21462c2f6bc82e0d1a890a6f492b6ccf7618053c20a3c05c73e055 ./design-concepts/build/captures_horizon_pick-1-standard.png +1d8a62916b12789fb2c6a418d983327185cc4f12cce4e2b9ae87dc8c47ff7f62 ./design-concepts/build/captures_horizon_pick-1-wide.png +1965699c3574d1de3bb19d9f5a8acfda29c12ade5c78f13a827df21a43a4ab2e ./design-concepts/build/captures_horizon_pick-2-medium.png +ba8d77cfd36a99827239b7e579bee6dd2ec9d518522aed8bf0910da5bf9d952e ./design-concepts/build/captures_horizon_pick-2-wide.png +ebeb46b08856108b7c3857966c91c531a54f7c71bd04ba5d322619056e506573 ./design-concepts/build/captures_horizon_pick-3-wide.png +b4ca1a25052c0111b76bc07ced8b565aa64d6d025dee839633aa99a6f9ad3fde ./design-concepts/build/captures_horizon_pick-4-small.png +65a1435ea4210a7dcebdc9cd55ade3c69be1aabf313a3db235eb2adecc9228a4 ./design-concepts/build/captures_horizon_pick-4-wide.png +53cf1438e611db35576cdc0ddf0f5301d8e8c2e79fb782d99af9bad712bce2fc ./design-concepts/build/captures_horizon_review-1-wide.png +311a326a7e6b01ddd4a4b4cbdb7957df1de692bd3eac740092f16556e060e25c ./design-concepts/build/captures_horizon_review-4-wide.png +41eaf842bf3c559aa39a561bfb06d93d92115d27291bc7430371e566c9a583c9 ./design-concepts/build/captures_horizon_theme-ocean-standard.png +9bb65111072a506672b0d57446cacf3c986c008c5edbb8a3d55dd864c759b358 ./design-concepts/build/captures_horizon_welcome-wide.png +feae5a2927ed3631817aee0aab4ef8422596e0aa2585c9823a891c93f09e86a7 ./design-concepts/build/captures_prompt_backdrop-off-standard.png +8adaef0a260dc327efb2699d959ee1643446589ed0add9d437a3faf55318bac5 ./design-concepts/build/captures_prompt_backdrop-subtle-standard.png +7e84138d8bd41b1ad2252af72219d63226777d676035624ead6770b96bb44cac ./design-concepts/build/captures_prompt_confirm-wide.png +1ccaebf206bd13255424ee33cdd9134dd9f4d339fc1587a48a4cd73e8328c7b1 ./design-concepts/build/captures_prompt_customize-wide.png +0140353975b1134f20dc79a74ea487a1e3efcc808145ede7719c6333062acc94 ./design-concepts/build/captures_prompt_keep-custom-wide.png +a6911770046816d6e6728631d64e1fdd2819e68422aad0d0999d0ca698299d2f ./design-concepts/build/captures_prompt_keep-multi-wide.png +4360bbf366723cf333b1ab34f472b795976e22355c25c9c5681e1fa5d662d684 ./design-concepts/build/captures_prompt_kept-standard.png +0cc88674a0d01ab0f1a00e60637c63adca7d117ad217761928402986637cf8b6 ./design-concepts/build/captures_prompt_nocolor-standard.png +8fc1df4757ec62b93be2d5bd64d6fe9bd655f04205c41c23f4f24f2d1ceb0664 ./design-concepts/build/captures_prompt_pick-1-narrow.png +f9be0663099f333b022dbcadd0fa4faaaf3357017cf6774d01838ea6a8c81b16 ./design-concepts/build/captures_prompt_pick-1-standard.png +2671fe401074d5137317b30fb69dd06cef06eb1fc22e8feaa0794d90028f1473 ./design-concepts/build/captures_prompt_pick-1-wide.png +786453620be6d17228667618e25447b71d80c4242d26216a618fcc970c23c0f6 ./design-concepts/build/captures_prompt_pick-2-medium.png +41fb78acf25421e56242146fe8f8a08dcdd500f30835763ddf574d9ce18424e6 ./design-concepts/build/captures_prompt_pick-2-wide.png +78bb913b0156cd226b09f9c1f04bdbb5611a3b773c3372a52468b725e1b28e99 ./design-concepts/build/captures_prompt_pick-3-wide.png +070ee97ae8496fdbba370557022b8c5859a0b9fb376425bc4733affd1e6be42c ./design-concepts/build/captures_prompt_pick-4-small.png +f2b5e1de65de157b5c1ed2a644dddce4adc46477d0003a28f107eb2308116aac ./design-concepts/build/captures_prompt_pick-4-wide.png +0b1b1cc52a149bb16fea6c5ad3ca2dd4c9734802774ec737e2d4376ce818dd92 ./design-concepts/build/captures_prompt_review-1-wide.png +e361a600d0ef06fab70d6bc86301667084f6f690b11ef43d64d469431c89a6f6 ./design-concepts/build/captures_prompt_review-4-wide.png +6a92f0744a24987c148f6080feb96eb2a00d5c46dec8f4c91830f8eb5fa42a8f ./design-concepts/build/captures_prompt_theme-ocean-standard.png +cfb4905864b262788942ec0eb4013f996a417fccb58b00a44854a4f8ccf9f126 ./design-concepts/build/captures_prompt_welcome-wide.png +86030567a9afaac518b0c54e0f9a8f3d9559d52cf8d79a166431eb3d047d155c ./design-concepts/build/captures_reactive_pick-1-wide.png +aa70a14d963896c4e4a70fc672d533dede114084764f8d2a6b4a9ad2c650fe19 ./design-concepts/build/captures_reactive_pick-2-wide.png +639b501bb93c5d5089ff2b165777e708b9fb80b922ae96baa49b1d92a888c9a0 ./design-concepts/build/captures_reactive_pick-3-wide.png +f1aecf7a68b37d005baa8ff490675cdd822925a403d7bdda83a0689cf1cdb2b9 ./design-concepts/build/captures_reactive_pick-4-wide.png +c681aa953d2cbf55e177b2530725e86fd928b5f184949bc1ba1ac56a4f0499aa ./design-concepts/build/captures_stage_backdrop-off-standard.png +9bc7d525494a684e18080bcee276895c96d3d8a60ae236a91ef9865c647e5816 ./design-concepts/build/captures_stage_backdrop-subtle-standard.png +e97b997dd816ac41384c4c8d990b91253304abc8d9801eadc696e1c8fe309a50 ./design-concepts/build/captures_stage_confirm-wide.png +357a62b8921f94508d3abc1fd0d446f9926022ee2a8f77d6522066a6d6effe6d ./design-concepts/build/captures_stage_customize-wide.png +9ad95156ee1ac3b926ecd57ee6462366088ab9b07993e68de055b28ba54d5b24 ./design-concepts/build/captures_stage_keep-custom-wide.png +2b0b8532a9775186315fc009b540c5b3e720e1406820478b04f4ba670cc0c992 ./design-concepts/build/captures_stage_keep-multi-wide.png +ecfde9bfb927b7e886dc41fb0ffdaf6ee0fe48f6a71ee152ea219bb357f78eca ./design-concepts/build/captures_stage_kept-standard.png +36383cfb8f3557044dbdd190331c64f3511f729f34f64086dac21d652f812fc3 ./design-concepts/build/captures_stage_nocolor-standard.png +bea714fd27d08fe14bdcf909da8b56411b982a66d238e3f15ac4320e497cd72f ./design-concepts/build/captures_stage_pick-1-narrow.png +a9c8c42a15273680c78aa15a4bf111d5697224893fe4522339232a18e65c6913 ./design-concepts/build/captures_stage_pick-1-standard.png +edddfa94de76884c8fd89be534cd3c9fcba7d2432c2e7932979e4f777ad8faae ./design-concepts/build/captures_stage_pick-1-wide.png +56fdd695e481967bc7a772ea3a01f0fa6387227cad654d8a6a925a630dfd0947 ./design-concepts/build/captures_stage_pick-2-medium.png +058e9555a60ad75ce9453c6fddf96dda165e21539db4387ff76afce47221f5cc ./design-concepts/build/captures_stage_pick-2-wide.png +92dd39290932082c3cc340469c96f00624a8d4eba087974fae3aaab2c9de7e36 ./design-concepts/build/captures_stage_pick-3-wide.png +5e5d3fac8abb22ccc4c00c20a31121a6ae131cbfb9e456f05e6d2d1c1a74d042 ./design-concepts/build/captures_stage_pick-4-small.png +a0b51d5e01c547b838c2c5462e7978f5fa442d0f980a89915ec80770ed3527b5 ./design-concepts/build/captures_stage_pick-4-wide.png +7d956cd2257c54838c53b92b9ab6ff993dc8ad0b22465a4bb27e42246f83aa3f ./design-concepts/build/captures_stage_review-1-wide.png +65c8e1499c9950bf0488ac8e47e1ffc2e806cb49237b364bdc684fa1e877d5e2 ./design-concepts/build/captures_stage_review-4-wide.png +bf399c533900b9da0e185c8ac52a31ec99393890285a2b62d4a173f8271ffd05 ./design-concepts/build/captures_stage_theme-ocean-standard.png +7c208259724c03111e0c9e2a5e4a611ab7ea61a97d3685b90329d711c0b2934f ./design-concepts/build/captures_stage_welcome-wide.png +bc88d796979a1c40e90f10efcdc26e53f9e849959daef7329bb402559729b57d ./design-concepts/build/clip-reactive-10.png +038d13d5cb2b549f1aa341d4ba56c6c68b35f92290d03152bfba68a555a16a3f ./design-concepts/build/clip-stage-20.png +edddfa94de76884c8fd89be534cd3c9fcba7d2432c2e7932979e4f777ad8faae ./design-concepts/build/q-test.png +0849c50b2c013d2f301c8cc1778f4677bbb6bdeb36000627921bb867313dc2a8 ./design-concepts/build/review-desktop.png +3010a3703a19226aba9737fc6cab86092b1c1074d073b3d15994ed770342acde ./design-concepts/build/review-phone.png +bead4b929cc9f2f9e17911f0a99cc9dcb0eb4d7cf42ac89be690299d17600081 ./design-concepts/capture.mjs +04d2ee8c1a5e740ce3af3a96e851604086cfed2aa6f8fe90244b1e3a27953030 ./design-concepts/captures/bench.jsonl +d6016d9c13a5a1316f36ff4369ddd4f040e3755ff586c75f28d8e8bbaa6b8346 ./design-concepts/captures/horizon-run.log +ab00d2f015f27243ea1f3504f8183a900bea5870b7b2f4ec5835a450b5575625 ./design-concepts/captures/horizon/backdrop-off-standard.png +298d6785cb46190ab227fc37cf00b7593a522e4e9580250369ef97e4f28d05c5 ./design-concepts/captures/horizon/backdrop-subtle-standard.png +ddc7feda6d90706b6bda37cbe8e398a31c643a4de14f6b6b663fc4df6af3bdbc ./design-concepts/captures/horizon/confirm-wide.png +27cafcd8ff949e04bc51876ce35eb6f5e73cc9093fe89d69a200280567f13db1 ./design-concepts/captures/horizon/customize-wide.png +c67422615500a9e9e63c7f77a6a9eb92a5a30e74221a149eca395140fd548e6c ./design-concepts/captures/horizon/keep-custom-wide.png +a3d318ccea1ccd392e9874e6bd639d8d62f784161bb438f8f12a22979e24ae06 ./design-concepts/captures/horizon/keep-multi-wide.png +c28abecec0964d24ce168088f66be9700b8e42c5d3c65ae79c5c71c6dac76c5d ./design-concepts/captures/horizon/kept-standard.png +b7b378fe171f2c86dfdfe8d9d9afa9988ebb5252307dbbbb744c7b3caf495fa7 ./design-concepts/captures/horizon/motion.mp4 +58e982fd2815665f459e3ad41c7e8ac6b2d218363da5c0e6a0c838d1a05b606c ./design-concepts/captures/horizon/nocolor-standard.png +42163aa49c8f11b77d9fd7c20c2e061e1dd99784c7dcac0dabebc3f268842280 ./design-concepts/captures/horizon/pick-1-narrow.png +fb8e1b3e439fa8d8b5febcc465a8d15c42221b05221be29d0a1c55a4aa2d01a2 ./design-concepts/captures/horizon/pick-1-standard.png +8d0385f83863b121ccb83f470fa9715d4096699cdb1d435c5fd0dc2542024979 ./design-concepts/captures/horizon/pick-1-wide.png +8022c64c18a7b6ee867498766e7b463b38272dc4b864d7561be1ae03e5761258 ./design-concepts/captures/horizon/pick-2-medium.png +498d912173e96f06e9bce022225ec7575a5b6b7dfa0a1b1095ae215b4ddb30ee ./design-concepts/captures/horizon/pick-2-wide.png +891b35789bfa3d342d20713686bf1192922e1f3c60973cadaff38db3f3729149 ./design-concepts/captures/horizon/pick-3-wide.png +ebe8fecc398d672b15f08d91e2abbd9cc81f4881a6561ff8c79d46d29686aecd ./design-concepts/captures/horizon/pick-4-small.png +50f050a8bdc8bcaee727fa8a6faf0af28d54a43dda1e09b783f3b2a1e42b31d7 ./design-concepts/captures/horizon/pick-4-standard.png +417c2914bf409abac45410666fe23f4f56404c4208ae33f2213e4b656797b95a ./design-concepts/captures/horizon/pick-4-wide.png +bd3e559b0a9fd44fff6d28def8c5f73cdcdd274a27e2a713af1b0e71b20697ef ./design-concepts/captures/horizon/review-1-wide.png +d64585dcc2610ce020d9c54d06205546e137cbda3c5ff6cf3f21b15cb1c6bc14 ./design-concepts/captures/horizon/review-4-wide.png +1e4cd8cc56f24daeb841c7aa9d635c2ab05dae3036af82d028f13096f5c71e6c ./design-concepts/captures/horizon/theme-ocean-standard.png +d9f305c9725e17cb6af2d2bfcfea1d0d04341270d0b2f3cd05efba01d51628c1 ./design-concepts/captures/horizon/welcome-wide.png +a1914961ac1e9c0cbf69eb75bb6624067130f247bfcb52ca0b51124d7331fcc0 ./design-concepts/captures/lab/sky-bands.png +3f1769f1f637f544aa40043d6e4b83a68d534c1ba4cc9f7c8935f138812cc674 ./design-concepts/captures/prompt-run.log +c10a36ff000cebec2fcaea41e21f07508b66ce4b92fc2013858302688de970bf ./design-concepts/captures/prompt/backdrop-off-standard.png +e1340a44e36970b1672796a8b81d715b67242e391b7d6c9cc379243b4775d77d ./design-concepts/captures/prompt/backdrop-subtle-standard.png +3a32fe2a97acae876a5004e04d25cbacd3f237076b622adc5cd7341aae9949c3 ./design-concepts/captures/prompt/confirm-wide.png +d40d9027386eddca71034fc6c20555e6cd4456132d7011073f77eb7960559c07 ./design-concepts/captures/prompt/customize-wide.png +99eb5793fedeb61fc5460c5775fdb14eedabb0657d0feb8281038975a8da17c4 ./design-concepts/captures/prompt/keep-custom-wide.png +24e4dc62abc145ee88de4b707067d2c686d5ec5dfd19e4ccebba0b1e67fb78ab ./design-concepts/captures/prompt/keep-multi-wide.png +664e01a13114fb2abd2fff28ec10c9fc61c156f6d778e6fe92207a64c3e52561 ./design-concepts/captures/prompt/kept-standard.png +c45454ea13823e1f78ae8fec8f2a150f98d9dc45b9378a9cb4d725d05e4465ee ./design-concepts/captures/prompt/motion.mp4 +369f97374401c85b67e32002c480ac3b79bd38a30ed7512d5d8b3b3b8b7c60f7 ./design-concepts/captures/prompt/nocolor-standard.png +61abce7378922de22235b5dff155b070cf180a9461fa5fb1ebb856d031887100 ./design-concepts/captures/prompt/pick-1-narrow.png +cb0fb7a1c484ca141bd72288963d9d43b2f8c2a7f2396a6ef8a71e9f09ba2d1b ./design-concepts/captures/prompt/pick-1-standard.png +459c1a54292a01cffac498abe8b1458b52bc5747a28279e93d8dc88a73921462 ./design-concepts/captures/prompt/pick-1-wide.png +a6f6a079f6af4ef04a9cb8fd676d7f97da8e439ddcd2fe4258cc195d8b132da5 ./design-concepts/captures/prompt/pick-2-medium.png +fdfb232c0be938f78134c899b441c2d1960d426916468c2cbc26938e0906cf15 ./design-concepts/captures/prompt/pick-2-wide.png +b41b6d7bd2750273faa4e65c8ea0d3bd18f6138e9cafdecddcba245553cf7246 ./design-concepts/captures/prompt/pick-3-wide.png +e01b83258f9d3b0dbdb513d8aa565affdd7fba0c85908f40f53088a61c39bb6a ./design-concepts/captures/prompt/pick-4-small.png +462ad417cb8b802dd935df48526e0b0525a5516a173d8b8da64f7ceaf82e80b6 ./design-concepts/captures/prompt/pick-4-standard.png +69862d985a2ecedfebce5ac4317262385b2563203b9d055e0ad5071152b4af99 ./design-concepts/captures/prompt/pick-4-wide.png +939a3fe31f8824f9126463e9338491b98bfa4de318fb4e0d6356e409a5d2afc3 ./design-concepts/captures/prompt/review-1-wide.png +d5ff1738dc229661531a0a04dff30e9958fa748b5f74181b07703480482432e6 ./design-concepts/captures/prompt/review-4-wide.png +755fd9252ec8c1e2acc9e40c0888d6d0877e6287faf746c2b96a7bf63f419dcd ./design-concepts/captures/prompt/theme-ocean-standard.png +885425e54b580b51d9d892a7f377691877d9bc6e2f0dc43b56f0b549bb98cce0 ./design-concepts/captures/prompt/welcome-wide.png +d65a5b32b4119f19082eba14dcac35dd35276a89aacbe634dd00e021ddaa3379 ./design-concepts/captures/reactive-run.log +2f3e980cab3b3d1f54d648af630fd4ec984f1c31da80c608cb1c1744692b9234 ./design-concepts/captures/reactive/motion.mp4 +0032086e5e715ba51a1f6f1b4e26a8d22ba7b461557593bb422be52b71b3876c ./design-concepts/captures/reactive/pick-1-wide.png +c82f409674ff5bf87c263fa24a628055fa08232be01251bf6f2a432ea33c2efd ./design-concepts/captures/reactive/pick-2-standard.png +66783830a9bf1ed3260d93f6e58238c85625edc05a2498fdac2a35a4260ed2de ./design-concepts/captures/reactive/pick-2-wide.png +9090d2052694d0f1563760d750474ce37f3255c99a59a0498560ff0cae68d384 ./design-concepts/captures/reactive/pick-3-wide.png +8cfa6aa5a5909cebbc7ac98d06a757a88f80fad9ef3661b20b2df39cad148f48 ./design-concepts/captures/reactive/pick-4-standard.png +1a2526c6a28d04e361af5dc8370d2ac96a2ca04349f8ac7dc4b003d41b37f67d ./design-concepts/captures/reactive/pick-4-wide.png +3b660bc5f1d68b014d15ed740b3b619d20ce8064a92db98d98bbec0432130cf7 ./design-concepts/captures/stage-run.log +fbf00f8fbda456cc3189401d332a5d6d982eea5fbba78207dc556b5e37855c72 ./design-concepts/captures/stage/backdrop-off-standard.png +d01eaaef89f04b4491d5f2d042a9d4b64bebdcf9317025a6487fb2ac216494a5 ./design-concepts/captures/stage/backdrop-subtle-standard.png +a09f39daefd32a2b08b7b78a04f7840a045080baed9df770ca448b866404001f ./design-concepts/captures/stage/confirm-wide.png +d371ff03dec64b2a575221dfb7976f8145b1d5587bbaebc6a69f04a8391129e2 ./design-concepts/captures/stage/customize-wide.png +f261fd6efc3878ea247d1d69d1a8021d449679d1583a81c839ea7aa77ce53aef ./design-concepts/captures/stage/keep-custom-wide.png +a75e17c06bf6674476e984617613bfd5d6c03d08a2fe6f8bb5c72fc6801b28ec ./design-concepts/captures/stage/keep-multi-wide.png +c28abecec0964d24ce168088f66be9700b8e42c5d3c65ae79c5c71c6dac76c5d ./design-concepts/captures/stage/kept-standard.png +df98eb749499dd96d7474297dfe3d6d440d281b5c4aa73afc4b2e20ad0ad261b ./design-concepts/captures/stage/motion.mp4 +fbf8f00d45ed7000a927001eed30a16f5d06f8da45b0670180e15ac178c9f177 ./design-concepts/captures/stage/nocolor-standard.png +9ce5f5fce5cf6e589b26f07d788a6965522501025be7d271625ba694510b90fe ./design-concepts/captures/stage/pick-1-narrow.png +61398672589ef49293af4fc392691b50dad02ae8bc2723d77155ebb1dee8ba09 ./design-concepts/captures/stage/pick-1-standard.png +66e4641b46c5633e605be380b6af3df1e498791ebe3986271980405732100eb7 ./design-concepts/captures/stage/pick-1-wide.png +8f64d15d878f6b9d9369e0f27d3d76cf39c64296eadfe2df9f720ac5a8db292f ./design-concepts/captures/stage/pick-2-medium.png +eb7863d49c6a6cbf7228c678eed03a4c9c3e11dacbbb90e60289f1a8172bc719 ./design-concepts/captures/stage/pick-2-wide.png +9c97252e1a391db61ee0fbcdd3e06d4bba1d92d08a217d4b7ae516cb4ae706f0 ./design-concepts/captures/stage/pick-3-wide.png +b3a111cbd09b4896452ce0c645752c880575f76d2f9194bb36dafa827037c248 ./design-concepts/captures/stage/pick-4-small.png +dd5d5ff1bfaca53853dc2f89fa88110e5ff44feac66c51a1c5fed984c62790ba ./design-concepts/captures/stage/pick-4-standard.png +c01f23321bcb812121d55172a2df13f8263b9a256a8c504ecf9df967244a0dab ./design-concepts/captures/stage/pick-4-wide.png +697775a7e73498ab7cfa9108ad21b3ced57b7562f9e9d61f3141d8bbacbb7b82 ./design-concepts/captures/stage/review-1-wide.png +7c4514d06fe60e099877044e4f1de9f798b053a127d1b28c6d8dd534b6c5e8e6 ./design-concepts/captures/stage/review-4-wide.png +7ce71a96f92bf3858b995d82ceb2530109dc06711a84bf26ba2d96159ceba9f8 ./design-concepts/captures/stage/theme-ocean-standard.png +a21c7b04657ff83727ebc99f3cf55ad9e86782c753adfb4ee03dac728c34a4a4 ./design-concepts/captures/stage/welcome-wide.png +9c525e3337d835ec9186a9840854f3d93bc35a430c9ba6b8dd188c5650ebd4ca ./design-concepts/package.json +5d22abe7fdf2d327aec643bb6b8b356ad9f91895061e7db9efb26494642d9d84 ./design-concepts/proto/bench.ts +546d3c08862f854e035e09b8487231549135b3de197674d279258036718e0e9c ./design-concepts/proto/firstprompt.ts +4a67432fc3a177fdd0263c23ce8bf169f701cc5d9fe057a9b9a77cf1cfaa6e2c ./design-concepts/proto/horizon.ts +7be5931967a81f4d764fda974faa97179b1842d1633179064ff4e4701ac7c4ed ./design-concepts/proto/kit.ts +2e8e4fc3d7ab96188dfe42ed40f87358b16deb5aea1577ac613a3f07e106e1bc ./design-concepts/proto/main.ts +55e6ed207d5da96a66776028d4d81ff02975c6d6729a8c1e5009fb3f5cf912f2 ./design-concepts/proto/skylab.ts +8806909c9d3d565ebd7a0cdb89f52cd6f6a95ec8291514e9b3a4f4171790d619 ./design-concepts/proto/src.ts +dcbc8979e11aaf05c2709f852f8aba183e58bdbf7009a0588f3b915016b053ab ./design-concepts/proto/stage.ts +54e538163ee0d77187f41f500a1bbb632d6f7087f5d42a73295e0aff62f2a99b ./design-concepts/review-embedded.html +5040fb819f67a434089d3fe0d0d803cd750071ce6d50022ea26ffa71dd30e390 ./design-concepts/review.html +16b074c942bf48108535b48159cba3cac41a38ec26142ed1054b93cd1a25511b ./design-concepts/run.sh +294333c83e956193d11bd3ef33c4ade21692bc9450b0439a6a55ce67dfb1c5de ./repo-folder/README.md +7a2f34356590048a1f662364fafd0f0f763b12e4da3c5893284f29b3e2b7270a ./repo-folder/prototypes/build-embedded.mjs +541188ca60481a962662e81ca439dce4ee4b5467d3fca380bdfe443753188148 ./repo-folder/prototypes/capture.mjs +9c525e3337d835ec9186a9840854f3d93bc35a430c9ba6b8dd188c5650ebd4ca ./repo-folder/prototypes/package.json +5d22abe7fdf2d327aec643bb6b8b356ad9f91895061e7db9efb26494642d9d84 ./repo-folder/prototypes/proto/bench.ts +546d3c08862f854e035e09b8487231549135b3de197674d279258036718e0e9c ./repo-folder/prototypes/proto/firstprompt.ts +4a67432fc3a177fdd0263c23ce8bf169f701cc5d9fe057a9b9a77cf1cfaa6e2c ./repo-folder/prototypes/proto/horizon.ts +7be5931967a81f4d764fda974faa97179b1842d1633179064ff4e4701ac7c4ed ./repo-folder/prototypes/proto/kit.ts +2e8e4fc3d7ab96188dfe42ed40f87358b16deb5aea1577ac613a3f07e106e1bc ./repo-folder/prototypes/proto/main.ts +55e6ed207d5da96a66776028d4d81ff02975c6d6729a8c1e5009fb3f5cf912f2 ./repo-folder/prototypes/proto/skylab.ts +8464527987c27a3520ec4d91c4a1ce323c514d58e0c03ba208937b1e978aab09 ./repo-folder/prototypes/proto/src.ts +dcbc8979e11aaf05c2709f852f8aba183e58bdbf7009a0588f3b915016b053ab ./repo-folder/prototypes/proto/stage.ts +5040fb819f67a434089d3fe0d0d803cd750071ce6d50022ea26ffa71dd30e390 ./repo-folder/prototypes/review.html +1d77d50f1da88e8d121ed8b1caccbbca3b23255957dd39bb169e9f5158194773 ./repo-folder/prototypes/run.sh +2671fe401074d5137317b30fb69dd06cef06eb1fc22e8feaa0794d90028f1473 ./repo-folder/reference/alternative-first-prompt.png +edddfa94de76884c8fd89be534cd3c9fcba7d2432c2e7932979e4f777ad8faae ./repo-folder/reference/alternative-stage.png +639b501bb93c5d5089ff2b165777e708b9fb80b922ae96baa49b1d92a888c9a0 ./repo-folder/reference/approved-customize.png +2195d6b233ecd9002945a4429f499c4a9b30ff5f86059c743bab9fd011b1b9fa ./repo-folder/reference/approved-ending-fold-filmstrip.png +8ade214fbedb83b66708ce9d85218a36c863cd3192a158fdd3d9a0d45c5d28ff ./repo-folder/reference/approved-ending-welcome-filmstrip.png +29ffe564f543505890c03e077c66af7dc4d730f1e1e931df785ce7abb974d790 ./repo-folder/reference/approved-guided-tour.png +311a326a7e6b01ddd4a4b4cbdb7957df1de692bd3eac740092f16556e060e25c ./repo-folder/reference/approved-keep-existing-review.png +f1aecf7a68b37d005baa8ff490675cdd822925a403d7bdda83a0689cf1cdb2b9 ./repo-folder/reference/approved-keep-existing.png +4985c513bbdfe7a038436f2d38c7ffb7d03919575f23bab4b9f23d2459150e2c ./repo-folder/reference/approved-leave-confirmation.png +aa70a14d963896c4e4a70fc672d533dede114084764f8d2a6b4a9ad2c650fe19 ./repo-folder/reference/approved-minimal.png +86030567a9afaac518b0c54e0f9a8f3d9559d52cf8d79a166431eb3d047d155c ./repo-folder/reference/approved-recommended.png +9bb65111072a506672b0d57446cacf3c986c008c5edbb8a3d55dd864c759b358 ./repo-folder/reference/approved-welcome.png +4f04d08e01932d285f7b599fb247ba936099408cbac1efdf2dd4262731abd363 ./repo-folder/reference/aurora-moods.png +ee7481318a1a820cb6b6f1c75d49ee69e15b03086ff6e7abe337c32125db534f ./repo-folder/tools/create-t7-archive.sh +cd234fd84b72620f7723ff121399c3ad510a1f9edafab05704bce4d093dd7d9d ./repo-folder/tools/inventory.mjs +00bc19b11028857736b01ba380255946c159b2420c0757058b173e4bc56464ec ./repo-folder/tools/prepare-pinned-checkout.sh +40e3cd1503417f43d50da3a72f74be8f5cd600ca4fe0564b8c7399b9e93670f2 ./repo-folder/tools/verify-t7-archive.sh +699a23924d380567a4b457bb17ba92c6daa4328f1966a99e61dbe3fec1d181bd ./review-package/design-review.zip +61e0cd9e1ba0e37bd70d35c4b8ce52df42d6794847745e15bfd99238bba925a3 ./superseded/notMyShell-13a47f8.bundle +79029ad55feed7539eb90adb661a72dee6fbf3a8e56e0366c7696992dd01af6a ./superseded/source-13a47f8/docs/design/post-v020-preferences-onboarding.md +0edc31fbde0b949dea5d68fd62ddfc926cefdda8a55fdc5d2ea01f646ef7b1d0 ./superseded/source-13a47f8/docs/testing/post-v020-preferences-onboarding.md +4b4a0ebdda6ea2ffbb4f44b79dfd1413683022a9eaee51f742de1f26ba73574f ./superseded/source-13a47f8/scripts/dev/post-v020-previews.ts +e96f03de81b2a9f51ab8c349b1da337d700808cd90665548acd03bf5e2008b8f ./superseded/source-13a47f8/src/cursor/palette.ts +b5d7ed61b8f1787c466bf256ae4dbc74ff5d3f764c5d1bacb1708b5f5d3f4bee ./superseded/source-13a47f8/src/idle/catSprite.ts +d422fefa5b4416cbc699b8c1c14d099ccd818a22645bacf3f20eeb9bd6aa1c27 ./superseded/source-13a47f8/src/idle/scenes.ts +6337e5c55efd69fc1759da85b7272c5a2b9ed87d17ddbb261e91cce2de1222e4 ./superseded/source-13a47f8/src/output/Welcome.ts +09ba5362478b846d1e3d891ecfcd75bcee0e6b0c82f0b71343184c2ff7f9fd73 ./superseded/source-13a47f8/src/prompt/configuration.ts +c864a7dbe3cde6e03f641c7b6cf6f42636f7e3b38d00c195015db69a8fd5663a ./superseded/source-13a47f8/src/setup/SetupCat.ts +e97e2354c371f1ce72c9282b7a635783eae77c0cfe0f9d1d5f251efa00609c30 ./superseded/source-13a47f8/src/setup/SetupPreview.ts +5dd16ea27626b637acec30b8faae2f4d1d97572b7dc50f3f062f093099ddac43 ./superseded/source-13a47f8/tests/postV020Onboarding.test.ts +e0cac90691ece57a2fc55617d5d20ba45b97a0b1f77e6f0a503e50b116edd26f ./superseded/source-13a47f8/tests/postV020Preferences.test.ts +709a2399f408836213c7cdd61761b6478398c8bbb160dce7e1ebfb1aa9a4ad69 ./superseded/source-13a47f8/tests/setupQuickPreview.test.ts +96fd8c638289c4a23d6c05718e17d8e20e119c3d9771a3afb9403281d1121221 ./superseded/static-modal-captures.mts +70b30f70ec1ac19f3afb662f28d65b4fbdd1290fa7dec9927ea7b739e0519c26 ./superseded/static-modal-captures/confirm-120x40.ansi +0125b6aa00036b519724afaabaab2bff54a0d1b9a187f663f4c4a2028f1d07fd ./superseded/static-modal-captures/confirm-16x6.ansi +9bb0c98599159ec53513582b0c2e1c3f251be8813fb9bbc266a06a1d33b1ebf2 ./superseded/static-modal-captures/confirm-200x50.ansi +aa657fef504562a87fe6e6091d31a99e1e89a91429b2e36c64573b9580fdc9bc ./superseded/static-modal-captures/confirm-32x12.ansi +61045452cf3f232064ac6ae416cfad37c8adf6b3223e0c1212c1d8a47756f9bb ./superseded/static-modal-captures/confirm-50x16.ansi +526835a8c54a462d923d4a1ce828099a41ecdd4d610c1e4d0cb214c502cde269 ./superseded/static-modal-captures/confirm-80x24.ansi +0bda74523ef77bb4238c5830f1ae99450cc8b0c49474bc5d652185391e10b9cb ./superseded/static-modal-captures/confirm-exit-120x40.ansi +a3ed0c3b25c8bd160c799ceafc01671aadf7aecffeb7bf149fc149b903ca71ba ./superseded/static-modal-captures/confirm-exit-16x6.ansi +8575516b8ea3c2f381b27f52c11ed95469a09c3883a276f13b1ad58d4185cfb4 ./superseded/static-modal-captures/confirm-exit-200x50.ansi +a315f123bafacb04ae254afb5f3ccac3340ccd30d8df6c706b4daebb1b433377 ./superseded/static-modal-captures/confirm-exit-32x12.ansi +90e17c101e5b1a4f9e6c5be93186b61961798bde4739acb263b695bd6a9c37b0 ./superseded/static-modal-captures/confirm-exit-50x16.ansi +71da00293c151901e46d2fc6ea68a0995c87944b63a5badbe133e6d1c28022a4 ./superseded/static-modal-captures/confirm-exit-80x24.ansi +90346f904370a19da844f15c08350cb347d8de121ea456d45a446bc9d8ae5d1f ./superseded/static-modal-captures/customize-manual-120x40.ansi +4d1234c90c6df9feaf19868f57c5f05bf5988081ceeaa94c8a0ded106deff1e2 ./superseded/static-modal-captures/customize-manual-16x6.ansi +f4576256dfc47fd407580330eb4b506ca23c96467e735ed3afcc09f0eb1aaf3a ./superseded/static-modal-captures/customize-manual-200x50.ansi +4be4861980b3f488deb47b5767c6c38206d79f7095ee5c79201c99e4c0ed60fb ./superseded/static-modal-captures/customize-manual-32x12.ansi +89f50c7bb0cc2c3004f75dc2c7d5f7bc490bd2295f7964486b4180093892c3c7 ./superseded/static-modal-captures/customize-manual-50x16.ansi +52129fb2c98197f8688b9b31aa99d176b3bed8718a9952a964151b298fb64a04 ./superseded/static-modal-captures/customize-manual-80x24.ansi +24ea117567e77b41f00d73dd57d97fb292cb9ceb109941bbcf6adcf5178de51d ./superseded/static-modal-captures/picker-minimal-120x40.ansi +8404933403257b4d0d8c347b0c1fe785684352e0349023c0347a6e54a1df0494 ./superseded/static-modal-captures/picker-minimal-16x6.ansi +ac98bff52d048d3142b6afd6550fc75cb327fc96f9377af27de8018fa71b1344 ./superseded/static-modal-captures/picker-minimal-200x50.ansi +9353d310916607e56380e0188d756f68e4112efea34952d63459c11671038b8a ./superseded/static-modal-captures/picker-minimal-32x12.ansi +e0ce7fb525b14ce5322f30952c105871f1da40243abcbd42c749f9d91efc5bd7 ./superseded/static-modal-captures/picker-minimal-50x16.ansi +44101a6776a24f9c09db92e7c55351343da41eae37338af8e78141cfd7a0625c ./superseded/static-modal-captures/picker-minimal-80x24.ansi +dd02611e72750e01ed45da2c7aad47e9bec0932ed1a4c7fb5b1f163208d0cf5f ./superseded/static-modal-captures/picker-off-80x24.ansi +4159c0064db5615d3257a1c732b9f39c9637e8849042847614cbff9e117c2dc8 ./superseded/static-modal-captures/picker-recommended-120x40.ansi +64dabbda068ca1efbf660102058d003f576c5d1999a7efe25c34a28bc94f1ed2 ./superseded/static-modal-captures/picker-recommended-16x6.ansi +439450eb4fc949af63a9a05b973f6cdd7bbad2cff5667ab9f0f9f67a09f6afd8 ./superseded/static-modal-captures/picker-recommended-200x50.ansi +7c15b2850fd054973ab3f11536b9441eff28292bd168495beebd8707cd4a3bd1 ./superseded/static-modal-captures/picker-recommended-32x12.ansi +251abd3f1235994d4aa5822903b386e00c342e062cf8081f75397deea02535bd ./superseded/static-modal-captures/picker-recommended-50x16.ansi +6ccb67fdc65076e22e470e5b887a19207861a215fa6a90d199c917ade0384b8b ./superseded/static-modal-captures/picker-recommended-80x24.ansi +2993d956ec79e9ae4bbbacd261966689da8036ff60e7c1ad73adebb9f3f8cc8d ./superseded/static-modal-captures/picker-subtle-80x24.ansi +5fcbf957b5d3f7a3fb7b62f3639dce8e34a2f1950f791b2b26f482623744a592 ./superseded/static-modal-captures/review-minimal-120x40.ansi +606bce84fbc75aa18e3ba0da3e81f6501842bff8ef3b1b06930a6c29d1fcbb5c ./superseded/static-modal-captures/review-minimal-16x6.ansi +1b555a67917037235752c3a1322a6e5cd1a9d25652b282d3aeff08787ab8b839 ./superseded/static-modal-captures/review-minimal-200x50.ansi +6435de0dbba1e36e95daaaa7c71d6d07f7706d46f916b48b92f799deb6ae6622 ./superseded/static-modal-captures/review-minimal-32x12.ansi +4d9bea6eff60b1316977f0cf423cc5cc2853ca4fc886104a115dd53f0bd691f8 ./superseded/static-modal-captures/review-minimal-50x16.ansi +c8dfdaa0dac588137b8089c585d847aff0ff87392c37bcfef2fa41b39ddd5b3f ./superseded/static-modal-captures/review-minimal-80x24.ansi +96c7867bfe849bf76f3c058a05b910b05840512c93131af136b0b867b3cb3d96 ./superseded/static-modal-captures/summary.txt diff --git a/docs/design/archive/first-run-onboarding-2026-10/README.md b/docs/design/archive/first-run-onboarding-2026-10/README.md new file mode 100644 index 00000000..b02d913c --- /dev/null +++ b/docs/design/archive/first-run-onboarding-2026-10/README.md @@ -0,0 +1,136 @@ +# First-run onboarding design archive (October 2026) + +The complete design exploration behind NMSh's first-run onboarding: three +directions, the reactive variant that was approved, the runnable prototypes +that produced every capture, the review pages, motion clips and benchmarks, and +the static modal they replaced. These are archived experiments kept for +reference and reuse. Nothing here is a production dependency, and nothing here +is compiled or tested with the product (`tsconfig.json` covers `src/` only). + +![Approved direction: reactive Horizon](reference/approved-recommended.png) + +## What was decided + +| Direction | Status | Idea | +| --- | --- | --- | +| **Reactive Horizon** | **Approved for production, 2026-10-17** | A real Aurora sky above a luminous horizon where Vespyr stands; four starting points in one list, the highlighted one a powerline segment pointing at its details. The sky's mood follows the highlighted choice: vivid, calm night, spectrum, or gone for Keep Existing. | +| First Prompt's ending | **Approved, combined with Reactive Horizon** | After Apply, setup folds away into the real transcript and composer; a receipt line, and on a genuine first run with Recommended, the welcome. | +| Horizon (static sky) | Preserved alternative | Reactive Horizon without the mood changes. | +| Stage | Preserved alternative | One full page per starting point with a tall Aurora window as its lighting, paged with ←→. | +| First Prompt | Preserved alternative | No setup screen: a `/startup` card in the transcript, with the real composer previewing each choice live. | + +The production design and its acceptance criteria are in +[`docs/design/first-run-startup.md`](../../first-run-startup.md). + +## Where everything is + +| What | Where | +| --- | --- | +| This folder (version-controlled) | Prototype source, review page source, tools, manifest, 13 reference images | +| Durable archive (T7 Shield, exFAT) | `/Volumes/T7 Shield/NMSh Design Archive/first-run-onboarding-2026-10-17/` — every capture, clip, page and log, the superseded implementation and a Git bundle | +| Original working directory (left intact) | `/Volumes/T7Tmp/ai-dev/qa/post-v020-preferences-onboarding/design-concepts/` | +| Published review (private) | https://claude.ai/artifact/JJ7YawnLpvXXDGaRCPRPUr | + +The binaries stay out of Git because Git LFS is not set up for this +repository. [`MANIFEST.sha256`](MANIFEST.sha256) records the SHA-256 of every +file in the durable archive; [`INVENTORY.md`](INVENTORY.md) lists them by kind. + +## Provenance + +- Repository `raiseCatError/notMyShell`, branch `feature/post-v020-preferences-onboarding`. +- The prototypes import NMSh's own modules (the Aurora engine, `CellGrid`, + Vespyr's pixels, the prompt renderer, theme chrome, `TerminalRenderer`, + `KeyDecoder`) as they were at commit + `13a47f8798df3d74c8b887426f6cdd794e20af5a`, the commit the review was made from. +- Captures: VHS 0.12 (xterm.js in headless Chrome), JetBrainsMono Nerd Font Mono + 18 px, line height 1.15, the NMSh demo theme (`#15141c` background). Stills + use `--freeze 4200`; clips are real key presses at 24 fps. +- Benchmarks (`captures/bench.jsonl` in the durable archive): the production + `TerminalRenderer`'s row diffing, 120 frames per case. +- Review and approval: 2026-10-17. + +## Run the prototypes + +They run against a checkout pinned at the provenance commit, so later product +changes cannot alter them. Prepare it once (a detached worktree under the T7's +disposable worktree root; `npm ci` runs through `t7run`, so caches stay on the T7): + +```sh +t7run bash docs/design/archive/first-run-onboarding-2026-10/tools/prepare-pinned-checkout.sh +``` + +Then, in a real terminal: + +```sh +cd docs/design/archive/first-run-onboarding-2026-10/prototypes +t7run bash run.sh --concept horizon --reactive # the approved direction +t7run bash run.sh --concept horizon # static sky +t7run bash run.sh --concept stage +t7run bash run.sh --concept prompt # First Prompt +t7run bash run.sh --concept sky # Aurora mood comparison +``` + +Keys: each direction's own arrows, `1`–`4`, `Enter`, `Esc`, `A` Aurora on, +subtle or off; prototype extras `T` next theme, `R` Reduced Motion, `q` quit. +Flags: `--backdrop subtle|off`, `--theme ocean`, `--nocolor --safe`, +`--case starship|multi|custom` (Keep Existing evidence), `--screen +review|confirm|customize|welcome|quiet|kept|left`, `--choice 1-4`, `--layout +twoLine|oneLine`, `--reduced`, `--frame --cols N --rows N --time MS` (print one +frame and exit). Keep Existing evidence is a fixed fictional sample; the +prototypes read nothing from the machine and write no configuration. + +To point at another checkout (for example a clone of the archived bundle), set +`NMSH_SRC=/path/to/checkout` with its `node_modules` installed. + +## Re-capture and rebuild + +```sh +cd docs/design/archive/first-run-onboarding-2026-10/prototypes +t7run node capture.mjs horizon # every still for a direction (horizon, stage, prompt, reactive) +t7run node capture.mjs reactive --clip # its motion clip +t7run node build-embedded.mjs horizon,stage,prompt,reactive # self-contained review page +``` + +Captures go to the run's T7 scratch directory (or `CAPTURE_DIR`); the +self-contained page reads `review.html` and `captures/` from the durable archive +(or `REVIEW_ROOT`). `review.html` itself shows its images when opened beside a +`captures/` folder, as it is in the durable archive. + +## Differences from the original working copy + +Only path handling changed; every other file is byte-identical: + +- `proto/src.ts` loads the NMSh modules from `NMSH_SRC` instead of absolute + paths into the feature worktree. +- `run.sh` defaults `NMSH_SRC` to the pinned checkout and checks it is prepared. +- `capture.mjs` writes to T7 scratch or `CAPTURE_DIR`, and passes `NMSH_SRC` into VHS. +- `build-embedded.mjs` reads from the durable archive or `REVIEW_ROOT` and writes to T7 scratch. + +With a still sky (`--reduced`), the archived copy renders frames identical byte +for byte to the original for the nine states checked; animated frames depend on +the moment they are sampled. + +## Check the durable archive + +```sh +bash docs/design/archive/first-run-onboarding-2026-10/tools/verify-t7-archive.sh +``` + +It re-hashes every file against `MANIFEST.sha256` and changes nothing. macOS +stores each file's `com.apple.provenance` attribute in an AppleDouble `._` file +on exFAT; those are filesystem metadata and are not in the manifest. Finder's +`.DS_Store` was not copied. + +## The superseded implementation + +The static centered modal and the earlier animated introduction it replaced +remain in Git history at `13a47f8`. The durable archive also keeps: + +- `superseded/source-13a47f8/` — the onboarding source, tests, preview script + and docs exactly as they were at that commit; +- `superseded/static-modal-captures/` — that modal's renderer captures and the + script that produced them; +- `superseded/notMyShell-13a47f8.bundle` — the repository history up to that + commit (`git clone notMyShell-13a47f8.bundle`), independent of any remote. + +`tools/create-t7-archive.sh` is the record of how the durable archive was built. diff --git a/docs/design/archive/first-run-onboarding-2026-10/prototypes/build-embedded.mjs b/docs/design/archive/first-run-onboarding-2026-10/prototypes/build-embedded.mjs new file mode 100644 index 00000000..1de800a5 --- /dev/null +++ b/docs/design/archive/first-run-onboarding-2026-10/prototypes/build-embedded.mjs @@ -0,0 +1,45 @@ +#!/usr/bin/env node +/** + * Builds a self-contained copy of review.html for publishing: every capture is + * quantized to an 8-bit PNG (visually identical for terminal frames) and inlined + * as a data URI; videos named in EMBED_VIDEOS are inlined, the rest point at the T7. + * t7run node build-embedded.mjs [concept,concept] + */ +import {spawnSync} from 'node:child_process'; +import {existsSync, mkdirSync, readFileSync, statSync, writeFileSync} from 'node:fs'; +import {join} from 'node:path'; + +/** Archive copy: reads review.html and captures/ from REVIEW_ROOT (the T7 archive by default); writes to T7 scratch. */ +const here = process.env.REVIEW_ROOT || '/Volumes/T7 Shield/NMSh Design Archive/first-run-onboarding-2026-10-17/design-concepts'; +const scratch = process.env.T7_RUN_DIR; +if (!scratch) throw new Error('Run through t7run so the build stays on the T7.'); +const build = join(scratch, 'build'); +mkdirSync(build, {recursive: true}); +const embedVideos = new Set((process.argv[2] ?? 'reactive').split(',').filter(Boolean)); +const cache = new Map(); + +function image(path) { + if (cache.has(path)) return cache.get(path); + const out = join(build, path.replaceAll('/', '_')); + if (!existsSync(out)) { + const run = spawnSync('ffmpeg', ['-v', 'error', '-y', '-i', join(here, path), '-vf', + 'split[a][b];[a]palettegen=max_colors=256:stats_mode=full[p];[b][p]paletteuse=dither=none', out], {encoding: 'utf8'}); + if (run.status !== 0) throw new Error(`ffmpeg ${path}: ${run.stderr}`); + } + const uri = `data:image/png;base64,${readFileSync(out).toString('base64')}`; + cache.set(path, uri); + return uri; +} + +let page = readFileSync(join(here, 'review.html'), 'utf8'); +page = page.replace(/ data-full="captures\/[^"]+"/gu, ''); +page = page.replace(/