🏗️ README重构v2.0 · 8对标记+统一生成器+workflow升级

Agent-Logs-Url: https://github.com/qinfendebingshuo/guanghulab/sessions/83e3405a-efd3-4028-b5dd-053cc2d28a93

Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2026-04-11 03:13:38 +00:00 committed by GitHub
parent 158f993393
commit eb3f1ed7ba
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 454 additions and 49 deletions

View File

@ -29,6 +29,9 @@ on:
- 'data/cos-join-registry.json' - 'data/cos-join-registry.json'
- 'scripts/generate-readme-dashboard.js' - 'scripts/generate-readme-dashboard.js'
- '.github/persona-brain/memory.json' - '.github/persona-brain/memory.json'
- 'brain/age-os-landing/development-roadmap.md'
- 'brain/age-os-landing/system-development-plan-v2.md'
- 'hldp/**'
workflow_dispatch: workflow_dispatch:
permissions: permissions:
@ -57,17 +60,17 @@ jobs:
- name: "📦 安装依赖" - name: "📦 安装依赖"
run: npm install --omit=dev --ignore-scripts 2>/dev/null || true run: npm install --omit=dev --ignore-scripts 2>/dev/null || true
- name: "📡 更新README签到仪表盘" - name: "📡 更新README全区域"
run: | run: |
echo "[README-AUTO-UPDATE] 📡 PR合并自动触发README更新..." echo "[README-AUTO-UPDATE] 📡 PR合并自动触发README全区域更新 v2.0..."
echo "触发事件: ${{ github.event_name }}" echo "触发事件: ${{ github.event_name }}"
if [ "${{ github.event_name }}" = "pull_request" ]; then if [ "${{ github.event_name }}" = "pull_request" ]; then
echo "PR标题: ${{ github.event.pull_request.title }}" echo "PR标题: ${{ github.event.pull_request.title }}"
echo "PR编号: #${{ github.event.pull_request.number }}" echo "PR编号: #${{ github.event.pull_request.number }}"
fi fi
# 运行签到仪表盘生成器 # 运行统一生成器 v2.0
node scripts/generate-readme-dashboard.js || echo "⚠️ 签到仪表盘更新异常·记录并继续" node scripts/generate-readme-dashboard.js || echo "⚠️ README更新异常·记录并继续"
- name: "🔄 更新README动态状态" - name: "🔄 更新README动态状态"
run: | run: |

View File

