@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.
- package/.claude-plugin/plugin.json +1 -1
- package/lib/cli.js +1 -1
- package/package.json +1 -1
- package/scripts/postinstall.js +62 -108
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.
|
|
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
package/scripts/postinstall.js
CHANGED
|
@@ -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
|
-
//
|
|
48
|
-
const
|
|
49
|
-
const
|
|
50
|
-
const
|
|
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
|
|
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
|
-
//
|
|
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
|
-
//
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
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:
|
|
277
|
+
console.log(`[push-todo] Clawdbot: Setup failed: ${error.message}`);
|
|
324
278
|
return false;
|
|
325
279
|
}
|
|
326
280
|
}
|