@specsafe/cli 0.8.0 → 2.0.3
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 +100 -279
- package/canonical/personas/bolt-zane.md +29 -0
- package/canonical/personas/forge-reva.md +29 -0
- package/canonical/personas/herald-cass.md +30 -0
- package/canonical/personas/mason-kai.md +30 -0
- package/canonical/personas/scout-elena.md +27 -0
- package/canonical/personas/warden-lyra.md +30 -0
- package/canonical/rules/.cursorrules.mdc +53 -0
- package/canonical/rules/.rules +48 -0
- package/canonical/rules/AGENTS.md +48 -0
- package/canonical/rules/CLAUDE.md +48 -0
- package/canonical/rules/CONVENTIONS.md +41 -0
- package/canonical/rules/GEMINI.md +50 -0
- package/canonical/rules/continue-config.yaml +5 -0
- package/canonical/skills/specsafe-archive/SKILL.md +63 -0
- package/canonical/skills/specsafe-code/SKILL.md +7 -0
- package/canonical/skills/specsafe-code/workflow.md +212 -0
- package/canonical/skills/specsafe-complete/SKILL.md +7 -0
- package/canonical/skills/specsafe-complete/workflow.md +130 -0
- package/canonical/skills/specsafe-doctor/SKILL.md +103 -0
- package/canonical/skills/specsafe-explore/SKILL.md +7 -0
- package/canonical/skills/specsafe-explore/workflow.md +100 -0
- package/canonical/skills/specsafe-init/SKILL.md +119 -0
- package/canonical/skills/specsafe-new/SKILL.md +7 -0
- package/canonical/skills/specsafe-new/workflow.md +156 -0
- package/canonical/skills/specsafe-qa/SKILL.md +7 -0
- package/canonical/skills/specsafe-qa/workflow.md +223 -0
- package/canonical/skills/specsafe-spec/SKILL.md +7 -0
- package/canonical/skills/specsafe-spec/workflow.md +158 -0
- package/canonical/skills/specsafe-status/SKILL.md +77 -0
- package/canonical/skills/specsafe-test/SKILL.md +7 -0
- package/canonical/skills/specsafe-test/workflow.md +210 -0
- package/canonical/skills/specsafe-verify/SKILL.md +7 -0
- package/canonical/skills/specsafe-verify/workflow.md +143 -0
- package/canonical/templates/project-state-template.md +33 -0
- package/canonical/templates/qa-report-template.md +55 -0
- package/canonical/templates/spec-template.md +52 -0
- package/canonical/templates/specsafe-config-template.json +10 -0
- package/generators/dist/adapters/aider.d.ts +2 -0
- package/generators/dist/adapters/aider.js +23 -0
- package/generators/dist/adapters/aider.js.map +1 -0
- package/generators/dist/adapters/antigravity.d.ts +2 -0
- package/generators/dist/adapters/antigravity.js +33 -0
- package/generators/dist/adapters/antigravity.js.map +1 -0
- package/generators/dist/adapters/claude-code.d.ts +2 -0
- package/generators/dist/adapters/claude-code.js +31 -0
- package/generators/dist/adapters/claude-code.js.map +1 -0
- package/generators/dist/adapters/continue.d.ts +2 -0
- package/generators/dist/adapters/continue.js +33 -0
- package/generators/dist/adapters/continue.js.map +1 -0
- package/generators/dist/adapters/cursor.d.ts +2 -0
- package/generators/dist/adapters/cursor.js +32 -0
- package/generators/dist/adapters/cursor.js.map +1 -0
- package/generators/dist/adapters/gemini.d.ts +2 -0
- package/generators/dist/adapters/gemini.js +36 -0
- package/generators/dist/adapters/gemini.js.map +1 -0
- package/generators/dist/adapters/index.d.ts +13 -0
- package/generators/dist/adapters/index.js +29 -0
- package/generators/dist/adapters/index.js.map +1 -0
- package/generators/dist/adapters/opencode.d.ts +2 -0
- package/generators/dist/adapters/opencode.js +32 -0
- package/generators/dist/adapters/opencode.js.map +1 -0
- package/generators/dist/adapters/types.d.ts +49 -0
- package/generators/dist/adapters/types.js +14 -0
- package/generators/dist/adapters/types.js.map +1 -0
- package/generators/dist/adapters/utils.d.ts +12 -0
- package/generators/dist/adapters/utils.js +68 -0
- package/generators/dist/adapters/utils.js.map +1 -0
- package/generators/dist/adapters/zed.d.ts +2 -0
- package/generators/dist/adapters/zed.js +31 -0
- package/generators/dist/adapters/zed.js.map +1 -0
- package/generators/dist/doctor.d.ts +10 -0
- package/generators/dist/doctor.js +123 -0
- package/generators/dist/doctor.js.map +1 -0
- package/generators/dist/index.d.ts +2 -0
- package/generators/dist/index.js +45 -0
- package/generators/dist/index.js.map +1 -0
- package/generators/dist/init.d.ts +9 -0
- package/generators/dist/init.js +167 -0
- package/generators/dist/init.js.map +1 -0
- package/generators/dist/install.d.ts +5 -0
- package/generators/dist/install.js +66 -0
- package/generators/dist/install.js.map +1 -0
- package/generators/dist/registry.d.ts +3 -0
- package/generators/dist/registry.js +8 -0
- package/generators/dist/registry.js.map +1 -0
- package/generators/dist/update.d.ts +5 -0
- package/generators/dist/update.js +40 -0
- package/generators/dist/update.js.map +1 -0
- package/package.json +31 -27
- package/dist/commands/apply.d.ts +0 -3
- package/dist/commands/apply.d.ts.map +0 -1
- package/dist/commands/apply.js +0 -182
- package/dist/commands/apply.js.map +0 -1
- package/dist/commands/archive.d.ts +0 -3
- package/dist/commands/archive.d.ts.map +0 -1
- package/dist/commands/archive.js +0 -99
- package/dist/commands/archive.js.map +0 -1
- package/dist/commands/capsule.d.ts +0 -8
- package/dist/commands/capsule.d.ts.map +0 -1
- package/dist/commands/capsule.js +0 -466
- package/dist/commands/capsule.js.map +0 -1
- package/dist/commands/complete.d.ts +0 -3
- package/dist/commands/complete.d.ts.map +0 -1
- package/dist/commands/complete.js +0 -140
- package/dist/commands/complete.js.map +0 -1
- package/dist/commands/constitution.d.ts +0 -3
- package/dist/commands/constitution.d.ts.map +0 -1
- package/dist/commands/constitution.js +0 -192
- package/dist/commands/constitution.js.map +0 -1
- package/dist/commands/create.d.ts +0 -10
- package/dist/commands/create.d.ts.map +0 -1
- package/dist/commands/create.js +0 -120
- package/dist/commands/create.js.map +0 -1
- package/dist/commands/delta.d.ts +0 -3
- package/dist/commands/delta.d.ts.map +0 -1
- package/dist/commands/delta.js +0 -82
- package/dist/commands/delta.js.map +0 -1
- package/dist/commands/diff.d.ts +0 -3
- package/dist/commands/diff.d.ts.map +0 -1
- package/dist/commands/diff.js +0 -102
- package/dist/commands/diff.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -3
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -204
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/done.d.ts +0 -3
- package/dist/commands/done.d.ts.map +0 -1
- package/dist/commands/done.js +0 -237
- package/dist/commands/done.js.map +0 -1
- package/dist/commands/explore.d.ts +0 -3
- package/dist/commands/explore.d.ts.map +0 -1
- package/dist/commands/explore.js +0 -236
- package/dist/commands/explore.js.map +0 -1
- package/dist/commands/export.d.ts +0 -7
- package/dist/commands/export.d.ts.map +0 -1
- package/dist/commands/export.js +0 -179
- package/dist/commands/export.js.map +0 -1
- package/dist/commands/extend.d.ts +0 -6
- package/dist/commands/extend.d.ts.map +0 -1
- package/dist/commands/extend.js +0 -167
- package/dist/commands/extend.js.map +0 -1
- package/dist/commands/init-old.d.ts +0 -3
- package/dist/commands/init-old.d.ts.map +0 -1
- package/dist/commands/init-old.js +0 -146
- package/dist/commands/init-old.js.map +0 -1
- package/dist/commands/init.d.ts +0 -3
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -298
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/list.d.ts +0 -3
- package/dist/commands/list.d.ts.map +0 -1
- package/dist/commands/list.js +0 -122
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/memory.d.ts +0 -3
- package/dist/commands/memory.d.ts.map +0 -1
- package/dist/commands/memory.js +0 -166
- package/dist/commands/memory.js.map +0 -1
- package/dist/commands/new.d.ts +0 -3
- package/dist/commands/new.d.ts.map +0 -1
- package/dist/commands/new.js +0 -508
- package/dist/commands/new.js.map +0 -1
- package/dist/commands/qa.d.ts +0 -3
- package/dist/commands/qa.d.ts.map +0 -1
- package/dist/commands/qa.js +0 -179
- package/dist/commands/qa.js.map +0 -1
- package/dist/commands/rules.d.ts +0 -6
- package/dist/commands/rules.d.ts.map +0 -1
- package/dist/commands/rules.js +0 -232
- package/dist/commands/rules.js.map +0 -1
- package/dist/commands/shard.d.ts +0 -6
- package/dist/commands/shard.d.ts.map +0 -1
- package/dist/commands/shard.js +0 -199
- package/dist/commands/shard.js.map +0 -1
- package/dist/commands/spec.d.ts +0 -3
- package/dist/commands/spec.d.ts.map +0 -1
- package/dist/commands/spec.js +0 -302
- package/dist/commands/spec.js.map +0 -1
- package/dist/commands/status.d.ts +0 -3
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -47
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/test-apply.d.ts +0 -3
- package/dist/commands/test-apply.d.ts.map +0 -1
- package/dist/commands/test-apply.js +0 -228
- package/dist/commands/test-apply.js.map +0 -1
- package/dist/commands/test-create.d.ts +0 -3
- package/dist/commands/test-create.d.ts.map +0 -1
- package/dist/commands/test-create.js +0 -183
- package/dist/commands/test-create.js.map +0 -1
- package/dist/commands/test-guide.d.ts +0 -3
- package/dist/commands/test-guide.d.ts.map +0 -1
- package/dist/commands/test-guide.js +0 -190
- package/dist/commands/test-guide.js.map +0 -1
- package/dist/commands/test-report.d.ts +0 -3
- package/dist/commands/test-report.d.ts.map +0 -1
- package/dist/commands/test-report.js +0 -196
- package/dist/commands/test-report.js.map +0 -1
- package/dist/commands/test-submit.d.ts +0 -6
- package/dist/commands/test-submit.d.ts.map +0 -1
- package/dist/commands/test-submit.js +0 -236
- package/dist/commands/test-submit.js.map +0 -1
- package/dist/commands/verify.d.ts +0 -3
- package/dist/commands/verify.d.ts.map +0 -1
- package/dist/commands/verify.js +0 -288
- package/dist/commands/verify.js.map +0 -1
- package/dist/config.d.ts +0 -23
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -44
- package/dist/config.js.map +0 -1
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -129
- package/dist/index.js.map +0 -1
- package/dist/rules/downloader.d.ts +0 -40
- package/dist/rules/downloader.d.ts.map +0 -1
- package/dist/rules/downloader.js +0 -253
- package/dist/rules/downloader.js.map +0 -1
- package/dist/rules/index.d.ts +0 -8
- package/dist/rules/index.d.ts.map +0 -1
- package/dist/rules/index.js +0 -8
- package/dist/rules/index.js.map +0 -1
- package/dist/rules/registry.d.ts +0 -45
- package/dist/rules/registry.d.ts.map +0 -1
- package/dist/rules/registry.js +0 -158
- package/dist/rules/registry.js.map +0 -1
- package/dist/rules/types.d.ts +0 -86
- package/dist/rules/types.d.ts.map +0 -1
- package/dist/rules/types.js +0 -6
- package/dist/rules/types.js.map +0 -1
- package/dist/utils/detectTools.d.ts +0 -15
- package/dist/utils/detectTools.d.ts.map +0 -1
- package/dist/utils/detectTools.js +0 -54
- package/dist/utils/detectTools.js.map +0 -1
- package/dist/utils/generateToolConfig.d.ts +0 -12
- package/dist/utils/generateToolConfig.d.ts.map +0 -1
- package/dist/utils/generateToolConfig.js +0 -1179
- package/dist/utils/generateToolConfig.js.map +0 -1
- package/dist/utils/testRunner.d.ts +0 -39
- package/dist/utils/testRunner.d.ts.map +0 -1
- package/dist/utils/testRunner.js +0 -325
- package/dist/utils/testRunner.js.map +0 -1
package/dist/commands/verify.js
DELETED
|
@@ -1,288 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import ora from 'ora';
|
|
4
|
-
import { Workflow, ProjectTracker, validateSpecId } from '@specsafe/core';
|
|
5
|
-
import { exec } from 'child_process';
|
|
6
|
-
import { promisify } from 'util';
|
|
7
|
-
import { access } from 'fs/promises';
|
|
8
|
-
import { join } from 'path';
|
|
9
|
-
import { loadConfig } from '../config.js';
|
|
10
|
-
const execAsync = promisify(exec);
|
|
11
|
-
export const verifyCommand = new Command('verify')
|
|
12
|
-
.description('Run tests and loop on failure (TEST → CODE loop)')
|
|
13
|
-
.argument('<id>', 'Spec ID')
|
|
14
|
-
.option('-w, --watch', 'Run in watch mode for continuous feedback')
|
|
15
|
-
.option('-u, --update', 'Update snapshots if applicable')
|
|
16
|
-
.option('--ci', 'Run in CI mode (no interactive)')
|
|
17
|
-
.action(async (id, options) => {
|
|
18
|
-
const spinner = ora(`Verifying ${id}...`).start();
|
|
19
|
-
try {
|
|
20
|
-
// Validate spec ID format
|
|
21
|
-
validateSpecId(id);
|
|
22
|
-
const workflow = new Workflow();
|
|
23
|
-
const tracker = new ProjectTracker(process.cwd());
|
|
24
|
-
const config = await loadConfig();
|
|
25
|
-
// Load existing specs from disk
|
|
26
|
-
await tracker.loadSpecsIntoWorkflow(workflow);
|
|
27
|
-
// Check if spec exists
|
|
28
|
-
const spec = workflow.getSpec(id);
|
|
29
|
-
if (!spec) {
|
|
30
|
-
throw new Error(`Spec '${id}' not found. Run 'specsafe new <name>' to create it first.`);
|
|
31
|
-
}
|
|
32
|
-
// Check if spec is in the right stage
|
|
33
|
-
if (spec.stage !== 'test' && spec.stage !== 'code' && spec.stage !== 'qa') {
|
|
34
|
-
throw new Error(`Spec '${id}' is in ${spec.stage.toUpperCase()} stage. Must be in TEST, CODE, or QA stage to verify.`);
|
|
35
|
-
}
|
|
36
|
-
// Check for test files
|
|
37
|
-
if (spec.testFiles.length === 0) {
|
|
38
|
-
// Try to find test file automatically
|
|
39
|
-
const testPath = join('tests', `${id.toLowerCase().replace(/-/g, '_')}.test.ts`);
|
|
40
|
-
try {
|
|
41
|
-
await access(testPath);
|
|
42
|
-
spec.testFiles.push(testPath);
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
throw new Error(`No test files found for ${id}. Run 'specsafe test ${id}' to generate tests first.`);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
spinner.text = `Running ${config.testFramework} tests...`;
|
|
49
|
-
// Run tests based on framework
|
|
50
|
-
let testResult;
|
|
51
|
-
try {
|
|
52
|
-
testResult = await runTests(config.testFramework, spec.testFiles, options);
|
|
53
|
-
}
|
|
54
|
-
catch (error) {
|
|
55
|
-
// Parse test output even if tests fail
|
|
56
|
-
testResult = parseTestOutput(error.stdout, error.stderr, config.testFramework);
|
|
57
|
-
}
|
|
58
|
-
spinner.stop();
|
|
59
|
-
// Display results
|
|
60
|
-
console.log('\n' + chalk.bold('━'.repeat(60)));
|
|
61
|
-
console.log(chalk.bold(` Test Results for ${id}`));
|
|
62
|
-
console.log(chalk.bold('━'.repeat(60)));
|
|
63
|
-
if (testResult.passed) {
|
|
64
|
-
console.log(chalk.green(`\n ✅ All tests passed!`));
|
|
65
|
-
console.log(chalk.green(` ${testResult.passedTests}/${testResult.totalTests} tests passed`));
|
|
66
|
-
console.log(chalk.gray(` Duration: ${testResult.duration}ms`));
|
|
67
|
-
// If in CODE stage, suggest moving to QA
|
|
68
|
-
if (spec.stage === 'code') {
|
|
69
|
-
console.log(chalk.blue(`\n 💡 Ready for QA! Run: specsafe qa ${id}`));
|
|
70
|
-
}
|
|
71
|
-
else if (spec.stage === 'qa') {
|
|
72
|
-
console.log(chalk.green(`\n 🎉 Ready to complete! Run: specsafe done ${id}`));
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
console.log(chalk.blue(`\n 💡 Tests pass! Ready to implement. Run: specsafe code ${id}`));
|
|
76
|
-
}
|
|
77
|
-
console.log(chalk.bold('━'.repeat(60)));
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
// Tests failed - show detailed output
|
|
81
|
-
console.log(chalk.red(`\n ❌ Tests failed`));
|
|
82
|
-
console.log(chalk.red(` ${testResult.failedTests}/${testResult.totalTests} tests failed`));
|
|
83
|
-
console.log(chalk.gray(` ${testResult.passedTests} passed, ${testResult.skippedTests} skipped`));
|
|
84
|
-
console.log(chalk.gray(` Duration: ${testResult.duration}ms`));
|
|
85
|
-
if (testResult.failures.length > 0) {
|
|
86
|
-
console.log(chalk.yellow(`\n Failed Tests:\n`));
|
|
87
|
-
for (const failure of testResult.failures.slice(0, 5)) {
|
|
88
|
-
console.log(chalk.red(` ✗ ${failure.name}`));
|
|
89
|
-
if (failure.file) {
|
|
90
|
-
console.log(chalk.gray(` File: ${failure.file}`));
|
|
91
|
-
}
|
|
92
|
-
console.log(chalk.gray(` ${failure.error.split('\n')[0]}`));
|
|
93
|
-
console.log();
|
|
94
|
-
}
|
|
95
|
-
if (testResult.failures.length > 5) {
|
|
96
|
-
console.log(chalk.gray(` ... and ${testResult.failures.length - 5} more failures`));
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
console.log(chalk.bold('━'.repeat(60)));
|
|
100
|
-
// Provide guidance for fixes
|
|
101
|
-
console.log(chalk.yellow('\n 🔧 Suggested fixes:\n'));
|
|
102
|
-
const suggestions = generateFixSuggestions(testResult.failures, spec);
|
|
103
|
-
for (const suggestion of suggestions) {
|
|
104
|
-
console.log(chalk.blue(` • ${suggestion}`));
|
|
105
|
-
}
|
|
106
|
-
console.log(chalk.gray(`\n 💡 Run 'specsafe code ${id}' to continue development`));
|
|
107
|
-
console.log(chalk.gray(` Then run 'specsafe verify ${id}' again`));
|
|
108
|
-
if (!options.ci) {
|
|
109
|
-
console.log(chalk.gray(`\n Or use --watch mode for continuous feedback:`));
|
|
110
|
-
console.log(chalk.gray(` specsafe verify ${id} --watch`));
|
|
111
|
-
}
|
|
112
|
-
// Exit with error code in CI mode
|
|
113
|
-
if (options.ci) {
|
|
114
|
-
process.exit(1);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
catch (error) {
|
|
118
|
-
spinner.fail(chalk.red(error.message));
|
|
119
|
-
if (error.message.includes('not found')) {
|
|
120
|
-
console.log(chalk.gray(`💡 Tip: Run 'specsafe new <name>' to create a spec first.`));
|
|
121
|
-
}
|
|
122
|
-
else if (error.message.includes('stage')) {
|
|
123
|
-
console.log(chalk.gray(`💡 Tip: Current workflow: SPEC → TEST → CODE → QA → COMPLETE`));
|
|
124
|
-
}
|
|
125
|
-
process.exit(1);
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
async function runTests(framework, testFiles, options) {
|
|
129
|
-
const testFilePattern = testFiles.length > 0 ? testFiles.join(' ') : '';
|
|
130
|
-
let command;
|
|
131
|
-
switch (framework) {
|
|
132
|
-
case 'vitest':
|
|
133
|
-
command = options.watch
|
|
134
|
-
? `npx vitest ${testFilePattern}`
|
|
135
|
-
: `npx vitest run ${testFilePattern}`;
|
|
136
|
-
if (options.update)
|
|
137
|
-
command += ' --update';
|
|
138
|
-
break;
|
|
139
|
-
case 'jest':
|
|
140
|
-
command = `npx jest ${testFilePattern}`;
|
|
141
|
-
if (options.watch)
|
|
142
|
-
command += ' --watch';
|
|
143
|
-
if (options.update)
|
|
144
|
-
command += ' --updateSnapshot';
|
|
145
|
-
break;
|
|
146
|
-
case 'playwright':
|
|
147
|
-
command = `npx playwright test ${testFilePattern}`;
|
|
148
|
-
if (options.watch)
|
|
149
|
-
command += ' --ui';
|
|
150
|
-
break;
|
|
151
|
-
default:
|
|
152
|
-
// Try to detect from package.json
|
|
153
|
-
command = `npm test -- ${testFilePattern}`;
|
|
154
|
-
if (options.watch)
|
|
155
|
-
command += ' --watch';
|
|
156
|
-
}
|
|
157
|
-
try {
|
|
158
|
-
const { stdout, stderr } = await execAsync(command, {
|
|
159
|
-
timeout: options.watch ? undefined : 120000,
|
|
160
|
-
env: { ...process.env, CI: options.watch ? 'false' : 'true' }
|
|
161
|
-
});
|
|
162
|
-
return parseTestOutput(stdout, stderr, framework);
|
|
163
|
-
}
|
|
164
|
-
catch (error) {
|
|
165
|
-
// Test command failed - parse the output anyway
|
|
166
|
-
if (error.stdout || error.stderr) {
|
|
167
|
-
return parseTestOutput(error.stdout || '', error.stderr || '', framework);
|
|
168
|
-
}
|
|
169
|
-
throw error;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
function parseTestOutput(stdout, stderr, framework) {
|
|
173
|
-
const output = stdout + stderr;
|
|
174
|
-
const result = {
|
|
175
|
-
passed: false,
|
|
176
|
-
totalTests: 0,
|
|
177
|
-
passedTests: 0,
|
|
178
|
-
failedTests: 0,
|
|
179
|
-
skippedTests: 0,
|
|
180
|
-
duration: 0,
|
|
181
|
-
failures: []
|
|
182
|
-
};
|
|
183
|
-
if (framework === 'vitest' || output.includes('vitest')) {
|
|
184
|
-
// Parse Vitest output
|
|
185
|
-
const passMatch = output.match(/(\d+) passed/);
|
|
186
|
-
const failMatch = output.match(/(\d+) failed/);
|
|
187
|
-
const skipMatch = output.match(/(\d+) skipped/);
|
|
188
|
-
const totalMatch = output.match(/Test Files?\s+\d+ passed \((\d+) total\)/);
|
|
189
|
-
const timeMatch = output.match(/Duration\s+(\d+)ms/);
|
|
190
|
-
if (passMatch)
|
|
191
|
-
result.passedTests = parseInt(passMatch[1], 10);
|
|
192
|
-
if (failMatch)
|
|
193
|
-
result.failedTests = parseInt(failMatch[1], 10);
|
|
194
|
-
if (skipMatch)
|
|
195
|
-
result.skippedTests = parseInt(skipMatch[1], 10);
|
|
196
|
-
if (timeMatch)
|
|
197
|
-
result.duration = parseInt(timeMatch[1], 10);
|
|
198
|
-
// Parse failures
|
|
199
|
-
const failureBlocks = output.match(/FAIL\s+[\s\S]+?(?=FAIL|Test Files|✓|passed|failed|$)/g) || [];
|
|
200
|
-
for (const block of failureBlocks) {
|
|
201
|
-
const testMatch = block.match(/FAIL\s+(.+)/);
|
|
202
|
-
const errorMatch = block.match(/AssertionError:\s*(.+)/) || block.match(/Error:\s*(.+)/);
|
|
203
|
-
if (testMatch) {
|
|
204
|
-
result.failures.push({
|
|
205
|
-
name: testMatch[1].trim(),
|
|
206
|
-
error: errorMatch ? errorMatch[1].trim() : 'Test failed',
|
|
207
|
-
file: testMatch[1].trim().split(' ')[0]
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
result.totalTests = result.passedTests + result.failedTests + result.skippedTests;
|
|
212
|
-
result.passed = result.failedTests === 0 && result.totalTests > 0;
|
|
213
|
-
}
|
|
214
|
-
else if (framework === 'jest' || output.includes('jest')) {
|
|
215
|
-
// Parse Jest output
|
|
216
|
-
const passedMatch = output.match(/(\d+)\s+passed/);
|
|
217
|
-
const failedMatch = output.match(/(\d+)\s+failed/);
|
|
218
|
-
const skippedMatch = output.match(/(\d+)\s+skipped/);
|
|
219
|
-
const totalMatch = output.match(/(\d+)\s+total/);
|
|
220
|
-
if (passedMatch)
|
|
221
|
-
result.passedTests = parseInt(passedMatch[1], 10);
|
|
222
|
-
if (failedMatch)
|
|
223
|
-
result.failedTests = parseInt(failedMatch[1], 10);
|
|
224
|
-
if (skippedMatch)
|
|
225
|
-
result.skippedTests = parseInt(skippedMatch[1], 10);
|
|
226
|
-
if (totalMatch) {
|
|
227
|
-
result.totalTests = parseInt(totalMatch[1], 10);
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
result.totalTests = result.passedTests + result.failedTests + result.skippedTests;
|
|
231
|
-
}
|
|
232
|
-
const timeMatch = output.match(/Time:\s+([\d.]+)\s*s/);
|
|
233
|
-
if (timeMatch)
|
|
234
|
-
result.duration = Math.round(parseFloat(timeMatch[1]) * 1000);
|
|
235
|
-
result.passed = result.failedTests === 0 && result.totalTests > 0;
|
|
236
|
-
// Parse Jest failures
|
|
237
|
-
const failMatches = output.matchAll(/✕\s+(.+)\s+\((.+?)\)/g);
|
|
238
|
-
for (const match of failMatches) {
|
|
239
|
-
result.failures.push({
|
|
240
|
-
name: match[1].trim(),
|
|
241
|
-
error: 'Test failed',
|
|
242
|
-
file: match[2].trim()
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
else {
|
|
247
|
-
// Generic parsing
|
|
248
|
-
const passed = output.match(/passed|✓|success/gi);
|
|
249
|
-
const failed = output.match(/failed|✕|error/gi);
|
|
250
|
-
result.passed = !!(!failed || (passed && !failed));
|
|
251
|
-
result.passedTests = passed ? passed.length : 0;
|
|
252
|
-
result.failedTests = failed ? failed.length : 0;
|
|
253
|
-
result.totalTests = result.passedTests + result.failedTests;
|
|
254
|
-
}
|
|
255
|
-
return result;
|
|
256
|
-
}
|
|
257
|
-
function generateFixSuggestions(failures, spec) {
|
|
258
|
-
const suggestions = [];
|
|
259
|
-
if (failures.length === 0) {
|
|
260
|
-
suggestions.push('No specific failures detected. Check test output above.');
|
|
261
|
-
return suggestions;
|
|
262
|
-
}
|
|
263
|
-
// Analyze failure patterns
|
|
264
|
-
const hasAssertionErrors = failures.some(f => f.error.toLowerCase().includes('expected') ||
|
|
265
|
-
f.error.toLowerCase().includes('assertion'));
|
|
266
|
-
const hasMissingImports = failures.some(f => f.error.toLowerCase().includes('cannot find module') ||
|
|
267
|
-
f.error.toLowerCase().includes('cannot resolve'));
|
|
268
|
-
const hasTypeErrors = failures.some(f => f.error.toLowerCase().includes('type') ||
|
|
269
|
-
f.error.toLowerCase().includes('property'));
|
|
270
|
-
if (hasMissingImports) {
|
|
271
|
-
suggestions.push('Missing imports detected. Check that all dependencies are installed: npm install');
|
|
272
|
-
}
|
|
273
|
-
if (hasTypeErrors) {
|
|
274
|
-
suggestions.push('Type errors found. Run: npx tsc --noEmit to see full type errors');
|
|
275
|
-
}
|
|
276
|
-
if (hasAssertionErrors) {
|
|
277
|
-
suggestions.push('Test assertions failing. Review the expected vs actual values above.');
|
|
278
|
-
suggestions.push('Check if implementation matches the spec requirements in ' + spec.id);
|
|
279
|
-
}
|
|
280
|
-
if (!hasMissingImports && !hasTypeErrors && !hasAssertionErrors) {
|
|
281
|
-
suggestions.push('Review the spec file: specs/active/' + spec.id + '.md');
|
|
282
|
-
suggestions.push('Ensure implementation covers all acceptance criteria');
|
|
283
|
-
suggestions.push('Check that test setup/teardown is correct');
|
|
284
|
-
}
|
|
285
|
-
suggestions.push('Run individual test: npx vitest run --reporter=verbose ' + spec.testFiles[0]);
|
|
286
|
-
return suggestions;
|
|
287
|
-
}
|
|
288
|
-
//# sourceMappingURL=verify.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SpecSafe Config Loader
|
|
3
|
-
* Loads configuration from specsafe.config.json with sensible defaults
|
|
4
|
-
*/
|
|
5
|
-
export interface SpecSafeConfig {
|
|
6
|
-
projectName: string;
|
|
7
|
-
version: string;
|
|
8
|
-
stages: string[];
|
|
9
|
-
testFramework: 'vitest' | 'jest';
|
|
10
|
-
language: 'typescript';
|
|
11
|
-
tools?: {
|
|
12
|
-
[toolName: string]: {
|
|
13
|
-
enabled: boolean;
|
|
14
|
-
version: string;
|
|
15
|
-
};
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Load SpecSafe configuration from specsafe.config.json
|
|
20
|
-
* Returns defaults if file doesn't exist
|
|
21
|
-
*/
|
|
22
|
-
export declare function loadConfig(cwd?: string): Promise<SpecSafeConfig>;
|
|
23
|
-
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,aAAa,EAAE,QAAQ,GAAG,MAAM,CAAC;IACjC,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,CAAC,EAAE;QACN,CAAC,QAAQ,EAAE,MAAM,GAAG;YAClB,OAAO,EAAE,OAAO,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;CACH;AAUD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,cAAc,CAAC,CA4BrF"}
|
package/dist/config.js
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SpecSafe Config Loader
|
|
3
|
-
* Loads configuration from specsafe.config.json with sensible defaults
|
|
4
|
-
*/
|
|
5
|
-
import { readFile, access } from 'fs/promises';
|
|
6
|
-
import { join } from 'path';
|
|
7
|
-
const DEFAULT_CONFIG = {
|
|
8
|
-
projectName: 'Untitled Project',
|
|
9
|
-
version: '1.0.0',
|
|
10
|
-
stages: ['spec', 'test', 'code', 'qa', 'complete', 'archived'],
|
|
11
|
-
testFramework: 'vitest',
|
|
12
|
-
language: 'typescript'
|
|
13
|
-
};
|
|
14
|
-
/**
|
|
15
|
-
* Load SpecSafe configuration from specsafe.config.json
|
|
16
|
-
* Returns defaults if file doesn't exist
|
|
17
|
-
*/
|
|
18
|
-
export async function loadConfig(cwd = process.cwd()) {
|
|
19
|
-
const configPath = join(cwd, 'specsafe.config.json');
|
|
20
|
-
try {
|
|
21
|
-
await access(configPath);
|
|
22
|
-
const content = await readFile(configPath, 'utf-8');
|
|
23
|
-
const parsed = JSON.parse(content);
|
|
24
|
-
// Merge with defaults
|
|
25
|
-
return {
|
|
26
|
-
projectName: parsed.projectName ?? DEFAULT_CONFIG.projectName,
|
|
27
|
-
version: parsed.version ?? DEFAULT_CONFIG.version,
|
|
28
|
-
stages: parsed.stages ?? DEFAULT_CONFIG.stages,
|
|
29
|
-
testFramework: parsed.testFramework ?? DEFAULT_CONFIG.testFramework,
|
|
30
|
-
language: parsed.language ?? DEFAULT_CONFIG.language
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
catch (error) {
|
|
34
|
-
if (error.code === 'ENOENT') {
|
|
35
|
-
// Config file doesn't exist, return defaults
|
|
36
|
-
return { ...DEFAULT_CONFIG };
|
|
37
|
-
}
|
|
38
|
-
if (error instanceof SyntaxError) {
|
|
39
|
-
throw new Error(`Invalid JSON in specsafe.config.json: ${error.message}`);
|
|
40
|
-
}
|
|
41
|
-
throw error;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAgB5B,MAAM,cAAc,GAAmB;IACrC,WAAW,EAAE,kBAAkB;IAC/B,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC;IAC9D,aAAa,EAAE,QAAQ;IACvB,QAAQ,EAAE,YAAY;CACvB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QAE9D,sBAAsB;QACtB,OAAO;YACL,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,cAAc,CAAC,WAAW;YAC7D,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,cAAc,CAAC,OAAO;YACjD,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM;YAC9C,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,cAAc,CAAC,aAAa;YACnE,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ;SACrD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,6CAA6C;YAC7C,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;QAC/B,CAAC;QAED,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
DELETED
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;GAIG"}
|
package/dist/index.js
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* SpecSafe CLI
|
|
4
|
-
* Command-line interface for the SpecSafe TDD framework
|
|
5
|
-
* Version 0.4.0 - OpenSpec-style workflow
|
|
6
|
-
*/
|
|
7
|
-
import { Command } from 'commander';
|
|
8
|
-
import chalk from 'chalk';
|
|
9
|
-
import { initCommand } from './commands/init.js';
|
|
10
|
-
import { newCommand } from './commands/new.js';
|
|
11
|
-
import { statusCommand } from './commands/status.js';
|
|
12
|
-
import { specCommand } from './commands/spec.js';
|
|
13
|
-
import { testCreateCommand } from './commands/test-create.js';
|
|
14
|
-
import { testApplyCommand } from './commands/test-apply.js';
|
|
15
|
-
import { qaCommand } from './commands/qa.js';
|
|
16
|
-
import { doneCommand } from './commands/done.js';
|
|
17
|
-
import { completeCommand } from './commands/complete.js';
|
|
18
|
-
import { listCommand } from './commands/list.js';
|
|
19
|
-
import { archiveCommand } from './commands/archive.js';
|
|
20
|
-
import { doctorCommand } from './commands/doctor.js';
|
|
21
|
-
import { rulesCommand } from './commands/rules.js';
|
|
22
|
-
import { verifyCommand } from './commands/verify.js';
|
|
23
|
-
import { exploreCommand } from './commands/explore.js';
|
|
24
|
-
import { deltaCommand } from './commands/delta.js';
|
|
25
|
-
import { applyCommand } from './commands/apply.js';
|
|
26
|
-
import { diffCommand } from './commands/diff.js';
|
|
27
|
-
import { extendCommand } from './commands/extend.js';
|
|
28
|
-
import { testGuideCommand } from './commands/test-guide.js';
|
|
29
|
-
import { testSubmitCommand } from './commands/test-submit.js';
|
|
30
|
-
import { testReportCommand } from './commands/test-report.js';
|
|
31
|
-
import { constitutionCommand } from './commands/constitution.js';
|
|
32
|
-
import { exportCommand } from './commands/export.js';
|
|
33
|
-
import { memoryCommand } from './commands/memory.js';
|
|
34
|
-
import { capsuleCommand } from './commands/capsule.js';
|
|
35
|
-
import { shardCommand } from './commands/shard.js';
|
|
36
|
-
import { createCommand } from './commands/create.js';
|
|
37
|
-
import { createRequire } from 'module';
|
|
38
|
-
const require = createRequire(import.meta.url);
|
|
39
|
-
const packageJson = require('../package.json');
|
|
40
|
-
const program = new Command();
|
|
41
|
-
program
|
|
42
|
-
.name('specsafe')
|
|
43
|
-
.description('SpecSafe - Test-Driven Development framework for AI-assisted software engineering')
|
|
44
|
-
.version(packageJson.version)
|
|
45
|
-
.option('-v, --verbose', 'Enable verbose output');
|
|
46
|
-
// Add commands
|
|
47
|
-
program.addCommand(initCommand);
|
|
48
|
-
program.addCommand(newCommand);
|
|
49
|
-
program.addCommand(statusCommand);
|
|
50
|
-
program.addCommand(listCommand);
|
|
51
|
-
program.addCommand(exploreCommand); // NEW: Pre-spec exploration
|
|
52
|
-
program.addCommand(specCommand);
|
|
53
|
-
program.addCommand(testCreateCommand); // NEW: Generate tests from scenarios
|
|
54
|
-
program.addCommand(testApplyCommand); // NEW: Run tests, loop on failure
|
|
55
|
-
program.addCommand(qaCommand);
|
|
56
|
-
program.addCommand(verifyCommand); // NEW: Test runner with loop
|
|
57
|
-
program.addCommand(doneCommand); // NEW: Complete + archive
|
|
58
|
-
program.addCommand(completeCommand); // DEPRECATED: Use 'done' instead
|
|
59
|
-
program.addCommand(archiveCommand);
|
|
60
|
-
program.addCommand(doctorCommand);
|
|
61
|
-
program.addCommand(rulesCommand);
|
|
62
|
-
// Delta spec commands (brownfield)
|
|
63
|
-
program.addCommand(deltaCommand); // Create delta spec
|
|
64
|
-
program.addCommand(applyCommand); // Apply delta specs
|
|
65
|
-
program.addCommand(diffCommand); // Preview delta changes
|
|
66
|
-
// Extension system
|
|
67
|
-
program.addCommand(extendCommand);
|
|
68
|
-
// E2E Testing commands
|
|
69
|
-
program.addCommand(testGuideCommand);
|
|
70
|
-
program.addCommand(testSubmitCommand);
|
|
71
|
-
program.addCommand(testReportCommand);
|
|
72
|
-
// Governance & Export
|
|
73
|
-
program.addCommand(constitutionCommand); // Constitutional governance
|
|
74
|
-
program.addCommand(exportCommand); // Export specs in multiple formats
|
|
75
|
-
program.addCommand(memoryCommand); // Project memory commands
|
|
76
|
-
program.addCommand(capsuleCommand); // Manage context capsules
|
|
77
|
-
program.addCommand(shardCommand); // Spec sharding for AI consumption
|
|
78
|
-
program.addCommand(createCommand); // Interactive spec creation via elicitation
|
|
79
|
-
// Workflow command group
|
|
80
|
-
program
|
|
81
|
-
.command('workflow')
|
|
82
|
-
.description('Show the SpecSafe workflow diagram')
|
|
83
|
-
.action(() => {
|
|
84
|
-
console.log(chalk.blue('\n┌─────────────────────────────────────────────────────────────┐'));
|
|
85
|
-
console.log(chalk.blue('│ SpecSafe Workflow │'));
|
|
86
|
-
console.log(chalk.blue('│ v0.4.0 - OpenSpec │'));
|
|
87
|
-
console.log(chalk.blue('└─────────────────────────────────────────────────────────────┘\n'));
|
|
88
|
-
console.log(chalk.white('Pre-Spec:'));
|
|
89
|
-
console.log(chalk.gray(' specsafe explore → Think through ideas before committing\n'));
|
|
90
|
-
console.log(chalk.white('Development Cycle:'));
|
|
91
|
-
console.log(chalk.cyan(' specsafe new [feature] → Create spec with PRD + BRD'));
|
|
92
|
-
console.log(chalk.gray(' ↓'));
|
|
93
|
-
console.log(chalk.cyan(' specsafe spec <id> → Flesh out detailed spec'));
|
|
94
|
-
console.log(chalk.gray(' ↓'));
|
|
95
|
-
console.log(chalk.cyan(' specsafe test-create <id> → Generate tests from scenarios'));
|
|
96
|
-
console.log(chalk.gray(' ↓'));
|
|
97
|
-
console.log(chalk.cyan(' specsafe test-apply <id> → Run tests, loop on failure'));
|
|
98
|
-
console.log(chalk.gray(' ↓ (if tests pass)'));
|
|
99
|
-
console.log(chalk.cyan(' specsafe qa <id> → QA validation'));
|
|
100
|
-
console.log(chalk.gray(' ↓'));
|
|
101
|
-
console.log(chalk.cyan(' specsafe done <id> → Complete & archive'));
|
|
102
|
-
console.log();
|
|
103
|
-
console.log(chalk.white('Brownfield Changes (Delta Specs):'));
|
|
104
|
-
console.log(chalk.cyan(' specsafe delta <id> → Create delta spec for changes'));
|
|
105
|
-
console.log(chalk.cyan(' specsafe diff <id> → Preview delta changes'));
|
|
106
|
-
console.log(chalk.cyan(' specsafe apply <id> → Apply delta to base spec'));
|
|
107
|
-
console.log();
|
|
108
|
-
console.log(chalk.white('Utility Commands:'));
|
|
109
|
-
console.log(chalk.gray(' specsafe status → View project status'));
|
|
110
|
-
console.log(chalk.gray(' specsafe list → List all specs'));
|
|
111
|
-
console.log(chalk.gray(' specsafe doctor → Check project health'));
|
|
112
|
-
console.log();
|
|
113
|
-
console.log(chalk.yellow('💡 The verify command is the key differentiator:'));
|
|
114
|
-
console.log(chalk.yellow(' It runs tests and provides feedback for the dev loop.\n'));
|
|
115
|
-
});
|
|
116
|
-
// Global error handling
|
|
117
|
-
program.exitOverride();
|
|
118
|
-
(async () => {
|
|
119
|
-
try {
|
|
120
|
-
await program.parseAsync();
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
if (error.code !== 'commander.help' && error.code !== 'commander.version') {
|
|
124
|
-
console.error(chalk.red('Error:'), error.message);
|
|
125
|
-
process.exit(1);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
})();
|
|
129
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rules Downloader
|
|
3
|
-
* Downloads rules from the GitHub repository or local source
|
|
4
|
-
*/
|
|
5
|
-
import type { DownloadOptions, RuleOperationResult } from './types.js';
|
|
6
|
-
/**
|
|
7
|
-
* Path to the rules directory in the repository
|
|
8
|
-
*/
|
|
9
|
-
export declare function getRulesSourcePath(): string;
|
|
10
|
-
/**
|
|
11
|
-
* Get the path to a specific tool's rules
|
|
12
|
-
*/
|
|
13
|
-
export declare function getToolRulesPath(toolName: string): string;
|
|
14
|
-
/**
|
|
15
|
-
* Check if rules exist for a tool in the source
|
|
16
|
-
*/
|
|
17
|
-
export declare function rulesExist(toolName: string): Promise<boolean>;
|
|
18
|
-
/**
|
|
19
|
-
* Get the content of a rule file from the source
|
|
20
|
-
*/
|
|
21
|
-
export declare function getRuleContent(toolName: string, fileName: string): Promise<string | null>;
|
|
22
|
-
/**
|
|
23
|
-
* Get the version of rules for a tool
|
|
24
|
-
* Currently returns '1.0.0' as placeholder
|
|
25
|
-
* In the future, this could read from a manifest.json
|
|
26
|
-
*/
|
|
27
|
-
export declare function getRulesVersion(_toolName: string): Promise<string>;
|
|
28
|
-
/**
|
|
29
|
-
* Download and install rules for a tool
|
|
30
|
-
*/
|
|
31
|
-
export declare function downloadRules(toolName: string, cwd?: string, options?: DownloadOptions): Promise<RuleOperationResult>;
|
|
32
|
-
/**
|
|
33
|
-
* Remove rules for a tool
|
|
34
|
-
*/
|
|
35
|
-
export declare function removeRules(toolName: string, cwd?: string): Promise<RuleOperationResult>;
|
|
36
|
-
/**
|
|
37
|
-
* Update rules for a tool to the latest version
|
|
38
|
-
*/
|
|
39
|
-
export declare function updateRules(toolName: string, cwd?: string): Promise<RuleOperationResult>;
|
|
40
|
-
//# sourceMappingURL=downloader.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"downloader.d.ts","sourceRoot":"","sources":["../../src/rules/downloader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAOvE;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAa3C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUnE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGxE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAsB,EAC3B,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAiF9B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAqD9B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAW9B"}
|