ai-x-terminal
Version:
Enhance your command-line experience with AI capabilities using OpenAI's API. Easily integrate with projects and leverage AI in the terminal.
90 lines (89 loc) • 2.87 kB
JavaScript
import fs from 'fs';
import { initializeCLI } from './cli/index.js';
import { loadAPIKey } from './utils/api-key.js';
import { streamCompletion } from './services/openai.js';
import { OpenAI } from 'openai';
import { loadConfig, saveConfig } from './config/index.js';
import { globby } from 'globby';
const excludePatterns = [
'.git/**',
'.Trash/**',
'Applications \\(Parallels\\)/**',
'Applications/**',
'Desktop/**',
'Documents/**',
'Downloads/**',
'FontBase/**',
'Library/**',
'Movies/**',
'Music/**',
'node_modules/**',
'Parallels/**',
'Pictures/**',
'Public/**',
];
async function main() {
const program = initializeCLI();
program.action(async (args, opts) => {
const apiKey = await loadAPIKey();
let config = {
persona: 'You are a helpful assistant.',
...loadConfig(),
};
if (opts.persona) {
config.persona = opts.persona;
saveConfig(config);
}
const openai = new OpenAI({ apiKey });
let prompt = args.join(' ') || 'Hello from AI Terminal!';
let fileCount = 0;
const query = prompt;
const processFiles = async (files) => {
for (const file of files) {
const fileContents = fs.readFileSync(file, 'utf-8').trim() + '\n---';
fileCount++;
prompt += `\n\n--- ${file}\n${fileContents}`;
}
};
if (opts.file) {
const files = await globby('**/*', {
gitignore: true,
ignore: excludePatterns,
});
const file = files.find((f) => f.includes(opts.file));
if (file) {
await processFiles([file]);
}
else {
console.error(`File not found: ${opts.file}`);
return;
}
}
if (opts.workspace || opts.list) {
const files = await globby(['**/*', '**/.*'], {
gitignore: true,
ignore: excludePatterns,
});
if (opts.workspace) {
await processFiles(files);
}
if (opts.list) {
fileCount = files.length;
prompt += `\n\n--- files listing ---\n${files.join('\n')}\n---------------------`;
}
}
console.log('\nPrompt:', prompt.length < 1000
? `\x1b[32m${prompt}\x1b[0m`
: `\x1b[32m${query +
'\n\n' +
'--- ' +
fileCount +
' files attached but content is not displayed as prompt is ' +
prompt.length +
' characters ---'}\x1b[0m`);
await streamCompletion(openai, prompt, config.persona);
});
program.parse();
}
main();