task-o-matic 0.0.12 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/commands/tasks/create.d.ts.map +1 -1
  2. package/dist/commands/tasks/create.js +6 -13
  3. package/dist/commands/tasks/document/add.d.ts +3 -0
  4. package/dist/commands/tasks/document/add.d.ts.map +1 -0
  5. package/dist/commands/tasks/document/add.js +35 -0
  6. package/dist/commands/tasks/document/analyze.d.ts +3 -0
  7. package/dist/commands/tasks/document/analyze.d.ts.map +1 -0
  8. package/dist/commands/tasks/document/analyze.js +49 -0
  9. package/dist/commands/tasks/document/get.d.ts +3 -0
  10. package/dist/commands/tasks/document/get.d.ts.map +1 -0
  11. package/dist/commands/tasks/document/get.js +29 -0
  12. package/dist/commands/tasks/document/index.d.ts +8 -0
  13. package/dist/commands/tasks/document/index.d.ts.map +1 -0
  14. package/dist/commands/tasks/document/index.js +13 -0
  15. package/dist/commands/tasks/enhance.d.ts.map +1 -1
  16. package/dist/commands/tasks/enhance.js +64 -61
  17. package/dist/commands/tasks/execute-loop.d.ts.map +1 -1
  18. package/dist/commands/tasks/execute-loop.js +64 -90
  19. package/dist/commands/tasks/execute.d.ts.map +1 -1
  20. package/dist/commands/tasks/execute.js +52 -16
  21. package/dist/commands/tasks/plan/create.d.ts +3 -0
  22. package/dist/commands/tasks/plan/create.d.ts.map +1 -0
  23. package/dist/commands/tasks/plan/create.js +37 -0
  24. package/dist/commands/tasks/plan/delete.d.ts +3 -0
  25. package/dist/commands/tasks/plan/delete.d.ts.map +1 -0
  26. package/dist/commands/tasks/plan/delete.js +14 -0
  27. package/dist/commands/tasks/plan/get.d.ts +3 -0
  28. package/dist/commands/tasks/plan/get.d.ts.map +1 -0
  29. package/dist/commands/tasks/plan/get.js +24 -0
  30. package/dist/commands/tasks/plan/index.d.ts +10 -0
  31. package/dist/commands/tasks/plan/index.d.ts.map +1 -0
  32. package/dist/commands/tasks/plan/index.js +17 -0
  33. package/dist/commands/tasks/plan/list.d.ts +3 -0
  34. package/dist/commands/tasks/plan/list.d.ts.map +1 -0
  35. package/dist/commands/tasks/plan/list.js +21 -0
  36. package/dist/commands/tasks/plan/set.d.ts +3 -0
  37. package/dist/commands/tasks/plan/set.d.ts.map +1 -0
  38. package/dist/commands/tasks/plan/set.js +33 -0
  39. package/dist/commands/tasks/split.d.ts.map +1 -1
  40. package/dist/commands/tasks/split.js +65 -60
  41. package/dist/lib/git-utils.d.ts +45 -0
  42. package/dist/lib/git-utils.d.ts.map +1 -0
  43. package/dist/lib/git-utils.js +160 -0
  44. package/dist/lib/task-execution-core.d.ts +7 -0
  45. package/dist/lib/task-execution-core.d.ts.map +1 -0
  46. package/dist/lib/task-execution-core.js +360 -0
  47. package/dist/lib/task-execution.d.ts +4 -0
  48. package/dist/lib/task-execution.d.ts.map +1 -1
  49. package/dist/lib/task-execution.js +31 -149
  50. package/dist/lib/task-loop-execution.d.ts +1 -19
  51. package/dist/lib/task-loop-execution.d.ts.map +1 -1
  52. package/dist/lib/task-loop-execution.js +50 -585
  53. package/dist/lib/task-planning.d.ts +28 -0
  54. package/dist/lib/task-planning.d.ts.map +1 -0
  55. package/dist/lib/task-planning.js +109 -0
  56. package/dist/lib/task-review.d.ts +27 -0
  57. package/dist/lib/task-review.d.ts.map +1 -0
  58. package/dist/lib/task-review.js +106 -0
  59. package/dist/lib/validation.d.ts +20 -3
  60. package/dist/lib/validation.d.ts.map +1 -1
  61. package/dist/lib/validation.js +39 -10
  62. package/dist/test/task-loop-git.test.js +6 -6
  63. package/dist/types/cli-options.d.ts +138 -0
  64. package/dist/types/cli-options.d.ts.map +1 -0
  65. package/dist/types/cli-options.js +6 -0
  66. package/dist/types/index.d.ts +38 -0
  67. package/dist/types/index.d.ts.map +1 -1
  68. package/dist/utils/bulk-operations.d.ts +51 -0
  69. package/dist/utils/bulk-operations.d.ts.map +1 -0
  70. package/dist/utils/bulk-operations.js +68 -0
  71. package/dist/utils/cli-validators.d.ts +54 -0
  72. package/dist/utils/cli-validators.d.ts.map +1 -0
  73. package/dist/utils/cli-validators.js +75 -0
  74. package/dist/utils/command-error-handler.d.ts +32 -0
  75. package/dist/utils/command-error-handler.d.ts.map +1 -0
  76. package/dist/utils/command-error-handler.js +52 -0
  77. package/dist/utils/confirmation.d.ts +19 -0
  78. package/dist/utils/confirmation.d.ts.map +1 -0
  79. package/dist/utils/confirmation.js +39 -0
  80. package/dist/utils/display-helpers.d.ts +81 -0
  81. package/dist/utils/display-helpers.d.ts.map +1 -0
  82. package/dist/utils/display-helpers.js +109 -0
  83. package/dist/utils/model-executor-parser.d.ts +38 -0
  84. package/dist/utils/model-executor-parser.d.ts.map +1 -0
  85. package/dist/utils/model-executor-parser.js +67 -0
  86. package/dist/utils/progress-tracking.d.ts +28 -0
  87. package/dist/utils/progress-tracking.d.ts.map +1 -0
  88. package/dist/utils/progress-tracking.js +43 -0
  89. package/package.json +1 -1
  90. package/dist/commands/tasks/document.d.ts +0 -5
  91. package/dist/commands/tasks/document.d.ts.map +0 -1
  92. package/dist/commands/tasks/document.js +0 -118
  93. package/dist/commands/tasks/plan.d.ts +0 -7
  94. package/dist/commands/tasks/plan.d.ts.map +0 -1
  95. package/dist/commands/tasks/plan.js +0 -131
