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.
- package/LICENSE +21 -0
- package/README.md +79 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +187 -0
- package/dist/cli.js.map +1 -0
- package/dist/conflict-detector.d.ts +24 -0
- package/dist/conflict-detector.d.ts.map +1 -0
- package/dist/conflict-detector.js +130 -0
- package/dist/conflict-detector.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +344 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata.d.ts +40 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +121 -0
- package/dist/metadata.js.map +1 -0
- package/dist/plan-utils.d.ts +35 -0
- package/dist/plan-utils.d.ts.map +1 -0
- package/dist/plan-utils.js +123 -0
- package/dist/plan-utils.js.map +1 -0
- package/dist/plan.d.ts +27 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +279 -0
- package/dist/plan.js.map +1 -0
- package/dist/prompts.d.ts +21 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +132 -0
- package/dist/prompts.js.map +1 -0
- package/dist/status.d.ts +73 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +375 -0
- package/dist/status.js.map +1 -0
- package/dist/types.d.ts +274 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +53 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +158 -0
- package/dist/utils.js.map +1 -0
- package/package.json +94 -0
- package/templates/harness/agents/plan-creator.md +95 -0
- package/templates/harness/skills/st-create-plan/SKILL.md +120 -0
- package/templates/harness/skills/st-create-plan/scripts/find-strikethroo-root.cjs +116 -0
- package/templates/harness/skills/st-create-plan/scripts/get-next-plan-id.cjs +197 -0
- package/templates/harness/skills/st-execute-blueprint/SKILL.md +147 -0
- package/templates/harness/skills/st-execute-blueprint/scripts/create-feature-branch.cjs +359 -0
- package/templates/harness/skills/st-execute-blueprint/scripts/find-strikethroo-root.cjs +116 -0
- package/templates/harness/skills/st-execute-blueprint/scripts/validate-plan-blueprint.cjs +358 -0
- package/templates/harness/skills/st-execute-task/SKILL.md +195 -0
- package/templates/harness/skills/st-execute-task/scripts/check-task-dependencies.cjs +420 -0
- package/templates/harness/skills/st-execute-task/scripts/find-strikethroo-root.cjs +116 -0
- package/templates/harness/skills/st-execute-task/scripts/validate-plan-blueprint.cjs +358 -0
- package/templates/harness/skills/st-full-workflow/SKILL.md +413 -0
- package/templates/harness/skills/st-full-workflow/scripts/create-feature-branch.cjs +359 -0
- package/templates/harness/skills/st-full-workflow/scripts/find-strikethroo-root.cjs +116 -0
- package/templates/harness/skills/st-full-workflow/scripts/get-next-plan-id.cjs +197 -0
- package/templates/harness/skills/st-full-workflow/scripts/get-next-task-id.cjs +295 -0
- package/templates/harness/skills/st-full-workflow/scripts/validate-plan-blueprint.cjs +358 -0
- package/templates/harness/skills/st-generate-tasks/SKILL.md +244 -0
- package/templates/harness/skills/st-generate-tasks/scripts/find-strikethroo-root.cjs +116 -0
- package/templates/harness/skills/st-generate-tasks/scripts/get-next-task-id.cjs +295 -0
- package/templates/harness/skills/st-generate-tasks/scripts/validate-plan-blueprint.cjs +358 -0
- package/templates/harness/skills/st-refine-plan/SKILL.md +205 -0
- package/templates/harness/skills/st-refine-plan/scripts/find-strikethroo-root.cjs +116 -0
- package/templates/harness/skills/st-refine-plan/scripts/validate-plan-blueprint.cjs +358 -0
- package/templates/strikethroo/README.md +7 -0
- package/templates/strikethroo/config/STRIKETHROO.md +76 -0
- package/templates/strikethroo/config/hooks/POST_ERROR_DETECTION.md +46 -0
- package/templates/strikethroo/config/hooks/POST_EXECUTION.md +25 -0
- package/templates/strikethroo/config/hooks/POST_PHASE.md +24 -0
- package/templates/strikethroo/config/hooks/POST_PLAN.md +5 -0
- package/templates/strikethroo/config/hooks/POST_TASK_GENERATION_ALL.md +41 -0
- package/templates/strikethroo/config/hooks/PRE_PHASE.md +21 -0
- package/templates/strikethroo/config/hooks/PRE_PLAN.md +42 -0
- package/templates/strikethroo/config/hooks/PRE_TASK_ASSIGNMENT.md +32 -0
- package/templates/strikethroo/config/hooks/PRE_TASK_EXECUTION.md +1 -0
- package/templates/strikethroo/config/templates/BLUEPRINT_TEMPLATE.md +24 -0
- package/templates/strikethroo/config/templates/EXECUTION_SUMMARY_TEMPLATE.md +13 -0
- package/templates/strikethroo/config/templates/PLAN_TEMPLATE.md +109 -0
- package/templates/strikethroo/config/templates/TASK_TEMPLATE.md +36 -0
package/dist/status.d.ts
ADDED
|
@@ -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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"}
|