@vibetasks/cli 0.5.0 → 0.5.2
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/dist/bin/vibetasks.js +90 -164
- package/package.json +3 -3
package/dist/bin/vibetasks.js
CHANGED
|
@@ -16,10 +16,7 @@ import { createRequire } from "module";
|
|
|
16
16
|
|
|
17
17
|
// src/commands/login.ts
|
|
18
18
|
import { Command } from "commander";
|
|
19
|
-
import inquirer from "inquirer";
|
|
20
|
-
import ora2 from "ora";
|
|
21
19
|
import chalk2 from "chalk";
|
|
22
|
-
import { AuthManager as AuthManager2, createSupabaseClient } from "@vibetasks/core";
|
|
23
20
|
|
|
24
21
|
// src/utils/browser-auth.ts
|
|
25
22
|
import { createServer } from "http";
|
|
@@ -363,88 +360,17 @@ async function getAvailablePort(startPort = 3737) {
|
|
|
363
360
|
}
|
|
364
361
|
|
|
365
362
|
// src/commands/login.ts
|
|
366
|
-
var loginCommand = new Command("login").description("Authenticate with
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
}
|
|
371
|
-
let email = options.email;
|
|
372
|
-
let password = options.password;
|
|
373
|
-
if (email && password) {
|
|
374
|
-
console.log(chalk2.blue.bold("\nVibeTasks Login\n"));
|
|
375
|
-
} else if (!process.stdin.isTTY) {
|
|
376
|
-
console.log(chalk2.red("Error: Non-interactive environment requires --email and --password flags"));
|
|
377
|
-
console.log(chalk2.gray("\nUsage: vibetasks login --email you@example.com --password yourpassword"));
|
|
378
|
-
console.log(chalk2.gray(" Or: vibetasks login --browser (opens browser for OAuth)"));
|
|
379
|
-
process.exit(1);
|
|
380
|
-
} else {
|
|
381
|
-
console.log(chalk2.blue.bold("\nVibeTasks Login\n"));
|
|
382
|
-
const answers = await inquirer.prompt([
|
|
383
|
-
{
|
|
384
|
-
type: "input",
|
|
385
|
-
name: "email",
|
|
386
|
-
message: "Email:",
|
|
387
|
-
validate: (input) => {
|
|
388
|
-
if (!input.includes("@")) return "Please enter a valid email address";
|
|
389
|
-
return true;
|
|
390
|
-
}
|
|
391
|
-
},
|
|
392
|
-
{
|
|
393
|
-
type: "password",
|
|
394
|
-
name: "password",
|
|
395
|
-
message: "Password:",
|
|
396
|
-
mask: "*",
|
|
397
|
-
validate: (input) => {
|
|
398
|
-
if (input.length < 6) return "Password must be at least 6 characters";
|
|
399
|
-
return true;
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
]);
|
|
403
|
-
email = answers.email;
|
|
404
|
-
password = answers.password;
|
|
405
|
-
}
|
|
406
|
-
const spinner = ora2("Authenticating...").start();
|
|
407
|
-
try {
|
|
408
|
-
const authManager = new AuthManager2();
|
|
409
|
-
const supabaseUrl = process.env.TASKFLOW_SUPABASE_URL || "https://cbkkztbcoitrfcleghfd.supabase.co";
|
|
410
|
-
const supabaseKey = process.env.TASKFLOW_SUPABASE_KEY || process.env.SUPABASE_ANON_KEY || "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImNia2t6dGJjb2l0cmZjbGVnaGZkIiwicm9sZSI6ImFub24iLCJpYXQiOjE3Njc3NTc0MjgsImV4cCI6MjA4MzMzMzQyOH0.G7ILx-nntP0NbxO1gKt5yASb7nt7OmpJ8qtykeGYbQA";
|
|
411
|
-
await authManager.setConfig("supabase_url", supabaseUrl);
|
|
412
|
-
await authManager.setConfig("supabase_key", supabaseKey);
|
|
413
|
-
const supabase = createSupabaseClient({
|
|
414
|
-
supabaseUrl,
|
|
415
|
-
supabaseKey
|
|
416
|
-
});
|
|
417
|
-
const { data, error } = await supabase.auth.signInWithPassword({
|
|
418
|
-
email,
|
|
419
|
-
password
|
|
420
|
-
});
|
|
421
|
-
if (error) throw error;
|
|
422
|
-
if (!data.session) {
|
|
423
|
-
throw new Error("Authentication failed - no session returned");
|
|
424
|
-
}
|
|
425
|
-
await authManager.setAccessToken(data.session.access_token);
|
|
426
|
-
await authManager.setRefreshToken(data.session.refresh_token);
|
|
427
|
-
const storageMethod = authManager.getStorageMethod();
|
|
428
|
-
const storageLocation = storageMethod === "keychain" ? "system keychain" : authManager["configManager"].getConfigPath();
|
|
429
|
-
spinner.succeed(chalk2.green("Successfully authenticated!"));
|
|
430
|
-
console.log(chalk2.gray(`
|
|
431
|
-
Logged in as: ${data.user.email}`));
|
|
432
|
-
console.log(chalk2.gray(`Tokens stored in: ${storageLocation}`));
|
|
433
|
-
console.log(chalk2.blue.bold("\n\u2728 You can now use TaskFlow CLI commands\n"));
|
|
434
|
-
process.exit(0);
|
|
435
|
-
} catch (error) {
|
|
436
|
-
spinner.fail(chalk2.red("Authentication failed"));
|
|
437
|
-
console.error(chalk2.red(`
|
|
438
|
-
Error: ${error.message}`));
|
|
439
|
-
process.exit(1);
|
|
440
|
-
}
|
|
363
|
+
var loginCommand = new Command("login").description("Authenticate with VibeTasks via browser (Google OAuth)").option("-b, --browser", "Login via browser (default)").action(async () => {
|
|
364
|
+
console.log(chalk2.blue.bold("\n\u{1F510} VibeTasks Login\n"));
|
|
365
|
+
console.log(chalk2.gray("Opening browser for Google sign-in...\n"));
|
|
366
|
+
await loginWithBrowser();
|
|
441
367
|
});
|
|
442
368
|
|
|
443
369
|
// src/commands/add.ts
|
|
444
370
|
import { Command as Command2 } from "commander";
|
|
445
|
-
import
|
|
371
|
+
import ora2 from "ora";
|
|
446
372
|
import chalk3 from "chalk";
|
|
447
|
-
import { AuthManager as
|
|
373
|
+
import { AuthManager as AuthManager2, TaskOperations } from "@vibetasks/core";
|
|
448
374
|
|
|
449
375
|
// src/utils/date-parser.ts
|
|
450
376
|
import { addDays, addWeeks, addMonths, format, parse, isValid } from "date-fns";
|
|
@@ -706,9 +632,9 @@ function getSessionManager() {
|
|
|
706
632
|
|
|
707
633
|
// src/commands/add.ts
|
|
708
634
|
var addCommand = new Command2("add").description("Add a new task").argument("<title>", "Task title").option("-n, --notes <notes>", "Task notes (markdown supported)").option("-d, --due <date>", 'Due date (YYYY-MM-DD, "today", "tomorrow", "+3d")').option("-p, --priority <level>", "Priority: low, medium, high", "none").option("-t, --tags <tags...>", "Tags (space-separated)").option("-s, --subtasks <subtasks...>", "Subtasks (space-separated, use quotes for multi-word)").option("--project <name>", "Override auto-detected project").option("-e, --energy <level>", "Energy required: low, medium, high").action(async (title, options) => {
|
|
709
|
-
const spinner =
|
|
635
|
+
const spinner = ora2("Creating task...").start();
|
|
710
636
|
try {
|
|
711
|
-
const authManager = new
|
|
637
|
+
const authManager = new AuthManager2();
|
|
712
638
|
const taskOps = await TaskOperations.fromAuthManager(authManager);
|
|
713
639
|
let projectTag;
|
|
714
640
|
if (options.project) {
|
|
@@ -841,7 +767,7 @@ function isRunningInClaudeCode() {
|
|
|
841
767
|
import { Command as Command3 } from "commander";
|
|
842
768
|
import chalk4 from "chalk";
|
|
843
769
|
import Table from "cli-table3";
|
|
844
|
-
import { AuthManager as
|
|
770
|
+
import { AuthManager as AuthManager3, TaskOperations as TaskOperations2 } from "@vibetasks/core";
|
|
845
771
|
|
|
846
772
|
// src/utils/short-ids.ts
|
|
847
773
|
import { writeFile as writeFile2, readFile as readFile2, mkdir as mkdir2 } from "fs/promises";
|
|
@@ -924,7 +850,7 @@ var listCommand = new Command3("list").description("List tasks").argument("[filt
|
|
|
924
850
|
console.error(chalk4.gray(`Valid filters: ${validFilters.join(", ")}`));
|
|
925
851
|
process.exit(1);
|
|
926
852
|
}
|
|
927
|
-
const authManager = new
|
|
853
|
+
const authManager = new AuthManager3();
|
|
928
854
|
const taskOps = await TaskOperations2.fromAuthManager(authManager);
|
|
929
855
|
let tasks = await taskOps.getTasks(filter);
|
|
930
856
|
if (options.project) {
|
|
@@ -1052,13 +978,13 @@ Error: ${error.message}
|
|
|
1052
978
|
|
|
1053
979
|
// src/commands/done.ts
|
|
1054
980
|
import { Command as Command4 } from "commander";
|
|
1055
|
-
import
|
|
981
|
+
import ora3 from "ora";
|
|
1056
982
|
import chalk5 from "chalk";
|
|
1057
|
-
import { AuthManager as
|
|
983
|
+
import { AuthManager as AuthManager4, TaskOperations as TaskOperations3 } from "@vibetasks/core";
|
|
1058
984
|
var doneCommand = new Command4("done").description("Mark a task as complete").argument("<id>", "Task ID, short # (1-99), or first 8 characters").action(async (id) => {
|
|
1059
|
-
const spinner =
|
|
985
|
+
const spinner = ora3("Completing task...").start();
|
|
1060
986
|
try {
|
|
1061
|
-
const authManager = new
|
|
987
|
+
const authManager = new AuthManager4();
|
|
1062
988
|
const taskOps = await TaskOperations3.fromAuthManager(authManager);
|
|
1063
989
|
const shortIdManager = new ShortIdManager();
|
|
1064
990
|
let taskId = await shortIdManager.resolveId(id);
|
|
@@ -1105,14 +1031,14 @@ Error: ${error.message}
|
|
|
1105
1031
|
// src/commands/vibing.ts
|
|
1106
1032
|
import { Command as Command5 } from "commander";
|
|
1107
1033
|
import chalk6 from "chalk";
|
|
1108
|
-
import
|
|
1109
|
-
import
|
|
1110
|
-
import { AuthManager as
|
|
1034
|
+
import ora4 from "ora";
|
|
1035
|
+
import inquirer from "inquirer";
|
|
1036
|
+
import { AuthManager as AuthManager5, TaskOperations as TaskOperations4 } from "@vibetasks/core";
|
|
1111
1037
|
var WIP_LIMIT = 3;
|
|
1112
1038
|
var vibingCommand = new Command5("vibing").alias("start").alias("v").description("Start working on a task (move to vibing status)").argument("[task-id]", "Task ID or short # (1-99) to start vibing on").option("-p, --pick", "Pick from todo tasks interactively").action(async (taskIdInput, options) => {
|
|
1113
|
-
const spinner =
|
|
1039
|
+
const spinner = ora4();
|
|
1114
1040
|
try {
|
|
1115
|
-
const authManager = new
|
|
1041
|
+
const authManager = new AuthManager5();
|
|
1116
1042
|
const taskOps = await TaskOperations4.fromAuthManager(authManager);
|
|
1117
1043
|
const shortIdManager = new ShortIdManager();
|
|
1118
1044
|
let taskId;
|
|
@@ -1130,7 +1056,7 @@ var vibingCommand = new Command5("vibing").alias("start").alias("v").description
|
|
|
1130
1056
|
console.log(chalk6.magenta(` ${i + 1}. ${t.title}`));
|
|
1131
1057
|
});
|
|
1132
1058
|
console.log("");
|
|
1133
|
-
const { proceed } = await
|
|
1059
|
+
const { proceed } = await inquirer.prompt([{
|
|
1134
1060
|
type: "confirm",
|
|
1135
1061
|
name: "proceed",
|
|
1136
1062
|
message: "Start another task anyway?",
|
|
@@ -1147,7 +1073,7 @@ var vibingCommand = new Command5("vibing").alias("start").alias("v").description
|
|
|
1147
1073
|
console.log(chalk6.yellow('\nNo todo tasks found. Add one with `vibetasks add "task title"`\n'));
|
|
1148
1074
|
process.exit(0);
|
|
1149
1075
|
}
|
|
1150
|
-
const { selectedTask } = await
|
|
1076
|
+
const { selectedTask } = await inquirer.prompt([{
|
|
1151
1077
|
type: "list",
|
|
1152
1078
|
name: "selectedTask",
|
|
1153
1079
|
message: "Pick a task to start:",
|
|
@@ -1183,10 +1109,10 @@ var vibingCommand = new Command5("vibing").alias("start").alias("v").description
|
|
|
1183
1109
|
import { Command as Command6 } from "commander";
|
|
1184
1110
|
import chalk7 from "chalk";
|
|
1185
1111
|
import Table2 from "cli-table3";
|
|
1186
|
-
import { AuthManager as
|
|
1112
|
+
import { AuthManager as AuthManager6, TaskOperations as TaskOperations5 } from "@vibetasks/core";
|
|
1187
1113
|
var searchCommand = new Command6("search").description("Search tasks by title").argument("<query>", "Search query").option("-l, --limit <number>", "Maximum number of results", "20").action(async (query, options) => {
|
|
1188
1114
|
try {
|
|
1189
|
-
const authManager = new
|
|
1115
|
+
const authManager = new AuthManager6();
|
|
1190
1116
|
const taskOps = await TaskOperations5.fromAuthManager(authManager);
|
|
1191
1117
|
const limit = parseInt(options.limit, 10);
|
|
1192
1118
|
const tasks = await taskOps.searchTasks(query, limit);
|
|
@@ -1241,18 +1167,18 @@ Error: ${error.message}
|
|
|
1241
1167
|
|
|
1242
1168
|
// src/commands/update.ts
|
|
1243
1169
|
import { Command as Command7 } from "commander";
|
|
1244
|
-
import
|
|
1170
|
+
import ora5 from "ora";
|
|
1245
1171
|
import chalk8 from "chalk";
|
|
1246
|
-
import { AuthManager as
|
|
1172
|
+
import { AuthManager as AuthManager7, TaskOperations as TaskOperations6 } from "@vibetasks/core";
|
|
1247
1173
|
var updateCommand = new Command7("update").description("Update a task").argument("<id>", "Task ID (full or first 8 characters)").option("-t, --title <title>", "New title").option("-n, --notes <notes>", "New notes").option("-d, --due <date>", "New due date").option("-p, --priority <level>", "New priority: low, medium, high, none").option("-s, --status <status>", "New status: todo, vibing, done").option("--project <name>", "New project tag").option("-e, --energy <level>", "Energy required: low, medium, high").option("-c, --context <notes>", "Update context notes").action(async (id, options) => {
|
|
1248
1174
|
if (!options.title && !options.notes && !options.due && !options.priority && !options.status && !options.project && !options.energy && !options.context) {
|
|
1249
1175
|
console.error(chalk8.red("\nError: No updates specified"));
|
|
1250
1176
|
console.error(chalk8.gray("Provide at least one option: --title, --notes, --due, --priority, --status, --project, --energy, or --context\n"));
|
|
1251
1177
|
process.exit(1);
|
|
1252
1178
|
}
|
|
1253
|
-
const spinner =
|
|
1179
|
+
const spinner = ora5("Updating task...").start();
|
|
1254
1180
|
try {
|
|
1255
|
-
const authManager = new
|
|
1181
|
+
const authManager = new AuthManager7();
|
|
1256
1182
|
const taskOps = await TaskOperations6.fromAuthManager(authManager);
|
|
1257
1183
|
let taskId = id;
|
|
1258
1184
|
if (id.length < 32) {
|
|
@@ -1316,13 +1242,13 @@ Error: ${error.message}
|
|
|
1316
1242
|
|
|
1317
1243
|
// src/commands/delete.ts
|
|
1318
1244
|
import { Command as Command8 } from "commander";
|
|
1319
|
-
import
|
|
1245
|
+
import ora6 from "ora";
|
|
1320
1246
|
import chalk9 from "chalk";
|
|
1321
|
-
import
|
|
1322
|
-
import { AuthManager as
|
|
1247
|
+
import inquirer2 from "inquirer";
|
|
1248
|
+
import { AuthManager as AuthManager8, TaskOperations as TaskOperations7 } from "@vibetasks/core";
|
|
1323
1249
|
var deleteCommand = new Command8("delete").description("Delete a task").argument("<id>", "Task ID (full or first 8 characters)").option("-y, --yes", "Skip confirmation").action(async (id, options) => {
|
|
1324
1250
|
try {
|
|
1325
|
-
const authManager = new
|
|
1251
|
+
const authManager = new AuthManager8();
|
|
1326
1252
|
const taskOps = await TaskOperations7.fromAuthManager(authManager);
|
|
1327
1253
|
let taskId = id;
|
|
1328
1254
|
let taskTitle = "";
|
|
@@ -1342,7 +1268,7 @@ var deleteCommand = new Command8("delete").description("Delete a task").argument
|
|
|
1342
1268
|
taskTitle = task.title;
|
|
1343
1269
|
}
|
|
1344
1270
|
if (!options.yes) {
|
|
1345
|
-
const answers = await
|
|
1271
|
+
const answers = await inquirer2.prompt([
|
|
1346
1272
|
{
|
|
1347
1273
|
type: "confirm",
|
|
1348
1274
|
name: "confirm",
|
|
@@ -1355,7 +1281,7 @@ var deleteCommand = new Command8("delete").description("Delete a task").argument
|
|
|
1355
1281
|
process.exit(0);
|
|
1356
1282
|
}
|
|
1357
1283
|
}
|
|
1358
|
-
const spinner =
|
|
1284
|
+
const spinner = ora6("Deleting task...").start();
|
|
1359
1285
|
await taskOps.deleteTask(taskId);
|
|
1360
1286
|
spinner.succeed(chalk9.green("Task deleted!"));
|
|
1361
1287
|
console.log(chalk9.gray(`
|
|
@@ -1378,10 +1304,10 @@ var deleteCommand = new Command8("delete").description("Delete a task").argument
|
|
|
1378
1304
|
// src/commands/config.ts
|
|
1379
1305
|
import { Command as Command9 } from "commander";
|
|
1380
1306
|
import chalk10 from "chalk";
|
|
1381
|
-
import { AuthManager as
|
|
1307
|
+
import { AuthManager as AuthManager9 } from "@vibetasks/core";
|
|
1382
1308
|
var configCommand = new Command9("config").description("View or set configuration").argument("[key]", "Configuration key").argument("[value]", "Configuration value").action(async (key, value) => {
|
|
1383
1309
|
try {
|
|
1384
|
-
const authManager = new
|
|
1310
|
+
const authManager = new AuthManager9();
|
|
1385
1311
|
if (!key) {
|
|
1386
1312
|
const configManager = authManager["configManager"];
|
|
1387
1313
|
const config = await configManager.getConfig();
|
|
@@ -1438,7 +1364,7 @@ Error: ${error.message}
|
|
|
1438
1364
|
// src/commands/hooks.ts
|
|
1439
1365
|
import { Command as Command10 } from "commander";
|
|
1440
1366
|
import chalk11 from "chalk";
|
|
1441
|
-
import
|
|
1367
|
+
import ora7 from "ora";
|
|
1442
1368
|
import fs from "fs/promises";
|
|
1443
1369
|
import path from "path";
|
|
1444
1370
|
function getVibetasksHooksPath() {
|
|
@@ -1448,7 +1374,7 @@ function getVibetasksHooksPath() {
|
|
|
1448
1374
|
}
|
|
1449
1375
|
var hooksCommand = new Command10("hooks").description("Manage hooks integration (git and Claude Code)");
|
|
1450
1376
|
hooksCommand.command("install").description("Install git hooks in current repository").action(async () => {
|
|
1451
|
-
const spinner =
|
|
1377
|
+
const spinner = ora7("Installing git hooks...").start();
|
|
1452
1378
|
try {
|
|
1453
1379
|
const gitDir = path.join(process.cwd(), ".git");
|
|
1454
1380
|
try {
|
|
@@ -1510,7 +1436,7 @@ Error: ${error.message}
|
|
|
1510
1436
|
}
|
|
1511
1437
|
});
|
|
1512
1438
|
hooksCommand.command("claude").description("Generate Claude Code hook configuration for TodoWrite sync").option("--project <path>", "Project path (defaults to current directory)").option("--output", "Output config to stdout instead of installing").action(async (options) => {
|
|
1513
|
-
const spinner =
|
|
1439
|
+
const spinner = ora7("Generating Claude Code hook configuration...").start();
|
|
1514
1440
|
try {
|
|
1515
1441
|
const projectPath = options.project || process.cwd();
|
|
1516
1442
|
const hooksPath = getVibetasksHooksPath();
|
|
@@ -1612,15 +1538,15 @@ hooksCommand.command("status").description("Show status of installed hooks").act
|
|
|
1612
1538
|
|
|
1613
1539
|
// src/commands/init.ts
|
|
1614
1540
|
import { Command as Command11 } from "commander";
|
|
1615
|
-
import
|
|
1616
|
-
import
|
|
1541
|
+
import inquirer3 from "inquirer";
|
|
1542
|
+
import ora8 from "ora";
|
|
1617
1543
|
import chalk12 from "chalk";
|
|
1618
|
-
import { AuthManager as
|
|
1544
|
+
import { AuthManager as AuthManager10 } from "@vibetasks/core";
|
|
1619
1545
|
import { detectProject as detectProject2 } from "@vibetasks/shared/utils/project-detector";
|
|
1620
1546
|
var initCommand = new Command11("init").description("Initialize TaskFlow for current project (auto-detect from git)").option("--name <name>", "Manually specify project name").action(async (options) => {
|
|
1621
|
-
const spinner =
|
|
1547
|
+
const spinner = ora8("Detecting project...").start();
|
|
1622
1548
|
try {
|
|
1623
|
-
const authManager = new
|
|
1549
|
+
const authManager = new AuthManager10();
|
|
1624
1550
|
const cwd = process.cwd();
|
|
1625
1551
|
let project;
|
|
1626
1552
|
if (options.name) {
|
|
@@ -1639,7 +1565,7 @@ var initCommand = new Command11("init").description("Initialize TaskFlow for cur
|
|
|
1639
1565
|
console.log(chalk12.gray(` Source: ${chalk12.white(project.source)}`));
|
|
1640
1566
|
console.log(chalk12.gray(` Path: ${chalk12.white(project.path)}
|
|
1641
1567
|
`));
|
|
1642
|
-
const answers = await
|
|
1568
|
+
const answers = await inquirer3.prompt([
|
|
1643
1569
|
{
|
|
1644
1570
|
type: "confirm",
|
|
1645
1571
|
name: "confirm",
|
|
@@ -1676,8 +1602,8 @@ Error: ${error.message}
|
|
|
1676
1602
|
|
|
1677
1603
|
// src/commands/setup.ts
|
|
1678
1604
|
import { Command as Command12 } from "commander";
|
|
1679
|
-
import
|
|
1680
|
-
import
|
|
1605
|
+
import inquirer4 from "inquirer";
|
|
1606
|
+
import ora9 from "ora";
|
|
1681
1607
|
import chalk13 from "chalk";
|
|
1682
1608
|
import fs2 from "fs/promises";
|
|
1683
1609
|
import path2 from "path";
|
|
@@ -1685,7 +1611,7 @@ import os from "os";
|
|
|
1685
1611
|
import { createServer as createServer2 } from "http";
|
|
1686
1612
|
import { exec as exec2 } from "child_process";
|
|
1687
1613
|
import { promisify as promisify2 } from "util";
|
|
1688
|
-
import { AuthManager as
|
|
1614
|
+
import { AuthManager as AuthManager11, TaskOperations as TaskOperations8, createSupabaseClient } from "@vibetasks/core";
|
|
1689
1615
|
import { detectProject as detectProject3 } from "@vibetasks/shared/utils/project-detector";
|
|
1690
1616
|
var execAsync2 = promisify2(exec2);
|
|
1691
1617
|
var SUPABASE_URL = "https://cbkkztbcoitrfcleghfd.supabase.co";
|
|
@@ -1750,12 +1676,12 @@ function showWelcome() {
|
|
|
1750
1676
|
}
|
|
1751
1677
|
async function checkExistingAuth() {
|
|
1752
1678
|
try {
|
|
1753
|
-
const authManager = new
|
|
1679
|
+
const authManager = new AuthManager11();
|
|
1754
1680
|
const token = await authManager.getAccessToken();
|
|
1755
1681
|
if (!token) return { authenticated: false };
|
|
1756
1682
|
const supabaseUrl = await authManager.getConfig("supabase_url") || SUPABASE_URL;
|
|
1757
1683
|
const supabaseKey = await authManager.getConfig("supabase_key") || SUPABASE_ANON_KEY;
|
|
1758
|
-
const supabase =
|
|
1684
|
+
const supabase = createSupabaseClient({ supabaseUrl, supabaseKey, accessToken: token });
|
|
1759
1685
|
const { data: { user } } = await supabase.auth.getUser();
|
|
1760
1686
|
if (user?.email) {
|
|
1761
1687
|
return { authenticated: true, email: user.email };
|
|
@@ -1794,7 +1720,7 @@ async function runBrowserAuth() {
|
|
|
1794
1720
|
return;
|
|
1795
1721
|
}
|
|
1796
1722
|
try {
|
|
1797
|
-
const authManager = new
|
|
1723
|
+
const authManager = new AuthManager11();
|
|
1798
1724
|
await authManager.setAccessToken(accessToken);
|
|
1799
1725
|
await authManager.setRefreshToken(refreshToken);
|
|
1800
1726
|
if (supabaseUrl) await authManager.setConfig("supabase_url", supabaseUrl);
|
|
@@ -1838,7 +1764,7 @@ async function stepAuthentication() {
|
|
|
1838
1764
|
const existing = await checkExistingAuth();
|
|
1839
1765
|
if (existing.authenticated) {
|
|
1840
1766
|
console.log(chalk13.green(" \u2713") + chalk13.white(` Already logged in as ${chalk13.cyan(existing.email)}`));
|
|
1841
|
-
const { reauth } = await
|
|
1767
|
+
const { reauth } = await inquirer4.prompt([{
|
|
1842
1768
|
type: "confirm",
|
|
1843
1769
|
name: "reauth",
|
|
1844
1770
|
message: "Re-authenticate with a different account?",
|
|
@@ -1848,7 +1774,7 @@ async function stepAuthentication() {
|
|
|
1848
1774
|
return { success: true, email: existing.email, skipped: true };
|
|
1849
1775
|
}
|
|
1850
1776
|
}
|
|
1851
|
-
const { authMethod } = await
|
|
1777
|
+
const { authMethod } = await inquirer4.prompt([{
|
|
1852
1778
|
type: "list",
|
|
1853
1779
|
name: "authMethod",
|
|
1854
1780
|
message: "How would you like to authenticate?",
|
|
@@ -1858,7 +1784,7 @@ async function stepAuthentication() {
|
|
|
1858
1784
|
]
|
|
1859
1785
|
}]);
|
|
1860
1786
|
if (authMethod === "browser") {
|
|
1861
|
-
const spinner =
|
|
1787
|
+
const spinner = ora9("Opening browser for authentication...").start();
|
|
1862
1788
|
spinner.stop();
|
|
1863
1789
|
console.log(chalk13.gray(" Waiting for browser authentication...\n"));
|
|
1864
1790
|
const result = await runBrowserAuth();
|
|
@@ -1870,7 +1796,7 @@ async function stepAuthentication() {
|
|
|
1870
1796
|
}
|
|
1871
1797
|
return result;
|
|
1872
1798
|
} else {
|
|
1873
|
-
const answers = await
|
|
1799
|
+
const answers = await inquirer4.prompt([
|
|
1874
1800
|
{
|
|
1875
1801
|
type: "input",
|
|
1876
1802
|
name: "email",
|
|
@@ -1885,12 +1811,12 @@ async function stepAuthentication() {
|
|
|
1885
1811
|
validate: (input) => input.length >= 6 || "Password must be at least 6 characters"
|
|
1886
1812
|
}
|
|
1887
1813
|
]);
|
|
1888
|
-
const spinner =
|
|
1814
|
+
const spinner = ora9("Authenticating...").start();
|
|
1889
1815
|
try {
|
|
1890
|
-
const authManager = new
|
|
1816
|
+
const authManager = new AuthManager11();
|
|
1891
1817
|
await authManager.setConfig("supabase_url", SUPABASE_URL);
|
|
1892
1818
|
await authManager.setConfig("supabase_key", SUPABASE_ANON_KEY);
|
|
1893
|
-
const supabase =
|
|
1819
|
+
const supabase = createSupabaseClient({
|
|
1894
1820
|
supabaseUrl: SUPABASE_URL,
|
|
1895
1821
|
supabaseKey: SUPABASE_ANON_KEY
|
|
1896
1822
|
});
|
|
@@ -1920,7 +1846,7 @@ async function stepClaudeCodeConfig() {
|
|
|
1920
1846
|
if (!hasClaudeCode) {
|
|
1921
1847
|
console.log(chalk13.yellow(" \u26A0") + chalk13.gray(" Claude Code config directory not found"));
|
|
1922
1848
|
console.log(chalk13.gray(" Run this command again after installing Claude Code"));
|
|
1923
|
-
const { createAnyway } = await
|
|
1849
|
+
const { createAnyway } = await inquirer4.prompt([{
|
|
1924
1850
|
type: "confirm",
|
|
1925
1851
|
name: "createAnyway",
|
|
1926
1852
|
message: "Create config directory anyway?",
|
|
@@ -1930,7 +1856,7 @@ async function stepClaudeCodeConfig() {
|
|
|
1930
1856
|
return { success: true, skipped: true };
|
|
1931
1857
|
}
|
|
1932
1858
|
}
|
|
1933
|
-
const { configure } = await
|
|
1859
|
+
const { configure } = await inquirer4.prompt([{
|
|
1934
1860
|
type: "confirm",
|
|
1935
1861
|
name: "configure",
|
|
1936
1862
|
message: "Configure VibeTasks MCP server for Claude Code?",
|
|
@@ -1939,7 +1865,7 @@ async function stepClaudeCodeConfig() {
|
|
|
1939
1865
|
if (!configure) {
|
|
1940
1866
|
return { success: true, skipped: true };
|
|
1941
1867
|
}
|
|
1942
|
-
const spinner =
|
|
1868
|
+
const spinner = ora9("Configuring Claude Code...").start();
|
|
1943
1869
|
try {
|
|
1944
1870
|
const configPath = getClaudeConfigPath();
|
|
1945
1871
|
const configDir = path2.dirname(configPath);
|
|
@@ -2015,7 +1941,7 @@ async function stepClaudeCodeConfig() {
|
|
|
2015
1941
|
}
|
|
2016
1942
|
async function stepProjectInit() {
|
|
2017
1943
|
console.log(chalk13.bold.blue("\n\u2501\u2501\u2501 Step 3: Project Setup (Optional) \u2501\u2501\u2501\n"));
|
|
2018
|
-
const spinner =
|
|
1944
|
+
const spinner = ora9("Detecting project...").start();
|
|
2019
1945
|
let project;
|
|
2020
1946
|
try {
|
|
2021
1947
|
project = await detectProject3(process.cwd());
|
|
@@ -2026,7 +1952,7 @@ async function stepProjectInit() {
|
|
|
2026
1952
|
spinner.info(chalk13.gray("No project detected in current directory"));
|
|
2027
1953
|
return { success: true, skipped: true };
|
|
2028
1954
|
}
|
|
2029
|
-
const { setupProject } = await
|
|
1955
|
+
const { setupProject } = await inquirer4.prompt([{
|
|
2030
1956
|
type: "confirm",
|
|
2031
1957
|
name: "setupProject",
|
|
2032
1958
|
message: `Auto-tag tasks created here as "${project.name}"?`,
|
|
@@ -2036,7 +1962,7 @@ async function stepProjectInit() {
|
|
|
2036
1962
|
return { success: true, skipped: true };
|
|
2037
1963
|
}
|
|
2038
1964
|
try {
|
|
2039
|
-
const authManager = new
|
|
1965
|
+
const authManager = new AuthManager11();
|
|
2040
1966
|
await authManager.setConfig(`project_${process.cwd()}`, project.name);
|
|
2041
1967
|
console.log(chalk13.green("\n \u2713") + chalk13.white(` Project "${project.name}" configured`));
|
|
2042
1968
|
return { success: true, projectName: project.name };
|
|
@@ -2051,9 +1977,9 @@ async function stepVerify() {
|
|
|
2051
1977
|
supabaseConnected: false,
|
|
2052
1978
|
mcpConfigured: false
|
|
2053
1979
|
};
|
|
2054
|
-
const supabaseSpinner =
|
|
1980
|
+
const supabaseSpinner = ora9("Testing Supabase connection...").start();
|
|
2055
1981
|
try {
|
|
2056
|
-
const authManager = new
|
|
1982
|
+
const authManager = new AuthManager11();
|
|
2057
1983
|
const taskOps = await TaskOperations8.fromAuthManager(authManager);
|
|
2058
1984
|
const tasks = await taskOps.getTasks("all");
|
|
2059
1985
|
result.supabaseConnected = true;
|
|
@@ -2063,7 +1989,7 @@ async function stepVerify() {
|
|
|
2063
1989
|
supabaseSpinner.fail(chalk13.red("Supabase connection failed"));
|
|
2064
1990
|
console.log(chalk13.gray(` ${error.message}`));
|
|
2065
1991
|
}
|
|
2066
|
-
const mcpSpinner =
|
|
1992
|
+
const mcpSpinner = ora9("Checking MCP configuration...").start();
|
|
2067
1993
|
try {
|
|
2068
1994
|
const configPath = getClaudeConfigPath();
|
|
2069
1995
|
const configContent = await fs2.readFile(configPath, "utf-8");
|
|
@@ -2224,7 +2150,7 @@ async function runNonInteractiveSetup() {
|
|
|
2224
2150
|
if (authResult.success) {
|
|
2225
2151
|
console.log(chalk13.gray("\nVerifying connection..."));
|
|
2226
2152
|
try {
|
|
2227
|
-
const authManager = new
|
|
2153
|
+
const authManager = new AuthManager11();
|
|
2228
2154
|
const taskOps = await TaskOperations8.fromAuthManager(authManager);
|
|
2229
2155
|
const tasks = await taskOps.getTasks("all");
|
|
2230
2156
|
console.log(chalk13.green("\u2713") + ` Connected (${tasks.length} tasks)`);
|
|
@@ -2251,7 +2177,7 @@ var setupCommand = new Command12("setup").description("Interactive setup wizard
|
|
|
2251
2177
|
process.exit(0);
|
|
2252
2178
|
}
|
|
2253
2179
|
showWelcome();
|
|
2254
|
-
const { proceed } = await
|
|
2180
|
+
const { proceed } = await inquirer4.prompt([{
|
|
2255
2181
|
type: "confirm",
|
|
2256
2182
|
name: "proceed",
|
|
2257
2183
|
message: "Ready to begin setup?",
|
|
@@ -2293,9 +2219,9 @@ var setupCommand = new Command12("setup").description("Interactive setup wizard
|
|
|
2293
2219
|
// src/commands/watch.ts
|
|
2294
2220
|
import { Command as Command13 } from "commander";
|
|
2295
2221
|
import chalk14 from "chalk";
|
|
2296
|
-
import
|
|
2297
|
-
import
|
|
2298
|
-
import { AuthManager as
|
|
2222
|
+
import ora10 from "ora";
|
|
2223
|
+
import inquirer5 from "inquirer";
|
|
2224
|
+
import { AuthManager as AuthManager12, TaskOperations as TaskOperations9 } from "@vibetasks/core";
|
|
2299
2225
|
import { detectProject as detectProject4 } from "@vibetasks/shared/utils/project-detector";
|
|
2300
2226
|
var watchCommand = new Command13("watch").description("Monitor clipboard for errors and offer to capture them as tasks").option("-i, --interval <ms>", "Polling interval in milliseconds", "1000").option("-a, --auto", "Auto-create tasks without prompting").option("-q, --quiet", "Minimal output (only show errors)").option("--project <name>", "Override auto-detected project").action(async (options) => {
|
|
2301
2227
|
const interval = parseInt(options.interval || "1000", 10);
|
|
@@ -2308,7 +2234,7 @@ var watchCommand = new Command13("watch").description("Monitor clipboard for err
|
|
|
2308
2234
|
let authManager;
|
|
2309
2235
|
let taskOps;
|
|
2310
2236
|
try {
|
|
2311
|
-
authManager = new
|
|
2237
|
+
authManager = new AuthManager12();
|
|
2312
2238
|
taskOps = await TaskOperations9.fromAuthManager(authManager);
|
|
2313
2239
|
} catch (error) {
|
|
2314
2240
|
if (error.message.includes("Not authenticated")) {
|
|
@@ -2353,7 +2279,7 @@ Error: ${error.message}
|
|
|
2353
2279
|
recentErrors.add(errorHash);
|
|
2354
2280
|
return;
|
|
2355
2281
|
}
|
|
2356
|
-
const { action } = await
|
|
2282
|
+
const { action } = await inquirer5.prompt([
|
|
2357
2283
|
{
|
|
2358
2284
|
type: "list",
|
|
2359
2285
|
name: "action",
|
|
@@ -2377,7 +2303,7 @@ Error: ${error.message}
|
|
|
2377
2303
|
console.log(error.rawText);
|
|
2378
2304
|
console.log(chalk14.gray("\u2500".repeat(50)));
|
|
2379
2305
|
console.log();
|
|
2380
|
-
const { afterShow } = await
|
|
2306
|
+
const { afterShow } = await inquirer5.prompt([
|
|
2381
2307
|
{
|
|
2382
2308
|
type: "list",
|
|
2383
2309
|
name: "afterShow",
|
|
@@ -2441,7 +2367,7 @@ Error: ${error.message}
|
|
|
2441
2367
|
});
|
|
2442
2368
|
});
|
|
2443
2369
|
async function createTaskFromError(error, taskOps, projectTag) {
|
|
2444
|
-
const spinner =
|
|
2370
|
+
const spinner = ora10("Creating task...").start();
|
|
2445
2371
|
try {
|
|
2446
2372
|
const title = generateTaskTitle(error);
|
|
2447
2373
|
const task = await taskOps.createTask({
|
|
@@ -2548,13 +2474,13 @@ var checkCommand = new Command13("check-clipboard").description("Check clipboard
|
|
|
2548
2474
|
// src/commands/archive.ts
|
|
2549
2475
|
import { Command as Command14 } from "commander";
|
|
2550
2476
|
import chalk15 from "chalk";
|
|
2551
|
-
import
|
|
2552
|
-
import
|
|
2553
|
-
import { AuthManager as
|
|
2477
|
+
import ora11 from "ora";
|
|
2478
|
+
import inquirer6 from "inquirer";
|
|
2479
|
+
import { AuthManager as AuthManager13, TaskOperations as TaskOperations10 } from "@vibetasks/core";
|
|
2554
2480
|
var archiveCommand = new Command14("archive").description("Archive a task or manage archived tasks").argument("[task-id]", "Task ID to archive (full or first 8 characters)").option("-l, --list", "List all archived tasks").option("-u, --unarchive <id>", "Unarchive a task by ID").option("--pick", "Pick from completed tasks to archive").action(async (taskId, options) => {
|
|
2555
|
-
const spinner =
|
|
2481
|
+
const spinner = ora11();
|
|
2556
2482
|
try {
|
|
2557
|
-
const authManager = new
|
|
2483
|
+
const authManager = new AuthManager13();
|
|
2558
2484
|
const taskOps = await TaskOperations10.fromAuthManager(authManager);
|
|
2559
2485
|
if (options.list) {
|
|
2560
2486
|
spinner.start("Fetching archived tasks...");
|
|
@@ -2606,7 +2532,7 @@ Restored: ${task2.title}`));
|
|
|
2606
2532
|
console.log(chalk15.yellow("\nNo completed tasks to archive. Complete some tasks first!\n"));
|
|
2607
2533
|
process.exit(0);
|
|
2608
2534
|
}
|
|
2609
|
-
const { selectedTask } = await
|
|
2535
|
+
const { selectedTask } = await inquirer6.prompt([{
|
|
2610
2536
|
type: "list",
|
|
2611
2537
|
name: "selectedTask",
|
|
2612
2538
|
message: "Pick a completed task to archive:",
|
|
@@ -2664,17 +2590,17 @@ Error: ${error.message}
|
|
|
2664
2590
|
// src/commands/daemon.ts
|
|
2665
2591
|
import { Command as Command15 } from "commander";
|
|
2666
2592
|
import chalk16 from "chalk";
|
|
2667
|
-
import
|
|
2593
|
+
import ora12 from "ora";
|
|
2668
2594
|
import { spawn } from "child_process";
|
|
2669
2595
|
import path3 from "path";
|
|
2670
2596
|
import { fileURLToPath } from "url";
|
|
2671
|
-
import { AuthManager as
|
|
2597
|
+
import { AuthManager as AuthManager14, TaskOperations as TaskOperations11 } from "@vibetasks/core";
|
|
2672
2598
|
var __filename2 = fileURLToPath(import.meta.url);
|
|
2673
2599
|
var __dirname2 = path3.dirname(__filename2);
|
|
2674
2600
|
var daemonCommand = new Command15("daemon").description("Manage the VibeTasks error capture daemon").addCommand(createStartCommand()).addCommand(createStopCommand()).addCommand(createStatusCommand()).addCommand(createConfigureCommand()).addCommand(createCaptureCommand());
|
|
2675
2601
|
function createStartCommand() {
|
|
2676
2602
|
return new Command15("start").description("Start the error capture daemon").option("-f, --foreground", "Run in foreground (useful for debugging)").option("--no-notify", "Disable startup notification").action(async (options) => {
|
|
2677
|
-
const spinner =
|
|
2603
|
+
const spinner = ora12("Starting VibeTasks daemon...").start();
|
|
2678
2604
|
try {
|
|
2679
2605
|
if (await daemonConfigManager.isDaemonRunning()) {
|
|
2680
2606
|
spinner.warn(chalk16.yellow("Daemon is already running"));
|
|
@@ -2715,7 +2641,7 @@ function createStartCommand() {
|
|
|
2715
2641
|
}
|
|
2716
2642
|
function createStopCommand() {
|
|
2717
2643
|
return new Command15("stop").description("Stop the error capture daemon").action(async () => {
|
|
2718
|
-
const spinner =
|
|
2644
|
+
const spinner = ora12("Stopping VibeTasks daemon...").start();
|
|
2719
2645
|
try {
|
|
2720
2646
|
const pid = await daemonConfigManager.getPid();
|
|
2721
2647
|
if (!pid) {
|
|
@@ -2812,7 +2738,7 @@ function createConfigureCommand() {
|
|
|
2812
2738
|
}
|
|
2813
2739
|
function createCaptureCommand() {
|
|
2814
2740
|
return new Command15("capture").description("Manually capture clipboard and check for errors").option("--create-task", "Create a task from the captured error").option("--raw", "Show raw clipboard content").action(async (options) => {
|
|
2815
|
-
const spinner =
|
|
2741
|
+
const spinner = ora12("Capturing clipboard...").start();
|
|
2816
2742
|
try {
|
|
2817
2743
|
const clipboard = await import("clipboardy");
|
|
2818
2744
|
const content = await clipboard.default.read();
|
|
@@ -3024,9 +2950,9 @@ function getCategoryPrefix2(category) {
|
|
|
3024
2950
|
return prefixes[category] || "Fix";
|
|
3025
2951
|
}
|
|
3026
2952
|
async function createTaskFromError2(error) {
|
|
3027
|
-
const spinner =
|
|
2953
|
+
const spinner = ora12("Creating task from error...").start();
|
|
3028
2954
|
try {
|
|
3029
|
-
const authManager = new
|
|
2955
|
+
const authManager = new AuthManager14();
|
|
3030
2956
|
const taskOps = await TaskOperations11.fromAuthManager(authManager);
|
|
3031
2957
|
const title = generateTaskTitle2(error);
|
|
3032
2958
|
const notes = formatErrorForNotes(error);
|
|
@@ -3086,11 +3012,11 @@ function getTagColor2(category) {
|
|
|
3086
3012
|
// src/commands/next.ts
|
|
3087
3013
|
import { Command as Command16 } from "commander";
|
|
3088
3014
|
import chalk17 from "chalk";
|
|
3089
|
-
import { AuthManager as
|
|
3015
|
+
import { AuthManager as AuthManager15, TaskOperations as TaskOperations12 } from "@vibetasks/core";
|
|
3090
3016
|
var PRIORITY_ORDER = { high: 0, medium: 1, low: 2, none: 3 };
|
|
3091
3017
|
var nextCommand = new Command16("next").description("Show and optionally start the highest priority task").option("-s, --start", "Start vibing on the task immediately").option("--project <name>", "Filter by project tag").action(async (options) => {
|
|
3092
3018
|
try {
|
|
3093
|
-
const authManager = new
|
|
3019
|
+
const authManager = new AuthManager15();
|
|
3094
3020
|
const taskOps = await TaskOperations12.fromAuthManager(authManager);
|
|
3095
3021
|
let tasks = await taskOps.getTasks("all");
|
|
3096
3022
|
tasks = tasks.filter((t) => t.status !== "done" && t.status !== "archived" && !t.completed);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibetasks/cli",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"description": "VibeTasks CLI - Lightning-fast task management from your terminal. Works with Claude Code, Cursor, and all AI coding tools.",
|
|
5
5
|
"author": "Vyas",
|
|
6
6
|
"license": "MIT",
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
"typecheck": "tsc --noEmit"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@vibetasks/core": "^0.5.
|
|
49
|
-
"@vibetasks/shared": "^1.2.
|
|
48
|
+
"@vibetasks/core": "^0.5.2",
|
|
49
|
+
"@vibetasks/shared": "^1.2.2",
|
|
50
50
|
"commander": "^11.1.0",
|
|
51
51
|
"chalk": "^5.3.0",
|
|
52
52
|
"ora": "^8.0.1",
|