{"slug": "review-your-ai-s-code-before-it-ever-hits-github-tuicr-gh-dash-claude-code-cli", "title": "Review Your AI's Code Before It Ever Hits GitHub: tuicr + gh-dash + Claude Code / Copilot CLI", "summary": "A new workflow using tuicr, gh-dash, and Claude Code or GitHub Copilot CLI enables developers to review AI-generated code locally before pushing to GitHub, preventing unreviewed agent output from reaching teammates. tuicr, a Rust-based terminal UI with vim keybindings, allows line-level comments and can push reviews to GitHub or return structured markdown to the agent for fixes, while gh-dash provides a terminal dashboard for tracking and merging PRs. The workflow addresses the accountability gap in agent-driven development by making the developer the first line of defense.", "body_md": "# Review Your AI's Code Before It Ever Hits GitHub: tuicr + gh-dash + Claude Code / Copilot CLI\n\nAI coding agents have changed *who* writes most of the code in my PRs — but they haven't changed *who is accountable*for it. The weakest point in an agent-driven workflow is the moment between \"the agent says it's done\" and \"I open a pull request.\" Pushing unreviewed agent output to GitHub and reviewing it there means my teammates become the first line of defense against my agent's mistakes.\n\nThis post describes a workflow that fixes that, using two terminal tools:\n\n— a TUI for code review with vim keybindings. It renders a GitHub-style diff in your terminal, lets you leave line-level comments, and can either push a real PR review to GitHub or hand structured markdown back to your coding agent.**tuicr**— a** gh-dash**`gh`\n\nCLI extension that gives you a rich terminal dashboard for PRs and issues, so the GitHub side of the loop never requires a browser either.\n\nThe loop looks like this:\n\n```\nClaude Code / Copilot CLI writes code\n        │\n        ▼\ntuicr: I review the diff locally, leave inline comments\n        │\n        ├── comments flow back to the agent → agent fixes → re-review\n        │\n        ▼\ncommit + push + PR (created by the agent via gh)\n        │\n        ▼\ngh-dash: track, check out, re-review, and merge PRs — all in the terminal\n```\n\nBoth DevOps Toolbox videos that inspired this post are worth watching: [The Holy Grail of Code Review TUIs](https://www.youtube.com/watch?v=6cqVzgVQJfE&ref=corti.com) covers tuicr and the agent review loop, and [I'm never going back to GitHub UI ever again.](https://www.youtube.com/watch?v=Z-3dUHDnkEI&ref=corti.com) covers gh-dash.\n\n## Part 1: Install the tooling\n\n### tuicr\n\ntuicr is a single static binary (written in Rust). Pick one:\n\n```\n# install script\ncurl -fsSL tuicr.dev/install.sh | sh\n\n# Homebrew\nbrew install agavra/tap/tuicr\n\n# Cargo\ncargo install tuicr\n\n# mise / nix\nmise use github:agavra/tuicr\nnix run github:agavra/tuicr\n```\n\nIt auto-detects git, jj, and Mercurial repos. For the GitHub integration (`:submit`\n\n, `tuicr pr <n>`\n\n) you need an authenticated `gh`\n\nCLI; for GitLab, `glab`\n\n.\n\n### gh-dash\n\ngh-dash is a `gh`\n\nextension, so the GitHub CLI is a prerequisite:\n\n```\nbrew install gh          # or your platform's package manager\ngh auth login\ngh extension install dlvhdr/gh-dash\n```\n\nInstall a Nerd Font for the icons (e.g. `brew install --cask font-fira-code-nerd-font`\n\n) and set it in your terminal. Then run:\n\n```\ngh dash\n```\n\n### An agent CLI\n\nEither (or both):\n\n```\nnpm install -g @anthropic-ai/claude-code   # Claude Code\nnpm install -g @github/copilot             # GitHub Copilot CLI\n```\n\n## Part 2: The core skill — reviewing agent output with tuicr\n\ntuicr can review anything a diff can describe:\n\n```\ntuicr                  # interactive commit selector\ntuicr -w               # uncommitted working-tree changes  ← the agent-review sweet spot\ntuicr -r main..HEAD    # a commit range\ntuicr pr 125           # a GitHub PR (via gh)\ntuicr mr 125           # a GitLab MR (via glab)\n```\n\n`tuicr -w`\n\nis the one I use most: the agent has just finished editing, nothing is committed, and I want to read every hunk before anything becomes permanent.\n\nNavigation is vim-native: `j`\n\n/`k`\n\nto scroll, `Ctrl-d`\n\n/`Ctrl-u`\n\nfor half-pages, `{`\n\n/`}`\n\nto jump between files, `[`\n\n/`]`\n\nbetween hunks, `g`\n\n/`G`\n\nfor top/bottom, `/`\n\nto search, `{N}G`\n\nto jump to a line. `?`\n\nshows help.\n\nCommenting mirrors the GitHub PR review model:\n\n| Key | Action |\n|---|---|\n`c` | Comment on the current line |\n`v` / `V` then `c` | Select a range, comment on it |\n`C` | File-level comment |\n`;c` | Review-level (overall) comment |\n\nEach comment gets a classification — **issue**, **suggestion**, **note**, or **praise** — which matters later, because the agent can prioritize issues over notes.\n\nWhen the review is done, tuicr has three export targets:\n\n— pushes your inline comments to GitHub (or GitLab) as a**:submit*** real*PR review, through the authenticated`gh`\n\n/`glab`\n\nCLI.— pipes the review as markdown to stdout for scripting or CI.`--stdout`\n\n** y or :clip** — copies a structured markdown block to the clipboard, with numbered comments anchored to files and lines:\n\n```\nI reviewed your code and have the following comments. Please address them.\n\n1. `src/auth.rs` - Consider adding unit tests\n2. `src/auth.rs:42` - Magic number should be a named constant\n3. `src/auth.rs:50-55` - This block could be refactored\n```\n\nPaste that straight into Claude Code, Copilot CLI, Codex, or Cursor and the agent has precise, addressable feedback.\n\ntuicr also tracks review sessions across invocations: revisit a PR and it preselects only the commits you haven't reviewed yet.\n\n## Part 3: The skills — wiring tuicr into Claude Code and Copilot CLI\n\nThis is where the workflow stops being copy/paste and becomes a closed loop. The tuicr repository ships an **agent skill** at [ skills/tuicr/SKILL.md](https://github.com/agavra/tuicr/blob/main/skills/tuicr/SKILL.md?ref=corti.com). Skills are the (now cross-vendor)\n\n`SKILL.md`\n\nconvention: a directory containing a markdown file with YAML frontmatter (`name`\n\n, `description`\n\n) plus instructions that get injected into the agent's context when the skill is invoked.### What the tuicr skill teaches the agent\n\nThe skill's description: *\"Use tuicr's review CLI to read and add comments in active TUI review sessions, and launch tuicr in tmux, Zellij, or Herdr when a user needs an interactive review pane.\"*\n\nConcretely, it instructs the agent to:\n\n**Launch tuicr in a split pane** of your terminal multiplexer (tmux, Zellij, or Herdr) when you ask for a review — so the diff opens next to the agent's chat, not instead of it. If no multiplexer is running, the agent asks you to launch tuicr manually.**Not** reach for tuicr for raw`git diff`\n\nquestions or when you've asked for a different workflow.\n\n**Distinguish two review modes**: a *user-led* review, where you write the comments and the agent only retrieves them; and an *agent review*, where the agent critiques an AI-generated patch itself and — after confirming with you — adds its own findings into the session:\n\n```\ntuicr review add --repo /path/to/repo --session <slug> \\\n  --target-file src/auth.rs --line 42 --type issue \\\n  --username \"Claude\" \"Magic number should be a named constant\"\n```\n\n**Poll your comments** (roughly every 30 seconds during an active review) and pull them in without you copying anything:\n\n```\ntuicr review comments --repo /path/to/repo --session <slug>\n```\n\nComments come back with path, line numbers, classification, and lifecycle state.\n\n**Attach to existing sessions** rather than spawning duplicates:\n\n```\ntuicr review list --repo /path/to/repo   # sessions for this repo\ntuicr review list --all                  # all sessions\n```\n\n### Installing the skill for Claude Code\n\nClaude Code discovers skills in `.claude/skills/`\n\n(per-project) or `~/.claude/skills/`\n\n(personal). Copy the skill out of the tuicr repo:\n\n```\ngit clone --depth 1 https://github.com/agavra/tuicr /tmp/tuicr\nmkdir -p ~/.claude/skills\ncp -r /tmp/tuicr/skills/tuicr ~/.claude/skills/tuicr\n```\n\nInside Claude Code, the skill triggers automatically when you ask for a review, or explicitly with `/tuicr`\n\n. A session then looks like:\n\n```\n> Refactor the auth module to remove the session-token duplication.\n  ... agent edits files ...\n> /tuicr — open a review of your changes\n  ... tuicr opens in a tmux split with the working-tree diff ...\n```\n\nYou review in the right pane with full vim navigation, drop `c`\n\ncomments as you go, and the agent picks them up and starts fixing — no clipboard involved. Re-run the review until the diff is clean.\n\n### Installing the skill for Copilot CLI\n\nCopilot CLI reads the same `SKILL.md`\n\nformat from several locations — and notably, ** .claude/skills is one of them**, so a repo-level skill serves both agents at once. Per\n\n[GitHub's docs](https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/add-skills?ref=corti.com):\n\n- Project-level:\n`.github/skills/`\n\n,`.claude/skills/`\n\n,`.agents/skills/`\n\n- Personal:\n`~/.copilot/skills/`\n\n,`~/.agents/skills/`\n\nEither copy the directory:\n\n```\nmkdir -p ~/.copilot/skills\ncp -r /tmp/tuicr/skills/tuicr ~/.copilot/skills/tuicr\n```\n\nor use the built-in management commands:\n\n```\ncopilot skill add /tmp/tuicr/skills/tuicr   # from a file, URL, or directory\ncopilot skill list\n```\n\nInside a Copilot CLI session, `/skills list`\n\nshows what's loaded, `/skills reload`\n\nrefreshes mid-session, and `/tuicr`\n\ninvokes the skill explicitly — same slash-name convention as Claude Code.\n\n### Related skills on the GitHub side\n\nTwo adjacent facts worth knowing while you're setting this up:\n\n- Anthropic maintains a public catalog of agent skills at\n[anthropics/skills](https://github.com/anthropics/skills?ref=corti.com), and GitHub curates Copilot-flavored ones in[github/awesome-copilot](https://github.com/github/awesome-copilot/blob/main/docs/README.skills.md?ref=corti.com)— the same`SKILL.md`\n\nformat throughout. - As of July 29, 2026,\n**Copilot code review on github.com also reads agent skills** from`.github/skills/`\n\n([GA announcement](https://github.blog/changelog/2026-07-29-copilot-code-review-agent-skills-and-mcp-now-generally-available/?ref=corti.com)). So a coding-standards skill you write for the local loop can double as review context for Copilot's server-side PR reviews.\n\n## Part 4: The full loop, end to end\n\nHere's the workflow I run, with Claude Code as the example (Copilot CLI is symmetric):\n\n**1. Start in tmux.** The skill needs a multiplexer to open the review pane:\n\n```\ntmux new -s feature-auth\nclaude\n```\n\n**2. Let the agent build.** Describe the task; the agent edits the working tree.\n\n**3. Review before anything is committed.** Ask for a review (or `/tuicr`\n\n). tuicr opens in a split with `-w`\n\nsemantics — the uncommitted diff. Read every hunk. Mark real problems as `issue`\n\n, style thoughts as `suggestion`\n\nor `note`\n\n, and yes, use `praise`\n\n— it tells the agent what to preserve.\n\n**4. Let the comments flow back.** The agent polls the session, reads your classified comments, and fixes. Repeat 3–4 until you'd sign your name to the diff. (Without the skill, the manual fallback is `y`\n\nin tuicr and paste into the chat — same information, more friction.)\n\n**5. Ship it.** Have the agent commit and open the PR:\n\n```\n> Commit this as \"refactor(auth): deduplicate session token handling\"\n  and open a PR against main using gh.\n```\n\n**6. Manage the PR in gh-dash.** Run `gh dash`\n\n. Your dashboard is driven by `~/.config/gh-dash/config.yml`\n\n, where sections are just GitHub search filters:\n\n```\nprSections:\n  - title: My Pull Requests\n    filters: is:open author:@me\n  - title: Needs My Review\n    filters: is:open review-requested:@me\n  - title: Agent PRs\n    filters: is:open author:@me label:ai-assisted\n```\n\nWith a PR selected, the defaults cover the whole lifecycle: `d`\n\nshows the diff in your pager, `C`\n\nchecks the PR out locally (`gh pr checkout`\n\n), `c`\n\ncomments, `v`\n\napproves, `u`\n\nupdates the branch, `w`\n\nwatches checks (`gh pr checks --watch`\n\n), `W`\n\nmarks ready-for-review, `m`\n\nmerges, `x`\n\n/`X`\n\nclose/reopen, `a`\n\n/`A`\n\nassign/unassign. Since v3.10.0, mutating commands prompt for confirmation.\n\n**7. Close the loop: launch tuicr from gh-dash.** gh-dash lets you bind keys to arbitrary shell commands with template variables — which means one keystroke can take you from a PR row in the dashboard into a full tuicr review of that PR:\n\n```\nkeybindings:\n  prs:\n    - key: T\n      name: review in tuicr\n      command: >\n        cd {{.RepoPath}} && tuicr pr {{.PrNumber}}\n```\n\nNow reviewing a teammate's (or your own agent's) PR is: `gh dash`\n\n→ arrow to the PR → `T`\n\n→ vim-review → `:submit`\n\n. The review lands on GitHub as real inline comments, and you never opened a browser.\n\n## Why this ordering matters\n\nThe point of this stack is *where* the review happens. Reviewing in the terminal, before the push, means:\n\n**The agent's first draft is never the PR.** Reviewers on GitHub see code that has already survived a line-by-line human pass.**Feedback is structured, not vibes.** Classified, line-anchored comments are something an agent can act on deterministically — \"fix issues 1 and 3, skip note 2\" works.**The tools compose instead of competing.** tuicr owns the diff-and-comment loop;`gh`\n\n/gh-dash own the GitHub state machine; the skill file is the only glue, and the same`SKILL.md`\n\nserves Claude Code, Copilot CLI, and (in`.github/skills/`\n\n) even Copilot's server-side code review.\n\nAccountability for AI-generated code shouldn't be outsourced to your teammates' patience. With tuicr and gh-dash, the review moves to the cheapest possible point — your own terminal, before the push — and the agents are wired to listen.\n\n## References\n\n- tuicr —\n[tuicr.dev](https://tuicr.dev/?ref=corti.com)·[github.com/agavra/tuicr](https://github.com/agavra/tuicr?ref=corti.com)·[skills/tuicr/SKILL.md](https://github.com/agavra/tuicr/blob/main/skills/tuicr/SKILL.md?ref=corti.com) - gh-dash —\n[gh-dash.dev](https://www.gh-dash.dev/getting-started/?ref=corti.com)·[selected-PR keybindings](https://www.gh-dash.dev/getting-started/keybindings/selected-pr/?ref=corti.com)·[custom keybindings](https://www.gh-dash.dev/configuration/keybindings/?ref=corti.com) - Copilot CLI agent skills —\n[GitHub Docs](https://docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/add-skills?ref=corti.com) - Copilot code review skills GA —\n[GitHub Changelog, 2026-07-29](https://github.blog/changelog/2026-07-29-copilot-code-review-agent-skills-and-mcp-now-generally-available/?ref=corti.com)", "url": "https://wpnews.pro/news/review-your-ai-s-code-before-it-ever-hits-github-tuicr-gh-dash-claude-code-cli", "canonical_source": "https://corti.com/review-your-ais-code-before-it-ever-hits-github-tuicr-gh-dash-claude-code-copilot-cli/", "published_at": "2026-08-02 07:27:03+00:00", "updated_at": "2026-08-02 07:40:06.352070+00:00", "lang": "en", "topics": ["developer-tools", "ai-agents", "ai-tools"], "entities": ["tuicr", "gh-dash", "Claude Code", "GitHub Copilot CLI", "GitHub", "GitLab", "agavra", "dlvhdr"], "alternates": {"html": "https://wpnews.pro/news/review-your-ai-s-code-before-it-ever-hits-github-tuicr-gh-dash-claude-code-cli", "markdown": "https://wpnews.pro/news/review-your-ai-s-code-before-it-ever-hits-github-tuicr-gh-dash-claude-code-cli.md", "text": "https://wpnews.pro/news/review-your-ai-s-code-before-it-ever-hits-github-tuicr-gh-dash-claude-code-cli.txt", "jsonld": "https://wpnews.pro/news/review-your-ai-s-code-before-it-ever-hits-github-tuicr-gh-dash-claude-code-cli.jsonld"}}