Skip to content

Add toolpath-desktop crate (Tauri 2 app)#20

Merged
eliothedeman merged 2 commits intomainfrom
eliot/musing-neumann-3f3419
Apr 20, 2026
Merged

Add toolpath-desktop crate (Tauri 2 app)#20
eliothedeman merged 2 commits intomainfrom
eliot/musing-neumann-3f3419

Conversation

@eliothedeman
Copy link
Copy Markdown
Collaborator

Summary

Adds crates/toolpath-desktop — a Tauri 2 companion app to Pathbase, aimed at users who won't open a terminal to run path derive .... They pick a trace source, preview the provenance DAG, and export locally or upload to Pathbase.

What's in it

Rust backend (crates/toolpath-desktop/src/) — links toolpath, toolpath-claude, toolpath-git, toolpath-github, toolpath-pi directly. No CLI subprocess.

  • list_agents auto-detects installed agents (Claude via ~/.claude/, pi.dev via ~/.pi/agent/sessions/) — ready-to-extend for future agents.
  • Streaming commands emit events as data is discovered: list_claude_projects_stream, list_claude_sessions_stream, list_pi_projects_stream, list_pi_sessions_stream, claude_session_title.
  • Derive commands per source: derive_claude, derive_pi, derive_git, derive_github.
  • save_document (round-trips through Document schema before writing) + stubbed upload_to_pathbase.
  • GitHub PAT stored in OS keychain under dev.pathbase.toolpath-desktop.
  • 13 unit tests covering the IPC command surface.

Frontend (crates/toolpath-desktop/frontend/) — Svelte 5 + TypeScript + Vite, bundled with bun. Elm-architecture shape:

  • src/lib/types.tsModel, Msg, Cmd, and IPC payload types that mirror Rust serde definitions.
  • src/lib/update.ts — pure (msg, model) -> [model, cmd] reducer.
  • src/lib/store.svelte.ts — reactive Svelte 5 store wrapping the reducer.
  • src/lib/ipc.ts — typed invoke / listen wrappers around @tauri-apps/api.
  • src/lib/viz.ts — dagre-d3 DAG renderer adapted from site/js/visualizer.js.
  • src/routes/*.svelte — one component per route (Home, BrowseAgents, BrowseClaude, BrowsePi, BrowseGit, BrowseGithub, Preview, Result).

Streaming events — Rust commands emit <source>:project, <source>:session, <source>:projects-done etc. Components subscribe-then-invoke so fast streams don't race with listener registration.

Workspace plumbing per CLAUDE.md checklist: root Cargo.toml, CLAUDE.md layout + dependency graph, README.md, scripts/release.sh (tier 3), site/_data/crates.json, site/pages/crates.md, CHANGELOG.md.

Dev loop

cd crates/toolpath-desktop/frontend && bun install   # once
cargo install tauri-cli --locked --version '^2'      # once
cd .. && cargo tauri dev

cargo tauri dev auto-starts Vite on localhost:1420 (via beforeDevCommand), Tauri's webview loads from that URL. Frontend edits hot-reload via Vite HMR — no Rust restart. Rust edits trigger cargo run restart.

Scope

In: source discovery (Claude, pi.dev, git, GitHub PR), DAG preview, local export, stubbed upload.

Out (deliberate v1 scope): real Pathbase API integration, live/track mode, query UI, editing documents, multi-doc Graph merging, identity signing.

Test plan

  • cargo test -p toolpath-desktop (13 passing)
  • cargo clippy --workspace -- -D warnings clean
  • bun run check (0 errors, 9 a11y-related warnings — non-blocking)
  • bun run build produces ~202 KB JS bundle (68 KB gzip)
  • Manual walkthrough: cargo tauri dev → Agents → Claude / pi.dev / Git / GitHub PR → Preview → Export → path validate round-trip
  • cargo tauri build produces signed .app under 20 MB on macOS

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 17, 2026

🔍 Preview deployed: https://a7339a4e.toolpath.pages.dev

Adds crates/toolpath-desktop — the non-technical-user entry point to
Pathbase. Users pick a trace source (Claude Code, pi.dev, local git,
GitHub PR), preview the provenance DAG, and export to `.path.json` or
upload to Pathbase (stubbed until the service ships).

Stack: Tauri 2 + Svelte 5 + TypeScript + Vite, bundled with bun. The
frontend is structured as an Elm-architecture loop — `types.ts` holds
`Model`/`Msg`/`Cmd`, `update.ts` is the pure reducer, `store.svelte.ts`
is a reactive Svelte 5 wrapper, and `routes/*.svelte` are pure views.
Streaming list commands (`list_*_projects_stream`, `list_*_sessions_stream`)
emit events that components subscribe to via typed wrappers around
`@tauri-apps/api`.

Rust backend links toolpath / toolpath-claude / toolpath-git /
toolpath-github / toolpath-pi directly — no CLI subprocess. 13 unit
tests cover the IPC command surface (source listing, derive validation,
export round-trip, upload stub, keychain input checks).

Workspace plumbing per CLAUDE.md checklist: root Cargo.toml, CLAUDE.md
layout + dependency graph, README.md, scripts/release.sh (tier 3),
site/_data/crates.json, site/pages/crates.md, CHANGELOG.md.

Dev loop: `cargo tauri dev` spawns `bun --cwd frontend run dev`
(Vite on localhost:1420), then runs the Rust binary against that URL.
Frontend edits hot-reload via Vite HMR; Rust edits trigger `cargo run`
restart. Production: `cargo tauri build` bundles to `frontend/dist/`
then packages native artefacts.
Tauri 2 pulls in glib-sys / webkit2gtk-sys on Linux, which need GTK
system libraries not installed on the Ubuntu runner. The crate targets
macOS primarily; excluding it from the workspace CI keeps the check
fast and avoids a ~500MB apt install. Its own tests run on dev
machines where Tauri's deps are already present.
@eliothedeman eliothedeman force-pushed the eliot/musing-neumann-3f3419 branch from 65f6340 to 548f642 Compare April 20, 2026 15:04
@eliothedeman eliothedeman merged commit f6f8772 into main Apr 20, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant