Files
sanguo_moziplus_v3/.claude/workflows/helpers/consistency-checker.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

377 lines
9.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 一致性检查模块
*
* 实现需求-设计-编码三向一致性检查逻辑
*/
/**
* 需求→设计一致性检查
*
* @param {Object} requirements - 需求列表
* @param {Object} design - 设计文档
* @returns {Object} 检查结果
*/
export function checkRequirementDesign(requirements, design) {
const items = []
let allPassed = true
// 如果 requirements 是数组,转换为对象
const reqMap = Array.isArray(requirements)
? requirements.reduce((acc, r, i) => {
acc[`R${i + 1}`] = r
return acc
}, {})
: requirements
// 遍历每个需求,检查设计是否覆盖
for (const [reqId, requirement] of Object.entries(reqMap)) {
const reqText = typeof requirement === 'string' ? requirement : requirement.description || requirement.text || JSON.stringify(requirement)
const isCovered = checkDesignCoverage(reqText, design)
items.push({
check: `需求 ${reqId}`,
expected: reqText,
actual: isCovered ? '已覆盖' : '未覆盖',
passed: isCovered
})
if (!isCovered) {
allPassed = false
}
}
return {
type: 'requirement-design',
passed: allPassed,
items,
summary: allPassed ? '需求完全被设计覆盖' : '部分需求未被设计覆盖'
}
}
/**
* 设计→编码一致性检查
*
* @param {Object} design - 设计文档
* @param {Object} codeChanges - 代码变更
* @returns {Object} 检查结果
*/
export function checkDesignCode(design, codeChanges) {
const items = []
let allPassed = true
// 提取设计中的关键组件/模块
const designComponents = extractDesignComponents(design)
// 提取代码变更中的文件/模块
const codeFiles = extractCodeFiles(codeChanges)
// 检查每个设计组件是否都有对应代码
for (const component of designComponents) {
const isImplemented = codeFiles.some(file =>
file.name.includes(component.name) ||
file.path.includes(component.path || component.name)
)
items.push({
check: `组件: ${component.name}`,
expected: `设计: ${component.description || component.type || '组件'}`,
actual: isImplemented ? `已实现: ${component.name}` : '未实现',
passed: isImplemented
})
if (!isImplemented) {
allPassed = false
}
}
return {
type: 'design-code',
passed: allPassed,
items,
summary: allPassed ? '设计完全被编码实现' : '部分设计未在编码中实现'
}
}
/**
* 需求→编码一致性检查
*
* @param {Object} requirements - 需求列表
* @param {Object} codeChanges - 代码变更
* @returns {Object} 检查结果
*/
export function checkRequirementCode(requirements, codeChanges) {
const items = []
let allPassed = true
// 如果 requirements 是数组,转换为对象
const reqMap = Array.isArray(requirements)
? requirements.reduce((acc, r, i) => {
acc[`R${i + 1}`] = r
return acc
}, {})
: requirements
// 提取代码实现的功能点
const codeFeatures = extractCodeFeatures(codeChanges)
// 检查每个需求是否在代码中实现
for (const [reqId, requirement] of Object.entries(reqMap)) {
const reqText = typeof requirement === 'string' ? requirement : requirement.description || requirement.text || JSON.stringify(requirement)
const isImplemented = checkCodeImplementation(reqText, codeFeatures)
items.push({
check: `需求 ${reqId}`,
expected: reqText,
actual: isImplemented ? '已实现' : '未实现',
passed: isImplemented
})
if (!isImplemented) {
allPassed = false
}
}
return {
type: 'requirement-code',
passed: allPassed,
items,
summary: allPassed ? '需求完全在编码中实现' : '部分需求未在编码中实现'
}
}
/**
* 完整的三向一致性检查
*
* @param {Object} requirements - 需求列表
* @param {Object} design - 设计文档
* @param {Object} codeChanges - 代码变更
* @returns {Object} 完整检查结果
*/
export function runThreeWayCheck(requirements, design, codeChanges) {
const requirementDesign = checkRequirementDesign(requirements, design)
const designCode = checkDesignCode(design, codeChanges)
const requirementCode = checkRequirementCode(requirements, codeChanges)
const allPassed = requirementDesign.passed && designCode.passed && requirementCode.passed
return {
allPassed,
requirementDesign,
designCode,
requirementCode,
summary: allPassed ? '三向一致性检查全部通过' : '三向一致性检查未通过',
deviations: findDeviations(requirementDesign, designCode, requirementCode)
}
}
/**
* 查找偏差
*/
function findDeviations(requirementDesign, designCode, requirementCode) {
const deviations = []
// 需求→设计偏差
if (!requirementDesign.passed) {
deviations.push({
type: 'requirement-design',
issues: requirementDesign.items.filter(i => !i.passed)
})
}
// 设计→编码偏差
if (!designCode.passed) {
deviations.push({
type: 'design-code',
issues: designCode.items.filter(i => !i.passed)
})
}
// 需求→编码偏差
if (!requirementCode.passed) {
deviations.push({
type: 'requirement-code',
issues: requirementCode.items.filter(i => !i.passed)
})
}
return deviations
}
/**
* 辅助函数:检查设计是否覆盖需求
*/
function checkDesignCoverage(requirementText, design) {
const designText = typeof design === 'string' ? design : JSON.stringify(design)
const reqKeywords = extractKeywords(requirementText)
// 至少有一个关键词在设计中被提及
return reqKeywords.some(keyword =>
designText.toLowerCase().includes(keyword.toLowerCase())
)
}
/**
* 辅助函数:检查代码是否实现需求
*/
function checkCodeImplementation(requirementText, codeFeatures) {
const reqKeywords = extractKeywords(requirementText)
// 至少有一个关键词在代码特性中被实现
return reqKeywords.some(keyword =>
codeFeatures.some(feature =>
feature.toLowerCase().includes(keyword.toLowerCase())
)
)
}
/**
* 辅助函数:提取关键词
*/
function extractKeywords(text) {
// 简单的关键词提取:过滤常见停用词
const stopWords = new Set(['的', '了', '是', '在', '和', '与', '或', '但', '如果', '那么', '这样', '那样', 'the', 'a', 'an', 'is', 'are', 'and', 'or', 'but', 'if', 'then', 'this', 'that'])
return text
.toLowerCase()
.split(/[\s,,。.!?;:]/)
.filter(word => word.length > 1 && !stopWords.has(word))
.slice(0, 5) // 取前5个关键词
}
/**
* 辅助函数:从设计中提取组件
*/
function extractDesignComponents(design) {
const components = []
// 如果 design 是字符串,尝试解析
if (typeof design === 'string') {
// 简单的提取逻辑:查找常见的组件模式
const patterns = [
/表:\s*(\w+)/g,
/接口:\s*(\w+)/g,
/模块:\s*(\w+)/g,
/组件:\s*(\w+)/g,
/文件:\s*([^\s]+)/g
]
for (const pattern of patterns) {
let match
while ((match = pattern.exec(design)) !== null) {
components.push({
name: match[1],
type: 'unknown',
description: match[0]
})
}
}
} else if (typeof design === 'object' && design !== null) {
// 如果 design 是对象,直接提取
for (const [key, value] of Object.entries(design)) {
if (value && typeof value === 'object' && value.name) {
components.push(value)
} else if (typeof value === 'string') {
components.push({
name: key,
type: 'unknown',
description: value
})
}
}
}
return components
}
/**
* 辅助函数:从代码变更中提取文件
*/
function extractCodeFiles(codeChanges) {
const files = []
if (typeof codeChanges === 'string') {
// 简单的文件路径提取
const lines = codeChanges.split('\n')
for (const line of lines) {
const match = line.match(/([a-zA-Z0-9_\/]+\.[a-zA-Z0-9]+)/)
if (match) {
files.push({
name: match[1].split('/').pop(),
path: match[1]
})
}
}
} else if (Array.isArray(codeChanges)) {
// 如果是数组,假设每个元素都是文件信息
for (const change of codeChanges) {
if (typeof change === 'string') {
files.push({
name: change.split('/').pop(),
path: change
})
} else if (change.file || change.path || change.name) {
files.push({
name: change.file || change.name || change.path?.split('/').pop(),
path: change.path || change.file
})
}
}
} else if (typeof codeChanges === 'object' && codeChanges !== null) {
// 如果是对象,提取文件信息
if (codeChanges.files) {
return extractCodeFiles(codeChanges.files)
}
if (codeChanges.changes) {
return extractCodeFiles(codeChanges.changes)
}
}
return files
}
/**
* 辅助函数:从代码中提取功能点
*/
function extractCodeFeatures(codeChanges) {
const features = []
// 提取函数名、类名、变量名等作为功能特征
const files = extractCodeFiles(codeChanges)
for (const file of files) {
const name = file.name || file.path || ''
// 从文件名推断功能
if (name.includes('.')) {
const baseName = name.substring(0, name.lastIndexOf('.'))
features.push(baseName)
}
features.push(name)
}
// 如果 codeChanges 包含 description 或 summary
if (typeof codeChanges === 'object' && codeChanges !== null) {
if (codeChanges.description) {
features.push(codeChanges.description)
}
if (codeChanges.summary) {
features.push(codeChanges.summary)
}
if (codeChanges.changes) {
features.push(codeChanges.changes)
}
}
return features
}
/**
* 导出所有检查函数
*/
export default {
checkRequirementDesign,
checkDesignCode,
checkRequirementCode,
runThreeWayCheck,
findDeviations
}