@@ -0,0 +1,38 @@
1
+ import { ExecutorTool, ModelAttemptConfig } from "../types";
2
+ /**
3
+ * Valid executor tools
4
+ */
5
+ export declare const VALID_EXECUTORS: ExecutorTool[];
6
+ /**
7
+ * Parse --try-models option into ModelAttemptConfig array
8
+ * Supports formats:
9
+ * - "model1,model2,model3" - just models (uses default executor)
10
+ * - "opencode:gpt-4o,claude:sonnet-4" - executor:model format
11
+ * - Mixed: "gpt-4o,claude:sonnet-4,gemini:gemini-2.0"
12
+ *
13
+ * @param value - Comma-separated model/executor specifications
14
+ * @returns Array of model attempt configurations
15
+ * @throws Error if an invalid executor is specified
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * parseTryModels("gpt-4o-mini,gpt-4o"); // [{ model: "gpt-4o-mini" }, { model: "gpt-4o" }]
20
+ * parseTryModels("opencode:gpt-4o,claude:sonnet-4"); // [{ executor: "opencode", model: "gpt-4o" }, ...]
21
+ * ```
22
+ */
23
+ export declare function parseTryModels(value: string): ModelAttemptConfig[];
24
+ /**
25
+ * Validate that an executor name is valid
26
+ *
27
+ * @param executor - Executor name to validate
28
+ * @returns Type guard confirming executor is valid
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * if (validateExecutor(options.tool)) {
33
+ * // TypeScript knows options.tool is ExecutorTool
34
+ * }
35
+ * ```
36
+ */
37
+ export declare function validateExecutor(executor: string): executor is ExecutorTool;
38
+ //# sourceMappingURL=model-executor-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-executor-parser.d.ts","sourceRoot":"","sources":["../../src/utils/model-executor-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,YAAY,EAKzC,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,EAAE,CA2BlE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,IAAI,YAAY,CAE3E"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VALID_EXECUTORS = void 0;
4
+ exports.parseTryModels = parseTryModels;
5
+ exports.validateExecutor = validateExecutor;
6
+ /**
7
+ * Valid executor tools
8
+ */
9
+ exports.VALID_EXECUTORS = [
10
+ "opencode",
11
+ "claude",
12
+ "gemini",
13
+ "codex",
14
+ ];
15
+ /**
16
+ * Parse --try-models option into ModelAttemptConfig array
17
+ * Supports formats:
18
+ * - "model1,model2,model3" - just models (uses default executor)
19
+ * - "opencode:gpt-4o,claude:sonnet-4" - executor:model format
20
+ * - Mixed: "gpt-4o,claude:sonnet-4,gemini:gemini-2.0"
21
+ *
22
+ * @param value - Comma-separated model/executor specifications
23
+ * @returns Array of model attempt configurations
24
+ * @throws Error if an invalid executor is specified
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * parseTryModels("gpt-4o-mini,gpt-4o"); // [{ model: "gpt-4o-mini" }, { model: "gpt-4o" }]
29
+ * parseTryModels("opencode:gpt-4o,claude:sonnet-4"); // [{ executor: "opencode", model: "gpt-4o" }, ...]
30
+ * ```
31
+ */
32
+ function parseTryModels(value) {
33
+ return value.split(",").map((item) => {
34
+ const trimmed = item.trim();
35
+ // Check if it includes executor specification (executor:model format)
36
+ if (trimmed.includes(":")) {
37
+ const [executor, model] = trimmed.split(":");
38
+ if (!exports.VALID_EXECUTORS.includes(executor)) {
39
+ throw new Error(`Invalid executor "${executor}" in --try-models. Must be one of: ${exports.VALID_EXECUTORS.join(", ")}`);
40
+ }
41
+ return {
42
+ executor: executor,
43
+ model: model.trim(),
44
+ };
45
+ }
46
+ // Just a model name - use default executor
47
+ return {
48
+ model: trimmed,
49
+ };
50
+ });
51
+ }
52
+ /**
53
+ * Validate that an executor name is valid
54
+ *
55
+ * @param executor - Executor name to validate
56
+ * @returns Type guard confirming executor is valid
57
+ *
58
+ * @example
59
+ * ```typescript
60
+ * if (validateExecutor(options.tool)) {
61
+ * // TypeScript knows options.tool is ExecutorTool
62
+ * }
63
+ * ```
64
+ */
65
+ function validateExecutor(executor) {
66
+ return exports.VALID_EXECUTORS.includes(executor);
67
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Progress event payload from AI operations
3
+ */
4
+ export interface ProgressEvent {
5
+ taskId?: string;
6
+ operation?: string;
7
+ step?: string;
8
+ progress?: number;
9
+ message?: string;
10
+ phase?: string;
11
+ [key: string]: any;
12
+ }
13
+ /**
14
+ * Execute an async function with automatic progress tracking
15
+ * Registers a progress handler, executes the function, and cleans up
16
+ *
17
+ * @param fn - The async function to execute with progress tracking
18
+ * @returns The result of the function
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const result = await withProgressTracking(async () => {
23
+ * return await taskService.enhanceTask(taskId);
24
+ * });
25
+ * ```
26
+ */
27
+ export declare function withProgressTracking<T>(fn: () => Promise<T>): Promise<T>;
28
+ //# sourceMappingURL=progress-tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-tracking.d.ts","sourceRoot":"","sources":["../../src/utils/progress-tracking.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAiBD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CASZ"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withProgressTracking = withProgressTracking;
4
+ const hooks_1 = require("../lib/hooks");
5
+ /**
6
+ * Display progress information to the console
7
+ */
8
+ function displayProgress(payload) {
9
+ const { operation, step, message, phase } = payload;
10
+ if (phase) {
11
+ console.log(`[${phase}]`, message || step || operation || "");
12
+ }
13
+ else if (operation && step) {
14
+ console.log(`${operation}: ${step}`);
15
+ }
16
+ else if (message) {
17
+ console.log(message);
18
+ }
19
+ }
20
+ /**
21
+ * Execute an async function with automatic progress tracking
22
+ * Registers a progress handler, executes the function, and cleans up
23
+ *
24
+ * @param fn - The async function to execute with progress tracking
25
+ * @returns The result of the function
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * const result = await withProgressTracking(async () => {
30
+ * return await taskService.enhanceTask(taskId);
31
+ * });
32
+ * ```
33
+ */
34
+ async function withProgressTracking(fn) {
35
+ const progressHandler = (payload) => displayProgress(payload);
36
+ hooks_1.hooks.on("task:progress", progressHandler);
37
+ try {
38
+ return await fn();
39
+ }
40
+ finally {
41
+ hooks_1.hooks.off("task:progress", progressHandler);
42
+ }
43
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-o-matic",
3
- "version": "0.0.12",
3
+ "version": "0.0.13",
4
4
  "description": "AI-powered task management CLI",
5
5
  "keywords": [
6
6
  "task-management",
@@ -1,5 +0,0 @@
1
- import { Command } from "commander";
2
- export declare const documentCommand: Command;
3
- export declare const getDocumentationCommand: Command;
4
- export declare const addDocumentationCommand: Command;
5
- //# sourceMappingURL=document.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../../src/commands/tasks/document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,eAAO,MAAM,eAAe,SA2ExB,CAAC;AAEL,eAAO,MAAM,uBAAuB,SAgChC,CAAC;AAEL,eAAO,MAAM,uBAAuB,SA8ChC,CAAC"}
@@ -1,118 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.addDocumentationCommand = exports.getDocumentationCommand = exports.documentCommand = void 0;
7
- const commander_1 = require("commander");
8
- const chalk_1 = __importDefault(require("chalk"));
9
- const tasks_1 = require("../../services/tasks");
10
- const hooks_1 = require("../../lib/hooks");
11
- const streaming_options_1 = require("../../utils/streaming-options");
12
- const progress_1 = require("../../cli/display/progress");
13
- const common_1 = require("../../cli/display/common");
14
- exports.documentCommand = new commander_1.Command("document")
15
- .description("Analyze and fetch documentation for a task using AI with Context7")
16
- .requiredOption("--task-id <id>", "Task ID")
17
- .option("--force", "Force refresh documentation even if recent")
18
- .option("--stream", "Show streaming AI output during analysis")
19
- .option("--ai-provider <provider>", "AI provider override")
20
- .option("--ai-model <model>", "AI model override")
21
- .option("--ai-key <key>", "AI API key override")
22
- .option("--ai-provider-url <url>", "AI provider URL override")
23
- .option("--reasoning <tokens>", "Enable reasoning for OpenRouter models (max reasoning tokens)")
24
- .action(async (options) => {
25
- try {
26
- const streamingOptions = (0, streaming_options_1.createStreamingOptions)(options.stream, "Analysis");
27
- const progressHandler = (payload) => {
28
- (0, progress_1.displayProgress)(payload);
29
- };
30
- hooks_1.hooks.on("task:progress", progressHandler);
31
- try {
32
- const result = await tasks_1.taskService.documentTask(options.taskId, options.force, {
33
- aiProvider: options.aiProvider,
34
- aiModel: options.aiModel,
35
- aiKey: options.aiKey,
36
- aiProviderUrl: options.aiProviderUrl,
37
- aiReasoning: options.reasoning,
38
- }, streamingOptions);
39
- if (result.documentation && !options.force) {
40
- const daysSinceFetch = (Date.now() - result.documentation.lastFetched) /
41
- (24 * 60 * 60 * 1000);
42
- console.log(chalk_1.default.green(`✓ Documentation is fresh (${Math.round(daysSinceFetch)} days old)`));
43
- console.log(chalk_1.default.cyan(`Recap: ${result.documentation.recap}`));
44
- console.log(chalk_1.default.blue(`Libraries: ${result.documentation.libraries.join(", ")}`));
45
- return;
46
- }
47
- if (result.analysis) {
48
- (0, common_1.displayDocumentationAnalysis)(result.analysis);
49
- }
50
- if (result.documentation?.research) {
51
- (0, common_1.displayResearchSummary)(result.documentation);
52
- }
53
- }
54
- finally {
55
- hooks_1.hooks.off("task:progress", progressHandler);
56
- }
57
- }
58
- catch (error) {
59
- (0, progress_1.displayError)(error);
60
- process.exit(1);
61
- }
62
- });
63
- exports.getDocumentationCommand = new commander_1.Command("get-documentation")
64
- .description("Get existing documentation for a task")
65
- .requiredOption("--id <id>", "Task ID")
66
- .action(async (options) => {
67
- try {
68
- const task = await tasks_1.taskService.getTask(options.id);
69
- if (!task) {
70
- throw new Error(`Task with ID ${options.id} not found`);
71
- }
72
- const documentation = await tasks_1.taskService.getTaskDocumentation(options.id);
73
- if (!documentation) {
74
- console.log(chalk_1.default.yellow(`⚠️ No documentation found for task ${options.id}`));
75
- console.log(chalk_1.default.gray(` Task: ${task.title}`));
76
- return;
77
- }
78
- console.log(chalk_1.default.blue(`\n📖 Documentation for Task: ${task.title} (${options.id})`));
79
- console.log(chalk_1.default.gray(` File: .task-o-matic/docs/tasks/${options.id}.md`));
80
- console.log("");
81
- console.log(documentation);
82
- }
83
- catch (error) {
84
- (0, progress_1.displayError)(error);
85
- process.exit(1);
86
- }
87
- });
88
- exports.addDocumentationCommand = new commander_1.Command("add-documentation")
89
- .description("Add documentation to a task from a file")
90
- .requiredOption("--id <id>", "Task ID")
91
- .requiredOption("--doc-file <path>", "Path to documentation file")
92
- .option("--overwrite", "Overwrite existing documentation")
93
- .action(async (options) => {
94
- try {
95
- const task = await tasks_1.taskService.getTask(options.id);
96
- if (!task) {
97
- throw new Error(`Task with ID ${options.id} not found`);
98
- }
99
- // Check if documentation already exists
100
- const existingDoc = await tasks_1.taskService.getTaskDocumentation(options.id);
101
- if (existingDoc && !options.overwrite) {
102
- console.log(chalk_1.default.yellow(`⚠️ Documentation already exists for task ${options.id}`));
103
- console.log(chalk_1.default.gray(` Use --overwrite to replace existing documentation`));
104
- return;
105
- }
106
- const result = await tasks_1.taskService.addTaskDocumentationFromFile(options.id, options.docFile);
107
- console.log(chalk_1.default.green(`✓ Documentation added to task: ${task.title} (${options.id})`));
108
- console.log(chalk_1.default.gray(` Source file: ${options.docFile}`));
109
- console.log(chalk_1.default.gray(` Saved to: ${result.filePath}`));
110
- if (options.overwrite) {
111
- console.log(chalk_1.default.cyan(` Previous documentation was overwritten`));
112
- }
113
- }
114
- catch (error) {
115
- (0, progress_1.displayError)(error);
116
- process.exit(1);
117
- }
118
- });
@@ -1,7 +0,0 @@
1
- import { Command } from "commander";
2
- export declare const planCommand: Command;
3
- export declare const getPlanCommand: Command;
4
- export declare const listPlanCommand: Command;
5
- export declare const deletePlanCommand: Command;
6
- export declare const setPlanCommand: Command;
7
- //# sourceMappingURL=plan.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/commands/tasks/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,WAAW,SA+CpB,CAAC;AAEL,eAAO,MAAM,cAAc,SA4BvB,CAAC;AAEL,eAAO,MAAM,eAAe,SAsBxB,CAAC;AAEL,eAAO,MAAM,iBAAiB,SAW1B,CAAC;AAEL,eAAO,MAAM,cAAc,SAsCvB,CAAC"}
@@ -1,131 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.setPlanCommand = exports.deletePlanCommand = exports.listPlanCommand = exports.getPlanCommand = exports.planCommand = void 0;
7
- const commander_1 = require("commander");
8
- const chalk_1 = __importDefault(require("chalk"));
9
- const tasks_1 = require("../../services/tasks");
10
- const hooks_1 = require("../../lib/hooks");
11
- const streaming_options_1 = require("../../utils/streaming-options");
12
- const progress_1 = require("../../cli/display/progress");
13
- const plan_1 = require("../../cli/display/plan");
14
- exports.planCommand = new commander_1.Command("plan")
15
- .description("Create detailed implementation plan for a task or subtask")
16
- .requiredOption("--id <id>", "Task or subtask ID to plan")
17
- .option("--stream", "Show streaming AI output during planning")
18
- .option("--ai-provider <provider>", "AI provider override")
19
- .option("--ai-model <model>", "AI model override")
20
- .option("--ai-key <key>", "AI API key override")
21
- .option("--ai-provider-url <url>", "AI provider URL override")
22
- .option("--reasoning <tokens>", "Enable reasoning for OpenRouter models (max reasoning tokens)")
23
- .action(async (options) => {
24
- try {
25
- const streamingOptions = (0, streaming_options_1.createStreamingOptions)(options.stream, "Planning");
26
- const progressHandler = (payload) => {
27
- (0, progress_1.displayProgress)(payload);
28
- };
29
- hooks_1.hooks.on("task:progress", progressHandler);
30
- try {
31
- const result = await tasks_1.taskService.planTask(options.id, {
32
- aiProvider: options.aiProvider,
33
- aiModel: options.aiModel,
34
- aiKey: options.aiKey,
35
- aiProviderUrl: options.aiProviderUrl,
36
- aiReasoning: options.reasoning,
37
- }, streamingOptions);
38
- // Display the plan
39
- (0, plan_1.displayPlanCreation)(options.id, result.task.title);
40
- console.log(chalk_1.default.cyan(result.plan));
41
- }
42
- finally {
43
- hooks_1.hooks.off("task:progress", progressHandler);
44
- }
45
- }
46
- catch (error) {
47
- (0, progress_1.displayError)(error);
48
- process.exit(1);
49
- }
50
- });
51
- exports.getPlanCommand = new commander_1.Command("get-plan")
52
- .description("View existing implementation plan for a task or subtask")
53
- .requiredOption("--id <id>", "Task or subtask ID")
54
- .action(async (options) => {
55
- try {
56
- const plan = await tasks_1.taskService.getTaskPlan(options.id);
57
- if (!plan) {
58
- console.log(chalk_1.default.yellow(`⚠️ No plan found for task/subtask ${options.id}`));
59
- return;
60
- }
61
- const task = await tasks_1.taskService.getTask(options.id);
62
- const taskTitle = task ? task.title : options.id;
63
- (0, plan_1.displayPlanView)(taskTitle, options.id, plan.plan, plan.createdAt, plan.updatedAt);
64
- }
65
- catch (error) {
66
- (0, progress_1.displayError)(error);
67
- process.exit(1);
68
- }
69
- });
70
- exports.listPlanCommand = new commander_1.Command("list-plan")
71
- .description("List all available implementation plans")
72
- .action(async () => {
73
- try {
74
- const plans = await tasks_1.taskService.listTaskPlans();
75
- // Get task titles for each plan
76
- const plansWithTitles = await Promise.all(plans.map(async (plan) => {
77
- const task = await tasks_1.taskService.getTask(plan.taskId);
78
- return {
79
- ...plan,
80
- taskTitle: task ? task.title : plan.taskId,
81
- };
82
- }));
83
- (0, plan_1.displayPlanList)(plansWithTitles);
84
- }
85
- catch (error) {
86
- (0, progress_1.displayError)(error);
87
- process.exit(1);
88
- }
89
- });
90
- exports.deletePlanCommand = new commander_1.Command("delete-plan")
91
- .description("Delete implementation plan for a task")
92
- .requiredOption("--id <id>", "Task ID")
93
- .action(async (options) => {
94
- try {
95
- const success = await tasks_1.taskService.deleteTaskPlan(options.id);
96
- (0, plan_1.displayPlanDeletion)(options.id, success);
97
- }
98
- catch (error) {
99
- (0, progress_1.displayError)(error);
100
- process.exit(1);
101
- }
102
- });
103
- exports.setPlanCommand = new commander_1.Command("set-plan")
104
- .description("Set implementation plan for a task")
105
- .requiredOption("--id <id>", "Task ID")
106
- .option("--plan <text>", "Plan text (use quotes for multi-line)")
107
- .option("--plan-file <path>", "Path to file containing the plan")
108
- .action(async (options) => {
109
- try {
110
- const task = await tasks_1.taskService.getTask(options.id);
111
- if (!task) {
112
- throw new Error(`Task with ID ${options.id} not found`);
113
- }
114
- if (!options.plan && !options.planFile) {
115
- throw new Error("Either --plan or --plan-file must be specified");
116
- }
117
- if (options.plan && options.planFile) {
118
- throw new Error("Cannot specify both --plan and --plan-file");
119
- }
120
- const result = await tasks_1.taskService.setTaskPlan(options.id, options.plan || undefined, options.planFile || undefined);
121
- console.log(chalk_1.default.green(`✓ Plan set for task: ${task.title} (${options.id})`));
122
- console.log(chalk_1.default.gray(` Plan file: ${result.planFile}`));
123
- if (options.planFile) {
124
- console.log(chalk_1.default.gray(` Source file: ${options.planFile}`));
125
- }
126
- }
127
- catch (error) {
128
- (0, progress_1.displayError)(error);
129
- process.exit(1);
130
- }
131
- });