Releases: m4ttstack/rt
Release list
v2.7.0
the worktree lifecycle release. rt worktree replaces the parking lot with a provision/dispose lifecycle backed by an on-deck pool of ready trees, and the daemon moves to realtime event tracking with per-repo grants. also ships the @mattstack/rt-client package, StrongDM agent verbs, and a batch of nav picker quality-of-life work. (an experimental mattcloud sandbox surface was built and retired entirely within this range, so it ships nothing.)
Worktree lifecycle
- new
rt worktreeverb family:provision,create,dispose,list,freshen,adopt, andeach, with a nav picker when invoked bare - on-deck pool: pre-created worktrees kept ready by the daemon (replenish/shrink), a ready-step engine with changed-glob triggers, and name pools with ticket-derived branch names
provisionclaims from the pool or cold-creates, revalidates the claim under lock, and surfaces degraded readiness instead of hiding itdisposeis guarded (MR-sha anchor, tolerant of generated drift, lease-aware) and renames to trash with async reaping, so verb latency is independent of tree size; if the trash rename fails, the branch and registry record are kept- merge reactor: merged MRs trigger auto-return of your shell and guarded auto-dispose of the finished tree
- per-repo worktree registry with a reconcile pass (ground-truth branches, unmanaged-tree adoption), epoch-checked saves so stale snapshots cannot clobber concurrent writes, and per-tree operation locks
- the parking lot is deleted;
rt parkremains as a deprecated stub pointing atrt worktree - install dedup sees through env-var prefixes, and pnpm implicit installs default to a plain install
Daemon: realtime tracking and freshness
- per-repo tracking levels (
live/poll/off) with per-cache opt-in grants, edited interactively viart daemon track - realtime events watchers replace the ActionCable MR subscriptions; events fan out to granted stores (project upserts, teammate pushes, notes)
- delta sync: incremental
updatedAfterpulls with a daily deep reconcile, demand-scoped to a 30-day window; a failed deep reconcile falls back to delta instead of wedging the repo - pipeline top-up inside delta sync (4-wide fetches, restores 5-minute pipeline freshness, stuck pipelines age out after 24h)
- freshness on demand:
cache:readtakes a max-age gate, andrt daemon statusgains--fresh/--max-ageplus events freshness reporting - discussions lifted into
~/.rt/discussions.jsonwith grant-aware reads; bot-authored notes are skipped - MR actions write back: mutations refresh the stores they changed, and a failed read-back can no longer report a succeeded mutation as failed
- notification correctness:
mr_readykeys on mergeability,mr_approvedrequires a new approver, conflict flaps stopped mr:by-branchbatch read (store-first with forge write-back)secrets:forge-token, a grant-gated forge-token verb- cron trigger layer: broadcast pattern to debounced command
rt daemon statusstops calling a live daemon dead
rt-client
- published as
@mattstack/rt-client: typed commands, unix-socket transport, relay, repo-name resolution, and a fake-daemon subpath export for tests - daemon handlers for the client catalog carry the catalog's own types
StrongDM
- agent JSON envelopes for
connect,status, andconnections, with a production guard and non-interactive reason/duration defaults - desktop-app preflight: launches SDM.app when the CLI probe errors
rt sdm connectionslisting, and the rt-sdm-connect agent orchestration skill
Navigation
- image previews in the fzf preview pane, with iTerm2 routing and character-art fallback when kitten cannot render
- live listing refresh while the picker is open, via the nav-watch fs-event bridge
- sort menu on ctrl-s, list wraparound at both ends, and cursor retention after opening a file
- fzf
--expectkeys are honored on exit 1, so ctrl-up no longer acts as a cancel; the run repo picker treats ctrl-up as back
Notifications and tray
- notification sounds coalesce, so a burst plays one tone
- notifier fallback dispatch is an async spawn with kill escalation
Fixes and internals
- dev-mode wrapper replaces
--tsconfig-overridewith a cwd pivot (bun#22023) - glance renamed to
@mattstack/glanceand bumped through 0.18, following its rebase contract - tests isolate HOME via a bunfig preload, and log writers resolve
~/.rt/logsat call time, so test runs stop polluting real logs - README refreshed for the public profile
Full Changelog: v2.5.0...v2.6.0
v2.6.0
the worktree lifecycle release. rt worktree replaces the parking lot with a provision/dispose lifecycle backed by an on-deck pool of ready trees, and the daemon moves to realtime event tracking with per-repo grants. also ships the @mattstack/rt-client package, StrongDM agent verbs, and a batch of nav picker quality-of-life work. (an experimental mattcloud sandbox surface was built and retired entirely within this range, so it ships nothing.)
Worktree lifecycle
- new
rt worktreeverb family:provision,create,dispose,list,freshen,adopt, andeach, with a nav picker when invoked bare - on-deck pool: pre-created worktrees kept ready by the daemon (replenish/shrink), a ready-step engine with changed-glob triggers, and name pools with ticket-derived branch names
provisionclaims from the pool or cold-creates, revalidates the claim under lock, and surfaces degraded readiness instead of hiding itdisposeis guarded (MR-sha anchor, tolerant of generated drift, lease-aware) and renames to trash with async reaping, so verb latency is independent of tree size; if the trash rename fails, the branch and registry record are kept- merge reactor: merged MRs trigger auto-return of your shell and guarded auto-dispose of the finished tree
- per-repo worktree registry with a reconcile pass (ground-truth branches, unmanaged-tree adoption), epoch-checked saves so stale snapshots cannot clobber concurrent writes, and per-tree operation locks
- the parking lot is deleted;
rt parkremains as a deprecated stub pointing atrt worktree - install dedup sees through env-var prefixes, and pnpm implicit installs default to a plain install
Daemon: realtime tracking and freshness
- per-repo tracking levels (
live/poll/off) with per-cache opt-in grants, edited interactively viart daemon track - realtime events watchers replace the ActionCable MR subscriptions; events fan out to granted stores (project upserts, teammate pushes, notes)
- delta sync: incremental
updatedAfterpulls with a daily deep reconcile, demand-scoped to a 30-day window; a failed deep reconcile falls back to delta instead of wedging the repo - pipeline top-up inside delta sync (4-wide fetches, restores 5-minute pipeline freshness, stuck pipelines age out after 24h)
- freshness on demand:
cache:readtakes a max-age gate, andrt daemon statusgains--fresh/--max-ageplus events freshness reporting - discussions lifted into
~/.rt/discussions.jsonwith grant-aware reads; bot-authored notes are skipped - MR actions write back: mutations refresh the stores they changed, and a failed read-back can no longer report a succeeded mutation as failed
- notification correctness:
mr_readykeys on mergeability,mr_approvedrequires a new approver, conflict flaps stopped mr:by-branchbatch read (store-first with forge write-back)secrets:forge-token, a grant-gated forge-token verb- cron trigger layer: broadcast pattern to debounced command
rt daemon statusstops calling a live daemon dead
rt-client
- published as
@mattstack/rt-client: typed commands, unix-socket transport, relay, repo-name resolution, and a fake-daemon subpath export for tests - daemon handlers for the client catalog carry the catalog's own types
StrongDM
- agent JSON envelopes for
connect,status, andconnections, with a production guard and non-interactive reason/duration defaults - desktop-app preflight: launches SDM.app when the CLI probe errors
rt sdm connectionslisting, and the rt-sdm-connect agent orchestration skill
Navigation
- image previews in the fzf preview pane, with iTerm2 routing and character-art fallback when kitten cannot render
- live listing refresh while the picker is open, via the nav-watch fs-event bridge
- sort menu on ctrl-s, list wraparound at both ends, and cursor retention after opening a file
- fzf
--expectkeys are honored on exit 1, so ctrl-up no longer acts as a cancel; the run repo picker treats ctrl-up as back
Notifications and tray
- notification sounds coalesce, so a burst plays one tone
- notifier fallback dispatch is an async spawn with kill escalation
Fixes and internals
- dev-mode wrapper replaces
--tsconfig-overridewith a cwd pivot (bun#22023) - glance renamed to
@mattstack/glanceand bumped through 0.18, following its rebase contract - tests isolate HOME via a bunfig preload, and log writers resolve
~/.rt/logsat call time, so test runs stop polluting real logs - README refreshed for the public profile
Full Changelog: v2.5.0...v2.6.0
v2.5.0
first release with docs. ships the rt.cool documentation site (generated command reference plus hand-written guides), full flag/arg coverage across every built-in command, and the release tooling that keeps it current. also lands the interactive commit picker and a batch of daemon and tray fixes.
Documentation
- rt.cool docs site: Docusaurus scaffold, 97-page generated command reference, and hand-written guides (getting-started, daemon, logging, plugins, StrongDM, tray, context extension, common flags)
- full flag/arg coverage: every built-in command now declares its real flags and positionals (0 coverage gaps)
docs:genanddocs:checkscripts: reference regenerates from the command tree, and drift is caught in the validator- release tooling:
update-docs.tsregenerates docs and drafts these notes,deploy-docs.shpublishes to Cloudflare Pages, and thert-releaseandrt-docsskills drive the flow
Commit
- interactive commit picker: select-all on load, visible discard prompt, backed by tested
lib/commit-opsprimitives
Daemon
- stop dropping the first process of headerless
psoutput - make periodic scanners async so status polls can't time out
- add async
runCapturesubprocess helper
Tray
- require two consecutive failed polls before going red
Full Changelog: v2.4.0...v2.5.0
Full Changelog: v2.4.0...v2.5.0
v2.4.0
v2.4.0
Navigation
- Add a preview pane to the file/directory picker — file contents or directory listings alongside the list (skips
node_modules, caps output, one name per line for directory previews) - Add deep-jump mode — recursive listing via
fd(with a walk fallback) to jump deep into a tree, with a total result cap - Add a hidden-files toggle
- Hide key hints behind a Ctrl+/ reveal — a true toggle rendered as a narrow two-column block spread across the list width
- Picker cursor now opens on the first real row instead of a heading separator
Worktrees
- Add
rt worktree eachto run a command across every worktree of a repo, with a parsed per-worktree summary
Repos
rt cdnow surfaces unregistered sibling repos — scanned one level deep from your registered repos and shown dimmed with an "unregistered" hint, so you can jump to a repo the first time without `cd`-ing there manually first
Tray & Notifications
- Tray surfaces process changes within ~2s, plus panel interaction polish
- Drop parked-workload alerts and exempt agents from runaway-process alerts
Fixes
- Fix parking lot errors
Full Changelog: v2.3.0...v2.4.0
v2.3.0
v2.3.0
Tray Improvements
- Detect when macOS Mission Control has stolen Control+Up at startup; fire a one-time notification with a "Show Me How" action that opens step-by-step instructions for disabling it in System Settings
Navigation
- Add Ctrl+F shortcut to open the current directory in Finder
Full Changelog: v2.2.0...v2.3.0
Full Changelog: v2.2.0...v2.3.0
v2.2.0
v2.2.0
Process Scanner Enhancements
- Discover processes in sibling git worktrees (not just registered repo roots)
- Extract package-script invocations from process env (
pnpm start:lite:watch) - Track scan readiness so the tray can show a spinner before the first scan completes
Park-Time Process Killing
- When parking-lot parks a worktree, running workload processes (dev servers, builds, watchers) are killed automatically
- AI agents (claude, codex, gemini, aider, cursor-agent, copilot), shells, and .app processes are protected
- SIGTERM with 5s escalation to SIGKILL
- Configurable via
killProcessesin parking-lot config (default true)
Notification Improvements
- Multiple simultaneous runaway processes collapse into a single summary notification
- New parked-workload sweep detects processes still running in already-parked worktrees
- Kill action button on runaway and parked-workload notifications
- File-backed dedup store so notifications survive daemon restarts
Tray Single-Panel Consolidation
- Replaced separate NSMenu and popover with a unified single panel view
- Status strip with daemon health dot and gear menu (restart, stop, view logs, login toggle, updates, quit)
- New Script column showing the package-manager invocation that launched a process
- Worktree column now shows worktree name instead of full cwd path
- Loading spinner before first scan completes instead of misleading "No processes running" empty state
Full Changelog: v2.1.0...v2.2.0
Full Changelog: v2.1.0...v2.2.0
v2.1.0
v2.1.0
User Plugins
Extensible plugin system for adding custom commands to rt:
~/.rt/plugins/<name>/with aplugin.jsonmanifestrt plugin newscaffolds a new plugin (bun module or shell exec)rt plugin listandrt plugin validatefor discovery and diagnostics- Plugin commands merge into the root command tree with collision policy (user plugins win over built-ins)
- Lazy module handlers (Bun) and exec handlers (any shell script)
- Injected API contract (
~/.rt/plugin-api) for plugins to call back into rt - Plugin-scoped logging with correct day rollover (local time)
- Reserved fast-path name guard + kebab-case aliases in validation
- Dedicated plugin author guide in docs
- E2e test suite for user plugins
SDM Picker Improvements
- Connection-state gutter indicator in the connect picker
- Live tunnel with flaky query probe correctly shows as connected, not failed
- Scan only postgres-family datasources, drop non-DB status entries
- Dedup picker + recents by resource, not key
Full Changelog: v2.0.2...v2.1.0
v2.0.2
SDM Scan + Enrichment Rewrite
Replace the connector-based SDM architecture with a simpler scan + enrichment model:
- Direct catalog scanner (rt-side, no connector binary needed)
- Declarative enrichment loader (JSONC files)
- Build connections from scan + enrichment data
- Drop connector runner, protocol, url resolver, map, suggest commands
- Daemon
sdm:catalogserves the rt scan directly (dropsdm:resolve) - Rewritten README StrongDM section for the new model
- Updated e2e tests (drop orphaned connector tests, add enrichment tests)
v2.0.1
- Fix: auto-login on
rt sdm connectwhen the session has expired - Fix: auto-login on
rt sdm connect <url>too
v2.0.0
Highlights
Major release introducing the StrongDM (SDM) subsystem, system process panel, sync/rebase escalation, and a complete logging architecture overhaul.
StrongDM Integration (rt sdm)
Full-featured SDM resource browser and connector management:
- Grouped picker with tiered resource display (recents, favorites, all)
- Browser-login popup flow for connector authentication
- Persistent catalog cache for instant cold starts
rt sdm connect <url>resolves remote deployed resource urls to sdm connectionrt sdm mapaudit view with LLM-powered suggest pass for unresolved gaps- Resolution provenance tracking (protocol v1.1)
- Connector runner with validation, TCP/query probes, and warm-up retry verification
- Daemon-side catalog/snapshot/recents/reconnect handlers
System Process Panel (rt-tray)
- Full system process scanner with CPU sampling and runaway detection
- NSOutlineView-based process tree with breadcrumb compression
- Kill actions, herdr pane focus, output reading
- Pop-out resizable window with autosaved frame
- Configurable runaway detection thresholds via
rt settings - Purple herdr badges, coral Claude Code badges
- Multi-select menus, hover masks, tooltips
Sync & Rebase Escalation
- Agent-driven conflict resolution via herdr panes
--json/--agent/--no-agentflags for sync- Rebase conflict escalation with the same flow
lib/herdr-agent.tsdrives Claude panes with readiness detection and retry logic
Logging Architecture
- Structural logging at central seams (CLI dispatch, daemon handleCommand, crashes)
~/.rt/logs/<surface>.YYYY-MM-DD[.N].logconvention with auto-discovery- Native stderr redirect captures bun panics
- Crash forensics for managed processes
- CLI invocation-level logging via exit/crash hooks
E2E Test Suite
- Termwright-based terminal automation harness
- Picker navigation, fzf separator skipping, identity selection tests
- Daemon lifecycle tests, verify --json backbone tests
- CI workflow with Termwright install + cargo cache
Breaking Changes
- Removed: daemon process-management subsystem (use herdr/tmux)
- Removed: proxy/bounce/tunnel/endpoints stacks from daemon
- Removed:
apps/dashboardweb app devOnlycommand-tree gating (SDM suggest hidden behind it)
Other
rt sdm set-email(moved from settings)- ctrl-up backs up one picker level in command tree
- Tray pop-out window frame persistence fix
Full Changelog: v1.3.3...v2.0.0