@e0ipso/ai-task-manager 1.14.0 → 1.16.0

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/status.js ADDED
@@ -0,0 +1,374 @@
1
+ "use strict";
2
+ /**
3
+ * Status Dashboard Module
4
+ *
5
+ * This module provides functionality to display a dashboard with plans and task statistics
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ var __importDefault = (this && this.__importDefault) || function (mod) {
41
+ return (mod && mod.__esModule) ? mod : { "default": mod };
42
+ };
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.parseTaskFiles = parseTaskFiles;
45
+ exports.collectPlanData = collectPlanData;
46
+ exports.categorizePlanStatus = categorizePlanStatus;
47
+ exports.calculateStatistics = calculateStatistics;
48
+ exports.formatDashboard = formatDashboard;
49
+ exports.status = status;
50
+ const fs = __importStar(require("fs-extra"));
51
+ const path = __importStar(require("path"));
52
+ const gray_matter_1 = __importDefault(require("gray-matter"));
53
+ const chalk_1 = __importDefault(require("chalk"));
54
+ /**
55
+ * Scan the plans directory and return all plan directories
56
+ */
57
+ async function scanPlansDirectory(baseDir) {
58
+ const plansDir = path.join(baseDir, '.ai/task-manager/plans');
59
+ if (!(await fs.pathExists(plansDir)))
60
+ return [];
61
+ const entries = await fs.readdir(plansDir, { withFileTypes: true });
62
+ return entries.filter(entry => entry.isDirectory()).map(entry => path.join(plansDir, entry.name));
63
+ }
64
+ /**
65
+ * Scan the archive directory and return all archived plan directories
66
+ */
67
+ async function scanArchiveDirectory(baseDir) {
68
+ const archiveDir = path.join(baseDir, '.ai/task-manager/archive');
69
+ if (!(await fs.pathExists(archiveDir)))
70
+ return [];
71
+ const entries = await fs.readdir(archiveDir, { withFileTypes: true });
72
+ return entries
73
+ .filter(entry => entry.isDirectory())
74
+ .map(entry => path.join(archiveDir, entry.name));
75
+ }
76
+ /**
77
+ * Parse a plan file and extract metadata
78
+ */
79
+ async function parsePlanFile(planDir) {
80
+ try {
81
+ const files = await fs.readdir(planDir);
82
+ const planFile = files.find(f => f.startsWith('plan-') && f.endsWith('.md'));
83
+ if (!planFile)
84
+ return null;
85
+ const content = await fs.readFile(path.join(planDir, planFile), 'utf-8');
86
+ const { data } = (0, gray_matter_1.default)(content);
87
+ return {
88
+ id: data.id,
89
+ summary: data.summary,
90
+ created: data.created,
91
+ isArchived: planDir.includes('/archive/'),
92
+ directoryPath: planDir,
93
+ tasks: [],
94
+ };
95
+ }
96
+ catch (_error) {
97
+ const planName = path.basename(planDir);
98
+ console.warn(chalk_1.default.yellow(`Warning: Skipping corrupted plan in ${planName}. Check the plan file's YAML frontmatter.`));
99
+ return null;
100
+ }
101
+ }
102
+ /**
103
+ * Parse task files in a plan directory
104
+ */
105
+ async function parseTaskFiles(planDir) {
106
+ const tasksDir = path.join(planDir, 'tasks');
107
+ if (!(await fs.pathExists(tasksDir)))
108
+ return [];
109
+ try {
110
+ const taskFiles = await fs.readdir(tasksDir);
111
+ const tasks = [];
112
+ for (const file of taskFiles) {
113
+ if (!file.endsWith('.md'))
114
+ continue;
115
+ try {
116
+ const content = await fs.readFile(path.join(tasksDir, file), 'utf-8');
117
+ const { data } = (0, gray_matter_1.default)(content);
118
+ tasks.push({
119
+ id: data.id,
120
+ status: data.status,
121
+ });
122
+ }
123
+ catch (_err) {
124
+ const planName = path.basename(planDir);
125
+ console.warn(chalk_1.default.yellow(`Warning: Skipping corrupted task file ${file} in ${planName}. Fix by checking for duplicate or invalid YAML frontmatter fields.`));
126
+ }
127
+ }
128
+ return tasks.sort((a, b) => a.id - b.id);
129
+ }
130
+ catch (_error) {
131
+ const planName = path.basename(planDir);
132
+ console.warn(chalk_1.default.yellow(`Warning: Could not read tasks directory in ${planName}. Check directory permissions.`));
133
+ return [];
134
+ }
135
+ }
136
+ /**
137
+ * Collect all plan data from the filesystem
138
+ */
139
+ async function collectPlanData() {
140
+ const baseDir = process.cwd();
141
+ const plans = [];
142
+ // Collect active plans
143
+ const activeDirs = await scanPlansDirectory(baseDir);
144
+ for (const dir of activeDirs) {
145
+ const plan = await parsePlanFile(dir);
146
+ if (plan) {
147
+ plan.tasks = await parseTaskFiles(dir);
148
+ plans.push(plan);
149
+ }
150
+ }
151
+ // Collect archived plans
152
+ const archiveDirs = await scanArchiveDirectory(baseDir);
153
+ for (const dir of archiveDirs) {
154
+ const plan = await parsePlanFile(dir);
155
+ if (plan) {
156
+ plan.tasks = await parseTaskFiles(dir);
157
+ plans.push(plan);
158
+ }
159
+ }
160
+ return plans.sort((a, b) => a.id - b.id);
161
+ }
162
+ /**
163
+ * Calculate basic plan counts
164
+ */
165
+ function calculateBasicCounts(plans) {
166
+ return {
167
+ total: plans.length,
168
+ active: plans.filter(p => !p.isArchived).length,
169
+ archived: plans.filter(p => p.isArchived).length,
170
+ };
171
+ }
172
+ /**
173
+ * Calculate task completion rate across all plans (active + archived)
174
+ */
175
+ function calculateTaskCompletionRate(plans) {
176
+ let totalTasks = 0;
177
+ let completedTasks = 0;
178
+ for (const plan of plans) {
179
+ totalTasks += plan.tasks.length;
180
+ completedTasks += plan.tasks.filter(t => t.status === 'completed').length;
181
+ }
182
+ if (totalTasks === 0)
183
+ return 0;
184
+ return Math.round((completedTasks / totalTasks) * 100);
185
+ }
186
+ /**
187
+ * Categorize a single plan's status
188
+ */
189
+ function categorizePlanStatus(plan) {
190
+ if (plan.tasks.length === 0)
191
+ return 'noTasks';
192
+ const completedCount = plan.tasks.filter(t => t.status === 'completed').length;
193
+ const pendingCount = plan.tasks.filter(t => t.status === 'pending').length;
194
+ if (completedCount === plan.tasks.length)
195
+ return 'completed';
196
+ if (pendingCount === plan.tasks.length)
197
+ return 'notStarted';
198
+ return 'inProgress';
199
+ }
200
+ /**
201
+ * Calculate plan status distribution
202
+ */
203
+ function calculatePlanStatusDistribution(plans) {
204
+ const distribution = {
205
+ noTasks: 0,
206
+ notStarted: 0,
207
+ inProgress: 0,
208
+ completed: 0,
209
+ };
210
+ for (const plan of plans) {
211
+ const status = categorizePlanStatus(plan);
212
+ distribution[status]++;
213
+ }
214
+ return distribution;
215
+ }
216
+ /**
217
+ * Find most recent and oldest plans
218
+ */
219
+ function findTimelinePlans(plans) {
220
+ if (plans.length === 0)
221
+ return {};
222
+ const sorted = [...plans].sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime());
223
+ return {
224
+ mostRecent: sorted[0],
225
+ oldest: sorted[sorted.length - 1],
226
+ };
227
+ }
228
+ /**
229
+ * Calculate all dashboard statistics
230
+ */
231
+ function calculateStatistics(plans) {
232
+ const counts = calculateBasicCounts(plans);
233
+ const timeline = findTimelinePlans(plans);
234
+ return {
235
+ totalPlans: counts.total,
236
+ activePlans: counts.active,
237
+ archivedPlans: counts.archived,
238
+ taskCompletionRate: calculateTaskCompletionRate(plans),
239
+ plansByStatus: calculatePlanStatusDistribution(plans.filter(p => !p.isArchived)),
240
+ mostRecentPlan: timeline.mostRecent,
241
+ oldestPlan: timeline.oldest,
242
+ };
243
+ }
244
+ // ============================================================================
245
+ // VISUAL FORMATTING (Task 04)
246
+ // ============================================================================
247
+ const TERM_WIDTH = 80;
248
+ const DIVIDER = '─'.repeat(TERM_WIDTH);
249
+ /**
250
+ * Format a section header
251
+ */
252
+ function formatSectionHeader(title) {
253
+ return `\n${chalk_1.default.cyan.bold(title)}\n${chalk_1.default.cyan(DIVIDER)}\n`;
254
+ }
255
+ /**
256
+ * Create an ASCII progress bar
257
+ */
258
+ function createProgressBar(percentage, width = 20) {
259
+ const filled = Math.round((percentage / 100) * width);
260
+ const empty = width - filled;
261
+ const bar = chalk_1.default.green('█'.repeat(filled)) + chalk_1.default.gray('░'.repeat(empty));
262
+ return `[${bar}] ${percentage}%`;
263
+ }
264
+ /**
265
+ * Format the summary section
266
+ */
267
+ function formatSummary(stats) {
268
+ let output = formatSectionHeader('Summary');
269
+ output += ` ${chalk_1.default.cyan('●')} Total Plans: ${stats.totalPlans}\n`;
270
+ output += ` ${chalk_1.default.green('●')} Active Plans: ${stats.activePlans}\n`;
271
+ output += ` ${chalk_1.default.blue('●')} Archived Plans: ${stats.archivedPlans}\n`;
272
+ output += ` ${chalk_1.default.magenta('●')} Task Progress: ${createProgressBar(stats.taskCompletionRate)} (${stats.taskCompletionRate}% complete)\n`;
273
+ return output;
274
+ }
275
+ /**
276
+ * Format the active plans section
277
+ */
278
+ function formatActivePlans(plans) {
279
+ const activePlans = plans.filter(p => !p.isArchived);
280
+ if (activePlans.length === 0) {
281
+ return formatSectionHeader('Active Plans') + ' No active plans\n';
282
+ }
283
+ let output = formatSectionHeader('Active Plans');
284
+ for (const plan of activePlans) {
285
+ const taskCount = plan.tasks.length;
286
+ const completedCount = plan.tasks.filter(t => t.status === 'completed').length;
287
+ const percentage = taskCount > 0 ? Math.round((completedCount / taskCount) * 100) : 0;
288
+ const summary = plan.summary.length > 50 ? plan.summary.substring(0, 47) + '...' : plan.summary;
289
+ output += ` ${chalk_1.default.yellow('●')} ${chalk_1.default.bold(`Plan ${plan.id}`)}: ${summary}\n`;
290
+ if (taskCount > 0) {
291
+ output += ` ${createProgressBar(percentage, 20)} ${completedCount}/${taskCount} tasks\n`;
292
+ }
293
+ else {
294
+ output += ` ${chalk_1.default.gray('No tasks generated')}\n`;
295
+ }
296
+ }
297
+ return output;
298
+ }
299
+ /**
300
+ * Format archived plans with unfinished tasks section
301
+ */
302
+ function formatIncompleteArchivedPlans(plans) {
303
+ const archivedPlans = plans.filter(p => p.isArchived);
304
+ const incompleteArchived = archivedPlans.filter(p => p.tasks.length > 0 && p.tasks.some(t => t.status !== 'completed'));
305
+ if (incompleteArchived.length === 0) {
306
+ return '';
307
+ }
308
+ let output = formatSectionHeader('Unfinished Tasks in Archived Plans');
309
+ for (const plan of incompleteArchived) {
310
+ const taskCount = plan.tasks.length;
311
+ const completedCount = plan.tasks.filter(t => t.status === 'completed').length;
312
+ const incompleteCount = taskCount - completedCount;
313
+ const percentage = Math.round((completedCount / taskCount) * 100);
314
+ const summary = plan.summary.length > 50 ? plan.summary.substring(0, 47) + '...' : plan.summary;
315
+ output += ` ${chalk_1.default.red('⚠')} ${chalk_1.default.bold(`Plan ${plan.id}`)}: ${summary}\n`;
316
+ output += ` ${createProgressBar(percentage, 20)} ${incompleteCount} incomplete task${incompleteCount !== 1 ? 's' : ''}\n`;
317
+ }
318
+ return output;
319
+ }
320
+ /**
321
+ * Format the archived plans section
322
+ */
323
+ function formatArchivedPlans(plans) {
324
+ const archivedPlans = plans.filter(p => p.isArchived);
325
+ if (archivedPlans.length === 0) {
326
+ return formatSectionHeader('Archived Plans') + ' No archived plans\n';
327
+ }
328
+ let output = formatSectionHeader('Archived Plans');
329
+ for (const plan of archivedPlans) {
330
+ const summary = plan.summary.length > 60 ? plan.summary.substring(0, 57) + '...' : plan.summary;
331
+ output += ` ${chalk_1.default.green('✓')} ${chalk_1.default.bold(`Plan ${plan.id}`)}: ${summary}\n`;
332
+ }
333
+ return output;
334
+ }
335
+ /**
336
+ * Format the complete dashboard
337
+ */
338
+ function formatDashboard(stats, plans) {
339
+ let output = '';
340
+ output += chalk_1.default.bold.white('\nAI Task Manager Dashboard\n');
341
+ output += chalk_1.default.gray(DIVIDER) + '\n';
342
+ output += formatSummary(stats);
343
+ output += formatActivePlans(plans);
344
+ const incompleteSection = formatIncompleteArchivedPlans(plans);
345
+ if (incompleteSection) {
346
+ output += incompleteSection;
347
+ }
348
+ output += formatArchivedPlans(plans);
349
+ output += '\n' + chalk_1.default.gray(DIVIDER) + '\n';
350
+ return output;
351
+ }
352
+ // ============================================================================
353
+ // MAIN STATUS FUNCTION (Task 05)
354
+ // ============================================================================
355
+ /**
356
+ * Main status function that orchestrates all components
357
+ */
358
+ async function status() {
359
+ try {
360
+ const plans = await collectPlanData();
361
+ const stats = calculateStatistics(plans);
362
+ const dashboard = formatDashboard(stats, plans);
363
+ console.log(dashboard);
364
+ return { success: true };
365
+ }
366
+ catch (error) {
367
+ const message = error instanceof Error ? error.message : String(error);
368
+ return {
369
+ success: false,
370
+ message: `Failed to generate dashboard: ${message}`,
371
+ };
372
+ }
373
+ }
374
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@e0ipso/ai-task-manager",
3
- "version": "1.14.0",
3
+ "version": "1.16.0",
4
4
  "description": "Task management for AI coding assistants",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -57,6 +57,7 @@
