@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/README.md +3 -0
- package/dist/cli.js +76 -0
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -1
- package/dist/index.js.map +1 -1
- package/dist/plan-utils.d.ts +35 -0
- package/dist/plan-utils.d.ts.map +1 -0
- package/dist/plan-utils.js +122 -0
- package/dist/plan-utils.js.map +1 -0
- package/dist/plan.d.ts +20 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +241 -0
- package/dist/plan.js.map +1 -0
- package/dist/status.d.ts +72 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +374 -0
- package/dist/status.js.map +1 -0
- package/package.json +2 -1
- package/templates/ai-task-manager/README.md +7 -0
- package/templates/assistant/commands/tasks/full-workflow.md +147 -0
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.
|
|
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,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
|