Skip to main content

Terminal-based spec review tool with real-time AI conversation

Project description

Revspec

A review tool for AI-generated spec documents with real-time AI conversation. Comment on specific lines, get AI replies instantly, resolve discussions, submit for rewrites, and approve — all without leaving the terminal.

Demo

revspec demo

Why

When an AI generates a spec, the human review step breaks the agentic loop. You have to open the file separately, read it, then type unstructured feedback. Revspec closes this loop with a TUI that lets you comment inline and discuss with the AI in real-time — like a chatroom anchored to the spec.

Install

pipx install revspec

Or with pip:

pip install revspec

Requires Python 3.11+. No native dependencies.

Claude Code plugin

Install the /revspec skill for Claude Code:

claude install icyrainz/revspec-py

This adds the /revspec slash command. After generating or editing a spec, use /revspec (or /revspec <path>) to launch an interactive review session with real-time AI conversation.

From source

git clone https://github.com/icyrainz/revspec-py.git
cd revspec-py
uv venv && uv pip install hatchling editables && uv pip install -e . --no-build-isolation

Usage

revspec spec.md

Opens a TUI with vim-style navigation. Press c on any line to open a thread and start commenting.

Live AI Integration

Revspec communicates with AI coding tools (Claude Code, etc.) via CLI subcommands:

revspec watch <file.md>

Blocks until the reviewer acts, then returns structured output:

=== New Comments ===
Thread: x1a3f (line 14)
  Context:
      12: The system uses polling...
    > 14: it sends a notification via webhook.
      16: resource state.
  [reviewer]: this is unclear

To reply: revspec reply spec.md x1a3f "<your response>"
When done replying, run: revspec watch spec.md

Watch exits on three events:

  • Comment/reply — returns thread content for AI to respond
  • Submit (S) — returns resolved thread summaries for AI to rewrite the spec
  • Approve (A) — spec is finalized
  • Session end — reviewer quit the TUI

revspec reply <file.md> <threadId> "<text>"

Sends an AI reply that appears instantly in the reviewer's TUI.

The loop

1. AI generates spec
2. AI launches: revspec spec.md (in tmux pane)
3. AI runs: revspec watch spec.md (blocks)
4. Reviewer comments → AI replies → watch again
5. Reviewer resolves threads → presses S (submit)
6. Watch returns resolved thread summaries → AI rewrites spec
7. TUI reloads with new spec → reviewer continues reviewing
8. Repeat 3-7 until A (approve)

Round Diff View

