UNPKG

build-in-public-bot

Version:

AI-powered CLI bot for automating build-in-public tweets with code screenshots

104 lines 5.26 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.codeCommand = codeCommand; const logger_1 = require("../utils/logger"); const config_1 = require("../services/config"); const ai_1 = require("../services/ai"); const screenshot_1 = require("../services/screenshot"); const storage_1 = require("../services/storage"); const twitter_1 = require("../services/twitter"); const prompts_1 = require("../utils/prompts"); const chalk_1 = __importDefault(require("chalk")); async function codeCommand(file, caption, options) { const configService = config_1.ConfigService.getInstance(); const aiService = ai_1.AIService.getInstance(); const screenshotService = screenshot_1.ScreenshotService.getInstance(); const storageService = storage_1.StorageService.getInstance(); const twitterService = twitter_1.TwitterService.getInstance(); try { const config = await configService.load(); logger_1.logger.startSpinner('Reading code file...'); const { code, language } = await screenshotService.readCodeFile(file, options.lines); logger_1.logger.stopSpinner(true, 'Code file read successfully!'); console.log('\n' + chalk_1.default.bold('Code Preview:')); console.log(chalk_1.default.gray('─'.repeat(50))); const preview = code.split('\n').slice(0, 10).join('\n'); console.log(preview); if (code.split('\n').length > 10) { console.log(chalk_1.default.gray('... (truncated)')); } console.log(chalk_1.default.gray('─'.repeat(50))); console.log(chalk_1.default.gray(`Language: ${language}`)); console.log(chalk_1.default.gray(`Lines: ${code.split('\n').length}\n`)); let tweetText = caption; if (!tweetText) { const generateCaption = await (0, prompts_1.confirm)('No caption provided. Would you like AI to generate one?', true); if (generateCaption) { logger_1.logger.startSpinner('Generating caption with AI...'); const codeContext = `I'm sharing a ${language} code snippet that shows: ${code.substring(0, 200)}...`; tweetText = await aiService.generateTweet({ message: codeContext, includeScreenshot: false }, config); logger_1.logger.stopSpinner(true, 'Caption generated!'); } else { tweetText = await (0, prompts_1.prompt)('Enter caption for the code screenshot'); } } console.log('\n' + chalk_1.default.bold('Tweet Preview:')); console.log(chalk_1.default.cyan('─'.repeat(50))); console.log(tweetText); console.log(chalk_1.default.gray('\n[Code screenshot will be attached]')); console.log(chalk_1.default.cyan('─'.repeat(50))); console.log(chalk_1.default.gray(`Character count: ${tweetText.length}/280\n`)); let shouldPost = options.confirm; if (shouldPost) { shouldPost = await (0, prompts_1.confirm)('Do you want to post this tweet?', true); } if (shouldPost) { logger_1.logger.startSpinner('Generating code screenshot...'); const screenshotBuffer = await screenshotService.generateCodeScreenshot(code, language, config.screenshots); const screenshotPath = await screenshotService.saveScreenshot(screenshotBuffer); logger_1.logger.stopSpinner(true, 'Screenshot generated!'); try { logger_1.logger.startSpinner('Posting tweet with screenshot...'); const result = await twitterService.post(tweetText, screenshotBuffer); logger_1.logger.stopSpinner(true, 'Posted to Twitter!'); const tweet = { id: result.id, text: tweetText, createdAt: new Date(), url: result.url, mediaUrls: [screenshotPath] }; await storageService.saveTweet(tweet); logger_1.logger.success('Tweet with code screenshot posted successfully! 🚀'); if (result.url) { logger_1.logger.info(`View your tweet: ${result.url}`); } } catch (error) { logger_1.logger.stopSpinner(false, 'Failed to post to Twitter'); const draft = { id: `draft-${Date.now()}`, text: tweetText, createdAt: new Date(), includeScreenshot: true, screenshotPath: screenshotPath }; await storageService.saveDraft(draft); logger_1.logger.error(`Twitter posting failed: ${error.message}`); logger_1.logger.info('Tweet saved as draft with screenshot.'); } } else { logger_1.logger.info('Tweet cancelled.'); } } catch (error) { logger_1.logger.stopSpinner(false, 'Failed to create code screenshot'); throw error; } } //# sourceMappingURL=code.js.map