From 1fc71abdc1669e0f7f0a5b901a84720383aff2b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B7=91=E5=A9=B7=E9=99=88?= Date: Mon, 9 Mar 2026 16:33:09 +0800 Subject: [PATCH] =?UTF-8?q?Step=208:=20=E5=B9=BF=E6=92=AD=E5=88=86?= =?UTF-8?q?=E5=8F=91=E7=B3=BB=E7=BB=9F=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/distribute-broadcasts.yml | 3 +- scripts/distribute-broadcasts.js | 89 +++++++-------------- 2 files changed, 33 insertions(+), 59 deletions(-) diff --git a/.github/workflows/distribute-broadcasts.yml b/.github/workflows/distribute-broadcasts.yml index 7db2a234..91a677ac 100644 --- a/.github/workflows/distribute-broadcasts.yml +++ b/.github/workflows/distribute-broadcasts.yml @@ -13,6 +13,7 @@ jobs: runs-on: ubuntu-latest permissions: contents: write + steps: - uses: actions/checkout@v4 with: @@ -31,5 +32,5 @@ jobs: git config user.name "铸渊 (ZhùYuān)" git config user.email "zhuyuan@guanghulab.com" 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 diff --git a/scripts/distribute-broadcasts.js b/scripts/distribute-broadcasts.js index 38441af9..f50d515a 100644 --- a/scripts/distribute-broadcasts.js +++ b/scripts/distribute-broadcasts.js @@ -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 path = require('path'); @@ -8,81 +7,55 @@ const path = require('path'); const OUTBOX = 'broadcasts-outbox'; const ARCHIVE = '.github/broadcasts/distributed'; -// ========== 开发者 → 模块目录 路由映射表 ========== -// 新增开发者时,在此表新增一行即可 +// 开发者 → 模块目录映射表 const DEV_ROUTES = { - 'DEV-001': { name: '页页', dirs: ['backend', 'src'] }, - 'DEV-002': { name: '肥猫', dirs: ['frontend', 'persona-selector', 'chat-bubble'] }, - 'DEV-003': { name: '燕樊', dirs: ['settings', 'cloud-drive'] }, - 'DEV-004': { name: '之之', dirs: ['dingtalk-bot'] }, - 'DEV-005': { name: '小草莓', dirs: ['status-board'] }, - 'DEV-009': { name: '花尔', dirs: ['user-center'] }, - 'DEV-010': { name: '桔子', dirs: ['ticket-system'] }, - 'DEV-011': { name: '匆匆那年', dirs: [] }, // 待分配模块后补充 + 'DEV-001': { name: '页页', dirs: ['backend', 'src'] }, + 'DEV-002': { name: '肥猫', dirs: ['frontend', 'persona-selector', 'chat-bubble'] }, + 'DEV-003': { name: '燕樊', dirs: ['settings', 'cloud-drive', 'frontend/chat', 'help-center'] }, + 'DEV-004': { name: '之之', dirs: ['dingtalk-bot'] }, + 'DEV-005': { name: '小草莓', dirs: ['status-board', 'cost-control', 'multi-persona'] }, + 'DEV-009': { name: '花尔', dirs: ['user-center'] }, + 'DEV-010': { name: '桔子', dirs: ['ticket-system', 'dashboard'] }, + 'DEV-011': { name: '匆匆那年', dirs: [] } }; if (!fs.existsSync(OUTBOX)) { - console.log('📭 无 broadcasts-outbox 目录'); + console.log('📭 无 outbox'); process.exit(0); } -// 扫描 outbox 下每个 DEV-00X 子目录 -const devDirs = fs.readdirSync(OUTBOX, { withFileTypes: true }) - .filter(entry => entry.isDirectory() && entry.name.startsWith('DEV-')) - .map(entry => entry.name); +const devDirs = fs.readdirSync(OUTBOX).filter(d => + d.startsWith('DEV-') && fs.statSync(path.join(OUTBOX, d)).isDirectory() +); -if (devDirs.length === 0) { - console.log('📭 无新广播待分发'); - process.exit(0); -} - -let totalDistributed = 0; +let total = 0; devDirs.forEach(devId => { - const outboxDir = path.join(OUTBOX, devId); - const files = fs.readdirSync(outboxDir).filter(f => - f.endsWith('.md') || f.endsWith('.json') - ); - + const files = fs.readdirSync(path.join(OUTBOX, devId)).filter(f => f.endsWith('.md') || f.endsWith('.json')); if (files.length === 0) return; - + const route = DEV_ROUTES[devId]; if (!route || route.dirs.length === 0) { - console.warn('⚠️ ' + devId + ' 无模块目录映射,广播保留在 outbox'); + console.warn('⚠️ ' + devId + ' 无映射'); return; } - + files.forEach(file => { - const rawContent = fs.readFileSync(path.join(outboxDir, file), 'utf8'); - - // 对 JSON 格式广播做基础校验 - if (file.endsWith('.json')) { - try { - JSON.parse(rawContent); - } catch (e) { - console.error('❌ [INVALID JSON] ' + path.join(outboxDir, file) + ' → ' + e.message + ',跳过分发'); - return; - } - } - - // 写入该开发者的每个模块目录 + const content = fs.readFileSync(path.join(OUTBOX, devId, file), 'utf8'); + route.dirs.forEach(dir => { - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir, { recursive: true }); - } - const targetFile = path.join(dir, 'LATEST-BROADCAST.md'); - fs.writeFileSync(targetFile, rawContent); - console.log('📡 ' + devId + '(' + route.name + ') → ' + targetFile); + if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true }); + fs.writeFileSync(path.join(dir, 'LATEST-BROADCAST.md'), content); + console.log(`📡 ${devId} (${route.name}) → ${dir}/LATEST-BROADCAST.md`); }); - - // 归档已分发广播(使用 UTC 时间戳确保跨时区一致性) + if (!fs.existsSync(ARCHIVE)) fs.mkdirSync(ARCHIVE, { recursive: true }); - const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19); - const archivePath = path.join(ARCHIVE, timestamp + '-' + devId + '-' + file); - fs.renameSync(path.join(outboxDir, file), archivePath); - - totalDistributed++; + fs.renameSync( + path.join(OUTBOX, devId, file), + path.join(ARCHIVE, new Date().toISOString().split('T')[0] + '-' + devId + '-' + file) + ); + total++; }); }); -console.log('\n✅ 广播分发完成,共 ' + totalDistributed + ' 条'); +console.log(`✅ 广播分发完成,共 ${total} 条`);