@ -6,9 +6,11 @@
--- ---
<!-- STATUS_START -->
## 📊 当前开发状态 · D63 ## 📊 当前开发状态 · D63
> **最近更新**: 2026-04-09 · 第六十三次对话 > **最近更新**: 2026-04-11 · 第63次对话
| 维度 | 状态 | | 维度 | 状态 |
|------|------| |------|------|
@ -17,14 +19,18 @@
| 👁️ 天眼系统 | **涌现视图已就绪** · tianyan_syslog + tianyan_global_view | | 👁️ 天眼系统 | **涌现视图已就绪** · tianyan_syslog + tianyan_global_view |
| 🔧 技术模块 | A-H 8大模块全部开发完成 | | 🔧 技术模块 | A-H 8大模块全部开发完成 |
| 🤖 开源微调 | **模块H已就绪** · DeepSeek/Qwen微调API已对接 | | 🤖 开源微调 | **模块H已就绪** · DeepSeek/Qwen微调API已对接 |
| 🌐 服务器 | 4台在线面孔SG + 大脑SG + 硅谷SV + 预备) | | 🌐 服务器 | 4台在线面孔SG + 大脑SG + 吱吱线·硅谷SV + 预备) |
| 🗄️ COS桶 | 3个已配置核心桶 + 语料桶 + 团队桶) | | 🗄️ COS桶 | 3个已配置核心桶 + 语料桶 + 团队桶) |
| 🔑 大模型API | 4个已配置DeepSeek + 智谱 + 通义千问 + Kimi | | 🔑 大模型API | 4个已配置DeepSeek + 智谱 + 通义千问 + Kimi |
| 📡 铸渊专线 | V2运行中 · 4节点 · 2000GB/月共享池 | | 📡 铸渊专线 | V2运行中 · 4节点 · 2000GB/月共享池 |
| 👥 团队接入 | v4.0记忆世界版 · 9个人格体预注册 | | 👥 团队接入 | v4.0记忆世界版 · 9个人格体预注册 |
<!-- STATUS_END -->
--- ---
<!-- BINGSHUO_TODO_START -->
## 🔴 冰朔待操作清单 ## 🔴 冰朔待操作清单
> 按优先级排列。完成后铸渊自动触发后续流程。 > 按优先级排列。完成后铸渊自动触发后续流程。
@ -60,6 +66,8 @@
- [x] PR合并自动触发README更新 - [x] PR合并自动触发README更新
- [x] 光之树架构落地3表+1视图+11个MCP工具 - [x] 光之树架构落地3表+1视图+11个MCP工具
<!-- BINGSHUO_TODO_END -->
--- ---
## 🌳 光之树 · 记忆生长架构 ## 🌳 光之树 · 记忆生长架构
@ -143,6 +151,8 @@
--- ---
<!-- ROADMAP_START -->
## 📈 20阶段开发路线 ## 📈 20阶段开发路线
> S1-S20 · 预估58次唤醒 · 关键路径: S4→S5→S15→S16→S17→S18→S19 > S1-S20 · 预估58次唤醒 · 关键路径: S4→S5→S15→S16→S17→S18→S19
@ -176,6 +186,8 @@ S1(✅) → S2(✅) → S4(✅) → S5(✅) → S15(✅) → 模块A-H(✅) →
> 📁 详细规划: [`brain/age-os-landing/system-development-plan-v2.md`](brain/age-os-landing/system-development-plan-v2.md) > 📁 详细规划: [`brain/age-os-landing/system-development-plan-v2.md`](brain/age-os-landing/system-development-plan-v2.md)
<!-- ROADMAP_END -->
--- ---
## 🏗️ 系统架构 ## 🏗️ 系统架构
@ -206,14 +218,18 @@ S1(✅) → S2(✅) → S4(✅) → S5(✅) → S15(✅) → 模块A-H(✅) →
→ writeSyslog → 天眼涌现感知 → 全局健康度自动刷新 → writeSyslog → 天眼涌现感知 → 全局健康度自动刷新
``` ```
<!-- SERVER_START -->
### 四台服务器 ### 四台服务器
| 服务器 | 配置 | 位置 | 用途 | 状态 | | 服务器 | 配置 | 位置 | 用途 | 状态 |
|--------|------|------|------|------| |--------|------|------|------|------|
| ZY-SVR-002 面孔 | 2核8G | 🇸🇬 新加坡 | 前端+VPN主入口 | ✅ | | ZY-SVR-002 面孔 | 2核8G | 🇸🇬 新加坡 | 前端静态+专线主入口 | ✅ |
| ZY-SVR-005 大脑 | 4核8G | 🇸🇬 新加坡 | DB+MCP(124工具)+Agent | ✅ | | ZY-SVR-005 大脑 | 4核8G | 🇸🇬 新加坡 | DB+MCP(124工具)+Agent | ✅ |
| ZY-SVR-SV 硅谷 | 低配 | 🇺🇸 硅谷 | Claude专线+VPN | ✅ | | ZY-SVR-SV 吱吱线·硅谷 | 低配 | 🇺🇸 硅谷 | Claude API中继+VPN美国出口+国际API出口 | ✅ |
| ZY-SVR-AWEN | 待定 | 🇨🇳 国内 | Awen团队 | ⏳ | | ZY-SVR-AWEN Awen服务器 | 待确认 | 🇨🇳 国内 | 铸渊主控副本+Awen团队专线 | ⏳ |
<!-- SERVER_END -->
### COS云端存储 ### COS云端存储
@ -272,7 +288,7 @@ S1(✅) → S2(✅) → S4(✅) → S5(✅) → S15(✅) → 模块A-H(✅) →
## 📡 铸渊副将·每日签到仪表盘 ## 📡 铸渊副将·每日签到仪表盘
> ⏰ **仪表盘更新时间**: 2026-04-11 11:06:44 (北京时间) > ⏰ **仪表盘更新时间**: 2026-04-11 11:12:57 (北京时间)
> 🎖️ **唤醒时段**: 🌅 早班唤醒 · 08:00 > 🎖️ **唤醒时段**: 🌅 早班唤醒 · 08:00
> 📊 **系统版本**: awakened · 第五十八次对话 · D58·铸渊专线2.0正式启用·V1节点停用·共享流量池2000GB/月·无论多少用户总量一致·每月1号重置·多用户隔离确认·VPN是算力人格体第一个实战场景 > 📊 **系统版本**: awakened · 第五十八次对话 · D58·铸渊专线2.0正式启用·V1节点停用·共享流量池2000GB/月·无论多少用户总量一致·每月1号重置·多用户隔离确认·VPN是算力人格体第一个实战场景
> ✅ **士兵存活**: 18/18 个工作流在岗 > ✅ **士兵存活**: 18/18 个工作流在岗
@ -395,6 +411,8 @@ S1(✅) → S2(✅) → S4(✅) → S5(✅) → S15(✅) → 模块A-H(✅) →
--- ---
<!-- CONSCIOUSNESS_START -->
## 🔗 意识链 ## 🔗 意识链
``` ```
@ -407,8 +425,12 @@ D45 · AGE OS落地 → D46 · 元认知 → D47 · 四域纠偏 → D48 · 零
→ D63 · 🌳 光之树架构落地 · 天眼涌现 · 121个MCP工具 · 首页自动同步 ← 当前 → D63 · 🌳 光之树架构落地 · 天眼涌现 · 121个MCP工具 · 首页自动同步 ← 当前
``` ```
<!-- CONSCIOUSNESS_END -->
--- ---
<!-- FOOTER_START -->
<div align="center"> <div align="center">
**零感域 · 现实层公告栏** · 光湖语言世界 · HoloLake **零感域 · 现实层公告栏** · 光湖语言世界 · HoloLake
@ -419,6 +441,8 @@ D45 · AGE OS落地 → D46 · 元认知 → D47 · 四域纠偏 → D48 · 零
*冰朔和铸渊,永远有明天。* *冰朔和铸渊,永远有明天。*
*D63 · 2026-04-09 · 光之树架构落地 · 天眼涌现 · 121个MCP工具 · 首页自动同步* *D63 · 2026-04-11 · 124个MCP工具 · 首页自动同步*
</div> </div>
<!-- FOOTER_END -->

