AI.news
主页教程研究工具模型AI创业讨论新闻每日简报WIKI🚀 创业库★ 投稿
AI+医疗机器人教育金融能源健康娱乐思考

GitHub - naya-ai/promptctl: Git for your AI prompts — version, diff, and rollback LLM prompts from the CLI

promptctl — Git for your AI prompts

CI License: MIT Go

Git for your AI prompts.

Track, version, diff, and rollback your LLM prompts — just like you version your code.

$ promptctl commit system --file prompts/system.txt -m "initial"
✓ Committed prompt "system" as v1

$ promptctl commit system --file prompts/system.txt -m "added citation rule"
✓ Committed prompt "system" as v2

$ promptctl diff system
--- system v1 (2026-06-01 09:12)
+++ system v2 (2026-06-03 14:47)

- You are a helpful assistant.
+ You are a helpful assistant. Always cite your sources.

$ promptctl rollback system 1 -m "reverting — citation hurt recall"
✓ Rolled back "system" to v1 → saved as v3

The Problem

Your prompts live in random places — hardcoded in files, buried in Notion docs, copy-pasted in Slack. When something breaks or stops working well, you have no idea:

  • What the prompt looked like last week when it was working
  • What changed between versions
  • Which version performed best
  • How to get back to a specific point

promptctl solves this. It's git for prompts.


Installation

Requires Go 1.22+.

go install github.com/naya-ai/promptctl/cmd/promptctl@latest

Or build from source:

git clone https://github.com/naya-ai/promptctl.git
cd promptctl
make build    # binary at bin/promptctl
# or: go build -o bin/promptctl ./cmd/promptctl/

Demo

promptctl terminal demo


Quick Start

# 1. Initialize in your project (creates .promptctl/store.json)
promptctl init

# 2. Save your first prompt version
echo "You are a helpful assistant." | promptctl commit system -m "initial"

# 3. Make a change and save it
echo "You are a helpful assistant. Always cite sources." | promptctl commit system -m "added citation rule" --model claude-3

# 4. See the history
promptctl log system --preview

# 5. Compare latest vs. previous
promptctl diff system

# 6. Roll back
promptctl rollback system 1 -m "reverting"

Commands

init

Initialize promptctl in the current directory. Creates .promptctl/store.json.

commit

Save a new version of a prompt.

# From stdin
echo "You are a helpful assistant." | promptctl commit system -m "initial"

# From a file (recommended for longer prompts)
promptctl commit system --file prompts/system.txt -m "from file"

# With metadata
promptctl commit classifier -m "optimized for speed" --model gpt-4o-mini --tag prod

# Interactive — type END on its own line to finish
promptctl commit system -m "manual entry"

Flags:

  • -m / --message — commit message (default: "add version N")
  • --model — tag with the model this prompt targets
  • --tag — add a label to this version
  • -f / --file — read content from a file instead of stdin

log

Show version history.

promptctl log                          # all prompts
promptctl log system                   # one prompt
promptctl log system --preview         # show content snippets
promptctl log system --tag prod        # filter by tag
promptctl log system --json            # machine-readable output

diff

Compare versions side by side with color highlighting.

promptctl diff system            # latest vs. previous
promptctl diff system 2          # v2 vs. latest
promptctl diff system 1 3        # v1 vs. v3

show

Show a prompt version.

promptctl show system            # latest version
promptctl show system 2          # specific version
promptctl show system --raw      # content only (good for piping)
promptctl show system --json     # full JSON
promptctl show system --copy     # copy to clipboard (macOS/Linux)
promptctl show system --version-at 2026-06-01   # version that was latest on that date

rollback

Restore a previous version. Creates a new version (non-destructive).

promptctl rollback system 1
promptctl rollback system 1 -m "reverting — citation hurt recall"

list

List all tracked prompts.

promptctl list
promptctl list --json       # JSON array with version counts
promptctl list --names      # one name per line (used by shell completions)

search

Search across content, commit messages, and tags.

promptctl search "helpful assistant"
promptctl search prod              # matches tag "prod"

export

Export all versions of a prompt to Markdown.

promptctl export system
promptctl export system > system-history.md

copy

Fork a prompt with its full version history under a new name.

promptctl copy system system-experimental

rename

Rename a prompt. All history moves with it.

promptctl rename system assistant

delete

Delete a prompt and all its versions.

watch

Auto-commit a file whenever it changes on disk. Great for editing prompts in your usual editor and automatically versioning every save.

promptctl watch prompts/system.txt --as system
promptctl watch prompts/system.txt --as system --model claude-3 --interval 2

Flags:

  • --as <name> — the prompt name to commit under (required)
  • --model — tag new versions with this model
  • --interval <seconds> — polling interval (default: 1)

Commit timestamps match the file's modification time, not when promptctl ran.

prune

Keep only the N most recent versions and discard the rest.

promptctl prune system --keep 10

stats

Show a store-wide overview.

Stats:
──────────────────────────────────────────────────
  Prompts:         4
  Total versions:  23
  Total content:   8432 chars
  First commit:    2026-06-01 09:12:00
  Last commit:     2026-06-24 15:30:44
  Most iterated:   system (12 versions)

completion

Print a shell completion script.

# Bash — add to ~/.bashrc
source <(promptctl completion bash)

# Zsh — add to ~/.zshrc
source <(promptctl completion zsh)

# Fish — save to completions directory
promptctl completion fish > ~/.config/fish/completions/promptctl.fish

Completions dynamically suggest prompt names for commands that take a <name> argument.


How It Works

promptctl stores everything in .promptctl/store.json — similar to how .git/ works. The store is discovered from your current directory or any parent, so commands work from any subdirectory.

your-project/
├── .promptctl/
│   └── store.json     ← all prompt versions live here
├── src/
└── ...

Add .promptctl/ to your project's .gitignore to keep prompt history local. If your team wants to share versions in git, track only the store file:

.promptctl/*
!.promptctl/store.json

Reading & Writing Programmatically

Several commands support --json or --raw for scripting:

# Read the latest version of a prompt
promptctl show system --raw

# Pipe the latest content into another tool
promptctl show system --raw | pbcopy

# List prompts as JSON
promptctl list --json

# Ingest output from a script
./generate-prompt.sh | promptctl commit system -m "generated"

Tagging & Model Tracking

# Tag a version for filtering
promptctl commit system -m "production" --tag prod --model claude-opus-4-8

# View only tagged versions
promptctl log system --tag prod

# Find all prompts referencing a tag
promptctl search prod

Why Zero Dependencies?

promptctl uses only Go's standard library — no external packages, no version conflicts, no go mod tidy surprises. One binary, no runtime.


Roadmap

  • Remote sync (S3, GitHub Gist)
  • Side-by-side terminal diff view
  • VS Code extension

Contributing

See CONTRIBUTING.md. PRs welcome — open an issue first for major changes.

git clone https://github.com/naya-ai/promptctl.git
cd promptctl
make test
make build

License

MIT © Shawnaya Williams

Show HN: Promptctl – Git for your AI prompts | AI.News