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.
- package/README.md +96 -40
- package/dist/commands/prd.js +4 -0
- package/dist/commands/prompt.d.ts.map +1 -1
- package/dist/commands/prompt.js +69 -61
- package/dist/commands/tasks/create.d.ts +3 -0
- package/dist/commands/tasks/create.d.ts.map +1 -0
- package/dist/commands/tasks/create.js +58 -0
- package/dist/commands/tasks/delete.d.ts +3 -0
- package/dist/commands/tasks/delete.d.ts.map +1 -0
- package/dist/commands/tasks/delete.js +40 -0
- package/dist/commands/tasks/document.d.ts +5 -0
- package/dist/commands/tasks/document.d.ts.map +1 -0
- package/dist/commands/tasks/document.js +118 -0
- package/dist/commands/tasks/enhance.d.ts +3 -0
- package/dist/commands/tasks/enhance.d.ts.map +1 -0
- package/dist/commands/tasks/enhance.js +86 -0
- package/dist/commands/tasks/execute.d.ts +3 -0
- package/dist/commands/tasks/execute.d.ts.map +1 -0
- package/dist/commands/tasks/execute.js +33 -0
- package/dist/commands/tasks/index.d.ts +16 -0
- package/dist/commands/tasks/index.d.ts.map +1 -0
- package/dist/commands/tasks/index.js +31 -0
- package/dist/commands/tasks/list.d.ts +3 -0
- package/dist/commands/tasks/list.d.ts.map +1 -0
- package/dist/commands/tasks/list.js +27 -0
- package/dist/commands/tasks/next.d.ts +3 -0
- package/dist/commands/tasks/next.d.ts.map +1 -0
- package/dist/commands/tasks/next.js +44 -0
- package/dist/commands/tasks/plan.d.ts +7 -0
- package/dist/commands/tasks/plan.d.ts.map +1 -0
- package/dist/commands/tasks/plan.js +131 -0
- package/dist/commands/tasks/show.d.ts +3 -0
- package/dist/commands/tasks/show.d.ts.map +1 -0
- package/dist/commands/tasks/show.js +23 -0
- package/dist/commands/tasks/split.d.ts +3 -0
- package/dist/commands/tasks/split.d.ts.map +1 -0
- package/dist/commands/tasks/split.js +95 -0
- package/dist/commands/tasks/status.d.ts +3 -0
- package/dist/commands/tasks/status.d.ts.map +1 -0
- package/dist/commands/tasks/status.js +26 -0
- package/dist/commands/tasks/subtasks.d.ts +3 -0
- package/dist/commands/tasks/subtasks.d.ts.map +1 -0
- package/dist/commands/tasks/subtasks.js +35 -0
- package/dist/commands/tasks/tags.d.ts +4 -0
- package/dist/commands/tasks/tags.d.ts.map +1 -0
- package/dist/commands/tasks/tags.js +37 -0
- package/dist/commands/tasks/tree.d.ts +3 -0
- package/dist/commands/tasks/tree.d.ts.map +1 -0
- package/dist/commands/tasks/tree.js +20 -0
- package/dist/commands/tasks/update.d.ts +3 -0
- package/dist/commands/tasks/update.d.ts.map +1 -0
- package/dist/commands/tasks/update.js +35 -0
- package/dist/commands/tasks.d.ts.map +1 -1
- package/dist/commands/tasks.js +23 -594
- package/dist/commands/workflow.d.ts +4 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +434 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/lib/ai-service/ai-operations.d.ts +5 -3
- package/dist/lib/ai-service/ai-operations.d.ts.map +1 -1
- package/dist/lib/ai-service/ai-operations.js +231 -30
- package/dist/lib/ai-service/filesystem-tools.d.ts +69 -0
- package/dist/lib/ai-service/filesystem-tools.d.ts.map +1 -0
- package/dist/lib/ai-service/filesystem-tools.js +70 -0
- package/dist/lib/ai-service/research-tools.d.ts.map +1 -1
- package/dist/lib/ai-service/research-tools.js +2 -2
- package/dist/lib/context-builder.d.ts +2 -1
- package/dist/lib/context-builder.d.ts.map +1 -1
- package/dist/lib/context-builder.js +3 -8
- package/dist/lib/executors/claude-code-executor.d.ts +6 -0
- package/dist/lib/executors/claude-code-executor.d.ts.map +1 -0
- package/dist/lib/executors/claude-code-executor.js +41 -0
- package/dist/lib/executors/codex-executor.d.ts +6 -0
- package/dist/lib/executors/codex-executor.d.ts.map +1 -0
- package/dist/lib/executors/codex-executor.js +41 -0
- package/dist/lib/executors/executor-factory.d.ts.map +1 -1
- package/dist/lib/executors/executor-factory.js +6 -3
- package/dist/lib/executors/gemini-executor.d.ts +6 -0
- package/dist/lib/executors/gemini-executor.d.ts.map +1 -0
- package/dist/lib/executors/gemini-executor.js +41 -0
- package/dist/lib/executors/opencode-executor.d.ts.map +1 -1
- package/dist/lib/executors/opencode-executor.js +2 -3
- package/dist/lib/hooks/logger.d.ts +2 -0
- package/dist/lib/hooks/logger.d.ts.map +1 -0
- package/dist/lib/hooks/logger.js +27 -0
- package/dist/lib/hooks.d.ts +64 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/hooks.js +60 -0
- package/dist/lib/index.d.ts +18 -17
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +3 -3
- package/dist/lib/prompt-builder.d.ts +8 -0
- package/dist/lib/prompt-builder.d.ts.map +1 -1
- package/dist/lib/prompt-builder.js +110 -4
- package/dist/lib/{storage.d.ts → storage/file-system.d.ts} +4 -3
- package/dist/lib/storage/file-system.d.ts.map +1 -0
- package/dist/lib/{storage.js → storage/file-system.js} +141 -152
- package/dist/lib/storage/types.d.ts +43 -0
- package/dist/lib/storage/types.d.ts.map +1 -0
- package/dist/lib/storage/types.js +2 -0
- package/dist/lib/task-execution.d.ts.map +1 -1
- package/dist/lib/task-execution.js +63 -14
- package/dist/prompts/workflow-assistance.d.ts +32 -0
- package/dist/prompts/workflow-assistance.d.ts.map +1 -0
- package/dist/prompts/workflow-assistance.js +130 -0
- package/dist/services/prd.d.ts +2 -0
- package/dist/services/prd.d.ts.map +1 -1
- package/dist/services/prd.js +4 -4
- package/dist/services/tasks.d.ts +13 -6
- package/dist/services/tasks.d.ts.map +1 -1
- package/dist/services/tasks.js +202 -88
- package/dist/services/workflow-ai-assistant.d.ts +74 -0
- package/dist/services/workflow-ai-assistant.d.ts.map +1 -0
- package/dist/services/workflow-ai-assistant.js +223 -0
- package/dist/test/hooks.test.d.ts +2 -0
- package/dist/test/hooks.test.d.ts.map +1 -0
- package/dist/test/hooks.test.js +58 -0
- package/dist/test/storage.test.js +16 -16
- package/dist/types/options.d.ts +35 -0
- package/dist/types/options.d.ts.map +1 -1
- package/dist/utils/ai-service-factory.d.ts +5 -5
- package/dist/utils/ai-service-factory.d.ts.map +1 -1
- package/dist/utils/ai-service-factory.js +4 -3
- package/dist/utils/workflow-prompts.d.ts +17 -0
- package/dist/utils/workflow-prompts.d.ts.map +1 -0
- package/dist/utils/workflow-prompts.js +88 -0
- package/package.json +2 -2
- 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;
|
|
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
|
-
|
|
14
|
+
return new claude_code_executor_1.ClaudeCodeExecutor();
|
|
12
15
|
case "gemini":
|
|
13
|
-
|
|
16
|
+
return new gemini_executor_1.GeminiExecutor();
|
|
14
17
|
case "codex":
|
|
15
|
-
|
|
18
|
+
return new codex_executor_1.CodexExecutor();
|
|
16
19
|
default:
|
|
17
20
|
throw new Error(`Unknown executor tool: ${tool}`);
|
|
18
21
|
}
|
|
@@ -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;
|
|
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(
|
|
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 @@
|
|
|
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();
|
package/dist/lib/index.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
33
|
+
export * from "../types";
|
|
34
34
|
/**
|
|
35
35
|
* Re-export callback types
|
|
36
36
|
*/
|
|
37
|
-
export type { ProgressCallback } from
|
|
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
|
|
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
|
|
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
|
|
51
|
-
export type { AIOptions } from
|
|
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 {
|
|
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
|
|
61
|
+
export { ConfigManager, configManager } from "./config";
|
|
61
62
|
/**
|
|
62
63
|
* AIOperations - AI service operations wrapper
|
|
63
64
|
*/
|
|
64
|
-
export { AIOperations } from
|
|
65
|
+
export { AIOperations } from "./ai-service/ai-operations";
|
|
65
66
|
/**
|
|
66
67
|
* ModelProvider - AI model provider abstraction
|
|
67
68
|
*/
|
|
68
|
-
export { ModelProvider } from
|
|
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
|
|
73
|
+
export { ContextBuilder } from "./context-builder";
|
|
73
74
|
/**
|
|
74
75
|
* PromptBuilder - Prompt template management
|
|
75
76
|
*/
|
|
76
|
-
export { PromptBuilder } from
|
|
77
|
+
export { PromptBuilder } from "./prompt-builder";
|
|
77
78
|
/**
|
|
78
79
|
* Stack formatter utility
|
|
79
80
|
*/
|
|
80
|
-
export { formatStackInfo } from
|
|
81
|
+
export { formatStackInfo } from "../utils/stack-formatter";
|
|
81
82
|
/**
|
|
82
83
|
* Streaming options builders
|
|
83
84
|
*/
|
|
84
|
-
export { createStreamingOptions, createStreamingOptionsWithCustomHandlers } from
|
|
85
|
+
export { createStreamingOptions, createStreamingOptionsWithCustomHandlers, } from "../utils/streaming-options";
|
|
85
86
|
/**
|
|
86
87
|
* Validation utilities
|
|
87
88
|
*/
|
|
88
|
-
export { isValidAIProvider, runValidations } from
|
|
89
|
+
export { isValidAIProvider, runValidations } from "./validation";
|
|
89
90
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/lib/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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.
|
|
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
|
|
85
|
-
Object.defineProperty(exports, "
|
|
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;
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 "
|
|
2
|
-
|
|
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=
|
|
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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"}
|