Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
2f00f40
Native theme library, Theme Studio tabs, Prompt None, Theme Bridge an…
raiseCatError Oct 4, 2026
f87e25a
Theme library, importer, Theme Bridge, Prompt None and host semantics…
raiseCatError Oct 4, 2026
f396abe
Remove trailing blank line at end of themeImporters.ts
raiseCatError Oct 4, 2026
049e563
Theme Bridge: Helix target with a native palette-based theme and conf…
raiseCatError Oct 4, 2026
dacc801
Prompt None keeps the configured input marker; history stays promptless
raiseCatError Oct 4, 2026
02f4b8a
Theme Bridge QA pass: two-level policy, single panel, bat, file listi…
raiseCatError Oct 4, 2026
f4623ac
Providers inline panel, picker orientation, tmux Config Studio, tool …
raiseCatError Oct 4, 2026
df92d51
Harden dotfiles exact copy and tmux pane frontend; count only output …
raiseCatError Oct 5, 2026
fd351fb
Fix Bash file-listing wrapper parse failure; add real-shell and promp…
raiseCatError Oct 5, 2026
9673b2f
Shell frameworks and Oh My Posh provider, Keep Awake, Homebrew instal…
raiseCatError Oct 5, 2026
b2075db
Oh My Zsh guided steps download into your home, not a shared temp pat…
raiseCatError Oct 5, 2026
122e105
Add GitHub Sponsors funding metadata
raiseCatError Oct 5, 2026
f0cda67
Keep Awake hands the composer straight back and shows itself as compo…
raiseCatError Oct 5, 2026
431f043
Document current NMSh architecture for project owners
raiseCatError Oct 5, 2026
16c2d59
Docs pass and reproducible VHS demos; Prompt None wording; link ARCHI…
raiseCatError Oct 5, 2026
22316de
docs clarify login shell setup
raiseCatError Oct 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
github: raiseCatError
67 changes: 67 additions & 0 deletions .github/workflows/homebrew-tap.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
name: Homebrew tap

# After a stable GitHub release is published, propose the matching formula
# update to raiseCatError/homebrew-tap as a pull request (reviewable; the
# tap's own CI installs and tests it). Never runs for prereleases, dev pushes
# or pull requests.
#
# Needs one secret, HOMEBREW_TAP_TOKEN: a fine-grained token limited to the
# raiseCatError/homebrew-tap repository with Contents and Pull requests write.

on:
release:
types: [published]

permissions:
contents: read

jobs:
formula:
if: ${{ !github.event.release.prerelease && !github.event.release.draft }}
runs-on: ubuntu-latest
steps:
- name: Release facts
id: release
env:
TAG: ${{ github.event.release.tag_name }}
run: |
# Strict stable semver only: the value later reaches a URL and a sed expression.
printf '%s' "$TAG" | grep -Eqx 'v[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}' || { echo "Not a stable version tag."; exit 1; }
version="${TAG#v}"
url="https://github.com/${GITHUB_REPOSITORY}/archive/refs/tags/${TAG}.tar.gz"
curl -fsSL --retry 3 -o release.tar.gz "$url"
sha256="$(sha256sum release.tar.gz | cut -d' ' -f1)"
echo "version=$version" >> "$GITHUB_OUTPUT"
echo "url=$url" >> "$GITHUB_OUTPUT"
echo "sha256=$sha256" >> "$GITHUB_OUTPUT"

- name: Check out the tap
uses: actions/checkout@v4
with:
repository: raiseCatError/homebrew-tap
token: ${{ secrets.HOMEBREW_TAP_TOKEN }}
path: tap

- name: Propose the formula update
working-directory: tap
env:
GH_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
VERSION: ${{ steps.release.outputs.version }}
URL: ${{ steps.release.outputs.url }}
SHA256: ${{ steps.release.outputs.sha256 }}
run: |
formula=Formula/nmsh.rb
if grep -q "^ url \"$URL\"$" "$formula"; then
# A published archive is immutable: never re-point the same version at different bytes.
grep -q "^ sha256 \"$SHA256\"$" "$formula" || { echo "The formula already names $URL with a different sha256. Publish a new patch release instead."; exit 1; }
echo "Formula already at $VERSION."; exit 0
fi
sed -i -E "s|^ url \".*\"$| url \"$URL\"|; s|^ sha256 \".*\"$| sha256 \"$SHA256\"|" "$formula"
git diff --stat
branch="nmsh-$VERSION"
git switch -c "$branch"
git -c user.name=J -c user.email=315733358+raiseCatError@users.noreply.github.com commit -am "nmsh $VERSION"
git push origin "$branch"
gh pr create --title "nmsh $VERSION" --body "Release: https://github.com/raiseCatError/notMyShell/releases/tag/v$VERSION
Archive: $URL
sha256: $SHA256"
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
dist/
node_modules/
.DS_Store
*.swp
33 changes: 26 additions & 7 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# NMSh Agent Guide

