b9327f3dea
## 第一阶段:核心 Gitea MCP 集成 - 新增 gitea-mcp-adapter.js 封装 Gitea MCP 工具调用 - 更新 gitea-orchestration.js 使用真实 MCP 调用 - 实现 Issue/PR/分支操作的完整适配层 - 添加错误处理和重试机制 ## 第二阶段:Comment 标记约定 - 新增 comment-markers.js 生成标准完成标记 - 新增 comment-parser.js 解析 Sub Agent 完成标记 - 实现轮询机制 waitForSubAgentCompletion - 支持 EXECUTE_DONE、REVIEW_DONE、TEST_DONE、VERIFICATION_PASSED 标记 ## 第三阶段:三向一致性检查 - 新增 consistency-checker.js 实现三向比对逻辑 - 新增 requirement-tracker.js 追踪需求映射 - 实现需求→设计、设计→编码、需求→编码检查 - 支持偏差检测和报告生成 ## 第四阶段:Linus 三问决策框架 - 新增 linus-triad.js 实现工程审慎决策 - 三问:现实问题、需要解决、方案可行 - 支持拒绝响应生成 - 集成 Agent 分析和关键词回退 ## 第五阶段:Superpowers 工作流集成 - 新增 superpowers-integration.js 封装五技能调用 - 新增 CLAUDE.md Main Agent 配置 - 实现 writing-plans、executing-plans、requesting-code-review、systematic-debugging、finishing-a-development-branch 总计:8 个新文件,1 个修改文件,约 2,982 行代码
303 lines
7.7 KiB
JavaScript
303 lines
7.7 KiB
JavaScript
/**
|
|
* 需求追踪模块
|
|
*
|
|
* 追踪需求到设计和编码的映射,生成一致性检查报告
|
|
*/
|
|
|
|
/**
|
|
* 需求追踪器类
|
|
*/
|
|
export class RequirementTracker {
|
|
constructor() {
|
|
this.requirements = new Map() // id -> requirement
|
|
this.designMapping = new Map() // requirementId -> designItems
|
|
this.codeMapping = new Map() // requirementId -> codeItems
|
|
}
|
|
|
|
/**
|
|
* 添加需求
|
|
*/
|
|
addRequirement(id, requirement) {
|
|
this.requirements.set(id, {
|
|
id,
|
|
description: typeof requirement === 'string' ? requirement : requirement.description || requirement.text || JSON.stringify(requirement),
|
|
status: 'pending',
|
|
...requirement
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 添加设计映射
|
|
*/
|
|
addDesignMapping(requirementId, designItems) {
|
|
this.designMapping.set(requirementId, Array.isArray(designItems) ? designItems : [designItems])
|
|
|
|
// 更新需求状态
|
|
const req = this.requirements.get(requirementId)
|
|
if (req) {
|
|
req.status = 'designed'
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 添加编码映射
|
|
*/
|
|
addCodeMapping(requirementId, codeItems) {
|
|
this.codeMapping.set(requirementId, Array.isArray(codeItems) ? codeItems : [codeItems])
|
|
|
|
// 更新需求状态
|
|
const req = this.requirements.get(requirementId)
|
|
if (req) {
|
|
req.status = 'implemented'
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取需求
|
|
*/
|
|
getRequirement(id) {
|
|
return this.requirements.get(id)
|
|
}
|
|
|
|
/**
|
|
* 获取所有需求
|
|
*/
|
|
getAllRequirements() {
|
|
return Array.from(this.requirements.values())
|
|
}
|
|
|
|
/**
|
|
* 获取需求的设计映射
|
|
*/
|
|
getDesignMapping(requirementId) {
|
|
return this.designMapping.get(requirementId) || []
|
|
}
|
|
|
|
/**
|
|
* 获取需求的编码映射
|
|
*/
|
|
getCodeMapping(requirementId) {
|
|
return this.codeMapping.get(requirementId) || []
|
|
}
|
|
|
|
/**
|
|
* 检查需求的完整性
|
|
*/
|
|
checkCompleteness(requirementId) {
|
|
const req = this.getRequirement(requirementId)
|
|
if (!req) {
|
|
return { complete: false, reason: '需求不存在' }
|
|
}
|
|
|
|
const hasDesign = this.designMapping.has(requirementId)
|
|
const hasCode = this.codeMapping.has(requirementId)
|
|
|
|
if (!hasDesign) {
|
|
return { complete: false, reason: '缺少设计映射' }
|
|
}
|
|
|
|
if (!hasCode) {
|
|
return { complete: false, reason: '缺少编码映射' }
|
|
}
|
|
|
|
return { complete: true }
|
|
}
|
|
|
|
/**
|
|
* 生成追踪报告
|
|
*/
|
|
generateReport() {
|
|
const requirements = this.getAllRequirements()
|
|
const report = {
|
|
total: requirements.length,
|
|
pending: 0,
|
|
designed: 0,
|
|
implemented: 0,
|
|
items: []
|
|
}
|
|
|
|
for (const req of requirements) {
|
|
const completeness = this.checkCompleteness(req.id)
|
|
const designItems = this.getDesignMapping(req.id)
|
|
const codeItems = this.getCodeMapping(req.id)
|
|
|
|
if (req.status === 'pending') {
|
|
report.pending++
|
|
} else if (req.status === 'designed') {
|
|
report.designed++
|
|
} else if (req.status === 'implemented') {
|
|
report.implemented++
|
|
}
|
|
|
|
report.items.push({
|
|
id: req.id,
|
|
description: req.description,
|
|
status: req.status,
|
|
complete: completeness.complete,
|
|
designCount: designItems.length,
|
|
codeCount: codeItems.length,
|
|
designItems,
|
|
codeItems
|
|
})
|
|
}
|
|
|
|
return report
|
|
}
|
|
|
|
/**
|
|
* 导出为 Markdown 格式
|
|
*/
|
|
toMarkdown() {
|
|
const report = this.generateReport()
|
|
let md = '# 需求追踪报告\n\n'
|
|
md += `## 概述\n\n`
|
|
md += `- 总需求数: ${report.total}\n`
|
|
md += `- 待处理: ${report.pending}\n`
|
|
md += `- 已设计: ${report.designed}\n`
|
|
md += `- 已实现: ${report.implemented}\n\n`
|
|
|
|
md += `## 详细追踪\n\n`
|
|
|
|
for (const item of report.items) {
|
|
md += `### ${item.id}: ${item.description}\n\n`
|
|
md += `- **状态**: ${item.status}\n`
|
|
md += `- **完整**: ${item.complete ? '✅' : '❌'}\n`
|
|
md += `- **设计映射**: ${item.designCount} 项\n`
|
|
md += `- **编码映射**: ${item.codeCount} 项\n\n`
|
|
|
|
if (item.designItems.length > 0) {
|
|
md += `#### 设计映射\n\n`
|
|
for (const design of item.designItems) {
|
|
md += `- ${typeof design === 'string' ? design : JSON.stringify(design)}\n`
|
|
}
|
|
md += `\n`
|
|
}
|
|
|
|
if (item.codeItems.length > 0) {
|
|
md += `#### 编码映射\n\n`
|
|
for (const code of item.codeItems) {
|
|
md += `- ${typeof code === 'string' ? code : JSON.stringify(code)}\n`
|
|
}
|
|
md += `\n`
|
|
}
|
|
}
|
|
|
|
return md
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 创建需求追踪器
|
|
*/
|
|
export function createRequirementTracker() {
|
|
return new RequirementTracker()
|
|
}
|
|
|
|
/**
|
|
* 从一致性检查结果生成追踪数据
|
|
*
|
|
* @param {Object} checkResult - 一致性检查结果
|
|
* @returns {Object} 追踪数据
|
|
*/
|
|
export function extractTrackingData(checkResult) {
|
|
const tracker = new RequirementTracker()
|
|
|
|
// 从需求→设计检查中提取需求
|
|
if (checkResult.requirementDesign) {
|
|
for (const item of checkResult.requirementDesign.items) {
|
|
const id = item.check.replace('需求 ', '')
|
|
tracker.addRequirement(id, item.expected)
|
|
if (item.passed) {
|
|
tracker.addDesignMapping(id, [item.actual])
|
|
}
|
|
}
|
|
}
|
|
|
|
// 从需求→编码检查中提取编码映射
|
|
if (checkResult.requirementCode) {
|
|
for (const item of checkResult.requirementCode.items) {
|
|
const id = item.check.replace('需求 ', '')
|
|
if (item.passed) {
|
|
tracker.addCodeMapping(id, [item.actual])
|
|
}
|
|
}
|
|
}
|
|
|
|
return tracker.generateReport()
|
|
}
|
|
|
|
/**
|
|
* 生成一致性检查报告
|
|
*
|
|
* @param {Object} checkResult - 一致性检查结果
|
|
* @returns {string} Markdown 报告
|
|
*/
|
|
export function generateConsistencyReport(checkResult) {
|
|
let md = '# 三向一致性检查报告\n\n'
|
|
|
|
// 概述
|
|
md += `## 概述\n\n`
|
|
md += `- **总体结果**: ${checkResult.allPassed ? '✅ 通过' : '❌ 未通过'}\n`
|
|
md += `- **需求→设计**: ${checkResult.requirementDesign.passed ? '✅ 通过' : '❌ 未通过'}\n`
|
|
md += `- **设计→编码**: ${checkResult.designCode.passed ? '✅ 通过' : '❌ 未通过'}\n`
|
|
md += `- **需求→编码**: ${checkResult.requirementCode.passed ? '✅ 通过' : '❌ 未通过'}\n\n`
|
|
|
|
// 需求→设计详细结果
|
|
md += `## 1️⃣ 需求 → 设计\n\n`
|
|
md += generateCheckTable(checkResult.requirementDesign.items)
|
|
md += `\n${checkResult.requirementDesign.summary}\n\n`
|
|
|
|
// 设计→编码详细结果
|
|
md += `## 2️⃣ 设计 → 编码\n\n`
|
|
md += generateCheckTable(checkResult.designCode.items)
|
|
md += `\n${checkResult.designCode.summary}\n\n`
|
|
|
|
// 需求→编码详细结果
|
|
md += `## 3️⃣ 需求 → 编码\n\n`
|
|
md += generateCheckTable(checkResult.requirementCode.items)
|
|
md += `\n${checkResult.requirementCode.summary}\n\n`
|
|
|
|
// 偏差列表
|
|
if (checkResult.deviations && checkResult.deviations.length > 0) {
|
|
md += `## ⚠️ 发现的偏差\n\n`
|
|
for (const deviation of checkResult.deviations) {
|
|
md += `### ${deviation.type}\n\n`
|
|
for (const issue of deviation.issues) {
|
|
md += `- **${issue.check}**: ${issue.expected} ≠ ${issue.actual}\n`
|
|
}
|
|
md += `\n`
|
|
}
|
|
}
|
|
|
|
return md
|
|
}
|
|
|
|
/**
|
|
* 辅助函数:生成检查表格
|
|
*/
|
|
function generateCheckTable(items) {
|
|
if (!items || items.length === 0) {
|
|
return '无检查项\n'
|
|
}
|
|
|
|
let table = '| 检查项 | 预期 | 实际 | 状态 |\n'
|
|
table += '|--------|------|------|------|\n'
|
|
|
|
for (const item of items) {
|
|
const status = item.passed ? '✅' : '❌'
|
|
table += `| ${item.check} | ${item.expected} | ${item.actual} | ${status} |\n`
|
|
}
|
|
|
|
return table
|
|
}
|
|
|
|
/**
|
|
* 导出默认函数
|
|
*/
|
|
export default {
|
|
RequirementTracker,
|
|
createRequirementTracker,
|
|
extractTrackingData,
|
|
generateConsistencyReport
|
|
}
|