mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-13 02:41:50 +08:00
- Introduced a comprehensive template for autonomous actions, detailing structure, execution, and error handling. - Added an orchestrator template to manage state and decision logic for autonomous actions. - Created a sequential phase template to outline execution steps and objectives for structured workflows. - Developed a skill documentation template to standardize the generation of skill entry files. - Implemented a Python script to compare search results between hybrid and cascade methods, analyzing ranking changes.
335 lines
8.6 KiB
Markdown
335 lines
8.6 KiB
Markdown
# Phase 5: Validation & Documentation
|
|
|
|
验证生成的 Skill 完整性并生成使用说明。
|
|
|
|
## Objective
|
|
|
|
- 验证所有必需文件存在
|
|
- 检查文件内容完整性
|
|
- 生成 README.md 使用说明
|
|
- 输出验证报告
|
|
|
|
## Input
|
|
|
|
- 依赖: 所有前序阶段产出
|
|
- 生成的 Skill 目录
|
|
|
|
## Execution Steps
|
|
|
|
### Step 1: 文件完整性检查
|
|
|
|
```javascript
|
|
const config = JSON.parse(Read(`${workDir}/skill-config.json`));
|
|
const skillDir = `.claude/skills/${config.skill_name}`;
|
|
|
|
const requiredFiles = {
|
|
common: [
|
|
'SKILL.md',
|
|
`specs/${config.skill_name}-requirements.md`,
|
|
'specs/quality-standards.md',
|
|
'templates/agent-base.md'
|
|
],
|
|
sequential: config.sequential_config?.phases?.map(p => `phases/${p.id}.md`) || [],
|
|
autonomous: [
|
|
'phases/orchestrator.md',
|
|
'phases/state-schema.md',
|
|
'specs/action-catalog.md',
|
|
...(config.autonomous_config?.actions?.map(a => `phases/actions/${a.id}.md`) || [])
|
|
]
|
|
};
|
|
|
|
const filesToCheck = [
|
|
...requiredFiles.common,
|
|
...(config.execution_mode === 'sequential' ? requiredFiles.sequential : requiredFiles.autonomous)
|
|
];
|
|
|
|
const fileCheckResults = filesToCheck.map(file => {
|
|
const fullPath = `${skillDir}/${file}`;
|
|
try {
|
|
const content = Read(fullPath);
|
|
return {
|
|
file: file,
|
|
exists: true,
|
|
size: content.length,
|
|
hasContent: content.length > 100,
|
|
hasTodo: content.includes('TODO')
|
|
};
|
|
} catch (e) {
|
|
return {
|
|
file: file,
|
|
exists: false,
|
|
size: 0,
|
|
hasContent: false,
|
|
hasTodo: false
|
|
};
|
|
}
|
|
});
|
|
```
|
|
|
|
### Step 2: 内容质量检查
|
|
|
|
```javascript
|
|
const contentChecks = [];
|
|
|
|
// 检查 SKILL.md
|
|
const skillMd = Read(`${skillDir}/SKILL.md`);
|
|
contentChecks.push({
|
|
file: 'SKILL.md',
|
|
checks: [
|
|
{ name: 'Front Matter', pass: skillMd.startsWith('---') },
|
|
{ name: 'Architecture', pass: skillMd.includes('## Architecture') },
|
|
{ name: 'Execution Flow', pass: skillMd.includes('## Execution Flow') },
|
|
{ name: 'References', pass: skillMd.includes('## Reference Documents') }
|
|
]
|
|
});
|
|
|
|
// 检查 Phase 文件
|
|
const phaseFiles = Glob(`${skillDir}/phases/*.md`);
|
|
for (const phaseFile of phaseFiles) {
|
|
if (phaseFile.includes('/actions/')) continue; // 单独检查
|
|
|
|
const content = Read(phaseFile);
|
|
contentChecks.push({
|
|
file: phaseFile.replace(skillDir + '/', ''),
|
|
checks: [
|
|
{ name: 'Objective', pass: content.includes('## Objective') },
|
|
{ name: 'Execution', pass: content.includes('## Execution') || content.includes('## Execution Steps') },
|
|
{ name: 'Output', pass: content.includes('## Output') },
|
|
{ name: 'Code Blocks', pass: content.includes('```') }
|
|
]
|
|
});
|
|
}
|
|
|
|
// 检查 Specs 文件
|
|
const specFiles = Glob(`${skillDir}/specs/*.md`);
|
|
for (const specFile of specFiles) {
|
|
const content = Read(specFile);
|
|
contentChecks.push({
|
|
file: specFile.replace(skillDir + '/', ''),
|
|
checks: [
|
|
{ name: 'Has Content', pass: content.length > 200 },
|
|
{ name: 'Has Structure', pass: content.includes('##') },
|
|
{ name: 'No Empty Sections', pass: !content.match(/##[^#]+\n\n##/) }
|
|
]
|
|
});
|
|
}
|
|
```
|
|
|
|
### Step 3: 生成验证报告
|
|
|
|
```javascript
|
|
const report = {
|
|
skill_name: config.skill_name,
|
|
execution_mode: config.execution_mode,
|
|
generated_at: new Date().toISOString(),
|
|
|
|
file_checks: {
|
|
total: fileCheckResults.length,
|
|
existing: fileCheckResults.filter(f => f.exists).length,
|
|
with_content: fileCheckResults.filter(f => f.hasContent).length,
|
|
with_todos: fileCheckResults.filter(f => f.hasTodo).length,
|
|
details: fileCheckResults
|
|
},
|
|
|
|
content_checks: {
|
|
files_checked: contentChecks.length,
|
|
all_passed: contentChecks.every(c => c.checks.every(ch => ch.pass)),
|
|
details: contentChecks
|
|
},
|
|
|
|
summary: {
|
|
status: calculateOverallStatus(fileCheckResults, contentChecks),
|
|
issues: collectIssues(fileCheckResults, contentChecks),
|
|
recommendations: generateRecommendations(fileCheckResults, contentChecks)
|
|
}
|
|
};
|
|
|
|
Write(`${workDir}/validation-report.json`, JSON.stringify(report, null, 2));
|
|
|
|
function calculateOverallStatus(fileResults, contentResults) {
|
|
const allFilesExist = fileResults.every(f => f.exists);
|
|
const allContentPassed = contentResults.every(c => c.checks.every(ch => ch.pass));
|
|
|
|
if (allFilesExist && allContentPassed) return 'PASS';
|
|
if (allFilesExist) return 'REVIEW';
|
|
return 'FAIL';
|
|
}
|
|
|
|
function collectIssues(fileResults, contentResults) {
|
|
const issues = [];
|
|
|
|
fileResults.filter(f => !f.exists).forEach(f => {
|
|
issues.push({ type: 'ERROR', message: `文件缺失: ${f.file}` });
|
|
});
|
|
|
|
fileResults.filter(f => f.hasTodo).forEach(f => {
|
|
issues.push({ type: 'WARNING', message: `包含 TODO: ${f.file}` });
|
|
});
|
|
|
|
contentResults.forEach(c => {
|
|
c.checks.filter(ch => !ch.pass).forEach(ch => {
|
|
issues.push({ type: 'WARNING', message: `${c.file}: 缺少 ${ch.name}` });
|
|
});
|
|
});
|
|
|
|
return issues;
|
|
}
|
|
|
|
function generateRecommendations(fileResults, contentResults) {
|
|
const recommendations = [];
|
|
|
|
if (fileResults.some(f => f.hasTodo)) {
|
|
recommendations.push('替换所有 TODO 占位符为实际内容');
|
|
}
|
|
|
|
contentResults.forEach(c => {
|
|
if (c.checks.some(ch => !ch.pass)) {
|
|
recommendations.push(`完善 ${c.file} 的结构`);
|
|
}
|
|
});
|
|
|
|
return recommendations;
|
|
}
|
|
```
|
|
|
|
### Step 4: 生成 README.md
|
|
|
|
```javascript
|
|
const readme = `# ${config.display_name}
|
|
|
|
${config.description}
|
|
|
|
## Quick Start
|
|
|
|
### 触发词
|
|
|
|
${config.triggers.map(t => `- "${t}"`).join('\n')}
|
|
|
|
### 执行模式
|
|
|
|
**${config.execution_mode === 'sequential' ? 'Sequential (顺序)' : 'Autonomous (自主)'}**
|
|
|
|
${config.execution_mode === 'sequential' ?
|
|
`阶段按固定顺序执行:\n${config.sequential_config.phases.map((p, i) =>
|
|
`${i + 1}. ${p.name}`
|
|
).join('\n')}` :
|
|
`动作由编排器动态选择:\n${config.autonomous_config.actions.map(a =>
|
|
`- ${a.name}: ${a.description || ''}`
|
|
).join('\n')}`}
|
|
|
|
## Usage
|
|
|
|
\`\`\`
|
|
# 直接触发
|
|
用户: ${config.triggers[0]}
|
|
|
|
# 或使用 Skill 名称
|
|
用户: /skill ${config.skill_name}
|
|
\`\`\`
|
|
|
|
## Output
|
|
|
|
- **格式**: ${config.output.format}
|
|
- **位置**: \`${config.output.location}\`
|
|
- **文件名**: \`${config.output.filename_pattern}\`
|
|
|
|
## Directory Structure
|
|
|
|
\`\`\`
|
|
.claude/skills/${config.skill_name}/
|
|
├── SKILL.md # 入口文件
|
|
├── phases/ # 执行阶段
|
|
${config.execution_mode === 'sequential' ?
|
|
config.sequential_config.phases.map(p => `│ ├── ${p.id}.md`).join('\n') :
|
|
`│ ├── orchestrator.md
|
|
│ ├── state-schema.md
|
|
│ └── actions/
|
|
${config.autonomous_config.actions.map(a => `│ ├── ${a.id}.md`).join('\n')}`}
|
|
├── specs/ # 规范文件
|
|
│ ├── ${config.skill_name}-requirements.md
|
|
│ ├── quality-standards.md
|
|
${config.execution_mode === 'autonomous' ? '│ └── action-catalog.md' : ''}
|
|
└── templates/ # 模板文件
|
|
└── agent-base.md
|
|
\`\`\`
|
|
|
|
## Customization
|
|
|
|
### 修改执行逻辑
|
|
|
|
编辑 \`phases/\` 目录下的阶段文件。
|
|
|
|
### 调整质量标准
|
|
|
|
编辑 \`specs/quality-standards.md\`。
|
|
|
|
### 添加新${config.execution_mode === 'sequential' ? '阶段' : '动作'}
|
|
|
|
${config.execution_mode === 'sequential' ?
|
|
`1. 在 \`phases/\` 创建新的阶段文件 (如 \`03.5-new-step.md\`)
|
|
2. 更新 SKILL.md 的执行流程` :
|
|
`1. 在 \`phases/actions/\` 创建新的动作文件
|
|
2. 更新 \`specs/action-catalog.md\`
|
|
3. 在 \`phases/orchestrator.md\` 添加选择逻辑`}
|
|
|
|
## Related Documents
|
|
|
|
- [设计规范](../_shared/SKILL-DESIGN-SPEC.md)
|
|
- [执行模式规范](specs/../../../skill-generator/specs/execution-modes.md)
|
|
|
|
---
|
|
|
|
*Generated by skill-generator v1.0*
|
|
`;
|
|
|
|
Write(`${skillDir}/README.md`, readme);
|
|
```
|
|
|
|
### Step 5: 输出最终结果
|
|
|
|
```javascript
|
|
const finalResult = {
|
|
skill_name: config.skill_name,
|
|
skill_path: skillDir,
|
|
execution_mode: config.execution_mode,
|
|
|
|
generated_files: [
|
|
'SKILL.md',
|
|
'README.md',
|
|
...filesToCheck
|
|
],
|
|
|
|
validation: report.summary,
|
|
|
|
next_steps: [
|
|
'1. 审阅生成的文件结构',
|
|
'2. 替换 TODO 占位符',
|
|
'3. 根据实际需求调整阶段逻辑',
|
|
'4. 测试 Skill 执行流程',
|
|
'5. 更新触发词和描述'
|
|
]
|
|
};
|
|
|
|
console.log('=== Skill 生成完成 ===');
|
|
console.log(`路径: ${skillDir}`);
|
|
console.log(`模式: ${config.execution_mode}`);
|
|
console.log(`状态: ${report.summary.status}`);
|
|
console.log('');
|
|
console.log('下一步:');
|
|
finalResult.next_steps.forEach(s => console.log(s));
|
|
```
|
|
|
|
## Output
|
|
|
|
- `{workDir}/validation-report.json` - 验证报告
|
|
- `{skillDir}/README.md` - 使用说明
|
|
|
|
## Completion
|
|
|
|
Skill 生成流程完成。用户可以:
|
|
|
|
1. 查看生成的 Skill 目录
|
|
2. 根据验证报告修复问题
|
|
3. 自定义执行逻辑
|
|
4. 测试 Skill 功能
|