strikethroo 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +79 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +187 -0
- package/dist/cli.js.map +1 -0
- package/dist/conflict-detector.d.ts +24 -0
- package/dist/conflict-detector.d.ts.map +1 -0
- package/dist/conflict-detector.js +130 -0
- package/dist/conflict-detector.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +344 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata.d.ts +40 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +121 -0
- package/dist/metadata.js.map +1 -0
- package/dist/plan-utils.d.ts +35 -0
- package/dist/plan-utils.d.ts.map +1 -0
- package/dist/plan-utils.js +123 -0
- package/dist/plan-utils.js.map +1 -0
- package/dist/plan.d.ts +27 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +279 -0
- package/dist/plan.js.map +1 -0
- package/dist/prompts.d.ts +21 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +132 -0
- package/dist/prompts.js.map +1 -0
- package/dist/status.d.ts +73 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +375 -0
- package/dist/status.js.map +1 -0
- package/dist/types.d.ts +274 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +53 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +158 -0
- package/dist/utils.js.map +1 -0
- package/package.json +94 -0
- package/templates/harness/agents/plan-creator.md +95 -0
- package/templates/harness/skills/st-create-plan/SKILL.md +120 -0
- package/templates/harness/skills/st-create-plan/scripts/find-strikethroo-root.cjs +116 -0
- package/templates/harness/skills/st-create-plan/scripts/get-next-plan-id.cjs +197 -0
- package/templates/harness/skills/st-execute-blueprint/SKILL.md +147 -0
- package/templates/harness/skills/st-execute-blueprint/scripts/create-feature-branch.cjs +359 -0
- package/templates/harness/skills/st-execute-blueprint/scripts/find-strikethroo-root.cjs +116 -0
- package/templates/harness/skills/st-execute-blueprint/scripts/validate-plan-blueprint.cjs +358 -0
- package/templates/harness/skills/st-execute-task/SKILL.md +195 -0
- package/templates/harness/skills/st-execute-task/scripts/check-task-dependencies.cjs +420 -0
- package/templates/harness/skills/st-execute-task/scripts/find-strikethroo-root.cjs +116 -0
- package/templates/harness/skills/st-execute-task/scripts/validate-plan-blueprint.cjs +358 -0
- package/templates/harness/skills/st-full-workflow/SKILL.md +413 -0
- package/templates/harness/skills/st-full-workflow/scripts/create-feature-branch.cjs +359 -0
- package/templates/harness/skills/st-full-workflow/scripts/find-strikethroo-root.cjs +116 -0
- package/templates/harness/skills/st-full-workflow/scripts/get-next-plan-id.cjs +197 -0
- package/templates/harness/skills/st-full-workflow/scripts/get-next-task-id.cjs +295 -0
- package/templates/harness/skills/st-full-workflow/scripts/validate-plan-blueprint.cjs +358 -0
- package/templates/harness/skills/st-generate-tasks/SKILL.md +244 -0
- package/templates/harness/skills/st-generate-tasks/scripts/find-strikethroo-root.cjs +116 -0
- package/templates/harness/skills/st-generate-tasks/scripts/get-next-task-id.cjs +295 -0
- package/templates/harness/skills/st-generate-tasks/scripts/validate-plan-blueprint.cjs +358 -0
- package/templates/harness/skills/st-refine-plan/SKILL.md +205 -0
- package/templates/harness/skills/st-refine-plan/scripts/find-strikethroo-root.cjs +116 -0
- package/templates/harness/skills/st-refine-plan/scripts/validate-plan-blueprint.cjs +358 -0
- package/templates/strikethroo/README.md +7 -0
- package/templates/strikethroo/config/STRIKETHROO.md +76 -0
- package/templates/strikethroo/config/hooks/POST_ERROR_DETECTION.md +46 -0
- package/templates/strikethroo/config/hooks/POST_EXECUTION.md +25 -0
- package/templates/strikethroo/config/hooks/POST_PHASE.md +24 -0
- package/templates/strikethroo/config/hooks/POST_PLAN.md +5 -0
- package/templates/strikethroo/config/hooks/POST_TASK_GENERATION_ALL.md +41 -0
- package/templates/strikethroo/config/hooks/PRE_PHASE.md +21 -0
- package/templates/strikethroo/config/hooks/PRE_PLAN.md +42 -0
- package/templates/strikethroo/config/hooks/PRE_TASK_ASSIGNMENT.md +32 -0
- package/templates/strikethroo/config/hooks/PRE_TASK_EXECUTION.md +1 -0
- package/templates/strikethroo/config/templates/BLUEPRINT_TEMPLATE.md +24 -0
- package/templates/strikethroo/config/templates/EXECUTION_SUMMARY_TEMPLATE.md +13 -0
- package/templates/strikethroo/config/templates/PLAN_TEMPLATE.md +109 -0
- package/templates/strikethroo/config/templates/TASK_TEMPLATE.md +36 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Main Init Command Implementation
|
|
4
|
+
*
|
|
5
|
+
* This file contains the implementation of the init command
|
|
6
|
+
* Handles initialization of new Strikethroo projects
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
42
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.init = init;
|
|
46
|
+
exports.isInitialized = isInitialized;
|
|
47
|
+
const fs = __importStar(require("fs-extra"));
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
50
|
+
const utils_1 = require("./utils");
|
|
51
|
+
const metadata_1 = require("./metadata");
|
|
52
|
+
const conflict_detector_1 = require("./conflict-detector");
|
|
53
|
+
const prompts_1 = require("./prompts");
|
|
54
|
+
// Visual formatting constants
|
|
55
|
+
const TERM_WIDTH = 80;
|
|
56
|
+
const DIVIDER = '─'.repeat(TERM_WIDTH);
|
|
57
|
+
/**
|
|
58
|
+
* Format a section header with cyan styling
|
|
59
|
+
*/
|
|
60
|
+
function formatSectionHeader(title) {
|
|
61
|
+
return `\n${chalk_1.default.cyan.bold(title)}\n${chalk_1.default.cyan(DIVIDER)}\n`;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get the absolute path to a template file
|
|
65
|
+
*/
|
|
66
|
+
function getTemplatePath(templateFile) {
|
|
67
|
+
return path.join(__dirname, '..', 'templates', templateFile);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Resolve path segments relative to a base directory with cross-platform compatibility
|
|
71
|
+
*/
|
|
72
|
+
function resolvePath(baseDir, ...segments) {
|
|
73
|
+
const base = baseDir || '.';
|
|
74
|
+
const validSegments = segments.filter(segment => segment !== null && segment !== undefined && segment !== '');
|
|
75
|
+
return path.resolve(base, ...validSegments);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Collect all file paths under a directory, sorted alphabetically
|
|
79
|
+
*/
|
|
80
|
+
async function collectFiles(dir) {
|
|
81
|
+
const files = [];
|
|
82
|
+
if (!(await exists(dir)))
|
|
83
|
+
return files;
|
|
84
|
+
async function walk(current) {
|
|
85
|
+
const entries = await fs.readdir(current, { withFileTypes: true });
|
|
86
|
+
for (const entry of entries) {
|
|
87
|
+
const fullPath = path.join(current, entry.name);
|
|
88
|
+
if (entry.isDirectory()) {
|
|
89
|
+
await walk(fullPath);
|
|
90
|
+
}
|
|
91
|
+
else if (entry.isFile() && entry.name !== '.init-metadata.json') {
|
|
92
|
+
files.push(fullPath);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
await walk(dir);
|
|
97
|
+
return files.sort();
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Check if a file or directory exists
|
|
101
|
+
*/
|
|
102
|
+
async function exists(filepath) {
|
|
103
|
+
try {
|
|
104
|
+
await fs.access(filepath);
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Initialize a new Strikethroo project
|
|
113
|
+
*
|
|
114
|
+
* Creates directory structures and copies template files based on the selected harnesses.
|
|
115
|
+
* Validates input, creates necessary directories, and copies appropriate templates.
|
|
116
|
+
*
|
|
117
|
+
* @param options - Initialization options containing harness selection
|
|
118
|
+
* @returns CommandResult indicating success or failure with details
|
|
119
|
+
*/
|
|
120
|
+
async function init(options) {
|
|
121
|
+
try {
|
|
122
|
+
// Determine base directory
|
|
123
|
+
const baseDir = options.destinationDirectory || '.';
|
|
124
|
+
const resolvedBaseDir = resolvePath(baseDir);
|
|
125
|
+
// Parse and validate harnesses
|
|
126
|
+
const harnesses = (0, utils_1.parseHarnesses)(options.harnesses);
|
|
127
|
+
(0, utils_1.validateHarnesses)(harnesses);
|
|
128
|
+
// ========== HEADER SECTION ==========
|
|
129
|
+
console.log(chalk_1.default.bold.white('\nStrikethroo Initialization'));
|
|
130
|
+
console.log(chalk_1.default.gray(DIVIDER));
|
|
131
|
+
// ========== CONFIGURATION SECTION ==========
|
|
132
|
+
console.log(formatSectionHeader('Configuration'));
|
|
133
|
+
console.log(` ${chalk_1.default.cyan('●')} Target Directory: ${resolvedBaseDir}`);
|
|
134
|
+
console.log(` ${chalk_1.default.cyan('●')} Harnesses: ${harnesses.join(', ')}`);
|
|
135
|
+
// ========== SETUP PROGRESS SECTION ==========
|
|
136
|
+
console.log(formatSectionHeader('Setup Progress'));
|
|
137
|
+
// Create .ai/strikethroo structure
|
|
138
|
+
console.log(` ${chalk_1.default.green('✓')} Creating .ai/strikethroo directory structure`);
|
|
139
|
+
await fs.ensureDir(resolvePath(baseDir, '.ai/strikethroo/plans'));
|
|
140
|
+
await fs.ensureDir(resolvePath(baseDir, '.ai/strikethroo/archive'));
|
|
141
|
+
await fs.ensureDir(resolvePath(baseDir, '.ai/strikethroo/config/hooks'));
|
|
142
|
+
// Copy common templates to .ai/strikethroo with conflict detection
|
|
143
|
+
console.log(` ${chalk_1.default.green('✓')} Copying common template files`);
|
|
144
|
+
await copyCommonTemplates(baseDir, options.force || false);
|
|
145
|
+
// Create harness-specific directories and copy templates
|
|
146
|
+
const allCreatedAgentFiles = new Map();
|
|
147
|
+
for (const harness of harnesses) {
|
|
148
|
+
console.log(` ${chalk_1.default.green('✓')} Setting up ${harness} harness configuration`);
|
|
149
|
+
const created = await createHarnessStructure(harness, baseDir);
|
|
150
|
+
if (created.length > 0) {
|
|
151
|
+
allCreatedAgentFiles.set(harness, created);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// ========== CREATED FILES SECTION ==========
|
|
155
|
+
console.log(formatSectionHeader('Created Files'));
|
|
156
|
+
// Common configuration files (dynamically listed)
|
|
157
|
+
console.log(chalk_1.default.cyan(' Common Configuration:'));
|
|
158
|
+
const commonFiles = await collectFiles(resolvePath(baseDir, '.ai/strikethroo'));
|
|
159
|
+
for (const file of commonFiles) {
|
|
160
|
+
console.log(` ${chalk_1.default.blue('●')} ${file}`);
|
|
161
|
+
}
|
|
162
|
+
for (const [harness, files] of allCreatedAgentFiles) {
|
|
163
|
+
console.log(chalk_1.default.cyan(` ${harness} Agents:`));
|
|
164
|
+
for (const file of files) {
|
|
165
|
+
console.log(` ${chalk_1.default.blue('●')} ${file}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// ========== FOOTER SECTION ==========
|
|
169
|
+
console.log(`\n${chalk_1.default.green('✓')} Strikethroo initialized successfully!`);
|
|
170
|
+
console.log(chalk_1.default.gray(DIVIDER));
|
|
171
|
+
// Post-init nudge directing users to install the task skills
|
|
172
|
+
console.log('\nNext: run `npx skills add e0ipso/strikethroo` to install the task skills for your harness(es).');
|
|
173
|
+
// Add documentation link
|
|
174
|
+
console.log(`\n 📚 Documentation: ${chalk_1.default.cyan('https://mateuaguilo.com/strikethroo')}\n`);
|
|
175
|
+
// Show suggested workflow help text
|
|
176
|
+
await displayWorkflowHelp();
|
|
177
|
+
return {
|
|
178
|
+
success: true,
|
|
179
|
+
message: 'Strikethroo initialized successfully!',
|
|
180
|
+
data: { harnesses },
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
const errorMessage = error instanceof Error ? error.message : 'Initialization failed with unknown error';
|
|
185
|
+
console.error(chalk_1.default.red(`\n✗ Initialization failed: ${errorMessage}\n`));
|
|
186
|
+
return {
|
|
187
|
+
success: false,
|
|
188
|
+
message: errorMessage,
|
|
189
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Copy common template files to .ai/strikethroo directory with conflict detection
|
|
195
|
+
*/
|
|
196
|
+
async function copyCommonTemplates(baseDir, force) {
|
|
197
|
+
const sourceDir = getTemplatePath('strikethroo');
|
|
198
|
+
const destDir = resolvePath(baseDir, '.ai/strikethroo');
|
|
199
|
+
const metadataPath = resolvePath(destDir, '.init-metadata.json');
|
|
200
|
+
// Check if source template directory exists
|
|
201
|
+
if (!(await exists(sourceDir))) {
|
|
202
|
+
throw new Error(`Template directory not found: ${sourceDir}`);
|
|
203
|
+
}
|
|
204
|
+
// Load existing metadata if present
|
|
205
|
+
const existingMetadata = await (0, metadata_1.loadMetadata)(metadataPath);
|
|
206
|
+
// Scenario 1: First-time init (no metadata) - copy all files
|
|
207
|
+
if (!existingMetadata) {
|
|
208
|
+
await fs.copy(sourceDir, destDir);
|
|
209
|
+
// Create initial metadata
|
|
210
|
+
await createMetadata(sourceDir, destDir, metadataPath);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
// Scenario 2: Force flag - overwrite all files
|
|
214
|
+
if (force) {
|
|
215
|
+
await fs.copy(sourceDir, destDir, { overwrite: true });
|
|
216
|
+
// Update metadata
|
|
217
|
+
await createMetadata(sourceDir, destDir, metadataPath);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
// Scenario 3: Conflict detection - check for user modifications
|
|
221
|
+
const conflicts = await (0, conflict_detector_1.detectConflicts)(destDir, sourceDir, existingMetadata);
|
|
222
|
+
if (conflicts.length === 0) {
|
|
223
|
+
await fs.copy(sourceDir, destDir, { overwrite: true });
|
|
224
|
+
// Update metadata
|
|
225
|
+
await createMetadata(sourceDir, destDir, metadataPath);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
// Conflicts detected - prompt user for resolution
|
|
229
|
+
console.log(chalk_1.default.yellow(`\n⚠ Detected ${conflicts.length} modified file(s). Prompting for resolution...\n`));
|
|
230
|
+
const resolutions = await (0, prompts_1.promptForConflicts)(conflicts);
|
|
231
|
+
// Apply resolutions
|
|
232
|
+
await applyResolutions(sourceDir, destDir, resolutions);
|
|
233
|
+
// Update metadata for all files (including resolved conflicts)
|
|
234
|
+
await createMetadata(sourceDir, destDir, metadataPath);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Create or update metadata file with current file hashes
|
|
238
|
+
*/
|
|
239
|
+
async function createMetadata(sourceDir, destDir, metadataPath) {
|
|
240
|
+
const files = {};
|
|
241
|
+
async function walkDir(dir, relativeTo) {
|
|
242
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
243
|
+
for (const entry of entries) {
|
|
244
|
+
const fullPath = path.join(dir, entry.name);
|
|
245
|
+
const relativePath = path.relative(relativeTo, fullPath);
|
|
246
|
+
// Skip README.md (always overwrite on init/re-init)
|
|
247
|
+
if (relativePath === 'README.md') {
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
// Skip metadata file itself
|
|
251
|
+
if (relativePath === '.init-metadata.json') {
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
if (entry.isDirectory()) {
|
|
255
|
+
await walkDir(fullPath, relativeTo);
|
|
256
|
+
}
|
|
257
|
+
else if (entry.isFile()) {
|
|
258
|
+
// Calculate hash of the destination file (what we just copied)
|
|
259
|
+
const destFilePath = path.join(destDir, relativePath);
|
|
260
|
+
if (await exists(destFilePath)) {
|
|
261
|
+
const hash = await (0, metadata_1.calculateFileHash)(destFilePath);
|
|
262
|
+
files[relativePath] = hash;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
const configDir = path.join(destDir, 'config');
|
|
268
|
+
if (await exists(configDir)) {
|
|
269
|
+
await walkDir(configDir, destDir);
|
|
270
|
+
}
|
|
271
|
+
// Create metadata object
|
|
272
|
+
const metadata = {
|
|
273
|
+
version: (0, metadata_1.getPackageVersion)(),
|
|
274
|
+
workspaceSchemaVersion: metadata_1.CURRENT_WORKSPACE_SCHEMA_VERSION,
|
|
275
|
+
timestamp: new Date().toISOString(),
|
|
276
|
+
files,
|
|
277
|
+
};
|
|
278
|
+
// Save metadata
|
|
279
|
+
await (0, metadata_1.saveMetadata)(metadataPath, metadata);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Apply user resolutions to file conflicts
|
|
283
|
+
*/
|
|
284
|
+
async function applyResolutions(sourceDir, destDir, resolutions) {
|
|
285
|
+
for (const [relativePath, resolution] of resolutions) {
|
|
286
|
+
const sourcePath = path.join(sourceDir, relativePath);
|
|
287
|
+
const destPath = path.join(destDir, relativePath);
|
|
288
|
+
if (resolution === 'overwrite') {
|
|
289
|
+
await fs.copy(sourcePath, destPath, { overwrite: true });
|
|
290
|
+
}
|
|
291
|
+
// If 'keep', do nothing - keep user's file
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
async function createHarnessStructure(harness, baseDir) {
|
|
295
|
+
const sourceAgentsDir = getTemplatePath(path.join('harness', 'agents'));
|
|
296
|
+
const createdFiles = [];
|
|
297
|
+
if (!(await exists(sourceAgentsDir))) {
|
|
298
|
+
return createdFiles;
|
|
299
|
+
}
|
|
300
|
+
const agentFiles = (await fs.readdir(sourceAgentsDir)).filter(f => f.endsWith('.md'));
|
|
301
|
+
const formatInfo = (0, utils_1.getAgentFormat)(harness);
|
|
302
|
+
const targetDir = resolvePath(baseDir, formatInfo.directory);
|
|
303
|
+
await fs.ensureDir(targetDir);
|
|
304
|
+
for (const agentFile of agentFiles) {
|
|
305
|
+
const sourcePath = path.join(sourceAgentsDir, agentFile);
|
|
306
|
+
const content = await fs.readFile(sourcePath, 'utf-8');
|
|
307
|
+
const baseName = path.basename(agentFile, '.md');
|
|
308
|
+
const targetName = baseName + formatInfo.extension;
|
|
309
|
+
const targetPath = path.join(targetDir, targetName);
|
|
310
|
+
if (formatInfo.format === 'toml') {
|
|
311
|
+
await fs.writeFile(targetPath, (0, utils_1.convertAgentMdToToml)(content), 'utf-8');
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
await fs.writeFile(targetPath, content, 'utf-8');
|
|
315
|
+
}
|
|
316
|
+
createdFiles.push(targetPath);
|
|
317
|
+
}
|
|
318
|
+
return createdFiles;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Check if a directory already has Strikethroo initialized
|
|
322
|
+
*/
|
|
323
|
+
async function isInitialized(baseDir) {
|
|
324
|
+
const targetDir = baseDir || '.';
|
|
325
|
+
return await exists(resolvePath(targetDir, '.ai/strikethroo'));
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Display formatted workflow help text to guide users after successful installation
|
|
329
|
+
*/
|
|
330
|
+
async function displayWorkflowHelp() {
|
|
331
|
+
console.log(formatSectionHeader('Suggested Workflow'));
|
|
332
|
+
console.log(` ${chalk_1.default.cyan('●')} Install the task skills:`);
|
|
333
|
+
console.log(` ${chalk_1.default.gray('npx skills add e0ipso/strikethroo')}`);
|
|
334
|
+
console.log('');
|
|
335
|
+
console.log(` ${chalk_1.default.cyan('●')} Ask your AI to plan, decompose, then execute.`);
|
|
336
|
+
console.log(` The skills cover plan creation, refinement, task generation, and blueprint execution.`);
|
|
337
|
+
console.log('');
|
|
338
|
+
console.log(` ${chalk_1.default.cyan('●')} Review intermediate artifacts between steps:`);
|
|
339
|
+
console.log(` ${chalk_1.default.gray('.ai/strikethroo/plans/')}`);
|
|
340
|
+
console.log('');
|
|
341
|
+
console.log(chalk_1.default.yellow(`💡 Reviewing the plan and the task list before execution is recommended.`));
|
|
342
|
+
console.log('');
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metadata Management for Init Command
|
|
3
|
+
*
|
|
4
|
+
* This file handles hash calculation, metadata file operations,
|
|
5
|
+
* and package version tracking for conflict detection
|
|
6
|
+
*/
|
|
7
|
+
import { InitMetadata } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Current workspace schema version baked into this CLI build.
|
|
10
|
+
*
|
|
11
|
+
* Bumped only when the `.ai/strikethroo/` workspace shape changes
|
|
12
|
+
* incompatibly (renamed hook, new required template, restructured directory).
|
|
13
|
+
* Skill bundles read this constant at build time to enforce a runtime
|
|
14
|
+
* schema-mismatch check against the workspace they're invoked against.
|
|
15
|
+
*/
|
|
16
|
+
export declare const CURRENT_WORKSPACE_SCHEMA_VERSION = 1;
|
|
17
|
+
/**
|
|
18
|
+
* Calculate SHA-256 hash of a file
|
|
19
|
+
* @param filePath - Absolute path to the file
|
|
20
|
+
* @returns SHA-256 hash as hex string
|
|
21
|
+
*/
|
|
22
|
+
export declare function calculateFileHash(filePath: string): Promise<string>;
|
|
23
|
+
/**
|
|
24
|
+
* Load metadata from .init-metadata.json file
|
|
25
|
+
* @param metadataPath - Absolute path to metadata file
|
|
26
|
+
* @returns InitMetadata object or null if file doesn't exist or is invalid
|
|
27
|
+
*/
|
|
28
|
+
export declare function loadMetadata(metadataPath: string): Promise<InitMetadata | null>;
|
|
29
|
+
/**
|
|
30
|
+
* Save metadata to .init-metadata.json file
|
|
31
|
+
* @param metadataPath - Absolute path to metadata file
|
|
32
|
+
* @param metadata - InitMetadata object to save
|
|
33
|
+
*/
|
|
34
|
+
export declare function saveMetadata(metadataPath: string, metadata: InitMetadata): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Get the current package version from package.json
|
|
37
|
+
* @returns Version string (e.g., "1.12.0")
|
|
38
|
+
*/
|
|
39
|
+
export declare function getPackageVersion(): string;
|
|
40
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;;;;GAOG;AACH,eAAO,MAAM,gCAAgC,IAAI,CAAC;AAElD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASzE;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA0BrF;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9F;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAK1C"}
|
package/dist/metadata.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Metadata Management for Init Command
|
|
4
|
+
*
|
|
5
|
+
* This file handles hash calculation, metadata file operations,
|
|
6
|
+
* and package version tracking for conflict detection
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.CURRENT_WORKSPACE_SCHEMA_VERSION = void 0;
|
|
43
|
+
exports.calculateFileHash = calculateFileHash;
|
|
44
|
+
exports.loadMetadata = loadMetadata;
|
|
45
|
+
exports.saveMetadata = saveMetadata;
|
|
46
|
+
exports.getPackageVersion = getPackageVersion;
|
|
47
|
+
const crypto = __importStar(require("crypto"));
|
|
48
|
+
const fs = __importStar(require("fs-extra"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
/**
|
|
51
|
+
* Current workspace schema version baked into this CLI build.
|
|
52
|
+
*
|
|
53
|
+
* Bumped only when the `.ai/strikethroo/` workspace shape changes
|
|
54
|
+
* incompatibly (renamed hook, new required template, restructured directory).
|
|
55
|
+
* Skill bundles read this constant at build time to enforce a runtime
|
|
56
|
+
* schema-mismatch check against the workspace they're invoked against.
|
|
57
|
+
*/
|
|
58
|
+
exports.CURRENT_WORKSPACE_SCHEMA_VERSION = 1;
|
|
59
|
+
/**
|
|
60
|
+
* Calculate SHA-256 hash of a file
|
|
61
|
+
* @param filePath - Absolute path to the file
|
|
62
|
+
* @returns SHA-256 hash as hex string
|
|
63
|
+
*/
|
|
64
|
+
async function calculateFileHash(filePath) {
|
|
65
|
+
const hash = crypto.createHash('sha256');
|
|
66
|
+
const stream = fs.createReadStream(filePath);
|
|
67
|
+
return new Promise((resolve, reject) => {
|
|
68
|
+
stream.on('data', data => hash.update(data));
|
|
69
|
+
stream.on('end', () => resolve(hash.digest('hex')));
|
|
70
|
+
stream.on('error', err => reject(err));
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Load metadata from .init-metadata.json file
|
|
75
|
+
* @param metadataPath - Absolute path to metadata file
|
|
76
|
+
* @returns InitMetadata object or null if file doesn't exist or is invalid
|
|
77
|
+
*/
|
|
78
|
+
async function loadMetadata(metadataPath) {
|
|
79
|
+
try {
|
|
80
|
+
const exists = await fs.pathExists(metadataPath);
|
|
81
|
+
if (!exists) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
const content = await fs.readFile(metadataPath, 'utf-8');
|
|
85
|
+
const metadata = JSON.parse(content);
|
|
86
|
+
// Validate metadata structure
|
|
87
|
+
if (!metadata.version || !metadata.timestamp || !metadata.files) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
// Backfill workspaceSchemaVersion for older workspaces missing the field
|
|
91
|
+
if (typeof metadata.workspaceSchemaVersion !== 'number') {
|
|
92
|
+
metadata.workspaceSchemaVersion = 1;
|
|
93
|
+
}
|
|
94
|
+
return metadata;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// If metadata is corrupted or invalid, return null
|
|
98
|
+
// This treats the situation as first-time init
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Save metadata to .init-metadata.json file
|
|
104
|
+
* @param metadataPath - Absolute path to metadata file
|
|
105
|
+
* @param metadata - InitMetadata object to save
|
|
106
|
+
*/
|
|
107
|
+
async function saveMetadata(metadataPath, metadata) {
|
|
108
|
+
await fs.ensureDir(path.dirname(metadataPath));
|
|
109
|
+
await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2), 'utf-8');
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get the current package version from package.json
|
|
113
|
+
* @returns Version string (e.g., "1.12.0")
|
|
114
|
+
*/
|
|
115
|
+
function getPackageVersion() {
|
|
116
|
+
// Read package.json from the package root (one level up from dist/)
|
|
117
|
+
const packageJsonPath = path.join(__dirname, '..', 'package.json');
|
|
118
|
+
const packageJson = require(packageJsonPath);
|
|
119
|
+
return packageJson.version;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBH,8CASC;AAOD,oCA0BC;AAOD,oCAGC;AAMD,8CAKC;AAnFD,+CAAiC;AACjC,6CAA+B;AAC/B,2CAA6B;AAG7B;;;;;;;GAOG;AACU,QAAA,gCAAgC,GAAG,CAAC,CAAC;AAElD;;;;GAIG;AACI,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IACtD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,YAAY,CAAC,YAAoB;IACrD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;QAErD,8BAA8B;QAC9B,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,yEAAyE;QACzE,IAAI,OAAO,QAAQ,CAAC,sBAAsB,KAAK,QAAQ,EAAE,CAAC;YACxD,QAAQ,CAAC,sBAAsB,GAAG,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,mDAAmD;QACnD,+CAA+C;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,YAAY,CAAC,YAAoB,EAAE,QAAsB;IAC7E,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAC/C,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC/E,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB;IAC/B,oEAAoE;IACpE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7C,OAAO,WAAW,CAAC,OAAO,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|