57
57
  "commander": "^11.1.0",
58
58
  "diff": "^5.2.0",
59
59
  "fs-extra": "^11.3.1",
60
+ "gray-matter": "^4.0.3",
60
61
  "inquirer": "^9.3.8"
61
62
  },
62
63
  "devDependencies": {
@@ -0,0 +1,7 @@
1
+ # AI Task Manager
2
+
3
+ This directory contains AI-assisted task management files for this project.
4
+
5
+ Managed by the [AI Task Manager](https://www.github.com/e0ipso/ai-task-manager) project.
6
+
7
+ **Documentation**: https://mateuaguilo.com/ai-task-manager
@@ -0,0 +1,147 @@
1
+ ---
2
+ argument-hint: [user-prompt]
3
+ description: Execute the full workflow from plan creation to blueprint execution
4
+ ---
5
+ # Full Workflow Execution
6
+
7
+ ## Assistant Configuration
8
+
9
+ Before proceeding with this command, you MUST load and respect the assistant's configuration:
10
+
11
+ **Run the following scripts:**
12
+ ```bash
13
+ ASSISTANT=$(node .ai/task-manager/config/scripts/detect-assistant.cjs)
14
+ node .ai/task-manager/config/scripts/read-assistant-config.cjs "$ASSISTANT"
15
+ ```
16
+
17
+ The output above contains your global and project-level configuration rules. You MUST keep these rules and guidelines in mind during all subsequent operations in this command.
18
+
19
+ ---
20
+
21
+ You are a workflow orchestration assistant. Your role is to execute the complete task management workflow from plan creation through blueprint execution with minimal user interaction.
22
+
23
+ ## Instructions
24
+
25
+ The user input is:
26
+
27
+ <user-input>
28
+ $ARGUMENTS
29
+ </user-input>
30
+
31
+ If no user input is provided, stop immediately and show an error message to the user.
32
+
33
+ ### Workflow Execution Process
34
+
35
+ Use your internal Todo task tool to track the workflow execution:
36
+
37
+ - [ ] Execute /tasks:create-plan
38
+ - [ ] Extract plan ID
39
+ - [ ] Execute /tasks:generate-tasks
40
+ - [ ] Execute /tasks:execute-blueprint
41
+ - [ ] Generate execution summary
42
+
43
+ #### Step 1: Determine Next Plan ID
44
+
45
+ Before creating the plan, determine what the next plan ID will be:
46
+
47
+ ```bash
48
+ node .ai/task-manager/config/scripts/get-next-plan-id.cjs
49
+ ```
50
+
51
+ Store this ID for later validation and use.
52
+
53
+ #### Step 2: Execute Plan Creation
54
+
55
+ Use the SlashCommand tool to execute plan creation with the user's prompt:
56
+
57
+ ```
58
+ /tasks:create-plan $ARGUMENTS
59
+ ```
60
+
61
+ **Important**: The plan creation command may ask clarification questions. Wait for user responses before continuing. This is expected behavior and maintains quality control.
62
+
63
+ After plan creation completes, provide minimal progress update:
64
+ "Step 1/4: Plan created (ID: [plan-id])"
65
+
66
+ #### Step 3: Validate Plan Creation
67
+
68
+ Verify the plan was created successfully by checking if the plan document exists:
69
+
70
+ ```bash
71
+ find .ai/task-manager/plans -name "plan-[0-9][0-9]*--*.md" -type f -exec grep -l "^id: \?[plan-id]$" {} \;
72
+ ```
73
+
74
+ If the plan is not found, halt with error:
75
+ "❌ Error: Plan creation failed. Expected plan with ID [plan-id] not found."
76
+
77
+ #### Step 4: Execute Task Generation
78
+
79
+ Use the SlashCommand tool to generate tasks for the plan:
80
+
81
+ ```
82
+ /tasks:generate-tasks [plan-id]
83
+ ```
84
+
85
+ After task generation completes, provide minimal progress update:
86
+ "Step 2/4: Tasks generated for plan [plan-id]"
87
+
88
+ #### Step 5: Execute Blueprint
89
+
90
+ Use the SlashCommand tool to execute the blueprint:
91
+
92
+ ```
93
+ /tasks:execute-blueprint [plan-id]
94
+ ```
95
+
96
+ After blueprint execution completes, provide minimal progress update:
97
+ "Step 3/4: Blueprint execution completed"
98
+
99
+ Note: The execute-blueprint command automatically archives the plan upon successful completion.
100
+
101
+ #### Step 6: Generate Execution Summary
102
+
103
+ After all steps complete successfully, generate a comprehensive summary:
104
+
105
+ ```
106
+ ✅ Full workflow completed successfully!
107
+
108
+ Plan: [plan-id]--[plan-name]
109
+ Location: .ai/task-manager/archive/[plan-id]--[plan-name]/
110
+
111
+ Status: Archived and ready for review
112
+
113
+ 📋 Next Steps:
114
+ - Review the implementation in the archived plan
115
+ - Check the execution summary in the plan document
116
+ - Verify all validation gates passed
117
+
118
+ Plan document: .ai/task-manager/archive/[plan-id]--[plan-name]/plan-[plan-id]--[plan-name].md
119
+ ```
120
+
121
+ ### Error Handling
122
+
123
+ If any step fails:
124
+ 1. Halt execution immediately
125
+ 2. Report clear error message indicating which step failed
126
+ 3. Preserve all created artifacts (plan, tasks) for manual review
127
+ 4. Provide guidance for manual continuation:
128
+ - If plan creation failed: Review error and retry
129
+ - If task generation failed: Run `/tasks:generate-tasks [plan-id]` manually after reviewing plan
130
+ - If blueprint execution failed: Review tasks and run `/tasks:execute-blueprint [plan-id]` manually
131
+
132
+ ### Output Requirements
133
+
134
+ **During Execution:**
135
+ - Minimal progress updates at each major step
136
+ - Clear indication of current step (1/4, 2/4, etc.)
137
+
138
+ **After Completion:**
139
+ - Comprehensive summary with plan location
140
+ - Status confirmation (Archived)
141
+ - Next steps for user review
142
+ - Direct link to plan document
143
+
144
+ **On Error:**
145
+ - Clear error message
146
+ - Indication of which step failed
147
+ - Manual recovery instructions