// docs / cli
Your library, from the terminal.
Save, search, copy, and pipe prompts straight into your agents and scripts. No account needed to start — signing in adds sync and version history.
Install
npm install -g promptlike
ple --versionThe CLI is live on npm as promptlike. Requires Node.js ≥18 and a clipboard tool on PATH for copy: pbcopy (macOS), xclip / wl-clipboard (Linux), or clip.exe (Windows).
Start here — no account needed
Since 0.4.0 the CLI works the moment it lands. Prompts are saved as plain Markdown files in ~/.promptlike/prompts/ — grep them, diff them, commit them to git. Nothing leaves your machine until you ask.
ple save "code review" -m "Review this diff and flag risks: {{diff}}"
ple get "code review" --var diff="$(git diff)" | claude
ple listSigned out, list / search / show / copy / get read the local store. Signed in, the same commands read your account library — the commands don't change, only where they read from.
Sign in — the upgrade, not the door
A free account adds sync across machines, version history with diff and rollback (Free holds up to 3 versions of each prompt, and the 4th save asks you to upgrade; Pro keeps all), and the web editor: sign up here. Local prompts are never uploaded automatically — bring them up explicitly with ple sync (--dry-run shows the list first). Signed up with Google? Google accounts have no password by default. Set one under Settings on the web first, because the CLI logs in with email + password.
Command reference
ple save <title> [-m <body>] [-d <desc>] [-t <tag>...] [--force]Save a prompt locally — no account needed. Body comes from -m or from stdin. Prompts live as plain Markdown files in ~/.promptlike/prompts/ (greppable, diffable, git-committable). Overwriting an existing prompt requires --force; tags and the description you don't repeat are carried over.
$ ple save "code review" -m "Review this diff: {{diff}}" -t review
✓ Saved: code review (code-review)
~/.promptlike/prompts/code-review.md
variables: {{diff}}
$ pbpaste | ple save "bug triage" # or pipe the body inple list [--tag <name>] [--limit <n>] [--project <repo>]Signed out, lists your local prompts; signed in, lists every prompt your account can access (tag filter server-side, default 30, max 100; --project limits it to one repo, CLI 0.8+). Same command, different source.
$ ple list
ID TITLE UPDATED
──────── ───────────────────────────── ──────────
12ab34cd Senior Code Reviewer 2d ago
98ef76dc Bug Triage Assistant 5d ago
$ ple list --tag debug --limit 50ple repo create <name> [--private|--public] [-d <text>] · ple repo list · ple repo show <repo> · ple repo visibility <repo> private|publicCLI 0.8+, signed in. Create and manage repos from the terminal. A new repo is private unless you pass --public. The server enforces everything: your plan's repo limit (Free: 1), name rules, unique URL slug, and that only the owner can change visibility. Making a repo public asks for confirmation (--yes in scripts). There is no delete command on purpose: deleting a repo cannot be undone, so it stays on the web. Add --json for a stable machine-readable shape.
$ ple repo create "team-prompts" -d "Shared review prompts"
✓ Created private repo 'team-prompts' (team-prompts, 1a2b3c4d)
$ ple repo list
ID NAME VISIBILITY ROLE PROMPTS UPDATED
1a2b3c4d team-prompts private owner 0 now
$ ple repo visibility team-prompts public --yes
✓ 'team-prompts' is now public.ple search <keyword>Case-insensitive search across title and description (signed out it also searches local prompt bodies and tags).
$ ple search debug
2 results:
Bug Triage Assistant · 98ef76dc · 5d ago
Triages bug reports by severity and reproducibility.
Debug Helper · 33cc44dd · 2w ago
Walk through systematic debugging steps.ple show <name> [--project <repo>]Render a prompt in the terminal with section headers. Matches by title substring or short ID.
$ ple show "code review"
── ROLE ──
You are a senior code reviewer…
── DESCRIPTION ──
Reviews diffs for correctness and clarity.
── CONTEXT ──
…ple copy <name> [--project <repo>]Look up a prompt by title substring or short ID and send it straight to your system clipboard. If the same title lives in more than one repo, the candidates are listed with their repo names, and --project <repo> picks one.
$ ple copy "code review"
✓ Copied: Senior Code Reviewer (12ab34cd, 487 chars)
$ ple copy 12ab34cd # short ID also works
$ ple copy "code review" --project backend-promptsple get <name> [--var key=value...] [--copy] [--project <repo>]Print a prompt raw to stdout (no colors, no decoration) so agents and scripts can pipe it. Fills {{variable}} placeholders from repeatable --var flags; messages go to stderr to keep stdout clean. Add --project <repo> to scope to one repo when the same title exists in more than one.
$ ple get "code review" --var lang=python | claude
$ ple get "code review" --project backend-prompts # disambiguate by repople export [name] --format agents-md|skill [--project <repo>] [--out <path>] [--zip]CLI 0.5+. Turn a prompt into an AGENTS.md section (printed to stdout, so you can append it) or an Agent Skill folder with a SKILL.md that Claude Code, Claude and other skill-aware agents load on demand. Leave out the name and pass --project to export a whole repo: one AGENTS.md, or one skill with each prompt under references/. --zip writes the archive Claude's skill upload expects. Works signed out too, from your local prompts.
$ ple export "code review" --format agents-md >> AGENTS.md
$ ple export "code review" --format skill --out ~/.claude/skills
✓ Exported 1 prompt → ~/.claude/skills/code-review
$ ple export --project backend-prompts --format skill --zipple import --scan [--dry-run] [--all] [--project <repo>]CLI 0.6+. Bring in the prompts you already keep for your agents, without copy-pasting: .claude/commands, .claude/skills/*/SKILL.md, .cursor/commands, ~/.codex/prompts, .github/prompts/*.prompt.md, AGENTS.md and CLAUDE.md (this repo and your home folder). Pick 1,3-5 or all. Re-running never imports the same content twice. Secret files (.env*, keys) are never opened, and a file that looks like it holds a live token is skipped.
$ ple import --scan --dry-run
Found 6 new · 2 already imported
1 claude-code command review .claude/commands/review.md
2 cursor command refactor .cursor/commands/refactor.md
…
$ ple import --scan # pick: 1,3-5 / all / Enter to cancelple log <name> · ple diff <name> [a] [b] · ple rollback <name> <version>CLI 0.6+, signed in. The version history from the web, in the terminal. diff compares any two versions (3, v3 or 1.0.2; default previous ↔ current) as a unified diff, colored in a terminal and plain when piped. rollback is non-destructive: the old version is copied forward as a new one, so a rollback can itself be undone.
$ ple log "code review"
* v5 1.0.4 rollback 2h ago
v4 1.0.3 web 3d ago
$ ple diff "code review" 2 5 | delta
$ ple rollback "code review" v2 --yesple stats [--range 7|30|365] [--json]CLI 0.6+, signed in. How your library is actually used: uses in the window, where they came from (web, CLI, agents), the most used prompts and the ones not touched in 30 days. Free shows a 7-day view.
$ ple stats --range 30
Usage — last 30 days
Uses 214
Outside the web 71%
…ple suggest "<task>" [--json] [--limit <n>] [--hook]CLI 0.6+. Which saved prompt fits this task? Matching is local: a cached copy of your library, or your local prompts when signed out. The text you type never leaves your machine. --hook is the Claude Code mode (see below).
$ ple suggest "review this pull request for security issues"
Code Review ai-os · used 12× · score 7.4
Use one: ple get "Code Review"ple config get [key] · ple config set <key> <value>CLI 0.6+. Preferences, kept apart from the session so logging out does not reset them. Today: suggest on|off.
$ ple config set suggest off
✓ suggest = offple sync [--dry-run]Upload your local prompts into your signed-in account — one-way, explicit, never automatic on login. Sync copies (local files are kept), tags travel too, and every shortfall is reported with its reason. --dry-run lists what would be uploaded without changing anything.
$ ple sync --dry-run
2 local prompts would be uploaded:
code-review code review
bug-triage bug triage
$ ple sync
✓ Uploaded 2 prompts (+3 tag links)ple loginSign in with email + password — this is the upgrade, not the door. Adds sync, version history (up to 3 versions of each prompt on Free; the 4th save asks you to upgrade), and the web editor. The session is stored at ~/.config/promptlike/config.json (owner-only, 0600). After signing in, commands read your account library; bring local prompts up with ple sync.
$ ple login
Email: you@example.com
Password: ********
✓ Logged in as you@example.com
2 local prompts on this machine are not shown while signed in — bring them into your account: ple sync --dry-runple improve <name> [--focus <hint>] [--pick <n>] [--project <repo>]Loop Engineering, single round: the API generates 2-3 AI variants of your prompt (concise / structured / chain-of-thought), each with a rationale and a size comparison against the current version. Pick a winner and it's saved as a new version with a Loop(<strategy>) changelog. Pro feature.
$ ple improve "code review" --focus "shorter"
[1] CONCISE · 412 chars · ~103 tokens (-75 chars vs current)
why: Cuts filler, keeps the checklist.
…
Pick a winner [1-3], 0 to cancel: 1
✓ Saved 'Senior Code Reviewer' as v5 (concise).ple loop <name> [--exec <cmd>] [--rounds <n>] [--focus <hint>] [--pick <n>] [--project <repo>]Multi-round improve: connect your own agent as the judge. With --exec, every variant is run through your command (prompt delivered as the PLE_PROMPT env var and on stdin; a literal {} is substituted) and the first ~20 lines of output appear under the variant. Each round's winner becomes the base for the next. Pro feature.
$ ple loop "code review" --exec 'claude -p {}' --rounds 3
═══ Round 1/3: 'Senior Code Reviewer' ═══
[1] CONCISE · …
── exec output exit 0 ──
│ Here's my review of the diff…
Pick a winner [1-3], 0 to cancel: 2
✓ Saved 'Senior Code Reviewer' as v6 (structured).
Continue to next round? (y/n) yple logoutRemove the local session file. The session itself expires on its own clock.
$ ple logout
✓ Logged outSuggestions inside Claude Code
The promptlike Claude Code plugin (0.3+) runs ple suggest --hook on every message you send. When one of your saved prompts clearly fits, Claude gets a one-line note naming it and fetches it only if it is relevant. Otherwise nothing happens. The hook stays silent for slash commands, short messages, weak matches and prompts it already suggested in the session. It never waits on the network, and without the CLI installed it does nothing.
Turn it off any of three ways: ple config set suggest off, PLE_SUGGEST=off in your environment, or the plugin option under /config in Claude Code. How often a suggestion is shown is counted on your machine only (ple stats).
Loop Engineering
Connect the CLI to your own agent and put your prompts under version control while they improve. ple loop generates variants, runs each one through the command you give it (Claude, a test script, anything) and saves the winner you pick as a new version. Your agent does the judging; your library keeps the history. Full guide: Loop docs.
# let Claude judge each variant, three rounds deep
ple loop "code review" --exec 'claude -p {}' --rounds 3
# or a quick single round without an agent
ple improve "code review" --focus "tighter output format"Loop Engineering is a Pro feature; Free accounts get a clear upgrade message on the first call.
Example flows
Day one, no account: save, fill, pipe. The whole loop works offline from the local store.
ple save "code review" -m "Review this diff: {{diff}}" -t review
ple get "code review" --var diff="$(git diff)" | claudeDaily use, signed in: browse, copy. Sign in once, find a prompt, drop it on your clipboard.
ple login
ple list
ple copy "Senior Reviewer"
✓ Copied: Senior Code Reviewer (12ab34cd, 487 chars)Agent / pipe workflow. ple get prints the raw prompt to stdout so you can pipe it into any tool, filling {{variables}} inline:
# pipe a filled prompt straight into an agent
ple get "code review" --var lang=python | claude
# or onto the clipboard
ple get my-prompt | pbcopyQuestions?
See the Help & FAQ or explore all features. Agents reading the library directly? That's the MCP server.