@specsafe/cli 0.7.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +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 +32 -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/explore.js
DELETED
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import ora from 'ora';
|
|
4
|
-
import { input, editor, select, confirm } from '@inquirer/prompts';
|
|
5
|
-
import { mkdir, writeFile } from 'fs/promises';
|
|
6
|
-
import { join } from 'path';
|
|
7
|
-
export const exploreCommand = new Command('explore')
|
|
8
|
-
.description('Explore ideas before creating a spec')
|
|
9
|
-
.argument('[topic]', 'Topic or idea to explore')
|
|
10
|
-
.option('-t, --template <type>', 'Exploration template', 'general')
|
|
11
|
-
.action(async (topic, options) => {
|
|
12
|
-
const spinner = ora('Starting exploration session...').start();
|
|
13
|
-
try {
|
|
14
|
-
spinner.stop();
|
|
15
|
-
console.log(chalk.blue('\n🔍 SpecSafe Exploration Mode\n'));
|
|
16
|
-
console.log(chalk.gray('Think through ideas before committing to a spec.\n'));
|
|
17
|
-
// Get the topic if not provided
|
|
18
|
-
let explorationTopic = topic;
|
|
19
|
-
if (!explorationTopic) {
|
|
20
|
-
explorationTopic = await input({
|
|
21
|
-
message: 'What idea or feature do you want to explore?',
|
|
22
|
-
validate: (value) => value.length > 0 || 'Please provide a topic'
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
console.log(chalk.blue(`\nExploring: ${explorationTopic}\n`));
|
|
26
|
-
// Choose exploration approach
|
|
27
|
-
const approach = await select({
|
|
28
|
-
message: 'What aspect do you want to focus on?',
|
|
29
|
-
choices: [
|
|
30
|
-
{
|
|
31
|
-
name: 'Technical Feasibility',
|
|
32
|
-
value: 'feasibility',
|
|
33
|
-
description: 'Evaluate if this is technically possible'
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
name: 'User Impact',
|
|
37
|
-
value: 'impact',
|
|
38
|
-
description: 'Understand how users would benefit'
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
name: 'Implementation Approaches',
|
|
42
|
-
value: 'approaches',
|
|
43
|
-
description: 'Compare different ways to build this'
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
name: 'Risk Assessment',
|
|
47
|
-
value: 'risks',
|
|
48
|
-
description: 'Identify potential problems and mitigations'
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
name: 'Free-form Exploration',
|
|
52
|
-
value: 'freeform',
|
|
53
|
-
description: 'Open-ended exploration'
|
|
54
|
-
}
|
|
55
|
-
]
|
|
56
|
-
});
|
|
57
|
-
const result = {
|
|
58
|
-
idea: explorationTopic,
|
|
59
|
-
approach: '',
|
|
60
|
-
pros: [],
|
|
61
|
-
cons: [],
|
|
62
|
-
alternatives: [],
|
|
63
|
-
recommendation: 'proceed',
|
|
64
|
-
nextSteps: []
|
|
65
|
-
};
|
|
66
|
-
// Guided prompts based on approach
|
|
67
|
-
switch (approach) {
|
|
68
|
-
case 'feasibility':
|
|
69
|
-
result.approach = await editor({
|
|
70
|
-
message: 'Describe the proposed solution:',
|
|
71
|
-
default: `# ${explorationTopic}\n\n## Proposed Solution\n\n[Describe your idea here]\n\n## Technical Considerations\n\n- What technologies would be needed?\n- What are the integration points?\n- Are there any blockers?`
|
|
72
|
-
});
|
|
73
|
-
break;
|
|
74
|
-
case 'impact':
|
|
75
|
-
result.approach = await editor({
|
|
76
|
-
message: 'Describe the user impact:',
|
|
77
|
-
default: `# ${explorationTopic}\n\n## Target Users\n\n[Who benefits from this?]\n\n## Problem Being Solved\n\n[What pain point does this address?]\n\n## Expected Outcomes\n\n[What changes for the user?]`
|
|
78
|
-
});
|
|
79
|
-
break;
|
|
80
|
-
case 'approaches':
|
|
81
|
-
result.approach = await editor({
|
|
82
|
-
message: 'Compare different approaches:',
|
|
83
|
-
default: `# ${explorationTopic}\n\n## Option 1: [Name]\n\nDescription...\n\nPros:\n- \n\nCons:\n- \n\n## Option 2: [Name]\n\nDescription...\n\nPros:\n- \n\nCons:\n- `
|
|
84
|
-
});
|
|
85
|
-
break;
|
|
86
|
-
case 'risks':
|
|
87
|
-
result.approach = await editor({
|
|
88
|
-
message: 'Identify risks and mitigations:',
|
|
89
|
-
default: `# ${explorationTopic}\n\n## Potential Risks\n\n| Risk | Probability | Impact | Mitigation |\n|------|-------------|--------|------------|\n| | | | |\n\n## Dependencies\n\n- What does this depend on?\n- What depends on this?\n\n## Unknowns\n\n[What don't we know yet?]`
|
|
90
|
-
});
|
|
91
|
-
break;
|
|
92
|
-
case 'freeform':
|
|
93
|
-
default:
|
|
94
|
-
result.approach = await editor({
|
|
95
|
-
message: 'Explore your idea freely:',
|
|
96
|
-
default: explorationTopic
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
// Pros and cons
|
|
100
|
-
console.log(chalk.blue('\nPros and Cons:\n'));
|
|
101
|
-
const prosInput = await editor({
|
|
102
|
-
message: 'List the advantages/benefits:',
|
|
103
|
-
default: '- \n- \n- '
|
|
104
|
-
});
|
|
105
|
-
result.pros = prosInput.split('\n').filter(line => line.trim().startsWith('-')).map(line => line.replace(/^-\s*/, '').trim());
|
|
106
|
-
const consInput = await editor({
|
|
107
|
-
message: 'List the challenges/risks:',
|
|
108
|
-
default: '- \n- \n- '
|
|
109
|
-
});
|
|
110
|
-
result.cons = consInput.split('\n').filter(line => line.trim().startsWith('-')).map(line => line.replace(/^-\s*/, '').trim());
|
|
111
|
-
// Alternatives
|
|
112
|
-
const alternativesInput = await editor({
|
|
113
|
-
message: 'What alternatives exist?',
|
|
114
|
-
default: `- Do nothing (status quo)
|
|
115
|
-
- [Alternative approach 1]
|
|
116
|
-
- [Alternative approach 2]`
|
|
117
|
-
});
|
|
118
|
-
result.alternatives = alternativesInput.split('\n').filter(line => line.trim().startsWith('-')).map(line => line.replace(/^-\s*/, '').trim());
|
|
119
|
-
// Recommendation
|
|
120
|
-
result.recommendation = await select({
|
|
121
|
-
message: 'What is your recommendation?',
|
|
122
|
-
choices: [
|
|
123
|
-
{ name: '✅ Proceed - Create a spec', value: 'proceed' },
|
|
124
|
-
{ name: '🔄 Refine - Needs more thought', value: 'refine' },
|
|
125
|
-
{ name: '↩️ Pivot - Consider alternatives', value: 'pivot' },
|
|
126
|
-
{ name: '❌ Abort - Not worth pursuing', value: 'abort' }
|
|
127
|
-
]
|
|
128
|
-
});
|
|
129
|
-
// Next steps
|
|
130
|
-
const nextStepsInput = await editor({
|
|
131
|
-
message: 'What are the next steps?',
|
|
132
|
-
default: result.recommendation === 'proceed'
|
|
133
|
-
? `1. Create spec with: specsafe new ${explorationTopic.toLowerCase().replace(/\s+/g, '-')}\n2. Define detailed requirements\n3. Identify technical approach`
|
|
134
|
-
: `1. [Research needed]\n2. [Stakeholder input needed]\n3. [Decision needed]`
|
|
135
|
-
});
|
|
136
|
-
result.nextSteps = nextStepsInput.split('\n').filter(line => line.trim());
|
|
137
|
-
// Generate summary
|
|
138
|
-
console.log(chalk.blue('\n' + '━'.repeat(60)));
|
|
139
|
-
console.log(chalk.bold(' Exploration Summary'));
|
|
140
|
-
console.log(chalk.blue('━'.repeat(60) + '\n'));
|
|
141
|
-
console.log(chalk.white(` Topic: ${explorationTopic}`));
|
|
142
|
-
console.log(chalk.gray(` Focus: ${approach}\n`));
|
|
143
|
-
if (result.pros.length > 0) {
|
|
144
|
-
console.log(chalk.green(' Pros:'));
|
|
145
|
-
for (const pro of result.pros) {
|
|
146
|
-
console.log(chalk.green(` ✓ ${pro}`));
|
|
147
|
-
}
|
|
148
|
-
console.log();
|
|
149
|
-
}
|
|
150
|
-
if (result.cons.length > 0) {
|
|
151
|
-
console.log(chalk.red(' Cons:'));
|
|
152
|
-
for (const con of result.cons) {
|
|
153
|
-
console.log(chalk.red(` ✗ ${con}`));
|
|
154
|
-
}
|
|
155
|
-
console.log();
|
|
156
|
-
}
|
|
157
|
-
// Recommendation
|
|
158
|
-
const recColors = {
|
|
159
|
-
proceed: chalk.green.bold,
|
|
160
|
-
refine: chalk.yellow.bold,
|
|
161
|
-
pivot: chalk.blue.bold,
|
|
162
|
-
abort: chalk.red.bold
|
|
163
|
-
};
|
|
164
|
-
const recLabels = {
|
|
165
|
-
proceed: 'PROCEED',
|
|
166
|
-
refine: 'REFINE',
|
|
167
|
-
pivot: 'PIVOT',
|
|
168
|
-
abort: 'ABORT'
|
|
169
|
-
};
|
|
170
|
-
const recColor = recColors[result.recommendation];
|
|
171
|
-
const recLabel = recLabels[result.recommendation];
|
|
172
|
-
console.log(chalk.white(' Recommendation: ') + recColor(recLabel));
|
|
173
|
-
console.log();
|
|
174
|
-
if (result.nextSteps.length > 0) {
|
|
175
|
-
console.log(chalk.blue(' Next Steps:'));
|
|
176
|
-
for (const step of result.nextSteps) {
|
|
177
|
-
console.log(chalk.white(` → ${step}`));
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
console.log(chalk.blue('\n' + '━'.repeat(60)));
|
|
181
|
-
// Persist exploration results to disk
|
|
182
|
-
const explorationDir = join('specs', 'exploration');
|
|
183
|
-
await mkdir(explorationDir, { recursive: true });
|
|
184
|
-
const fileSlug = explorationTopic
|
|
185
|
-
.toLowerCase()
|
|
186
|
-
.replace(/[^a-z0-9]+/g, '-')
|
|
187
|
-
.replace(/^-+|-+$/g, '') || 'exploration';
|
|
188
|
-
const timestamp = new Date().toISOString().slice(0, 10);
|
|
189
|
-
const explorationPath = join(explorationDir, `${timestamp}-${fileSlug}.md`);
|
|
190
|
-
const explorationContent = `# Exploration: ${explorationTopic}
|
|
191
|
-
|
|
192
|
-
**Date:** ${new Date().toISOString()}
|
|
193
|
-
**Focus:** ${options.template}
|
|
194
|
-
**Recommendation:** ${result.recommendation.toUpperCase()}
|
|
195
|
-
|
|
196
|
-
## Approach
|
|
197
|
-
|
|
198
|
-
${result.approach}
|
|
199
|
-
|
|
200
|
-
## Pros
|
|
201
|
-
${result.pros.map(p => `- ${p}`).join('\n') || '- None listed'}
|
|
202
|
-
|
|
203
|
-
## Cons
|
|
204
|
-
${result.cons.map(c => `- ${c}`).join('\n') || '- None listed'}
|
|
205
|
-
|
|
206
|
-
## Alternatives
|
|
207
|
-
${result.alternatives.map(a => `- ${a}`).join('\n') || '- None listed'}
|
|
208
|
-
|
|
209
|
-
## Next Steps
|
|
210
|
-
${result.nextSteps.map(s => `- ${s}`).join('\n') || '- None listed'}
|
|
211
|
-
`;
|
|
212
|
-
await writeFile(explorationPath, explorationContent, 'utf-8');
|
|
213
|
-
console.log(chalk.gray(` 💾 Saved exploration notes: ${explorationPath}`));
|
|
214
|
-
// Offer to create spec if recommended
|
|
215
|
-
if (result.recommendation === 'proceed') {
|
|
216
|
-
const shouldCreate = await confirm({
|
|
217
|
-
message: 'Create a spec now?',
|
|
218
|
-
default: true
|
|
219
|
-
});
|
|
220
|
-
if (shouldCreate) {
|
|
221
|
-
const featureName = explorationTopic.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '');
|
|
222
|
-
console.log(chalk.blue(`\nRun: specsafe new ${featureName}`));
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
console.log();
|
|
226
|
-
}
|
|
227
|
-
catch (error) {
|
|
228
|
-
if (error.message.includes('User force closed')) {
|
|
229
|
-
console.log(chalk.gray('\nExploration cancelled.'));
|
|
230
|
-
process.exit(0);
|
|
231
|
-
}
|
|
232
|
-
console.error(chalk.red('Error:'), error.message);
|
|
233
|
-
process.exit(1);
|
|
234
|
-
}
|
|
235
|
-
});
|
|
236
|
-
//# sourceMappingURL=explore.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"explore.js","sourceRoot":"","sources":["../../src/commands/explore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/commands/export.js
DELETED
|
@@ -1,179 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/commands/extend.js
DELETED
|
@@ -1,167 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extend.js","sourceRoot":"","sources":["../../src/commands/extend.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init-old.d.ts","sourceRoot":"","sources":["../../src/commands/init-old.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,WAAW,SAyJpB,CAAC"}
|