task-o-matic 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ export declare const continueCommand: Command;
4
+ //# sourceMappingURL=continue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continue.d.ts","sourceRoot":"","sources":["../../src/commands/continue.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,eAAe,SA4ExB,CAAC"}
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.continueCommand = void 0;
8
+ const commander_1 = require("commander");
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const task_o_matic_core_1 = require("task-o-matic-core");
11
+ const progress_1 = require("../cli/display/progress");
12
+ exports.continueCommand = new commander_1.Command("continue")
13
+ .description("Continue working on an existing project")
14
+ .option("-s, --status", "Show project status overview")
15
+ .option("-a, --add-feature <feature>", "Add a new feature to the PRD")
16
+ .option("-u, --update-prd", "Update PRD with implementation progress")
17
+ .option("-g, --generate-tasks", "Generate tasks for unimplemented features")
18
+ .option("-p, --generate-plan", "Generate implementation plan for remaining work")
19
+ .action(async (options) => {
20
+ try {
21
+ const workingDir = task_o_matic_core_1.configManager.getWorkingDirectory() || process.cwd();
22
+ let action = "review-status"; // Default action
23
+ if (options.addFeature)
24
+ action = "add-feature";
25
+ else if (options.updatePrd)
26
+ action = "update-prd";
27
+ else if (options.generateTasks)
28
+ action = "generate-tasks";
29
+ else if (options.generatePlan)
30
+ action = "generate-plan";
31
+ // If just --status or no options, it falls to review-status which is correct
32
+ const result = await task_o_matic_core_1.workflowService.continueProject({
33
+ projectDir: workingDir,
34
+ action: action,
35
+ callbacks: {
36
+ onProgress: (event) => {
37
+ if (event.type === "started")
38
+ console.log(chalk_1.default.blue(event.message));
39
+ else if (event.type === "completed")
40
+ console.log(chalk_1.default.green(event.message));
41
+ else if (event.type === "progress")
42
+ console.log(chalk_1.default.gray(event.message));
43
+ else if (event.type === "info")
44
+ console.log(chalk_1.default.gray(event.message));
45
+ else if (event.type === "warning")
46
+ console.log(chalk_1.default.yellow(event.message));
47
+ // Ignore stream chunks for cleaner output
48
+ },
49
+ onError: (error) => {
50
+ console.error(chalk_1.default.red("Error:"), error.message);
51
+ }
52
+ }
53
+ });
54
+ if (!result.success) {
55
+ console.log(chalk_1.default.red(`\nāŒ ${result.message}`));
56
+ if (result.action === "initialize") {
57
+ console.log(chalk_1.default.cyan("Run 'task-o-matic init attach' to set up this project."));
58
+ }
59
+ process.exit(1);
60
+ }
61
+ const status = result.projectStatus;
62
+ console.log(chalk_1.default.bold.blue(`\nšŸ“Š Project Status: ${status.prd?.exists ? "Active" : "No PRD"}`));
63
+ console.log(chalk_1.default.bold("\nTasks:"));
64
+ console.log(` ${chalk_1.default.green("āœ“")} ${status.tasks.completed} Completed`);
65
+ console.log(` ${chalk_1.default.yellow("āžœ")} ${status.tasks.inProgress} In Progress`);
66
+ console.log(` ${chalk_1.default.white("ā—‹")} ${status.tasks.todo} Todo`);
67
+ console.log(` ${chalk_1.default.cyan("=")} ${status.tasks.total} Total (${status.tasks.completionPercentage}% Complete)`);
68
+ if (status.prd) {
69
+ console.log(chalk_1.default.bold("\nPRD:"));
70
+ console.log(` ${status.prd.exists ? chalk_1.default.green("āœ“ Found") : chalk_1.default.red("āœ— Missing")}`);
71
+ if (status.prd.exists) {
72
+ console.log(` Path: ${status.prd.path}`);
73
+ }
74
+ }
75
+ if (status.nextSteps && status.nextSteps.length > 0) {
76
+ console.log(chalk_1.default.bold("\nšŸ‘‰ Suggested Next Steps:"));
77
+ status.nextSteps.forEach(step => console.log(` - ${step}`));
78
+ }
79
+ if (result.message && result.message !== "Project status analysis complete") {
80
+ console.log(chalk_1.default.yellow(`\nā„¹ļø ${result.message}`));
81
+ }
82
+ }
83
+ catch (error) {
84
+ (0, progress_1.displayError)(error);
85
+ process.exit(1);
86
+ }
87
+ });
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ export declare const detectCommand: Command;
4
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/commands/detect.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,SAEzB,CAAC"}
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.detectCommand = void 0;
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = require("node:path");
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const commander_1 = require("commander");
12
+ const task_o_matic_core_1 = require("task-o-matic-core");
13
+ const progress_1 = require("../cli/display/progress");
14
+ exports.detectCommand = new commander_1.Command("detect").description("Detect technology stack of the current project");
15
+ exports.detectCommand
16
+ .description("Detect technology stack of the current project")
17
+ .option("--save", "Save detected stack to .task-o-matic/stack.json")
18
+ .option("--json", "Output result as JSON")
19
+ .action(async (options) => {
20
+ try {
21
+ const workingDir = task_o_matic_core_1.configManager.getWorkingDirectory() || process.cwd();
22
+ if (!options.json) {
23
+ console.log(chalk_1.default.blue("šŸ” Detecting project stack..."));
24
+ console.log(chalk_1.default.cyan(` šŸ“ Working directory: ${workingDir}`));
25
+ }
26
+ // Run ProjectAnalysisService
27
+ const analysisService = new task_o_matic_core_1.ProjectAnalysisService();
28
+ const stackResult = await analysisService.detectStack(workingDir);
29
+ if (!stackResult.success) {
30
+ if (options.json) {
31
+ console.log(JSON.stringify({ success: false, error: "Stack detection failed", warnings: stackResult.warnings }, null, 2));
32
+ }
33
+ else {
34
+ console.log(chalk_1.default.yellow("āš ļø Stack detection had issues:"));
35
+ stackResult.warnings?.forEach((w) => console.log(chalk_1.default.yellow(` - ${w}`)));
36
+ }
37
+ process.exit(1);
38
+ }
39
+ const stack = stackResult.stack;
40
+ if (options.json) {
41
+ console.log(JSON.stringify(stack, null, 2));
42
+ }
43
+ else {
44
+ console.log(chalk_1.default.green("\nāœ… Stack detected:"));
45
+ console.log(` Language: ${chalk_1.default.cyan(stack.language)}`);
46
+ console.log(` Framework(s): ${chalk_1.default.cyan(stack.frameworks.join(", "))}`);
47
+ if (stack.database)
48
+ console.log(` Database: ${chalk_1.default.cyan(stack.database)}`);
49
+ if (stack.orm)
50
+ console.log(` ORM: ${chalk_1.default.cyan(stack.orm)}`);
51
+ if (stack.auth)
52
+ console.log(` Auth: ${chalk_1.default.cyan(stack.auth)}`);
53
+ console.log(` Package Manager: ${chalk_1.default.cyan(stack.packageManager)}`);
54
+ console.log(` Runtime: ${chalk_1.default.cyan(stack.runtime)}`);
55
+ if (stack.api)
56
+ console.log(` API: ${chalk_1.default.cyan(stack.api)}`);
57
+ console.log(` Confidence: ${chalk_1.default.cyan(`${Math.round(stack.confidence * 100)}%`)}`);
58
+ }
59
+ // Save if requested
60
+ if (options.save) {
61
+ const taskOMaticDir = task_o_matic_core_1.configManager.getTaskOMaticDir();
62
+ // Ensure .task-o-matic exists? usually configManager handles paths but directory might not exist if not initialized
63
+ // But detect command might be run on uninitialized project too?
64
+ // The plan implies it can be used standalone.
65
+ // However, configManager.getTaskOMaticDir() relies on working directory.
66
+ // If we want to save, we should probably check if .task-o-matic exists or create it.
67
+ // Actually, init attach creates it. If we run detect --save on a raw project, we should probably create it too?
68
+ // Let's assume we create it if it doesn't exist, similar to init attach.
69
+ if (!(0, node_fs_1.existsSync)(taskOMaticDir)) {
70
+ (0, node_fs_1.mkdirSync)(taskOMaticDir, { recursive: true });
71
+ }
72
+ const stackFilePath = (0, node_path_1.join)(taskOMaticDir, "stack.json");
73
+ (0, node_fs_1.writeFileSync)(stackFilePath, JSON.stringify(stack, null, 2));
74
+ if (!options.json) {
75
+ console.log(chalk_1.default.green(`\n āœ“ Saved to ${stackFilePath}`));
76
+ }
77
+ }
78
+ }
79
+ catch (error) {
80
+ (0, progress_1.displayError)(error);
81
+ process.exit(1);
82
+ }
83
+ });
@@ -202,15 +202,244 @@ exports.initCommand
202
202
  (0, progress_1.displayError)(error);