After each submit/rewrite cycle, the TUI shows an inline unified diff of what changed:

  • Red ghost rows with - prefix for removed lines
  • Green-tinted rows with + prefix for added/changed lines
  • [DIFF +N -M] indicator in the top bar showing change counts
  • Toggle with \d, navigate hunks with ]d/[d

The diff auto-appears on reload and persists until approve. Each round diffs against the immediately previous version.

Markdown rendering

Revspec renders markdown in-place:

  • Headings — colored and bold, #######
  • Inline — bold, italic, bold-italic, strikethrough, code, links
  • Fenced code blocks — markers dimmed, body in green
  • Tables — box-drawing borders, header row bolded, auto-column-widths
  • Lists — unordered, ordered, task lists
  • Blockquotes — bar gutter, italicized text
  • Cursor line highlighting and search highlights

Testing

just test             # Unit + integration (pytest)
just pytest-watch     # Watch mode

432 tests covering state, protocol, markdown, watch, reply, renderer, diff_state, and bugfixes.

Protocol

Communication happens through a JSONL file (spec.review.jsonl) — append-only, both sides write to it. The JSONL is the single source of truth for the review session.

Event types

{"type":"comment","threadId":"x1a3f","line":14,"author":"reviewer","text":"unclear","ts":1710400000}
{"type":"reply","threadId":"x1a3f","author":"owner","text":"I'll fix it","ts":1710400005}
{"type":"resolve","threadId":"x1a3f","author":"reviewer","ts":1710400010}
{"type":"submit","author":"reviewer","ts":1710400050}
{"type":"approve","author":"reviewer","ts":1710400060}
{"type":"session-start","author":"reviewer","ts":1710400065}
{"type":"session-end","author":"reviewer","ts":1710400070}

The submit event acts as a round delimiter — the AI rewrites the spec, and the TUI reloads. Events before a submit reference the previous spec version. The session-start event marks where a new review session begins — only events after the last session-start are replayed on startup.

Thread statuses: open (awaiting AI reply), pending (AI replied, awaiting reviewer), resolved, outdated.

Keybindings

Navigation

Key Action
j/k Move cursor down/up
gg / G Go to top / bottom
Ctrl+D/U Half page down/up
H/M/L Jump to screen top / middle / bottom
zz Center cursor line in viewport
/ Search (smartcase)
n/N Next/prev search match
Esc Clear search highlights
]t/[t Next/prev thread
]r/[r Next/prev unread AI reply
]d/[d Next/prev diff hunk
]1/[1 Next/prev h1 heading
]2/[2 Next/prev h2 heading
]3/[3 Next/prev h3 heading
Ctrl+O/I Jump list back/forward
'' Jump to previous position

Review

Key Action
c Open thread / comment on line
r Resolve thread (toggle)
R Resolve all pending
dd Delete thread (with confirm)
t List threads (Ctrl+F to filter all/active/resolved)
S Submit for rewrite (AI updates spec, TUI reloads)
A Approve spec (finalize and exit)

Toggles

Key Action
\w Toggle line wrapping
\n Toggle line numbers
\d Toggle diff view

Commands

Key Action
:q Quit (warns if unresolved threads)
:q! Force quit (also :wq!, :qa!, etc.)
:{N} Jump to line N
:wrap Toggle line wrapping
:diff Toggle diff view
:submit Submit for rewrite
:approve Approve spec
:resolve Resolve thread
:reload Reload spec
:help Show help
Ctrl+R Reload spec (when modified externally)
Ctrl+C Force quit
? Help

Thread popup

The thread popup has two vim-style modes, indicated by border color and label:

  • Insert mode (mauve border) — type your comment, Tab sends (stays in insert mode for chat-like flow), Esc switches to normal mode
  • Normal mode (blue/green border) — j/k and Ctrl+D/U scroll the conversation, gg/G top/bottom, i/c to reply, r to resolve, q/Esc to close. Border is green when resolved, blue when open.

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

revspec-0.5.3.tar.gz (2.9 MB view details)

Uploaded Source

Built Distribution

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

revspec-0.5.3-py3-none-any.whl (48.5 kB view details)

Uploaded Python 3

File details

Details for the file revspec-0.5.3.tar.gz.

File metadata

  • Download URL: revspec-0.5.3.tar.gz
  • Upload date:
  • Size: 2.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for revspec-0.5.3.tar.gz
Algorithm Hash digest
SHA256 8001b24e6bc0694ee216a0a592d19361f938033dbab21eeb623dd5c27e618594
MD5 b5b23ff2f41ef66131d7b47824e835d6
BLAKE2b-256 04a28ee1624053a2017d83dc598417f4f3fc1fa4fab2cef844aa9ae59d498144

See more details on using hashes here.

File details

Details for the file revspec-0.5.3-py3-none-any.whl.

File metadata

  • Download URL: revspec-0.5.3-py3-none-any.whl
  • Upload date:
  • Size: 48.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for revspec-0.5.3-py3-none-any.whl
Algorithm Hash digest
SHA256 114a875f33b4956cf3ac0ad92325bfbd56ff09ab4fbc2a23d2af5a41d7c0e16e
MD5 ed3d830c7275da3daa0638af43d51f54
BLAKE2b-256 570d712eccb3ba85024b0a9c0c76267f071567f17bf3bb9250e41d364baa96f5

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