strikethroo 3.0.0 → 3.0.2
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 +2 -3
- package/dist/cli.js +0 -137
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
- package/dist/plan-utils.d.ts +0 -35
- package/dist/plan-utils.d.ts.map +0 -1
- package/dist/plan-utils.js +0 -123
- package/dist/plan-utils.js.map +0 -1
- package/dist/plan.d.ts +0 -27
- package/dist/plan.d.ts.map +0 -1
- package/dist/plan.js +0 -279
- package/dist/plan.js.map +0 -1
- package/dist/status.d.ts +0 -73
- package/dist/status.d.ts.map +0 -1
- package/dist/status.js +0 -375
- package/dist/status.js.map +0 -1
package/README.md
CHANGED
|
@@ -31,7 +31,6 @@ The CLI's `init` emits the shared workspace plus harness-specific agents (e.g.,
|
|
|
31
31
|
- **🎯 Extensible Architecture**: Add custom validation gates, quality checks, and workflow patterns
|
|
32
32
|
- **📋 Structured Workflows**: Three-phase progressive refinement with validation gates
|
|
33
33
|
- **🔄 Plan Mode Integration**: Enhance existing AI assistant features with structured task management
|
|
34
|
-
- **📊 Plan Inspection & Management**: View progress, archive completed work, and manage plans via CLI
|
|
35
34
|
- **💰 Works Within Subscriptions**: No additional API keys or costs required
|
|
36
35
|
|
|
37
36
|
## 📖 Documentation
|
|
@@ -60,8 +59,8 @@ The `st-full-workflow` skill handles plan creation, task generation, and bluepri
|
|
|
60
59
|
2. **🔍 Refine the plan** → "Refine plan 1" (`st-refine-plan` skill — useful when a second assistant should red-team the plan)
|
|
61
60
|
3. **📋 Generate tasks** → "Generate tasks for plan 1" (`st-generate-tasks` skill)
|
|
62
61
|
4. **🚀 Execute blueprint** → "Execute the blueprint for plan 1" (`st-execute-blueprint` skill)
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
|
|
63
|
+
Progress is driven by the Agent Skills workflow: the `st-execute-blueprint` skill runs the phases, archives the plan automatically on completion, and you can inspect plan and task files directly under `.ai/strikethroo/plans/` (completed plans move to `.ai/strikethroo/archive/`).
|
|
65
64
|
|
|
66
65
|
## 🤖 Supported Harnesses
|
|
67
66
|
|
package/dist/cli.js
CHANGED
|
@@ -9,8 +9,6 @@
|
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
const commander_1 = require("commander");
|
|
11
11
|
const index_1 = require("./index");
|
|
12
|
-
const status_1 = require("./status");
|
|
13
|
-
const plan_1 = require("./plan");
|
|
14
12
|
const program = new commander_1.Command();
|
|
15
13
|
program.name('strikethroo').version('0.1.0').description('AI-powered task management CLI tool');
|
|
16
14
|
program
|
|
@@ -36,141 +34,6 @@ program
|
|
|
36
34
|
process.exit(1);
|
|
37
35
|
}
|
|
38
36
|
});
|
|
39
|
-
program
|
|
40
|
-
.command('status')
|
|
41
|
-
.description('Display dashboard with plans and task statistics')
|
|
42
|
-
.action(async () => {
|
|
43
|
-
try {
|
|
44
|
-
const result = await (0, status_1.status)();
|
|
45
|
-
if (result.success) {
|
|
46
|
-
process.exit(0);
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
if (result.message) {
|
|
50
|
-
console.error(result.message);
|
|
51
|
-
}
|
|
52
|
-
process.exit(1);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
console.error(`Unexpected error: ${error instanceof Error ? error.message : String(error)}`);
|
|
57
|
-
process.exit(1);
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
// Create parent plan command for help organization
|
|
61
|
-
const planCommand = program
|
|
62
|
-
.command('plan')
|
|
63
|
-
.description('Display and manage plans. Use `plan <id>` as shorthand for `plan show <id>`.');
|
|
64
|
-
// Plan show subcommand
|
|
65
|
-
planCommand
|
|
66
|
-
.command('show <plan-id>')
|
|
67
|
-
.description('Display plan metadata, progress, and executive summary')
|
|
68
|
-
.action(async (planId) => {
|
|
69
|
-
try {
|
|
70
|
-
const planIdNum = parseInt(planId, 10);
|
|
71
|
-
if (isNaN(planIdNum)) {
|
|
72
|
-
console.error(`Invalid plan ID: ${planId}. Must be a number.`);
|
|
73
|
-
process.exit(1);
|
|
74
|
-
}
|
|
75
|
-
const result = await (0, plan_1.showPlan)(planIdNum);
|
|
76
|
-
if (result.success) {
|
|
77
|
-
process.exit(0);
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
if (result.message) {
|
|
81
|
-
console.error(result.message);
|
|
82
|
-
}
|
|
83
|
-
process.exit(1);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
catch (error) {
|
|
87
|
-
console.error(`Unexpected error: ${error instanceof Error ? error.message : String(error)}`);
|
|
88
|
-
process.exit(1);
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
// Plan archive subcommand
|
|
92
|
-
planCommand
|
|
93
|
-
.command('archive <plan-id>')
|
|
94
|
-
.description('Move a plan from active to archive directory')
|
|
95
|
-
.action(async (planId) => {
|
|
96
|
-
try {
|
|
97
|
-
const planIdNum = parseInt(planId, 10);
|
|
98
|
-
if (isNaN(planIdNum)) {
|
|
99
|
-
console.error(`Invalid plan ID: ${planId}. Must be a number.`);
|
|
100
|
-
process.exit(1);
|
|
101
|
-
}
|
|
102
|
-
const result = await (0, plan_1.archivePlan)(planIdNum);
|
|
103
|
-
if (result.success) {
|
|
104
|
-
process.exit(0);
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
if (result.message) {
|
|
108
|
-
console.error(result.message);
|
|
109
|
-
}
|
|
110
|
-
process.exit(1);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
catch (error) {
|
|
114
|
-
console.error(`Unexpected error: ${error instanceof Error ? error.message : String(error)}`);
|
|
115
|
-
process.exit(1);
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
// Plan delete subcommand
|
|
119
|
-
planCommand
|
|
120
|
-
.command('delete <plan-id>')
|
|
121
|
-
.description('Permanently delete a plan and all its tasks')
|
|
122
|
-
.action(async (planId) => {
|
|
123
|
-
try {
|
|
124
|
-
const planIdNum = parseInt(planId, 10);
|
|
125
|
-
if (isNaN(planIdNum)) {
|
|
126
|
-
console.error(`Invalid plan ID: ${planId}. Must be a number.`);
|
|
127
|
-
process.exit(1);
|
|
128
|
-
}
|
|
129
|
-
const result = await (0, plan_1.deletePlan)(planIdNum);
|
|
130
|
-
if (result.success) {
|
|
131
|
-
process.exit(0);
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
if (result.message) {
|
|
135
|
-
console.error(result.message);
|
|
136
|
-
}
|
|
137
|
-
process.exit(1);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
catch (error) {
|
|
141
|
-
console.error(`Unexpected error: ${error instanceof Error ? error.message : String(error)}`);
|
|
142
|
-
process.exit(1);
|
|
143
|
-
}
|
|
144
|
-
});
|
|
145
|
-
// Backward compatibility: plan <id> as shorthand for plan show <id>
|
|
146
|
-
planCommand
|
|
147
|
-
.argument('[plan-id]', 'Plan ID to display (shorthand for show subcommand)')
|
|
148
|
-
.action(async (planId) => {
|
|
149
|
-
// Only handle if planId is provided and no subcommand was matched
|
|
150
|
-
if (planId) {
|
|
151
|
-
try {
|
|
152
|
-
const planIdNum = parseInt(planId, 10);
|
|
153
|
-
if (isNaN(planIdNum)) {
|
|
154
|
-
console.error(`Invalid plan ID: ${planId}. Must be a number.`);
|
|
155
|
-
process.exit(1);
|
|
156
|
-
}
|
|
157
|
-
const result = await (0, plan_1.showPlan)(planIdNum);
|
|
158
|
-
if (result.success) {
|
|
159
|
-
process.exit(0);
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
if (result.message) {
|
|
163
|
-
console.error(result.message);
|
|
164
|
-
}
|
|
165
|
-
process.exit(1);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
catch (error) {
|
|
169
|
-
console.error(`Unexpected error: ${error instanceof Error ? error.message : String(error)}`);
|
|
170
|
-
process.exit(1);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
37
|
// Error handling for unknown commands
|
|
175
38
|
program.on('command:*', async (operands) => {
|
|
176
39
|
console.error(`Unknown command: ${operands[0]}`);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AACA;;;;;GAKG;;AAEH,yCAAoC;AACpC,mCAA+B;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AACA;;;;;GAKG;;AAEH,yCAAoC;AACpC,mCAA+B;AAG/B,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,qCAAqC,CAAC,CAAC;AAEhG,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,sCAAsC,CAAC;KACnD,cAAc,CACb,qBAAqB,EACrB,6FAA6F,CAC9F;KACA,MAAM,CACL,gCAAgC,EAChC,uEAAuE,CACxE;KACA,MAAM,CAAC,SAAS,EAAE,6CAA6C,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,OAAoB,EAAE,EAAE;IACrC,IAAI,CAAC;QACH,2BAA2B;QAC3B,MAAM,MAAM,GAAG,MAAM,IAAA,YAAI,EAAC,OAAO,CAAC,CAAC;QAEnC,6CAA6C;QAC7C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,sCAAsC;AACtC,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAC,QAAQ,EAAC,EAAE;IACvC,OAAO,CAAC,KAAK,CAAC,oBAAoB,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,+BAA+B;AAC/B,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,sCAAsC;AACtC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
package/package.json
CHANGED
package/dist/plan-utils.d.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Plan Utilities Module
|
|
3
|
-
*
|
|
4
|
-
* Provides functions for locating plans, loading plan data, and extracting content
|
|
5
|
-
*/
|
|
6
|
-
import { PlanMetadata } from './status';
|
|
7
|
-
/**
|
|
8
|
-
* Location information for a plan
|
|
9
|
-
*/
|
|
10
|
-
export interface PlanLocation {
|
|
11
|
-
planId: number;
|
|
12
|
-
directoryPath: string;
|
|
13
|
-
filePath: string;
|
|
14
|
-
isArchived: boolean;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Extended plan data including body content
|
|
18
|
-
*/
|
|
19
|
-
export interface PlanData extends PlanMetadata {
|
|
20
|
-
bodyContent: string;
|
|
21
|
-
executiveSummary: string;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Find a plan by ID in either plans/ or archive/ directories
|
|
25
|
-
*/
|
|
26
|
-
export declare function findPlanById(planId: number): Promise<PlanLocation | null>;
|
|
27
|
-
/**
|
|
28
|
-
* Extract Executive Summary section from markdown content
|
|
29
|
-
*/
|
|
30
|
-
export declare function extractExecutiveSummary(markdown: string): string;
|
|
31
|
-
/**
|
|
32
|
-
* Load complete plan data including metadata, tasks, and content
|
|
33
|
-
*/
|
|
34
|
-
export declare function loadPlanData(planId: number): Promise<PlanData | null>;
|
|
35
|
-
//# sourceMappingURL=plan-utils.d.ts.map
|
package/dist/plan-utils.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plan-utils.d.ts","sourceRoot":"","sources":["../src/plan-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,YAAY,EAAkB,MAAM,UAAU,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,QAAS,SAAQ,YAAY;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAqC/E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWhE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAqB3E"}
|
package/dist/plan-utils.js
DELETED
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Plan Utilities Module
|
|
4
|
-
*
|
|
5
|
-
* Provides functions for locating plans, loading plan data, and extracting content
|
|
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.findPlanById = findPlanById;
|
|
45
|
-
exports.extractExecutiveSummary = extractExecutiveSummary;
|
|
46
|
-
exports.loadPlanData = loadPlanData;
|
|
47
|
-
const fs = __importStar(require("fs-extra"));
|
|
48
|
-
const path = __importStar(require("path"));
|
|
49
|
-
const gray_matter_1 = __importDefault(require("gray-matter"));
|
|
50
|
-
const status_1 = require("./status");
|
|
51
|
-
/**
|
|
52
|
-
* Find a plan by ID in either plans/ or archive/ directories
|
|
53
|
-
*/
|
|
54
|
-
async function findPlanById(planId) {
|
|
55
|
-
const baseDir = process.cwd();
|
|
56
|
-
const searchDirs = [
|
|
57
|
-
{ path: path.join(baseDir, '.ai/strikethroo/plans'), archived: false },
|
|
58
|
-
{ path: path.join(baseDir, '.ai/strikethroo/archive'), archived: true },
|
|
59
|
-
];
|
|
60
|
-
for (const searchDir of searchDirs) {
|
|
61
|
-
if (!(await fs.pathExists(searchDir.path)))
|
|
62
|
-
continue;
|
|
63
|
-
const entries = await fs.readdir(searchDir.path, { withFileTypes: true });
|
|
64
|
-
for (const entry of entries) {
|
|
65
|
-
if (!entry.isDirectory())
|
|
66
|
-
continue;
|
|
67
|
-
const planDir = path.join(searchDir.path, entry.name);
|
|
68
|
-
const files = await fs.readdir(planDir);
|
|
69
|
-
const planFile = files.find(f => f.startsWith('plan-') && f.endsWith('.md'));
|
|
70
|
-
if (!planFile)
|
|
71
|
-
continue;
|
|
72
|
-
const filePath = path.join(planDir, planFile);
|
|
73
|
-
const content = await fs.readFile(filePath, 'utf-8');
|
|
74
|
-
const { data } = (0, gray_matter_1.default)(content);
|
|
75
|
-
if (data.id === planId) {
|
|
76
|
-
return {
|
|
77
|
-
planId,
|
|
78
|
-
directoryPath: planDir,
|
|
79
|
-
filePath,
|
|
80
|
-
isArchived: searchDir.archived,
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Extract Executive Summary section from markdown content
|
|
89
|
-
*/
|
|
90
|
-
function extractExecutiveSummary(markdown) {
|
|
91
|
-
// Match from "## Executive Summary" to next ## heading or end of file
|
|
92
|
-
const regex = /## Executive Summary\n+([\s\S]*?)(?=\n## |$)/;
|
|
93
|
-
const match = markdown.match(regex);
|
|
94
|
-
if (!match || !match[1]) {
|
|
95
|
-
return 'No Executive Summary found.';
|
|
96
|
-
}
|
|
97
|
-
// Trim whitespace and return
|
|
98
|
-
return match[1].trim();
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Load complete plan data including metadata, tasks, and content
|
|
102
|
-
*/
|
|
103
|
-
async function loadPlanData(planId) {
|
|
104
|
-
const location = await findPlanById(planId);
|
|
105
|
-
if (!location)
|
|
106
|
-
return null;
|
|
107
|
-
const content = await fs.readFile(location.filePath, 'utf-8');
|
|
108
|
-
const { data, content: bodyContent } = (0, gray_matter_1.default)(content);
|
|
109
|
-
const tasks = await (0, status_1.parseTaskFiles)(location.directoryPath);
|
|
110
|
-
const executiveSummary = extractExecutiveSummary(bodyContent);
|
|
111
|
-
return {
|
|
112
|
-
id: data.id,
|
|
113
|
-
summary: data.summary,
|
|
114
|
-
created: data.created,
|
|
115
|
-
approval_method: data.approval_method,
|
|
116
|
-
isArchived: location.isArchived,
|
|
117
|
-
directoryPath: location.directoryPath,
|
|
118
|
-
tasks,
|
|
119
|
-
bodyContent,
|
|
120
|
-
executiveSummary,
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
//# sourceMappingURL=plan-utils.js.map
|
package/dist/plan-utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plan-utils.js","sourceRoot":"","sources":["../src/plan-utils.ts"],"names":[],"mappings":"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"}
|
package/dist/plan.d.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Plan Command Module
|
|
3
|
-
*
|
|
4
|
-
* Implements show and archive subcommands for plan inspection and management
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Display plan metadata, executive summary, and task statistics
|
|
8
|
-
*/
|
|
9
|
-
export declare function showPlan(planId: number): Promise<{
|
|
10
|
-
success: boolean;
|
|
11
|
-
message?: string;
|
|
12
|
-
}>;
|
|
13
|
-
/**
|
|
14
|
-
* Delete a plan permanently from either active or archive directory
|
|
15
|
-
*/
|
|
16
|
-
export declare function deletePlan(planId: number, autoConfirm?: boolean): Promise<{
|
|
17
|
-
success: boolean;
|
|
18
|
-
message?: string;
|
|
19
|
-
}>;
|
|
20
|
-
/**
|
|
21
|
-
* Archive a plan by moving it to the archive directory
|
|
22
|
-
*/
|
|
23
|
-
export declare function archivePlan(planId: number, autoConfirm?: boolean): Promise<{
|
|
24
|
-
success: boolean;
|
|
25
|
-
message?: string;
|
|
26
|
-
}>;
|
|
27
|
-
//# sourceMappingURL=plan.d.ts.map
|
package/dist/plan.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0EH;;GAEG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA8D9F;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,WAAW,GAAE,OAAe,GAC3B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyCjD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,WAAW,GAAE,OAAe,GAC3B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA8FjD"}
|
package/dist/plan.js
DELETED
|
@@ -1,279 +0,0 @@
|
|
|
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.deletePlan = deletePlan;
|
|
46
|
-
exports.archivePlan = archivePlan;
|
|
47
|
-
const fs = __importStar(require("fs-extra"));
|
|
48
|
-
const path = __importStar(require("path"));
|
|
49
|
-
const gray_matter_1 = __importDefault(require("gray-matter"));
|
|
50
|
-
const readline = __importStar(require("readline"));
|
|
51
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
52
|
-
const plan_utils_1 = require("./plan-utils");
|
|
53
|
-
const TERM_WIDTH = 80;
|
|
54
|
-
const DIVIDER = '─'.repeat(TERM_WIDTH);
|
|
55
|
-
/**
|
|
56
|
-
* Format a section header
|
|
57
|
-
*/
|
|
58
|
-
function formatSectionHeader(title) {
|
|
59
|
-
return `\n${chalk_1.default.cyan.bold(title)}\n${chalk_1.default.cyan(DIVIDER)}\n`;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Create an ASCII progress bar
|
|
63
|
-
*/
|
|
64
|
-
function createProgressBar(percentage, width = 20) {
|
|
65
|
-
const filled = Math.round((percentage / 100) * width);
|
|
66
|
-
const empty = width - filled;
|
|
67
|
-
const bar = chalk_1.default.green('█'.repeat(filled)) + chalk_1.default.gray('░'.repeat(empty));
|
|
68
|
-
return `[${bar}] ${percentage}%`;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Wrap text to specified width, preserving paragraphs
|
|
72
|
-
*/
|
|
73
|
-
function wrapText(text, maxWidth) {
|
|
74
|
-
const paragraphs = text.split('\n\n');
|
|
75
|
-
return paragraphs
|
|
76
|
-
.map(paragraph => {
|
|
77
|
-
const words = paragraph.split(/\s+/);
|
|
78
|
-
const lines = [];
|
|
79
|
-
let currentLine = '';
|
|
80
|
-
for (const word of words) {
|
|
81
|
-
if (currentLine.length + word.length + 1 <= maxWidth) {
|
|
82
|
-
currentLine += (currentLine ? ' ' : '') + word;
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
if (currentLine)
|
|
86
|
-
lines.push(currentLine);
|
|
87
|
-
currentLine = word;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
if (currentLine)
|
|
91
|
-
lines.push(currentLine);
|
|
92
|
-
return lines.join('\n');
|
|
93
|
-
})
|
|
94
|
-
.join('\n\n');
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Prompt user for yes/no confirmation
|
|
98
|
-
*/
|
|
99
|
-
async function promptConfirmation(question) {
|
|
100
|
-
const rl = readline.createInterface({
|
|
101
|
-
input: process.stdin,
|
|
102
|
-
output: process.stdout,
|
|
103
|
-
});
|
|
104
|
-
return new Promise(resolve => {
|
|
105
|
-
rl.question(question, answer => {
|
|
106
|
-
rl.close();
|
|
107
|
-
resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Display plan metadata, executive summary, and task statistics
|
|
113
|
-
*/
|
|
114
|
-
async function showPlan(planId) {
|
|
115
|
-
try {
|
|
116
|
-
const planData = await (0, plan_utils_1.loadPlanData)(planId);
|
|
117
|
-
if (!planData) {
|
|
118
|
-
return {
|
|
119
|
-
success: false,
|
|
120
|
-
message: `Plan ${planId} not found. Check .ai/strikethroo/plans/ and .ai/strikethroo/archive/`,
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
// Build output
|
|
124
|
-
let output = '';
|
|
125
|
-
// Header
|
|
126
|
-
output += chalk_1.default.bold.white(`\nPlan ${planData.id}\n`);
|
|
127
|
-
output += chalk_1.default.gray(DIVIDER) + '\n';
|
|
128
|
-
// Metadata section
|
|
129
|
-
output += formatSectionHeader('Metadata');
|
|
130
|
-
output += ` ${chalk_1.default.cyan('●')} ID: ${planData.id}\n`;
|
|
131
|
-
output += ` ${chalk_1.default.cyan('●')} Created: ${planData.created}\n`;
|
|
132
|
-
output += ` ${chalk_1.default.cyan('●')} Status: ${planData.isArchived ? chalk_1.default.blue('Archived') : chalk_1.default.green('Active')}\n`;
|
|
133
|
-
output += ` ${chalk_1.default.cyan('●')} Summary: ${planData.summary}\n`;
|
|
134
|
-
output += ` ${chalk_1.default.cyan('●')} Approval: ${planData.approval_method ?? 'unset'}\n`;
|
|
135
|
-
// Task statistics section
|
|
136
|
-
const taskCount = planData.tasks.length;
|
|
137
|
-
const completedCount = planData.tasks.filter(t => t.status === 'completed').length;
|
|
138
|
-
const percentage = taskCount > 0 ? Math.round((completedCount / taskCount) * 100) : 0;
|
|
139
|
-
output += formatSectionHeader('Task Progress');
|
|
140
|
-
if (taskCount > 0) {
|
|
141
|
-
output += ` ${createProgressBar(percentage, 20)} ${completedCount}/${taskCount} tasks completed\n`;
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
output += ` ${chalk_1.default.gray('No tasks generated yet')}\n`;
|
|
145
|
-
}
|
|
146
|
-
// Executive Summary section
|
|
147
|
-
output += formatSectionHeader('Executive Summary');
|
|
148
|
-
// Word wrap the executive summary to 76 chars (80 - 4 for indent)
|
|
149
|
-
const wrappedSummary = wrapText(planData.executiveSummary, 76);
|
|
150
|
-
output +=
|
|
151
|
-
wrappedSummary
|
|
152
|
-
.split('\n')
|
|
153
|
-
.map(line => ` ${line}`)
|
|
154
|
-
.join('\n') + '\n';
|
|
155
|
-
// Footer
|
|
156
|
-
output += '\n' + chalk_1.default.gray(DIVIDER) + '\n';
|
|
157
|
-
console.log(output);
|
|
158
|
-
return { success: true };
|
|
159
|
-
}
|
|
160
|
-
catch (error) {
|
|
161
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
162
|
-
return {
|
|
163
|
-
success: false,
|
|
164
|
-
message: `Failed to display plan: ${message}`,
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Delete a plan permanently from either active or archive directory
|
|
170
|
-
*/
|
|
171
|
-
async function deletePlan(planId, autoConfirm = false) {
|
|
172
|
-
try {
|
|
173
|
-
// 1. Find the plan
|
|
174
|
-
const location = await (0, plan_utils_1.findPlanById)(planId);
|
|
175
|
-
if (!location) {
|
|
176
|
-
return {
|
|
177
|
-
success: false,
|
|
178
|
-
message: `Plan ${planId} not found. Check .ai/strikethroo/plans/ and .ai/strikethroo/archive/ directories.`,
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
// 2. Prompt for confirmation (unless autoConfirm is true)
|
|
182
|
-
if (!autoConfirm) {
|
|
183
|
-
const planType = location.isArchived ? 'archived' : 'active';
|
|
184
|
-
console.log(chalk_1.default.yellow(`\n⚠ Warning: This will permanently delete ${planType} plan ${planId} and all its tasks.\n`));
|
|
185
|
-
const confirmed = await promptConfirmation('Delete plan? (y/n): ');
|
|
186
|
-
if (!confirmed) {
|
|
187
|
-
return { success: false, message: 'Deletion cancelled by user.' };
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
// 3. Delete the directory
|
|
191
|
-
await fs.remove(location.directoryPath);
|
|
192
|
-
// 4. Display success message
|
|
193
|
-
console.log(chalk_1.default.green(`\n✓ Plan ${planId} successfully deleted.\n`));
|
|
194
|
-
return { success: true };
|
|
195
|
-
}
|
|
196
|
-
catch (error) {
|
|
197
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
198
|
-
return {
|
|
199
|
-
success: false,
|
|
200
|
-
message: `Failed to delete plan: ${message}`,
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Archive a plan by moving it to the archive directory
|
|
206
|
-
*/
|
|
207
|
-
async function archivePlan(planId, autoConfirm = false) {
|
|
208
|
-
try {
|
|
209
|
-
// 1. Find and validate plan location
|
|
210
|
-
const location = await (0, plan_utils_1.findPlanById)(planId);
|
|
211
|
-
if (!location) {
|
|
212
|
-
return {
|
|
213
|
-
success: false,
|
|
214
|
-
message: `Plan ${planId} not found. Check .ai/strikethroo/plans/ directory.`,
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
if (location.isArchived) {
|
|
218
|
-
return {
|
|
219
|
-
success: false,
|
|
220
|
-
message: `Plan ${planId} is already archived.`,
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
// 2. Load plan data to check for incomplete tasks
|
|
224
|
-
const planData = await (0, plan_utils_1.loadPlanData)(planId);
|
|
225
|
-
if (!planData) {
|
|
226
|
-
return { success: false, message: `Failed to load plan ${planId} data.` };
|
|
227
|
-
}
|
|
228
|
-
const incompleteTasks = planData.tasks.filter(t => t.status !== 'completed');
|
|
229
|
-
// 3. Warn user if incomplete tasks exist
|
|
230
|
-
if (incompleteTasks.length > 0 && !autoConfirm) {
|
|
231
|
-
console.log(chalk_1.default.yellow(`\n⚠ Warning: Plan ${planId} has ${incompleteTasks.length} incomplete task(s).\n`));
|
|
232
|
-
const confirmed = await promptConfirmation('Archive anyway? (y/n): ');
|
|
233
|
-
if (!confirmed) {
|
|
234
|
-
return { success: false, message: 'Archive cancelled by user.' };
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
// 4. Update all task files to completed status
|
|
238
|
-
const tasksDir = path.join(location.directoryPath, 'tasks');
|
|
239
|
-
if (await fs.pathExists(tasksDir)) {
|
|
240
|
-
const taskFiles = await fs.readdir(tasksDir);
|
|
241
|
-
for (const file of taskFiles) {
|
|
242
|
-
if (!file.endsWith('.md'))
|
|
243
|
-
continue;
|
|
244
|
-
const taskPath = path.join(tasksDir, file);
|
|
245
|
-
const content = await fs.readFile(taskPath, 'utf-8');
|
|
246
|
-
const parsed = (0, gray_matter_1.default)(content);
|
|
247
|
-
// Update status to completed
|
|
248
|
-
parsed.data.status = 'completed';
|
|
249
|
-
// Write back with updated frontmatter
|
|
250
|
-
const updated = gray_matter_1.default.stringify(parsed.content, parsed.data);
|
|
251
|
-
await fs.writeFile(taskPath, updated, 'utf-8');
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
// 5. Append "Manually archived" note to plan document
|
|
255
|
-
const planContent = await fs.readFile(location.filePath, 'utf-8');
|
|
256
|
-
const today = new Date().toISOString().split('T')[0]; // YYYY-MM-DD format
|
|
257
|
-
const archiveNote = `\n---\n\n**Note**: Manually archived on ${today}\n`;
|
|
258
|
-
const updatedContent = planContent + archiveNote;
|
|
259
|
-
await fs.writeFile(location.filePath, updatedContent, 'utf-8');
|
|
260
|
-
// 6. Move plan directory to archive
|
|
261
|
-
const baseDir = process.cwd();
|
|
262
|
-
const archiveDir = path.join(baseDir, '.ai/strikethroo/archive');
|
|
263
|
-
await fs.ensureDir(archiveDir);
|
|
264
|
-
const planDirName = path.basename(location.directoryPath);
|
|
265
|
-
const archivePath = path.join(archiveDir, planDirName);
|
|
266
|
-
await fs.move(location.directoryPath, archivePath);
|
|
267
|
-
// 7. Display success message
|
|
268
|
-
console.log(chalk_1.default.green(`\n✓ Plan ${planId} successfully archived to .ai/strikethroo/archive/${planDirName}\n`));
|
|
269
|
-
return { success: true };
|
|
270
|
-
}
|
|
271
|
-
catch (error) {
|
|
272
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
273
|
-
return {
|
|
274
|
-
success: false,
|
|
275
|
-
message: `Failed to archive plan: ${message}`,
|
|
276
|
-
};
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
//# sourceMappingURL=plan.js.map
|
package/dist/plan.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"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"}
|
package/dist/status.d.ts
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
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
|
package/dist/status.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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
DELETED
|
@@ -1,375 +0,0 @@
|
|
|
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
|
package/dist/status.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
|