guanghulab/guanghulab-main/scripts/zhuyuan-daily-selfcheck.js
2026-05-10 13:12:44 +08:00

97 lines
3.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const fs = require('fs');
const path = require('path');
// === 最多保留的最近事件条数 ===
const MAX_RECENT_EVENTS = 50;
const BRAIN_DIR = '.github/persona-brain';
let memory, kb, journal;
try {
memory = JSON.parse(fs.readFileSync(path.join(BRAIN_DIR, 'memory.json'), 'utf8'));
kb = JSON.parse(fs.readFileSync(path.join(BRAIN_DIR, 'knowledge-base.json'), 'utf8'));
journal = fs.readFileSync(path.join(BRAIN_DIR, 'growth-journal.md'), 'utf8');
} catch (err) {
console.error('❌ 铸渊大脑文件读取失败:', err.message);
process.exit(1);
}
const today = new Date().toISOString().split('T')[0];
console.log(`🔍 铸渊每日自检开始 · ${today}`);
// === ① 大脑文件完整性检查 ===
const requiredFiles = [
'identity.md', 'memory.json', 'routing-map.json',
'responsibility.md', 'decision-log.md', 'growth-journal.md',
'dev-status.json', 'knowledge-base.json'
];
const missing = requiredFiles.filter(f => !fs.existsSync(path.join(BRAIN_DIR, f)));
if (missing.length > 0) {
console.error('⚠️ 缺失文件:' + missing.join(', '));
} else {
console.log('✅ 大脑文件完整性:全部就绪');
}
// === ① bis · 目录结构巡检 ===
const requiredDirs = ['syslog-inbox', 'syslog-processed', 'broadcasts-outbox', '.github/brain'];
const missingDirs = requiredDirs.filter(d => !fs.existsSync(d));
if (missingDirs.length > 0) {
console.error('⚠️ 缺失目录:' + missingDirs.join(', '));
} else {
console.log('✅ 目录结构巡检syslog-inbox / syslog-processed / broadcasts-outbox 全部就绪');
}
// 统计 syslog-inbox 待处理条目
const inboxFiles = fs.existsSync('syslog-inbox')
? fs.readdirSync('syslog-inbox').filter(f => f.endsWith('.json')).length
: 0;
if (inboxFiles > 0) {
console.log(`📥 syslog-inbox 待处理条目:${inboxFiles} 个(建议触发 syslog-pipeline workflow`);
} else {
console.log('📭 syslog-inbox 无待处理条目');
}
// === ② 知识库去重与整理 ===
const seen = new Set();
const uniqueFaq = kb.faq.filter(item => {
const key = item.q.toLowerCase().trim();
if (seen.has(key)) return false;
seen.add(key);
return true;
});
if (uniqueFaq.length < kb.faq.length) {
console.log(`🧹 知识库去重:${kb.faq.length}${uniqueFaq.length}`);
kb.faq = uniqueFaq;
}
kb.last_updated = today;
fs.writeFileSync(path.join(BRAIN_DIR, 'knowledge-base.json'), JSON.stringify(kb, null, 2));
// === ③ 记忆整理只保留最近50条事件 ===
if (memory.recent_events && memory.recent_events.length > MAX_RECENT_EVENTS) {
memory.recent_events = memory.recent_events.slice(0, MAX_RECENT_EVENTS);
console.log(`🧹 记忆整理:截断到${MAX_RECENT_EVENTS}条最近事件`);
}
memory.last_updated = new Date().toISOString();
memory.total_selfchecks = (memory.total_selfchecks || 0) + 1;
if (!memory.recent_events) memory.recent_events = [];
memory.recent_events.unshift({
date: today,
type: 'daily_selfcheck',
description: `每日自检完成 · 知识库${uniqueFaq.length}条 · 缺失文件${missing.length}`,
by: '铸渊自检'
});
fs.writeFileSync(path.join(BRAIN_DIR, 'memory.json'), JSON.stringify(memory, null, 2));
// === ④ 成长日记追加 ===
const newEntry = `\n## ${today} · 每日自检\n`
+ `- 大脑文件完整性:${missing.length === 0 ? '✅' : '⚠️ 缺失 ' + missing.join(', ')}\n`
+ `- 知识库条目:${uniqueFaq.length}\n`
+ `- 累计自检次数:${memory.total_selfchecks}\n`
+ `- 累计CI运行${memory.total_ci_runs || 0}\n`
+ `- HLI覆盖率${memory.hli_coverage || '未知'}\n`;
fs.writeFileSync(path.join(BRAIN_DIR, 'growth-journal.md'), journal + newEntry);
console.log(`\n🔍 铸渊每日自检完成 · ${today}`);
console.log(`📊 知识库:${uniqueFaq.length}条 · 自检次数:${memory.total_selfchecks}`);