@specsafe/cli 0.4.0 → 0.5.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/apply.d.ts +3 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +182 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/delta.d.ts +3 -0
- package/dist/commands/delta.d.ts.map +1 -0
- package/dist/commands/delta.js +82 -0
- package/dist/commands/delta.js.map +1 -0
- package/dist/commands/diff.d.ts +3 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +102 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/init-old.d.ts +3 -0
- package/dist/commands/init-old.d.ts.map +1 -0
- package/dist/commands/init-old.js +146 -0
- package/dist/commands/init-old.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +195 -43
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +26 -8
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/qa.d.ts.map +1 -1
- package/dist/commands/qa.js +37 -1
- package/dist/commands/qa.js.map +1 -1
- package/dist/commands/rules.d.ts.map +1 -1
- package/dist/commands/rules.js +182 -97
- package/dist/commands/rules.js.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/commands/init.js
CHANGED
|
@@ -1,15 +1,78 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import ora from 'ora';
|
|
4
|
-
import { writeFile, mkdir } from 'fs/promises';
|
|
5
|
-
import {
|
|
4
|
+
import { writeFile, mkdir, access, chmod } from 'fs/promises';
|
|
5
|
+
import { existsSync } from 'fs';
|
|
6
|
+
import { join, dirname } from 'path';
|
|
7
|
+
import { execSync } from 'child_process';
|
|
8
|
+
import { ProjectTracker, getSupportedAgents, getAgent, AGENT_DEFINITIONS } from '@specsafe/core';
|
|
6
9
|
import { checkbox, select, confirm, input } from '@inquirer/prompts';
|
|
7
|
-
|
|
8
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Detect which agents are already configured in the project
|
|
12
|
+
*/
|
|
13
|
+
async function detectConfiguredAgents(projectDir) {
|
|
14
|
+
const detected = [];
|
|
15
|
+
for (const agentDef of AGENT_DEFINITIONS) {
|
|
16
|
+
for (const file of agentDef.detectionFiles) {
|
|
17
|
+
const filePath = join(projectDir, file);
|
|
18
|
+
try {
|
|
19
|
+
await access(filePath);
|
|
20
|
+
detected.push(agentDef.id);
|
|
21
|
+
break; // Found one file, that's enough
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// File doesn't exist, continue
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return detected;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generate configurations for selected agents
|
|
32
|
+
*/
|
|
33
|
+
async function generateAgentConfigs(agents, projectDir, projectName) {
|
|
34
|
+
for (const agentId of agents) {
|
|
35
|
+
const agentEntry = getAgent(agentId);
|
|
36
|
+
if (!agentEntry) {
|
|
37
|
+
console.warn(chalk.yellow(`Warning: Agent ${agentId} not found in registry`));
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
// Generate main config files
|
|
42
|
+
const configFiles = await agentEntry.adapter.generateConfig(projectDir, {
|
|
43
|
+
projectName,
|
|
44
|
+
});
|
|
45
|
+
// Generate command files
|
|
46
|
+
const commandFiles = await agentEntry.adapter.generateCommands(projectDir, {
|
|
47
|
+
projectName,
|
|
48
|
+
});
|
|
49
|
+
const allFiles = [...configFiles, ...commandFiles];
|
|
50
|
+
// Write files
|
|
51
|
+
for (const file of allFiles) {
|
|
52
|
+
const filePath = join(projectDir, file.path);
|
|
53
|
+
const fileDir = dirname(filePath);
|
|
54
|
+
// Create directory if needed (mkdir recursive is idempotent, no need to check existsSync)
|
|
55
|
+
await mkdir(fileDir, { recursive: true });
|
|
56
|
+
// Skip if file exists
|
|
57
|
+
if (existsSync(filePath)) {
|
|
58
|
+
console.log(chalk.yellow(` ⚠ ${file.path} already exists, skipping`));
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
// Write file
|
|
62
|
+
await writeFile(filePath, file.content);
|
|
63
|
+
console.log(chalk.green(` ✓ Created ${file.path}`));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.error(chalk.red(` ✗ Failed to generate ${agentId} config: ${error.message}`));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
9
71
|
export const initCommand = new Command('init')
|
|
10
72
|
.description('Initialize a new SpecSafe project')
|
|
11
73
|
.argument('[name]', 'Project name', 'my-project')
|
|
12
|
-
.
|
|
74
|
+
.option('--agent <agents...>', 'AI coding agents to configure (can be repeated)')
|
|
75
|
+
.action(async (defaultName, options) => {
|
|
13
76
|
const spinner = ora('Initializing SpecSafe project...').start();
|
|
14
77
|
try {
|
|
15
78
|
// Interactive prompts for project name
|
|
@@ -18,19 +81,61 @@ export const initCommand = new Command('init')
|
|
|
18
81
|
message: 'Project name:',
|
|
19
82
|
default: defaultName,
|
|
20
83
|
});
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
84
|
+
const projectDir = process.cwd();
|
|
85
|
+
// 1. Determine which agents to configure
|
|
86
|
+
let selectedAgents = [];
|
|
87
|
+
if (options.agent && options.agent.length > 0) {
|
|
88
|
+
// Agents specified via CLI flag - validate each one
|
|
89
|
+
const supportedAgents = getSupportedAgents();
|
|
90
|
+
const invalidAgents = options.agent.filter(id => !supportedAgents.includes(id));
|
|
91
|
+
if (invalidAgents.length > 0) {
|
|
92
|
+
console.error(chalk.red(`Error: Invalid agent(s): ${invalidAgents.join(', ')}`));
|
|
93
|
+
console.log(chalk.gray(`\nSupported agents: ${supportedAgents.join(', ')}`));
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
selectedAgents = options.agent;
|
|
97
|
+
console.log(chalk.blue(`Using agents from CLI: ${selectedAgents.join(', ')}`));
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// Auto-detect or prompt
|
|
101
|
+
const detectedAgents = await detectConfiguredAgents(projectDir);
|
|
102
|
+
if (detectedAgents.length > 0) {
|
|
103
|
+
console.log(chalk.green(`Detected agents: ${detectedAgents.join(', ')}`));
|
|
104
|
+
const useDetected = await confirm({
|
|
105
|
+
message: 'Use detected agents?',
|
|
106
|
+
default: true,
|
|
107
|
+
});
|
|
108
|
+
if (useDetected) {
|
|
109
|
+
selectedAgents = detectedAgents;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
if (selectedAgents.length === 0) {
|
|
113
|
+
// Prompt user to select
|
|
114
|
+
const agentChoices = AGENT_DEFINITIONS.map((agent) => ({
|
|
115
|
+
name: agent.name,
|
|
116
|
+
value: agent.id,
|
|
117
|
+
checked: detectedAgents.includes(agent.id),
|
|
118
|
+
}));
|
|
119
|
+
selectedAgents = await checkbox({
|
|
120
|
+
message: 'Which AI coding agents do you use?',
|
|
121
|
+
choices: agentChoices,
|
|
122
|
+
required: false,
|
|
123
|
+
});
|
|
124
|
+
// Default to all if none selected
|
|
125
|
+
if (selectedAgents.length === 0) {
|
|
126
|
+
const useAll = await confirm({
|
|
127
|
+
message: 'No agents selected. Generate configs for all supported agents?',
|
|
128
|
+
default: false,
|
|
129
|
+
});
|
|
130
|
+
if (useAll) {
|
|
131
|
+
// Filter to only agents that have registered adapters
|
|
132
|
+
selectedAgents = getSupportedAgents().filter(id => getAgent(id) !== undefined);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// 2. Prompt for test framework
|
|
138
|
+
spinner.stop();
|
|
34
139
|
const testFramework = await select({
|
|
35
140
|
message: 'Select testing framework:',
|
|
36
141
|
choices: [
|
|
@@ -40,20 +145,22 @@ export const initCommand = new Command('init')
|
|
|
40
145
|
],
|
|
41
146
|
default: 'vitest',
|
|
42
147
|
});
|
|
43
|
-
//
|
|
148
|
+
// 3. Prompt for git hooks
|
|
44
149
|
const useGitHooks = await confirm({
|
|
45
150
|
message: 'Enable git hooks for spec validation?',
|
|
46
151
|
default: true,
|
|
47
152
|
});
|
|
48
153
|
spinner.start('Creating project structure...');
|
|
49
|
-
// Create directory structure
|
|
50
|
-
await mkdir('specs/active', { recursive: true });
|
|
51
|
-
await mkdir('specs/completed', { recursive: true });
|
|
52
|
-
await mkdir('specs/archive', { recursive: true });
|
|
53
|
-
await mkdir('
|
|
54
|
-
await mkdir('
|
|
154
|
+
// Create directory structure (relative to projectDir)
|
|
155
|
+
await mkdir(join(projectDir, 'specs/active'), { recursive: true });
|
|
156
|
+
await mkdir(join(projectDir, 'specs/completed'), { recursive: true });
|
|
157
|
+
await mkdir(join(projectDir, 'specs/archive'), { recursive: true });
|
|
158
|
+
await mkdir(join(projectDir, 'specs/drafts'), { recursive: true });
|
|
159
|
+
await mkdir(join(projectDir, 'specs/exploration'), { recursive: true });
|
|
160
|
+
await mkdir(join(projectDir, 'src'), { recursive: true });
|
|
161
|
+
await mkdir(join(projectDir, 'tests'), { recursive: true });
|
|
55
162
|
// Create PROJECT_STATE.md
|
|
56
|
-
const tracker = new ProjectTracker(
|
|
163
|
+
const tracker = new ProjectTracker(projectDir);
|
|
57
164
|
await tracker.initialize(name);
|
|
58
165
|
// Create spec template
|
|
59
166
|
const template = `# Spec Template
|
|
@@ -90,37 +197,71 @@ export const initCommand = new Command('init')
|
|
|
90
197
|
|
|
91
198
|
## 9. Notes & References
|
|
92
199
|
`;
|
|
93
|
-
await writeFile('specs/template.md', template);
|
|
94
|
-
// Create config file with selected
|
|
95
|
-
const
|
|
96
|
-
for (const
|
|
97
|
-
|
|
200
|
+
await writeFile(join(projectDir, 'specs/template.md'), template);
|
|
201
|
+
// Create config file with selected agents
|
|
202
|
+
const agentsConfig = {};
|
|
203
|
+
for (const agentId of selectedAgents) {
|
|
204
|
+
agentsConfig[agentId] = { enabled: true };
|
|
98
205
|
}
|
|
99
206
|
const config = {
|
|
100
207
|
project: name,
|
|
101
208
|
version: '1.0.0',
|
|
102
|
-
stages: ['spec', 'test', '
|
|
209
|
+
stages: ['explore', 'draft', 'spec', 'test-create', 'test-apply', 'verify', 'complete'],
|
|
103
210
|
testFramework,
|
|
104
211
|
language: 'typescript',
|
|
105
|
-
|
|
212
|
+
agents: agentsConfig,
|
|
106
213
|
gitHooks: {
|
|
107
214
|
enabled: useGitHooks,
|
|
108
215
|
},
|
|
109
216
|
};
|
|
110
|
-
await writeFile('specsafe.config.json', JSON.stringify(config, null, 2));
|
|
111
|
-
spinner.text = 'Generating
|
|
112
|
-
// Generate
|
|
113
|
-
|
|
114
|
-
await generateToolConfig(tool, '.');
|
|
115
|
-
}
|
|
217
|
+
await writeFile(join(projectDir, 'specsafe.config.json'), JSON.stringify(config, null, 2));
|
|
218
|
+
spinner.text = 'Generating agent configurations...';
|
|
219
|
+
// Generate configs for selected agents
|
|
220
|
+
await generateAgentConfigs(selectedAgents, projectDir, name);
|
|
116
221
|
// Generate git hooks if enabled
|
|
117
222
|
if (useGitHooks) {
|
|
118
|
-
|
|
223
|
+
const hooksDir = join(projectDir, '.githooks');
|
|
224
|
+
await mkdir(hooksDir, { recursive: true });
|
|
225
|
+
const preCommitPath = join(hooksDir, 'pre-commit');
|
|
226
|
+
if (!existsSync(preCommitPath)) {
|
|
227
|
+
const preCommitContent = `#!/bin/bash
|
|
228
|
+
# SpecSafe pre-commit hook v1.0
|
|
229
|
+
set -e
|
|
230
|
+
|
|
231
|
+
echo "Running SpecSafe pre-commit checks..."
|
|
232
|
+
|
|
233
|
+
# Check PROJECT_STATE.md exists
|
|
234
|
+
if [ ! -f "PROJECT_STATE.md" ]; then
|
|
235
|
+
echo "PROJECT_STATE.md not found."
|
|
236
|
+
exit 1
|
|
237
|
+
fi
|
|
238
|
+
|
|
239
|
+
# Run specsafe doctor if available
|
|
240
|
+
if command -v specsafe >/dev/null 2>&1; then
|
|
241
|
+
specsafe doctor --silent || true
|
|
242
|
+
fi
|
|
243
|
+
|
|
244
|
+
echo "Pre-commit checks passed"
|
|
245
|
+
exit 0
|
|
246
|
+
`;
|
|
247
|
+
await writeFile(preCommitPath, preCommitContent);
|
|
248
|
+
// Make the hook executable
|
|
249
|
+
await chmod(preCommitPath, 0o755);
|
|
250
|
+
// Configure git to use .githooks directory
|
|
251
|
+
try {
|
|
252
|
+
execSync('git config --local core.hooksPath .githooks', { cwd: projectDir });
|
|
253
|
+
console.log(chalk.green(' ✓ Created .githooks/pre-commit'));
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
console.log(chalk.yellow(' ⚠ Created .githooks/pre-commit (run: git config --local core.hooksPath .githooks)'));
|
|
257
|
+
}
|
|
258
|
+
}
|
|
119
259
|
}
|
|
120
260
|
spinner.succeed(chalk.green(`Initialized SpecSafe project: ${name}`));
|
|
121
261
|
console.log('\n' + chalk.blue('Generated configurations:'));
|
|
122
|
-
for (const
|
|
123
|
-
|
|
262
|
+
for (const agentId of selectedAgents) {
|
|
263
|
+
const agentDef = AGENT_DEFINITIONS.find((a) => a.id === agentId);
|
|
264
|
+
console.log(chalk.green(` ✓ ${agentDef?.name || agentId}`));
|
|
124
265
|
}
|
|
125
266
|
if (useGitHooks) {
|
|
126
267
|
console.log(chalk.green(' ✓ Git hooks enabled'));
|
|
@@ -130,11 +271,22 @@ export const initCommand = new Command('init')
|
|
|
130
271
|
console.log(' 1. specsafe new <spec-name> - Create a new spec');
|
|
131
272
|
console.log(' 2. specsafe status - View project status');
|
|
132
273
|
console.log(' 3. Edit specs/active/ to define requirements');
|
|
274
|
+
if (selectedAgents.length > 0) {
|
|
275
|
+
console.log('\n' + chalk.blue('Agent commands:'));
|
|
276
|
+
for (const agentId of selectedAgents.slice(0, 3)) {
|
|
277
|
+
const agentEntry = getAgent(agentId);
|
|
278
|
+
if (agentEntry) {
|
|
279
|
+
// Use regex for whole-word replacement
|
|
280
|
+
const cmdFormat = agentEntry.commandFormat.replace(/\bcommand\b/, 'specsafe');
|
|
281
|
+
console.log(` ${agentEntry.name}: ${cmdFormat}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
133
285
|
}
|
|
134
286
|
catch (error) {
|
|
135
287
|
spinner.fail(chalk.red(`Failed to initialize: ${error.message}`));
|
|
136
288
|
if (error.message.includes('EEXIST')) {
|
|
137
|
-
console.log(chalk.gray("💡 Tip: Directory already exists.
|
|
289
|
+
console.log(chalk.gray("💡 Tip: Directory already exists."));
|
|
138
290
|
}
|
|
139
291
|
if (error.message.includes('User force closed')) {
|
|
140
292
|
console.log(chalk.gray('💡 Tip: Init was cancelled by user.'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAErE;;GAEG;AACH,KAAK,UAAU,sBAAsB,CAAC,UAAkB;IACtD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,QAAQ,IAAI,iBAAiB,EAAE,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC3B,MAAM,CAAC,gCAAgC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,+BAA+B;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,oBAAoB,CACjC,MAAgB,EAChB,UAAkB,EAClB,WAAmB;IAEnB,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,OAAO,wBAAwB,CAAC,CAAC,CAAC;YAC9E,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,6BAA6B;YAC7B,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE;gBACtE,WAAW;aACZ,CAAC,CAAC;YAEH,yBAAyB;YACzB,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE;gBACzE,WAAW;aACZ,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,YAAY,CAAC,CAAC;YAEnD,cAAc;YACd,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAElC,0FAA0F;gBAC1F,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAE1C,sBAAsB;gBACtB,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,2BAA2B,CAAC,CAAC,CAAC;oBACvE,SAAS;gBACX,CAAC;gBAED,aAAa;gBACb,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,OAAO,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,mCAAmC,CAAC;KAChD,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,YAAY,CAAC;KAChD,MAAM,CAAC,qBAAqB,EAAE,iDAAiD,CAAC;KAChF,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,OAA6B,EAAE,EAAE;IACnE,MAAM,OAAO,GAAG,GAAG,CAAC,kCAAkC,CAAC,CAAC,KAAK,EAAE,CAAC;IAEhE,IAAI,CAAC;QACH,uCAAuC;QACvC,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC;YACvB,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,WAAW;SACrB,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAEjC,yCAAyC;QACzC,IAAI,cAAc,GAAa,EAAE,CAAC;QAElC,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,oDAAoD;YACpD,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;YAC7C,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YAEhF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,wBAAwB;YACxB,MAAM,cAAc,GAAG,MAAM,sBAAsB,CAAC,UAAU,CAAC,CAAC;YAEhE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAE1E,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC;oBAChC,OAAO,EAAE,sBAAsB;oBAC/B,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;gBAEH,IAAI,WAAW,EAAE,CAAC;oBAChB,cAAc,GAAG,cAAc,CAAC;gBAClC,CAAC;YACH,CAAC;YAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,wBAAwB;gBACxB,MAAM,YAAY,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBACrD,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,KAAK,EAAE,KAAK,CAAC,EAAE;oBACf,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;iBAC3C,CAAC,CAAC,CAAC;gBAEJ,cAAc,GAAG,MAAM,QAAQ,CAAC;oBAC9B,OAAO,EAAE,oCAAoC;oBAC7C,OAAO,EAAE,YAAY;oBACrB,QAAQ,EAAE,KAAK;iBAChB,CAAC,CAAC;gBAEH,kCAAkC;gBAClC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAChC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;wBAC3B,OAAO,EAAE,gEAAgE;wBACzE,OAAO,EAAE,KAAK;qBACf,CAAC,CAAC;oBAEH,IAAI,MAAM,EAAE,CAAC;wBACX,sDAAsD;wBACtD,cAAc,GAAG,kBAAkB,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC;oBACjF,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC;YACjC,OAAO,EAAE,2BAA2B;YACpC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACjD,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;gBAC/B,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,YAAY,EAAE;aAClD;YACD,OAAO,EAAE,QAAQ;SAClB,CAAC,CAAC;QAEH,0BAA0B;QAC1B,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC;YAChC,OAAO,EAAE,uCAAuC;YAChD,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAE/C,sDAAsD;QACtD,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5D,0BAA0B;QAC1B,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAE/B,uBAAuB;QACvB,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCtB,CAAC;QACI,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,EAAE,QAAQ,CAAC,CAAC;QAEjE,0CAA0C;QAC1C,MAAM,YAAY,GAAyC,EAAE,CAAC;QAC9D,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACrC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5C,CAAC;QAED,MAAM,MAAM,GAAG;YACb,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,CAAC;YACvF,aAAa;YACb,QAAQ,EAAE,YAAY;YACtB,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE;gBACR,OAAO,EAAE,WAAW;aACrB;SACF,CAAC;QACF,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,sBAAsB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE3F,OAAO,CAAC,IAAI,GAAG,oCAAoC,CAAC;QAEpD,uCAAuC;QACvC,MAAM,oBAAoB,CAAC,cAAc,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAE7D,gCAAgC;QAChC,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YAC/C,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE3C,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACnD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC/B,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;CAmBlC,CAAC;gBACQ,MAAM,SAAS,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;gBACjD,2BAA2B;gBAC3B,MAAM,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;gBAClC,2CAA2C;gBAC3C,IAAI,CAAC;oBACH,QAAQ,CAAC,6CAA6C,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;oBAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC,CAAC;gBAC/D,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qFAAqF,CAAC,CAAC,CAAC;gBACnH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC,CAAC;QAEtE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAC5D,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,QAAQ,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,aAAa,gBAAgB,CAAC,CAAC,CAAC;QAE/D,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAE9D,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAClD,KAAK,MAAM,OAAO,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACjD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACrC,IAAI,UAAU,EAAE,CAAC;oBACf,uCAAuC;oBACvC,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;oBAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAClE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;YAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,UAAU,SAgdnB,CAAC"}
|
package/dist/commands/new.js
CHANGED
|
@@ -3,7 +3,7 @@ import chalk from 'chalk';
|
|
|
3
3
|
import ora from 'ora';
|
|
4
4
|
import { writeFile, mkdir, readdir } from 'fs/promises';
|
|
5
5
|
import { join, basename } from 'path';
|
|
6
|
-
import { Workflow, ProjectTracker } from '@specsafe/core';
|
|
6
|
+
import { Workflow, ProjectTracker, generateEARSTemplate } from '@specsafe/core';
|
|
7
7
|
import { input, editor, select } from '@inquirer/prompts';
|
|
8
8
|
export const newCommand = new Command('new')
|
|
9
9
|
.description('Create a new spec with interactive PRD creation')
|
|
@@ -12,6 +12,7 @@ export const newCommand = new Command('new')
|
|
|
12
12
|
.option('-a, --author <author>', 'Author name', 'developer')
|
|
13
13
|
.option('-n, --dry-run', 'Preview changes without writing files')
|
|
14
14
|
.option('--skip-interactive', 'Skip interactive prompts and use defaults')
|
|
15
|
+
.option('--ears', 'Use EARS (Easy Approach to Requirements Syntax) template')
|
|
15
16
|
.action(async (name, options) => {
|
|
16
17
|
const spinner = ora('Creating new spec...').start();
|
|
17
18
|
try {
|
|
@@ -70,7 +71,7 @@ export const newCommand = new Command('new')
|
|
|
70
71
|
let stakeholders = '';
|
|
71
72
|
let timeline = '';
|
|
72
73
|
let priority = 'P1';
|
|
73
|
-
if (!options.skipInteractive && !options.dryRun) {
|
|
74
|
+
if (!options.skipInteractive && !options.dryRun && !options.ears) {
|
|
74
75
|
console.log(chalk.blue('\n📋 Let\'s create a Product Requirements Document (PRD)\n'));
|
|
75
76
|
problemStatement = await editor({
|
|
76
77
|
message: 'Problem Statement (what problem does this solve?):',
|
|
@@ -90,7 +91,7 @@ So that [some reason]
|
|
|
90
91
|
- [ ] Criterion 2
|
|
91
92
|
- [ ] Criterion 3`
|
|
92
93
|
});
|
|
93
|
-
|
|
94
|
+
technicalConsiderations = await editor({
|
|
94
95
|
message: 'Technical Requirements (dependencies, constraints, stack):',
|
|
95
96
|
default: `<!-- Technical constraints, dependencies, integrations needed -->
|
|
96
97
|
- Required APIs:
|
|
@@ -138,8 +139,14 @@ So that [some reason]
|
|
|
138
139
|
spinner.start('Creating spec files...');
|
|
139
140
|
// Create spec
|
|
140
141
|
const spec = workflow.createSpec(id, featureName, options.description || `Spec for ${featureName}`, options.author, basename(process.cwd()));
|
|
141
|
-
//
|
|
142
|
-
|
|
142
|
+
// Use EARS template if requested
|
|
143
|
+
let specContent;
|
|
144
|
+
if (options.ears) {
|
|
145
|
+
specContent = generateEARSTemplate(id, featureName, options.author, priority);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
// Create PRD + BRD-enhanced spec content
|
|
149
|
+
specContent = `# ${featureName} Specification
|
|
143
150
|
|
|
144
151
|
**ID:** ${id}
|
|
145
152
|
**Status:** SPEC
|
|
@@ -269,6 +276,7 @@ ${timeline || `| Phase | Milestone | Target Date |
|
|
|
269
276
|
|
|
270
277
|
*Generated by SpecSafe v0.4.0 - OpenSpec Workflow*
|
|
271
278
|
`;
|
|
279
|
+
}
|
|
272
280
|
const specPath = join('specs/active', `${id}.md`);
|
|
273
281
|
// Handle dry-run mode
|
|
274
282
|
if (options.dryRun) {
|
|
@@ -399,14 +407,24 @@ When assisting with this project:
|
|
|
399
407
|
}
|
|
400
408
|
// Update project state
|
|
401
409
|
await tracker.addSpec(spec);
|
|
402
|
-
spinner.succeed(chalk.green(`Created spec: ${id}`));
|
|
410
|
+
spinner.succeed(chalk.green(`Created spec: ${id}${options.ears ? ' (EARS format)' : ''}`));
|
|
403
411
|
console.log(chalk.blue(` Location: ${specPath}`));
|
|
404
412
|
console.log(chalk.blue(` Tech Stack: .specsafe/tech-stack.md`));
|
|
405
413
|
console.log(chalk.blue(` Rules: .specsafe/rules.md`));
|
|
414
|
+
if (options.ears) {
|
|
415
|
+
console.log(chalk.green('\n ✨ Using EARS (Easy Approach to Requirements Syntax)'));
|
|
416
|
+
console.log(chalk.gray(' EARS patterns make requirements testable by construction'));
|
|
417
|
+
}
|
|
406
418
|
console.log(chalk.gray('\n Next steps:'));
|
|
407
419
|
console.log(chalk.gray(` 1. Edit ${specPath} to refine requirements`));
|
|
408
|
-
|
|
409
|
-
|
|
420
|
+
if (options.ears) {
|
|
421
|
+
console.log(chalk.gray(` 2. Follow EARS patterns in the template`));
|
|
422
|
+
console.log(chalk.gray(` 3. Run: specsafe qa ${id} --ears (to validate EARS compliance)`));
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
console.log(chalk.gray(` 2. Run: specsafe spec ${id}`));
|
|
426
|
+
console.log(chalk.gray(` 3. Or explore: specsafe explore`));
|
|
427
|
+
}
|
|
410
428
|
}
|
|
411
429
|
catch (error) {
|
|
412
430
|
spinner.fail(chalk.red(`Failed to create spec: ${error.message}`));
|
package/dist/commands/new.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qa.d.ts","sourceRoot":"","sources":["../../src/commands/qa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"qa.d.ts","sourceRoot":"","sources":["../../src/commands/qa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,SAAS,SA4KlB,CAAC"}
|
package/dist/commands/qa.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import ora from 'ora';
|
|
4
|
-
import { Workflow, ProjectTracker, validateSpecId } from '@specsafe/core';
|
|
4
|
+
import { Workflow, ProjectTracker, validateSpecId, generateEARSReport, getEARSScore } from '@specsafe/core';
|
|
5
5
|
import { exec } from 'child_process';
|
|
6
6
|
import { promisify } from 'util';
|
|
7
7
|
import { writeFile, mkdir } from 'fs/promises';
|
|
@@ -11,6 +11,7 @@ export const qaCommand = new Command('qa')
|
|
|
11
11
|
.description('Run QA validation (CODE → QA)')
|
|
12
12
|
.argument('<id>', 'Spec ID')
|
|
13
13
|
.option('-o, --output <path>', 'Output path for QA report')
|
|
14
|
+
.option('--ears', 'Validate EARS compliance and generate EARS report')
|
|
14
15
|
.action(async (id, options) => {
|
|
15
16
|
const spinner = ora(`Running QA for ${id}...`).start();
|
|
16
17
|
try {
|
|
@@ -108,11 +109,34 @@ export const qaCommand = new Command('qa')
|
|
|
108
109
|
await mkdir('qa-reports', { recursive: true });
|
|
109
110
|
const reportPath = options.output || join('qa-reports', `qa-${id}.json`);
|
|
110
111
|
await writeFile(reportPath, JSON.stringify(qaReport, null, 2));
|
|
112
|
+
// EARS validation if requested
|
|
113
|
+
let earsScore;
|
|
114
|
+
let earsReportPath;
|
|
115
|
+
if (options.ears) {
|
|
116
|
+
spinner.text = `Validating EARS compliance for ${id}...`;
|
|
117
|
+
const spec = workflow.getSpec(id);
|
|
118
|
+
earsScore = getEARSScore(spec);
|
|
119
|
+
const earsReport = generateEARSReport(spec);
|
|
120
|
+
earsReportPath = join('qa-reports', `ears-${id}.md`);
|
|
121
|
+
await writeFile(earsReportPath, earsReport);
|
|
122
|
+
}
|
|
111
123
|
// Persist state
|
|
112
124
|
await tracker.addSpec(workflow.getSpec(id));
|
|
113
125
|
if (qaReport.recommendation === 'GO') {
|
|
114
126
|
spinner.succeed(chalk.green(`✅ QA passed for ${id}`));
|
|
115
127
|
console.log(chalk.blue(` Report: ${reportPath}`));
|
|
128
|
+
if (options.ears && earsScore !== undefined) {
|
|
129
|
+
console.log(chalk.blue(` EARS Report: ${earsReportPath}`));
|
|
130
|
+
if (earsScore >= 90) {
|
|
131
|
+
console.log(chalk.green(` EARS Score: ${earsScore}/100 ✅`));
|
|
132
|
+
}
|
|
133
|
+
else if (earsScore >= 70) {
|
|
134
|
+
console.log(chalk.yellow(` EARS Score: ${earsScore}/100 ⚠️`));
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
console.log(chalk.red(` EARS Score: ${earsScore}/100 ❌`));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
116
140
|
console.log(chalk.green('Ready for completion!'));
|
|
117
141
|
console.log(chalk.blue(` Run: specsafe complete ${id} --report ${reportPath}`));
|
|
118
142
|
}
|
|
@@ -120,6 +144,18 @@ export const qaCommand = new Command('qa')
|
|
|
120
144
|
spinner.warn(chalk.yellow(`⚠️ QA issues found for ${id}`));
|
|
121
145
|
const issueDescs = qaReport.issues.map(i => i.description);
|
|
122
146
|
console.log(chalk.red(` Issues: ${issueDescs.join(', ')}`));
|
|
147
|
+
if (options.ears && earsScore !== undefined) {
|
|
148
|
+
console.log(chalk.blue(` EARS Report: ${earsReportPath}`));
|
|
149
|
+
if (earsScore >= 90) {
|
|
150
|
+
console.log(chalk.green(` EARS Score: ${earsScore}/100 ✅`));
|
|
151
|
+
}
|
|
152
|
+
else if (earsScore >= 70) {
|
|
153
|
+
console.log(chalk.yellow(` EARS Score: ${earsScore}/100 ⚠️`));
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
console.log(chalk.red(` EARS Score: ${earsScore}/100 ❌`));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
123
159
|
console.log(chalk.blue('Fix issues and re-run: specsafe qa <id>'));
|
|
124
160
|
}
|
|
125
161
|
}
|
package/dist/commands/qa.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qa.js","sourceRoot":"","sources":["../../src/commands/qa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"qa.js","sourceRoot":"","sources":["../../src/commands/qa.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/commands/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/commands/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkFpC;;GAEG;AACH,eAAO,MAAM,YAAY,SA8MtB,CAAC"}
|