@e0ipso/ai-task-manager 1.0.1
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/LICENSE +68 -0
- package/README.md +128 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +90 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +219 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +66 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +184 -0
- package/dist/logger.js.map +1 -0
- package/dist/types.d.ts +256 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +62 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +210 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +553 -0
- package/dist/utils.js.map +1 -0
- package/package.json +86 -0
- package/templates/ai-task-manager/TASK_MANAGER_INFO.md +54 -0
- package/templates/ai-task-manager/VALIDATION_GATES.md +5 -0
- package/templates/commands/tasks/create-plan.md +142 -0
- package/templates/commands/tasks/create-plan.toml +72 -0
- package/templates/commands/tasks/execute-blueprint.md +163 -0
- package/templates/commands/tasks/execute-blueprint.toml +156 -0
- package/templates/commands/tasks/generate-tasks.md +466 -0
- package/templates/commands/tasks/generate-tasks.toml +220 -0
package/dist/utils.js
ADDED
|
@@ -0,0 +1,553 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Helper Functions for File Operations
|
|
4
|
+
*
|
|
5
|
+
* This file contains utility functions for file system operations,
|
|
6
|
+
* path manipulation, and other common tasks used by the CLI
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.ensureDir = ensureDir;
|
|
43
|
+
exports.directoryExists = directoryExists;
|
|
44
|
+
exports.fileExists = fileExists;
|
|
45
|
+
exports.exists = exists;
|
|
46
|
+
exports.copyTemplate = copyTemplate;
|
|
47
|
+
exports.writeJsonFile = writeJsonFile;
|
|
48
|
+
exports.readJsonFile = readJsonFile;
|
|
49
|
+
exports.parseAssistants = parseAssistants;
|
|
50
|
+
exports.validateAssistants = validateAssistants;
|
|
51
|
+
exports.getAbsolutePath = getAbsolutePath;
|
|
52
|
+
exports.getRelativePath = getRelativePath;
|
|
53
|
+
exports.joinPath = joinPath;
|
|
54
|
+
exports.getDirName = getDirName;
|
|
55
|
+
exports.getBaseName = getBaseName;
|
|
56
|
+
exports.getExtension = getExtension;
|
|
57
|
+
exports.getTemplateFormat = getTemplateFormat;
|
|
58
|
+
exports.getTemplatePath = getTemplatePath;
|
|
59
|
+
exports.getCreatedDirectories = getCreatedDirectories;
|
|
60
|
+
exports.ensureTrailingSlash = ensureTrailingSlash;
|
|
61
|
+
exports.sanitizeFilename = sanitizeFilename;
|
|
62
|
+
exports.getHomeDirectory = getHomeDirectory;
|
|
63
|
+
exports.remove = remove;
|
|
64
|
+
exports.move = move;
|
|
65
|
+
exports.resolvePath = resolvePath;
|
|
66
|
+
exports.parseFrontmatter = parseFrontmatter;
|
|
67
|
+
exports.escapeTomlString = escapeTomlString;
|
|
68
|
+
exports.convertMdToToml = convertMdToToml;
|
|
69
|
+
exports.readAndProcessTemplate = readAndProcessTemplate;
|
|
70
|
+
exports.writeProcessedTemplate = writeProcessedTemplate;
|
|
71
|
+
exports.getMarkdownTemplateNames = getMarkdownTemplateNames;
|
|
72
|
+
const fs = __importStar(require("fs-extra"));
|
|
73
|
+
const path = __importStar(require("path"));
|
|
74
|
+
const types_1 = require("./types");
|
|
75
|
+
/**
|
|
76
|
+
* Create a directory recursively if it doesn't exist
|
|
77
|
+
* @param dirPath - The directory path to create
|
|
78
|
+
* @throws FileSystemError if directory creation fails
|
|
79
|
+
*/
|
|
80
|
+
async function ensureDir(dirPath) {
|
|
81
|
+
try {
|
|
82
|
+
await fs.ensureDir(dirPath);
|
|
83
|
+
}
|
|
84
|
+
catch (_error) {
|
|
85
|
+
const errorMessage = _error instanceof Error ? _error.message : 'Unknown error';
|
|
86
|
+
throw new types_1.FileSystemError(`Failed to create directory: ${dirPath}`, {
|
|
87
|
+
originalError: errorMessage,
|
|
88
|
+
path: dirPath,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Check if a directory exists
|
|
94
|
+
* @param dirPath - The directory path to check
|
|
95
|
+
* @returns Promise<boolean> - True if directory exists, false otherwise
|
|
96
|
+
*/
|
|
97
|
+
async function directoryExists(dirPath) {
|
|
98
|
+
try {
|
|
99
|
+
const stats = await fs.stat(dirPath);
|
|
100
|
+
return stats.isDirectory();
|
|
101
|
+
}
|
|
102
|
+
catch (_error) {
|
|
103
|
+
// If file doesn't exist or any other error, return false
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Check if a file exists
|
|
109
|
+
* @param filePath - The file path to check
|
|
110
|
+
* @returns Promise<boolean> - True if file exists, false otherwise
|
|
111
|
+
*/
|
|
112
|
+
async function fileExists(filePath) {
|
|
113
|
+
try {
|
|
114
|
+
const stats = await fs.stat(filePath);
|
|
115
|
+
return stats.isFile();
|
|
116
|
+
}
|
|
117
|
+
catch (_error) {
|
|
118
|
+
// If file doesn't exist or any other error, return false
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check if a file or directory exists (generic)
|
|
124
|
+
* @param filepath - The path to check
|
|
125
|
+
* @returns Promise<boolean> - True if path exists, false otherwise
|
|
126
|
+
*/
|
|
127
|
+
async function exists(filepath) {
|
|
128
|
+
try {
|
|
129
|
+
await fs.access(filepath);
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Copy a file or directory from source to destination
|
|
138
|
+
* @param src - Source path (file or directory)
|
|
139
|
+
* @param dest - Destination path
|
|
140
|
+
* @param options - Copy options
|
|
141
|
+
* @throws FileSystemError if copy operation fails
|
|
142
|
+
*/
|
|
143
|
+
async function copyTemplate(src, dest, options = { overwrite: true }) {
|
|
144
|
+
try {
|
|
145
|
+
await fs.copy(src, dest, options);
|
|
146
|
+
}
|
|
147
|
+
catch (_error) {
|
|
148
|
+
const errorMessage = _error instanceof Error ? _error.message : 'Unknown error';
|
|
149
|
+
throw new types_1.FileSystemError(`Failed to copy from ${src} to ${dest}`, {
|
|
150
|
+
originalError: errorMessage,
|
|
151
|
+
source: src,
|
|
152
|
+
destination: dest,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Write JSON data to a file with proper formatting
|
|
158
|
+
* @param filePath - The file path to write to
|
|
159
|
+
* @param data - The data to write as JSON
|
|
160
|
+
* @throws FileSystemError if write operation fails
|
|
161
|
+
*/
|
|
162
|
+
async function writeJsonFile(filePath, data) {
|
|
163
|
+
try {
|
|
164
|
+
await fs.writeJson(filePath, data, { spaces: 2 });
|
|
165
|
+
}
|
|
166
|
+
catch (_error) {
|
|
167
|
+
const errorMessage = _error instanceof Error ? _error.message : 'Unknown error';
|
|
168
|
+
throw new types_1.FileSystemError(`Failed to write JSON file: ${filePath}`, {
|
|
169
|
+
originalError: errorMessage,
|
|
170
|
+
path: filePath,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Read and parse a JSON file
|
|
176
|
+
* @param filePath - The file path to read from
|
|
177
|
+
* @returns The parsed JSON data
|
|
178
|
+
* @throws FileSystemError if read operation fails
|
|
179
|
+
*/
|
|
180
|
+
async function readJsonFile(filePath) {
|
|
181
|
+
try {
|
|
182
|
+
return await fs.readJson(filePath);
|
|
183
|
+
}
|
|
184
|
+
catch (_error) {
|
|
185
|
+
const errorMessage = _error instanceof Error ? _error.message : 'Unknown error';
|
|
186
|
+
throw new types_1.FileSystemError(`Failed to read JSON file: ${filePath}`, {
|
|
187
|
+
originalError: errorMessage,
|
|
188
|
+
path: filePath,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Parse comma-separated assistant values into an array
|
|
194
|
+
* @param value - Comma-separated string of assistant names
|
|
195
|
+
* @returns Array of assistant names
|
|
196
|
+
* @throws Error if invalid assistant names are provided
|
|
197
|
+
*/
|
|
198
|
+
function parseAssistants(value) {
|
|
199
|
+
const validAssistants = ['claude', 'gemini'];
|
|
200
|
+
if (!value.trim()) {
|
|
201
|
+
throw new Error('Assistants parameter cannot be empty');
|
|
202
|
+
}
|
|
203
|
+
const assistants = value
|
|
204
|
+
.split(',')
|
|
205
|
+
.map(a => a.trim().toLowerCase())
|
|
206
|
+
.filter(a => a.length > 0);
|
|
207
|
+
// Validate that all assistants are valid
|
|
208
|
+
const invalidAssistants = assistants.filter((assistant) => !validAssistants.includes(assistant));
|
|
209
|
+
if (invalidAssistants.length > 0) {
|
|
210
|
+
throw new Error(`Invalid assistant(s): ${invalidAssistants.join(', ')}. Valid options are: ${validAssistants.join(', ')}`);
|
|
211
|
+
}
|
|
212
|
+
// Remove duplicates and return
|
|
213
|
+
return Array.from(new Set(assistants));
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Validate that all assistants are supported
|
|
217
|
+
* @param assistants - Array of assistants to validate
|
|
218
|
+
* @throws Error if any assistant is invalid or array is empty
|
|
219
|
+
*/
|
|
220
|
+
function validateAssistants(assistants) {
|
|
221
|
+
const validAssistants = ['claude', 'gemini'];
|
|
222
|
+
if (assistants.length === 0) {
|
|
223
|
+
throw new Error('At least one assistant must be specified');
|
|
224
|
+
}
|
|
225
|
+
for (const assistant of assistants) {
|
|
226
|
+
if (!validAssistants.includes(assistant)) {
|
|
227
|
+
throw new Error(`Invalid assistant: ${assistant}. Supported assistants: ${validAssistants.join(', ')}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Get the absolute path for a given path, resolving it relative to the current working directory
|
|
233
|
+
* @param inputPath - The input path (can be relative or absolute)
|
|
234
|
+
* @returns The absolute path
|
|
235
|
+
*/
|
|
236
|
+
function getAbsolutePath(inputPath) {
|
|
237
|
+
return path.isAbsolute(inputPath) ? inputPath : path.resolve(process.cwd(), inputPath);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Get the relative path from one path to another
|
|
241
|
+
* @param from - The source path
|
|
242
|
+
* @param to - The target path
|
|
243
|
+
* @returns The relative path
|
|
244
|
+
*/
|
|
245
|
+
function getRelativePath(from, to) {
|
|
246
|
+
return path.relative(from, to);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Join multiple path segments into a single path
|
|
250
|
+
* @param segments - Path segments to join
|
|
251
|
+
* @returns The joined path
|
|
252
|
+
*/
|
|
253
|
+
function joinPath(...segments) {
|
|
254
|
+
return path.join(...segments);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Get the directory name from a file path
|
|
258
|
+
* @param filePath - The file path
|
|
259
|
+
* @returns The directory name
|
|
260
|
+
*/
|
|
261
|
+
function getDirName(filePath) {
|
|
262
|
+
return path.dirname(filePath);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Get the base name (filename) from a file path
|
|
266
|
+
* @param filePath - The file path
|
|
267
|
+
* @param ext - Optional extension to remove
|
|
268
|
+
* @returns The base name
|
|
269
|
+
*/
|
|
270
|
+
function getBaseName(filePath, ext) {
|
|
271
|
+
return path.basename(filePath, ext);
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Get the file extension from a file path
|
|
275
|
+
* @param filePath - The file path
|
|
276
|
+
* @returns The file extension (including the dot)
|
|
277
|
+
*/
|
|
278
|
+
function getExtension(filePath) {
|
|
279
|
+
return path.extname(filePath);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Get the template format for a specific assistant
|
|
283
|
+
* @param assistant - The assistant type
|
|
284
|
+
* @returns The template format to use ('md' for Claude, 'toml' for Gemini)
|
|
285
|
+
*/
|
|
286
|
+
function getTemplateFormat(assistant) {
|
|
287
|
+
switch (assistant) {
|
|
288
|
+
case 'claude':
|
|
289
|
+
return 'md';
|
|
290
|
+
case 'gemini':
|
|
291
|
+
return 'toml';
|
|
292
|
+
default:
|
|
293
|
+
// This should never happen due to type safety, but adding for completeness
|
|
294
|
+
throw new Error(`Unknown assistant type: ${assistant}`);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Get the absolute path to a template file
|
|
299
|
+
* @param templateFile - The template filename
|
|
300
|
+
* @returns The absolute path to the template
|
|
301
|
+
*/
|
|
302
|
+
function getTemplatePath(templateFile) {
|
|
303
|
+
return path.join(__dirname, '..', 'templates', templateFile);
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Get list of directories that will be created for given assistants
|
|
307
|
+
* @param assistants - Array of assistants
|
|
308
|
+
* @param baseDir - Base directory to resolve paths against (defaults to current directory)
|
|
309
|
+
* @returns Array of directory paths to create
|
|
310
|
+
*/
|
|
311
|
+
function getCreatedDirectories(assistants, baseDir) {
|
|
312
|
+
const base = baseDir || '.';
|
|
313
|
+
const dirs = [
|
|
314
|
+
resolvePath(base, '.ai/task-manager'),
|
|
315
|
+
resolvePath(base, '.ai/task-manager/plans'),
|
|
316
|
+
];
|
|
317
|
+
for (const assistant of assistants) {
|
|
318
|
+
dirs.push(resolvePath(base, `.${assistant}`));
|
|
319
|
+
dirs.push(resolvePath(base, `.${assistant}/commands`));
|
|
320
|
+
dirs.push(resolvePath(base, `.${assistant}/commands/tasks`));
|
|
321
|
+
}
|
|
322
|
+
return dirs;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Ensure a directory path ends with a path separator
|
|
326
|
+
* @param dirPath - The directory path
|
|
327
|
+
* @returns The directory path with trailing separator
|
|
328
|
+
*/
|
|
329
|
+
function ensureTrailingSlash(dirPath) {
|
|
330
|
+
return dirPath.endsWith(path.sep) ? dirPath : dirPath + path.sep;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Create a safe filename by removing or replacing invalid characters
|
|
334
|
+
* @param filename - The input filename
|
|
335
|
+
* @returns A safe filename for the current platform
|
|
336
|
+
*/
|
|
337
|
+
function sanitizeFilename(filename) {
|
|
338
|
+
// Replace invalid characters with underscores
|
|
339
|
+
return filename
|
|
340
|
+
.replace(/[<>:"/\\|?*]/g, '_')
|
|
341
|
+
.replace(/\s+/g, '_')
|
|
342
|
+
.replace(/_+/g, '_')
|
|
343
|
+
.replace(/^_|_$/g, '');
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Get the home directory path
|
|
347
|
+
* @returns The user's home directory path
|
|
348
|
+
*/
|
|
349
|
+
function getHomeDirectory() {
|
|
350
|
+
return require('os').homedir();
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Remove a file or directory recursively
|
|
354
|
+
* @param targetPath - The path to remove
|
|
355
|
+
* @throws FileSystemError if removal fails
|
|
356
|
+
*/
|
|
357
|
+
async function remove(targetPath) {
|
|
358
|
+
try {
|
|
359
|
+
await fs.remove(targetPath);
|
|
360
|
+
}
|
|
361
|
+
catch (_error) {
|
|
362
|
+
const errorMessage = _error instanceof Error ? _error.message : 'Unknown error';
|
|
363
|
+
throw new types_1.FileSystemError(`Failed to remove: ${targetPath}`, {
|
|
364
|
+
originalError: errorMessage,
|
|
365
|
+
path: targetPath,
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Move a file or directory from source to destination
|
|
371
|
+
* @param src - Source path
|
|
372
|
+
* @param dest - Destination path
|
|
373
|
+
* @throws FileSystemError if move operation fails
|
|
374
|
+
*/
|
|
375
|
+
async function move(src, dest) {
|
|
376
|
+
try {
|
|
377
|
+
await fs.move(src, dest);
|
|
378
|
+
}
|
|
379
|
+
catch (_error) {
|
|
380
|
+
const errorMessage = _error instanceof Error ? _error.message : 'Unknown error';
|
|
381
|
+
throw new types_1.FileSystemError(`Failed to move from ${src} to ${dest}`, {
|
|
382
|
+
originalError: errorMessage,
|
|
383
|
+
source: src,
|
|
384
|
+
destination: dest,
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Resolve path segments relative to a base directory with cross-platform compatibility
|
|
390
|
+
* @param baseDir - The base directory (defaults to '.' if not provided, null, or undefined)
|
|
391
|
+
* @param segments - Additional path segments to resolve
|
|
392
|
+
* @returns The resolved absolute path
|
|
393
|
+
*/
|
|
394
|
+
function resolvePath(baseDir, ...segments) {
|
|
395
|
+
// Handle edge cases: null, undefined, or empty strings
|
|
396
|
+
const base = baseDir || '.';
|
|
397
|
+
// Filter out any null, undefined, or empty string segments
|
|
398
|
+
const validSegments = segments.filter(segment => segment !== null && segment !== undefined && segment !== '');
|
|
399
|
+
return path.resolve(base, ...validSegments);
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Parse YAML frontmatter from markdown content
|
|
403
|
+
* @param content - The markdown content with frontmatter
|
|
404
|
+
* @returns Object containing frontmatter and body content
|
|
405
|
+
*/
|
|
406
|
+
function parseFrontmatter(content) {
|
|
407
|
+
const frontmatterRegex = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n([\s\S]*))?$/;
|
|
408
|
+
const match = content.match(frontmatterRegex);
|
|
409
|
+
if (!match) {
|
|
410
|
+
return {
|
|
411
|
+
frontmatter: {},
|
|
412
|
+
body: content,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
const frontmatterContent = match[1] || '';
|
|
416
|
+
const bodyContent = match[2] || ''; // match[2] is now undefined when no body exists
|
|
417
|
+
// Simple YAML parser for our specific use case
|
|
418
|
+
const frontmatter = {};
|
|
419
|
+
const lines = frontmatterContent.split('\n');
|
|
420
|
+
for (const line of lines) {
|
|
421
|
+
const trimmed = line.trim();
|
|
422
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
423
|
+
continue;
|
|
424
|
+
const colonIndex = trimmed.indexOf(':');
|
|
425
|
+
if (colonIndex === -1)
|
|
426
|
+
continue;
|
|
427
|
+
const key = trimmed.substring(0, colonIndex).trim();
|
|
428
|
+
const value = trimmed.substring(colonIndex + 1).trim();
|
|
429
|
+
// Remove quotes if present
|
|
430
|
+
frontmatter[key] = value.replace(/^["']|["']$/g, '');
|
|
431
|
+
}
|
|
432
|
+
return {
|
|
433
|
+
frontmatter,
|
|
434
|
+
body: bodyContent,
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Escape a string for TOML format
|
|
439
|
+
* @param str - The string to escape
|
|
440
|
+
* @returns The escaped string suitable for TOML
|
|
441
|
+
*/
|
|
442
|
+
function escapeTomlString(str) {
|
|
443
|
+
return str
|
|
444
|
+
.replace(/\\/g, '\\\\')
|
|
445
|
+
.replace(/"/g, '\\"')
|
|
446
|
+
.replace(/\n/g, '\\n')
|
|
447
|
+
.replace(/\r/g, '\\r')
|
|
448
|
+
.replace(/\t/g, '\\t');
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Convert markdown template content to TOML format for Gemini
|
|
452
|
+
* @param mdContent - The markdown template content
|
|
453
|
+
* @returns The converted TOML content
|
|
454
|
+
*/
|
|
455
|
+
function convertMdToToml(mdContent) {
|
|
456
|
+
const { frontmatter, body } = parseFrontmatter(mdContent);
|
|
457
|
+
// Process the body content for Gemini format
|
|
458
|
+
const processedBody = body
|
|
459
|
+
// Transform $ARGUMENTS → {{args}} (not followed by alphanumeric that would make it an identifier)
|
|
460
|
+
.replace(/\$ARGUMENTS(?![0-9])/g, '{{args}}')
|
|
461
|
+
// Transform $1 → {{plan_id}} (exact match, not part of longer number)
|
|
462
|
+
.replace(/\$1(?![0-9])/g, '{{plan_id}}')
|
|
463
|
+
.replace(/\$2(?![0-9])/g, '{{param2}}')
|
|
464
|
+
.replace(/\$3(?![0-9])/g, '{{param3}}');
|
|
465
|
+
// Build TOML content
|
|
466
|
+
let tomlContent = '[metadata]\n';
|
|
467
|
+
// Add frontmatter fields to metadata section
|
|
468
|
+
for (const [key, value] of Object.entries(frontmatter)) {
|
|
469
|
+
if (key === 'argument-hint') {
|
|
470
|
+
// Special handling for argument-hint - convert to {{}} format
|
|
471
|
+
const convertedHint = String(value)
|
|
472
|
+
.replace(/\[plan-ID\]/g, '{{plan_id}}')
|
|
473
|
+
.replace(/\[user-prompt\]/g, '{{args}}');
|
|
474
|
+
tomlContent += `argument-hint = "${escapeTomlString(convertedHint)}"\n`;
|
|
475
|
+
}
|
|
476
|
+
else {
|
|
477
|
+
tomlContent += `${key} = "${escapeTomlString(String(value))}"\n`;
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
// Add the prompt section with escaped content
|
|
481
|
+
tomlContent += '\n[prompt]\n';
|
|
482
|
+
tomlContent += `content = """${escapeTomlString(processedBody)}"""\n`;
|
|
483
|
+
return tomlContent;
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Read a markdown template file and optionally convert to TOML
|
|
487
|
+
* @param templatePath - Path to the markdown template
|
|
488
|
+
* @param targetFormat - Target format ('md' or 'toml')
|
|
489
|
+
* @returns The template content in the requested format
|
|
490
|
+
*/
|
|
491
|
+
async function readAndProcessTemplate(templatePath, targetFormat) {
|
|
492
|
+
try {
|
|
493
|
+
const mdContent = await fs.readFile(templatePath, 'utf-8');
|
|
494
|
+
if (targetFormat === 'md') {
|
|
495
|
+
return mdContent;
|
|
496
|
+
}
|
|
497
|
+
else if (targetFormat === 'toml') {
|
|
498
|
+
return convertMdToToml(mdContent);
|
|
499
|
+
}
|
|
500
|
+
else {
|
|
501
|
+
throw new Error(`Unsupported template format: ${targetFormat}`);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
catch (_error) {
|
|
505
|
+
const errorMessage = _error instanceof Error ? _error.message : 'Unknown error';
|
|
506
|
+
throw new types_1.FileSystemError(`Failed to read and process template: ${templatePath}`, {
|
|
507
|
+
originalError: errorMessage,
|
|
508
|
+
path: templatePath,
|
|
509
|
+
targetFormat,
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Write processed template content to destination
|
|
515
|
+
* @param content - The template content to write
|
|
516
|
+
* @param destPath - Destination file path
|
|
517
|
+
*/
|
|
518
|
+
async function writeProcessedTemplate(content, destPath) {
|
|
519
|
+
try {
|
|
520
|
+
// Ensure destination directory exists
|
|
521
|
+
await fs.ensureDir(path.dirname(destPath));
|
|
522
|
+
// Write the content
|
|
523
|
+
await fs.writeFile(destPath, content, 'utf-8');
|
|
524
|
+
}
|
|
525
|
+
catch (_error) {
|
|
526
|
+
const errorMessage = _error instanceof Error ? _error.message : 'Unknown error';
|
|
527
|
+
throw new types_1.FileSystemError(`Failed to write processed template: ${destPath}`, {
|
|
528
|
+
originalError: errorMessage,
|
|
529
|
+
path: destPath,
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Get the names of all markdown template files in a given subdirectory of templates.
|
|
535
|
+
* @param templateSubdir - The subdirectory within templates (e.g., 'commands/tasks')
|
|
536
|
+
* @returns An array of template names (filenames without .md extension)
|
|
537
|
+
* @throws FileSystemError if the directory cannot be read
|
|
538
|
+
*/
|
|
539
|
+
async function getMarkdownTemplateNames(templateSubdir) {
|
|
540
|
+
const fullPath = path.join(__dirname, '..', 'templates', templateSubdir);
|
|
541
|
+
try {
|
|
542
|
+
const files = await fs.readdir(fullPath);
|
|
543
|
+
return files.filter(file => file.endsWith('.md')).map(file => path.basename(file, '.md'));
|
|
544
|
+
}
|
|
545
|
+
catch (_error) {
|
|
546
|
+
const errorMessage = _error instanceof Error ? _error.message : 'Unknown error';
|
|
547
|
+
throw new types_1.FileSystemError(`Failed to read template directory: ${fullPath}`, {
|
|
548
|
+
originalError: errorMessage,
|
|
549
|
+
path: fullPath,
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@e0ipso/ai-task-manager",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Task management for AI coding assistants",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"ai-task-manager": "dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"dev": "tsc --watch",
|
|
12
|
+
"start": "node dist/cli.js",
|
|
13
|
+
"test": "jest",
|
|
14
|
+
"test:watch": "jest --watch",
|
|
15
|
+
"lint": "eslint 'src/**/*.ts' --ignore-pattern 'src/**/*.test.ts' --ignore-pattern 'src/**/__tests__/**'",
|
|
16
|
+
"lint:fix": "eslint 'src/**/*.ts' --ignore-pattern 'src/**/*.test.ts' --ignore-pattern 'src/**/__tests__/**' --fix",
|
|
17
|
+
"format": "prettier --write src/**/*.ts",
|
|
18
|
+
"commitlint": "commitlint --edit",
|
|
19
|
+
"clean": "rm -rf dist",
|
|
20
|
+
"prepublishOnly": "npm run build",
|
|
21
|
+
"prepare": "husky",
|
|
22
|
+
"security:audit": "npm audit",
|
|
23
|
+
"security:audit-json": "npm audit --json",
|
|
24
|
+
"security:fix": "npm audit fix",
|
|
25
|
+
"security:fix-force": "npm audit fix --force"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"cli",
|
|
29
|
+
"task-management",
|
|
30
|
+
"ai",
|
|
31
|
+
"npx",
|
|
32
|
+
"typescript"
|
|
33
|
+
],
|
|
34
|
+
"author": "e0ipso",
|
|
35
|
+
"license": "proprietary",
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18.0.0"
|
|
41
|
+
},
|
|
42
|
+
"files": [
|
|
43
|
+
"dist/",
|
|
44
|
+
"templates/",
|
|
45
|
+
"LICENSE"
|
|
46
|
+
],
|
|
47
|
+
"repository": {
|
|
48
|
+
"type": "git",
|
|
49
|
+
"url": "git+https://github.com/e0ipso/ai-task-manager.git"
|
|
50
|
+
},
|
|
51
|
+
"bugs": {
|
|
52
|
+
"url": "https://github.com/e0ipso/ai-task-manager/issues"
|
|
53
|
+
},
|
|
54
|
+
"homepage": "https://github.com/e0ipso/ai-task-manager#readme",
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"chalk": "^5.6.0",
|
|
57
|
+
"commander": "^11.1.0",
|
|
58
|
+
"fs-extra": "^11.3.1"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@commitlint/cli": "^19.8.1",
|
|
62
|
+
"@commitlint/config-conventional": "^19.8.1",
|
|
63
|
+
"@eslint/js": "^9.34.0",
|
|
64
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
65
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
66
|
+
"@semantic-release/git": "^10.0.1",
|
|
67
|
+
"@semantic-release/github": "^11.0.5",
|
|
68
|
+
"@semantic-release/npm": "^12.0.2",
|
|
69
|
+
"@semantic-release/release-notes-generator": "^12.1.0",
|
|
70
|
+
"@types/fs-extra": "^11.0.4",
|
|
71
|
+
"@types/jest": "^30.0.0",
|
|
72
|
+
"@types/node": "^24.3.0",
|
|
73
|
+
"@typescript-eslint/eslint-plugin": "^8.41.0",
|
|
74
|
+
"@typescript-eslint/parser": "^8.41.0",
|
|
75
|
+
"eslint": "^9.34.0",
|
|
76
|
+
"eslint-config-prettier": "^10.1.8",
|
|
77
|
+
"eslint-plugin-prettier": "^5.5.4",
|
|
78
|
+
"husky": "^9.1.7",
|
|
79
|
+
"jest": "^30.1.2",
|
|
80
|
+
"prettier": "^3.6.2",
|
|
81
|
+
"semantic-release": "^24.2.7",
|
|
82
|
+
"ts-jest": "^29.4.1",
|
|
83
|
+
"ts-node": "^10.9.2",
|
|
84
|
+
"typescript": "^5.9.2"
|
|
85
|
+
}
|
|
86
|
+
}
|