@specsafe/cli 0.5.0 ā 0.7.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/dist/commands/capsule.d.ts +8 -0
- package/dist/commands/capsule.d.ts.map +1 -0
- package/dist/commands/capsule.js +466 -0
- package/dist/commands/capsule.js.map +1 -0
- package/dist/commands/constitution.d.ts +3 -0
- package/dist/commands/constitution.d.ts.map +1 -0
- package/dist/commands/constitution.js +192 -0
- package/dist/commands/constitution.js.map +1 -0
- package/dist/commands/export.d.ts +7 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +179 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/extend.d.ts +6 -0
- package/dist/commands/extend.d.ts.map +1 -0
- package/dist/commands/extend.js +167 -0
- package/dist/commands/extend.js.map +1 -0
- package/dist/commands/memory.d.ts +3 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +166 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +66 -1
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/shard.d.ts +6 -0
- package/dist/commands/shard.d.ts.map +1 -0
- package/dist/commands/shard.js +199 -0
- package/dist/commands/shard.js.map +1 -0
- package/dist/commands/test-guide.d.ts +3 -0
- package/dist/commands/test-guide.d.ts.map +1 -0
- package/dist/commands/test-guide.js +190 -0
- package/dist/commands/test-guide.js.map +1 -0
- package/dist/commands/test-report.d.ts +3 -0
- package/dist/commands/test-report.d.ts.map +1 -0
- package/dist/commands/test-report.js +196 -0
- package/dist/commands/test-report.js.map +1 -0
- package/dist/commands/test-submit.d.ts +6 -0
- package/dist/commands/test-submit.d.ts.map +1 -0
- package/dist/commands/test-submit.js +236 -0
- package/dist/commands/test-submit.js.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { writeFile, mkdir, readFile } from 'fs/promises';
|
|
5
|
+
import { existsSync } from 'fs';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { ConstitutionManager, generateConstitution, generateMinimalConstitution, generateStrictConstitution, BUILTIN_PRINCIPLES } from '@specsafe/core';
|
|
8
|
+
async function loadSpec(specId, cwd = process.cwd()) {
|
|
9
|
+
const specsDir = join(cwd, 'specs');
|
|
10
|
+
const specPath = join(specsDir, `${specId}.json`);
|
|
11
|
+
if (!existsSync(specPath))
|
|
12
|
+
throw new Error(`Spec file not found: ${specPath}`);
|
|
13
|
+
const content = await readFile(specPath, 'utf-8');
|
|
14
|
+
const spec = JSON.parse(content);
|
|
15
|
+
spec.createdAt = new Date(spec.createdAt);
|
|
16
|
+
spec.updatedAt = new Date(spec.updatedAt);
|
|
17
|
+
if (spec.completedAt)
|
|
18
|
+
spec.completedAt = new Date(spec.completedAt);
|
|
19
|
+
return spec;
|
|
20
|
+
}
|
|
21
|
+
export const constitutionCommand = new Command('constitution')
|
|
22
|
+
.description('Manage constitutional governance')
|
|
23
|
+
.addCommand(new Command('init')
|
|
24
|
+
.description('Initialize constitution')
|
|
25
|
+
.option('--minimal', 'Minimal constitution')
|
|
26
|
+
.option('--strict', 'Strict constitution')
|
|
27
|
+
.option('--force', 'Overwrite existing')
|
|
28
|
+
.action(async (options) => {
|
|
29
|
+
const spinner = ora('Initializing...').start();
|
|
30
|
+
try {
|
|
31
|
+
const cwd = process.cwd();
|
|
32
|
+
const specsafeDir = join(cwd, '.specsafe');
|
|
33
|
+
const constitutionPath = join(specsafeDir, 'constitution.md');
|
|
34
|
+
if (existsSync(constitutionPath) && !options.force) {
|
|
35
|
+
spinner.fail(chalk.red('Constitution exists. Use --force'));
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
await mkdir(specsafeDir, { recursive: true });
|
|
39
|
+
let projectName = 'My Project';
|
|
40
|
+
try {
|
|
41
|
+
const pkgPath = join(cwd, 'package.json');
|
|
42
|
+
if (existsSync(pkgPath)) {
|
|
43
|
+
const pkg = JSON.parse(await readFile(pkgPath, 'utf-8'));
|
|
44
|
+
projectName = pkg.name || projectName;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch { }
|
|
48
|
+
let content;
|
|
49
|
+
if (options.minimal)
|
|
50
|
+
content = generateMinimalConstitution(projectName);
|
|
51
|
+
else if (options.strict)
|
|
52
|
+
content = generateStrictConstitution(projectName);
|
|
53
|
+
else
|
|
54
|
+
content = generateConstitution({ projectName });
|
|
55
|
+
await writeFile(constitutionPath, content);
|
|
56
|
+
spinner.succeed(chalk.green('Constitution initialized'));
|
|
57
|
+
console.log(chalk.gray(`\n${constitutionPath}`));
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
spinner.fail(chalk.red(error.message));
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
}))
|
|
64
|
+
.addCommand(new Command('list')
|
|
65
|
+
.description('List principles')
|
|
66
|
+
.option('--builtin-only', 'Show built-ins only')
|
|
67
|
+
.action(async (options) => {
|
|
68
|
+
const spinner = ora('Loading...').start();
|
|
69
|
+
try {
|
|
70
|
+
if (options.builtinOnly) {
|
|
71
|
+
spinner.stop();
|
|
72
|
+
console.log(chalk.bold('\nš Built-in Principles:\n'));
|
|
73
|
+
for (const p of BUILTIN_PRINCIPLES) {
|
|
74
|
+
const lock = p.immutable ? 'š' : 'š';
|
|
75
|
+
const sev = p.severity === 'error' ? 'š«' : 'ā ļø';
|
|
76
|
+
console.log(`${lock} ${sev} ${chalk.cyan(p.id.padEnd(30))} ${p.name}`);
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const mgr = new ConstitutionManager();
|
|
81
|
+
await mgr.load({ includeBuiltins: true });
|
|
82
|
+
const principles = mgr.listPrinciples();
|
|
83
|
+
spinner.stop();
|
|
84
|
+
console.log(chalk.bold('\nš Principles:\n'));
|
|
85
|
+
const errors = principles.filter(p => p.severity === 'error');
|
|
86
|
+
const warnings = principles.filter(p => p.severity === 'warning');
|
|
87
|
+
if (errors.length > 0) {
|
|
88
|
+
console.log(chalk.bold('š« Errors:'));
|
|
89
|
+
for (const p of errors) {
|
|
90
|
+
const lock = p.immutable ? 'š' : 'š';
|
|
91
|
+
console.log(` ${lock} ${chalk.red(p.id.padEnd(30))} ${p.name}`);
|
|
92
|
+
}
|
|
93
|
+
console.log();
|
|
94
|
+
}
|
|
95
|
+
if (warnings.length > 0) {
|
|
96
|
+
console.log(chalk.bold('ā ļø Warnings:'));
|
|
97
|
+
for (const p of warnings) {
|
|
98
|
+
const lock = p.immutable ? 'š' : 'š';
|
|
99
|
+
console.log(` ${lock} ${chalk.yellow(p.id.padEnd(30))} ${p.name}`);
|
|
100
|
+
}
|
|
101
|
+
console.log();
|
|
102
|
+
}
|
|
103
|
+
console.log(chalk.gray(`Total: ${principles.length}`));
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
spinner.fail(chalk.red(error.message));
|
|
107
|
+
process.exit(1);
|
|
108
|
+
}
|
|
109
|
+
}))
|
|
110
|
+
.addCommand(new Command('check')
|
|
111
|
+
.description('Check spec governance')
|
|
112
|
+
.argument('<spec-id>', 'Spec ID')
|
|
113
|
+
.action(async (specId) => {
|
|
114
|
+
const spinner = ora('Checking...').start();
|
|
115
|
+
try {
|
|
116
|
+
const spec = await loadSpec(specId);
|
|
117
|
+
const mgr = new ConstitutionManager();
|
|
118
|
+
await mgr.load({ includeBuiltins: true });
|
|
119
|
+
const results = await mgr.validate(spec);
|
|
120
|
+
spinner.stop();
|
|
121
|
+
console.log(chalk.bold(`\nš ${spec.name}\n`));
|
|
122
|
+
let totalErrors = 0;
|
|
123
|
+
let totalWarnings = 0;
|
|
124
|
+
for (const result of results) {
|
|
125
|
+
const icon = result.passed ? 'ā
' : 'ā';
|
|
126
|
+
const color = result.passed ? chalk.green : chalk.red;
|
|
127
|
+
console.log(`${icon} ${color(result.gate.name)}`);
|
|
128
|
+
if (result.violations.length > 0) {
|
|
129
|
+
for (const v of result.violations) {
|
|
130
|
+
const vIcon = v.severity === 'error' ? 'š«' : 'ā ļø';
|
|
131
|
+
const vColor = v.severity === 'error' ? chalk.red : chalk.yellow;
|
|
132
|
+
console.log(` ${vIcon} ${vColor(v.principle.name)}`);
|
|
133
|
+
console.log(` ${chalk.gray(v.message)}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
totalErrors += result.violations.filter(v => v.severity === 'error').length;
|
|
137
|
+
totalWarnings += result.violations.filter(v => v.severity === 'warning').length;
|
|
138
|
+
}
|
|
139
|
+
console.log(chalk.bold('\nSummary:'));
|
|
140
|
+
console.log(chalk.gray(`Gates: ${results.length}`));
|
|
141
|
+
if (totalErrors > 0)
|
|
142
|
+
console.log(chalk.red(`Errors: ${totalErrors}`));
|
|
143
|
+
if (totalWarnings > 0)
|
|
144
|
+
console.log(chalk.yellow(`Warnings: ${totalWarnings}`));
|
|
145
|
+
if (totalErrors === 0) {
|
|
146
|
+
console.log(chalk.green('\n⨠Passed!'));
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
console.log(chalk.red('\nā Failed'));
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
spinner.fail(chalk.red(error.message));
|
|
155
|
+
process.exit(1);
|
|
156
|
+
}
|
|
157
|
+
}))
|
|
158
|
+
.addCommand(new Command('add')
|
|
159
|
+
.description('Add custom principle')
|
|
160
|
+
.argument('<id>', 'Principle ID')
|
|
161
|
+
.requiredOption('--name <name>', 'Name')
|
|
162
|
+
.requiredOption('--description <desc>', 'Description')
|
|
163
|
+
.option('--severity <level>', 'error or warning', 'warning')
|
|
164
|
+
.option('--immutable', 'Immutable', false)
|
|
165
|
+
.action(async (id, options) => {
|
|
166
|
+
const spinner = ora('Adding...').start();
|
|
167
|
+
try {
|
|
168
|
+
if (options.severity !== 'error' && options.severity !== 'warning') {
|
|
169
|
+
throw new Error('Severity must be error or warning');
|
|
170
|
+
}
|
|
171
|
+
const mgr = new ConstitutionManager();
|
|
172
|
+
await mgr.load({ includeBuiltins: false });
|
|
173
|
+
const principle = {
|
|
174
|
+
id,
|
|
175
|
+
name: options.name,
|
|
176
|
+
description: options.description,
|
|
177
|
+
severity: options.severity,
|
|
178
|
+
immutable: options.immutable,
|
|
179
|
+
metadata: { createdAt: new Date() },
|
|
180
|
+
};
|
|
181
|
+
mgr.addPrinciple(principle);
|
|
182
|
+
spinner.text = 'Saving...';
|
|
183
|
+
await mgr.save();
|
|
184
|
+
spinner.succeed(chalk.green('Added and saved'));
|
|
185
|
+
console.log(chalk.gray(`\n${principle.id}: ${principle.name}`));
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
spinner.fail(chalk.red(error.message));
|
|
189
|
+
process.exit(1);
|
|
190
|
+
}
|
|
191
|
+
}));
|
|
192
|
+
//# sourceMappingURL=constitution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constitution.js","sourceRoot":"","sources":["../../src/commands/constitution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,eAAO,MAAM,aAAa,SAyFtB,CAAC"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export Command
|
|
3
|
+
* Export specs in multiple formats: markdown, json, html, stakeholder bundles
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import ora from 'ora';
|
|
8
|
+
import { writeFile, mkdir, access } from 'fs/promises';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
import { parseSpecFromFile, exportSpec, generateStakeholderBundle, validateFilePath, validateOutputPath, sanitizeFilename, validateExportFormat, } from '@specsafe/core';
|
|
11
|
+
export const exportCommand = new Command('export')
|
|
12
|
+
.description('Export spec in multiple formats')
|
|
13
|
+
.argument('<spec>', 'Spec ID or path to spec file (e.g., SPEC-20260212-001 or specs/active/SPEC-20260212-001.md)')
|
|
14
|
+
.option('-f, --format <format>', 'Export format: markdown, json, html, stakeholder', 'markdown')
|
|
15
|
+
.option('-o, --output <path>', 'Output file or directory')
|
|
16
|
+
.option('--stakeholder', 'Generate all 4 stakeholder bundles')
|
|
17
|
+
.option('--bundle', 'Export all formats as zip (not implemented yet)')
|
|
18
|
+
.option('--no-metadata', 'Exclude metadata from export')
|
|
19
|
+
.option('--include-history', 'Include history in export (JSON only)')
|
|
20
|
+
.action(async (specPathOrId, options) => {
|
|
21
|
+
const spinner = ora('Loading spec...').start();
|
|
22
|
+
try {
|
|
23
|
+
// Validate export format
|
|
24
|
+
try {
|
|
25
|
+
validateExportFormat(options.format);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
spinner.fail(chalk.red(error.message));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
// Determine spec file path
|
|
32
|
+
let specFilePath = specPathOrId;
|
|
33
|
+
// If it looks like a spec ID, find the file
|
|
34
|
+
if (!specFilePath.includes('/') && !specFilePath.includes('.md')) {
|
|
35
|
+
const specId = specPathOrId.toUpperCase();
|
|
36
|
+
// Try active folder first
|
|
37
|
+
try {
|
|
38
|
+
const activePath = `specs/active/${specId}.md`;
|
|
39
|
+
await access(activePath);
|
|
40
|
+
specFilePath = activePath;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Try completed folder
|
|
44
|
+
try {
|
|
45
|
+
const completedPath = `specs/completed/${specId}.md`;
|
|
46
|
+
await access(completedPath);
|
|
47
|
+
specFilePath = completedPath;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Try as is (full path)
|
|
51
|
+
specFilePath = `${specPathOrId}.md`;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
spinner.text = 'Parsing spec...';
|
|
56
|
+
// Parse spec from file (with path validation)
|
|
57
|
+
const spec = await parseSpecFromFile(specFilePath);
|
|
58
|
+
spinner.text = 'Generating export...';
|
|
59
|
+
// Handle different export modes
|
|
60
|
+
if (options.stakeholder) {
|
|
61
|
+
await exportStakeholderBundles(spec, options.output);
|
|
62
|
+
}
|
|
63
|
+
else if (options.bundle) {
|
|
64
|
+
spinner.stop();
|
|
65
|
+
console.log(chalk.yellow('ā ļø Bundle export (zip) is not yet implemented.'));
|
|
66
|
+
console.log(chalk.gray('Use --stakeholder to generate individual bundle files.'));
|
|
67
|
+
console.log(chalk.gray('Or specify --format for single format export.'));
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
await exportSingleFormat(spec, options.format, options.output, options.metadata !== false, options.includeHistory);
|
|
72
|
+
}
|
|
73
|
+
spinner.succeed(chalk.green('Export completed successfully!'));
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
spinner.fail(chalk.red(error.message));
|
|
77
|
+
if (error.code === 'ENOENT') {
|
|
78
|
+
console.log(chalk.gray('\nš” Tip: Make sure the spec file exists.'));
|
|
79
|
+
console.log(chalk.gray(' Example: specsafe export SPEC-20260212-001'));
|
|
80
|
+
console.log(chalk.gray(' Or: specsafe export specs/active/SPEC-20260212-001.md'));
|
|
81
|
+
}
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
/**
|
|
86
|
+
* Export spec in a single format
|
|
87
|
+
*/
|
|
88
|
+
async function exportSingleFormat(spec, format, outputPath, includeMetadata = true, includeHistory = false) {
|
|
89
|
+
const result = exportSpec(spec, format, {
|
|
90
|
+
includeMetadata,
|
|
91
|
+
includeHistory,
|
|
92
|
+
});
|
|
93
|
+
// Determine output path with validation
|
|
94
|
+
let finalPath;
|
|
95
|
+
if (!outputPath) {
|
|
96
|
+
// Default to current directory with generated filename
|
|
97
|
+
finalPath = result.filename;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// Validate and sanitize the output path
|
|
101
|
+
try {
|
|
102
|
+
finalPath = validateFilePath(outputPath);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
throw new Error(`Invalid output path: ${error.message}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Write the file with error handling
|
|
109
|
+
try {
|
|
110
|
+
await writeFile(finalPath, result.content);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
throw new Error(`Failed to write export file: ${error.message}`);
|
|
114
|
+
}
|
|
115
|
+
// Display result info
|
|
116
|
+
console.log(chalk.blue('\nš Export Details:'));
|
|
117
|
+
console.log(` Format: ${chalk.cyan(format.toUpperCase())}`);
|
|
118
|
+
console.log(` File: ${chalk.cyan(finalPath)}`);
|
|
119
|
+
console.log(` Size: ${chalk.cyan(formatBytes(result.size))}`);
|
|
120
|
+
console.log();
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Export all stakeholder bundles
|
|
124
|
+
*/
|
|
125
|
+
async function exportStakeholderBundles(spec, outputDir) {
|
|
126
|
+
const bundle = generateStakeholderBundle(spec);
|
|
127
|
+
// Determine output directory with validation
|
|
128
|
+
let dir;
|
|
129
|
+
if (outputDir) {
|
|
130
|
+
try {
|
|
131
|
+
dir = validateOutputPath(outputDir);
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
throw new Error(`Invalid output directory: ${error.message}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
dir = join(process.cwd(), 'bundles');
|
|
139
|
+
}
|
|
140
|
+
// Create directory if needed with error handling
|
|
141
|
+
try {
|
|
142
|
+
await mkdir(dir, { recursive: true });
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
throw new Error(`Failed to create output directory: ${error.message}`);
|
|
146
|
+
}
|
|
147
|
+
// Write each bundle file with error handling
|
|
148
|
+
const files = [
|
|
149
|
+
{ name: 'Executive Summary', result: bundle.executive },
|
|
150
|
+
{ name: 'Technical Specification', result: bundle.technical },
|
|
151
|
+
{ name: 'QA Specification', result: bundle.qa },
|
|
152
|
+
{ name: 'Design Specification', result: bundle.design },
|
|
153
|
+
];
|
|
154
|
+
for (const file of files) {
|
|
155
|
+
try {
|
|
156
|
+
const sanitizedFilename = sanitizeFilename(file.result.filename);
|
|
157
|
+
const filePath = join(dir, sanitizedFilename);
|
|
158
|
+
await writeFile(filePath, file.result.content);
|
|
159
|
+
console.log(chalk.cyan(` ā ${file.name}: ${filePath}`));
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
throw new Error(`Failed to write ${file.name}: ${error.message}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
console.log(chalk.blue(`\nš¦ Generated ${files.length} stakeholder bundles in: ${dir}`));
|
|
166
|
+
console.log();
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Format bytes to human-readable string
|
|
170
|
+
*/
|
|
171
|
+
function formatBytes(bytes) {
|
|
172
|
+
if (bytes === 0)
|
|
173
|
+
return '0 Bytes';
|
|
174
|
+
const k = 1024;
|
|
175
|
+
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
|
|
176
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
177
|
+
return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extend.d.ts","sourceRoot":"","sources":["../../src/commands/extend.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,eAAO,MAAM,aAAa,SAkMvB,CAAC"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension management commands
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { listExtensions, listEnabledExtensions, enableExtension, disableExtension, getExtension, loadBuiltinExtensions, } from '@specsafe/core';
|
|
7
|
+
export const extendCommand = new Command('extend')
|
|
8
|
+
.description('Manage SpecSafe extensions')
|
|
9
|
+
.addCommand(new Command('list')
|
|
10
|
+
.description('List all available extensions')
|
|
11
|
+
.option('-e, --enabled-only', 'Show only enabled extensions')
|
|
12
|
+
.action(async (options) => {
|
|
13
|
+
try {
|
|
14
|
+
// Load builtins first
|
|
15
|
+
await loadBuiltinExtensions();
|
|
16
|
+
const extensions = options.enabledOnly
|
|
17
|
+
? listEnabledExtensions()
|
|
18
|
+
: listExtensions();
|
|
19
|
+
if (extensions.length === 0) {
|
|
20
|
+
console.log(chalk.yellow('No extensions found.'));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
console.log(chalk.bold('\nš¦ Extensions:\n'));
|
|
24
|
+
for (const ext of extensions) {
|
|
25
|
+
const status = ext.enabled === false
|
|
26
|
+
? chalk.red('disabled')
|
|
27
|
+
: chalk.green('enabled');
|
|
28
|
+
console.log(chalk.bold(` ${ext.name}`) + ` (${status})`);
|
|
29
|
+
console.log(chalk.gray(` ID: ${ext.id}`));
|
|
30
|
+
console.log(chalk.gray(` Version: ${ext.version}`));
|
|
31
|
+
if (ext.author) {
|
|
32
|
+
console.log(chalk.gray(` Author: ${ext.author}`));
|
|
33
|
+
}
|
|
34
|
+
console.log(` ${ext.description}`);
|
|
35
|
+
const hookPhases = Object.keys(ext.hooks);
|
|
36
|
+
if (hookPhases.length > 0) {
|
|
37
|
+
console.log(chalk.cyan(` Hooks: ${hookPhases.join(', ')}`));
|
|
38
|
+
}
|
|
39
|
+
console.log();
|
|
40
|
+
}
|
|
41
|
+
console.log(chalk.gray(`Total: ${extensions.length} extension(s)\n`));
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
console.error(chalk.red('Failed to list extensions:'), error);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
}))
|
|
48
|
+
.addCommand(new Command('enable')
|
|
49
|
+
.description('Enable an extension')
|
|
50
|
+
.argument('<name>', 'Extension ID or name')
|
|
51
|
+
.action(async (name) => {
|
|
52
|
+
try {
|
|
53
|
+
// Load builtins first
|
|
54
|
+
await loadBuiltinExtensions();
|
|
55
|
+
// Try to find by ID first
|
|
56
|
+
let extension = getExtension(name);
|
|
57
|
+
// If not found, search by name
|
|
58
|
+
if (!extension) {
|
|
59
|
+
const allExtensions = listExtensions();
|
|
60
|
+
extension = allExtensions.find((ext) => ext.name.toLowerCase() === name.toLowerCase());
|
|
61
|
+
}
|
|
62
|
+
if (!extension) {
|
|
63
|
+
console.error(chalk.red(`Extension "${name}" not found.`));
|
|
64
|
+
console.log(chalk.gray('Run "specsafe extend list" to see available extensions.'));
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
const success = enableExtension(extension.id);
|
|
68
|
+
if (success) {
|
|
69
|
+
console.log(chalk.green(`ā Enabled extension: ${extension.name}`));
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
console.error(chalk.red(`Failed to enable extension: ${extension.name}`));
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
console.error(chalk.red('Failed to enable extension:'), error);
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
}))
|
|
81
|
+
.addCommand(new Command('disable')
|
|
82
|
+
.description('Disable an extension')
|
|
83
|
+
.argument('<name>', 'Extension ID or name')
|
|
84
|
+
.action(async (name) => {
|
|
85
|
+
try {
|
|
86
|
+
// Load builtins first
|
|
87
|
+
await loadBuiltinExtensions();
|
|
88
|
+
// Try to find by ID first
|
|
89
|
+
let extension = getExtension(name);
|
|
90
|
+
// If not found, search by name
|
|
91
|
+
if (!extension) {
|
|
92
|
+
const allExtensions = listExtensions();
|
|
93
|
+
extension = allExtensions.find((ext) => ext.name.toLowerCase() === name.toLowerCase());
|
|
94
|
+
}
|
|
95
|
+
if (!extension) {
|
|
96
|
+
console.error(chalk.red(`Extension "${name}" not found.`));
|
|
97
|
+
console.log(chalk.gray('Run "specsafe extend list" to see available extensions.'));
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
const success = disableExtension(extension.id);
|
|
101
|
+
if (success) {
|
|
102
|
+
console.log(chalk.green(`ā Disabled extension: ${extension.name}`));
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
console.error(chalk.red(`Failed to disable extension: ${extension.name}`));
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
console.error(chalk.red('Failed to disable extension:'), error);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
}))
|
|
114
|
+
.addCommand(new Command('info')
|
|
115
|
+
.description('Show detailed information about an extension')
|
|
116
|
+
.argument('<name>', 'Extension ID or name')
|
|
117
|
+
.action(async (name) => {
|
|
118
|
+
try {
|
|
119
|
+
// Load builtins first
|
|
120
|
+
await loadBuiltinExtensions();
|
|
121
|
+
// Try to find by ID first
|
|
122
|
+
let extension = getExtension(name);
|
|
123
|
+
// If not found, search by name
|
|
124
|
+
if (!extension) {
|
|
125
|
+
const allExtensions = listExtensions();
|
|
126
|
+
extension = allExtensions.find((ext) => ext.name.toLowerCase() === name.toLowerCase());
|
|
127
|
+
}
|
|
128
|
+
if (!extension) {
|
|
129
|
+
console.error(chalk.red(`Extension "${name}" not found.`));
|
|
130
|
+
console.log(chalk.gray('Run "specsafe extend list" to see available extensions.'));
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
console.log();
|
|
134
|
+
console.log(chalk.bold(extension.name));
|
|
135
|
+
console.log(chalk.gray('ā'.repeat(50)));
|
|
136
|
+
console.log(chalk.gray(`ID: ${extension.id}`));
|
|
137
|
+
console.log(chalk.gray(`Version: ${extension.version}`));
|
|
138
|
+
if (extension.author) {
|
|
139
|
+
console.log(chalk.gray(`Author: ${extension.author}`));
|
|
140
|
+
}
|
|
141
|
+
const status = extension.enabled === false
|
|
142
|
+
? chalk.red('disabled')
|
|
143
|
+
: chalk.green('enabled');
|
|
144
|
+
console.log(chalk.gray(`Status: ${status}`));
|
|
145
|
+
console.log();
|
|
146
|
+
console.log(extension.description);
|
|
147
|
+
console.log();
|
|
148
|
+
const hookPhases = Object.keys(extension.hooks);
|
|
149
|
+
if (hookPhases.length > 0) {
|
|
150
|
+
console.log(chalk.bold('Hooks:'));
|
|
151
|
+
for (const phase of hookPhases) {
|
|
152
|
+
console.log(chalk.cyan(` ⢠${phase}`));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (extension.config && Object.keys(extension.config).length > 0) {
|
|
156
|
+
console.log();
|
|
157
|
+
console.log(chalk.bold('Configuration:'));
|
|
158
|
+
console.log(JSON.stringify(extension.config, null, 2));
|
|
159
|
+
}
|
|
160
|
+
console.log();
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
console.error(chalk.red('Failed to get extension info:'), error);
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
166
|
+
}));
|
|
167
|
+
//# sourceMappingURL=extend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extend.js","sourceRoot":"","sources":["../../src/commands/extend.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/commands/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,aAAa,SAwLvB,CAAC"}
|