Tuicr logo

Tuicr

CommunityPopular
agavra
tuicr

Use tuicr's review CLI to read and add comments in active TUI review sessions, and launch tuicr in cmux, tmux, Zellij, or Herdr when a user needs an interactive review pane.

Overview

Publisheragavra
Repositorytuicr
Skill nametuicr
Stars
3.1K
Forks
264
Bundled files
5
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 5 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by agavra on GitHub. Read the source before you install it.

Installation

Install the Tuicr AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/agavra/tuicr.git /tmp/tuicr
mkdir -p .claude/skills
cp -r /tmp/tuicr/skills/tuicr .claude/skills/tuicr
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Tuicr in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Tuicr on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Tuicr is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

tuicr Review Workflow

Use tuicr review as the default agent interface. The TUI is where the human reviews code; the CLI is how the agent discovers active sessions, reads user comments, and, only when appropriate, adds agent-authored comments.

Core Rule

First decide which workflow the user is asking for:

  1. User-led review of agent-generated changes

    • The user wants to inspect the patch and write comments in tuicr.
    • Your job is to open or find the session, then retrieve the user's comments with tuicr review comments when they say comments are ready. If you are explicitly waiting while the user reviews, poll the same command periodically and look for new comment IDs.
    • Do not add your own review comments, do not preemptively review your own patch, and do not impersonate the user's comments.
  2. Agent review of an AI-generated patch

    • The user wants you to understand, critique, or summarize a patch.
    • You may inspect the patch and propose findings.
    • If you can confidently identify this workflow and the target session, add findings directly with tuicr review add and an explicit --username identifying the agent. Ask first when the workflow or session is ambiguous.

If the user's intent is ambiguous, ask which workflow they want.

Attach To A Session

  1. Determine the repository directory from the user's request, current working directory, or recent file operations. Ask if it is ambiguous.

  2. List persisted sessions:

    bash
    tuicr review list --repo /path/to/repo   # checkout + its repo's PR sessions
    tuicr review list --repo owner/repo      # all sessions for a forge repo
    tuicr review list --all                  # every session across all repos

    --repo is a selector: a checkout path also surfaces PR sessions for that checkout's origin repo, and a forge coordinate like owner/repo matches local and PR sessions by owner/repo. Each row carries a kind (local or pr) and a usable slug. Use --all when you don't know the repo.

    [] with exit 0 also means "not a repo root" — a subdirectory returns it too. Pass the root, then --all, before concluding nothing is open.

  3. Choose the session:

    • If the CLI clearly reports exactly one relevant active session with "active": true, attach to it.
    • If multiple sessions are active, or the correct session is not clear, ask the user which slug to use. One repo can hold a worktree and a commit-range session at once, and adding to the wrong one exits 0.
    • If the user provided a slug or session JSON path, use it directly.
    • For a PR review, pass the PR slug from the listing (e.g. gh:owner/repo/pr/N) to --session; it is self-contained and needs no --repo.
    • If there is no active session, start or wait for one as described below.
    • Until active-session discovery is formalized as a stable protocol, treat "active": true as a convenience signal. If slug resolution fails, ask the user for the slug or repo path used by the session.

The CLI works even if the agent is not running inside tmux, Zellij, or Herdr, so do not require a multiplexer just to connect to an existing active session.

Start A Session

When the user needs an interactive tuicr pane and no active session exists:

EnvironmentAction
$CMUX_WORKSPACE_ID is setRun tuicr-wrapper-cmux.sh /path/to/repo -- <scope>
$TMUX is setRun tuicr-wrapper.sh /path/to/repo -- <scope>
$ZELLIJ is setRun tuicr-wrapper-zellij.sh /path/to/repo -- <scope>
$HERDR_ENV is 1Run tuicr-wrapper-herdr.sh /path/to/repo -- <scope>
None is setTell the user you are waiting for them to start tuicr in the repo, then attach with tuicr review list after they say it is ready

<scope> is -w for uncommitted working-tree changes or -r <revset> for a commit range — always pass one explicitly so the user is never left to pick staged/unstaged/commit-range manually in the TUI.

