strikethroo 3.0.1 → 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 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
- 5. **📊 Monitor progress** → `npx strikethroo status`
64
- 6. **🗂️ Manage plans** `npx strikethroo plan show 1`
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":"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"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "strikethroo",
3
- "version": "3.0.1",
3
+ "version": "3.0.2",
4
4
  "description": "Task management for AI coding assistants",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -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
@@ -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"}
@@ -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
@@ -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
@@ -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
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuFH,wCAsCC;AAKD,0CAyBC;AA+DD,oDASC;AA2CD,kDAaC;AA8HD,0CAmBC;AASD,wBAgBC;AAncD,6CAA+B;AAC/B,2CAA6B;AAC7B,8DAAiC;AACjC,kDAA0B;AAuB1B;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAAC,OAAe;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;IAC7D,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAEhD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACpG,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,oBAAoB,CAAC,OAAe;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC;IACjE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAElD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,OAAO,OAAO;SACX,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;SACpC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CAAC,OAAe;IAC1C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7E,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QACzE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAA,qBAAM,EAAC,OAAO,CAAC,CAAC;QAEjC,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;YACzC,aAAa,EAAE,OAAO;YACtB,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CACV,eAAK,CAAC,MAAM,CACV,uCAAuC,QAAQ,2CAA2C,CAC3F,CACF,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAmB,EAAE,CAAC;QAEjC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YAEpC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBACtE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAA,qBAAM,EAAC,OAAO,CAAC,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,MAAM,EAAE,IAAI,CAAC,MAAM;iBACpB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,IAAI,EAAE,CAAC;gBACd,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACxC,OAAO,CAAC,IAAI,CACV,eAAK,CAAC,MAAM,CACV,yCAAyC,IAAI,OAAO,QAAQ,qEAAqE,CAClI,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CACV,eAAK,CAAC,MAAM,CACV,8CAA8C,QAAQ,gCAAgC,CACvF,CACF,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,eAAe;IACnC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,uBAAuB;IACvB,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACrD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACxD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;AAC3C,CAAC;AA6BD;;GAEG;AACH,SAAS,oBAAoB,CAAC,KAAqB;IAKjD,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,MAAM;QACnB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM;QAC/C,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM;KACjD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,2BAA2B,CAAC,KAAqB;IACxD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAChC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IAC5E,CAAC;IAED,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,IAAkB;IACrD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE9C,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IAC/E,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAE3E,IAAI,cAAc,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,WAAW,CAAC;IAC7D,IAAI,YAAY,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,YAAY,CAAC;IAC5D,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,+BAA+B,CAAC,KAAqB;IAC5D,MAAM,YAAY,GAAG;QACnB,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,CAAC;QACb,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,CAAC;KACb,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC1C,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,KAAqB;IAI9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CACxE,CAAC;IAEF,OAAO;QACL,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;KAClC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,KAAqB;IACvD,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE1C,OAAO;QACL,UAAU,EAAE,MAAM,CAAC,KAAK;QACxB,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,aAAa,EAAE,MAAM,CAAC,QAAQ;QAC9B,kBAAkB,EAAE,2BAA2B,CAAC,KAAK,CAAC;QACtD,aAAa,EAAE,+BAA+B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAChF,cAAc,EAAE,QAAQ,CAAC,UAAU;QACnC,UAAU,EAAE,QAAQ,CAAC,MAAM;KAC5B,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAEvC;;GAEG;AACH,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,KAAK,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,UAAkB,EAAE,QAAgB,EAAE;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAE7B,MAAM,GAAG,GAAG,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5E,OAAO,IAAI,GAAG,KAAK,UAAU,GAAG,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,KAA0B;IAC/C,IAAI,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAE5C,MAAM,IAAI,KAAK,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,UAAU,IAAI,CAAC;IACpE,MAAM,IAAI,KAAK,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,WAAW,IAAI,CAAC;IACvE,MAAM,IAAI,KAAK,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,aAAa,IAAI,CAAC;IAC1E,MAAM,IAAI,KAAK,eAAK,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,iBAAiB,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,KAAK,CAAC,kBAAkB,eAAe,CAAC;IAE5I,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,KAAqB;IAC9C,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAErD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,mBAAmB,CAAC,cAAc,CAAC,GAAG,qBAAqB,CAAC;IACrE,CAAC;IAED,IAAI,MAAM,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;IAEjD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACpC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;QAC/E,MAAM,UAAU,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QAEhG,MAAM,IAAI,KAAK,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,eAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,OAAO,IAAI,CAAC;QAElF,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,SAAS,iBAAiB,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,cAAc,IAAI,SAAS,UAAU,CAAC;QAChG,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,SAAS,eAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,6BAA6B,CAAC,KAAqB;IAC1D,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,kBAAkB,GAAG,aAAa,CAAC,MAAM,CAC7C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CACvE,CAAC;IAEF,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,MAAM,GAAG,mBAAmB,CAAC,oCAAoC,CAAC,CAAC;IAEvE,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACpC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;QAC/E,MAAM,eAAe,GAAG,SAAS,GAAG,cAAc,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;QAElE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QAEhG,MAAM,IAAI,KAAK,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,eAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,OAAO,IAAI,CAAC;QAC/E,MAAM,IAAI,SAAS,iBAAiB,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,eAAe,mBAAmB,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;IACjI,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,KAAqB;IAChD,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAEtD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,mBAAmB,CAAC,gBAAgB,CAAC,GAAG,uBAAuB,CAAC;IACzE,CAAC;IAED,IAAI,MAAM,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;IAEnD,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QAEhG,MAAM,IAAI,KAAK,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,eAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,EAAE,CAAC,KAAK,OAAO,IAAI,CAAC;IACnF,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,KAA0B,EAAE,KAAqB;IAC/E,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,MAAM,IAAI,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IACxD,MAAM,IAAI,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAErC,MAAM,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAEnC,MAAM,iBAAiB,GAAG,6BAA6B,CAAC,KAAK,CAAC,CAAC;IAC/D,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,IAAI,iBAAiB,CAAC;IAC9B,CAAC;IAED,MAAM,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAErC,MAAM,IAAI,IAAI,GAAG,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAE5C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,iCAAiC;AACjC,+EAA+E;AAE/E;;GAEG;AACI,KAAK,UAAU,MAAM;IAC1B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAEhD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEvB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,iCAAiC,OAAO,EAAE;SACpD,CAAC;IACJ,CAAC;AACH,CAAC"}