203
203
  }
204
204
  });
205
+ // Attach to existing project
206
+ exports.initCommand
207
+ .command("attach")
208
+ .description("Attach task-o-matic to an existing project (detect stack automatically)")
209
+ .option("--analyze", "Run full project analysis including TODOs and features")
210
+ .option("--create-prd", "Auto-generate a PRD from codebase analysis")
211
+ .option("--dry-run", "Just detect, don't create files")
212
+ .option("--redetect", "Force re-detection of stack (overwrites cached stack.json)")
213
+ .option("--ai-provider <provider>", "AI provider (openrouter/anthropic/openai/custom)", "openrouter")
214
+ .option("--ai-model <model>", "AI model", "z-ai/glm-4.6")
215
+ .option("--ai-key <key>", "AI API key")
216
+ .option("--ai-provider-url <url>", "AI provider URL")
217
+ .option("--max-tokens <tokens>", "Max tokens for AI (min 32768 for 2025)", "32768")
218
+ .option("--temperature <temp>", "AI temperature", "0.5")
219
+ .option("--context7-api-key <key>", "Context7 API key")
220
+ .action(async (options) => {
221
+ const workingDir = task_o_matic_core_1.configManager.getWorkingDirectory() || process.cwd();
222
+ const taskOMaticDir = (0, path_1.join)(workingDir, ".task-o-matic");
223
+ console.log(chalk_1.default.blue("šŸ”— Attaching task-o-matic to existing project..."));
224
+ console.log(chalk_1.default.cyan(` šŸ“ Working directory: ${workingDir}`));
225
+ // Check if already initialized (unless --redetect is passed)
226
+ if ((0, fs_1.existsSync)((0, path_1.join)(taskOMaticDir, "config.json")) && !options.redetect) {
227
+ console.log(chalk_1.default.yellow("āš ļø This project is already initialized with task-o-matic."));
228
+ console.log(chalk_1.default.cyan(" Use --redetect to re-analyze the stack."));
229
+ return;
230
+ }
231
+ // Check for project markers
232
+ const hasPackageJson = (0, fs_1.existsSync)((0, path_1.join)(workingDir, "package.json"));
233
+ const hasGit = (0, fs_1.existsSync)((0, path_1.join)(workingDir, ".git"));
234
+ if (!hasPackageJson) {
235
+ console.log(chalk_1.default.red("āŒ No package.json found in this directory."));
236
+ console.log(chalk_1.default.cyan(" Run 'task-o-matic init init' to create a new project."));
237
+ return;
238
+ }
239
+ console.log(chalk_1.default.blue("\nšŸ“Š Analyzing project..."));
240
+ // Run ProjectAnalysisService
241
+ const analysisService = new task_o_matic_core_1.ProjectAnalysisService();
242
+ // Detect stack
243
+ let stackResult;
244
+ try {
245
+ stackResult = await analysisService.detectStack(workingDir);
246
+ }
247
+ catch (error) {
248
+ console.log(chalk_1.default.red("āŒ Stack detection failed:"), error instanceof Error ? error.message : String(error));
249
+ return;
250
+ }
251
+ if (!stackResult.success) {
252
+ console.log(chalk_1.default.yellow("āš ļø Stack detection had issues:"));
253
+ stackResult.warnings?.forEach((w) => console.log(chalk_1.default.yellow(` - ${w}`)));
254
+ }
255
+ const stack = stackResult.stack;
256
+ // Display detected stack
257
+ console.log(chalk_1.default.green("\nāœ… Stack detected:"));
258
+ console.log(` Language: ${chalk_1.default.cyan(stack.language)}`);
259
+ console.log(` Framework(s): ${chalk_1.default.cyan(stack.frameworks.join(", "))}`);
260
+ if (stack.database)
261
+ console.log(` Database: ${chalk_1.default.cyan(stack.database)}`);
262
+ if (stack.orm)
263
+ console.log(` ORM: ${chalk_1.default.cyan(stack.orm)}`);
264
+ if (stack.auth)
265
+ console.log(` Auth: ${chalk_1.default.cyan(stack.auth)}`);
266
+ console.log(` Package Manager: ${chalk_1.default.cyan(stack.packageManager)}`);
267
+ console.log(` Runtime: ${chalk_1.default.cyan(stack.runtime)}`);
268
+ if (stack.api)
269
+ console.log(` API: ${chalk_1.default.cyan(stack.api)}`);
270
+ console.log(` Confidence: ${chalk_1.default.cyan(`${Math.round(stack.confidence * 100)}%`)}`);
271
+ // If dry run, stop here
272
+ if (options.dryRun) {
273
+ console.log(chalk_1.default.cyan("\nšŸ“‹ Dry run complete. No files created."));
274
+ return;
275
+ }
276
+ // Create .task-o-matic directory structure
277
+ const dirs = ["tasks", "prd", "logs", "docs"];
278
+ if (!(0, fs_1.existsSync)(taskOMaticDir)) {
279
+ (0, fs_1.mkdirSync)(taskOMaticDir, { recursive: true });
280
+ console.log(chalk_1.default.green(`\nāœ“ Created ${taskOMaticDir}`));
281
+ }
282
+ dirs.forEach((dir) => {
283
+ const fullPath = (0, path_1.join)(taskOMaticDir, dir);
284
+ if (!(0, fs_1.existsSync)(fullPath)) {
285
+ (0, fs_1.mkdirSync)(fullPath, { recursive: true });
286
+ console.log(chalk_1.default.green(` āœ“ Created ${fullPath}`));
287
+ }
288
+ });
289
+ // Write stack.json (cached stack detection)
290
+ const stackFilePath = (0, path_1.join)(taskOMaticDir, "stack.json");
291
+ (0, fs_1.writeFileSync)(stackFilePath, JSON.stringify(stack, null, 2));
292
+ console.log(chalk_1.default.green(` āœ“ Created ${stackFilePath}`));
293
+ // Initialize config with provided options
294
+ const config = {
295
+ ai: {
296
+ provider: options.aiProvider,
297
+ model: options.aiModel,
298
+ maxTokens: parseInt(options.maxTokens) || 32768,
299
+ temperature: parseFloat(options.temperature) || 0.5,
300
+ },
301
+ };
302
+ // Add API key if provided
303
+ if (options.aiKey) {
304
+ config.ai.apiKey = options.aiKey;
305
+ }
306
+ // Add provider URL if provided
307
+ if (options.aiProviderUrl) {
308
+ config.ai.baseURL = options.aiProviderUrl;
309
+ }
310
+ // Set working directory and save config
311
+ task_o_matic_core_1.configManager.setWorkingDirectory(workingDir);
312
+ task_o_matic_core_1.configManager.setConfig(config);
313
+ task_o_matic_core_1.configManager.save();
314
+ console.log(chalk_1.default.green(` āœ“ Created ${taskOMaticDir}/config.json`));
315
+ // Initialize mcp.json with context7 config
316
+ const mcpConfig = {
317
+ context7: {},
318
+ };
319
+ if (options.context7ApiKey) {
320
+ mcpConfig.context7.apiKey = options.context7ApiKey;
321
+ }
322
+ const mcpFilePath = (0, path_1.join)(taskOMaticDir, "mcp.json");
323
+ (0, fs_1.writeFileSync)(mcpFilePath, JSON.stringify(mcpConfig, null, 2));
324
+ console.log(chalk_1.default.green(` āœ“ Created ${mcpFilePath}`));
325
+ let analysisResult;
326
+ // Run full analysis if requested
327
+ if (options.analyze) {
328
+ console.log(chalk_1.default.blue("\nšŸ“Š Running full project analysis..."));
329
+ try {
330
+ analysisResult = await analysisService.analyzeProject(workingDir);
331
+ }
332
+ catch (error) {
333
+ console.error(chalk_1.default.red("āŒ Project analysis failed:"), error instanceof Error ? error.message : String(error));
334
+ // Fallback or early exit if analysis is critical
335
+ }
336
+ if (analysisResult && analysisResult.success) {
337
+ const analysis = analysisResult.analysis;
338
+ console.log(chalk_1.default.green("\nāœ… Project analysis complete:"));
339
+ console.log(` Project: ${chalk_1.default.cyan(analysis.projectName)}`);
340
+ if (analysis.version)
341
+ console.log(` Version: ${chalk_1.default.cyan(analysis.version)}`);
342
+ console.log(chalk_1.default.blue("\nšŸ“ Structure:"));
343
+ console.log(` Monorepo: ${analysis.structure.isMonorepo ? "Yes" : "No"}`);
344
+ console.log(` Source directories: ${analysis.structure.sourceDirectories.length}`);
345
+ console.log(` Has tests: ${analysis.structure.hasTests ? "Yes" : "No"}`);
346
+ console.log(` Has CI/CD: ${analysis.structure.hasCICD ? "Yes" : "No"}`);
347
+ console.log(` Has Docker: ${analysis.structure.hasDocker ? "Yes" : "No"}`);
348
+ if (analysis.documentation.length > 0) {
349
+ console.log(chalk_1.default.blue(`\nšŸ“š Documentation found: ${analysis.documentation.length} files`));
350
+ }
351
+ if (analysis.todos.length > 0) {
352
+ console.log(chalk_1.default.blue(`\nšŸ“ TODOs found: ${analysis.todos.length} comments`));
353
+ // Show first 5 TODOs
354
+ analysis.todos.slice(0, 5).forEach((todo) => {
355
+ console.log(chalk_1.default.gray(` [${todo.type}] ${todo.file}:${todo.line} - ${todo.text.substring(0, 60)}${todo.text.length > 60 ? "..." : ""}`));
356
+ });
357
+ if (analysis.todos.length > 5) {
358
+ console.log(chalk_1.default.gray(` ... and ${analysis.todos.length - 5} more`));
359
+ }
360
+ }
361
+ if (analysis.existingFeatures.length > 0) {
362
+ console.log(chalk_1.default.blue(`\nšŸ”§ Features detected: ${analysis.existingFeatures.length}`));
363
+ analysis.existingFeatures.forEach((feature) => {
364
+ console.log(chalk_1.default.gray(` - ${feature.name}: ${feature.description}`));
365
+ });
366
+ }
367
+ // Save analysis result
368
+ const analysisFilePath = (0, path_1.join)(taskOMaticDir, "analysis.json");
369
+ (0, fs_1.writeFileSync)(analysisFilePath, JSON.stringify(analysis, null, 2));
370
+ console.log(chalk_1.default.green(`\n āœ“ Saved analysis to ${analysisFilePath}`));
371
+ // Show suggestions
372
+ if (analysisResult.suggestions && analysisResult.suggestions.length > 0) {
373
+ console.log(chalk_1.default.blue("\nšŸ’” Suggestions:"));
374
+ analysisResult.suggestions.forEach((suggestion) => {
375
+ console.log(chalk_1.default.cyan(` - ${suggestion}`));
376
+ });
377
+ }
378
+ }
379
+ else {
380
+ console.log(chalk_1.default.yellow("āš ļø Analysis had issues:"));
381
+ analysisResult?.warnings?.forEach((w) => console.log(chalk_1.default.yellow(` - ${w}`)));
382
+ }
383
+ }
384
+ // Handle --create-prd (independent of analysis)
385
+ if (options.createPrd) {
386
+ console.log(chalk_1.default.blue("\nšŸ“„ Generating PRD from codebase..."));
387
+ try {
388
+ const prdResult = await task_o_matic_core_1.prdService.generateFromCodebase({
389
+ workingDirectory: workingDir,
390
+ outputFile: "current-state.md",
391
+ analysisResult,
392
+ });
393
+ console.log(chalk_1.default.green(` āœ“ Generated PRD: ${prdResult.prdPath}`));
394
+ }
395
+ catch (error) {
396
+ console.error(chalk_1.default.red(" āŒ Failed to generate PRD:"), error instanceof Error ? error.message : String(error));
397
+ }
398
+ }
399
+ // Update .gitignore if git exists
400
+ if (hasGit) {
401
+ const gitignorePath = (0, path_1.join)(workingDir, ".gitignore");
402
+ const taskOMaticEntries = [
403
+ "",
404
+ "# Task-O-Matic",
405
+ ".task-o-matic/logs/",
406
+ ".task-o-matic/config.json",
407
+ ".task-o-matic/mcp.json",
408
+ ];
409
+ if ((0, fs_1.existsSync)(gitignorePath)) {
410
+ const existing = (0, fs_1.readFileSync)(gitignorePath, "utf-8");
411
+ if (!existing.includes(".task-o-matic/")) {
412
+ (0, fs_1.writeFileSync)(gitignorePath, existing + taskOMaticEntries.join("\n") + "\n");
413
+ console.log(chalk_1.default.green(" āœ“ Updated .gitignore"));
414
+ }
415
+ }
416
+ else {
417
+ (0, fs_1.writeFileSync)(gitignorePath, taskOMaticEntries.join("\n") + "\n");
418
+ console.log(chalk_1.default.green(" āœ“ Created .gitignore"));
419
+ }
420
+ }
421
+ console.log(chalk_1.default.green("\nāœ… Task-O-Matic attached successfully!"));
422
+ console.log(chalk_1.default.cyan("\nNext steps:"));
423
+ console.log(" 1. Configure AI provider: task-o-matic config set-ai-provider <provider> <model>");
424
+ console.log(" 2. Generate PRD from codebase: task-o-matic prd generate --from-codebase");
425
+ console.log(' 3. Create your first task: task-o-matic tasks create --title "Your first task"');
426
+ });
205
427
  // Default action - show help