## What NMSh is
notMyShell (NMSh) is a terminal frontend that operates over a persistent, real zsh session. Instead of replacing the shell or running commands as isolated subprocesses, NMSh orchestrates a hidden pseudo-terminal (PTY) running zsh. It captures input via a fixed editor, highlights it semantically, and sends it to the real shell.
notMyShell (NMSh) is a terminal frontend that operates over a persistent, real shell session (zsh by default, Bash 4.4+ or Fish through the ShellAdapter). Instead of replacing the shell or running commands as isolated subprocesses, NMSh orchestrates a hidden pseudo-terminal (PTY) running that shell. It captures input in its own composer, highlights it semantically, and sends it to the real shell.

## Core invariants
- NMSh is a frontend over a persistent real shell.
- Do not replace ShellSession with command-by-command spawning.
- Preserve real zsh state between commands.
- Preserve real shell state between commands (zsh, Bash and Fish alike).
- Raw PTY stdout/stderr must remain raw/presentation-safe.
- Do not semantically recolor arbitrary PTY output.
- NMSh-owned submitted command lines may have semantic highlighting.
Expand All @@ -29,9 +29,12 @@ notMyShell (NMSh) is a terminal frontend that operates over a persistent, real z
- **history viewport**: Scrollable past commands and raw PTY output
- **autocomplete/suggestions**: Real-time completion hints below the input
- **live activity**: Real-time animation and elapsed time for running commands
- **context/prompt**: Evaluated from the shell and displayed on the bottom editor
- **persistent editor**: The fixed input box at the bottom of the screen
- **separator**: A visual divider between output and the editor
- **context/prompt**: Evaluated from the shell; NMSh Native or an external provider (Starship, Oh My Posh, Powerlevel10k), or None
- **composer**: The persistent editor, docked Bottom or Top, or in Flow after the newest output; one-line or two-line
- **composer edges**: Optional divider rows around the composer (one shared edge renderer); NMSh-owned accessories such as Keep Awake use a free edge and never touch prompt content
- **frontend chrome**: Status Strip, notices, find bar and accessory rows are planned by `src/app/screenPlan.ts`, never written to the transcript

`src/app/screenPlan.ts` is the single geometry source per frame: render, hit testing, cursor, viewport and PTY sizing all read the same plan.

NMSh uses a FOLLOW mode during execution, pinning the output viewport to the bottom. During historical inspection, it enters DETACHED mode.

Expand All @@ -50,7 +53,17 @@ As the user types, partial input is tokenized. Known executables, aliases, and b
Submitted commands retain their semantic presentation in the NMSh output history. The styling (e.g. lavender for known commands, red for unknown commands) persists even after the command completes.

## Shell compatibility
Released (0.16.0): a real ShellAdapter with zsh, Fish and Bash 4.4+ backends ([docs/architecture/shell-adapter.md](docs/architecture/shell-adapter.md)). Nushell and PowerShell remain future.
Released (0.16.0): a real ShellAdapter with zsh, Fish and Bash 4.4+ backends ([docs/architecture/shell-adapter.md](docs/architecture/shell-adapter.md)). Nushell and PowerShell remain future. Changes must keep all three backends working.

## Safety boundaries
- Shell config, framework code and parseable tool configs are executable: never source, merge or silently edit them. Offered edits are exact diffs behind a confirmation.
- Theme imports and dotfiles are data: bounded parsers, no includes, templates, network or repository code execution; dotfiles exact copies fail closed.
- NMSh changes only what its ownership ledger proves it wrote; Keep Awake signals only its own verified process.
- Installs are typed argv shown before confirmation; special installers are never run by NMSh.
- Chroma never reaches generated external artifacts.

## Current surfaces (unreleased beyond v0.16.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). See CHANGELOG.md → Unreleased.

## Testing / verification
During implementation, run focused affected tests. Use `npm run verify:fast` for
Expand All @@ -71,8 +84,11 @@ for sharding, platform gates and exact-release evidence requirements.
npm run verify:fast
npm run verify
npm run verify:release
npm run demos # re-record README/docs media with VHS (scripts/demos/README.md)
```

Do not hardcode test totals in docs; they change with every slice.

When writing tests involving `TerminalApp`, you must carefully tear down child processes and temp ZDOTDIRs:
```typescript
app['stop'](0);
Expand All @@ -87,6 +103,7 @@ app['session'].kill();
- prefer localized changes
- do not casually rewrite the renderer or PTY architecture
- no fabricated manual verification
- commits and PRs carry no AI attribution and no AI co-author trailers
- distinguish automated verification from human GUI/runtime validation

## Planning and GitHub tracking
Expand All @@ -102,10 +119,12 @@ For substantial implementation work:
5. **Only close work requiring human validation after that validation occurs**

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.16.0 Release](https://github.com/raiseCatError/notMyShell/releases/tag/v0.16.0) — current stable release
- [PR #303](https://github.com/raiseCatError/notMyShell/pull/303) — the merged cumulative v0.16 release; [#308](https://github.com/raiseCatError/notMyShell/issues/308) tracks release readiness
- [PR #303](https://github.com/raiseCatError/notMyShell/pull/303) — the merged cumulative v0.16 release
- [PR #315](https://github.com/raiseCatError/notMyShell/pull/315) — open development PR for the work after v0.16.0 (not released; the package version stays 0.16.0)
- [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
- [docs/design/structured-execution.md](docs/design/structured-execution.md) — v0.2.0 design decisions
Expand Down
Loading
Loading