task-o-matic 0.0.9 → 0.0.11

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 (110) hide show
  1. package/dist/cli/display/progress.d.ts +1 -1
  2. package/dist/cli/display/progress.d.ts.map +1 -1
  3. package/dist/cli/display/progress.js +16 -13
  4. package/dist/commands/benchmark.js +70 -2
  5. package/dist/commands/init.js +48 -27
  6. package/dist/commands/prd.d.ts.map +1 -1
  7. package/dist/commands/prd.js +201 -0
  8. package/dist/commands/tasks/execute-loop.d.ts.map +1 -1
  9. package/dist/commands/tasks/execute-loop.js +10 -0
  10. package/dist/commands/tasks/execute.d.ts.map +1 -1
  11. package/dist/commands/tasks/execute.js +4 -0
  12. package/dist/commands/workflow.d.ts.map +1 -1
  13. package/dist/commands/workflow.js +56 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +2 -0
  16. package/dist/lib/ai-service/ai-operations.d.ts +13 -10
  17. package/dist/lib/ai-service/ai-operations.d.ts.map +1 -1
  18. package/dist/lib/ai-service/ai-operations.js +35 -995
  19. package/dist/lib/ai-service/base-operations.d.ts +13 -0
  20. package/dist/lib/ai-service/base-operations.d.ts.map +1 -0
  21. package/dist/lib/ai-service/base-operations.js +79 -0
  22. package/dist/lib/ai-service/documentation-operations.d.ts +18 -0
  23. package/dist/lib/ai-service/documentation-operations.d.ts.map +1 -0
  24. package/dist/lib/ai-service/documentation-operations.js +291 -0
  25. package/dist/lib/ai-service/prd-operations.d.ts +14 -0
  26. package/dist/lib/ai-service/prd-operations.d.ts.map +1 -0
  27. package/dist/lib/ai-service/prd-operations.js +405 -0
  28. package/dist/lib/ai-service/task-operations.d.ts +12 -0
  29. package/dist/lib/ai-service/task-operations.d.ts.map +1 -0
  30. package/dist/lib/ai-service/task-operations.js +225 -0
  31. package/dist/lib/benchmark/registry.d.ts.map +1 -1
  32. package/dist/lib/benchmark/registry.js +127 -0
  33. package/dist/lib/better-t-stack-cli.d.ts +4 -1
  34. package/dist/lib/better-t-stack-cli.d.ts.map +1 -1
  35. package/dist/lib/better-t-stack-cli.js +126 -5
  36. package/dist/lib/config.d.ts +13 -6
  37. package/dist/lib/config.d.ts.map +1 -1
  38. package/dist/lib/config.js +90 -48
  39. package/dist/lib/context-builder.d.ts +13 -1
  40. package/dist/lib/context-builder.d.ts.map +1 -1
  41. package/dist/lib/context-builder.js +68 -36
  42. package/dist/lib/executors/claude-code-executor.d.ts +5 -2
  43. package/dist/lib/executors/claude-code-executor.d.ts.map +1 -1
  44. package/dist/lib/executors/claude-code-executor.js +30 -3
  45. package/dist/lib/executors/codex-executor.d.ts +5 -2
  46. package/dist/lib/executors/codex-executor.d.ts.map +1 -1
  47. package/dist/lib/executors/codex-executor.js +30 -3
  48. package/dist/lib/executors/executor-factory.d.ts +2 -2
  49. package/dist/lib/executors/executor-factory.d.ts.map +1 -1
  50. package/dist/lib/executors/executor-factory.js +5 -5
  51. package/dist/lib/executors/gemini-executor.d.ts +5 -2
  52. package/dist/lib/executors/gemini-executor.d.ts.map +1 -1
  53. package/dist/lib/executors/gemini-executor.js +30 -3
  54. package/dist/lib/executors/opencode-executor.d.ts +5 -2
  55. package/dist/lib/executors/opencode-executor.d.ts.map +1 -1
  56. package/dist/lib/executors/opencode-executor.js +30 -7
  57. package/dist/lib/index.d.ts +5 -0
  58. package/dist/lib/index.d.ts.map +1 -1
  59. package/dist/lib/index.js +7 -1
  60. package/dist/lib/prompt-builder.d.ts.map +1 -1
  61. package/dist/lib/prompt-builder.js +1 -0
  62. package/dist/lib/storage/file-system.d.ts +3 -7
  63. package/dist/lib/storage/file-system.d.ts.map +1 -1
  64. package/dist/lib/storage/file-system.js +50 -230
  65. package/dist/lib/storage/storage-callbacks.d.ts +17 -0
  66. package/dist/lib/storage/storage-callbacks.d.ts.map +1 -0
  67. package/dist/lib/storage/storage-callbacks.js +94 -0
  68. package/dist/lib/task-execution.d.ts.map +1 -1
  69. package/dist/lib/task-execution.js +16 -9
  70. package/dist/lib/task-loop-execution.d.ts.map +1 -1
  71. package/dist/lib/task-loop-execution.js +207 -8
  72. package/dist/prompts/index.d.ts +2 -0
  73. package/dist/prompts/index.d.ts.map +1 -1
  74. package/dist/prompts/index.js +2 -0
  75. package/dist/prompts/prd-combination.d.ts +2 -0
  76. package/dist/prompts/prd-combination.d.ts.map +1 -0
  77. package/dist/prompts/prd-combination.js +35 -0
  78. package/dist/prompts/prd-generation.d.ts +2 -0
  79. package/dist/prompts/prd-generation.d.ts.map +1 -0
  80. package/dist/prompts/prd-generation.js +49 -0
  81. package/dist/services/prd.d.ts +43 -0
  82. package/dist/services/prd.d.ts.map +1 -1
  83. package/dist/services/prd.js +121 -0
  84. package/dist/services/workflow-ai-assistant.d.ts.map +1 -1
  85. package/dist/services/workflow-ai-assistant.js +1 -40
  86. package/dist/services/workflow.d.ts +10 -0
  87. package/dist/services/workflow.d.ts.map +1 -1
  88. package/dist/services/workflow.js +118 -40
  89. package/dist/test/hooks.test.js +19 -10
  90. package/dist/test/integration/callbacks.test.d.ts +2 -0
  91. package/dist/test/integration/callbacks.test.d.ts.map +1 -0
  92. package/dist/test/integration/callbacks.test.js +64 -0
  93. package/dist/test/task-loop-git.test.js +33 -0
  94. package/dist/test/validation.test.d.ts +2 -0
  95. package/dist/test/validation.test.d.ts.map +1 -0
  96. package/dist/test/validation.test.js +22 -0
  97. package/dist/types/callbacks.d.ts +9 -6
  98. package/dist/types/callbacks.d.ts.map +1 -1
  99. package/dist/types/index.d.ts +17 -2
  100. package/dist/types/index.d.ts.map +1 -1
  101. package/dist/types/workflow-options.d.ts +7 -0
  102. package/dist/types/workflow-options.d.ts.map +1 -1
  103. package/dist/utils/ai-service-factory.d.ts +15 -1
  104. package/dist/utils/ai-service-factory.d.ts.map +1 -1
  105. package/dist/utils/ai-service-factory.js +29 -1
  106. package/dist/utils/streaming-options.d.ts +1 -1
  107. package/dist/utils/streaming-options.d.ts.map +1 -1
  108. package/dist/utils/streaming-options.js +31 -18
  109. package/docs/agents/cli.md +191 -0
  110. package/package.json +3 -2
