Files
openclaw-backups/skills/openclaw-self-healing/scripts/reorganize-cron-channels.js

154 lines
4.5 KiB
JavaScript

#!/usr/bin/env node
/**
* 크론 채널 재분류 스크립트
*
* 채널 매핑:
* - #jarvis (1468386844621144065): 일상/브리핑
* - #jarvis-market (1469190686145384513): 투자/뉴스
* - #jarvis-system (1469190688083280065): 시스템
*/
const CHANNELS = {
jarvis: 'channel:1468386844621144065',
market: 'channel:1469190686145384513',
system: 'channel:1469190688083280065'
};
// 크론 분류 맵 (크론 이름 → 채널)
const CRON_CLASSIFICATION = {
// #jarvis (일상/브리핑)
'모닝 브리핑': 'jarvis',
'검증: 모닝 브리핑': 'jarvis',
'퇴근 브리핑': 'jarvis',
'검증: 퇴근 브리핑': 'jarvis',
'조식 알림': 'jarvis',
'검증: 조식 알림': 'jarvis',
'부부 약 먹기 알림': 'jarvis',
'검증: 부부 약': 'jarvis',
'취침 알림': 'jarvis',
'검증: 취침 알림': 'jarvis',
'관훈 근무일 확인': 'jarvis',
'관훈 미확정 저녁': 'jarvis',
'검증: 관훈 저녁': 'jarvis',
'관훈 예약 알림': 'jarvis',
'검증: 관훈 예약': 'jarvis',
'어머님 코다리 알림': 'jarvis',
// #jarvis-market (투자/뉴스)
'TQQQ 15분 모니터링': 'market',
'시장 급변 감지': 'market',
'일일 주식 브리핑': 'market',
'검증: 일일 주식': 'market',
'IT/AI 뉴스 브리핑': 'market',
'검증: IT/AI 뉴스': 'market',
'트렌드 헌터': 'market',
'검증: 트렌드 헌터': 'market',
'시간당 종합 체크': 'market',
'실적 발표 캘린더': 'market',
'검증: 실적 발표': 'market',
'월급날 정기투자 알림': 'market',
'검증: 월급날 정기투자': 'market',
'자비스 정보 탐험': 'market',
'주간 요약 리포트': 'market',
'검증: 주간 요약': 'market',
'GitHub 감시': 'market',
// #jarvis-system (시스템)
'🚨 Emergency Recovery 실패 감지': 'system',
'외부 API 사용량 모니터링': 'system',
'일일 백업': 'system',
'Kakao 에러 로그 정리': 'system',
'Nightly Build': 'system',
'로그 정리': 'system',
'디스크 용량 경고': 'system',
'일일 닥터 점검': 'system',
'일일 자가 체크': 'system',
'Kakao Token 자동 갱신': 'system',
'Kakao Refresh Token 만료 알림': 'system',
'일일 업데이트 확인': 'system',
'월간 비용 추적': 'system',
'검증: 월간 비용': 'system',
'크론 감시 리포트': 'system',
'야간 종합 점검': 'system',
'일일 자가개선': 'system',
'패턴 탐지 (주간)': 'system',
'주간 자기평가 감사': 'system'
};
async function main() {
const gatewayUrl = 'http://localhost:18789';
// 1. 모든 크론 가져오기
const listRes = await fetch(`${gatewayUrl}/api/cron/list`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action: 'list' })
});
const { jobs } = await listRes.json();
console.log(`${jobs.length}개 크론 발견\n`);
let updated = 0;
let skipped = 0;
let errors = 0;
for (const job of jobs) {
const targetChannel = CRON_CLASSIFICATION[job.name];
if (!targetChannel) {
console.log(`⏭️ 스킵: "${job.name}" (분류 없음)`);
skipped++;
continue;
}
const newChannelId = CHANNELS[targetChannel];
const currentTo = job.payload?.to;
if (currentTo === newChannelId) {
console.log(`✅ 이미 올바름: "${job.name}" → ${targetChannel}`);
skipped++;
continue;
}
// payload 복사 및 to 업데이트
const updatedPayload = {
...job.payload,
to: newChannelId
};
try {
const updateRes = await fetch(`${gatewayUrl}/api/cron/update`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
action: 'update',
jobId: job.id,
patch: { payload: updatedPayload }
})
});
const result = await updateRes.json();
if (result.error) {
console.error(`❌ 실패: "${job.name}" - ${result.error}`);
errors++;
} else {
console.log(`🔄 업데이트: "${job.name}" → ${targetChannel} (${currentTo || 'null'}${newChannelId})`);
updated++;
}
} catch (err) {
console.error(`❌ 예외: "${job.name}" - ${err.message}`);
errors++;
}
}
console.log(`\n📊 결과:`);
console.log(` 업데이트: ${updated}`);
console.log(` 스킵: ${skipped}`);
console.log(` 에러: ${errors}`);
}
main().catch(console.error);