232 lines
6.2 KiB
JavaScript
232 lines
6.2 KiB
JavaScript
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
|