#!/usr/bin/env node /** * 批量导入 claude-skills → Bookworm 格式适配脚本 * * 功能: * 1. 复制技能目录到 Bookworm skills/ * 2. 转换 SKILL.md 前置元数据 (claude-skills → Bookworm 格式) * 3. 添加 Bookworm 专有字段 (allowed-tools, maturity, composable) * 4. 转换 description 为中英双语触发格式 */ const fs = require('fs'); const path = require('path'); const SRC_BASE = path.join(__dirname, '..', 'repos', 'claude-skills', 'skills'); const DST_BASE = path.join(__dirname, '..', 'skills'); // 导入列表: name → Bookworm 适配配置 const IMPORTS = { 'typescript-pro': { descCN: 'TypeScript 深度专家。当用户需要 TypeScript 高级类型系统、泛型、条件类型、tRPC 全栈类型安全、tsconfig 优化、类型守卫、判别联合类型,或说 "TypeScript"、"类型安全"、"泛型" 时使用此技能。', tools: 'Read, Glob, Grep, Edit, Write, Bash', domain: 'development', composable: { enhances: ['frontend-expert', 'backend-builder'] }, }, 'python-pro': { descCN: 'Python 深度专家。当用户需要 Python 3.11+ 高级特性、类型提示 typing、async/await 异步编程、dataclass、mypy 配置、pytest 高级用法、生产级 Python 模式,或说 "Python"、"类型提示"、"异步Python" 时使用此技能。', tools: 'Read, Glob, Grep, Edit, Write, Bash', domain: 'development', composable: { enhances: ['backend-builder', 'data-engineer-expert'] }, }, 'golang-pro': { descCN: 'Go 语言深度专家。当用户需要 Go 1.21+ 并发编程、goroutine/channel、gRPC 服务、微服务架构、Go 性能优化、Go 模块管理,或说 "Go语言"、"Golang"、"goroutine" 时使用此技能。', tools: 'Read, Glob, Grep, Edit, Write, Bash', domain: 'development', composable: { enhances: ['backend-builder', 'cloud-native-expert'] }, }, 'api-designer': { descCN: 'API 设计架构师。当用户需要设计 REST/GraphQL API、OpenAPI 3.1 规范、资源建模、API 版本策略、分页模式、错误处理标准、API 文档规范,或说 "API设计"、"OpenAPI"、"接口规范" 时使用此技能。', tools: 'Read, Glob, Grep, Edit, Write, Bash', domain: 'architecture', composable: { enhances: ['backend-builder', 'tech-writer-expert'] }, }, 'graphql-architect': { descCN: 'GraphQL 架构专家。当用户需要 GraphQL Schema 设计、Resolver 实现、订阅 Subscription、Apollo/Relay 客户端、N+1 问题解决、DataLoader、GraphQL 缓存策略,或说 "GraphQL"、"Schema设计"、"Apollo" 时使用此技能。', tools: 'Read, Glob, Grep, Edit, Write, Bash', domain: 'architecture', composable: { enhances: ['api-designer', 'frontend-expert'] }, }, 'angular-architect': { descCN: 'Angular 架构专家。当用户需要 Angular 17+ standalone 组件、Signals、RxJS 响应式编程、NgRx 状态管理、Angular 路由、Angular 性能优化、企业级 Angular 应用,或说 "Angular"、"RxJS"、"NgRx" 时使用此技能。', tools: 'Read, Glob, Grep, Edit, Write, Bash', domain: 'development', composable: { enhances: ['frontend-expert', 'typescript-pro'] }, }, 'cloud-architect': { descCN: '云架构专家。当用户需要 AWS/GCP/Azure 云服务架构、EC2/Lambda/S3、Cloud Run/BigQuery、成本优化 FinOps、灾备策略、混合云部署、Well-Architected Framework,或说 "云架构"、"AWS"、"GCP"、"Azure" 时使用此技能。', tools: 'Read, Glob, Grep, Edit, Write, Bash', domain: 'architecture', composable: { enhances: ['architect-expert', 'devops-expert'] }, }, 'kubernetes-specialist': { descCN: 'Kubernetes 深度专家。当用户需要 K8s 集群配置、Helm Charts、RBAC 安全策略、NetworkPolicy、存储配置 PV/PVC、Pod 调度、K8s 故障排查、Operator 开发,或说 "K8s部署"、"Helm"、"K8s排错" 时使用此技能。注意: K8s+服务网格/Istio 路由到 cloud-native-expert。', tools: 'Read, Glob, Grep, Edit, Write, Bash', domain: 'devops', composable: { enhances: ['cloud-native-expert', 'devops-expert'] }, }, 'rust-engineer': { descCN: 'Rust 系统编程专家。当用户需要 Rust 所有权/借用/生命周期、async/await、宏开发、trait 设计、错误处理 Result/Option、性能优化、WebAssembly/WASM,或说 "Rust"、"所有权"、"借用检查" 时使用此技能。', tools: 'Read, Glob, Grep, Edit, Write, Bash', domain: 'development', composable: { enhances: ['performance-expert', 'edge-computing-expert'] }, }, 'vue-expert': { descCN: 'Vue.js 深度专家。当用户需要 Vue 3 Composition API、Pinia 状态管理、Vue Router、SSR/Nuxt、组件设计模式、Vue 性能优化、TypeScript + Vue 集成,或说 "Vue3"、"Composition API"、"Pinia" 时使用此技能。', tools: 'Read, Glob, Grep, Edit, Write, Bash', domain: 'development', composable: { enhances: ['frontend-expert', 'typescript-pro'] }, }, 'flutter-expert': { descCN: 'Flutter 跨平台专家。当用户需要 Flutter/Dart 开发、Widget 架构、状态管理 Riverpod/BLoC、Platform Channel、Flutter 性能优化、Flutter 测试,或说 "Flutter"、"Dart"、"Widget" 时使用此技能。', tools: 'Read, Glob, Grep, Edit, Write, Bash', domain: 'development', composable: { enhances: ['mobile-expert'] }, }, 'swift-expert': { descCN: 'Swift/iOS 深度专家。当用户需要 Swift 5.9+/SwiftUI 开发、async/await 并发、Core Data、网络层架构、Swift 测试、App 性能优化,或说 "Swift"、"SwiftUI"、"iOS原生" 时使用此技能。', tools: 'Read, Glob, Grep, Edit, Write, Bash', domain: 'development', composable: { enhances: ['mobile-expert'] }, }, 'nextjs-developer': { descCN: 'Next.js 全栈专家。当用户需要 Next.js 14+ App Router、RSC 服务端组件、Server Actions、ISR/SSG/SSR 渲染策略、Middleware、Next.js 性能优化,或说 "Next.js"、"App Router"、"Server Components" 时使用此技能。', tools: 'Read, Glob, Grep, Edit, Write, Bash', domain: 'development', composable: { enhances: ['frontend-expert', 'typescript-pro'] }, }, 'websocket-engineer': { descCN: 'WebSocket 实时通信专家。当用户需要 WebSocket 协议实现、Socket.IO、实时消息推送、连接管理、心跳保活、断线重连、房间/频道管理,或说 "WebSocket"、"实时通信"、"Socket.IO" 时使用此技能。', tools: 'Read, Glob, Grep, Edit, Write, Bash', domain: 'development', composable: { enhances: ['backend-builder', 'notification-system-expert'] }, }, 'terraform-engineer': { descCN: 'Terraform 基础设施即代码专家。当用户需要 Terraform/OpenTofu IaC、HCL 配置、模块设计、State 管理、Provider 开发、多云 IaC 编排,或说 "Terraform"、"IaC"、"基础设施即代码" 时使用此技能。', tools: 'Read, Glob, Grep, Edit, Write, Bash', domain: 'devops', composable: { enhances: ['cloud-architect', 'devops-expert'] }, }, }; let imported = 0; let skipped = 0; const errors = []; for (const [name, config] of Object.entries(IMPORTS)) { const src = path.join(SRC_BASE, name); const dst = path.join(DST_BASE, name); // 复制目录 (如果已存在则只更新 SKILL.md) if (!fs.existsSync(dst)) { try { copyDirSync(src, dst); } catch (e) { errors.push(`${name}: 复制失败 — ${e.message}`); continue; } } // 读取并转换 SKILL.md const skillFile = path.join(dst, 'SKILL.md'); if (!fs.existsSync(skillFile)) { errors.push(`${name}: SKILL.md 不存在`); continue; } let content = fs.readFileSync(skillFile, 'utf8'); // 替换前置元数据 // 统一换行符为 LF content = content.replace(/\r\n/g, '\n'); const fmMatch = content.match(/^---\n([\s\S]*?)\n---/); if (!fmMatch) { errors.push(`${name}: 无法解析前置元数据`); continue; } // 构建 Bookworm 格式前置元数据 const composableBlock = config.composable ? `\ncomposable: true\n enhances: [${config.composable.enhances.join(', ')}]` : ''; const newFrontmatter = `--- name: ${name} description: > ${config.descCN} allowed-tools: ${config.tools} maturity: imported last-reviewed: 2026-03-03${composableBlock} ---`; content = content.replace(/^---\n[\s\S]*?\n---/, newFrontmatter); fs.writeFileSync(skillFile, content, 'utf8'); console.log(`[OK] ${name} — 已导入并适配`); imported++; } console.log(`\n═══════════════════════════════`); console.log(`导入: ${imported} | 跳过: ${skipped} | 错误: ${errors.length}`); if (errors.length > 0) { console.log('错误详情:'); errors.forEach(e => console.log(` ! ${e}`)); } console.log(`═══════════════════════════════`); // === 工具函数 === function copyDirSync(src, dst) { fs.mkdirSync(dst, { recursive: true }); for (const entry of fs.readdirSync(src, { withFileTypes: true })) { const srcPath = path.join(src, entry.name); const dstPath = path.join(dst, entry.name); if (entry.isDirectory()) { copyDirSync(srcPath, dstPath); } else { fs.copyFileSync(srcPath, dstPath); } } }