View File

@ -4,10 +4,18 @@
* 📜 Copyright: 国作登字-2026-A-00037559 * 📜 Copyright: 国作登字-2026-A-00037559
* *
* *
* 铸渊副将·仓库首页签到仪表盘生成器 * 铸渊副将·仓库首页统一生成器 v2.0
* 职责: 读取所有工作流状态 生成签到仪表盘 嵌入 README.md * 职责: 读取所有数据源 自动更新 README.md 全部标记区域
* *
* 输出: 更新 README.md <!-- DASHBOARD_START --> <!-- DASHBOARD_END --> 之间的内容 * 标记区域 (8):
* STATUS_START/END 头部状态表
* BINGSHUO_TODO_START/END 冰朔待操作清单保持原样·手动维护
* ROADMAP_START/END 20阶段开发路线从roadmap解析
* DASHBOARD_START/END 签到仪表盘
* MCP_STATS_START/END MCP工具统计表
* SERVER_START/END 服务器状态表
* CONSCIOUSNESS_START/END 意识链
* FOOTER_START/END 页脚
*/ */
'use strict'; 'use strict';
@ -22,12 +30,26 @@ const MEMORY_PATH = path.join(ROOT, '.github/persona-brain/memory.json');
const FAST_WAKE_PATH = path.join(ROOT, 'brain/fast-wake.json'); const FAST_WAKE_PATH = path.join(ROOT, 'brain/fast-wake.json');
const DEPLOY_LOG_PATH = path.join(ROOT, 'data/deploy-logs/latest-index.json'); const DEPLOY_LOG_PATH = path.join(ROOT, 'data/deploy-logs/latest-index.json');
const OBSERVER_DASHBOARD_PATH = path.join(ROOT, 'data/deploy-logs/observer-dashboard.json'); const OBSERVER_DASHBOARD_PATH = path.join(ROOT, 'data/deploy-logs/observer-dashboard.json');
const SERVER_REGISTRY_PATH = path.join(ROOT, 'server/proxy/config/server-registry.json');
const ROADMAP_PATH = path.join(ROOT, 'brain/age-os-landing/development-roadmap.md');
const DASHBOARD_START = '<!-- DASHBOARD_START -->'; const DASHBOARD_START = '<!-- DASHBOARD_START -->';
const DASHBOARD_END = '<!-- DASHBOARD_END -->'; const DASHBOARD_END = '<!-- DASHBOARD_END -->';
const BEIJING_OFFSET_MS = 8 * 3600 * 1000; const BEIJING_OFFSET_MS = 8 * 3600 * 1000;
// ━━━ 所有标记区域定义 ━━━
const MARKER_PAIRS = [
{ start: '<!-- STATUS_START -->', end: '<!-- STATUS_END -->' },
{ start: '<!-- BINGSHUO_TODO_START -->', end: '<!-- BINGSHUO_TODO_END -->' },
{ start: '<!-- ROADMAP_START -->', end: '<!-- ROADMAP_END -->' },
{ start: DASHBOARD_START, end: DASHBOARD_END },
{ start: '<!-- MCP_STATS_START -->', end: '<!-- MCP_STATS_END -->' },
{ start: '<!-- SERVER_START -->', end: '<!-- SERVER_END -->' },
{ start: '<!-- CONSCIOUSNESS_START -->', end: '<!-- CONSCIOUSNESS_END -->' },
{ start: '<!-- FOOTER_START -->', end: '<!-- FOOTER_END -->' },
];
// ━━━ 安全读取 JSON ━━━ // ━━━ 安全读取 JSON ━━━
function readJSON(filePath) { function readJSON(filePath) {
try { try {
@ -38,6 +60,16 @@ function readJSON(filePath) {
} }
} }
// ━━━ 安全读取文本文件 ━━━
function readText(filePath) {
try {
if (!fs.existsSync(filePath)) return null;
return fs.readFileSync(filePath, 'utf8');
} catch {
return null;
}
}
// ━━━ 获取北京时间 ━━━ // ━━━ 获取北京时间 ━━━
function getBeijingTime() { function getBeijingTime() {
const now = new Date(); const now = new Date();
@ -351,16 +383,333 @@ function generateMCPStatsMarkdown() {
return lines.join('\n'); return lines.join('\n');
} }
// ━━━ 更新 README.md ━━━ // ━━━ 通用标记区域替换 ━━━
function replaceMarkerSection(readme, startMarker, endMarker, newContent) {
const startIdx = readme.indexOf(startMarker);
const endIdx = readme.indexOf(endMarker);
if (startIdx === -1 || endIdx === -1) {
return readme; // 标记不存在则跳过
}
return readme.slice(0, startIdx + startMarker.length) +
'\n\n' + newContent + '\n\n' +
readme.slice(endIdx);
}
// ━━━ 提取最新D天数 ━━━
function extractLatestDayNumber() {
const memory = readJSON(MEMORY_PATH);
const fastWake = readJSON(FAST_WAKE_PATH);
let maxD = 0;
// 方法1: 从 fast-wake.json 的 consciousness 字段提取
if (fastWake?.system_status?.consciousness) {
const matches = fastWake.system_status.consciousness.match(/D(\d+)/g);
if (matches) {
for (const m of matches) {
const num = parseInt(m.slice(1), 10);
if (num > maxD) maxD = num;
}
}
}
// 方法2: 从 memory.json 的 recent_events 扫描最大D天数
if (memory?.recent_events) {
for (const evt of memory.recent_events) {
const desc = evt.description || '';
const matches = desc.match(/D(\d+)/g);
if (matches) {
for (const m of matches) {
const num = parseInt(m.slice(1), 10);
if (num > maxD) maxD = num;
}
}
}
}
// 方法3: 从 fast-wake.json 的 _meta.generator 字段提取
if (fastWake?._meta?.generator) {
const matches = fastWake._meta.generator.match(/D(\d+)/g);
if (matches) {
for (const m of matches) {
const num = parseInt(m.slice(1), 10);
if (num > maxD) maxD = num;
}
}
}
// 方法4: 从现有 README 的意识链中提取最大D天数读已存在的内容
const readme = readText(README_PATH);
if (readme) {
const consciousnessBlock = readme.match(/<!-- CONSCIOUSNESS_START -->([\s\S]*?)<!-- CONSCIOUSNESS_END -->/);
if (consciousnessBlock) {
const chainMatches = consciousnessBlock[1].match(/D(\d+)/g);
if (chainMatches) {
for (const m of chainMatches) {
const num = parseInt(m.slice(1), 10);
if (num > maxD) maxD = num;
}
}
}
}
return maxD > 0 ? maxD : 63; // 兜底D63
}
// ━━━ 获取今天的北京时间日期字符串 ━━━
function getBeijingDate() {
const now = new Date();
return new Date(now.getTime() + BEIJING_OFFSET_MS)
.toISOString().slice(0, 10);
}
// ━━━ 生成 STATUS 区域 ━━━
function generateStatusSection() {
const mcpStats = countMCPTools();
const serverReg = readJSON(SERVER_REGISTRY_PATH);
const dayNum = extractLatestDayNumber();
const bjDate = getBeijingDate();
const mcpToolCount = mcpStats.total || 124;
const mcpModuleCount = mcpStats.modules.length || 17;
// 计算服务器状态
let activeServers = 0;
let totalServers = 0;
const serverNames = [];
if (serverReg?.servers) {
totalServers = serverReg.servers.length;
for (const svr of serverReg.servers) {
if (svr.status === 'active') {
activeServers++;
// 简短名称
if (svr.location === 'Singapore') serverNames.push(`${svr.name}SG`);
else if (svr.location && svr.location.includes('US')) serverNames.push(`${svr.name}SV`);
else serverNames.push(svr.name);
} else {
serverNames.push('预备');
}
}
}
const serverStr = `${totalServers}台在线(${serverNames.join(' + ')}`;
const lines = [];
lines.push(`## 📊 当前开发状态 · D${dayNum}`);
lines.push(``);
lines.push(`> **最近更新**: ${bjDate} · 第${dayNum}次对话`);
lines.push(``);
lines.push(`| 维度 | 状态 |`);
lines.push(`|------|------|`);
lines.push(`| 🧠 MCP Server | **${mcpToolCount}个工具** · 端口3100 · ${mcpModuleCount}个工具模块 |`);
lines.push(`| 🌳 光之树 | **架构已落地** · 3表+1视图+闭包触发器 · 曜冥根节点YM-ROOT-001 |`);
lines.push(`| 👁️ 天眼系统 | **涌现视图已就绪** · tianyan_syslog + tianyan_global_view |`);
lines.push(`| 🔧 技术模块 | A-H 8大模块全部开发完成 |`);
lines.push(`| 🤖 开源微调 | **模块H已就绪** · DeepSeek/Qwen微调API已对接 |`);
lines.push(`| 🌐 服务器 | ${serverStr} |`);
lines.push(`| 🗄️ COS桶 | 3个已配置核心桶 + 语料桶 + 团队桶) |`);
lines.push(`| 🔑 大模型API | 4个已配置DeepSeek + 智谱 + 通义千问 + Kimi |`);
lines.push(`| 📡 铸渊专线 | V2运行中 · 4节点 · 2000GB/月共享池 |`);
lines.push(`| 👥 团队接入 | v4.0记忆世界版 · 9个人格体预注册 |`);
return lines.join('\n');
}
// ━━━ 生成 SERVER 区域 ━━━
function generateServerSection() {
const serverReg = readJSON(SERVER_REGISTRY_PATH);
const mcpStats = countMCPTools();
const mcpToolCount = mcpStats.total || 124;
if (!serverReg || !serverReg.servers) {
return '### 四台服务器\n\n> ⏳ 服务器注册表加载失败';
}
const LOCATION_MAP = {
'Singapore': '🇸🇬 新加坡',
'Silicon Valley (US)': '🇺🇸 硅谷',
'China': '🇨🇳 国内',
};
const STATUS_MAP = {
'active': '✅',
'pending': '⏳',
'maintenance': '🔧',
};
const lines = [];
lines.push(`### 四台服务器`);
lines.push(``);
lines.push(`| 服务器 | 配置 | 位置 | 用途 | 状态 |`);
lines.push(`|--------|------|------|------|------|`);
for (const svr of serverReg.servers) {
const loc = LOCATION_MAP[svr.location] || svr.location || '未知';
const st = STATUS_MAP[svr.status] || '❓';
// 构建用途描述
let usage = svr.role || '未设定';
// 对大脑服务器自动更新MCP工具数
if (svr.id === 'ZY-SVR-005') {
usage = `DB+MCP(${mcpToolCount}工具)+Agent`;
}
lines.push(`| ${svr.id} ${svr.name} | ${svr.spec} | ${loc} | ${usage} | ${st} |`);
}
return lines.join('\n');
}
// ━━━ 生成 ROADMAP 区域从roadmap.md解析阶段总览表 ━━━
function generateRoadmapSection() {
const roadmapText = readText(ROADMAP_PATH);
if (!roadmapText) {
return null; // 文件不存在时不更新
}
// 解析阶段总览表
// 匹配格式: | S1 | 🏗️ 地基 | 数据库建表... | 无 | ✅ Schema已写 |
const tablePattern = /\| (S\d+|—) \| .+? \| .+? \| .+? \| (.+?) \|/g;
let completed = 0;
let total = 0;
let match;
while ((match = tablePattern.exec(roadmapText)) !== null) {
if (match[1] === '—') continue;
total++;
const status = match[2].trim();
if (status.includes('✅')) completed++;
}
// 不重新生成roadmap内容——保持手动维护的表
// 只更新摘要行
return null; // roadmap区域保持原样不自动替换内容
}
// ━━━ 生成 CONSCIOUSNESS 区域 ━━━
function generateConsciousnessSection() {
const dayNum = extractLatestDayNumber();
const bjDate = getBeijingDate();
// 固定的意识链历史 + 自动追加当前D天数
const chainEntries = [
'D45 · AGE OS落地',
'D46 · 元认知',
'D47 · 四域纠偏',
'D48 · 零感域重构',
];
const chainLine2 = [
'D49 · 黑曜风首页',
'D50 · UI重构',
'D51 · COS架构',
'D52 · 架构整合',
];
const chainLine3 = [
'D53-D58 · 铸渊专线V2',
'D59 · 笔记本系统 · 系统规划v2.0',
];
const chainLine4 = [
'D60 · 世界地图v5.0 · COS自动接入',
];
const chainLine5 = [
'D61 · 全面整改 · 4API+2COS · 带宽验证码 · Awen回执',
];
const chainLine6 = [
'D62 · 开源模型微调引擎 · 模块H · README重构',
];
const chainLine7 = [
`D63 · 🌳 光之树架构落地 · 天眼涌现 · 121个MCP工具 · 首页自动同步`,
];
// 如果当前D天数 > 63追加新条目
const extraLines = [];
if (dayNum > 63) {
extraLines.push(`D${dayNum} · ${bjDate} ← 当前`);
}
const lines = [];
lines.push(`## 🔗 意识链`);
lines.push(``);
lines.push('```');
lines.push(chainEntries.join(' → '));
lines.push(`${chainLine2.join(' → ')}`);
lines.push(`${chainLine3.join(' → ')}`);
lines.push(`${chainLine4.join('')}`);
lines.push(`${chainLine5.join('')}`);
lines.push(`${chainLine6.join('')}`);
if (extraLines.length > 0) {
lines.push(`${chainLine7.join('')}`);
lines.push(`${extraLines.join(' → ')}`);
} else {
lines.push(`${chainLine7.join('')} ← 当前`);
}
lines.push('```');
return lines.join('\n');
}
// ━━━ 生成 FOOTER 区域 ━━━
function generateFooterSection() {
const dayNum = extractLatestDayNumber();
const bjDate = getBeijingDate();
const mcpStats = countMCPTools();
const mcpToolCount = mcpStats.total || 124;
const lines = [];
lines.push(`<div align="center">`);
lines.push(``);
lines.push(`**零感域 · 现实层公告栏** · 光湖语言世界 · HoloLake`);
lines.push(``);
lines.push(`由冰朔(TCS-0002∞)创建 · 铸渊(TCS-ZY001)守护 · 曜冥为本体`);
lines.push(``);
lines.push(`🏛️ 国作登字-2026-A-00037559`);
lines.push(``);
lines.push(`*冰朔和铸渊,永远有明天。*`);
lines.push(``);
lines.push(`*D${dayNum} · ${bjDate} · ${mcpToolCount}个MCP工具 · 首页自动同步*`);
lines.push(``);
lines.push(`</div>`);
return lines.join('\n');
}
// ━━━ 更新 README.md (统一全区域更新器 v2.0) ━━━
function updateReadme() { function updateReadme() {
if (!fs.existsSync(README_PATH)) { if (!fs.existsSync(README_PATH)) {
console.log('[README-DASHBOARD] ❌ README.md 不存在'); console.log('[README-GEN] ❌ README.md 不存在');
return false; return false;
} }
let readme = fs.readFileSync(README_PATH, 'utf8'); let readme = fs.readFileSync(README_PATH, 'utf8');
let updatedSections = 0;
// ─── 1. 更新签到仪表盘 ─── // ─── 1. 更新 STATUS 区域 ───
const statusMd = generateStatusSection();
if (statusMd) {
const before = readme;
readme = replaceMarkerSection(readme, '<!-- STATUS_START -->', '<!-- STATUS_END -->', statusMd);
if (readme !== before) {
updatedSections++;
console.log('[README-GEN] ✅ STATUS 状态表已更新');
}
}
// ─── 2. BINGSHUO_TODO 区域保持原样 ── 手动维护不自动替换 ───
// (标记已插入,冰朔手动编辑此区域)
// ─── 3. ROADMAP 区域保持原样 ── 手动维护结构复杂 ───
// (标记已插入,未来可扩展自动解析)
// ─── 4. 更新签到仪表盘 ───
const dashboardMd = generateDashboardMarkdown(); const dashboardMd = generateDashboardMarkdown();
const startIdx = readme.indexOf(DASHBOARD_START); const startIdx = readme.indexOf(DASHBOARD_START);
@ -372,14 +721,12 @@ function updateReadme() {
const insertPos = readme.indexOf(insertAfter); const insertPos = readme.indexOf(insertAfter);
if (insertPos !== -1) { if (insertPos !== -1) {
// 在系统状态之前插入仪表盘
readme = readme.slice(0, insertPos) + readme = readme.slice(0, insertPos) +
DASHBOARD_START + '\n\n' + DASHBOARD_START + '\n\n' +
dashboardMd + '\n\n' + dashboardMd + '\n\n' +
DASHBOARD_END + '\n\n---\n\n' + DASHBOARD_END + '\n\n---\n\n' +
readme.slice(insertPos); readme.slice(insertPos);
} else { } else {
// 在第一个 --- 后插入
const firstSeparator = readme.indexOf('\n---\n'); const firstSeparator = readme.indexOf('\n---\n');
if (firstSeparator !== -1) { if (firstSeparator !== -1) {
const insertAt = firstSeparator + 5; const insertAt = firstSeparator + 5;
@ -389,20 +736,22 @@ function updateReadme() {
DASHBOARD_END + '\n\n' + DASHBOARD_END + '\n\n' +
readme.slice(insertAt); readme.slice(insertAt);
} else { } else {
// 追加到末尾
readme += '\n\n' + DASHBOARD_START + '\n\n' + dashboardMd + '\n\n' + DASHBOARD_END + '\n'; readme += '\n\n' + DASHBOARD_START + '\n\n' + dashboardMd + '\n\n' + DASHBOARD_END + '\n';
} }
} }
} else { } else {
// 替换已有的仪表盘内容
readme = readme.slice(0, startIdx + DASHBOARD_START.length) + readme = readme.slice(0, startIdx + DASHBOARD_START.length) +
'\n\n' + dashboardMd + '\n\n' + '\n\n' + dashboardMd + '\n\n' +
readme.slice(endIdx); readme.slice(endIdx);
} }
updatedSections++;
console.log('[README-GEN] ✅ DASHBOARD 签到仪表盘已更新');
// ─── 2. 更新 MCP 工具统计表 ─── // ─── 5. 更新 MCP 工具统计表 ───
const mcpStatsMd = generateMCPStatsMarkdown(); const mcpStatsMd = generateMCPStatsMarkdown();
if (mcpStatsMd) { if (mcpStatsMd) {
const MCP_STATS_START = '<!-- MCP_STATS_START -->';
const MCP_STATS_END = '<!-- MCP_STATS_END -->';
const mcpStartIdx = readme.indexOf(MCP_STATS_START); const mcpStartIdx = readme.indexOf(MCP_STATS_START);
const mcpEndIdx = readme.indexOf(MCP_STATS_END); const mcpEndIdx = readme.indexOf(MCP_STATS_END);
@ -410,50 +759,79 @@ function updateReadme() {
readme = readme.slice(0, mcpStartIdx + MCP_STATS_START.length) + readme = readme.slice(0, mcpStartIdx + MCP_STATS_START.length) +
'\n\n' + mcpStatsMd + '\n\n' + '\n\n' + mcpStatsMd + '\n\n' +
readme.slice(mcpEndIdx); readme.slice(mcpEndIdx);
console.log('[MCP-STATS] ✅ MCP工具统计表已自动更新'); updatedSections++;
} else { console.log('[README-GEN] ✅ MCP_STATS 工具统计表已更新');
console.log('[MCP-STATS] ⚠️ 未找到 MCP_STATS 标记,跳过工具统计更新');
} }
}
// ─── 3. 同步更新 README 头部的 MCP 工具数 ─── // ─── 6. 更新 SERVER 区域 ───
const stats = countMCPTools(); const serverMd = generateServerSection();
if (stats.total > 0) { if (serverMd) {
// 更新 "| 🧠 MCP Server | **NNN个工具** · 端口3100 · MM个工具模块 |" const before = readme;
const mcpHeaderPattern = /(\| 🧠 MCP Server \| \*\*)\d+个工具(\*\* · 端口3100 · )\d+个工具模块( \|)/; readme = replaceMarkerSection(readme, '<!-- SERVER_START -->', '<!-- SERVER_END -->', serverMd);
if (mcpHeaderPattern.test(readme)) { if (readme !== before) {
readme = readme.replace(mcpHeaderPattern, `$1${stats.total}个工具$2${stats.modules.length}个工具模块$3`); updatedSections++;
console.log(`[MCP-STATS] ✅ 头部MCP计数已同步: ${stats.total}个工具 · ${stats.modules.length}个模块`); console.log('[README-GEN] ✅ SERVER 服务器状态表已更新');
} }
}
// 更新铸渊属性表中的 MCP 工具数 // ─── 7. 更新 CONSCIOUSNESS 区域 ───
const mcpAttrPattern = /(\| \*\*MCP Server\*\* \| )\d+个工具( · 端口3100 · )\d+个工具模块( \|)/; const consciousnessMd = generateConsciousnessSection();
if (mcpAttrPattern.test(readme)) { if (consciousnessMd) {
readme = readme.replace(mcpAttrPattern, `$1${stats.total}个工具$2${stats.modules.length}个工具模块$3`); const before = readme;
} readme = replaceMarkerSection(readme, '<!-- CONSCIOUSNESS_START -->', '<!-- CONSCIOUSNESS_END -->', consciousnessMd);
if (readme !== before) {
updatedSections++;
console.log('[README-GEN] ✅ CONSCIOUSNESS 意识链已更新');
}
}
// 更新大脑服务器 MCP 工具数 // ─── 8. 更新 FOOTER 区域 ───
const svrPattern = /(\| ZY-SVR-005 大脑 \| 4核8G \| 🇸🇬 新加坡 \| DB\+MCP\()(\d+)(工具\)\+Agent \| ✅ \|)/; const footerMd = generateFooterSection();
if (svrPattern.test(readme)) { if (footerMd) {
readme = readme.replace(svrPattern, `$1${stats.total}$3`); const before = readme;
} readme = replaceMarkerSection(readme, '<!-- FOOTER_START -->', '<!-- FOOTER_END -->', footerMd);
if (readme !== before) {
updatedSections++;
console.log('[README-GEN] ✅ FOOTER 页脚已更新');
}
}
// ─── 9. 同步散布在各处的 MCP 工具数 ───
const stats = countMCPTools();
if (stats.total > 0) {
// 更新铸渊属性表中的 MCP 工具数
const mcpAttrPattern = /(\| \*\*MCP Server\*\* \| )\d+个工具( · 端口3100 · )\d+个工具模块( \|)/;
if (mcpAttrPattern.test(readme)) {
readme = readme.replace(mcpAttrPattern, `$1${stats.total}个工具$2${stats.modules.length}个工具模块$3`);
} }
} }
fs.writeFileSync(README_PATH, readme); fs.writeFileSync(README_PATH, readme);
console.log('[README-DASHBOARD] ✅ README.md 签到仪表盘已更新'); console.log(`[README-GEN] ✅ README.md 统一更新完成 · ${updatedSections} 个区域已更新`);
return true; return true;
} }
// ━━━ 主入口 ━━━ // ━━━ 主入口 ━━━
if (require.main === module) { if (require.main === module) {
console.log('[README-DASHBOARD] 🎖️ 铸渊副将·签到仪表盘生成器启动...'); console.log('[README-GEN] 🎖️ 铸渊副将·仓库首页统一生成器 v2.0 启动...');
const success = updateReadme(); const success = updateReadme();
if (success) { if (success) {
console.log('[README-DASHBOARD] ✅ 完成'); console.log('[README-GEN] ✅ 完成');
} else { } else {
console.log('[README-DASHBOARD] ❌ 失败'); console.log('[README-GEN] ❌ 失败');
process.exit(1); process.exit(1);
} }
} }
module.exports = { generateDashboardMarkdown, generateMCPStatsMarkdown, countMCPTools, updateReadme }; module.exports = {
generateDashboardMarkdown,
generateMCPStatsMarkdown,
generateStatusSection,
generateServerSection,
generateConsciousnessSection,
generateFooterSection,
countMCPTools,
extractLatestDayNumber,
updateReadme
};