From fa4173a1202ffcdad3da5d12cb35697744a34084 Mon Sep 17 00:00:00 2001 From: sean Date: Sat, 31 May 2025 22:28:09 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=BB=9F=E4=B8=80=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=B8=BA=20npx=20dpml-prompt@snapshot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/bin/promptx.js | 10 +- src/constants.js | 2 +- src/lib/core/pouch/PouchCLI.js | 13 +- src/lib/core/pouch/commands/HelloCommand.js | 8 +- src/lib/core/pouch/commands/RecallCommand.js | 11 +- .../core/pouch/commands/RememberCommand.js | 127 +++++------------- 7 files changed, 56 insertions(+), 117 deletions(-) diff --git a/package.json b/package.json index 60fcede..07d6854 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dpml-prompt", - "version": "0.0.2-snapshot.3", + "version": "0.0.2-snapshot.4", "description": "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.", "main": "src/lib/index.js", "bin": { diff --git a/src/bin/promptx.js b/src/bin/promptx.js index 501d74c..22c903b 100755 --- a/src/bin/promptx.js +++ b/src/bin/promptx.js @@ -53,10 +53,10 @@ program }) program - .command('remember [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 发现下一步操作 diff --git a/src/constants.js b/src/constants.js index 6f3a812..f53a1f1 100644 --- a/src/constants.js +++ b/src/constants.js @@ -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 = '') => `${COMMAND_PREFIX} remember ${key}${content !== '' ? ' "' + content + '"' : ' '}` + remember: (content = '') => `${COMMAND_PREFIX} remember${content !== '' ? ' "' + content + '"' : ' '}` } // 系统路径配置 diff --git a/src/lib/core/pouch/PouchCLI.js b/src/lib/core/pouch/PouchCLI.js index d6c5b6a..407fb9a 100644 --- a/src/lib/core/pouch/PouchCLI.js +++ b/src/lib/core/pouch/PouchCLI.js @@ -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 导航: 每个命令执行后都会提供下一步的建议操作, diff --git a/src/lib/core/pouch/commands/HelloCommand.js b/src/lib/core/pouch/commands/HelloCommand.js index b37d798..510455e 100644 --- a/src/lib/core/pouch/commands/HelloCommand.js +++ b/src/lib/core/pouch/commands/HelloCommand.js @@ -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,不是角色名称** ` diff --git a/src/lib/core/pouch/commands/RecallCommand.js b/src/lib/core/pouch/commands/RecallCommand.js index 2ecd5a8..d525379 100644 --- a/src/lib/core/pouch/commands/RecallCommand.js +++ b/src/lib/core/pouch/commands/RecallCommand.js @@ -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} diff --git a/src/lib/core/pouch/commands/RememberCommand.js b/src/lib/core/pouch/commands/RememberCommand.js index e75b773..5f47832 100644 --- a/src/lib/core/pouch/commands/RememberCommand.js +++ b/src/lib/core/pouch/commands/RememberCommand.js @@ -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('://')}\` - 应用实践: 在实际场景中运用记忆 @@ -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('')} # AI运用记忆激活角色 🔄 下一步行动: - 开始记忆: 内化第一条知识 - 命令: ${buildCommand.remember('', '')} + 命令: ${buildCommand.remember('')} - 学习资源: 学习新知识再内化 命令: ${buildCommand.learn('://')}` } @@ -245,10 +202,9 @@ ${buildCommand.action('')} # 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('')} # AI运用记忆激活角色 } } - if (!value) { - return { - currentState: 'remember_awaiting_content', - availableTransitions: ['remember', 'recall'], - nextActions: [ - { - name: '重新输入', - description: '提供完整的记忆内容', - command: buildCommand.remember(key, ''), - priority: 'high' - } - ] - } - } - return { currentState: 'memory_saved', availableTransitions: ['recall', 'learn', 'action', 'remember'], @@ -291,7 +232,7 @@ ${buildCommand.action('')} # AI运用记忆激活角色 { name: '检索记忆', description: '测试记忆是否可检索', - command: buildCommand.recall(key), + command: buildCommand.recall('<关键词>'), priority: 'high' }, { @@ -309,13 +250,13 @@ ${buildCommand.action('')} # AI运用记忆激活角色 { name: '继续内化', description: 'AI继续内化更多知识', - command: buildCommand.remember('', ''), + command: buildCommand.remember(''), 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' }