@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.
Files changed (49) hide show
  1. package/dist/commands/complete.d.ts.map +1 -1
  2. package/dist/commands/complete.js +4 -1
  3. package/dist/commands/complete.js.map +1 -1
  4. package/dist/commands/done.d.ts +3 -0
  5. package/dist/commands/done.d.ts.map +1 -0
  6. package/dist/commands/done.js +237 -0
  7. package/dist/commands/done.js.map +1 -0
  8. package/dist/commands/explore.d.ts +3 -0
  9. package/dist/commands/explore.d.ts.map +1 -0
  10. package/dist/commands/explore.js +236 -0
  11. package/dist/commands/explore.js.map +1 -0
  12. package/dist/commands/new.d.ts.map +1 -1
  13. package/dist/commands/new.js +312 -27
  14. package/dist/commands/new.js.map +1 -1
  15. package/dist/commands/spec.d.ts.map +1 -1
  16. package/dist/commands/spec.js +257 -25
  17. package/dist/commands/spec.js.map +1 -1
  18. package/dist/commands/test-apply.d.ts +3 -0
  19. package/dist/commands/test-apply.d.ts.map +1 -0
  20. package/dist/commands/test-apply.js +228 -0
  21. package/dist/commands/test-apply.js.map +1 -0
  22. package/dist/commands/test-create.d.ts +3 -0
  23. package/dist/commands/test-create.d.ts.map +1 -0
  24. package/dist/commands/{test.js → test-create.js} +79 -30
  25. package/dist/commands/test-create.js.map +1 -0
  26. package/dist/commands/verify.d.ts +3 -0
  27. package/dist/commands/verify.d.ts.map +1 -0
  28. package/dist/commands/verify.js +288 -0
  29. package/dist/commands/verify.js.map +1 -0
  30. package/dist/index.d.ts +1 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +46 -6
  33. package/dist/index.js.map +1 -1
  34. package/dist/utils/generateToolConfig.d.ts +1 -1
  35. package/dist/utils/generateToolConfig.d.ts.map +1 -1
  36. package/dist/utils/generateToolConfig.js +980 -209
  37. package/dist/utils/generateToolConfig.js.map +1 -1
  38. package/dist/utils/testRunner.d.ts +39 -0
  39. package/dist/utils/testRunner.d.ts.map +1 -0
  40. package/dist/utils/testRunner.js +325 -0
  41. package/dist/utils/testRunner.js.map +1 -0
  42. package/package.json +3 -3
  43. package/dist/commands/code.d.ts +0 -3
  44. package/dist/commands/code.d.ts.map +0 -1
  45. package/dist/commands/code.js +0 -53
  46. package/dist/commands/code.js.map +0 -1
  47. package/dist/commands/test.d.ts +0 -3
  48. package/dist/commands/test.d.ts.map +0 -1
  49. package/dist/commands/test.js.map +0 -1
@@ -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 requirements and move to SPEC stage')
9
- .argument('<id>', 'Spec ID')
10
- .action(async (id) => {
11
- const spinner = ora(`Validating ${id} requirements...`).start();
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
- const specPath = join('specs/active', `${id}.md`);
25
- const content = await readFile(specPath, 'utf-8');
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 = content.match(/^#\s+(.+?)\s+Specification/m);
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
- // Validate requirements are defined
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
- spinner.warn(chalk.yellow(`${id} has no requirements defined yet`));
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
- console.log(chalk.blue('Next: Run specsafe test <id> to generate tests'));
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":"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"}
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const testApplyCommand: Command;
3
+ //# sourceMappingURL=test-apply.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const testCreateCommand: Command;
3
+ //# sourceMappingURL=test-create.d.ts.map
@@ -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"}