A live progress dashboard per worktree for Paseo, drawn from a file agents write with the paseo-progress command.
From the plugin's README
paseo-progress. One in the middle of a long step finds out when that step ends.paseo-progress. Agents need the skill, and an agent that skips the command leaves the dashboard behind.~/.local/state/paseo-progress/.npmjs · Paseo 0.9+
paseo plugin add npm:@stevecastaneda/paseo-progress@1.8.0GitHub · Paseo 0.8 fallback
paseo plugin add stevecastaneda/paseo-plugins --ref 215f0a6c6215f4963727138ba85c0f7ab7588c29 --path progressGit security status and fallback installation are pinned to commit 215f0a6c6215.
From the plugin's README
paseo plugin add npm:@stevecastaneda/paseo-progress
Or from Paseo's plugin registry: paseo plugin add stevecastaneda/progress.
Enable plugins under Settings → Plugins on the Paseo host. You need Node.js 22.18 or later on the daemon host.
Then install the paseo-progress command agents run. Open Progress from Command Center and press Install command in the banner. It adds one file, ~/.local/bin/paseo-progress, on the machine running the Paseo daemon, and the banner disappears once agents can run it. On Windows it also adds paseo-progress.cmd next to it, because PowerShell and cmd only run files with an extension like .cmd. The plugin writes nothing until you press it, and it never replaces a file something else put at that path.
To install from a terminal instead, or to put the command somewhere else:
dir="$(paseo plugin ls progress --json | node -pe 'JSON.parse(require("fs").readFileSync(0))[0].path')"
node "$([ -f "$dir/dist/server/cli.js" ] && echo "$dir/dist/server/cli.js" || echo "$dir/server/cli.ts")" install-launcher [path]
If paseo isn't on your PATH, use /Applications/Paseo.app/Contents/Resources/bin/paseo. The command doesn't name a plugin folder: each run asks Paseo (paseo plugin ls) which copy of the plugin it is running and runs that copy, so it keeps working after updates and npm run dev switches. The npm package carries the command as one JavaScript file in dist/, built with esbuild when publishing, beca…
README
A plugin for Paseo 0.11 and later that gives each worktree a live progress dashboard. Agents record progress with the paseo-progress command, which adds one line per change to the worktree's progress file. That file lives outside the repo, so git never sees it. The Progress panel draws the dashboard from that file and updates by itself.
The dashboard shows:
--waits-for T03) shows "Waits for Ticket 03" under its title until that one is done; waiting is the order of work, so it never counts as stuck, even if the agent also marked it blocked. Press a ticket for its story in a dialog. A summary on top shows its status and stage, time worked against the estimate as a bar that turns red past it, the agent's latest status line while it's working, and the agent on it. Tabs below hold the rest, each only when it has something: the ticket's write-up when it has a --source file (the start of it, with the rest a press away), a timeline of its stages and statuses with how long each took, and the activity, questions and deliverables that belong to it. The agent on a ticket shows by its chat title; pressing it opens that chat. Items tagged with --ticket belong exactly; older, untagged ones are matched by when they happened and marked "by time"Q2 (title): B for your reply. Files and links the agent attached (--file) open like deliverables: images, videos and text files preview in Paseo (with Back to the question), a folder lists its files there, links open in Paseo's browser, and other files open in their default app. From the pill's popover, the preview opens over the popover, which stays open so you can go back to it. Answers stay listed under the same reference.
The panel lives in Explorer, beside the agent chat, so you can watch both. Open it from Command Center with Open Progress. The cog at the top right of the panel opens the plugin's Settings. After an update, the panel shows what's new once, including any versions you skipped. When questions are waiting or something is stuck, a pill above the message box says so, for example 3 questions. With something stuck too, it shortens to 3Q · 1 stuck to fit. Pressing it opens a popover with each open question, its choices and their Copy buttons, and what is stuck, so you can answer without leaving the chat. Open Progress at the bottom opens the panel in Explorer.
On phones, where Paseo has no Explorer pane, Progress opens as a tab of its own, and the pill stays above the message box while a run is open so there's always a way in. SVG files and videos preview on desktop; on phones they open on the daemon host.
The first time a run starts in a worktree whose Progress panel has never been opened, the pill shows a spinner and reads Progress instead; pressing it opens the panel. Once the panel has been opened there, the plugin writes an empty progress-panel-opened file next to the progress file and the nudge never comes back, even for later runs. It doesn't open the panel by itself because Paseo switches to a workspace to open its panel, which would pull you away from whatever you're looking at.
paseo plugin add npm:@stevecastaneda/paseo-progress
Or from Paseo's plugin registry: paseo plugin add stevecastaneda/progress.
Enable plugins under Settings → Plugins on the Paseo host. You need Node.js 22.18 or later on the daemon host.
Then install the paseo-progress command agents run. Open Progress from Command Center and press Install command in the banner. It adds one file, ~/.local/bin/paseo-progress, on the machine running the Paseo daemon, and the banner disappears once agents can run it. On Windows it also adds paseo-progress.cmd next to it, because PowerShell and cmd only run files with an extension like .cmd. The plugin writes nothing until you press it, and it never replaces a file something else put at that path.
To install from a terminal instead, or to put the command somewhere else:
dir="$(paseo plugin ls progress --json | node -pe 'JSON.parse(require("fs").readFileSync(0))[0].path')"
node "$([ -f "$dir/dist/server/cli.js" ] && echo "$dir/dist/server/cli.js" || echo "$dir/server/cli.ts")" install-launcher [path]
If paseo isn't on your PATH, use /Applications/Paseo.app/Contents/Resources/bin/paseo. The command doesn't name a plugin folder: each run asks Paseo (paseo plugin ls) which copy of the plugin it is running and runs that copy, so it keeps working after updates and npm run dev switches. The npm package carries the command as one JavaScript file in dist/, built with esbuild when publishing, because Node won't run TypeScript from node_modules. That file includes zod (MIT), so installing the plugin downloads no other packages.
The command, and Install skill in the panel, look for Paseo's own command in this order:
PASEO_BIN, if you set it.PASEO_CLI, which Paseo sets for the agents it starts.paseo on your PATH./Applications/Paseo.app/Contents/Resources/bin/paseo on macOS, %LOCALAPPDATA%\Programs\Paseo\resources\bin\paseo.cmd on Windows.Setting PASEO_PROGRESS_PLUGIN_DIR to a plugin folder makes the command run that copy without asking Paseo. Use it only for testing, because an installed plugin's folder changes with every update.
Progress comes in English and Simplified Chinese. To pick one, open the cog in the Progress panel and choose Display → Language. System follows each device's language and falls back to English for anything other than Simplified Chinese, so Traditional Chinese stays in English for now.
The choice is saved on the Paseo host, so every device connected to it shows the same language. Progress can't follow Paseo's own language setting, because Paseo doesn't share it with plugins. Open dialogs and pills switch as soon as you change it. The Progress name and its Open Progress and Settings entries stay in English.
Progress translates its own labels, not what agents write. Titles, questions, choices, stages, notes, item labels like Ticket, file paths and release notes stay as written, and so do error messages from the host. The paseo-progress command and the reply you copy for an agent stay in English too.
Each worktree's progress lives outside the repo, in its own folder under ~/.local/state/paseo-progress/ on the daemon host. There's nothing to set up and nothing to hide: git never sees these files, and the plugin never edits a .gitignore or git's exclude file. The panel's empty state shows the exact path.
If you want to keep runs, at the bottom of the panel press Save to repo… and pick a folder (or name a new one). From then on, each run is saved as its own file there, like history/20261001-064512-export-feature.jsonl, and updated as the run goes. Commit them like any other file. One file per run means two branches never write the same file, so merges don't conflict. The lock and the panel marker never go there.
The choice covers every worktree of the repo and is kept in the repo's local git config (paseo-progress.saveRuns), which nothing commits. Change… picks another folder for future runs; Stop saving turns it off. Files already saved are never moved or deleted.
Earlier versions kept progress in .scratch/ in each worktree, hidden by a .scratch/.gitignore they wrote. The first time the command or the panel touches a worktree after the upgrade, the plugin moves its files out of .scratch/ and removes that .gitignore if it's exactly the one the plugin wrote. If .scratch/ is then empty, it goes too; anything else you keep there stays. If git tracks the old progress file (for example, an agent committed it), the plugin leaves it where it is and keeps using it, so nothing changes in that repo.
The plugin ships an agent skill, paseo-progress, that tells agents when to run each command during a multi-ticket job: set up the run, move tickets through their stages, ask questions, and finish. It stays short and leaves the details to paseo-progress --help. Press Install skill in the Progress panel. It links paseo-progress into ~/.agents/skills, ~/.claude/skills, and ~/.codex/skills (the folders Paseo installs its own skills into), pointing at the copy of the plugin Paseo runs, so plugin updates reach agents. On Windows the links are junctions, which don't need admin rights or Developer Mode. Paseo puts each plugin update in a new folder, so when Progress starts it repoints the links it made to that folder. If it can't, the button changes to Update skill. It never replaces a skill it didn't link; that folder is skipped. To read what agents get, open View skill under Agent Skills in Progress settings.
From a terminal instead:
skill="$(paseo plugin ls progress --json | node -pe 'JSON.parse(require("fs").readFileSync(0))[0].path')/skills/paseo-progress"
for dir in ~/.agents/skills ~/.claude/skills ~/.codex/skills; do mkdir -p "$dir" && ln -s "$skill" "$dir/paseo-progress"; done
Run paseo-progress --help for every command, and paseo-progress <command> --help for one. Commands find the worktree root from the current directory.
paseo-progress start "Loan Options snapshots" --subtitle "4 tickets"
paseo-progress ticket add "Ticket 01: Saved table" --estimate 120 \
--source specs/01-saved-table.md # Added T01
paseo-progress ticket update T01 --status working --stage Build
paseo-progress ticket update T01 --stage Fixes
paseo-progress ticket update T01 --status done
paseo-progress question ask "Row spacing" "Even out the card spacing?" \
--option "A=Even it out | Cards look balanced" \
--option "B=Leave it | No change" \
--recommend A --raised-by "Ticket 01 design review" # Asked Q1
paseo-progress question answer Q1 A --words "Even it out."
paseo-progress deliverable add "Browser check screenshots" .scratch/shots/ --ticket T01
paseo-progress activity add "Saved table matches the design now." --ticket T01
paseo-progress ticker set "Running the browser check"
paseo-progress stuck set "Staging is down" --ticket T01 # Flagged S1
paseo-progress show
paseo-progress finish "Snapshots ship for all four tables"
not_started, working, blocked, done, and skipped. Skipped tickets leave the totals.ticket add and ticket update take an optional --source <path or link>[=<label>]: where the ticket is written up, like its spec file or issue. It shows under the ticket's status in its dialog and opens like a deliverable. --source "" clears it. Tickets without one are fine.question ask needs --recommend, the agent's pick. The question dialog tags that option "Recommended". Its output tells the agent the question mode and what to do until the answer. --big "<why>" marks a big question, which waits for the answer even in Keep building. start and show also print the mode.~/.local/state/paseo-progress/settings.json for the command. Without that file, for example while the plugin is off, the command uses Work around.show), and the skill has it work that ticket in order after its current one. An agent only hears about tickets added since its own last update in the run, and only once.start begins a fresh dashboard. Earlier runs stay in the file. Question references stay unique across runs.finish "<outcome>" closes the run once every ticket is done or skipped, no question is open, and nothing is flagged stuck; otherwise it says what is left. The run stays on the dashboard, marked Finished with its outcome, and takes no more updates, so the next agent in the worktree starts a new run instead of adding to it.The progress file, progress.jsonl, holds one JSON event per line, each with a version (v), a UTC timestamp (ts) from the real clock, and a type. Events written by a Paseo agent also carry its agent id (by). It is only ever appended to, so you can read or diff the history. A half-written last line is ignored. Other bad lines are skipped and listed in a small notice in the panel while the rest still renders. A lock keeps two commands from writing at once or handing out the same id.
paseo-progress. One in the middle of a long step finds out when that step ends.paseo-progress. Agents need the skill, and an agent that skips the command leaves the dashboard behind.~/.local/state/paseo-progress/.paseo-progress stopped with "The progress plugin is not installed in Paseo", and Install skill couldn't find the plugin. On Windows, Paseo's command is paseo.cmd, and Node can start a .cmd file only through cmd. Both now go through cmd on Windows, and both also check where Paseo installs its command.paseo-progress.cmd, so agents in PowerShell or cmd can run paseo-progress, not just those in Git Bash.PATH on Windows when it's there.paseo-progress.cmd, then press Update command. Also remove PASEO_PROGRESS_PLUGIN_DIR, or the command keeps running the folder it names after the plugin updates. Skill links you made yourself keep working, and the panel offers Update skill once the plugin folder changes.spawn xdg-open ENOENT.Can't open files on my-server. Copied path.requestType=… code=… text.2Q · 1 stuck. Before, Paseo cut it off at 2 questions · 1 st….(11m ago) moves to the next line whole. It no longer splits in the middle.2h 15m. Before, the progress bar said 2 h 15 min and the finished tickets said 2.3 h for the same work. Estimates show the minutes you set, so a 90-minute ticket reads 1h 30m, not 1.5 h.paseo-progress command is now built into a single file that includes zod. The plugin used to install @getpaseo/client just for its types; it now gets them from the plugin SDK that Paseo already provides.npm ci asking for a package-lock.json, because npm 12 no longer reads the lockfile this plugin shipped (#53). The plugin no longer runs its own install step; Paseo's npm install already brings in what it needs.Scanned 22 Oct 2026, 22:12 UTC from stevecastaneda/paseo-plugins/progress.