bookworm-smart-assistant/scripts/patches/patch-p0-3-reapply-tiering.js

80 lines
3.2 KiB
JavaScript
Raw Normal View History

#!/usr/bin/env node
/**
* P0-3 Re-apply: Skill 三层分层
* 上一会话 P0-3 patch 结果被后续操作覆盖, patch 用硬编码列表重新写入
* T1=21 (常驻) / T2=40 (按需) / T3=34 (归档)
* Idempotent: sentinel [P0-3] SKILL_TIERING_v1 (检查 criticality 字段)
*/
'use strict';
const fs = require('fs');
const path = require('path');
const TARGET = path.resolve(__dirname, '..', '..', 'skills-index.json');
if (!fs.existsSync(TARGET)) { process.stderr.write('[SKIP] skills-index.json not found\n'); process.exit(0); }
const src = fs.readFileSync(TARGET, 'utf8');
let index;
try { index = JSON.parse(src); } catch (e) { process.stderr.write('[FAIL] JSON parse error\n'); process.exit(1); }
if (!index.skills || !Array.isArray(index.skills)) { process.stderr.write('[FAIL] no skills array\n'); process.exit(1); }
// Idempotent check: if any skill already has criticality field, skip
const hasCriticality = index.skills.some(s => s.criticality);
if (hasCriticality) { process.stderr.write('[SKIP] already has criticality (sentinel check)\n'); process.exit(0); }
fs.writeFileSync(TARGET + '.bak-p03-reapply.' + Date.now(), src);
// T1: 21 skills (常驻, 高频或高关键度)
const T1 = new Set([
'ai-ml-expert', 'architect-expert', 'backend-builder', 'debugger-expert',
'developer-expert', 'devops-expert', 'frontend-expert', 'git-operation-master',
'guardian', 'mobile-expert', 'performance-expert', 'project-audit-expert',
'prompt-optimizer', 'qa', 'review', 'reviewer-expert', 'security-expert',
'technical-seo-expert', 'tester-expert', 'workflow-automation-expert',
'zero-defect-guardian',
]);
// HIGH criticality: 安全/审计/守护类
const HIGH_CRIT = new Set([
'security-expert', 'guardian', 'zero-defect-guardian', 'review',
'debugger-expert', 'developer-expert', 'project-audit-expert',
]);
// T3: 34 skills (归档, 极低频或已废弃边缘)
const T3 = new Set([
'browser-automation-expert', 'canvas-designer', 'code-migrator',
'competitive-analyst', 'content-strategist', 'creative-writer',
'data-engineer', 'database-expert', 'design-system-expert',
'documentation-expert', 'education-expert', 'email-composer',
'file-manager', 'finance-advisor', 'game-developer',
'graph-expert', 'healthcare-expert', 'i18n-expert',
'legal-advisor', 'marketing-expert', 'ml-ops-expert',
'presentation-expert', 'product-manager', 'project-manager',
'regex-expert', 'resume-builder', 'social-media-expert',
'spreadsheet-expert', 'startup-advisor', 'system-admin',
'technical-writer', 'terminal-expert', 'ui-ux-expert',
'video-editor',
]);
let t1 = 0, t2 = 0, t3 = 0;
for (const skill of index.skills) {
const name = skill.name || '';
if (T1.has(name)) {
skill.tier_class = 'T1';
t1++;
} else if (T3.has(name)) {
skill.tier_class = 'T3';
t3++;
} else {
skill.tier_class = 'T2';
t2++;
}
skill.criticality = HIGH_CRIT.has(name) ? 'HIGH' : T1.has(name) ? 'MEDIUM' : 'LOW';
skill.callCount30d = 0; // 无历史数据, 初始化为 0
}
const tmp = TARGET + '.tmp.' + process.pid;
fs.writeFileSync(tmp, JSON.stringify(index, null, 2), 'utf8');
fs.renameSync(tmp, TARGET);
process.stderr.write('[DONE] P0-3 re-applied: T1=' + t1 + ' T2=' + t2 + ' T3=' + t3 + '\n');