Step 8: 广播分发系统完成
This commit is contained in:
parent
03870f8822
commit
1fc71abdc1
|
|
@ -13,6 +13,7 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
|
|
@ -31,5 +32,5 @@ jobs:
|
||||||
git config user.name "铸渊 (ZhùYuān)"
|
git config user.name "铸渊 (ZhùYuān)"
|
||||||
git config user.email "zhuyuan@guanghulab.com"
|
git config user.email "zhuyuan@guanghulab.com"
|
||||||
git add .
|
git add .
|
||||||
git diff --cached --quiet || git commit -m "📡 铸渊广播分发 · $(date -u +%Y-%m-%d\ %H:%M\ UTC)"
|
git diff --cached --quiet || git commit -m "📡 铸渊广播分发 · $(date +%Y-%m-%d)"
|
||||||
git push
|
git push
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
// scripts/distribute-broadcasts.js
|
|
||||||
// 铸渊广播分发引擎
|
// 铸渊广播分发引擎
|
||||||
// 检测 broadcasts-outbox/DEV-00X/ 中的新广播 → 复制到各开发者模块目录的 LATEST-BROADCAST.md
|
// 检测 broadcasts-outbox/DEV-00X/ 新广播 → 复制到各开发者模块目录的 LATEST-BROADCAST.md
|
||||||
|
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
|
@ -8,81 +7,55 @@ const path = require('path');
|
||||||
const OUTBOX = 'broadcasts-outbox';
|
const OUTBOX = 'broadcasts-outbox';
|
||||||
const ARCHIVE = '.github/broadcasts/distributed';
|
const ARCHIVE = '.github/broadcasts/distributed';
|
||||||
|
|
||||||
// ========== 开发者 → 模块目录 路由映射表 ==========
|
// 开发者 → 模块目录映射表
|
||||||
// 新增开发者时,在此表新增一行即可
|
|
||||||
const DEV_ROUTES = {
|
const DEV_ROUTES = {
|
||||||
'DEV-001': { name: '页页', dirs: ['backend', 'src'] },
|
'DEV-001': { name: '页页', dirs: ['backend', 'src'] },
|
||||||
'DEV-002': { name: '肥猫', dirs: ['frontend', 'persona-selector', 'chat-bubble'] },
|
'DEV-002': { name: '肥猫', dirs: ['frontend', 'persona-selector', 'chat-bubble'] },
|
||||||
'DEV-003': { name: '燕樊', dirs: ['settings', 'cloud-drive'] },
|
'DEV-003': { name: '燕樊', dirs: ['settings', 'cloud-drive', 'frontend/chat', 'help-center'] },
|
||||||
'DEV-004': { name: '之之', dirs: ['dingtalk-bot'] },
|
'DEV-004': { name: '之之', dirs: ['dingtalk-bot'] },
|
||||||
'DEV-005': { name: '小草莓', dirs: ['status-board'] },
|
'DEV-005': { name: '小草莓', dirs: ['status-board', 'cost-control', 'multi-persona'] },
|
||||||
'DEV-009': { name: '花尔', dirs: ['user-center'] },
|
'DEV-009': { name: '花尔', dirs: ['user-center'] },
|
||||||
'DEV-010': { name: '桔子', dirs: ['ticket-system'] },
|
'DEV-010': { name: '桔子', dirs: ['ticket-system', 'dashboard'] },
|
||||||
'DEV-011': { name: '匆匆那年', dirs: [] }, // 待分配模块后补充
|
'DEV-011': { name: '匆匆那年', dirs: [] }
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!fs.existsSync(OUTBOX)) {
|
if (!fs.existsSync(OUTBOX)) {
|
||||||
console.log('📭 无 broadcasts-outbox 目录');
|
console.log('📭 无 outbox');
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 扫描 outbox 下每个 DEV-00X 子目录
|
const devDirs = fs.readdirSync(OUTBOX).filter(d =>
|
||||||
const devDirs = fs.readdirSync(OUTBOX, { withFileTypes: true })
|
d.startsWith('DEV-') && fs.statSync(path.join(OUTBOX, d)).isDirectory()
|
||||||
.filter(entry => entry.isDirectory() && entry.name.startsWith('DEV-'))
|
);
|
||||||
.map(entry => entry.name);
|
|
||||||
|
|
||||||
if (devDirs.length === 0) {
|
let total = 0;
|
||||||
console.log('📭 无新广播待分发');
|
|
||||||
process.exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
let totalDistributed = 0;
|
|
||||||
|
|
||||||
devDirs.forEach(devId => {
|
devDirs.forEach(devId => {
|
||||||
const outboxDir = path.join(OUTBOX, devId);
|
const files = fs.readdirSync(path.join(OUTBOX, devId)).filter(f => f.endsWith('.md') || f.endsWith('.json'));
|
||||||
const files = fs.readdirSync(outboxDir).filter(f =>
|
|
||||||
f.endsWith('.md') || f.endsWith('.json')
|
|
||||||
);
|
|
||||||
|
|
||||||
if (files.length === 0) return;
|
if (files.length === 0) return;
|
||||||
|
|
||||||
const route = DEV_ROUTES[devId];
|
const route = DEV_ROUTES[devId];
|
||||||
if (!route || route.dirs.length === 0) {
|
if (!route || route.dirs.length === 0) {
|
||||||
console.warn('⚠️ ' + devId + ' 无模块目录映射,广播保留在 outbox');
|
console.warn('⚠️ ' + devId + ' 无映射');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
files.forEach(file => {
|
files.forEach(file => {
|
||||||
const rawContent = fs.readFileSync(path.join(outboxDir, file), 'utf8');
|
const content = fs.readFileSync(path.join(OUTBOX, devId, file), 'utf8');
|
||||||
|
|
||||||
// 对 JSON 格式广播做基础校验
|
|
||||||
if (file.endsWith('.json')) {
|
|
||||||
try {
|
|
||||||
JSON.parse(rawContent);
|
|
||||||
} catch (e) {
|
|
||||||
console.error('❌ [INVALID JSON] ' + path.join(outboxDir, file) + ' → ' + e.message + ',跳过分发');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 写入该开发者的每个模块目录
|
|
||||||
route.dirs.forEach(dir => {
|
route.dirs.forEach(dir => {
|
||||||
if (!fs.existsSync(dir)) {
|
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
||||||
fs.mkdirSync(dir, { recursive: true });
|
fs.writeFileSync(path.join(dir, 'LATEST-BROADCAST.md'), content);
|
||||||
}
|
console.log(`📡 ${devId} (${route.name}) → ${dir}/LATEST-BROADCAST.md`);
|
||||||
const targetFile = path.join(dir, 'LATEST-BROADCAST.md');
|
|
||||||
fs.writeFileSync(targetFile, rawContent);
|
|
||||||
console.log('📡 ' + devId + '(' + route.name + ') → ' + targetFile);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 归档已分发广播(使用 UTC 时间戳确保跨时区一致性)
|
|
||||||
if (!fs.existsSync(ARCHIVE)) fs.mkdirSync(ARCHIVE, { recursive: true });
|
if (!fs.existsSync(ARCHIVE)) fs.mkdirSync(ARCHIVE, { recursive: true });
|
||||||
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
fs.renameSync(
|
||||||
const archivePath = path.join(ARCHIVE, timestamp + '-' + devId + '-' + file);
|
path.join(OUTBOX, devId, file),
|
||||||
fs.renameSync(path.join(outboxDir, file), archivePath);
|
path.join(ARCHIVE, new Date().toISOString().split('T')[0] + '-' + devId + '-' + file)
|
||||||
|
);
|
||||||
totalDistributed++;
|
total++;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log('\n✅ 广播分发完成,共 ' + totalDistributed + ' 条');
|
console.log(`✅ 广播分发完成,共 ${total} 条`);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue