Files
sanguo_moziplus_v3/.claude/workflows/helpers/requirement-tracker.js
T
claude_dev b9327f3dea feat(v0.5): 实现完整的五阶段动态编排系统
## 第一阶段:核心 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 行代码
2026-07-01 20:51:13 +08:00

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
}