UNPKG

dpml-prompt

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.

513 lines (461 loc) 19.3 kB
/** * MCP 工具定义 - 共享配置 * 统一管理所有MCP工具的描述和Schema定义,避免重复维护 */ /** * 工具定义配置 */ const TOOL_DEFINITIONS = [ { name: 'promptx_init', description: '🎯 [AI专业能力启动器] ⚡ 让你瞬间拥有任何领域的专家级思维和技能 - 一键激活丰富的专业角色库(产品经理/开发者/设计师/营销专家等),获得跨对话记忆能力,30秒内从普通AI变身行业专家。**多项目支持**:现在支持多个IDE/项目同时使用,项目间完全隔离。**必须使用场景**:1️⃣系统首次使用时;2️⃣创建新角色后刷新注册表;3️⃣角色激活(action)出错时重新发现角色;4️⃣查看当前版本号;5️⃣项目路径发生变化时。每次需要专业服务时都应该先用这个', inputSchema: { type: 'object', properties: { workingDirectory: { type: 'string', description: '当前项目的工作目录绝对路径。AI应该知道当前工作的项目路径,请提供此参数。' }, ideType: { type: 'string', description: 'IDE或编辑器类型,如:cursor, vscode, claude等。完全可选,不提供则自动检测为unknown。' } }, required: ['workingDirectory'] }, convertToCliArgs: (args) => { if (args && args.workingDirectory) { return [{ workingDirectory: args.workingDirectory, ideType: args.ideType }]; } return []; } }, { name: 'promptx_welcome', description: `🎭 [专业服务清单] 展示所有可用的AI专业角色和工具 为AI提供完整的专业服务选项清单,包括可激活的角色和可调用的工具。 何时使用此工具: - 初次进入项目了解可用的角色和工具 - 需要专业能力但不知道有哪些角色可选 - 寻找合适的工具来完成特定任务 - 想要了解项目级、系统级、用户级资源 - 不确定该激活什么角色或使用什么工具 - 定期查看新增的角色和工具 核心展示内容: - 所有可激活的专业角色(按来源分组) - 所有可调用的功能工具(附带使用手册) - 系统级资源(📦 来自PromptX核心) - 项目级资源(🏗️ 当前项目特有) - 用户级资源(👤 用户自定义) - 资源统计和快速索引 资源来源说明: - 📦 系统角色/工具:PromptX内置的通用资源 - 🏗️ 项目角色/工具:当前项目特有的资源 - 👤 用户角色/工具:用户自定义创建的资源 你应该: 1. 项目开始时先用welcome查看可用角色和工具 2. 根据任务需求选择合适的角色激活 3. 发现工具后通过manual链接学习使用方法 4. 记住常用角色ID和工具名便于快速调用 5. 为用户推荐最适合当前任务的角色或工具 6. 关注新增资源(特别是项目级和用户级) 7. 理解不同来源资源的优先级和适用场景 8. 工具使用前必须先learn其manual文档`, inputSchema: { type: 'object', properties: {} }, convertToCliArgs: () => [] }, { name: 'promptx_action', description: `⚡ [专业角色激活器] 瞬间获得指定专业角色的完整思维和技能包 通过角色ID激活专业身份,获得该领域专家的思考方式、工作原则和专业知识。 何时使用此工具: - 需要特定领域的专业能力来解决问题 - 想要切换到不同的专业视角思考 - 处理专业任务需要相应的专业知识 - 用户明确要求某个角色的服务 - 需要创建内容、分析问题或技术决策 - 想要获得角色特有的执行技能 核心激活能力: - 瞬间加载角色的完整定义(人格、原则、知识) - 自动获取角色的所有依赖资源 - 激活角色特有的思维模式和执行技能 - 加载角色相关的历史经验和记忆 - 提供角色专属的工作方法论 - 支持角色间的快速切换 - 3秒内完成专业化转换 系统内置角色(可直接激活): - assistant: AI助手 - 基础对话和任务处理 - luban: 鲁班 - PromptX工具开发大师(开发工具找他) - noface: 无面 - 万能学习助手,可转换为任何领域专家 - nuwa: 女娲 - AI角色创造专家(创建角色找她) - sean: Sean - deepractice.ai创始人,矛盾驱动决策 角色职责边界: - 开发工具 → 切换到luban - 创建角色 → 切换到nuwa - 通用任务 → 使用assistant - 学习新领域 → 使用noface - 产品决策 → 切换到sean 使用前置条件: - 必须已通过promptx_init初始化项目环境 - 确保角色ID的正确性(使用welcome查看可用角色) - 新创建的角色需要先刷新注册表 你应该: 1. 根据任务需求选择合适的角色激活 2. 当任务超出当前角色能力时主动切换角色 3. 激活后立即以该角色身份提供服务 4. 保持角色的专业特征和语言风格 5. 充分利用角色的专业知识解决问题 6. 识别任务类型并切换到对应专家角色 7. 记住常用角色ID便于快速激活 8. 角色不存在时先用init刷新注册表 任务与角色匹配原则: - 当前角色无法胜任时,不要勉强执行 - 主动建议用户切换到合适的角色 - 绝不虚构能力或资源`, inputSchema: { type: 'object', properties: { role: { type: 'string', description: '要激活的角色ID,如:copywriter, product-manager, java-backend-developer' } }, required: ['role'] }, convertToCliArgs: (args) => args && args.role ? [args.role] : [] }, { name: 'promptx_learn', description: `🧠 [专业资源学习器] PromptX资源管理体系的统一学习入口 通过标准化协议体系加载各类专业资源,是AI获取专业能力和理解工具使用的核心通道。 何时使用此工具: - 用户要求使用某个工具但你不了解其用法 - 需要获取特定领域的专业思维模式和执行技能 - 想要了解某个角色的完整定义和能力边界 - 需要查看工具的使用手册和参数说明 - 学习项目特定的资源和配置信息 - 获取最新的专业知识和最佳实践 - 理解复杂概念前需要学习相关基础知识 核心学习能力: - 支持12种标准协议的资源加载和解析 - 智能识别资源类型并选择合适的加载策略 - 保持manual文档的原始格式不进行语义渲染 - 支持跨项目资源访问和继承机制 - 自动处理资源间的依赖关系 - 提供结构化的学习内容展示 - 资源内容的实时加载和更新 使用前置条件: - 必须已通过promptx_init初始化项目环境 - 确保资源路径或ID的正确性 - 对于工具使用必须先学习manual再考虑使用tool 支持的资源协议: - @role://角色ID - 完整角色定义 - @thought://资源ID - 专业思维模式 - @execution://资源ID - 执行技能实践 - @knowledge://资源ID - 领域专业知识 - @manual://工具名 - 工具使用手册(必须真实存在) - @tool://工具名 - 工具源代码 - @package://包名 - 工具包资源 - @project://路径 - 项目特定资源 - @file://路径 - 文件系统资源 - @prompt://ID - 提示词模板 - @user://资源 - 用户自定义资源 - @resource://ID - 通用资源引用 重要提醒: - 只能学习真实存在的资源,绝不虚构 - 资源不存在时会返回错误,不要猜测 - 工具manual必须先存在才能学习使用 你应该: 1. 看到工具相关需求时立即学习对应的@manual://工具名 2. 在不确定资源内容时主动使用learn查看 3. 遵循"学习→理解→使用"的标准流程 4. 为用户推荐相关的学习资源 5. 记住已学习的内容避免重复学习 6. 识别资源间的关联并建议深入学习 7. 在激活角色后学习其依赖的所有资源 8. 将学习到的知识立即应用到当前任务中`, inputSchema: { type: 'object', properties: { resource: { type: 'string', description: '资源URL,支持格式:thought://creativity, execution://best-practice, knowledge://scrum' } }, required: ['resource'] }, convertToCliArgs: (args) => args && args.resource ? [args.resource] : [] }, { name: 'promptx_recall', description: `🔍 [智能记忆检索器] PromptX专业AI记忆体系的核心检索工具 基于认知心理学检索线索理论,智能检索指定角色的专业经验和知识。 何时使用此工具: - 处理涉及私有信息的任务(用户背景、项目细节、组织结构) - 遇到预训练知识无法覆盖的专业领域问题 - 需要了解特定技术栈的历史决策和配置信息 - 感知到语义鸿沟需要外部专业知识补充 - 用户提及过往经验或类似问题的解决方案 - 当前任务上下文触发了相关记忆线索 - 需要避免重复已解决问题的错误路径 - 个性化服务需要了解用户偏好和工作习惯 核心检索能力: - 基于三层检索策略:关键词精确匹配、语义相关分析、时空关联检索 - 支持XML技术记忆的转义字符还原和格式美化 - 智能相关性评估:直接相关、间接相关、背景相关、结构相关 - 渐进式信息呈现:摘要优先、结构化展示、按需详情展开 - 上下文驱动的记忆激活和关联分析 - 自动识别记忆时效性并提供更新建议 - 跨记忆关联发现和知识图谱构建 使用前置条件: - 必须已通过promptx_action激活PromptX角色 - 激活后将自动切换到PromptX专业记忆体系 - 客户端原生记忆功能将被禁用以避免冲突 - 确保检索目标与当前激活角色匹配 检索策略说明: - query参数:仅在确信能精确匹配时使用(如"女娲"、"PromptX"、"MCP"等专有名词) - 语义搜索:不确定时留空query获取全量记忆进行语义匹配 - **强制补充检索**:如使用query参数检索无结果,必须立即无参数全量检索 - **检索优先级**:全量检索 > 部分匹配 > 空结果,宁可多检索也不遗漏 - **用户查询场景**:对于用户的自然语言查询(如"明天安排"、"项目进度"等),优先使用全量检索 你应该: 1. 感知到预训练知识不足时主动触发记忆检索 2. 优先检索与当前任务上下文最相关的专业记忆 3. 根据检索线索调整查询策略提升检索精度 4. 利用检索结果建立当前任务的知识上下文 5. 识别记忆时效性对过时信息进行标记提醒 6. 将检索到的经验应用到当前问题的解决方案中 7. **关键策略:如果使用query参数没有检索到结果,必须立即使用无参数方式全量检索** 8. 宁可多检索也不要遗漏重要的相关记忆信息`, inputSchema: { type: 'object', properties: { role: { type: 'string', description: '要检索记忆的角色ID,如:java-developer, product-manager, copywriter' }, query: { type: 'string', description: '检索关键词,仅在确信能精确匹配时使用(如"女娲"、"PromptX"等具体词汇)。语义搜索或不确定时请留空以获取全量记忆,如果使用关键字无结果建议重试无参数方式' }, random_string: { type: 'string', description: 'Dummy parameter for no-parameter tools' } }, required: ['role', 'random_string'] }, convertToCliArgs: (args) => { if (!args || !args.role) { throw new Error('role 参数是必需的'); } const result = []; // role参数作为第一个位置参数 result.push(args.role); // 处理query参数 if (args && args.query && typeof args.query === 'string' && args.query.trim() !== '') { result.push(args.query); } return result; } }, { name: 'promptx_remember', description: `💾 [智能记忆存储器] PromptX专业AI记忆体系的核心存储工具 将重要经验和知识智能处理后永久保存到指定角色的专业记忆库中。 何时使用此工具: - 用户分享个人化信息:具体的计划、偏好、背景情况 - 用户提供项目特定信息:工作内容、进展、配置、决策 - 用户描述经验性信息:解决问题的方法、遇到的困难、得到的教训 - 用户进行纠错性信息:对AI回答的修正、补充、澄清 - 通过工具调用获得新的文件内容、数据查询结果 - 从互联网获取了训练截止后的最新技术信息 - 每轮对话结束时识别到有价值的用户特定信息 核心处理能力: - 自动识别信息类型并应用对应的奥卡姆剃刀压缩策略 - 智能生成3-5个语义相关的分类标签避免重复 - 基于价值评估机制筛选高价值信息存储 - 支持XML技术内容的转义处理和格式优化 - 实现角色隔离存储确保专业记忆的独立性 - 自动去重检测避免冗余记忆的累积 - 提取最小完整信息保持记忆库的简洁高效 使用前置条件: - 必须已通过promptx_action激活PromptX角色 - 激活后将自动切换到PromptX专业记忆体系 - 客户端原生记忆功能将被禁用以避免冲突 - 确保当前角色与要存储的记忆内容匹配 参数详细说明: - role: 目标角色ID,记忆将绑定到此专业角色的知识库 - content: 原始信息内容,工具将自动进行智能优化处理 - tags: 可选自定义标签,工具会基于内容自动生成补充标签 🧠 智能记忆判断策略: 当用户分享以下类型信息时,立即评估记忆价值: 📍 个人化信息:用户的具体计划、偏好、背景情况 📍 项目特定信息:具体的工作内容、进展、配置、决策 📍 经验性信息:解决问题的方法、遇到的困难、得到的教训 📍 纠错性信息:对AI回答的修正、补充、澄清 记忆决策原则: - 这是通用知识还是用户特定信息? - 这对提升后续服务质量有帮助吗? - 不确定时,倾向于记忆而不是遗漏 你应该: 1. 每轮对话结束时主动评估是否有值得记忆的新信息 2. 基于语义理解而非关键词匹配来判断记忆价值 3. 优先记忆大模型训练数据中不存在的私有专业信息 4. 保持记忆内容的简洁性,核心价值信息优于详细描述 5. 当不确定是否值得记忆时,倾向于记忆而不是遗漏`, inputSchema: { type: 'object', properties: { role: { type: 'string', description: '要保存记忆的角色ID,如:java-developer, product-manager, copywriter' }, content: { type: 'string', description: '要保存的重要信息或经验' }, tags: { type: 'string', description: '自定义标签,用空格分隔,可选' } }, required: ['role', 'content'] }, convertToCliArgs: (args) => { if (!args || !args.role) { throw new Error('role 参数是必需的'); } if (!args || !args.content) { throw new Error('content 参数是必需的'); } const result = []; // role参数作为第一个位置参数 result.push(args.role); // 然后是内容 result.push(args.content); // 处理tags参数 if (args.tags) { result.push('--tags', args.tags); } return result; } }, { name: 'promptx_tool', description: `🔧 [工具执行器] 执行通过@tool协议声明的JavaScript功能工具 基于PromptX工具生态系统,提供安全可控的工具执行环境。 何时使用此工具: - 已通过promptx_learn学习了@manual://工具名并理解其功能 - 用户明确要求使用某个工具解决具体问题 - 当前任务正好匹配工具的设计用途 - 所有必需参数都已准备就绪 - 确认这是解决问题的最佳工具选择 核心执行能力: - 动态加载和执行JavaScript工具模块 - 自动处理工具依赖的npm包安装 - 提供隔离的执行沙箱环境 - 支持异步工具执行和超时控制 - 完整的错误捕获和友好提示 - 工具执行状态的实时监控 - 参数验证和类型检查 使用前置条件: - 必须先使用promptx_learn学习@manual://工具名 - 完全理解工具的功能、参数和返回值格式 - 确认工具适用于当前的使用场景 - 准备好所有必需的参数值 执行流程规范: 1. 识别需求 → 2. learn manual → 3. 理解功能 → 4. 准备参数 → 5. 执行工具 严格禁止: - 未学习manual就直接调用工具 - 基于猜测使用工具 - 将工具用于非设计用途 - 忽略工具的使用限制和边界 你应该: 1. 永远遵循"先学习后使用"的原则 2. 仔细阅读manual中的参数说明和示例 3. 根据manual中的最佳实践使用工具 4. 处理工具返回的错误并给出建议 5. 向用户解释工具的执行过程和结果 6. 在工具执行失败时参考manual的故障排除 7. 记录工具使用经验供后续参考 8. 推荐相关工具形成完整解决方案`, inputSchema: { type: 'object', properties: { tool_resource: { type: 'string', description: '工具资源引用,格式:@tool://tool-name,如@tool://calculator', pattern: '^@tool://.+' }, parameters: { type: 'object', description: '传递给工具的参数对象' }, rebuild: { type: 'boolean', description: '是否强制重建沙箱(默认false)。用于处理异常情况如node_modules损坏、权限问题等。正常情况下会自动检测依赖变化', default: false }, timeout: { type: 'number', description: '工具执行超时时间(毫秒),默认30000ms', default: 30000 } }, required: ['tool_resource', 'parameters'] }, convertToCliArgs: (args) => { if (!args || !args.tool_resource || !args.parameters) { throw new Error('tool_resource 和 parameters 参数是必需的'); } const result = [args.tool_resource, args.parameters]; if (args.rebuild) { result.push('--rebuild'); } if (args.timeout) { result.push('--timeout', args.timeout); } return result; } } ]; /** * 获取所有工具定义 - 用于MCP Server */ function getToolDefinitions() { return TOOL_DEFINITIONS.map(tool => ({ name: tool.name, description: tool.description, inputSchema: tool.inputSchema })); } /** * 获取指定工具的定义 */ function getToolDefinition(toolName) { return TOOL_DEFINITIONS.find(tool => tool.name === toolName); } /** * 获取指定工具的参数转换函数 */ function getToolCliConverter(toolName) { const tool = getToolDefinition(toolName); return tool ? tool.convertToCliArgs : null; } /** * 获取所有工具名称 */ function getToolNames() { return TOOL_DEFINITIONS.map(tool => tool.name); } module.exports = { TOOL_DEFINITIONS, getToolDefinitions, getToolDefinition, getToolCliConverter, getToolNames };