@specsafe/cli 0.3.5 → 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/rules/registry.js +1 -1
- package/dist/rules/registry.js.map +1 -1
- package/dist/utils/detectTools.js +2 -2
- package/dist/utils/detectTools.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 +990 -207
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../src/commands/complete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"complete.d.ts","sourceRoot":"","sources":["../../src/commands/complete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,eAAe,SA2IxB,CAAC"}
|
|
@@ -5,11 +5,14 @@ import { Workflow, ProjectTracker, validateSpecId } from '@specsafe/core';
|
|
|
5
5
|
import { rename, readFile, access } from 'fs/promises';
|
|
6
6
|
import { join } from 'path';
|
|
7
7
|
export const completeCommand = new Command('complete')
|
|
8
|
-
.description('Complete spec (QA → COMPLETE)')
|
|
8
|
+
.description('Complete spec (QA → COMPLETE) [DEPRECATED: use "done" instead]')
|
|
9
9
|
.argument('<id>', 'Spec ID')
|
|
10
10
|
.option('-r, --report <path>', 'Path to QA report')
|
|
11
11
|
.option('-n, --dry-run', 'Preview changes without writing files')
|
|
12
12
|
.action(async (id, options) => {
|
|
13
|
+
// Show deprecation warning
|
|
14
|
+
console.log(chalk.yellow('\n⚠️ DEPRECATION WARNING: "specsafe complete" is deprecated.'));
|
|
15
|
+
console.log(chalk.yellow(' Use "specsafe done" instead for complete + archive functionality.\n'));
|
|
13
16
|
const spinner = ora(`Completing ${id}...`).start();
|
|
14
17
|
try {
|
|
15
18
|
// Validate spec ID format
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"complete.js","sourceRoot":"","sources":["../../src/commands/complete.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,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC
|
|
1
|
+
{"version":3,"file":"complete.js","sourceRoot":"","sources":["../../src/commands/complete.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,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC,gEAAgE,CAAC;KAC7E,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;KAC3B,MAAM,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;KAClD,MAAM,CAAC,eAAe,EAAE,uCAAuC,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,OAA8C,EAAE,EAAE;IAC3E,2BAA2B;IAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+DAA+D,CAAC,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wEAAwE,CAAC,CAAC,CAAC;IAEpG,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAEnD,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,uCAAuC;QACvC,IAAI,QAAkB,CAAC;QACvB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAE/C,2BAA2B;YAC3B,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC5G,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC;YAC/E,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,+CAA+C,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7F,CAAC;YAED,gCAAgC;YAChC,IAAI,YAAY,CAAC,cAAc,KAAK,IAAI,IAAI,YAAY,CAAC,cAAc,KAAK,OAAO,EAAE,CAAC;gBACpF,MAAM,IAAI,KAAK,CAAC,mEAAmE,YAAY,CAAC,cAAc,GAAG,CAAC,CAAC;YACrH,CAAC;YAED,QAAQ,GAAG,YAAwB,CAAC;YACpC,iFAAiF;YACjF,IAAI,OAAO,QAAQ,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAC3C,QAAQ,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,oBAAoB;YACpB,QAAQ,GAAG;gBACT,EAAE,EAAE,MAAM,EAAE,EAAE;gBACd,MAAM,EAAE,EAAE;gBACV,SAAS,EAAE,IAAI,IAAI,EAAE;gBACrB,WAAW,EAAE,EAAE;gBACf,QAAQ,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;gBACxE,cAAc,EAAE,IAAa;gBAC7B,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,mBAAmB;aAC3B,CAAC;QACJ,CAAC;QAED,qBAAqB;QACrB,IAAI,QAAQ,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,CAAC,MAAM,iCAAiC,EAAE,GAAG,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,QAAQ,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACxF,CAAC;QAED,uCAAuC;QACvC,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrH,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC;QAC3E,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,yCAAyC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAE1D,sBAAsB;QACtB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,CAAC;YAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,UAAU,MAAM,UAAU,EAAE,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+CAA+C,EAAE,EAAE,CAAC,CAAC,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,mFAAmF;QACnF,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;YACzB,MAAM,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,WAAgB,EAAE,CAAC;YAC1B,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAClC,wFAAwF;gBACxF,OAAO,CAAC,IAAI,GAAG,0BAA0B,UAAU,yBAAyB,CAAC;YAC/E,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,6BAA6B,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC;YACH,QAAQ,CAAC,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,SAAc,EAAE,CAAC;YACxB,IAAI,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,SAAS,EAAE,mCAAmC,EAAE,uBAAuB,CAAC,CAAC;YAC3F,CAAC;YACD,IAAI,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,SAAS,EAAE,0CAA0C,EAAE,UAAU,CAAC,CAAC;YACrF,CAAC;YACD,IAAI,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,mFAAmF,EAAE,UAAU,CAAC,CAAC;YACnH,CAAC;YACD,MAAM,SAAS,CAAC;QAClB,CAAC;QACD,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAE,CAAC,CAAC;QAE7C,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACpD,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,iBAAiB,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC/F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,EAAE,+BAA+B,CAAC,CAAC,CAAC;QACzF,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yDAAyD,EAAE,sBAAsB,CAAC,CAAC,CAAC;QAC7G,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,WAAW,CAAC,EAAE,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,EAAE,kCAAkC,CAAC,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"done.d.ts","sourceRoot":"","sources":["../../src/commands/done.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,WAAW,SA8MpB,CAAC"}
|
|
@@ -0,0 +1,237 @@
|
|
|
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 { rename, readFile, access, mkdir } from 'fs/promises';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { confirm } from '@inquirer/prompts';
|
|
8
|
+
export const doneCommand = new Command('done')
|
|
9
|
+
.description('Complete spec and archive (QA → COMPLETE → ARCHIVE)')
|
|
10
|
+
.argument('<id>', 'Spec ID')
|
|
11
|
+
.option('-r, --report <path>', 'Path to QA report')
|
|
12
|
+
.option('-n, --dry-run', 'Preview changes without writing files')
|
|
13
|
+
.option('--skip-archive', 'Keep in completed folder (do not archive)')
|
|
14
|
+
.action(async (id, options) => {
|
|
15
|
+
const spinner = ora(`Completing ${id}...`).start();
|
|
16
|
+
try {
|
|
17
|
+
// Validate spec ID format
|
|
18
|
+
validateSpecId(id);
|
|
19
|
+
const workflow = new Workflow();
|
|
20
|
+
const tracker = new ProjectTracker(process.cwd());
|
|
21
|
+
// Load existing specs from disk
|
|
22
|
+
await tracker.loadSpecsIntoWorkflow(workflow);
|
|
23
|
+
// Check if spec exists
|
|
24
|
+
const spec = workflow.getSpec(id);
|
|
25
|
+
if (!spec) {
|
|
26
|
+
throw new Error(`Spec '${id}' not found. Run 'specsafe new <name>' to create it first.`);
|
|
27
|
+
}
|
|
28
|
+
const requiredQaFields = ['id', 'specId', 'timestamp', 'recommendation', 'testResults', 'coverage', 'issues', 'notes'];
|
|
29
|
+
// Load QA report from file if provided
|
|
30
|
+
let qaReport;
|
|
31
|
+
if (options.report) {
|
|
32
|
+
const reportContent = await readFile(options.report, 'utf-8');
|
|
33
|
+
const parsedReport = JSON.parse(reportContent);
|
|
34
|
+
// Validate required fields
|
|
35
|
+
const missingFields = requiredQaFields.filter(field => !(field in parsedReport));
|
|
36
|
+
if (missingFields.length > 0) {
|
|
37
|
+
throw new Error(`Invalid QA report: missing required fields: ${missingFields.join(', ')}`);
|
|
38
|
+
}
|
|
39
|
+
// Validate recommendation value
|
|
40
|
+
if (parsedReport.recommendation !== 'GO' && parsedReport.recommendation !== 'NO-GO') {
|
|
41
|
+
throw new Error(`Invalid QA report: recommendation must be 'GO' or 'NO-GO', got '${parsedReport.recommendation}'`);
|
|
42
|
+
}
|
|
43
|
+
qaReport = parsedReport;
|
|
44
|
+
// Convert timestamp from ISO string to Date object (JSON.parse produces strings)
|
|
45
|
+
if (typeof qaReport.timestamp === 'string') {
|
|
46
|
+
qaReport.timestamp = new Date(qaReport.timestamp);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Default QA report
|
|
51
|
+
qaReport = {
|
|
52
|
+
id: `QA-${id}`,
|
|
53
|
+
specId: id,
|
|
54
|
+
timestamp: new Date(),
|
|
55
|
+
testResults: [],
|
|
56
|
+
coverage: { statements: 100, branches: 100, functions: 100, lines: 100 },
|
|
57
|
+
recommendation: 'GO',
|
|
58
|
+
issues: [],
|
|
59
|
+
notes: 'All tests passing'
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Validate QA report
|
|
63
|
+
if (qaReport.specId !== id) {
|
|
64
|
+
throw new Error(`QA report spec ID (${qaReport.specId}) does not match target spec (${id})`);
|
|
65
|
+
}
|
|
66
|
+
if (qaReport.recommendation !== 'GO') {
|
|
67
|
+
throw new Error('Cannot complete: QA report recommends NO-GO. Address issues first.');
|
|
68
|
+
}
|
|
69
|
+
// Validate required fields are present
|
|
70
|
+
const missingFields = requiredQaFields.filter(field => !(field in qaReport));
|
|
71
|
+
if (missingFields.length > 0) {
|
|
72
|
+
throw new Error(`QA report is missing required fields: ${missingFields.join(', ')}`);
|
|
73
|
+
}
|
|
74
|
+
// Check current stage
|
|
75
|
+
if (spec.stage !== 'qa') {
|
|
76
|
+
throw new Error(`Spec '${id}' is in ${spec.stage.toUpperCase()} stage. Must be in QA stage to complete.`);
|
|
77
|
+
}
|
|
78
|
+
const sourcePath = join('specs', 'active', `${id}.md`);
|
|
79
|
+
const completedPath = join('specs', 'completed', `${id}.md`);
|
|
80
|
+
const archivePath = join('specs', 'archive', `${id}.md`);
|
|
81
|
+
// Handle dry-run mode
|
|
82
|
+
if (options.dryRun) {
|
|
83
|
+
spinner.stop();
|
|
84
|
+
console.log(chalk.cyan('[DRY RUN] Would perform the following actions:\n'));
|
|
85
|
+
console.log(chalk.cyan(' State transition:'));
|
|
86
|
+
console.log(chalk.gray(` QA → COMPLETE`));
|
|
87
|
+
if (!options.skipArchive) {
|
|
88
|
+
console.log(chalk.gray(` COMPLETE → ARCHIVE`));
|
|
89
|
+
}
|
|
90
|
+
console.log(chalk.cyan(`\n File operations:`));
|
|
91
|
+
console.log(chalk.gray(` ${sourcePath} → ${completedPath}`));
|
|
92
|
+
if (!options.skipArchive) {
|
|
93
|
+
console.log(chalk.gray(` ${completedPath} → ${archivePath}`));
|
|
94
|
+
}
|
|
95
|
+
console.log(chalk.cyan(`\n QA Report:`));
|
|
96
|
+
console.log(chalk.gray(` ID: ${qaReport.id}`));
|
|
97
|
+
console.log(chalk.gray(` Recommendation: ${qaReport.recommendation}`));
|
|
98
|
+
console.log(chalk.gray(` Coverage: ${JSON.stringify(qaReport.coverage)}`));
|
|
99
|
+
console.log(chalk.cyan(`\n Would update PROJECT_STATE.md for spec: ${id}`));
|
|
100
|
+
process.exit(0);
|
|
101
|
+
}
|
|
102
|
+
// Confirmation if not using default QA report
|
|
103
|
+
if (!options.report) {
|
|
104
|
+
spinner.stop();
|
|
105
|
+
const confirmed = await confirm({
|
|
106
|
+
message: `No QA report provided. Mark ${id} as complete anyway?`,
|
|
107
|
+
default: false
|
|
108
|
+
});
|
|
109
|
+
if (!confirmed) {
|
|
110
|
+
console.log(chalk.gray('Run specsafe qa first to generate a proper QA report.'));
|
|
111
|
+
process.exit(0);
|
|
112
|
+
}
|
|
113
|
+
spinner.start('Completing spec...');
|
|
114
|
+
}
|
|
115
|
+
// Move file to completed FIRST
|
|
116
|
+
try {
|
|
117
|
+
await access(sourcePath);
|
|
118
|
+
await mkdir('specs/completed', { recursive: true });
|
|
119
|
+
await rename(sourcePath, completedPath);
|
|
120
|
+
}
|
|
121
|
+
catch (renameError) {
|
|
122
|
+
if (renameError.code === 'ENOENT') {
|
|
123
|
+
spinner.text = `Source file not found at ${sourcePath}, checking completed folder...`;
|
|
124
|
+
// Check if already in completed
|
|
125
|
+
try {
|
|
126
|
+
await access(completedPath);
|
|
127
|
+
spinner.text = `Spec already in completed folder.`;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
throw new Error(`Spec file not found in active or completed folders.`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
throw new Error(`Failed to move spec file: ${renameError.message}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Now update workflow state and persist
|
|
138
|
+
try {
|
|
139
|
+
workflow.moveToComplete(id, qaReport);
|
|
140
|
+
}
|
|
141
|
+
catch (moveError) {
|
|
142
|
+
if (moveError.message.includes('not found')) {
|
|
143
|
+
throw new Error(`Spec '${id}' not found. Run 'specsafe spec ${id}' to create it first.`);
|
|
144
|
+
}
|
|
145
|
+
if (moveError.message.includes('Must be in QA stage')) {
|
|
146
|
+
throw new Error(`Spec '${id}' is not in QA stage. Run 'specsafe qa ${id}' first.`);
|
|
147
|
+
}
|
|
148
|
+
if (moveError.message.includes('NO-GO')) {
|
|
149
|
+
throw new Error(`Cannot complete: QA report recommends NO-GO. Fix issues and re-run 'specsafe qa ${id}' first.`);
|
|
150
|
+
}
|
|
151
|
+
throw moveError;
|
|
152
|
+
}
|
|
153
|
+
// Persist state
|
|
154
|
+
await tracker.addSpec(workflow.getSpec(id));
|
|
155
|
+
spinner.succeed(chalk.green(`✅ Completed ${id}`));
|
|
156
|
+
console.log(chalk.blue(` Moved to: specs/completed/`));
|
|
157
|
+
console.log(chalk.green(` Ready for production!`));
|
|
158
|
+
// Optionally archive
|
|
159
|
+
if (!options.skipArchive) {
|
|
160
|
+
try {
|
|
161
|
+
await mkdir('specs/archive', { recursive: true });
|
|
162
|
+
await rename(completedPath, archivePath);
|
|
163
|
+
// Update state to archived
|
|
164
|
+
workflow.archiveSpec(id);
|
|
165
|
+
await tracker.addSpec(workflow.getSpec(id));
|
|
166
|
+
console.log(chalk.blue(` Archived to: specs/archive/`));
|
|
167
|
+
}
|
|
168
|
+
catch (archiveError) {
|
|
169
|
+
console.log(chalk.yellow(` ⚠️ Could not archive: ${archiveError.message}`));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Generate completion summary
|
|
173
|
+
const summary = generateCompletionSummary(id, qaReport, spec);
|
|
174
|
+
console.log(chalk.blue('\n Completion Summary:'));
|
|
175
|
+
console.log(chalk.gray(` Duration: ${calculateDuration(spec)}`));
|
|
176
|
+
console.log(chalk.gray(` Test Coverage: ${qaReport.coverage.statements}% statements`));
|
|
177
|
+
console.log(chalk.gray(` Issues Found: ${qaReport.issues.length}`));
|
|
178
|
+
console.log(chalk.blue('\n Next:'));
|
|
179
|
+
console.log(chalk.gray(` • Consider updating documentation`));
|
|
180
|
+
console.log(chalk.gray(` • Announce completion to team`));
|
|
181
|
+
console.log(chalk.gray(` • Create a new spec: specsafe new <feature>`));
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
spinner.fail(chalk.red(error.message));
|
|
185
|
+
if (error.message.includes('not in QA stage') || error.message.includes('Run \'specsafe qa\'')) {
|
|
186
|
+
console.log(chalk.gray(`💡 Tip: Run 'specsafe qa ${id}' to run QA validation first.`));
|
|
187
|
+
}
|
|
188
|
+
else if (error.message.includes('NO-GO')) {
|
|
189
|
+
console.log(chalk.gray(`💡 Tip: Fix the failing tests and re-run 'specsafe qa ${id}' before completing.`));
|
|
190
|
+
}
|
|
191
|
+
else if (error.message.includes('not found')) {
|
|
192
|
+
console.log(chalk.gray(`💡 Tip: Run 'specsafe new <name>' to create a spec first.`));
|
|
193
|
+
}
|
|
194
|
+
else if (error.message.includes('QA report')) {
|
|
195
|
+
console.log(chalk.gray(`💡 Tip: Run 'specsafe qa ${id}' to generate a QA report first.`));
|
|
196
|
+
}
|
|
197
|
+
process.exit(1);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
function generateCompletionSummary(id, qaReport, spec) {
|
|
201
|
+
const lines = [
|
|
202
|
+
`# Completion Summary: ${id}`,
|
|
203
|
+
'',
|
|
204
|
+
`**Completed:** ${new Date().toISOString()}`,
|
|
205
|
+
`**QA Report:** ${qaReport.id}`,
|
|
206
|
+
`**Recommendation:** ${qaReport.recommendation}`,
|
|
207
|
+
'',
|
|
208
|
+
'## Coverage',
|
|
209
|
+
`- Statements: ${qaReport.coverage.statements}%`,
|
|
210
|
+
`- Branches: ${qaReport.coverage.branches}%`,
|
|
211
|
+
`- Functions: ${qaReport.coverage.functions}%`,
|
|
212
|
+
`- Lines: ${qaReport.coverage.lines}%`,
|
|
213
|
+
'',
|
|
214
|
+
'## Issues',
|
|
215
|
+
qaReport.issues.length > 0
|
|
216
|
+
? qaReport.issues.map((i) => `- ${i.severity}: ${i.description}`).join('\n')
|
|
217
|
+
: '- No issues found',
|
|
218
|
+
'',
|
|
219
|
+
'## Notes',
|
|
220
|
+
qaReport.notes
|
|
221
|
+
];
|
|
222
|
+
return lines.join('\n');
|
|
223
|
+
}
|
|
224
|
+
function calculateDuration(spec) {
|
|
225
|
+
if (!spec.createdAt)
|
|
226
|
+
return 'Unknown';
|
|
227
|
+
const start = new Date(spec.createdAt).getTime();
|
|
228
|
+
const end = Date.now();
|
|
229
|
+
const diff = end - start;
|
|
230
|
+
const days = Math.floor(diff / (1000 * 60 * 60 * 24));
|
|
231
|
+
const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
|
|
232
|
+
if (days > 0) {
|
|
233
|
+
return `${days}d ${hours}h`;
|
|
234
|
+
}
|
|
235
|
+
return `${hours}h`;
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=done.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"done.js","sourceRoot":"","sources":["../../src/commands/done.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explore.d.ts","sourceRoot":"","sources":["../../src/commands/explore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,eAAO,MAAM,cAAc,SAkQvB,CAAC"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { input, editor, select, confirm } from '@inquirer/prompts';
|
|
5
|
+
import { mkdir, writeFile } from 'fs/promises';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
export const exploreCommand = new Command('explore')
|
|
8
|
+
.description('Explore ideas before creating a spec')
|
|
9
|
+
.argument('[topic]', 'Topic or idea to explore')
|
|
10
|
+
.option('-t, --template <type>', 'Exploration template', 'general')
|
|
11
|
+
.action(async (topic, options) => {
|
|
12
|
+
const spinner = ora('Starting exploration session...').start();
|
|
13
|
+
try {
|
|
14
|
+
spinner.stop();
|
|
15
|
+
console.log(chalk.blue('\n🔍 SpecSafe Exploration Mode\n'));
|
|
16
|
+
console.log(chalk.gray('Think through ideas before committing to a spec.\n'));
|
|
17
|
+
// Get the topic if not provided
|
|
18
|
+
let explorationTopic = topic;
|
|
19
|
+
if (!explorationTopic) {
|
|
20
|
+
explorationTopic = await input({
|
|
21
|
+
message: 'What idea or feature do you want to explore?',
|
|
22
|
+
validate: (value) => value.length > 0 || 'Please provide a topic'
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
console.log(chalk.blue(`\nExploring: ${explorationTopic}\n`));
|
|
26
|
+
// Choose exploration approach
|
|
27
|
+
const approach = await select({
|
|
28
|
+
message: 'What aspect do you want to focus on?',
|
|
29
|
+
choices: [
|
|
30
|
+
{
|
|
31
|
+
name: 'Technical Feasibility',
|
|
32
|
+
value: 'feasibility',
|
|
33
|
+
description: 'Evaluate if this is technically possible'
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'User Impact',
|
|
37
|
+
value: 'impact',
|
|
38
|
+
description: 'Understand how users would benefit'
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'Implementation Approaches',
|
|
42
|
+
value: 'approaches',
|
|
43
|
+
description: 'Compare different ways to build this'
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'Risk Assessment',
|
|
47
|
+
value: 'risks',
|
|
48
|
+
description: 'Identify potential problems and mitigations'
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: 'Free-form Exploration',
|
|
52
|
+
value: 'freeform',
|
|
53
|
+
description: 'Open-ended exploration'
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
});
|
|
57
|
+
const result = {
|
|
58
|
+
idea: explorationTopic,
|
|
59
|
+
approach: '',
|
|
60
|
+
pros: [],
|
|
61
|
+
cons: [],
|
|
62
|
+
alternatives: [],
|
|
63
|
+
recommendation: 'proceed',
|
|
64
|
+
nextSteps: []
|
|
65
|
+
};
|
|
66
|
+
// Guided prompts based on approach
|
|
67
|
+
switch (approach) {
|
|
68
|
+
case 'feasibility':
|
|
69
|
+
result.approach = await editor({
|
|
70
|
+
message: 'Describe the proposed solution:',
|
|
71
|
+
default: `# ${explorationTopic}\n\n## Proposed Solution\n\n[Describe your idea here]\n\n## Technical Considerations\n\n- What technologies would be needed?\n- What are the integration points?\n- Are there any blockers?`
|
|
72
|
+
});
|
|
73
|
+
break;
|
|
74
|
+
case 'impact':
|
|
75
|
+
result.approach = await editor({
|
|
76
|
+
message: 'Describe the user impact:',
|
|
77
|
+
default: `# ${explorationTopic}\n\n## Target Users\n\n[Who benefits from this?]\n\n## Problem Being Solved\n\n[What pain point does this address?]\n\n## Expected Outcomes\n\n[What changes for the user?]`
|
|
78
|
+
});
|
|
79
|
+
break;
|
|
80
|
+
case 'approaches':
|
|
81
|
+
result.approach = await editor({
|
|
82
|
+
message: 'Compare different approaches:',
|
|
83
|
+
default: `# ${explorationTopic}\n\n## Option 1: [Name]\n\nDescription...\n\nPros:\n- \n\nCons:\n- \n\n## Option 2: [Name]\n\nDescription...\n\nPros:\n- \n\nCons:\n- `
|
|
84
|
+
});
|
|
85
|
+
break;
|
|
86
|
+
case 'risks':
|
|
87
|
+
result.approach = await editor({
|
|
88
|
+
message: 'Identify risks and mitigations:',
|
|
89
|
+
default: `# ${explorationTopic}\n\n## Potential Risks\n\n| Risk | Probability | Impact | Mitigation |\n|------|-------------|--------|------------|\n| | | | |\n\n## Dependencies\n\n- What does this depend on?\n- What depends on this?\n\n## Unknowns\n\n[What don't we know yet?]`
|
|
90
|
+
});
|
|
91
|
+
break;
|
|
92
|
+
case 'freeform':
|
|
93
|
+
default:
|
|
94
|
+
result.approach = await editor({
|
|
95
|
+
message: 'Explore your idea freely:',
|
|
96
|
+
default: explorationTopic
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
// Pros and cons
|
|
100
|
+
console.log(chalk.blue('\nPros and Cons:\n'));
|
|
101
|
+
const prosInput = await editor({
|
|
102
|
+
message: 'List the advantages/benefits:',
|
|
103
|
+
default: '- \n- \n- '
|
|
104
|
+
});
|
|
105
|
+
result.pros = prosInput.split('\n').filter(line => line.trim().startsWith('-')).map(line => line.replace(/^-\s*/, '').trim());
|
|
106
|
+
const consInput = await editor({
|
|
107
|
+
message: 'List the challenges/risks:',
|
|
108
|
+
default: '- \n- \n- '
|
|
109
|
+
});
|
|
110
|
+
result.cons = consInput.split('\n').filter(line => line.trim().startsWith('-')).map(line => line.replace(/^-\s*/, '').trim());
|
|
111
|
+
// Alternatives
|
|
112
|
+
const alternativesInput = await editor({
|
|
113
|
+
message: 'What alternatives exist?',
|
|
114
|
+
default: `- Do nothing (status quo)
|
|
115
|
+
- [Alternative approach 1]
|
|
116
|
+
- [Alternative approach 2]`
|
|
117
|
+
});
|
|
118
|
+
result.alternatives = alternativesInput.split('\n').filter(line => line.trim().startsWith('-')).map(line => line.replace(/^-\s*/, '').trim());
|
|
119
|
+
// Recommendation
|
|
120
|
+
result.recommendation = await select({
|
|
121
|
+
message: 'What is your recommendation?',
|
|
122
|
+
choices: [
|
|
123
|
+
{ name: '✅ Proceed - Create a spec', value: 'proceed' },
|
|
124
|
+
{ name: '🔄 Refine - Needs more thought', value: 'refine' },
|
|
125
|
+
{ name: '↩️ Pivot - Consider alternatives', value: 'pivot' },
|
|
126
|
+
{ name: '❌ Abort - Not worth pursuing', value: 'abort' }
|
|
127
|
+
]
|
|
128
|
+
});
|
|
129
|
+
// Next steps
|
|
130
|
+
const nextStepsInput = await editor({
|
|
131
|
+
message: 'What are the next steps?',
|
|
132
|
+
default: result.recommendation === 'proceed'
|
|
133
|
+
? `1. Create spec with: specsafe new ${explorationTopic.toLowerCase().replace(/\s+/g, '-')}\n2. Define detailed requirements\n3. Identify technical approach`
|
|
134
|
+
: `1. [Research needed]\n2. [Stakeholder input needed]\n3. [Decision needed]`
|
|
135
|
+
});
|
|
136
|
+
result.nextSteps = nextStepsInput.split('\n').filter(line => line.trim());
|
|
137
|
+
// Generate summary
|
|
138
|
+
console.log(chalk.blue('\n' + '━'.repeat(60)));
|
|
139
|
+
console.log(chalk.bold(' Exploration Summary'));
|
|
140
|
+
console.log(chalk.blue('━'.repeat(60) + '\n'));
|
|
141
|
+
console.log(chalk.white(` Topic: ${explorationTopic}`));
|
|
142
|
+
console.log(chalk.gray(` Focus: ${approach}\n`));
|
|
143
|
+
if (result.pros.length > 0) {
|
|
144
|
+
console.log(chalk.green(' Pros:'));
|
|
145
|
+
for (const pro of result.pros) {
|
|
146
|
+
console.log(chalk.green(` ✓ ${pro}`));
|
|
147
|
+
}
|
|
148
|
+
console.log();
|
|
149
|
+
}
|
|
150
|
+
if (result.cons.length > 0) {
|
|
151
|
+
console.log(chalk.red(' Cons:'));
|
|
152
|
+
for (const con of result.cons) {
|
|
153
|
+
console.log(chalk.red(` ✗ ${con}`));
|
|
154
|
+
}
|
|
155
|
+
console.log();
|
|
156
|
+
}
|
|
157
|
+
// Recommendation
|
|
158
|
+
const recColors = {
|
|
159
|
+
proceed: chalk.green.bold,
|
|
160
|
+
refine: chalk.yellow.bold,
|
|
161
|
+
pivot: chalk.blue.bold,
|
|
162
|
+
abort: chalk.red.bold
|
|
163
|
+
};
|
|
164
|
+
const recLabels = {
|
|
165
|
+
proceed: 'PROCEED',
|
|
166
|
+
refine: 'REFINE',
|
|
167
|
+
pivot: 'PIVOT',
|
|
168
|
+
abort: 'ABORT'
|
|
169
|
+
};
|
|
170
|
+
const recColor = recColors[result.recommendation];
|
|
171
|
+
const recLabel = recLabels[result.recommendation];
|
|
172
|
+
console.log(chalk.white(' Recommendation: ') + recColor(recLabel));
|
|
173
|
+
console.log();
|
|
174
|
+
if (result.nextSteps.length > 0) {
|
|
175
|
+
console.log(chalk.blue(' Next Steps:'));
|
|
176
|
+
for (const step of result.nextSteps) {
|
|
177
|
+
console.log(chalk.white(` → ${step}`));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
console.log(chalk.blue('\n' + '━'.repeat(60)));
|
|
181
|
+
// Persist exploration results to disk
|
|
182
|
+
const explorationDir = join('specs', 'exploration');
|
|
183
|
+
await mkdir(explorationDir, { recursive: true });
|
|
184
|
+
const fileSlug = explorationTopic
|
|
185
|
+
.toLowerCase()
|
|
186
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
187
|
+
.replace(/^-+|-+$/g, '') || 'exploration';
|
|
188
|
+
const timestamp = new Date().toISOString().slice(0, 10);
|
|
189
|
+
const explorationPath = join(explorationDir, `${timestamp}-${fileSlug}.md`);
|
|
190
|
+
const explorationContent = `# Exploration: ${explorationTopic}
|
|
191
|
+
|
|
192
|
+
**Date:** ${new Date().toISOString()}
|
|
193
|
+
**Focus:** ${options.template}
|
|
194
|
+
**Recommendation:** ${result.recommendation.toUpperCase()}
|
|
195
|
+
|
|
196
|
+
## Approach
|
|
197
|
+
|
|
198
|
+
${result.approach}
|
|
199
|
+
|
|
200
|
+
## Pros
|
|
201
|
+
${result.pros.map(p => `- ${p}`).join('\n') || '- None listed'}
|
|
202
|
+
|
|
203
|
+
## Cons
|
|
204
|
+
${result.cons.map(c => `- ${c}`).join('\n') || '- None listed'}
|
|
205
|
+
|
|
206
|
+
## Alternatives
|
|
207
|
+
${result.alternatives.map(a => `- ${a}`).join('\n') || '- None listed'}
|
|
208
|
+
|
|
209
|
+
## Next Steps
|
|
210
|
+
${result.nextSteps.map(s => `- ${s}`).join('\n') || '- None listed'}
|
|
211
|
+
`;
|
|
212
|
+
await writeFile(explorationPath, explorationContent, 'utf-8');
|
|
213
|
+
console.log(chalk.gray(` 💾 Saved exploration notes: ${explorationPath}`));
|
|
214
|
+
// Offer to create spec if recommended
|
|
215
|
+
if (result.recommendation === 'proceed') {
|
|
216
|
+
const shouldCreate = await confirm({
|
|
217
|
+
message: 'Create a spec now?',
|
|
218
|
+
default: true
|
|
219
|
+
});
|
|
220
|
+
if (shouldCreate) {
|
|
221
|
+
const featureName = explorationTopic.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '');
|
|
222
|
+
console.log(chalk.blue(`\nRun: specsafe new ${featureName}`));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
console.log();
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
if (error.message.includes('User force closed')) {
|
|
229
|
+
console.log(chalk.gray('\nExploration cancelled.'));
|
|
230
|
+
process.exit(0);
|
|
231
|
+
}
|
|
232
|
+
console.error(chalk.red('Error:'), error.message);
|
|
233
|
+
process.exit(1);
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
//# sourceMappingURL=explore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explore.js","sourceRoot":"","sources":["../../src/commands/explore.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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,SAgcnB,CAAC"}
|