206
428
  exports.initCommand.action(() => {
207
429
  console.log(chalk_1.default.blue("TaskOMatic Initialization"));
208
430
  console.log("");
209
431
  console.log(chalk_1.default.cyan("Usage:"));
210
432
  console.log(" task-o-matic init init Initialize task-o-matic project");
433
+ console.log(" task-o-matic init attach Attach to existing project");
211
434
  console.log(" task-o-matic init bootstrap <name> Bootstrap Better-T-Stack project");
212
435
  console.log("");
213
436
  console.log(chalk_1.default.cyan("Examples:"));
437
+ console.log(" # Attach to existing project:");
438
+ console.log(" task-o-matic init attach");
439
+ console.log(" task-o-matic init attach --analyze");
440
+ console.log(" task-o-matic init attach --dry-run");
441
+ console.log(" task-o-matic init attach --redetect");
442
+ console.log("");
214
443
  console.log(" # Basic initialization:");
215
444
  console.log(" task-o-matic init init");
216
445
  console.log(" task-o-matic init init --project-name my-app");
@@ -263,4 +492,10 @@ exports.initCommand.action(() => {
263
492
  console.log(" --package-manager <pm> Package manager (npm/pnpm/bun)");
264
493
  console.log(" --runtime <runtime> Runtime (node/bun)");
265
494
  console.log(" --payment <payment> Payment provider (none/polar)");
495
+ console.log("");
496
+ console.log(chalk_1.default.cyan("Attach Options:"));
497
+ console.log(" --analyze Run full project analysis (TODOs, features)");
498
+ console.log(" --create-prd Auto-generate a PRD from codebase analysis");
499
+ console.log(" --dry-run Just detect stack, don't create files");
500
+ console.log(" --redetect Force re-detection (overwrites stack.json)");
266
501
  });
@@ -1 +1 @@
1
- {"version":3,"file":"prd.d.ts","sourceRoot":"","sources":["../../src/commands/prd.ts"],"names":[],"mappings":";AAYA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,eAAO,MAAM,UAAU,SAEtB,CAAC"}
1
+ {"version":3,"file":"prd.d.ts","sourceRoot":"","sources":["../../src/commands/prd.ts"],"names":[],"mappings":";AAYA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,UAAU,SAEtB,CAAC"}
@@ -726,3 +726,97 @@ exports.prdCommand
726
726
  process.exit(1);
727
727
  }
728
728
  });
