🏗️ 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:
parent
158f993393
commit
eb3f1ed7ba
|
|
@ -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: |
|
||||||
|
|
|
||||||
38
README.md
38
README.md
|
|
@ -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 -->
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue