Files
PromptX/src/lib/core/pouch/commands/RegisterCommand.js

232 lines
6.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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