guanghulab/scripts/aoac/readme-sync-module.js
2026-05-10 13:12:44 +08:00

131 lines
4.2 KiB
JavaScript
Raw 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.

#!/usr/bin/env node
'use strict';
/**
* AOAC-04 · 首页同步模块 (README Sync Module)
* ═══════════════════════════════════════════════
* AGE OS Agent Chain · 半Agent事件唤醒
*
* 唤醒条件data/aoac/readme-sync-trigger.json 被写入
* 职责解析链路报告→提取进度变更→准备README更新数据
* 输出data/aoac/readme-update-payload.json
*
* 版权:国作登字-2026-A-00037559 · TCS-0002∞
*/
const fs = require('fs');
const path = require('path');
const ROOT = path.resolve(__dirname, '..', '..');
const CHAIN_REPORT_PATH = path.join(ROOT, 'data', 'aoac', 'chain-report.json');
const TRIGGER_PATH = path.join(ROOT, 'data', 'aoac', 'readme-sync-trigger.json');
const PAYLOAD_PATH = path.join(ROOT, 'data', 'aoac', 'readme-update-payload.json');
const CHAIN_STATUS_PATH = path.join(ROOT, 'data', 'aoac', 'chain-status.json');
const BEIJING_OFFSET_MS = 8 * 3600 * 1000;
function getBeijingTime() {
const now = new Date();
return new Date(now.getTime() + BEIJING_OFFSET_MS)
.toISOString().replace('T', ' ').slice(0, 19) + '+08:00';
}
function readJSON(filePath) {
try {
if (!fs.existsSync(filePath)) return null;
return JSON.parse(fs.readFileSync(filePath, 'utf8'));
} catch { return null; }
}
function writeJSON(filePath, data) {
fs.mkdirSync(path.dirname(filePath), { recursive: true });
fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n', 'utf8');
}
function extractReadmeUpdates(chainReport) {
if (!chainReport) return null;
const updates = {
aoac_section: '',
progress_entries: [],
status_badge: '🟢'
};
// Build AOAC status line
const dev = chainReport.development || {};
const ci = chainReport.ci_result || {};
const ciBadge = ci.overall === 'success' ? '✅' :
ci.overall === 'failure' ? '❌' : '⚠️';
updates.status_badge = ciBadge;
updates.aoac_section = [
`| ${chainReport.report_id || 'N/A'} | PR #${dev.pr_number || '?'} | ${(dev.pr_title || '').slice(0, 50)} | ${dev.files_changed || 0}文件 +${dev.additions || 0}/-${dev.deletions || 0} | ${ciBadge} ${ci.overall || 'unknown'} | ${chainReport.timestamp || ''} |`
].join('\n');
// Progress entry for consciousness chain
if (dev.pr_title) {
updates.progress_entries.push({
type: 'dev_merge',
title: dev.pr_title,
result: ci.overall,
timestamp: chainReport.timestamp
});
}
return updates;
}
function main() {
console.log('📋 AOAC-04 · 首页同步模块 · 唤醒中...');
console.log(`📅 ${getBeijingTime()}`);
// Check trigger
const trigger = readJSON(TRIGGER_PATH);
if (!trigger) {
console.log('⚠️ 无触发信号,跳过');
return;
}
console.log(`📡 收到触发信号: ${trigger.trigger_id}`);
// Read chain report
const chainReport = readJSON(CHAIN_REPORT_PATH);
if (!chainReport) {
console.log('⚠️ 链路报告不存在,跳过');
return;
}
// Extract README updates
const updates = extractReadmeUpdates(chainReport);
const now = new Date();
const payload = {
aoac_agent: 'AOAC-04',
aoac_agent_name: 'readme-sync-module',
payload_id: `AOAC-PAYLOAD-${now.toISOString().slice(0, 10).replace(/-/g, '')}-${String(Math.floor(Math.random() * 1000)).padStart(3, '0')}`,
timestamp: getBeijingTime(),
timestamp_utc: now.toISOString(),
source_report: chainReport.report_id,
updates,
changes_summary: chainReport.changes_summary,
trigger_master: true,
next_agent: 'AOAC-05 (readme-master-agent)'
};
writeJSON(PAYLOAD_PATH, payload);
console.log(`✅ README更新数据已准备: ${payload.payload_id}`);
console.log(` ${chainReport.changes_summary}`);
// Update chain status
const chainStatus = readJSON(CHAIN_STATUS_PATH) || {};
if (chainStatus.agents && chainStatus.agents['AOAC-04']) {
chainStatus.agents['AOAC-04'].status = 'completed';
chainStatus.agents['AOAC-04'].last_run = now.toISOString();
chainStatus.agents['AOAC-04'].last_success = now.toISOString();
}
writeJSON(CHAIN_STATUS_PATH, chainStatus);
console.log('📋 AOAC-04 · 半Agent完成 · 触发AOAC-05主控');
}
main();