pi-claude-style-tools-aft
Claude Code-style tool rendering for Pi with complete AFT tool support, grouped rows, rich diffs, previews, and math rendering
Package details
Install pi-claude-style-tools-aft from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:pi-claude-style-tools-aft- Package
pi-claude-style-tools-aft- Version
1.0.66- Published
- Jul 10, 2026
- Downloads
- 131/mo · 131/wk
- Author
- aaalice233
- License
- MIT
- Types
- extension
- Size
- 337 KB
- Dependencies
- 2 dependencies · 3 peers
Pi manifest JSON
{
"extensions": [
"./extensions/index.ts",
"./extensions/spinner.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-claude-style-tools-aft
English | 简体中文
Claude Code-inspired tool rendering for Pi, extended with first-class AFT compatibility.
[!IMPORTANT] This repository is an AFT-compatible fork of FammasMaz/pi-cc-tools. It keeps the upstream visual experience while changing how core tools are integrated, so AFT can own tool execution and this extension can focus exclusively on presentation.
Contents
- Why this fork?
- Fork-specific highlights
- Installation
- Features inherited from upstream
- Configuration
- Notes
- Credits
Why this fork?
The upstream extension re-registers Pi's core tools to attach its renderers. That works when Pi's built-in implementations are the only backend, but it competes with AFT, which also replaces core tools such as read, write, edit, grep, and bash with its Rust-backed implementations. Whichever extension wins the name collision can unintentionally replace the other one's behavior.
This fork separates those responsibilities:
- AFT owns execution — its Rust backend, schemas, permissions, prompt metadata, indexing, formatting, diagnostics, and safety behavior remain untouched.
- This extension owns presentation — Claude-style rendering is injected at the TUI component layer without registering a second tool with the same name.
- Load order no longer matters — AFT can load before or after this extension without losing its tool implementations.
This fork vs. upstream
| Capability | Upstream pi-claude-style-tools |
This fork |
|---|---|---|
| Claude-style rendering for Pi built-ins | Yes | Yes |
| Core-tool integration | Re-registers core tools and delegates to Pi built-ins | Renderer-only; preserves the active backend |
| AFT core-tool execution | May be replaced by an extension name collision | Preserved unchanged |
| Dedicated AFT layouts | No | All 22 AFT 0.46 tools |
| Extension load order | Can affect which core implementation wins | AFT-compatible in either order |
| Future AFT tools | Generic custom-tool rendering | Structured aft_* / ast_grep_* / bash-control fallback |
| Upstream themes, diffs, grouping, spinner, MCP and OpenAI styling | Yes | Preserved |
Fork-specific highlights
- Complete AFT tool coverage — dedicated compact and expanded layouts for all 22 tools exposed by
@cortexkit/aft-pi0.46. - AFT-aware core renderers — understands
path,filePath, andfile_path, plusoldString/newString, append operations, batch edits, line-range edits, formatter outcomes, and LSP diagnostics. - Purpose-built result views — trees for outlines and call graphs, grouped semantic-search results, source-oriented zoom output, background task status, safety history, conflict summaries, and mutation diffs.
- Compact by default — collapsed rows show the action, target, counts, and state;
Ctrl+Oreveals full source, trees, terminal output, diagnostics, and diffs. - Forward-compatible fallback — unknown future AFT-family tools are summarized from structured
detailsor JSON content instead of dumping raw objects. - No AFT runtime dependency — AFT remains optional; Pi built-in tools keep the same Claude-style rendering when AFT is absent.
Supported AFT tools
| Category | Tools |
|---|---|
| Core replacements | read, write, edit, grep, bash |
| Background terminal | bash_status, bash_watch, bash_write, bash_kill |
| Reading and search | aft_outline, aft_zoom, aft_search, aft_inspect |
| Code relationships | aft_callgraph, aft_conflicts |
| Code mutations | aft_import, ast_grep_search, ast_grep_replace, aft_refactor |
| Files and recovery | aft_delete, aft_move, aft_safety |
Installation
Install AFT and this fork as separate Pi extensions from npm:
pi install npm:@cortexkit/aft-pi
pi install npm:pi-claude-style-tools-aft
To track the latest repository source instead, replace the second command with pi install git:github.com/Aaalice233/pi-claude-style-tools-aft.
If the upstream npm package is already installed, remove or disable it first so Pi does not load two copies of the display extension:
pi remove npm:pi-claude-style-tools
No extension ordering or additional AFT configuration is required. Compatibility has been verified locally with Pi 0.80.6 and @cortexkit/aft-pi 0.46.0, in both load orders.
Features inherited from upstream
- 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
- MCP-aware rendering with hidden, summary, and preview modes
- Configurable output modes for read, search, bash, and MCP results
- Live running previews that show a few output lines for active tool calls (latest lines for bash), persisting until the next tool/text activity
- Subagent completion notifications restyled to match the same Claude-style tool rows
- RTK rewrite integration that folds rewrite notices into the bash tool row with a muted
(RTK)badge and expanded-only rewrite details - 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) - Light Ghostty-sync themes — edit/write diffs use
github-lighthighlighting and light-tinted diff rows; tool pending dots use softer chrome colors - Transparent edit/write diffs with universal red/green diff colors
- Grouped consecutive tool calls with a compact status header and per-tool glance rows (set
groupToolCalls: falseto disable) - Extra detail toggle with
Ctrl+Shift+O, increasing expanded preview caps without making the default view heavy - 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,
"expandedPreviewMaxLines": 4000,
"extraExpandedPreviewMaxLines": 12000,
"extraToolOutputExpanded": false,
"groupToolCalls": true,
"bashOutputMode": "opencode",
"bashCollapsedLines": 10,
"liveToolPreview": true,
"liveToolPreviewLines": 5,
"diffCollapsedLines": 24,
"themeAdaptive": true,
"diffTheme": "github-dark"
}
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 |
|---|---|
| User box, tool rules, code fences | dim → muted → borderMuted → thinkingText |
Branch connectors (├─, └─, │) |
fixed rgb(72) by default (theme-independent); /cc-tools branch theme to follow pi theme |
| "✻ Turn took Ns" line (final message only, with session total + turn count) | muted |
| Thinking-block italic gray | muted |
| Diff add/remove accents | toolDiffAdded / toolDiffRemoved |
| Diff background tints | mixed against toolSuccessBg base |
Spinner 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.
On /resume, /new, or /fork, tool chrome is rebound from the current pi theme (no coupling to Ghostty or other theme extensions). If you use Ghostty sync, listing it above this extension in settings.json is recommended so setTheme runs before chrome rebind.
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 itself is still colored by pi's loader using accent, while the verb text (e.g. Cooking…) follows borderAccent by default so it stays lively without being the exact same color as the glyph. 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 verb <key> # change the verb color (e.g. thinkingHigh, mdHeading)
/cc-spinner status <key> # change the status suffix color
/cc-spinner reset # restore defaults (verb=borderAccent, status=muted)
The selection is persisted as spinnerVerbColor / spinnerStatusColor in ~/.pi/settings.json and applied on the next spinner tick.
Tool background modes
| Value | Behavior |
|---|---|
default |
Standard Pi tool backgrounds |
transparent |
Transparent tool backgrounds |
border |
Transparent backgrounds with top/bottom border lines |
Use /cc-tools to control tool UI at runtime:
/cc-tools status # show style, grouping, and extra-detail state
/cc-tools outlines # tool style: outlines, transparent, or default
/cc-tools group toggle # toggle grouped adjacent/concurrent tool calls
/cc-tools group off # disable grouping (also ungroups current grouped rows)
/cc-tools detail toggle # same mode as Ctrl+Shift+O
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 |
Display settings
| Setting | Default | Description |
|---|---|---|
previewLines |
8 |
Lines shown in collapsed preview mode |
expandedPreviewMaxLines |
4000 |
Max lines when expanded with Ctrl+O |
extraExpandedPreviewMaxLines |
12000 |
Max lines after Ctrl+Shift+O extra-detail mode |
extraToolOutputExpanded |
false |
Start with Ctrl+Shift+O extra-detail mode enabled |
groupToolCalls |
true |
Group adjacent/concurrent tool calls under a compact status header |
bashCollapsedLines |
10 |
Lines for collapsed bash output |
liveToolPreview |
true |
Show a small live output preview while tools are still running |
liveToolPreviewLines |
5 |
Lines shown in the collapsed live preview |
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.
AFT compatibility internals
The display layer recognizes AFT's hoisted core implementations without wrapping or replacing their definitions. For AFT-specific tools it selects a dedicated renderer by tool name, while unknown future aft_*, ast_grep_*, and AFT bash-control tools use the structured fallback path.
This design is intentionally presentation-only: tool arguments and results are read for display, but the extension never modifies AFT's execute function, parameter schema, permission checks, prompt guidance, or returned data.
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