Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ For substantial implementation work:
Key references:
- [ROADMAP.md](ROADMAP.md) — product direction and issue index
- [GitHub Issues](https://github.com/raiseCatError/notMyShell/issues) — actionable work
- [v0.6.0 Release](https://github.com/raiseCatError/notMyShell/releases/tag/v0.6.0) — current stable release
- [v0.7.0 Release](https://github.com/raiseCatError/notMyShell/releases/tag/v0.7.0) — current stable release
- [#132 Flow / Classic composer](https://github.com/raiseCatError/notMyShell/issues/132) — next planned direction (see [ROADMAP.md](ROADMAP.md))
- [GitHub Project](https://github.com/users/raiseCatError/projects/1) — live development status board
- [docs/architecture/terminal-stack.md](docs/architecture/terminal-stack.md) — terminology and stack model
Expand Down
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,26 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

## [Unreleased]

## [0.7.0] - 2026-10-01

UI Foundation & Customization: a shared internal UI toolkit (notMyUI), Chroma color roles, reduced-presentation modes, Markdown-authored help, and Settings v2.

### Added
- **notMyUI toolkit:** an internal presentation and interaction foundation for NMSh-owned surfaces (not a published package). [docs/architecture/notmyui.md](docs/architecture/notmyui.md) maps each primitive to its real consumers and lists what is deliberately not built.
- **Shared actions and contextual help:** panel and palette actions share one model (identity, label, key, enabled state), and footer help is derived from it, so it stays in step with what a panel can actually do.
- **Shared form controls:** toggles, selects, multi-selects, text fields and confirmations are reusable controls that report proposals while the feature layer persists. Settings rows and Settings search use them.
- **Accessibility baseline:** `NO_COLOR` (or `TERM=dumb`) stops NMSh-generated color escapes while bold, inverse and glyphs remain. `NMSH_COLOR=none|256|truecolor` overrides the color level explicitly. `NMSH_REDUCED_MOTION=1` holds the shimmer and the welcome blink still while durations keep counting. Focus, changed and error states are also carried by text or glyphs, not color alone. See [docs/accessibility/baseline.md](docs/accessibility/baseline.md) for criteria and known gaps.
- **Deterministic presentation:** `NMSH_DETERMINISTIC=1` fixes the displayed completion time, the shimmer and activity phase, and the welcome blink for repeatable captures, and implies reduced motion. Shell behavior, PTY output and measured durations stay real. See [docs/testing/deterministic-presentation.md](docs/testing/deterministic-presentation.md).
- **Chroma:** shared color roles for NMSh-owned UI in three distinct categories (semantic status, theme and identity colors), plus gradients and curves, with truecolor, 256-color and no-color fallback.
- **Surface primitives:** frames, fills, padding, insets, width and alignment, used by the shared panel frame.
- **Semantic motion engine:** a pure engine of motion profiles per state, sampled at an elapsed time. It owns no timers and never changes width. The existing running-command shimmer and activity glyph now run on it.
- **Authored Markdown and `/help`:** `/help` renders NMSh-authored Markdown (headings, tables, code fences, tips, links). Through the transcript, links appear as `text (url)` rather than clickable hyperlinks.
- **Settings v2:** a simple and an advanced view, a changed marker on settings that differ from their defaults, reset of the current setting, search, and a remembered position within a run.

### Notes
- Authored Markdown applies to NMSh-owned content only. Raw PTY output, transcript command output, `/copy` and archived shell data are never interpreted as authored UI content or recolored.
- Not included: automatic 256-color detection (`NMSH_COLOR=256` selects it), a persisted reduced-motion setting, user key remapping, a shared animation scheduler, Linguist language colors (#176) and transient visual effects (#78). Screen-reader behavior is unverified, and not every surface uses authored Markdown yet.

## [0.6.0] - 2026-09-29

Sessions & Continuity: persistent live sessions you can detach from and reattach to, a Flow composer, and a `/layout` showcase.
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ Before starting work, check:

- **[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.6.0 Release](https://github.com/raiseCatError/notMyShell/releases/tag/v0.6.0)** — current stable release
- **[v0.7.0 Release](https://github.com/raiseCatError/notMyShell/releases/tag/v0.7.0)** — current stable release
- **[#132 Flow / Classic composer](https://github.com/raiseCatError/notMyShell/issues/132)** — next planned direction (see [ROADMAP.md](ROADMAP.md))
- **GitHub Project** — [NMSh Development](https://github.com/users/raiseCatError/projects/1) — live development status board

Expand Down
23 changes: 21 additions & 2 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@

| | |
|---|---|
| **Current release** | [v0.6.0 — Sessions & Continuity](https://github.com/raiseCatError/notMyShell/releases/tag/v0.6.0) |
| **Current release** | [v0.7.0 — UI Foundation & Customization](https://github.com/raiseCatError/notMyShell/releases/tag/v0.7.0) |
| **Development branch** | `dev` |
| **Next direction** | [v0.7.0 — UI Foundation & Customization](https://github.com/raiseCatError/notMyShell/milestone/6) (planned) |
| **Next direction** | Not yet defined; see the Backlog below and open issues |
| **Project board** | [NMSh Development](https://github.com/users/raiseCatError/projects/1) |

GitHub issues define actionable remaining work. A merged implementation may still be open with `needs-human-test` while physical terminal checks are pending. Closed issues represent completed work, not a promise that future refinements are finished.
Expand Down Expand Up @@ -93,6 +93,25 @@ The final release candidate also included the passive-hover selection fix.
| [#132](https://github.com/raiseCatError/notMyShell/issues/132), [#133](https://github.com/raiseCatError/notMyShell/issues/133) | Flow composer position; `/layout` showcase |
| [#199](https://github.com/raiseCatError/notMyShell/issues/199), [#206](https://github.com/raiseCatError/notMyShell/issues/206), [#211](https://github.com/raiseCatError/notMyShell/issues/211), [#212](https://github.com/raiseCatError/notMyShell/issues/212) | Physical-QA fixes: resize on closed PTY, stray suspended job, inline interactive UIs, multi-session restore |

## Released — v0.7.0 UI Foundation & Customization

[Milestone #6](https://github.com/raiseCatError/notMyShell/milestone/6) shipped after physical QA of Settings v2, generated help, color and motion modes, surfaces, and Flow/Chat regressions. Release notes are in [CHANGELOG.md](CHANGELOG.md). Screen-reader behavior is unverified; see [accessibility baseline](docs/accessibility/baseline.md).

### Shipped scope

| Issue | Implemented scope |
|---|---|
| [#164](https://github.com/raiseCatError/notMyShell/issues/164) | notMyUI internal toolkit and acceptance documentation |
| [#165](https://github.com/raiseCatError/notMyShell/issues/165) | Surface primitives: frames, fills, layout |
| [#166](https://github.com/raiseCatError/notMyShell/issues/166) | Shared actions and generated contextual help |
| [#167](https://github.com/raiseCatError/notMyShell/issues/167) | Shared form controls |
| [#168](https://github.com/raiseCatError/notMyShell/issues/168) | Authored Markdown renderer and `/help` |
| [#169](https://github.com/raiseCatError/notMyShell/issues/169) | Settings v2: simple/advanced view, changed markers, reset, remembered position |
| [#170](https://github.com/raiseCatError/notMyShell/issues/170) | Accessibility baseline, no-color and reduced-motion modes |
| [#171](https://github.com/raiseCatError/notMyShell/issues/171) | Chroma shared color roles, gradients and fallback |
| [#172](https://github.com/raiseCatError/notMyShell/issues/172) | Semantic motion engine; shimmer migrated onto it |
| [#173](https://github.com/raiseCatError/notMyShell/issues/173) | Deterministic presentation mode |

## Backlog — Research and Future Features

These remain open and are not scheduled for a release.
Expand Down
42 changes: 42 additions & 0 deletions docs/accessibility/baseline.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Accessibility and reduced-presentation baseline

This applies to NMSh-owned surfaces only: panels, the composer, status rows, help and the transcript chrome. Raw PTY output, archived command output and `/copy` are never restyled.

Accessibility flows through the shared primitives (`ui/palette`, `ui/glyphs`, `ui/actions`, `ui/formControls`, `presentation/environment`), not a separate renderer.

## Controls

| Setting | Effect |
| --- | --- |
| `NO_COLOR=1` (non-empty) or `TERM=dumb` | `foreground()`/`background()` emit nothing. Bold, inverse and glyphs remain. |
| `NMSH_COLOR=none` / `256` / `truecolor` | Explicit override, wins over `NO_COLOR`/`TERM`. `256` maps NMSh colors to the xterm 256 palette. |
| `NMSH_ICONS=safe` | ASCII-safe glyph set (existing). |
| `NMSH_REDUCED_MOTION=1` | Shimmer/activity glyph phase and the welcome blink stay still. Durations keep counting. Deterministic presentation implies it. |

These are environment controls. A persisted setting would change the public configuration schema and is left to the Settings work.

## Acceptance criteria

1. Every action is reachable by keyboard; the pointer only adds shortcuts (`ui/actions`).
2. The focused row is identifiable without color: a pointer glyph (`›`, or `>` in safe mode) or `>` in plain form controls.
3. Changed and error states are text (`(changed)`, `Error: ...`), not color alone (`ui/formControls`).
4. Success/failure rows carry distinct glyphs (`✔`/`✘`, or `+`/`x` in safe mode) in addition to color.
5. With `NO_COLOR`, no NMSh-generated color escape is written; layout is unchanged.
6. With reduced motion, no NMSh-owned decoration changes between frames unless state changes.
7. No width-changing animation.

## Audit result

- Met: keyboard operation in palette, Settings, draft panels; pointer-free navigation; safe glyph set; status glyphs; footer help derived from actions.
- Known gaps: command-row background bands (`TranscriptPresenter`) are a color-only cue for "this is a command" under `NO_COLOR`; the prompt prefix is the remaining cue. Provider panels (prompt, welcome, suggestions) keep hand-written footers.
- Not supported: automatic 256-color detection (only explicit `NMSH_COLOR=256`), 16-color output, and a persisted reduced-motion setting.

## Screen readers

NMSh redraws full-screen frames in the alternate screen. Terminals expose that to assistive technology inconsistently, so NMSh cannot guarantee screen-reader-friendly output. What it does provide is text-carried state and no pointer requirement; behavior with a specific terminal and reader has not been verified.

## Motion

`motion/motion.ts` is a pure engine: profiles per semantic state (`waiting`, `processing`, `streaming`, `transition`, `completion`, `failure`) sampled at an elapsed time. Reduced motion holds every profile still. It never schedules timers, changes width or touches PTY output.

The shimmer (`status/shimmer.ts`) samples the `processing`/`streaming` profiles. The one existing activity timer is already bounded (100 ms), cleared on exit, and its renders are suppressed during passthrough, so no shared scheduler was added; one should arrive with a second animated consumer. `waiting`, `transition`, `completion` and `failure` have no consumer yet.
40 changes: 40 additions & 0 deletions docs/architecture/notmyui.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# notMyUI: internal presentation and interaction toolkit

Internal to NMSh (not a published package). It exists only for NMSh-owned surfaces; raw PTY output, archived command output and `/copy` are never interpreted or recolored by it. zsh stays authoritative.

## Primitives and their consumers

| Primitive | Module | What it owns | Real consumers |
| --- | --- | --- | --- |
| Deterministic clock | `presentation/environment` | `NMSH_DETERMINISTIC`, `NMSH_REDUCED_MOTION` display seams | completion time, shimmer phase, welcome blink |
| Capability | `presentation/capabilities` | color level: none / 256 / truecolor | `chroma/escape`, `ui/palette` |
| Chroma | `chroma/chroma`, `chroma/escape` | which color a cell gets: status / theme / identity roles, gradients, curves, fallback | palette helpers, shimmer, Settings status tones, surfaces |
| Actions | `ui/actions` | identity, label, key, enabled state; derived footers | command palette, layout/syntax/transcript panels |
| Form controls | `ui/formControls` | toggle, select, multi-select, text field, confirmation as proposals | Settings rows, Settings search |
| Surfaces | `ui/surface` | frame, fill, padding, inset, width, alignment | `framePanel` (all panels) |
| Motion | `motion/motion` | semantic motion profiles, sampled purely | shimmer |
| Authored Markdown | `help/markdown` | branded, NMSh-owned content only | `/help` |
| Settings v2 | `ui/SettingsPanel` | simple/advanced rows, changed marker, reset | `/settings` Config |

Boundaries: Chroma decides color; surfaces and layout decide where cells are; controls report proposals and the feature layer persists; motion yields intensities and owns no timers.

## Not built (no consumer yet)

Shared animation scheduler, user-remappable bindings, surface variants beyond the top line in panels, Linguist language colors (#176), transient effects (#78), automatic 256-color detection, persisted reduced-motion setting.

## Acceptance

See `docs/accessibility/baseline.md` for accessibility criteria and known gaps.

## v0.7 physical QA checklist (not yet performed)

- Ghostty and Terminal.app: `/settings` Config: `A` advanced, `/` search, `R` reset, changed `•` marker, remembered position after Esc and reopen.
- Narrow widths (about 24 to 40 columns) for Settings, palette and `/help`.
- `NO_COLOR=1`: panels stay legible; focus, changed and status cues remain visible; command-row bands (known gap).
- `NMSH_COLOR=256` on a 256-color terminal: palette looks acceptable.
- `NMSH_REDUCED_MOTION=1`: running-command shimmer and welcome blink stay still while the timer counts.
- `NMSH_DETERMINISTIC=1`: completion time and shimmer are stable across runs.
- `/help`: table, code fence and tips render in Ghostty and Terminal.app; safe-glyph mode (`NMSH_ICONS=safe`) shows ASCII.
- Command palette: footer hides Enter/↑↓ when no result matches; keyboard-only run and close.
- Passthrough transitions (vim, fzf) and Flow/Chat layouts unchanged; no motion or repaint artifacts after exit.
- Screen reader behavior is unverified and not promised.
34 changes: 34 additions & 0 deletions docs/testing/deterministic-presentation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Deterministic presentation for tests

Set `NMSH_DETERMINISTIC=1` when launching NMSh to make its current presentation
more repeatable in visual and integration captures:

```sh
NMSH_DETERMINISTIC=1 npm run dev
```

This is a developer/testing aid for visual snapshots, integration tests, and
later VHS/demo tooling. It is opt-in and does not change the normal runtime.

## Stabilized today

- NMSh's displayed command completion time is fixed to 09:41 local time. The
measured command duration and the underlying shell event timestamp remain
real.
- NMSh shimmer and live activity spinner presentation use a fixed phase.
Command duration text remains based on real elapsed time.
- Vespyr stays in its open-eye frame; the ambient blink timer is not started.
Its existing blink delay sequence is already deterministic and has no random
choices.

The fixed completion clock uses the local-time formatter, so it stabilizes the
displayed hour and minute across runs on a host. It does not normalize locale,
terminal width, colors, or other host presentation settings.

## Deliberately unchanged

This mode does not freeze `Date`, randomness, or timers globally. Shell commands,
zsh state, PTY output and timing, session expiry, service protocol timing,
timeouts/retries, external programs, persisted timestamps, and filesystem IDs
remain real. NMSh currently has no general animation engine or random ambient
visual choices; this seam does not implement the future #172 animation system.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "nmsh",
"version": "0.6.0",
"version": "0.7.0",
"description": "A cleaner terminal frontend for zsh with persistent input, autocomplete, semantic highlighting, scrollable history, and better command feedback.",
"private": true,
"main": "dist/index.js",
Expand Down
Loading
Loading