729
+ // Generate PRD from existing codebase
730
+ exports.prdCommand
731
+ .command("generate")
732
+ .description("Generate a PRD from an existing codebase (reverse-engineering)")
733
+ .option("--output <filename>", "Output filename", "current-state.md")
734
+ .option("--ai <provider:model>", "AI model to use. Format: [provider:]model[;reasoning[=budget]]")
735
+ .option("--ai-reasoning <tokens>", "Enable reasoning for OpenRouter models (max reasoning tokens)")
736
+ .option("--stream", "Enable streaming output")
737
+ .option("--tools", "Enable filesystem tools for deeper analysis")
738
+ .option("--json", "Output result as JSON")
739
+ .action(async (options) => {
740
+ try {
741
+ const workingDirectory = process.cwd();
742
+ // Load configuration
743
+ await task_o_matic_core_1.configManager.load();
744
+ const aiConfig = task_o_matic_core_1.configManager.getAIConfig();
745
+ // Determine which AI model to use
746
+ let aiProvider = aiConfig.provider;
747
+ let aiModel = aiConfig.model;
748
+ let aiReasoning = aiConfig.reasoning?.maxTokens?.toString();
749
+ if (options.ai) {
750
+ const modelConfig = (0, task_o_matic_core_1.parseModelString)(options.ai);
751
+ aiProvider = modelConfig.provider || aiProvider;
752
+ aiModel = modelConfig.model;
753
+ if (modelConfig.reasoning) {
754
+ aiReasoning = modelConfig.reasoning.toString();
755
+ }
756
+ }
757
+ if (options.aiReasoning) {
758
+ aiReasoning = options.aiReasoning;
759
+ }
760
+ const streamingOptions = (0, streaming_options_1.createStreamingOptions)(options.stream, "Generating PRD from codebase");
761
+ // Default to codebase generation if from-codebase is specified OR if no description is provided (as implied by command)
762
+ // Actually this is the `generate` subcommand, so it *is* the from-codebase command essentially.
763
+ // But we should respect the flag if user explicitly provides it, or if it's the intended default mode for this command.
764
+ // Given the description "Generate a PRD from an existing codebase", it seems `from-codebase` is the primary function.
765
+ if (options.fromCodebase || true) {
766
+ // Always true for this subcommand per its description, but keeping check structure
767
+ console.log(chalk_1.default.blue("šŸ” Analyzing existing codebase...\n"));
768
+ const result = await task_o_matic_core_1.prdService.generateFromCodebase({
769
+ workingDirectory,
770
+ outputFile: options.output,
771
+ enableFilesystemTools: options.tools,
772
+ aiOptions: {
773
+ aiProvider,
774
+ aiModel,
775
+ aiReasoning,
776
+ },
777
+ streamingOptions,
778
+ callbacks: {
779
+ onProgress: progress_1.displayProgress,
780
+ onError: progress_1.displayError,
781
+ },
782
+ });
783
+ console.log("");
784
+ if (options.json) {
785
+ // JSON output mode
786
+ console.log(JSON.stringify({
787
+ prdPath: result.prdPath,
788
+ projectName: result.analysis.projectName,
789
+ stack: result.analysis.stack,
790
+ features: result.analysis.existingFeatures.length,
791
+ todos: result.analysis.todos.length,
792
+ stats: result.stats,
793
+ }, null, 2));
794
+ }
795
+ else {
796
+ // Human-readable output
797
+ console.log(chalk_1.default.green("āœ“ PRD Generated from Codebase\n"));
798
+ console.log(chalk_1.default.cyan("Project Analysis:"));
799
+ console.log(chalk_1.default.white(` Project Name: ${result.analysis.projectName}`));
800
+ console.log(chalk_1.default.white(` Stack: ${result.analysis.stack.frameworks.join(", ")} (${result.analysis.stack.language})`));
801
+ console.log(chalk_1.default.white(` Features Detected: ${result.analysis.existingFeatures.length}`));
802
+ console.log(chalk_1.default.white(` TODOs Found: ${result.analysis.todos.length}`));
803
+ console.log(chalk_1.default.blue("\nStats:"));
804
+ console.log(chalk_1.default.cyan(` Duration: ${result.stats.duration}ms`));
805
+ if (result.stats.tokenUsage) {
806
+ console.log(chalk_1.default.cyan(` Tokens: ${result.stats.tokenUsage.total}`));
807
+ }
808
+ if (result.stats.timeToFirstToken) {
809
+ console.log(chalk_1.default.cyan(` TTFT: ${result.stats.timeToFirstToken}ms`));
810
+ }
811
+ console.log(chalk_1.default.green(`\nāœ“ PRD saved to: ${result.prdPath}`));
812
+ console.log(chalk_1.default.dim("\nTip: Use 'task-o-matic prd parse --file " +
813
+ result.prdPath +
814
+ "' to extract tasks"));
815
+ }
816
+ } // End of fromCodebase block
817
+ }
818
+ catch (error) {
819
+ (0, progress_1.displayError)(error);
820
+ process.exit(1);
821
+ }
822
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"execute-loop.d.ts","sourceRoot":"","sources":["../../../src/commands/tasks/execute-loop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,eAAO,MAAM,kBAAkB,SA4L5B,CAAC"}
1
+ {"version":3,"file":"execute-loop.d.ts","sourceRoot":"","sources":["../../../src/commands/tasks/execute-loop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,eAAO,MAAM,kBAAkB,SAiM5B,CAAC"}
@@ -30,6 +30,7 @@ exports.executeLoopCommand = new commander_1.Command("execute-loop")
30
30
  .option("--auto-commit", "Automatically commit changes after each task", false)
31
31
  .option("--plan", "Generate an implementation plan before execution", false)
32
32
  .option("--plan-model <model>", "Model/executor to use for planning (e.g., 'opencode:gpt-4o' or 'gpt-4o')")
33
+ .option("--plan-tool <tool>", "Tool/Executor to use for planning (defaults to --tool)")
33
34
  .option("--review-plan", "Pause for human review of the plan", false)
34
35
  .option("--review", "Run AI review after execution", false)
35
36
  .option("--review-model <model>", "Model/executor to use for review (e.g., 'opencode:gpt-4o' or 'gpt-4o')")
@@ -84,6 +85,7 @@ exports.executeLoopCommand = new commander_1.Command("execute-loop")
84
85
  model: options.model,
85
86
  plan: options.plan,
86
87
  planModel: options.planModel,
88
+ planTool: options.planTool,
87
89
  reviewPlan: options.reviewPlan,
88
90
  review: options.review,
89
91
  reviewModel: options.reviewModel,
@@ -1 +1 @@
1
- {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/commands/tasks/execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,cAAc,SA2HxB,CAAC"}
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/commands/tasks/execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,cAAc,SAgIxB,CAAC"}
@@ -28,6 +28,7 @@ exports.executeCommand = new commander_1.Command("execute")
28
28
  .option("--try-models <models>", "Progressive model/executor configs for retries (e.g., 'gpt-4o-mini,claude:sonnet-4')")
29
29
  .option("--plan", "Generate an implementation plan before execution", false)
30
30
  .option("--plan-model <model>", "Model/executor to use for planning (e.g., 'opencode:gpt-4o' or 'gpt-4o')")
31
+ .option("--plan-tool <tool>", "Tool/Executor to use for planning (defaults to --tool)")
31
32
  .option("--review-plan", "Pause for human review of the plan", false)
32
33
  .option("--review", "Run AI review after execution", false)
33
34
  .option("--review-model <model>", "Model/executor to use for review (e.g., 'opencode:gpt-4o' or 'gpt-4o')")
@@ -67,6 +68,7 @@ exports.executeCommand = new commander_1.Command("execute")
67
68
  tryModels,
68
69
  plan: options.plan,
69
70
  planModel: options.planModel,
71
+ planTool: options.planTool,
70
72
  reviewPlan: options.reviewPlan,
71
73
  review: options.review,
72
74
  reviewModel: options.reviewModel,
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,QAAA,MAAM,OAAO,SAAgB,CAAC;AAkD9B;;;GAGG;AACH,eAAO,MAAM,MAAM,qBAgBlB,CAAC;AAEF;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,QAAA,MAAM,OAAO,SAAgB,CAAC;AAoD9B;;;GAGG;AACH,eAAO,MAAM,MAAM,qBAgBlB,CAAC;AAEF;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -15,6 +15,8 @@ const commander_1 = require("commander");
15
15
  const task_o_matic_core_1 = require("task-o-matic-core");
16
16
  const benchmark_1 = require("./commands/benchmark");
17
17
  const config_1 = require("./commands/config");
18
+ const continue_1 = require("./commands/continue");
19
+ const detect_1 = require("./commands/detect");
18
20
  const init_1 = require("./commands/init");
19
21
  const install_1 = require("./commands/install");
20
22
  const prd_1 = require("./commands/prd");
@@ -33,11 +35,13 @@ program
33
35
  program.addCommand(config_1.configCommand);
34
36
  program.addCommand(tasks_1.tasksCommand);
35
37
  program.addCommand(prd_1.prdCommand);
38
+ program.addCommand(continue_1.continueCommand);
36
39
  program.addCommand(prompt_1.promptCommand);
37
40
  program.addCommand(init_1.initCommand);
38
41
  program.addCommand(workflow_1.workflowCommand);
39
42
  program.addCommand(benchmark_1.benchmarkCommand);
40
43
  program.addCommand(install_1.installCommand);
44
+ program.addCommand(detect_1.detectCommand);
41
45
  // Default action - show help
42
46
  program.action(() => {
43
47
  console.log(chalk_1.default.blue("šŸš€ AI-Powered Task Management CLI"));
@@ -54,7 +58,7 @@ program.action(() => {
54
58
  // Error handling
55
59
  program.on("command:*", (operands) => {
56
60
  console.error(chalk_1.default.red(`Unknown command: ${operands[0]}`));
57
- console.log(chalk_1.default.blue("Available commands: config, tasks, prd, prompt, init, workflow, benchmark, install"));
61
+ console.log(chalk_1.default.blue("Available commands: config, tasks, prd, prompt, init, workflow, benchmark, install, continue, detect"));
58
62
  console.log(chalk_1.default.blue("Use --help for available commands"));
59
63
  process.exit(1);
60
64
  });
@@ -53,7 +53,8 @@ describe("CLI Commands Help", () => {
53
53
  "prompt",
54
54
  "workflow",
55
55
  "benchmark",
56
- "install"
56
+ "install",
57
+ "continue"
57
58
  ];
58
59
  commands.forEach(cmd => {
59
60
  it(`should show help for ${cmd || "main"} command`, (done) => {
@@ -88,6 +88,7 @@ export interface ExecuteCommandOptions extends DryRunOptions {
88
88
  tryModels?: string;
89
89
  plan?: boolean;
90
90
  planModel?: string;
91
+ planTool?: string;
91
92
  reviewPlan?: boolean;
92
93
  review?: boolean;
93
94
  reviewModel?: string;
@@ -109,6 +110,7 @@ export interface ExecuteLoopCommandOptions extends DryRunOptions {
109
110
  autoCommit?: boolean;
110
111
  plan?: boolean;
111
112
  planModel?: string;
113
+ planTool?: string;
112
114
  reviewPlan?: boolean;
113
115
  review?: boolean;
114
116
  reviewModel?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"cli-options.d.ts","sourceRoot":"","sources":["../../src/types/cli-options.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,WAAW,CAAC;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,oBACf,SAAQ,gBAAgB,EACtB,iBAAiB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,qBACf,SAAQ,kBAAkB,EACxB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,iBAAiB;CAAG;AAExB,MAAM,WAAW,mBACf,SAAQ,kBAAkB,EACxB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,iBAAiB;IACnB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBACf,SAAQ,gBAAgB,EACtB,iBAAiB;IACnB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBACf,SAAQ,gBAAgB,EACtB,iBAAiB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,8BAA8B;IAC7C,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,8BAA8B;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,yBAA0B,SAAQ,aAAa;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,WAAW,CAAC;IAC9C,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd"}
1
+ {"version":3,"file":"cli-options.d.ts","sourceRoot":"","sources":["../../src/types/cli-options.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-o-matic",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "CLI for Task-O-Matic",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -29,7 +29,7 @@
29
29
  "test": "mocha -r tsx/cjs src/test/commands.test.ts"
30
30
  },
31
31
  "dependencies": {
32
- "task-o-matic-core": "0.1.2",
32
+ "task-o-matic-core": "0.1.4",
33
33
  "chalk": "^5.4.1",
34
34
  "commander": "^14.0.2",
35
35
  "create-better-t-stack": "^3.15.0",