@stevecastaneda/paseo-progress 0.3.2 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -2
- package/client/directory.ts +16 -2
- package/client/panel.tsx +3 -2
- package/client/pills.tsx +1 -2
- package/dist/server/cli.js +21015 -503
- package/package.json +5 -6
- package/skills/paseo-progress/SKILL.md +10 -0
- package/dist/server/launcher.js +0 -90
- package/dist/server/lock.js +0 -34
- package/dist/server/paths.js +0 -22
- package/dist/server/progress-file.js +0 -115
- package/dist/server/store.js +0 -205
- package/dist/shared/attachments.js +0 -92
- package/dist/shared/dashboard.js +0 -386
- package/dist/shared/events.js +0 -127
- package/dist/shared/format.js +0 -50
- package/dist/shared/show.js +0 -74
package/README.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
<img src="https://raw.githubusercontent.com/stevecastaneda/paseo-plugins/main/progress/icon.png" alt="" width="64" height="64">
|
|
2
|
+
|
|
1
3
|
# Progress
|
|
2
4
|
|
|
3
5
|
A plugin for Paseo 0.9 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.
|
|
@@ -7,7 +9,7 @@ A plugin for Paseo 0.9 and later that gives each worktree a live progress dashbo
|
|
|
7
9
|
The dashboard shows:
|
|
8
10
|
|
|
9
11
|
- the run's title, a headline ("2 of 4 tickets done, 5 questions waiting for you, 1 stuck"), a one-line "now" ticker, and when it was last updated
|
|
10
|
-
- a "possibly stale" warning after 15 minutes with no update while tickets remain, unless Paseo shows an agent in the workspace still running
|
|
12
|
+
- a "possibly stale" warning after 15 minutes with no update while tickets remain, unless Paseo shows an agent in the workspace still running, and never once every ticket is done or skipped or the run is finished; working items swap their spinner for a pulsing amber warning
|
|
11
13
|
- percent of estimated work done, time done of time estimated (like "1 h 30 min of 2 h"; once everything is done, how long it really took), and a bar with one segment per ticket
|
|
12
14
|
- **Stuck:** blocked tickets, working tickets with no update for longer than their estimate, and blockers the agent flags
|
|
13
15
|
- **Tickets:** estimate, status, and the working ticket's stage. A ticket that waits for another (`--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"
|
|
@@ -39,7 +41,7 @@ dir="$(paseo plugin ls progress --json | node -pe 'JSON.parse(require("fs").read
|
|
|
39
41
|
node "$([ -f "$dir/dist/server/cli.js" ] && echo "$dir/dist/server/cli.js" || echo "$dir/server/cli.ts")" install-launcher [path]
|
|
40
42
|
```
|
|
41
43
|
|
|
42
|
-
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
|
|
44
|
+
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.
|
|
43
45
|
|
|
44
46
|
## Where progress is kept
|
|
45
47
|
|
|
@@ -96,6 +98,7 @@ paseo-progress finish "Snapshots ship for all four tables"
|
|
|
96
98
|
- `question ask` needs `--recommend`, the agent's pick. The question dialog tags that option "Recommended".
|
|
97
99
|
- Deliverable paths are stored relative to the worktree root. Web links open in Paseo's browser. Pressing an image (PNG, JPEG, GIF, WebP, up to 10 MB) or text deliverable (Markdown, text, logs, JSON, YAML, CSV; the first 256 KB) previews it in a dialog inside Paseo, which also works from a phone; **Open** there opens the file in its default app. Pressing any other local deliverable opens it with its default app on the machine running the Paseo daemon (for example HTML in your browser and folders in the file manager). On macOS, **Open** sends text files to your default browser. Only recorded deliverables inside the worktree open this way; otherwise the path is copied. The copy icon on each row copies the path.
|
|
98
100
|
- Several agents can share one run. When another session adds a ticket, each agent sees it at the end of its next command's output (and in `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.
|
|
101
|
+
- Subagents record their own progress. Since Paseo 0.11, an agent waiting on background subagents shows as idle, so only the subagents' updates show the work is still going. The skill has the agent give each subagent the worktree path and ticket id, and the subagent records its stages and a ticker line on that worktree's dashboard.
|
|
99
102
|
- `start` begins a fresh dashboard. Earlier runs stay in the file. Question references stay unique across runs.
|
|
100
103
|
- `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.
|
|
101
104
|
|
|
@@ -107,6 +110,7 @@ The progress file, `progress.jsonl`, holds one JSON event per line, each with a
|
|
|
107
110
|
|
|
108
111
|
- An agent hears about tickets other sessions added only when it next runs `paseo-progress`. One in the middle of a long step finds out when that step ends.
|
|
109
112
|
- Nothing updates unless the agent runs `paseo-progress`. Agents need the skill, and an agent that skips the command leaves the dashboard behind.
|
|
113
|
+
- On Paseo 0.11 and later, an agent waiting on background subagents counts as idle. If those subagents record nothing, the dashboard shows "possibly stale" after 15 minutes while they're still working.
|
|
110
114
|
- The command runs on the machine that hosts the Paseo daemon, and it needs Node.js 22.18 or later there.
|
|
111
115
|
- Each worktree keeps its own dashboard. There's no view across worktrees.
|
|
112
116
|
- Progress folders outside the repo stay behind when a worktree is deleted. They're small, and you can delete them from `~/.local/state/paseo-progress/`.
|
|
@@ -127,6 +131,14 @@ npm run dev
|
|
|
127
131
|
|
|
128
132
|
## Changelog
|
|
129
133
|
|
|
134
|
+
### 0.3.4
|
|
135
|
+
|
|
136
|
+
- Installing the plugin no longer downloads any other npm packages. The `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.
|
|
137
|
+
|
|
138
|
+
### 0.3.3
|
|
139
|
+
|
|
140
|
+
- The skill now has subagents record their own progress, so the dashboard stops warning "possibly stale" while they work. Since Paseo 0.11, an agent waiting on background subagents shows as idle. After 15 minutes with no update, the dashboard said the work may have stopped even though the subagents were still at it. Now the agent gives each subagent the worktree path and ticket id, and the subagent records its stages and a ticker line. If the Progress panel shows **Update skill** after you update, press it so agents get the new instructions.
|
|
141
|
+
|
|
130
142
|
### 0.3.2
|
|
131
143
|
|
|
132
144
|
- The plugin's page in Paseo's plugin store now uses the plugin's own description instead of text the store copied from paseo.cafe.
|
package/client/directory.ts
CHANGED
|
@@ -1,10 +1,24 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { getPaseoClient } from "@getpaseo/plugin/client";
|
|
2
|
+
|
|
3
|
+
// Paseo's client types are read through the plugin SDK, which Paseo provides.
|
|
4
|
+
// Importing them from @getpaseo/client would make Paseo require that package
|
|
5
|
+
// installed alongside the plugin, even though only its types are used.
|
|
6
|
+
type PaseoApi = ReturnType<typeof getPaseoClient>;
|
|
7
|
+
type Handler<Subscribe> = Subscribe extends (handler: infer H) => unknown ? H : never;
|
|
8
|
+
export type PaseoAgentUpdate = Parameters<Handler<PaseoApi["agents"]["subscribe"]>>[0];
|
|
9
|
+
export type PaseoWorkspaceUpdate = Parameters<Handler<PaseoApi["workspaces"]["subscribe"]>>[0];
|
|
10
|
+
type Message = Parameters<
|
|
11
|
+
Parameters<NonNullable<Awaited<ReturnType<PaseoApi["agents"]["list"]>>["subscription"]>["subscribe"]>[0]["update"]
|
|
12
|
+
>[0];
|
|
13
|
+
type OwnedSubscription<T> = {
|
|
14
|
+
subscribe(observer: { snapshot(snapshot: T): void; update(message: Message): void; error?(error: unknown): void }): () => void;
|
|
15
|
+
release(): Promise<void>;
|
|
16
|
+
};
|
|
2
17
|
|
|
3
18
|
type Page = {
|
|
4
19
|
entries: unknown[];
|
|
5
20
|
pageInfo: { hasMore: boolean; nextCursor?: string | null };
|
|
6
21
|
};
|
|
7
|
-
type Message = Parameters<SubscriptionObserver<unknown>["update"]>[0];
|
|
8
22
|
|
|
9
23
|
// Paseo 0.9 returns an owned subscription from list({ subscribe: {} }). It
|
|
10
24
|
// delivers the first page as a snapshot, again after every reconnect, then the
|
package/client/panel.tsx
CHANGED
|
@@ -36,8 +36,9 @@ export function ProgressPanel(props: PluginWorkspacePanelProps) {
|
|
|
36
36
|
function WorkspaceProgress({ theme, workspaceId, host, layout, navigation }: PluginWorkspacePanelProps) {
|
|
37
37
|
const colors = theme.colors;
|
|
38
38
|
const directory = useWorkspace(workspaceId, (workspace) => workspace.directory);
|
|
39
|
-
// Paseo marks the workspace running while any of its agents is
|
|
40
|
-
// waiting on subagents
|
|
39
|
+
// Paseo marks the workspace running while any of its agents is. Since 0.11 a Claude
|
|
40
|
+
// agent waiting on background subagents counts as idle, so those subagents record
|
|
41
|
+
// progress themselves (see the skill).
|
|
41
42
|
const agentRunning = useWorkspace(workspaceId, (workspace) => workspace.status === "running") ?? false;
|
|
42
43
|
const query = useDashboard(host.id, workspaceId, directory);
|
|
43
44
|
const result = query.data ?? null;
|
package/client/pills.tsx
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import type { PaseoAgentUpdate, PaseoWorkspaceUpdate } from "@getpaseo/client";
|
|
2
1
|
import type { PluginButtonContentProps, PluginButtonIconProps, PluginButtonRegistration, PluginClientContext } from "@getpaseo/plugin/client";
|
|
3
2
|
import { Icon } from "@getpaseo/plugin/client/react-native";
|
|
4
3
|
import React, { useSyncExternalStore } from "react";
|
|
5
4
|
import { Platform } from "react-native";
|
|
6
5
|
import { type AttentionResult, getAttention } from "../shared/rpc";
|
|
7
6
|
import { isIdle, type Pill, pillFor } from "./pill-state";
|
|
8
|
-
import { observeDirectory } from "./directory";
|
|
7
|
+
import { observeDirectory, type PaseoAgentUpdate, type PaseoWorkspaceUpdate } from "./directory";
|
|
9
8
|
import { onPanelOpened } from "./panel-opened";
|
|
10
9
|
import { IconSwap } from "./motion";
|
|
11
10
|
import { Spinner } from "./spinner";
|