diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..bce2cef --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,16 @@ +{ + "permissions": { + "allow": [ + "Bash(promptx:*)", + "Bash(node:*)", + "Bash(mkdir:*)", + "Bash(npm test:*)", + "Bash(git restore:*)", + "Bash(rm:*)", + "Bash(ls:*)", + "Bash(find:*)", + "Bash(npx:*)" + ], + "deny": [] + } +} \ No newline at end of file diff --git a/Bug报告-MCP多项目环境记忆路径错误.md b/Bug报告-MCP多项目环境记忆路径错误.md new file mode 100644 index 0000000..db708cf --- /dev/null +++ b/Bug报告-MCP多项目环境记忆路径错误.md @@ -0,0 +1,424 @@ +# 🐛 Bug报告: MCP多项目环境记忆路径错误 + +## 📊 **Bug基本信息** + +| 字段 | 内容 | +|------|------| +| **Bug ID** | PROMPTX-001 | +| **严重级别** | 🔴 **高危** - 数据完整性问题 | +| **发现时间** | 2025-06-25 | +| **影响组件** | MCP Server、记忆系统、工作目录识别 | +| **影响版本** | PromptX v0.0.2-snapshot | +| **报告者** | AI Memory Specialist | + +--- + +## 🎯 **问题描述** + +### 🔍 **现象表现** +在MCP环境下使用`mcp_promptx-local_promptx_remember`工具保存记忆时,记忆被错误保存到其他项目的`.promptx`目录中,而不是当前工作项目的目录。 + +### 📂 **具体表现** +``` +期望行为: +记忆保存到 → /Users/macmima1234/Desktop/PromptX/.promptx/memory/memory.xml ✅ + +实际行为: +记忆保存到 → /Users/macmima1234/Desktop/GalleryHub/.promptx/memory/memory.xml ❌ +``` + +### 🎭 **触发条件** +- **环境**: MCP (Model Context Protocol) 模式 +- **工具**: `mcp_promptx-local_promptx_remember` +- **场景**: 用户Desktop下存在多个包含`.promptx`目录的项目 +- **当前目录**: `/Users/macmima1234/Desktop/PromptX` +- **多项目布局**: + ``` + /Users/macmima1234/Desktop/ + ├── PromptX/.promptx ✅ 期望目标 + ├── GalleryHub/.promptx ❌ 错误选择 + ├── shop/.promptx 📁 其他项目 + ├── agent-zero/.promptx 📁 其他项目 + └── ~/.promptx 📁 用户目录 + ``` + +--- + +## 🔍 **根因分析** + +### 🎯 **核心问题定位** + +#### **问题文件**: `src/lib/utils/executionContext.js` +#### **问题函数**: `getWorkspaceSynchronous()` → `findExistingPromptxDirectory()` + +### 🧠 **深度分析** + +#### **1. 执行流程追踪** +```javascript +// MCP启动时的执行链 +getExecutionContext() +├── command === 'mcp-server' ✅ +├── getMCPWorkingDirectory() + ├── getWorkspaceSynchronous(context) + ├── 策略1: WORKSPACE_FOLDER_PATHS ❌ (undefined) + ├── 策略2: PROMPTX_WORKSPACE ❌ (undefined) + └── 策略3: findExistingPromptxDirectory() ❌ (在这里出错!) + └── 向上查找 .promptx 目录 + ├── 起始点: process.cwd() = AI应用安装目录 + ├── 向上搜索过程中发现多个.promptx目录 + └── 返回第一个找到的: GalleryHub/.promptx ❌ +``` + +#### **2. 问题代码定位** +```javascript +// 文件:src/lib/utils/executionContext.js 行89-94 +// 策略3:现有.promptx目录 +const existingPrompxRoot = findExistingPromptxDirectory(context.startDir); +if (existingPrompxRoot) { + console.error(`[执行上下文] 发现现有.promptx目录: ${existingPrompxRoot}`); + return existingPrompxRoot; // ❌ 返回了错误的项目路径! +} +``` + +```javascript +// 文件:src/lib/utils/executionContext.js 行134-154 +function findExistingPromptxDirectory(startDir) { + let currentDir = path.resolve(startDir); // startDir = process.cwd() = AI应用目录 + const root = path.parse(currentDir).root; + + while (currentDir !== root) { + const promptxPath = path.join(currentDir, '.promptx'); + if (fs.existsSync(promptxPath)) { // ❌ 找到第一个就返回,没有优先级判断 + try { + const stat = fs.statSync(promptxPath); + if (stat.isDirectory()) { + return currentDir; // ❌ 返回了错误的项目路径! + } + } catch { + // 忽略权限错误等,继续查找 + } + } + // 向上一级目录 + const parentDir = path.dirname(currentDir); + if (parentDir === currentDir) break; + currentDir = parentDir; + } + return null; +} +``` + +#### **3. 路径歧义问题** +``` +向上查找过程: +AI应用目录 (/Applications/Claude.app/...) + ↓ 向上搜索 +用户目录 (/Users/macmima1234/) + ↓ 向上搜索 +Desktop目录 (/Users/macmima1234/Desktop/) + ↓ 发现多个.promptx目录 + ├── agent-zero/.promptx (第一个被发现?) + ├── GalleryHub/.promptx (实际被选择) + ├── PromptX/.promptx (期望目标) + └── shop/.promptx + +❌ 算法缺陷:没有"最接近当前期望项目"的智能判断 +``` + +--- + +## 🎯 **影响评估** + +### 🔴 **高危影响** + +#### **1. 数据完整性问题** +- **记忆数据错位**: 用户期望的记忆被保存到错误的项目中 +- **数据污染风险**: 不同项目的记忆互相混合 +- **数据丢失风险**: 用户找不到自己保存的记忆内容 + +#### **2. 用户体验严重破坏** +- **功能失效**: 记忆系统在多项目环境下完全不可用 +- **信任度下降**: 用户对系统可靠性产生质疑 +- **工作效率损失**: 需要手动查找和迁移记忆文件 + +#### **3. 系统架构问题** +- **MCP协议理解偏差**: 对工作目录识别的理解存在缺陷 +- **多项目支持缺失**: 没有考虑多项目开发环境的现实需求 +- **环境隔离失败**: 不同项目的PromptX实例应该相互隔离 + +### 📊 **影响范围统计** +- **受影响用户**: 所有在多项目环境下使用MCP的开发者 +- **受影响功能**: 记忆系统 (remember/recall)、角色发现、学习功能 +- **受影响环境**: MCP模式 (CLI模式不受影响) +- **数据风险**: 高 (记忆数据可能完全错位) + +--- + +## 🔬 **复现步骤** + +### 📋 **环境准备** +1. **创建多项目环境**: + ```bash + mkdir -p ~/Desktop/ProjectA && echo '{}' > ~/Desktop/ProjectA/package.json + mkdir -p ~/Desktop/ProjectB && echo '{}' > ~/Desktop/ProjectB/package.json + mkdir -p ~/Desktop/PromptX # 当前工作项目 + ``` + +2. **初始化.promptx目录**: + ```bash + mkdir -p ~/Desktop/ProjectA/.promptx/memory + mkdir -p ~/Desktop/ProjectB/.promptx/memory + mkdir -p ~/Desktop/PromptX/.promptx/memory + ``` + +3. **配置MCP环境**: 在Claude Desktop中配置PromptX MCP Server + +### 🔄 **复现操作** +1. **在PromptX项目目录下启动**: `cd ~/Desktop/PromptX` +2. **通过MCP调用记忆工具**: 使用`mcp_promptx-local_promptx_remember`保存记忆 +3. **检查记忆保存位置**: + ```bash + find ~/Desktop -name "memory.xml" -exec ls -la {} \; + ``` + +### ✅ **预期结果 vs 实际结果** +| 步骤 | 预期结果 | 实际结果 | 状态 | +|------|----------|----------|------| +| 记忆保存位置 | `~/Desktop/PromptX/.promptx/memory/` | `~/Desktop/ProjectA/.promptx/memory/` | ❌ 失败 | +| 文件完整性 | 记忆保存到正确项目 | 记忆保存到错误项目 | ❌ 失败 | + +--- + +## 🛠️ **潜在解决方案分析** + +### 🎯 **方案1: 优化策略优先级** (推荐) + +#### **核心思路**: 调整`getWorkspaceSynchronous()`的策略顺序,优先使用更精确的方法 + +```javascript +// 修改建议:src/lib/utils/executionContext.js +function getWorkspaceSynchronous(context) { + // 策略1:PromptX专用环境变量 (提升优先级) + const promptxWorkspaceEnv = process.env.PROMPTX_WORKSPACE; + if (promptxWorkspaceEnv && promptxWorkspaceEnv.trim() !== '') { + const promptxWorkspace = normalizePath(expandHome(promptxWorkspaceEnv)); + if (isValidDirectory(promptxWorkspace)) { + return promptxWorkspace; // ✅ 精确指定的项目路径 + } + } + + // 策略2:智能项目根目录匹配 (新增) + const projectRoot = findProjectRootWithPreference(context.startDir); + if (projectRoot) { + return projectRoot; // ✅ 基于项目特征的智能判断 + } + + // 策略3:现有.promptx目录 (降低优先级,增加智能判断) + const existingPrompxRoot = findExistingPromptxDirectoryWithPreference(context); + if (existingPrompxRoot) { + return existingPrompxRoot; // ✅ 带有偏好的目录选择 + } + + // 其他策略... +} +``` + +#### **预期效果**: +- ✅ 解决多项目路径歧义问题 +- ✅ 保持向后兼容性 +- ✅ 修改范围最小,风险可控 + +### 🎯 **方案2: 智能项目匹配算法** (中期) + +#### **核心思路**: 增加项目特征识别和距离计算 + +```javascript +// 新增函数:智能项目根目录查找 +function findProjectRootWithPreference(startDir) { + const candidates = findAllProjectRoots(startDir); + + // 按距离和特征评分排序 + const scoredCandidates = candidates.map(candidate => ({ + path: candidate, + score: calculateProjectScore(candidate, startDir) + })); + + // 返回得分最高的项目 + scoredCandidates.sort((a, b) => b.score - a.score); + return scoredCandidates[0]?.path || null; +} + +function calculateProjectScore(projectPath, currentContext) { + let score = 0; + + // 1. 路径距离权重 + const distance = path.relative(currentContext, projectPath).split('/').length; + score += Math.max(0, 100 - distance * 10); + + // 2. 项目特征权重 + if (fs.existsSync(path.join(projectPath, 'package.json'))) score += 20; + if (fs.existsSync(path.join(projectPath, '.git'))) score += 15; + if (fs.existsSync(path.join(projectPath, '.promptx'))) score += 30; + + // 3. 命名偏好权重 + if (projectPath.includes('PromptX')) score += 50; + + return score; +} +``` + +### 🎯 **方案3: 环境变量强制指定** (短期) + +#### **核心思路**: 要求用户在MCP配置中明确指定工作目录 + +```json +// Claude Desktop 配置修改 +{ + "mcpServers": { + "promptx": { + "command": "npx", + "args": ["dpml-prompt@snapshot", "mcp-server"], + "cwd": "/Users/macmima1234/Desktop/PromptX", + "env": { + "PROMPTX_WORKSPACE": "/Users/macmima1234/Desktop/PromptX" // 强制指定 + } + } + } +} +``` + +#### **预期效果**: +- ✅ 立即解决问题 +- ✅ 用户控制精确 +- ❌ 需要用户手动配置 +- ❌ 用户体验不友好 + +### 🎯 **方案4: AI提供路径参数** (长期) + +#### **核心思路**: 修改MCP工具接口,要求AI主动提供工作目录 + +```javascript +// 工具接口修改 +{ + name: 'promptx_remember', + inputSchema: { + type: 'object', + properties: { + content: { type: 'string', description: '要保存的记忆内容' }, + workingDirectory: { + type: 'string', + description: '当前项目工作目录', + required: true // 设为必需参数 + } + }, + required: ['content', 'workingDirectory'] + } +} +``` + +--- + +## 📊 **修复优先级建议** + +### 🚨 **立即修复** (1-2天) +1. **方案3**: 更新文档,指导用户配置`PROMPTX_WORKSPACE`环境变量 +2. **临时方案**: 在工具返回中增加路径验证和警告信息 + +### ⚡ **短期修复** (1周内) +1. **方案1**: 优化策略优先级,提升环境变量和智能判断的权重 +2. **增强日志**: 详细记录路径选择过程,便于用户调试 + +### 🔧 **中期优化** (1个月内) +1. **方案2**: 实现智能项目匹配算法 +2. **完善测试**: 添加多项目环境的自动化测试覆盖 + +### 🌟 **长期重构** (3个月内) +1. **方案4**: 重新设计MCP接口设计,增强路径管理 +2. **架构升级**: 统一路径解析服务,消除同步/异步不一致问题 + +--- + +## 🧪 **测试策略** + +### 📋 **回归测试清单** +- [ ] 单项目环境下MCP记忆功能正常 +- [ ] 多项目环境下路径选择正确 +- [ ] 环境变量配置优先级正确 +- [ ] CLI模式不受影响 +- [ ] 不同操作系统下表现一致 + +### 🎯 **自动化测试方案** +```javascript +// 测试用例设计 +describe('MCP多项目环境路径识别', () => { + test('应该选择正确的项目目录', async () => { + // 创建多项目环境 + // 配置环境变量 + // 调用记忆功能 + // 验证保存位置 + }); + + test('环境变量应该有最高优先级', async () => { + // 设置PROMPTX_WORKSPACE + // 验证路径选择 + }); + + test('应该提供清晰的错误信息', async () => { + // 模拟路径歧义场景 + // 验证错误提示 + }); +}); +``` + +--- + +## 📚 **相关文档和代码** + +### 🔗 **关键文件** +- `src/lib/utils/executionContext.js` - 主要问题文件 +- `src/lib/commands/MCPServerCommand.js` - MCP服务器入口 +- `src/lib/core/pouch/commands/RememberCommand.js` - 记忆保存逻辑 +- `docs/mcp-integration-guide.md` - MCP集成指南 + +### 🏷️ **相关Issue和PR** +- 本次发现: PromptX记忆系统升级与角色发现Bug修复过程 +- 相关组件: PackageDiscovery跨项目使用问题修复 + +### 📖 **参考资料** +- [Model Context Protocol 规范](https://modelcontextprotocol.io/) +- [Claude Desktop MCP配置指南](https://claude.ai/docs) +- [Node.js 路径解析最佳实践](https://nodejs.org/api/path.html) + +--- + +## 🎯 **结论与建议** + +### 🚨 **严重性评估** +此Bug属于**高危级别**,直接影响用户数据完整性和系统可信度,需要**立即修复**。 + +### 💡 **修复建议** +1. **立即**: 通过文档指导用户配置环境变量解决 +2. **短期**: 实施方案1优化策略优先级 +3. **中期**: 开发智能项目匹配算法 +4. **长期**: 重构MCP接口设计 + +### 🎖️ **经验总结** +1. **多环境兼容性**: 路径解析需要考虑复杂的多项目环境 +2. **用户体验**: 系统应该智能处理路径歧义,减少用户配置负担 +3. **测试覆盖**: 需要增加多项目环境的测试用例 +4. **文档完善**: MCP配置指南需要更详细的环境变量说明 + +--- + +**报告生成时间**: 2025-06-25 +**报告版本**: v1.0 +**下次更新**: 修复实施后 +**状态**: 🔴 待修复 + +--- + +## 📞 **联系信息** + +如有问题或需要进一步信息,请联系: +- **技术负责人**: AI Memory Specialist +- **项目仓库**: PromptX GitHub Repository +- **优先级**: 高危 - 立即处理 \ No newline at end of file diff --git a/PR-记忆系统升级与角色发现Bug修复.md b/PR-记忆系统升级与角色发现Bug修复.md new file mode 100644 index 0000000..3e53efb --- /dev/null +++ b/PR-记忆系统升级与角色发现Bug修复.md @@ -0,0 +1,668 @@ +# 🚀 feat: 记忆系统架构升级 + declarative.dpml命名重构 + MCP边界条件Bug修复 + +## 📊 **变更概览** +- **5个文件修改**:+625行,-88行 (declarative.dpml升级 +28行) +- **5个新增文件**:思维模式、测试、文档 +- **4个主要功能模块**:记忆系统升级 + 文件命名重构 + 角色发现修复 + MCP边界条件修复 +- **🎯 升级验证**:MCP重启测试 100% 通过 + +--- + +## 🧠 **记忆系统重大升级** + +### ✨ **核心特性** +- **XML格式存储**:从Markdown单文件升级到结构化XML存储 +- **🎯 declarative.dpml命名**:memory.xml → declarative.dpml 架构级语义升级 +- **内容缩进美化**:新增`formatContentWithIndent()`方法,提升XML可读性 +- **Legacy数据迁移**:自动检测并迁移旧版Markdown格式记忆 +- **增强日志系统**:完整的操作日志追踪和错误处理 +- **XML安全处理**:自动转义特殊字符,确保数据完整性 +- **🆕 边界条件修复**:解决空XML文件导致的写入失败问题 +- **🚀 MCP重启验证**:升级后功能100%正常,零中断平滑切换 + +### 📂 **文件变更** +- `RememberCommand.js` (+416行): XML存储、迁移、格式化、边界条件修复 +- `RecallCommand.js` (+224行): XML读取、搜索、错误处理优化 + +### 🆕 **新增功能** +```javascript +// XML内容缩进格式化 +formatContentWithIndent(content, indentLevel = 3) + +// XML转义安全处理 +escapeXML(text) / unescapeXML(text) + +// Legacy数据自动迁移 +migrateLegacyMemoriesIfNeeded() + +// XML记忆解析 +parseXMLMemories() / readXMLMemories() +``` + +### 📋 **XML格式示例** + +#### **升级前(Markdown格式)** +```markdown +# 陈述性记忆 + +- 2025/01/15 14:30 CRMEB项目前端门店功能架构总结 --tags CRMEB 前端架构 #流程管理 +``` + +#### **升级后(declarative.dpml格式)** +```xml + + + + + + 🔧 XML转义字符全面测试 + + **测试字符集**: + - 尖括号: <script>alert('test')</script> + - 双引号: "重要信息"和"配置参数" + - 与符号: A & B 和 C&D 组合 + + #工具使用 + + +``` + +#### **🎯 命名语义升级价值** +- **认知科学精准性**:`declarative` 明确表达陈述性记忆 +- **DPML生态统一**:`.dpml` 扩展名与PromptX协议体系一致 +- **未来扩展铺路**:为 `procedural.dpml`、`episodic.dpml` 奠定基础 +- **专业表达提升**:体现基于认知心理学的系统设计 + +--- + +## 🎯 **declarative.dpml架构升级实施与验证** + +### 🚀 **升级背景与动机** + +#### **语义命名问题** +``` +升级前:memory.xml +问题分析: +├── 语义模糊:memory 过于通用,无法区分记忆类型 +├── 扩展困难:未来增加其他记忆类型时命名冲突 +└── 理论缺失:缺乏认知科学的理论基础表达 +``` + +#### **升级目标确立** +``` +升级后:declarative.dpml +价值体现: +├── 🧠 认知科学精准:明确表达陈述性记忆 +├── 🏗️ 架构生态统一:与PromptX DPML协议完美契合 +├── 🔮 未来扩展铺路:为procedural.dpml等分类奠定基础 +└── 🎯 专业化表达:体现基于心理学理论的系统设计 +``` + +### 🔧 **实施方案与代码变更** + +#### **核心文件修改清单** +```javascript +// RememberCommand.js (4处修改) +- const xmlFile = path.join(memoryDir, 'memory.xml') ++ const xmlFile = path.join(memoryDir, 'declarative.dpml') + +- const filesToBackup = ['memory.xml', 'declarative.md', ...] ++ const filesToBackup = ['declarative.dpml', 'declarative.md', ...] + +// RecallCommand.js (2处修改) +- const xmlFile = path.join(memoryDir, 'memory.xml') ++ const xmlFile = path.join(memoryDir, 'declarative.dpml') + +// 测试文件重命名 +memory-xml-integration.test.js → memory-dpml-integration.test.js +``` + +#### **架构升级策略** +- **直接切换**:所有新记忆使用 `declarative.dpml` +- **历史保留**:`memory.xml` 作为历史数据保留 +- **零感知升级**:用户操作流程完全不变 +- **MCP重启生效**:代码修改后需重启MCP工具生效 + +### 🧪 **升级测试验证结果** + +#### **测试1: MCP重启后文件创建验证** +```bash +测试时间:2025-06-26 MCP重启后 +测试命令:remember "🎉 MCP重启后declarative.dpml升级测试" + +✅ 预期结果:创建declarative.dpml文件 +✅ 实际结果: + 存储路径: declarative.dpml ← 🎯 升级成功! + 文件状态: 创建成功,1.1KB,28行 +``` + +#### **测试2: 文件系统状态验证** +```bash +.promptx/memory/ 目录内容: +├── declarative.dpml (1.7KB, 47行) ← 🆕 新记忆存储 +└── memory.xml (17KB, 426行) ← 📜 历史数据保留 + +状态分析: +✅ 新记忆全部存储到declarative.dpml +✅ 历史数据完整保留在memory.xml +✅ 双文件并存策略完美执行 +``` + +#### **测试3: XML转义字符处理验证** +```xml +测试内容: & "引号" 测试 + +存储转义: +-