99 lines
2.6 KiB
JavaScript
99 lines
2.6 KiB
JavaScript
|
|
// scripts/generate-system-health.js
|
|||
|
|
// 系统健康状态生成器 · System Health Generator
|
|||
|
|
//
|
|||
|
|
// 功能:巡检 brain/ 目录完整性和系统状态,更新 brain/system-health.json
|
|||
|
|
// 触发方式:
|
|||
|
|
// - GitHub Actions: daily-maintenance.yml
|
|||
|
|
// - 本地:node scripts/generate-system-health.js
|
|||
|
|
|
|||
|
|
'use strict';
|
|||
|
|
|
|||
|
|
const fs = require('fs');
|
|||
|
|
const path = require('path');
|
|||
|
|
|
|||
|
|
const ROOT = path.join(__dirname, '..');
|
|||
|
|
const BRAIN_DIR = path.join(ROOT, 'brain');
|
|||
|
|
const OUT_PATH = path.join(BRAIN_DIR, 'system-health.json');
|
|||
|
|
|
|||
|
|
const BEIJING_OFFSET_MS = 8 * 3600 * 1000;
|
|||
|
|
|
|||
|
|
const now = new Date();
|
|||
|
|
const nowISO = now.toISOString();
|
|||
|
|
const nowBJ = new Date(now.getTime() + BEIJING_OFFSET_MS).toISOString()
|
|||
|
|
.replace('T', ' ').slice(0, 19) + '+08:00';
|
|||
|
|
|
|||
|
|
// ── 巡检 brain/ 目录完整性 ──
|
|||
|
|
|
|||
|
|
function checkBrainIntegrity() {
|
|||
|
|
const required = [
|
|||
|
|
'master-brain.md',
|
|||
|
|
'read-order.md',
|
|||
|
|
'repo-map.json',
|
|||
|
|
'automation-map.json',
|
|||
|
|
'communication-map.json',
|
|||
|
|
'id-map.json',
|
|||
|
|
'system-health.json'
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
const missing = [];
|
|||
|
|
const present = [];
|
|||
|
|
|
|||
|
|
for (const file of required) {
|
|||
|
|
const filePath = path.join(BRAIN_DIR, file);
|
|||
|
|
if (fs.existsSync(filePath)) {
|
|||
|
|
present.push(file);
|
|||
|
|
} else {
|
|||
|
|
missing.push(file);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
complete: missing.length === 0,
|
|||
|
|
total: required.length,
|
|||
|
|
present: present.length,
|
|||
|
|
missing
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ── 检查 workflow 目录 ──
|
|||
|
|
|
|||
|
|
function checkWorkflows() {
|
|||
|
|
const wfDir = path.join(ROOT, '.github/workflows');
|
|||
|
|
try {
|
|||
|
|
const files = fs.readdirSync(wfDir).filter(f => f.endsWith('.yml'));
|
|||
|
|
return { count: files.length, status: files.length > 0 ? 'stable' : 'warning' };
|
|||
|
|
} catch {
|
|||
|
|
return { count: 0, status: 'error' };
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ── 主生成 ──
|
|||
|
|
|
|||
|
|
function generate() {
|
|||
|
|
if (!fs.existsSync(BRAIN_DIR)) fs.mkdirSync(BRAIN_DIR, { recursive: true });
|
|||
|
|
|
|||
|
|
const brainCheck = checkBrainIntegrity();
|
|||
|
|
const wfCheck = checkWorkflows();
|
|||
|
|
|
|||
|
|
const health = {
|
|||
|
|
version: '4.0',
|
|||
|
|
last_check: nowBJ,
|
|||
|
|
communication: 'synced',
|
|||
|
|
automation: wfCheck.status,
|
|||
|
|
maintenance_agent: 'active',
|
|||
|
|
system_health: brainCheck.complete ? 'normal' : 'warning',
|
|||
|
|
brain_integrity: brainCheck,
|
|||
|
|
workflow_count: wfCheck.count,
|
|||
|
|
checked_by: 'scripts/generate-system-health.js'
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
fs.writeFileSync(OUT_PATH, JSON.stringify(health, null, 2));
|
|||
|
|
console.log(`✅ system-health.json 已更新 · brain完整性: ${brainCheck.present}/${brainCheck.total} · 工作流: ${wfCheck.count}`);
|
|||
|
|
|
|||
|
|
if (brainCheck.missing.length > 0) {
|
|||
|
|
console.log(`⚠️ 缺失文件: ${brainCheck.missing.join(', ')}`);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
generate();
|