feat(cli): 添加 --rule 选项支持模板自动发现

重构 ccw cli 模板系统:

- 新增 template-discovery.ts 模块,支持扁平化模板自动发现
- 添加 --rule <template> 选项,自动加载 protocol 和 template
- 模板目录从嵌套结构 (prompts/category/file.txt) 迁移到扁平结构 (prompts/category-function.txt)
- 更新所有 agent/command 文件,使用 $PROTO $TMPL 环境变量替代 $(cat ...) 模式
- 支持模糊匹配:--rule 02-review-architecture 可匹配 analysis-review-architecture.txt

其他更新:
- Dashboard: 添加 Claude Manager 和 Issue Manager 页面
- Codex-lens: 增强 chain_search 和 clustering 模块

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
catlog22
2026-01-17 19:20:24 +08:00
parent 1fae35c05d
commit f14418603a
137 changed files with 13125 additions and 301 deletions

View File

@@ -75,10 +75,13 @@ async function getSessionDetailData(sessionPath: string, dataType: string): Prom
}
}
// Load summaries from .summaries/
// Load summaries from .summaries/ and fallback to plan.json
if (dataType === 'summary' || dataType === 'all') {
const summariesDir = join(normalizedPath, '.summaries');
result.summaries = [];
result.summary = null; // Single summary text from plan.json
// 1. Try to load from .summaries/ directory
if (await fileExists(summariesDir)) {
const files = (await readdir(summariesDir)).filter(f => f.endsWith('.md'));
for (const file of files) {
@@ -90,6 +93,26 @@ async function getSessionDetailData(sessionPath: string, dataType: string): Prom
}
}
}
// 2. Fallback: Try to get summary from plan.json (for lite-fix-plan sessions)
if (result.summaries.length === 0) {
const planFile = join(normalizedPath, 'plan.json');
if (await fileExists(planFile)) {
try {
const planData = JSON.parse(await readFile(planFile, 'utf8'));
// Check plan.summary
if (planData.summary) {
result.summary = planData.summary;
}
// Check synthesis.convergence.summary
if (!result.summary && planData.synthesis?.convergence?.summary) {
result.summary = planData.synthesis.convergence.summary;
}
} catch (e) {
console.warn('Failed to parse plan file for summary:', planFile, (e as Error).message);
}
}
}
}
// Load plan.json (for lite tasks)