task-o-matic 0.0.2 → 0.0.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.
Files changed (129) hide show
  1. package/README.md +96 -40
  2. package/dist/commands/prd.js +4 -0
  3. package/dist/commands/prompt.d.ts.map +1 -1
  4. package/dist/commands/prompt.js +69 -61
  5. package/dist/commands/tasks/create.d.ts +3 -0
  6. package/dist/commands/tasks/create.d.ts.map +1 -0
  7. package/dist/commands/tasks/create.js +58 -0
  8. package/dist/commands/tasks/delete.d.ts +3 -0
  9. package/dist/commands/tasks/delete.d.ts.map +1 -0
  10. package/dist/commands/tasks/delete.js +40 -0
  11. package/dist/commands/tasks/document.d.ts +5 -0
  12. package/dist/commands/tasks/document.d.ts.map +1 -0
  13. package/dist/commands/tasks/document.js +118 -0
  14. package/dist/commands/tasks/enhance.d.ts +3 -0
  15. package/dist/commands/tasks/enhance.d.ts.map +1 -0
  16. package/dist/commands/tasks/enhance.js +86 -0
  17. package/dist/commands/tasks/execute.d.ts +3 -0
  18. package/dist/commands/tasks/execute.d.ts.map +1 -0
  19. package/dist/commands/tasks/execute.js +33 -0
  20. package/dist/commands/tasks/index.d.ts +16 -0
  21. package/dist/commands/tasks/index.d.ts.map +1 -0
  22. package/dist/commands/tasks/index.js +31 -0
  23. package/dist/commands/tasks/list.d.ts +3 -0
  24. package/dist/commands/tasks/list.d.ts.map +1 -0
  25. package/dist/commands/tasks/list.js +27 -0
  26. package/dist/commands/tasks/next.d.ts +3 -0
  27. package/dist/commands/tasks/next.d.ts.map +1 -0
  28. package/dist/commands/tasks/next.js +44 -0
  29. package/dist/commands/tasks/plan.d.ts +7 -0
  30. package/dist/commands/tasks/plan.d.ts.map +1 -0
  31. package/dist/commands/tasks/plan.js +131 -0
  32. package/dist/commands/tasks/show.d.ts +3 -0
  33. package/dist/commands/tasks/show.d.ts.map +1 -0
  34. package/dist/commands/tasks/show.js +23 -0
  35. package/dist/commands/tasks/split.d.ts +3 -0
  36. package/dist/commands/tasks/split.d.ts.map +1 -0
  37. package/dist/commands/tasks/split.js +95 -0
  38. package/dist/commands/tasks/status.d.ts +3 -0
  39. package/dist/commands/tasks/status.d.ts.map +1 -0
  40. package/dist/commands/tasks/status.js +26 -0
  41. package/dist/commands/tasks/subtasks.d.ts +3 -0
  42. package/dist/commands/tasks/subtasks.d.ts.map +1 -0
  43. package/dist/commands/tasks/subtasks.js +35 -0
  44. package/dist/commands/tasks/tags.d.ts +4 -0
  45. package/dist/commands/tasks/tags.d.ts.map +1 -0
  46. package/dist/commands/tasks/tags.js +37 -0
  47. package/dist/commands/tasks/tree.d.ts +3 -0
  48. package/dist/commands/tasks/tree.d.ts.map +1 -0
  49. package/dist/commands/tasks/tree.js +20 -0
  50. package/dist/commands/tasks/update.d.ts +3 -0
  51. package/dist/commands/tasks/update.d.ts.map +1 -0
  52. package/dist/commands/tasks/update.js +35 -0
  53. package/dist/commands/tasks.d.ts.map +1 -1
  54. package/dist/commands/tasks.js +23 -594
  55. package/dist/commands/workflow.d.ts +4 -0
  56. package/dist/commands/workflow.d.ts.map +1 -0
  57. package/dist/commands/workflow.js +434 -0
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +3 -1
  60. package/dist/lib/ai-service/ai-operations.d.ts +5 -3
  61. package/dist/lib/ai-service/ai-operations.d.ts.map +1 -1
  62. package/dist/lib/ai-service/ai-operations.js +231 -30
  63. package/dist/lib/ai-service/filesystem-tools.d.ts +69 -0
  64. package/dist/lib/ai-service/filesystem-tools.d.ts.map +1 -0
  65. package/dist/lib/ai-service/filesystem-tools.js +70 -0
  66. package/dist/lib/ai-service/research-tools.d.ts.map +1 -1
  67. package/dist/lib/ai-service/research-tools.js +2 -2
  68. package/dist/lib/context-builder.d.ts +2 -1
  69. package/dist/lib/context-builder.d.ts.map +1 -1
  70. package/dist/lib/context-builder.js +3 -8
  71. package/dist/lib/executors/claude-code-executor.d.ts +6 -0
  72. package/dist/lib/executors/claude-code-executor.d.ts.map +1 -0
  73. package/dist/lib/executors/claude-code-executor.js +41 -0
  74. package/dist/lib/executors/codex-executor.d.ts +6 -0
  75. package/dist/lib/executors/codex-executor.d.ts.map +1 -0
  76. package/dist/lib/executors/codex-executor.js +41 -0
  77. package/dist/lib/executors/executor-factory.d.ts.map +1 -1
  78. package/dist/lib/executors/executor-factory.js +6 -3
  79. package/dist/lib/executors/gemini-executor.d.ts +6 -0
  80. package/dist/lib/executors/gemini-executor.d.ts.map +1 -0
  81. package/dist/lib/executors/gemini-executor.js +41 -0
  82. package/dist/lib/executors/opencode-executor.d.ts.map +1 -1
  83. package/dist/lib/executors/opencode-executor.js +2 -3
  84. package/dist/lib/hooks/logger.d.ts +2 -0
  85. package/dist/lib/hooks/logger.d.ts.map +1 -0
  86. package/dist/lib/hooks/logger.js +27 -0
  87. package/dist/lib/hooks.d.ts +64 -0
  88. package/dist/lib/hooks.d.ts.map +1 -0
  89. package/dist/lib/hooks.js +60 -0
  90. package/dist/lib/index.d.ts +18 -17
  91. package/dist/lib/index.d.ts.map +1 -1
  92. package/dist/lib/index.js +3 -3
  93. package/dist/lib/prompt-builder.d.ts +8 -0
  94. package/dist/lib/prompt-builder.d.ts.map +1 -1
  95. package/dist/lib/prompt-builder.js +110 -4
  96. package/dist/lib/{storage.d.ts → storage/file-system.d.ts} +4 -3
  97. package/dist/lib/storage/file-system.d.ts.map +1 -0
  98. package/dist/lib/{storage.js → storage/file-system.js} +141 -152
  99. package/dist/lib/storage/types.d.ts +43 -0
  100. package/dist/lib/storage/types.d.ts.map +1 -0
  101. package/dist/lib/storage/types.js +2 -0
  102. package/dist/lib/task-execution.d.ts.map +1 -1
  103. package/dist/lib/task-execution.js +63 -14
  104. package/dist/prompts/workflow-assistance.d.ts +32 -0
  105. package/dist/prompts/workflow-assistance.d.ts.map +1 -0
  106. package/dist/prompts/workflow-assistance.js +130 -0
  107. package/dist/services/prd.d.ts +2 -0
  108. package/dist/services/prd.d.ts.map +1 -1
  109. package/dist/services/prd.js +4 -4
  110. package/dist/services/tasks.d.ts +13 -6
  111. package/dist/services/tasks.d.ts.map +1 -1
  112. package/dist/services/tasks.js +202 -88
  113. package/dist/services/workflow-ai-assistant.d.ts +74 -0
  114. package/dist/services/workflow-ai-assistant.d.ts.map +1 -0
  115. package/dist/services/workflow-ai-assistant.js +223 -0
  116. package/dist/test/hooks.test.d.ts +2 -0
  117. package/dist/test/hooks.test.d.ts.map +1 -0
  118. package/dist/test/hooks.test.js +58 -0
  119. package/dist/test/storage.test.js +16 -16
  120. package/dist/types/options.d.ts +35 -0
  121. package/dist/types/options.d.ts.map +1 -1
  122. package/dist/utils/ai-service-factory.d.ts +5 -5
  123. package/dist/utils/ai-service-factory.d.ts.map +1 -1
  124. package/dist/utils/ai-service-factory.js +4 -3
  125. package/dist/utils/workflow-prompts.d.ts +17 -0
  126. package/dist/utils/workflow-prompts.d.ts.map +1 -0
  127. package/dist/utils/workflow-prompts.js +88 -0
  128. package/package.json +2 -2
  129. package/dist/lib/storage.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-executor.d.ts","sourceRoot":"","sources":["../../../src/lib/executors/codex-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI/C,qBAAa,aAAc,YAAW,gBAAgB;IACpD,IAAI,SAAW;IAET,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CA+BpE"}
