specpilot 1.1.2 ā 1.2.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/README.md +43 -5
- package/dist/cli.js +12 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/add-specs.d.ts +9 -0
- package/dist/commands/add-specs.d.ts.map +1 -0
- package/dist/commands/add-specs.js +124 -0
- package/dist/commands/add-specs.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +87 -7
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +24 -0
- package/dist/commands/migrate.js.map +1 -1
- package/dist/utils/codeAnalyzer.d.ts +37 -0
- package/dist/utils/codeAnalyzer.d.ts.map +1 -0
- package/dist/utils/codeAnalyzer.js +224 -0
- package/dist/utils/codeAnalyzer.js.map +1 -0
- package/dist/utils/projectDetector.d.ts +20 -0
- package/dist/utils/projectDetector.d.ts.map +1 -0
- package/dist/utils/projectDetector.js +152 -0
- package/dist/utils/projectDetector.js.map +1 -0
- package/dist/utils/projectMigrator.d.ts +6 -0
- package/dist/utils/projectMigrator.d.ts.map +1 -1
- package/dist/utils/projectMigrator.js +25 -0
- package/dist/utils/projectMigrator.js.map +1 -1
- package/dist/utils/specGenerator.d.ts +23 -0
- package/dist/utils/specGenerator.d.ts.map +1 -1
- package/dist/utils/specGenerator.js +138 -1
- package/dist/utils/specGenerator.js.map +1 -1
- package/dist/utils/templateEngine.d.ts +5 -0
- package/dist/utils/templateEngine.d.ts.map +1 -1
- package/dist/utils/templateEngine.js +56 -7
- package/dist/utils/templateEngine.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -128,7 +128,7 @@ npm install -g specpilot
|
|
|
128
128
|
|
|
129
129
|
```bash
|
|
130
130
|
specpilot --version
|
|
131
|
-
# Should output: 1.1.
|
|
131
|
+
# Should output: 1.1.2 (or current version)
|
|
132
132
|
|
|
133
133
|
specpilot --help
|
|
134
134
|
# Shows available commands
|
|
@@ -158,6 +158,12 @@ specpilot init my-project --no-prompts
|
|
|
158
158
|
### Additional Commands
|
|
159
159
|
|
|
160
160
|
```bash
|
|
161
|
+
# Add .specs folder to an existing project
|
|
162
|
+
specpilot add-specs
|
|
163
|
+
specpilot add-specs --lang typescript --framework react
|
|
164
|
+
specpilot add-specs --no-analysis # Skip codebase analysis
|
|
165
|
+
specpilot add-specs --no-prompts # Non-interactive mode
|
|
166
|
+
|
|
161
167
|
# Validate project specs
|
|
162
168
|
specpilot validate --verbose
|
|
163
169
|
specpilot validate --fix
|
|
@@ -165,13 +171,22 @@ specpilot validate --fix
|
|
|
165
171
|
# List available templates
|
|
166
172
|
specpilot list
|
|
167
173
|
|
|
168
|
-
# Migrate legacy structures (
|
|
174
|
+
# Migrate legacy structures (only if you have old .project-spec folder)
|
|
175
|
+
# Note: Only use this if you're upgrading from an older SpecPilot version
|
|
169
176
|
specpilot migrate --from complex --to simple --backup
|
|
170
177
|
|
|
171
178
|
# Generate or update specs from a natural language description
|
|
172
179
|
specpilot specify "A simple REST API for todos" --update
|
|
173
180
|
```
|
|
174
181
|
|
|
182
|
+
#### When to Use Which Command
|
|
183
|
+
|
|
184
|
+
- **`specpilot init <name>`** - Starting a brand new project from scratch
|
|
185
|
+
- **`specpilot add-specs`** - Adding specifications to an existing codebase
|
|
186
|
+
- **`specpilot migrate`** - Upgrading from old .project-spec structure (legacy)
|
|
187
|
+
- **`specpilot validate`** - Checking your specs for errors
|
|
188
|
+
- **`specpilot specify`** - Generating specs from natural language description
|
|
189
|
+
|
|
175
190
|
> Tip: Run `specpilot --help` or `specpilot <command> --help` for full options.
|
|
176
191
|
|
|
177
192
|
## Configuration
|
|
@@ -256,10 +271,13 @@ ai-context:
|
|
|
256
271
|
|
|
257
272
|
- **Flexible Structure**: Generates `.specs` with customizable, production-ready layout
|
|
258
273
|
- **Language Support**: Templates for TypeScript and Python
|
|
274
|
+
- **Existing Project Support**: Add `.specs` to existing projects with `add-specs` command
|
|
275
|
+
- **Intelligent Analysis**: Auto-detect language/framework, scan TODOs/FIXMEs, analyze tests
|
|
259
276
|
- **Spec Validation**: Built-in validation with optional auto-fix
|
|
260
277
|
- **AI Integration**: Dedicated prompts tracking for development cycles
|
|
261
278
|
- **Migration Support**: Helps transition older structures
|
|
262
279
|
- **Template Listing**: Discover available language/framework combinations
|
|
280
|
+
- **Developer Attribution**: Prompts for developer name and personalizes generated specs
|
|
263
281
|
|
|
264
282
|
## Project Structure
|
|
265
283
|
|
|
@@ -311,14 +329,34 @@ specpilot validate --fix
|
|
|
311
329
|
|
|
312
330
|
#### Migration Issues
|
|
313
331
|
|
|
332
|
+
**Error: "Source structure 'complex' not found"**
|
|
333
|
+
|
|
334
|
+
This means you're trying to migrate from a structure that doesn't exist in your project.
|
|
335
|
+
|
|
314
336
|
```bash
|
|
315
|
-
#
|
|
316
|
-
|
|
337
|
+
# Check what's in your project directory
|
|
338
|
+
ls -la
|
|
317
339
|
|
|
318
|
-
#
|
|
340
|
+
# For NEW projects, use:
|
|
341
|
+
specpilot init my-project
|
|
342
|
+
|
|
343
|
+
# For EXISTING projects without specs:
|
|
344
|
+
specpilot add-specs
|
|
345
|
+
|
|
346
|
+
# Only use migrate if you have an old .project-spec folder:
|
|
319
347
|
specpilot migrate --from complex --to simple --backup
|
|
320
348
|
```
|
|
321
349
|
|
|
350
|
+
**When to use migrate:**
|
|
351
|
+
- You have an old `.project-spec` folder from a previous SpecPilot version
|
|
352
|
+
- You're upgrading between SpecPilot structure versions
|
|
353
|
+
- You need to convert between specification formats
|
|
354
|
+
|
|
355
|
+
**When NOT to use migrate:**
|
|
356
|
+
- Starting a new project (use `init` instead)
|
|
357
|
+
- Adding specs to existing code (use `add-specs` instead)
|
|
358
|
+
- Your project has no specification folder yet
|
|
359
|
+
|
|
322
360
|
### Debug Mode
|
|
323
361
|
|
|
324
362
|
```bash
|
package/dist/cli.js
CHANGED
|
@@ -7,6 +7,7 @@ const validate_1 = require("./commands/validate");
|
|
|
7
7
|
const migrate_1 = require("./commands/migrate");
|
|
8
8
|
const list_1 = require("./commands/list");
|
|
9
9
|
const specify_1 = require("./commands/specify");
|
|
10
|
+
const add_specs_1 = require("./commands/add-specs");
|
|
10
11
|
const packageJson = require('../package.json');
|
|
11
12
|
commander_1.program
|
|
12
13
|
.name('specpilot')
|
|
@@ -62,6 +63,17 @@ commander_1.program
|
|
|
62
63
|
.option('--no-prompts', 'Skip interactive prompts')
|
|
63
64
|
.option('-u, --update', 'Regenerate specs with new description')
|
|
64
65
|
.action(specify_1.specifyCommand);
|
|
66
|
+
// Add-specs command
|
|
67
|
+
commander_1.program
|
|
68
|
+
.command('add-specs')
|
|
69
|
+
.alias('add')
|
|
70
|
+
.description('Add .specs folder to an existing project')
|
|
71
|
+
.option('-l, --lang <language>', 'Programming language (typescript, python)')
|
|
72
|
+
.option('-f, --framework <framework>', 'Framework (react, express, django, etc.)')
|
|
73
|
+
.option('--no-analysis', 'Skip codebase analysis')
|
|
74
|
+
.option('--deep-analysis', 'Perform thorough codebase analysis')
|
|
75
|
+
.option('--no-prompts', 'Skip interactive prompts')
|
|
76
|
+
.action(add_specs_1.addSpecsCommand);
|
|
65
77
|
// Parse command line arguments
|
|
66
78
|
commander_1.program.parse();
|
|
67
79
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,0CAA8C;AAC9C,kDAAsD;AACtD,gDAAoD;AACpD,0CAA8C;AAC9C,gDAAoD;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface AddSpecsOptions {
|
|
2
|
+
lang?: string;
|
|
3
|
+
framework?: string;
|
|
4
|
+
noAnalysis: boolean;
|
|
5
|
+
deepAnalysis: boolean;
|
|
6
|
+
prompts: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function addSpecsCommand(options: AddSpecsOptions): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=add-specs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-specs.d.ts","sourceRoot":"","sources":["../../src/commands/add-specs.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,eAAe,iBAuH7D"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.addSpecsCommand = addSpecsCommand;
|
|
7
|
+
const path_1 = require("path");
|
|
8
|
+
const fs_1 = require("fs");
|
|
9
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
11
|
+
const projectDetector_1 = require("../utils/projectDetector");
|
|
12
|
+
const codeAnalyzer_1 = require("../utils/codeAnalyzer");
|
|
13
|
+
const templateEngine_1 = require("../utils/templateEngine");
|
|
14
|
+
const specGenerator_1 = require("../utils/specGenerator");
|
|
15
|
+
const logger_1 = require("../utils/logger");
|
|
16
|
+
async function addSpecsCommand(options) {
|
|
17
|
+
const logger = new logger_1.Logger();
|
|
18
|
+
try {
|
|
19
|
+
logger.info('š Analyzing existing project...');
|
|
20
|
+
const projectDir = process.cwd();
|
|
21
|
+
const specsDir = (0, path_1.join)(projectDir, '.specs');
|
|
22
|
+
// Check if .specs already exists
|
|
23
|
+
if ((0, fs_1.existsSync)(specsDir)) {
|
|
24
|
+
logger.error('ā .specs folder already exists in this directory');
|
|
25
|
+
logger.info('š” Use `specpilot validate` to check existing specs');
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
// Detect project information
|
|
29
|
+
const detector = new projectDetector_1.ProjectDetector();
|
|
30
|
+
let projectInfo = await detector.detectProject(projectDir);
|
|
31
|
+
if (!projectInfo && !options.lang) {
|
|
32
|
+
logger.error('ā Could not auto-detect project type');
|
|
33
|
+
logger.info('š” Please specify language: --lang typescript or --lang python');
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
// Use provided options or detected values
|
|
37
|
+
const language = options.lang || projectInfo?.language || 'typescript';
|
|
38
|
+
let framework = options.framework || projectInfo?.framework;
|
|
39
|
+
// Validate language
|
|
40
|
+
const supportedLanguages = ['typescript', 'javascript', 'python'];
|
|
41
|
+
if (!supportedLanguages.includes(language)) {
|
|
42
|
+
logger.error(`ā Language "${language}" is not supported`);
|
|
43
|
+
logger.info(`š” Supported languages: ${supportedLanguages.join(', ')}`);
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
// Prompt for missing information
|
|
47
|
+
if (!framework && options.prompts) {
|
|
48
|
+
const frameworks = getFrameworksForLanguage(language);
|
|
49
|
+
if (frameworks.length > 0) {
|
|
50
|
+
const response = await inquirer_1.default.prompt([{
|
|
51
|
+
type: 'list',
|
|
52
|
+
name: 'framework',
|
|
53
|
+
message: 'Choose a framework:',
|
|
54
|
+
choices: ['none', ...frameworks]
|
|
55
|
+
}]);
|
|
56
|
+
framework = response.framework === 'none' ? undefined : response.framework;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Get developer name
|
|
60
|
+
let developerName = projectInfo?.author || 'Your Name';
|
|
61
|
+
if (options.prompts) {
|
|
62
|
+
const nameResponse = await inquirer_1.default.prompt([{
|
|
63
|
+
type: 'input',
|
|
64
|
+
name: 'developerName',
|
|
65
|
+
message: 'Enter your name (for spec file attribution):',
|
|
66
|
+
default: developerName
|
|
67
|
+
}]);
|
|
68
|
+
developerName = nameResponse.developerName.trim() || developerName;
|
|
69
|
+
}
|
|
70
|
+
// Analyze codebase if requested
|
|
71
|
+
let analysis = null;
|
|
72
|
+
if (!options.noAnalysis) {
|
|
73
|
+
logger.info('š Analyzing codebase...');
|
|
74
|
+
const analyzer = new codeAnalyzer_1.CodeAnalyzer();
|
|
75
|
+
analysis = await analyzer.analyzeCodebase(projectDir);
|
|
76
|
+
// Show analysis summary
|
|
77
|
+
if (projectInfo) {
|
|
78
|
+
logger.info(chalk_1.default.green(`ā
Detected ${projectInfo.language}${projectInfo.framework ? `/${projectInfo.framework}` : ''} project`));
|
|
79
|
+
}
|
|
80
|
+
if (analysis.todos.length > 0) {
|
|
81
|
+
logger.info(chalk_1.default.yellow(`š Found ${analysis.todos.length} TODOs/FIXMEs`));
|
|
82
|
+
}
|
|
83
|
+
if (analysis.tests.testCount > 0) {
|
|
84
|
+
logger.info(chalk_1.default.cyan(`š§Ŗ Detected ${analysis.tests.framework || 'unknown'} testing framework with ${analysis.tests.testCount} tests`));
|
|
85
|
+
}
|
|
86
|
+
if (analysis.architecture.components.length > 0) {
|
|
87
|
+
logger.info(chalk_1.default.blue(`šļø Extracted ${analysis.architecture.components.length} components`));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Initialize template engine and spec generator
|
|
91
|
+
const templateEngine = new templateEngine_1.TemplateEngine();
|
|
92
|
+
const specGenerator = new specGenerator_1.SpecGenerator(templateEngine);
|
|
93
|
+
// Generate .specs directory structure
|
|
94
|
+
const projectName = projectInfo?.name || 'my-project';
|
|
95
|
+
const description = projectInfo?.description ||
|
|
96
|
+
`A ${language} project${framework ? ` using ${framework}` : ''}`;
|
|
97
|
+
await specGenerator.generateSpecs({
|
|
98
|
+
projectName,
|
|
99
|
+
language,
|
|
100
|
+
framework,
|
|
101
|
+
targetDir: projectDir,
|
|
102
|
+
specsName: '.specs',
|
|
103
|
+
author: developerName,
|
|
104
|
+
description,
|
|
105
|
+
analysis: (!options.noAnalysis && analysis) ? analysis : undefined
|
|
106
|
+
});
|
|
107
|
+
logger.success('ā
.specs folder created successfully!');
|
|
108
|
+
logger.info(`š Location: ${specsDir}`);
|
|
109
|
+
// Show next steps
|
|
110
|
+
console.log(chalk_1.default.cyan('\nļæ½ Next: Open .specs/README.md and follow the Quick Start steps to populate your specs with AI.'));
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
logger.error(`ā Failed to add specs: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function getFrameworksForLanguage(language) {
|
|
118
|
+
const frameworks = {
|
|
119
|
+
typescript: ['react', 'express', 'next', 'nest', 'vue', 'angular'],
|
|
120
|
+
python: ['fastapi', 'django', 'flask', 'streamlit']
|
|
121
|
+
};
|
|
122
|
+
return frameworks[language] || [];
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=add-specs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-specs.js","sourceRoot":"","sources":["../../src/commands/add-specs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,iBAiInE"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
@@ -8,6 +41,7 @@ const path_1 = require("path");
|
|
|
8
41
|
const fs_1 = require("fs");
|
|
9
42
|
const chalk_1 = __importDefault(require("chalk"));
|
|
10
43
|
const inquirer_1 = __importDefault(require("inquirer"));
|
|
44
|
+
const yaml = __importStar(require("js-yaml"));
|
|
11
45
|
const templateEngine_1 = require("../utils/templateEngine");
|
|
12
46
|
const specGenerator_1 = require("../utils/specGenerator");
|
|
13
47
|
const logger_1 = require("../utils/logger");
|
|
@@ -29,7 +63,7 @@ async function initCommand(name, options) {
|
|
|
29
63
|
process.exit(1);
|
|
30
64
|
}
|
|
31
65
|
// Validate supported language
|
|
32
|
-
const supportedLanguages = ['typescript', 'python'];
|
|
66
|
+
const supportedLanguages = ['typescript', 'javascript', 'python'];
|
|
33
67
|
if (!supportedLanguages.includes(options.lang)) {
|
|
34
68
|
logger.error(`ā Language "${options.lang}" is not supported`);
|
|
35
69
|
logger.info(`š” Supported languages: ${supportedLanguages.join(', ')}`);
|
|
@@ -49,11 +83,60 @@ async function initCommand(name, options) {
|
|
|
49
83
|
framework = response.framework === 'none' ? undefined : response.framework;
|
|
50
84
|
}
|
|
51
85
|
}
|
|
86
|
+
// Get developer name for spec attribution
|
|
87
|
+
let developerName = 'Your Name'; // default
|
|
88
|
+
if (options.prompts) {
|
|
89
|
+
const nameResponse = await inquirer_1.default.prompt([{
|
|
90
|
+
type: 'input',
|
|
91
|
+
name: 'developerName',
|
|
92
|
+
message: 'Enter your name (for spec file attribution):',
|
|
93
|
+
default: 'Your Name'
|
|
94
|
+
}]);
|
|
95
|
+
developerName = nameResponse.developerName.trim() || 'Your Name';
|
|
96
|
+
}
|
|
52
97
|
// Create project directory
|
|
53
98
|
const targetDir = (0, path_1.join)(options.dir, projectName);
|
|
54
99
|
if (!(0, fs_1.existsSync)(targetDir)) {
|
|
55
100
|
(0, fs_1.mkdirSync)(targetDir, { recursive: true });
|
|
56
101
|
}
|
|
102
|
+
// Check for existing .specs folder
|
|
103
|
+
const specsDir = (0, path_1.join)(targetDir, options.specsName);
|
|
104
|
+
if ((0, fs_1.existsSync)(specsDir)) {
|
|
105
|
+
logger.error(`ā Cannot initialize: ${options.specsName} folder already exists in ${targetDir}`);
|
|
106
|
+
// Try to read existing project info
|
|
107
|
+
const projectYamlPath = (0, path_1.join)(specsDir, 'project', 'project.yaml');
|
|
108
|
+
const requirementsMdPath = (0, path_1.join)(specsDir, 'project', 'requirements.md');
|
|
109
|
+
let projectInfo = '';
|
|
110
|
+
if ((0, fs_1.existsSync)(projectYamlPath)) {
|
|
111
|
+
try {
|
|
112
|
+
const projectData = yaml.load((0, fs_1.readFileSync)(projectYamlPath, 'utf8'));
|
|
113
|
+
projectInfo += `\nš Existing Project: ${projectData.name || 'Unknown'}`;
|
|
114
|
+
projectInfo += `\nš Version: ${projectData.version || 'Unknown'}`;
|
|
115
|
+
projectInfo += `\nš» Language: ${projectData.language || 'Unknown'}`;
|
|
116
|
+
projectInfo += `\nšļø Framework: ${projectData.framework || 'Unknown'}`;
|
|
117
|
+
projectInfo += `\nš¤ Author: ${projectData.author || 'Unknown'}`;
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
projectInfo += '\nā ļø Could not read project.yaml';
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if ((0, fs_1.existsSync)(requirementsMdPath)) {
|
|
124
|
+
try {
|
|
125
|
+
const requirementsContent = (0, fs_1.readFileSync)(requirementsMdPath, 'utf8');
|
|
126
|
+
const lines = requirementsContent.split('\n').slice(0, 5); // First 5 lines
|
|
127
|
+
projectInfo += `\nš Requirements Preview:\n${lines.join('\n')}`;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
projectInfo += '\nā ļø Could not read requirements.md';
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
logger.info(chalk_1.default.yellow(projectInfo));
|
|
134
|
+
logger.info(chalk_1.default.cyan('\nš” To continue with this project:'));
|
|
135
|
+
logger.info(` cd ${targetDir}`);
|
|
136
|
+
logger.info(` specpilot validate # Check current specs`);
|
|
137
|
+
logger.info(` # Edit ${options.specsName}/project/requirements.md`);
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
57
140
|
// Initialize template engine and spec generator
|
|
58
141
|
const templateEngine = new templateEngine_1.TemplateEngine();
|
|
59
142
|
const specGenerator = new specGenerator_1.SpecGenerator(templateEngine);
|
|
@@ -63,17 +146,14 @@ async function initCommand(name, options) {
|
|
|
63
146
|
language: options.lang,
|
|
64
147
|
framework,
|
|
65
148
|
targetDir,
|
|
66
|
-
specsName: options.specsName
|
|
149
|
+
specsName: options.specsName,
|
|
150
|
+
author: developerName
|
|
67
151
|
});
|
|
68
152
|
logger.success(`ā
Project "${projectName}" initialized successfully!`);
|
|
69
153
|
logger.info(`š Location: ${targetDir}`);
|
|
70
154
|
logger.info(`š Specs: ${(0, path_1.join)(targetDir, options.specsName)}`);
|
|
71
155
|
// Show next steps
|
|
72
|
-
console.log(chalk_1.default.cyan('\n
|
|
73
|
-
console.log(` cd ${projectName}`);
|
|
74
|
-
console.log(` # Edit ${options.specsName}/requirements.md to define your project`);
|
|
75
|
-
console.log(` # Update ${options.specsName}/project.yaml with your configuration`);
|
|
76
|
-
console.log(` specpilot validate # Validate your specifications`);
|
|
156
|
+
console.log(chalk_1.default.cyan('\nš Next: Open .specs/README.md and follow the Quick Start steps to populate your specs with AI.'));
|
|
77
157
|
}
|
|
78
158
|
catch (error) {
|
|
79
159
|
logger.error(`ā Failed to initialize project: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,iBA8E3D"}
|
package/dist/commands/migrate.js
CHANGED
|
@@ -12,6 +12,30 @@ async function migrateCommand(options) {
|
|
|
12
12
|
try {
|
|
13
13
|
logger.info('š Starting project migration...');
|
|
14
14
|
const migrator = new projectMigrator_1.ProjectMigrator();
|
|
15
|
+
// Check if migration is actually needed
|
|
16
|
+
const migrationNeeded = await migrator.checkMigrationNeeded(options.dir, options.from, options.to);
|
|
17
|
+
if (!migrationNeeded.needed) {
|
|
18
|
+
if (migrationNeeded.reason === 'no_source') {
|
|
19
|
+
logger.error(`ā Source structure "${options.from}" not found in ${options.dir}`);
|
|
20
|
+
console.log(chalk_1.default.yellow('\nš” When to use migrate:'));
|
|
21
|
+
console.log(' ⢠Upgrading from old .project-spec to new .specs structure');
|
|
22
|
+
console.log(' ⢠Converting between different specification formats\n');
|
|
23
|
+
console.log(chalk_1.default.cyan('š For new projects, use:'));
|
|
24
|
+
console.log(chalk_1.default.white(' specpilot init my-project'));
|
|
25
|
+
console.log(chalk_1.default.cyan('\nš¦ For existing codebases without specs:'));
|
|
26
|
+
console.log(chalk_1.default.white(' specpilot add-specs'));
|
|
27
|
+
console.log(chalk_1.default.cyan('\nš For help:'));
|
|
28
|
+
console.log(chalk_1.default.white(' specpilot migrate --help'));
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
else if (migrationNeeded.reason === 'already_migrated') {
|
|
32
|
+
logger.info('ā
Project is already using the target structure.');
|
|
33
|
+
console.log(chalk_1.default.yellow(`\nā ļø The "${options.to}" structure already exists.`));
|
|
34
|
+
console.log(chalk_1.default.cyan('\nNext steps:'));
|
|
35
|
+
console.log(' specpilot validate # Validate your specs');
|
|
36
|
+
process.exit(0);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
15
39
|
// Validate source structure exists
|
|
16
40
|
const sourceExists = await migrator.validateSource(options.dir, options.from);
|
|
17
41
|
if (!sourceExists) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":";;;;;AAcA,
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface TodoItem {
|
|
2
|
+
file: string;
|
|
3
|
+
line: number;
|
|
4
|
+
type: 'TODO' | 'FIXME' | 'HACK' | 'NOTE';
|
|
5
|
+
text: string;
|
|
6
|
+
}
|
|
7
|
+
export interface TestInfo {
|
|
8
|
+
framework?: string;
|
|
9
|
+
testFiles: string[];
|
|
10
|
+
testCount: number;
|
|
11
|
+
hasE2E: boolean;
|
|
12
|
+
hasUnit: boolean;
|
|
13
|
+
hasIntegration: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface ArchitectureInfo {
|
|
16
|
+
components: string[];
|
|
17
|
+
directories: string;
|
|
18
|
+
fileTypes: Record<string, number>;
|
|
19
|
+
}
|
|
20
|
+
export interface AnalysisResult {
|
|
21
|
+
todos: TodoItem[];
|
|
22
|
+
tests: TestInfo;
|
|
23
|
+
architecture: ArchitectureInfo;
|
|
24
|
+
}
|
|
25
|
+
export declare class CodeAnalyzer {
|
|
26
|
+
private excludeDirs;
|
|
27
|
+
private codeExtensions;
|
|
28
|
+
analyzeCodebase(projectDir?: string): Promise<AnalysisResult>;
|
|
29
|
+
private findTodos;
|
|
30
|
+
private analyzeTests;
|
|
31
|
+
private findTestFiles;
|
|
32
|
+
private isTestFile;
|
|
33
|
+
private detectTestFramework;
|
|
34
|
+
private extractArchitecture;
|
|
35
|
+
private buildDirectoryTree;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=codeAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codeAnalyzer.d.ts","sourceRoot":"","sources":["../../src/utils/codeAnalyzer.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,YAAY,EAAE,gBAAgB,CAAC;CAChC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,WAAW,CAAoF;IACvG,OAAO,CAAC,cAAc,CAAgE;IAEhF,eAAe,CAAC,UAAU,GAAE,MAAsB,GAAG,OAAO,CAAC,cAAc,CAAC;IAQlF,OAAO,CAAC,SAAS;IA4CjB,OAAO,CAAC,YAAY;IAiDpB,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,mBAAmB;IAiC3B,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,kBAAkB;CAgD3B"}
|