fix: 统一命令格式为 npx dpml-prompt@snapshot
This commit is contained in:
@ -53,10 +53,10 @@ program
|
||||
})
|
||||
|
||||
program
|
||||
.command('remember <key> [value...]')
|
||||
.command('remember [content...]')
|
||||
.description('🧠 remember锦囊 - AI主动内化知识和经验到记忆体系')
|
||||
.action(async (key, value, options) => {
|
||||
const args = [key, ...(value || [])]
|
||||
.action(async (content, options) => {
|
||||
const args = content || []
|
||||
await cli.execute('remember', args)
|
||||
})
|
||||
|
||||
@ -99,8 +99,8 @@ ${chalk.cyan('示例:')}
|
||||
promptx recall
|
||||
|
||||
${chalk.gray('# 6️⃣ AI内化专业知识')}
|
||||
promptx remember "scrum-tips" "每日站会控制在15分钟内"
|
||||
promptx remember "deploy-flow" "测试→预发布→生产"
|
||||
promptx remember "每日站会控制在15分钟内"
|
||||
promptx remember "测试→预发布→生产"
|
||||
|
||||
${chalk.cyan('🔄 PATEOAS状态机:')}
|
||||
每个锦囊输出都包含 PATEOAS 导航,引导 AI 发现下一步操作
|
||||
|
||||
@ -22,7 +22,7 @@ export const buildCommand = {
|
||||
action: (roleId) => `${COMMAND_PREFIX} action ${roleId}`,
|
||||
learn: (resource) => `${COMMAND_PREFIX} learn ${resource}`,
|
||||
recall: (query = '') => `${COMMAND_PREFIX} recall${query ? ' ' + query : ''}`,
|
||||
remember: (key, content = '<content>') => `${COMMAND_PREFIX} remember ${key}${content !== '<content>' ? ' "' + content + '"' : ' <content>'}`
|
||||
remember: (content = '<content>') => `${COMMAND_PREFIX} remember${content !== '<content>' ? ' "' + content + '"' : ' <content>'}`
|
||||
}
|
||||
|
||||
// 系统路径配置
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
const PouchStateMachine = require('./state/PouchStateMachine')
|
||||
const PouchRegistry = require('./PouchRegistry')
|
||||
const commands = require('./commands')
|
||||
const { COMMANDS } = require('../../../constants')
|
||||
|
||||
/**
|
||||
* 锦囊CLI主入口
|
||||
@ -57,7 +58,7 @@ class PouchCLI {
|
||||
|
||||
// 验证命令是否存在
|
||||
if (!this.registry.validate(commandName)) {
|
||||
throw new Error(`未知命令: ${commandName}\n使用 'npx promptx help' 查看可用命令`)
|
||||
throw new Error(`未知命令: ${commandName}\n使用 '${COMMANDS.HELP}' 查看可用命令`)
|
||||
}
|
||||
|
||||
try {
|
||||
@ -104,11 +105,11 @@ class PouchCLI {
|
||||
help += `
|
||||
|
||||
💡 使用示例:
|
||||
npx promptx init # 初始化工作环境
|
||||
npx promptx hello # 发现可用角色
|
||||
npx promptx action copywriter # 激活文案专家
|
||||
npx promptx learn scrum # 学习敏捷知识
|
||||
npx promptx recall frontend # 检索前端记忆
|
||||
${COMMANDS.INIT} # 初始化工作环境
|
||||
${COMMANDS.HELLO} # 发现可用角色
|
||||
${COMMANDS.ACTION} copywriter # 激活文案专家
|
||||
${COMMANDS.LEARN} scrum # 学习敏捷知识
|
||||
${COMMANDS.RECALL} frontend # 检索前端记忆
|
||||
|
||||
🔄 PATEOAS 导航:
|
||||
每个命令执行后都会提供下一步的建议操作,
|
||||
|
||||
@ -88,7 +88,7 @@ class HelloCommand extends BasePouchCommand {
|
||||
content += `### ${index + 1}. ${role.name}
|
||||
**角色ID**: \`${role.id}\`
|
||||
**专业能力**: ${role.description}
|
||||
**激活命令**: \`npx promptx action ${role.id}\`
|
||||
**激活命令**: \`${buildCommand.action(role.id)}\`
|
||||
|
||||
---
|
||||
|
||||
@ -101,12 +101,12 @@ class HelloCommand extends BasePouchCommand {
|
||||
### 🔧 激活步骤
|
||||
1. **选择角色**: 从上述列表中选择需要的专业角色
|
||||
2. **使用角色ID**: 复制对应的角色ID(如:\`${allRoles[0]?.id || 'assistant'}\`)
|
||||
3. **执行命令**: 运行 \`npx promptx action <角色ID>\`
|
||||
3. **执行命令**: 运行 \`${buildCommand.action('<角色ID>')}\`
|
||||
|
||||
### 📝 激活示例
|
||||
\`\`\`bash
|
||||
# 激活智能助手角色
|
||||
npx promptx action ${allRoles[0]?.id || 'assistant'}
|
||||
${buildCommand.action(allRoles[0]?.id || 'assistant')}
|
||||
\`\`\`
|
||||
|
||||
### ⚡ 激活后效果
|
||||
@ -118,7 +118,7 @@ npx promptx action ${allRoles[0]?.id || 'assistant'}
|
||||
|
||||
⚠️ **AI执行指令**:
|
||||
📢 **向主人汇报角色选项,明确说明使用方法:"请选择角色ID,然后我将执行对应的action命令"**
|
||||
🎯 **等待主人指定具体的角色ID后,立即执行 \`npx promptx action <角色ID>\`**
|
||||
🎯 **等待主人指定具体的角色ID后,立即执行 \`${buildCommand.action('<角色ID>')}\`**
|
||||
💡 **强调:action命令需要具体的角色ID,不是角色名称**
|
||||
`
|
||||
|
||||
|
||||
@ -135,20 +135,18 @@ ${formattedMemories}
|
||||
* 解析记忆行(紧凑格式)
|
||||
*/
|
||||
parseMemoryLine (line) {
|
||||
// 格式:- 2025/05/31 14:30 内容 #key #tag1 #tag2 #评分:8 #有效期:长期
|
||||
const match = line.match(/^- (\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}) (.*?) (#\w+.*?)$/)
|
||||
// 格式:- 2025/05/31 14:30 内容 #tag1 #tag2 #评分:8 #有效期:长期
|
||||
const match = line.match(/^- (\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}) (.*?) (#.*?)$/)
|
||||
if (!match) return null
|
||||
|
||||
const [, timestamp, content, tagsStr] = match
|
||||
const tags = tagsStr.split(' ').filter(t => t.startsWith('#'))
|
||||
const keyTag = tags.find(t => !t.includes(':') && !['#敏捷开发', '#测试', '#部署', '#前端开发', '#后端开发', '#AI', '#最佳实践', '#流程管理', '#工具使用', '#其他'].includes(t))
|
||||
|
||||
return {
|
||||
timestamp,
|
||||
content,
|
||||
key: keyTag ? keyTag.substring(1) : 'unknown',
|
||||
tags,
|
||||
source: keyTag ? keyTag.substring(1) : 'unknown'
|
||||
source: 'memory'
|
||||
}
|
||||
}
|
||||
|
||||
@ -158,7 +156,6 @@ ${formattedMemories}
|
||||
matchesMemory (memory, query) {
|
||||
const lowerQuery = query.toLowerCase()
|
||||
return memory.content.toLowerCase().includes(lowerQuery) ||
|
||||
memory.key.toLowerCase().includes(lowerQuery) ||
|
||||
memory.tags.some(tag => tag.toLowerCase().includes(lowerQuery))
|
||||
}
|
||||
|
||||
@ -179,7 +176,7 @@ ${formattedMemories}
|
||||
? memory.content.substring(0, 120) + '...'
|
||||
: memory.content
|
||||
|
||||
return `📝 ${index + 1}. **${memory.key}** (${memory.timestamp})
|
||||
return `📝 ${index + 1}. **记忆** (${memory.timestamp})
|
||||
|
||||
${content}
|
||||
|
||||
|
||||
@ -17,51 +17,35 @@ class RememberCommand extends BasePouchCommand {
|
||||
}
|
||||
|
||||
async getContent (args) {
|
||||
const [key, ...valueParts] = args
|
||||
const value = valueParts.join(' ')
|
||||
const content = args.join(' ')
|
||||
|
||||
if (!key) {
|
||||
if (!content) {
|
||||
return this.getUsageHelp()
|
||||
}
|
||||
|
||||
if (!value) {
|
||||
return `❌ 请提供要内化的知识内容
|
||||
|
||||
🔍 使用方法:
|
||||
\`\`\`bash
|
||||
${buildCommand.remember('<记忆标识>', '<知识内容>')}
|
||||
\`\`\`
|
||||
|
||||
📝 示例:
|
||||
\`\`\`bash
|
||||
${buildCommand.remember('copywriter-tips', '"视频文案要有强烈的画面感和节奏感"')}
|
||||
${buildCommand.remember('scrum-daily', '"每日站会应该控制在15分钟内,关注昨天、今天、阻碍"')}
|
||||
\`\`\``
|
||||
}
|
||||
|
||||
try {
|
||||
const memoryEntry = await this.saveMemory(key, value)
|
||||
const memoryEntry = await this.saveMemory(content)
|
||||
|
||||
return this.formatSaveResponse(key, value, memoryEntry)
|
||||
return this.formatSaveResponse(content, memoryEntry)
|
||||
} catch (error) {
|
||||
return `❌ 记忆内化失败:${error.message}
|
||||
|
||||
💡 可能的原因:
|
||||
- AI记忆体系目录权限不足
|
||||
- 磁盘空间不够
|
||||
- 记忆标识格式不正确
|
||||
- 记忆内容格式问题
|
||||
|
||||
🔧 解决方案:
|
||||
1. 检查 .promptx 目录权限
|
||||
2. 确保磁盘空间充足
|
||||
3. 使用简洁的记忆标识(字母、数字、连字符)`
|
||||
3. 检查记忆内容是否包含特殊字符`
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 将知识内化到AI记忆体系(紧凑格式)
|
||||
*/
|
||||
async saveMemory (key, value) {
|
||||
async saveMemory (value) {
|
||||
// 1. 确保AI记忆体系目录存在
|
||||
const memoryDir = await this.ensureMemoryDirectory()
|
||||
|
||||
@ -69,13 +53,12 @@ ${buildCommand.remember('scrum-daily', '"每日站会应该控制在15分钟内
|
||||
const memoryFile = path.join(memoryDir, 'declarative.md')
|
||||
|
||||
// 3. 格式化为一行记忆
|
||||
const memoryLine = this.formatMemoryLine(key, value)
|
||||
const memoryLine = this.formatMemoryLine(value)
|
||||
|
||||
// 4. 追加到记忆文件
|
||||
const action = await this.appendToMemoryFile(memoryFile, key, memoryLine)
|
||||
const action = await this.appendToMemoryFile(memoryFile, memoryLine)
|
||||
|
||||
return {
|
||||
key,
|
||||
value,
|
||||
filePath: memoryFile,
|
||||
action,
|
||||
@ -98,32 +81,23 @@ ${buildCommand.remember('scrum-daily', '"每日站会应该控制在15分钟内
|
||||
/**
|
||||
* 格式化为一行记忆(紧凑格式)
|
||||
*/
|
||||
formatMemoryLine (key, value) {
|
||||
formatMemoryLine (value) {
|
||||
const now = new Date()
|
||||
const timestamp = `${now.getFullYear()}/${String(now.getMonth() + 1).padStart(2, '0')}/${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`
|
||||
|
||||
// 自动生成标签
|
||||
const tags = this.generateTags(key, value)
|
||||
const tags = this.generateTags(value)
|
||||
|
||||
return `- ${timestamp} ${value} #${key} ${tags} #评分:8 #有效期:长期`
|
||||
return `- ${timestamp} ${value} #${tags} #评分:8 #有效期:长期`
|
||||
}
|
||||
|
||||
/**
|
||||
* 自动生成标签
|
||||
*/
|
||||
generateTags (key, value) {
|
||||
generateTags (value) {
|
||||
const tags = []
|
||||
const lowerKey = key.toLowerCase()
|
||||
const lowerValue = value.toLowerCase()
|
||||
|
||||
// 基于key生成标签
|
||||
if (lowerKey.includes('scrum') || lowerKey.includes('agile')) tags.push('#敏捷开发')
|
||||
if (lowerKey.includes('test') || lowerKey.includes('qa')) tags.push('#测试')
|
||||
if (lowerKey.includes('deploy') || lowerKey.includes('发布')) tags.push('#部署')
|
||||
if (lowerKey.includes('react') || lowerKey.includes('前端')) tags.push('#前端开发')
|
||||
if (lowerKey.includes('api') || lowerKey.includes('后端')) tags.push('#后端开发')
|
||||
if (lowerKey.includes('prompt') || lowerKey.includes('ai')) tags.push('#AI')
|
||||
|
||||
// 基于value生成标签
|
||||
if (lowerValue.includes('最佳实践') || lowerValue.includes('规则')) tags.push('#最佳实践')
|
||||
if (lowerValue.includes('流程') || lowerValue.includes('步骤')) tags.push('#流程管理')
|
||||
@ -135,7 +109,7 @@ ${buildCommand.remember('scrum-daily', '"每日站会应该控制在15分钟内
|
||||
/**
|
||||
* 追加到记忆文件
|
||||
*/
|
||||
async appendToMemoryFile (memoryFile, key, memoryLine) {
|
||||
async appendToMemoryFile (memoryFile, memoryLine) {
|
||||
// 初始化文件(如果不存在)
|
||||
if (!await fs.pathExists(memoryFile)) {
|
||||
await fs.writeFile(memoryFile, `# 陈述性记忆
|
||||
@ -151,37 +125,25 @@ ${memoryLine}
|
||||
// 读取现有内容
|
||||
const content = await fs.readFile(memoryFile, 'utf-8')
|
||||
|
||||
// 检查是否已存在相同key的记忆
|
||||
const keyPattern = new RegExp(`^- .*#${key}\\b`, 'm')
|
||||
if (keyPattern.test(content)) {
|
||||
// 替换现有记忆
|
||||
const updatedContent = content.replace(keyPattern, memoryLine)
|
||||
await fs.writeFile(memoryFile, updatedContent)
|
||||
return 'updated'
|
||||
} else {
|
||||
// 追加新记忆(在高价值记忆部分)
|
||||
const insertPosition = content.indexOf('\n\n') + 2
|
||||
const updatedContent = content.slice(0, insertPosition) + memoryLine + '\n\n' + content.slice(insertPosition)
|
||||
await fs.writeFile(memoryFile, updatedContent)
|
||||
return 'created'
|
||||
}
|
||||
// 追加新记忆(在高价值记忆部分)
|
||||
const updatedContent = content + '\n\n' + memoryLine
|
||||
await fs.writeFile(memoryFile, updatedContent)
|
||||
return 'created'
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化保存响应(简化版本)
|
||||
*/
|
||||
formatSaveResponse (key, value, memoryEntry) {
|
||||
formatSaveResponse (value, memoryEntry) {
|
||||
const { action, timestamp } = memoryEntry
|
||||
|
||||
const actionLabels = {
|
||||
created: '✅ AI已内化新记忆',
|
||||
updated: '🔄 AI已更新记忆'
|
||||
created: '✅ AI已内化新记忆'
|
||||
}
|
||||
|
||||
return `${actionLabels[action]}:${key}
|
||||
return `${actionLabels[action]}:${value}
|
||||
|
||||
## 📋 记忆详情
|
||||
- **记忆标识**: \`${key}\`
|
||||
- **内化时间**: ${timestamp.split('T')[0]}
|
||||
- **知识内容**: ${value.length > 100 ? value.substring(0, 100) + '...' : value}
|
||||
|
||||
@ -192,7 +154,7 @@ ${memoryLine}
|
||||
|
||||
## 🔄 下一步行动:
|
||||
- 记忆检索: 验证知识内化效果
|
||||
命令: \`${buildCommand.recall(key)}\`
|
||||
命令: \`${buildCommand.recall(value)}\`
|
||||
- 能力强化: 学习相关知识增强记忆
|
||||
命令: \`${buildCommand.learn('<protocol>://<resource-id>')}\`
|
||||
- 应用实践: 在实际场景中运用记忆
|
||||
@ -209,7 +171,7 @@ ${memoryLine}
|
||||
|
||||
## 📖 基本用法
|
||||
\`\`\`bash
|
||||
${buildCommand.remember('<记忆标识>', '<知识内容>')}
|
||||
${buildCommand.remember('<知识内容>')}
|
||||
\`\`\`
|
||||
|
||||
## 💡 记忆内化示例
|
||||
@ -217,17 +179,12 @@ ${buildCommand.remember('<记忆标识>', '<知识内容>')}
|
||||
### 📝 AI记忆内化
|
||||
AI学习和内化各种专业知识
|
||||
\`\`\`bash
|
||||
${buildCommand.remember('"deploy-process"', '"1.构建代码 2.运行测试 3.部署到staging 4.验证功能 5.发布生产"')}
|
||||
${buildCommand.remember('"debug-case-001"', '"用户反馈视频加载慢,排查发现是CDN配置问题,修改后加载速度提升60%"')}
|
||||
${buildCommand.remember('"react-hooks"', '"React Hooks允许在函数组件中使用state和其他React特性"')}
|
||||
${buildCommand.remember('"code-review-rules"', '"每个PR至少需要2个人review,必须包含测试用例"')}
|
||||
${buildCommand.remember('"构建代码 → 运行测试 → 部署到staging → 验证功能 → 发布生产"')}
|
||||
${buildCommand.remember('"用户反馈视频加载慢,排查发现是CDN配置问题,修改后加载速度提升60%"')}
|
||||
${buildCommand.remember('"React Hooks允许在函数组件中使用state和其他React特性"')}
|
||||
${buildCommand.remember('"每个PR至少需要2个人review,必须包含测试用例"')}
|
||||
\`\`\`
|
||||
|
||||
## 💡 记忆标识规范
|
||||
- 使用简洁的英文标识
|
||||
- 支持连字符分隔
|
||||
- 例如:\`copywriter-tips\`、\`scrum-daily\`、\`react-best-practice\`
|
||||
|
||||
## 🔍 记忆检索与应用
|
||||
\`\`\`bash
|
||||
${buildCommand.recall('<关键词>')} # AI主动检索记忆
|
||||
@ -236,7 +193,7 @@ ${buildCommand.action('<role-id>')} # AI运用记忆激活角色
|
||||
|
||||
🔄 下一步行动:
|
||||
- 开始记忆: 内化第一条知识
|
||||
命令: ${buildCommand.remember('<key>', '<content>')}
|
||||
命令: ${buildCommand.remember('<content>')}
|
||||
- 学习资源: 学习新知识再内化
|
||||
命令: ${buildCommand.learn('<protocol>://<resource>')}`
|
||||
}
|
||||
@ -245,10 +202,9 @@ ${buildCommand.action('<role-id>')} # AI运用记忆激活角色
|
||||
* 获取PATEOAS导航信息
|
||||
*/
|
||||
getPATEOAS (args) {
|
||||
const [key, ...valueParts] = args
|
||||
const value = valueParts.join(' ')
|
||||
const content = args.join(' ')
|
||||
|
||||
if (!key) {
|
||||
if (!content) {
|
||||
return {
|
||||
currentState: 'remember_awaiting_input',
|
||||
availableTransitions: ['hello', 'learn', 'recall'],
|
||||
@ -269,21 +225,6 @@ ${buildCommand.action('<role-id>')} # AI运用记忆激活角色
|
||||
}
|
||||
}
|
||||
|
||||
if (!value) {
|
||||
return {
|
||||
currentState: 'remember_awaiting_content',
|
||||
availableTransitions: ['remember', 'recall'],
|
||||
nextActions: [
|
||||
{
|
||||
name: '重新输入',
|
||||
description: '提供完整的记忆内容',
|
||||
command: buildCommand.remember(key, '<content>'),
|
||||
priority: 'high'
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
currentState: 'memory_saved',
|
||||
availableTransitions: ['recall', 'learn', 'action', 'remember'],
|
||||
@ -291,7 +232,7 @@ ${buildCommand.action('<role-id>')} # AI运用记忆激活角色
|
||||
{
|
||||
name: '检索记忆',
|
||||
description: '测试记忆是否可检索',
|
||||
command: buildCommand.recall(key),
|
||||
command: buildCommand.recall('<关键词>'),
|
||||
priority: 'high'
|
||||
},
|
||||
{
|
||||
@ -309,13 +250,13 @@ ${buildCommand.action('<role-id>')} # AI运用记忆激活角色
|
||||
{
|
||||
name: '继续内化',
|
||||
description: 'AI继续内化更多知识',
|
||||
command: buildCommand.remember('<key>', '<content>'),
|
||||
command: buildCommand.remember('<content>'),
|
||||
priority: 'low'
|
||||
}
|
||||
],
|
||||
metadata: {
|
||||
savedMemory: key,
|
||||
memoryLength: value.length,
|
||||
savedMemory: content.substring(0, 50) + (content.length > 50 ? '...' : ''),
|
||||
memoryLength: content.length,
|
||||
timestamp: new Date().toISOString(),
|
||||
systemVersion: '锦囊串联状态机 v1.0'
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user