const BasePouchCommand = require('../BasePouchCommand') const fs = require('fs-extra') const path = require('path') const PackageProtocol = require('../../resource/protocols/PackageProtocol') const { buildCommand } = require('../../../../constants') /** * 角色注册锦囊命令 * 负责将新创建的角色注册到系统中 */ class RegisterCommand extends BasePouchCommand { constructor () { super() this.packageProtocol = new PackageProtocol() } getPurpose () { return '注册新创建的角色到系统中,使其可以被发现和激活' } async getContent (args) { const [roleId] = args if (!roleId) { return `❌ 请指定要注册的角色ID 🔍 使用方法: \`\`\`bash ${buildCommand.register('<角色ID>')} \`\`\` 💡 例如: \`\`\`bash ${buildCommand.register('my-custom-role')} \`\`\`` } try { // 1. 检查角色文件是否存在 const roleExists = await this.checkRoleExists(roleId) if (!roleExists) { return `❌ 角色文件不存在! 请确保以下文件存在: - prompt/domain/${roleId}/${roleId}.role.md - prompt/domain/${roleId}/thought/${roleId}.thought.md - prompt/domain/${roleId}/execution/${roleId}.execution.md 💡 您可以使用角色设计师来创建完整的角色套件: \`\`\`bash ${buildCommand.action('role-designer')} \`\`\`` } // 2. 提取角色元数据 const roleMetadata = await this.extractRoleMetadata(roleId) // 3. 注册角色到系统 const registrationResult = await this.registerRole(roleId, roleMetadata) if (registrationResult.success) { return `✅ 角色 "${roleId}" 注册成功! 📋 **注册信息**: - 名称:${roleMetadata.name} - 描述:${roleMetadata.description} - 文件路径:${roleMetadata.filePath} 🎯 **下一步操作**: \`\`\`bash ${buildCommand.action(roleId)} \`\`\` 💡 现在您可以激活这个角色了!` } else { return `❌ 角色注册失败:${registrationResult.error} 🔍 请检查: - 角色文件格式是否正确 - 是否有写入权限 - 注册表文件是否可访问` } } catch (error) { console.error('Register command error:', error) return `❌ 注册角色 "${roleId}" 时发生错误:${error.message} 💡 请确保角色文件存在且格式正确。` } } /** * 检查角色文件是否存在 */ async checkRoleExists (roleId) { try { const packageRoot = await this.packageProtocol.getPackageRoot() const roleFile = path.join(packageRoot, 'prompt', 'domain', roleId, `${roleId}.role.md`) return await fs.pathExists(roleFile) } catch (error) { return false } } /** * 提取角色元数据 */ async extractRoleMetadata (roleId) { const packageRoot = await this.packageProtocol.getPackageRoot() const roleFile = path.join(packageRoot, 'prompt', 'domain', roleId, `${roleId}.role.md`) const content = await fs.readFile(roleFile, 'utf-8') const relativePath = path.relative(packageRoot, roleFile) // 提取元数据 let name = `🎭 ${roleId}` let description = '用户自定义角色' // 从注释中提取元数据(支持多行) const nameMatch = content.match(/name:\s*(.+?)(?:\n|$)/i) if (nameMatch) { name = nameMatch[1].trim() } const descMatch = content.match(/description:\s*(.+?)(?:\n|$)/i) if (descMatch) { description = descMatch[1].trim() } // 如果没有找到注释,尝试从文件内容推断 if (name === `🎭 ${roleId}` && description === '用户自定义角色') { // 可以根据角色内容进行更智能的推断 if (content.includes('产品')) { name = `📊 ${roleId}` } else if (content.includes('开发') || content.includes('代码')) { name = `💻 ${roleId}` } else if (content.includes('设计')) { name = `🎨 ${roleId}` } } return { name, description, filePath: `@package://${relativePath}` } } /** * 注册角色到系统 */ async registerRole (roleId, metadata) { try { const packageRoot = await this.packageProtocol.getPackageRoot() const registryPath = path.join(packageRoot, 'src', 'resource.registry.json') // 读取当前注册表 const registry = await fs.readJson(registryPath) // 添加新角色 if (!registry.protocols.role.registry) { registry.protocols.role.registry = {} } registry.protocols.role.registry[roleId] = { file: metadata.filePath, name: metadata.name, description: metadata.description } // 写回注册表 await fs.writeJson(registryPath, registry, { spaces: 2 }) return { success: true } } catch (error) { return { success: false, error: error.message } } } getPATEOAS (args) { const [roleId] = args if (!roleId) { return { currentState: 'register_awaiting_role', availableTransitions: ['hello', 'action'], nextActions: [ { name: '查看可用角色', description: '查看已注册的角色', command: buildCommand.hello(), priority: 'medium' }, { name: '创建新角色', description: '使用角色设计师创建新角色', command: buildCommand.action('role-designer'), priority: 'high' } ], metadata: { message: '需要指定角色ID' } } } return { currentState: 'register_completed', availableTransitions: ['action', 'hello'], nextActions: [ { name: '激活角色', description: '激活刚注册的角色', command: buildCommand.action(roleId), priority: 'high' }, { name: '查看所有角色', description: '查看角色列表', command: buildCommand.hello(), priority: 'medium' } ], metadata: { registeredRole: roleId, systemVersion: '锦囊串联状态机 v1.0' } } } } module.exports = RegisterCommand