cw-ai-backlog
Version:
AI-powered tool to generate backlog items from meeting documents and output to Google Sheets
93 lines (77 loc) • 3.22 kB
JavaScript
const { Command } = require('commander');
const path = require('path');
const fs = require('fs-extra');
const chalk = require('chalk');
const ora = require('ora');
const { parseFile } = require('./parsers');
const { generateBacklog } = require('./openai');
const { loadConfig } = require('./config');
const { writeBacklogToSheets } = require('./sheets');
const { setupConfigInteractive } = require('./setup');
// 讀取 package.json 獲取版本號
const packageJson = require('../package.json');
const program = new Command();
program
.name('ai-backlog')
.description('Generate backlog items from meeting documents using AI and output to Google Sheets')
.version(packageJson.version);
program
.argument('[input]', '會議檔案路徑或 Google Docs 連結')
.option('-c, --config <path>', '配置檔案路徑', './ai_backlog.config.js')
.option('--setup', '執行互動式配置設定')
.option('--show-config', '顯示配置檔案位置')
.option('--edit-config', '快速編輯全域配置檔案')
.action(async (input, options) => {
let spinner;
try {
// 如果使用者要執行互動式設定
if (options.setup) {
await setupConfigInteractive();
return;
}
// 如果使用者要查看配置檔案位置
if (options.showConfig) {
const { showConfigPaths } = require('./config');
await showConfigPaths();
return;
}
// 如果使用者要編輯配置檔案
if (options.editConfig) {
const { editGlobalConfig } = require('./config');
await editGlobalConfig();
return;
}
if (!input) {
console.error(chalk.red('❌ 請提供會議檔案路徑或 Google Docs 連結'));
console.log(chalk.yellow('💡 如果是第一次使用,請執行: ai-backlog --setup'));
process.exit(1);
}
spinner = ora('正在載入配置...').start();
// 載入配置
const config = await loadConfig(options.config);
spinner.succeed('配置載入完成');
// 解析檔案內容
spinner.start('正在解析檔案內容...');
const content = await parseFile(input, config);
spinner.succeed('檔案解析完成');
// 生成 backlog
spinner.start('正在使用 AI 生成 backlog...');
const backlogItems = await generateBacklog(content, config);
spinner.succeed('Backlog 生成完成');
// 寫入 Google Sheets
spinner.start('正在寫入 Google Sheets...');
const result = await writeBacklogToSheets(backlogItems, config);
spinner.succeed('Backlog 已成功寫入 Google Sheets');
console.log(chalk.blue(`\n📊 共生成 ${backlogItems.length} 個 backlog 項目`));
console.log(chalk.green(`📋 工作表名稱: ${result.sheetName}`));
console.log(chalk.cyan(`🔗 工作表連結: ${result.url}`));
console.log(chalk.yellow('\n💡 請記得填寫 Area、Iteration、BacklogLink、AssignedTo 和 MoSCoW 欄位'));
} catch (error) {
if (spinner) {
spinner.fail('執行失敗');
}
console.error(chalk.red('❌ 錯誤:'), error.message);
process.exit(1);
}
});
program.parse();