specpilot 1.1.2 → 1.1.3
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 +10 -1
- 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 +132 -0
- package/dist/commands/add-specs.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +86 -2
- package/dist/commands/init.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/specGenerator.d.ts +21 -0
- package/dist/utils/specGenerator.d.ts.map +1 -1
- package/dist/utils/specGenerator.js +14 -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
|
|
@@ -256,10 +262,13 @@ ai-context:
|
|
|
256
262
|
|
|
257
263
|
- **Flexible Structure**: Generates `.specs` with customizable, production-ready layout
|
|
258
264
|
- **Language Support**: Templates for TypeScript and Python
|
|
265
|
+
- **Existing Project Support**: Add `.specs` to existing projects with `add-specs` command
|
|
266
|
+
- **Intelligent Analysis**: Auto-detect language/framework, scan TODOs/FIXMEs, analyze tests
|
|
259
267
|
- **Spec Validation**: Built-in validation with optional auto-fix
|
|
260
268
|
- **AI Integration**: Dedicated prompts tracking for development cycles
|
|
261
269
|
- **Migration Support**: Helps transition older structures
|
|
262
270
|
- **Template Listing**: Discover available language/framework combinations
|
|
271
|
+
- **Developer Attribution**: Prompts for developer name and personalizes generated specs
|
|
263
272
|
|
|
264
273
|
## Project Structure
|
|
265
274
|
|
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,iBA+H7D"}
|
|
@@ -0,0 +1,132 @@
|
|
|
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 steps:'));
|
|
111
|
+
console.log(` # Review and customize your specs:`);
|
|
112
|
+
console.log(` ${chalk_1.default.dim('cd')} .specs`);
|
|
113
|
+
console.log(` ${chalk_1.default.dim('#')} Edit project/requirements.md`);
|
|
114
|
+
console.log(` ${chalk_1.default.dim('#')} Update project/project.yaml`);
|
|
115
|
+
if (analysis && analysis.todos.length > 0) {
|
|
116
|
+
console.log(` ${chalk_1.default.dim('#')} Check planning/tasks.md for discovered TODOs`);
|
|
117
|
+
}
|
|
118
|
+
console.log(` \n specpilot validate ${chalk_1.default.dim('# Validate your specifications')}`);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
logger.error(`❌ Failed to add specs: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function getFrameworksForLanguage(language) {
|
|
126
|
+
const frameworks = {
|
|
127
|
+
typescript: ['react', 'express', 'next', 'nest', 'vue', 'angular'],
|
|
128
|
+
python: ['fastapi', 'django', 'flask', 'streamlit']
|
|
129
|
+
};
|
|
130
|
+
return frameworks[language] || [];
|
|
131
|
+
}
|
|
132
|
+
//# 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,iBAqInE"}
|
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,7 +146,8 @@ 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}`);
|
|
@@ -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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"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CodeAnalyzer = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
class CodeAnalyzer {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.excludeDirs = ['node_modules', 'dist', 'build', '.git', '__pycache__', 'venv', '.venv', 'env'];
|
|
9
|
+
this.codeExtensions = ['.ts', '.tsx', '.js', '.jsx', '.py', '.java', '.go', '.rs'];
|
|
10
|
+
}
|
|
11
|
+
async analyzeCodebase(projectDir = process.cwd()) {
|
|
12
|
+
return {
|
|
13
|
+
todos: this.findTodos(projectDir),
|
|
14
|
+
tests: this.analyzeTests(projectDir),
|
|
15
|
+
architecture: this.extractArchitecture(projectDir)
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
findTodos(dir, todos = []) {
|
|
19
|
+
try {
|
|
20
|
+
const items = (0, fs_1.readdirSync)(dir);
|
|
21
|
+
for (const item of items) {
|
|
22
|
+
const fullPath = (0, path_1.join)(dir, item);
|
|
23
|
+
try {
|
|
24
|
+
const stat = (0, fs_1.statSync)(fullPath);
|
|
25
|
+
if (stat.isDirectory()) {
|
|
26
|
+
if (!this.excludeDirs.includes(item)) {
|
|
27
|
+
this.findTodos(fullPath, todos);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else if (this.codeExtensions.includes((0, path_1.extname)(item))) {
|
|
31
|
+
const content = (0, fs_1.readFileSync)(fullPath, 'utf-8');
|
|
32
|
+
const lines = content.split('\n');
|
|
33
|
+
lines.forEach((line, index) => {
|
|
34
|
+
const todoMatch = line.match(/\/\/\s*(TODO|FIXME|HACK|NOTE):?\s*(.+)/i) ||
|
|
35
|
+
line.match(/#\s*(TODO|FIXME|HACK|NOTE):?\s*(.+)/i);
|
|
36
|
+
if (todoMatch) {
|
|
37
|
+
todos.push({
|
|
38
|
+
file: fullPath.replace(dir + '/', ''),
|
|
39
|
+
line: index + 1,
|
|
40
|
+
type: todoMatch[1].toUpperCase(),
|
|
41
|
+
text: todoMatch[2].trim()
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
// Skip files that can't be read
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
// Skip directories that can't be read
|
|
55
|
+
}
|
|
56
|
+
return todos;
|
|
57
|
+
}
|
|
58
|
+
analyzeTests(dir) {
|
|
59
|
+
const testFiles = [];
|
|
60
|
+
let testCount = 0;
|
|
61
|
+
let hasE2E = false;
|
|
62
|
+
let hasUnit = false;
|
|
63
|
+
let hasIntegration = false;
|
|
64
|
+
let framework;
|
|
65
|
+
this.findTestFiles(dir, testFiles);
|
|
66
|
+
// Detect test framework
|
|
67
|
+
if (testFiles.some(f => f.includes('.spec.') || f.includes('.test.'))) {
|
|
68
|
+
framework = this.detectTestFramework(dir);
|
|
69
|
+
}
|
|
70
|
+
// Count tests and categorize
|
|
71
|
+
testFiles.forEach(file => {
|
|
72
|
+
try {
|
|
73
|
+
const content = (0, fs_1.readFileSync)((0, path_1.join)(dir, file), 'utf-8');
|
|
74
|
+
// Count test cases
|
|
75
|
+
const testMatches = content.match(/\b(test|it|describe)\s*\(/g);
|
|
76
|
+
if (testMatches) {
|
|
77
|
+
testCount += testMatches.length;
|
|
78
|
+
}
|
|
79
|
+
// Categorize tests
|
|
80
|
+
if (file.includes('e2e') || file.includes('integration')) {
|
|
81
|
+
hasE2E = true;
|
|
82
|
+
}
|
|
83
|
+
else if (file.includes('integration')) {
|
|
84
|
+
hasIntegration = true;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
hasUnit = true;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
// Skip files that can't be read
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
framework,
|
|
96
|
+
testFiles,
|
|
97
|
+
testCount,
|
|
98
|
+
hasE2E,
|
|
99
|
+
hasUnit,
|
|
100
|
+
hasIntegration
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
findTestFiles(dir, testFiles) {
|
|
104
|
+
try {
|
|
105
|
+
const items = (0, fs_1.readdirSync)(dir);
|
|
106
|
+
for (const item of items) {
|
|
107
|
+
const fullPath = (0, path_1.join)(dir, item);
|
|
108
|
+
try {
|
|
109
|
+
const stat = (0, fs_1.statSync)(fullPath);
|
|
110
|
+
if (stat.isDirectory()) {
|
|
111
|
+
if (!this.excludeDirs.includes(item)) {
|
|
112
|
+
this.findTestFiles(fullPath, testFiles);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else if (this.isTestFile(item)) {
|
|
116
|
+
testFiles.push(fullPath.replace(dir + '/', ''));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
// Skip directories that can't be read
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
isTestFile(filename) {
|
|
129
|
+
return filename.includes('.test.') ||
|
|
130
|
+
filename.includes('.spec.') ||
|
|
131
|
+
filename.includes('_test.') ||
|
|
132
|
+
filename.startsWith('test_');
|
|
133
|
+
}
|
|
134
|
+
detectTestFramework(dir) {
|
|
135
|
+
try {
|
|
136
|
+
const packageJsonPath = (0, path_1.join)(dir, 'package.json');
|
|
137
|
+
if ((0, fs_1.statSync)(packageJsonPath).isFile()) {
|
|
138
|
+
const pkg = JSON.parse((0, fs_1.readFileSync)(packageJsonPath, 'utf-8'));
|
|
139
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
140
|
+
if (deps.jest)
|
|
141
|
+
return 'jest';
|
|
142
|
+
if (deps.mocha)
|
|
143
|
+
return 'mocha';
|
|
144
|
+
if (deps.vitest)
|
|
145
|
+
return 'vitest';
|
|
146
|
+
if (deps.jasmine)
|
|
147
|
+
return 'jasmine';
|
|
148
|
+
if (deps.cypress)
|
|
149
|
+
return 'cypress';
|
|
150
|
+
if (deps.playwright)
|
|
151
|
+
return 'playwright';
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
// No package.json or can't read it
|
|
156
|
+
}
|
|
157
|
+
// Check for Python test frameworks
|
|
158
|
+
try {
|
|
159
|
+
const requirementsPath = (0, path_1.join)(dir, 'requirements.txt');
|
|
160
|
+
if ((0, fs_1.statSync)(requirementsPath).isFile()) {
|
|
161
|
+
const content = (0, fs_1.readFileSync)(requirementsPath, 'utf-8');
|
|
162
|
+
if (content.includes('pytest'))
|
|
163
|
+
return 'pytest';
|
|
164
|
+
if (content.includes('unittest'))
|
|
165
|
+
return 'unittest';
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
// No requirements.txt
|
|
170
|
+
}
|
|
171
|
+
return undefined;
|
|
172
|
+
}
|
|
173
|
+
extractArchitecture(dir) {
|
|
174
|
+
const components = [];
|
|
175
|
+
const fileTypes = {};
|
|
176
|
+
const directories = this.buildDirectoryTree(dir, components, fileTypes);
|
|
177
|
+
return {
|
|
178
|
+
components: [...new Set(components)],
|
|
179
|
+
directories,
|
|
180
|
+
fileTypes
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
buildDirectoryTree(dir, components, fileTypes, depth = 0, prefix = '') {
|
|
184
|
+
let result = '';
|
|
185
|
+
if (depth > 3)
|
|
186
|
+
return result; // Limit recursion depth
|
|
187
|
+
try {
|
|
188
|
+
const items = (0, fs_1.readdirSync)(dir);
|
|
189
|
+
for (const item of items) {
|
|
190
|
+
const fullPath = (0, path_1.join)(dir, item);
|
|
191
|
+
try {
|
|
192
|
+
const stat = (0, fs_1.statSync)(fullPath);
|
|
193
|
+
if (stat.isDirectory()) {
|
|
194
|
+
if (!this.excludeDirs.includes(item)) {
|
|
195
|
+
result += `${prefix}${item}/\n`;
|
|
196
|
+
result += this.buildDirectoryTree(fullPath, components, fileTypes, depth + 1, prefix + ' ');
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
const ext = (0, path_1.extname)(item);
|
|
201
|
+
if (this.codeExtensions.includes(ext)) {
|
|
202
|
+
fileTypes[ext] = (fileTypes[ext] || 0) + 1;
|
|
203
|
+
// Extract component names (files that might be components)
|
|
204
|
+
if (item.match(/component|service|controller|model|view|page/i)) {
|
|
205
|
+
components.push(item.replace(ext, ''));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// Add files to tree
|
|
209
|
+
result += `${prefix}${item}\n`;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
// Skip directories that can't be read
|
|
219
|
+
}
|
|
220
|
+
return result;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
exports.CodeAnalyzer = CodeAnalyzer;
|
|
224
|
+
//# sourceMappingURL=codeAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codeAnalyzer.js","sourceRoot":"","sources":["../../src/utils/codeAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface ProjectInfo {
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
language: string;
|
|
5
|
+
framework?: string;
|
|
6
|
+
author?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
dependencies: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare class ProjectDetector {
|
|
11
|
+
detectProject(projectDir?: string): Promise<ProjectInfo | null>;
|
|
12
|
+
private detectNodeProject;
|
|
13
|
+
private detectPythonProject;
|
|
14
|
+
private detectLanguage;
|
|
15
|
+
private detectFramework;
|
|
16
|
+
private detectPythonFramework;
|
|
17
|
+
private extractAuthor;
|
|
18
|
+
private extractPythonDependencies;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=projectDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectDetector.d.ts","sourceRoot":"","sources":["../../src/utils/projectDetector.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,qBAAa,eAAe;IACpB,aAAa,CAAC,UAAU,GAAE,MAAsB,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAuBpF,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,mBAAmB;IA0C3B,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,yBAAyB;CAiBlC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProjectDetector = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
class ProjectDetector {
|
|
7
|
+
async detectProject(projectDir = process.cwd()) {
|
|
8
|
+
// Try to detect Node.js/TypeScript project
|
|
9
|
+
const packageJsonPath = (0, path_1.join)(projectDir, 'package.json');
|
|
10
|
+
if ((0, fs_1.existsSync)(packageJsonPath)) {
|
|
11
|
+
return this.detectNodeProject(packageJsonPath);
|
|
12
|
+
}
|
|
13
|
+
// Try to detect Python project
|
|
14
|
+
const setupPyPath = (0, path_1.join)(projectDir, 'setup.py');
|
|
15
|
+
const pyprojectPath = (0, path_1.join)(projectDir, 'pyproject.toml');
|
|
16
|
+
const requirementsPath = (0, path_1.join)(projectDir, 'requirements.txt');
|
|
17
|
+
if ((0, fs_1.existsSync)(pyprojectPath)) {
|
|
18
|
+
return this.detectPythonProject(pyprojectPath, 'pyproject.toml');
|
|
19
|
+
}
|
|
20
|
+
else if ((0, fs_1.existsSync)(setupPyPath)) {
|
|
21
|
+
return this.detectPythonProject(setupPyPath, 'setup.py');
|
|
22
|
+
}
|
|
23
|
+
else if ((0, fs_1.existsSync)(requirementsPath)) {
|
|
24
|
+
return this.detectPythonProject(requirementsPath, 'requirements.txt');
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
detectNodeProject(packageJsonPath) {
|
|
29
|
+
const pkg = JSON.parse((0, fs_1.readFileSync)(packageJsonPath, 'utf-8'));
|
|
30
|
+
return {
|
|
31
|
+
name: pkg.name || 'unknown-project',
|
|
32
|
+
version: pkg.version || '1.0.0',
|
|
33
|
+
language: this.detectLanguage(pkg),
|
|
34
|
+
framework: this.detectFramework(pkg),
|
|
35
|
+
author: this.extractAuthor(pkg.author),
|
|
36
|
+
description: pkg.description || '',
|
|
37
|
+
dependencies: Object.keys(pkg.dependencies || {})
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
detectPythonProject(filePath, fileType) {
|
|
41
|
+
const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
|
|
42
|
+
if (fileType === 'pyproject.toml') {
|
|
43
|
+
// Basic TOML parsing for name and version
|
|
44
|
+
const nameMatch = content.match(/name\s*=\s*["']([^"']+)["']/);
|
|
45
|
+
const versionMatch = content.match(/version\s*=\s*["']([^"']+)["']/);
|
|
46
|
+
return {
|
|
47
|
+
name: nameMatch ? nameMatch[1] : 'unknown-project',
|
|
48
|
+
version: versionMatch ? versionMatch[1] : '1.0.0',
|
|
49
|
+
language: 'python',
|
|
50
|
+
framework: this.detectPythonFramework(content),
|
|
51
|
+
description: '',
|
|
52
|
+
dependencies: this.extractPythonDependencies(content)
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
else if (fileType === 'requirements.txt') {
|
|
56
|
+
// Parse requirements.txt
|
|
57
|
+
return {
|
|
58
|
+
name: 'unknown-project',
|
|
59
|
+
version: '1.0.0',
|
|
60
|
+
language: 'python',
|
|
61
|
+
framework: this.detectPythonFramework(content),
|
|
62
|
+
description: '',
|
|
63
|
+
dependencies: content.split('\n').filter(line => line.trim() && !line.startsWith('#'))
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// setup.py - basic parsing
|
|
68
|
+
const nameMatch = content.match(/name\s*=\s*["']([^"']+)["']/);
|
|
69
|
+
const versionMatch = content.match(/version\s*=\s*["']([^"']+)["']/);
|
|
70
|
+
return {
|
|
71
|
+
name: nameMatch ? nameMatch[1] : 'unknown-project',
|
|
72
|
+
version: versionMatch ? versionMatch[1] : '1.0.0',
|
|
73
|
+
language: 'python',
|
|
74
|
+
framework: this.detectPythonFramework(content),
|
|
75
|
+
description: '',
|
|
76
|
+
dependencies: this.extractPythonDependencies(content)
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
detectLanguage(pkg) {
|
|
81
|
+
// Check if TypeScript is in devDependencies
|
|
82
|
+
if (pkg.devDependencies?.typescript || pkg.dependencies?.typescript) {
|
|
83
|
+
return 'typescript';
|
|
84
|
+
}
|
|
85
|
+
// Check for TypeScript-specific fields or config
|
|
86
|
+
if (pkg.types || pkg.typings) {
|
|
87
|
+
return 'typescript';
|
|
88
|
+
}
|
|
89
|
+
// Default to JavaScript for Node.js projects without TypeScript
|
|
90
|
+
return 'javascript';
|
|
91
|
+
}
|
|
92
|
+
detectFramework(pkg) {
|
|
93
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
94
|
+
// React
|
|
95
|
+
if (deps.react)
|
|
96
|
+
return 'react';
|
|
97
|
+
// Next.js
|
|
98
|
+
if (deps.next)
|
|
99
|
+
return 'next';
|
|
100
|
+
// Vue
|
|
101
|
+
if (deps.vue)
|
|
102
|
+
return 'vue';
|
|
103
|
+
// Angular
|
|
104
|
+
if (deps['@angular/core'])
|
|
105
|
+
return 'angular';
|
|
106
|
+
// Express
|
|
107
|
+
if (deps.express)
|
|
108
|
+
return 'express';
|
|
109
|
+
// NestJS
|
|
110
|
+
if (deps['@nestjs/core'])
|
|
111
|
+
return 'nest';
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
detectPythonFramework(content) {
|
|
115
|
+
const lowerContent = content.toLowerCase();
|
|
116
|
+
if (lowerContent.includes('fastapi'))
|
|
117
|
+
return 'fastapi';
|
|
118
|
+
if (lowerContent.includes('django'))
|
|
119
|
+
return 'django';
|
|
120
|
+
if (lowerContent.includes('flask'))
|
|
121
|
+
return 'flask';
|
|
122
|
+
if (lowerContent.includes('streamlit'))
|
|
123
|
+
return 'streamlit';
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
extractAuthor(author) {
|
|
127
|
+
if (typeof author === 'string') {
|
|
128
|
+
return author;
|
|
129
|
+
}
|
|
130
|
+
else if (typeof author === 'object' && author.name) {
|
|
131
|
+
return author.name;
|
|
132
|
+
}
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
extractPythonDependencies(content) {
|
|
136
|
+
const deps = [];
|
|
137
|
+
const lines = content.split('\n');
|
|
138
|
+
for (const line of lines) {
|
|
139
|
+
const trimmed = line.trim();
|
|
140
|
+
if (trimmed && !trimmed.startsWith('#')) {
|
|
141
|
+
// Extract package name (before ==, >=, etc.)
|
|
142
|
+
const match = trimmed.match(/^([a-zA-Z0-9_-]+)/);
|
|
143
|
+
if (match) {
|
|
144
|
+
deps.push(match[1]);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return deps;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.ProjectDetector = ProjectDetector;
|
|
152
|
+
//# sourceMappingURL=projectDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectDetector.js","sourceRoot":"","sources":["../../src/utils/projectDetector.ts"],"names":[],"mappings":";;;AAAA,2BAA8C;AAC9C,+BAA4B;AAa5B,MAAa,eAAe;IAC1B,KAAK,CAAC,aAAa,CAAC,aAAqB,OAAO,CAAC,GAAG,EAAE;QACpD,2CAA2C;QAC3C,MAAM,eAAe,GAAG,IAAA,WAAI,EAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QACzD,IAAI,IAAA,eAAU,EAAC,eAAe,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QACjD,CAAC;QAED,+BAA+B;QAC/B,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACjD,MAAM,aAAa,GAAG,IAAA,WAAI,EAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QACzD,MAAM,gBAAgB,GAAG,IAAA,WAAI,EAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;QAE9D,IAAI,IAAA,eAAU,EAAC,aAAa,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QACnE,CAAC;aAAM,IAAI,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC3D,CAAC;aAAM,IAAI,IAAA,eAAU,EAAC,gBAAgB,CAAC,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,iBAAiB,CAAC,eAAuB;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;QAE/D,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,iBAAiB;YACnC,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,OAAO;YAC/B,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;YAClC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;YACpC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;YACtC,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE;YAClC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;SAClD,CAAC;IACJ,CAAC;IAEO,mBAAmB,CAAC,QAAgB,EAAE,QAAgB;QAC5D,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEhD,IAAI,QAAQ,KAAK,gBAAgB,EAAE,CAAC;YAClC,0CAA0C;YAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC/D,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAErE,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB;gBAClD,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;gBACjD,QAAQ,EAAE,QAAQ;gBAClB,SAAS,EAAE,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;gBAC9C,WAAW,EAAE,EAAE;gBACf,YAAY,EAAE,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC;aACtD,CAAC;QACJ,CAAC;aAAM,IAAI,QAAQ,KAAK,kBAAkB,EAAE,CAAC;YAC3C,yBAAyB;YACzB,OAAO;gBACL,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,QAAQ;gBAClB,SAAS,EAAE,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;gBAC9C,WAAW,EAAE,EAAE;gBACf,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aACvF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,2BAA2B;YAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC/D,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAErE,OAAO;gBACL,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB;gBAClD,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;gBACjD,QAAQ,EAAE,QAAQ;gBAClB,SAAS,EAAE,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;gBAC9C,WAAW,EAAE,EAAE;gBACf,YAAY,EAAE,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC;aACtD,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,GAAQ;QAC7B,4CAA4C;QAC5C,IAAI,GAAG,CAAC,eAAe,EAAE,UAAU,IAAI,GAAG,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC;YACpE,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,iDAAiD;QACjD,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC7B,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,gEAAgE;QAChE,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,eAAe,CAAC,GAAQ;QAC9B,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;QAE7D,QAAQ;QACR,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,OAAO,CAAC;QAE/B,UAAU;QACV,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,MAAM,CAAC;QAE7B,MAAM;QACN,IAAI,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QAE3B,UAAU;QACV,IAAI,IAAI,CAAC,eAAe,CAAC;YAAE,OAAO,SAAS,CAAC;QAE5C,UAAU;QACV,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAEnC,SAAS;QACT,IAAI,IAAI,CAAC,cAAc,CAAC;YAAE,OAAO,MAAM,CAAC;QAExC,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,qBAAqB,CAAC,OAAe;QAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAE3C,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QACvD,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;QACrD,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAC;QACnD,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,OAAO,WAAW,CAAC;QAE3D,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,aAAa,CAAC,MAAW;QAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC;QAChB,CAAC;aAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YACrD,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,yBAAyB,CAAC,OAAe;QAC/C,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,6CAA6C;gBAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBACjD,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA5JD,0CA4JC"}
|
|
@@ -7,6 +7,27 @@ export interface SpecGeneratorOptions {
|
|
|
7
7
|
specsName: string;
|
|
8
8
|
author?: string;
|
|
9
9
|
description?: string;
|
|
10
|
+
analysis?: {
|
|
11
|
+
todos: Array<{
|
|
12
|
+
file: string;
|
|
13
|
+
line: number;
|
|
14
|
+
text: string;
|
|
15
|
+
type: string;
|
|
16
|
+
}>;
|
|
17
|
+
tests: {
|
|
18
|
+
framework?: string;
|
|
19
|
+
testFiles: string[];
|
|
20
|
+
testCount: number;
|
|
21
|
+
hasE2E: boolean;
|
|
22
|
+
hasUnit: boolean;
|
|
23
|
+
hasIntegration: boolean;
|
|
24
|
+
};
|
|
25
|
+
architecture: {
|
|
26
|
+
components: string[];
|
|
27
|
+
directories: string;
|
|
28
|
+
fileTypes: Record<string, number>;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
10
31
|
}
|
|
11
32
|
export declare class SpecGenerator {
|
|
12
33
|
private templateEngine;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/specGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAmB,MAAM,kBAAkB,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"specGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/specGenerator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAmB,MAAM,kBAAkB,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE;QACT,KAAK,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACzE,KAAK,EAAE;YACL,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,SAAS,EAAE,MAAM,EAAE,CAAC;YACpB,SAAS,EAAE,MAAM,CAAC;YAClB,MAAM,EAAE,OAAO,CAAC;YAChB,OAAO,EAAE,OAAO,CAAC;YACjB,cAAc,EAAE,OAAO,CAAC;SACzB,CAAC;QACF,YAAY,EAAE;YACZ,UAAU,EAAE,MAAM,EAAE,CAAC;YACrB,WAAW,EAAE,MAAM,CAAC;YACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SACnC,CAAC;KACH,CAAC;CACH;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,cAAc;gBAAd,cAAc,EAAE,cAAc;IAE5C,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;YAkCnD,mBAAmB;YAUnB,sBAAsB;YAUtB,sBAAsB;YA8BtB,eAAe;YAcf,eAAe;YA8Bf,iBAAiB;YA6BjB,cAAc;YA4Bd,iBAAiB;YA2BjB,qBAAqB;YA0BrB,iBAAiB;YAwCjB,eAAe;YA0Bf,4BAA4B;CA+C3C"}
|
|
@@ -20,7 +20,8 @@ class SpecGenerator {
|
|
|
20
20
|
author: options.author || 'Your Name',
|
|
21
21
|
description: options.description || `A ${options.language} project${options.framework ? ` using ${options.framework}` : ''}`,
|
|
22
22
|
lastUpdated: '2025-10-05',
|
|
23
|
-
contributors: [options.author || 'Your Name']
|
|
23
|
+
contributors: [options.author || 'Your Name'],
|
|
24
|
+
architecture: options.analysis?.architecture
|
|
24
25
|
};
|
|
25
26
|
// Write spec files in correct subfolders
|
|
26
27
|
await this.generateProjectYaml((0, path_1.join)(specsDir, 'project'), context);
|
|
@@ -233,6 +234,18 @@ This file (prompts.md) contains ALL AI interactions for {{projectName}}. Update
|
|
|
233
234
|
|
|
234
235
|
**🚨 MANDATE**: Update with every AI interaction.
|
|
235
236
|
|
|
237
|
+
## First-Use Onboarding Prompt
|
|
238
|
+
Use the following prompt the very first time you partner with an AI agent after generating the .specs folder:
|
|
239
|
+
|
|
240
|
+
~~~
|
|
241
|
+
Act as the specification-driven co-pilot for this repository. We just generated the \`.specs/\` directory with SpecPilot SDD. Your job is to inspect the current codebase and fill in every \`.specs\` file with high-signal, implementation-aware details.
|
|
242
|
+
- First, map the project's language, framework, major modules, and any existing tests.
|
|
243
|
+
- Then propose or refine the entries for: \`project/project.yaml\`, \`project/requirements.md\`, \`architecture/architecture.md\`, \`architecture/api.yaml\`, \`planning/tasks.md\`, \`planning/roadmap.md\`, \`quality/tests.md\`, \`development/docs.md\`, \`development/context.md\`, and \`development/prompts.md\`.
|
|
244
|
+
- Capture requirements, architecture decisions, API surface, test strategy, and development context so another engineer (or AI) could continue the project confidently.
|
|
245
|
+
- Highlight any gaps or risks you uncover in the code.
|
|
246
|
+
Use markdown where appropriate, keep IDs stable (e.g., \`REQ-001\`, \`TASK-001\`), and make sure everything is internally consistent. When you're done, summarize what changed and call out anything that needs human follow-up.
|
|
247
|
+
~~~
|
|
248
|
+
|
|
236
249
|
## Cross-References
|
|
237
250
|
- Context: ./context.md
|
|
238
251
|
- Project config: ../project/project.yaml
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specGenerator.js","sourceRoot":"","sources":["../../src/utils/specGenerator.ts"],"names":[],"mappings":";;;AAAA,+BAA4B;AAC5B,2BAA8C;
|
|
1
|
+
{"version":3,"file":"specGenerator.js","sourceRoot":"","sources":["../../src/utils/specGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,11 @@ export interface TemplateContext {
|
|
|
4
4
|
framework?: string;
|
|
5
5
|
author?: string;
|
|
6
6
|
description?: string;
|
|
7
|
+
architecture?: {
|
|
8
|
+
components: string[];
|
|
9
|
+
directories: string;
|
|
10
|
+
fileTypes: Record<string, number>;
|
|
11
|
+
};
|
|
7
12
|
[key: string]: any;
|
|
8
13
|
}
|
|
9
14
|
export declare class TemplateEngine {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templateEngine.d.ts","sourceRoot":"","sources":["../../src/utils/templateEngine.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAsD;;IAMvE,OAAO,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"templateEngine.d.ts","sourceRoot":"","sources":["../../src/utils/templateEngine.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE;QACb,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAsD;;IAMvE,OAAO,CAAC,eAAe;IAcvB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAUtD,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM;IAS9D,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM;IAK1E,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAK7F,OAAO,CAAC,yBAAyB;IAsCjC,OAAO,CAAC,sBAAsB;IA8C9B,OAAO,CAAC,oBAAoB;IAmD5B,OAAO,CAAC,uBAAuB;CAiFhC"}
|
|
@@ -44,10 +44,11 @@ class TemplateEngine {
|
|
|
44
44
|
registerHelpers() {
|
|
45
45
|
// Register custom Handlebars helpers
|
|
46
46
|
Handlebars.registerHelper('uppercase', (str) => str.toUpperCase());
|
|
47
|
-
Handlebars.registerHelper('lowercase', (str) => str.
|
|
47
|
+
Handlebars.registerHelper('lowercase', (str) => str.slice(1));
|
|
48
48
|
Handlebars.registerHelper('capitalize', (str) => str.charAt(0).toUpperCase() + str.slice(1));
|
|
49
49
|
Handlebars.registerHelper('currentDate', () => new Date().toISOString().split('T')[0]);
|
|
50
50
|
Handlebars.registerHelper('currentYear', () => new Date().getFullYear());
|
|
51
|
+
Handlebars.registerHelper('join', (array, separator) => Array.isArray(array) ? array.join(separator) : '');
|
|
51
52
|
}
|
|
52
53
|
loadTemplate(templatePath, name) {
|
|
53
54
|
try {
|
|
@@ -79,13 +80,17 @@ class TemplateEngine {
|
|
|
79
80
|
const templates = {
|
|
80
81
|
// Project.yaml templates
|
|
81
82
|
'typescript-project.yaml': this.getProjectYamlTemplate('typescript'),
|
|
83
|
+
'javascript-project.yaml': this.getProjectYamlTemplate('javascript'),
|
|
82
84
|
'python-project.yaml': this.getProjectYamlTemplate('python'),
|
|
83
85
|
// Architecture templates
|
|
84
86
|
'typescript-architecture.md': this.getArchitectureTemplate('typescript'),
|
|
87
|
+
'javascript-architecture.md': this.getArchitectureTemplate('javascript'),
|
|
85
88
|
'python-architecture.md': this.getArchitectureTemplate('python'),
|
|
86
89
|
// Framework-specific variations
|
|
87
90
|
'typescript-react-project.yaml': this.getProjectYamlTemplate('typescript', 'react'),
|
|
88
91
|
'typescript-express-project.yaml': this.getProjectYamlTemplate('typescript', 'express'),
|
|
92
|
+
'javascript-react-project.yaml': this.getProjectYamlTemplate('javascript', 'react'),
|
|
93
|
+
'javascript-express-project.yaml': this.getProjectYamlTemplate('javascript', 'express'),
|
|
89
94
|
'python-django-project.yaml': this.getProjectYamlTemplate('python', 'django'),
|
|
90
95
|
'python-fastapi-project.yaml': this.getProjectYamlTemplate('python', 'fastapi'),
|
|
91
96
|
};
|
|
@@ -141,6 +146,7 @@ team:
|
|
|
141
146
|
# Build and Deployment
|
|
142
147
|
build:
|
|
143
148
|
${language === 'typescript' ? 'command: "npm run build"' : ''}
|
|
149
|
+
${language === 'javascript' ? 'command: "npm start"' : ''}
|
|
144
150
|
${language === 'python' ? 'command: "python -m build"' : ''}
|
|
145
151
|
|
|
146
152
|
# Dependencies (framework-specific)
|
|
@@ -170,6 +176,23 @@ ${this.getDependencySection(language, framework)}`;
|
|
|
170
176
|
- "@types/helmet"
|
|
171
177
|
- "typescript"
|
|
172
178
|
- "ts-node"`;
|
|
179
|
+
}
|
|
180
|
+
if (language === 'javascript' && framework === 'react') {
|
|
181
|
+
return `dependencies:
|
|
182
|
+
runtime:
|
|
183
|
+
- "react"
|
|
184
|
+
- "react-dom"
|
|
185
|
+
development:
|
|
186
|
+
- "vite"`;
|
|
187
|
+
}
|
|
188
|
+
if (language === 'javascript' && framework === 'express') {
|
|
189
|
+
return `dependencies:
|
|
190
|
+
runtime:
|
|
191
|
+
- "express"
|
|
192
|
+
- "cors"
|
|
193
|
+
- "helmet"
|
|
194
|
+
development:
|
|
195
|
+
- "nodemon"`;
|
|
173
196
|
}
|
|
174
197
|
return `dependencies:
|
|
175
198
|
runtime: []
|
|
@@ -198,15 +221,41 @@ This document outlines the architecture and design decisions for {{projectName}}
|
|
|
198
221
|
## Core Components
|
|
199
222
|
|
|
200
223
|
### Application Structure
|
|
224
|
+
{{#if architecture}}
|
|
225
|
+
{{#if architecture.directories}}
|
|
226
|
+
Based on analysis of the project structure:
|
|
227
|
+
\`\`\`
|
|
228
|
+
{{architecture.directories}}
|
|
229
|
+
\`\`\`
|
|
230
|
+
|
|
231
|
+
{{#if architecture.components}}
|
|
232
|
+
**Components found**: {{join architecture.components ", "}}
|
|
233
|
+
{{/if}}
|
|
234
|
+
|
|
235
|
+
{{#if architecture.fileTypes}}
|
|
236
|
+
**File types in project**:
|
|
237
|
+
{{#each architecture.fileTypes}}
|
|
238
|
+
- {{@key}}: {{this}} files
|
|
239
|
+
{{/each}}
|
|
240
|
+
{{/if}}
|
|
241
|
+
{{else}}
|
|
242
|
+
*Project structure analysis not available. Replace the placeholder below with your actual application structure.*
|
|
243
|
+
|
|
244
|
+
\`\`\`text
|
|
245
|
+
[ADD YOUR APPLICATION STRUCTURE TREE HERE]
|
|
201
246
|
\`\`\`
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
247
|
+
{{/if}}
|
|
248
|
+
{{else}}
|
|
249
|
+
*No architecture analysis available. This template was generated without project analysis.*
|
|
250
|
+
|
|
251
|
+
**Application structure placeholder:**
|
|
252
|
+
\`\`\`text
|
|
253
|
+
[ADD YOUR APPLICATION STRUCTURE TREE HERE]
|
|
208
254
|
\`\`\`
|
|
209
255
|
|
|
256
|
+
*Replace the placeholder with the directories and files that represent your real application structure. Include annotations for responsibilities when helpful.*
|
|
257
|
+
{{/if}}
|
|
258
|
+
|
|
210
259
|
## Design Decisions
|
|
211
260
|
|
|
212
261
|
### Decision 1: [Decision Title]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templateEngine.js","sourceRoot":"","sources":["../../src/utils/templateEngine.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uDAAyC;AACzC,2BAAkC;
|
|
1
|
+
{"version":3,"file":"templateEngine.js","sourceRoot":"","sources":["../../src/utils/templateEngine.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED