UNPKG

build-in-public-bot

Version:

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

85 lines 4.48 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.watchCommand = void 0; const commander_1 = require("commander"); const chalk_1 = __importDefault(require("chalk")); const ora_1 = __importDefault(require("ora")); const watcher_1 = require("../services/watcher"); const context_analyzer_1 = require("../services/context-analyzer"); const config_1 = require("../services/config"); const ai_1 = require("../services/ai"); const storage_1 = require("../services/storage"); const errors_1 = require("../utils/errors"); const logger_1 = require("../utils/logger"); exports.watchCommand = new commander_1.Command('watch') .description('Watch for code changes and suggest tweets') .option('-p, --path <path>', 'Path to watch', process.cwd()) .option('-a, --auto', 'Automatically generate tweets for significant changes') .option('-i, --interval <minutes>', 'Minimum interval between auto-tweets', '30') .action(async (options) => { try { const spinner = (0, ora_1.default)('Starting code watcher...').start(); const configService = config_1.ConfigService.getInstance(); const config = await configService.load(); const watcherService = watcher_1.WatcherService.getInstance(); const contextAnalyzer = context_analyzer_1.ContextAnalyzerService.getInstance(); const aiService = ai_1.AIService.getInstance(); const storageService = storage_1.StorageService.getInstance(); let lastAutoTweetTime = 0; const minInterval = parseInt(options.interval) * 60 * 1000; watcherService.on('fileChange', async (change) => { contextAnalyzer.addFileChange(change); logger_1.logger.info(`${chalk_1.default.dim(new Date().toLocaleTimeString())} ${chalk_1.default.yellow(change.type)} ${change.path}`); if (options.auto && Date.now() - lastAutoTweetTime > minInterval) { const context = await contextAnalyzer.analyzeCurrentContext(); if (context.recentChanges.length >= 5 || change.type === 'add') { try { const suggestion = await contextAnalyzer.generateTweetSuggestion(context); const tweet = await aiService.generateTweet({ message: suggestion, includeScreenshot: false }, config); console.log('\n' + chalk_1.default.green('📝 Auto-generated tweet suggestion:')); console.log(chalk_1.default.white(tweet)); console.log(chalk_1.default.dim('(Use "bip post" to tweet this)\n')); await storageService.saveDraft({ id: `auto-${Date.now()}`, text: tweet, createdAt: new Date(), includeScreenshot: false }); lastAutoTweetTime = Date.now(); } catch (error) { logger_1.logger.error('Failed to generate auto-tweet:', error); } } } }); await watcherService.start(options.path); spinner.succeed(chalk_1.default.green('Code watcher started!')); console.log(chalk_1.default.dim(`Watching: ${options.path}`)); console.log(chalk_1.default.dim('Press Ctrl+C to stop\n')); const context = await contextAnalyzer.analyzeCurrentContext(); console.log(chalk_1.default.cyan('Current context:')); console.log(` Project: ${chalk_1.default.white(context.projectName)}`); console.log(` Branch: ${chalk_1.default.white(context.currentBranch)}`); if (context.language) { console.log(` Language: ${chalk_1.default.white(context.language)}`); } if (context.framework) { console.log(` Framework: ${chalk_1.default.white(context.framework)}`); } console.log(''); process.on('SIGINT', async () => { console.log('\n' + chalk_1.default.yellow('Stopping watcher...')); await watcherService.stop(); process.exit(0); }); await new Promise(() => { }); } catch (error) { (0, errors_1.handleError)(error); } }); //# sourceMappingURL=watch.js.map