@masslessai/push-todo 3.5.5 → 3.5.7

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/SKILL.md CHANGED
@@ -197,6 +197,18 @@ If no CLAUDE.md or README.md exists, generate minimal keywords from:
197
197
  - Git repo name
198
198
  - Primary file extensions (`.swift` -> iOS, `.py` -> Python, `.rs` -> Rust)
199
199
 
200
+ ## Resuming Daemon Sessions
201
+
202
+ When tasks are executed by the Push daemon on a Mac, each task creates a Claude Code session. These sessions can be resumed to continue exactly where the daemon left off.
203
+
204
+ **When you see `**Session:** Resumable` in a task's output**, tell the user:
205
+ - The task has a saved Claude Code session from the daemon
206
+ - They can resume it with `push-todo resume <number>` (run in their terminal, not here)
207
+ - This opens an **interactive** Claude Code session with the full conversation history - every file read, edit, and decision the daemon made
208
+ - It must be run on the **same machine** that executed the task (sessions are stored locally)
209
+
210
+ **Important:** `push-todo resume` launches an interactive Claude Code terminal session. It cannot be run from within an existing Claude Code session. Instruct the user to run it directly in their terminal.
211
+
200
212
  ## CLI Reference
201
213
 
202
214
  The `push-todo` CLI supports these commands:
@@ -207,6 +219,7 @@ The `push-todo` CLI supports these commands:
207
219
  | `push-todo <number>` | Show specific task (e.g., `push-todo 427`) |
208
220
  | `push-todo --all-projects` | List tasks from all projects |
209
221
  | `push-todo --backlog` | Show backlog items |
222
+ | `push-todo --resume <number>` | Resume the daemon's Claude Code session for a task |
210
223
  | `push-todo connect` | Run connection diagnostics and setup |
211
224
  | `push-todo search <query>` | Search tasks |
212
225
  | `push-todo --status` | Show connection status |
package/lib/daemon.js CHANGED
@@ -1006,14 +1006,23 @@ function handleTaskCompletion(displayNumber, exitCode) {
1006
1006
  log(`Task #${displayNumber} could not extract session_id`);
1007
1007
  }
1008
1008
 
1009
+ // Auto-create PR first so we can include it in the summary
1010
+ const prUrl = createPRForTask(displayNumber, summary, projectPath);
1011
+
1012
+ // Build execution summary for Supabase (shown in iOS timeline)
1013
+ const durationStr = duration < 60 ? `${duration}s` : `${Math.floor(duration / 60)}m ${duration % 60}s`;
1014
+ const machineName = getMachineName() || 'Mac';
1015
+ let executionSummary = `Ran for ${durationStr} on ${machineName}.`;
1016
+ if (prUrl) {
1017
+ executionSummary += ` PR: ${prUrl}`;
1018
+ }
1019
+
1009
1020
  updateTaskStatus(displayNumber, 'completed', {
1010
1021
  duration,
1011
- sessionId
1022
+ sessionId,
1023
+ summary: executionSummary
1012
1024
  });
1013
1025
 
1014
- // Auto-create PR
1015
- const prUrl = createPRForTask(displayNumber, summary, projectPath);
1016
-
1017
1026
  if (NOTIFY_ON_COMPLETE) {
1018
1027
  const prNote = prUrl ? ' PR ready for review.' : '';
1019
1028
  sendMacNotification(
@@ -131,28 +131,25 @@ export function formatTaskForDisplay(task) {
131
131
  // Status
132
132
  if (task.isCompleted || task.is_completed) {
133
133
  lines.push('**Status:** ✅ Completed');
134
- // Show session resume hint if session_id is available
135
- const sessionId = task.executionSessionId || task.execution_session_id;
136
- if (sessionId) {
137
- lines.push(`**Session:** Available (\`push-todo resume ${displayNum}\`)`);
138
- }
139
134
  } else if (execStatus === 'running') {
140
- const machineName = task.executionMachineName || task.execution_machine_name;
141
- const machineHint = machineName ? ` on ${machineName}` : '';
142
- lines.push(`**Status:** 🔄 Running${machineHint}`);
135
+ lines.push('**Status:** 🔄 Running');
143
136
  } else if (execStatus === 'queued') {
144
137
  lines.push('**Status:** ⚡ Queued for Mac execution');
145
138
  } else if (execStatus === 'failed') {
146
139
  const error = task.executionError || task.execution_error || 'Unknown error';
147
140
  lines.push(`**Status:** ❌ Failed: ${error}`);
148
- } else if (execStatus === 'needs_clarification') {
149
- lines.push('**Status:** ❓ Needs clarification');
150
141
  } else if (task.isBacklog || task.is_backlog) {
151
142
  lines.push('**Status:** 📦 Backlog');
152
143
  } else {
153
144
  lines.push('**Status:** Active');
154
145
  }
155
146
 
147
+ // Show session resume hint for any task with a session ID
148
+ const sessionId = task.executionSessionId || task.execution_session_id;
149
+ if (sessionId && displayNum) {
150
+ lines.push(`**Session:** Resumable (\`push-todo resume ${displayNum}\`) - continues the exact Claude Code conversation`);
151
+ }
152
+
156
153
  const createdAt = task.createdAt || task.created_at;
157
154
  lines.push(`**Created:** ${createdAt || 'unknown'}`);
158
155
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@masslessai/push-todo",
3
- "version": "3.5.5",
3
+ "version": "3.5.7",
4
4
  "description": "Voice tasks from Push iOS app for Claude Code",
5
5
  "type": "module",
6
6
  "bin": {