@@ -83,6 +83,133 @@ class BenchmarkRegistry {
83
83
  return await workflow_benchmark_1.workflowBenchmarkService.executeWorkflow(input, aiOptions, streamingOptions);
84
84
  },
85
85
  });
86
+ // Task Create with AI Enhancement
87
+ this.register({
88
+ id: "task-create",
89
+ name: "Task Creation (AI-Enhanced)",
90
+ description: "Create a new task with AI enhancement using Context7 documentation",
91
+ validateInput: (input) => typeof input.title === "string" && input.title.length > 0,
92
+ execute: async (input, aiOptions, streamingOptions) => {
93
+ return await taskService.createTask({
94
+ title: input.title,
95
+ content: input.content,
96
+ parentId: input.parentId,
97
+ effort: input.effort,
98
+ aiEnhance: true, // Always use AI enhancement for benchmarking
99
+ aiOptions,
100
+ streamingOptions,
101
+ });
102
+ },
103
+ });
104
+ // Task Enhancement
105
+ this.register({
106
+ id: "task-enhance",
107
+ name: "Task Enhancement",
108
+ description: "Enhance an existing task with AI using Context7 documentation",
109
+ validateInput: (input) => typeof input.taskId === "string",
110
+ execute: async (input, aiOptions, streamingOptions) => {
111
+ return await taskService.enhanceTask(input.taskId, aiOptions, streamingOptions);
112
+ },
113
+ });
114
+ // Task Planning
115
+ this.register({
116
+ id: "task-plan",
117
+ name: "Task Planning",
118
+ description: "Create a detailed implementation plan for a task",
119
+ validateInput: (input) => typeof input.taskId === "string",
120
+ execute: async (input, aiOptions, streamingOptions) => {
121
+ return await taskService.planTask(input.taskId, aiOptions, streamingOptions);
122
+ },
123
+ });
124
+ // Task Documentation
125
+ this.register({
126
+ id: "task-document",
127
+ name: "Task Documentation",
128
+ description: "Analyze and generate documentation for a task",
129
+ validateInput: (input) => typeof input.taskId === "string",
130
+ execute: async (input, aiOptions, streamingOptions) => {
131
+ return await taskService.documentTask(input.taskId, input.force || false, aiOptions, streamingOptions);
132
+ },
133
+ });
134
+ // PRD Creation
135
+ this.register({
136
+ id: "prd-create",
137
+ name: "PRD Creation",
138
+ description: "Generate a Product Requirements Document from a description",
139
+ validateInput: (input) => typeof input.description === "string" && input.description.length > 0,
140
+ execute: async (input, aiOptions, streamingOptions) => {
141
+ return await prd_1.prdService.generatePRD({
142
+ description: input.description,
143
+ outputDir: input.outputDir,
144
+ filename: input.filename,
145
+ aiOptions,
146
+ streamingOptions,
147
+ callbacks: {},
148
+ });
149
+ },
150
+ });
151
+ // PRD Combine
152
+ this.register({
153
+ id: "prd-combine",
154
+ name: "PRD Combination",
155
+ description: "Combine multiple PRD files into a single master PRD",
156
+ validateInput: (input) => Array.isArray(input.prds) &&
157
+ input.prds.length > 0 &&
158
+ typeof input.originalDescription === "string",
159
+ execute: async (input, aiOptions, streamingOptions) => {
160
+ return await prd_1.prdService.combinePRDs({
161
+ prds: input.prds,
162
+ originalDescription: input.originalDescription,
163
+ outputDir: input.outputDir,
164
+ filename: input.filename,
165
+ aiOptions,
166
+ streamingOptions,
167
+ callbacks: {},
168
+ });
169
+ },
170
+ });
171
+ // PRD Question Generation
172
+ this.register({
173
+ id: "prd-question",
174
+ name: "PRD Question Generation",
175
+ description: "Generate clarifying questions for a PRD",
176
+ validateInput: (input) => typeof input.file === "string" && input.file.length > 0,
177
+ execute: async (input, aiOptions, streamingOptions) => {
178
+ return await prd_1.prdService.generateQuestions({
179
+ file: input.file,
180
+ workingDirectory: input.workingDirectory,
181
+ enableFilesystemTools: input.tools,
182
+ promptOverride: input.prompt,
183
+ messageOverride: input.message,
184
+ aiOptions,
185
+ streamingOptions,
186
+ callbacks: {},
187
+ });
188
+ },
189
+ });
190
+ // PRD Refinement
191
+ this.register({
192
+ id: "prd-refine",
193
+ name: "PRD Refinement",
194
+ description: "Refine a PRD by generating questions and incorporating answers",
195
+ validateInput: (input) => typeof input.file === "string" &&
196
+ input.file.length > 0 &&
197
+ typeof input.questionMode === "string" &&
198
+ (input.questionMode === "user" || input.questionMode === "ai"),
199
+ execute: async (input, aiOptions, streamingOptions) => {
200
+ return await prd_1.prdService.refinePRDWithQuestions({
201
+ file: input.file,
202
+ questionMode: input.questionMode,
203
+ answers: input.answers,
204
+ questionAIOptions: input.questionAIOptions,
205
+ workingDirectory: input.workingDirectory,
206
+ enableFilesystemTools: input.tools,
207
+ aiOptions,
208
+ streamingOptions,
209
+ callbacks: {},
210
+ });
211
+ },
212
+ });
86
213
  }
