#!/usr/bin/env node const fs = require('fs'); const path = require('path'); const JOBS_FILE = path.join(process.env.HOME, '.openclaw/cron/jobs.json'); const SELF_REVIEW_TEMPLATE = ` --- **๐Ÿ” ์ž๊ธฐํ‰๊ฐ€ (๋‹ต๋ณ€ ์ „์†ก ์งํ›„ ์ˆ˜ํ–‰):** 1. ์™„์„ฑ๋„: ์š”์ฒญ ์ •๋ณด ์ „๋ถ€ ์ „๋‹ฌํ–ˆ๋‚˜? 2. ์ •ํ™•์„ฑ: ๊ณ„์‚ฐ/๋ฐ์ดํ„ฐ ์ •ํ™•ํ•œ๊ฐ€? 3. ํ†ค: ์ž๋น„์Šค๋‹ต๊ฒŒ ๊ฑด๋ฐฉ์ง„๊ฐ€? (ChatGPT์ฒ˜๋Ÿผ ๊ตฝ์‹ ๊ฑฐ๋ฆฌ์ง€ ์•Š์•˜๋‚˜?) 4. ๊ฐ„๊ฒฐ์„ฑ: ๋ถˆํ•„์š”ํ•œ ๋ง ์—†์—ˆ๋‚˜? 5. ๊ฐœ์„ ์ : ๋‹ค์Œ์—” ๋ญ˜ ๋” ์ž˜ํ•  ์ˆ˜ ์žˆ๋‚˜? โ†’ memory/YYYY-MM-DD.md์— ํ‰๊ฐ€ 2-3์ค„ ๊ธฐ๋ก (์˜ˆ: "[HH:MM] ํฌ๋ก ๋ช… - โœ…/โš ๏ธ ํ•ต์‹ฌ ํ‰๊ฐ€. ๊ฐœ์„ : XXX")`; // ์—…๋ฐ์ดํŠธํ•  ํฌ๋ก  ID์™€ ํŠน๋ณ„ ์ฒ˜๋ฆฌ const CRONS_TO_UPDATE = { 'b81588fa-5111-41fb-871f-d767dc1f783b': { name: 'Daily Stock Briefing', prependToMessage: `โ˜• **Good Morning, Sir.** **๐Ÿ’ฑ ํ™˜์œจ (USD/KRW)** ์‹ค์‹œ๊ฐ„ ํ™˜์œจ ํ™•์ธ: \`\`\`bash python3 ~/openclaw/scripts/get-exchange-rate.py \`\`\` โ†’ ํ˜„์žฌ ํ™˜์œจ: โ‚ฉX,XXX.XX (์ „์ผ ๋Œ€๋น„: ยฑX.XX์›, ยฑX.XX%) **๐Ÿ“ˆ ํฌํŠธํด๋ฆฌ์˜ค ๋ธŒ๋ฆฌํ•‘** 1. **TQQQ / SOXL / NVDA** ๊ฐ„๋‹จ ์‹œ์„ธ: \`\`\`bash ~/openclaw/skills/yahoo-finance/yf TQQQ ~/openclaw/skills/yahoo-finance/yf SOXL ~/openclaw/skills/yahoo-finance/yf NVDA \`\`\` 2. ์ง€๋‚œ๋ฐค ๋ณ€๋™๋ฅ  ์š”์•ฝ **๐Ÿ”ฅ Hot Scanner** (ํŠธ๋ Œ๋”ฉ ์ข…๋ชฉ): \`\`\`bash python3 ~/openclaw/skills/stock-analysis/scripts/hot_scanner.py --no-social \`\`\` - ์ƒ์œ„ 3๊ฐœ๋งŒ ๊ฐ„๋‹จํžˆ **๐Ÿ”ฎ Rumor Scanner** (์กฐ๊ธฐ ์‹œ๊ทธ๋„): \`\`\`bash python3 ~/openclaw/skills/stock-analysis/scripts/rumor_scanner.py \`\`\` - Impact 7์  ์ด์ƒ๋งŒ ๋ณด๊ณ  - M&A/์ธ์ˆ˜ํ•ฉ๋ณ‘ ๋ฃจ๋จธ, ๋‚ด๋ถ€์ž ๊ฑฐ๋ž˜, ์• ๋„๋ฆฌ์ŠคํŠธ ์—…๊ทธ๋ ˆ์ด๋“œ **๐Ÿ’ก ์˜ค๋Š˜์˜ ์ „๋žต** ์ œ์•ˆ (Hot + Rumor ์ข…ํ•ฉ)` }, 'b9662f08-36ee-4e6d-ab9d-fd2d48f21737': { name: '๋ชจ๋‹ ๋ธŒ๋ฆฌํ•‘' }, 'bd8e8994-3646-4f7a-b994-4f3ae9f1890a': { name: 'Daily Wrap-up' }, 'cc9ddcf5-734c-4e8e-b0e0-51884f8a5196': { name: 'Trend Hunter' }, '41e625c8-59a5-4df5-bd97-2dbc5282eda7': { name: 'IT/AI ๋‰ด์Šค ๋ธŒ๋ฆฌํ•‘' }, '6b2da787-7df8-49e8-b506-9139f66f86ca': { name: '์กฐ์‹ ์•Œ๋ฆผ' }, '422b96a7-8931-43ba-84ce-a55b1b9a6477': { name: '์ทจ์นจ ์•Œ๋ฆผ' }, 'e16e5163-9caf-444b-b74d-0cbebaed013b': { name: '๋ถ€๋ถ€ ์•ฝ ๋จน๊ธฐ ์•Œ๋ฆผ' }, 'dfa2bf81-fa94-45b2-a154-b7e4a78fc173': { name: '๊ด€ํ›ˆ ๋ฏธํ™•์ • ์ €๋…' }, '270a5dc7-f19e-402f-ae3a-79c628a3cde8': { name: 'Monthly DCA Reminder' }, '22c071ae-598f-48da-b002-4d1fd395bf0a': { name: '์‹ค์  ๋ฐœํ‘œ ์บ˜๋ฆฐ๋”' }, '41e5363d-6b32-48c2-9bf6-738d950c6d6c': { name: '์ฃผ๊ฐ„ ์š”์•ฝ ๋ฆฌํฌํŠธ' }, 'ddef1a57-21e8-4614-991c-a3f29177e8ee': { name: '์›”๊ฐ„ ๋น„์šฉ ์ถ”์ ' }, 'a98f06f7-a084-4993-b352-358d00ed340f': { name: 'TQQQ 15๋ถ„ ๋ชจ๋‹ˆํ„ฐ๋ง' } }; try { // Read jobs.json const data = JSON.parse(fs.readFileSync(JOBS_FILE, 'utf8')); let updated = 0; data.jobs.forEach(job => { const config = CRONS_TO_UPDATE[job.id]; if (!config) return; const currentMessage = job.payload.message || ''; // ์ด๋ฏธ ์ž๊ธฐํ‰๊ฐ€๊ฐ€ ์žˆ์œผ๋ฉด ์Šคํ‚ต if (currentMessage.includes('๐Ÿ” ์ž๊ธฐํ‰๊ฐ€')) { console.log(`[SKIP] ${config.name} - ์ด๋ฏธ ์ž๊ธฐํ‰๊ฐ€ ์žˆ์Œ`); return; } // Daily Stock Briefing์€ ์ „์ฒด ๊ต์ฒด if (config.prependToMessage) { job.payload.message = config.prependToMessage + SELF_REVIEW_TEMPLATE; } else { // ๋‚˜๋จธ์ง€๋Š” ๊ธฐ์กด ๋ฉ”์‹œ์ง€์— ์ž๊ธฐํ‰๊ฐ€ ์ถ”๊ฐ€ job.payload.message = currentMessage + SELF_REVIEW_TEMPLATE; } job.updatedAtMs = Date.now(); updated++; console.log(`[UPDATE] ${config.name}`); }); // Write back fs.writeFileSync(JOBS_FILE, JSON.stringify(data, null, 2)); console.log(`\nโœ… ${updated}๊ฐœ ํฌ๋ก  ์—…๋ฐ์ดํŠธ ์™„๋ฃŒ`); } catch (error) { console.error('โŒ ์—๋Ÿฌ:', error.message); process.exit(1); }