guanghulab/scripts/aoac/chain-fusion.js

165 lines
5.9 KiB
JavaScript
Raw Permalink Normal View History

#!/usr/bin/env node
'use strict';
/**
* AOAC-03 · 合体引擎 (Chain Fusion Engine)
*
* AGE OS Agent Chain · 全Agent开发全链路感知
*
* 唤醒条件AOAC-02完成CI日志+开发日志双全
* 职责合并两半日志生成完整开发报告写入触发信号
* 输出data/aoac/chain-report.json + data/aoac/readme-sync-trigger.json
*
* 版权国作登字-2026-A-00037559 · TCS-0002
*/
const fs = require('fs');
const path = require('path');
const ROOT = path.resolve(__dirname, '..', '..');
const DEV_LOG_PATH = path.join(ROOT, 'data', 'aoac', 'dev-session-log.json');
const MERGE_LOG_PATH = path.join(ROOT, 'data', 'aoac', 'merge-result-log.json');
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 CHAIN_STATUS_PATH = path.join(ROOT, 'data', 'aoac', 'chain-status.json');
const HISTORY_DIR = path.join(ROOT, 'data', 'aoac', 'history');
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 getDateStr() {
const now = new Date();
return new Date(now.getTime() + BEIJING_OFFSET_MS)
.toISOString().slice(0, 10);
}
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 generateChangeSummary(devLog, mergeLog) {
const parts = [];
if (devLog && devLog.pr) {
parts.push(`PR #${devLog.pr.number}: ${devLog.pr.title}`);
}
if (devLog && devLog.diff) {
parts.push(`${devLog.diff.changed_files}个文件 (+${devLog.diff.additions} -${devLog.diff.deletions})`);
}
if (devLog && devLog.categories) {
const cats = Object.keys(devLog.categories);
if (cats.length > 0) {
parts.push(`涉及: ${cats.join(', ')}`);
}
}
if (mergeLog && mergeLog.ci) {
parts.push(`CI: ${mergeLog.ci.overall_result} (✅${mergeLog.ci.summary.passed}${mergeLog.ci.summary.failed})`);
}
return parts.join(' · ');
}
function main() {
console.log('⚡ AOAC-03 · 合体引擎 · 唤醒中...');
console.log(`📅 ${getBeijingTime()}`);
const devLog = readJSON(DEV_LOG_PATH);
const mergeLog = readJSON(MERGE_LOG_PATH);
if (!devLog && !mergeLog) {
console.log('⚠️ 开发日志和合并日志都不存在,生成空报告');
}
const now = new Date();
const dateStr = getDateStr();
const seq = String(Math.floor(Math.random() * 1000)).padStart(3, '0');
const reportId = `AOAC-CHAIN-${dateStr.replace(/-/g, '')}-${seq}`;
// Fuse the two halves
const chainReport = {
aoac_agent: 'AOAC-03',
aoac_agent_name: 'dev-chain-agent',
report_id: reportId,
status: 'complete',
timestamp: getBeijingTime(),
timestamp_utc: now.toISOString(),
fusion: {
dev_sentinel: devLog ? 'present' : 'missing',
merge_sentinel: mergeLog ? 'present' : 'missing',
fusion_quality: devLog && mergeLog ? 'full' : 'partial'
},
development: {
pr_number: (devLog && devLog.pr && devLog.pr.number) || (mergeLog && mergeLog.merge && mergeLog.merge.pr_number) || null,
pr_title: (devLog && devLog.pr && devLog.pr.title) || (mergeLog && mergeLog.merge && mergeLog.merge.pr_title) || 'unknown',
author: (devLog && devLog.pr && devLog.pr.author) || '',
branch: (devLog && devLog.pr && devLog.pr.branch) || '',
files_changed: (devLog && devLog.diff && devLog.diff.changed_files) || 0,
additions: (devLog && devLog.diff && devLog.diff.additions) || 0,
deletions: (devLog && devLog.diff && devLog.diff.deletions) || 0,
categories: (devLog && devLog.categories) || {}
},
ci_result: {
overall: (mergeLog && mergeLog.ci && mergeLog.ci.overall_result) || 'unknown',
passed: (mergeLog && mergeLog.ci && mergeLog.ci.summary && mergeLog.ci.summary.passed) || 0,
failed: (mergeLog && mergeLog.ci && mergeLog.ci.summary && mergeLog.ci.summary.failed) || 0,
merge_commit: (mergeLog && mergeLog.merge && mergeLog.merge.merge_commit_sha) || ''
},
changes_summary: generateChangeSummary(devLog, mergeLog),
triggered_by: 'AOAC-02',
triggers_next: 'AOAC-04 (readme-sync-module)'
};
// Write chain report
writeJSON(CHAIN_REPORT_PATH, chainReport);
console.log(`✅ 链路报告已生成: ${reportId}`);
console.log(` ${chainReport.changes_summary}`);
// Write trigger signal for AOAC-04
const trigger = {
trigger_id: `AOAC-TRIGGER-${dateStr.replace(/-/g, '')}-${seq}`,
source: 'AOAC-03',
target: 'AOAC-04',
chain_report_id: reportId,
timestamp: now.toISOString(),
action: 'readme_sync'
};
writeJSON(TRIGGER_PATH, trigger);
console.log('📡 触发信号已发送 → AOAC-04');
// Archive to history
const historyDir = path.join(HISTORY_DIR, dateStr);
fs.mkdirSync(historyDir, { recursive: true });
writeJSON(path.join(historyDir, `${reportId}.json`), chainReport);
// Update chain status
const chainStatus = readJSON(CHAIN_STATUS_PATH) || {};
if (chainStatus.agents) {
if (chainStatus.agents['AOAC-03']) {
chainStatus.agents['AOAC-03'].status = 'completed';
chainStatus.agents['AOAC-03'].last_run = now.toISOString();
chainStatus.agents['AOAC-03'].last_success = now.toISOString();
}
chainStatus.chain_health = chainReport.ci_result.overall === 'success' ? 'healthy' : 'warning';
}
writeJSON(CHAIN_STATUS_PATH, chainStatus);
console.log('⚡ AOAC-03 · 合体完成 · 链路报告已归档');
}
main();