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",
"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": {

View File

@ -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 发现下一步操作

View File

@ -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>'}`
}
// 系统路径配置

View File

@ -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 导航:
每个命令执行后都会提供下一步的建议操作,

View File

@ -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不是角色名称**
`

View File

@ -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}

View File

@ -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'
}