Skip to main content

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 for ghst to resolve to your local checkout. Alternatively, use uv run ghst without activating. The eval "$(ghst shell-init zsh)" line in your .zshrc handles 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).

Privacy

ghst sends the following data to your configured LLM provider:

  • Current buffer (what you've typed so far)
  • Current working directory
  • Recent shell history (last 5-10 commands)

ghst does NOT send:

  • File contents (unless they appear in terminal output)
  • Environment variables or full PATH
  • 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 Installationbrew install ghst via 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

ghst-0.2.0.tar.gz (82.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ghst-0.2.0-py3-none-any.whl (31.9 kB view details)

Uploaded Python 3

File details

Details for the file ghst-0.2.0.tar.gz.

File metadata

  • Download URL: ghst-0.2.0.tar.gz
  • Upload date:
  • Size: 82.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for ghst-0.2.0.tar.gz
Algorithm Hash digest
SHA256 e2a3936e4a18a559e2c84cb53018457dc9866ce05d5f9993340dec683be4bea6
MD5 35c2355012444052b7a783d69ba2ed47
BLAKE2b-256 9162f543185b0920656d81dcedd80db465d23cc35a9b2e00f4131feef8d96047

See more details on using hashes here.

File details

Details for the file ghst-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: ghst-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 31.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for ghst-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e54d28cca2688e1be73627a5209f90c3473d16dc55ed51af697635c3a087474e
MD5 98d3f315d7e362309e001e8196844385
BLAKE2b-256 069f2f2cc41b411b1e9ba57c18e034413c95e8fad059230cf109dde5e62c18c3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page