Overview
Create the Linux desktop app project scaffold at linux/ using Rust with GTK4 and libadwaita.
Project Structure
linux/
├── Cargo.toml
├── src/
│ ├── main.rs # GtkApplication setup, CLI arg parsing
│ ├── app.rs # Application subclass, window management
│ ├── state.rs # AppState, ConnectionState
│ ├── models/
│ │ ├── mod.rs
│ │ ├── manifest.rs # Manifest, WorktreeEntry, AgentEntry (serde)
│ │ ├── agent_variant.rs # Claude/Codex/OpenCode/Terminal/Worktree
│ │ └── settings.rs # AppSettings
│ ├── api/
│ │ ├── mod.rs
│ │ ├── client.rs # PpgClient (reqwest, 13 REST endpoints)
│ │ └── websocket.rs # WsManager (tokio-tungstenite)
│ ├── ui/
│ │ ├── mod.rs
│ │ ├── window.rs # MainWindow
│ │ ├── sidebar.rs
│ │ ├── terminal_pane.rs
│ │ ├── pane_grid.rs
│ │ ├── home_dashboard.rs
│ │ ├── command_palette.rs
│ │ ├── worktree_detail.rs
│ │ ├── settings_dialog.rs
│ │ ├── prompts_view.rs
│ │ ├── swarms_view.rs
│ │ ├── schedules_view.rs
│ │ ├── agent_config_view.rs
│ │ └── setup_view.rs
│ └── util/
│ ├── mod.rs
│ └── shell.rs
Cargo.toml Dependencies
[package]
name = "ppg-desktop"
version = "0.1.0"
edition = "2021"
[dependencies]
gtk4 = { version = "0.9", features = ["v4_12"] }
libadwaita = { version = "0.7", features = ["v1_4"] }
vte4 = "0.8"
tokio = { version = "1", features = ["full"] }
tokio-tungstenite = { version = "0.24", features = ["native-tls"] }
reqwest = { version = "0.12", features = ["json"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
glib = "0.20"
gio = "0.20"
Acceptance Criteria
Labels
platform: linux
Overview
Create the Linux desktop app project scaffold at
linux/using Rust with GTK4 and libadwaita.Project Structure
Cargo.toml Dependencies
Acceptance Criteria
cargo buildcompiles cleanlyadw::NavigationSplitView(sidebar + content)--server-url,--token,--project-rootLabels
platform: linux