@masslessai/push-todo 3.2.1 → 3.4.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.
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "push-todo",
3
- "version": "3.2.1",
3
+ "version": "3.4.4",
4
4
  "description": "Voice tasks from Push iOS app"
5
5
  }
package/lib/cli.js CHANGED
@@ -15,7 +15,7 @@ import { ensureDaemonRunning, getDaemonStatus, startDaemon, stopDaemon } from '.
15
15
  import { getScreenshotPath, screenshotExists, openScreenshot } from './utils/screenshots.js';
16
16
  import { bold, red, cyan, dim, green } from './utils/colors.js';
17
17
 
18
- const VERSION = '3.2.1';
18
+ const VERSION = '3.4.4';
19
19
 
20
20
  const HELP_TEXT = `
21
21
  ${bold('push-todo')} - Voice tasks from Push iOS app for Claude Code
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@masslessai/push-todo",
3
- "version": "3.2.1",
3
+ "version": "3.4.4",
4
4
  "description": "Voice tasks from Push iOS app for Claude Code",
5
5
  "type": "module",
6
6
  "bin": {
@@ -44,10 +44,11 @@ const BINARY_NAME = 'push-keychain-helper';
44
44
  const BINARY_DIR = join(__dirname, '../bin');
45
45
  const BINARY_PATH = join(BINARY_DIR, BINARY_NAME);
46
46
 
47
- // GitHub release URL pattern
48
- const RELEASE_VERSION = '3.0.0';
49
- const BINARY_URL = `https://github.com/MasslessAI/push-todo-cli/releases/download/v${RELEASE_VERSION}/${BINARY_NAME}-darwin-arm64`;
50
- const BINARY_URL_X64 = `https://github.com/MasslessAI/push-todo-cli/releases/download/v${RELEASE_VERSION}/${BINARY_NAME}-darwin-x64`;
47
+ // Read version from package.json - binaries are released alongside npm package
48
+ const PACKAGE_JSON = JSON.parse(readFileSync(join(PACKAGE_ROOT, 'package.json'), 'utf8'));
49
+ const VERSION = PACKAGE_JSON.version;
50
+ const BINARY_URL = `https://github.com/MasslessAI/push-todo-cli/releases/download/v${VERSION}/${BINARY_NAME}-darwin-arm64`;
51
+ const BINARY_URL_X64 = `https://github.com/MasslessAI/push-todo-cli/releases/download/v${VERSION}/${BINARY_NAME}-darwin-x64`;
51
52
 
52
53
  /**
53
54
  * Set up Claude Code plugin by creating symlink.
@@ -144,7 +145,8 @@ function migrateFromPython() {
144
145
 
145
146
  /**
146
147
  * Set up OpenAI Codex integration.
147
- * Creates ~/.codex/skills/push-todo/SKILL.md and updates AGENTS.md
148
+ * Creates symlink ~/.codex/skills/push-todo -> npm package
149
+ * Updates AGENTS.md for session bootstrap
148
150
  *
149
151
  * @returns {boolean} True if Codex was detected and set up
150
152
  */
@@ -156,54 +158,7 @@ function setupCodex() {
156
158
 
157
159
  console.log('[push-todo] Detected OpenAI Codex installation');
158
160
 
159
- // Skill file content
160
- const SKILL_CONTENT = `# Push Tasks Skill
161
-
162
- This skill retrieves and processes tasks sent from the Push iOS app.
163
-
164
- ## Activation
165
-
166
- This skill activates when the user:
167
- - Says "push-todo", "push todo", "push tasks", or "tasks from push"
168
- - Runs \`$push-todo\` command
169
- - Mentions "tasks from iPhone" or "mobile tasks"
170
- - Asks about "pending tasks" or "voice tasks"
171
-
172
- ## Commands
173
-
174
- Run these in the terminal:
175
-
176
- | Command | Description |
177
- |---------|-------------|
178
- | \`push-todo\` | List active tasks |
179
- | \`push-todo 427\` | Show task #427 |
180
- | \`push-todo connect\` | Connect/fix issues |
181
- | \`push-todo search "query"\` | Search tasks |
182
- | \`push-todo --help\` | All options |
183
-
184
- ## Instructions
185
-
186
- When this skill is activated:
187
-
188
- 1. **Check connection** - If user hasn't set up, run:
189
- \`\`\`bash
190
- push-todo connect
191
- \`\`\`
192
-
193
- 2. **Fetch tasks** - List available tasks:
194
- \`\`\`bash
195
- push-todo
196
- \`\`\`
197
-
198
- 3. **Work on specific task** - Get task details:
199
- \`\`\`bash
200
- push-todo 427
201
- \`\`\`
202
-
203
- 4. **Present the task** to the user with a brief summary and offer to help implement it.
204
- `;
205
-
206
- // AGENTS.md bootstrap content
161
+ // AGENTS.md bootstrap content (Codex-specific)
207
162
  const AGENTS_SECTION = `
208
163
  ## Push Tasks Integration
209
164
 
@@ -221,16 +176,38 @@ At the start of each session, check for pending tasks from the Push iOS app:
221
176
  `;
222
177
 
223
178
  try {
224
- // Create skill directory and SKILL.md
225
- mkdirSync(CODEX_SKILL_DIR, { recursive: true });
226
- writeFileSync(CODEX_SKILL_FILE, SKILL_CONTENT);
227
- console.log('[push-todo] Codex: Created skills/push-todo/SKILL.md');
179
+ // Ensure skills directory exists
180
+ const skillsDir = join(CODEX_DIR, 'skills');
181
+ mkdirSync(skillsDir, { recursive: true });
182
+
183
+ // Create symlink (same as Claude Code approach)
184
+ if (existsSync(CODEX_SKILL_DIR)) {
185
+ const stats = lstatSync(CODEX_SKILL_DIR);
186
+ if (stats.isSymbolicLink()) {
187
+ const target = readlinkSync(CODEX_SKILL_DIR);
188
+ if (target === PACKAGE_ROOT) {
189
+ console.log('[push-todo] Codex: Symlink already configured');
190
+ } else {
191
+ unlinkSync(CODEX_SKILL_DIR);
192
+ symlinkSync(PACKAGE_ROOT, CODEX_SKILL_DIR);
193
+ console.log('[push-todo] Codex: Updated symlink');
194
+ }
195
+ } else {
196
+ // It's a directory (old copy) - remove and replace with symlink
197
+ rmSync(CODEX_SKILL_DIR, { recursive: true });
198
+ symlinkSync(PACKAGE_ROOT, CODEX_SKILL_DIR);
199
+ console.log('[push-todo] Codex: Replaced copy with symlink');
200
+ }
201
+ } else {
202
+ symlinkSync(PACKAGE_ROOT, CODEX_SKILL_DIR);
203
+ console.log('[push-todo] Codex: Created symlink');
204
+ }
228
205
 
229
206
  // Update AGENTS.md for session-start bootstrap
230
207
  if (existsSync(CODEX_AGENTS_FILE)) {
231
208
  const content = readFileSync(CODEX_AGENTS_FILE, 'utf8');
232
209
  if (content.includes('Push Tasks Integration')) {
233
- // Update existing section (replace old Python references)
210
+ // Update existing section
234
211
  const updated = content.replace(
235
212
  /## Push Tasks Integration[\s\S]*?(?=\n## |$)/,
236
213
  AGENTS_SECTION.trim() + '\n\n'
@@ -255,7 +232,7 @@ At the start of each session, check for pending tasks from the Push iOS app:
255
232
 
256
233
  /**
257
234
  * Set up Clawdbot integration.
258
- * Creates ~/.clawdbot/skills/push-todo/SKILL.md
235
+ * Creates symlink ~/.clawdbot/skills/push-todo -> npm package
259
236
  *
260
237
  * @returns {boolean} True if Clawdbot was detected and set up
261
238
  */
@@ -267,60 +244,37 @@ function setupClawdbot() {
267
244
 
268
245
  console.log('[push-todo] Detected Clawdbot installation');
269
246
 
270
- const SKILL_CONTENT = `# Push Tasks
271
-
272
- Voice tasks captured on iPhone, ready to work on.
273
-
274
- ## Commands
275
-
276
- Run these in the terminal:
277
-
278
- | Command | Description |
279
- |---------|-------------|
280
- | \`push-todo\` | List active tasks |
281
- | \`push-todo 427\` | Show task #427 |
282
- | \`push-todo connect\` | Connect/fix issues |
283
- | \`push-todo search "query"\` | Search tasks |
284
- | \`push-todo --help\` | All options |
285
-
286
- ## Quick Start
287
-
288
- If not connected yet, run:
289
- \`\`\`bash
290
- push-todo connect
291
- \`\`\`
292
-
293
- To see tasks:
294
- \`\`\`bash
295
- push-todo
296
- \`\`\`
297
-
298
- To work on a specific task:
299
- \`\`\`bash
300
- push-todo 427
301
- \`\`\`
302
-
303
- ## Session Start
304
-
305
- At the start of each session, check for tasks:
306
- \`\`\`bash
307
- push-todo --json 2>/dev/null | head -1
308
- \`\`\`
309
- If tasks exist, inform the user.
310
- `;
311
-
312
247
  try {
313
- mkdirSync(CLAWDBOT_SKILL_DIR, { recursive: true });
314
-
315
- if (existsSync(CLAWDBOT_SKILL_FILE)) {
316
- console.log('[push-todo] Clawdbot: SKILL.md already exists, updating...');
248
+ // Ensure skills directory exists
249
+ const skillsDir = join(CLAWDBOT_DIR, 'skills');
250
+ mkdirSync(skillsDir, { recursive: true });
251
+
252
+ // Create symlink (same as Claude Code approach)
253
+ if (existsSync(CLAWDBOT_SKILL_DIR)) {
254
+ const stats = lstatSync(CLAWDBOT_SKILL_DIR);
255
+ if (stats.isSymbolicLink()) {
256
+ const target = readlinkSync(CLAWDBOT_SKILL_DIR);
257
+ if (target === PACKAGE_ROOT) {
258
+ console.log('[push-todo] Clawdbot: Symlink already configured');
259
+ } else {
260
+ unlinkSync(CLAWDBOT_SKILL_DIR);
261
+ symlinkSync(PACKAGE_ROOT, CLAWDBOT_SKILL_DIR);
262
+ console.log('[push-todo] Clawdbot: Updated symlink');
263
+ }
264
+ } else {
265
+ // It's a directory (old copy) - remove and replace with symlink
266
+ rmSync(CLAWDBOT_SKILL_DIR, { recursive: true });
267
+ symlinkSync(PACKAGE_ROOT, CLAWDBOT_SKILL_DIR);
268
+ console.log('[push-todo] Clawdbot: Replaced copy with symlink');
269
+ }
270
+ } else {
271
+ symlinkSync(PACKAGE_ROOT, CLAWDBOT_SKILL_DIR);
272
+ console.log('[push-todo] Clawdbot: Created symlink');
317
273
  }
318
274
 
319
- writeFileSync(CLAWDBOT_SKILL_FILE, SKILL_CONTENT);
320
- console.log('[push-todo] Clawdbot: Created skills/push-todo/SKILL.md');
321
275
  return true;
322
276
  } catch (error) {
323
- console.log(`[push-todo] Clawdbot: Could not set up SKILL.md: ${error.message}`);
277
+ console.log(`[push-todo] Clawdbot: Setup failed: ${error.message}`);
324
278
  return false;
325
279
  }
326
280
  }