優化 Step2:改用 skill RPG 攻防腳色系統(新增 Mage 邏輯角色、Step3/4 套 Paladin 裁決人設) #15

Merged
jiantw83 merged 14 commits from develop into master 2026-06-16 09:05:55 +00:00
Showing only changes of commit 60001499da - Show all commits
+20 -6
View File
@@ -2,6 +2,7 @@ import fs from 'fs';
import path from 'path'; import path from 'path';
import { fileURLToPath } from 'url'; import { fileURLToPath } from 'url';
import yaml from 'js-yaml'; import yaml from 'js-yaml';
import { warn } from './log.js';
const ROLES_DIR = path.join(fileURLToPath(import.meta.url), '..', 'prompts', 'roles'); const ROLES_DIR = path.join(fileURLToPath(import.meta.url), '..', 'prompts', 'roles');
@@ -17,11 +18,24 @@ export function parseRoleFile(content) {
return { ...meta, body: match[2].trim() }; return { ...meta, body: match[2].trim() };
} }
let cachedRoles = null;
/**
* 讀取並解析所有角色 .md,結果快取於模組層級(單次程序生命週期內檔案不變)。
* 單一檔案解析失敗(壞 YAML、缺 frontmatter 等)時記錄警告並略過,不讓整個流程崩潰。
*/
function readRoleFiles() { function readRoleFiles() {
return fs.readdirSync(ROLES_DIR) if (cachedRoles) return cachedRoles;
.filter(f => f.endsWith('.md')) const roles = [];
.sort() for (const f of fs.readdirSync(ROLES_DIR).filter(f => f.endsWith('.md')).sort()) {
.map(f => parseRoleFile(fs.readFileSync(path.join(ROLES_DIR, f), 'utf8'))); try {
roles.push(parseRoleFile(fs.readFileSync(path.join(ROLES_DIR, f), 'utf8')));
} catch (e) {
warn(`角色檔解析失敗,已略過: ${f}${e.message}`);
}
}
cachedRoles = roles;
return cachedRoles;
} }
/** /**
@@ -44,7 +58,7 @@ export function loadRole(name) {
*/ */
export function buildAnalysisPrompt(role) { export function buildAnalysisPrompt(role) {
return [ return [
`你是 ${role.badge ? role.badge + ' ' : ''}${role.name},負責「${role.focus}」面向的程式碼審查(攻擊方)。`, `你是 ${role.badge ? role.badge + ' ' : ''}${role.name},負責「${role.focus || '綜合'}」面向的程式碼審查(攻擊方)。`,
role.personality ? `個性:${role.personality}` : '', role.personality ? `個性:${role.personality}` : '',
'', '',
role.body, role.body,
@@ -77,7 +91,7 @@ export function getRoleIntro(roles) {
]; ];
for (const r of roles) { for (const r of roles) {
const badge = r.badge ? `${r.badge} ` : ''; const badge = r.badge ? `${r.badge} ` : '';
lines.push(`| **${badge}${r.name}** | ${r.focus} | ${r.personality} |`); lines.push(`| **${badge}${r.name}** | ${r.focus || ''} | ${r.personality || ''} |`);
} }
return lines.join('\n'); return lines.join('\n');
} }