@specsafe/cli 0.3.6 → 0.4.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/complete.d.ts.map +1 -1
- package/dist/commands/complete.js +4 -1
- package/dist/commands/complete.js.map +1 -1
- package/dist/commands/done.d.ts +3 -0
- package/dist/commands/done.d.ts.map +1 -0
- package/dist/commands/done.js +237 -0
- package/dist/commands/done.js.map +1 -0
- package/dist/commands/explore.d.ts +3 -0
- package/dist/commands/explore.d.ts.map +1 -0
- package/dist/commands/explore.js +236 -0
- package/dist/commands/explore.js.map +1 -0
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +312 -27
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/spec.d.ts.map +1 -1
- package/dist/commands/spec.js +257 -25
- package/dist/commands/spec.js.map +1 -1
- package/dist/commands/test-apply.d.ts +3 -0
- package/dist/commands/test-apply.d.ts.map +1 -0
- package/dist/commands/test-apply.js +228 -0
- package/dist/commands/test-apply.js.map +1 -0
- package/dist/commands/test-create.d.ts +3 -0
- package/dist/commands/test-create.d.ts.map +1 -0
- package/dist/commands/{test.js → test-create.js} +79 -30
- package/dist/commands/test-create.js.map +1 -0
- package/dist/commands/verify.d.ts +3 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +288 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -6
- package/dist/index.js.map +1 -1
- package/dist/utils/generateToolConfig.d.ts +1 -1
- package/dist/utils/generateToolConfig.d.ts.map +1 -1
- package/dist/utils/generateToolConfig.js +980 -209
- package/dist/utils/generateToolConfig.js.map +1 -1
- package/dist/utils/testRunner.d.ts +39 -0
- package/dist/utils/testRunner.d.ts.map +1 -0
- package/dist/utils/testRunner.js +325 -0
- package/dist/utils/testRunner.js.map +1 -0
- package/package.json +3 -3
- package/dist/commands/code.d.ts +0 -3
- package/dist/commands/code.d.ts.map +0 -1
- package/dist/commands/code.js +0 -53
- package/dist/commands/code.js.map +0 -1
- package/dist/commands/test.d.ts +0 -3
- package/dist/commands/test.d.ts.map +0 -1
- package/dist/commands/test.js.map +0 -1
package/dist/commands/spec.js
CHANGED
|
@@ -2,13 +2,17 @@ import { Command } from 'commander';
|
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import ora from 'ora';
|
|
4
4
|
import { Workflow, ProjectTracker, validateSpecId } from '@specsafe/core';
|
|
5
|
-
import { readFile } from 'fs/promises';
|
|
5
|
+
import { readFile, writeFile } from 'fs/promises';
|
|
6
6
|
import { join, basename } from 'path';
|
|
7
|
+
import { input, editor, confirm } from '@inquirer/prompts';
|
|
7
8
|
export const specCommand = new Command('spec')
|
|
8
|
-
.description('Validate spec
|
|
9
|
-
.argument('<id>', 'Spec ID')
|
|
10
|
-
.
|
|
11
|
-
|
|
9
|
+
.description('Validate spec and enhance with AI-assisted generation from PRD')
|
|
10
|
+
.argument('<id>', 'Spec ID (or use --from-prd to generate from PRD)')
|
|
11
|
+
.option('--from-prd', 'Generate detailed spec from PRD section')
|
|
12
|
+
.option('--interactive', 'Use interactive mode to refine requirements', true)
|
|
13
|
+
.option('--auto-generate', 'Auto-generate scenarios from PRD')
|
|
14
|
+
.action(async (id, options) => {
|
|
15
|
+
const spinner = ora(`Processing ${id}...`).start();
|
|
12
16
|
try {
|
|
13
17
|
// Validate spec ID format
|
|
14
18
|
validateSpecId(id);
|
|
@@ -18,45 +22,160 @@ export const specCommand = new Command('spec')
|
|
|
18
22
|
await tracker.loadSpecsIntoWorkflow(workflow);
|
|
19
23
|
// Check if spec exists
|
|
20
24
|
let spec = workflow.getSpec(id);
|
|
25
|
+
let specContent;
|
|
26
|
+
let specPath;
|
|
21
27
|
if (!spec) {
|
|
22
28
|
// Try to load from file
|
|
23
29
|
try {
|
|
24
|
-
|
|
25
|
-
|
|
30
|
+
specPath = join('specs/active', `${id}.md`);
|
|
31
|
+
specContent = await readFile(specPath, 'utf-8');
|
|
26
32
|
// Extract name from content (first heading)
|
|
27
|
-
const nameMatch =
|
|
33
|
+
const nameMatch = specContent.match(/^#\s+(.+?)\s+Specification/m);
|
|
28
34
|
const name = nameMatch ? nameMatch[1] : id;
|
|
29
35
|
// Create spec in workflow
|
|
30
36
|
spec = workflow.createSpec(id, name, `Spec loaded from ${specPath}`, 'developer', basename(process.cwd()));
|
|
31
|
-
// Parse requirements from content
|
|
32
|
-
const reqMatch = content.match(/###\s+Functional\s+Requirements[\s\S]*?(?=###|$)/i);
|
|
33
|
-
if (reqMatch) {
|
|
34
|
-
// Extract requirement rows from table
|
|
35
|
-
const rows = reqMatch[0].match(/\|\s*FR-\d+\s*\|[^|]+\|/g);
|
|
36
|
-
if (rows && rows.length > 0) {
|
|
37
|
-
spec.requirements = rows.map(row => ({
|
|
38
|
-
id: row.match(/FR-\d+/)?.[0] || 'REQ-1',
|
|
39
|
-
text: row.split('|')[2]?.trim() || 'Requirement',
|
|
40
|
-
priority: 'P0',
|
|
41
|
-
scenarios: []
|
|
42
|
-
}));
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
37
|
await tracker.addSpec(spec);
|
|
38
|
+
spinner.text = `Loaded spec from file...`;
|
|
46
39
|
}
|
|
47
40
|
catch (fileError) {
|
|
48
41
|
throw new Error(`Spec ${id} not found. Run 'specsafe new <name>' to create it first.`);
|
|
49
42
|
}
|
|
50
43
|
}
|
|
51
|
-
|
|
44
|
+
else {
|
|
45
|
+
specPath = join('specs/active', `${id}.md`);
|
|
46
|
+
try {
|
|
47
|
+
specContent = await readFile(specPath, 'utf-8');
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
throw new Error(`Spec file not found: ${specPath}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
spinner.stop();
|
|
54
|
+
// Check if PRD section exists
|
|
55
|
+
const hasPrd = specContent.includes('## 1. Product Requirements Document') ||
|
|
56
|
+
specContent.includes('## Problem Statement');
|
|
57
|
+
if (!hasPrd) {
|
|
58
|
+
console.log(chalk.yellow('\n⚠️ No PRD section found in spec.'));
|
|
59
|
+
const shouldAdd = await confirm({
|
|
60
|
+
message: 'Would you like to add a PRD section?',
|
|
61
|
+
default: true
|
|
62
|
+
});
|
|
63
|
+
if (shouldAdd) {
|
|
64
|
+
const problemStatement = await editor({
|
|
65
|
+
message: 'Problem Statement:',
|
|
66
|
+
default: 'Describe the problem this feature solves...'
|
|
67
|
+
});
|
|
68
|
+
const userStories = await editor({
|
|
69
|
+
message: 'User Stories:',
|
|
70
|
+
default: 'As a [user], I want [goal], so that [reason]'
|
|
71
|
+
});
|
|
72
|
+
// Insert PRD section after metadata
|
|
73
|
+
const prdSection = `\n## 1. Product Requirements Document (PRD)\n\n### 1.1 Problem Statement\n${problemStatement}\n\n### 1.2 User Stories\n${userStories}\n\n### 1.3 Acceptance Criteria\n- [ ] Criterion 1\n- [ ] Criterion 2\n\n### 1.4 Technical Considerations\n\n`;
|
|
74
|
+
const insertPoint = specContent.indexOf('## 2.');
|
|
75
|
+
if (insertPoint > 0) {
|
|
76
|
+
specContent = specContent.slice(0, insertPoint) + prdSection + specContent.slice(insertPoint);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
specContent += '\n' + prdSection;
|
|
80
|
+
}
|
|
81
|
+
await writeFile(specPath, specContent);
|
|
82
|
+
console.log(chalk.green('\n✅ Added PRD section to spec'));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Parse PRD and generate requirements
|
|
86
|
+
if (options.fromPrd || options.autoGenerate) {
|
|
87
|
+
spinner.start('Generating requirements from PRD...');
|
|
88
|
+
const generatedRequirements = parsePrdForRequirements(specContent);
|
|
89
|
+
const generatedScenarios = parsePrdForScenarios(specContent);
|
|
90
|
+
spinner.stop();
|
|
91
|
+
if (generatedRequirements.length > 0) {
|
|
92
|
+
console.log(chalk.blue('\n📋 Generated Requirements from PRD:\n'));
|
|
93
|
+
for (const req of generatedRequirements) {
|
|
94
|
+
console.log(chalk.white(` ${req.id}: ${req.text}`));
|
|
95
|
+
}
|
|
96
|
+
if (options.interactive) {
|
|
97
|
+
const shouldAdd = await confirm({
|
|
98
|
+
message: 'Add these requirements to the spec?',
|
|
99
|
+
default: true
|
|
100
|
+
});
|
|
101
|
+
if (shouldAdd) {
|
|
102
|
+
// Update spec with requirements
|
|
103
|
+
spec.requirements = [
|
|
104
|
+
...spec.requirements,
|
|
105
|
+
...generatedRequirements.filter(r => !spec.requirements.some((er) => er.id === r.id))
|
|
106
|
+
];
|
|
107
|
+
// Update spec content
|
|
108
|
+
specContent = updateRequirementsSection(specContent, generatedRequirements);
|
|
109
|
+
await writeFile(specPath, specContent);
|
|
110
|
+
console.log(chalk.green(`\n✅ Added ${generatedRequirements.length} requirements`));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (generatedScenarios.length > 0) {
|
|
115
|
+
console.log(chalk.blue('\n🎬 Generated Scenarios:\n'));
|
|
116
|
+
for (const scenario of generatedScenarios) {
|
|
117
|
+
console.log(chalk.white(` Scenario: ${scenario.name}`));
|
|
118
|
+
}
|
|
119
|
+
if (options.interactive) {
|
|
120
|
+
const shouldAddScenarios = await confirm({
|
|
121
|
+
message: 'Add these scenarios to the spec?',
|
|
122
|
+
default: true
|
|
123
|
+
});
|
|
124
|
+
if (shouldAddScenarios) {
|
|
125
|
+
specContent = updateScenariosSection(specContent, generatedScenarios);
|
|
126
|
+
await writeFile(specPath, specContent);
|
|
127
|
+
console.log(chalk.green(`\n✅ Added ${generatedScenarios.length} scenarios`));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Interactive refinement
|
|
133
|
+
if (options.interactive) {
|
|
134
|
+
const addMore = await confirm({
|
|
135
|
+
message: 'Add additional requirements interactively?',
|
|
136
|
+
default: spec.requirements.length === 0
|
|
137
|
+
});
|
|
138
|
+
if (addMore) {
|
|
139
|
+
let adding = true;
|
|
140
|
+
while (adding) {
|
|
141
|
+
const reqText = await input({
|
|
142
|
+
message: 'Requirement description (or press Enter to finish):'
|
|
143
|
+
});
|
|
144
|
+
if (!reqText) {
|
|
145
|
+
adding = false;
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
const priority = await input({
|
|
149
|
+
message: 'Priority (P0/P1/P2):',
|
|
150
|
+
default: 'P1'
|
|
151
|
+
});
|
|
152
|
+
const newReq = {
|
|
153
|
+
id: `FR-${spec.requirements.length + 1}`,
|
|
154
|
+
text: reqText,
|
|
155
|
+
priority,
|
|
156
|
+
scenarios: []
|
|
157
|
+
};
|
|
158
|
+
spec.requirements.push(newReq);
|
|
159
|
+
// Update file
|
|
160
|
+
specContent = updateRequirementsSection(specContent, [newReq]);
|
|
161
|
+
await writeFile(specPath, specContent);
|
|
162
|
+
console.log(chalk.green(` Added: ${newReq.id}`));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Validate requirements
|
|
52
167
|
if (spec.requirements.length === 0) {
|
|
53
|
-
|
|
168
|
+
console.log(chalk.yellow('\n⚠️ No requirements defined yet'));
|
|
54
169
|
console.log(chalk.blue('Add requirements to the spec file before moving to TEST stage'));
|
|
55
170
|
}
|
|
56
171
|
else {
|
|
57
172
|
spinner.succeed(chalk.green(`${id} validated: ${spec.requirements.length} requirements defined`));
|
|
58
173
|
}
|
|
59
|
-
|
|
174
|
+
// Persist state
|
|
175
|
+
await tracker.addSpec(spec);
|
|
176
|
+
console.log(chalk.blue('\nNext steps:'));
|
|
177
|
+
console.log(chalk.gray(` • Run: specsafe test ${id} → Generate tests from requirements`));
|
|
178
|
+
console.log(chalk.gray(` • Run: specsafe verify ${id} → Verify implementation`));
|
|
60
179
|
}
|
|
61
180
|
catch (error) {
|
|
62
181
|
spinner.fail(chalk.red(error.message));
|
|
@@ -67,4 +186,117 @@ export const specCommand = new Command('spec')
|
|
|
67
186
|
process.exit(1);
|
|
68
187
|
}
|
|
69
188
|
});
|
|
189
|
+
function parsePrdForRequirements(content) {
|
|
190
|
+
const requirements = [];
|
|
191
|
+
// Extract user stories
|
|
192
|
+
const userStoryMatch = content.match(/### 1\.2 User Stories\n([\s\S]*?)(?=###|$)/);
|
|
193
|
+
if (userStoryMatch) {
|
|
194
|
+
const stories = userStoryMatch[1]
|
|
195
|
+
.split('\n')
|
|
196
|
+
.filter(line => line.trim().match(/^As\s+a/i))
|
|
197
|
+
.map(line => line.trim());
|
|
198
|
+
stories.forEach((story, index) => {
|
|
199
|
+
requirements.push({
|
|
200
|
+
id: `FR-${index + 1}`,
|
|
201
|
+
text: story,
|
|
202
|
+
priority: 'P1',
|
|
203
|
+
scenarios: []
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
// Extract acceptance criteria
|
|
208
|
+
const criteriaMatch = content.match(/### 1\.3 Acceptance Criteria\n([\s\S]*?)(?=###|$)/);
|
|
209
|
+
if (criteriaMatch) {
|
|
210
|
+
const criteria = criteriaMatch[1]
|
|
211
|
+
.split('\n')
|
|
212
|
+
.filter(line => line.trim().startsWith('- [ ]') || line.trim().startsWith('- '))
|
|
213
|
+
.map(line => line.replace(/^- \[ \]\s*/, '').replace(/^- \[x\]\s*/i, '').replace(/^- /, '').trim());
|
|
214
|
+
criteria.forEach((criterion, index) => {
|
|
215
|
+
if (!requirements.some(r => r.text.includes(criterion))) {
|
|
216
|
+
requirements.push({
|
|
217
|
+
id: `FR-${requirements.length + 1}`,
|
|
218
|
+
text: `Acceptance: ${criterion}`,
|
|
219
|
+
priority: 'P0',
|
|
220
|
+
scenarios: []
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
return requirements;
|
|
226
|
+
}
|
|
227
|
+
function parsePrdForScenarios(content) {
|
|
228
|
+
const scenarios = [];
|
|
229
|
+
// Try to extract from user stories
|
|
230
|
+
const userStoryMatch = content.match(/### 1\.2 User Stories\n([\s\S]*?)(?=###|$)/);
|
|
231
|
+
if (userStoryMatch) {
|
|
232
|
+
const stories = userStoryMatch[1]
|
|
233
|
+
.split('\n')
|
|
234
|
+
.filter(line => line.trim().match(/^As\s+a/i));
|
|
235
|
+
stories.forEach((story, index) => {
|
|
236
|
+
// Parse "As a X, I want Y, so that Z"
|
|
237
|
+
const match = story.match(/As\s+a[n]?\s+(\w+),?\s*I\s+want\s+(.+?),?\s*so\s+that\s+(.+)/i);
|
|
238
|
+
if (match) {
|
|
239
|
+
scenarios.push({
|
|
240
|
+
name: `User ${match[1]} completes goal`,
|
|
241
|
+
given: `I am a ${match[1]}`,
|
|
242
|
+
when: `I want to ${match[2]}`,
|
|
243
|
+
thenOutcome: `I can ${match[3]}`
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
return scenarios;
|
|
249
|
+
}
|
|
250
|
+
function updateRequirementsSection(content, newRequirements) {
|
|
251
|
+
// Find or create the requirements table
|
|
252
|
+
const tableHeader = '| ID | Requirement | Priority | Acceptance Criteria |';
|
|
253
|
+
const tableSeparator = '|----|-------------|----------|---------------------|';
|
|
254
|
+
const requirementsRows = newRequirements.map(r => `| ${r.id} | ${r.text} | ${r.priority} | |`);
|
|
255
|
+
if (content.includes(tableHeader)) {
|
|
256
|
+
// Append to existing table
|
|
257
|
+
const tableEndMatch = content.match(/\| FR-\d+ \|[^|]+\|[^|]+\|[^|]+\|/g);
|
|
258
|
+
if (tableEndMatch) {
|
|
259
|
+
const lastRow = tableEndMatch[tableEndMatch.length - 1];
|
|
260
|
+
const insertIndex = content.indexOf(lastRow) + lastRow.length;
|
|
261
|
+
content = content.slice(0, insertIndex) + '\n' + requirementsRows.join('\n') + content.slice(insertIndex);
|
|
262
|
+
return content;
|
|
263
|
+
}
|
|
264
|
+
// Table header exists but no data rows yet - add after separator
|
|
265
|
+
const separatorIndex = content.indexOf(tableSeparator);
|
|
266
|
+
if (separatorIndex !== -1) {
|
|
267
|
+
const insertIndex = separatorIndex + tableSeparator.length;
|
|
268
|
+
content = content.slice(0, insertIndex) + '\n' + requirementsRows.join('\n') + content.slice(insertIndex);
|
|
269
|
+
return content;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Fallback: If no table header found, try to find Functional Requirements section
|
|
273
|
+
const funcReqMatch = content.match(/(### Functional Requirements\n[\s\S]*?)(?=###|##\s+\d+|$)/);
|
|
274
|
+
if (funcReqMatch) {
|
|
275
|
+
// Insert table after the section header
|
|
276
|
+
const sectionEnd = funcReqMatch.index + funcReqMatch[1].length;
|
|
277
|
+
content = content.slice(0, sectionEnd) +
|
|
278
|
+
'\n\n' + tableHeader + '\n' + tableSeparator + '\n' + requirementsRows.join('\n') +
|
|
279
|
+
content.slice(sectionEnd);
|
|
280
|
+
return content;
|
|
281
|
+
}
|
|
282
|
+
// Last resort: append a new Functional Requirements section at the end
|
|
283
|
+
content = content.trimEnd() + '\n\n### Functional Requirements\n\n' +
|
|
284
|
+
tableHeader + '\n' + tableSeparator + '\n' + requirementsRows.join('\n') + '\n';
|
|
285
|
+
return content;
|
|
286
|
+
}
|
|
287
|
+
function updateScenariosSection(content, scenarios) {
|
|
288
|
+
const scenariosText = scenarios.map((s, i) => `### Scenario ${i + 1}: ${s.name}
|
|
289
|
+
- **Given** ${s.given}
|
|
290
|
+
- **When** ${s.when}
|
|
291
|
+
- **Then** ${s.thenOutcome}
|
|
292
|
+
`).join('\n');
|
|
293
|
+
// Find "## 4. Scenarios" section
|
|
294
|
+
const scenariosMatch = content.match(/## 4\. Scenarios[\s\S]*?(?=## 5\.|## 6\.|$)/);
|
|
295
|
+
if (scenariosMatch) {
|
|
296
|
+
// Append to existing scenarios
|
|
297
|
+
const insertPoint = content.indexOf(scenariosMatch[0]) + scenariosMatch[0].length;
|
|
298
|
+
content = content.slice(0, insertPoint) + '\n' + scenariosText + content.slice(insertPoint);
|
|
299
|
+
}
|
|
300
|
+
return content;
|
|
301
|
+
}
|
|
70
302
|
//# sourceMappingURL=spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/commands/spec.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;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEtC,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,mDAAmD,CAAC;KAChE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;KAC3B,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,EAAE;IAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEhE,IAAI,CAAC;QACH,0BAA0B;QAC1B,cAAc,CAAC,EAAE,CAAC,CAAC;QAEnB,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAElD,gCAAgC;QAChC,MAAM,OAAO,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAE9C,uBAAuB;QACvB,IAAI,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEhC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,wBAAwB;YACxB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;gBAClD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAElD,4CAA4C;gBAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBAC/D,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAE3C,0BAA0B;gBAC1B,IAAI,GAAG,QAAQ,CAAC,UAAU,CACxB,EAAE,EACF,IAAI,EACJ,oBAAoB,QAAQ,EAAE,EAC9B,WAAW,EACX,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CACxB,CAAC;gBAEF,kCAAkC;gBAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;gBACpF,IAAI,QAAQ,EAAE,CAAC;oBACb,sCAAsC;oBACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;oBAC3D,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;4BACnC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO;4BACvC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,aAAa;4BAChD,QAAQ,EAAE,IAAa;4BACvB,SAAS,EAAE,EAAE;yBACd,CAAC,CAAC,CAAC;oBACN,CAAC;gBACH,CAAC;gBAED,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,2DAA2D,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,kCAAkC,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC,CAAC;QAC3F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,eAAe,IAAI,CAAC,YAAY,CAAC,MAAM,uBAAuB,CAAC,CAAC,CAAC;QACpG,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-apply.d.ts","sourceRoot":"","sources":["../../src/commands/test-apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,gBAAgB,SAmNzB,CAAC"}
|
|
@@ -0,0 +1,228 @@
|
|
|
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 { readFile, writeFile, mkdir } from 'fs/promises';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { input, confirm, select } from '@inquirer/prompts';
|
|
8
|
+
export const testApplyCommand = new Command('test-apply')
|
|
9
|
+
.description('Start implementation with development guidance (TEST → CODE)')
|
|
10
|
+
.argument('<id>', 'Spec ID')
|
|
11
|
+
.option('--skip-confirm', 'Skip confirmation prompts')
|
|
12
|
+
.option('--quick', 'Quick mode - minimal guidance')
|
|
13
|
+
.action(async (id, options) => {
|
|
14
|
+
const spinner = ora(`Starting implementation for ${id}...`).start();
|
|
15
|
+
try {
|
|
16
|
+
// Validate spec ID format
|
|
17
|
+
validateSpecId(id);
|
|
18
|
+
const workflow = new Workflow();
|
|
19
|
+
const tracker = new ProjectTracker(process.cwd());
|
|
20
|
+
// Load existing specs from disk
|
|
21
|
+
await tracker.loadSpecsIntoWorkflow(workflow);
|
|
22
|
+
// Check if spec exists
|
|
23
|
+
const spec = workflow.getSpec(id);
|
|
24
|
+
if (!spec) {
|
|
25
|
+
throw new Error(`Spec '${id}' not found. Run 'specsafe new <name>' to create it first.`);
|
|
26
|
+
}
|
|
27
|
+
// Read spec content for guidance
|
|
28
|
+
const specPath = join('specs/active', `${id}.md`);
|
|
29
|
+
let specContent;
|
|
30
|
+
try {
|
|
31
|
+
specContent = await readFile(specPath, 'utf-8');
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
throw new Error(`Spec file not found: ${specPath}`);
|
|
35
|
+
}
|
|
36
|
+
spinner.stop();
|
|
37
|
+
// Display development guidance
|
|
38
|
+
console.log(chalk.blue('\n' + '━'.repeat(60)));
|
|
39
|
+
console.log(chalk.bold(` Development Mode: ${id}`));
|
|
40
|
+
console.log(chalk.blue('━'.repeat(60) + '\n'));
|
|
41
|
+
// Show current status
|
|
42
|
+
console.log(chalk.white(` Current Stage: ${spec.stage.toUpperCase()}`));
|
|
43
|
+
console.log(chalk.white(` Requirements: ${spec.requirements.length}`));
|
|
44
|
+
console.log(chalk.white(` Test Files: ${spec.testFiles.length}`));
|
|
45
|
+
console.log();
|
|
46
|
+
// Extract key information from spec
|
|
47
|
+
const prdSection = extractSection(specContent, 'Product Requirements Document');
|
|
48
|
+
const acceptanceCriteria = extractSection(specContent, 'Acceptance Criteria');
|
|
49
|
+
const technicalApproach = extractSection(specContent, 'Technical Approach');
|
|
50
|
+
// Show PRD highlights
|
|
51
|
+
if (prdSection) {
|
|
52
|
+
console.log(chalk.cyan(' 📝 Problem Statement:'));
|
|
53
|
+
const problem = extractSection(prdSection, 'Problem Statement');
|
|
54
|
+
if (problem) {
|
|
55
|
+
const summary = problem.split('\n').find(line => line.trim() && !line.trim().startsWith('#'));
|
|
56
|
+
if (summary) {
|
|
57
|
+
console.log(chalk.gray(` ${summary.substring(0, 100)}${summary.length > 100 ? '...' : ''}`));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
console.log();
|
|
61
|
+
}
|
|
62
|
+
// Show acceptance criteria
|
|
63
|
+
if (acceptanceCriteria) {
|
|
64
|
+
console.log(chalk.cyan(' ✅ Acceptance Criteria:'));
|
|
65
|
+
const criteria = acceptanceCriteria
|
|
66
|
+
.split('\n')
|
|
67
|
+
.filter(line => line.trim().startsWith('- [') || line.trim().startsWith('-'))
|
|
68
|
+
.slice(0, 5);
|
|
69
|
+
for (const criterion of criteria) {
|
|
70
|
+
const clean = criterion.replace(/^- \[[ x]\]\s*/i, '').trim();
|
|
71
|
+
console.log(chalk.gray(` • ${clean.substring(0, 60)}${clean.length > 60 ? '...' : ''}`));
|
|
72
|
+
}
|
|
73
|
+
console.log();
|
|
74
|
+
}
|
|
75
|
+
// Show technical approach hints
|
|
76
|
+
if (technicalApproach) {
|
|
77
|
+
console.log(chalk.cyan(' 🛠️ Technical Approach:'));
|
|
78
|
+
const techStack = extractSection(technicalApproach, 'Tech Stack');
|
|
79
|
+
if (techStack) {
|
|
80
|
+
console.log(chalk.gray(` ${techStack.split('\n').find(l => l.trim() && !l.trim().startsWith('#')) || 'See spec for details'}`));
|
|
81
|
+
}
|
|
82
|
+
console.log();
|
|
83
|
+
}
|
|
84
|
+
// Development guidance
|
|
85
|
+
if (!options.quick) {
|
|
86
|
+
console.log(chalk.cyan(' 📋 Implementation Checklist:\n'));
|
|
87
|
+
const checklist = [
|
|
88
|
+
'Review test files to understand expected behavior',
|
|
89
|
+
'Create minimal implementation to pass first test',
|
|
90
|
+
'Iterate: run tests, fix, repeat',
|
|
91
|
+
'Refactor once all tests pass'
|
|
92
|
+
];
|
|
93
|
+
for (const item of checklist) {
|
|
94
|
+
console.log(chalk.gray(` [ ] ${item}`));
|
|
95
|
+
}
|
|
96
|
+
console.log();
|
|
97
|
+
}
|
|
98
|
+
// Interactive guidance
|
|
99
|
+
if (!options.skipConfirm && !options.quick) {
|
|
100
|
+
const wantGuidance = await confirm({
|
|
101
|
+
message: 'Would you like implementation guidance?',
|
|
102
|
+
default: true
|
|
103
|
+
});
|
|
104
|
+
if (wantGuidance) {
|
|
105
|
+
// Offer to create implementation file
|
|
106
|
+
const createFile = await confirm({
|
|
107
|
+
message: 'Create implementation file?',
|
|
108
|
+
default: true
|
|
109
|
+
});
|
|
110
|
+
if (createFile) {
|
|
111
|
+
const fileName = await input({
|
|
112
|
+
message: 'Implementation file name:',
|
|
113
|
+
default: `${id.toLowerCase().replace(/-/g, '_')}.ts`
|
|
114
|
+
});
|
|
115
|
+
const implPath = join('src', fileName);
|
|
116
|
+
// Generate boilerplate
|
|
117
|
+
const boilerplate = generateBoilerplate(spec, fileName);
|
|
118
|
+
await mkdir('src', { recursive: true });
|
|
119
|
+
await writeFile(implPath, boilerplate);
|
|
120
|
+
console.log(chalk.green(`\n ✅ Created: ${implPath}`));
|
|
121
|
+
// Add to spec
|
|
122
|
+
spec.implementationFiles.push(implPath);
|
|
123
|
+
}
|
|
124
|
+
// Offer TDD approach guidance
|
|
125
|
+
const tddApproach = await select({
|
|
126
|
+
message: 'Choose your approach:',
|
|
127
|
+
choices: [
|
|
128
|
+
{ name: '📕 Read tests first, then implement', value: 'read-first' },
|
|
129
|
+
{ name: '⚡ Start coding (I know what to do)', value: 'start-coding' },
|
|
130
|
+
{ name: '🎯 One test at a time', value: 'one-test' }
|
|
131
|
+
]
|
|
132
|
+
});
|
|
133
|
+
switch (tddApproach) {
|
|
134
|
+
case 'read-first':
|
|
135
|
+
console.log(chalk.blue('\n 📖 Recommended: Read the test files first'));
|
|
136
|
+
if (spec.testFiles.length > 0) {
|
|
137
|
+
console.log(chalk.gray(` ${spec.testFiles.join(', ')}`));
|
|
138
|
+
}
|
|
139
|
+
console.log(chalk.gray(' Understand what the tests expect, then implement.'));
|
|
140
|
+
break;
|
|
141
|
+
case 'one-test':
|
|
142
|
+
console.log(chalk.blue('\n 🎯 Run tests with verbose output:'));
|
|
143
|
+
console.log(chalk.gray(` npx vitest run --reporter=verbose`));
|
|
144
|
+
console.log(chalk.gray(' Fix one failing test at a time.'));
|
|
145
|
+
break;
|
|
146
|
+
case 'start-coding':
|
|
147
|
+
console.log(chalk.blue('\n ⚡ Go for it! Remember:'));
|
|
148
|
+
console.log(chalk.gray(' - Run specsafe verify after changes'));
|
|
149
|
+
console.log(chalk.gray(' - Keep tests passing as you go'));
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Move to code stage (validates tests exist)
|
|
155
|
+
try {
|
|
156
|
+
workflow.moveToCode(id);
|
|
157
|
+
await tracker.addSpec(spec);
|
|
158
|
+
console.log(chalk.green(`\n ✅ Moved ${id} to CODE stage`));
|
|
159
|
+
}
|
|
160
|
+
catch (moveError) {
|
|
161
|
+
if (moveError.message.includes('Must be in TEST stage')) {
|
|
162
|
+
// Already in code or beyond, that's fine
|
|
163
|
+
console.log(chalk.gray(`\n Note: Spec already in ${spec.stage.toUpperCase()} stage`));
|
|
164
|
+
}
|
|
165
|
+
else if (moveError.message.includes('No test files generated')) {
|
|
166
|
+
throw new Error(`No test files found. Run 'specsafe test ${id}' to generate tests first.`);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
throw moveError;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Development commands reference
|
|
173
|
+
console.log(chalk.blue('\n Development Commands:\n'));
|
|
174
|
+
console.log(chalk.gray(` Run tests: npx vitest run`));
|
|
175
|
+
console.log(chalk.gray(` Watch mode: npx vitest`));
|
|
176
|
+
console.log(chalk.gray(` Verify: specsafe verify ${id}`));
|
|
177
|
+
console.log(chalk.gray(` Check status: specsafe status`));
|
|
178
|
+
console.log(chalk.blue('\n' + '━'.repeat(60)));
|
|
179
|
+
console.log();
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
spinner.fail(chalk.red(error.message));
|
|
183
|
+
if (error.message.includes('not in TEST stage') || error.message.includes('Run \'specsafe test\'')) {
|
|
184
|
+
console.log(chalk.gray(`💡 Tip: Run 'specsafe test ${id}' to generate tests first.`));
|
|
185
|
+
}
|
|
186
|
+
else if (error.message.includes('not found')) {
|
|
187
|
+
console.log(chalk.gray(`💡 Tip: Run 'specsafe new <name>' to create a spec first.`));
|
|
188
|
+
}
|
|
189
|
+
else if (error.message.includes('No test files')) {
|
|
190
|
+
console.log(chalk.gray(`💡 Tip: Run 'specsafe test ${id}' to generate tests first.`));
|
|
191
|
+
}
|
|
192
|
+
process.exit(1);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
function extractSection(content, sectionName) {
|
|
196
|
+
const regex = new RegExp(`##+\s*${sectionName}[\\s\\S]*?(?=##+|$)`, 'i');
|
|
197
|
+
const match = content.match(regex);
|
|
198
|
+
return match ? match[0] : null;
|
|
199
|
+
}
|
|
200
|
+
function generateBoilerplate(spec, fileName) {
|
|
201
|
+
const functionName = fileName
|
|
202
|
+
.replace(/\.ts$/, '')
|
|
203
|
+
.replace(/[_-](.)/g, (_, char) => char.toUpperCase())
|
|
204
|
+
.replace(/^(.)/, (_, char) => char.toUpperCase());
|
|
205
|
+
const requirements = spec.requirements.map((r) => `// - ${r.text}`).join('\n');
|
|
206
|
+
return `/**
|
|
207
|
+
* ${spec.name}
|
|
208
|
+
* Spec: ${spec.id}
|
|
209
|
+
*
|
|
210
|
+
* Requirements:
|
|
211
|
+
${requirements || ' * (See spec for requirements)'}
|
|
212
|
+
*/
|
|
213
|
+
|
|
214
|
+
// TODO: Implement functionality to pass tests
|
|
215
|
+
|
|
216
|
+
export interface ${functionName}Options {
|
|
217
|
+
// Define options here
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export function ${functionName}(options?: ${functionName}Options): void {
|
|
221
|
+
// TODO: Implement
|
|
222
|
+
throw new Error('Not implemented');
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// TODO: Add more exports as needed
|
|
226
|
+
`;
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=test-apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-apply.js","sourceRoot":"","sources":["../../src/commands/test-apply.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;AAC1E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAU,MAAM,mBAAmB,CAAC;AAEnE,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC;KACtD,WAAW,CAAC,8DAA8D,CAAC;KAC3E,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;KAC3B,MAAM,CAAC,gBAAgB,EAAE,2BAA2B,CAAC;KACrD,MAAM,CAAC,SAAS,EAAE,+BAA+B,CAAC;KAClD,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,OAAmD,EAAE,EAAE;IAChF,MAAM,OAAO,GAAG,GAAG,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAEpE,IAAI,CAAC;QACH,0BAA0B;QAC1B,cAAc,CAAC,EAAE,CAAC,CAAC;QAEnB,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAElD,gCAAgC;QAChC,MAAM,OAAO,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAE9C,uBAAuB;QACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,SAAS,EAAE,4DAA4D,CAAC,CAAC;QAC3F,CAAC;QAED,iCAAiC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAClD,IAAI,WAAmB,CAAC;QACxB,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,+BAA+B;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAE/C,sBAAsB;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,oCAAoC;QACpC,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,EAAE,+BAA+B,CAAC,CAAC;QAChF,MAAM,kBAAkB,GAAG,cAAc,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;QAC9E,MAAM,iBAAiB,GAAG,cAAc,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;QAE5E,sBAAsB;QACtB,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC;YAChE,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC9F,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAClG,CAAC;YACH,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,2BAA2B;QAC3B,IAAI,kBAAkB,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,kBAAkB;iBAChC,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;iBAC5E,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAEf,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC9F,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,gCAAgC;QAChC,IAAI,iBAAiB,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,cAAc,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;YAClE,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,sBAAsB,EAAE,CAAC,CAAC,CAAC;YACrI,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;YAE5D,MAAM,SAAS,GAAG;gBAChB,mDAAmD;gBACnD,kDAAkD;gBAClD,iCAAiC;gBACjC,8BAA8B;aAC/B,CAAC;YAEF,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC3C,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC;gBACjC,OAAO,EAAE,yCAAyC;gBAClD,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YAEH,IAAI,YAAY,EAAE,CAAC;gBACjB,sCAAsC;gBACtC,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC;oBAC/B,OAAO,EAAE,6BAA6B;oBACtC,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;gBAEH,IAAI,UAAU,EAAE,CAAC;oBACf,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC;wBAC3B,OAAO,EAAE,2BAA2B;wBACpC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK;qBACrD,CAAC,CAAC;oBAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;oBAEvC,uBAAuB;oBACvB,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;oBAExD,MAAM,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACxC,MAAM,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;oBAEvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC,CAAC;oBAEvD,cAAc;oBACd,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC1C,CAAC;gBAED,8BAA8B;gBAC9B,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC;oBAC/B,OAAO,EAAE,uBAAuB;oBAChC,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,qCAAqC,EAAE,KAAK,EAAE,YAAY,EAAE;wBACpE,EAAE,IAAI,EAAE,oCAAoC,EAAE,KAAK,EAAE,cAAc,EAAE;wBACrE,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,UAAU,EAAE;qBACrD;iBACF,CAAC,CAAC;gBAEH,QAAQ,WAAW,EAAE,CAAC;oBACpB,KAAK,YAAY;wBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;wBACzE,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;wBAC/D,CAAC;wBACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC,CAAC;wBAClF,MAAM;oBAER,KAAK,UAAU;wBACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;wBACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;wBAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;wBAChE,MAAM;oBAER,KAAK,cAAc;wBACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;wBACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;wBACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;wBAC/D,MAAM;gBACV,CAAC;YACH,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,IAAI,CAAC;YACH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACxB,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,SAAc,EAAE,CAAC;YACxB,IAAI,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBACxD,yCAAyC;gBACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;YACzF,CAAC;iBAAM,IAAI,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,CAAC;gBACjE,MAAM,IAAI,KAAK,CAAC,2CAA2C,EAAE,4BAA4B,CAAC,CAAC;YAC7F,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,CAAC;YAClB,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,EAAE,EAAE,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;QAE9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,EAAE,CAAC;IAEhB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;YACnG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,EAAE,4BAA4B,CAAC,CAAC,CAAC;QACxF,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC,CAAC;QACvF,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,EAAE,4BAA4B,CAAC,CAAC,CAAC;QACxF,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,SAAS,cAAc,CAAC,OAAe,EAAE,WAAmB;IAC1D,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,SAAS,WAAW,qBAAqB,EAAE,GAAG,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAS,EAAE,QAAgB;IACtD,MAAM,YAAY,GAAG,QAAQ;SAC1B,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;SACpD,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAEpD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpF,OAAO;KACJ,IAAI,CAAC,IAAI;WACH,IAAI,CAAC,EAAE;;;EAGhB,YAAY,IAAI,gCAAgC;;;;;mBAK/B,YAAY;;;;kBAIb,YAAY,cAAc,YAAY;;;;;;CAMvD,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-create.d.ts","sourceRoot":"","sources":["../../src/commands/test-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,iBAAiB,SAsM1B,CAAC"}
|