- TypeScript 100%
| config | ||
| docs/plans | ||
| extensions | ||
| scripts | ||
| .gitignore | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
pi-claude-style-tools
Claude Code inspired tool rendering for Pi — Shiki-powered diffs, status dots, branch connectors, file icons, and configurable output modes.
Features
- Compact built-in tool rendering for
read,bash,grep,find,ls,edit, andwrite - Claude-style OpenAI tool rendering for
apply_patchplus common Pi/OpenAI-style tools likewebfetch,web_search,fetch_content, task tools, and context tools apply_patchdiff previews that render parsed file patches in the call phase, similar toedit/write- Adaptive edit/write diffs with split or unified layouts, syntax highlighting, and inline word-level emphasis
- Diff stat bar with colored add/remove summary and hunk metadata
- Progressive collapsed diff hints that shorten on narrow terminals
- Thinking labels during streaming and final messages, with context sanitization
- Claude-style transcript grammar controls for assistant/thinking prefixes, message spacing, hidden thinking labels, and active working tips
- MCP-aware rendering with hidden, summary, and preview modes
- Configurable output modes for read, search, bash, and MCP results
- Transparent tool backgrounds in
transparentorbordermode - Theme-adaptive palette — borders, branch connectors, dim text, spinner accent, and diff backgrounds automatically follow the active pi theme (set
themeAdaptive: falseto keep the fixed Claude-style palette) - Transparent edit/write diffs with universal red/green diff colors
- Global border patch for all tool rows, including unknown/custom tools
Configuration
Set in .pi/settings.json or ~/.pi/settings.json:
{
"toolBackground": "border",
"readOutputMode": "preview",
"searchOutputMode": "preview",
"mcpOutputMode": "preview",
"previewLines": 8,
"bashOutputMode": "opencode",
"bashCollapsedLines": 10,
"diffCollapsedLines": 24,
"themeAdaptive": true,
"diffTheme": "github-dark",
"spinnerColor": "borderAccent",
"spinnerVerbs": ["Reviewing", "Polishing"],
"spinnerVerbMode": "append",
"messageStyle": "claude",
"assistantPrefix": "●",
"thinkingPrefix": "✻",
"messageSpacing": "comfortable",
"workingTipEnabled": true,
"workingTipText": "Run /install-github-app to tag @claude right from your GitHub issues and PRs",
"hiddenThinkingLabel": "Pondering..."
}
Theme integration
When themeAdaptive is true (default), the following colors are derived from the active pi theme on every render and re-derived whenever the theme changes:
| Element | Derived from |
|---|---|
| Tool outline borders (top/bottom rules) | borderMuted |
Branch connectors (├─, └─, │) |
dim (fallback: muted) |
| "✻ Worked for Ns" line | muted |
| Thinking-block italic gray | muted |
| Diff add/remove accents | toolDiffAdded / toolDiffRemoved |
| Diff background tints | mixed against toolSuccessBg base |
Spinner glyph + verb text (✻ Working…) |
borderAccent (fallback: accent) |
| Spinner status text | muted |
User-supplied diffTheme presets and diffColors overrides always win over theme-derived defaults. File-type icons (e.g. ts, py, rs) keep their language-identity colors and are not theme-derived.
Set themeAdaptive: false to keep the original fixed Claude-style palette regardless of the active pi theme.
Toggle at runtime with /cc-theme
/cc-theme # show current setting + theme name
/cc-theme status # show current setting + color preview (incl. spinner)
/cc-theme on # follow pi theme
/cc-theme off # keep fixed Claude palette
/cc-theme toggle # flip the current value
The selection is persisted to ~/.pi/settings.json and applied to the next rendered tool row. No restart required.
Repaint the spinner with /cc-spinner
The spinner glyph and verb text (e.g. ✻ Cooking…) share borderAccent by default so the working indicator reads as one unit. The status suffix (e.g. (thinking · ↓ 10 tokens · 2s)) follows muted. Use /cc-spinner to bind either text element to any other theme color key:
/cc-spinner preview # list every common theme key with a colored sample
/cc-spinner color <key> # change glyph + verb color together (e.g. thinkingHigh)
/cc-spinner verb <key> # alias for color, kept for older muscle memory
/cc-spinner status <key> # change the status suffix color
/cc-spinner reset # restore color defaults (spinner=borderAccent, status=muted)
/cc-spinner verbs list # show custom spinner verbs and append/replace mode
/cc-spinner verbs add Reviewing # add a custom verb or phrase
/cc-spinner verbs remove Reviewing # remove a custom verb or phrase
/cc-spinner verbs mode append # append custom verbs to the defaults
/cc-spinner verbs mode replace # use only custom verbs, with safe fallback to defaults
/cc-spinner verbs reset # remove user custom verbs and mode
Color selections are persisted as spinnerColor / spinnerStatusColor in ~/.pi/settings.json and applied on the next spinner tick. Older spinnerVerbColor settings still work as a backward-compatible alias. Custom verbs are persisted as spinnerVerbs and spinnerVerbMode; they are picked at the next turn start. /cc-spinner verbs ... writes user settings in ~/.pi/settings.json; project-level custom verbs can be set manually in .pi/settings.json. When both project and user spinner settings exist, the spinner reader applies project settings first and user settings second.
Tune assistant/thinking transcript chrome with /cc-message
/cc-message # show current message chrome settings
/cc-message style claude # screenshot-style transcript rhythm
/cc-message style classic # older package spacing/prefix behavior
/cc-message spacing comfortable # keep one blank line between paragraphs
/cc-message spacing compact # remove blank lines inside assistant/thinking blocks
/cc-message assistant-prefix ● # set assistant paragraph prefix
/cc-message thinking-prefix ✻ # set visible thinking prefix
/cc-message hidden-thinking-label Pondering...
/cc-message tip on # show active working tip line
/cc-message tip off # hide active working tip line
/cc-message tip text Run /help for tips # set active working tip text
/cc-message reset # restore message chrome defaults
messageStyle: "claude" trims leading/trailing blank render lines, collapses paragraph gaps, and aligns wrapped assistant/thinking lines under the message body, matching Claude Code's sparse transcript grammar. messageStyle: "classic" keeps the previous package behavior. The active working tip is rendered as a subordinate └─ Tip: line under the spinner when supported by the Pi loader.
Tool background modes
| Value | Behavior |
|---|---|
default |
Standard Pi tool backgrounds |
transparent |
Transparent tool backgrounds |
border |
Transparent backgrounds with top/bottom border lines |
Output modes
| Setting | Values | Default |
|---|---|---|
readOutputMode |
hidden, summary, preview |
preview |
searchOutputMode |
hidden, count, preview |
preview |
mcpOutputMode |
hidden, summary, preview |
preview |
bashOutputMode |
opencode, summary, preview |
opencode |
Numeric settings
| Setting | Default | Description |
|---|---|---|
previewLines |
8 |
Lines shown in collapsed preview mode |
expandedPreviewMaxLines |
4000 |
Max lines when fully expanded |
bashCollapsedLines |
10 |
Lines for collapsed bash output |
diffCollapsedLines |
24 |
Diff lines before collapsing |
Notes
This package targets recent Pi versions where tool renderers use:
renderCall(args, theme, context)renderResult(result, { expanded, isPartial }, theme, context)
Unknown/custom tools do not have a public global renderer hook in Pi, so this package patches container rendering to add top/bottom borders for all tool executions in border mode.
Credits
This project builds upon and was inspired by the excellent work of:
- @heyhuynhgiabuu/pi-pretty by huynhgiabuu — Pretty terminal output with syntax-highlighted file reads, colored bash output, and tree-view directory listings
- @heyhuynhgiabuu/pi-diff by huynhgiabuu — Shiki-powered terminal diff renderer with word-level diffs in split and unified views
- pi-tool-display by MasuRii — Compact tool call rendering, diff visualization, and output truncation