task-o-matic 0.0.13 ā 0.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/init.js +41 -8
- package/dist/commands/tasks/document/add.js +3 -3
- package/dist/commands/tasks/list.js +2 -2
- package/dist/commands/tasks/next.js +4 -4
- package/dist/commands/tasks/status.js +2 -2
- package/dist/lib/ai-service/ai-operations.d.ts +1 -1
- package/dist/lib/ai-service/ai-operations.d.ts.map +1 -1
- package/dist/lib/ai-service/base-operations.d.ts +22 -0
- package/dist/lib/ai-service/base-operations.d.ts.map +1 -1
- package/dist/lib/ai-service/base-operations.js +29 -1
- package/dist/lib/ai-service/task-operations.d.ts +1 -1
- package/dist/lib/ai-service/task-operations.d.ts.map +1 -1
- package/dist/lib/better-t-stack-cli.d.ts +36 -21
- package/dist/lib/better-t-stack-cli.d.ts.map +1 -1
- package/dist/lib/better-t-stack-cli.js +212 -33
- package/dist/lib/bootstrap/cli-bootstrap.d.ts +14 -0
- package/dist/lib/bootstrap/cli-bootstrap.d.ts.map +1 -0
- package/dist/lib/bootstrap/cli-bootstrap.js +325 -0
- package/dist/lib/bootstrap/index.d.ts +4 -0
- package/dist/lib/bootstrap/index.d.ts.map +1 -0
- package/dist/lib/bootstrap/index.js +19 -0
- package/dist/lib/bootstrap/medusa-bootstrap.d.ts +14 -0
- package/dist/lib/bootstrap/medusa-bootstrap.d.ts.map +1 -0
- package/dist/lib/bootstrap/medusa-bootstrap.js +218 -0
- package/dist/lib/bootstrap/opentui-bootstrap.d.ts +11 -0
- package/dist/lib/bootstrap/opentui-bootstrap.d.ts.map +1 -0
- package/dist/lib/bootstrap/opentui-bootstrap.js +342 -0
- package/dist/lib/config.d.ts +14 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +18 -0
- package/dist/services/prd.d.ts.map +1 -1
- package/dist/services/prd.js +18 -45
- package/dist/services/tasks.d.ts +2 -2
- package/dist/services/tasks.d.ts.map +1 -1
- package/dist/services/tasks.js +55 -85
- package/dist/types/index.d.ts +36 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/results.d.ts +60 -6
- package/dist/types/results.d.ts.map +1 -1
- package/dist/utils/error-utils.d.ts +70 -0
- package/dist/utils/error-utils.d.ts.map +1 -0
- package/dist/utils/error-utils.js +103 -0
- package/dist/utils/file-utils.d.ts +49 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +77 -0
- package/dist/utils/id-generator.d.ts +92 -0
- package/dist/utils/id-generator.d.ts.map +1 -0
- package/dist/utils/id-generator.js +140 -0
- package/dist/utils/stack-formatter.d.ts +2 -1
- package/dist/utils/stack-formatter.d.ts.map +1 -1
- package/dist/utils/stack-formatter.js +8 -2
- package/dist/utils/storage-utils.d.ts +49 -0
- package/dist/utils/storage-utils.d.ts.map +1 -0
- package/dist/utils/storage-utils.js +79 -0
- package/dist/utils/streaming-utils.d.ts +38 -0
- package/dist/utils/streaming-utils.d.ts.map +1 -0
- package/dist/utils/streaming-utils.js +56 -0
- package/docs/agents/cli.md +58 -149
- package/package.json +1 -1
|
@@ -0,0 +1,342 @@
|
|
|
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.bootstrapOpenTuiProject = bootstrapOpenTuiProject;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const child_process_1 = require("child_process");
|
|
11
|
+
const util_1 = require("util");
|
|
12
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
13
|
+
async function bootstrapOpenTuiProject(options) {
|
|
14
|
+
try {
|
|
15
|
+
console.log(chalk_1.default.blue(`\nš Bootstrapping OpenTUI project: ${options.projectName}`));
|
|
16
|
+
// Warn if not using Bun
|
|
17
|
+
if (options.packageManager !== "bun") {
|
|
18
|
+
console.log(chalk_1.default.yellow(` ā ļø OpenTUI works best with Bun. Consider using --package-manager bun`));
|
|
19
|
+
}
|
|
20
|
+
// Create project directory
|
|
21
|
+
if (!(0, fs_1.existsSync)(options.projectPath)) {
|
|
22
|
+
(0, fs_1.mkdirSync)(options.projectPath, { recursive: true });
|
|
23
|
+
console.log(chalk_1.default.green(` ā Created project directory`));
|
|
24
|
+
}
|
|
25
|
+
// Create directory structure
|
|
26
|
+
const dirs = ["src", "src/components"];
|
|
27
|
+
dirs.forEach(dir => {
|
|
28
|
+
const fullPath = (0, path_1.join)(options.projectPath, dir);
|
|
29
|
+
(0, fs_1.mkdirSync)(fullPath, { recursive: true });
|
|
30
|
+
});
|
|
31
|
+
console.log(chalk_1.default.green(` ā Created directory structure`));
|
|
32
|
+
// Generate files
|
|
33
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(options.projectPath, "package.json"), generatePackageJson(options));
|
|
34
|
+
console.log(chalk_1.default.green(` ā Created package.json`));
|
|
35
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(options.projectPath, "tsconfig.json"), generateTsConfig());
|
|
36
|
+
console.log(chalk_1.default.green(` ā Created tsconfig.json`));
|
|
37
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(options.projectPath, "build.ts"), generateBuildScriptTemplate(options.framework));
|
|
38
|
+
console.log(chalk_1.default.green(` ā Created build.ts`));
|
|
39
|
+
// Generate framework-specific files
|
|
40
|
+
const extension = options.framework === "vue" ? "vue" : "tsx";
|
|
41
|
+
const indexContent = getFrameworkIndexTemplate(options.framework);
|
|
42
|
+
const appContent = getFrameworkAppTemplate(options.framework);
|
|
43
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(options.projectPath, "src/index.ts"), indexContent);
|
|
44
|
+
console.log(chalk_1.default.green(` ā Created src/index.ts`));
|
|
45
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(options.projectPath, `src/App.${extension}`), appContent);
|
|
46
|
+
console.log(chalk_1.default.green(` ā Created src/App.${extension}`));
|
|
47
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(options.projectPath, "README.md"), generateReadmeTemplate(options));
|
|
48
|
+
console.log(chalk_1.default.green(` ā Created README.md`));
|
|
49
|
+
(0, fs_1.writeFileSync)((0, path_1.join)(options.projectPath, ".gitignore"), generateGitignoreTemplate());
|
|
50
|
+
console.log(chalk_1.default.green(` ā Created .gitignore`));
|
|
51
|
+
// Install dependencies
|
|
52
|
+
console.log(chalk_1.default.cyan(`\n š¦ Installing dependencies with ${options.packageManager}...`));
|
|
53
|
+
const installCmd = options.packageManager === "npm" ? "npm install" :
|
|
54
|
+
options.packageManager === "pnpm" ? "pnpm install" :
|
|
55
|
+
"bun install";
|
|
56
|
+
await execAsync(installCmd, { cwd: options.projectPath });
|
|
57
|
+
console.log(chalk_1.default.green(` ā Dependencies installed`));
|
|
58
|
+
return {
|
|
59
|
+
success: true,
|
|
60
|
+
message: `OpenTUI project "${options.projectName}" created successfully!`
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
65
|
+
return {
|
|
66
|
+
success: false,
|
|
67
|
+
message: `Failed to bootstrap OpenTUI project: ${message}`
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function generatePackageJson(options) {
|
|
72
|
+
const frameworkDeps = getFrameworkDependencies(options.framework);
|
|
73
|
+
const frameworkDevDeps = getFrameworkDevDependencies(options.framework);
|
|
74
|
+
const pkg = {
|
|
75
|
+
name: options.projectName,
|
|
76
|
+
version: "0.1.0",
|
|
77
|
+
type: "module",
|
|
78
|
+
scripts: {
|
|
79
|
+
build: "bun run build.ts",
|
|
80
|
+
dev: "bun run --watch src/index.ts",
|
|
81
|
+
start: "bun run dist/index.js"
|
|
82
|
+
},
|
|
83
|
+
dependencies: {
|
|
84
|
+
"@opentui/core": "latest",
|
|
85
|
+
...frameworkDeps
|
|
86
|
+
},
|
|
87
|
+
devDependencies: {
|
|
88
|
+
typescript: "latest",
|
|
89
|
+
"@types/node": "latest",
|
|
90
|
+
...frameworkDevDeps
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
return JSON.stringify(pkg, null, 2);
|
|
94
|
+
}
|
|
95
|
+
function getFrameworkDependencies(framework) {
|
|
96
|
+
const deps = {
|
|
97
|
+
solid: {
|
|
98
|
+
"@opentui/solid": "latest",
|
|
99
|
+
"solid-js": "latest"
|
|
100
|
+
},
|
|
101
|
+
vue: {
|
|
102
|
+
"@opentui/vue": "latest",
|
|
103
|
+
vue: "latest"
|
|
104
|
+
},
|
|
105
|
+
react: {
|
|
106
|
+
"@opentui/react": "latest",
|
|
107
|
+
react: "latest"
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
return deps[framework];
|
|
111
|
+
}
|
|
112
|
+
function getFrameworkDevDependencies(framework) {
|
|
113
|
+
const devDeps = {
|
|
114
|
+
solid: {
|
|
115
|
+
"bun-plugin-solid": "latest"
|
|
116
|
+
},
|
|
117
|
+
vue: {
|
|
118
|
+
"bun-plugin-vue3": "latest"
|
|
119
|
+
},
|
|
120
|
+
react: {}
|
|
121
|
+
};
|
|
122
|
+
return devDeps[framework];
|
|
123
|
+
}
|
|
124
|
+
function generateTsConfig() {
|
|
125
|
+
const config = {
|
|
126
|
+
compilerOptions: {
|
|
127
|
+
target: "ES2022",
|
|
128
|
+
module: "ESNext",
|
|
129
|
+
moduleResolution: "bundler",
|
|
130
|
+
strict: true,
|
|
131
|
+
esModuleInterop: true,
|
|
132
|
+
skipLibCheck: true,
|
|
133
|
+
jsx: "preserve",
|
|
134
|
+
jsxImportSource: "solid-js",
|
|
135
|
+
types: ["bun-types"]
|
|
136
|
+
},
|
|
137
|
+
include: ["src/**/*", "build.ts"],
|
|
138
|
+
exclude: ["node_modules", "dist"]
|
|
139
|
+
};
|
|
140
|
+
return JSON.stringify(config, null, 2);
|
|
141
|
+
}
|
|
142
|
+
function generateBuildScriptTemplate(framework) {
|
|
143
|
+
const plugins = {
|
|
144
|
+
solid: `import { pluginSolid } from "bun-plugin-solid";`,
|
|
145
|
+
vue: `import { pluginVue3 } from "bun-plugin-vue3";`,
|
|
146
|
+
react: ``
|
|
147
|
+
};
|
|
148
|
+
const pluginArray = {
|
|
149
|
+
solid: `plugins: [pluginSolid()]`,
|
|
150
|
+
vue: `plugins: [pluginVue3()]`,
|
|
151
|
+
react: `plugins: []`
|
|
152
|
+
};
|
|
153
|
+
return `${plugins[framework] ? plugins[framework] + "\n\n" : ""}const result = await Bun.build({
|
|
154
|
+
entrypoints: ["./src/index.ts"],
|
|
155
|
+
outdir: "./dist",
|
|
156
|
+
target: "bun",
|
|
157
|
+
${pluginArray[framework]},
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
if (!result.success) {
|
|
161
|
+
console.error("Build failed");
|
|
162
|
+
for (const message of result.logs) {
|
|
163
|
+
console.error(message);
|
|
164
|
+
}
|
|
165
|
+
process.exit(1);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
console.log("Build successful!");
|
|
169
|
+
`;
|
|
170
|
+
}
|
|
171
|
+
function getFrameworkIndexTemplate(framework) {
|
|
172
|
+
const templates = {
|
|
173
|
+
solid: `import { createCliRenderer } from "@opentui/core";
|
|
174
|
+
import { createRoot } from "@opentui/solid";
|
|
175
|
+
import { App } from "./App";
|
|
176
|
+
|
|
177
|
+
const renderer = await createCliRenderer({
|
|
178
|
+
exitOnCtrlC: true,
|
|
179
|
+
targetFps: 60,
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
renderer.start();
|
|
183
|
+
createRoot(renderer).render(() => <App />);
|
|
184
|
+
`,
|
|
185
|
+
vue: `import { createCliRenderer } from "@opentui/core";
|
|
186
|
+
import { createRoot } from "@opentui/vue";
|
|
187
|
+
import App from "./App.vue";
|
|
188
|
+
|
|
189
|
+
const renderer = await createCliRenderer({
|
|
190
|
+
exitOnCtrlC: true,
|
|
191
|
+
targetFps: 60,
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
renderer.start();
|
|
195
|
+
createRoot(renderer).render(App);
|
|
196
|
+
`,
|
|
197
|
+
react: `import { createCliRenderer } from "@opentui/core";
|
|
198
|
+
import { createRoot } from "@opentui/react";
|
|
199
|
+
import { App } from "./App";
|
|
200
|
+
|
|
201
|
+
const renderer = await createCliRenderer({
|
|
202
|
+
exitOnCtrlC: true,
|
|
203
|
+
targetFps: 60,
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
renderer.start();
|
|
207
|
+
createRoot(renderer).render(<App />);
|
|
208
|
+
`
|
|
209
|
+
};
|
|
210
|
+
return templates[framework];
|
|
211
|
+
}
|
|
212
|
+
function getFrameworkAppTemplate(framework) {
|
|
213
|
+
const templates = {
|
|
214
|
+
solid: `import { TextRenderable } from "@opentui/core";
|
|
215
|
+
|
|
216
|
+
export function App() {
|
|
217
|
+
return (
|
|
218
|
+
<TextRenderable
|
|
219
|
+
content="Hello from OpenTUI with Solid!"
|
|
220
|
+
fg="#00FF00"
|
|
221
|
+
position="absolute"
|
|
222
|
+
left={10}
|
|
223
|
+
top={5}
|
|
224
|
+
/>
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
`,
|
|
228
|
+
vue: `<script setup lang="ts">
|
|
229
|
+
</script>
|
|
230
|
+
|
|
231
|
+
<template>
|
|
232
|
+
<textRenderable
|
|
233
|
+
content="Hello from OpenTUI with Vue!"
|
|
234
|
+
:style="{ fg: '#00FF00', position: 'absolute', left: 10, top: 5 }"
|
|
235
|
+
/>
|
|
236
|
+
</template>
|
|
237
|
+
`,
|
|
238
|
+
react: `import { TextRenderable } from "@opentui/core";
|
|
239
|
+
|
|
240
|
+
export function App() {
|
|
241
|
+
return (
|
|
242
|
+
<TextRenderable
|
|
243
|
+
content="Hello from OpenTUI with React!"
|
|
244
|
+
fg="#00FF00"
|
|
245
|
+
position="absolute"
|
|
246
|
+
left={10}
|
|
247
|
+
top={5}
|
|
248
|
+
/>
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
`
|
|
252
|
+
};
|
|
253
|
+
return templates[framework];
|
|
254
|
+
}
|
|
255
|
+
function generateReadmeTemplate(options) {
|
|
256
|
+
return `# ${options.projectName}
|
|
257
|
+
|
|
258
|
+
Terminal User Interface (TUI) application built with OpenTUI and ${options.framework === "solid" ? "Solid.js" : options.framework === "vue" ? "Vue.js" : "React"}
|
|
259
|
+
|
|
260
|
+
Generated by task-o-matic
|
|
261
|
+
|
|
262
|
+
## Installation
|
|
263
|
+
|
|
264
|
+
\`\`\`bash
|
|
265
|
+
${options.packageManager} install
|
|
266
|
+
\`\`\`
|
|
267
|
+
|
|
268
|
+
## Development
|
|
269
|
+
|
|
270
|
+
\`\`\`bash
|
|
271
|
+
# Run in development mode with watch
|
|
272
|
+
${options.packageManager} run dev
|
|
273
|
+
|
|
274
|
+
# Build the project
|
|
275
|
+
${options.packageManager} run build
|
|
276
|
+
|
|
277
|
+
# Run the built TUI app
|
|
278
|
+
${options.packageManager} start
|
|
279
|
+
\`\`\`
|
|
280
|
+
|
|
281
|
+
## Project Structure
|
|
282
|
+
|
|
283
|
+
- \`src/index.ts\` - Application entry point
|
|
284
|
+
- \`src/App.${options.framework === "vue" ? "vue" : "tsx"}\` - Main TUI component
|
|
285
|
+
- \`src/components/\` - Reusable TUI components
|
|
286
|
+
- \`build.ts\` - Bun build configuration
|
|
287
|
+
|
|
288
|
+
## Technologies
|
|
289
|
+
|
|
290
|
+
- **OpenTUI** - Terminal UI framework
|
|
291
|
+
- **${options.framework === "solid" ? "Solid.js" : options.framework === "vue" ? "Vue.js" : "React"}** - Component framework
|
|
292
|
+
- **TypeScript** - Type-safe development
|
|
293
|
+
- **Bun** - Fast JavaScript runtime and bundler
|
|
294
|
+
|
|
295
|
+
## Controls
|
|
296
|
+
|
|
297
|
+
- \`Ctrl+C\` - Exit the application
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
Generated with [task-o-matic](https://github.com/anthropics/task-o-matic)
|
|
302
|
+
`;
|
|
303
|
+
}
|
|
304
|
+
function generateGitignoreTemplate() {
|
|
305
|
+
return `# Dependencies
|
|
306
|
+
node_modules/
|
|
307
|
+
.pnp
|
|
308
|
+
.pnp.js
|
|
309
|
+
|
|
310
|
+
# Testing
|
|
311
|
+
coverage/
|
|
312
|
+
|
|
313
|
+
# Production
|
|
314
|
+
dist/
|
|
315
|
+
build/
|
|
316
|
+
|
|
317
|
+
# Misc
|
|
318
|
+
.DS_Store
|
|
319
|
+
.env
|
|
320
|
+
.env.local
|
|
321
|
+
.env.development.local
|
|
322
|
+
.env.test.local
|
|
323
|
+
.env.production.local
|
|
324
|
+
|
|
325
|
+
# Logs
|
|
326
|
+
npm-debug.log*
|
|
327
|
+
yarn-debug.log*
|
|
328
|
+
yarn-error.log*
|
|
329
|
+
lerna-debug.log*
|
|
330
|
+
bun-debug.log*
|
|
331
|
+
|
|
332
|
+
# IDEs
|
|
333
|
+
.idea/
|
|
334
|
+
.vscode/
|
|
335
|
+
*.swp
|
|
336
|
+
*.swo
|
|
337
|
+
*~
|
|
338
|
+
|
|
339
|
+
# TypeScript
|
|
340
|
+
*.tsbuildinfo
|
|
341
|
+
`;
|
|
342
|
+
}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -28,4 +28,18 @@ export declare class ConfigManager {
|
|
|
28
28
|
getConfigFilePath(): string;
|
|
29
29
|
}
|
|
30
30
|
export declare const configManager: ConfigManager;
|
|
31
|
+
/**
|
|
32
|
+
* Helper function to set working directory and reload config.
|
|
33
|
+
* Combines the common pattern of setWorkingDirectory + load.
|
|
34
|
+
*
|
|
35
|
+
* @param dir - Working directory path
|
|
36
|
+
* @param manager - ConfigManager instance (defaults to singleton)
|
|
37
|
+
* @returns Loaded config
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* await setupWorkingDirectory("/path/to/project");
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function setupWorkingDirectory(dir: string, manager?: ConfigManager): Promise<Config>;
|
|
31
45
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAA6C,MAAM,UAAU,CAAC;AAI/E,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,QAAQ,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAC7C;AA4CD,wBAAgB,4BAA4B,CAC1C,UAAU,GAAE,MAAc,GACzB,eAAe,CA+BjB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,SAAS,CAAkB;gBAEvB,SAAS,CAAC,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAE,MAAM;IAiBlE,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQtC,YAAY,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IAK9C,mBAAmB,IAAI,MAAM;IAI7B,gBAAgB,IAAI,MAAM;IAI1B,OAAO,CAAC,aAAa;IAoBf,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAsCvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,SAAS,IAAI,MAAM;IAanB,WAAW,IAAI,QAAQ;IAIjB,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK/B,iBAAiB,IAAI,MAAM;CAG5B;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAA6C,MAAM,UAAU,CAAC;AAI/E,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,QAAQ,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAC7C;AA4CD,wBAAgB,4BAA4B,CAC1C,UAAU,GAAE,MAAc,GACzB,eAAe,CA+BjB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,SAAS,CAAkB;gBAEvB,SAAS,CAAC,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAE,MAAM;IAiBlE,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQtC,YAAY,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IAK9C,mBAAmB,IAAI,MAAM;IAI7B,gBAAgB,IAAI,MAAM;IAI1B,OAAO,CAAC,aAAa;IAoBf,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAsCvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,SAAS,IAAI,MAAM;IAanB,WAAW,IAAI,QAAQ;IAIjB,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK/B,iBAAiB,IAAI,MAAM;CAG5B;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC;AAEjD;;;;;;;;;;;;GAYG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,aAA6B,GACrC,OAAO,CAAC,MAAM,CAAC,CAGjB"}
|
package/dist/lib/config.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.configManager = exports.ConfigManager = void 0;
|
|
4
4
|
exports.createDefaultConfigCallbacks = createDefaultConfigCallbacks;
|
|
5
|
+
exports.setupWorkingDirectory = setupWorkingDirectory;
|
|
5
6
|
const path_1 = require("path");
|
|
6
7
|
const process_1 = require("process");
|
|
7
8
|
const fs_1 = require("fs");
|
|
@@ -200,3 +201,20 @@ class ConfigManager {
|
|
|
200
201
|
}
|
|
201
202
|
exports.ConfigManager = ConfigManager;
|
|
202
203
|
exports.configManager = new ConfigManager();
|
|
204
|
+
/**
|
|
205
|
+
* Helper function to set working directory and reload config.
|
|
206
|
+
* Combines the common pattern of setWorkingDirectory + load.
|
|
207
|
+
*
|
|
208
|
+
* @param dir - Working directory path
|
|
209
|
+
* @param manager - ConfigManager instance (defaults to singleton)
|
|
210
|
+
* @returns Loaded config
|
|
211
|
+
*
|
|
212
|
+
* @example
|
|
213
|
+
* ```typescript
|
|
214
|
+
* await setupWorkingDirectory("/path/to/project");
|
|
215
|
+
* ```
|
|
216
|
+
*/
|
|
217
|
+
async function setupWorkingDirectory(dir, manager = exports.configManager) {
|
|
218
|
+
manager.setWorkingDirectory(dir);
|
|
219
|
+
return await manager.load();
|
|
220
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prd.d.ts","sourceRoot":"","sources":["../../src/services/prd.ts"],"names":[],"mappings":"AASA,OAAO,EAAiB,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAY,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"prd.d.ts","sourceRoot":"","sources":["../../src/services/prd.ts"],"names":[],"mappings":"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"}
|
package/dist/services/prd.js
CHANGED
|
@@ -40,6 +40,8 @@ const ai_service_factory_1 = require("../utils/ai-service-factory");
|
|
|
40
40
|
const ai_config_builder_1 = require("../utils/ai-config-builder");
|
|
41
41
|
const config_1 = require("../lib/config");
|
|
42
42
|
const validation_1 = require("../lib/validation");
|
|
43
|
+
const streaming_utils_1 = require("../utils/streaming-utils");
|
|
44
|
+
const file_utils_1 = require("../utils/file-utils");
|
|
43
45
|
/**
|
|
44
46
|
* PRDService - Business logic for PRD operations
|
|
45
47
|
* Handles PRD parsing, task extraction, and PRD improvement
|
|
@@ -52,20 +54,16 @@ class PRDService {
|
|
|
52
54
|
type: "started",
|
|
53
55
|
message: "Starting PRD parsing...",
|
|
54
56
|
});
|
|
55
|
-
// Validate file exists
|
|
56
|
-
|
|
57
|
-
throw new Error(`PRD file not found: ${input.file}`);
|
|
58
|
-
}
|
|
57
|
+
// Validate file exists (DRY fix 1.2)
|
|
58
|
+
(0, file_utils_1.validateFileExists)(input.file, `PRD file not found: ${input.file}`);
|
|
59
59
|
// Ensure we're in a task-o-matic project
|
|
60
60
|
const taskOMaticDir = config_1.configManager.getTaskOMaticDir();
|
|
61
61
|
if (!(0, fs_1.existsSync)(taskOMaticDir)) {
|
|
62
62
|
throw new Error(`Not a task-o-matic project. Run 'task-o-matic init init' first.`);
|
|
63
63
|
}
|
|
64
|
-
// Set working directory
|
|
64
|
+
// Set working directory and reload config (DRY fix 1.4)
|
|
65
65
|
const workingDir = input.workingDirectory || process.cwd();
|
|
66
|
-
config_1.
|
|
67
|
-
// Reload config after changing working directory
|
|
68
|
-
await config_1.configManager.load();
|
|
66
|
+
await (0, config_1.setupWorkingDirectory)(workingDir);
|
|
69
67
|
input.callbacks?.onProgress?.({
|
|
70
68
|
type: "progress",
|
|
71
69
|
message: "Reading PRD file...",
|
|
@@ -104,34 +102,13 @@ class PRDService {
|
|
|
104
102
|
message: "Parsing PRD with AI...",
|
|
105
103
|
});
|
|
106
104
|
const stepStart2 = Date.now();
|
|
107
|
-
//
|
|
108
|
-
|
|
109
|
-
let timeToFirstToken;
|
|
110
|
-
// Wrap streaming options to capture metrics
|
|
111
|
-
const metricsStreamingOptions = {
|
|
112
|
-
...input.streamingOptions,
|
|
113
|
-
onFinish: async (result) => {
|
|
114
|
-
if (result.usage) {
|
|
115
|
-
tokenUsage = {
|
|
116
|
-
prompt: result.usage.inputTokens || result.usage.promptTokens || 0,
|
|
117
|
-
completion: result.usage.outputTokens || result.usage.completionTokens || 0,
|
|
118
|
-
total: result.usage.totalTokens || 0,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
// Call original onFinish if provided
|
|
122
|
-
await input.streamingOptions?.onFinish?.(result);
|
|
123
|
-
},
|
|
124
|
-
onChunk: (chunk) => {
|
|
125
|
-
if (chunk && !timeToFirstToken) {
|
|
126
|
-
timeToFirstToken = Date.now() - stepStart2;
|
|
127
|
-
}
|
|
128
|
-
// Call original onChunk if provided
|
|
129
|
-
input.streamingOptions?.onChunk?.(chunk);
|
|
130
|
-
},
|
|
131
|
-
};
|
|
105
|
+
// Use utility to wrap streaming options and capture metrics (DRY fix 1.1)
|
|
106
|
+
const { options: metricsStreamingOptions, getMetrics } = (0, streaming_utils_1.createMetricsStreamingOptions)(input.streamingOptions, stepStart2);
|
|
132
107
|
const result = await (0, ai_service_factory_1.getAIOperations)().parsePRD(prdContent, aiConfig, input.promptOverride, input.messageOverride, metricsStreamingOptions, undefined, // retryConfig
|
|
133
108
|
workingDir, // Pass working directory to AI operations
|
|
134
109
|
input.enableFilesystemTools);
|
|
110
|
+
// Extract metrics after AI call
|
|
111
|
+
const { tokenUsage, timeToFirstToken } = getMetrics();
|
|
135
112
|
steps.push({
|
|
136
113
|
step: "AI Parsing",
|
|
137
114
|
status: "completed",
|
|
@@ -220,12 +197,11 @@ class PRDService {
|
|
|
220
197
|
type: "started",
|
|
221
198
|
message: "Generating clarifying questions...",
|
|
222
199
|
});
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
200
|
+
// Validate file exists (DRY fix 1.2)
|
|
201
|
+
(0, file_utils_1.validateFileExists)(input.file, `PRD file not found: ${input.file}`);
|
|
202
|
+
// Set working directory and reload config (DRY fix 1.4)
|
|
226
203
|
const workingDir = input.workingDirectory || process.cwd();
|
|
227
|
-
config_1.
|
|
228
|
-
await config_1.configManager.load();
|
|
204
|
+
await (0, config_1.setupWorkingDirectory)(workingDir);
|
|
229
205
|
input.callbacks?.onProgress?.({
|
|
230
206
|
type: "progress",
|
|
231
207
|
message: "Reading PRD file...",
|
|
@@ -252,14 +228,11 @@ class PRDService {
|
|
|
252
228
|
type: "started",
|
|
253
229
|
message: "Starting PRD improvement...",
|
|
254
230
|
});
|
|
255
|
-
// Validate file exists
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
}
|
|
259
|
-
// Set working directory from CLI layer (defaults to process.cwd() for backward compatibility)
|
|
231
|
+
// Validate file exists (DRY fix 1.2)
|
|
232
|
+
(0, file_utils_1.validateFileExists)(input.file, `PRD file not found: ${input.file}`);
|
|
233
|
+
// Set working directory and reload config (DRY fix 1.4)
|
|
260
234
|
const workingDir = input.workingDirectory || process.cwd();
|
|
261
|
-
config_1.
|
|
262
|
-
await config_1.configManager.load();
|
|
235
|
+
await (0, config_1.setupWorkingDirectory)(workingDir);
|
|
263
236
|
input.callbacks?.onProgress?.({
|
|
264
237
|
type: "progress",
|
|
265
238
|
message: "Reading PRD file...",
|
package/dist/services/tasks.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AIOptions } from "../utils/ai-config-builder";
|
|
2
|
-
import { Task, StreamingOptions } from "../types";
|
|
2
|
+
import { Task, StreamingOptions, TaskAIMetadata } from "../types";
|
|
3
3
|
import { CreateTaskResult, EnhanceTaskResult, SplitTaskResult, PlanTaskResult, DocumentTaskResult, DeleteTaskResult } from "../types/results";
|
|
4
4
|
/**
|
|
5
5
|
* TaskService - Centralized business logic for all task operations
|
|
@@ -21,7 +21,7 @@ export declare class TaskService {
|
|
|
21
21
|
}): Promise<Task[]>;
|
|
22
22
|
getTask(id: string): Promise<Task | null>;
|
|
23
23
|
getTaskContent(id: string): Promise<string | null>;
|
|
24
|
-
getTaskAIMetadata(id: string): Promise<
|
|
24
|
+
getTaskAIMetadata(id: string): Promise<TaskAIMetadata | null>;
|
|
25
25
|
getSubtasks(id: string): Promise<Task[]>;
|
|
26
26
|
updateTask(id: string, updates: {
|
|
27
27
|
title?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/services/tasks.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiB,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EACL,IAAI,EACJ,gBAAgB,
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/services/tasks.ts"],"names":[],"mappings":"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"}
|