AI-powered shell plugin — ghost-text autocomplete, natural language commands, error correction, and history search
Project description
ghst — AI-powered shell plugin
LLM-powered ghost-text autocomplete, natural language commands, and semantic history search for zsh. Works with any terminal emulator that supports ANSI escapes — no terminal modifications needed.
Features
- Autocomplete — Ghost text suggestions as you type, powered by an LLM with shell context. Accept with Tab/→.
- Natural Language Commands — Press Ctrl+G, describe what you want in English, get a shell command.
- History Search — Press Ctrl+R to search your shell history with natural language instead of substring matching.
Install
uv tool install ghst
ghst init
The init wizard will configure your LLM provider, add shell integration to your .zshrc, start the daemon, and verify the connection. Then restart your shell:
exec zsh
Development Setup
git clone https://github.com/insprd/ghst.git
cd ghst
uv venv && source .venv/bin/activate
uv pip install -e ".[dev]"
ghst init # configure provider + inject zshrc
exec zsh # reload shell to activate
Note: In dev mode, you must activate the venv (
source .venv/bin/activate) in each new shell forghstto resolve to your local checkout. Alternatively, useuv run ghstwithout activating. Theeval "$(ghst shell-init zsh)"line in your.zshrchandles this automatically once the venv is active.
Usage
Autocomplete
Just start typing. After a brief pause, ghost text appears with a suggestion:
$ git sta‹tus --short›
- Tab or → — Accept the full suggestion
- Shift+→ — Accept one word at a time
- Esc — Dismiss
Natural Language Commands (Ctrl+G)
$ █ # Press Ctrl+G
ghst> find python files modified this week
$ find . -name "*.py" -mtime -7█
The generated command is placed in your buffer for review — never auto-executed. Press Ctrl+Z to undo and restore your original buffer.
History Search (Ctrl+R)
ghst history> that docker command for postgres
→ docker exec -it postgres-dev psql -U admin -d myapp
docker run -d --name postgres-dev -e POSTGRES_PASSWORD=secret postgres:15
Cheat Sheet (Ctrl+/)
Press Ctrl+/ at any time to see a quick reference of all shortcuts.
Configuration
Config file: ~/.config/ghst/config.toml
[provider]
name = "openai" # "openai" or "anthropic"
api_key = "sk-..." # Or set GHST_API_KEY env var
model = "gpt-4o" # Model for NL commands
autocomplete_model = "gpt-4o-mini" # Fast model for autocomplete
[ui]
autocomplete_delay_ms = 200 # Debounce delay (ms)
autocomplete_min_chars = 3 # Min chars before autocomplete fires
nl_hotkey = "^G" # NL command hotkey
history_search_hotkey = "^R" # History search hotkey
See config/default.toml for all available settings.
CLI Commands
| Command | Description |
|---|---|
ghst init |
Interactive setup wizard |
ghst start |
Start the daemon |
ghst stop |
Stop the daemon |
ghst status |
Show daemon health and config |
ghst shell-init zsh |
Output shell integration code |
ghst help |
Show all commands and shortcuts |
Architecture
zsh (ZLE widgets) ←── Unix domain socket ──→ ghstd (Python daemon)
autocomplete.zsh daemon.py (asyncio)
nl-command.zsh llm.py (httpx)
history-search.zsh safety.py, config.py
The shell side sends JSON requests over a Unix socket; the daemon routes them to the LLM and returns suggestions. The daemon runs in the background, auto-starts on first use, and auto-restarts when Python source files change (for seamless development).
Context Awareness
Autocomplete suggestions are informed by your full working environment — not just what you've typed. Every request includes:
| Context | Example | What it helps with |
|---|---|---|
| Directory listing | src/ tests/ README.md |
cd, cat, vim suggest real file/folder names |
| Git branch & status | on main (dirty) |
git commit, git push, git stash awareness |
| Git branches | feature/auth, develop, next |
git checkout, git merge suggest real branch names |
| Project type | python, docker |
Suggests uv run pytest instead of npm test |
| Active environment | venv:.venv |
Knows python resolves to the venv, not system |
| Recent commands | last 5 from history | Learns your patterns within the session |
| Exit status | 0 or 1 |
Knows if the last command failed |
All context is gathered locally and cached (5s TTL) to avoid redundant work during rapid typing. Project type is detected from marker files in the current directory:
package.json · pyproject.toml · Cargo.toml · go.mod · Gemfile · Makefile · Dockerfile · docker-compose.yml · CMakeLists.txt · pom.xml · build.gradle · justfile · Taskfile.yml
Privacy
ghst sends the following data to your configured LLM provider:
- Current buffer (what you've typed so far)
- Current working directory and directory listing (non-hidden files/folders)
- Recent shell history (last 5-10 commands)
- Git context — current branch, dirty status, local branch names
- Project type — detected from marker files (e.g.
package.json,pyproject.toml,Cargo.toml) - Active environment — virtualenv name, conda env,
NODE_ENV
ghst does NOT send:
- File contents (unless they appear in terminal output)
- Hidden/dotfiles or environment variables
- SSH keys, passwords, or other credentials
All sensitive data (API keys, passwords, tokens) is automatically stripped from history and terminal output before sending to the LLM.
Roadmap
Planned features for future releases:
- Error Correction — Auto-suggest fixes as ghost text when a command fails
- Proactive Suggestions — Read the last command's output and suggest the next command on an empty prompt
- Bash & Fish Support — Extend autocomplete and NL commands beyond zsh
- Local Model Support — Optimized flows for Ollama, LM Studio, and other local inference servers
- Homebrew Installation —
brew install ghstvia a Homebrew tap
Development
uv run pytest # Run tests
uv run pytest -v # Verbose
uv run ruff check src/ # Lint
uv run basedpyright src/ghst/ # Type check
The daemon auto-reloads during development: every 30 commands, the shell checks if any .py source file is newer than the running daemon and restarts it if so. No manual ghst stop && ghst start needed after editing Python code.
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ghst-0.4.0.tar.gz.
File metadata
- Download URL: ghst-0.4.0.tar.gz
- Upload date:
- Size: 85.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3852d36000e0c7a18a43f32307cc140997ac8d3bfb2a830083f5f6370e00a5ba
|
|
| MD5 |
e5b233da348200b7669c2509868a496d
|
|
| BLAKE2b-256 |
cb85ad63961324f772db493c0fbb6ba1ea0f7c30248b643622010960e9051ec4
|
Provenance
The following attestation bundles were made for ghst-0.4.0.tar.gz:
Publisher:
release.yml on insprd/ghst
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ghst-0.4.0.tar.gz -
Subject digest:
3852d36000e0c7a18a43f32307cc140997ac8d3bfb2a830083f5f6370e00a5ba - Sigstore transparency entry: 976587039
- Sigstore integration time:
-
Permalink:
insprd/ghst@c50c9481ab6c6340bf88229fe148dc83ff1a307e -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/insprd
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c50c9481ab6c6340bf88229fe148dc83ff1a307e -
Trigger Event:
release
-
Statement type:
File details
Details for the file ghst-0.4.0-py3-none-any.whl.
File metadata
- Download URL: ghst-0.4.0-py3-none-any.whl
- Upload date:
- Size: 34.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
71127ae9da8eaf26979fecc7b6241c5337c1d1b247b659ded71bb1781e23c239
|
|
| MD5 |
a79b85916cd87b16adcd396ce65c2d0f
|
|
| BLAKE2b-256 |
fee2b83e488e9b8fe51fc02afeb61f5dcb25555d1985eae91affde29f2481729
|
Provenance
The following attestation bundles were made for ghst-0.4.0-py3-none-any.whl:
Publisher:
release.yml on insprd/ghst
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ghst-0.4.0-py3-none-any.whl -
Subject digest:
71127ae9da8eaf26979fecc7b6241c5337c1d1b247b659ded71bb1781e23c239 - Sigstore transparency entry: 976587053
- Sigstore integration time:
-
Permalink:
insprd/ghst@c50c9481ab6c6340bf88229fe148dc83ff1a307e -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/insprd
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c50c9481ab6c6340bf88229fe148dc83ff1a307e -
Trigger Event:
release
-
Statement type: