strikethroo 3.0.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.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +79 -0
  3. package/dist/cli.d.ts +9 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +187 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/conflict-detector.d.ts +24 -0
  8. package/dist/conflict-detector.d.ts.map +1 -0
  9. package/dist/conflict-detector.js +130 -0
  10. package/dist/conflict-detector.js.map +1 -0
  11. package/dist/index.d.ts +22 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +344 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/metadata.d.ts +40 -0
  16. package/dist/metadata.d.ts.map +1 -0
  17. package/dist/metadata.js +121 -0
  18. package/dist/metadata.js.map +1 -0
  19. package/dist/plan-utils.d.ts +35 -0
  20. package/dist/plan-utils.d.ts.map +1 -0
  21. package/dist/plan-utils.js +123 -0
  22. package/dist/plan-utils.js.map +1 -0
  23. package/dist/plan.d.ts +27 -0
  24. package/dist/plan.d.ts.map +1 -0
  25. package/dist/plan.js +279 -0
  26. package/dist/plan.js.map +1 -0
  27. package/dist/prompts.d.ts +21 -0
  28. package/dist/prompts.d.ts.map +1 -0
  29. package/dist/prompts.js +132 -0
  30. package/dist/prompts.js.map +1 -0
  31. package/dist/status.d.ts +73 -0
  32. package/dist/status.d.ts.map +1 -0
  33. package/dist/status.js +375 -0
  34. package/dist/status.js.map +1 -0
  35. package/dist/types.d.ts +274 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +9 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/utils.d.ts +53 -0
  40. package/dist/utils.d.ts.map +1 -0
  41. package/dist/utils.js +158 -0
  42. package/dist/utils.js.map +1 -0
  43. package/package.json +94 -0
  44. package/templates/harness/agents/plan-creator.md +95 -0
  45. package/templates/harness/skills/st-create-plan/SKILL.md +120 -0
  46. package/templates/harness/skills/st-create-plan/scripts/find-strikethroo-root.cjs +116 -0
  47. package/templates/harness/skills/st-create-plan/scripts/get-next-plan-id.cjs +197 -0
  48. package/templates/harness/skills/st-execute-blueprint/SKILL.md +147 -0
  49. package/templates/harness/skills/st-execute-blueprint/scripts/create-feature-branch.cjs +359 -0
  50. package/templates/harness/skills/st-execute-blueprint/scripts/find-strikethroo-root.cjs +116 -0
  51. package/templates/harness/skills/st-execute-blueprint/scripts/validate-plan-blueprint.cjs +358 -0
  52. package/templates/harness/skills/st-execute-task/SKILL.md +195 -0
  53. package/templates/harness/skills/st-execute-task/scripts/check-task-dependencies.cjs +420 -0
  54. package/templates/harness/skills/st-execute-task/scripts/find-strikethroo-root.cjs +116 -0
  55. package/templates/harness/skills/st-execute-task/scripts/validate-plan-blueprint.cjs +358 -0
  56. package/templates/harness/skills/st-full-workflow/SKILL.md +413 -0
  57. package/templates/harness/skills/st-full-workflow/scripts/create-feature-branch.cjs +359 -0
  58. package/templates/harness/skills/st-full-workflow/scripts/find-strikethroo-root.cjs +116 -0
  59. package/templates/harness/skills/st-full-workflow/scripts/get-next-plan-id.cjs +197 -0
  60. package/templates/harness/skills/st-full-workflow/scripts/get-next-task-id.cjs +295 -0
  61. package/templates/harness/skills/st-full-workflow/scripts/validate-plan-blueprint.cjs +358 -0
  62. package/templates/harness/skills/st-generate-tasks/SKILL.md +244 -0
  63. package/templates/harness/skills/st-generate-tasks/scripts/find-strikethroo-root.cjs +116 -0
  64. package/templates/harness/skills/st-generate-tasks/scripts/get-next-task-id.cjs +295 -0
  65. package/templates/harness/skills/st-generate-tasks/scripts/validate-plan-blueprint.cjs +358 -0
  66. package/templates/harness/skills/st-refine-plan/SKILL.md +205 -0
  67. package/templates/harness/skills/st-refine-plan/scripts/find-strikethroo-root.cjs +116 -0
  68. package/templates/harness/skills/st-refine-plan/scripts/validate-plan-blueprint.cjs +358 -0
  69. package/templates/strikethroo/README.md +7 -0
  70. package/templates/strikethroo/config/STRIKETHROO.md +76 -0
  71. package/templates/strikethroo/config/hooks/POST_ERROR_DETECTION.md +46 -0
  72. package/templates/strikethroo/config/hooks/POST_EXECUTION.md +25 -0
  73. package/templates/strikethroo/config/hooks/POST_PHASE.md +24 -0
  74. package/templates/strikethroo/config/hooks/POST_PLAN.md +5 -0
  75. package/templates/strikethroo/config/hooks/POST_TASK_GENERATION_ALL.md +41 -0
  76. package/templates/strikethroo/config/hooks/PRE_PHASE.md +21 -0
  77. package/templates/strikethroo/config/hooks/PRE_PLAN.md +42 -0
  78. package/templates/strikethroo/config/hooks/PRE_TASK_ASSIGNMENT.md +32 -0
  79. package/templates/strikethroo/config/hooks/PRE_TASK_EXECUTION.md +1 -0
  80. package/templates/strikethroo/config/templates/BLUEPRINT_TEMPLATE.md +24 -0
  81. package/templates/strikethroo/config/templates/EXECUTION_SUMMARY_TEMPLATE.md +13 -0
  82. package/templates/strikethroo/config/templates/PLAN_TEMPLATE.md +109 -0
  83. package/templates/strikethroo/config/templates/TASK_TEMPLATE.md +36 -0