@@ -0,0 +1,41 @@
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.CodexExecutor = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const child_process_1 = require("child_process");
9
+ class CodexExecutor {
10
+ name = "codex";
11
+ async execute(message, dry = false) {
12
+ if (dry) {
13
+ console.log(chalk_1.default.cyan(`🔧 Using executor: ${this.name}`));
14
+ console.log(chalk_1.default.cyan(`codex exec "${message}"`));
15
+ return;
16
+ }
17
+ // Launch codex and wait for it to complete
18
+ const child = (0, child_process_1.spawn)("codex", ["exec", message], {
19
+ stdio: "inherit", // Give tool full terminal control
20
+ });
21
+ // Wait for completion (blocking)
22
+ await new Promise((resolve, reject) => {
23
+ child.on("close", (code) => {
24
+ if (code === 0) {
25
+ console.log("✅ Codex CLI execution completed successfully");
26
+ resolve();
27
+ }
28
+ else {
29
+ const error = new Error(`Codex CLI exited with code ${code}`);
30
+ console.error(`❌ ${error.message}`);
31
+ reject(error);
32
+ }
33
+ });
34
+ child.on("error", (error) => {
35
+ console.error(`❌ Failed to launch Codex CLI: ${error.message}`);
36
+ reject(error);
37
+ });
38
+ });
39
+ }
40
+ }
41
+ exports.CodexExecutor = CodexExecutor;
@@ -1 +1 @@
1
- {"version":3,"file":"executor-factory.d.ts","sourceRoot":"","sources":["../../../src/lib/executors/executor-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG7D,qBAAa,eAAe;IAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,GAAE,YAAyB,GAAG,gBAAgB;CAcjE"}
1
+ {"version":3,"file":"executor-factory.d.ts","sourceRoot":"","sources":["../../../src/lib/executors/executor-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM7D,qBAAa,eAAe;IAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,GAAE,YAAyB,GAAG,gBAAgB;CAcjE"}
@@ -2,17 +2,20 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ExecutorFactory = void 0;
4
4
  const opencode_executor_1 = require("./opencode-executor");
5
+ const claude_code_executor_1 = require("./claude-code-executor");
6
+ const gemini_executor_1 = require("./gemini-executor");
7
+ const codex_executor_1 = require("./codex-executor");
5
8
  class ExecutorFactory {
6
9
  static create(tool = "opencode") {
7
10
  switch (tool) {
8
11
  case "opencode":
9
12
  return new opencode_executor_1.OpencodeExecutor();
10
13
  case "claude":
11
- throw new Error("Claude executor not implemented yet");
14
+ return new claude_code_executor_1.ClaudeCodeExecutor();
12
15
  case "gemini":
13
- throw new Error("Gemini executor not implemented yet");
16
+ return new gemini_executor_1.GeminiExecutor();
14
17
  case "codex":
15
- throw new Error("Codex executor not implemented yet");
18
+ return new codex_executor_1.CodexExecutor();
16
19
  default:
17
20
  throw new Error(`Unknown executor tool: ${tool}`);
18
21
  }
@@ -0,0 +1,6 @@
1
+ import { ExternalExecutor } from "../../types";
2
+ export declare class GeminiExecutor implements ExternalExecutor {
3
+ name: string;
4
+ execute(message: string, dry?: boolean): Promise<void>;
5
+ }
6
+ //# sourceMappingURL=gemini-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-executor.d.ts","sourceRoot":"","sources":["../../../src/lib/executors/gemini-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI/C,qBAAa,cAAe,YAAW,gBAAgB;IACrD,IAAI,SAAY;IAEV,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CA+BpE"}
@@ -0,0 +1,41 @@
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.GeminiExecutor = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const child_process_1 = require("child_process");
9
+ class GeminiExecutor {
10
+ name = "gemini";
11
+ async execute(message, dry = false) {
12
+ if (dry) {
13
+ console.log(chalk_1.default.cyan(`🔧 Using executor: ${this.name}`));
14
+ console.log(chalk_1.default.cyan(`gemini -p "${message}"`));
15
+ return;
16
+ }
17
+ // Launch gemini and wait for it to complete
18
+ const child = (0, child_process_1.spawn)("gemini", ["-p", message], {
19
+ stdio: "inherit", // Give tool full terminal control
20
+ });
21
+ // Wait for completion (blocking)
22
+ await new Promise((resolve, reject) => {
23
+ child.on("close", (code) => {
24
+ if (code === 0) {
25
+ console.log("✅ Gemini CLI execution completed successfully");
26
+ resolve();
27
+ }
28
+ else {
29
+ const error = new Error(`Gemini CLI exited with code ${code}`);
30
+ console.error(`❌ ${error.message}`);
31
+ reject(error);
32
+ }
33
+ });
34
+ child.on("error", (error) => {
35
+ console.error(`❌ Failed to launch Gemini CLI: ${error.message}`);
36
+ reject(error);
37
+ });
38
+ });
39
+ }
40
+ }
41
+ exports.GeminiExecutor = GeminiExecutor;
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-executor.d.ts","sourceRoot":"","sources":["../../../src/lib/executors/opencode-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAIhE,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,IAAI,SAAc;IAEZ,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAsCpE"}
1
+ {"version":3,"file":"opencode-executor.d.ts","sourceRoot":"","sources":["../../../src/lib/executors/opencode-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAIhE,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,IAAI,SAAc;IAEZ,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAmCpE"}
@@ -9,12 +9,11 @@ const child_process_1 = require("child_process");
9
9
  class OpencodeExecutor {
10
10
  name = "opencode";
11
11
  async execute(message, dry = false) {
12
- const command = `opencode run "${message}"`;
13
12
  if (dry) {
14
- console.log(chalk_1.default.cyan(command));
13
+ console.log(chalk_1.default.cyan(`🔧 Using executor: ${this.name}`));
14
+ console.log(chalk_1.default.cyan(`opencode -p "${message}"`));
15
15
  return;
16
16
  }
17
- console.log(`🚀 Launching opencode with message: ${message}`);
18
17
  // Launch opencode and wait for it to complete
19
18
  const child = (0, child_process_1.spawn)("opencode", ["-p", message], {
20
19
  stdio: "inherit", // Give tool full terminal control
@@ -0,0 +1,2 @@
1
+ export declare function registerLoggerHooks(): void;
2
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/lib/hooks/logger.ts"],"names":[],"mappings":"AAGA,wBAAgB,mBAAmB,SA8BlC"}
@@ -0,0 +1,27 @@
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.registerLoggerHooks = registerLoggerHooks;
7
+ const hooks_1 = require("../hooks");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ function registerLoggerHooks() {
10
+ hooks_1.hooks.on("task:created", ({ task }) => {
11
+ console.log(chalk_1.default.gray(`[Hook] Task created: ${task.title} (${task.id})`));
12
+ });
13
+ hooks_1.hooks.on("task:updated", ({ task, changes }) => {
14
+ const changedFields = Object.keys(changes).join(", ");
15
+ console.log(chalk_1.default.gray(`[Hook] Task updated: ${task.id} (Fields: ${changedFields})`));
16
+ });
17
+ hooks_1.hooks.on("task:status-changed", ({ task, oldStatus, newStatus }) => {
18
+ console.log(chalk_1.default.magenta(`[Hook] Status changed: ${task.title} -> ${oldStatus} to ${newStatus}`));
19
+ });
20
+ hooks_1.hooks.on("execution:start", ({ taskId, tool }) => {
21
+ console.log(chalk_1.default.blue(`[Hook] Execution started for ${taskId} using ${tool}`));
22
+ });
23
+ hooks_1.hooks.on("execution:end", ({ taskId, success }) => {
24
+ const status = success ? chalk_1.default.green("Success") : chalk_1.default.red("Failed");
25
+ console.log(chalk_1.default.blue(`[Hook] Execution ended for ${taskId}: ${status}`));
26
+ });
27
+ }
@@ -0,0 +1,64 @@
1
+ import { Task } from "../types";
2
+ export type TaskEventType = "task:created" | "task:updated" | "task:deleted" | "task:status-changed" | "task:progress" | "execution:start" | "execution:end" | "execution:error";
3
+ export interface TaskEventPayloads {
4
+ "task:created": {
5
+ task: Task;
6
+ };
7
+ "task:updated": {
8
+ task: Task;
9
+ changes: Partial<Task>;
10
+ };
11
+ "task:deleted": {
12
+ taskId: string;
13
+ };
14
+ "task:status-changed": {
15
+ task: Task;
16
+ oldStatus: string;
17
+ newStatus: string;
18
+ };
19
+ "task:progress": {
20
+ taskId?: string;
21
+ message: string;
22
+ type?: string;
23
+ };
24
+ "execution:start": {
25
+ taskId: string;
26
+ tool: string;
27
+ };
28
+ "execution:end": {
29
+ taskId: string;
30
+ success: boolean;
31
+ };
32
+ "execution:error": {
33
+ taskId: string;
34
+ error: Error;
35
+ };
36
+ }
37
+ export type TaskEventHandler<T extends TaskEventType> = (payload: TaskEventPayloads[T]) => Promise<void> | void;
38
+ declare class HookRegistry {
39
+ private static instance;
40
+ private listeners;
41
+ private constructor();
42
+ static getInstance(): HookRegistry;
43
+ /**
44
+ * Register a handler for a specific event type
45
+ */
46
+ on<T extends TaskEventType>(type: T, handler: TaskEventHandler<T>): void;
47
+ /**
48
+ * Remove a handler
49
+ */
50
+ off<T extends TaskEventType>(type: T, handler: TaskEventHandler<T>): void;
51
+ /**
52
+ * Emit an event to all registered handlers
53
+ * We don't await handlers to prevent blocking the main flow,
54
+ * but we catch errors to prevent crashes.
55
+ */
56
+ emit<T extends TaskEventType>(type: T, payload: TaskEventPayloads[T]): Promise<void>;
57
+ /**
58
+ * Clear all listeners (useful for testing)
59
+ */
60
+ clear(): void;
61
+ }
62
+ export declare const hooks: HookRegistry;
63
+ export {};
64
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/lib/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGhC,MAAM,MAAM,aAAa,GACrB,cAAc,GACd,cAAc,GACd,cAAc,GACd,qBAAqB,GACrB,eAAe,GACf,iBAAiB,GACjB,eAAe,GACf,iBAAiB,CAAC;AAGtB,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC;IAC/B,cAAc,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IACvD,cAAc,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,qBAAqB,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5E,eAAe,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,iBAAiB,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,eAAe,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACtD,iBAAiB,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC;CACrD;AAGD,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,aAAa,IAAI,CACtD,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAE1B,cAAM,YAAY;IAChB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAe;IACtC,OAAO,CAAC,SAAS,CAAiD;IAElE,OAAO;WAIO,WAAW,IAAI,YAAY;IAOzC;;OAEG;IACI,EAAE,CAAC,CAAC,SAAS,aAAa,EAC/B,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC3B,IAAI;IAOP;;OAEG;IACI,GAAG,CAAC,CAAC,SAAS,aAAa,EAChC,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC3B,IAAI;IAOP;;;;OAIG;IACU,IAAI,CAAC,CAAC,SAAS,aAAa,EACvC,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC;IAehB;;OAEG;IACI,KAAK,IAAI,IAAI;CAGrB;AAED,eAAO,MAAM,KAAK,cAA6B,CAAC"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hooks = void 0;
4
+ class HookRegistry {
5
+ static instance;
6
+ listeners;
7
+ constructor() {
8
+ this.listeners = new Map();
9
+ }
10
+ static getInstance() {
11
+ if (!HookRegistry.instance) {
12
+ HookRegistry.instance = new HookRegistry();
13
+ }
14
+ return HookRegistry.instance;
15
+ }
16
+ /**
17
+ * Register a handler for a specific event type
18
+ */
19
+ on(type, handler) {
20
+ if (!this.listeners.has(type)) {
21
+ this.listeners.set(type, new Set());
22
+ }
23
+ this.listeners.get(type).add(handler);
24
+ }
25
+ /**
26
+ * Remove a handler
27
+ */
28
+ off(type, handler) {
29
+ const handlers = this.listeners.get(type);
30
+ if (handlers) {
31
+ handlers.delete(handler);
32
+ }
33
+ }
34
+ /**
35
+ * Emit an event to all registered handlers
36
+ * We don't await handlers to prevent blocking the main flow,
37
+ * but we catch errors to prevent crashes.
38
+ */
39
+ async emit(type, payload) {
40
+ const handlers = this.listeners.get(type);
41
+ if (!handlers || handlers.size === 0)
42
+ return;
43
+ const promises = Array.from(handlers).map(async (handler) => {
44
+ try {
45
+ await handler(payload);
46
+ }
47
+ catch (error) {
48
+ console.error(`Error in hook handler for event ${type}:`, error);
49
+ }
50
+ });
51
+ await Promise.all(promises);
52
+ }
53
+ /**
54
+ * Clear all listeners (useful for testing)
55
+ */
56
+ clear() {
57
+ this.listeners.clear();
58
+ }
59
+ }
60
+ exports.hooks = HookRegistry.getInstance();
@@ -20,70 +20,71 @@
20
20
  * TaskService - Core task management operations
21
21
  * Handles creating, updating, listing, enhancing, splitting, and planning tasks
22
22
  */
23
- export { TaskService } from '../services/tasks';
23
+ export { TaskService } from "../services/tasks";
24
24
  /**
25
25
  * PRDService - Product Requirements Document parsing and processing
26
26
  * Handles PRD parsing, task extraction, and PRD improvement
27
27
  */
28
- export { PRDService } from '../services/prd';
28
+ export { PRDService } from "../services/prd";
29
29
  /**
30
30
  * Re-export all types from the types module
31
31
  * Includes Task, AIConfig, StreamingOptions, and all related interfaces
32
32
  */
33
- export * from '../types';
33
+ export * from "../types";
34
34
  /**
35
35
  * Re-export callback types
36
36
  */
37
- export type { ProgressCallback } from '../types/callbacks';
37
+ export type { ProgressCallback } from "../types/callbacks";
38
38
  /**
39
39
  * Re-export option types
40
40
  */
41
- export type { CreateTaskOptions, SplitTaskOptions, PlanTaskOptions, EnhanceTaskOptions } from '../types/options';
41
+ export type { CreateTaskOptions, SplitTaskOptions, PlanTaskOptions, EnhanceTaskOptions, } from "../types/options";
42
42
  /**
43
43
  * Factory functions for getting singleton instances of core services
44
44
  * These ensure only one instance exists throughout the application
45
45
  */
46
- export { getAIOperations, getModelProvider, getStorage, getContextBuilder, resetServiceInstances } from '../utils/ai-service-factory';
46
+ export { getAIOperations, getModelProvider, getStorage, getContextBuilder, resetServiceInstances, } from "../utils/ai-service-factory";
47
47
  /**
48
48
  * AI configuration builder utility
49
49
  */
50
- export { buildAIConfig } from '../utils/ai-config-builder';
51
- export type { AIOptions } from '../utils/ai-config-builder';
50
+ export { buildAIConfig } from "../utils/ai-config-builder";
51
+ export type { AIOptions } from "../utils/ai-config-builder";
52
52
  /**
53
53
  * LocalStorage - File-based storage abstraction for tasks and metadata
54
54
  * Note: This is Node.js file-system based and not compatible with browser environments
55
55
  */
56
- export { LocalStorage } from './storage';
56
+ export { FileSystemStorage } from "./storage/file-system";
57
+ export type { TaskRepository } from "./storage/types";
57
58
  /**
58
59
  * ConfigManager - Configuration management for task-o-matic projects
59
60
  */
60
- export { ConfigManager, configManager } from './config';
61
+ export { ConfigManager, configManager } from "./config";
61
62
  /**
62
63
  * AIOperations - AI service operations wrapper
63
64
  */
64
- export { AIOperations } from './ai-service/ai-operations';
65
+ export { AIOperations } from "./ai-service/ai-operations";
65
66
  /**
66
67
  * ModelProvider - AI model provider abstraction
67
68
  */
68
- export { ModelProvider } from './ai-service/model-provider';
69
+ export { ModelProvider } from "./ai-service/model-provider";
69
70
  /**
70
71
  * ContextBuilder - Task context assembly for AI operations
71
72
  */
72
- export { ContextBuilder } from './context-builder';
73
+ export { ContextBuilder } from "./context-builder";
73
74
  /**
74
75
  * PromptBuilder - Prompt template management
75
76
  */
76
- export { PromptBuilder } from './prompt-builder';
77
+ export { PromptBuilder } from "./prompt-builder";
77
78
  /**
78
79
  * Stack formatter utility
79
80
  */
80
- export { formatStackInfo } from '../utils/stack-formatter';
81
+ export { formatStackInfo } from "../utils/stack-formatter";
81
82
  /**
82
83
  * Streaming options builders
83
84
  */
84
- export { createStreamingOptions, createStreamingOptionsWithCustomHandlers } from '../utils/streaming-options';
85
+ export { createStreamingOptions, createStreamingOptionsWithCustomHandlers, } from "../utils/streaming-options";
85
86
  /**
86
87
  * Validation utilities
87
88
  */
88
- export { isValidAIProvider, runValidations } from './validation';
89
+ export { isValidAIProvider, runValidations } from "./validation";
89
90
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAM7C;;;GAGG;AACH,cAAc,UAAU,CAAC;AAEzB;;GAEG;AACH,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;GAEG;AACH,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAMjH;;;GAGG;AACH,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,6BAA6B,CAAC;AAErC;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,YAAY,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAM5D;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAExD;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D;;GAEG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMjD;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D;;GAEG;AACH,OAAO,EAAE,sBAAsB,EAAE,wCAAwC,EAAE,MAAM,4BAA4B,CAAC;AAM9G;;GAEG;AACH,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAM7C;;;GAGG;AACH,cAAc,UAAU,CAAC;AAEzB;;GAEG;AACH,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;GAEG;AACH,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAM1B;;;GAGG;AACH,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,6BAA6B,CAAC;AAErC;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,YAAY,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAM5D;;;GAGG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAExD;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D;;GAEG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAMjD;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D;;GAEG;AACH,OAAO,EACL,sBAAsB,EACtB,wCAAwC,GACzC,MAAM,4BAA4B,CAAC;AAMpC;;GAEG;AACH,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
package/dist/lib/index.js CHANGED
@@ -32,7 +32,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
32
32
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
33
33
  };
34
34
  Object.defineProperty(exports, "__esModule", { value: true });
35
- exports.runValidations = exports.isValidAIProvider = exports.createStreamingOptionsWithCustomHandlers = exports.createStreamingOptions = exports.formatStackInfo = exports.PromptBuilder = exports.ContextBuilder = exports.ModelProvider = exports.AIOperations = exports.configManager = exports.ConfigManager = exports.LocalStorage = exports.buildAIConfig = exports.resetServiceInstances = exports.getContextBuilder = exports.getStorage = exports.getModelProvider = exports.getAIOperations = exports.PRDService = exports.TaskService = void 0;
35
+ exports.runValidations = exports.isValidAIProvider = exports.createStreamingOptionsWithCustomHandlers = exports.createStreamingOptions = exports.formatStackInfo = exports.PromptBuilder = exports.ContextBuilder = exports.ModelProvider = exports.AIOperations = exports.configManager = exports.ConfigManager = exports.FileSystemStorage = exports.buildAIConfig = exports.resetServiceInstances = exports.getContextBuilder = exports.getStorage = exports.getModelProvider = exports.getAIOperations = exports.PRDService = exports.TaskService = void 0;
36
36
  // ============================================================================
37
37
  // Main Services - Business Logic Layer
38
38
  // ============================================================================
@@ -81,8 +81,8 @@ Object.defineProperty(exports, "buildAIConfig", { enumerable: true, get: functio
81
81
  * LocalStorage - File-based storage abstraction for tasks and metadata
82
82
  * Note: This is Node.js file-system based and not compatible with browser environments
83
83
  */
84
- var storage_1 = require("./storage");
85
- Object.defineProperty(exports, "LocalStorage", { enumerable: true, get: function () { return storage_1.LocalStorage; } });
84
+ var file_system_1 = require("./storage/file-system");
85
+ Object.defineProperty(exports, "FileSystemStorage", { enumerable: true, get: function () { return file_system_1.FileSystemStorage; } });
86
86
  /**
87
87
  * ConfigManager - Configuration management for task-o-matic projects
88
88
  */
@@ -46,5 +46,13 @@ export declare class PromptBuilder {
46
46
  * Detect stack info using ContextBuilder (proper BTS config loading)
47
47
  */
48
48
  static detectStackInfo(projectPath?: string): Promise<string>;
49
+ /**
50
+ * Build comprehensive project context for external executors
51
+ */
52
+ static buildFullProjectContext(projectPath: string): Promise<string>;
53
+ /**
54
+ * Format prompt for specific executor
55
+ */
56
+ static formatForExecutor(prompt: string, executor: "opencode" | "claude" | "gemini" | "codex"): string;
49
57
  }
50
58
  //# sourceMappingURL=prompt-builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/lib/prompt-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKnE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,qBAAa,aAAa;IACxB;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB;IAyEtE;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,MAAM;IAI5B;;OAEG;IACH,MAAM,CAAC,iBAAiB,CACtB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,GACvB,cAAc,GAAG,IAAI;IAKxB;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAO/C;;OAEG;WACU,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAiBhE;;OAEG;WACU,gBAAgB,CAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC;IAmClB;;OAEG;WACU,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAsCpE"}
1
+ {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/lib/prompt-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOnE,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,qBAAa,aAAa;IACxB;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB;IAiFtE;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,MAAM;IAI5B;;OAEG;IACH,MAAM,CAAC,iBAAiB,CACtB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,GACvB,cAAc,GAAG,IAAI;IAKxB;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAO/C;;OAEG;WACU,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAiBhE;;OAEG;WACU,gBAAgB,CAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC;IAmClB;;OAEG;WACU,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuCnE;;OAEG;WACU,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4G1E;;OAEG;IACH,MAAM,CAAC,iBAAiB,CACtB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GACnD,MAAM;CAmBV"}
@@ -4,7 +4,8 @@ exports.PromptBuilder = void 0;
4
4
  const prompt_registry_1 = require("./prompt-registry");
5
5
  const fs_1 = require("fs");
6
6
  const config_1 = require("./config");
7
- const context_builder_1 = require("./context-builder");
7
+ const ai_service_factory_1 = require("../utils/ai-service-factory");
8
+ const path_1 = require("path");
8
9
  class PromptBuilder {
9
10
  /**
10
11
  * Build a prompt with variable replacement
@@ -93,7 +94,7 @@ class PromptBuilder {
93
94
  */
94
95
  static async autoDetectPRDContent() {
95
96
  try {
96
- const contextBuilder = new context_builder_1.ContextBuilder();
97
+ const contextBuilder = (0, ai_service_factory_1.getContextBuilder)();
97
98
  // Build context for a dummy task to get PRD content
98
99
  const context = await contextBuilder.buildContextForNewTask("Dummy Task", "For PRD detection");
99
100
  return context.prdContent;
@@ -120,7 +121,7 @@ class PromptBuilder {
120
121
  // Use ContextBuilder to get rich context if we have a title
121
122
  if (taskTitle) {
122
123
  try {
123
- const contextBuilder = new context_builder_1.ContextBuilder();
124
+ const contextBuilder = (0, ai_service_factory_1.getContextBuilder)();
124
125
  const context = await contextBuilder.buildContextForNewTask(taskTitle, taskDescription);
125
126
  // Return formatted context instead of just description
126
127
  return contextBuilder.formatContextForAI(context);
@@ -140,7 +141,7 @@ class PromptBuilder {
140
141
  // Default to current working directory if not provided
141
142
  const workDir = projectPath || process.cwd();
142
143
  config_1.configManager.setWorkingDirectory(workDir);
143
- const contextBuilder = new context_builder_1.ContextBuilder();
144
+ const contextBuilder = (0, ai_service_factory_1.getContextBuilder)();
144
145
  // Build context for a dummy task to get stack info
145
146
  const context = await contextBuilder.buildContextForNewTask("Dummy Task", "For stack detection");
146
147
  if (context.stack && context.stack._source === "file") {
@@ -167,5 +168,110 @@ class PromptBuilder {
167
168
  return "Not detected";
168
169
  }
169
170
  }
171
+ /**
172
+ * Build comprehensive project context for external executors
173
+ */
174
+ static async buildFullProjectContext(projectPath) {
175
+ const contextParts = [];
176
+ contextParts.push("**Project Context:**");
177
+ // Detect package.json and dependencies
178
+ const packageJsonPath = (0, path_1.join)(projectPath, "package.json");
179
+ if ((0, fs_1.existsSync)(packageJsonPath)) {
180
+ try {
181
+ const packageJson = JSON.parse((0, fs_1.readFileSync)(packageJsonPath, "utf-8"));
182
+ const deps = Object.keys(packageJson.dependencies || {});
183
+ const devDeps = Object.keys(packageJson.devDependencies || {});
184
+ contextParts.push(`\n**Dependencies:**`);
185
+ if (deps.length > 0) {
186
+ contextParts.push(`- Production: ${deps.slice(0, 10).join(", ")}${deps.length > 10 ? ` (+${deps.length - 10} more)` : ""}`);
187
+ }
188
+ if (devDeps.length > 0) {
189
+ contextParts.push(`- Development: ${devDeps.slice(0, 10).join(", ")}${devDeps.length > 10 ? ` (+${devDeps.length - 10} more)` : ""}`);
190
+ }
191
+ if (packageJson.scripts) {
192
+ const scripts = Object.keys(packageJson.scripts);
193
+ contextParts.push(`\n**Available Scripts:** ${scripts.join(", ")}`);
194
+ }
195
+ }
196
+ catch (error) {
197
+ console.warn("Could not parse package.json:", error);
198
+ }
199
+ }
200
+ // Detect project structure
201
+ try {
202
+ const files = (0, fs_1.readdirSync)(projectPath);
203
+ const directories = files.filter((f) => {
204
+ try {
205
+ const stat = (0, fs_1.statSync)((0, path_1.join)(projectPath, f));
206
+ return stat.isDirectory() && !f.startsWith(".");
207
+ }
208
+ catch {
209
+ return false;
210
+ }
211
+ });
212
+ if (directories.length > 0) {
213
+ contextParts.push(`\n**Project Structure:** ${directories.join(", ")}`);
214
+ }
215
+ // Detect configuration files
216
+ const configFiles = files.filter((f) => f.match(/\.(config|rc)\.(js|ts|json|yaml|yml)$/) ||
217
+ [
218
+ "tsconfig.json",
219
+ "next.config.js",
220
+ "vite.config.ts",
221
+ "tailwind.config.js",
222
+ ].includes(f));
223
+ if (configFiles.length > 0) {
224
+ contextParts.push(`\n**Configuration Files:** ${configFiles.join(", ")}`);
225
+ }
226
+ }
227
+ catch (error) {
228
+ console.warn("Could not read project structure:", error);
229
+ }
230
+ // Detect frameworks and tools
231
+ const detectedTools = [];
232
+ if ((0, fs_1.existsSync)((0, path_1.join)(projectPath, "next.config.js")) ||
233
+ (0, fs_1.existsSync)((0, path_1.join)(projectPath, "next.config.ts"))) {
234
+ detectedTools.push("Next.js");
235
+ }
236
+ if ((0, fs_1.existsSync)((0, path_1.join)(projectPath, "vite.config.ts")) ||
237
+ (0, fs_1.existsSync)((0, path_1.join)(projectPath, "vite.config.js"))) {
238
+ detectedTools.push("Vite");
239
+ }
240
+ if ((0, fs_1.existsSync)((0, path_1.join)(projectPath, "tailwind.config.js")) ||
241
+ (0, fs_1.existsSync)((0, path_1.join)(projectPath, "tailwind.config.ts"))) {
242
+ detectedTools.push("Tailwind CSS");
243
+ }
244
+ if ((0, fs_1.existsSync)((0, path_1.join)(projectPath, "convex"))) {
245
+ detectedTools.push("Convex");
246
+ }
247
+ if ((0, fs_1.existsSync)((0, path_1.join)(projectPath, "turbo.json"))) {
248
+ detectedTools.push("Turborepo");
249
+ }
250
+ if (detectedTools.length > 0) {
251
+ contextParts.push(`\n**Detected Tools:** ${detectedTools.join(", ")}`);
252
+ }
253
+ return contextParts.join("\n");
254
+ }
255
+ /**
256
+ * Format prompt for specific executor
257
+ */
258
+ static formatForExecutor(prompt, executor) {
259
+ // Most executors work well with plain text prompts
260
+ // This method exists for future customization if needed
261
+ switch (executor) {
262
+ case "claude":
263
+ // Claude Code works well with structured markdown
264
+ return prompt;
265
+ case "gemini":
266
+ // Gemini CLI supports file references with @
267
+ return prompt;
268
+ case "codex":
269
+ // Codex CLI supports structured prompts
270
+ return prompt;
271
+ case "opencode":
272
+ default:
273
+ return prompt;
274
+ }
275
+ }
170
276
  }
171
277
  exports.PromptBuilder = PromptBuilder;
@@ -1,5 +1,6 @@
1
- import { Task, CreateTaskRequest, TaskAIMetadata } from "../types";
2
- export declare class LocalStorage {
1
+ import { Task, CreateTaskRequest, TaskAIMetadata } from "../../types";
2
+ import { TaskRepository } from "./types";
3
+ export declare class FileSystemStorage implements TaskRepository {
3
4
  private taskOMatic;
4
5
  private tasksFile;
5
6
  private initialized;
@@ -57,4 +58,4 @@ export declare class LocalStorage {
57
58
  saveTaskDocumentation(taskId: string, documentation: string): Promise<string>;
58
59
  getTaskDocumentation(taskId: string): Promise<string | null>;
59
60
  }
60
- //# sourceMappingURL=storage.d.ts.map
61
+ //# sourceMappingURL=file-system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-system.d.ts","sourceRoot":"","sources":["../../../src/lib/storage/file-system.ts"],"names":[],"mappings":"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"}