{"id":47238861,"url":"https://github.com/jongio/dispatch","last_synced_at":"2026-06-06T08:00:49.089Z","repository":{"id":344116308,"uuid":"1177485713","full_name":"jongio/dispatch","owner":"jongio","description":"A terminal UI for browsing and launching GitHub Copilot CLI sessions. Search,   filter, group, preview, and resume — without leaving the terminal.","archived":false,"fork":false,"pushed_at":"2026-06-06T06:04:20.000Z","size":121737,"stargazers_count":19,"open_issues_count":15,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-06T07:15:53.292Z","etag":null,"topics":["copilot","github"],"latest_commit_sha":null,"homepage":"https://jongio.github.io/dispatch","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/jongio.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-10T04:19:28.000Z","updated_at":"2026-06-06T05:57:15.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jongio/dispatch","commit_stats":null,"previous_names":["jongio/dispatch"],"tags_count":26,"template":false,"template_full_name":null,"purl":"pkg:github/jongio/dispatch","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jongio%2Fdispatch","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jongio%2Fdispatch/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jongio%2Fdispatch/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jongio%2Fdispatch/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jongio","download_url":"https://codeload.github.com/jongio/dispatch/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jongio%2Fdispatch/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33973868,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-06T02:00:07.033Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["copilot","github"],"created_at":"2026-03-14T00:21:03.896Z","updated_at":"2026-06-06T08:00:49.081Z","avatar_url":"https://github.com/jongio.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Dispatch\n\n[![CI](https://github.com/jongio/dispatch/actions/workflows/ci.yml/badge.svg)](https://github.com/jongio/dispatch/actions/workflows/ci.yml)\n[![Go Report Card](https://goreportcard.com/badge/github.com/jongio/dispatch)](https://goreportcard.com/report/github.com/jongio/dispatch)\n[![Go Reference](https://pkg.go.dev/badge/github.com/jongio/dispatch.svg)](https://pkg.go.dev/github.com/jongio/dispatch)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n[![Go Version](https://img.shields.io/github/go-mod/go-version/jongio/dispatch)](go.mod)\n[![golangci-lint](https://img.shields.io/badge/lint-golangci--lint-00ADD8?logo=go)](https://golangci-lint.run)\n[![Race Detector](https://img.shields.io/badge/race_detector-enabled-green?logo=go)](https://go.dev/doc/articles/race_detector)\n[![govulncheck](https://img.shields.io/badge/vulncheck-govulncheck-blue?logo=go)](https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck)\n[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey)](#)\n\nA terminal UI for browsing and launching GitHub Copilot CLI sessions.\n\nDispatch reads your local Copilot CLI session store and presents every past session in a searchable, sortable, groupable TUI. Full-text search, conversation previews, directory filtering, five built-in themes, and four launch modes — all without leaving the terminal.\n\n![Dispatch terminal UI](web/public/screenshots/one-half-light/hero-main.png)\n\n## Features\n\n- **Full-text search** (`/`) — FTS5 full-text search with BM25 ranking when available, falling back to LIKE for older CLI versions. Two-tier: quick search (summaries, branches, repos, directories) returns results instantly; deep search (turns, checkpoints, files, refs) kicks in after 300ms. Searching a number (e.g. \"42\", \"#42\", \"PR42\") also matches session refs (PRs, issues, commits)\n- **Directory filtering** (`f`) — hierarchical tree panel for toggling directory exclusion, persisted to config\n- **Sorting** (`s` / `S`) — 5 fields (updated, folder, name, created, turns) with toggleable direction\n- **Grouping (pivot) modes** (`Tab`) — flat, folder, repo, branch, date — displayed as collapsible trees with session counts\n- **Time range filtering** (`1`–`4`) — 1 hour, 1 day, 7 days, all\n- **Preview panel** (`p`) — metadata, chat-style conversation bubbles, checkpoints (up to 5), files (up to 5), refs (up to 5), scroll indicators. Toggle conversation sort order with `o`. Click the session ID row to copy it to clipboard\n- **Copy session ID** (`c`) — copy the selected session's ID to the system clipboard. Also available by clicking the ID row in the preview pane\n- **Four launch modes** (`Enter` / `t` / `w` / `e`) — in-place, new tab, new window, split pane (Windows Terminal) with per-session overrides\n- **Multi-session open** (`Space` / `L` / `a` / `d`) — select multiple sessions with Space, launch all at once with L, select/deselect all with a/d. Shift+↑/↓ for range selection, Ctrl+click and Shift+click for mouse selection\n- **Attention indicators** — colored dots showing real-time session status: working (blue, executing tools), thinking (cyan, generating response), compacting (magenta, context compaction), waiting (purple), active (green), stale (yellow), interrupted (orange ⚡), idle (gray). Jump to next waiting session with `n`, resume interrupted sessions with `R`, filter by status with `!`\n- **Host type icons** — sessions display an icon indicating their origin: CLI (desktop), Cloud (cloud), or Actions (gear)\n- **Incremental auto-refresh** — the session list auto-refreshes within 2 seconds when the Copilot CLI writes new data (WAL file polling when focused). No manual reindex needed for normal use\n- **Plan indicator** (`v`) — a dot next to sessions that have a `plan.md` file (`~/.copilot/session-state/{session-id}/plan.md`). Press `v` to view the plan in the preview pane. Filter sessions with plans via the `!` status picker\n- **Work status detection** — analyzes `plan.md` files to identify sessions with incomplete planned work. Colored dots show completion status in the session list and preview panel. Press `R` to explicitly scan work status. Filter by work completion via the `!` status picker. Supports AI-powered analysis via Copilot SDK `analyze_completion` tool\n- **Session hiding** (`h` / `H`) — hide sessions from the list, toggle visibility of hidden sessions, persistent state\n- **Session favorites** (`*`) — star sessions as favorites. Filter to show only favorites via the `!` status picker\n- **Settings panel** (`,`) — 10 fields: Yolo Mode, Agent, Model, Launch Mode, Pane Direction, Terminal, Shell, Custom Command, Theme, Crash Recovery\n- **Shell picker** — auto-detects installed shells, modal picker when multiple available\n- **5 built-in themes** — Dispatch Dark, Dispatch Light, Campbell, One Half Dark, One Half Light + custom via Windows Terminal JSON\n- **Help overlay** (`?`) — two-column grouped keyboard shortcuts\n- **Mouse support** — click, double-click, Ctrl+double-click (window), Shift+double-click (tab), pane-aware scroll wheel\n- **Nerd Font detection** — auto-detects Nerd Fonts and uses rich icons, falls back to ASCII\n- **Windows Terminal theme detection** — inherits the active terminal color scheme\n- **Refresh** (`r`) — reload the session store without restarting\n- **Demo mode** — `dispatch --demo` with synthetic data for experimentation\n- **Self-update** — `dispatch update` checks GitHub Releases and upgrades in-place; background update check notifies on new versions\n- **Maintenance** — `--reindex` (manual rebuild of the session index via Copilot CLI PTY — repair action only), `--clear-cache` (reset config)\n- **Cross-platform** — Windows (amd64/arm64), macOS (amd64/arm64), Linux (amd64/arm64)\n\n### Feature Highlights\n\n| Search \u0026 Preview | Grouping \u0026 Filtering |\n|---|---|\n| ![Search](web/public/screenshots/one-half-light/search-active.png) | ![Grouping by folder](web/public/screenshots/one-half-light/pivot-folder.png) |\n| ![Preview panel](web/public/screenshots/one-half-light/preview-panel.png) | ![Filter panel](web/public/screenshots/one-half-light/filter-panel.png) |\n\n| Multi-Select | Attention Indicators |\n|---|---|\n| ![Multi-select sessions](web/public/screenshots/one-half-light/multi-select.png) | ![Attention status picker](web/public/screenshots/one-half-light/attention-picker.png) |\n\n| Settings | Help Overlay |\n|---|---|\n| ![Settings panel](web/public/screenshots/one-half-light/config-panel.png) | ![Help overlay](web/public/screenshots/one-half-light/help-overlay.png) |\n\n## Requirements\n\n- **GitHub Copilot CLI** installed and used at least once (so the session store exists)\n- **Go 1.26+** — only required when building from source; binary releases have no dependencies\n\n## Installation\n\n### Shell script (Linux / macOS)\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/jongio/dispatch/main/install.sh | sh\n```\n\nTo install a specific version:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/jongio/dispatch/main/install.sh | sh -s -- v0.1.0\n```\n\n### PowerShell (Windows)\n\n```powershell\nirm https://raw.githubusercontent.com/jongio/dispatch/main/install.ps1 | iex\n```\n\nTo install a specific version:\n\n```powershell\n$v=\"v0.1.0\"; irm https://raw.githubusercontent.com/jongio/dispatch/main/install.ps1 | iex\n```\n\n### From source\n\nRequires Go 1.26+:\n\n```sh\ngo install github.com/jongio/dispatch/cmd/dispatch@latest\n```\n\nOr clone and build locally:\n\n```sh\ngit clone https://github.com/jongio/dispatch.git\ncd dispatch\ngo install ./cmd/dispatch/\n```\n\nThe installer also creates a `disp` alias automatically.\n\n## Usage\n\n```sh\ndispatch\n```\n\n### Example Workflow\n\n1. Run `dispatch` (or `disp`) in your terminal\n2. Press `/` to search for previous sessions — try a keyword like \"auth\" or \"refactor\"\n3. Navigate with arrow keys or `j`/`k`\n4. Press `p` to toggle the preview pane and read the conversation\n5. Press `Enter` to resume the selected session (opens in a new tab by default)\n6. Use `Tab` to cycle grouping modes (folder → repo → branch → date → flat)\n7. Press `s` to cycle sort fields, `S` to flip direction\n8. Press `,` to open settings — change theme, launch mode, model, and more\n\n### Key Bindings\n\n#### Navigation\n\n| Key | Action |\n|---|---|\n| `↑` / `k` | Move up |\n| `↓` / `j` | Move down |\n| `←` | Collapse group |\n| `→` | Expand group |\n\n#### Launch \u0026 Session\n\n| Key | Action |\n|---|---|\n| `Enter` | Launch selected session (or toggle folder) |\n| `w` | Launch in new window |\n| `t` | Launch in new tab |\n| `e` | Launch in split pane (Windows Terminal) |\n\n#### Multi-Select\n\n| Key | Action |\n|---|---|\n| `Space` | Toggle selection on current session |\n| `Shift+↑` | Extend selection upward (range select) |\n| `Shift+↓` | Extend selection downward (range select) |\n| `L` | Launch all selected sessions (or all in folder) |\n| `a` | Select all visible sessions |\n| `d` | Deselect all |\n\n#### Attention \u0026 Status\n\n| Key | Action |\n|---|---|\n| `n` | Jump to next waiting session |\n| `N` | Resume all interrupted sessions |\n| `R` | Scan work status across sessions with plans |\n| `!` | Filter by attention status, plans, favorites, and work completion |\n| `h` | Hide/unhide current session |\n| `H` | Toggle visibility of hidden sessions |\n| `*` | Toggle favorite on current session |\n\n#### Search \u0026 Filter\n\n| Key | Action |\n|---|---|\n| `/` | Focus search bar |\n| `Esc` | Clear search / close overlay |\n| `f` | Open filter panel |\n\n#### View \u0026 Sorting\n\n| Key | Action |\n|---|---|\n| `s` | Cycle sort field |\n| `S` | Toggle sort direction |\n| `Tab` | Cycle grouping mode |\n| `p` | Toggle preview panel |\n| `P` | Cycle preview position (right → bottom → left → top) |\n| `v` | View plan in preview pane |\n| `o` | Toggle conversation sort order (oldest/newest first) |\n| `c` | Copy session ID to clipboard |\n| `PgUp` / `PgDn` | Scroll preview |\n| `r` | Refresh session store |\n| `,` | Open settings panel |\n\n#### Time Range (when search is not focused)\n\n| Key | Action |\n|---|---|\n| `1` | Last 1 hour |\n| `2` | Last 1 day |\n| `3` | Last 7 days |\n| `4` | All time |\n\n#### Settings \u0026 Info\n\n| Key | Action |\n|---|---|\n| `?` | Show help overlay |\n| `q` | Quit |\n| `Ctrl+C` | Force quit |\n\n#### Overlay Navigation\n\nKeys inside overlays (filter, settings, shell picker, help):\n\n| Key | Action |\n|---|---|\n| `↑` / `k`, `↓` / `j` | Navigate |\n| `Enter` | Select / apply / toggle |\n| `Esc` | Close overlay |\n| `Space` | Toggle checkbox (filter panel) |\n| `←` / `→` | Collapse / expand (filter panel) |\n\n### Mouse\n\n| Action | Effect |\n|---|---|\n| Click session | Select it |\n| Click folder header | Expand or collapse |\n| Double-click session | Launch it |\n| Ctrl + click session | Toggle selection without opening |\n| Shift + click session | Range select from last click |\n| Double-click (with selections) | Open all selected sessions |\n| Double-click folder | Launch new session in that directory |\n| Ctrl + double-click | Force new window |\n| Shift + double-click | Force new tab |\n| Scroll wheel (list) | Scroll session list |\n| Scroll wheel (preview) | Scroll preview pane |\n| Click header elements | Interact with search, time range, sort, pivot |\n| Click session ID in preview | Copy session ID to clipboard |\n| Click conversation sort arrow | Toggle conversation sort order |\n\n## Configuration\n\nConfiguration is stored in the platform-specific config directory:\n\n- **Linux**: `~/.config/dispatch/config.json`\n- **macOS**: `~/Library/Application Support/dispatch/config.json`\n- **Windows**: `%APPDATA%\\dispatch\\config.json`\n\n### Options\n\n| Key | Type | Default | Description |\n|-----|------|---------|-------------|\n| `default_shell` | string | `\"\"` | Preferred shell (`bash`, `zsh`, `pwsh`, `cmd.exe`). Empty = auto-detect |\n| `default_terminal` | string | `\"\"` | Terminal emulator. Empty = auto-detect |\n| `default_time_range` | string | `\"1d\"` | Time filter: `1h`, `1d`, `7d`, `all` |\n| `default_sort` | string | `\"updated\"` | Sort field: `updated`, `created`, `turns`, `name`, `folder` |\n| `default_pivot` | string | `\"folder\"` | Grouping: `none`, `folder`, `repo`, `branch`, `date` |\n| `show_preview` | bool | `true` | Show preview pane on startup |\n| `preview_position` | string | `\"right\"` | Position of the preview pane: `right`, `bottom`, `left`, `top` |\n| `max_sessions` | int | `100` | Maximum sessions to load |\n| `yoloMode` | bool | `false` | Pass `--allow-all` to Copilot CLI (auto-confirm commands) |\n| `agent` | string | `\"\"` | Pass `--agent \u003cname\u003e` to Copilot CLI |\n| `model` | string | `\"\"` | Pass `--model \u003cname\u003e` to Copilot CLI |\n| `launch_mode` | string | `\"tab\"` | How to open sessions: `in-place`, `tab`, `window`, `pane` |\n| `pane_direction` | string | `\"auto\"` | Split direction for pane mode: `auto`, `right`, `down`, `left`, `up` (see note below) |\n| `custom_command` | string | `\"\"` | Custom launch command (`{sessionId}` is replaced) |\n| `excluded_dirs` | array | `[]` | Directory paths to hide from session list |\n| `theme` | string | `\"auto\"` | Color scheme: `auto` or a named scheme |\n| `workspace_recovery` | bool | `true` | Detect sessions interrupted by crash/reboot |\n| `ai_search` | bool | `false` | Enable Copilot SDK-powered AI semantic search |\n| `hiddenSessions` | array | `[]` | Session IDs hidden from the main list |\n| `favoriteSessions` | array | `[]` | Session IDs starred as favorites |\n\n#### Pane Direction Semantics\n\nWhen `launch_mode` is `\"pane\"`, the `pane_direction` value maps to Windows Terminal's `-H` / `-V` split-pane flags:\n\n| Direction | WT Flag | Meaning |\n|-----------|---------|---------|\n| `down` | `-H` | Horizontal split — divider runs horizontally, new pane below |\n| `up` | `-H` | Horizontal split — WT controls actual placement (closest available) |\n| `right` | `-V` | Vertical split — divider runs vertically, new pane to the right |\n| `left` | `-V` | Vertical split — WT controls actual placement (closest available) |\n| `auto` | *(none)* | Windows Terminal decides automatically |\n\n\u003e **Note:** `-H` and `-V` control split *orientation* only (the direction the divider runs). Windows Terminal decides actual pane placement based on available space.\n\n### Example config.json\n\n```json\n{\n  \"default_shell\": \"\",\n  \"default_terminal\": \"\",\n  \"default_time_range\": \"1d\",\n  \"default_sort\": \"updated\",\n  \"default_pivot\": \"folder\",\n  \"show_preview\": true,\n  \"preview_position\": \"right\",\n  \"max_sessions\": 100,\n  \"yoloMode\": false,\n  \"agent\": \"\",\n  \"model\": \"\",\n  \"launch_mode\": \"tab\",\n  \"pane_direction\": \"auto\",\n  \"custom_command\": \"\",\n  \"excluded_dirs\": [],\n  \"theme\": \"auto\",\n  \"workspace_recovery\": true,\n  \"ai_search\": false,\n  \"hiddenSessions\": [],\n  \"favoriteSessions\": []\n}\n```\n\n### Custom Command\n\nSet `custom_command` to replace the default Copilot CLI launch entirely. Use `{sessionId}` as the placeholder. When set, Agent, Model, and Yolo Mode fields are ignored.\n\n```json\n\"custom_command\": \"my-tool resume {sessionId}\"\n```\n\n## Themes\n\nFive built-in color schemes:\n\n- Dispatch Dark\n- Dispatch Light\n- Campbell\n- One Half Dark\n- One Half Light\n\n| Dispatch Dark | Dispatch Light | Campbell |\n|---|---|---|\n| ![Dispatch Dark](web/public/screenshots/dispatch-dark/hero-main.png) | ![Dispatch Light](web/public/screenshots/dispatch-light/hero-main.png) | ![Campbell](web/public/screenshots/campbell/hero-main.png) |\n\n| One Half Dark | One Half Light |\n|---|---|\n| ![One Half Dark](web/public/screenshots/one-half-dark/hero-main.png) | ![One Half Light](web/public/screenshots/one-half-light/hero-main.png) |\n\nSet `theme` to `\"auto\"` (default) for automatic light/dark detection based on your terminal background. Or set it to any built-in scheme name.\n\n### Custom Themes\n\nAdd custom color schemes using Windows Terminal JSON format in the `schemes` array of your config file. Each scheme name becomes available in the settings theme selector.\n\n## CLI Flags\n\n| Flag | Description |\n|---|---|\n| `--help`, `-h`, `help` | Show usage information |\n| `--version`, `-v`, `version` | Print the version and exit |\n| `update` | Update dispatch to the latest release |\n| `--demo` | Load a demo database with synthetic sessions |\n| `--reindex` | Full chronicle reindex via Copilot CLI (falls back to FTS5 rebuild) |\n| `--clear-cache` | Reset all configuration to defaults |\n\nA background update check runs on every launch and notifies you when a new version is available.\n\nUnknown flags print an error message with usage help and exit with code 1.\n\n## Environment Variables\n\n| Variable | Description |\n|---|---|\n| `DISPATCH_DB` | Override the path to the Copilot CLI session store database |\n| `DISPATCH_LOG` | Path to a log file (enables debug logging) |\n\n## Shell Aliases\n\nThe installer creates a `disp` shorthand automatically. To add it manually:\n\n```sh\n# bash / zsh\nalias disp=\"dispatch\"\n```\n\n```powershell\n# PowerShell\nSet-Alias -Name disp -Value dispatch\n```\n\n## Troubleshooting\n\n**\"dispatch: command not found\"**\n- Ensure `$GOPATH/bin` (or the install directory) is in your `PATH`\n- Restart your terminal after installation\n\n**\"session store not found\"**\n- Copilot CLI must have been used at least once to create the session database\n- Check that `~/.copilot/session-store.db` exists (or the platform equivalent)\n- Override with the `DISPATCH_DB` environment variable if your database is elsewhere\n\n**Sessions not appearing**\n- Check your time range filter — the default shows only the last day\n- Use `/` to search by keyword\n- Check `excluded_dirs` in your config\n- Try `dispatch --reindex` to rebuild the session index (or press `r` inside the TUI)\n\n## Development\n\n### Quick Start\n\n```sh\ngit clone https://github.com/jongio/dispatch.git\ncd dispatch\ngo build ./cmd/dispatch/\n```\n\n### Build Targets (via [Mage](https://magefile.org))\n\n| Target | Command | Description |\n|---|---|---|\n| **Install** | `mage install` | Test → kill stale → build → ensure PATH → verify |\n| **Test** | `mage test` | `go test` with race detector + shuffle |\n| **TestWSL** | `mage testWSL` | Run tests under WSL Linux for Unix code path coverage |\n| **CoverageReport** | `mage coverageReport` | Generate `coverage.html` with atomic coverage profile |\n| **Preflight** | `mage preflight` | Full CI check (11 steps — see below) |\n| **Vet** | `mage vet` | `go vet ./...` |\n| **Lint** | `mage lint` | golangci-lint (falls back to go vet) |\n| **Fmt** | `mage fmt` | Format all Go source files |\n| **Build** | `mage build` | Compile dev binary with version info |\n| **Clean** | `mage clean` | Remove `bin/` directory |\n| **Contributors** | `mage contributors` | Regenerate CONTRIBUTORS.md from git history |\n\n### Quality Pipeline\n\n`mage preflight` runs the same checks as CI — if preflight passes, CI will pass:\n\n```\nStep  1/11  gofmt           — Auto-format source files\nStep  2/11  go mod tidy     — Clean up module dependencies\nStep  3/11  go vet          — Static analysis\nStep  4/11  golangci-lint   — Extended linter suite (20+ linters)\nStep  5/11  go build        — Compile all packages\nStep  6/11  go test         — Unit \u0026 integration tests (shuffled, race-detected)\nStep  7/11  go test -race   — Race detection (requires gcc / CGO)\nStep  8/11  WSL tests       — Unix code path coverage (skipped if WSL unavailable)\nStep  9/11  govulncheck     — Known vulnerability scan\nStep 10/11  gofumpt         — Strict formatting enforcement\nStep 11/11  deadcode        — Unreachable code detection\n```\n\n### CI Pipeline\n\nEvery push and PR runs on GitHub Actions:\n\n| Check | Description |\n|---|---|\n| `go build` | Compilation gate |\n| `golangci-lint` | Static analysis with extended linters |\n| `go vet` | Go's built-in static analyzer |\n| `go test` | Full test suite |\n| `go test -race` | Race condition detection (CGO enabled) |\n| `govulncheck` | Known vulnerability scan |\n| Cross-compile | Verify `darwin/amd64`, `darwin/arm64`, `windows/amd64`, `windows/arm64` |\n\n### Test Quality\n\n| Metric | Value |\n|---|---|\n| Test packages | 7/7 passing |\n| Coverage | ~79% overall (styles 99%, components 90%, config 88%) |\n| Test files | 39 test files for 44 source files |\n| Test:source ratio | 1.9:1 lines |\n| Test patterns | Table-driven, `t.Helper()`, standard library only |\n| Race detector | ✅ CI + local (when gcc available) |\n| Shuffle | ✅ Randomized test order |\n| Benchmarks | SQLite queries, theme derivation, session list rendering |\n| WSL cross-test | ✅ Unix code paths via `mage testWSL` |\n\n### Optional Tools\n\nThese enhance the local development experience. All skip gracefully if not installed:\n\n```sh\ngo install github.com/golangci/golangci-lint/cmd/golangci-lint@latest  # Extended linting\ngo install golang.org/x/vuln/cmd/govulncheck@latest                   # Vulnerability scanning\ngo install mvdan.cc/gofumpt@latest                                     # Strict formatting\ngo install golang.org/x/tools/cmd/deadcode@latest                      # Dead code detection\n```\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.\n\n## Security\n\nSee [SECURITY.md](SECURITY.md) for the security policy and vulnerability reporting.\n\n## Built With\n\n- [Bubble Tea](https://github.com/charmbracelet/bubbletea) — TUI framework\n- [Lip Gloss](https://github.com/charmbracelet/lipgloss) — Terminal styling\n- [Bubbles](https://github.com/charmbracelet/bubbles) — TUI components\n- [modernc SQLite](https://pkg.go.dev/modernc.org/sqlite) — Pure-Go SQLite driver\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjongio%2Fdispatch","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjongio%2Fdispatch","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjongio%2Fdispatch/lists"}