From c9d6495e5fb8d087d20f7e9dd5987c551f16e235 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 13 Mar 2026 06:37:11 +0000 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=8F=90=E5=8F=96=E5=85=B1?= =?UTF-8?q?=E4=BA=AB=20dev-suffix-map=20=E6=A8=A1=E5=9D=97=20+=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=BB=A3=E7=A0=81=E5=AE=A1=E6=9F=A5=E5=8F=8D=E9=A6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建 scripts/utils/dev-suffix-map.js (共享后缀→DEV-ID映射) - 更新 verify-modules.js + push-broadcast-to-github.js 使用共享映射 - 移动 require 到文件顶部 (invoke-persona.js, create-standardized-ticket.js) - 心跳监控参数可配置化 (HEARTBEAT_TIMEOUT_MINUTES, MAX_RETRY_COUNT) Co-authored-by: qinfendebingshuo <207279273+qinfendebingshuo@users.noreply.github.com> --- scripts/create-standardized-ticket.js | 2 +- scripts/invoke-persona.js | 2 +- scripts/notion-heartbeat.js | 4 +-- scripts/push-broadcast-to-github.js | 12 ++------- scripts/utils/dev-suffix-map.js | 38 +++++++++++++++++++++++++++ scripts/verify-modules.js | 18 +++++-------- 6 files changed, 50 insertions(+), 26 deletions(-) create mode 100644 scripts/utils/dev-suffix-map.js diff --git a/scripts/create-standardized-ticket.js b/scripts/create-standardized-ticket.js index a1607245..4bfb5b1f 100644 --- a/scripts/create-standardized-ticket.js +++ b/scripts/create-standardized-ticket.js @@ -18,6 +18,7 @@ 'use strict'; const https = require('https'); +const fs = require('fs'); const NOTION_TOKEN = process.env.NOTION_TOKEN || ''; const NOTION_TICKET_DB_ID = process.env.NOTION_TICKET_DB_ID || ''; @@ -184,7 +185,6 @@ async function createStandardizedTicket() { // 输出工单 ID 到 GITHUB_OUTPUT var outputFile = process.env.GITHUB_OUTPUT; if (outputFile) { - var fs = require('fs'); fs.appendFileSync(outputFile, 'ticket_page_id=' + result.id + '\n'); fs.appendFileSync(outputFile, 'ticket_url=' + (result.url || '') + '\n'); } diff --git a/scripts/invoke-persona.js b/scripts/invoke-persona.js index bd4cc12e..c88cbd5c 100644 --- a/scripts/invoke-persona.js +++ b/scripts/invoke-persona.js @@ -24,6 +24,7 @@ const https = require('https'); const http = require('http'); const fs = require('fs'); const path = require('path'); +const childProcess = require('child_process'); // ══════════════════════════════════════════════════════════ // 配置 @@ -166,7 +167,6 @@ async function invokePersona(workOrder) { process.env.AUTHOR = workOrder.developer; // 执行 wake-persona.js(fork 子进程) - var childProcess = require('child_process'); var wakeScript = path.join(__dirname, 'wake-persona.js'); return new Promise(function (resolve, reject) { diff --git a/scripts/notion-heartbeat.js b/scripts/notion-heartbeat.js index a259d4bd..5707647b 100644 --- a/scripts/notion-heartbeat.js +++ b/scripts/notion-heartbeat.js @@ -30,8 +30,8 @@ var SMTP_USER = process.env.SMTP_USER || ''; var SMTP_PASS = process.env.SMTP_PASS || ''; var NOTION_VERSION = '2022-06-28'; -var HEARTBEAT_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes -var MAX_RETRIES = 3; +var HEARTBEAT_TIMEOUT_MS = (parseInt(process.env.HEARTBEAT_TIMEOUT_MINUTES, 10) || 5) * 60 * 1000; +var MAX_RETRIES = parseInt(process.env.MAX_RETRY_COUNT, 10) || 3; var REPO_OWNER = 'qinfendebingshuo'; var REPO_NAME = 'guanghulab'; diff --git a/scripts/push-broadcast-to-github.js b/scripts/push-broadcast-to-github.js index 32af6eb1..41cd164f 100644 --- a/scripts/push-broadcast-to-github.js +++ b/scripts/push-broadcast-to-github.js @@ -18,6 +18,7 @@ var https = require('https'); var fs = require('fs'); +var devSuffixMap = require('./utils/dev-suffix-map'); var GITHUB_TOKEN = process.env.GITHUB_TOKEN || ''; var BROADCAST_ID = process.env.BROADCAST_ID || ''; @@ -94,16 +95,7 @@ async function pushBroadcast() { // 确定开发者 ID(从广播编号提取或使用环境变量) var devId = DEVELOPER_ID; if (!devId) { - // 从 BROADCAST_ID 提取后缀 → 映射到 DEV-XXX - var suffixMatch = BROADCAST_ID.match(/BC-[A-Z0-9]+-\d+-([A-Z]+)/i); - var suffix = suffixMatch ? suffixMatch[1].toUpperCase() : ''; - var suffixMap = { - 'YY': 'DEV-001', 'FM': 'DEV-002', 'YF': 'DEV-003', - 'ZZ': 'DEV-004', 'XCM': 'DEV-005', 'HE': 'DEV-009', - 'JZ': 'DEV-010', 'CCNN': 'DEV-011', 'AW': 'DEV-012', - 'XX': 'DEV-013', 'SY': 'DEV-014', - }; - devId = suffixMap[suffix] || 'UNKNOWN'; + devId = devSuffixMap.getDevIdFromBroadcast(BROADCAST_ID) || 'UNKNOWN'; } // 构建路径和提交信息 diff --git a/scripts/utils/dev-suffix-map.js b/scripts/utils/dev-suffix-map.js new file mode 100644 index 00000000..35248f80 --- /dev/null +++ b/scripts/utils/dev-suffix-map.js @@ -0,0 +1,38 @@ +// scripts/utils/dev-suffix-map.js +// 开发者广播编号后缀 → DEV-ID 映射表 +// +// 广播编号格式: BC-{模块}-{序号}-{后缀} +// 后缀是开发者名字拼音首字母缩写 + +'use strict'; + +// 后缀→开发者编号映射 +var SUFFIX_MAP = { + 'YY': 'DEV-001', // 页页 + 'FM': 'DEV-002', // 肥猫 + 'YF': 'DEV-003', // 燕樊 + 'ZZ': 'DEV-004', // 之之 + 'XCM': 'DEV-005', // 小草莓 + 'HE': 'DEV-009', // 花尔 + 'JZ': 'DEV-010', // 桔子 + 'CCNN': 'DEV-011', // 匆匆那年 + 'AW': 'DEV-012', // Awen + 'XX': 'DEV-013', // 小兴 + 'SY': 'DEV-014', // 时雨 +}; + +/** + * 从广播编号中提取开发者编号 + * @param {string} broadcastId - 广播编号(如 BC-M22-009-AW) + * @returns {string} 开发者编号(如 DEV-012),未找到返回空字符串 + */ +function getDevIdFromBroadcast(broadcastId) { + var suffixMatch = (broadcastId || '').match(/BC-[A-Z0-9]+-\d+-([A-Z]+)/i); + var suffix = suffixMatch ? suffixMatch[1].toUpperCase() : ''; + return SUFFIX_MAP[suffix] || ''; +} + +module.exports = { + SUFFIX_MAP: SUFFIX_MAP, + getDevIdFromBroadcast: getDevIdFromBroadcast, +}; diff --git a/scripts/verify-modules.js b/scripts/verify-modules.js index 2df4ddf5..24b250e5 100644 --- a/scripts/verify-modules.js +++ b/scripts/verify-modules.js @@ -17,6 +17,7 @@ const fs = require('fs'); const path = require('path'); +const devSuffixMap = require('./utils/dev-suffix-map'); const SYSLOG_CONTENT = process.env.SYSLOG_CONTENT || ''; const BROADCAST_ID = process.env.BROADCAST_ID || ''; @@ -67,25 +68,18 @@ function extractDevId(content, broadcastId) { var devMatch = content.match(/\b(DEV-\d{3})\b/i); if (devMatch) return devMatch[1].toUpperCase(); - // 从广播编号提取开发者后缀(如 BC-M22-009-AW → AW) + // 从广播编号提取开发者编号(使用共享映射表) + var mappedDevId = devSuffixMap.getDevIdFromBroadcast(broadcastId); + if (mappedDevId) return mappedDevId; + + // 兜底:从 dev-status.json 匹配 var suffixMatch = broadcastId.match(/BC-[A-Z0-9]+-\d+-([A-Z]+)/i); var devSuffix = suffixMatch ? suffixMatch[1].toUpperCase() : ''; - // 从 dev-status.json 通过后缀匹配开发者 if (devSuffix) { try { var devStatus = JSON.parse(fs.readFileSync(DEV_STATUS_PATH, 'utf8')); var team = devStatus.team || []; - // 后缀缩写映射表(从 dev-status.json 中名字的拼音首字母) - var suffixMap = { - 'YY': 'DEV-001', 'FM': 'DEV-002', 'YF': 'DEV-003', - 'ZZ': 'DEV-004', 'XCM': 'DEV-005', 'HE': 'DEV-009', - 'JZ': 'DEV-010', 'CCNN': 'DEV-011', 'AW': 'DEV-012', - 'XX': 'DEV-013', 'SY': 'DEV-014', - }; - if (suffixMap[devSuffix]) return suffixMap[devSuffix]; - - // 兜底:尝试从 team 中匹配 waiting 字段里的广播编号 for (var i = 0; i < team.length; i++) { var waiting = team[i].waiting || ''; if (waiting.includes(broadcastId) || waiting.includes(devSuffix)) {