@masslessai/push-todo 3.4.5 → 3.4.6

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
@@ -1,180 +1,197 @@
1
- # Push Todo Skill
1
+ ---
2
+ description: Show active voice tasks from Push iOS app
3
+ allowed-tools: Bash, Read, Edit, Write, Glob, Grep
4
+ ---
2
5
 
3
- This skill enables Claude Code to fetch and work on voice tasks captured via the Push iOS app.
6
+ # Push Voice Tasks
4
7
 
5
- ## Quick Start
8
+ This command fetches and displays your active voice tasks from the Push iOS app.
6
9
 
7
- 1. Run `push-todo connect` to authenticate
8
- 2. Run `push-todo` to list active tasks
9
- 3. Run `push-todo <number>` to view and work on a specific task
10
+ ## Usage
10
11
 
11
- ## Commands
12
+ - `/push-todo` - Show active tasks for current project
13
+ - `/push-todo #427` - Jump directly to task #427
14
+ - `/push-todo review` - Review existing tasks and mark completed ones
15
+ - `/push-todo setup` - Configure your Push connection
12
16
 
13
- ### List Tasks
17
+ > **Note:** To see tasks from all projects, ask explicitly: "show tasks from all projects"
14
18
 
15
- ```bash
16
- push-todo # Active tasks for current project
17
- push-todo --all-projects # Tasks from all projects
18
- push-todo --backlog # Backlog items only
19
- push-todo --include-backlog # Active + backlog
20
- push-todo --completed # Completed items only
21
- push-todo --json # Output as JSON
22
- ```
19
+ ## Instructions
23
20
 
24
- ### View Specific Task
21
+ When this command is invoked:
25
22
 
26
- ```bash
27
- push-todo 427 # View task #427
28
- push-todo 427 --json # As JSON
29
- ```
23
+ 1. **Check for setup**: First verify the config exists:
24
+ ```bash
25
+ test -f ~/.config/push/config && echo "configured" || echo "not configured"
26
+ ```
30
27
 