87
214
  }
88
215
  exports.BenchmarkRegistry = BenchmarkRegistry;
@@ -7,6 +7,8 @@ export declare class BetterTStackService {
7
7
  }>;
8
8
  private convertToAPIConfig;
9
9
  private saveBTSConfig;
10
+ private addCheckTypesScript;
11
+ private copyDocumentation;
10
12
  }
11
13
  export interface InitOptions {
12
14
  projectName?: string;
@@ -18,7 +20,7 @@ export interface InitOptions {
18
20
  addons?: string[];
19
21
  runtime?: string;
20
22
  api?: string;
21
- payments?: string;
23
+ payment?: string;
22
24
  orm?: string;
23
25
  dbSetup?: string;
24
26
  packageManager?: string;
@@ -27,6 +29,7 @@ export interface InitOptions {
27
29
  serverDeploy?: string;
28
30
  noInstall?: boolean;
29
31
  examples?: string[];
32
+ includeDocs?: boolean;
30
33
  }
31
34
  export declare function runBetterTStackCLI(options: InitOptions, workingDirectory?: string): Promise<{
32
35
  success: boolean;
@@ -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;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"}
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;IAqEF,OAAO,CAAC,kBAAkB;YA0BZ,aAAa;YAiCb,mBAAmB;YAiCnB,iBAAiB;CA+ChC;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,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,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;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;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,CAwCtE"}
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.BetterTStackService = void 0;
4
37
  exports.runBetterTStackCLI = runBetterTStackCLI;
@@ -28,7 +61,21 @@ class BetterTStackService {
28
61
  }
29
62
  if (result.success) {
30
63
  // Save configuration
31
- await this.saveBTSConfig(name, config);
64
+ await this.saveBTSConfig(name, config, result.projectDirectory);
65
+ // Post-bootstrap enhancements
66
+ try {
67
+ const projectDir = result.projectDirectory;
68
+ // 1. Add check-types script to packages
69
+ await this.addCheckTypesScript(projectDir);
70
+ // 2. Copy documentation if requested
71
+ if (config.includeDocs) {
72
+ await this.copyDocumentation(projectDir);
73
+ }
74
+ }
75
+ catch (error) {
76
+ console.error("⚠ Post-bootstrap enhancements failed:", error);
77
+ // Don't fail the whole process, just log warning
78
+ }
32
79
  return {
33
80
  success: true,
34
81
  projectPath: result.relativePath,
@@ -72,10 +119,17 @@ class BetterTStackService {
72
119
  ? config.examples
73
120
  : undefined,
74
121
  disableAnalytics: true,
122
+ payments: config.payments,
75
123
  };
76
124
  }
77
- async saveBTSConfig(name, config) {
78
- const taskOMaticDir = config_1.configManager.getTaskOMaticDir();
125
+ async saveBTSConfig(name, config, projectPath) {
126
+ const taskOMaticDir = projectPath
127
+ ? (0, path_1.join)(projectPath, ".task-o-matic")
128
+ : config_1.configManager.getTaskOMaticDir();
129
+ // Ensure directory exists if we're using a specific project path
130
+ if (projectPath && !require("fs").existsSync(taskOMaticDir)) {
131
+ require("fs").mkdirSync(taskOMaticDir, { recursive: true });
132
+ }
79
133
  const configData = JSON.stringify({
80
134
  ...config,
81
135
  projectName: config.projectName || name,
@@ -88,6 +142,72 @@ class BetterTStackService {
88
142
  const stackConfigPath = (0, path_1.join)(taskOMaticDir, "stack.json");
89
143
  (0, fs_1.writeFileSync)(stackConfigPath, configData);
90
144
  }
145
+ async addCheckTypesScript(projectDir) {
146
+ const { glob } = await Promise.resolve().then(() => __importStar(require("glob")));
147
+ const { readFileSync, writeFileSync } = await Promise.resolve().then(() => __importStar(require("fs")));
148
+ console.log("🔍 Adding check-types scripts to packages...");
149
+ // Find all package.json files in apps and backend directories
150
+ const packageFiles = await glob(["apps/*/package.json", "backend/*/package.json"], { cwd: projectDir, absolute: true });
151
+ for (const file of packageFiles) {
152
+ try {
153
+ const content = JSON.parse(readFileSync(file, "utf-8"));
154
+ if (!content.scripts) {
155
+ content.scripts = {};
156
+ }
157
+ // Add check-types script if not present
158
+ if (!content.scripts["check-types"]) {
159
+ content.scripts["check-types"] = "tsc --noEmit";
160
+ writeFileSync(file, JSON.stringify(content, null, 2) + "\n");
161
+ console.log(` ✓ Added check-types to ${file.split("/").slice(-3).join("/")}`);
162
+ }
163
+ }
164
+ catch (err) {
165
+ console.warn(` ⚠ Failed to update ${file}:`, err);
166
+ }
167
+ }
168
+ }
169
+ async copyDocumentation(projectDir) {
170
+ const { copyFileSync, mkdirSync, existsSync } = await Promise.resolve().then(() => __importStar(require("fs")));
171
+ const { resolve, dirname } = await Promise.resolve().then(() => __importStar(require("path")));
172
+ console.log("📚 Copying documentation...");
173
+ try {
174
+ // Source: docs/agents/cli.md in the current package
175
+ // We need to find where the package is installed or running from
176
+ // Assuming we are running from dist/lib/better-t-stack-cli.js or similar
177
+ // The docs should be in ../../docs/agents/cli.md relative to this file's location in source
178
+ // Or in the package root if installed
179
+ let sourcePath = resolve(__dirname, "../../../docs/agents/cli.md");
180
+ // Check if we're in dist
181
+ if (!existsSync(sourcePath)) {
182
+ // Try to find it relative to package root (cwd when running dev)
183
+ sourcePath = resolve(process.cwd(), "docs/agents/cli.md");
184
+ }
185
+ if (!existsSync(sourcePath)) {
186
+ // Try to find it in node_modules if installed as dependency
187
+ try {
188
+ sourcePath = require.resolve("task-o-matic/docs/agents/cli.md");
189
+ }
190
+ catch (e) {
191
+ // Ignore
192
+ }
193
+ }
194
+ if (existsSync(sourcePath)) {
195
+ const destPath = (0, path_1.join)(projectDir, "docs/task-o-matic.md");
196
+ const destDir = dirname(destPath);
197
+ if (!existsSync(destDir)) {
198
+ mkdirSync(destDir, { recursive: true });
199
+ }
200
+ copyFileSync(sourcePath, destPath);
201
+ console.log(` ✓ Copied documentation to docs/task-o-matic.md`);
202
+ }
203
+ else {
204
+ console.warn(" ⚠ Could not locate source documentation file");
205
+ }
206
+ }
207
+ catch (err) {
208
+ console.warn(" ⚠ Failed to copy documentation:", err);
209
+ }
210
+ }
91
211
  }
92
212
  exports.BetterTStackService = BetterTStackService;
93
213
  async function runBetterTStackCLI(options, workingDirectory) {
@@ -103,9 +223,9 @@ async function runBetterTStackCLI(options, workingDirectory) {
103
223
  : options.database || "sqlite",
104
224
  auth: options.noAuth ? "none" : "better-auth",
105
225
  addons: options.addons || ["turborepo"],
106
- runtime: isConvex ? "none" : options.runtime || "node",
226
+ runtime: isConvex || backend === "self" ? "none" : options.runtime || "node",
107
227
  api: options.api || "none",
108
- payments: options.payments || "none",
228
+ payments: options.payment || "none",
109
229
  orm: isConvex ? "none" : options.orm || "drizzle",
110
230
  dbSetup: isConvex ? "none" : options.dbSetup || "none",
111
231
  packageManager: options.packageManager || "npm",
@@ -114,6 +234,7 @@ async function runBetterTStackCLI(options, workingDirectory) {
114
234
  serverDeploy: options.serverDeploy || "none",
115
235
  install: !options.noInstall,
116
236
  examples: options.examples || [],
237
+ includeDocs: options.includeDocs,
117
238
  };
118
239
  const result = await btsService.createProject(options.projectName || options.name || "", btsConfig, workingDirectory);
119
240
  return {
@@ -3,21 +3,28 @@ export interface Config {
3
3
  ai: AIConfig;
4
4
  workingDirectory?: string;
5
5
  }
6
+ export interface ConfigCallbacks {
7
+ read: (key: string) => Promise<string | null>;
8
+ write: (key: string, value: string) => Promise<void>;
9
+ getEnv: (key: string) => string | undefined;
10
+ }
11
+ export declare function createDefaultConfigCallbacks(workingDir?: string): ConfigCallbacks;
6
12
  export declare class ConfigManager {
7
13
  private config;
8
14
  private customWorkingDir;
9
- constructor(workingDirectory?: string);
15
+ private callbacks;
16
+ constructor(callbacks?: ConfigCallbacks, workingDirectory?: string);
10
17
  setWorkingDirectory(dir: string): void;
18
+ setCallbacks(callbacks: ConfigCallbacks): void;
11
19
  getWorkingDirectory(): string;
12
- ensureTaskOMaticDir(): void;
20
+ getTaskOMaticDir(): string;
13
21
  private loadEnvConfig;
14
- load(): Config;
15
- save(): void;
22
+ load(): Promise<Config>;
23
+ save(): Promise<void>;
16
24
  getConfig(): Config;
17
25
  getAIConfig(): AIConfig;
18
- setAIConfig(aiConfig: Partial<AIConfig>): void;
26
+ setAIConfig(aiConfig: Partial<AIConfig>): Promise<void>;
19
27
  setConfig(config: Config): void;
20
- getTaskOMaticDir(): string;
21
28
  getConfigFilePath(): string;
22
29
  }
23
30
  export declare const configManager: ConfigManager;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAA6C,MAAM,UAAU,CAAC;AAE/E,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,QAAQ,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAyCD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,gBAAgB,CAAuB;gBAEnC,gBAAgB,CAAC,EAAE,MAAM;IAOrC,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMtC,mBAAmB,IAAI,MAAM;IAI7B,mBAAmB,IAAI,IAAI;IAO3B,OAAO,CAAC,aAAa;IAcrB,IAAI,IAAI,MAAM;IA2Cd,IAAI,IAAI,IAAI;IAaZ,SAAS,IAAI,MAAM;IAOnB,WAAW,IAAI,QAAQ;IAIvB,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI;IAQ9C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,gBAAgB,IAAI,MAAM;IAIxB,iBAAiB,IAAI,MAAM;CAM5B;AAID,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"}
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.configManager = exports.ConfigManager = void 0;
4
- const fs_1 = require("fs");
5
- const process_1 = require("process");
4
+ exports.createDefaultConfigCallbacks = createDefaultConfigCallbacks;
6
5
  const path_1 = require("path");
6
+ const process_1 = require("process");
7
+ const fs_1 = require("fs");
7
8
  const dotenv_1 = require("dotenv");
8
9
  // Provider-specific sensible defaults for 2025
9
10
  const PROVIDER_DEFAULTS = {
@@ -28,61 +29,101 @@ const PROVIDER_DEFAULTS = {
28
29
  temperature: 0.5,
29
30
  },
30
31
  };
31
- function getApiKeyFromEnv(provider) {
32
+ function getApiKeyFromEnv(provider, getEnv) {
32
33
  switch (provider) {
33
34
  case "openrouter":
34
- return process.env.OPENROUTER_API_KEY;
35
+ return getEnv("OPENROUTER_API_KEY");
35
36
  case "anthropic":
36
- return process.env.ANTHROPIC_API_KEY;
37
+ return getEnv("ANTHROPIC_API_KEY");
37
38
  case "openai":
38
- return process.env.OPENAI_API_KEY;
39
+ return getEnv("OPENAI_API_KEY");
39
40
  case "custom":
40
- return process.env.CUSTOM_API_KEY;
41
+ return getEnv("CUSTOM_API_KEY");
41
42
  default:
42
43
  return undefined;
43
44
  }
44
45
  }
46
+ function createDefaultConfigCallbacks(workingDir = (0, process_1.cwd)()) {
47
+ // Ensure dotenv is loaded for the default callbacks
48
+ const envPath = (0, path_1.join)(workingDir, ".env");
49
+ if ((0, fs_1.existsSync)(envPath)) {
50
+ (0, dotenv_1.config)({ path: envPath });
51
+ }
52
+ return {
53
+ read: async (key) => {
54
+ // If key is relative, assume it's in .task-o-matic dir relative to workingDir
55
+ // But ConfigManager usually passes "config.json"
56
+ // We need to resolve it.
57
+ // For default callbacks, we replicate the original behavior:
58
+ // .task-o-matic/config.json in workingDir
59
+ const configPath = (0, path_1.join)(workingDir, ".task-o-matic", key);
60
+ if ((0, fs_1.existsSync)(configPath)) {
61
+ return (0, fs_1.readFileSync)(configPath, "utf-8");
62
+ }
63
+ return null;
64
+ },
65
+ write: async (key, value) => {
66
+ const taskOMaticDir = (0, path_1.join)(workingDir, ".task-o-matic");
67
+ if (!(0, fs_1.existsSync)(taskOMaticDir)) {
68
+ (0, fs_1.mkdirSync)(taskOMaticDir, { recursive: true });
69
+ }
70
+ const configPath = (0, path_1.join)(taskOMaticDir, key);
71
+ (0, fs_1.writeFileSync)(configPath, value, "utf-8");
72
+ },
73
+ getEnv: (key) => process.env[key],
74
+ };
75
+ }
45
76
  class ConfigManager {
46
77
  config = null;
47
78
  customWorkingDir = null;
48
- constructor(workingDirectory) {
79
+ callbacks;
80
+ constructor(callbacks, workingDirectory) {
49
81
  if (workingDirectory) {
50
- this.setWorkingDirectory(workingDirectory);
82
+ this.customWorkingDir = (0, path_1.resolve)(workingDirectory);
51
83
  }
52
- this.load();
84
+ // If callbacks not provided, create defaults using the working directory
85
+ this.callbacks =
86
+ callbacks || createDefaultConfigCallbacks(this.getWorkingDirectory());
87
+ // We cannot await in constructor.
88
+ // Consumers MUST call load() or ensure it's loaded before accessing config.
89
+ // For backward compatibility in CLI (where sync access was common),
90
+ // we might need a way to force sync load if using default callbacks?
91
+ // But we want to support async callbacks.
92
+ // So we enforce async initialization pattern.
53
93
  }
54
94
  setWorkingDirectory(dir) {
55
95
  this.customWorkingDir = (0, path_1.resolve)(dir);
56
- // Reload config when directory changes
57
- this.load();
96
+ // Re-create default callbacks to point to new dir
97
+ this.callbacks = createDefaultConfigCallbacks(this.getWorkingDirectory());
98
+ // Invalidate config so next access requires reload
99
+ this.config = null;
100
+ }
101
+ setCallbacks(callbacks) {
102
+ this.callbacks = callbacks;
103
+ this.config = null;
58
104
  }
59
105
  getWorkingDirectory() {
60
106
  return this.customWorkingDir || (0, process_1.cwd)();
61
107
  }
62
- ensureTaskOMaticDir() {
63
- const taskOMaticDir = this.getTaskOMaticDir();
64
- if (!(0, fs_1.existsSync)(taskOMaticDir)) {
65
- (0, fs_1.mkdirSync)(taskOMaticDir, { recursive: true });
66
- }
108
+ getTaskOMaticDir() {
109
+ return (0, path_1.join)(this.getWorkingDirectory(), ".task-o-matic");
67
110
  }
68
111
  loadEnvConfig() {
69
- const env = process.env;
70
- const provider = env.AI_PROVIDER?.toLowerCase() || "openrouter";
112
+ const provider = this.callbacks.getEnv("AI_PROVIDER")?.toLowerCase() ||
113
+ "openrouter";
71
114
  const defaults = PROVIDER_DEFAULTS[provider] || PROVIDER_DEFAULTS.openrouter;
115
+ const maxTokensStr = this.callbacks.getEnv("AI_MAX_TOKENS");
116
+ const tempStr = this.callbacks.getEnv("AI_TEMPERATURE");
117
+ const modelStr = this.callbacks.getEnv("AI_MODEL");
72
118
  return {
73
119
  provider,
74
- model: env.AI_MODEL || defaults.model,
75
- maxTokens: env.AI_MAX_TOKENS ? parseInt(env.AI_MAX_TOKENS) : defaults.maxTokens,
76
- temperature: env.AI_TEMPERATURE ? parseFloat(env.AI_TEMPERATURE) : defaults.temperature,
77
- apiKey: getApiKeyFromEnv(provider),
120
+ model: modelStr || defaults.model,
121
+ maxTokens: maxTokensStr ? parseInt(maxTokensStr) : defaults.maxTokens,
122
+ temperature: tempStr ? parseFloat(tempStr) : defaults.temperature,
123
+ apiKey: getApiKeyFromEnv(provider, this.callbacks.getEnv),
78
124
  };
79
125
  }
80
- load() {
81
- const workingDir = this.getWorkingDirectory();
82
- const envPath = (0, path_1.join)(workingDir, '.env');
83
- if ((0, fs_1.existsSync)(envPath)) {
84
- (0, dotenv_1.config)({ path: envPath });
85
- }
126
+ async load() {
86
127
  const envConfig = this.loadEnvConfig();
87
128
  const defaultConfig = {
88
129
  ai: {
@@ -93,65 +134,66 @@ class ConfigManager {
93
134
  ...envConfig,
94
135
  },
95
136
  };
96
- const configFilePath = this.getConfigFilePath();
97
- if ((0, fs_1.existsSync)(configFilePath)) {
98
- try {
99
- const configData = (0, fs_1.readFileSync)(configFilePath, "utf-8");
137
+ try {
138
+ // Use relative path "config.json" - callbacks handle resolution
139
+ const configData = await this.callbacks.read("config.json");
140
+ if (configData) {
100
141
  const fileConfig = JSON.parse(configData);
101
142
  this.config = {
102
143
  ...defaultConfig,
103
144
  ...fileConfig,
104
- ai: { ...defaultConfig.ai, ...fileConfig.ai, ...envConfig }
145
+ ai: { ...defaultConfig.ai, ...fileConfig.ai, ...envConfig },
105
146
  };
106
147
  if (this.config && this.config.workingDirectory) {
107
148
  this.customWorkingDir = this.config.workingDirectory;
108
149
  }
109
150
  }
110
- catch (error) {
111
- console.warn("Failed to read config file, using defaults:", error);
151
+ else {
112
152
  this.config = defaultConfig;
113
153
  }
114
154
  }
115
- else {
155
+ catch (error) {
156
+ console.warn("Failed to read config, using defaults:", error);
116
157
  this.config = defaultConfig;
117
158
  }
118
159
  return this.config;
119
160
  }
120
- save() {
161
+ async save() {
121
162
  if (!this.config) {
122
163
  throw new Error("Config not loaded, cannot save.");
123
164
  }
124
- this.ensureTaskOMaticDir();
125
165
  try {
126
- const configFilePath = this.getConfigFilePath();
127
- (0, fs_1.writeFileSync)(configFilePath, JSON.stringify(this.config, null, 2));
166
+ await this.callbacks.write("config.json", JSON.stringify(this.config, null, 2));
128
167
  }
129
168
  catch (error) {
130
169
  console.error("Failed to save config:", error);
170
+ throw error;
131
171
  }
132
172
  }
133
173
  getConfig() {
134
174
  if (!this.config) {
135
- return this.load();
175
+ // If we are here, it means load() wasn't called or hasn't finished.
176
+ // Since we can't be async here, we must throw or return defaults.
177
+ // Returning defaults might hide issues.
178
+ // Throwing forces users to await load().
179
+ throw new Error("Config not loaded. Call await configManager.load() first.");
136
180
  }
137
181
  return this.config;
138
182
  }
139
183
  getAIConfig() {
140
184
  return this.getConfig().ai;
141
185
  }
142
- setAIConfig(aiConfig) {
186
+ async setAIConfig(aiConfig) {
143
187
  if (!this.config) {
144
- this.load();
188
+ await this.load();
145
189
  }
146
190
  this.config.ai = { ...this.config.ai, ...aiConfig };
147
- this.save();
191
+ await this.save();
148
192
  }
149
193
  setConfig(config) {
150
194
  this.config = config;
151
195
  }
152
- getTaskOMaticDir() {
153
- return (0, path_1.join)(this.getWorkingDirectory(), ".task-o-matic");
154
- }
196
+ // Helper for legacy code that might need path (deprecated for direct use)
155
197
  getConfigFilePath() {
156
198
  return (0, path_1.join)(this.getTaskOMaticDir(), "config.json");
157
199
  }
@@ -1,10 +1,22 @@
1
1
  import { TaskContext, TaskDocumentation } from "../types";
2
2
  import { TaskRepository } from "./storage/types";
3
+ export interface FileStats {
4
+ mtime: number;
5
+ isDirectory: boolean;
6
+ }
7
+ export interface ContextCallbacks {
8
+ readFile: (path: string) => Promise<string | null>;
9
+ fileExists: (path: string) => Promise<boolean>;
10
+ listFiles: (dir: string) => Promise<string[]>;
11
+ stat: (path: string) => Promise<FileStats | null>;
12
+ }
13
+ export declare function createDefaultContextCallbacks(): ContextCallbacks;
3
14
  export declare class ContextBuilder {
4
15
  private storage;
16
+ private callbacks;
5
17
  private taskOMatic;
6
18
  private initialized;
7
- constructor(storage: TaskRepository);
19
+ constructor(storage: TaskRepository, callbacks?: ContextCallbacks);
8
20
  private ensureInitialized;
9
21
  /**
10
22
  * Build comprehensive context for AI operations
@@ -1 +1 @@
1
- {"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../src/lib/context-builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,WAAW,EAAa,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,cAAc;IAInC,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuCxD;;OAEG;IACG,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC;IAsBvB;;OAEG;IACH,OAAO,CAAC,cAAc;IA6CtB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAmB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAkB7B;;OAEG;IACH,oBAAoB,CAAC,aAAa,EAAE,iBAAiB,GAAG,OAAO;IAK/D;;OAEG;IACH,oBAAoB,CAAC,aAAa,EAAE,iBAAiB,GAAG,OAAO;IAK/D;;OAEG;IACH,OAAO,CAAC,aAAa;IAqBrB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0C7B;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM;CAmDjD"}
1
+ {"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../src/lib/context-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,WAAW,EAAa,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnD,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;CACnD;AAED,wBAAgB,6BAA6B,IAAI,gBAAgB,CA4BhE;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,gBAAgB;IAKjE,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAsCxD;;OAEG;IACG,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC;IAsBvB;;OAEG;YACW,cAAc;IA8C5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;YACW,kBAAkB;IAiBhC;;OAEG;YACW,qBAAqB;IAmBnC;;OAEG;IACH,oBAAoB,CAAC,aAAa,EAAE,iBAAiB,GAAG,OAAO;IAK/D;;OAEG;IACH,oBAAoB,CAAC,aAAa,EAAE,iBAAiB,GAAG,OAAO;IAK/D;;OAEG;YACW,aAAa;IAkB3B;;OAEG;YACW,qBAAqB;IAqDnC;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM;CAmDjD"}