/** * 채팅 도구(짹) 실호출 결과 시트 — standalone 실행기. * * Cloud Function(`/debug/chatToolsSheet`)과 동일한 로직(chatToolsSheetService)을 * 로컬에서 prod 데이터에 붙여 실행하고, 결과를 tmp/ 아래 Markdown/JSON으로 떨군다. * * ⚠️ 실제 prod 데이터를 읽고 KBO 캐시에 쓴다(유저 데이터는 read-only). 수동 실행용. * * 실행: * gcloud auth application-default login # 또는 GOOGLE_APPLICATION_CREDENTIALS= * npx tsx scripts/chat-tools-sheet.ts * * 옵션(env): FIREBASE_PROJECT(기본 mmday-panit), CHAT_TOOLS_PLAYER, CHAT_TOOLS_DATE */ // 반드시 src/* 보다 먼저 — prod 앱을 초기화한다(import 순서가 곧 실행 순서). import { BOOTSTRAP_PROJECT } from "./_bootstrap"; import { mkdirSync, writeFileSync } from "node:fs"; import { join } from "node:path"; import { runChatToolsSheet, renderSheetMarkdown, type SheetOptions, } from "../src/services/chatToolsSheetService"; async function main(): Promise { const uid = (process.argv[2] ?? process.env.CHAT_TOOLS_UID ?? "").trim(); if (!uid) { console.error("사용법: npx tsx scripts/chat-tools-sheet.ts (또는 CHAT_TOOLS_UID=)"); process.exit(1); } const opts: SheetOptions = { player: process.env.CHAT_TOOLS_PLAYER?.trim() || undefined, date: process.env.CHAT_TOOLS_DATE?.trim() || undefined, }; console.log(`[chat-tools-sheet] project=${BOOTSTRAP_PROJECT} uid=${uid} — 도구 실호출 중…`); const sheet = await runChatToolsSheet(uid, opts); for (const r of sheet.results) { console.log(` ${r.ok ? "✓" : "✗"} ${r.tool} [${r.label}] ${r.elapsedMs}ms`); } const md = renderSheetMarkdown(sheet); const outDir = join(process.cwd(), "tmp"); mkdirSync(outDir, { recursive: true }); const stamp = sheet.meta.generatedAt.replace(/[:.]/g, "-"); const base = `chat-tools-sheet-${uid}-${stamp}`; const mdPath = join(outDir, `${base}.md`); const jsonPath = join(outDir, `${base}.json`); writeFileSync(mdPath, md, "utf8"); writeFileSync(jsonPath, JSON.stringify(sheet, null, 2), "utf8"); const okCount = sheet.results.filter((r) => r.ok).length; console.log(`\n[chat-tools-sheet] 완료: ${okCount}/${sheet.results.length} 성공`); console.log(` • Markdown: ${mdPath}`); console.log(` • JSON: ${jsonPath}`); } main().catch((err) => { console.error("[chat-tools-sheet] 치명적 오류:", err); process.exit(1); });