内容
<div align="center">
<a href="https://kroch228.github.io/pigide-landing/">
<picture>
<source srcset=".github/readme/hero.webp" type="image/webp"/>
<img src=".github/readme/hero.gif" alt="PigIDE — 意志转化为行动" width="100%"/>
</picture>
</a>
<br/>
[](https://kroch228.github.io/pigide-landing/)
[](LICENSE)
[](#stack)
[](#prerequisites)
[](CODE_OF_CONDUCT.md)
<br/>
**一款托管 CLI 编程代理池的桌面 IDE,以平铺终端窗格显示。**
<br/>您指挥。集群构建。语音输入。代码输出。
<br/>
**→ <a href="https://kroch228.github.io/pigide-landing/">查看实时演示页面</a>**
</div>
---
## 快速开始
```bash
git clone https://github.com/<your-fork>/pigide
cd pigide/frontend && pnpm install && cd ../src-tauri
cargo tauri dev
```
Once the window is open:
1. **+** in the Workspaces sidebar — your first workspace.
2. **+ kiro-cli** (or any agent type) inside an empty TilingArea — terminal tile spawns with the agent already running.
3. Talk to the orchestrator on the right pane to dispatch tasks across tiles.
4. `Ctrl+,` opens Settings · `Ctrl+1..9` jumps between workspaces.
For voice: hold the configured PTT hotkey (off by default — bind in `Settings → Voice`) and speak. Partials stream into the focused input within 300 ms.
<div align="center">
<img src=".github/readme/stats.svg" alt="6 agent runtimes · 300 ms voice latency · 120k GPU particles · 100% local" width="100%"/>
</div>
<br/>
<div align="center">
<img src=".github/readme/marquee.svg" alt="Conduct the swarm · You direct · Agents build" width="100%"/>
</div>
<br/>
## 技术栈
- **Rust核心(Tauri 2):** `portable-pty`、`rusqlite`、`reqwest`、`tokio`、`cpal`、`whisper-rs`
- **前端(React + TypeScript + Vite):** `allotment`、`@xterm/xterm`、`zustand`
## 先决条件
- Rust 1.80+ (`rustc 1.95` tested)
- Node 20+ + pnpm 9+ (`node 25`, `pnpm 10` tested)
- Linux: `webkit2gtk-4.1` and PulseAudio/ALSA dev libs
- An OmniRouter instance running locally (defaults to `http://localhost:20128`)
- `~/.local/bin/kiro-cli` and `/usr/bin/claude` for the agent tiles
<br/>
## 构建
<details>
<summary><b>开发运行</b> — <code>cargo tauri dev</code></summary>
```bash
# Install frontend deps
cd frontend
pnpm install
cd ..
# Run the dev server (Vite) + Tauri window
cd src-tauri
cargo tauri dev
# (or, if @tauri-apps/cli is installed in frontend/, `pnpm tauri dev` from frontend/)
```
</details>
<details>
<summary><b>发布构建</b> — <code>./scripts/build.sh</code></summary>
Один скрипт собирает фронтенд и Tauri-приложение, автоматически выбирает Whisper-бэкенд (GPU/CPU) и складывает всё в `./dist/` в корне репозитория.
```bash
./scripts/build.sh
```
Что попадает в `dist/`:
```
dist/
├── bin/ # raw executables (pigide, pigide-cli)
├── bundle/ # установщики (.deb / .rpm / .AppImage / .dmg / .msi)
└── BUILD_INFO.txt # дата, коммит, какой GPU-бэкенд использован
```
GPU-бэкенд определяется автоматически (CUDA → ROCm → Vulkan → CPU; на macOS — Metal). Принудительно выбрать можно через `PIGIDE_GPU`:
```bash
PIGIDE_GPU=cuda ./scripts/build.sh # NVIDIA, нужен CUDA toolkit
PIGIDE_GPU=hipblas ./scripts/build.sh # AMD ROCm
PIGIDE_GPU=vulkan ./scripts/build.sh # cross-vendor Vulkan
PIGIDE_GPU=metal ./scripts/build.sh # Apple Silicon
PIGIDE_GPU=cpu ./scripts/build.sh # CPU-only
```
В рантайме можно форсить CPU без пересборки: `PIGIDE_WHISPER_CPU=1`.
Перед сборкой скрипт показывает **preflight**: текущая ветка, коммит, ahead/behind относительно `origin/main` и список незакоммиченных изменений. Если working tree грязный — спросит подтверждение (это страховка от ситуации, когда забыл закоммитить и потом потерял правки при checkout). Чтобы пропускать вопрос в CI: `PIGIDE_BUILD_DIRTY=1 ./scripts/build.sh`.
</details>
<details>
<summary><b>首次运行注意事项</b> — 数据存储位置、日志、模型</summary>
- Database: `~/.config/pigide/db.sqlite`
- Whisper model: downloaded on first PTT use to `~/.cache/pigide/ggml-small.bin`
- Logs: stderr, set `RUST_LOG=pigide=debug,info`
</details>
<br/>
## 架构模型
The Kiro orchestrator runs against a swappable LLM backend. Default is the **Anthropic Messages API** with **Claude Opus 4.5** as primary and **Claude Opus 4** as automatic fallback on `5xx` / `529` / timeout. Set `ANTHROPIC_API_KEY` in the environment, or paste a key into `Right pane → Settings → API key`.
OmniRouter (OpenAI-compatible) remains available — switch via `Right pane → Settings → Provider`.
<br/>
## 监视器(可选)
<details>
<summary>后台监督代理 stdout</summary>
Watcher слушает stdout каждого спавненного агента, классифицирует чанки через Google AI Studio Generative Language API (по умолчанию `gemini-2.5-flash-lite` — Gemma 3 4B IT из изначального брифа AI Studio v1beta больше не отдаёт; live-проверка показала, что Gemma 4 31B уходит в reasoning-prose вместо строгого JSON, а Flash-Lite обеспечивает strict-JSON и стоит в ~10× меньше) и эскалирует «вопросы к человеку» Architect'у в почтовый ящик `role:coordinator`, на тред `watcher:<agent_id>`. Ответ Architect'а автоматически инжектится обратно в stdin исходного агента — агент не зависает на интерактивном prompt'е, пока вы не подойдёте.
### 开启
```bash
cd src-tauri
cargo build --features watcher
# 或用于调试启动
GEMINI_API_KEY=AIzaSy... cargo tauri dev --features watcher
```
### 环境变量
| 变量名 | 默认值 | 用途 |
|-|-|-|
| `GEMINI_API_KEY` | - (必填) | Google AI Studio 密钥。仅用于 `x-goog-api-key` 请求头,不存储在 URL 或日志中。 |
| `PIGIDE_WATCHER_RPM` | `10` | 每个代理的速率限制(每分钟请求数)。令牌桶算法:当桶满时,块将被丢弃,不会排队。 |
| `PIGIDE_WATCHER_MODEL` | `gemini-2.5-flash-lite` | 生成式语言 API 模型名称。可更改为其他可用的 Gemma/Gemini-Flash-Lite 模型。 |
### MCP 工具
当 Watcher 激活时,MCP 服务器注册一个新工具:
```json
{ "method": "tools/call", "params": { "name": "watcher_status", "arguments": {} } }
```
返回 `{enabled, rpm, agents: { <agent_id>: {last_classification, calls_this_minute, blocked_until, dropped} }}` — 方便用于仪表板和检查桶是否卡住。
### 成本
`gemini-2.5-flash-lite` 在 AI Studio 免费层可用,每个项目限 30 RPM(截至编写时)。默认 `PIGIDE_WATCHER_RPM=10` 调整为单个代理不会单独耗尽密钥限额。在付费层,Flash-Lite 是最便宜的 Gemini API 模型,约 0.075 美元/百万输入令牌和 0.30 美元/百万输出令牌(文本)。
</details>
<br/>
## PigVoice - 即时语音转文本
<details>
<summary>流式语音层 · 少于 300 ms 延迟 · LocalAgreement-2 合并器</summary>
PigVoice 是集成到 PigIDE 中的流式语音层。目标:**少于 300 ms 感知延迟**,从语音到第一个可见令牌,部分假设直接进入聚焦输入。
### 工作原理
```
mic (cpal) → resample 16k → Silero-style VAD → rolling-window Whisper
→ LocalAgreement-2 merger → voice://partial events
→ on VAD endpoint: clean final → voice://final
```
设备上的引擎是 `whisper.cpp`(通过 `whisper-rs`,无需新的原生依赖)。部分内容通过 **LocalAgreement-2** 稳定:只有两个连续解码通过同意令牌,令牌才会提交到可见 UI,因此文本不会向后波动。参见 [`PIGVOICE_RESEARCH.md`](./PIGVOICE_RESEARCH.md) 和 [`PIGVOICE_PLAN.md`](./PIGVOICE_PLAN.md) 获取完整设计。
### 设置(存储在 `~/.config/pigide/db.sqlite`,`settings` 表)
| 键 | 默认值 | 含义 |
|-|-|-|
| `voice.partial_enabled` | `true` | 开启/关闭流式部分内容(回落到批处理) |
| `voice.partial_hop_ms` | `250` | 语音段中重新解码的节奏 |
| `voice.endpoint_silence_ms` | `400` | 提交最终分段所需的静音 |
| `voice.engine` | `whisper-streaming` | `whisper-streaming` / `whisper-batch` / `deepgram`(云,需手动开启) |
| `voice.cloud_api_key` | 未设置 | Deepgram Nova-3 密钥(存储在用户设置中,永远不会写入 git) |
| `voice.cloud_endpoint` | Deepgram 默认 | 可覆盖的 WS 端点 |
| `voice.hotkey_enabled` | `false` | 全局 PTT 热键(默认关闭;与窗口管理器冲突) |
| `voice.record_mode` | `push-to-talk` | 或 `toggle` |
| `voice.inject_enabled` | `false` | 将最终转录输入到聚焦窗口 |
| `whisper.model_id` | `small` | `tiny` / `base` / `small` / `medium` / `large` / `distil-large` 之一 |
| `whisper.language` | `auto` | Whisper 语言提示 |
流式处理路径默认为 `tiny` 以实现首个令牌速度快;从应用内语音设置面板选择更大模型以提高准确率。如果模型尚未下载,流式处理循环静默运行,现有批处理路径触发下载。
### GPU 加速(可选)
默认情况下,PigIDE 以仅 CPU 方式构建 Whisper。发布构建脚本 (`./scripts/build.sh`) 自动检测 GPU;要手动选择,请导出 `PIGIDE_GPU=cuda|hipblas|vulkan|metal|cpu` - 参见 [构建](#build) 部分。Whisper 上下文尝试使用 GPU 并回落到 CPU,如果初始化失败(缺少工具包、设备 OOM 等),则记录 `warn!` 日志。在运行时强制使用 CPU - `PIGIDE_WHISPER_CPU=1`.
系统依赖项按后端分类:
- `gpu-cuda` - CUDA 工具包(cublas, cudart, nvcc)。Arch: `sudo pacman -S cuda`。Ubuntu: `sudo apt install nvidia-cuda-toolkit`。
- `gpu-hipblas` - AMD ROCm。
- `gpu-vulkan` - Vulkan SDK。
- `gpu-metal` - Apple Silicon,无需安装。
通过日志验证实时后端(`RUST_LOG=pigide=info`):
```
whisper: GPU backend initialized (model=small)
```
### 事件(Tauri)
| 事件 | 有效载荷 | 何时 |
|-|-|-|
| `voice://state` | `{ state: "idle" \| "recording" \| "transcribing" }` | 开始/停止 |
| `voice://partial` | `{ stable, unstable, segment_id }` | 每个 `partial_hop_ms` 分段中间 |
| `voice://final` | `{ text, segment_id }` | VAD 端点或用户停止 |
| `voice://transcript` | `{ text }` | `final` 的兼容别名 |
| `voice://engine-error` | `{ engine, error }` | 非致命引擎故障 |
| `voice://download` | `{ bytes, total }` | 模型下载进度 |
### 测试
```bash
cd src-tauri
# 合并器、VAD、模式控制器、云配置等的单元测试
cargo test --lib voice::
# 端到端流式集成测试(无需麦克风/模型):
cargo test --test integration_streaming
# 延迟基准测试 - 如果中位数首次部分 > 600 ms 则失败:
cargo test --test bench_latency --release
```
</details>
<br/>
## 技能 - 可扩展的架构提示模块
<details>
<summary>自动发现 YAML 模块 · 热重载 · 每回合注入</summary>
架构师的提示不再固定。**技能** 是小型命名 `.md` 模块,具有 YAML 前置元数据,由架构师从 `~/.pigide/skills/` 和 `<workspace>/.pigide/skills/` 自动发现并选择每回合(按标签/触发器/显式 `@skill:<id>` 提及)。
```markdown
---
id: builder-brief-writer
name: Builder Brief Writer
description: 为 Builder 代理编写自成体系的简介
priority: 60
tags: [dispatch, builder]
triggers: [builder, " сборщик"]
---
You are composing a Builder brief.
GOAL: {{goal}}
{{#if files_in_scope}}FILES: {{files_in_scope}}{{/if}}
```
默认情况下,五个内置技能随附 - 包括 `user-skill-prompt-engineer`,这是架构师在调度到子代理时调用的元技能。技能面板(右窗格 → 技能)列出所有技能,切换启用/禁用,显示上一轮的选择跟踪,并允许您从 UI 中为新用户技能创建一个存根。
架构师提示本身(`src-tauri/src/orchestrator/prompt.rs`,v2 - 黄金标准元提示;v1 存档在 `prompt.v1.rs`)通过确定性 8 步流水线驱动每回合:**意图 → 合同**(角色/目标/退出标准)→ **技能选择** → **内存接地** → **分解**(Plan-and-Solve / Least-to-Most)→ **草稿**(通过 `[[user-skill-prompt-engineer]]`)→ **自我批评**(Self-Refine + Chain-of-Verification)→ **调度**(并行独立)→ **观察 + 自我改进**(为新模式创建 `create_memory`)。研究引用在 `prompt.rs` 顶部。
在 `src-tauri/resources/skills/` 中查看内置技能示例。
```bash
# 单元测试(解析器、路由器、合成器、注册表)
cargo test --lib skills::
# 集成测试(端到端合成 + 热重载)
cargo test --test skills_integration
```
</details>
<br/>
## 致谢
PigIDE 集成第三方软件,其许可证在 `LICENSES/` 中复制,并在 [`NOTICE`](./NOTICE) 中总结:
- **[Ruflo](https://github.com/ruvnet/ruflo)** (MIT,© 2024-2026 ruvnet)- 用作受监督的 Node.js 侧车(`pigide-ruflod`),为编排器-账本层提供支持。PigIDE 通过其 MCP 服务器(传输=stdio)与其通信;参见 `src-tauri/src/ruflo/` 以获取桥梁。
<br/>
<div align="center">
<sub>© 2026 PigIDE · Tauri · React · Rust · Three.js · <b>本地 · 永远</b></sub>
<br/>
<sub><a href="https://kroch228.github.io/pigide-landing/">kroch228.github.io/pigide-landing</a></sub>
</div>
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器