feat: 实现本地角色动态发现机制 - 双重角色发现机制:同时支持npm仓库角色和本地项目角色 - 智能环境检测:自动适配开发、npx、全局、本地、monorepo等部署环境 - 安全机制完善:路径验证、权限检查、多层容错处理 - 向后兼容保证,不影响现有功能

This commit is contained in:
Cen-Yaozu
2025-06-01 21:26:14 +08:00
parent 4a0ad6e61c
commit 05cb5f54c0
48 changed files with 7124 additions and 20 deletions

209
docs/pr-review-response.md Normal file
View File

@ -0,0 +1,209 @@
# PromptX 角色激活改进 PR Review 回复
## 🎉 总体评价
感谢您提交这个非常有价值的PR您准确识别并解决了PromptX系统的一个重要痛点**本地角色发现能力缺失**。这个改进对于实现"AI-First CLI"设计理念具有重要意义,让用户能够在项目中创建和使用自定义角色,真正实现了"锦囊妙计"的本地化扩展。
## ✅ PR亮点
### 1. **问题定位准确**
- 准确识别了静态角色库的局限性
- 理解了本地角色发现的重要性
- 符合PromptX"AI use CLI get prompt for AI"的核心理念
### 2. **技术方案合理**
- 双重发现机制设计思路正确
- 环境检测覆盖面广泛npx、全局、本地、monorepo等
- 安全考虑周全(路径遍历防护、访问控制)
- 容错机制完善(多层降级策略)
### 3. **文档详实**
- 提供了完整的技术架构说明
- 包含了使用指南和最佳实践
- 考虑了性能优化和兼容性
## ⚠️ 需要改进的地方
### 1. **架构集成问题**
当前实现方式绕过了PromptX现有的统一资源管理架构。我们发现
```javascript
// 现有HelloCommand已通过ResourceManager统一管理
const ResourceManager = require('../../resource/resourceManager')
const resourceManager = new ResourceManager()
await resourceManager.initialize()
```
您的`discoverLocalRoles()`直接在HelloCommand中实现文件扫描这可能导致
- 双重管理角色发现逻辑
- 破坏ResourceManager的统一性
- 缓存机制不一致
### 2. **性能考虑**
```javascript
// 每次hello命令都要扫描文件系统
const roleFiles = glob.sync(rolePattern)
```
在大型项目中,频繁的文件系统扫描可能影响性能,建议添加:
- 文件修改时间检测
- 扫描结果缓存
- 增量更新机制
### 3. **代码重复**
PackageProtocol.js已经实现了复杂的环境检测逻辑建议复用而不是重新实现。
## 🔧 建议的重构方案
### 方案A集成到现有架构强烈推荐
1. **将角色发现逻辑移到PackageProtocol**
```javascript
// 在PackageProtocol.js中添加
async discoverDomainRoles() {
const packageRoot = await this.getPackageRoot()
const domainPath = path.join(packageRoot, 'prompt', 'domain')
// 复用现有的环境检测逻辑
const installMode = this.detectInstallMode()
// 扫描角色文件
const rolePattern = path.join(domainPath, '*', '*.role.md')
const roleFiles = glob.sync(rolePattern)
// 缓存结果
return this._cacheDiscoveredRoles(roleFiles)
}
```
2. **在ResourceManager中统一调用**
```javascript
// 在ResourceManager.initialize()中
async initialize() {
// 现有逻辑...
// 动态发现并合并本地角色
await this.discoverAndMergeLocalRoles()
}
async discoverAndMergeLocalRoles() {
const packageProtocol = new PackageProtocol()
const discoveredRoles = await packageProtocol.discoverDomainRoles()
// 合并到registry.protocols.role.registry
this.registry.protocols.role.registry = {
...this.registry.protocols.role.registry,
...discoveredRoles
}
}
```
3. **保持HelloCommand接口不变**
HelloCommand继续通过ResourceManager获取角色无需修改核心逻辑。
### 方案B最小化修改方案
如果不想大幅重构,可以:
1. **只修改资源注册表加载逻辑**
2. **在ResourceManager初始化时自动扫描**
3. **HelloCommand保持完全不变**
## 📋 具体修改建议
### 1. **文件结构调整**
```
建议的实现位置:
├── src/lib/core/resource/protocols/PackageProtocol.js (添加角色发现方法)
├── src/lib/core/resource/resourceManager.js (集成调用逻辑)
└── src/lib/core/pouch/commands/HelloCommand.js (保持不变)
```
### 2. **性能优化建议**
```javascript
// 添加缓存机制
class PackageProtocol {
constructor() {
this.roleDiscoveryCache = new Map()
this.lastScanTime = null
}
async discoverDomainRoles() {
const cacheKey = 'discovered-roles'
// 检查缓存有效性
if (this._isCacheValid(cacheKey)) {
return this.roleDiscoveryCache.get(cacheKey)
}
// 执行扫描
const roles = await this._performRoleDiscovery()
// 更新缓存
this.roleDiscoveryCache.set(cacheKey, roles)
this.lastScanTime = Date.now()
return roles
}
}
```
### 3. **测试覆盖增强**
建议添加以下测试场景:
- 多环境兼容性测试
- 大型项目性能测试
- 边界情况处理测试
- 缓存机制验证测试
## 🎯 下一步行动建议
### 1. **重构实现方式**
-`discoverLocalRoles()`移到PackageProtocol
- 通过ResourceManager统一管理
- 保持HelloCommand接口稳定
### 2. **性能优化**
- 添加扫描结果缓存
- 实现增量更新机制
- 考虑懒加载策略
### 3. **测试完善**
- 编写单元测试覆盖新功能
- 进行多环境集成测试
- 验证与现有功能的兼容性
### 4. **文档更新**
- 更新技术架构文档
- 补充新功能使用指南
- 添加故障排除说明
## 💬 协作建议
我们非常愿意与您协作完善这个功能!建议的协作方式:
1. **架构讨论**:我们可以先就重构方案进行详细讨论
2. **分阶段实现**可以分多个小PR逐步完善
3. **代码review**每个阶段我们都会提供详细的代码review
4. **测试协助**:我们可以协助编写和完善测试用例
## 🏆 结论
这是一个**非常有价值**的PR解决了PromptX系统的重要局限。虽然需要一些架构调整但核心思路和实现都很优秀。我们建议按照上述方案进行重构这样既能实现您的功能目标又能保持系统架构的一致性和稳定性。
期待与您进一步协作共同完善PromptX的角色激活能力
---
**Review by**: PromptX 核心团队
**Date**: 2024年12月
**Priority**: High - 核心功能增强
**Status**: 需要重构,建议接受