{"id":50218075,"url":"https://github.com/zac15987/zpit","last_synced_at":"2026-05-26T10:03:07.044Z","repository":{"id":346370499,"uuid":"1186337281","full_name":"zac15987/zpit","owner":"zac15987","description":"TUI-based AI development cockpit that orchestrates Claude Code agents across projects with automated issue lifecycle, cross-agent channel communication, and a 5-layer safety system.","archived":false,"fork":false,"pushed_at":"2026-05-19T05:22:03.000Z","size":1710,"stargazers_count":3,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-19T05:51:52.977Z","etag":null,"topics":["ai-agents","automation","bubble-tea","claude-code","cli","code-review","developer-tools","forgejo","github","go","tui","worktree"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zac15987.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-19T14:18:39.000Z","updated_at":"2026-05-05T09:18:15.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/zac15987/zpit","commit_stats":null,"previous_names":["zac15987/zpit"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/zac15987/zpit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zac15987%2Fzpit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zac15987%2Fzpit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zac15987%2Fzpit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zac15987%2Fzpit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zac15987","download_url":"https://codeload.github.com/zac15987/zpit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zac15987%2Fzpit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33514912,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T03:12:49.672Z","status":"ssl_error","status_checked_at":"2026-05-26T03:12:47.976Z","response_time":63,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agents","automation","bubble-tea","claude-code","cli","code-review","developer-tools","forgejo","github","go","tui","worktree"],"created_at":"2026-05-26T10:03:05.731Z","updated_at":"2026-05-26T10:03:07.034Z","avatar_url":"https://github.com/zac15987.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Zpit\n\n**Zpit** (zac + cockpit) — a TUI-based AI development cockpit that orchestrates [Claude Code](https://claude.ai/code) agents across multiple projects. Zpit acts as a **dispatch center** — it selects projects, launches agents in separate terminal windows, monitors their progress, coordinates the full issue lifecycle from requirement clarification to PR, and enables real-time cross-agent communication via a built-in HTTP broker + MCP channel.\n\n\u003e **Key principle:** Claude Code runs in independent terminal windows. Zpit never wraps or embeds it — it monitors via session logs, coordinates via issue trackers, and bridges agents via a local channel broker.\n\n## TUI Preview\n\n### Main View\n\nFour independently scrollable dock panels — Projects, Active Terminals, Loop Engine (left column, stacked), Hotkeys (right column). Catppuccin Mocha palette with a single-column `▎` mauve bar marking the focused panel.\n\n```\n Zpit v0.1                                            04/19 15:04  Windows Terminal\n\n\n▎ PROJECTS  7                                         HOTKEYS\n  ──────                                              ──────\n  › AI Inspection Cleaning Demo  ⚪ not deployed     [Enter] Launch Claude Code\n     machine │ wpf, ethercat, basler                  [c] Clarify requirement\n                                                      [l] Loop auto-implement\n    ENR DUC  ⚪ not deployed                          [r] Review changes\n     machine │ wpf, secsgem                           [f] Efficiency agent\n                                                      [s] Status overview\n    DisplayProfileManager  ⚪ not deployed            [o] Open project folder\n     desktop │ wpf, nlog                              [i] Open Issue Tracker\n                                                      [p] Open PR\n    Zpit  🟢 deployed                                 [u] Undeploy agents\n     terminal │ go, bubbletea                         [d] Redeploy all agents\n                                                      [m] Channel communication\n    Zplex  ⚪ not deployed                             [g] Git status\n     desktop │ go, electron, xterm                    [G] Open lazygit\n                                                      [U] Run claude update\n    Zacfuse  🟢 deployed                              [a] Add project\n     web │ astro, typescript, docs                    [e] Edit config\n                                                      [x] Close Terminal\n                                                      [Tab] Switch Panel\n  ACTIVE TERMINALS  1                                 [?] Help\n  ──────                                              [q] Quit\n  ›[1] Zpit │ 🟡 Waiting for input 00:15\n      Q: Commit 2198be6 pushed to `origin/dev`, working tre\n\n\n  Press ? for help, q to quit\n```\n\nTab cycles focus between Projects → Active Terminals (when any) → Loop Engine (when any slot exists); Hotkeys stays docked to the right as read-only reference. `↑↓/PgUp/PgDn` scroll the focused panel only; mouse wheel scrolls whichever panel the cursor hovers. Below ~40 cols the left/right widths auto-shrink, but Hotkeys never drops below the other panels.\n\n### Status View\n\n```\n Zpit v0.1                                        03/27 14:04  Windows Terminal\n\n\n  Issues — AI Inspection Cleaning Demo\n  ────────────────────────────────────────────────────────────\n\n › #25   [pending] feat(manual-control): Safety Interlock + Soft Limit + Reset Zero\n\n\n\n\n  [y] Confirm (pending→todo)  [i] Open in browser  [Esc] Back\n```\n\n## How It Works\n\n```\nYou (TUI)                    Claude Code Agents\n    │\n    ├─ [c] Clarify ──────────► Clarifier agent (new terminal)\n    │   requirement              asks questions, creates structured issue\n    │   (press multiple times)   agents auto-discover via agent_type, enter Facilitator/Advisor meeting mode\n    │\n    ├─ [l] Loop ──────────────► Coding agent (worktree + new terminal)\n    │   auto-implement           implements, commits, opens PR\n    │        │\n    │        └─ PR appears ───► Reviewer agent (same worktree)\n    │             │              checks AC, writes review report\n    │             ├─ PASS ────► waits for human merge\n    │             └─ NEEDS CHANGES → auto-retry coding (up to N rounds)\n    │\n    ├─ [s] Status ────────────► shows issue list from tracker\n    ├─ [r] Review ────────────► launches reviewer on demand\n    ├─ [f] Efficiency ────────► lightweight agent (no hooks, no tracker, self-review)\n    ├─ [d] Redeploy ──────────► undeploy + re-write all agents/hooks/docs (no launch)\n    └─ [Enter] ───────────────► launches Claude Code directly\n```\n\n## Features\n\n- **Multi-project dashboard** — switch between projects with arrow keys, mouse scroll support\n- **Loop engine** — fully automated: poll todo issues → create worktree → coding agent → reviewer → PR merge → cleanup\n- **Task decomposition** — when an Issue Spec contains `## TASKS`, the coding agent delegates to `task-runner` subagents (sequential, or parallel batches with per-subagent `isolation: \"worktree\"`)\n- **Agent monitoring** — real-time status via session log parsing (Working / Waiting / Permission / Ended), auto-detects running sessions on startup, survives `/resume` session switches\n- **Notifications** — Windows Toast + sound when an agent needs your input or awaits tool permission\n- **Issue tracker integration** — Forgejo/Gitea and GitHub via REST API + MCP\n- **Cross-agent channel** — real-time agent-to-agent communication via HTTP broker + MCP; supports same-project, cross-project, and global broadcast messaging\n- **Meeting mode** — multiple clarifier agents auto-discover via `agent_type` tracking, assign Facilitator/Advisor roles, and converge to a structured issue through coordinated channel communication\n- **5-layer safety system** — agent-guidelines.md, allowed tools, PreToolUse hooks, git worktree isolation, human PR review\n- **Per-issue branch control** — clarifier asks target branch, coding agent enforces it\n- **Auto-retry** — reviewer judges NEEDS CHANGES → coding agent auto-fixes → re-review (configurable rounds)\n- **i18n** — TUI chrome localized to English or Traditional Chinese (zh-TW) via `locale.T()`; all agent output (Issue Specs, commits, PR bodies, channel messages) is always English regardless of TUI locale, for token efficiency\n- **Per-role model selection** — `[agent_models]` lets you choose a model per agent role (defaults to Opus across all roles with 1M context, tuned for single-round coding→review accuracy); override any value in config\n- **SSH remote access** — `zpit serve` runs a headless SSH daemon (Wish), multiple clients share one dashboard with real-time state sync; `auto_serve` mode starts the server automatically when running `zpit`, enabling seamless mobile access without workflow interruption\n- **Desktop agent** — `[w]` launches a global Claude Code session that drives the OS (mouse, keyboard, screenshots, accessibility actions) through a policy-enforced MCP proxy. Backed by [`zpit-desktop-mcp`](https://github.com/zac15987/computer-use-mcp), our fork of [`@zavora-ai/computer-use-mcp`](https://github.com/zavora-ai/computer-use-mcp). Single-instance, macOS + Windows only.\n\n## Session sync (cross-machine /resume)\n\nWhen you work across multiple machines (laptop at home, desktop at the office) and want to continue a long Claude Code conversation on the other machine, the session JSONL file is the unit of replay — but Claude Code's `~/.claude/projects/\u003cencoded-cwd\u003e/` directory uses an OS-specific encoded folder name and embeds the absolute project path inside every session line. A naive file copy is invisible to `claude --resume` on the other side.\n\nZpit's **`[h] History`** view bridges this. From the main dock press `h` to open the Session Browser:\n\n- Top level: every encoded folder under `~/.claude/projects/`. Each row shows session count, total size, last-modified time, and a 🟢 marker when at least one session is currently alive on this machine.\n- Drill into a folder: every `*.jsonl` session with multi-select checkboxes. 🧩 marks sessions that have a sibling `\u003cid\u003e/subagents/` directory; 🟢 marks live sessions.\n\n### Export\n\nIn the session list, select one or more sessions with `Space` (or `[a]` to toggle all). Press `[e]` to export. Zpit warns if any selected session is currently active (informational — you can still proceed) and writes a zip bundle containing:\n\n- One `\u003csession-id\u003e.jsonl` per selected session at the zip root.\n- One `\u003csession-id\u003e/subagents/` subtree per selected session that has subagents on disk (preserved verbatim).\n- A `manifest.json` describing the source OS and absolute project path so the importer can rewrite paths.\n- Optionally a `memory/` subtree (opt-in via the `[ ] Include memory/` checkbox at export time — off by default to avoid leaking project-private notes).\n\nDefault output path: `~/.zpit/exports/\u003cfolder-name\u003e-\u003cYYYYMMDD-HHMMSS\u003e.zip`.\n\nYou can also press `[E]` (capital) on a folder row in the top-level view to export every session in that folder in one shot.\n\n### Import\n\nFrom the top-level folder list, press `[i]` (or select the `[+] Import bundle...` row + Enter) to open the import wizard. Steps:\n\n1. Bundle path entry — type the path to a `.zip` produced by the exporter above.\n2. Manifest preview — Zpit reads `manifest.json` and shows source OS, source path, session count, memory inclusion. Per-session checkboxes let you deselect individual sessions.\n3. Destination path — type the absolute path of the destination project on this machine.\n4. Final preview — Zpit shows the resolved `~/.claude/projects/\u003cdest-encoded\u003e/` and the action plan. Confirm to run.\n5. Run — Zpit rewrites `cwd` fields in each session JSONL line to the destination path (only the JSON `cwd` field, never literal path text in chat content), copies subagents verbatim, and optionally writes `memory/` if the bundle included it.\n\nIf the destination already has a session with the same ID, you get a 3-button collision modal: **Overwrite**, **Skip this session**, or **Cancel entire import**. The same prompt applies to the `memory/` directory.\n\nAfter import, `claude --resume \u003csession-id\u003e` on this machine sees the new file.\n\n### Bundle format\n\nThe zip bundle contains:\n\n```\n\u003cbundle.zip\u003e\n├── manifest.json                     # format_version, source_os, source_cwd,\n│                                     # source_encoded_cwd, sessions[], exported_at,\n│                                     # include_memory\n├── \u003csession-id\u003e.jsonl                # one per session (lines streamed)\n├── \u003csession-id\u003e/subagents/...        # one per session with subagents (verbatim)\n└── memory/...                        # only when include_memory=true\n```\n\n`source_cwd` is sourced from any session line's `cwd` field when available; only when no line has one does the exporter fall back to a lossy reverse-derivation of the encoded folder name.\n\n## Requirements\n\n- [Go](https://go.dev/) 1.26+\n- [Claude Code](https://claude.ai/code) CLI installed and authenticated\n- Windows Terminal (Windows) or tmux (Linux/WSL)\n- A Forgejo/Gitea or GitHub issue tracker\n\n## Quick Start\n\n```bash\n# Build\ngo build -o zpit .\n\n# First run — creates config template at ~/.zpit/config.toml\n./zpit\n# Edit the config with your projects and tracker tokens, then:\n./zpit\n\n# SSH server mode (remote access)\n./zpit serve      # Start headless SSH daemon (default port 2200)\n./zpit connect    # SSH connect to local server\n\n# Or enable auto_serve in config — then just \"./zpit\" starts\n# the SSH server automatically and connects to it.\n# You can SSH in from your phone at any time.\n```\n\n## Configuration\n\nConfig lives at `~/.zpit/config.toml`. Override with `ZPIT_CONFIG` env var.\n\n```toml\nlanguage = \"en\"             # en | zh-TW\nbroker_port = 17731         # HTTP broker port for cross-agent channel\n# zpit_bin = \"/usr/local/bin/zpit\"  # explicit binary path for .mcp.json generation\n\n[terminal]\nwindows_mode = \"new_tab\"    # new_tab | new_window\ntmux_mode = \"new_window\"    # new_window | new_pane\n# windows_terminal_profile = \"PowerShell 7\"  # WT profile name for -p flag\n\n[notification]\ntui_alert = true\nwindows_toast = true\nsound = true\n# sound_file = \"D:/sounds/notify.mp3\"  # custom notification sound (WAV/MP3/M4A/OGG)\nre_remind_minutes = 2\n\n[worktree]\nbase_dir_windows = \"D:/worktrees\"\nbase_dir_wsl = \"/mnt/d/worktrees\"\nmax_per_project = 5\npoll_seconds = 10           # todo issue polling interval\npr_poll_seconds = 10        # PR merge polling interval (only used when auto_merge = false)\nmax_review_rounds = 3       # auto-retry rounds before needs-human\n# dir_format = \"{project_id}/{issue_id}--{slug}\"\n# auto_cleanup = false\n\n# Per-role model selection — passed to Claude Code via --model at launch.\n# Aliases (opus/sonnet/haiku) resolve per provider; append [1m] to opt\n# into the 1M-context tier. Pin to a full ID (e.g. claude-opus-4-7[1m])\n# if you need cross-provider consistency.\n[agent_models]\nclarifier = \"opus[1m]\"      # requirement clarification — deepest reasoning (1M context)\ncoding = \"opus[1m]\"         # feature implementation (1M context)\nreviewer = \"opus[1m]\"       # PR review (1M context)\ntask_runner = \"opus[1m]\"    # advisory — subagents inherit the coding session's model\nefficiency = \"opus[1m]\"     # efficiency-review agent (manual [f]) — deep reasoning\n\n# Tracker providers — token read from env var, never stored in config\n[providers.tracker.my-forgejo]\ntype = \"forgejo_issues\"\nurl = \"https://your-forgejo.example.com\"\ntoken_env = \"FORGEJO_TOKEN\"\n\n# Git providers (optional — for Forgejo/Gitea PR API)\n# [providers.git.my-forgejo]\n# type = \"forgejo\"\n# url = \"https://your-forgejo.example.com\"\n# token_env = \"FORGEJO_TOKEN\"\n\n# Projects\n[[projects]]\nname = \"My Project\"\nid = \"my-project\"\nprofile = \"machine\"         # display tag: machine | desktop | web | android | terminal (for TUI icon)\nhook_mode = \"strict\"        # strict | standard | relaxed\nlog_policy = \"standard\"     # strict | standard | minimal — agent logging strictness\ntracker = \"my-forgejo\"\n# tracker_project = \"My_Project\"  # tracker project name if different from repo\n# git = \"my-forgejo\"              # git provider for PR operations\nrepo = \"org/repo\"\nbase_branch = \"dev\"\nchannel_enabled = false     # enable cross-agent channel communication\nchannel_listen = []         # subscribe to other projects' events, e.g. [\"_global\", \"other-proj\"]\n# auto_merge = false      # when true, Zpit calls the tracker merge API after ai-review PASS (opt-in)\n# merge_method = \"squash\"  # squash | merge | rebase (used when auto_merge = true)\ntags = [\"go\"]\n\n[projects.path]\nwindows = \"D:/Projects/my-project\"\nwsl = \"/mnt/d/Projects/my-project\"\n\n# SSH server (optional — for remote TUI access)\n# [ssh]\n# port = 2200\n# host = \"0.0.0.0\"\n# host_key_path = \"~/.zpit/ssh/host_ed25519\"\n# password_env = \"ZPIT_SSH_PASSWORD\"\n# authorized_keys_path = \"~/.ssh/authorized_keys\"\n# auto_serve = false    # when true, \"zpit\" auto-starts SSH server + connects\n```\n\n## Hotkeys\n\n| Key | Action |\n|-----|--------|\n| `Enter` | Launch Claude Code in new terminal |\n| `c` | Clarify — open clarifier agent to create structured issue |\n| `l` | Loop — toggle automated coding + review cycle |\n| `r` | Review — launch reviewer agent |\n| `f` | Efficiency — lightweight agent (no hooks, no tracker, self-review) |\n| `s` | Status — view issue list from tracker |\n| `o` | Open project folder |\n| `i` | Open issue tracker in browser |\n| `p` | Open pull request in browser (in Loop Slot focus: the slot's PR; falls back to `/pulls?head=\u003cbranch\u003e` if not yet open) |\n| `u` | Undeploy — remove deployed agents, docs, hooks |\n| `d` | Redeploy — undeploy then re-write all 4 agents + hooks + docs (no Claude launch) |\n| `m` | Channel — view cross-agent communication events |\n| `g` | Git Status — view branches (local + remote-only) and commit graph; [f] fetch, [p] pull (--ff-only) |\n| `G` | Open lazygit in new terminal (project root; in Loop Slot focus: slot's worktree) |\n| `U` | Run `claude update` in new terminal (stays open to show result) |\n| `a` | Add project (coming soon) |\n| `e` | Edit config — sub-menu: toggle channel, edit channel_listen, open in $EDITOR |\n| `w` | Window — launch desktop agent (macOS + Windows only; single instance across all clients) |\n| `x` | Close Terminal — force-close selected terminal (when Terminals panel focused) |\n| `Tab` | Switch focus between panels (Projects, Terminals, Loop Slots) |\n| `?` | Help |\n| `q` | Quit |\n\n## Loop Engine\n\nThe loop engine automates the full coding cycle:\n\n1. **Poll** tracker for `todo` issues (configurable interval)\n2. **Create worktree** — isolated git worktree from `base_branch`\n3. **Launch coding agent** — writes implementation, commits, opens PR, sets `review` label\n4. **Detect completion** — polls issue labels for `review` (agents don't need to exit)\n5. **Launch reviewer** — checks acceptance criteria, writes review report, sets verdict label\n6. **Detect verdict** — polls issue labels for `ai-review` (PASS → wait for human merge) or `needs-changes` (auto-retry up to `max_review_rounds`)\n7. **Cleanup** — after PR merge, removes worktree and branch\n\nMultiple issues run in parallel, limited by `max_per_project`.\n\n## Safety System\n\nZpit enforces 5 layers of safety to prevent agents from causing damage:\n\n| Layer | Mechanism | Scope |\n|-------|-----------|-------|\n| 1 | agent-guidelines.md behavioral rules | Soft — agent reads on startup |\n| 2 | `--allowedTools` per agent role | Medium — Claude Code enforced |\n| 3 | PreToolUse hooks | Hard — enforced even with `--bypass-all-permissions` |\n| 4 | Git worktree isolation | Physical — agents can't touch main repo |\n| 5 | Final merge gate (conditional) | When `auto_merge = false` (default): human PR review is the final gate. When `auto_merge = true`: the AI reviewer's `ai-review` PASS label replaces the human gate and triggers the tracker's merge API. Only enable `auto_merge` when you trust the reviewer model quality on your repo. |\n\n**PreToolUse hooks:**\n- `path-guard.sh` — confines Write/Edit to worktree directory\n- `bash-firewall.sh` — blocks destructive commands (rm -rf, curl|bash, force push, etc.)\n- `git-guard.sh` — push whitelist (only `feat/*` branches), blocks merge, rebase, branch-delete, force push\n\n**Notification hook:**\n- `notify-permission.sh` — writes signal file when Claude Code needs tool permission approval; TUI detects and shows 🟠 status + toast notification\n\nHook strictness is per-project: `strict` (all hooks), `standard` (path-guard + git-guard), `relaxed` (git-guard only). Notification hook is always active in all modes.\n\n## Issue Spec Format\n\nThe clarifier agent produces structured issues:\n\n```markdown\n## CONTEXT\n[Problem description with specific file names and behavior]\n\n## APPROACH\n[Selected solution + reasoning]\n\n## ACCEPTANCE_CRITERIA\nAC-1: [Specific, verifiable condition]\nAC-2: ...\n\n## SCOPE\n[modify] path/to/file (reason)\n[create] path/to/new-file (reason)\n\n## CONSTRAINTS\n[Hard limits]\n\n## BRANCH\n[Optional: PR target branch, defaults to project base_branch]\n\n## TASKS\n[Optional: Task decomposition — triggers subagent delegation]\nT1: [task description] | [modify] path/to/file\nT2: [task description] [P] | [modify] path/to/other  # [P] = parallelizable\nT3: [task description] [depends:T1] | [create] path/to/new\n\n## COORDINATES_WITH\n[Optional: Cross-agent coordination for parallel work]\n#42: Brief description of related issue\n\n## REFERENCES\n[Optional: URLs, related files]\n```\n\n## Development\n\n```bash\ngo build ./...           # Build\ngo test ./...            # Run all tests\nmake test-hooks          # Run hook tests (requires bash)\ngo run .                 # Local TUI (or auto-serve if ssh.auto_serve=true)\ngo run . serve           # SSH server mode\ngo run . connect         # SSH client shortcut\n```\n\nLogs: `~/.zpit/logs/zpit-YYYY-MM-DD.log` — daily rotation, 30-day retention.\n\n## Desktop Agent\n\nPress `[w]` from the main view to launch the desktop agent — a standalone Claude Code session that controls the operating system (mouse, keyboard, screenshots, window/app management, accessibility actions). Unlike project-scoped agents, it is global (cwd = `$HOME` / `%USERPROFILE%`) and limited to one active instance across all connected TUI clients.\n\nThe desktop agent is backed by [`zpit-desktop-mcp`](https://github.com/zac15987/computer-use-mcp) — our fork of [`@zavora-ai/computer-use-mcp`](https://github.com/zavora-ai/computer-use-mcp) by [James Karanja Maina / zavora.ai](https://zavora.ai). The fork adds Windows AUMID launch support in `open_application`, a stdio-entrypoint fix for Windows backslash paths, and tracks the upstream `@modelcontextprotocol/sdk` Zod 4 bump. Many thanks to the upstream authors — none of this would exist without their original work.\n\nSafety is enforced by `zpit serve-desktop-proxy`, a Go MCP proxy that sits between Claude Code and the `npx zpit-desktop-mcp` subprocess. Every JSON-RPC `tools/call` frame is intercepted, evaluated against `~/.zpit/desktop-policy.toml` (auto-created on first run), and either forwarded or rejected with a structured error. Hard-blocked tools include `run_script`, `filesystem`, `process_kill`, `registry`, `notification`, and all virtual-desktop tools; `deny_keys` blocks OS-level escape hatches like `win+r`, `ctrl+alt+del`, and `alt+f4`. The conventional 5-layer hook stack does **not** apply to the desktop agent — the proxy is the safety layer.\n\nPlatform support: macOS and Windows. On Linux, `[w]` is a no-op (the upstream Rust NAPI module has no Linux backend).\n\nSee [docs/architecture/desktop-agent.md](docs/architecture/desktop-agent.md) for the full design rationale (why proxy over hooks, tool-by-tool allowlist justification, default `deny_keys` per platform).\n\n## Architecture\n\nSee [docs/architecture/](docs/architecture/) for the full architecture documents (split by topic, with an [index](docs/architecture/README.md)).\n\n## Open Source Attributions\n\nZpit is built on top of the following open source libraries:\n\n| Library | Purpose | License |\n|---------|---------|---------|\n| [Bubble Tea](https://github.com/charmbracelet/bubbletea) | TUI framework | MIT |\n| [Bubbles](https://github.com/charmbracelet/bubbles) | TUI components (list, text input, etc.) | MIT |\n| [Lip Gloss](https://github.com/charmbracelet/lipgloss) | TUI styling and layout | MIT |\n| [Huh](https://github.com/charmbracelet/huh) | Form and confirm dialogs | MIT |\n| [Wish](https://github.com/charmbracelet/wish) | SSH server for TUI remote access | MIT |\n| [BurntSushi/toml](https://github.com/BurntSushi/toml) | TOML config parser | MIT |\n| [fsnotify](https://github.com/fsnotify/fsnotify) | Filesystem watcher (session log monitoring) | BSD-3-Clause |\n| [go-colorful](https://github.com/lucasb-eyer/go-colorful) | Color math for terminal rendering | MIT |\n| [muesli/termenv](https://github.com/muesli/termenv) | Terminal environment detection | MIT |\n| [rivo/uniseg](https://github.com/rivo/uniseg) | Unicode text segmentation | MIT |\n| [mattn/go-runewidth](https://github.com/mattn/go-runewidth) | Rune display width calculation | MIT |\n| [bubbletea-overlay](https://github.com/rmhubbert/bubbletea-overlay) | Overlay rendering for confirm dialogs | MIT |\n| [golang.org/x/sys, x/text](https://pkg.go.dev/golang.org/x) | Go extended standard library | BSD-3-Clause |\n\nAll Charmbracelet libraries (`bubbletea`, `bubbles`, `lipgloss`, `huh`, `wish`, `ssh`) are copyright © Charmbracelet, Inc., licensed under the MIT License.\n`fsnotify` and `golang.org/x/*` are BSD-3-Clause; their copyright notices are retained as required.\n\n### Desktop agent — upstream credit\n\nThe [`[w]` desktop agent](#desktop-agent) is backed by [`zpit-desktop-mcp`](https://github.com/zac15987/computer-use-mcp), our fork of [`@zavora-ai/computer-use-mcp`](https://github.com/zavora-ai/computer-use-mcp) (forked at v6.1.0). The original `computer-use-mcp` package — including the Rust NAPI native backend, the MCP server scaffolding, and the full macOS + Windows toolset — is the work of [James Karanja Maina](mailto:james@zavora.ai) / [zavora.ai](https://zavora.ai), released under the MIT License. Zpit's fork adds Windows AUMID launch support, the stdio-entrypoint backslash fix, and the SDK Zod 4 bump; everything else is upstream. Sincere thanks to the zavora.ai team for making this layer of zpit possible.\n\n| Package | Purpose | License |\n|---------|---------|---------|\n| [`zpit-desktop-mcp`](https://github.com/zac15987/computer-use-mcp) (zpit fork) | Desktop-control MCP server for the `[w]` agent | MIT |\n| [`@zavora-ai/computer-use-mcp`](https://github.com/zavora-ai/computer-use-mcp) (upstream) | Original MCP server + Rust NAPI native backend | MIT |\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzac15987%2Fzpit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzac15987%2Fzpit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzac15987%2Fzpit/lists"}