# 角色内容解析不完整问题 ## 🔥 问题等级 **高优先级 (High Priority)** ## 📋 问题描述 当前PromptX的角色解析机制存在重大缺陷:**只解析@引用,完全忽略DPML标签内的直接内容**。这导致许多用户自定义角色的核心能力丢失。 ## 🔍 问题详情 ### 当前解析机制 ActionCommand在`analyzeRoleDependencies`方法中使用以下正则表达式: ```javascript const resourceRegex = /@([!?]?)([a-zA-Z][a-zA-Z0-9_-]*):\/\/([a-zA-Z0-9_\/.,-]+?)(?=[\s\)\],]|$)/g ``` 这个正则**只提取@引用**,完全忽略DPML标签内直接编写的内容。 ### 影响的角色类型 #### 1. 系统角色(使用@引用) ```xml @!thought://remember @!thought://recall @!thought://assistant @!execution://assistant ``` **状态**:✅ 正常解析 #### 2. 用户角色(直接内容) ```xml # 网络杠精思维模式 ## 核心思维特征 - **挑刺思维**:看到任何观点都先找问题和漏洞 - **抬杠本能**:天生反对派,习惯性质疑一切表述 ... # 网络杠精行为原则 ## 核心抬杠准则 - **逢言必反**:对任何观点都要找到反对的角度 ... # 网络杠精专业知识体系 ## 逻辑谬误大全 - **稻草人谬误**:故意曲解对方观点 ... ``` **状态**:❌ **内容完全丢失** ## 🎯 具体影响 ### internet-debater角色损失分析 - **丢失内容**:3个完整的DPML节段,约100行专业内容 - **丢失能力**: - 杠精思维模式和认知特征 - 抬杠行为原则和语言风格 - 逻辑谬误知识和争论技巧 - **用户体验**:激活角色后获得的是"空壳",无法发挥预期作用 ### 潜在影响范围 - 所有直接编写内容的用户自定义角色 - 混合编写方式的角色(@引用 + 直接内容) - 未来可能创建的角色 ## 🔍 根因分析 ### 1. 设计假设错误 系统设计时假设所有角色都使用@引用方式,但实际上: - 用户更倾向于直接编写内容 - 文档没有强制要求使用@引用 - 角色创建工具支持直接编写 ### 2. 验证与解析分离 ```javascript // resourceManager.js - 只验证格式,不解析内容 validateDPMLFormat(content, type) { const tags = DPML_TAGS[type] return content.includes(tags.start) && content.includes(tags.end) } ``` ### 3. 解析逻辑单一 ActionCommand只有一种解析模式:正则匹配@引用,没有考虑直接内容。 ## 💡 解决方案 ### 方案1:混合解析机制(推荐) 扩展ActionCommand解析逻辑,同时支持: 1. **@引用解析**:保持现有逻辑 2. **直接内容解析**:提取DPML标签内的Markdown内容 3. **内容合并**:@引用内容 + 直接内容 = 完整角色能力 ### 方案2:内容提取器 创建专门的DPML内容提取器: ```javascript class DPMLContentExtractor { extractTagContent(content, tagName) { const regex = new RegExp(`<${tagName}>([\\s\\S]*?)`, 'g') // 提取标签内容,同时处理@引用和直接内容 } } ``` ### 方案3:解析策略统一 统一角色解析策略: 1. 优先解析@引用 2. 补充解析直接内容 3. 合并生成完整的角色Profile ## 🔧 技术实现要点 ### 1. 扩展依赖分析 ```javascript // ActionCommand.js async analyzeRoleDependencies(roleInfo) { const roleContent = await fs.readFile(filePath, 'utf-8') // 现有:提取@引用 const references = this.extractReferences(roleContent) // 新增:提取直接内容 const directContent = this.extractDirectContent(roleContent) // 合并依赖 return this.mergeDependencies(references, directContent) } ``` ### 2. 内容提取算法 ```javascript extractDirectContent(content) { const sections = {} const tags = ['personality', 'principle', 'knowledge'] tags.forEach(tag => { const regex = new RegExp(`<${tag}>([\\s\\S]*?)`, 'g') const match = regex.exec(content) if (match && match[1].trim()) { // 过滤掉@引用,只保留直接内容 const directText = this.filterOutReferences(match[1]) if (directText.trim()) { sections[tag] = directText } } }) return sections } ``` ## 📊 影响评估 ### 修复收益 - **功能完整性**:用户自定义角色能力完全恢复 - **用户体验**:角色激活后获得预期的专业能力 - **兼容性**:支持所有编写方式,向下兼容 ### 修复成本 - **开发工作量**:中等(主要在ActionCommand和相关解析逻辑) - **测试工作量**:中等(需要测试各种角色格式) - **风险评估**:低(主要是增强功能,不破坏现有逻辑) ## 🧪 测试用例 ### 测试场景1:纯@引用角色 ```xml @!thought://assistant @!execution://assistant ``` **期望**:正常解析@引用 ### 测试场景2:纯直接内容角色 ```xml # 直接编写的个性内容 # 直接编写的原则内容 ``` **期望**:正确提取直接内容 ### 测试场景3:混合方式角色 ```xml @!thought://base-personality # 补充的个性特征 - 额外特征1 - 额外特征2 ``` **期望**:@引用 + 直接内容都被解析 ## 📅 建议修复时间线 - **阶段1**:问题确认和方案设计(已完成) - **阶段2**:核心解析逻辑实现(1-2天) - **阶段3**:测试用例编写和验证(1天) - **阶段4**:兼容性测试和文档更新(1天) ## 🔗 相关文件 - `src/lib/core/pouch/commands/ActionCommand.js` - 主要修改文件 - `src/lib/core/resource/resourceManager.js` - 可能需要增强DPML处理 - `.promptx/resource/domain/internet-debater/internet-debater.role.md` - 受影响的测试案例 - `src/tests/commands/ActionCommand.*.test.js` - 需要补充的测试 ## ⚠️ 注意事项 1. **保持向下兼容**:现有@引用方式不能受影响 2. **性能考虑**:内容解析不应显著影响角色激活速度 3. **内容去重**:避免@引用和直接内容的重复 4. **错误处理**:DPML格式错误时的优雅降级 --- **报告人**:Claude Code **发现时间**:2025-06-11 **优先级**:High **标签**:bug, role-parsing, user-experience, content-loss