31
- ### Search Tasks
28
+ 2. **If not configured**: Run the setup flow (see [Setup Mode](#setup-mode) below)
32
29
 
33
- ```bash
34
- push-todo search "auth bug" # Search for tasks
35
- push-todo --search "fix" # Alternative syntax
36
- ```
30
+ 3. **If configured**: Fetch tasks:
31
+ ```bash
32
+ push-todo
33
+ ```
37
34
 
38
- ### Manage Tasks
35
+ 4. Present the tasks and ask which one to work on
39
36
 
40
- ```bash
41
- push-todo --queue 427,428 # Queue tasks for daemon
42
- push-todo --queue-batch # Auto-queue a batch
43
- push-todo --mark-completed <uuid> --completion-comment "Fixed the bug"
44
- ```
37
+ 5. When user selects a task, mark it as started and begin working
45
38
 
46
- ### Connection & Status
39
+ ## Review Mode
47
40
 
48
- ```bash
49
- push-todo connect # Run diagnostics, authenticate
50
- push-todo status # Show connection status
51
- push-todo setting # Show all settings
52
- push-todo setting auto-commit # Toggle a setting
53
- ```
41
+ When `/push-todo review` is invoked, use **session context** to identify completed tasks:
42
+
43
+ ### Step 1: Analyze Session Context
44
+
45
+ First, recall what was worked on in this session (or the previous compacted session):
46
+ - What tasks were explicitly mentioned? (e.g., "work on #701")
47
+ - What features were implemented or bugs fixed?
48
+ - What files were edited and why?
54
49
 
55
- ### Monitor
50
+ ### Step 2: Fetch Pending Tasks
56
51
 
57
52
  ```bash
58
- push-todo --watch # Live terminal UI
59
- push-todo --watch --json # JSON status output
53
+ push-todo --all-projects --json
60
54
  ```
61
55
 
62
- ## Task Format
56
+ ### Step 3: Match Session Work Against Tasks
63
57
 
64
- Tasks include:
58
+ For each pending task, check if it matches work done in this session:
65
59
 
66
- - **summary**: Brief title
67
- - **content/normalizedContent**: Full task description (AI-extracted)
68
- - **originalTranscript**: Raw voice recording text
69
- - **displayNumber**: Human-readable number (#1, #2...)
70
- - **projectHint**: Associated project (git remote)
71
- - **screenshotAttachments**: Any attached screenshots
72
- - **linkAttachments**: Any attached links
60
+ **Explicit Match**: Task number was mentioned (e.g., "worked on #701")
61
+ - These should be marked complete unless work is clearly unfinished
73
62
 
74
- ## Batch Processing
63
+ **Implicit Match**: Work done aligns with task content semantically
64
+ - Compare task summary/content against session work
65
+ - Example: Task says "add review parameter to slash command" and we just added that feature
75
66
 
76
- The CLI supports batch task processing:
67
+ **No Match**: Task wasn't worked on this session
68
+ - Skip these (don't search codebase unnecessarily)
77
69
 
78
- 1. Fetch multiple tasks with `push-todo`
79
- 2. Tasks marked for batch will show `BATCH_OFFER` format
80
- 3. Use `--queue` to add tasks to the daemon queue
70
+ ### Step 4: Present Findings
81
71
 
82
- ## Integration with Claude Code
72
+ ```
73
+ ## Session Review
74
+
75
+ Based on this session, I found:
83
76
 
84
- ### Session Start Hook
77
+ ### Completed This Session
78
+ - #701 "Add review parameter" - We implemented this feature (explicit)
79
+ - #427 "Fix login bug" - We fixed the auth issue in LoginView.swift (implicit match)
85
80
 
86
- When Claude Code starts, the hook shows:
81
+ ### Not Worked On
82
+ - #351 "Test on smaller phone" - No related work this session
83
+ - #682 "Rework recording overlay" - No related work this session
84
+
85
+ Should I mark #701 and #427 as completed?
87
86
  ```
88
- [Push] You have 5 active tasks from your iPhone. Say 'push-todo' to see them.
87
+
88
+ ### Step 5: Mark Confirmed Tasks
89
+
90
+ ```bash
91
+ push-todo --mark-completed TASK_UUID --completion-comment "Completed in Claude Code session"
89
92
  ```
90
93
 
91
- ### Session End Hook
94
+ ### Key Principle
92
95
 
93
- Reports session completion to the Push backend.
96
+ **Session context is primary** - don't grep the entire codebase for every task. Use conversation history to identify what was actually worked on, then match against tasks semantically. This catches both:
97
+ - Explicit: User said "work on #701" but forgot to mark complete
98
+ - Implicit: User fixed something that matches a task they didn't mention
94
99
 
95
- ### Slash Command
100
+ ## Setup Mode
96
101
 
97
- Use `/push-todo` in Claude Code as a shortcut:
98
- - `/push-todo` - List tasks
99
- - `/push-todo 427` - Work on task #427
100
- - `/push-todo connect` - Run diagnostics
102
+ When `/push-todo setup` is invoked, generate project-specific keywords BEFORE running the setup script.
101
103
 
102
- ## Settings
104
+ ### Why Keywords Matter
103
105
 
104
- | Setting | Default | Description |
105
- |---------|---------|-------------|
106
- | `AUTO_COMMIT` | `true` | Auto-commit changes after task completion |
107
- | `MAX_BATCH_SIZE` | `5` | Maximum tasks in batch offer |
106
+ Keywords help the AI route voice todos to the correct project. Generic keywords like "coding" or "programming" don't differentiate between projects. We need UNIQUE keywords that identify THIS specific project.
108
107
 
109
- Toggle with: `push-todo setting auto-commit`
108
+ ### Step 1: Understand the Project
110
109
 
111
- ## Project Registration
110
+ Read the project context to generate meaningful keywords:
112
111
 
113
- Projects are identified by their git remote URL. Register with:
112
+ 1. **Check for CLAUDE.md**:
113
+ ```bash
114
+ test -f CLAUDE.md && echo "found" || echo "not found"
115
+ ```
114
116
 
115
- ```bash
116
- push-todo connect
117
- ```
117
+ 2. **If CLAUDE.md exists**, read the header section:
118
+ ```bash
119
+ head -80 CLAUDE.md
120
+ ```
118
121
 
119
- This maps the git remote to the local path, enabling:
120
- - Automatic project filtering
121
- - Daemon task routing
122
- - Cross-machine synchronization
122
+ 3. **If no CLAUDE.md**, check for README.md:
123
+ ```bash
124
+ test -f README.md && head -50 README.md
125
+ ```
123
126
 
124
- ## E2EE (End-to-End Encryption)
127
+ ### Step 2: Generate Unique Keywords
125
128
 
126
- If enabled on the Push app:
127
- - Tasks are encrypted on device
128
- - Decryption uses iCloud Keychain
129
- - Requires macOS with keychain access
129
+ Based on the project context, generate 5-10 keywords.
130
130
 
131
- Check status: `push-todo status`
131
+ **MUST include:**
132
+ - Project name and common nicknames users would say
133
+ - Domain-specific terms (e.g., "voice todo" for a voice app)
134
+ - Distinctive tech if relevant (e.g., "whisper" for speech recognition)
132
135
 
133
- ## Configuration
136
+ **MUST NOT include (these are useless for differentiation):**
137
+ - Generic terms: "coding", "programming", "development"
138
+ - Tool terms: "mac", "terminal", "cli", "ai", "task"
139
+ - Any term that applies to ALL code projects
134
140
 
135
- Config file: `~/.config/push/config`
141
+ **Think:** "What would the user SAY when creating a task for THIS project?"
142
+
143
+ ### Step 3: Generate Description
144
+
145
+ Generate a short (5-15 words) description that captures what makes this project unique. NOT generic like "coding tasks" or "development work".
146
+
147
+ ### Step 4: Run Setup with Keywords
136
148
 
137
149
  ```bash
138
- export PUSH_KEY="your-api-key"
139
- export PUSH_USER_ID="user-uuid"
140
- export AUTO_COMMIT="true"
141
- export MAX_BATCH_SIZE="5"
150
+ push-todo connect --keywords "keyword1,keyword2,keyword3,..." --description "Short unique description"
142
151
  ```
143
152
 
144
- ## Troubleshooting
153
+ ### Examples
145
154
 
146
- ### "No API key configured"
147
- Run `push-todo connect` to authenticate.
155
+ **For a voice todo app (Push):**
156
+ ```bash
157
+ push-todo connect --keywords "push,voice,todo,whisper,ios,swiftui,recording,speech,transcription" --description "Voice-powered todo app for iOS with whisper speech recognition"
158
+ ```
148
159
 
149
- ### "E2EE not available"
150
- The keychain helper binary may not be installed. Check:
151
- - macOS only (not Linux/Windows)
152
- - Binary at `node_modules/@masslessai/push-todo/bin/push-keychain-helper`
160
+ **For a web scraping project:**
161
+ ```bash
162
+ push-todo connect --keywords "scraper,crawler,beautifulsoup,selenium,extraction,parsing" --description "Web scraping tool for data extraction"
163
+ ```
153
164
 
154
- ### "Invalid API key"
155
- Your key may have expired. Run `push-todo connect` to re-authenticate.
165
+ **For a game engine:**
166
+ ```bash
167
+ push-todo connect --keywords "engine,graphics,rendering,physics,ecs,vulkan,gamedev" --description "Custom game engine with Vulkan renderer"
168
+ ```
156
169
 
157
- ### Tasks not showing for project
158
- Run `push-todo connect` to register the current project, or use `--all-projects`.
170
+ ### Fallback (No Documentation)
159
171
 
160
- ## API Reference
172
+ If no CLAUDE.md or README.md exists, generate minimal keywords from:
173
+ - Folder name
174
+ - Git repo name
175
+ - Primary file extensions (`.swift` -> iOS, `.py` -> Python, `.rs` -> Rust)
161
176
 
162
- The CLI also exports a programmatic API:
177
+ ## CLI Reference
163
178
 
164
- ```javascript
165
- import {
166
- listTasks,
167
- showTask,
168
- searchTasks,
169
- markComplete
170
- } from '@masslessai/push-todo';
179
+ The `push-todo` CLI supports these commands:
171
180
 
172
- // List tasks
173
- const tasks = await listTasks({ allProjects: true });
181
+ | Command | Description |
182
+ |---------|-------------|
183
+ | `push-todo` | List active tasks for current project |
184
+ | `push-todo <number>` | Show specific task (e.g., `push-todo 427`) |
185
+ | `push-todo --all-projects` | List tasks from all projects |
186
+ | `push-todo --backlog` | Show backlog items |
187
+ | `push-todo connect` | Run connection diagnostics and setup |
188
+ | `push-todo search <query>` | Search tasks |
189
+ | `push-todo --status` | Show connection status |
190
+ | `push-todo --mark-completed <uuid>` | Mark task as completed |
191
+ | `push-todo --json` | Output as JSON |
174
192
 
175
- // Search
176
- const results = await searchTasks('bug fix');
193
+ ## What is Push?
177
194
 
178
- // Mark complete
179
- await markComplete(taskId, 'Fixed the issue');
180
- ```
195
+ Push is a voice-powered todo app for iOS. Users capture tasks by speaking on their phone, and those tasks sync to Claude Code for implementation.
196
+
197
+ Learn more: https://pushto.do
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@masslessai/push-todo",
3
- "version": "3.4.5",
3
+ "version": "3.4.6",
4
4
  "description": "Voice tasks from Push iOS app for Claude Code",
5
5
  "type": "module",
6
6
  "bin": {
@@ -17,10 +17,8 @@
17
17
  "bin/",
18
18
  "lib/",
19
19
  "hooks/",
20
- "commands/",
21
20
  "natives/",
22
21
  "scripts/",
23
- ".claude-plugin/",
24
22
  "SKILL.md",
25
23
  "LICENSE"
26
24
  ],
@@ -35,7 +33,7 @@
35
33
  },
36
34
  "keywords": [
37
35
  "claude-code",
38
- "claude-code-plugin",
36
+ "claude-code-skill",
39
37
  "push",
40
38
  "voice",
41
39
  "todo",
@@ -3,7 +3,7 @@
3
3
  * Post-install script for Push CLI.
4
4
  *
5
5
  * Sets up integrations for ALL detected AI coding clients:
6
- * 1. Claude Code - symlink to ~/.claude/plugins/
6
+ * 1. Claude Code - symlink to ~/.claude/skills/ (gives clean /push-todo command)
7
7
  * 2. OpenAI Codex - AGENTS.md in ~/.codex/
8
8
  * 3. Clawdbot - SKILL.md in ~/.clawdbot/skills/
9
9
  * 4. Downloads native keychain helper binary (macOS)
@@ -24,10 +24,10 @@ const PACKAGE_ROOT = join(__dirname, '..');
24
24
 
25
25
  // Claude Code locations
26
26
  const CLAUDE_DIR = join(homedir(), '.claude');
27
- const PLUGIN_DIR = join(CLAUDE_DIR, 'plugins');
28
- const PLUGIN_LINK = join(PLUGIN_DIR, 'push-todo');
29
- const LEGACY_SKILL_DIR = join(CLAUDE_DIR, 'skills');
30
- const LEGACY_SKILL_LINK = join(LEGACY_SKILL_DIR, 'push-todo');
27
+ const SKILL_DIR = join(CLAUDE_DIR, 'skills');
28
+ const SKILL_LINK = join(SKILL_DIR, 'push-todo');
29
+ const LEGACY_PLUGIN_DIR = join(CLAUDE_DIR, 'plugins');
30
+ const LEGACY_PLUGIN_LINK = join(LEGACY_PLUGIN_DIR, 'push-todo');
31
31
 
32
32
  // OpenAI Codex locations
33
33
  const CODEX_DIR = join(homedir(), '.codex');
@@ -51,81 +51,84 @@ const BINARY_URL = `https://github.com/MasslessAI/push-todo-cli/releases/downloa
51
51
  const BINARY_URL_X64 = `https://github.com/MasslessAI/push-todo-cli/releases/download/v${VERSION}/${BINARY_NAME}-darwin-x64`;
52
52
 
53
53
  /**
54
- * Set up Claude Code plugin by creating symlink.
54
+ * Set up Claude Code skill by creating symlink.
55
55
  *
56
- * Creates: ~/.claude/plugins/push-todo -> <npm-package-location>
56
+ * Creates: ~/.claude/skills/push-todo -> <npm-package-location>
57
+ *
58
+ * Skills give clean slash commands like /push-todo (no namespace prefix).
57
59
  *
58
60
  * @returns {boolean} True if successful
59
61
  */
60
- function setupClaudePlugin() {
62
+ function setupClaudeSkill() {
61
63
  try {
62
- // Ensure ~/.claude/plugins/ directory exists
63
- if (!existsSync(PLUGIN_DIR)) {
64
- mkdirSync(PLUGIN_DIR, { recursive: true });
65
- console.log('[push-todo] Created ~/.claude/plugins/ directory');
64
+ // Ensure ~/.claude/skills/ directory exists
65
+ if (!existsSync(SKILL_DIR)) {
66
+ mkdirSync(SKILL_DIR, { recursive: true });
67
+ console.log('[push-todo] Created ~/.claude/skills/ directory');
66
68
  }
67
69
 
68
70
  // Check if symlink already exists
69
- if (existsSync(PLUGIN_LINK)) {
71
+ if (existsSync(SKILL_LINK)) {
70
72
  try {
71
- const stats = lstatSync(PLUGIN_LINK);
73
+ const stats = lstatSync(SKILL_LINK);
72
74
  if (stats.isSymbolicLink()) {
73
- const currentTarget = readlinkSync(PLUGIN_LINK);
75
+ const currentTarget = readlinkSync(SKILL_LINK);
74
76
  if (currentTarget === PACKAGE_ROOT) {
75
- console.log('[push-todo] Claude Code plugin symlink already configured.');
77
+ console.log('[push-todo] Claude Code skill symlink already configured.');
76
78
  return true;
77
79
  }
78
80
  // Different target - remove and recreate
79
81
  console.log('[push-todo] Updating existing symlink...');
80
- unlinkSync(PLUGIN_LINK);
82
+ unlinkSync(SKILL_LINK);
81
83
  } else {
82
84
  // It's a directory or file, not a symlink - back it up
83
- console.log('[push-todo] Found existing plugin directory, backing up...');
84
- const backupPath = `${PLUGIN_LINK}.backup.${Date.now()}`;
85
- rmSync(PLUGIN_LINK, { recursive: true });
85
+ console.log('[push-todo] Found existing skill directory, backing up...');
86
+ const backupPath = `${SKILL_LINK}.backup.${Date.now()}`;
87
+ rmSync(SKILL_LINK, { recursive: true });
86
88
  console.log(`[push-todo] Backed up to ${backupPath}`);
87
89
  }
88
90
  } catch (err) {
89
- console.log(`[push-todo] Warning: Could not check existing plugin: ${err.message}`);
91
+ console.log(`[push-todo] Warning: Could not check existing skill: ${err.message}`);
90
92
  }
91
93
  }
92
94
 
93
95
  // Create the symlink
94
- symlinkSync(PACKAGE_ROOT, PLUGIN_LINK);
95
- console.log('[push-todo] Claude Code plugin installed:');
96
- console.log(`[push-todo] ~/.claude/plugins/push-todo -> ${PACKAGE_ROOT}`);
96
+ symlinkSync(PACKAGE_ROOT, SKILL_LINK);
97
+ console.log('[push-todo] Claude Code skill installed:');
98
+ console.log(`[push-todo] ~/.claude/skills/push-todo -> ${PACKAGE_ROOT}`);
97
99
  return true;
98
100
  } catch (error) {
99
- console.error(`[push-todo] Failed to set up Claude Code plugin: ${error.message}`);
101
+ console.error(`[push-todo] Failed to set up Claude Code skill: ${error.message}`);
100
102
  console.log('[push-todo] You can manually create the symlink:');
101
- console.log(`[push-todo] ln -s "${PACKAGE_ROOT}" "${PLUGIN_LINK}"`);
103
+ console.log(`[push-todo] ln -s "${PACKAGE_ROOT}" "${SKILL_LINK}"`);
102
104
  return false;
103
105
  }
104
106
  }
105
107
 
106
108
  /**
107
- * Clean up legacy installation (Python version in ~/.claude/skills/).
109
+ * Clean up legacy plugin installation (in ~/.claude/plugins/).
110
+ * We migrated from plugins to skills for cleaner /push-todo command.
108
111
  */
109
112
  function cleanupLegacyInstallation() {
110
- if (!existsSync(LEGACY_SKILL_LINK)) {
113
+ if (!existsSync(LEGACY_PLUGIN_LINK)) {
111
114
  return;
112
115
  }
113
116
 
114
117
  try {
115
- const stats = lstatSync(LEGACY_SKILL_LINK);
118
+ const stats = lstatSync(LEGACY_PLUGIN_LINK);
116
119
 
117
120
  if (stats.isSymbolicLink()) {
118
- const target = readlinkSync(LEGACY_SKILL_LINK);
119
- // Check if it points to old Python location
120
- if (target.includes('plugins/push-todo') || target.includes('push-todo-cli')) {
121
- console.log('[push-todo] Removing legacy symlink at ~/.claude/skills/push-todo');
122
- unlinkSync(LEGACY_SKILL_LINK);
123
- console.log('[push-todo] Legacy symlink removed.');
124
- }
121
+ console.log('[push-todo] Removing legacy plugin symlink at ~/.claude/plugins/push-todo');
122
+ unlinkSync(LEGACY_PLUGIN_LINK);
123
+ console.log('[push-todo] Legacy plugin symlink removed.');
124
+ } else if (stats.isDirectory()) {
125
+ console.log('[push-todo] Removing legacy plugin directory at ~/.claude/plugins/push-todo');
126
+ rmSync(LEGACY_PLUGIN_LINK, { recursive: true });
127
+ console.log('[push-todo] Legacy plugin directory removed.');
125
128
  }
126
129
  } catch (error) {
127
130
  // Ignore errors - this is best-effort cleanup
128
- console.log(`[push-todo] Note: Could not clean up legacy installation: ${error.message}`);
131
+ console.log(`[push-todo] Note: Could not clean up legacy plugin: ${error.message}`);
129
132
  }
130
133
  }
131
134
 
@@ -331,9 +334,9 @@ async function main() {
331
334
  // Step 2: Clean up legacy installation
332
335
  cleanupLegacyInstallation();
333
336
 
334
- // Step 3: Set up Claude Code plugin symlink
335
- console.log('[push-todo] Setting up Claude Code plugin...');
336
- const claudeSuccess = setupClaudePlugin();
337
+ // Step 3: Set up Claude Code skill symlink
338
+ console.log('[push-todo] Setting up Claude Code skill...');
339
+ const claudeSuccess = setupClaudeSkill();
337
340
  console.log('');
338
341
 
339
342
  // Step 4: Set up OpenAI Codex (if installed)
@@ -1,5 +0,0 @@
1
- {
2
- "name": "push-todo",
3
- "version": "3.4.5",
4
- "description": "Voice tasks from Push iOS app"
5
- }
@@ -1,78 +0,0 @@
1
- # Push Todo - Voice Tasks from iPhone
2
-
3
- Fetch and work on voice tasks captured via the Push iOS app.
4
-
5
- ## How to Use
6
-
7
- Run `/push-todo` to see your active tasks, or `/push-todo <number>` to work on a specific task.
8
-
9
- ## Commands
10
-
11
- | Command | Description |
12
- |---------|-------------|
13
- | `/push-todo` | List all active tasks for current project |
14
- | `/push-todo <number>` | Work on specific task (e.g., `/push-todo 427`) |
15
- | `/push-todo --all-projects` | List tasks from all projects |
16
- | `/push-todo --backlog` | Show backlog items |
17
- | `/push-todo connect` | Run connection diagnostics |
18
- | `/push-todo search <query>` | Search tasks |
19
- | `/push-todo status` | Show connection status |
20
-
21
- ## Task Output Format
22
-
23
- When you fetch a task, you'll see:
24
-
25
- ```
26
- ## Task: #427 Fix authentication bug
27
-
28
- **Project:** github.com/user/repo
29
-
30
- ### Content
31
- Users are getting logged out randomly. Need to investigate the session token expiration logic.
32
-
33
- ### Original Voice Transcript
34
- > "There's a bug where users get logged out randomly, I think it's the session token expiration"
35
-
36
- **Task ID:** `550e8400-e29b-41d4-a716-446655440000`
37
- **Display Number:** #427
38
- **Status:** Active
39
- **Created:** 2026-01-15T10:30:00Z
40
- ```
41
-
42
- ## Batch Offer Format
43
-
44
- When multiple tasks are available, you may see a batch offer:
45
-
46
- ```
47
- ==================================================
48
- BATCH_OFFER: 3
49
- BATCH_TASKS: 427,428,429
50
- #427 - Fix authentication bug
51
- #428 - Add dark mode support
52
- #429 - Update API documentation
53
- ==================================================
54
- ```
55
-
56
- ## Working on Tasks
57
-
58
- When you fetch a specific task:
59
-
60
- 1. Read the **Content** section for the full task description
61
- 2. Check the **Original Voice Transcript** for additional context
62
- 3. Implement the requested changes
63
- 4. Mark the task as completed when done
64
-
65
- ## Completion
66
-
67
- After completing a task, the task will be marked as done and synced back to the Push app on your iPhone.
68
-
69
- ## Project Context
70
-
71
- Tasks are associated with git repositories. The CLI automatically detects your current project and shows only relevant tasks.
72
-
73
- - Use `--all-projects` to see tasks from all registered projects
74
- - Run `push-todo connect` to register the current project
75
-
76
- ## E2EE Support
77
-
78
- If you have End-to-End Encryption enabled on the Push app, the CLI will automatically decrypt task content using your iCloud Keychain.