重构:更新前端开发者角色文档,移除冗余的执行策略,新增微信小程序专项开发部分;更新资源注册表,统一时间戳格式,移除不再使用的资源注册逻辑,优化工具定义获取方式,提升代码可读性和维护性。
This commit is contained in:
@ -84,50 +84,7 @@ class DiscoveryManager {
|
||||
}
|
||||
|
||||
/**
|
||||
* 发现资源并直接注册到指定注册表(新的简化方法)
|
||||
* @param {ResourceRegistry} registry - 目标注册表
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async discoverAndDirectRegister(registry) {
|
||||
logger.info(`[DiscoveryManager] 🚀 开始直接注册,发现器数量: ${this.discoveries.length}`)
|
||||
|
||||
// 按优先级顺序直接注册,让高优先级的覆盖低优先级的
|
||||
for (const discovery of this.discoveries) {
|
||||
try {
|
||||
logger.debug(`[DiscoveryManager] 🔍 处理发现器: ${discovery.source} (优先级: ${discovery.priority})`)
|
||||
|
||||
if (typeof discovery.discoverRegistry === 'function') {
|
||||
// 使用新的discoverRegistry方法
|
||||
const discoveredRegistry = await discovery.discoverRegistry()
|
||||
if (discoveredRegistry instanceof Map) {
|
||||
logger.debug(`[DiscoveryManager] ✅ ${discovery.source} 发现 ${discoveredRegistry.size} 个资源`)
|
||||
for (const [resourceId, reference] of discoveredRegistry) {
|
||||
registry.register(resourceId, reference) // 直接注册,自动覆盖
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 向后兼容:使用discover()方法
|
||||
const resources = await discovery.discover()
|
||||
if (Array.isArray(resources)) {
|
||||
logger.debug(`[DiscoveryManager] ✅ ${discovery.source} 发现 ${resources.length} 个资源 (兼容模式)`)
|
||||
resources.forEach(resource => {
|
||||
if (resource.id && resource.reference) {
|
||||
registry.register(resource.id, resource.reference) // 直接注册
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
logger.warn(`[DiscoveryManager] ❌ ${discovery.source} direct registration failed: ${error.message}`)
|
||||
// 单个发现器失败不影响其他发现器
|
||||
}
|
||||
}
|
||||
|
||||
logger.info(`[DiscoveryManager] 🎯 注册完成,注册表总资源数: ${registry.size}`)
|
||||
}
|
||||
|
||||
/**
|
||||
* 发现并合并所有注册表(新架构方法)
|
||||
* 发现并合并所有注册表(RegistryData架构)
|
||||
* @returns {Promise<Map>} 合并后的资源注册表 Map<resourceId, reference>
|
||||
*/
|
||||
async discoverRegistries() {
|
||||
|
||||
@ -201,18 +201,17 @@ class PackageDiscovery extends BaseDiscovery {
|
||||
if (await fs.pathExists(roleFile)) {
|
||||
const reference = `@package://prompt/domain/${item}/${item}.role.md`
|
||||
|
||||
const resourceData = new ResourceData({
|
||||
id: item,
|
||||
source: 'package',
|
||||
protocol: 'role',
|
||||
name: ResourceData._generateDefaultName(item, 'role'),
|
||||
description: ResourceData._generateDefaultDescription(item, 'role'),
|
||||
reference: reference,
|
||||
metadata: {
|
||||
filePath: roleFile,
|
||||
scannedAt: new Date().toISOString()
|
||||
}
|
||||
})
|
||||
const resourceData = new ResourceData({
|
||||
id: item,
|
||||
source: 'package',
|
||||
protocol: 'role',
|
||||
name: ResourceData._generateDefaultName(item, 'role'),
|
||||
description: ResourceData._generateDefaultDescription(item, 'role'),
|
||||
reference: reference,
|
||||
metadata: {
|
||||
scannedAt: new Date().toISOString()
|
||||
}
|
||||
})
|
||||
|
||||
registryData.addResource(resourceData)
|
||||
}
|
||||
@ -232,7 +231,6 @@ class PackageDiscovery extends BaseDiscovery {
|
||||
description: ResourceData._generateDefaultDescription(item, 'thought'),
|
||||
reference: reference,
|
||||
metadata: {
|
||||
filePath: thoughtFile,
|
||||
scannedAt: new Date().toISOString()
|
||||
}
|
||||
})
|
||||
@ -258,7 +256,6 @@ class PackageDiscovery extends BaseDiscovery {
|
||||
description: ResourceData._generateDefaultDescription(execId, 'execution'),
|
||||
reference: reference,
|
||||
metadata: {
|
||||
filePath: path.join(executionDir, execFile),
|
||||
scannedAt: new Date().toISOString()
|
||||
}
|
||||
})
|
||||
@ -304,7 +301,6 @@ class PackageDiscovery extends BaseDiscovery {
|
||||
description: ResourceData._generateDefaultDescription(id, protocol),
|
||||
reference: reference,
|
||||
metadata: {
|
||||
filePath: path.join(itemPath, file),
|
||||
scannedAt: new Date().toISOString()
|
||||
}
|
||||
})
|
||||
@ -328,7 +324,6 @@ class PackageDiscovery extends BaseDiscovery {
|
||||
description: ResourceData._generateDefaultDescription(id, protocol),
|
||||
reference: reference,
|
||||
metadata: {
|
||||
filePath: path.join(coreDir, item),
|
||||
scannedAt: new Date().toISOString()
|
||||
}
|
||||
})
|
||||
@ -557,26 +552,52 @@ class PackageDiscovery extends BaseDiscovery {
|
||||
* @returns {Promise<string|null>} 包根目录路径或null
|
||||
*/
|
||||
async _findDevelopmentRoot() {
|
||||
// 策略1:检查当前工作目录
|
||||
const cwd = process.cwd()
|
||||
const hasPackageJson = await fs.pathExists(path.join(cwd, 'package.json'))
|
||||
const hasPromptDir = await fs.pathExists(path.join(cwd, 'prompt'))
|
||||
|
||||
if (!hasPackageJson || !hasPromptDir) {
|
||||
return null
|
||||
if (await this._isValidDevelopmentRoot(cwd)) {
|
||||
return fs.realpathSync(cwd)
|
||||
}
|
||||
|
||||
try {
|
||||
const packageJson = await fs.readJSON(path.join(cwd, 'package.json'))
|
||||
if (packageJson.name === 'dpml-prompt') {
|
||||
return fs.realpathSync(cwd) // 解析符号链接
|
||||
// 策略2:检查启动脚本的目录(适用于通过脚本启动的情况)
|
||||
const scriptDir = path.dirname(process.argv[1])
|
||||
let searchDir = scriptDir
|
||||
|
||||
// 向上查找最多5级目录
|
||||
for (let i = 0; i < 5; i++) {
|
||||
if (await this._isValidDevelopmentRoot(searchDir)) {
|
||||
return fs.realpathSync(searchDir)
|
||||
}
|
||||
} catch (error) {
|
||||
// Ignore JSON parsing errors
|
||||
|
||||
const parentDir = path.dirname(searchDir)
|
||||
if (parentDir === searchDir) break // 已到根目录
|
||||
searchDir = parentDir
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查目录是否为有效的开发环境根目录
|
||||
* @param {string} dir - 要检查的目录
|
||||
* @returns {Promise<boolean>} 是否为有效的开发根目录
|
||||
* @private
|
||||
*/
|
||||
async _isValidDevelopmentRoot(dir) {
|
||||
const hasPackageJson = await fs.pathExists(path.join(dir, 'package.json'))
|
||||
const hasPromptDir = await fs.pathExists(path.join(dir, 'prompt'))
|
||||
|
||||
if (!hasPackageJson || !hasPromptDir) {
|
||||
return false
|
||||
}
|
||||
|
||||
try {
|
||||
const packageJson = await fs.readJSON(path.join(dir, 'package.json'))
|
||||
return packageJson.name === 'dpml-prompt'
|
||||
} catch (error) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查找已安装包的根目录
|
||||
* @returns {Promise<string|null>} 包根目录路径或null
|
||||
|
||||
@ -374,7 +374,6 @@ class ProjectDiscovery extends BaseDiscovery {
|
||||
description: ResourceData._generateDefaultDescription(item, 'role'),
|
||||
reference: reference,
|
||||
metadata: {
|
||||
filePath: roleFile,
|
||||
scannedAt: new Date().toISOString()
|
||||
}
|
||||
})
|
||||
@ -399,7 +398,6 @@ class ProjectDiscovery extends BaseDiscovery {
|
||||
description: ResourceData._generateDefaultDescription(thoughtId, 'thought'),
|
||||
reference: reference,
|
||||
metadata: {
|
||||
filePath: path.join(thoughtDir, thoughtFile),
|
||||
scannedAt: new Date().toISOString()
|
||||
}
|
||||
})
|
||||
@ -426,7 +424,6 @@ class ProjectDiscovery extends BaseDiscovery {
|
||||
description: ResourceData._generateDefaultDescription(execId, 'execution'),
|
||||
reference: reference,
|
||||
metadata: {
|
||||
filePath: path.join(executionDir, execFile),
|
||||
scannedAt: new Date().toISOString()
|
||||
}
|
||||
})
|
||||
@ -453,7 +450,6 @@ class ProjectDiscovery extends BaseDiscovery {
|
||||
description: ResourceData._generateDefaultDescription(knowledgeId, 'knowledge'),
|
||||
reference: reference,
|
||||
metadata: {
|
||||
filePath: path.join(knowledgeDir, knowledgeFile),
|
||||
scannedAt: new Date().toISOString()
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user