A keyboard-driven TUI (Terminal User Interface) for high-velocity GitHub issue triage, powered by Warp's Cloud Agents.
🎨 Vibe coded by @zachlloyd
Quick setup guide: warpdotdev/power-fixer-setup
- Rust - Install via rustup
- GitHub CLI -
brew install ghthengh auth login - gcloud CLI -
brew install google-cloud-sdkthengcloud auth login(for IAP-protected Cloud Run) - PowerFixer Server - Running locally or remotely and reachable from this client (production setup assumes Google Cloud / Cloud Run)
# Install the binary
cargo install --git https://github.com/warpdotdev/power-fixer.git
# Run it
power-fixerBy default, the client uses POWERFIXER_SERVER_URL (or http://localhost:3001 if unset). For GCP deployments, set POWERFIXER_SERVER_URL to your Cloud Run URL.
PowerFixer will notify you on the home screen when a new version is available. To update:
cargo install --git https://github.com/warpdotdev/power-fixer.git --forcepower-fixer # Connect to POWERFIXER_SERVER_URL (or localhost default)
power-fixer --local # Connect to localhost:3001 (for local dev)
power-fixer --help # Show all optionsIf you want to run the server locally or contribute to PowerFixer:
- PowerFixer Server - Run
power-fixer-serverlocally or point to a deployed instance - (Optional) oz CLI - For local agent execution mode (
POWERFIXER_LOCAL_AGENT_BIN, default:oz)
# Clone and build
git clone https://github.com/warpdotdev/power-fixer.git
cd power-fixer
# Run with the helper script
./script/run --local
# Or build and run directly
cargo build --release
./target/release/power-fixer --local- The app loads untriaged issues from
POWERFIXER_DEFAULT_REPO(default:owner/repo) - Use
↑/↓to select an action,Enterto execute - Press
/to open the command menu for global actions:- Filter - Change issue filter (untriaged, waiting-user, etc.)
- Agents - View agent-assigned issues dashboard
- Power Triage - Launch batch AI triage on multiple issues
- Press
tto translate non-English issues - Press
qto quit
| Key | Action |
|---|---|
/ |
Open command menu |
t |
Translate current issue |
j/k |
Scroll issue details |
Enter |
Execute selected action |
q |
Quit |
Power Fixer is built for engineers who need to rapidly triage, investigate, and resolve large volumes of GitHub issues. It combines a fast terminal interface with AI-powered automation to help you:
- Triage at scale: Process issues quickly with keyboard shortcuts and streamlined workflows
- Automate fixes: Launch Oz Cloud Agents to investigate and fix issues automatically
- Collaborate: Post to Slack channels and @mention team members directly from the TUI
- Deduplicate: Use AI to identify and close duplicate issues
- Track state: Label-based workflow keeps issues organized across triage states
- Filter views: Switch between Untriaged, Triaged, Waiting for User, Waiting for Warper, Agent Assigned, and Closed issues
- Smart sorting: Issues sorted by last updated time
- Full context: View issue body, labels, comments, and metadata in-app
- Quick actions: Comment, close, label, and skip with minimal keystrokes
- Launch Cloud Agents: Assign Oz Cloud Agents to investigate and fix issues via the Warp Platform API
- Custom prompts: Add additional context when launching agents
- Real-time status: Poll agent task status (Queued → In Progress → Succeeded/Failed)
- Session links: Direct links to agent sessions for monitoring
- Retry failed tasks: Re-launch agents on failed issues with one keystroke
- Agent dashboard: View all agent-assigned issues with their current status
- AI-powered search: Launch an agent to find potential duplicates using semantic analysis
- Review UI: Interactive interface to select canonical issue and mark duplicates
- Bulk close: Close multiple duplicates with proper linking comments
- Post to channels: Share issues to feedback channels (#feedback-code-ux, #feedback-agents-ux, #feedback-quality, #feedback-revenue, #feedback-core-bugs, #feedback-warp-3)
- Add context: Include comments when posting to Slack
- User mentions: Autocomplete @mentions for Slack users
- Agent metadata: Optionally include agent session links in Slack posts
To enable Slack integration, you need a Slack bot token with the following scopes:
chat:write- Post messages to channelsusers:read- Fetch user list for @mention autocompletechannels:read- List available channels
Set the token as an environment variable:
export SLACK_BOT_TOKEN=xoxb-your-slack-bot-tokenThe bot must be invited to any channel you want to post to.
- Post-action flow: After agent launch or other actions, optionally add labels, comments, or send to Slack
- Team @mentions: Autocomplete for Warp team members when writing GitHub comments
- Label management: Apply pf: labels to track triage state (pf:waiting-user, pf:waiting-warper)
- Rust - For building the application
- GitHub CLI (
gh) - Must be authenticated with access to your repo - PowerFixer Server - Reachable via
POWERFIXER_SERVER_URL(or--server), with production deployments expected on Google Cloud (Cloud Run) - (Optional for IAP)
POWERFIXER_IAP_AUDIENCE(and optionallyPOWERFIXER_IAP_SERVICE_ACCOUNT) for automatic gcloud identity-token auth - GitHub Token -
GITHUB_TOKENmust be set - (Optional) Slack Bot Token -
SLACK_BOT_TOKENenv var for Slack integration - (Optional) oz CLI - For local agent mode
cargo build --release
./target/release/power-fixerCreate a .env file in the project directory (see .env.example):
# Required
GITHUB_TOKEN=ghp_...
POWERFIXER_DEFAULT_REPO=owner/repo
POWERFIXER_SERVER_URL=https://your-service-xyz-uc.a.run.app
# Optional auth token for server requests
POWERFIXER_AUTH_TOKEN=your_token_here
# Optional IAP auto-auth (recommended for IAP-protected Cloud Run)
POWERFIXER_IAP_AUDIENCE=/projects/123456789/global/backendServices/123456789
POWERFIXER_IAP_SERVICE_ACCOUNT=power-fixer-cli@your-project.iam.gserviceaccount.com
POWERFIXER_IAP_HOST_SUFFIX=.a.run.app
# Optional - enables Slack posting and @mentions
SLACK_BOT_TOKEN=xoxb-your-slack-bot-token
# Optional gcloud secret loading in ./script/run
POWERFIXER_GCP_PROJECT=your-gcp-project
POWERFIXER_SLACK_SECRET_NAME=powerfixer-slack-bot-token
# Optional update UI hints
POWERFIXER_UPDATE_REPO=warpdotdev/power-fixer
POWERFIXER_INSTALL_HINT="cargo install --git https://github.com/warpdotdev/power-fixer.git --force"
# Optional local agent binary
POWERFIXER_LOCAL_AGENT_BIN=ozcargo runThe app starts by fetching untriaged issues from POWERFIXER_DEFAULT_REPO.
Issue View:
↑/↓- Navigate actionsj/k- Scroll issue detailsEnter- Execute selected actionf- Change filter (switch issue views)a- View agent-assigned issues dashboardq- Quit
Actions:
- Next - Move to next issue (optionally apply label first)
- Comment - Add comment with optional label (close, waiting-user, waiting-warper)
- Agent - Launch Cloud Agent to fix the issue
- DeDupe - Search for and close duplicate issues
- Slack - Post issue to a feedback channel
Comment Input:
@- Trigger team member autocompleteTab- Complete selected mention↑/↓- Navigate suggestionsEnter- Submit commentEsc- Cancel
Agent Dashboard:
↑/↓- Navigate issuess- Sync/refresh task statuses from APIr- Retry failed agent taskc- Copy session URL to clipboardt- Copy task ID to clipboardEsc- Return to main view
DeDupe Review:
↑/↓- Navigate duplicate candidatesd- Toggle duplicate selectionc- Make selected issue the canonical (keep open)Enter- Execute (close selected duplicates)Esc- Cancel
The TUI client stores no persistent state locally. All agent and triage state is managed by the PowerFixer Server (see power-fixer-server repository) and synced via:
- Initial HTTP fetch at startup (
GET /api/v1/state) - Real-time WebSocket updates for state changes
The TUI maintains an in-memory cache for instant UI rendering.
See userflows.md for comprehensive navigation diagrams showing all screens and transitions.
src/
├── main.rs # TUI app entry, CLI args, event loop
├── lib.rs # Library crate exports
├── utils.rs # Utilities (clipboard, logging)
├── app/
│ ├── state.rs # Application state and data structures
│ ├── handlers.rs # Keyboard input handlers
│ ├── ui.rs # ratatui rendering
│ ├── background.rs # Background task spawning
│ └── theme.rs # Color theme support (light/dark/auto)
├── server/
│ ├── client.rs # HTTP client for PowerFixer Server API
│ ├── websocket.rs # WebSocket client for real-time updates
│ ├── types.rs # Request/response types for server API
│ └── ws_types.rs # WebSocket message types (shared with server)
├── services/
│ ├── github.rs # GitHub CLI wrapper (issues, comments, labels)
│ └── slack.rs # Slack API integration
└── features/
└── triage.rs # Batch triage orchestration
The TUI requires the PowerFixer Server to be running. The server handles:
- Agent status callbacks from Oz cloud agents
- Real-time WebSocket updates to all connected TUI clients
- Persistent state storage in PostgreSQL
See the power-fixer-server repository for server setup and deployment.
Power Fixer uses pf: prefixed labels on GitHub for visibility:
- No pf: label → Untriaged (default view)
- pf:waiting-user → Waiting for reporter response
- pf:waiting-warper → Assigned to a Warp engineer
- pf:triaged → Issue has been examined, possibly commented on, with no further action needed at this time
Agent assignment and other states are tracked in the database, not via GitHub labels.
Internal development continues in private repositories. The open-source repository mirrors selected releases and changes.