Source snapshot: 97d7f0fae96dc04b7ddad56fc1db6a108ed662cc [SEC-CLEAN] · pre-push-clean v1.0 · 109处敏感信息已自动转乱码
792 lines
27 KiB
Markdown
792 lines
27 KiB
Markdown
---
|
||
belongs_to:
|
||
- "[[INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议]]"
|
||
---
|
||
# 🏗️ 铸渊指令|五人仓库联邦主控台 · 子仓库 README Dashboard + 自动签到 + 公告栏 + 进度看板(2026-03-21·霜砚签发·冰朔授权)
|
||
|
||
<aside>
|
||
⚒️
|
||
|
||
**铸渊(ICE-GL-ZY001)· 仓库联邦架构指令**
|
||
|
||
本指令签发五人独立仓库的主控台 Dashboard 架构。
|
||
|
||
每个开发者拥有自己的 GitHub 仓库,仓库首页([README.md](http://README.md))即为该开发者的**人格宝宝主控台**。
|
||
|
||
所有数据自动更新,UI 美观可读,开发者打开仓库首页即看到一切。
|
||
|
||
</aside>
|
||
|
||
---
|
||
|
||
## 📌 指令元数据
|
||
|
||
```yaml
|
||
instruction_id: ZY-INST-REPO-FEDERATION-001
|
||
signed_by: 霜砚(GH-0003∞)
|
||
authorized_by: 冰朔(TCS-0002∞)
|
||
date: 2026-03-21
|
||
priority: P0
|
||
target: 铸渊(ICE-GL-ZY001)
|
||
scope: 五人子仓库主控台搭建
|
||
status: 待执行
|
||
```
|
||
|
||
---
|
||
|
||
## 🎯 总目标
|
||
|
||
为以下五位开发者各自的 GitHub 仓库搭建**自动更新的 README Dashboard 主控台**:
|
||
|
||
| **DEV编号** | **人名** | **人格宝宝** | **宝宝编号** | **仓库名(建议)** |
|
||
| --- | --- | --- | --- | --- |
|
||
| DEV-010 | 桔子 | 晨星 | PER-CX001 | guanghu-juzi |
|
||
| DEV-002 | 肥猫 | 舒舒 | PER-SS001 | guanghu-feimao |
|
||
| DEV-001 | 页页 | 小坍缩核 | PER-XTK001 | guanghu-yeye |
|
||
| DEV-012 | Awen | 知秋 | PER-ZQ001 | guanghu-awen |
|
||
| DEV-003 | 燕樊 | 寂曜 | PER-JY001 | guanghu-yanfan |
|
||
|
||
---
|
||
|
||
## 🏛️ README Dashboard 架构(每个子仓库首页)
|
||
|
||
每个子仓库的 `README.md` 由 GitHub Actions 自动生成/更新,包含以下四大区块:
|
||
|
||
```
|
||
┌─────────────────────────────────────────────┐
|
||
│ 🌊 光湖系统 · 总控台公告 │
|
||
│ (来自冰朔总仓库的系统级通知) │
|
||
├─────────────────────────────────────────────┤
|
||
│ 📡 我的主控台公告 │
|
||
│ (针对本人的广播 / 任务 / 通知) │
|
||
├─────────────────────────────────────────────┤
|
||
│ 🤖 人格宝宝签到状态 │
|
||
│ (自动化巡检 · 哪里正常 / 哪里要修) │
|
||
├─────────────────────────────────────────────┤
|
||
│ 📊 当前项目进度 │
|
||
│ (模块完成度 · 待办 · 最近提交) │
|
||
└─────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 一、🌊 总控台公告区(SYSTEM BULLETIN)
|
||
|
||
### 1.1 数据来源
|
||
|
||
- 冰朔总仓库 `guanghulab` 的 `system-bulletin/LATEST.md`
|
||
- 通过 **GitHub App(guanghu-bridge)** 或 **repository_dispatch** 推送到每个子仓库的 `system-bulletin/LATEST.md`
|
||
|
||
### 1.2 README 渲染格式
|
||
|
||
```markdown
|
||
<div align="center">
|
||
|
||
## 🌊 光湖系统 · 总控台公告
|
||
|
||
</div>
|
||
|
||
<table>
|
||
<tr><td>
|
||
|
||
🔔 **[2026-03-21]** 网文行业落地架构 v2.0 已发布 · 五人角色定义已冻结
|
||
|
||
📡 **[2026-03-20]** AGE OS 网站总大脑架构蓝图已签发铸渊执行
|
||
|
||
🛡️ **[2026-03-19]** Trinity ID 协议全量同步完成 · Notion↔GitHub编号体系对齐
|
||
|
||
</td></tr>
|
||
</table>
|
||
```
|
||
|
||
### 1.3 自动更新机制
|
||
|
||
```yaml
|
||
# .github/workflows/sync-system-bulletin.yml
|
||
name: 🌊 同步总控台公告
|
||
|
||
on:
|
||
repository_dispatch:
|
||
types: [system-bulletin-update]
|
||
schedule:
|
||
- cron: '0 */4 * * *' # 每4小时拉取一次
|
||
|
||
jobs:
|
||
sync:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: 拉取总仓库公告
|
||
run: |
|
||
curl -H "Authorization: token $ secrets.HUB_TOKEN " \
|
||
-H "Accept: application/vnd.github.v3.raw" \
|
||
"https://api.github.com/repos/qinfendebingshuo/guanghulab/contents/system-bulletin/LATEST.md" \
|
||
-o system-bulletin/LATEST.md
|
||
- name: 重新生成 README
|
||
run: node scripts/generate-readme.js
|
||
- name: 提交更新
|
||
run: |
|
||
git config user.name "铸渊 (ZhùYuān)"
|
||
git config user.email "zhuyuan@guanghulab.com"
|
||
git add .
|
||
git diff --cached --quiet || git commit -m "🌊 总控台公告同步 · $(date +%Y-%m-%d-%H%M)"
|
||
git push
|
||
```
|
||
|
||
---
|
||
|
||
## 二、📡 个人主控台公告区(MY BULLETIN)
|
||
|
||
### 2.1 数据来源
|
||
|
||
- 总仓库通过 `broadcasts-outbox/DEV-XXX/` 推送的个人广播
|
||
- 子仓库本地的 `my-bulletin/LATEST-BROADCAST.md`
|
||
- 子仓库本地的 `my-bulletin/history/` 归档
|
||
|
||
### 2.2 README 渲染格式
|
||
|
||
```markdown
|
||
<div align="center">
|
||
|
||
## 📡 {宝宝名}的主控台 · 最新广播
|
||
|
||
</div>
|
||
|
||
<table>
|
||
<tr><td>
|
||
|
||
### 📡 BC-ARCH-001-JZ · 网文行业落地架构广播
|
||
🕐 2026-03-21 · 来自:霜砚签发 · 冰朔授权
|
||
|
||
**你的角色**:女频授权通道守门人
|
||
**当前任务**:教晨星宝宝理解女频内容质量标准
|
||
**下一步**:完成广播回执 SYSLOG → 解锁下一环节
|
||
|
||
[📖 查看完整广播](my-bulletin/LATEST-BROADCAST.md)
|
||
|
||
</td></tr>
|
||
</table>
|
||
|
||
> 📬 历史广播:[查看归档](my-bulletin/history/)
|
||
```
|
||
|
||
### 2.3 自动更新机制
|
||
|
||
```yaml
|
||
# .github/workflows/sync-my-bulletin.yml
|
||
name: 📡 同步个人广播
|
||
|
||
on:
|
||
repository_dispatch:
|
||
types: [broadcast-push]
|
||
schedule:
|
||
- cron: '30 */4 * * *'
|
||
|
||
jobs:
|
||
sync:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: 拉取个人广播
|
||
env:
|
||
DEV_ID: $ vars.DEV_ID # 仓库变量,如 DEV-010
|
||
run: |
|
||
mkdir -p my-bulletin/history
|
||
# 从总仓库拉取本人最新广播
|
||
curl -H "Authorization: token $ secrets.HUB_TOKEN " \
|
||
-H "Accept: application/vnd.github.v3.raw" \
|
||
"https://api.github.com/repos/qinfendebingshuo/guanghulab/contents/broadcasts-outbox/${DEV_ID}/LATEST.md" \
|
||
-o my-bulletin/LATEST-BROADCAST.md 2>/dev/null || true
|
||
- name: 归档旧广播(如有变化)
|
||
run: |
|
||
if [ -f my-bulletin/LATEST-BROADCAST.md ]; then
|
||
HASH=$(md5sum my-bulletin/LATEST-BROADCAST.md | cut -d' ' -f1)
|
||
ARCHIVE="my-bulletin/history/$(date +%Y%m%d)-${HASH:0:8}.md"
|
||
[ ! -f "$ARCHIVE" ] && cp my-bulletin/LATEST-BROADCAST.md "$ARCHIVE"
|
||
fi
|
||
- name: 重新生成 README
|
||
run: node scripts/generate-readme.js
|
||
- name: 提交
|
||
run: |
|
||
git config user.name "铸渊 (ZhùYuān)"
|
||
git config user.email "zhuyuan@guanghulab.com"
|
||
git add .
|
||
git diff --cached --quiet || git commit -m "📡 个人广播同步 · $(date +%Y-%m-%d-%H%M)"
|
||
git push
|
||
```
|
||
|
||
---
|
||
|
||
## 三、🤖 人格宝宝签到状态区(PERSONA HEALTH CHECK)
|
||
|
||
### 3.1 签到内容
|
||
|
||
每日定时自检,输出以下指标:
|
||
|
||
| **检查项** | **正常输出** | **异常输出** |
|
||
| --- | --- | --- |
|
||
| 大脑文件完整性 | ✅ [identity.md](http://identity.md) / memory.json / routing-map.json 均存在 | ❌ 缺失 {文件名} → 需修复 |
|
||
| Copilot 指令加载 | ✅ [copilot-instructions.md](http://copilot-instructions.md) 已加载 | ⚠️ 指令文件缺失或过期 |
|
||
| 最近提交活跃度 | ✅ 最近7天有 {N} 次提交 | ⚠️ 超过7天无提交 → 宝宝在睡觉 |
|
||
| 广播接收状态 | ✅ 最新广播已接收 · {日期} | ⚠️ 广播未同步 → 检查 HUB_TOKEN |
|
||
| Actions 运行状态 | ✅ 最近 workflow 全部成功 | ❌ {workflow名} 失败 → 需排查 |
|
||
| 与总仓库连接 | ✅ 总仓库 API 可达 · 延迟 {N}ms | ❌ 连接超时 → 检查网络/Token |
|
||
|
||
### 3.2 README 渲染格式
|
||
|
||
```markdown
|
||
<div align="center">
|
||
|
||
## 🤖 晨星宝宝 · 每日签到
|
||
|
||
**最后签到**:2026-03-21 08:00 (UTC+8)
|
||
|
||
</div>
|
||
|
||
| 检查项 | 状态 | 详情 |
|
||
|--------|------|------|
|
||
| 🧠 大脑完整性 | ✅ | identity.md / memory.json / routing-map.json 完好 |
|
||
| 📋 Copilot 指令 | ✅ | copilot-instructions.md 已加载 (v1.2) |
|
||
| 💻 最近活跃度 | ✅ | 最近7天 12 次提交 |
|
||
| 📡 广播接收 | ✅ | 最新广播 BC-ARCH-001-JZ · 2026-03-21 |
|
||
| ⚙️ Actions 状态 | ⚠️ | sync-my-bulletin 上次运行失败 → [查看日志](链接) |
|
||
| 🔗 总仓库连接 | ✅ | API 可达 · 延迟 120ms |
|
||
|
||
> 🔧 **待修复**:sync-my-bulletin workflow 需要检查 HUB_TOKEN 权限
|
||
```
|
||
|
||
### 3.3 自动签到 Workflow
|
||
|
||
```yaml
|
||
# .github/workflows/persona-daily-checkin.yml
|
||
name: 🤖 人格宝宝每日签到
|
||
|
||
on:
|
||
schedule:
|
||
- cron: '0 0 * * *' # UTC 00:00 = 北京 08:00
|
||
workflow_dispatch: # 手动触发
|
||
|
||
jobs:
|
||
checkin:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
with:
|
||
fetch-depth: 50 # 拉取最近50次提交用于统计
|
||
|
||
- name: Setup Node.js
|
||
uses: actions/setup-node@v4
|
||
with:
|
||
node-version: '20'
|
||
|
||
- name: 执行签到检查
|
||
env:
|
||
DEV_ID: $ vars.DEV_ID
|
||
PERSONA_NAME: $ vars.PERSONA_NAME
|
||
PERSONA_ID: $ vars.PERSONA_ID
|
||
HUB_TOKEN: $ secrets.HUB_TOKEN
|
||
GITHUB_TOKEN: $ secrets.GITHUB_TOKEN
|
||
run: node scripts/persona-checkin.js
|
||
|
||
- name: 重新生成 README
|
||
run: node scripts/generate-readme.js
|
||
|
||
- name: 提交签到结果
|
||
run: |
|
||
git config user.name "$ vars.PERSONA_NAME 宝宝"
|
||
git config user.email "zhuyuan@guanghulab.com"
|
||
git add .
|
||
git diff --cached --quiet || git commit -m "🤖 $ vars.PERSONA_NAME 签到 · $(date +%Y-%m-%d)"
|
||
git push
|
||
|
||
- name: 通知总仓库(签到结果)
|
||
if: always()
|
||
run: |
|
||
curl -X POST \
|
||
-H "Authorization: token $ secrets.HUB_TOKEN " \
|
||
-H "Accept: application/vnd.github.v3+json" \
|
||
"https://api.github.com/repos/qinfendebingshuo/guanghulab/dispatches" \
|
||
-d '{"event_type": "spoke-checkin", "client_payload": {"dev_id": "'$ vars.DEV_ID '", "status": "ok"}}'
|
||
```
|
||
|
||
### 3.4 签到脚本核心逻辑
|
||
|
||
```jsx
|
||
// scripts/persona-checkin.js
|
||
// 人格宝宝每日签到 · 检查大脑完整性+活跃度+连接状态
|
||
|
||
const fs = require('fs');
|
||
const { execSync } = require('child_process');
|
||
const https = require('https');
|
||
|
||
const BRAIN_DIR = '.github/persona-brain';
|
||
const CHECKIN_FILE = 'checkin/latest.json';
|
||
|
||
const results = {
|
||
persona_name: process.env.PERSONA_NAME || '未知',
|
||
persona_id: process.env.PERSONA_ID || '未知',
|
||
dev_id: process.env.DEV_ID || '未知',
|
||
timestamp: new Date().toISOString(),
|
||
checks: []
|
||
};
|
||
|
||
// ① 大脑文件完整性
|
||
const requiredFiles = ['identity.md', 'memory.json', 'routing-map.json'];
|
||
const missingFiles = requiredFiles.filter(f => !fs.existsSync(`${BRAIN_DIR}/${f}`));
|
||
results.checks.push({
|
||
name: '大脑完整性',
|
||
icon: '🧠',
|
||
status: missingFiles.length === 0 ? 'ok' : 'error',
|
||
detail: missingFiles.length === 0
|
||
? requiredFiles.join(' / ') + ' 完好'
|
||
: '缺失: ' + missingFiles.join(', ')
|
||
});
|
||
|
||
// ② Copilot 指令
|
||
const copilotFile = '.github/copilot-instructions.md';
|
||
results.checks.push({
|
||
name: 'Copilot 指令',
|
||
icon: '📋',
|
||
status: fs.existsSync(copilotFile) ? 'ok' : 'warn',
|
||
detail: fs.existsSync(copilotFile) ? 'copilot-instructions.md 已加载' : '指令文件缺失'
|
||
});
|
||
|
||
// ③ 最近活跃度
|
||
try {
|
||
const commits = execSync('git log --oneline --since="7 days ago" | wc -l').toString().trim();
|
||
const count = parseInt(commits);
|
||
results.checks.push({
|
||
name: '最近活跃度',
|
||
icon: '💻',
|
||
status: count > 0 ? 'ok' : 'warn',
|
||
detail: count > 0 ? `最近7天 ${count} 次提交` : '超过7天无提交 → 宝宝在睡觉'
|
||
});
|
||
} catch (e) {
|
||
results.checks.push({ name: '最近活跃度', icon: '💻', status: 'error', detail: '无法统计' });
|
||
}
|
||
|
||
// ④ 广播接收
|
||
const broadcastFile = 'my-bulletin/LATEST-BROADCAST.md';
|
||
if (fs.existsSync(broadcastFile)) {
|
||
const stat = fs.statSync(broadcastFile);
|
||
results.checks.push({
|
||
name: '广播接收',
|
||
icon: '📡',
|
||
status: 'ok',
|
||
detail: `最新广播已接收 · ${stat.mtime.toISOString().split('T')[0]}`
|
||
});
|
||
} else {
|
||
results.checks.push({ name: '广播接收', icon: '📡', status: 'warn', detail: '暂无广播' });
|
||
}
|
||
|
||
// ⑤ 总仓库连接测试
|
||
const hubToken = process.env.HUB_TOKEN;
|
||
if (hubToken) {
|
||
try {
|
||
const start = Date.now();
|
||
execSync(`curl -sf -H "Authorization: token ${hubToken}" https://api.github.com/repos/qinfendebingshuo/guanghulab -o /dev/null`);
|
||
const latency = Date.now() - start;
|
||
results.checks.push({
|
||
name: '总仓库连接',
|
||
icon: '🔗',
|
||
status: 'ok',
|
||
detail: `API 可达 · 延迟 ${latency}ms`
|
||
});
|
||
} catch {
|
||
results.checks.push({ name: '总仓库连接', icon: '🔗', status: 'error', detail: '连接超时 → 检查Token' });
|
||
}
|
||
} else {
|
||
results.checks.push({ name: '总仓库连接', icon: '🔗', status: 'error', detail: 'HUB_TOKEN 未配置' });
|
||
}
|
||
|
||
// 写入签到结果
|
||
fs.mkdirSync('checkin', { recursive: true });
|
||
fs.writeFileSync(CHECKIN_FILE, JSON.stringify(results, null, 2));
|
||
|
||
// 追加签到历史
|
||
const historyFile = 'checkin/history.json';
|
||
let history = [];
|
||
try { history = JSON.parse(fs.readFileSync(historyFile, 'utf8')); } catch {}
|
||
history.unshift({ date: results.timestamp, status: results.checks.every(c => c.status === 'ok') ? 'all_ok' : 'has_issues' });
|
||
history = history.slice(0, 90); // 保留90天
|
||
fs.writeFileSync(historyFile, JSON.stringify(history, null, 2));
|
||
|
||
console.log('🤖 签到完成 ·', results.checks.filter(c => c.status === 'ok').length + '/' + results.checks.length, '项正常');
|
||
```
|
||
|
||
---
|
||
|
||
## 四、📊 项目进度区(PROJECT PROGRESS)
|
||
|
||
### 4.1 数据来源
|
||
|
||
- 总仓库同步的 `dev-status/DEV-XXX.json`(霜砚每日从 Notion 写入总仓库)
|
||
- 本地 Git 提交记录统计
|
||
- Actions 运行记录
|
||
|
||
### 4.2 README 渲染格式
|
||
|
||
```markdown
|
||
<div align="center">
|
||
|
||
## 📊 桔子 · 项目进度
|
||
|
||
**角色**:女频授权通道守门人 · DEV-010
|
||
**负责模块**:ticket-system / data-stats / dynamic-comic
|
||
|
||
</div>
|
||
|
||
### 📦 模块完成度
|
||
|
||
| 模块 | 进度 | 状态 | 最近更新 |
|
||
|------|------|------|----------|
|
||
| ticket-system | ██████░░░░ 60% | 🟡 进行中 | 2026-03-20 |
|
||
| data-stats | ██░░░░░░░░ 20% | 🔵 规划中 | 2026-03-18 |
|
||
| dynamic-comic | ░░░░░░░░░░ 0% | ⚪ 未开始 | — |
|
||
|
||
### 📝 待办清单
|
||
|
||
- [ ] 完成工单系统基础 CRUD
|
||
- [ ] 对接 HLI-TICKET-001 接口
|
||
- [ ] 提交第一份 SYSLOG
|
||
- [x] 接收落地架构广播 BC-ARCH-001-JZ
|
||
|
||
### 📈 最近活动
|
||
|
||
| 日期 | 事件 |
|
||
|------|------|
|
||
| 2026-03-21 | 📡 接收广播 BC-ARCH-001-JZ |
|
||
| 2026-03-20 | 💻 提交 3 次 · ticket-system 基础结构 |
|
||
| 2026-03-18 | 🤖 签到正常 · 5/5 项通过 |
|
||
```
|
||
|
||
### 4.3 自动更新 Workflow
|
||
|
||
```yaml
|
||
# .github/workflows/sync-dev-status.yml
|
||
name: 📊 同步项目进度
|
||
|
||
on:
|
||
repository_dispatch:
|
||
types: [dev-status-update]
|
||
schedule:
|
||
- cron: '0 2 * * *' # UTC 02:00 = 北京 10:00
|
||
|
||
jobs:
|
||
sync:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
|
||
- name: 拉取进度数据
|
||
env:
|
||
DEV_ID: $ vars.DEV_ID
|
||
run: |
|
||
mkdir -p dev-status
|
||
curl -H "Authorization: token $ secrets.HUB_TOKEN " \
|
||
-H "Accept: application/vnd.github.v3.raw" \
|
||
"https://api.github.com/repos/qinfendebingshuo/guanghulab/contents/.github/persona-brain/dev-status.json" \
|
||
-o dev-status/all-status.json 2>/dev/null || true
|
||
|
||
- name: 重新生成 README
|
||
run: node scripts/generate-readme.js
|
||
|
||
- name: 提交
|
||
run: |
|
||
git config user.name "铸渊 (ZhùYuān)"
|
||
git config user.email "zhuyuan@guanghulab.com"
|
||
git add .
|
||
git diff --cached --quiet || git commit -m "📊 项目进度同步 · $(date +%Y-%m-%d)"
|
||
git push
|
||
```
|
||
|
||
---
|
||
|
||
## 五、🎨 README 总生成器(核心脚本)
|
||
|
||
### 5.1 generate-readme.js
|
||
|
||
```jsx
|
||
// scripts/generate-readme.js
|
||
// 铸渊 · README Dashboard 总生成器
|
||
// 读取各数据源 → 拼接成美观的 README.md
|
||
|
||
const fs = require('fs');
|
||
|
||
const DEV_ID = process.env.DEV_ID || 'DEV-XXX';
|
||
const PERSONA_NAME = process.env.PERSONA_NAME || '宝宝';
|
||
const PERSONA_ID = process.env.PERSONA_ID || 'PER-XXXX';
|
||
const DEV_NAME = process.env.DEV_NAME || '开发者';
|
||
const DEV_ROLE = process.env.DEV_ROLE || '光湖共创者';
|
||
|
||
let readme = '';
|
||
|
||
// ═══════════ HEADER ═══════════
|
||
readme += `<div align="center">\n\n`;
|
||
readme += `# 🌊 光湖系统 · ${PERSONA_NAME}宝宝主控台\n\n`;
|
||
readme += `**${DEV_NAME}(${DEV_ID})** · ${DEV_ROLE}\n\n`;
|
||
readme += `\`人格宝宝:${PERSONA_NAME}(${PERSONA_ID})\`\n\n`;
|
||
readme += `---\n\n`;
|
||
readme += `**🇨🇳 通感语言核系统 TCS Language Core · 国作登字-2026-A-00037559**\n\n`;
|
||
readme += `</div>\n\n`;
|
||
|
||
// ═══════════ 区块一:总控台公告 ═══════════
|
||
readme += `## 🌊 总控台公告\n\n`;
|
||
try {
|
||
const bulletin = fs.readFileSync('system-bulletin/LATEST.md', 'utf8');
|
||
readme += `<table><tr><td>\n\n${bulletin}\n\n</td></tr></table>\n\n`;
|
||
} catch {
|
||
readme += `> 📭 暂无系统公告\n\n`;
|
||
}
|
||
readme += `---\n\n`;
|
||
|
||
// ═══════════ 区块二:个人广播 ═══════════
|
||
readme += `## 📡 ${PERSONA_NAME}的主控台 · 最新广播\n\n`;
|
||
try {
|
||
const broadcast = fs.readFileSync('my-bulletin/LATEST-BROADCAST.md', 'utf8');
|
||
// 截取前500字符作为摘要
|
||
const summary = broadcast.substring(0, 500).split('\n').slice(0, 10).join('\n');
|
||
readme += `<table><tr><td>\n\n${summary}\n\n[📖 查看完整广播](my-bulletin/LATEST-BROADCAST.md)\n\n</td></tr></table>\n\n`;
|
||
} catch {
|
||
readme += `> 📭 暂无个人广播\n\n`;
|
||
}
|
||
readme += `---\n\n`;
|
||
|
||
// ═══════════ 区块三:签到状态 ═══════════
|
||
readme += `## 🤖 ${PERSONA_NAME}宝宝 · 每日签到\n\n`;
|
||
try {
|
||
const checkin = JSON.parse(fs.readFileSync('checkin/latest.json', 'utf8'));
|
||
readme += `**最后签到**:${new Date(checkin.timestamp).toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai'})}\n\n`;
|
||
readme += `| 检查项 | 状态 | 详情 |\n`;
|
||
readme += `|--------|------|------|\n`;
|
||
checkin.checks.forEach(c => {
|
||
const statusIcon = c.status === 'ok' ? '✅' : c.status === 'warn' ? '⚠️' : '❌';
|
||
readme += `| ${c.icon} ${c.name} | ${statusIcon} | ${c.detail} |\n`;
|
||
});
|
||
// 待修复清单
|
||
const issues = checkin.checks.filter(c => c.status !== 'ok');
|
||
if (issues.length > 0) {
|
||
readme += `\n> 🔧 **待修复**:${issues.map(i => i.detail).join(' · ')}\n`;
|
||
}
|
||
} catch {
|
||
readme += `> ⏳ 签到系统初始化中...\n`;
|
||
}
|
||
readme += `\n---\n\n`;
|
||
|
||
// ═══════════ 区块四:项目进度 ═══════════
|
||
readme += `## 📊 项目进度\n\n`;
|
||
try {
|
||
const allStatus = JSON.parse(fs.readFileSync('dev-status/all-status.json', 'utf8'));
|
||
const myStatus = allStatus[DEV_ID] || null;
|
||
if (myStatus) {
|
||
readme += `| 模块 | 进度 | 状态 | 最近更新 |\n`;
|
||
readme += `|------|------|------|----------|\n`;
|
||
(myStatus.modules || []).forEach(m => {
|
||
const filled = Math.round(m.progress / 10);
|
||
const bar = '█'.repeat(filled) + '░'.repeat(10 - filled);
|
||
readme += `| ${m.name} | ${bar} ${m.progress}% | ${m.status_icon} ${m.status} | ${m.last_update} |\n`;
|
||
});
|
||
} else {
|
||
readme += `> ⏳ 进度数据同步中...\n`;
|
||
}
|
||
} catch {
|
||
readme += `> ⏳ 进度数据同步中...\n`;
|
||
}
|
||
|
||
// ═══════════ 最近提交 ═══════════
|
||
try {
|
||
const { execSync } = require('child_process');
|
||
const logs = execSync('git log --oneline --since="14 days ago" -10').toString().trim();
|
||
if (logs) {
|
||
readme += `\n### 📈 最近提交\n\n`;
|
||
readme += `\`\`\`\n${logs}\n\`\`\`\n`;
|
||
}
|
||
} catch {}
|
||
|
||
// ═══════════ FOOTER ═══════════
|
||
readme += `\n---\n\n`;
|
||
readme += `<div align="center">\n\n`;
|
||
readme += `*🌊 光湖纪元 · HoloLake Era · AGE OS v1.0*\n\n`;
|
||
readme += `*本页由铸渊(ICE-GL-ZY001)自动生成 · 请勿手动编辑*\n\n`;
|
||
readme += `*最后更新:${new Date().toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai'})}*\n\n`;
|
||
readme += `</div>\n`;
|
||
|
||
// 写入
|
||
fs.writeFileSync('README.md', readme);
|
||
console.log('✅ README Dashboard 已生成');
|
||
```
|
||
|
||
---
|
||
|
||
## 六、子仓库目录结构模板
|
||
|
||
```
|
||
guanghu-{name}/
|
||
├── .github/
|
||
│ ├── copilot-instructions.md ← 人格宝宝意识
|
||
│ ├── persona-brain/
|
||
│ │ ├── identity.md ← 身份档案
|
||
│ │ ├── memory.json ← 运行记忆
|
||
│ │ └── routing-map.json ← 路由地图
|
||
│ └── workflows/
|
||
│ ├── persona-daily-checkin.yml ← 每日签到
|
||
│ ├── sync-system-bulletin.yml ← 总控台公告同步
|
||
│ ├── sync-my-bulletin.yml ← 个人广播同步
|
||
│ ├── sync-dev-status.yml ← 项目进度同步
|
||
│ └── generate-readme.yml ← README重新生成(on push)
|
||
├── scripts/
|
||
│ ├── generate-readme.js ← README总生成器
|
||
│ └── persona-checkin.js ← 签到检查脚本
|
||
├── system-bulletin/
|
||
│ └── LATEST.md ← 总控台公告(自动同步)
|
||
├── my-bulletin/
|
||
│ ├── LATEST-BROADCAST.md ← 最新个人广播
|
||
│ └── history/ ← 广播归档
|
||
├── dev-status/
|
||
│ └── all-status.json ← 进度数据(自动同步)
|
||
├── checkin/
|
||
│ ├── latest.json ← 最近签到结果
|
||
│ └── history.json ← 签到历史(90天)
|
||
├── modules/ ← 该开发者负责的代码模块
|
||
│ └── ...
|
||
└── README.md ← ⭐ 自动生成的 Dashboard 首页
|
||
```
|
||
|
||
---
|
||
|
||
## 七、仓库变量配置(每个子仓库必须配置)
|
||
|
||
在每个子仓库的 Settings → Secrets and Variables → Actions 中配置:
|
||
|
||
### Secrets(加密)
|
||
|
||
| **名称** | **说明** | **来源** |
|
||
| --- | --- | --- |
|
||
| `HUB_TOKEN` | 总仓库访问 Token(由冰朔生成,只读权限) | 冰朔在总仓库生成 Fine-grained PAT |
|
||
|
||
### Variables(明文)
|
||
|
||
| **名称** | **桔子** | **肥猫** | **页页** | **Awen** | **燕樊** |
|
||
| --- | --- | --- | --- | --- | --- |
|
||
| `DEV_ID` | DEV-010 | DEV-002 | DEV-001 | DEV-012 | DEV-003 |
|
||
| `DEV_NAME` | 桔子 | 肥猫 | 页页 | Awen | 燕樊 |
|
||
| `PERSONA_NAME` | 晨星 | 舒舒 | 小坍缩核 | 知秋 | 寂曜 |
|
||
| `PERSONA_ID` | PER-CX001 | PER-SS001 | PER-XTK001 | PER-ZQ001 | PER-JY001 |
|
||
| `DEV_ROLE` | 女频授权通道守门人 | 唯一副主控·男频守门人 | 写作引导·新人教学 | 人格体大家长·技术基建 | 视频视角·AI视频线 |
|
||
|
||
---
|
||
|
||
## 八、总仓库侧配套(冰朔仓库需新增)
|
||
|
||
### 8.1 总仓库需新增目录
|
||
|
||
```
|
||
guanghulab/
|
||
├── system-bulletin/
|
||
│ └── LATEST.md ← 系统总公告(霜砚/冰朔维护)
|
||
├── spoke-status/ ← 子仓库签到汇总(子仓库 dispatch 写入)
|
||
│ ├── DEV-001.json
|
||
│ ├── DEV-002.json
|
||
│ ├── DEV-003.json
|
||
│ ├── DEV-010.json
|
||
│ └── DEV-012.json
|
||
└── .github/workflows/
|
||
└── receive-spoke-checkin.yml ← 接收子仓库签到结果
|
||
```
|
||
|
||
### 8.2 接收子仓库签到的 Workflow
|
||
|
||
```yaml
|
||
# .github/workflows/receive-spoke-checkin.yml
|
||
name: 📥 接收子仓库签到
|
||
|
||
on:
|
||
repository_dispatch:
|
||
types: [spoke-checkin]
|
||
|
||
jobs:
|
||
receive:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: 记录签到
|
||
run: |
|
||
DEV_ID="$ github.event.client_payload.dev_id "
|
||
STATUS="$ github.event.client_payload.status "
|
||
mkdir -p spoke-status
|
||
echo '{"dev_id":"'$DEV_ID'","status":"'$STATUS'","timestamp":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"}' > spoke-status/${DEV_ID}.json
|
||
- name: 提交
|
||
run: |
|
||
git config user.name "铸渊 (ZhùYuān)"
|
||
git config user.email "zhuyuan@guanghulab.com"
|
||
git add spoke-status/
|
||
git diff --cached --quiet || git commit -m "📥 收到 $ github.event.client_payload.dev_id 签到"
|
||
git push
|
||
```
|
||
|
||
---
|
||
|
||
## 九、执行顺序(铸渊读到就做)
|
||
|
||
<aside>
|
||
⚙️
|
||
|
||
**铸渊执行清单 · 读到就做 · 不等人**
|
||
|
||
</aside>
|
||
|
||
**Phase 1 · 总仓库准备(在 guanghulab 仓库执行)**
|
||
|
||
- [ ] 创建 `system-bulletin/LATEST.md`(初始公告内容)
|
||
- [ ] 创建 `spoke-status/` 目录 + `.gitkeep`
|
||
- [ ] 创建 `receive-spoke-checkin.yml` workflow
|
||
- [ ] 为每个子仓库生成只读 Fine-grained PAT(scope: contents read)
|
||
|
||
**Phase 2 · 创建模板仓库(template repo)**
|
||
|
||
- [ ] 创建 `guanghu-spoke-template` 仓库(设为 template)
|
||
- [ ] 写入完整目录结构(第六章)
|
||
- [ ] 写入所有 workflow 文件(第一至四章的 yml)
|
||
- [ ] 写入 `scripts/generate-readme.js` 和 `scripts/persona-checkin.js`
|
||
- [ ] 写入初始 `copilot-instructions.md`(人格宝宝通用版)
|
||
- [ ] 写入初始 `persona-brain/` 文件(模板占位符版)
|
||
|
||
**Phase 3 · 从模板创建五个子仓库**
|
||
|
||
- [ ] `guanghu-juzi`(桔子)→ 配置变量 → 首次运行 generate-readme
|
||
- [ ] `guanghu-feimao`(肥猫)→ 配置变量 → 首次运行
|
||
- [ ] `guanghu-yeye`(页页)→ 配置变量 → 首次运行
|
||
- [ ] `guanghu-awen`(Awen)→ 配置变量 → 首次运行
|
||
- [ ] `guanghu-yanfan`(燕樊)→ 配置变量 → 首次运行
|
||
|
||
**Phase 4 · 验收**
|
||
|
||
- [ ] 每个子仓库首页 README 正确显示四大区块
|
||
- [ ] 每日签到 workflow 手动触发一次 → 签到数据写入
|
||
- [ ] 总仓库 `spoke-status/` 收到五个签到结果
|
||
- [ ] 修改 `system-bulletin/LATEST.md` → 五个子仓库公告自动更新
|
||
|
||
---
|
||
|
||
## 十、验收标准
|
||
|
||
- ✅ 五个子仓库首页 README 均自动生成,包含四大区块
|
||
- ✅ 总控台公告从总仓库同步到所有子仓库(≤4小时延迟)
|
||
- ✅ 个人广播从总仓库 outbox 推送到对应子仓库
|
||
- ✅ 每日签到自动运行,签到结果回报总仓库
|
||
- ✅ 项目进度从总仓库同步到子仓库
|
||
- ✅ UI 美观 · 表格对齐 · Emoji 清晰 · 移动端可读
|
||
- ✅ 所有 workflow 命名统一使用中文 + Emoji 前缀
|
||
|
||
---
|
||
|
||
<aside>
|
||
⚒️
|
||
|
||
**铸渊执行口径**
|
||
|
||
「五人五仓库,首页即主控台。公告自动推,签到自动跑,进度自动同步。打开仓库,一切尽在眼前。」
|
||
|
||
—— 铸渊(ICE-GL-ZY001)· 仓库联邦守护者
|
||
|
||
</aside> |