genit-all 1.0.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/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +168 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/types/index.d.ts +21 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/ai.util.d.ts +20 -0
- package/dist/utils/ai.util.d.ts.map +1 -0
- package/dist/utils/ai.util.js +135 -0
- package/dist/utils/ai.util.js.map +1 -0
- package/dist/utils/helpers.util.d.ts +2 -0
- package/dist/utils/helpers.util.d.ts.map +1 -0
- package/dist/utils/helpers.util.js +160 -0
- package/dist/utils/helpers.util.js.map +1 -0
- package/dist/utils/openai.util.d.ts +14 -0
- package/dist/utils/openai.util.d.ts.map +1 -0
- package/dist/utils/openai.util.js +123 -0
- package/dist/utils/openai.util.js.map +1 -0
- package/dist/utils/ui.util.d.ts +34 -0
- package/dist/utils/ui.util.d.ts.map +1 -0
- package/dist/utils/ui.util.js +85 -0
- package/dist/utils/ui.util.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":""}
|
package/dist/cli/main.js
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
const prompts_1 = require("@inquirer/prompts");
|
|
41
|
+
const fs = __importStar(require("fs-extra"));
|
|
42
|
+
const path_1 = __importDefault(require("path"));
|
|
43
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
44
|
+
const ui_util_1 = require("../utils/ui.util");
|
|
45
|
+
const helpers_util_1 = require("../utils/helpers.util");
|
|
46
|
+
const ai_util_1 = require("../utils/ai.util");
|
|
47
|
+
// Load environment variables
|
|
48
|
+
dotenv_1.default.config();
|
|
49
|
+
async function main() {
|
|
50
|
+
try {
|
|
51
|
+
// Show welcome banner
|
|
52
|
+
(0, ui_util_1.showBanner)();
|
|
53
|
+
// Initialize AI Provider
|
|
54
|
+
const spinner = (0, ui_util_1.createSpinner)('Initializing AI provider...');
|
|
55
|
+
spinner.start();
|
|
56
|
+
try {
|
|
57
|
+
(0, ai_util_1.initializeAIProvider)();
|
|
58
|
+
const providerName = process.env.AI_PROVIDER || 'Gemini';
|
|
59
|
+
spinner.succeed(`AI provider initialized (${providerName})`);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
spinner.fail('Failed to initialize AI provider');
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
(0, ui_util_1.showSectionHeader)('File Generation');
|
|
66
|
+
// Main file type selection
|
|
67
|
+
const fileTypeChoices = [
|
|
68
|
+
{ name: '🐳 Docker', value: 'docker', description: 'Docker-related files' },
|
|
69
|
+
{ name: '📝 README.md', value: 'readme', description: 'Project documentation' },
|
|
70
|
+
{ name: '🚫 .gitignore', value: 'gitignore', description: 'Git ignore file' },
|
|
71
|
+
];
|
|
72
|
+
const fileType = await (0, prompts_1.select)({
|
|
73
|
+
message: 'Choose file to generate:',
|
|
74
|
+
choices: fileTypeChoices,
|
|
75
|
+
});
|
|
76
|
+
let targetFile;
|
|
77
|
+
let subType;
|
|
78
|
+
let displayName;
|
|
79
|
+
// Handle Docker sub-options
|
|
80
|
+
if (fileType === 'docker') {
|
|
81
|
+
const dockerChoices = [
|
|
82
|
+
{ name: '📦 Dockerfile', value: 'dockerfile', description: 'Container image definition' },
|
|
83
|
+
{ name: '🔧 docker-compose.yml', value: 'docker-compose', description: 'Multi-container setup' },
|
|
84
|
+
{ name: '🚫 .dockerignore', value: 'dockerignore', description: 'Docker ignore file' },
|
|
85
|
+
];
|
|
86
|
+
const dockerType = await (0, prompts_1.select)({
|
|
87
|
+
message: 'Choose Docker file:',
|
|
88
|
+
choices: dockerChoices,
|
|
89
|
+
});
|
|
90
|
+
subType = dockerType;
|
|
91
|
+
if (dockerType === 'dockerfile') {
|
|
92
|
+
targetFile = 'Dockerfile';
|
|
93
|
+
displayName = 'Dockerfile';
|
|
94
|
+
}
|
|
95
|
+
else if (dockerType === 'docker-compose') {
|
|
96
|
+
targetFile = 'docker-compose.yml';
|
|
97
|
+
displayName = 'docker-compose.yml';
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
targetFile = '.dockerignore';
|
|
101
|
+
displayName = '.dockerignore';
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else if (fileType === 'readme') {
|
|
105
|
+
targetFile = 'README.md';
|
|
106
|
+
displayName = 'README.md';
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
targetFile = '.gitignore';
|
|
110
|
+
displayName = '.gitignore';
|
|
111
|
+
}
|
|
112
|
+
const outputPath = path_1.default.join(process.cwd(), targetFile);
|
|
113
|
+
// Check if file exists
|
|
114
|
+
const fileExists = await fs.pathExists(outputPath);
|
|
115
|
+
if (fileExists) {
|
|
116
|
+
(0, ui_util_1.showWarning)(`File ${(0, ui_util_1.formatFilePath)(targetFile)} already exists`);
|
|
117
|
+
const shouldOverwrite = await (0, prompts_1.confirm)({
|
|
118
|
+
message: 'Do you want to overwrite it?',
|
|
119
|
+
default: false,
|
|
120
|
+
});
|
|
121
|
+
if (!shouldOverwrite) {
|
|
122
|
+
(0, ui_util_1.showInfo)('Generation cancelled');
|
|
123
|
+
process.exit(0);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
(0, ui_util_1.showSectionHeader)('Analyzing Project');
|
|
127
|
+
// Scan project
|
|
128
|
+
const scanSpinner = (0, ui_util_1.createSpinner)('Scanning project structure...');
|
|
129
|
+
scanSpinner.start();
|
|
130
|
+
const projectSummary = await (0, helpers_util_1.getProjectSummary)(process.cwd());
|
|
131
|
+
scanSpinner.succeed('Project structure analyzed');
|
|
132
|
+
(0, ui_util_1.showInfo)(`Found project files and dependencies`);
|
|
133
|
+
(0, ui_util_1.showSectionHeader)('Generating Content');
|
|
134
|
+
// Generate content
|
|
135
|
+
const genSpinner = (0, ui_util_1.createSpinner)(`Generating ${displayName} with AI...`);
|
|
136
|
+
genSpinner.start();
|
|
137
|
+
try {
|
|
138
|
+
const generatedContent = await (0, ai_util_1.generateContent)(fileType === 'docker' ? 'Docker' : fileType === 'readme' ? 'README.md' : '.gitignore', subType, projectSummary);
|
|
139
|
+
genSpinner.succeed(`Content generated successfully`);
|
|
140
|
+
// Write to file
|
|
141
|
+
const writeSpinner = (0, ui_util_1.createSpinner)(`Writing to ${targetFile}...`);
|
|
142
|
+
writeSpinner.start();
|
|
143
|
+
await fs.writeFile(outputPath, generatedContent, 'utf-8');
|
|
144
|
+
writeSpinner.succeed('File written successfully');
|
|
145
|
+
(0, ui_util_1.showSectionHeader)('Success');
|
|
146
|
+
(0, ui_util_1.showSuccess)(`Generated ${(0, ui_util_1.formatFilePath)(targetFile)} successfully!`);
|
|
147
|
+
(0, ui_util_1.showInfo)(`Location: ${(0, ui_util_1.formatFilePath)(outputPath)}`);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
genSpinner.fail('Failed to generate content');
|
|
151
|
+
(0, ui_util_1.showError)(`Generation failed: ${error?.message || 'Unknown error'}`);
|
|
152
|
+
process.exit(1);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
if (error.name === 'ExitPromptError') {
|
|
157
|
+
// User cancelled with Ctrl+C
|
|
158
|
+
(0, ui_util_1.showInfo)('\nOperation cancelled by user');
|
|
159
|
+
process.exit(0);
|
|
160
|
+
}
|
|
161
|
+
(0, ui_util_1.showError)(`Unexpected error: ${error?.message || 'Unknown error'}`);
|
|
162
|
+
console.error(error);
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Run the CLI
|
|
167
|
+
main();
|
|
168
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface FileGenerationOption {
|
|
2
|
+
type: 'docker' | 'readme' | 'gitignore';
|
|
3
|
+
subType?: 'dockerfile' | 'docker-compose' | 'dockerignore';
|
|
4
|
+
}
|
|
5
|
+
export interface ProjectFile {
|
|
6
|
+
path: string;
|
|
7
|
+
content: string;
|
|
8
|
+
size: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ProjectSummary {
|
|
11
|
+
structure: string[];
|
|
12
|
+
keyFiles: ProjectFile[];
|
|
13
|
+
totalFiles: number;
|
|
14
|
+
}
|
|
15
|
+
export interface GenerationConfig {
|
|
16
|
+
fileType: string;
|
|
17
|
+
subType?: string;
|
|
18
|
+
outputPath: string;
|
|
19
|
+
projectSummary: string;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IACxC,OAAO,CAAC,EAAE,YAAY,GAAG,gBAAgB,GAAG,cAAc,CAAC;CAC5D;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Provider interface
|
|
3
|
+
*/
|
|
4
|
+
interface AIProvider {
|
|
5
|
+
generateContent(prompt: string): Promise<string>;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Get the appropriate AI provider based on environment configuration
|
|
9
|
+
*/
|
|
10
|
+
export declare function initializeAIProvider(): AIProvider;
|
|
11
|
+
/**
|
|
12
|
+
* Get or initialize the AI provider
|
|
13
|
+
*/
|
|
14
|
+
export declare function getAIProvider(): AIProvider;
|
|
15
|
+
/**
|
|
16
|
+
* Generate file content using the configured AI provider
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateContent(fileType: string, subType: string | undefined, projectSummary: string): Promise<string>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=ai.util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.util.d.ts","sourceRoot":"","sources":["../../src/utils/ai.util.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,UAAU,UAAU;IAClB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAClD;AA6BD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,UAAU,CAqBjD;AAID;;GAEG;AACH,wBAAgB,aAAa,IAAI,UAAU,CAK1C;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAUjB"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initializeAIProvider = initializeAIProvider;
|
|
4
|
+
exports.getAIProvider = getAIProvider;
|
|
5
|
+
exports.generateContent = generateContent;
|
|
6
|
+
const generative_ai_1 = require("@google/generative-ai");
|
|
7
|
+
const ui_util_1 = require("./ui.util");
|
|
8
|
+
/**
|
|
9
|
+
* Google Gemini Provider
|
|
10
|
+
*/
|
|
11
|
+
class GeminiProvider {
|
|
12
|
+
client;
|
|
13
|
+
model;
|
|
14
|
+
constructor(apiKey, model = 'gemini-2.5-flash') {
|
|
15
|
+
this.client = new generative_ai_1.GoogleGenerativeAI(apiKey);
|
|
16
|
+
this.model = model;
|
|
17
|
+
}
|
|
18
|
+
async generateContent(prompt) {
|
|
19
|
+
try {
|
|
20
|
+
const model = this.client.getGenerativeModel({ model: this.model });
|
|
21
|
+
const result = await model.generateContent(prompt);
|
|
22
|
+
const response = await result.response;
|
|
23
|
+
const text = response.text();
|
|
24
|
+
return text.trim();
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
(0, ui_util_1.showError)(`Gemini API error: ${error?.message || 'Unknown error'}`);
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Get the appropriate AI provider based on environment configuration
|
|
34
|
+
*/
|
|
35
|
+
function initializeAIProvider() {
|
|
36
|
+
const provider = process.env.AI_PROVIDER?.toLowerCase() || 'gemini';
|
|
37
|
+
switch (provider) {
|
|
38
|
+
case 'gemini':
|
|
39
|
+
case 'google':
|
|
40
|
+
const geminiKey = process.env.GEMINI_API_KEY;
|
|
41
|
+
if (!geminiKey || geminiKey === 'your_api_key_here') {
|
|
42
|
+
(0, ui_util_1.showError)('GEMINI_API_KEY not found or invalid');
|
|
43
|
+
(0, ui_util_1.showWarning)('Please add your Google Gemini API key to .env');
|
|
44
|
+
(0, ui_util_1.showInfo)('Get a free key at: https://aistudio.google.com/app/apikey');
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
const geminiModel = process.env.GEMINI_MODEL || 'gemini-2.5-flash';
|
|
48
|
+
return new GeminiProvider(geminiKey, geminiModel);
|
|
49
|
+
default:
|
|
50
|
+
(0, ui_util_1.showError)(`Unknown AI provider: ${provider}`);
|
|
51
|
+
(0, ui_util_1.showWarning)('Supported providers: gemini');
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
let aiProvider = null;
|
|
56
|
+
/**
|
|
57
|
+
* Get or initialize the AI provider
|
|
58
|
+
*/
|
|
59
|
+
function getAIProvider() {
|
|
60
|
+
if (!aiProvider) {
|
|
61
|
+
aiProvider = initializeAIProvider();
|
|
62
|
+
}
|
|
63
|
+
return aiProvider;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Generate file content using the configured AI provider
|
|
67
|
+
*/
|
|
68
|
+
async function generateContent(fileType, subType, projectSummary) {
|
|
69
|
+
const provider = getAIProvider();
|
|
70
|
+
const prompt = buildPrompt(fileType, subType, projectSummary);
|
|
71
|
+
try {
|
|
72
|
+
return await provider.generateContent(prompt);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
(0, ui_util_1.showError)(`Generation failed: ${error?.message || 'Unknown error'}`);
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Build the prompt based on file type
|
|
81
|
+
*/
|
|
82
|
+
function buildPrompt(fileType, subType, projectSummary) {
|
|
83
|
+
let prompt = `You are an expert in TypeScript project setups and DevOps. Based on this project summary (structure and key files), generate a high-quality, production-ready `;
|
|
84
|
+
if (fileType === 'Docker') {
|
|
85
|
+
if (subType === 'dockerfile') {
|
|
86
|
+
prompt += `Dockerfile optimized for a Node.js/TypeScript application. Include:
|
|
87
|
+
- Multi-stage builds for production
|
|
88
|
+
- Proper layer caching
|
|
89
|
+
- Security best practices
|
|
90
|
+
- Minimal final image size
|
|
91
|
+
- Health checks if applicable`;
|
|
92
|
+
}
|
|
93
|
+
else if (subType === 'docker-compose') {
|
|
94
|
+
prompt += `docker-compose.yml file. Analyze the package.json dependencies and:
|
|
95
|
+
- Set up the main application service
|
|
96
|
+
- Add any required services (databases, redis, etc.) based on dependencies
|
|
97
|
+
- Configure proper networking
|
|
98
|
+
- Add volume mounts for development
|
|
99
|
+
- Include environment variable examples`;
|
|
100
|
+
}
|
|
101
|
+
else if (subType === 'dockerignore') {
|
|
102
|
+
prompt += `.dockerignore file to exclude unnecessary files from Docker builds. Include:
|
|
103
|
+
- node_modules
|
|
104
|
+
- Build artifacts
|
|
105
|
+
- Development files
|
|
106
|
+
- Git files
|
|
107
|
+
- Documentation that shouldn't be in the image`;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else if (fileType === 'README.md') {
|
|
111
|
+
prompt += `README.md file with comprehensive documentation including:
|
|
112
|
+
- Project title and description
|
|
113
|
+
- Features list
|
|
114
|
+
- Installation instructions
|
|
115
|
+
- Usage examples
|
|
116
|
+
- Configuration details
|
|
117
|
+
- Scripts available
|
|
118
|
+
- Project structure overview
|
|
119
|
+
- Contributing guidelines (if applicable)
|
|
120
|
+
- License information`;
|
|
121
|
+
}
|
|
122
|
+
else if (fileType === '.gitignore') {
|
|
123
|
+
prompt += `.gitignore file tailored to Node.js/TypeScript projects. Include:
|
|
124
|
+
- node_modules
|
|
125
|
+
- Build outputs (dist, build)
|
|
126
|
+
- Environment files
|
|
127
|
+
- IDE configurations
|
|
128
|
+
- OS-specific files
|
|
129
|
+
- Logs and temporary files
|
|
130
|
+
- Any project-specific patterns based on the structure`;
|
|
131
|
+
}
|
|
132
|
+
prompt += `\n\nProject Summary:\n${projectSummary}\n\nIMPORTANT: Output ONLY the file content, no explanations, no markdown code blocks, no additional text. Just the raw file content ready to be written to disk.`;
|
|
133
|
+
return prompt;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=ai.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai.util.js","sourceRoot":"","sources":["../../src/utils/ai.util.ts"],"names":[],"mappings":";;AAwCA,oDAqBC;AAOD,sCAKC;AAKD,0CAcC;AA5FD,yDAA2D;AAC3D,uCAA6D;AAS7D;;GAEG;AACH,MAAM,cAAc;IACV,MAAM,CAAqB;IAC3B,KAAK,CAAS;IAEtB,YAAY,MAAc,EAAE,QAAgB,kBAAkB;QAC5D,IAAI,CAAC,MAAM,GAAG,IAAI,kCAAkB,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAc;QAClC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;YAE7B,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAA,mBAAS,EAAC,qBAAqB,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC;YACpE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,SAAgB,oBAAoB;IAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,QAAQ,CAAC;IAEpE,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ;YACX,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;YAC7C,IAAI,CAAC,SAAS,IAAI,SAAS,KAAK,mBAAmB,EAAE,CAAC;gBACpD,IAAA,mBAAS,EAAC,qCAAqC,CAAC,CAAC;gBACjD,IAAA,qBAAW,EAAC,+CAA+C,CAAC,CAAC;gBAC7D,IAAA,kBAAQ,EAAC,2DAA2D,CAAC,CAAC;gBACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,kBAAkB,CAAC;YACnE,OAAO,IAAI,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAEpD;YACE,IAAA,mBAAS,EAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;YAC9C,IAAA,qBAAW,EAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,UAAU,GAAsB,IAAI,CAAC;AAEzC;;GAEG;AACH,SAAgB,aAAa;IAC3B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,UAAU,GAAG,oBAAoB,EAAE,CAAC;IACtC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,OAA2B,EAC3B,cAAsB;IAEtB,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAA,mBAAS,EAAC,sBAAsB,KAAK,EAAE,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC;QACrE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAClB,QAAgB,EAChB,OAA2B,EAC3B,cAAsB;IAEtB,IAAI,MAAM,GAAG,gKAAgK,CAAC;IAE9K,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;YAC7B,MAAM,IAAI;;;;;8BAKc,CAAC;QAC3B,CAAC;aAAM,IAAI,OAAO,KAAK,gBAAgB,EAAE,CAAC;YACxC,MAAM,IAAI;;;;;wCAKwB,CAAC;QACrC,CAAC;aAAM,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;YACtC,MAAM,IAAI;;;;;+CAK+B,CAAC;QAC5C,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,MAAM,IAAI;;;;;;;;;sBASQ,CAAC;IACrB,CAAC;SAAM,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QACrC,MAAM,IAAI;;;;;;;uDAOyC,CAAC;IACtD,CAAC;IAED,MAAM,IAAI,yBAAyB,cAAc,mKAAmK,CAAC;IAErN,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.util.d.ts","sourceRoot":"","sources":["../../src/utils/helpers.util.ts"],"names":[],"mappings":"AAkBA,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA+ExE"}
|
|
@@ -0,0 +1,160 @@
|
|
|
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
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.getProjectSummary = getProjectSummary;
|
|
40
|
+
const path_1 = __importDefault(require("path"));
|
|
41
|
+
const fs = __importStar(require("fs-extra"));
|
|
42
|
+
const glob_1 = require("glob");
|
|
43
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
44
|
+
const MAX_FILE_SIZE = 100 * 1024; // 100KB max per file
|
|
45
|
+
const MAX_TOTAL_SIZE = 500 * 1024; // 500KB total
|
|
46
|
+
const IMPORTANT_FILES = [
|
|
47
|
+
'package.json',
|
|
48
|
+
'tsconfig.json',
|
|
49
|
+
'README.md',
|
|
50
|
+
'src/index.ts',
|
|
51
|
+
'src/main.ts',
|
|
52
|
+
'src/app.ts',
|
|
53
|
+
'src/server.ts',
|
|
54
|
+
];
|
|
55
|
+
async function getProjectSummary(rootDir) {
|
|
56
|
+
try {
|
|
57
|
+
// Get list of files to ignore
|
|
58
|
+
const ignorePatterns = await getIgnorePatterns(rootDir);
|
|
59
|
+
// Get all files in project
|
|
60
|
+
const allFiles = await (0, glob_1.glob)('**/*', {
|
|
61
|
+
cwd: rootDir,
|
|
62
|
+
nodir: true,
|
|
63
|
+
ignore: ignorePatterns,
|
|
64
|
+
dot: true,
|
|
65
|
+
});
|
|
66
|
+
// Filter out binary files and large files
|
|
67
|
+
const textFiles = allFiles.filter(file => {
|
|
68
|
+
const ext = path_1.default.extname(file).toLowerCase();
|
|
69
|
+
const binaryExts = ['.png', '.jpg', '.jpeg', '.gif', '.ico', '.pdf', '.zip', '.tar', '.gz'];
|
|
70
|
+
return !binaryExts.includes(ext);
|
|
71
|
+
});
|
|
72
|
+
let summary = '=== PROJECT STRUCTURE ===\n\n';
|
|
73
|
+
summary += `Total files: ${textFiles.length}\n\n`;
|
|
74
|
+
summary += 'File tree:\n';
|
|
75
|
+
textFiles.slice(0, 100).forEach((file) => {
|
|
76
|
+
summary += ` ${file}\n`;
|
|
77
|
+
});
|
|
78
|
+
if (textFiles.length > 100) {
|
|
79
|
+
summary += ` ... and ${textFiles.length - 100} more files\n`;
|
|
80
|
+
}
|
|
81
|
+
summary += '\n=== KEY FILE CONTENTS ===\n\n';
|
|
82
|
+
// Read important files
|
|
83
|
+
let totalSize = 0;
|
|
84
|
+
for (const keyFile of IMPORTANT_FILES) {
|
|
85
|
+
const fullPath = path_1.default.join(rootDir, keyFile);
|
|
86
|
+
if (await fs.pathExists(fullPath)) {
|
|
87
|
+
try {
|
|
88
|
+
const stats = await fs.stat(fullPath);
|
|
89
|
+
if (stats.size < MAX_FILE_SIZE && totalSize + stats.size < MAX_TOTAL_SIZE) {
|
|
90
|
+
const content = await fs.readFile(fullPath, 'utf-8');
|
|
91
|
+
summary += `--- ${keyFile} ---\n${content}\n\n`;
|
|
92
|
+
totalSize += stats.size;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
console.log(chalk_1.default.red(`Error reading ${fullPath}: ${error}`));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Add some source files if we have room
|
|
101
|
+
const sourceFiles = textFiles.filter(f => f.startsWith('src/') &&
|
|
102
|
+
(f.endsWith('.ts') || f.endsWith('.js')) &&
|
|
103
|
+
!IMPORTANT_FILES.includes(f)).slice(0, 5);
|
|
104
|
+
for (const srcFile of sourceFiles) {
|
|
105
|
+
if (totalSize >= MAX_TOTAL_SIZE)
|
|
106
|
+
break;
|
|
107
|
+
const fullPath = path_1.default.join(rootDir, srcFile);
|
|
108
|
+
try {
|
|
109
|
+
const stats = await fs.stat(fullPath);
|
|
110
|
+
if (stats.size < MAX_FILE_SIZE) {
|
|
111
|
+
const content = await fs.readFile(fullPath, 'utf-8');
|
|
112
|
+
summary += `--- ${srcFile} ---\n${content}\n\n`;
|
|
113
|
+
totalSize += stats.size;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.log(chalk_1.default.red(`Error reading ${fullPath}: ${error}`));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return summary;
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
console.error('Error generating project summary:', error);
|
|
124
|
+
return 'Error: Could not read project structure';
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get ignore patterns from .gitignore and add defaults
|
|
129
|
+
*/
|
|
130
|
+
async function getIgnorePatterns(rootDir) {
|
|
131
|
+
const defaultIgnores = [
|
|
132
|
+
'node_modules/**',
|
|
133
|
+
'.git/**',
|
|
134
|
+
'dist/**',
|
|
135
|
+
'build/**',
|
|
136
|
+
'*.log',
|
|
137
|
+
'.env',
|
|
138
|
+
'.env.*',
|
|
139
|
+
'coverage/**',
|
|
140
|
+
'.next/**',
|
|
141
|
+
'.cache/**',
|
|
142
|
+
];
|
|
143
|
+
const gitignorePath = path_1.default.join(rootDir, '.gitignore');
|
|
144
|
+
if (await fs.pathExists(gitignorePath)) {
|
|
145
|
+
try {
|
|
146
|
+
const gitignoreContent = await fs.readFile(gitignorePath, 'utf-8');
|
|
147
|
+
const gitignorePatterns = gitignoreContent
|
|
148
|
+
.split('\n')
|
|
149
|
+
.map(line => line.trim())
|
|
150
|
+
.filter(line => line && !line.startsWith('#'))
|
|
151
|
+
.map(pattern => pattern.endsWith('/') ? `${pattern}**` : pattern);
|
|
152
|
+
return [...defaultIgnores, ...gitignorePatterns];
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
return defaultIgnores;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return defaultIgnores;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=helpers.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.util.js","sourceRoot":"","sources":["../../src/utils/helpers.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { OpenAI } from 'openai';
|
|
2
|
+
/**
|
|
3
|
+
* Initialize OpenAI client with API key validation
|
|
4
|
+
*/
|
|
5
|
+
export declare function initializeOpenAI(): OpenAI;
|
|
6
|
+
/**
|
|
7
|
+
* Get the OpenAI client instance
|
|
8
|
+
*/
|
|
9
|
+
export declare function getOpenAIClient(): OpenAI;
|
|
10
|
+
/**
|
|
11
|
+
* Generate file content using GPT-5.2
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateContent(fileType: string, subType: string | undefined, projectSummary: string): Promise<string>;
|
|
14
|
+
//# sourceMappingURL=openai.util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.util.d.ts","sourceRoot":"","sources":["../../src/utils/openai.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKhC;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAiBzC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAKxC;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CA2BjB"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initializeOpenAI = initializeOpenAI;
|
|
4
|
+
exports.getOpenAIClient = getOpenAIClient;
|
|
5
|
+
exports.generateContent = generateContent;
|
|
6
|
+
const openai_1 = require("openai");
|
|
7
|
+
const ui_util_1 = require("./ui.util");
|
|
8
|
+
let openaiClient = null;
|
|
9
|
+
/**
|
|
10
|
+
* Initialize OpenAI client with API key validation
|
|
11
|
+
*/
|
|
12
|
+
function initializeOpenAI() {
|
|
13
|
+
const apiKey = process.env.OPENAI_API_KEY;
|
|
14
|
+
if (!apiKey) {
|
|
15
|
+
(0, ui_util_1.showError)('OPENAI_API_KEY not found in environment variables');
|
|
16
|
+
(0, ui_util_1.showWarning)('Please create a .env file with your OpenAI API key');
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
if (apiKey.trim() === '' || apiKey === 'your_api_key_here') {
|
|
20
|
+
(0, ui_util_1.showError)('Invalid OPENAI_API_KEY in .env file');
|
|
21
|
+
(0, ui_util_1.showWarning)('Please add a valid OpenAI API key to your .env file');
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
openaiClient = new openai_1.OpenAI({ apiKey });
|
|
25
|
+
return openaiClient;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get the OpenAI client instance
|
|
29
|
+
*/
|
|
30
|
+
function getOpenAIClient() {
|
|
31
|
+
if (!openaiClient) {
|
|
32
|
+
return initializeOpenAI();
|
|
33
|
+
}
|
|
34
|
+
return openaiClient;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Generate file content using GPT-5.2
|
|
38
|
+
*/
|
|
39
|
+
async function generateContent(fileType, subType, projectSummary) {
|
|
40
|
+
const client = getOpenAIClient();
|
|
41
|
+
let prompt = buildPrompt(fileType, subType, projectSummary);
|
|
42
|
+
try {
|
|
43
|
+
const response = await client.chat.completions.create({
|
|
44
|
+
model: 'gpt-4o', // Using gpt-4o as gpt-5.2 may not be available yet
|
|
45
|
+
messages: [{ role: 'user', content: prompt }],
|
|
46
|
+
max_tokens: 3000,
|
|
47
|
+
temperature: 0.7,
|
|
48
|
+
});
|
|
49
|
+
return response.choices[0]?.message?.content?.trim() || '';
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error?.status === 429) {
|
|
53
|
+
(0, ui_util_1.showError)('OpenAI API quota exceeded');
|
|
54
|
+
(0, ui_util_1.showWarning)('Please check your OpenAI account billing and quota');
|
|
55
|
+
(0, ui_util_1.showWarning)('Visit: https://platform.openai.com/account/billing');
|
|
56
|
+
}
|
|
57
|
+
else if (error?.status === 401) {
|
|
58
|
+
(0, ui_util_1.showError)('Invalid OpenAI API key');
|
|
59
|
+
(0, ui_util_1.showWarning)('Please check your API key in the .env file');
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
(0, ui_util_1.showError)(`OpenAI API error: ${error?.message || 'Unknown error'}`);
|
|
63
|
+
}
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Build the prompt for GPT based on file type
|
|
69
|
+
*/
|
|
70
|
+
function buildPrompt(fileType, subType, projectSummary) {
|
|
71
|
+
let prompt = `You are an expert in TypeScript project setups and DevOps. Based on this project summary (structure and key files), generate a high-quality, production-ready `;
|
|
72
|
+
if (fileType === 'Docker') {
|
|
73
|
+
if (subType === 'Dockerfile') {
|
|
74
|
+
prompt += `Dockerfile optimized for a Node.js/TypeScript application. Include:
|
|
75
|
+
- Multi-stage builds for production
|
|
76
|
+
- Proper layer caching
|
|
77
|
+
- Security best practices
|
|
78
|
+
- Minimal final image size
|
|
79
|
+
- Health checks if applicable`;
|
|
80
|
+
}
|
|
81
|
+
else if (subType === 'docker-compose') {
|
|
82
|
+
prompt += `docker-compose.yml file. Analyze the package.json dependencies and:
|
|
83
|
+
- Set up the main application service
|
|
84
|
+
- Add any required services (databases, redis, etc.) based on dependencies
|
|
85
|
+
- Configure proper networking
|
|
86
|
+
- Add volume mounts for development
|
|
87
|
+
- Include environment variable examples`;
|
|
88
|
+
}
|
|
89
|
+
else if (subType === '.dockerignore') {
|
|
90
|
+
prompt += `.dockerignore file to exclude unnecessary files from Docker builds. Include:
|
|
91
|
+
- node_modules
|
|
92
|
+
- Build artifacts
|
|
93
|
+
- Development files
|
|
94
|
+
- Git files
|
|
95
|
+
- Documentation that shouldn't be in the image`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else if (fileType === 'README.md') {
|
|
99
|
+
prompt += `README.md file with comprehensive documentation including:
|
|
100
|
+
- Project title and description
|
|
101
|
+
- Features list
|
|
102
|
+
- Installation instructions
|
|
103
|
+
- Usage examples
|
|
104
|
+
- Configuration details
|
|
105
|
+
- Scripts available
|
|
106
|
+
- Project structure overview
|
|
107
|
+
- Contributing guidelines (if applicable)
|
|
108
|
+
- License information`;
|
|
109
|
+
}
|
|
110
|
+
else if (fileType === '.gitignore') {
|
|
111
|
+
prompt += `.gitignore file tailored to Node.js/TypeScript projects. Include:
|
|
112
|
+
- node_modules
|
|
113
|
+
- Build outputs (dist, build)
|
|
114
|
+
- Environment files
|
|
115
|
+
- IDE configurations
|
|
116
|
+
- OS-specific files
|
|
117
|
+
- Logs and temporary files
|
|
118
|
+
- Any project-specific patterns based on the structure`;
|
|
119
|
+
}
|
|
120
|
+
prompt += `\n\nProject Summary:\n${projectSummary}\n\nIMPORTANT: Output ONLY the file content, no explanations, no markdown code blocks, no additional text. Just the raw file content ready to be written to disk.`;
|
|
121
|
+
return prompt;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=openai.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.util.js","sourceRoot":"","sources":["../../src/utils/openai.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Ora } from 'ora';
|
|
2
|
+
/**
|
|
3
|
+
* Display a welcome banner
|
|
4
|
+
*/
|
|
5
|
+
export declare function showBanner(): void;
|
|
6
|
+
/**
|
|
7
|
+
* Display a success message
|
|
8
|
+
*/
|
|
9
|
+
export declare function showSuccess(message: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* Display an error message
|
|
12
|
+
*/
|
|
13
|
+
export declare function showError(message: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Display an info message
|
|
16
|
+
*/
|
|
17
|
+
export declare function showInfo(message: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* Display a warning message
|
|
20
|
+
*/
|
|
21
|
+
export declare function showWarning(message: string): void;
|
|
22
|
+
/**
|
|
23
|
+
* Create a spinner with a message
|
|
24
|
+
*/
|
|
25
|
+
export declare function createSpinner(message: string): Ora;
|
|
26
|
+
/**
|
|
27
|
+
* Display file path in a formatted way
|
|
28
|
+
*/
|
|
29
|
+
export declare function formatFilePath(filePath: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Display a section header
|
|
32
|
+
*/
|
|
33
|
+
export declare function showSectionHeader(title: string): void;
|
|
34
|
+
//# sourceMappingURL=ui.util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.util.d.ts","sourceRoot":"","sources":["../../src/utils/ui.util.ts"],"names":[],"mappings":"AAEA,OAAY,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAkBjC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAMlD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAIrD"}
|
|
@@ -0,0 +1,85 @@
|
|
|
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.showBanner = showBanner;
|
|
7
|
+
exports.showSuccess = showSuccess;
|
|
8
|
+
exports.showError = showError;
|
|
9
|
+
exports.showInfo = showInfo;
|
|
10
|
+
exports.showWarning = showWarning;
|
|
11
|
+
exports.createSpinner = createSpinner;
|
|
12
|
+
exports.formatFilePath = formatFilePath;
|
|
13
|
+
exports.showSectionHeader = showSectionHeader;
|
|
14
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
15
|
+
const boxen_1 = __importDefault(require("boxen"));
|
|
16
|
+
const ora_1 = __importDefault(require("ora"));
|
|
17
|
+
/**
|
|
18
|
+
* Display a welcome banner
|
|
19
|
+
*/
|
|
20
|
+
function showBanner() {
|
|
21
|
+
const banner = chalk_1.default.bold.cyan(`
|
|
22
|
+
██████╗ ███████╗███╗ ██╗██╗████████╗ █████╗ ██╗ ██╗
|
|
23
|
+
██╔════╝ ██╔════╝████╗ ██║██║╚══██╔══╝ ██╔══██╗██║ ██║
|
|
24
|
+
██║ ███╗█████╗ ██╔██╗ ██║██║ ██║ █████╗███████║██║ ██║
|
|
25
|
+
██║ ██║██╔══╝ ██║╚██╗██║██║ ██║ ╚════╝██╔══██║██║ ██║
|
|
26
|
+
╚██████╔╝███████╗██║ ╚████║██║ ██║ ██║ ██║███████╗███████╗
|
|
27
|
+
╚═════╝ ╚══════╝╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝
|
|
28
|
+
`);
|
|
29
|
+
const subtitle = chalk_1.default.gray('File generator for TypeScript projects');
|
|
30
|
+
console.log((0, boxen_1.default)(banner + '\n' + subtitle, {
|
|
31
|
+
padding: 1,
|
|
32
|
+
margin: 1,
|
|
33
|
+
borderStyle: 'round',
|
|
34
|
+
borderColor: 'cyan',
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Display a success message
|
|
39
|
+
*/
|
|
40
|
+
function showSuccess(message) {
|
|
41
|
+
console.log(chalk_1.default.green('✓') + ' ' + chalk_1.default.bold(message));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Display an error message
|
|
45
|
+
*/
|
|
46
|
+
function showError(message) {
|
|
47
|
+
console.log(chalk_1.default.red('✗') + ' ' + chalk_1.default.bold.red(message));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Display an info message
|
|
51
|
+
*/
|
|
52
|
+
function showInfo(message) {
|
|
53
|
+
console.log(chalk_1.default.blue('ℹ') + ' ' + chalk_1.default.cyan(message));
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Display a warning message
|
|
57
|
+
*/
|
|
58
|
+
function showWarning(message) {
|
|
59
|
+
console.log(chalk_1.default.yellow('⚠') + ' ' + chalk_1.default.yellow(message));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Create a spinner with a message
|
|
63
|
+
*/
|
|
64
|
+
function createSpinner(message) {
|
|
65
|
+
return (0, ora_1.default)({
|
|
66
|
+
text: message,
|
|
67
|
+
color: 'cyan',
|
|
68
|
+
spinner: 'dots',
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Display file path in a formatted way
|
|
73
|
+
*/
|
|
74
|
+
function formatFilePath(filePath) {
|
|
75
|
+
return chalk_1.default.underline.cyan(filePath);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Display a section header
|
|
79
|
+
*/
|
|
80
|
+
function showSectionHeader(title) {
|
|
81
|
+
console.log('\n' + chalk_1.default.bold.magenta('━'.repeat(50)));
|
|
82
|
+
console.log(chalk_1.default.bold.magenta(` ${title}`));
|
|
83
|
+
console.log(chalk_1.default.bold.magenta('━'.repeat(50)) + '\n');
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=ui.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.util.js","sourceRoot":"","sources":["../../src/utils/ui.util.ts"],"names":[],"mappings":";;;;;AAOA,gCAkBC;AAKD,kCAEC;AAKD,8BAEC;AAKD,4BAEC;AAKD,kCAEC;AAKD,sCAMC;AAKD,wCAEC;AAKD,8CAIC;AAhFD,kDAA0B;AAC1B,kDAA0B;AAC1B,8CAA+B;AAE/B;;GAEG;AACH,SAAgB,UAAU;IACxB,MAAM,MAAM,GAAG,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;GAO9B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,eAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAEtE,OAAO,CAAC,GAAG,CAAC,IAAA,eAAK,EAAC,MAAM,GAAG,IAAI,GAAG,QAAQ,EAAE;QAC1C,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,CAAC;QACT,WAAW,EAAE,OAAO;QACpB,WAAW,EAAE,MAAM;KACpB,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,OAAe;IACzC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAC,OAAe;IACvC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,SAAgB,QAAQ,CAAC,OAAe;IACtC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,OAAe;IACzC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,eAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,OAAe;IAC3C,OAAO,IAAA,aAAG,EAAC;QACT,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,MAAM;KAChB,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,QAAgB;IAC7C,OAAO,eAAK,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACzD,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "genit-all",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "AI-powered file generator for TypeScript projects - generates Dockerfiles, README, .gitignore and more",
|
|
5
|
+
"main": "dist/cli/main.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"genit-all": "dist/cli/main.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"dev": "ts-node src/cli/main.ts",
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"start": "node dist/cli/main.js",
|
|
13
|
+
"prepublishOnly": "npm run build",
|
|
14
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"cli",
|
|
18
|
+
"typescript",
|
|
19
|
+
"ai",
|
|
20
|
+
"gemini",
|
|
21
|
+
"generator",
|
|
22
|
+
"dockerfile",
|
|
23
|
+
"readme",
|
|
24
|
+
"gitignore",
|
|
25
|
+
"code-generation",
|
|
26
|
+
"devtools"
|
|
27
|
+
],
|
|
28
|
+
"author": "King Faithful <faithfuleromosele001@gmail.com>",
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "https://github.com/Faithful001/genit-all.git"
|
|
33
|
+
},
|
|
34
|
+
"type": "commonjs",
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/fs-extra": "^11.0.4",
|
|
37
|
+
"@types/glob": "^8.1.0",
|
|
38
|
+
"@types/ignore-walk": "^4.0.3",
|
|
39
|
+
"@types/inquirer": "^9.0.9",
|
|
40
|
+
"@types/node": "^25.0.3",
|
|
41
|
+
"ts-node": "^10.9.2",
|
|
42
|
+
"typescript": "^5.9.3"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@google/generative-ai": "^0.24.1",
|
|
46
|
+
"@inquirer/prompts": "^7.10.1",
|
|
47
|
+
"boxen": "^7.1.1",
|
|
48
|
+
"chalk": "^5.6.2",
|
|
49
|
+
"commander": "^14.0.2",
|
|
50
|
+
"dotenv": "^17.2.3",
|
|
51
|
+
"fs-extra": "^11.3.3",
|
|
52
|
+
"glob": "^13.0.0",
|
|
53
|
+
"ignore-walk": "^8.0.0",
|
|
54
|
+
"inquirer": "^13.1.0",
|
|
55
|
+
"ora": "^8.2.0"
|
|
56
|
+
}
|
|
57
|
+
}
|