build-in-public-bot
Version:
AI-powered CLI bot for automating build-in-public tweets with code screenshots
85 lines • 4.48 kB
JavaScript
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
;