task-o-matic 0.0.4 → 0.0.7

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/cli/bin.js CHANGED
File without changes
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/commands/workflow.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,eAAO,MAAM,eAAe,SAiExB,CAAC"}
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/commands/workflow.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BpC,eAAO,MAAM,eAAe,SAiExB,CAAC"}
@@ -10,6 +10,7 @@ const chalk_1 = __importDefault(require("chalk"));
10
10
  const fs_1 = require("fs");
11
11
  const path_1 = require("path");
12
12
  const config_1 = require("../lib/config");
13
+ const better_t_stack_cli_1 = require("../lib/better-t-stack-cli");
13
14
  const prd_1 = require("../services/prd");
14
15
  const tasks_1 = require("../services/tasks");
15
16
  const workflow_ai_assistant_1 = require("../services/workflow-ai-assistant");
@@ -72,7 +73,7 @@ exports.workflowCommand = new commander_1.Command("workflow")
72
73
  */
73
74
  async function stepInitialize(state, aiOptions, streamingOptions) {
74
75
  console.log(chalk_1.default.blue.bold("\nšŸ“¦ Step 1: Project Initialization\n"));
75
- // Check if already initialized
76
+ // Check if already initialized in current directory
76
77
  const taskOMaticDir = config_1.configManager.getTaskOMaticDir();
77
78
  const alreadyInitialized = (0, fs_1.existsSync)(taskOMaticDir);
78
79
  if (alreadyInitialized) {
@@ -91,25 +92,127 @@ async function stepInitialize(state, aiOptions, streamingOptions) {
91
92
  state.currentStep = "define-prd";
92
93
  return;
93
94
  }
95
+ const projectName = await (0, workflow_prompts_1.textInputPrompt)("What is the name of your project?", "my-app");
96
+ // IMMEDIATE DIRECTORY CREATION AND SWITCH
97
+ const projectDir = (0, path_1.resolve)(process.cwd(), projectName);
98
+ if (!(0, fs_1.existsSync)(projectDir)) {
99
+ (0, fs_1.mkdirSync)(projectDir, { recursive: true });
100
+ console.log(chalk_1.default.green(`\nāœ“ Created directory: ${projectName}`));
101
+ }
102
+ else {
103
+ console.log(chalk_1.default.yellow(`\n⚠ Directory ${projectName} already exists`));
104
+ }
105
+ console.log(chalk_1.default.cyan(` šŸ“‚ Switching to project directory: ${projectDir}\n`));
106
+ process.chdir(projectDir);
107
+ config_1.configManager.setWorkingDirectory(projectDir);
108
+ state.projectDir = projectDir;
109
+ // Initialize task-o-matic in the NEW directory
110
+ console.log(chalk_1.default.cyan(" Initializing task-o-matic...\n"));
111
+ const newTaskOMaticDir = (0, path_1.join)(projectDir, ".task-o-matic");
112
+ if (!(0, fs_1.existsSync)(newTaskOMaticDir)) {
113
+ (0, fs_1.mkdirSync)(newTaskOMaticDir, { recursive: true });
114
+ ["tasks", "prd", "logs"].forEach((dir) => {
115
+ (0, fs_1.mkdirSync)((0, path_1.join)(newTaskOMaticDir, dir), { recursive: true });
116
+ });
117
+ }
118
+ // AI Configuration Step - ALWAYS ask for this first
119
+ console.log(chalk_1.default.blue.bold("\nšŸ¤– Step 1.1: AI Configuration\n"));
120
+ const aiProvider = await (0, workflow_prompts_1.selectPrompt)("Select AI Provider:", [
121
+ { name: "OpenRouter", value: "openrouter" },
122
+ { name: "Anthropic", value: "anthropic" },
123
+ { name: "OpenAI", value: "openai" },
124
+ { name: "Custom (e.g. local LLM)", value: "custom" },
125
+ ]);
126
+ let aiProviderUrl;
127
+ if (aiProvider === "custom") {
128
+ aiProviderUrl = await (0, workflow_prompts_1.textInputPrompt)("Enter Custom Provider URL:", "http://localhost:11434/v1");
129
+ }
130
+ const defaultModel = aiProvider === "openrouter"
131
+ ? "anthropic/claude-3.5-sonnet"
132
+ : aiProvider === "anthropic"
133
+ ? "claude-3-5-sonnet-20240620"
134
+ : aiProvider === "openai"
135
+ ? "gpt-4o"
136
+ : "llama3";
137
+ const aiModel = await (0, workflow_prompts_1.textInputPrompt)("Enter AI Model:", defaultModel);
138
+ // Check/Ask for API Key
139
+ const providerKeyName = aiProvider === "openai"
140
+ ? "OPENAI_API_KEY"
141
+ : aiProvider === "anthropic"
142
+ ? "ANTHROPIC_API_KEY"
143
+ : aiProvider === "openrouter"
144
+ ? "OPENROUTER_API_KEY"
145
+ : "AI_API_KEY";
146
+ // Check if key exists in current env
147
+ let apiKey = process.env[providerKeyName];
148
+ if (!apiKey) {
149
+ console.log(chalk_1.default.yellow(`\nāš ļø No API key found for ${aiProvider}`));
150
+ apiKey = await (0, workflow_prompts_1.textInputPrompt)(`Enter your ${aiProvider} API Key:`);
151
+ }
152
+ // Save AI Config to .env immediately in the new project dir
153
+ const envPath = (0, path_1.join)(projectDir, ".env");
154
+ let envContent = "";
155
+ if ((0, fs_1.existsSync)(envPath)) {
156
+ envContent = (0, fs_1.readFileSync)(envPath, "utf-8");
157
+ }
158
+ if (!envContent.includes("AI_PROVIDER=")) {
159
+ envContent += `AI_PROVIDER=${aiProvider}\n`;
160
+ }
161
+ if (!envContent.includes("AI_MODEL=")) {
162
+ envContent += `AI_MODEL=${aiModel}\n`;
163
+ }
164
+ if (aiProviderUrl && !envContent.includes("AI_PROVIDER_URL=")) {
165
+ envContent += `AI_PROVIDER_URL=${aiProviderUrl}\n`;
166
+ }
167
+ if (!envContent.includes(`${providerKeyName}=`)) {
168
+ envContent += `${providerKeyName}=${apiKey}\n`;
169
+ }
170
+ (0, fs_1.writeFileSync)(envPath, envContent);
171
+ // Update process.env for immediate use
172
+ process.env.AI_PROVIDER = aiProvider;
173
+ process.env.AI_MODEL = aiModel;
174
+ process.env[providerKeyName] = apiKey;
175
+ if (aiProviderUrl) {
176
+ process.env.AI_PROVIDER_URL = aiProviderUrl;
177
+ }
178
+ // Update ConfigManager
179
+ config_1.configManager.setAIConfig({
180
+ provider: aiProvider,
181
+ model: aiModel,
182
+ apiKey: apiKey,
183
+ baseURL: aiProviderUrl,
184
+ });
185
+ console.log(chalk_1.default.green("āœ“ AI Configuration saved"));
186
+ // Stack Configuration Step
187
+ console.log(chalk_1.default.blue.bold("\nšŸ“¦ Step 1.2: Stack Configuration\n"));
94
188
  // Choose initialization method
95
- let initMethod = await (0, workflow_prompts_1.selectPrompt)("How would you like to configure your project?", [
189
+ let initMethod = await (0, workflow_prompts_1.selectPrompt)("How would you like to configure your project stack?", [
96
190
  { name: "Quick start (recommended defaults)", value: "quick" },
97
191
  { name: "Custom configuration", value: "custom" },
98
192
  { name: "AI-assisted (describe your project)", value: "ai" },
99
193
  ]);
100
194
  let config;
101
195
  if (initMethod === "ai") {
102
- console.log(chalk_1.default.cyan("\nšŸ¤– AI-Assisted Configuration\n"));
196
+ console.log(chalk_1.default.cyan("\nšŸ¤– AI-Assisted Stack Configuration\n"));
103
197
  const description = await (0, workflow_prompts_1.textInputPrompt)("Describe your project (e.g., 'A SaaS app for team collaboration with real-time features'):");
104
198
  console.log(chalk_1.default.gray("\n Analyzing your requirements...\n"));
105
199
  config = await workflow_ai_assistant_1.workflowAIAssistant.assistInitConfig({
106
200
  userDescription: description,
107
- aiOptions,
201
+ aiOptions: {
202
+ aiProvider,
203
+ aiModel,
204
+ aiKey: apiKey,
205
+ aiProviderUrl,
206
+ },
108
207
  streamingOptions,
109
208
  });
209
+ // Override AI's project name with user's choice
210
+ config.projectName = projectName;
211
+ // Override AI config with what we just set
212
+ config.aiProvider = aiProvider;
213
+ config.aiModel = aiModel;
110
214
  console.log(chalk_1.default.green("\nāœ“ AI Recommendations:"));
111
215
  console.log(chalk_1.default.gray(` Project: ${config.projectName}`));
112
- console.log(chalk_1.default.gray(` AI Provider: ${config.aiProvider}`));
113
216
  console.log(chalk_1.default.gray(` Frontend: ${config.frontend || "none"}`));
114
217
  console.log(chalk_1.default.gray(` Backend: ${config.backend || "none"}`));
115
218
  console.log(chalk_1.default.gray(` Database: ${config.database || "none"}`));
@@ -125,9 +228,9 @@ async function stepInitialize(state, aiOptions, streamingOptions) {
125
228
  }
126
229
  if (initMethod === "quick") {
127
230
  config = {
128
- projectName: "my-project",
129
- aiProvider: "openrouter",
130
- aiModel: "anthropic/claude-3.5-sonnet",
231
+ projectName: projectName,
232
+ aiProvider: aiProvider,
233
+ aiModel: aiModel,
131
234
  frontend: "next",
132
235
  backend: "hono",
133
236
  database: "sqlite",
@@ -137,14 +240,9 @@ async function stepInitialize(state, aiOptions, streamingOptions) {
137
240
  }
138
241
  else if (initMethod === "custom") {
139
242
  config = {
140
- projectName: await (0, workflow_prompts_1.textInputPrompt)("Project name:", "my-project"),
141
- aiProvider: await (0, workflow_prompts_1.selectPrompt)("AI Provider:", [
142
- "openrouter",
143
- "anthropic",
144
- "openai",
145
- "custom",
146
- ]),
147
- aiModel: await (0, workflow_prompts_1.textInputPrompt)("AI Model:", "anthropic/claude-3.5-sonnet"),
243
+ projectName: projectName,
244
+ aiProvider: aiProvider,
245
+ aiModel: aiModel,
148
246
  };
149
247
  const shouldBootstrap = await (0, workflow_prompts_1.confirmPrompt)("Bootstrap with Better-T-Stack?", true);
150
248
  if (shouldBootstrap) {
@@ -172,51 +270,64 @@ async function stepInitialize(state, aiOptions, streamingOptions) {
172
270
  config.auth = await (0, workflow_prompts_1.confirmPrompt)("Include authentication?", true);
173
271
  }
174
272
  }
175
- // Initialize project
176
- console.log(chalk_1.default.cyan("\n Initializing project...\n"));
177
- // Create .task-o-matic directory
178
- if (!(0, fs_1.existsSync)(taskOMaticDir)) {
179
- (0, fs_1.mkdirSync)(taskOMaticDir, { recursive: true });
180
- ["tasks", "prd", "logs"].forEach((dir) => {
181
- (0, fs_1.mkdirSync)((0, path_1.join)(taskOMaticDir, dir), { recursive: true });
182
- });
183
- }
184
- // Save configuration
185
- config_1.configManager.setConfig({
186
- ai: {
187
- provider: config.aiProvider, // Cast to satisfy AIProvider type
188
- model: config.aiModel,
189
- maxTokens: 32768,
190
- temperature: 0.5,
191
- },
192
- });
193
- config_1.configManager.save();
194
- console.log(chalk_1.default.green("āœ“ Project initialized"));
195
- // Bootstrap if configured
273
+ // Bootstrap Logic
196
274
  if (config.frontend || config.backend) {
197
275
  const shouldBootstrap = await (0, workflow_prompts_1.confirmPrompt)("Bootstrap project now?", true);
198
276
  if (shouldBootstrap) {
199
277
  console.log(chalk_1.default.cyan("\n Bootstrapping with Better-T-Stack...\n"));
200
- console.log(chalk_1.default.gray(" (This may take a few minutes)\n"));
201
- // Note: Actual bootstrap would call Better-T-Stack CLI
202
- // For now, we'll just note the configuration
203
- const btsConfig = {
204
- projectName: config.projectName,
205
- frontend: config.frontend,
206
- backend: config.backend,
207
- database: config.database,
208
- auth: config.auth,
209
- };
210
- (0, fs_1.writeFileSync)((0, path_1.join)(taskOMaticDir, "bts-config.json"), JSON.stringify(btsConfig, null, 2));
211
- console.log(chalk_1.default.yellow("ℹ Bootstrap configuration saved"));
212
- console.log(chalk_1.default.gray(" Run 'task-o-matic init bootstrap' to complete setup\n"));
278
+ try {
279
+ // We are already in the project directory.
280
+ // We pass "." as the project name so Better-T-Stack scaffolds in the current directory.
281
+ const result = await (0, better_t_stack_cli_1.runBetterTStackCLI)({
282
+ projectName: ".", // Force scaffolding in current dir
283
+ frontend: config.frontend || "next",
284
+ backend: config.backend || "hono",
285
+ database: config.database || "sqlite",
286
+ noAuth: !config.auth,
287
+ // Default values for required fields that might be missing from simple config
288
+ orm: "drizzle",
289
+ packageManager: "npm",
290
+ runtime: "node",
291
+ noInstall: false,
292
+ noGit: false,
293
+ }, process.cwd());
294
+ if (result.success) {
295
+ console.log(chalk_1.default.green(`\nāœ“ ${result.message}\n`));
296
+ // Fix up the configuration files
297
+ // Because we passed ".", the config file is named ".-bts-config.json" and contains projectName: "."
298
+ const dotConfigPath = (0, path_1.join)(newTaskOMaticDir, ".-bts-config.json");
299
+ const realConfigPath = (0, path_1.join)(newTaskOMaticDir, `${projectName}-bts-config.json`);
300
+ const stackConfigPath = (0, path_1.join)(newTaskOMaticDir, "stack.json");
301
+ if ((0, fs_1.existsSync)(dotConfigPath)) {
302
+ const configContent = JSON.parse((0, fs_1.readFileSync)(dotConfigPath, "utf-8"));
303
+ configContent.projectName = projectName; // Fix the project name
304
+ const newContent = JSON.stringify(configContent, null, 2);
305
+ (0, fs_1.writeFileSync)(realConfigPath, newContent);
306
+ (0, fs_1.writeFileSync)(stackConfigPath, newContent);
307
+ // Remove the temporary dot config
308
+ const { unlinkSync } = require("fs");
309
+ unlinkSync(dotConfigPath);
310
+ }
311
+ }
312
+ else {
313
+ console.log(chalk_1.default.red(`\nāœ— Bootstrap failed: ${result.message}\n`));
314
+ console.log(chalk_1.default.yellow("You can try running 'task-o-matic init bootstrap' manually later.\n"));
315
+ }
316
+ }
317
+ catch (error) {
318
+ console.log(chalk_1.default.red(`\nāœ— Bootstrap failed: ${error}\n`));
319
+ }
213
320
  }
214
321
  }
322
+ // Save configuration
323
+ config_1.configManager.save();
324
+ console.log(chalk_1.default.green("āœ“ Project initialized"));
215
325
  state.initialized = true;
216
326
  state.projectName = config.projectName;
217
327
  state.aiConfig = {
218
- provider: config.aiProvider,
219
- model: config.aiModel,
328
+ provider: aiProvider,
329
+ model: aiModel,
330
+ key: apiKey,
220
331
  };
221
332
  state.currentStep = "define-prd";
222
333
  }
@@ -405,18 +516,33 @@ async function stepSplitTasks(state, aiOptions, streamingOptions) {
405
516
  console.log(chalk_1.default.gray(" No tasks selected"));
406
517
  return;
407
518
  }
519
+ let globalSplitMethod = "interactive";
520
+ let globalCustomInstructions;
521
+ if (tasksToSplit.length > 1) {
522
+ globalSplitMethod = await (0, workflow_prompts_1.selectPrompt)("How would you like to split these tasks?", [
523
+ { name: "Interactive (ask for each task)", value: "interactive" },
524
+ { name: "Standard AI split for ALL", value: "standard" },
525
+ { name: "Same custom instructions for ALL", value: "custom" },
526
+ ]);
527
+ if (globalSplitMethod === "custom") {
528
+ globalCustomInstructions = await (0, workflow_prompts_1.textInputPrompt)("Custom instructions for ALL tasks (e.g., 'Break into 2-4 hour chunks'):", "");
529
+ }
530
+ }
408
531
  for (const taskId of tasksToSplit) {
409
532
  const task = state.tasks.find((t) => t.id === taskId);
410
533
  if (!task)
411
534
  continue;
412
535
  console.log(chalk_1.default.cyan(`\n Splitting: ${task.title}\n`));
413
- const splitMethod = await (0, workflow_prompts_1.selectPrompt)("Split method:", [
414
- { name: "Standard AI split", value: "standard" },
415
- { name: "Custom instructions", value: "custom" },
416
- ]);
417
- let customInstructions;
418
- if (splitMethod === "custom") {
419
- customInstructions = await (0, workflow_prompts_1.textInputPrompt)("Custom instructions (e.g., 'Break into 2-4 hour chunks'):", "");
536
+ let splitMethod = globalSplitMethod;
537
+ let customInstructions = globalCustomInstructions;
538
+ if (globalSplitMethod === "interactive") {
539
+ splitMethod = await (0, workflow_prompts_1.selectPrompt)("Split method:", [
540
+ { name: "Standard AI split", value: "standard" },
541
+ { name: "Custom instructions", value: "custom" },
542
+ ]);
543
+ if (splitMethod === "custom") {
544
+ customInstructions = await (0, workflow_prompts_1.textInputPrompt)("Custom instructions (e.g., 'Break into 2-4 hour chunks'):", "");
545
+ }
420
546
  }
421
547
  try {
422
548
  const result = await tasks_1.taskService.splitTask(taskId, aiOptions, undefined, // promptOverride
@@ -31,5 +31,6 @@ export interface InitOptions {
31
31
  export declare function runBetterTStackCLI(options: InitOptions, workingDirectory?: string): Promise<{
32
32
  success: boolean;
33
33
  message: string;
34
+ projectPath?: string;
34
35
  }>;
35
36
  //# sourceMappingURL=better-t-stack-cli.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"better-t-stack-cli.d.ts","sourceRoot":"","sources":["../../src/lib/better-t-stack-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAKrC,qBAAa,mBAAmB;IACxB,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,EACjB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAmDF,OAAO,CAAC,kBAAkB;YAsBZ,aAAa;CAqB5B;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,WAAW,EACpB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAkChD"}
1
+ {"version":3,"file":"better-t-stack-cli.d.ts","sourceRoot":"","sources":["../../src/lib/better-t-stack-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAKrC,qBAAa,mBAAmB;IACxB,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,EACjB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAqDF,OAAO,CAAC,kBAAkB;YAyBZ,aAAa;CAqB5B;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,WAAW,EACpB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAsCtE"}
@@ -68,7 +68,9 @@ class BetterTStackService {
68
68
  git: config.git,
69
69
  install: config.install,
70
70
  addons: config.addons,
71
- examples: config.examples,
71
+ examples: config.examples && config.examples.length > 0
72
+ ? config.examples
73
+ : undefined,
72
74
  disableAnalytics: true,
73
75
  };
74
76
  }
@@ -114,5 +116,9 @@ async function runBetterTStackCLI(options, workingDirectory) {
114
116
  examples: options.examples || [],
115
117
  };
116
118
  const result = await btsService.createProject(options.projectName || options.name || "", btsConfig, workingDirectory);
117
- return { success: result.success, message: result.message };
119
+ return {
120
+ success: result.success,
121
+ message: result.message,
122
+ projectPath: result.projectPath,
123
+ };
118
124
  }
File without changes
@@ -120,6 +120,7 @@ export interface InitConfigChoice {
120
120
  projectName: string;
121
121
  aiProvider: string;
122
122
  aiModel: string;
123
+ aiProviderUrl?: string;
123
124
  frontend?: string;
124
125
  backend?: string;
125
126
  database?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/types/options.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAGD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAGD,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;CACZ;AAGD,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAGD,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAGD,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,eAAgB,SAAQ,kBAAkB;IACzD,EAAE,EAAE,MAAM,CAAC;CACZ;AAGD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;CACZ;AAGD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,WAAW,CAAC;IAC9C,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAGD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAGD,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,WAAW,CAAC;CAC9C;AAGD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;CACZ;AAGD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;CACZ;AAGD,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAGD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACtC,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;CAC3C;AAGD,MAAM,WAAW,eAAgB,SAAQ,kBAAkB;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,MAAM,YAAY,GACpB,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,gBAAgB,GAChB,aAAa,GACb,UAAU,CAAC;AAEf,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,WAAW,EAAE,YAAY,CAAC;IAC1B,QAAQ,CAAC,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,GAAG;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,CAAC,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,CAAC,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/types/options.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-o-matic",
3
- "version": "0.0.4",
3
+ "version": "0.0.7",
4
4
  "description": "AI-powered task management CLI",
5
5
  "keywords": [
6
6
  "task-management",
@@ -50,8 +50,8 @@
50
50
  "start": "node dist/cli/bin.js",
51
51
  "check-types": "tsc --noEmit --skipLibCheck",
52
52
  "test": "mocha -r tsx/cjs src/test/**/*.test.ts",
53
- "prepare": "npm run build",
54
- "prepublishOnly": "bun run build && bun test"
53
+ "prepare": "npm run build && chmod +x dist/cli/bin.js",
54
+ "prepublishOnly": "bun run build && chmod +x dist/cli/bin.js && bun test"
55
55
  },
56
56
  "dependencies": {
57
57
  "@ai-sdk/anthropic": "^2.0.44",