@@ -0,0 +1,73 @@
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
+ approval_method?: string;
21
+ isArchived: boolean;
22
+ directoryPath: string;
23
+ tasks: TaskMetadata[];
24
+ }
25
+ /**
26
+ * Parse task files in a plan directory
27
+ */
28
+ export declare function parseTaskFiles(planDir: string): Promise<TaskMetadata[]>;
29
+ /**
30
+ * Collect all plan data from the filesystem
31
+ */
32
+ export declare function collectPlanData(): Promise<PlanMetadata[]>;
33
+ /**
34
+ * Plan status categorization
35
+ */
36
+ export type PlanStatus = 'noTasks' | 'notStarted' | 'inProgress' | 'completed';
37
+ /**
38
+ * Dashboard statistics interface
39
+ */
40
+ export interface DashboardStatistics {
41
+ totalPlans: number;
42
+ activePlans: number;
43
+ archivedPlans: number;
44
+ taskCompletionRate: number;
45
+ plansByStatus: {
46
+ noTasks: number;
47
+ notStarted: number;
48
+ inProgress: number;
49
+ completed: number;
50
+ };
51
+ mostRecentPlan?: PlanMetadata;
52
+ oldestPlan?: PlanMetadata;
53
+ }
54
+ /**
55
+ * Categorize a single plan's status
56
+ */
57
+ export declare function categorizePlanStatus(plan: PlanMetadata): PlanStatus;
58
+ /**
59
+ * Calculate all dashboard statistics
60
+ */
61
+ export declare function calculateStatistics(plans: PlanMetadata[]): DashboardStatistics;
62
+ /**
63
+ * Format the complete dashboard
64
+ */
65
+ export declare function formatDashboard(stats: DashboardStatistics, plans: PlanMetadata[]): string;
66
+ /**
67
+ * Main status function that orchestrates all components
68
+ */
69
+ export declare function status(): Promise<{
70
+ success: boolean;
71
+ message?: string;
72
+ }>;
73
+ //# 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,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AA0DD;;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"}
package/dist/status.js ADDED
@@ -0,0 +1,375 @@
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/strikethroo/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/strikethroo/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
+ approval_method: data.approval_method,
92
+ isArchived: planDir.includes('/archive/'),
93
+ directoryPath: planDir,
94
+ tasks: [],
95
+ };
96
+ }
97
+ catch (_error) {
98
+ const planName = path.basename(planDir);
99
+ console.warn(chalk_1.default.yellow(`Warning: Skipping corrupted plan in ${planName}. Check the plan file's YAML frontmatter.`));
100
+ return null;
101
+ }
102
+ }
103
+ /**
104
+ * Parse task files in a plan directory
105
+ */
106
+ async function parseTaskFiles(planDir) {
107
+ const tasksDir = path.join(planDir, 'tasks');
108
+ if (!(await fs.pathExists(tasksDir)))
109
+ return [];
110
+ try {
111
+ const taskFiles = await fs.readdir(tasksDir);
112
+ const tasks = [];
113
+ for (const file of taskFiles) {
114
+ if (!file.endsWith('.md'))
115
+ continue;
116
+ try {
117
+ const content = await fs.readFile(path.join(tasksDir, file), 'utf-8');
118
+ const { data } = (0, gray_matter_1.default)(content);
119
+ tasks.push({
120
+ id: data.id,
121
+ status: data.status,
122
+ });
123
+ }
124
+ catch (_err) {
125
+ const planName = path.basename(planDir);
126
+ console.warn(chalk_1.default.yellow(`Warning: Skipping corrupted task file ${file} in ${planName}. Fix by checking for duplicate or invalid YAML frontmatter fields.`));
127
+ }
128
+ }
129
+ return tasks.sort((a, b) => a.id - b.id);
130
+ }
131
+ catch (_error) {
132
+ const planName = path.basename(planDir);
133
+ console.warn(chalk_1.default.yellow(`Warning: Could not read tasks directory in ${planName}. Check directory permissions.`));
134
+ return [];
135
+ }
136
+ }
137
+ /**
138
+ * Collect all plan data from the filesystem
139
+ */
140
+ async function collectPlanData() {
141
+ const baseDir = process.cwd();
142
+ const plans = [];
143
+ // Collect active plans
144
+ const activeDirs = await scanPlansDirectory(baseDir);
145
+ for (const dir of activeDirs) {
146
+ const plan = await parsePlanFile(dir);
147
+ if (plan) {
148
+ plan.tasks = await parseTaskFiles(dir);
149
+ plans.push(plan);
150
+ }
151
+ }
152
+ // Collect archived plans
153
+ const archiveDirs = await scanArchiveDirectory(baseDir);
154
+ for (const dir of archiveDirs) {
155
+ const plan = await parsePlanFile(dir);
156
+ if (plan) {
157
+ plan.tasks = await parseTaskFiles(dir);
158
+ plans.push(plan);
159
+ }
160
+ }
161
+ return plans.sort((a, b) => a.id - b.id);
162
+ }
163
+ /**
164
+ * Calculate basic plan counts
165
+ */
166
+ function calculateBasicCounts(plans) {
167
+ return {
168
+ total: plans.length,
169
+ active: plans.filter(p => !p.isArchived).length,
170
+ archived: plans.filter(p => p.isArchived).length,
171
+ };
172
+ }
173
+ /**
174
+ * Calculate task completion rate across all plans (active + archived)
175
+ */
176
+ function calculateTaskCompletionRate(plans) {
177
+ let totalTasks = 0;
178
+ let completedTasks = 0;
179
+ for (const plan of plans) {
180
+ totalTasks += plan.tasks.length;
181
+ completedTasks += plan.tasks.filter(t => t.status === 'completed').length;
182
+ }
183
+ if (totalTasks === 0)
184
+ return 0;
185
+ return Math.round((completedTasks / totalTasks) * 100);
186
+ }
187
+ /**
188
+ * Categorize a single plan's status
189
+ */
190
+ function categorizePlanStatus(plan) {
191
+ if (plan.tasks.length === 0)
192
+ return 'noTasks';
193
+ const completedCount = plan.tasks.filter(t => t.status === 'completed').length;
194
+ const pendingCount = plan.tasks.filter(t => t.status === 'pending').length;
195
+ if (completedCount === plan.tasks.length)
196
+ return 'completed';
197
+ if (pendingCount === plan.tasks.length)
198
+ return 'notStarted';
199
+ return 'inProgress';
200
+ }
201
+ /**
202
+ * Calculate plan status distribution
203
+ */
204
+ function calculatePlanStatusDistribution(plans) {
205
+ const distribution = {
206
+ noTasks: 0,
207
+ notStarted: 0,
208
+ inProgress: 0,
209
+ completed: 0,
210
+ };
211
+ for (const plan of plans) {
212
+ const status = categorizePlanStatus(plan);
213
+ distribution[status]++;
214
+ }
215
+ return distribution;
216
+ }
217
+ /**
218
+ * Find most recent and oldest plans
219
+ */
220
+ function findTimelinePlans(plans) {
221
+ if (plans.length === 0)
222
+ return {};
223
+ const sorted = [...plans].sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime());
224
+ return {
225
+ mostRecent: sorted[0],
226
+ oldest: sorted[sorted.length - 1],
227
+ };
228
+ }
229
+ /**
230
+ * Calculate all dashboard statistics
231
+ */
232
+ function calculateStatistics(plans) {
233
+ const counts = calculateBasicCounts(plans);
234
+ const timeline = findTimelinePlans(plans);
235
+ return {
236
+ totalPlans: counts.total,
237
+ activePlans: counts.active,
238
+ archivedPlans: counts.archived,
239
+ taskCompletionRate: calculateTaskCompletionRate(plans),
240
+ plansByStatus: calculatePlanStatusDistribution(plans.filter(p => !p.isArchived)),
241
+ mostRecentPlan: timeline.mostRecent,
242
+ oldestPlan: timeline.oldest,
243
+ };
244
+ }
245
+ // ============================================================================
246
+ // VISUAL FORMATTING (Task 04)
247
+ // ============================================================================
248
+ const TERM_WIDTH = 80;
249
+ const DIVIDER = '─'.repeat(TERM_WIDTH);
250
+ /**
251
+ * Format a section header
252
+ */
253
+ function formatSectionHeader(title) {
254
+ return `\n${chalk_1.default.cyan.bold(title)}\n${chalk_1.default.cyan(DIVIDER)}\n`;
255
+ }
256
+ /**
257
+ * Create an ASCII progress bar
258
+ */
259
+ function createProgressBar(percentage, width = 20) {
260
+ const filled = Math.round((percentage / 100) * width);
261
+ const empty = width - filled;
262
+ const bar = chalk_1.default.green('█'.repeat(filled)) + chalk_1.default.gray('░'.repeat(empty));
263
+ return `[${bar}] ${percentage}%`;
264
+ }
265
+ /**
266
+ * Format the summary section
267
+ */
268
+ function formatSummary(stats) {
269
+ let output = formatSectionHeader('Summary');
270
+ output += ` ${chalk_1.default.cyan('●')} Total Plans: ${stats.totalPlans}\n`;
271
+ output += ` ${chalk_1.default.green('●')} Active Plans: ${stats.activePlans}\n`;
272
+ output += ` ${chalk_1.default.blue('●')} Archived Plans: ${stats.archivedPlans}\n`;
273
+ output += ` ${chalk_1.default.magenta('●')} Task Progress: ${createProgressBar(stats.taskCompletionRate)} (${stats.taskCompletionRate}% complete)\n`;
274
+ return output;
275
+ }
276
+ /**
277
+ * Format the active plans section
278
+ */
279
+ function formatActivePlans(plans) {
280
+ const activePlans = plans.filter(p => !p.isArchived);
281
+ if (activePlans.length === 0) {
282
+ return formatSectionHeader('Active Plans') + ' No active plans\n';
283
+ }
284
+ let output = formatSectionHeader('Active Plans');
285
+ for (const plan of activePlans) {
286
+ const taskCount = plan.tasks.length;
287
+ const completedCount = plan.tasks.filter(t => t.status === 'completed').length;
288
+ const percentage = taskCount > 0 ? Math.round((completedCount / taskCount) * 100) : 0;
289
+ const summary = plan.summary.length > 50 ? plan.summary.substring(0, 47) + '...' : plan.summary;
290
+ output += ` ${chalk_1.default.yellow('●')} ${chalk_1.default.bold(`Plan ${plan.id}`)}: ${summary}\n`;
291
+ if (taskCount > 0) {
292
+ output += ` ${createProgressBar(percentage, 20)} ${completedCount}/${taskCount} tasks\n`;
293
+ }
294
+ else {
295
+ output += ` ${chalk_1.default.gray('No tasks generated')}\n`;
296
+ }
297
+ }
298
+ return output;
299
+ }
300
+ /**
301
+ * Format archived plans with unfinished tasks section
302
+ */
303
+ function formatIncompleteArchivedPlans(plans) {
304
+ const archivedPlans = plans.filter(p => p.isArchived);
305
+ const incompleteArchived = archivedPlans.filter(p => p.tasks.length > 0 && p.tasks.some(t => t.status !== 'completed'));
306
+ if (incompleteArchived.length === 0) {
307
+ return '';
308
+ }
309
+ let output = formatSectionHeader('Unfinished Tasks in Archived Plans');
310
+ for (const plan of incompleteArchived) {
311
+ const taskCount = plan.tasks.length;
312
+ const completedCount = plan.tasks.filter(t => t.status === 'completed').length;
313
+ const incompleteCount = taskCount - completedCount;
314
+ const percentage = Math.round((completedCount / taskCount) * 100);
315
+ const summary = plan.summary.length > 50 ? plan.summary.substring(0, 47) + '...' : plan.summary;
316
+ output += ` ${chalk_1.default.red('⚠')} ${chalk_1.default.bold(`Plan ${plan.id}`)}: ${summary}\n`;
317
+ output += ` ${createProgressBar(percentage, 20)} ${incompleteCount} incomplete task${incompleteCount !== 1 ? 's' : ''}\n`;
318
+ }
319
+ return output;
320
+ }
321
+ /**
322
+ * Format the archived plans section
323
+ */
324
+ function formatArchivedPlans(plans) {
325
+ const archivedPlans = plans.filter(p => p.isArchived);
326
+ if (archivedPlans.length === 0) {
327
+ return formatSectionHeader('Archived Plans') + ' No archived plans\n';
328
+ }
329
+ let output = formatSectionHeader('Archived Plans');
330
+ for (const plan of archivedPlans) {
331
+ const summary = plan.summary.length > 60 ? plan.summary.substring(0, 57) + '...' : plan.summary;
332
+ output += ` ${chalk_1.default.green('✓')} ${chalk_1.default.bold(`Plan ${plan.id}`)}: ${summary}\n`;
333
+ }
334
+ return output;
335
+ }
336
+ /**
337
+ * Format the complete dashboard
338
+ */
339
+ function formatDashboard(stats, plans) {
340
+ let output = '';
341
+ output += chalk_1.default.bold.white('\nStrikethroo Dashboard\n');
342
+ output += chalk_1.default.gray(DIVIDER) + '\n';
343
+ output += formatSummary(stats);
344
+ output += formatActivePlans(plans);
345
+ const incompleteSection = formatIncompleteArchivedPlans(plans);
346
+ if (incompleteSection) {
347
+ output += incompleteSection;
348
+ }
349
+ output += formatArchivedPlans(plans);
350
+ output += '\n' + chalk_1.default.gray(DIVIDER) + '\n';
351
+ return output;
352
+ }
353
+ // ============================================================================
354
+ // MAIN STATUS FUNCTION (Task 05)
355
+ // ============================================================================
356
+ /**
357
+ * Main status function that orchestrates all components
358
+ */
359
+ async function status() {
360
+ try {
361
+ const plans = await collectPlanData();
362
+ const stats = calculateStatistics(plans);
363
+ const dashboard = formatDashboard(stats, plans);
364
+ console.log(dashboard);
365
+ return { success: true };
366
+ }
367
+ catch (error) {
368
+ const message = error instanceof Error ? error.message : String(error);
369
+ return {
370
+ success: false,
371
+ message: `Failed to generate dashboard: ${message}`,
372
+ };
373
+ }
374
+ }
375
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}