taskin 2.1.0 → 2.2.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.
- package/dist/index.js +587 -294
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -7180,6 +7180,384 @@ var require_dist = __commonJS({
|
|
|
7180
7180
|
init_esm_shims();
|
|
7181
7181
|
import { Command } from "commander";
|
|
7182
7182
|
|
|
7183
|
+
// src/commands/config.ts
|
|
7184
|
+
init_esm_shims();
|
|
7185
|
+
import chalk2 from "chalk";
|
|
7186
|
+
import inquirer from "inquirer";
|
|
7187
|
+
|
|
7188
|
+
// src/lib/colors.ts
|
|
7189
|
+
init_esm_shims();
|
|
7190
|
+
import chalk from "chalk";
|
|
7191
|
+
var colors = {
|
|
7192
|
+
info: chalk.cyan,
|
|
7193
|
+
success: chalk.green,
|
|
7194
|
+
warning: chalk.yellow,
|
|
7195
|
+
error: chalk.red,
|
|
7196
|
+
highlight: chalk.bold.white,
|
|
7197
|
+
secondary: chalk.gray,
|
|
7198
|
+
normal: chalk.white
|
|
7199
|
+
};
|
|
7200
|
+
var icons = {
|
|
7201
|
+
rocket: "\u{1F680}",
|
|
7202
|
+
list: "\u{1F4CA}",
|
|
7203
|
+
check: "\u2705",
|
|
7204
|
+
pause: "\u23F8\uFE0F",
|
|
7205
|
+
info: "\u{1F4A1}",
|
|
7206
|
+
task: "\u{1F4CB}",
|
|
7207
|
+
gear: "\u2699\uFE0F"
|
|
7208
|
+
};
|
|
7209
|
+
function printHeader(title, icon) {
|
|
7210
|
+
console.log();
|
|
7211
|
+
console.log(colors.highlight("\u2550".repeat(60)));
|
|
7212
|
+
console.log(colors.highlight(`${icon} ${title}`));
|
|
7213
|
+
console.log(colors.highlight("\u2550".repeat(60)));
|
|
7214
|
+
console.log();
|
|
7215
|
+
}
|
|
7216
|
+
function success(message) {
|
|
7217
|
+
console.log(colors.success(`\u2713 ${message}`));
|
|
7218
|
+
}
|
|
7219
|
+
function error(message) {
|
|
7220
|
+
console.error(colors.error(`\u2717 ${message}`));
|
|
7221
|
+
}
|
|
7222
|
+
function info(message) {
|
|
7223
|
+
console.log(colors.info(`\u2139 ${message}`));
|
|
7224
|
+
}
|
|
7225
|
+
|
|
7226
|
+
// src/lib/config-manager.ts
|
|
7227
|
+
init_esm_shims();
|
|
7228
|
+
import { TaskinConfigSchema } from "@opentask/taskin-types";
|
|
7229
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
7230
|
+
import { join } from "path";
|
|
7231
|
+
function getAutomationBehavior(level, commits) {
|
|
7232
|
+
const presets = {
|
|
7233
|
+
manual: {
|
|
7234
|
+
autoCommitStatusChange: false,
|
|
7235
|
+
autoCommitPause: false,
|
|
7236
|
+
autoCommitFinish: false
|
|
7237
|
+
},
|
|
7238
|
+
assisted: {
|
|
7239
|
+
autoCommitStatusChange: true,
|
|
7240
|
+
autoCommitPause: true,
|
|
7241
|
+
autoCommitFinish: false
|
|
7242
|
+
},
|
|
7243
|
+
autopilot: {
|
|
7244
|
+
autoCommitStatusChange: true,
|
|
7245
|
+
autoCommitPause: true,
|
|
7246
|
+
autoCommitFinish: true
|
|
7247
|
+
}
|
|
7248
|
+
};
|
|
7249
|
+
const behavior = presets[level];
|
|
7250
|
+
if (commits) {
|
|
7251
|
+
return {
|
|
7252
|
+
autoCommitStatusChange: commits.taskStatusChanges ?? behavior.autoCommitStatusChange,
|
|
7253
|
+
autoCommitPause: commits.workInProgress ?? behavior.autoCommitPause,
|
|
7254
|
+
autoCommitFinish: commits.completedWork ?? behavior.autoCommitFinish
|
|
7255
|
+
};
|
|
7256
|
+
}
|
|
7257
|
+
return behavior;
|
|
7258
|
+
}
|
|
7259
|
+
var ConfigManager = class {
|
|
7260
|
+
constructor(projectRoot = process.cwd()) {
|
|
7261
|
+
this.projectRoot = projectRoot;
|
|
7262
|
+
this.configPath = join(projectRoot, ".taskin.json");
|
|
7263
|
+
}
|
|
7264
|
+
configPath;
|
|
7265
|
+
/**
|
|
7266
|
+
* Load configuration from .taskin.json
|
|
7267
|
+
* @throws Error if config file not found or invalid
|
|
7268
|
+
*/
|
|
7269
|
+
loadConfig() {
|
|
7270
|
+
if (!existsSync(this.configPath)) {
|
|
7271
|
+
throw new Error(
|
|
7272
|
+
`Taskin configuration not found at ${this.configPath}.
|
|
7273
|
+
Run 'taskin init' to initialize.`
|
|
7274
|
+
);
|
|
7275
|
+
}
|
|
7276
|
+
const content = readFileSync(this.configPath, "utf-8");
|
|
7277
|
+
const json = JSON.parse(content);
|
|
7278
|
+
const result = TaskinConfigSchema.safeParse(json);
|
|
7279
|
+
if (!result.success) {
|
|
7280
|
+
throw new Error(`Invalid Taskin configuration:
|
|
7281
|
+
${result.error.message}`);
|
|
7282
|
+
}
|
|
7283
|
+
return result.data;
|
|
7284
|
+
}
|
|
7285
|
+
/**
|
|
7286
|
+
* Save configuration to .taskin.json
|
|
7287
|
+
*/
|
|
7288
|
+
saveConfig(config) {
|
|
7289
|
+
const validated = TaskinConfigSchema.parse(config);
|
|
7290
|
+
writeFileSync(this.configPath, JSON.stringify(validated, null, 2), "utf-8");
|
|
7291
|
+
}
|
|
7292
|
+
/**
|
|
7293
|
+
* Get automation level from config
|
|
7294
|
+
* Returns 'assisted' as default if not configured
|
|
7295
|
+
*/
|
|
7296
|
+
getAutomationLevel() {
|
|
7297
|
+
const config = this.loadConfig();
|
|
7298
|
+
return config.automation?.level ?? "assisted";
|
|
7299
|
+
}
|
|
7300
|
+
/**
|
|
7301
|
+
* Set automation level in config
|
|
7302
|
+
*/
|
|
7303
|
+
setAutomationLevel(level) {
|
|
7304
|
+
const config = this.loadConfig();
|
|
7305
|
+
config.automation = {
|
|
7306
|
+
...config.automation,
|
|
7307
|
+
level
|
|
7308
|
+
};
|
|
7309
|
+
this.saveConfig(config);
|
|
7310
|
+
}
|
|
7311
|
+
/**
|
|
7312
|
+
* Get automation configuration
|
|
7313
|
+
*/
|
|
7314
|
+
getAutomationConfig() {
|
|
7315
|
+
const config = this.loadConfig();
|
|
7316
|
+
return config.automation ?? { level: "assisted" };
|
|
7317
|
+
}
|
|
7318
|
+
/**
|
|
7319
|
+
* Set automation configuration
|
|
7320
|
+
*/
|
|
7321
|
+
setAutomationConfig(automation) {
|
|
7322
|
+
const config = this.loadConfig();
|
|
7323
|
+
config.automation = automation;
|
|
7324
|
+
this.saveConfig(config);
|
|
7325
|
+
}
|
|
7326
|
+
/**
|
|
7327
|
+
* Get resolved automation behavior
|
|
7328
|
+
*/
|
|
7329
|
+
getAutomationBehavior() {
|
|
7330
|
+
const automation = this.getAutomationConfig();
|
|
7331
|
+
return getAutomationBehavior(automation.level, automation.commits);
|
|
7332
|
+
}
|
|
7333
|
+
/**
|
|
7334
|
+
* Check if config file exists
|
|
7335
|
+
*/
|
|
7336
|
+
exists() {
|
|
7337
|
+
return existsSync(this.configPath);
|
|
7338
|
+
}
|
|
7339
|
+
};
|
|
7340
|
+
|
|
7341
|
+
// src/lib/project-check.ts
|
|
7342
|
+
init_esm_shims();
|
|
7343
|
+
import { existsSync as existsSync2 } from "fs";
|
|
7344
|
+
import path2 from "path";
|
|
7345
|
+
function isTaskinProject(cwd = process.cwd()) {
|
|
7346
|
+
return existsSync2(path2.join(cwd, ".taskin.json"));
|
|
7347
|
+
}
|
|
7348
|
+
function requireTaskinProject(cwd = process.cwd()) {
|
|
7349
|
+
if (!isTaskinProject(cwd)) {
|
|
7350
|
+
error(
|
|
7351
|
+
'This directory is not initialized as a taskin project. Run "taskin init" first.'
|
|
7352
|
+
);
|
|
7353
|
+
process.exit(1);
|
|
7354
|
+
}
|
|
7355
|
+
}
|
|
7356
|
+
|
|
7357
|
+
// src/commands/define-command/index.ts
|
|
7358
|
+
init_esm_shims();
|
|
7359
|
+
|
|
7360
|
+
// src/commands/define-command/define-command.ts
|
|
7361
|
+
init_esm_shims();
|
|
7362
|
+
var defineCommand = (config) => {
|
|
7363
|
+
return (program2) => {
|
|
7364
|
+
const cmd = program2.command(config.name).description(config.description);
|
|
7365
|
+
if (config.alias) {
|
|
7366
|
+
cmd.alias(config.alias);
|
|
7367
|
+
}
|
|
7368
|
+
config.options?.forEach((opt) => {
|
|
7369
|
+
cmd.option(opt.flags, opt.description, opt.defaultValue);
|
|
7370
|
+
});
|
|
7371
|
+
cmd.action(async (...args) => {
|
|
7372
|
+
try {
|
|
7373
|
+
await config.handler(...args);
|
|
7374
|
+
} catch (err) {
|
|
7375
|
+
error(
|
|
7376
|
+
`Failed to execute command: ${err instanceof Error ? err.message : String(err)}`
|
|
7377
|
+
);
|
|
7378
|
+
process.exit(1);
|
|
7379
|
+
}
|
|
7380
|
+
});
|
|
7381
|
+
};
|
|
7382
|
+
};
|
|
7383
|
+
|
|
7384
|
+
// src/commands/define-command/define-command.types.ts
|
|
7385
|
+
init_esm_shims();
|
|
7386
|
+
|
|
7387
|
+
// src/commands/config.ts
|
|
7388
|
+
var configCommand = defineCommand({
|
|
7389
|
+
name: "config",
|
|
7390
|
+
description: "\u2699\uFE0F Configure Taskin settings",
|
|
7391
|
+
options: [
|
|
7392
|
+
{
|
|
7393
|
+
flags: "-l, --level <level>",
|
|
7394
|
+
description: "Set automation level (manual|assisted|autopilot)"
|
|
7395
|
+
},
|
|
7396
|
+
{
|
|
7397
|
+
flags: "-s, --show",
|
|
7398
|
+
description: "Show current configuration"
|
|
7399
|
+
}
|
|
7400
|
+
],
|
|
7401
|
+
handler: async (options) => {
|
|
7402
|
+
await handleConfigCommand(options);
|
|
7403
|
+
}
|
|
7404
|
+
});
|
|
7405
|
+
async function handleConfigCommand(options) {
|
|
7406
|
+
requireTaskinProject();
|
|
7407
|
+
const configManager = new ConfigManager(process.cwd());
|
|
7408
|
+
if (options.show) {
|
|
7409
|
+
await showConfiguration(configManager);
|
|
7410
|
+
return;
|
|
7411
|
+
}
|
|
7412
|
+
if (options.level) {
|
|
7413
|
+
await setAutomationLevel(configManager, options.level);
|
|
7414
|
+
return;
|
|
7415
|
+
}
|
|
7416
|
+
await interactiveConfig(configManager);
|
|
7417
|
+
}
|
|
7418
|
+
async function showConfiguration(configManager) {
|
|
7419
|
+
printHeader("Current Configuration", "\u2699\uFE0F");
|
|
7420
|
+
try {
|
|
7421
|
+
const config = configManager.loadConfig();
|
|
7422
|
+
const automationLevel = configManager.getAutomationLevel();
|
|
7423
|
+
const behavior = configManager.getAutomationBehavior();
|
|
7424
|
+
console.log(chalk2.bold("\n\u{1F4CB} General"));
|
|
7425
|
+
console.log(` Version: ${chalk2.cyan(config.version)}`);
|
|
7426
|
+
console.log(` Provider: ${chalk2.cyan(config.provider.type)}
|
|
7427
|
+
`);
|
|
7428
|
+
console.log(chalk2.bold("\u{1F916} Automation"));
|
|
7429
|
+
console.log(` Level: ${chalk2.cyan(automationLevel)}`);
|
|
7430
|
+
console.log(
|
|
7431
|
+
` Auto-commit status changes: ${behavior.autoCommitStatusChange ? chalk2.green("\u2713 Yes") : chalk2.red("\u2717 No")}`
|
|
7432
|
+
);
|
|
7433
|
+
console.log(
|
|
7434
|
+
` Auto-commit on pause: ${behavior.autoCommitPause ? chalk2.green("\u2713 Yes") : chalk2.red("\u2717 No")}`
|
|
7435
|
+
);
|
|
7436
|
+
console.log(
|
|
7437
|
+
` Auto-commit on finish: ${behavior.autoCommitFinish ? chalk2.green("\u2713 Yes") : chalk2.red("\u2717 No")}
|
|
7438
|
+
`
|
|
7439
|
+
);
|
|
7440
|
+
console.log(chalk2.bold("\u{1F4D6} Available Levels:"));
|
|
7441
|
+
console.log(
|
|
7442
|
+
` ${chalk2.yellow("manual")} - You're in control: all commits are suggestions only`
|
|
7443
|
+
);
|
|
7444
|
+
console.log(
|
|
7445
|
+
` ${chalk2.yellow("assisted")} - Smart suggestions: auto-commits status changes, suggests work commits`
|
|
7446
|
+
);
|
|
7447
|
+
console.log(
|
|
7448
|
+
` ${chalk2.yellow("autopilot")} - Let Taskin drive: auto-commits everything
|
|
7449
|
+
`
|
|
7450
|
+
);
|
|
7451
|
+
} catch (err) {
|
|
7452
|
+
error("Failed to load configuration");
|
|
7453
|
+
if (err instanceof Error) {
|
|
7454
|
+
console.error(chalk2.dim(err.message));
|
|
7455
|
+
}
|
|
7456
|
+
process.exit(1);
|
|
7457
|
+
}
|
|
7458
|
+
}
|
|
7459
|
+
async function setAutomationLevel(configManager, level) {
|
|
7460
|
+
printHeader("Configure Automation Level", "\u2699\uFE0F");
|
|
7461
|
+
const validLevels = ["manual", "assisted", "autopilot"];
|
|
7462
|
+
if (!validLevels.includes(level)) {
|
|
7463
|
+
error(
|
|
7464
|
+
`Invalid automation level: ${level}. Valid options: ${validLevels.join(", ")}`
|
|
7465
|
+
);
|
|
7466
|
+
process.exit(1);
|
|
7467
|
+
}
|
|
7468
|
+
try {
|
|
7469
|
+
const currentLevel = configManager.getAutomationLevel();
|
|
7470
|
+
if (currentLevel === level) {
|
|
7471
|
+
info(`Automation level is already set to ${colors.highlight(level)}`);
|
|
7472
|
+
return;
|
|
7473
|
+
}
|
|
7474
|
+
configManager.setAutomationLevel(level);
|
|
7475
|
+
success(`\u2713 Automation level set to ${colors.highlight(level)}`);
|
|
7476
|
+
const behavior = configManager.getAutomationBehavior();
|
|
7477
|
+
console.log(chalk2.dim("\nCurrent behavior:"));
|
|
7478
|
+
console.log(
|
|
7479
|
+
chalk2.dim(
|
|
7480
|
+
` Auto-commit status changes: ${behavior.autoCommitStatusChange ? "\u2713" : "\u2717"}`
|
|
7481
|
+
)
|
|
7482
|
+
);
|
|
7483
|
+
console.log(
|
|
7484
|
+
chalk2.dim(
|
|
7485
|
+
` Auto-commit on pause: ${behavior.autoCommitPause ? "\u2713" : "\u2717"}`
|
|
7486
|
+
)
|
|
7487
|
+
);
|
|
7488
|
+
console.log(
|
|
7489
|
+
chalk2.dim(
|
|
7490
|
+
` Auto-commit on finish: ${behavior.autoCommitFinish ? "\u2713" : "\u2717"}`
|
|
7491
|
+
)
|
|
7492
|
+
);
|
|
7493
|
+
} catch (err) {
|
|
7494
|
+
error("Failed to update configuration");
|
|
7495
|
+
if (err instanceof Error) {
|
|
7496
|
+
console.error(chalk2.dim(err.message));
|
|
7497
|
+
}
|
|
7498
|
+
process.exit(1);
|
|
7499
|
+
}
|
|
7500
|
+
}
|
|
7501
|
+
async function interactiveConfig(configManager) {
|
|
7502
|
+
printHeader("Configure Taskin", "\u2699\uFE0F");
|
|
7503
|
+
try {
|
|
7504
|
+
const currentLevel = configManager.getAutomationLevel();
|
|
7505
|
+
console.log(`Current automation level: ${chalk2.cyan(currentLevel)}
|
|
7506
|
+
`);
|
|
7507
|
+
const { level } = await inquirer.prompt([
|
|
7508
|
+
{
|
|
7509
|
+
type: "list",
|
|
7510
|
+
name: "level",
|
|
7511
|
+
message: "Select automation level:",
|
|
7512
|
+
default: currentLevel,
|
|
7513
|
+
choices: [
|
|
7514
|
+
{
|
|
7515
|
+
name: "\u{1F527} manual - You control all commits (suggestions only)",
|
|
7516
|
+
value: "manual"
|
|
7517
|
+
},
|
|
7518
|
+
{
|
|
7519
|
+
name: "\u{1F91D} assisted - Auto-commit status changes, suggest work commits (recommended)",
|
|
7520
|
+
value: "assisted"
|
|
7521
|
+
},
|
|
7522
|
+
{
|
|
7523
|
+
name: "\u{1F680} autopilot - Auto-commit everything",
|
|
7524
|
+
value: "autopilot"
|
|
7525
|
+
}
|
|
7526
|
+
]
|
|
7527
|
+
}
|
|
7528
|
+
]);
|
|
7529
|
+
if (level === currentLevel) {
|
|
7530
|
+
info(`Keeping current automation level: ${colors.highlight(level)}`);
|
|
7531
|
+
return;
|
|
7532
|
+
}
|
|
7533
|
+
configManager.setAutomationLevel(level);
|
|
7534
|
+
success(`\u2713 Automation level set to ${colors.highlight(level)}`);
|
|
7535
|
+
const behavior = configManager.getAutomationBehavior();
|
|
7536
|
+
console.log(chalk2.dim("\nNew behavior:"));
|
|
7537
|
+
console.log(
|
|
7538
|
+
chalk2.dim(
|
|
7539
|
+
` Auto-commit status changes: ${behavior.autoCommitStatusChange ? "\u2713" : "\u2717"}`
|
|
7540
|
+
)
|
|
7541
|
+
);
|
|
7542
|
+
console.log(
|
|
7543
|
+
chalk2.dim(
|
|
7544
|
+
` Auto-commit on pause: ${behavior.autoCommitPause ? "\u2713" : "\u2717"}`
|
|
7545
|
+
)
|
|
7546
|
+
);
|
|
7547
|
+
console.log(
|
|
7548
|
+
chalk2.dim(
|
|
7549
|
+
` Auto-commit on finish: ${behavior.autoCommitFinish ? "\u2713" : "\u2717"}`
|
|
7550
|
+
)
|
|
7551
|
+
);
|
|
7552
|
+
} catch (err) {
|
|
7553
|
+
error("Configuration cancelled or failed");
|
|
7554
|
+
if (err instanceof Error) {
|
|
7555
|
+
console.error(chalk2.dim(err.message));
|
|
7556
|
+
}
|
|
7557
|
+
process.exit(1);
|
|
7558
|
+
}
|
|
7559
|
+
}
|
|
7560
|
+
|
|
7183
7561
|
// src/commands/dashboard.ts
|
|
7184
7562
|
init_esm_shims();
|
|
7185
7563
|
|
|
@@ -7190,7 +7568,7 @@ init_esm_shims();
|
|
|
7190
7568
|
init_esm_shims();
|
|
7191
7569
|
import { UserStatsSchema } from "@opentask/taskin-types";
|
|
7192
7570
|
import { promises as fs } from "fs";
|
|
7193
|
-
import
|
|
7571
|
+
import path3 from "path";
|
|
7194
7572
|
var MILLISECONDS_PER_SECOND = 1e3;
|
|
7195
7573
|
var SECONDS_PER_MINUTE = 60;
|
|
7196
7574
|
var MINUTES_PER_HOUR = 60;
|
|
@@ -7410,7 +7788,7 @@ var FileSystemMetricsAdapter = class {
|
|
|
7410
7788
|
const taskFiles = files.filter((f) => f.startsWith("task-") && f.endsWith(".md"));
|
|
7411
7789
|
const tasks = [];
|
|
7412
7790
|
for (const file of taskFiles) {
|
|
7413
|
-
const filePath =
|
|
7791
|
+
const filePath = path3.join(this.tasksDirectory, file);
|
|
7414
7792
|
let content;
|
|
7415
7793
|
try {
|
|
7416
7794
|
content = await fs.readFile(filePath, "utf-8");
|
|
@@ -7741,23 +8119,23 @@ function slugify(text) {
|
|
|
7741
8119
|
|
|
7742
8120
|
// ../utils/dist/ui.js
|
|
7743
8121
|
init_esm_shims();
|
|
7744
|
-
import
|
|
7745
|
-
var
|
|
7746
|
-
primary:
|
|
7747
|
-
secondary:
|
|
7748
|
-
success:
|
|
7749
|
-
warning:
|
|
7750
|
-
error:
|
|
7751
|
-
info:
|
|
7752
|
-
highlight:
|
|
7753
|
-
normal:
|
|
8122
|
+
import chalk3 from "chalk";
|
|
8123
|
+
var colors2 = {
|
|
8124
|
+
primary: chalk3.blue,
|
|
8125
|
+
secondary: chalk3.gray,
|
|
8126
|
+
success: chalk3.green,
|
|
8127
|
+
warning: chalk3.yellow,
|
|
8128
|
+
error: chalk3.red,
|
|
8129
|
+
info: chalk3.cyan,
|
|
8130
|
+
highlight: chalk3.magenta,
|
|
8131
|
+
normal: chalk3.white
|
|
7754
8132
|
};
|
|
7755
8133
|
|
|
7756
8134
|
// ../file-system-task-provider/dist/fs-task-provider.js
|
|
7757
8135
|
init_i18n();
|
|
7758
8136
|
init_task_validator();
|
|
7759
8137
|
import { promises as fs2 } from "fs";
|
|
7760
|
-
import
|
|
8138
|
+
import path4 from "path";
|
|
7761
8139
|
var FileSystemTaskProvider = class {
|
|
7762
8140
|
tasksDirectory;
|
|
7763
8141
|
userRegistry;
|
|
@@ -7775,7 +8153,7 @@ var FileSystemTaskProvider = class {
|
|
|
7775
8153
|
if (!taskFile) {
|
|
7776
8154
|
return void 0;
|
|
7777
8155
|
}
|
|
7778
|
-
const filePath =
|
|
8156
|
+
const filePath = path4.join(this.tasksDirectory, taskFile);
|
|
7779
8157
|
const content = await fs2.readFile(filePath, "utf-8");
|
|
7780
8158
|
const titleMatch = content.match(/^# .*Task.*?[—-]\s*(.+)$/im);
|
|
7781
8159
|
const title = titleMatch ? titleMatch[1].trim() : "Untitled";
|
|
@@ -7849,7 +8227,7 @@ var FileSystemTaskProvider = class {
|
|
|
7849
8227
|
);
|
|
7850
8228
|
const tasks = [];
|
|
7851
8229
|
for (const file of taskFiles) {
|
|
7852
|
-
const filePath =
|
|
8230
|
+
const filePath = path4.join(this.tasksDirectory, file);
|
|
7853
8231
|
const content = await fs2.readFile(filePath, "utf-8");
|
|
7854
8232
|
const idMatch = file.match(/^task-(\d+)-/);
|
|
7855
8233
|
const taskId = idMatch ? idMatch[1] : "unknown";
|
|
@@ -7908,7 +8286,7 @@ var FileSystemTaskProvider = class {
|
|
|
7908
8286
|
const taskId = String(nextNumber).padStart(3, "0");
|
|
7909
8287
|
const titleSlug = slugify(options.title);
|
|
7910
8288
|
const fileName = `task-${taskId}-${titleSlug}.md`;
|
|
7911
|
-
const filePath =
|
|
8289
|
+
const filePath = path4.join(this.tasksDirectory, fileName);
|
|
7912
8290
|
const fileExists = await fs2.access(filePath).then(() => true).catch(() => false);
|
|
7913
8291
|
if (fileExists) {
|
|
7914
8292
|
throw new Error(`Task file already exists: ${fileName}`);
|
|
@@ -7961,7 +8339,7 @@ ${i18n.notesPlaceholder}
|
|
|
7961
8339
|
}
|
|
7962
8340
|
async lint(fix) {
|
|
7963
8341
|
const files = await fs2.readdir(this.tasksDirectory);
|
|
7964
|
-
const taskFiles = files.filter((file) => file.startsWith("task-") && file.endsWith(".md")).map((file) =>
|
|
8342
|
+
const taskFiles = files.filter((file) => file.startsWith("task-") && file.endsWith(".md")).map((file) => path4.join(this.tasksDirectory, file));
|
|
7965
8343
|
if (fix) {
|
|
7966
8344
|
let fixedCount = 0;
|
|
7967
8345
|
for (const filePath of taskFiles) {
|
|
@@ -7989,14 +8367,14 @@ init_i18n();
|
|
|
7989
8367
|
// ../file-system-task-provider/dist/user-registry.js
|
|
7990
8368
|
init_esm_shims();
|
|
7991
8369
|
import { promises as fs3 } from "fs";
|
|
7992
|
-
import
|
|
8370
|
+
import path5 from "path";
|
|
7993
8371
|
var UserRegistry = class {
|
|
7994
8372
|
config;
|
|
7995
8373
|
users = /* @__PURE__ */ new Map();
|
|
7996
8374
|
usersFilePath;
|
|
7997
8375
|
constructor(config) {
|
|
7998
8376
|
this.config = config;
|
|
7999
|
-
this.usersFilePath =
|
|
8377
|
+
this.usersFilePath = path5.join(config.taskinDir, "users.json");
|
|
8000
8378
|
}
|
|
8001
8379
|
/**
|
|
8002
8380
|
* Load users from users.json
|
|
@@ -8480,97 +8858,11 @@ init_esm_shims();
|
|
|
8480
8858
|
init_esm_shims();
|
|
8481
8859
|
|
|
8482
8860
|
// src/commands/dashboard.ts
|
|
8483
|
-
import
|
|
8861
|
+
import chalk4 from "chalk";
|
|
8484
8862
|
import express from "express";
|
|
8485
8863
|
import { createServer } from "http";
|
|
8486
8864
|
import path6 from "path";
|
|
8487
8865
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
8488
|
-
|
|
8489
|
-
// src/lib/colors.ts
|
|
8490
|
-
init_esm_shims();
|
|
8491
|
-
import chalk2 from "chalk";
|
|
8492
|
-
var colors2 = {
|
|
8493
|
-
info: chalk2.cyan,
|
|
8494
|
-
success: chalk2.green,
|
|
8495
|
-
warning: chalk2.yellow,
|
|
8496
|
-
error: chalk2.red,
|
|
8497
|
-
highlight: chalk2.bold.white,
|
|
8498
|
-
secondary: chalk2.gray,
|
|
8499
|
-
normal: chalk2.white
|
|
8500
|
-
};
|
|
8501
|
-
var icons = {
|
|
8502
|
-
rocket: "\u{1F680}",
|
|
8503
|
-
list: "\u{1F4CA}",
|
|
8504
|
-
check: "\u2705",
|
|
8505
|
-
pause: "\u23F8\uFE0F",
|
|
8506
|
-
info: "\u{1F4A1}",
|
|
8507
|
-
task: "\u{1F4CB}",
|
|
8508
|
-
gear: "\u2699\uFE0F"
|
|
8509
|
-
};
|
|
8510
|
-
function printHeader(title, icon) {
|
|
8511
|
-
console.log();
|
|
8512
|
-
console.log(colors2.highlight("\u2550".repeat(60)));
|
|
8513
|
-
console.log(colors2.highlight(`${icon} ${title}`));
|
|
8514
|
-
console.log(colors2.highlight("\u2550".repeat(60)));
|
|
8515
|
-
console.log();
|
|
8516
|
-
}
|
|
8517
|
-
function success(message) {
|
|
8518
|
-
console.log(colors2.success(`\u2713 ${message}`));
|
|
8519
|
-
}
|
|
8520
|
-
function error(message) {
|
|
8521
|
-
console.error(colors2.error(`\u2717 ${message}`));
|
|
8522
|
-
}
|
|
8523
|
-
function info(message) {
|
|
8524
|
-
console.log(colors2.info(`\u2139 ${message}`));
|
|
8525
|
-
}
|
|
8526
|
-
|
|
8527
|
-
// src/lib/project-check.ts
|
|
8528
|
-
init_esm_shims();
|
|
8529
|
-
import { existsSync } from "fs";
|
|
8530
|
-
import path5 from "path";
|
|
8531
|
-
function isTaskinProject(cwd = process.cwd()) {
|
|
8532
|
-
return existsSync(path5.join(cwd, ".taskin.json"));
|
|
8533
|
-
}
|
|
8534
|
-
function requireTaskinProject(cwd = process.cwd()) {
|
|
8535
|
-
if (!isTaskinProject(cwd)) {
|
|
8536
|
-
error(
|
|
8537
|
-
'This directory is not initialized as a taskin project. Run "taskin init" first.'
|
|
8538
|
-
);
|
|
8539
|
-
process.exit(1);
|
|
8540
|
-
}
|
|
8541
|
-
}
|
|
8542
|
-
|
|
8543
|
-
// src/commands/define-command/index.ts
|
|
8544
|
-
init_esm_shims();
|
|
8545
|
-
|
|
8546
|
-
// src/commands/define-command/define-command.ts
|
|
8547
|
-
init_esm_shims();
|
|
8548
|
-
var defineCommand = (config) => {
|
|
8549
|
-
return (program2) => {
|
|
8550
|
-
const cmd = program2.command(config.name).description(config.description);
|
|
8551
|
-
if (config.alias) {
|
|
8552
|
-
cmd.alias(config.alias);
|
|
8553
|
-
}
|
|
8554
|
-
config.options?.forEach((opt) => {
|
|
8555
|
-
cmd.option(opt.flags, opt.description, opt.defaultValue);
|
|
8556
|
-
});
|
|
8557
|
-
cmd.action(async (...args) => {
|
|
8558
|
-
try {
|
|
8559
|
-
await config.handler(...args);
|
|
8560
|
-
} catch (err) {
|
|
8561
|
-
error(
|
|
8562
|
-
`Failed to execute command: ${err instanceof Error ? err.message : String(err)}`
|
|
8563
|
-
);
|
|
8564
|
-
process.exit(1);
|
|
8565
|
-
}
|
|
8566
|
-
});
|
|
8567
|
-
};
|
|
8568
|
-
};
|
|
8569
|
-
|
|
8570
|
-
// src/commands/define-command/define-command.types.ts
|
|
8571
|
-
init_esm_shims();
|
|
8572
|
-
|
|
8573
|
-
// src/commands/dashboard.ts
|
|
8574
8866
|
var __filename2 = fileURLToPath2(import.meta.url);
|
|
8575
8867
|
var __dirname2 = path6.dirname(__filename2);
|
|
8576
8868
|
var dashboardCommand = defineCommand({
|
|
@@ -8754,17 +9046,17 @@ async function startDashboard(options) {
|
|
|
8754
9046
|
});
|
|
8755
9047
|
}
|
|
8756
9048
|
info("");
|
|
8757
|
-
info(
|
|
9049
|
+
info(chalk4.bold("Dashboard Controls:"));
|
|
8758
9050
|
info(
|
|
8759
|
-
` \u2022 Dashboard: ${
|
|
9051
|
+
` \u2022 Dashboard: ${chalk4.cyan(`http://${host}:${port}${filterQuery}`)}`
|
|
8760
9052
|
);
|
|
8761
|
-
info(` \u2022 WebSocket: ${
|
|
9053
|
+
info(` \u2022 WebSocket: ${chalk4.cyan(`ws://${host}:${wsPort}`)}`);
|
|
8762
9054
|
if (options.filterOpen) {
|
|
8763
|
-
info(` \u2022 Filter: ${
|
|
9055
|
+
info(` \u2022 Filter: ${chalk4.yellow("Open tasks only")}`);
|
|
8764
9056
|
} else if (options.filterClosed) {
|
|
8765
|
-
info(` \u2022 Filter: ${
|
|
9057
|
+
info(` \u2022 Filter: ${chalk4.yellow("Closed tasks only")}`);
|
|
8766
9058
|
}
|
|
8767
|
-
info(` \u2022 Press ${
|
|
9059
|
+
info(` \u2022 Press ${chalk4.bold("Ctrl+C")} to stop both servers`);
|
|
8768
9060
|
info("");
|
|
8769
9061
|
const cleanup = async () => {
|
|
8770
9062
|
info("\nShutting down servers...");
|
|
@@ -9198,7 +9490,7 @@ import path9 from "path";
|
|
|
9198
9490
|
|
|
9199
9491
|
// src/lib/sound-player.ts
|
|
9200
9492
|
init_esm_shims();
|
|
9201
|
-
import { existsSync as
|
|
9493
|
+
import { existsSync as existsSync3 } from "fs";
|
|
9202
9494
|
import path8 from "path";
|
|
9203
9495
|
import player from "play-sound";
|
|
9204
9496
|
var soundPlayer = player({});
|
|
@@ -9215,7 +9507,7 @@ function playSound(soundName) {
|
|
|
9215
9507
|
// Custom sound in project root
|
|
9216
9508
|
path8.join(process.cwd(), ".taskin", `${soundName}.mp3`)
|
|
9217
9509
|
];
|
|
9218
|
-
const soundPath = possiblePaths.find((p) =>
|
|
9510
|
+
const soundPath = possiblePaths.find((p) => existsSync3(p));
|
|
9219
9511
|
if (!soundPath) {
|
|
9220
9512
|
return;
|
|
9221
9513
|
}
|
|
@@ -9282,28 +9574,28 @@ async function finishTask(taskId, options) {
|
|
|
9282
9574
|
if (!options.skipUpdate) {
|
|
9283
9575
|
const commitType = task.type || "feat";
|
|
9284
9576
|
console.log(
|
|
9285
|
-
|
|
9577
|
+
colors.secondary(
|
|
9286
9578
|
` 1. Commit the status change: git add TASKS/task-${normalizedId}-*.md && git commit -m "docs(TASKS): task-${normalizedId} - atualiza status para done [skip-ci]"`
|
|
9287
9579
|
)
|
|
9288
9580
|
);
|
|
9289
|
-
console.log(
|
|
9581
|
+
console.log(colors.secondary(" 2. Review your changes"));
|
|
9290
9582
|
console.log(
|
|
9291
|
-
|
|
9583
|
+
colors.secondary(
|
|
9292
9584
|
` 3. Commit your work: git add . && git commit -m "${commitType}(task-${normalizedId}): ${task.title}"`
|
|
9293
9585
|
)
|
|
9294
9586
|
);
|
|
9295
|
-
console.log(
|
|
9296
|
-
console.log(
|
|
9587
|
+
console.log(colors.secondary(" 4. Push: git push"));
|
|
9588
|
+
console.log(colors.secondary(" 5. Create a Pull Request"));
|
|
9297
9589
|
} else {
|
|
9298
9590
|
const commitType = task.type || "feat";
|
|
9299
|
-
console.log(
|
|
9591
|
+
console.log(colors.secondary(" 1. Review your changes"));
|
|
9300
9592
|
console.log(
|
|
9301
|
-
|
|
9593
|
+
colors.secondary(
|
|
9302
9594
|
` 2. Commit your work: git add . && git commit -m "${commitType}(task-${normalizedId}): ${task.title}"`
|
|
9303
9595
|
)
|
|
9304
9596
|
);
|
|
9305
|
-
console.log(
|
|
9306
|
-
console.log(
|
|
9597
|
+
console.log(colors.secondary(" 3. Push: git push"));
|
|
9598
|
+
console.log(colors.secondary(" 4. Create a Pull Request"));
|
|
9307
9599
|
}
|
|
9308
9600
|
console.log();
|
|
9309
9601
|
success("Great work! \u{1F680}");
|
|
@@ -9316,14 +9608,14 @@ async function finishTask(taskId, options) {
|
|
|
9316
9608
|
// src/commands/init.ts
|
|
9317
9609
|
init_esm_shims();
|
|
9318
9610
|
import {
|
|
9319
|
-
existsSync as
|
|
9611
|
+
existsSync as existsSync5,
|
|
9320
9612
|
mkdirSync,
|
|
9321
|
-
readFileSync,
|
|
9613
|
+
readFileSync as readFileSync2,
|
|
9322
9614
|
readdirSync,
|
|
9323
|
-
writeFileSync
|
|
9615
|
+
writeFileSync as writeFileSync2
|
|
9324
9616
|
} from "fs";
|
|
9325
|
-
import
|
|
9326
|
-
import { join } from "path";
|
|
9617
|
+
import inquirer2 from "inquirer";
|
|
9618
|
+
import { join as join2 } from "path";
|
|
9327
9619
|
|
|
9328
9620
|
// src/lib/provider-installer/index.ts
|
|
9329
9621
|
init_esm_shims();
|
|
@@ -9331,12 +9623,12 @@ init_esm_shims();
|
|
|
9331
9623
|
// src/lib/provider-installer/provider-installer.ts
|
|
9332
9624
|
init_esm_shims();
|
|
9333
9625
|
import { execSync } from "child_process";
|
|
9334
|
-
import { existsSync as
|
|
9626
|
+
import { existsSync as existsSync4 } from "fs";
|
|
9335
9627
|
function detectPackageManager() {
|
|
9336
|
-
if (
|
|
9628
|
+
if (existsSync4("pnpm-lock.yaml")) {
|
|
9337
9629
|
return "pnpm";
|
|
9338
9630
|
}
|
|
9339
|
-
if (
|
|
9631
|
+
if (existsSync4("yarn.lock")) {
|
|
9340
9632
|
return "yarn";
|
|
9341
9633
|
}
|
|
9342
9634
|
return "npm";
|
|
@@ -9544,8 +9836,8 @@ var initCommand = defineCommand({
|
|
|
9544
9836
|
async function initializeTaskin(options) {
|
|
9545
9837
|
printHeader("Initializing Taskin", "\u{1F3AF}");
|
|
9546
9838
|
const cwd = process.cwd();
|
|
9547
|
-
const configFile =
|
|
9548
|
-
if (
|
|
9839
|
+
const configFile = join2(cwd, ".taskin.json");
|
|
9840
|
+
if (existsSync5(configFile) && !options.force) {
|
|
9549
9841
|
error("Taskin is already initialized in this project");
|
|
9550
9842
|
info("Use --force to reinitialize");
|
|
9551
9843
|
process.exit(1);
|
|
@@ -9564,12 +9856,12 @@ async function initializeTaskin(options) {
|
|
|
9564
9856
|
let providerId;
|
|
9565
9857
|
if (options.provider) {
|
|
9566
9858
|
providerId = options.provider;
|
|
9567
|
-
info(`Using provider from command line: ${
|
|
9859
|
+
info(`Using provider from command line: ${colors.highlight(providerId)}`);
|
|
9568
9860
|
} else if (process.env.CI === "true") {
|
|
9569
9861
|
providerId = "fs";
|
|
9570
9862
|
info("CI environment detected, using default provider: fs");
|
|
9571
9863
|
} else {
|
|
9572
|
-
const response = await
|
|
9864
|
+
const response = await inquirer2.prompt([
|
|
9573
9865
|
{
|
|
9574
9866
|
type: "list",
|
|
9575
9867
|
name: "providerId",
|
|
@@ -9586,7 +9878,7 @@ async function initializeTaskin(options) {
|
|
|
9586
9878
|
process.exit(1);
|
|
9587
9879
|
}
|
|
9588
9880
|
console.log();
|
|
9589
|
-
info(`Setting up task provider: ${
|
|
9881
|
+
info(`Setting up task provider: ${colors.highlight(selectedProvider.name)}`);
|
|
9590
9882
|
console.log();
|
|
9591
9883
|
const bundledProviders = ["fs"];
|
|
9592
9884
|
if (!bundledProviders.includes(selectedProvider.id)) {
|
|
@@ -9601,14 +9893,14 @@ async function initializeTaskin(options) {
|
|
|
9601
9893
|
}
|
|
9602
9894
|
};
|
|
9603
9895
|
info("Creating configuration file...");
|
|
9604
|
-
|
|
9605
|
-
success(`\u2713 Created ${
|
|
9606
|
-
const gitignorePath =
|
|
9607
|
-
if (
|
|
9608
|
-
const gitignoreContent =
|
|
9896
|
+
writeFileSync2(configFile, JSON.stringify(config, null, 2), "utf-8");
|
|
9897
|
+
success(`\u2713 Created ${colors.highlight(".taskin.json")}`);
|
|
9898
|
+
const gitignorePath = join2(cwd, ".gitignore");
|
|
9899
|
+
if (existsSync5(gitignorePath)) {
|
|
9900
|
+
const gitignoreContent = readFileSync2(gitignorePath, "utf-8");
|
|
9609
9901
|
if (!gitignoreContent.includes(".taskin.json")) {
|
|
9610
9902
|
info("Adding .taskin.json to .gitignore...");
|
|
9611
|
-
|
|
9903
|
+
writeFileSync2(
|
|
9612
9904
|
gitignorePath,
|
|
9613
9905
|
`${gitignoreContent}
|
|
9614
9906
|
# Taskin configuration
|
|
@@ -9623,13 +9915,13 @@ async function initializeTaskin(options) {
|
|
|
9623
9915
|
success("\u{1F389} Taskin initialized successfully!");
|
|
9624
9916
|
console.log();
|
|
9625
9917
|
info("Next steps:");
|
|
9626
|
-
console.log(
|
|
9918
|
+
console.log(colors.secondary(" 1. Run: taskin list"));
|
|
9627
9919
|
console.log(
|
|
9628
|
-
|
|
9920
|
+
colors.secondary(
|
|
9629
9921
|
selectedProvider.id === "fs" ? " 2. Create a new task: taskin new (interactive mode)" : ` 2. Tasks will be synced with ${selectedProvider.name}`
|
|
9630
9922
|
)
|
|
9631
9923
|
);
|
|
9632
|
-
console.log(
|
|
9924
|
+
console.log(colors.secondary(" 3. Start working: taskin start <task-id>"));
|
|
9633
9925
|
console.log();
|
|
9634
9926
|
info("For more information, run: taskin --help");
|
|
9635
9927
|
console.log();
|
|
@@ -9653,29 +9945,29 @@ async function setupProviderConfig(provider, cwd) {
|
|
|
9653
9945
|
}
|
|
9654
9946
|
})
|
|
9655
9947
|
);
|
|
9656
|
-
const answers = await
|
|
9948
|
+
const answers = await inquirer2.prompt(questions);
|
|
9657
9949
|
console.log();
|
|
9658
9950
|
success(`\u2713 ${provider.name} configuration saved`);
|
|
9659
9951
|
return answers;
|
|
9660
9952
|
}
|
|
9661
9953
|
async function setupFileSystemProvider(cwd) {
|
|
9662
|
-
const tasksDir =
|
|
9663
|
-
if (!
|
|
9954
|
+
const tasksDir = join2(cwd, "TASKS");
|
|
9955
|
+
if (!existsSync5(tasksDir)) {
|
|
9664
9956
|
info(`Creating TASKS directory...`);
|
|
9665
9957
|
mkdirSync(tasksDir, { recursive: true });
|
|
9666
|
-
success(`\u2713 Created ${
|
|
9958
|
+
success(`\u2713 Created ${colors.highlight("TASKS/")} directory`);
|
|
9667
9959
|
} else {
|
|
9668
|
-
info(`${
|
|
9960
|
+
info(`${colors.highlight("TASKS/")} directory already exists`);
|
|
9669
9961
|
success("\u2713 Directory is ready to use");
|
|
9670
9962
|
}
|
|
9671
9963
|
const existingTask001 = readdirSync(tasksDir).find(
|
|
9672
9964
|
(file) => file.startsWith("task-001-") && file.endsWith(".md")
|
|
9673
9965
|
);
|
|
9674
9966
|
if (existingTask001) {
|
|
9675
|
-
info(`Sample task already exists: ${
|
|
9967
|
+
info(`Sample task already exists: ${colors.highlight(existingTask001)}`);
|
|
9676
9968
|
info("Skipping sample task creation (users already know the pattern)");
|
|
9677
9969
|
} else {
|
|
9678
|
-
const sampleTaskFile =
|
|
9970
|
+
const sampleTaskFile = join2(tasksDir, "task-001-setup-project.md");
|
|
9679
9971
|
info("Creating sample task...");
|
|
9680
9972
|
const sampleTask = `# Task 001 \u2014 Setup Project
|
|
9681
9973
|
|
|
@@ -9697,9 +9989,9 @@ This is a sample task created during Taskin initialization.
|
|
|
9697
9989
|
|
|
9698
9990
|
You can edit or delete this file. Use \`taskin list\` to see all tasks.
|
|
9699
9991
|
`;
|
|
9700
|
-
|
|
9992
|
+
writeFileSync2(sampleTaskFile, sampleTask, "utf-8");
|
|
9701
9993
|
success(
|
|
9702
|
-
`\u2713 Created sample task ${
|
|
9994
|
+
`\u2713 Created sample task ${colors.highlight("task-001-setup-project.md")}`
|
|
9703
9995
|
);
|
|
9704
9996
|
}
|
|
9705
9997
|
return {
|
|
@@ -9709,8 +10001,8 @@ You can edit or delete this file. Use \`taskin list\` to see all tasks.
|
|
|
9709
10001
|
|
|
9710
10002
|
// src/commands/lint.ts
|
|
9711
10003
|
init_esm_shims();
|
|
9712
|
-
import
|
|
9713
|
-
import { join as
|
|
10004
|
+
import chalk5 from "chalk";
|
|
10005
|
+
import { join as join3 } from "path";
|
|
9714
10006
|
var lintCommand = defineCommand({
|
|
9715
10007
|
name: "lint",
|
|
9716
10008
|
description: "\u{1F50D} Validate task markdown files",
|
|
@@ -9730,7 +10022,7 @@ var lintCommand = defineCommand({
|
|
|
9730
10022
|
}
|
|
9731
10023
|
});
|
|
9732
10024
|
async function executeLint(options) {
|
|
9733
|
-
const tasksDir = options.path ||
|
|
10025
|
+
const tasksDir = options.path || join3(process.cwd(), "TASKS");
|
|
9734
10026
|
if (options.fix) {
|
|
9735
10027
|
console.log(`\u{1F527} Fixing task files in: ${tasksDir}
|
|
9736
10028
|
`);
|
|
@@ -9739,26 +10031,26 @@ async function executeLint(options) {
|
|
|
9739
10031
|
`);
|
|
9740
10032
|
}
|
|
9741
10033
|
const userRegistry = new UserRegistry({
|
|
9742
|
-
taskinDir:
|
|
10034
|
+
taskinDir: join3(process.cwd(), ".taskin")
|
|
9743
10035
|
});
|
|
9744
10036
|
await userRegistry.load();
|
|
9745
10037
|
const provider = new FileSystemTaskProvider(tasksDir, userRegistry);
|
|
9746
10038
|
const result = await provider.lint(options.fix);
|
|
9747
10039
|
if (result.valid) {
|
|
9748
|
-
console.log(
|
|
10040
|
+
console.log(chalk5.green(`\u2705 All task files are valid!
|
|
9749
10041
|
`));
|
|
9750
10042
|
} else {
|
|
9751
|
-
console.log(
|
|
10043
|
+
console.log(chalk5.red(`
|
|
9752
10044
|
\u274C Found ${result.issues.length} issue(s):
|
|
9753
10045
|
`));
|
|
9754
10046
|
for (const issue of result.issues) {
|
|
9755
|
-
console.log(
|
|
10047
|
+
console.log(chalk5.yellow(` ${issue.file}: ${issue.message}`));
|
|
9756
10048
|
}
|
|
9757
10049
|
console.log();
|
|
9758
10050
|
}
|
|
9759
10051
|
if (!result.valid && !options.fix) {
|
|
9760
10052
|
console.log(
|
|
9761
|
-
|
|
10053
|
+
chalk5.blue(`\u{1F4A1} Run with --fix to automatically fix format issues
|
|
9762
10054
|
`)
|
|
9763
10055
|
);
|
|
9764
10056
|
process.exit(1);
|
|
@@ -9809,7 +10101,7 @@ async function listTasks(filter, options) {
|
|
|
9809
10101
|
const taskProvider = new FileSystemTaskProvider(tasksDir, userRegistry);
|
|
9810
10102
|
const tasks = await taskProvider.getAllTasks();
|
|
9811
10103
|
if (tasks.length === 0) {
|
|
9812
|
-
console.log(
|
|
10104
|
+
console.log(colors.warning("No tasks found in TASKS/ directory"));
|
|
9813
10105
|
return;
|
|
9814
10106
|
}
|
|
9815
10107
|
const openStatuses = ["pending", "in-progress", "blocked"];
|
|
@@ -9841,24 +10133,24 @@ async function listTasks(filter, options) {
|
|
|
9841
10133
|
);
|
|
9842
10134
|
}
|
|
9843
10135
|
if (filteredTasks.length === 0) {
|
|
9844
|
-
console.log(
|
|
10136
|
+
console.log(colors.warning("No tasks match the filters"));
|
|
9845
10137
|
return;
|
|
9846
10138
|
}
|
|
9847
10139
|
console.log(
|
|
9848
|
-
|
|
10140
|
+
colors.highlight(
|
|
9849
10141
|
`${"ID".padEnd(15)} ${"Status".padEnd(15)} ${"Type".padEnd(12)} ${"User".padEnd(15)} ${"Title"}`
|
|
9850
10142
|
)
|
|
9851
10143
|
);
|
|
9852
|
-
console.log(
|
|
10144
|
+
console.log(colors.secondary("\u2500".repeat(100)));
|
|
9853
10145
|
filteredTasks.forEach((task) => {
|
|
9854
10146
|
const statusColor = getStatusColor(task.status);
|
|
9855
10147
|
const typeColor = getTypeColor(task.type);
|
|
9856
10148
|
console.log(
|
|
9857
|
-
`${
|
|
10149
|
+
`${colors.info(task.id.padEnd(15))} ${statusColor(task.status.padEnd(15))} ${typeColor(task.type.padEnd(12))} ${colors.secondary((task.assignee?.name || "unassigned").padEnd(15))} ${colors.normal(task.title)}`
|
|
9858
10150
|
);
|
|
9859
10151
|
});
|
|
9860
10152
|
console.log();
|
|
9861
|
-
console.log(
|
|
10153
|
+
console.log(colors.secondary("\u2500".repeat(100)));
|
|
9862
10154
|
const statusCounts = {
|
|
9863
10155
|
pending: filteredTasks.filter((t) => t.status === "pending").length,
|
|
9864
10156
|
"in-progress": filteredTasks.filter((t) => t.status === "in-progress").length,
|
|
@@ -9866,7 +10158,7 @@ async function listTasks(filter, options) {
|
|
|
9866
10158
|
blocked: filteredTasks.filter((t) => t.status === "blocked").length
|
|
9867
10159
|
};
|
|
9868
10160
|
console.log(
|
|
9869
|
-
|
|
10161
|
+
colors.info(
|
|
9870
10162
|
`\u{1F4CA} Total: ${filteredTasks.length} tasks | \u23F3 Pending: ${statusCounts.pending} | \u{1F680} In Progress: ${statusCounts["in-progress"]} | \u2705 Done: ${statusCounts.done} | \u{1F6AB} Blocked: ${statusCounts.blocked}`
|
|
9871
10163
|
)
|
|
9872
10164
|
);
|
|
@@ -9875,33 +10167,33 @@ async function listTasks(filter, options) {
|
|
|
9875
10167
|
function getStatusColor(status) {
|
|
9876
10168
|
switch (status) {
|
|
9877
10169
|
case "pending":
|
|
9878
|
-
return
|
|
10170
|
+
return colors.secondary;
|
|
9879
10171
|
case "in-progress":
|
|
9880
|
-
return
|
|
10172
|
+
return colors.info;
|
|
9881
10173
|
case "done":
|
|
9882
|
-
return
|
|
10174
|
+
return colors.success;
|
|
9883
10175
|
case "blocked":
|
|
9884
|
-
return
|
|
10176
|
+
return colors.error;
|
|
9885
10177
|
default:
|
|
9886
|
-
return
|
|
10178
|
+
return colors.normal;
|
|
9887
10179
|
}
|
|
9888
10180
|
}
|
|
9889
10181
|
function getTypeColor(type) {
|
|
9890
10182
|
switch (type) {
|
|
9891
10183
|
case "feat":
|
|
9892
|
-
return
|
|
10184
|
+
return colors.success;
|
|
9893
10185
|
case "fix":
|
|
9894
|
-
return
|
|
10186
|
+
return colors.error;
|
|
9895
10187
|
case "refactor":
|
|
9896
|
-
return
|
|
10188
|
+
return colors.warning;
|
|
9897
10189
|
case "docs":
|
|
9898
|
-
return
|
|
10190
|
+
return colors.info;
|
|
9899
10191
|
case "test":
|
|
9900
|
-
return
|
|
10192
|
+
return colors.secondary;
|
|
9901
10193
|
case "chore":
|
|
9902
|
-
return
|
|
10194
|
+
return colors.normal;
|
|
9903
10195
|
default:
|
|
9904
|
-
return
|
|
10196
|
+
return colors.normal;
|
|
9905
10197
|
}
|
|
9906
10198
|
}
|
|
9907
10199
|
|
|
@@ -13633,7 +13925,7 @@ Let me start by marking the task as done using the finish_task tool.`
|
|
|
13633
13925
|
init_esm_shims();
|
|
13634
13926
|
|
|
13635
13927
|
// src/commands/mcp-server.ts
|
|
13636
|
-
import
|
|
13928
|
+
import chalk6 from "chalk";
|
|
13637
13929
|
import path11 from "path";
|
|
13638
13930
|
var mcpServerCommand = defineCommand({
|
|
13639
13931
|
name: "mcp-server",
|
|
@@ -13679,27 +13971,27 @@ async function startMCPServer(options) {
|
|
|
13679
13971
|
await mcpServer.connect({ transport });
|
|
13680
13972
|
success("\u2713 MCP server started successfully");
|
|
13681
13973
|
info("");
|
|
13682
|
-
info(
|
|
13683
|
-
info(` \u2022 Transport: ${
|
|
13684
|
-
info(` \u2022 Debug: ${
|
|
13974
|
+
info(chalk6.bold("Server Information:"));
|
|
13975
|
+
info(` \u2022 Transport: ${chalk6.cyan(transport)}`);
|
|
13976
|
+
info(` \u2022 Debug: ${chalk6.cyan(debug ? "enabled" : "disabled")}`);
|
|
13685
13977
|
info("");
|
|
13686
|
-
info(
|
|
13687
|
-
info(` \u2022 ${
|
|
13688
|
-
info(` \u2022 ${
|
|
13978
|
+
info(chalk6.bold("Available Tools:"));
|
|
13979
|
+
info(` \u2022 ${chalk6.green("start_task")} - Start working on a task`);
|
|
13980
|
+
info(` \u2022 ${chalk6.green("finish_task")} - Mark a task as finished`);
|
|
13689
13981
|
info("");
|
|
13690
|
-
info(
|
|
13982
|
+
info(chalk6.bold("Available Prompts:"));
|
|
13691
13983
|
info(
|
|
13692
|
-
` \u2022 ${
|
|
13984
|
+
` \u2022 ${chalk6.green("start-task-workflow")} - Guide for starting tasks`
|
|
13693
13985
|
);
|
|
13694
13986
|
info(
|
|
13695
|
-
` \u2022 ${
|
|
13987
|
+
` \u2022 ${chalk6.green("finish-task-workflow")} - Guide for finishing tasks`
|
|
13696
13988
|
);
|
|
13697
|
-
info(` \u2022 ${
|
|
13989
|
+
info(` \u2022 ${chalk6.green("task-summary")} - Get task summary and insights`);
|
|
13698
13990
|
info("");
|
|
13699
|
-
info(
|
|
13700
|
-
info(` \u2022 ${
|
|
13991
|
+
info(chalk6.bold("Available Resources:"));
|
|
13992
|
+
info(` \u2022 ${chalk6.green("taskin://tasks")} - Access all tasks`);
|
|
13701
13993
|
info("");
|
|
13702
|
-
info(`Press ${
|
|
13994
|
+
info(`Press ${chalk6.bold("Ctrl+C")} to stop the server`);
|
|
13703
13995
|
info("");
|
|
13704
13996
|
const cleanup = async () => {
|
|
13705
13997
|
info("\nShutting down MCP server...");
|
|
@@ -13724,8 +14016,8 @@ async function startMCPServer(options) {
|
|
|
13724
14016
|
|
|
13725
14017
|
// src/commands/new.ts
|
|
13726
14018
|
init_esm_shims();
|
|
13727
|
-
import { existsSync as
|
|
13728
|
-
import
|
|
14019
|
+
import { existsSync as existsSync6, mkdirSync as mkdirSync2, writeFileSync as writeFileSync3 } from "fs";
|
|
14020
|
+
import inquirer3 from "inquirer";
|
|
13729
14021
|
import path12 from "path";
|
|
13730
14022
|
var createCommand = defineCommand({
|
|
13731
14023
|
name: "new",
|
|
@@ -13760,7 +14052,7 @@ async function createTask(options) {
|
|
|
13760
14052
|
if (!options.type && !options.title) {
|
|
13761
14053
|
info("Interactive mode - Answer the questions below:");
|
|
13762
14054
|
console.log();
|
|
13763
|
-
const answers = await
|
|
14055
|
+
const answers = await inquirer3.prompt([
|
|
13764
14056
|
{
|
|
13765
14057
|
type: "list",
|
|
13766
14058
|
name: "type",
|
|
@@ -13819,7 +14111,7 @@ async function createTask(options) {
|
|
|
13819
14111
|
return;
|
|
13820
14112
|
}
|
|
13821
14113
|
const tasksDir = path12.join(process.cwd(), "TASKS");
|
|
13822
|
-
if (!
|
|
14114
|
+
if (!existsSync6(tasksDir)) {
|
|
13823
14115
|
mkdirSync2(tasksDir, { recursive: true });
|
|
13824
14116
|
}
|
|
13825
14117
|
const monorepoRoot = path12.dirname(tasksDir);
|
|
@@ -13837,7 +14129,7 @@ async function createTask(options) {
|
|
|
13837
14129
|
const titleSlug = slugify(options.title);
|
|
13838
14130
|
const fileName = `task-${taskId}-${titleSlug}.md`;
|
|
13839
14131
|
const filePath = path12.join(tasksDir, fileName);
|
|
13840
|
-
if (
|
|
14132
|
+
if (existsSync6(filePath)) {
|
|
13841
14133
|
error(`Task file already exists: ${fileName}`);
|
|
13842
14134
|
return;
|
|
13843
14135
|
}
|
|
@@ -13848,17 +14140,17 @@ async function createTask(options) {
|
|
|
13848
14140
|
description: options.description || "",
|
|
13849
14141
|
user: options.user || "A definir"
|
|
13850
14142
|
});
|
|
13851
|
-
|
|
14143
|
+
writeFileSync3(filePath, taskContent, "utf-8");
|
|
13852
14144
|
console.log();
|
|
13853
14145
|
success(`Task ${taskId} created successfully!`);
|
|
13854
|
-
console.log(
|
|
13855
|
-
console.log(
|
|
14146
|
+
console.log(colors.secondary(`\u{1F4C4} File: ${fileName}`));
|
|
14147
|
+
console.log(colors.secondary(`\u{1F4C1} Path: ${filePath}`));
|
|
13856
14148
|
console.log();
|
|
13857
|
-
console.log(
|
|
13858
|
-
console.log(
|
|
14149
|
+
console.log(colors.info("Next steps:"));
|
|
14150
|
+
console.log(colors.normal(` 1. Edit the task file to add more details`));
|
|
13859
14151
|
console.log(
|
|
13860
|
-
|
|
13861
|
-
` 2. Run ${
|
|
14152
|
+
colors.normal(
|
|
14153
|
+
` 2. Run ${colors.highlight("taskin start " + taskId)} to begin working on it`
|
|
13862
14154
|
)
|
|
13863
14155
|
);
|
|
13864
14156
|
console.log();
|
|
@@ -13936,12 +14228,12 @@ async function pauseTask(taskId, options) {
|
|
|
13936
14228
|
const commitMessage = options.message || `WIP: task-${normalizedId} - ${task.title}`;
|
|
13937
14229
|
if (options.skipCommit) {
|
|
13938
14230
|
info("Would create commit with message:");
|
|
13939
|
-
console.log(
|
|
14231
|
+
console.log(colors.highlight(` "${commitMessage}"`));
|
|
13940
14232
|
console.log();
|
|
13941
14233
|
info("Use without --skip-commit to actually commit");
|
|
13942
14234
|
} else {
|
|
13943
14235
|
info("Creating commit...");
|
|
13944
|
-
console.log(
|
|
14236
|
+
console.log(colors.secondary(` Message: "${commitMessage}"`));
|
|
13945
14237
|
console.log();
|
|
13946
14238
|
try {
|
|
13947
14239
|
execSync2("git add -A", { cwd: process.cwd(), stdio: "ignore" });
|
|
@@ -13958,9 +14250,9 @@ async function pauseTask(taskId, options) {
|
|
|
13958
14250
|
info("Status updated to pending");
|
|
13959
14251
|
console.log();
|
|
13960
14252
|
info("Next steps:");
|
|
13961
|
-
console.log(
|
|
14253
|
+
console.log(colors.secondary(" 1. Switch to another task"));
|
|
13962
14254
|
console.log(
|
|
13963
|
-
|
|
14255
|
+
colors.secondary(" 2. Or continue later with the same branch")
|
|
13964
14256
|
);
|
|
13965
14257
|
if (options.sound !== false) {
|
|
13966
14258
|
playSound("stop");
|
|
@@ -14027,17 +14319,17 @@ async function startTask(taskId, _options) {
|
|
|
14027
14319
|
console.log();
|
|
14028
14320
|
info("Next steps (suggestions):");
|
|
14029
14321
|
console.log(
|
|
14030
|
-
|
|
14322
|
+
colors.secondary(
|
|
14031
14323
|
` 1. Commit the status change: git add TASKS/task-${normalizedId}-*.md && git commit -m "docs(TASKS): task-${normalizedId} - atualiza status para in-progress [skip ci]"`
|
|
14032
14324
|
)
|
|
14033
14325
|
);
|
|
14034
14326
|
console.log(
|
|
14035
|
-
|
|
14327
|
+
colors.secondary(
|
|
14036
14328
|
" 2. Create a branch: git checkout -b feat/task-" + normalizedId
|
|
14037
14329
|
)
|
|
14038
14330
|
);
|
|
14039
|
-
console.log(
|
|
14040
|
-
console.log(
|
|
14331
|
+
console.log(colors.secondary(" 3. Start coding! \u{1F4BB}"));
|
|
14332
|
+
console.log(colors.secondary(' 4. Use "taskin pause" to save progress'));
|
|
14041
14333
|
console.log();
|
|
14042
14334
|
if (_options.sound !== false) {
|
|
14043
14335
|
playSound("start");
|
|
@@ -14046,7 +14338,7 @@ async function startTask(taskId, _options) {
|
|
|
14046
14338
|
|
|
14047
14339
|
// src/commands/stats.ts
|
|
14048
14340
|
init_esm_shims();
|
|
14049
|
-
import
|
|
14341
|
+
import chalk7 from "chalk";
|
|
14050
14342
|
import path15 from "path";
|
|
14051
14343
|
var statsCommand = defineCommand({
|
|
14052
14344
|
name: "stats",
|
|
@@ -14109,27 +14401,27 @@ async function showStats(options) {
|
|
|
14109
14401
|
displayUserStats(stats, options.detailed);
|
|
14110
14402
|
}
|
|
14111
14403
|
} catch (error2) {
|
|
14112
|
-
console.error(
|
|
14404
|
+
console.error(chalk7.red("\n\u274C Error fetching stats:"), error2);
|
|
14113
14405
|
process.exit(1);
|
|
14114
14406
|
}
|
|
14115
14407
|
}
|
|
14116
14408
|
function displayUserStats(stats, detailed = false) {
|
|
14117
14409
|
console.log(
|
|
14118
|
-
`${
|
|
14410
|
+
`${chalk7.dim("Period:")} ${stats.period} (${formatDate(stats.periodStart)} to ${formatDate(stats.periodEnd)})
|
|
14119
14411
|
`
|
|
14120
14412
|
);
|
|
14121
|
-
console.log(
|
|
14413
|
+
console.log(chalk7.bold("\u{1F4DD} Code Metrics"));
|
|
14122
14414
|
console.log(
|
|
14123
|
-
` ${
|
|
14415
|
+
` ${chalk7.green("+")}${stats.codeMetrics.linesAdded} lines added`
|
|
14124
14416
|
);
|
|
14125
14417
|
console.log(
|
|
14126
|
-
` ${
|
|
14418
|
+
` ${chalk7.red("-")}${stats.codeMetrics.linesRemoved} lines removed`
|
|
14127
14419
|
);
|
|
14128
|
-
console.log(` ${
|
|
14420
|
+
console.log(` ${chalk7.cyan("=")}${stats.codeMetrics.netChange} net change`);
|
|
14129
14421
|
console.log(` \u{1F4C1} ${stats.codeMetrics.filesChanged} files changed`);
|
|
14130
14422
|
console.log(` \u{1F4BE} ${stats.codeMetrics.commits} commits
|
|
14131
14423
|
`);
|
|
14132
|
-
console.log(
|
|
14424
|
+
console.log(chalk7.bold("\u{1F3AF} Contribution"));
|
|
14133
14425
|
console.log(
|
|
14134
14426
|
` \u2705 ${stats.contributionMetrics.tasksCompleted} tasks completed`
|
|
14135
14427
|
);
|
|
@@ -14137,7 +14429,7 @@ function displayUserStats(stats, detailed = false) {
|
|
|
14137
14429
|
` \u{1F4CA} ${stats.contributionMetrics.activityFrequency.toFixed(2)} commits/day
|
|
14138
14430
|
`
|
|
14139
14431
|
);
|
|
14140
|
-
console.log(
|
|
14432
|
+
console.log(chalk7.bold("\u26A1 Engagement"));
|
|
14141
14433
|
console.log(
|
|
14142
14434
|
` \u{1F525} ${(stats.engagementMetrics.completionRate * 100).toFixed(1)}% completion rate`
|
|
14143
14435
|
);
|
|
@@ -14146,7 +14438,7 @@ function displayUserStats(stats, detailed = false) {
|
|
|
14146
14438
|
`
|
|
14147
14439
|
);
|
|
14148
14440
|
if (detailed) {
|
|
14149
|
-
console.log(
|
|
14441
|
+
console.log(chalk7.bold("\u23F0 Temporal Patterns"));
|
|
14150
14442
|
console.log(" By Day of Week:");
|
|
14151
14443
|
const days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
14152
14444
|
Object.entries(stats.temporalMetrics.byDayOfWeek).forEach(
|
|
@@ -14179,25 +14471,25 @@ function displayUserStats(stats, detailed = false) {
|
|
|
14179
14471
|
}
|
|
14180
14472
|
function displayTeamStats(stats, detailed = false) {
|
|
14181
14473
|
console.log(
|
|
14182
|
-
`${
|
|
14474
|
+
`${chalk7.dim("Period:")} ${stats.period} (${formatDate(stats.periodStart)} to ${formatDate(stats.periodEnd)})
|
|
14183
14475
|
`
|
|
14184
14476
|
);
|
|
14185
|
-
console.log(
|
|
14477
|
+
console.log(chalk7.bold("\u{1F465} Team Overview"));
|
|
14186
14478
|
console.log(` \u{1F464} ${stats.totalContributors} contributors`);
|
|
14187
14479
|
console.log(` \u{1F4BE} ${stats.totalCommits} total commits`);
|
|
14188
14480
|
console.log(` \u2705 ${stats.totalTasksCompleted} tasks completed
|
|
14189
14481
|
`);
|
|
14190
|
-
console.log(
|
|
14482
|
+
console.log(chalk7.bold("\u{1F4DD} Code Metrics"));
|
|
14191
14483
|
console.log(
|
|
14192
|
-
` ${
|
|
14484
|
+
` ${chalk7.green("+")}${stats.codeMetrics.linesAdded} lines added`
|
|
14193
14485
|
);
|
|
14194
14486
|
console.log(
|
|
14195
|
-
` ${
|
|
14487
|
+
` ${chalk7.red("-")}${stats.codeMetrics.linesRemoved} lines removed`
|
|
14196
14488
|
);
|
|
14197
14489
|
console.log(` \u{1F4C1} ${stats.codeMetrics.filesChanged} files changed
|
|
14198
14490
|
`);
|
|
14199
14491
|
if (detailed && stats.contributors.length > 0) {
|
|
14200
|
-
console.log(
|
|
14492
|
+
console.log(chalk7.bold("\u{1F3C6} Top Contributors"));
|
|
14201
14493
|
stats.contributors.sort((a, b) => {
|
|
14202
14494
|
if (b.commits !== a.commits) {
|
|
14203
14495
|
return b.commits - a.commits;
|
|
@@ -14214,24 +14506,24 @@ function displayTeamStats(stats, detailed = false) {
|
|
|
14214
14506
|
}
|
|
14215
14507
|
}
|
|
14216
14508
|
function displayTaskStats(stats, _detailed = false) {
|
|
14217
|
-
console.log(`${
|
|
14509
|
+
console.log(`${chalk7.dim("Task:")} ${stats.taskId} - ${stats.title}
|
|
14218
14510
|
`);
|
|
14219
|
-
console.log(
|
|
14511
|
+
console.log(chalk7.bold("\u{1F4CB} Task Info"));
|
|
14220
14512
|
console.log(` Status: ${getStatusEmoji(stats.status)} ${stats.status}`);
|
|
14221
14513
|
console.log(` Type: ${stats.type}`);
|
|
14222
14514
|
console.log(` Assignee: ${stats.assignee || "unassigned"}
|
|
14223
14515
|
`);
|
|
14224
|
-
console.log(
|
|
14516
|
+
console.log(chalk7.bold("\u{1F4DD} Code Metrics"));
|
|
14225
14517
|
console.log(
|
|
14226
|
-
` ${
|
|
14518
|
+
` ${chalk7.green("+")}${stats.codeMetrics.linesAdded} lines added`
|
|
14227
14519
|
);
|
|
14228
14520
|
console.log(
|
|
14229
|
-
` ${
|
|
14521
|
+
` ${chalk7.red("-")}${stats.codeMetrics.linesRemoved} lines removed`
|
|
14230
14522
|
);
|
|
14231
14523
|
console.log(` \u{1F4C1} ${stats.codeMetrics.filesChanged} files changed
|
|
14232
14524
|
`);
|
|
14233
14525
|
if (stats.contributors.length > 0) {
|
|
14234
|
-
console.log(
|
|
14526
|
+
console.log(chalk7.bold("\u{1F465} Contributors"));
|
|
14235
14527
|
stats.contributors.forEach((c) => {
|
|
14236
14528
|
console.log(` \u2022 ${c}`);
|
|
14237
14529
|
});
|
|
@@ -14243,7 +14535,7 @@ function formatDate(isoString) {
|
|
|
14243
14535
|
function createBar(value, max, length = 20) {
|
|
14244
14536
|
if (max === 0) return "\u2591".repeat(length);
|
|
14245
14537
|
const filled = Math.round(value / max * length);
|
|
14246
|
-
return
|
|
14538
|
+
return chalk7.cyan("\u2588".repeat(filled)) + chalk7.dim("\u2591".repeat(length - filled));
|
|
14247
14539
|
}
|
|
14248
14540
|
function getTrendEmoji(trend) {
|
|
14249
14541
|
switch (trend) {
|
|
@@ -14274,20 +14566,20 @@ function getStatusEmoji(status) {
|
|
|
14274
14566
|
init_esm_shims();
|
|
14275
14567
|
function showCustomHelp() {
|
|
14276
14568
|
printHeader("Taskin - Task Management System", icons.rocket);
|
|
14277
|
-
console.log(
|
|
14278
|
-
console.log(
|
|
14569
|
+
console.log(colors.info("\u{1F4CB} AVAILABLE COMMANDS"));
|
|
14570
|
+
console.log(colors.highlight("\u2550".repeat(60)));
|
|
14279
14571
|
console.log();
|
|
14280
14572
|
const commands = [
|
|
14281
14573
|
{
|
|
14282
|
-
name:
|
|
14283
|
-
alias:
|
|
14574
|
+
name: colors.highlight("taskin init"),
|
|
14575
|
+
alias: colors.secondary("Alias: setup"),
|
|
14284
14576
|
description: "Initialize Taskin in your project",
|
|
14285
14577
|
examples: ["taskin init", "taskin setup"],
|
|
14286
14578
|
icon: "\u{1F3AF}"
|
|
14287
14579
|
},
|
|
14288
14580
|
{
|
|
14289
|
-
name:
|
|
14290
|
-
alias:
|
|
14581
|
+
name: colors.highlight("taskin list") + colors.normal(" [filter]"),
|
|
14582
|
+
alias: colors.secondary("Alias: ls"),
|
|
14291
14583
|
description: "List all tasks in the project",
|
|
14292
14584
|
examples: [
|
|
14293
14585
|
"taskin list",
|
|
@@ -14298,8 +14590,8 @@ function showCustomHelp() {
|
|
|
14298
14590
|
icon: "\u{1F4CA}"
|
|
14299
14591
|
},
|
|
14300
14592
|
{
|
|
14301
|
-
name:
|
|
14302
|
-
alias:
|
|
14593
|
+
name: colors.highlight("taskin new"),
|
|
14594
|
+
alias: colors.secondary("Alias: create"),
|
|
14303
14595
|
description: "Create a new task",
|
|
14304
14596
|
examples: [
|
|
14305
14597
|
'taskin new -t feat -T "Add login" -d "Implement user authentication"',
|
|
@@ -14309,8 +14601,8 @@ function showCustomHelp() {
|
|
|
14309
14601
|
icon: "\u{1F4DD}"
|
|
14310
14602
|
},
|
|
14311
14603
|
{
|
|
14312
|
-
name:
|
|
14313
|
-
alias:
|
|
14604
|
+
name: colors.highlight("taskin start") + colors.normal(" <task-id>"),
|
|
14605
|
+
alias: colors.secondary("Alias: begin"),
|
|
14314
14606
|
description: "Start working on a task (suggests commits)",
|
|
14315
14607
|
examples: [
|
|
14316
14608
|
"taskin start 001",
|
|
@@ -14320,22 +14612,22 @@ function showCustomHelp() {
|
|
|
14320
14612
|
icon: "\u{1F680}"
|
|
14321
14613
|
},
|
|
14322
14614
|
{
|
|
14323
|
-
name:
|
|
14324
|
-
alias:
|
|
14615
|
+
name: colors.highlight("taskin pause") + colors.normal(" <task-id>"),
|
|
14616
|
+
alias: colors.secondary("Alias: stop"),
|
|
14325
14617
|
description: "Pause a task (auto-commits work in progress)",
|
|
14326
14618
|
examples: ["taskin pause 001", 'taskin pause 001 -m "saving progress"'],
|
|
14327
14619
|
icon: "\u23F8\uFE0F"
|
|
14328
14620
|
},
|
|
14329
14621
|
{
|
|
14330
|
-
name:
|
|
14331
|
-
alias:
|
|
14622
|
+
name: colors.highlight("taskin finish") + colors.normal(" <task-id>"),
|
|
14623
|
+
alias: colors.secondary("Alias: done"),
|
|
14332
14624
|
description: "Finish a task (suggests commits)",
|
|
14333
14625
|
examples: ["taskin finish 001", "taskin done task-001"],
|
|
14334
14626
|
icon: "\u2705"
|
|
14335
14627
|
},
|
|
14336
14628
|
{
|
|
14337
|
-
name:
|
|
14338
|
-
alias:
|
|
14629
|
+
name: colors.highlight("taskin config") + colors.normal(" [options]"),
|
|
14630
|
+
alias: colors.secondary("Options: --level <manual|assisted|autopilot>"),
|
|
14339
14631
|
description: "Configure automation level",
|
|
14340
14632
|
examples: [
|
|
14341
14633
|
"taskin config",
|
|
@@ -14345,8 +14637,8 @@ function showCustomHelp() {
|
|
|
14345
14637
|
icon: "\u2699\uFE0F"
|
|
14346
14638
|
},
|
|
14347
14639
|
{
|
|
14348
|
-
name:
|
|
14349
|
-
alias:
|
|
14640
|
+
name: colors.highlight("taskin lint") + colors.normal(" [options]"),
|
|
14641
|
+
alias: colors.secondary("Options: -p, --path <directory>"),
|
|
14350
14642
|
description: "Validate task markdown files",
|
|
14351
14643
|
examples: [
|
|
14352
14644
|
"taskin lint",
|
|
@@ -14356,8 +14648,8 @@ function showCustomHelp() {
|
|
|
14356
14648
|
icon: "\u{1F50D}"
|
|
14357
14649
|
},
|
|
14358
14650
|
{
|
|
14359
|
-
name:
|
|
14360
|
-
alias:
|
|
14651
|
+
name: colors.highlight("taskin dashboard") + colors.normal(" [options]"),
|
|
14652
|
+
alias: colors.secondary(
|
|
14361
14653
|
"Options: --host, --port, --filter-open, --filter-closed"
|
|
14362
14654
|
),
|
|
14363
14655
|
description: "Start the web dashboard",
|
|
@@ -14370,56 +14662,56 @@ function showCustomHelp() {
|
|
|
14370
14662
|
icon: "\u{1F4CA}"
|
|
14371
14663
|
},
|
|
14372
14664
|
{
|
|
14373
|
-
name:
|
|
14374
|
-
alias:
|
|
14665
|
+
name: colors.highlight("taskin mcp-server"),
|
|
14666
|
+
alias: colors.secondary("Alias: mcp"),
|
|
14375
14667
|
description: "Start MCP server for Claude Desktop integration",
|
|
14376
14668
|
examples: ["taskin mcp-server", "taskin mcp"],
|
|
14377
14669
|
icon: "\u{1F916}"
|
|
14378
14670
|
}
|
|
14379
14671
|
];
|
|
14380
14672
|
commands.forEach((cmd, index) => {
|
|
14381
|
-
console.log(
|
|
14382
|
-
console.log(
|
|
14383
|
-
console.log(
|
|
14673
|
+
console.log(colors.warning(`${cmd.icon} ${cmd.name}`));
|
|
14674
|
+
console.log(colors.normal(` ${cmd.alias}`));
|
|
14675
|
+
console.log(colors.info(` ${cmd.description}`));
|
|
14384
14676
|
console.log();
|
|
14385
|
-
console.log(
|
|
14677
|
+
console.log(colors.normal(` ${colors.info("\u{1F4DD} Examples:")}`));
|
|
14386
14678
|
cmd.examples.forEach((example) => {
|
|
14387
|
-
console.log(
|
|
14679
|
+
console.log(colors.secondary(` ${example}`));
|
|
14388
14680
|
});
|
|
14389
14681
|
if (index < commands.length - 1) {
|
|
14390
14682
|
console.log();
|
|
14391
|
-
console.log(
|
|
14683
|
+
console.log(colors.normal(" " + colors.secondary("\u2500".repeat(50))));
|
|
14392
14684
|
console.log();
|
|
14393
14685
|
}
|
|
14394
14686
|
});
|
|
14395
14687
|
console.log();
|
|
14396
|
-
console.log(
|
|
14688
|
+
console.log(colors.highlight("\u2550".repeat(60)));
|
|
14397
14689
|
console.log();
|
|
14398
|
-
console.log(
|
|
14690
|
+
console.log(colors.info("\u{1F4A1} QUICK TIPS"));
|
|
14399
14691
|
console.log(
|
|
14400
|
-
|
|
14401
|
-
`${
|
|
14692
|
+
colors.normal(
|
|
14693
|
+
`${colors.warning("\u2022")} Use short IDs: ${colors.highlight("001")}, ${colors.highlight("task-001")}`
|
|
14402
14694
|
)
|
|
14403
14695
|
);
|
|
14404
14696
|
console.log(
|
|
14405
|
-
|
|
14406
|
-
`${
|
|
14697
|
+
colors.normal(
|
|
14698
|
+
`${colors.warning("\u2022")} Configure automation with ${colors.highlight("taskin config --level <manual|assisted|autopilot>")}`
|
|
14407
14699
|
)
|
|
14408
14700
|
);
|
|
14409
14701
|
console.log(
|
|
14410
|
-
|
|
14411
|
-
`${
|
|
14702
|
+
colors.normal(
|
|
14703
|
+
`${colors.warning("\u2022")} All commands support ${colors.highlight("--help")} for more options`
|
|
14412
14704
|
)
|
|
14413
14705
|
);
|
|
14414
14706
|
console.log(
|
|
14415
|
-
|
|
14416
|
-
`${
|
|
14707
|
+
colors.normal(
|
|
14708
|
+
`${colors.warning("\u2022")} Use aliases for faster commands: ${colors.highlight("ls")}, ${colors.highlight("begin")}, ${colors.highlight("stop")}, ${colors.highlight("done")}`
|
|
14417
14709
|
)
|
|
14418
14710
|
);
|
|
14419
14711
|
console.log();
|
|
14420
|
-
console.log(
|
|
14712
|
+
console.log(colors.info("\u{1F527} FOR MORE HELP"));
|
|
14421
14713
|
console.log(
|
|
14422
|
-
|
|
14714
|
+
colors.secondary("taskin ") + colors.highlight("<command>") + colors.secondary(" --help")
|
|
14423
14715
|
);
|
|
14424
14716
|
console.log();
|
|
14425
14717
|
return "";
|
|
@@ -14427,15 +14719,15 @@ function showCustomHelp() {
|
|
|
14427
14719
|
|
|
14428
14720
|
// src/version.ts
|
|
14429
14721
|
init_esm_shims();
|
|
14430
|
-
import { readFileSync as
|
|
14431
|
-
import { dirname, join as
|
|
14722
|
+
import { readFileSync as readFileSync3 } from "fs";
|
|
14723
|
+
import { dirname, join as join4 } from "path";
|
|
14432
14724
|
import { fileURLToPath as fileURLToPath3 } from "url";
|
|
14433
14725
|
var __filename3 = fileURLToPath3(import.meta.url);
|
|
14434
14726
|
var __dirname3 = dirname(__filename3);
|
|
14435
14727
|
function getVersion() {
|
|
14436
14728
|
try {
|
|
14437
|
-
const packageJsonPath =
|
|
14438
|
-
const packageJson = JSON.parse(
|
|
14729
|
+
const packageJsonPath = join4(__dirname3, "../package.json");
|
|
14730
|
+
const packageJson = JSON.parse(readFileSync3(packageJsonPath, "utf-8"));
|
|
14439
14731
|
return packageJson.version;
|
|
14440
14732
|
} catch {
|
|
14441
14733
|
return "0.0.0";
|
|
@@ -14444,16 +14736,16 @@ function getVersion() {
|
|
|
14444
14736
|
|
|
14445
14737
|
// src/main.ts
|
|
14446
14738
|
init_esm_shims();
|
|
14447
|
-
import { dirname as dirname2, join as
|
|
14739
|
+
import { dirname as dirname2, join as join6 } from "path";
|
|
14448
14740
|
|
|
14449
14741
|
// src/lib/file-system-task-linter/index.ts
|
|
14450
14742
|
init_esm_shims();
|
|
14451
14743
|
|
|
14452
14744
|
// src/lib/file-system-task-linter/file-system-task-linter.ts
|
|
14453
14745
|
init_esm_shims();
|
|
14454
|
-
import
|
|
14746
|
+
import chalk8 from "chalk";
|
|
14455
14747
|
import { readdir, readFile as readFile2 } from "fs/promises";
|
|
14456
|
-
import { join as
|
|
14748
|
+
import { join as join5 } from "path";
|
|
14457
14749
|
var VALID_STATUSES = ["pending", "in-progress", "done", "blocked"];
|
|
14458
14750
|
var VALID_TYPES = ["feat", "fix", "chore", "docs", "refactor", "test"];
|
|
14459
14751
|
var FileSystemTaskLinter = class {
|
|
@@ -14607,7 +14899,7 @@ var FileSystemTaskLinter = class {
|
|
|
14607
14899
|
if (fileNameError) {
|
|
14608
14900
|
this.addError(file, fileNameError.message, fileNameError.severity);
|
|
14609
14901
|
}
|
|
14610
|
-
const content = await readFile2(
|
|
14902
|
+
const content = await readFile2(join5(tasksDir, file), "utf-8");
|
|
14611
14903
|
this.validateContent(file, content);
|
|
14612
14904
|
}
|
|
14613
14905
|
const errors = this.errors.filter((e) => e.severity === "error");
|
|
@@ -14625,13 +14917,13 @@ var FileSystemTaskLinter = class {
|
|
|
14625
14917
|
static printResults(result) {
|
|
14626
14918
|
if (result.errors.length === 0 && result.warnings.length === 0) {
|
|
14627
14919
|
console.log(
|
|
14628
|
-
|
|
14920
|
+
chalk8.green(`\u2705 All ${result.filesChecked} task files are valid!
|
|
14629
14921
|
`)
|
|
14630
14922
|
);
|
|
14631
14923
|
return;
|
|
14632
14924
|
}
|
|
14633
14925
|
console.log(
|
|
14634
|
-
|
|
14926
|
+
chalk8.bold(
|
|
14635
14927
|
`
|
|
14636
14928
|
\u{1F4CA} Validation Results (${result.filesChecked} files checked):
|
|
14637
14929
|
`
|
|
@@ -14645,19 +14937,19 @@ var FileSystemTaskLinter = class {
|
|
|
14645
14937
|
errorsByFile.get(error2.file).push(error2);
|
|
14646
14938
|
});
|
|
14647
14939
|
for (const [file, fileErrors] of errorsByFile) {
|
|
14648
|
-
console.log(
|
|
14940
|
+
console.log(chalk8.cyan(`
|
|
14649
14941
|
\u{1F4C4} ${file}`));
|
|
14650
14942
|
for (const error2 of fileErrors) {
|
|
14651
|
-
const icon = error2.severity === "error" ?
|
|
14943
|
+
const icon = error2.severity === "error" ? chalk8.red("\u274C") : chalk8.yellow("\u26A0\uFE0F");
|
|
14652
14944
|
const location = error2.line ? `:${error2.line}` : "";
|
|
14653
14945
|
console.log(` ${icon} ${error2.message}${location}`);
|
|
14654
14946
|
}
|
|
14655
14947
|
}
|
|
14656
14948
|
console.log("\n" + "\u2500".repeat(60));
|
|
14657
14949
|
console.log(
|
|
14658
|
-
|
|
14950
|
+
chalk8.bold(
|
|
14659
14951
|
`
|
|
14660
|
-
\u{1F4CA} Summary: ${
|
|
14952
|
+
\u{1F4CA} Summary: ${chalk8.red(result.errors.length + " error(s)")}, ${chalk8.yellow(result.warnings.length + " warning(s)")}
|
|
14661
14953
|
`
|
|
14662
14954
|
)
|
|
14663
14955
|
);
|
|
@@ -14805,8 +15097,8 @@ var Taskin = class {
|
|
|
14805
15097
|
|
|
14806
15098
|
// src/main.ts
|
|
14807
15099
|
function createTaskin(tasksDir) {
|
|
14808
|
-
const resolvedTasksDir = tasksDir ||
|
|
14809
|
-
const taskinDir =
|
|
15100
|
+
const resolvedTasksDir = tasksDir || join6(process.cwd(), "TASKS");
|
|
15101
|
+
const taskinDir = join6(dirname2(resolvedTasksDir), ".taskin");
|
|
14810
15102
|
const userRegistry = new UserRegistry({ taskinDir });
|
|
14811
15103
|
const taskProvider = new FileSystemTaskProvider(
|
|
14812
15104
|
resolvedTasksDir,
|
|
@@ -14834,6 +15126,7 @@ startCommand(program);
|
|
|
14834
15126
|
pauseCommand(program);
|
|
14835
15127
|
finishCommand(program);
|
|
14836
15128
|
statsCommand(program);
|
|
15129
|
+
configCommand(program);
|
|
14837
15130
|
registerExportCommand(program);
|
|
14838
15131
|
lintCommand(program);
|
|
14839
15132
|
dashboardCommand(program);
|