promptcoder-cli
Version:
AI-powered code generation CLI tool with conversation persistence, file tools, and LLM integration
184 lines • 6.69 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.loadConfig = loadConfig;
exports.setupConfig = setupConfig;
const fs = __importStar(require("fs-extra"));
const path = __importStar(require("path"));
const os = __importStar(require("os"));
const inquirer_1 = __importDefault(require("inquirer"));
const chalk_1 = __importDefault(require("chalk"));
const dotenv_1 = require("dotenv");
(0, dotenv_1.config)();
const CONFIG_DIR = path.join(os.homedir(), '.promptcoder');
const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
async function loadConfig() {
// Try to load from environment variables first
const envConfig = loadFromEnv();
if (envConfig) {
return envConfig;
}
// Try to load from config file
const fileConfig = await loadFromFile();
if (fileConfig) {
return fileConfig;
}
// If no config found, prompt user to set it up
console.log(chalk_1.default.yellow('⚠️ No configuration found. Please set up your API keys.'));
return await setupConfig();
}
function loadFromEnv() {
const openaiKey = process.env.OPENAI_API_KEY;
const anthropicKey = process.env.ANTHROPIC_API_KEY;
if (openaiKey) {
return {
provider: 'openai',
apiKey: openaiKey,
model: process.env.OPENAI_MODEL || 'gpt-4'
};
}
if (anthropicKey) {
return {
provider: 'anthropic',
apiKey: anthropicKey,
model: process.env.ANTHROPIC_MODEL || 'claude-3-5-sonnet-20241022'
};
}
return null;
}
async function loadFromFile() {
try {
if (!(await fs.pathExists(CONFIG_FILE))) {
return null;
}
const storedConfig = await fs.readJson(CONFIG_FILE);
const provider = storedConfig.defaultProvider;
let apiKey;
let model;
if (provider === 'openai') {
apiKey = storedConfig.openaiApiKey;
model = storedConfig.defaultModel?.openai || 'gpt-4';
}
else {
apiKey = storedConfig.anthropicApiKey;
model = storedConfig.defaultModel?.anthropic || 'claude-3-sonnet-20240229';
}
if (!apiKey) {
console.log(chalk_1.default.yellow(`⚠️ No API key found for ${provider} in config file.`));
return null;
}
return { provider, apiKey, model };
}
catch (error) {
console.log(chalk_1.default.red('❌ Error loading config file:'), error);
return null;
}
}
async function setupConfig() {
console.log(chalk_1.default.blue.bold('\n🔧 CodePrompt Configuration Setup\n'));
const { provider } = await inquirer_1.default.prompt([
{
type: 'list',
name: 'provider',
message: 'Choose your preferred LLM provider:',
choices: [
{ name: 'OpenAI (GPT-4, GPT-3.5)', value: 'openai' },
{ name: 'Anthropic (Claude)', value: 'anthropic' }
]
}
]);
const { apiKey } = await inquirer_1.default.prompt([
{
type: 'password',
name: 'apiKey',
message: `Enter your ${provider === 'openai' ? 'OpenAI' : 'Anthropic'} API key:`,
validate: (input) => input.trim().length > 0 || 'API key is required'
}
]);
const defaultModels = {
openai: ['gpt-4o'],
anthropic: ['claude-3-5-sonnet-20241022']
};
const { model } = await inquirer_1.default.prompt([
{
type: 'list',
name: 'model',
message: 'Choose the model to use:',
choices: defaultModels[provider]
}
]);
const { saveToFile } = await inquirer_1.default.prompt([
{
type: 'confirm',
name: 'saveToFile',
message: 'Save this configuration to file for future use?',
default: true
}
]);
if (saveToFile) {
await saveConfig(provider, apiKey, model);
}
console.log(chalk_1.default.green('✅ Configuration completed!\n'));
return { provider, apiKey, model };
}
async function saveConfig(provider, apiKey, model) {
try {
await fs.ensureDir(CONFIG_DIR);
let storedConfig = { defaultProvider: provider };
// Load existing config if it exists
if (await fs.pathExists(CONFIG_FILE)) {
storedConfig = await fs.readJson(CONFIG_FILE);
}
// Update config
storedConfig.defaultProvider = provider;
if (provider === 'openai') {
storedConfig.openaiApiKey = apiKey;
storedConfig.defaultModel = { ...storedConfig.defaultModel, openai: model };
}
else {
storedConfig.anthropicApiKey = apiKey;
storedConfig.defaultModel = { ...storedConfig.defaultModel, anthropic: model };
}
await fs.writeJson(CONFIG_FILE, storedConfig, { spaces: 2 });
console.log(chalk_1.default.gray(`Configuration saved to ${CONFIG_FILE}`));
}
catch (error) {
console.log(chalk_1.default.red('❌ Error saving config:'), error);
}
}
//# sourceMappingURL=config.js.map