Skip to content

Architecture Overview

GSD is a TypeScript application built on the Pi SDK. It embeds the Pi coding agent and extends it with the GSD workflow engine, auto mode state machine, and project management primitives.

gsd (CLI binary)
└─ loader.ts Sets PI_PACKAGE_DIR, GSD env vars, dynamic-imports cli.ts
└─ cli.ts Wires SDK managers, loads extensions, starts InteractiveMode
├─ onboarding.ts First-run setup wizard (LLM provider + tool keys)
├─ wizard.ts Env hydration from stored auth.json credentials
├─ app-paths.ts ~/.gsd/agent/, ~/.gsd/sessions/, auth.json
├─ resource-loader.ts Syncs bundled extensions + agents to ~/.gsd/agent/
└─ src/resources/
├─ extensions/gsd/ Core GSD extension
├─ extensions/... 12 supporting extensions
├─ agents/ scout, researcher, worker
├─ AGENTS.md Agent routing instructions
└─ GSD-WORKFLOW.md Manual bootstrap protocol
gsd headless Headless mode — CI/cron orchestration via RPC child process
gsd --mode mcp MCP server mode — exposes tools over stdin/stdout
vscode-extension/ VS Code extension — chat participant (@gsd), sidebar dashboard, RPC integration

.gsd/ is the sole source of truth. Auto mode reads it, writes it, and advances based on what it finds. No in-memory state survives across sessions. This enables crash recovery, multi-terminal steering, and session resumption.

loader.ts sets all environment variables with zero SDK imports, then dynamically imports cli.ts which does static SDK imports. This ensures PI_PACKAGE_DIR is set before any SDK code evaluates.

PI_PACKAGE_DIR points to pkg/ (not project root) to avoid Pi’s theme resolution colliding with GSD’s src/ directory. Contains only piConfig and theme assets.

Bundled extensions and agents are synced to ~/.gsd/agent/ on every launch, not just first run. This means npm update -g takes effect immediately.

LLM provider SDKs (Anthropic, OpenAI, Google, etc.) are lazy-loaded on first use rather than imported at startup. This significantly reduces cold-start time — only the provider you actually connect to gets loaded.

Every dispatch creates a new agent session. The LLM starts with a clean context window containing only the pre-inlined artifacts it needs. This prevents quality degradation from context accumulation.

ExtensionWhat It Provides
GSDCore workflow engine — auto mode, state machine, commands, dashboard
Browser ToolsPlaywright-based browser automation — navigation, forms, screenshots, PDF export, device emulation, visual regression, structured data extraction, route mocking, accessibility tree inspection, and semantic actions
Search the WebBrave Search, Tavily, or Jina page extraction
Google SearchGemini-powered web search with AI-synthesized answers
Context7Up-to-date library/framework documentation
Background ShellLong-running process management with readiness detection
SubagentDelegated tasks with isolated context windows
Mac ToolsmacOS native app automation via Accessibility APIs
MCP ClientNative MCP server integration via @modelcontextprotocol/sdk
VoiceReal-time speech-to-text (macOS, Linux)
Slash CommandsCustom command creation
LSPLanguage Server Protocol — diagnostics, definitions, references, hover, rename
Ask User QuestionsStructured user input with single/multi-select
Secure Env CollectMasked secret collection
Async JobsBackground command execution with async_bash, await_job, cancel_job
Remote QuestionsDiscord, Slack, and Telegram integration for headless question routing
TTSRTool-triggered system rules — conditional context injection based on tool usage
Universal ConfigDiscovery of existing AI tool configurations (Claude Code, Cursor, Windsurf, etc.)
AgentRole
ScoutFast codebase recon — compressed context for handoff
ResearcherWeb research — finds and synthesizes current information
WorkerGeneral-purpose execution in an isolated context window

Performance-critical operations use a Rust N-API engine:

  • grep — ripgrep-backed content search
  • glob — gitignore-aware file discovery
  • ps — cross-platform process tree management
  • highlight — syntect-based syntax highlighting
  • ast — structural code search via ast-grep
  • diff — fuzzy text matching and unified diff generation
  • text — ANSI-aware text measurement and wrapping
  • html — HTML-to-Markdown conversion
  • image — decode, encode, resize images
  • fd — fuzzy file path discovery
  • clipboard — native clipboard access
  • git — libgit2-backed git read operations (v2.16+)
  • parser — GSD file parsing and frontmatter extraction

The auto mode dispatch pipeline:

1. Read disk state (STATE.md, roadmap, plans)
2. Determine next unit type and ID
3. Classify complexity → select model tier
4. Apply budget pressure adjustments
5. Check routing history for adaptive adjustments
6. Dynamic model routing (if enabled) → select cheapest model for tier
7. Resolve effective model (with fallbacks)
8. Check pending captures → triage if needed
9. Build dispatch prompt (applying inline level compression)
10. Create fresh agent session
11. Inject prompt and let LLM execute
12. On completion: snapshot metrics, verify artifacts, persist state
13. Loop to step 1

Phase skipping (from token profile) gates steps 2-3: if a phase is skipped, the corresponding unit type is never dispatched.

ModulePurpose
auto.tsAuto-mode state machine and orchestration
auto/session.tsAutoSession class — all mutable auto-mode state in one encapsulated instance
auto-dispatch.tsDeclarative dispatch table (phase → unit mapping)
auto-idempotency.tsCompleted-key checks, skip loop detection, key eviction
auto-stuck-detection.tsStuck loop recovery and unit retry escalation
auto-start.tsFresh-start bootstrap — git/state init, crash lock detection, worktree setup
auto-post-unit.tsPost-unit processing — commit, doctor, state rebuild, hooks
auto-verification.tsPost-unit verification gate (lint/test/typecheck with auto-fix retries)
auto-prompts.tsPrompt builders with inline level compression
auto-worktree.tsWorktree lifecycle (create, enter, merge, teardown)
auto-recovery.tsExpected artifact resolution, completed-key persistence, self-healing
auto-timeout-recovery.tsTimed-out unit recovery and continuation
auto-timers.tsUnit supervision — soft/idle/hard timeouts, continue-here monitor
complexity-classifier.tsUnit complexity classification (light/standard/heavy)
model-router.tsDynamic model routing with cost-aware selection
model-cost-table.tsBuilt-in per-model cost data for cross-provider comparison
routing-history.tsAdaptive learning from routing outcomes
captures.tsFire-and-forget thought capture and triage classification
triage-resolution.tsCapture resolution (inject, defer, replan, quick-task)
visualizer-overlay.tsWorkflow visualizer TUI overlay
visualizer-data.tsData loading for visualizer tabs
visualizer-views.tsTab renderers (progress, deps, metrics, timeline, discussion status)
metrics.tsToken and cost tracking ledger
state.tsState derivation from disk
session-lock.tsOS-level exclusive session locking (proper-lockfile)
crash-recovery.tsLock file management for crash detection and recovery
preferences.tsPreference loading, merging, validation
git-service.tsGit operations — commit, merge, worktree sync, completed-units cross-boundary sync
unit-id.tsCentralized parseUnitId() — milestone/slice/task extraction from unit IDs
error-utils.tsgetErrorMessage() — unified error-to-string conversion
roadmap-slices.tsRoadmap parser with prose fallback for LLM-generated variants
memory-extractor.tsExtract reusable knowledge from session transcripts
memory-store.tsPersistent memory store for cross-session knowledge
queue-order.tsMilestone queue ordering