If more than one multiplexer marker is set, prefer the innermost multiplexer if that is clear; otherwise ask. cmux hosts a Ghostty terminal, so $TERM_PROGRAM reads ghostty inside cmux — check $CMUX_WORKSPACE_ID, not the terminal name.

tuicr supports both git and Jujutsu (jj) repositories, and jj workspaces may have no .git directory at all. Do not pre-check the directory with git rev-parse or refuse to launch because git does not recognize it; always run the wrapper and let it validate the repository.

Wrapper paths are relative to this skill directory:

bash
<skill-directory>/tuicr-wrapper-cmux.sh /path/to/repo -- -w
<skill-directory>/tuicr-wrapper.sh /path/to/repo -- -w
<skill-directory>/tuicr-wrapper-zellij.sh /path/to/repo -- -w
<skill-directory>/tuicr-wrapper-herdr.sh /path/to/repo -- -w

The Herdr wrapper requires jq to read pane IDs and completion results from Herdr's JSON responses.

Every wrapper accepts pass-through tuicr arguments after --, which is how you scope the review instead of leaving the scope selector for the user to fill in — for example -- -w for uncommitted working-tree changes or -- -r <revset> for a commit range. Always pass one of these explicitly when launching a review pane.

If your tool supports command timeouts, use a long timeout, such as 10 minutes, because the tmux, Zellij, and Herdr wrappers wait for the TUI to exit. The cmux wrapper is the exception: it returns as soon as the pane is running and prints the new surface ref between === TUICR SURFACE === markers. Capture that ref — it is how you close the pane later with cmux close-surface --surface <ref>. Once the TUI creates its active session, use tuicr review list --repo /path/to/repo to capture the slug. If your environment cannot run another command while a blocking wrapper is waiting, read the comments after the user exits tuicr.

Reconstruct The Diff

To review a patch yourself, rebuild the diff the user sees. The slug's source segment says which:

Slug segmentDiff
worktree/<head>, staged-and-unstaged/<head>git diff HEAD
staged/<head>git diff --cached
unstaged/<head>git diff
commits/<base>..<head>git diff <base>~1..<head>
pr/<n>gh pr diff <n>
pristinenone; every tracked file shown in full

Range endpoints are inclusive and printed oldest-first, so <base> without ~1 drops the first commit. Check the file count against the listing row's file_count; a mismatch means every line number you derive will be wrong.

Read User Comments

This is the main review loop for user-led review.

There is no push stream from tuicr to the agent. Read comments by running the CLI on demand. After the user says comments are ready, or after the TUI exits, run:

bash
tuicr review comments --repo /path/to/repo --session <slug>

The command emits JSON. Each comment includes fields like:

  • id
  • location
  • path
  • start_line
  • end_line
  • side
  • comment_type
  • author
  • lifecycle_state
  • content

Treat these comments as the user's review feedback:

  • issue: blocking problem to fix first
  • suggestion: consider implementing or explain why not
  • note: answer or acknowledge
  • praise: no action required

If you are waiting during an active review, poll this command about every 30 seconds and compare comment IDs with the previous result. Read immediately when the user says comments are ready. Stop polling once the user says the review is done or your tooling would block other work.

An empty result does not by itself mean the review didn't happen. On exit, tuicr always prints a line like tuicr-summary: reviewed 3/3 files, 0 comments added to stderr (visible in the pane's scrollback), and tuicr review list reports the same reviewed_count/file_count for the session. If reviewed_count equals file_count, zero comments is a legitimate "nothing to flag" outcome — treat the review as complete, don't ask the user to confirm. Only ask whether the user saved comments in the intended session, or whether another active session should be selected, when reviewed_count is less than file_count (the user quit before reviewing everything) or you can't find a tuicr-summary: line at all. If the review may have continued while you were working, rerun tuicr review comments before claiming completion.

Add Agent Comments

Only add comments when the workflow allows it and, for agent-authored review, after the user approves writing them into tuicr.

Defaults:

  • Prefer line comments when a specific file and line are known.
  • Use file comments for file-scoped feedback.
  • Use review-level comments only for whole-review summaries.
  • Use --type issue for problems by default.
  • Use suggestion, note, or praise when that better matches the intent.
  • Pass --username so agent comments are visually distinguishable.

Examples:

bash
tuicr review add --repo /path/to/repo --session <slug> \
  --target-file src/main.rs \
  --line 42 \
  --side new \
  --type issue \
  --username "Codex" \
  "Handle the empty case here."
bash
tuicr review add --repo /path/to/repo --session <slug> \
  --target-file src/main.rs \
  --type suggestion \
  --username "Codex" \
  "Consider splitting this file-level concern into a helper."

Omit --target-file for a review-level comment. Add --end-line for a range comment. Use --side old for removed lines and --side new for added or unchanged lines in the new file.

For structured input, use --input with literal JSON, @path/to/file.json, or - for stdin. Supported target types are review, file, line, and line_range. One object per call — an array is a parse error. The file key is file, not path. target.type is inferred from the fields present:

bash
tuicr review add --session <slug> --username "Codex" --input \
  '{"file":"src/main.rs","line":42,"side":"new","comment_type":"issue","content":"Handle the empty case."}'

Then verify. A line outside the diff stores, prints back, and exits 0, but never renders — invisible to the user, successful-looking to you. Re-read tuicr review comments and check each start_line exists on the side you gave (new for added or unchanged, old for removed). Check author to distinguish your comments from the user's, and keep the returned ids to identify the exact comments in later reads.

Legacy Export Output

Older wrapper-driven flows may emit:

text
=== TUICR INSTRUCTIONS ===
...
=== END TUICR INSTRUCTIONS ===

If present, process those instructions. Otherwise prefer tuicr review comments; it is the primary source of review feedback. If the wrapper mentions clipboard export, ask the user to paste it only when the CLI comments are unavailable.

Multiplexer Tips

cmux:

  • Switch panes: click the pane, or cmux focus-pane --pane <ref>
  • Close tuicr: press q; the pane closes itself. Force it with cmux close-surface --surface <ref>
  • List panes: cmux list-panes
  • Read a pane without focusing it: cmux read-screen --surface <ref>

tmux:

  • Switch panes: Ctrl-b then arrow keys
  • Close tuicr: press q
  • Resize panes: Ctrl-b then Ctrl-arrow
  • Zoom pane: Ctrl-b then z

zellij:

  • Switch panes: Alt + arrow keys
  • Close tuicr: press q
  • Resize panes: Ctrl-n, then arrow keys
  • Toggle fullscreen: Alt-f
  • Cycle stacked panes: Alt + [ / ]

Herdr:

  • Select a pane: click it in the Herdr UI
  • Close tuicr: press q; the wrapper then closes the review pane

Error Handling

SituationAction
Multiple plausible active sessionsAsk which session slug to use
No active session, cmux/tmux/Zellij/Herdr availableStart a new tuicr pane with the matching wrapper
No active session, no multiplexerTell the user you are waiting for them to start tuicr
cmux wrapper printed no surface refRun cmux list-panes to find the pane, or ask the user to start tuicr themselves
tuicr not installedTell the user to install tuicr
Not a repositoryAsk for the correct repo directory
Comments are empty, but reviewed_count == file_countTreat as a completed review with nothing to flag — don't ask
Comments are empty and reviewed_count < file_countConfirm the selected session or ask the user to save/add comments

When Not To Use

  • The user only wants raw git diff output.
  • The user explicitly asks for a non-tuicr review workflow.
  • The task is remote PR review and no tuicr PR session is involved.

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Tuicr AI skill do?

Use tuicr's review CLI to read and add comments in active TUI review sessions, and launch tuicr in cmux, tmux, Zellij, or Herdr when a user needs an interactive review pane.

Why use Tuicr on TypingMind?

Because you install it once and use it with any model. Tuicr is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Tuicr in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/agavra/tuicr/tree/main/skills/tuicr. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Tuicr?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Tuicr?

As many as you like. As long as a model supports skills, you can use Tuicr with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Tuicr AI skill free?

Yes. It is published on GitHub by agavra under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