@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/plan.js ADDED
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ /**
3
+ * Plan Command Module
4
+ *
5
+ * Implements show and archive subcommands for plan inspection and management
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.showPlan = showPlan;
45
+ exports.archivePlan = archivePlan;
46
+ const fs = __importStar(require("fs-extra"));
47
+ const path = __importStar(require("path"));
48
+ const gray_matter_1 = __importDefault(require("gray-matter"));
49
+ const readline = __importStar(require("readline"));
50
+ const chalk_1 = __importDefault(require("chalk"));
51
+ const plan_utils_1 = require("./plan-utils");
52
+ const TERM_WIDTH = 80;
53
+ const DIVIDER = '─'.repeat(TERM_WIDTH);
54
+ /**
55
+ * Format a section header
56
+ */
57
+ function formatSectionHeader(title) {
58
+ return `\n${chalk_1.default.cyan.bold(title)}\n${chalk_1.default.cyan(DIVIDER)}\n`;
59
+ }
60
+ /**
61
+ * Create an ASCII progress bar
62
+ */
63
+ function createProgressBar(percentage, width = 20) {
64
+ const filled = Math.round((percentage / 100) * width);
65
+ const empty = width - filled;
66
+ const bar = chalk_1.default.green('█'.repeat(filled)) + chalk_1.default.gray('░'.repeat(empty));
67
+ return `[${bar}] ${percentage}%`;
68
+ }
69
+ /**
70
+ * Wrap text to specified width, preserving paragraphs
71
+ */
72
+ function wrapText(text, maxWidth) {
73
+ const paragraphs = text.split('\n\n');
74
+ return paragraphs
75
+ .map(paragraph => {
76
+ const words = paragraph.split(/\s+/);
77
+ const lines = [];
78
+ let currentLine = '';
79
+ for (const word of words) {
80
+ if (currentLine.length + word.length + 1 <= maxWidth) {
81
+ currentLine += (currentLine ? ' ' : '') + word;
82
+ }
83
+ else {
84
+ if (currentLine)
85
+ lines.push(currentLine);
86
+ currentLine = word;
87
+ }
88
+ }
89
+ if (currentLine)
90
+ lines.push(currentLine);
91
+ return lines.join('\n');
92
+ })
93
+ .join('\n\n');
94
+ }
95
+ /**
96
+ * Prompt user for yes/no confirmation
97
+ */
98
+ async function promptConfirmation(question) {
99
+ const rl = readline.createInterface({
100
+ input: process.stdin,
101
+ output: process.stdout,
102
+ });
103
+ return new Promise(resolve => {
104
+ rl.question(question, answer => {
105
+ rl.close();
106
+ resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
107
+ });
108
+ });
109
+ }
110
+ /**
111
+ * Display plan metadata, executive summary, and task statistics
112
+ */
113
+ async function showPlan(planId) {
114
+ try {
115
+ const planData = await (0, plan_utils_1.loadPlanData)(planId);
116
+ if (!planData) {
117
+ return {
118
+ success: false,
119
+ message: `Plan ${planId} not found. Check .ai/task-manager/plans/ and .ai/task-manager/archive/`,
120
+ };
121
+ }
122
+ // Build output
123
+ let output = '';
124
+ // Header
125
+ output += chalk_1.default.bold.white(`\nPlan ${planData.id}\n`);
126
+ output += chalk_1.default.gray(DIVIDER) + '\n';
127
+ // Metadata section
128
+ output += formatSectionHeader('Metadata');
129
+ output += ` ${chalk_1.default.cyan('●')} ID: ${planData.id}\n`;
130
+ output += ` ${chalk_1.default.cyan('●')} Created: ${planData.created}\n`;
131
+ output += ` ${chalk_1.default.cyan('●')} Status: ${planData.isArchived ? chalk_1.default.blue('Archived') : chalk_1.default.green('Active')}\n`;
132
+ output += ` ${chalk_1.default.cyan('●')} Summary: ${planData.summary}\n`;
133
+ // Task statistics section
134
+ const taskCount = planData.tasks.length;
135
+ const completedCount = planData.tasks.filter(t => t.status === 'completed').length;
136
+ const percentage = taskCount > 0 ? Math.round((completedCount / taskCount) * 100) : 0;
137
+ output += formatSectionHeader('Task Progress');
138
+ if (taskCount > 0) {
139
+ output += ` ${createProgressBar(percentage, 20)} ${completedCount}/${taskCount} tasks completed\n`;
140
+ }
141
+ else {
142
+ output += ` ${chalk_1.default.gray('No tasks generated yet')}\n`;
143
+ }
144
+ // Executive Summary section
145
+ output += formatSectionHeader('Executive Summary');
146
+ // Word wrap the executive summary to 76 chars (80 - 4 for indent)
147
+ const wrappedSummary = wrapText(planData.executiveSummary, 76);
148
+ output +=
149
+ wrappedSummary
150
+ .split('\n')
151
+ .map(line => ` ${line}`)
152
+ .join('\n') + '\n';
153
+ // Footer
154
+ output += '\n' + chalk_1.default.gray(DIVIDER) + '\n';
155
+ console.log(output);
156
+ return { success: true };
157
+ }
158
+ catch (error) {
159
+ const message = error instanceof Error ? error.message : String(error);
160
+ return {
161
+ success: false,
162
+ message: `Failed to display plan: ${message}`,
163
+ };
164
+ }
165
+ }
166
+ /**
167
+ * Archive a plan by moving it to the archive directory
168
+ */
169
+ async function archivePlan(planId, autoConfirm = false) {
170
+ try {
171
+ // 1. Find and validate plan location
172
+ const location = await (0, plan_utils_1.findPlanById)(planId);
173
+ if (!location) {
174
+ return {
175
+ success: false,
176
+ message: `Plan ${planId} not found. Check .ai/task-manager/plans/ directory.`,
177
+ };
178
+ }
179
+ if (location.isArchived) {
180
+ return {
181
+ success: false,
182
+ message: `Plan ${planId} is already archived.`,
183
+ };
184
+ }
185
+ // 2. Load plan data to check for incomplete tasks
186
+ const planData = await (0, plan_utils_1.loadPlanData)(planId);
187
+ if (!planData) {
188
+ return { success: false, message: `Failed to load plan ${planId} data.` };
189
+ }
190
+ const incompleteTasks = planData.tasks.filter(t => t.status !== 'completed');
191
+ // 3. Warn user if incomplete tasks exist
192
+ if (incompleteTasks.length > 0 && !autoConfirm) {
193
+ console.log(chalk_1.default.yellow(`\n⚠ Warning: Plan ${planId} has ${incompleteTasks.length} incomplete task(s).\n`));
194
+ const confirmed = await promptConfirmation('Archive anyway? (y/n): ');
195
+ if (!confirmed) {
196
+ return { success: false, message: 'Archive cancelled by user.' };
197
+ }
198
+ }
199
+ // 4. Update all task files to completed status
200
+ const tasksDir = path.join(location.directoryPath, 'tasks');
201
+ if (await fs.pathExists(tasksDir)) {
202
+ const taskFiles = await fs.readdir(tasksDir);
203
+ for (const file of taskFiles) {
204
+ if (!file.endsWith('.md'))
205
+ continue;
206
+ const taskPath = path.join(tasksDir, file);
207
+ const content = await fs.readFile(taskPath, 'utf-8');
208
+ const parsed = (0, gray_matter_1.default)(content);
209
+ // Update status to completed
210
+ parsed.data.status = 'completed';
211
+ // Write back with updated frontmatter
212
+ const updated = gray_matter_1.default.stringify(parsed.content, parsed.data);
213
+ await fs.writeFile(taskPath, updated, 'utf-8');
214
+ }
215
+ }
216
+ // 5. Append "Manually archived" note to plan document
217
+ const planContent = await fs.readFile(location.filePath, 'utf-8');
218
+ const today = new Date().toISOString().split('T')[0]; // YYYY-MM-DD format
219
+ const archiveNote = `\n---\n\n**Note**: Manually archived on ${today}\n`;
220
+ const updatedContent = planContent + archiveNote;
221
+ await fs.writeFile(location.filePath, updatedContent, 'utf-8');
222
+ // 6. Move plan directory to archive
223
+ const baseDir = process.cwd();
224
+ const archiveDir = path.join(baseDir, '.ai/task-manager/archive');
225
+ await fs.ensureDir(archiveDir);
226
+ const planDirName = path.basename(location.directoryPath);
227
+ const archivePath = path.join(archiveDir, planDirName);
228
+ await fs.move(location.directoryPath, archivePath);
229
+ // 7. Display success message
230
+ console.log(chalk_1.default.green(`\n✓ Plan ${planId} successfully archived to .ai/task-manager/archive/${planDirName}\n`));
231
+ return { success: true };
232
+ }
233
+ catch (error) {
234
+ const message = error instanceof Error ? error.message : String(error);
235
+ return {
236
+ success: false,
237
+ message: `Failed to archive plan: ${message}`,
238
+ };
239
+ }
240
+ }
241
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Status Dashboard Module
3
+ *
4
+ * This module provides functionality to display a dashboard with plans and task statistics
5
+ */
6
+ /**
7
+ * Metadata extracted from task files
8
+ */
9
+ export interface TaskMetadata {
10
+ id: number;
11
+ status: 'pending' | 'in-progress' | 'completed' | 'needs-clarification';
12
+ }
13
+ /**
14
+ * Metadata extracted from plan files
15
+ */
16
+ export interface PlanMetadata {
17
+ id: number;
18
+ summary: string;
19
+ created: string;
20
+ isArchived: boolean;
21
+ directoryPath: string;
22
+ tasks: TaskMetadata[];
23
+ }
24
+ /**
25
+ * Parse task files in a plan directory
26
+ */
27
+ export declare function parseTaskFiles(planDir: string): Promise<TaskMetadata[]>;
28
+ /**
29
+ * Collect all plan data from the filesystem
30
+ */
31
+ export declare function collectPlanData(): Promise<PlanMetadata[]>;
32
+ /**
33
+ * Plan status categorization
34
+ */
35
+ export type PlanStatus = 'noTasks' | 'notStarted' | 'inProgress' | 'completed';
36
+ /**
37
+ * Dashboard statistics interface
38
+ */
39
+ export interface DashboardStatistics {
40
+ totalPlans: number;
41
+ activePlans: number;
42
+ archivedPlans: number;
43
+ taskCompletionRate: number;
44
+ plansByStatus: {
45
+ noTasks: number;
46
+ notStarted: number;
47
+ inProgress: number;
48
+ completed: number;
49
+ };
50
+ mostRecentPlan?: PlanMetadata;
51
+ oldestPlan?: PlanMetadata;
52
+ }
53
+ /**
54
+ * Categorize a single plan's status
55
+ */
56
+ export declare function categorizePlanStatus(plan: PlanMetadata): PlanStatus;
57
+ /**
58
+ * Calculate all dashboard statistics
59
+ */
60
+ export declare function calculateStatistics(plans: PlanMetadata[]): DashboardStatistics;
61
+ /**
62
+ * Format the complete dashboard
63
+ */
64
+ export declare function formatDashboard(stats: DashboardStatistics, plans: PlanMetadata[]): string;
65
+ /**
66
+ * Main status function that orchestrates all components
67
+ */
68
+ export declare function status(): Promise<{
69
+ success: boolean;
70
+ message?: string;
71
+ }>;
72
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,qBAAqB,CAAC;CACzE;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAyDD;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAsC7E;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAyB/D;AAMD;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;AAE/E;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,cAAc,CAAC,EAAE,YAAY,CAAC;IAC9B,UAAU,CAAC,EAAE,YAAY,CAAC;CAC3B;AAiCD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,UAAU,CASnE;AAwCD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,mBAAmB,CAa9E;AA2HD;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,CAmBzF;AAMD;;GAEG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB9E"}