fix: 统一命令格式为 npx dpml-prompt@snapshot

This commit is contained in:
sean
2025-05-31 22:28:09 +08:00
parent 1e57784a02
commit fa4173a120
7 changed files with 56 additions and 117 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "dpml-prompt", "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.", "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", "main": "src/lib/index.js",
"bin": { "bin": {

View File

@ -53,10 +53,10 @@ program
}) })
program program
.command('remember <key> [value...]') .command('remember [content...]')
.description('🧠 remember锦囊 - AI主动内化知识和经验到记忆体系') .description('🧠 remember锦囊 - AI主动内化知识和经验到记忆体系')
.action(async (key, value, options) => { .action(async (content, options) => {
const args = [key, ...(value || [])] const args = content || []
await cli.execute('remember', args) await cli.execute('remember', args)
}) })
@ -99,8 +99,8 @@ ${chalk.cyan('示例:')}
promptx recall promptx recall
${chalk.gray('# 6⃣ AI内化专业知识')} ${chalk.gray('# 6⃣ AI内化专业知识')}
promptx remember "scrum-tips" "每日站会控制在15分钟内" promptx remember "每日站会控制在15分钟内"
promptx remember "deploy-flow" "测试→预发布→生产" promptx remember "测试→预发布→生产"
${chalk.cyan('🔄 PATEOAS状态机:')} ${chalk.cyan('🔄 PATEOAS状态机:')}
每个锦囊输出都包含 PATEOAS 导航,引导 AI 发现下一步操作 每个锦囊输出都包含 PATEOAS 导航,引导 AI 发现下一步操作

View File

@ -22,7 +22,7 @@ export const buildCommand = {
action: (roleId) => `${COMMAND_PREFIX} action ${roleId}`, action: (roleId) => `${COMMAND_PREFIX} action ${roleId}`,
learn: (resource) => `${COMMAND_PREFIX} learn ${resource}`, learn: (resource) => `${COMMAND_PREFIX} learn ${resource}`,
recall: (query = '') => `${COMMAND_PREFIX} recall${query ? ' ' + query : ''}`, 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>'}`
} }
// 系统路径配置 // 系统路径配置

View File

