@promptx/cli
Version:
DPML-powered AI prompt framework - Revolutionary AI-First CLI system based on Deepractice Prompt Markup Language. Build sophisticated AI agents with structured prompts, memory systems, and execution frameworks.
192 lines (158 loc) • 6.02 kB
JavaScript
const BasePouchCommand = require('../BasePouchCommand')
const { getGlobalResourceManager } = require('../../resource')
const { CognitionManager } = require('../../cognition/CognitionManager')
const logger = require('../../../utils/logger')
/**
* 记忆检索锦囊命令 - 基于认知体系
* 使用 CognitionManager 进行智能语义检索
*/
class RecallCommand extends BasePouchCommand {
constructor () {
super()
this.lastSearchCount = 0
this.resourceManager = getGlobalResourceManager()
this.cognitionManager = new CognitionManager(this.resourceManager)
}
getPurpose () {
return 'AI主动检索记忆中的专业知识、最佳实践和历史经验(基于认知体系)'
}
async getContent (args) {
// 解析参数:--role, query
const { role, query } = this.parseArgs(args)
if (!role) {
return `❌ 错误:缺少必填参数 role
🎯 **使用方法**:
recall 角色ID [查询关键词]
📋 **示例**:
recall java-developer "React Hooks"
recall product-manager # 查看所有产品经理记忆
recall copywriter "A/B测试"
💡 **可用角色ID**:通过 welcome 工具查看所有可用角色`
}
logger.step('🧠 [RecallCommand] 开始记忆检索流程 (基于认知体系)')
logger.info(`🔍 [RecallCommand] 角色: ${role}, 查询内容: ${query ? `"${query}"` : '全部记忆'}`)
try {
// 🎯 使用CognitionManager进行检索
const memories = await this.cognitionManager.recall(role, query || '')
this.lastSearchCount = memories.length
logger.success(`✅ [RecallCommand] 认知检索完成 - 找到 ${memories.length} 条匹配记忆`)
if (memories.length === 0) {
if (query) {
logger.warn(`⚠️ [RecallCommand] 未找到匹配查询"${query}"的记忆`)
return `🔍 记忆检索结果:未找到匹配"${query}"的相关记忆
💡 优化建议:
1. **扩大查询范围**:尝试使用更通用的关键词
2. **换个角度查询**:尝试相关词汇或概念
3. **检查拼写**:确认关键词拼写正确
4. **查看全部记忆**:不使用查询参数,浏览所有记忆寻找灵感`
} else {
logger.warn('⚠️ [RecallCommand] 记忆体系为空')
return `🧠 AI记忆体系中暂无内容。
💡 提示:尚未建立该角色的记忆体系,请通过学习和实践积累经验。`
}
}
const formattedMemories = this.formatEngrams(memories, query)
return `🧠 AI记忆体系 ${query ? `检索"${query}"` : '全部记忆'} (${memories.length}条):
${formattedMemories}
💡 记忆运用建议:
1. 结合当前任务场景灵活运用
2. 根据实际情况调整和变通
3. 持续学习和增强记忆能力`
} catch (error) {
logger.error(`❌ [RecallCommand] 记忆检索失败: ${error.message}`)
logger.debug(`🐛 [RecallCommand] 错误堆栈: ${error.stack}`)
return `❌ 检索记忆时出错:${error.message}
💡 **可能的原因**:
- 角色ID不正确
- 认知系统初始化失败
- 记忆存储路径问题
🔧 **建议操作**:
1. 检查角色ID是否正确
2. 重试检索操作
3. 如持续失败,查看日志详情`
}
}
/**
* 🎯 解析命令行参数 - role作为第一个位置参数
*/
parseArgs(args) {
let query = ''
let role = ''
let argIndex = 0
// 第一个参数是role
if (args.length > 0) {
role = args[0]
argIndex = 1
}
// 从第二个参数开始解析查询内容
for (let i = argIndex; i < args.length; i++) {
// 查询参数
if (query) {
query += ' ' + args[i]
} else {
query = args[i]
}
}
return { role, query }
}
getPATEOAS (args) {
const [query] = args
const currentState = query ? `recalled-${query}` : 'recall-waiting'
return {
currentState,
availableTransitions: ['welcome', 'remember', 'learn', 'recall'],
nextActions: [
{
name: '选择角色',
description: '选择专业角色来应用检索到的知识',
method: 'MCP PromptX welcome 工具'
},
{
name: '记忆新知识',
description: '继续内化更多专业知识',
method: 'MCP PromptX remember 工具'
},
{
name: '学习资源',
description: '学习相关专业资源',
method: 'MCP PromptX learn 工具'
},
{
name: '继续检索',
description: '检索其他相关记忆',
method: 'MCP PromptX recall 工具'
}
],
metadata: {
query: query || null,
resultCount: this.lastSearchCount || 0,
searchTime: new Date().toISOString(),
hasResults: (this.lastSearchCount || 0) > 0
}
}
}
/**
* 格式化Engram对象(突出核心要素:content, schema, strength, timestamp)
*/
formatEngrams (engrams, query) {
return engrams.map((engram, index) => {
const content = engram.getContent ? engram.getContent() : engram.content
const schema = engram.schema
const strength = engram.getStrength ? engram.getStrength() : engram.strength || 0
const timestamp = engram.timestamp ? new Date(engram.timestamp).toLocaleString() : '未知时间'
let result = `📝 ${index + 1}. **记忆** [强度: ${strength.toFixed(2)}] (${timestamp})
💭 **内容**: ${content}`
if (schema) {
// 如果schema是字符串(Mermaid格式),简化显示
if (typeof schema === 'string') {
const schemaPreview = schema.replace(/\n/g, ' → ').substring(0, 100)
result += `\n🗺️ **认知结构**: ${schemaPreview}${schema.length > 100 ? '...' : ''}`
} else if (schema.name) {
result += `\n🗺️ **认知结构**: ${schema.name}`
}
}
return result + '\n---'
}).join('\n')
}
}
module.exports = RecallCommand