@vibetasks/cli 0.6.0 → 0.6.1

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.
Files changed (2) hide show
  1. package/dist/bin/vibetasks.js +52 -96
  2. package/package.json +67 -67
@@ -45,12 +45,7 @@ ${url}
45
45
  `));
46
46
  }
47
47
  }
48
- async function getAuthBaseUrl() {
49
- const authManager = new AuthManager();
50
- const configUrl = await authManager.getConfig("auth-url");
51
- if (configUrl) {
52
- return String(configUrl);
53
- }
48
+ function getAuthBaseUrl() {
54
49
  if (process.env.VIBETASKS_AUTH_URL) {
55
50
  return process.env.VIBETASKS_AUTH_URL;
56
51
  }
@@ -63,7 +58,6 @@ async function loginWithBrowser() {
63
58
  console.log(chalk.blue.bold("\n\u{1F510} VibeTasks Browser Login\n"));
64
59
  const spinner = ora("Starting local server...").start();
65
60
  const port = await getAvailablePort();
66
- const baseUrl = await getAuthBaseUrl();
67
61
  return new Promise((resolve, reject) => {
68
62
  let timeoutId = null;
69
63
  const server = createServer(async (req, res) => {
@@ -134,36 +128,6 @@ async function loginWithBrowser() {
134
128
  <title>Authentication Successful</title>
135
129
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
136
130
  <style>
137
- :root {
138
- --background: oklch(1 0 0);
139
- --foreground: oklch(0.145 0 0);
140
- --card: oklch(1 0 0);
141
- --card-foreground: oklch(0.145 0 0);
142
- --primary: oklch(0.205 0 0);
143
- --primary-foreground: oklch(0.985 0 0);
144
- --muted: oklch(0.97 0 0);
145
- --muted-foreground: oklch(0.556 0 0);
146
- --accent: oklch(0.97 0 0);
147
- --accent-foreground: oklch(0.205 0 0);
148
- --border: oklch(0.922 0 0);
149
- --success: oklch(0.7 0.15 160);
150
- }
151
- @media (prefers-color-scheme: dark) {
152
- :root {
153
- --background: oklch(0.145 0 0);
154
- --foreground: oklch(0.985 0 0);
155
- --card: oklch(0.205 0 0);
156
- --card-foreground: oklch(0.985 0 0);
157
- --primary: oklch(0.922 0 0);
158
- --primary-foreground: oklch(0.205 0 0);
159
- --muted: oklch(0.269 0 0);
160
- --muted-foreground: oklch(0.708 0 0);
161
- --accent: oklch(0.269 0 0);
162
- --accent-foreground: oklch(0.985 0 0);
163
- --border: oklch(1 0 0 / 10%);
164
- --success: oklch(0.75 0.15 160);
165
- }
166
- }
167
131
  * { margin: 0; padding: 0; box-sizing: border-box; }
168
132
  body {
169
133
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
@@ -171,36 +135,35 @@ async function loginWithBrowser() {
171
135
  align-items: center;
172
136
  justify-content: center;
173
137
  min-height: 100vh;
174
- background: var(--background);
175
- color: var(--foreground);
138
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
176
139
  padding: 20px;
177
140
  }
178
141
  .container {
179
142
  text-align: center;
180
- padding: 48px 40px;
181
- background: var(--card);
182
- border: 1px solid var(--border);
183
- border-radius: 12px;
143
+ padding: 60px 40px;
144
+ background: white;
145
+ border-radius: 20px;
146
+ box-shadow: 0 20px 60px rgba(0,0,0,0.3);
184
147
  max-width: 450px;
185
148
  width: 100%;
186
149
  }
187
150
  .checkmark {
188
- width: 64px;
189
- height: 64px;
151
+ width: 80px;
152
+ height: 80px;
190
153
  border-radius: 50%;
191
154
  display: block;
192
- stroke-width: 2.5;
193
- stroke: var(--success);
155
+ stroke-width: 3;
156
+ stroke: #4CAF50;
194
157
  stroke-miterlimit: 10;
195
158
  margin: 0 auto 24px;
196
- animation: scale 0.3s ease-in-out 0.9s both;
159
+ animation: fill 0.4s ease-in-out 0.4s forwards, scale 0.3s ease-in-out 0.9s both;
197
160
  }
198
161
  .checkmark-circle {
199
162
  stroke-dasharray: 166;
200
163
  stroke-dashoffset: 166;
201
- stroke-width: 2.5;
164
+ stroke-width: 3;
202
165
  stroke-miterlimit: 10;
203
- stroke: var(--success);
166
+ stroke: #4CAF50;
204
167
  fill: none;
205
168
  animation: stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards;
206
169
  }
@@ -218,65 +181,66 @@ async function loginWithBrowser() {
218
181
  50% { transform: scale3d(1.1, 1.1, 1); }
219
182
  }
220
183
  h1 {
221
- color: var(--foreground);
222
- font-size: 24px;
223
- font-weight: 600;
224
- margin-bottom: 8px;
184
+ color: #2d3748;
185
+ font-size: 28px;
186
+ font-weight: 700;
187
+ margin-bottom: 12px;
225
188
  }
226
189
  .email {
227
- font-weight: 500;
228
- color: var(--muted-foreground);
229
- font-size: 14px;
230
- margin-bottom: 20px;
190
+ font-weight: 600;
191
+ color: #667eea;
192
+ font-size: 16px;
193
+ margin-bottom: 24px;
231
194
  }
232
195
  .message {
233
- color: var(--muted-foreground);
234
- font-size: 14px;
235
- line-height: 1.5;
196
+ color: #718096;
197
+ font-size: 15px;
198
+ line-height: 1.6;
236
199
  }
237
200
  .success-badge {
238
201
  display: inline-block;
239
- background: var(--accent);
240
- color: var(--accent-foreground);
241
- padding: 6px 12px;
242
- border-radius: 6px;
243
- font-size: 13px;
244
- font-weight: 500;
245
- margin-top: 16px;
202
+ background: #f0fdf4;
203
+ color: #15803d;
204
+ padding: 8px 16px;
205
+ border-radius: 20px;
206
+ font-size: 14px;
207
+ font-weight: 600;
208
+ margin-top: 20px;
246
209
  }
247
210
  .button-group {
248
- margin-top: 28px;
211
+ margin-top: 32px;
249
212
  display: flex;
250
- gap: 10px;
213
+ gap: 12px;
251
214
  justify-content: center;
252
- flex-wrap: wrap;
253
215
  }
254
216
  .button {
255
- padding: 10px 20px;
217
+ padding: 12px 24px;
256
218
  border-radius: 8px;
257
- font-weight: 500;
219
+ font-weight: 600;
258
220
  font-size: 14px;
259
221
  cursor: pointer;
260
222
  transition: all 0.2s;
261
223
  text-decoration: none;
262
224
  display: inline-block;
263
- border: none;
264
225
  }
265
226
  .button-primary {
266
- background: var(--primary);
267
- color: var(--primary-foreground);
227
+ background: #667eea;
228
+ color: white;
229
+ border: none;
268
230
  }
269
231
  .button-primary:hover {
270
- opacity: 0.9;
232
+ background: #5568d3;
271
233
  transform: translateY(-1px);
234
+ box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
272
235
  }
273
236
  .button-secondary {
274
- background: var(--muted);
275
- color: var(--muted-foreground);
237
+ background: #f7fafc;
238
+ color: #4a5568;
239
+ border: 2px solid #e2e8f0;
276
240
  }
277
241
  .button-secondary:hover {
278
- background: var(--accent);
279
- color: var(--accent-foreground);
242
+ background: #edf2f7;
243
+ border-color: #cbd5e0;
280
244
  }
281
245
  </style>
282
246
  </head>
@@ -286,15 +250,15 @@ async function loginWithBrowser() {
286
250
  <circle class="checkmark-circle" cx="26" cy="26" r="25" fill="none"/>
287
251
  <path class="checkmark-check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8"/>
288
252
  </svg>
289
- <h1>Authentication Successful</h1>
253
+ <h1>Authentication Successful!</h1>
290
254
  <p class="email">${email}</p>
291
255
  <p class="message">
292
- Your VibeTasks CLI is now connected.<br>
293
- Close this window to continue.
256
+ Your VibeTasks CLI is now connected to your account.<br>
257
+ You can close this window and return to your terminal.
294
258
  </p>
295
259
  <div class="success-badge">Ready to use</div>
296
260
  <div class="button-group">
297
- <a href="${baseUrl}/settings?tab=ai" class="button button-primary">Set up AI integration</a>
261
+ <a href="https://vibetasks.dev/dashboard" class="button button-primary">Go to Dashboard</a>
298
262
  <button onclick="window.close()" class="button button-secondary">Close Window</button>
299
263
  </div>
300
264
  </div>
@@ -350,6 +314,7 @@ Error: ${error.message}`));
350
314
  });
