@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/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
+ }