@ -1,6 +1,7 @@
const PouchStateMachine = require('./state/PouchStateMachine') const PouchStateMachine = require('./state/PouchStateMachine')
const PouchRegistry = require('./PouchRegistry') const PouchRegistry = require('./PouchRegistry')
const commands = require('./commands') const commands = require('./commands')
const { COMMANDS } = require('../../../constants')
/** /**
* 锦囊CLI主入口 * 锦囊CLI主入口
@ -57,7 +58,7 @@ class PouchCLI {
// 验证命令是否存在 // 验证命令是否存在
if (!this.registry.validate(commandName)) { if (!this.registry.validate(commandName)) {
throw new Error(`未知命令: ${commandName}\n使用 'npx promptx help' 查看可用命令`) throw new Error(`未知命令: ${commandName}\n使用 '${COMMANDS.HELP}' 查看可用命令`)
} }
try { try {
@ -104,11 +105,11 @@ class PouchCLI {
help += ` help += `
💡 使用示例: 💡 使用示例:
npx promptx init # 初始化工作环境 ${COMMANDS.INIT} # 初始化工作环境
npx promptx hello # 发现可用角色 ${COMMANDS.HELLO} # 发现可用角色
npx promptx action copywriter # 激活文案专家 ${COMMANDS.ACTION} copywriter # 激活文案专家
npx promptx learn scrum # 学习敏捷知识 ${COMMANDS.LEARN} scrum # 学习敏捷知识
npx promptx recall frontend # 检索前端记忆 ${COMMANDS.RECALL} frontend # 检索前端记忆
🔄 PATEOAS 导航: 🔄 PATEOAS 导航:
每个命令执行后都会提供下一步的建议操作, 每个命令执行后都会提供下一步的建议操作,

View File

@ -88,7 +88,7 @@ class HelloCommand extends BasePouchCommand {
content += `### ${index + 1}. ${role.name} content += `### ${index + 1}. ${role.name}
**角色ID**: \`${role.id}\` **角色ID**: \`${role.id}\`
**专业能力**: ${role.description} **专业能力**: ${role.description}
**激活命令**: \`npx promptx action ${role.id}\` **激活命令**: \`${buildCommand.action(role.id)}\`
--- ---
@ -101,12 +101,12 @@ class HelloCommand extends BasePouchCommand {
### 🔧 激活步骤 ### 🔧 激活步骤
1. **选择角色**: 从上述列表中选择需要的专业角色 1. **选择角色**: 从上述列表中选择需要的专业角色
2. **使用角色ID**: 复制对应的角色ID\`${allRoles[0]?.id || 'assistant'}\` 2. **使用角色ID**: 复制对应的角色ID\`${allRoles[0]?.id || 'assistant'}\`
3. **执行命令**: 运行 \`npx promptx action <角色ID>\` 3. **执行命令**: 运行 \`${buildCommand.action('<角色ID>')}\`
### 📝 激活示例 ### 📝 激活示例
\`\`\`bash \`\`\`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执行指令** ⚠️ **AI执行指令**
📢 **向主人汇报角色选项,明确说明使用方法:"请选择角色ID然后我将执行对应的action命令"** 📢 **向主人汇报角色选项,明确说明使用方法:"请选择角色ID然后我将执行对应的action命令"**
🎯 **等待主人指定具体的角色ID后立即执行 \`npx promptx action <角色ID>\`** 🎯 **等待主人指定具体的角色ID后立即执行 \`${buildCommand.action('<角色ID>')}\`**
💡 **强调action命令需要具体的角色ID不是角色名称** 💡 **强调action命令需要具体的角色ID不是角色名称**
` `

View File

@ -135,20 +135,18 @@ ${formattedMemories}
* 解析记忆行(紧凑格式) * 解析记忆行(紧凑格式)
*/ */
parseMemoryLine (line) { parseMemoryLine (line) {
// 格式:- 2025/05/31 14:30 内容 #key #tag1 #tag2 #评分:8 #有效期:长期 // 格式:- 2025/05/31 14:30 内容 #tag1 #tag2 #评分:8 #有效期:长期
const match = line.match(/^- (\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}) (.*?) (#\w+.*?)$/) const match = line.match(/^- (\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}) (.*?) (#.*?)$/)
if (!match) return null if (!match) return null
const [, timestamp, content, tagsStr] = match const [, timestamp, content, tagsStr] = match
const tags = tagsStr.split(' ').filter(t => t.startsWith('#')) const tags = tagsStr.split(' ').filter(t => t.startsWith('#'))
const keyTag = tags.find(t => !t.includes(':') && !['#敏捷开发', '#测试', '#部署', '#前端开发', '#后端开发', '#AI', '#最佳实践', '#流程管理', '#工具使用', '#其他'].includes(t))
return { return {
timestamp, timestamp,
content, content,
key: keyTag ? keyTag.substring(1) : 'unknown',
tags, tags,
source: keyTag ? keyTag.substring(1) : 'unknown' source: 'memory'
} }
} }
@ -158,7 +156,6 @@ ${formattedMemories}
matchesMemory (memory, query) { matchesMemory (memory, query) {
const lowerQuery = query.toLowerCase() const lowerQuery = query.toLowerCase()
return memory.content.toLowerCase().includes(lowerQuery) || return memory.content.toLowerCase().includes(lowerQuery) ||
memory.key.toLowerCase().includes(lowerQuery) ||
memory.tags.some(tag => tag.toLowerCase().includes(lowerQuery)) memory.tags.some(tag => tag.toLowerCase().includes(lowerQuery))
} }
@ -179,7 +176,7 @@ ${formattedMemories}
? memory.content.substring(0, 120) + '...' ? memory.content.substring(0, 120) + '...'
: memory.content : memory.content
return `📝 ${index + 1}. **${memory.key}** (${memory.timestamp}) return `📝 ${index + 1}. **记忆** (${memory.timestamp})
${content} ${content}

View File

@ -17,51 +17,35 @@ class RememberCommand extends BasePouchCommand {
} }
async getContent (args) { async getContent (args) {
const [key, ...valueParts] = args const content = args.join(' ')
const value = valueParts.join(' ')
if (!key) { if (!content) {
return this.getUsageHelp() return this.getUsageHelp()
} }
if (!value) {
return `❌ 请提供要内化的知识内容
🔍 使用方法:
\`\`\`bash
${buildCommand.remember('<记忆标识>', '<知识内容>')}
\`\`\`
📝 示例:
\`\`\`bash
${buildCommand.remember('copywriter-tips', '"视频文案要有强烈的画面感和节奏感"')}
${buildCommand.remember('scrum-daily', '"每日站会应该控制在15分钟内关注昨天、今天、阻碍"')}
\`\`\``
}
try { 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) { } catch (error) {
return `❌ 记忆内化失败:${error.message} return `❌ 记忆内化失败:${error.message}
💡 可能的原因: 💡 可能的原因:
- AI记忆体系目录权限不足 - AI记忆体系目录权限不足
- 磁盘空间不够 - 磁盘空间不够
- 记忆标识格式不正确 - 记忆内容格式问题
🔧 解决方案: 🔧 解决方案:
1. 检查 .promptx 目录权限 1. 检查 .promptx 目录权限
2. 确保磁盘空间充足 2. 确保磁盘空间充足
3. 使用简洁的记忆标识(字母、数字、连字符` 3. 检查记忆内容是否包含特殊字符`
} }
} }
/** /**
* 将知识内化到AI记忆体系紧凑格式 * 将知识内化到AI记忆体系紧凑格式
*/ */
async saveMemory (key, value) { async saveMemory (value) {
// 1. 确保AI记忆体系目录存在 // 1. 确保AI记忆体系目录存在
const memoryDir = await this.ensureMemoryDirectory() const memoryDir = await this.ensureMemoryDirectory()
@ -69,13 +53,12 @@ ${buildCommand.remember('scrum-daily', '"每日站会应该控制在15分钟内
const memoryFile = path.join(memoryDir, 'declarative.md') const memoryFile = path.join(memoryDir, 'declarative.md')
// 3. 格式化为一行记忆 // 3. 格式化为一行记忆
const memoryLine = this.formatMemoryLine(key, value) const memoryLine = this.formatMemoryLine(value)
// 4. 追加到记忆文件 // 4. 追加到记忆文件
const action = await this.appendToMemoryFile(memoryFile, key, memoryLine) const action = await this.appendToMemoryFile(memoryFile, memoryLine)
return { return {
key,
value, value,
filePath: memoryFile, filePath: memoryFile,
action, action,
@ -98,32 +81,23 @@ ${buildCommand.remember('scrum-daily', '"每日站会应该控制在15分钟内
/** /**
* 格式化为一行记忆(紧凑格式) * 格式化为一行记忆(紧凑格式)
*/ */
formatMemoryLine (key, value) { formatMemoryLine (value) {
const now = new Date() 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 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 tags = []
const lowerKey = key.toLowerCase()
const lowerValue = value.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生成标签 // 基于value生成标签
if (lowerValue.includes('最佳实践') || lowerValue.includes('规则')) tags.push('#最佳实践') if (lowerValue.includes('最佳实践') || lowerValue.includes('规则')) tags.push('#最佳实践')
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)) { if (!await fs.pathExists(memoryFile)) {
await fs.writeFile(memoryFile, `# 陈述性记忆 await fs.writeFile(memoryFile, `# 陈述性记忆
@ -151,37 +125,25 @@ ${memoryLine}
// 读取现有内容 // 读取现有内容
const content = await fs.readFile(memoryFile, 'utf-8') 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 + '\n\n' + memoryLine
const updatedContent = content.slice(0, insertPosition) + memoryLine + '\n\n' + content.slice(insertPosition)
await fs.writeFile(memoryFile, updatedContent) await fs.writeFile(memoryFile, updatedContent)
return 'created' return 'created'
} }
}
/** /**
* 格式化保存响应(简化版本) * 格式化保存响应(简化版本)
*/ */
formatSaveResponse (key, value, memoryEntry) { formatSaveResponse (value, memoryEntry) {
const { action, timestamp } = memoryEntry const { action, timestamp } = memoryEntry
const actionLabels = { const actionLabels = {
created: '✅ AI已内化新记忆', created: '✅ AI已内化新记忆'
updated: '🔄 AI已更新记忆'
} }
return `${actionLabels[action]}${key} return `${actionLabels[action]}${value}
## 📋 记忆详情 ## 📋 记忆详情
- **记忆标识**: \`${key}\`
- **内化时间**: ${timestamp.split('T')[0]} - **内化时间**: ${timestamp.split('T')[0]}
- **知识内容**: ${value.length > 100 ? value.substring(0, 100) + '...' : value} - **知识内容**: ${value.length > 100 ? value.substring(0, 100) + '...' : value}
@ -192,7 +154,7 @@ ${memoryLine}
## 🔄 下一步行动: ## 🔄 下一步行动:
- 记忆检索: 验证知识内化效果 - 记忆检索: 验证知识内化效果
命令: \`${buildCommand.recall(key)}\` 命令: \`${buildCommand.recall(value)}\`
- 能力强化: 学习相关知识增强记忆 - 能力强化: 学习相关知识增强记忆
命令: \`${buildCommand.learn('<protocol>://<resource-id>')}\` 命令: \`${buildCommand.learn('<protocol>://<resource-id>')}\`
- 应用实践: 在实际场景中运用记忆 - 应用实践: 在实际场景中运用记忆
@ -209,7 +171,7 @@ ${memoryLine}
## 📖 基本用法 ## 📖 基本用法
\`\`\`bash \`\`\`bash
${buildCommand.remember('<记忆标识>', '<知识内容>')} ${buildCommand.remember('<知识内容>')}
\`\`\` \`\`\`
## 💡 记忆内化示例 ## 💡 记忆内化示例
@ -217,17 +179,12 @@ ${buildCommand.remember('<记忆标识>', '<知识内容>')}
### 📝 AI记忆内化 ### 📝 AI记忆内化
AI学习和内化各种专业知识 AI学习和内化各种专业知识
\`\`\`bash \`\`\`bash
${buildCommand.remember('"deploy-process"', '"1.构建代码 2.运行测试 3.部署到staging 4.验证功能 5.发布生产"')} ${buildCommand.remember('"构建代码 运行测试 部署到staging 验证功能 发布生产"')}
${buildCommand.remember('"debug-case-001"', '"用户反馈视频加载慢排查发现是CDN配置问题修改后加载速度提升60%"')} ${buildCommand.remember('"用户反馈视频加载慢排查发现是CDN配置问题修改后加载速度提升60%"')}
${buildCommand.remember('"react-hooks"', '"React Hooks允许在函数组件中使用state和其他React特性"')} ${buildCommand.remember('"React Hooks允许在函数组件中使用state和其他React特性"')}
${buildCommand.remember('"code-review-rules"', '"每个PR至少需要2个人review必须包含测试用例"')} ${buildCommand.remember('"每个PR至少需要2个人review必须包含测试用例"')}
\`\`\` \`\`\`
## 💡 记忆标识规范
- 使用简洁的英文标识
- 支持连字符分隔
- 例如:\`copywriter-tips\`\`scrum-daily\`\`react-best-practice\`
## 🔍 记忆检索与应用 ## 🔍 记忆检索与应用
\`\`\`bash \`\`\`bash
${buildCommand.recall('<关键词>')} # AI主动检索记忆 ${buildCommand.recall('<关键词>')} # AI主动检索记忆
@ -236,7 +193,7 @@ ${buildCommand.action('<role-id>')} # AI运用记忆激活角色
🔄 下一步行动: 🔄 下一步行动:
- 开始记忆: 内化第一条知识 - 开始记忆: 内化第一条知识
命令: ${buildCommand.remember('<key>', '<content>')} 命令: ${buildCommand.remember('<content>')}
- 学习资源: 学习新知识再内化 - 学习资源: 学习新知识再内化
命令: ${buildCommand.learn('<protocol>://<resource>')}` 命令: ${buildCommand.learn('<protocol>://<resource>')}`
} }
@ -245,10 +202,9 @@ ${buildCommand.action('<role-id>')} # AI运用记忆激活角色
* 获取PATEOAS导航信息 * 获取PATEOAS导航信息
*/ */
getPATEOAS (args) { getPATEOAS (args) {
const [key, ...valueParts] = args const content = args.join(' ')
const value = valueParts.join(' ')
if (!key) { if (!content) {
return { return {
currentState: 'remember_awaiting_input', currentState: 'remember_awaiting_input',
availableTransitions: ['hello', 'learn', 'recall'], 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 { return {
currentState: 'memory_saved', currentState: 'memory_saved',
availableTransitions: ['recall', 'learn', 'action', 'remember'], availableTransitions: ['recall', 'learn', 'action', 'remember'],
@ -291,7 +232,7 @@ ${buildCommand.action('<role-id>')} # AI运用记忆激活角色
{ {
name: '检索记忆', name: '检索记忆',
description: '测试记忆是否可检索', description: '测试记忆是否可检索',
command: buildCommand.recall(key), command: buildCommand.recall('<关键词>'),
priority: 'high' priority: 'high'
}, },
{ {
@ -309,13 +250,13 @@ ${buildCommand.action('<role-id>')} # AI运用记忆激活角色
{ {
name: '继续内化', name: '继续内化',
description: 'AI继续内化更多知识', description: 'AI继续内化更多知识',
command: buildCommand.remember('<key>', '<content>'), command: buildCommand.remember('<content>'),
priority: 'low' priority: 'low'
} }
], ],
metadata: { metadata: {
savedMemory: key, savedMemory: content.substring(0, 50) + (content.length > 50 ? '...' : ''),
memoryLength: value.length, memoryLength: content.length,
timestamp: new Date().toISOString(), timestamp: new Date().toISOString(),
systemVersion: '锦囊串联状态机 v1.0' systemVersion: '锦囊串联状态机 v1.0'
} }