The plugin · v1.0

Promptcellar for Claude Code.

A Claude Code plugin that captures every prompt you send to the agent and stores it in your repo as structured PLF.

Install Promptcellar
$curl -fsSL https://get.promptcellar.io/claude-code | sh
Open a Claude Code session in any git repo to start capturing.Codex coming soon →
01 — What gets captured

Every prompt. Every outcome.

Secrets and PII are stripped before anything touches disk — redaction is on by default. Everything else is captured verbatim.

  • Verbatim prompt text + git author identity.
    post-redaction · 222 gitleaks rules + PII layer
  • Git state at prompt time: branch, HEAD, dirty/clean.
  • Outcome: files touched, commits made, status.
    completed · interrupted · errored
  • Enrichments: input/output tokens, estimated cost, wall-clock duration.
  • Tool & model versions, for reproducibility.
.prompts/2026/05/01/7b3e9a4f.jsonlplf-1
{
"version": "plf-1",
"id": "01HX8K2P7M9NRT3VQYZB4WGFCD",
"session_id": "7b3e9a4f-1c84-4d2a-9e21-bd3f7af80c91",
"timestamp": "2026-05-01T14:22:31.412Z",
"author": { "email": "you@team.com", "name": "You" },
"tool": { "name": "claude-code", "version": "1.4.0" },
"model": { "provider": "anthropic", "name": "claude-opus-4-7" },
"prompt": "Refactor the auth middleware to use the new token store.",
"git": { "branch": "feat/auth", "head_commit": "a1b2c3d", "dirty": false },
"outcome": { "files_touched": ["server/auth.ts"], "status": "completed" },
"enrichments": { "input_tokens": 8412, "output_tokens": 1330, "cost_usd": 0.041 }
}
02 — In-session controls

Everything is a slash command.

No binary on your PATH. No new shell. The plugin's only surface is /promptcellar:* inside Claude Code.

Promptcellar capturing a prompt inside Claude Code: slash command runs, prompt is captured, JSONL record lands in .prompts/
Plugin in action — install, type a prompt, watch the record land.
CommandWhat it does
/promptcellar:statusResolved config + capture counts + .prompts/ location
/promptcellar:log [N]The last N captured prompts in this repo
/promptcellar:doctorDiagnose hook wiring, transcript parser, perms
/promptcellar:enable / :disablePer-repo (committed) or --for-me / --global
/promptcellar:versionPlugin + transcript-adapter version
/promptcellar:uninstallRemove plugin entry; data left intact
03 — Three-layer config

Repo decides. You opt out. Machine kills.

Resolution order — most-restrictive wins.

01 · Global
~/.promptcellar/config.json

“Stop capturing on this whole laptop today.”

02 · Repo · committed
.promptcellar/config.json

The team's decision. Travels with the code.

03 · Personal · gitignored
.promptcellar/config.local.json

“The repo captures, but skip mine.”

04 — Privacy & redaction

The redaction layer.

Four passes, in order. The first match wins.

01

222 gitleaks rules

AWS, GitHub, Stripe, Anthropic, OpenAI, Slack, Datadog, GCP, Cloudflare — vendored at build time.

02

Built-in PII layer

Luhn-validated card numbers. ISO-13616 (MOD-97) IBAN checks. Email and phone fall through to context-aware classifiers.

03

.promptcellarignore

Team-specific deny rules. Authoritative — overrides everything else, including allows.

04

.promptcellarallow

Narrow exceptions for false positives. Last in the chain. Local-first.

Matches never touch disk. Excluded records leave a typed gap so the timeline stays auditable — you can see {"status":"excluded","reason":"secret"} in the JSONL.

05 — How capture works

Four hooks. Six binaries. Sub-10ms.

HookWhat we do with it
SessionStartRegisters a session id, writes header line, picks .prompts/<date>/<id>.jsonl path.
UserPromptSubmitCaptures the verbatim prompt + git author + branch HEAD; runs through the redactor.
PostToolUseBuffers per-tool outcomes (files touched, exit codes) into the open record.
StopFlushes a single canonical PLF line. Append-only. fsync optional.

Hooks buffer per session and flush one canonical record at Stop. No partial lines. No lock contention across sessions because each session writes to its own content-addressable file. See IMPLEMENTATION_PLAN.md for the full story.

06 — Reading your data

It's just JSONL. jq is enough.

Last 10 prompts across all branches
cat .prompts/**/*.jsonl \ | jq -r '.prompt' \ | tail -n 10
Total cost on a branch
jq -s '[.[] | select(.git.branch=="feat/auth") | .enrichments.cost_usd] | add' \ .prompts/**/*.jsonl
Prompts that touched a path
jq -r 'select(.outcome.files_touched[] | contains("server/auth")) | .prompt' .prompts/**/*.jsonl

Browse all examples on GitHub →

Coming soon

Codex support, in flight.

Same PLF format. Same .prompts/ folder. Different agent.

Install Promptcellar
$curl -fsSL https://get.promptcellar.io/claude-code | sh