Source snapshot: 97d7f0fae96dc04b7ddad56fc1db6a108ed662cc [SEC-CLEAN] · pre-push-clean v1.0 · 109处敏感信息已自动转乱码
27 KiB
27 KiB
belongs_to
| belongs_to | |
|---|---|
|
🏗️ 铸渊指令|五人仓库联邦主控台 · 子仓库 README Dashboard + 自动签到 + 公告栏 + 进度看板(2026-03-21·霜砚签发·冰朔授权)
📌 指令元数据
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 渲染格式
<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 自动更新机制
# .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 渲染格式
<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 自动更新机制
# .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 / memory.json / routing-map.json 均存在 | ❌ 缺失 {文件名} → 需修复 |
| Copilot 指令加载 | ✅ copilot-instructions.md 已加载 | ⚠️ 指令文件缺失或过期 |
| 最近提交活跃度 | ✅ 最近7天有 {N} 次提交 | ⚠️ 超过7天无提交 → 宝宝在睡觉 |
| 广播接收状态 | ✅ 最新广播已接收 · {日期} | ⚠️ 广播未同步 → 检查 HUB_TOKEN |
| Actions 运行状态 | ✅ 最近 workflow 全部成功 | ❌ {workflow名} 失败 → 需排查 |
| 与总仓库连接 | ✅ 总仓库 API 可达 · 延迟 {N}ms | ❌ 连接超时 → 检查网络/Token |
3.2 README 渲染格式
<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
# .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 签到脚本核心逻辑
// 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 渲染格式
<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
# .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
// 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
# .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
九、执行顺序(铸渊读到就做)
Phase 1 · 总仓库准备(在 guanghulab 仓库执行)
- 创建
system-bulletin/LATEST.md(初始公告内容) - 创建
spoke-status/目录 +.gitkeep - 创建
receive-spoke-checkin.ymlworkflow - 为每个子仓库生成只读 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-readmeguanghu-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 前缀