351
315
  server.listen(port, async () => {
352
316
  spinner.text = "Opening browser...";
317
+ const baseUrl = getAuthBaseUrl();
353
318
  const authUrl = `${baseUrl}/cli-auth?port=${port}`;
354
319
  spinner.text = "Waiting for authentication in browser...";
355
320
  console.log(chalk.gray(`
@@ -398,7 +363,6 @@ async function getAvailablePort(startPort = 3737) {
398
363
  var loginCommand = new Command("login").description("Authenticate with VibeTasks via browser (Google OAuth)").option("-b, --browser", "Login via browser (default)").action(async () => {
399
364
  console.log(chalk2.blue.bold("\n\u{1F510} VibeTasks Login\n"));
400
365
  console.log(chalk2.gray("Opening browser for Google sign-in...\n"));
401
- console.log(chalk2.gray("Tip: For local development, run: vibetasks config auth-url http://localhost:3847\n"));
402
366
  await loginWithBrowser();
403
367
  });
404
368
 
@@ -977,15 +941,7 @@ ${filterMessages[filter] || "No tasks found"}.
977
941
  const subtasks = task.subtasks_json || task.subtasks || [];
978
942
  const doneCount = subtasks.filter((s) => s.done).length;
979
943
  const totalCount = subtasks.length;
980
- let progress = chalk4.gray("-");
981
- if (totalCount > 0) {
982
- const percentage = doneCount / totalCount * 100;
983
- const barLength = 5;
984
- const filled = Math.round(doneCount / totalCount * barLength);
985
- const bar = "\u2588".repeat(filled) + "\u2591".repeat(barLength - filled);
986
- const barColor = percentage === 100 ? chalk4.green : percentage >= 50 ? chalk4.cyan : chalk4.yellow;
987
- progress = `${barColor(bar)} ${chalk4.cyan(`${doneCount}/${totalCount}`)}`;
988
- }
944
+ const progress = totalCount > 0 ? chalk4.cyan(`${doneCount}/${totalCount}`) : chalk4.gray("-");
989
945
  if (options.shortIds) {
990
946
  table.push([shortId, status, titleWithAI, progress, dueDate]);
991
947
  } else {
@@ -1798,7 +1754,7 @@ async function runBrowserAuth() {
1798
1754
  res.end();
1799
1755
  });
1800
1756
  server.listen(port, async () => {
1801
- const taskflowPort = process.env.TASKFLOW_WEB_PORT || "3847";
1757
+ const taskflowPort = process.env.TASKFLOW_WEB_PORT || "2843";
1802
1758
  const authUrl = `http://localhost:${taskflowPort}/cli-auth?port=${port}`;
1803
1759
  console.log(chalk13.gray(`
1804
1760
  If browser doesn't open, visit:`));
package/package.json CHANGED
@@ -1,67 +1,67 @@
1
- {
2
- "name": "@vibetasks/cli",
3
- "version": "0.6.0",
4
- "description": "VibeTasks CLI - Lightning-fast task management from your terminal. Works with Claude Code, Cursor, and all AI coding tools.",
5
- "author": "Vyas",
6
- "license": "MIT",
7
- "type": "module",
8
- "main": "./dist/bin/vibetasks.js",
9
- "bin": {
10
- "vibetasks": "./dist/bin/vibetasks.js"
11
- },
12
- "files": [
13
- "dist",
14
- "hooks",
15
- "package.json"
16
- ],
17
- "keywords": [
18
- "vibetasks",
19
- "vibe",
20
- "vibecoding",
21
- "cli",
22
- "task-management",
23
- "productivity",
24
- "mcp",
25
- "claude-code",
26
- "cursor",
27
- "ai-tools",
28
- "terminal"
29
- ],
30
- "repository": {
31
- "type": "git",
32
- "url": "https://github.com/vyassathya/vibetasks.git",
33
- "directory": "packages/cli"
34
- },
35
- "homepage": "https://vibetasks.dev",
36
- "bugs": {
37
- "url": "https://github.com/vyassathya/vibetasks/issues"
38
- },
39
- "publishConfig": {
40
- "access": "public"
41
- },
42
- "scripts": {
43
- "dev": "tsx bin/vibetasks.ts",
44
- "build": "tsup bin/vibetasks.ts src/daemon-worker.ts --format esm --clean --outDir dist --shims",
45
- "typecheck": "tsc --noEmit"
46
- },
47
- "dependencies": {
48
- "@vibetasks/core": "^0.5.4",
49
- "@vibetasks/shared": "^1.3.1",
50
- "commander": "^11.1.0",
51
- "chalk": "^5.3.0",
52
- "ora": "^8.0.1",
53
- "cli-table3": "^0.6.3",
54
- "inquirer": "^9.2.12",
55
- "date-fns": "^3.0.0",
56
- "clipboardy": "^4.0.0",
57
- "node-notifier": "^10.0.1",
58
- "node-global-key-listener": "^0.3.0"
59
- },
60
- "devDependencies": {
61
- "@types/inquirer": "^9.0.7",
62
- "@types/node": "^20.0.0",
63
- "tsx": "^4.7.0",
64
- "tsup": "^8.0.0",
65
- "typescript": "^5.3.3"
66
- }
67
- }
1
+ {
2
+ "name": "@vibetasks/cli",
3
+ "version": "0.6.1",
4
+ "description": "VibeTasks CLI - Lightning-fast task management from your terminal. Works with Claude Code, Cursor, and all AI coding tools.",
5
+ "author": "Vyas",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "./dist/bin/vibetasks.js",
9
+ "bin": {
10
+ "vibetasks": "./dist/bin/vibetasks.js"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "hooks",
15
+ "package.json"
16
+ ],
17
+ "keywords": [
18
+ "vibetasks",
19
+ "vibe",
20
+ "vibecoding",
21
+ "cli",
22
+ "task-management",
23
+ "productivity",
24
+ "mcp",
25
+ "claude-code",
26
+ "cursor",
27
+ "ai-tools",
28
+ "terminal"
29
+ ],
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/vyassathya/vibetasks.git",
33
+ "directory": "packages/cli"
34
+ },
35
+ "homepage": "https://vibetasks.dev",
36
+ "bugs": {
37
+ "url": "https://github.com/vyassathya/vibetasks/issues"
38
+ },
39
+ "publishConfig": {
40
+ "access": "public"
41
+ },
42
+ "scripts": {
43
+ "dev": "tsx bin/vibetasks.ts",
44
+ "build": "tsup bin/vibetasks.ts src/daemon-worker.ts --format esm --clean --outDir dist --shims",
45
+ "typecheck": "tsc --noEmit"
46
+ },
47
+ "dependencies": {
48
+ "@vibetasks/core": "^0.5.4",
49
+ "@vibetasks/shared": "^1.4.1",
50
+ "commander": "^11.1.0",
51
+ "chalk": "^5.3.0",
52
+ "ora": "^8.0.1",
53
+ "cli-table3": "^0.6.3",
54
+ "inquirer": "^9.2.12",
55
+ "date-fns": "^3.0.0",
56
+ "clipboardy": "^4.0.0",
57
+ "node-notifier": "^10.0.1",
58
+ "node-global-key-listener": "^0.3.0"
59
+ },
60
+ "devDependencies": {
61
+ "@types/inquirer": "^9.0.7",
62
+ "@types/node": "^20.0.0",
63
+ "tsx": "^4.7.0",
64
+ "tsup": "^8.0.0",
65
+ "typescript": "^5.3.3"
66
+ }
67
+ }