feat: add team-tech-debt skill for tech debt identification and cleanup

6-role team (coordinator, scanner, assessor, planner, executor, validator)
with 3 pipeline modes (scan, remediate, targeted) and fix-verify loop.
Scanner performs 5-dimension analysis (code, architecture, testing,
dependency, documentation) via CLI fan-out. Follows team-skill-designer
patterns with self-contained role.md and command.md files.
This commit is contained in:
catlog22
2026-02-23 22:46:27 +08:00
parent 1efe2f469e
commit f60dd44d5b
15 changed files with 3451 additions and 0 deletions

View File

@@ -0,0 +1,176 @@
# Command: remediate
> 分批委派 code-developer 执行债务清理。按修复类型分组(重构、死代码移除、依赖更新、文档补充),每批委派给 code-developer。
## When to Use
- Phase 3 of Executor
- 治理方案已加载,修复 actions 已分批
- 需要通过 code-developer 执行代码修改
**Trigger conditions**:
- TDFIX-* 任务进入 Phase 3
- 修复 actions 列表非空
- 目标文件可访问
## Strategy
### Delegation Mode
**Mode**: Sequential Batch Delegation
**Subagent**: `code-developer`
**Batch Strategy**: 按修复类型分组,每组一个委派
### Decision Logic
```javascript
// 分批策略
const batchOrder = ['refactor', 'update-deps', 'add-tests', 'add-docs', 'restructure']
// 按优先级排序批次
function sortBatches(batches) {
const sorted = {}
for (const type of batchOrder) {
if (batches[type]) sorted[type] = batches[type]
}
// 追加未知类型
for (const [type, actions] of Object.entries(batches)) {
if (!sorted[type]) sorted[type] = actions
}
return sorted
}
```
## Execution Steps
### Step 1: Context Preparation
```javascript
// 按类型分组并排序
const sortedBatches = sortBatches(batches)
// 每批最大 items 数
const MAX_ITEMS_PER_BATCH = 10
// 如果单批过大,进一步拆分
function splitLargeBatches(batches) {
const result = {}
for (const [type, actions] of Object.entries(batches)) {
if (actions.length <= MAX_ITEMS_PER_BATCH) {
result[type] = actions
} else {
for (let i = 0; i < actions.length; i += MAX_ITEMS_PER_BATCH) {
const chunk = actions.slice(i, i + MAX_ITEMS_PER_BATCH)
result[`${type}-${Math.floor(i / MAX_ITEMS_PER_BATCH) + 1}`] = chunk
}
}
}
return result
}
const finalBatches = splitLargeBatches(sortedBatches)
```
### Step 2: Execute Strategy
```javascript
for (const [batchName, actions] of Object.entries(finalBatches)) {
// 构建修复上下文
const batchType = batchName.replace(/-\d+$/, '')
const fileList = actions.map(a => a.file).filter(Boolean)
// 根据类型选择修复提示
const typePrompts = {
'refactor': `Refactor the following code to reduce complexity and improve readability. Preserve all existing behavior.`,
'update-deps': `Update the specified dependencies. Check for breaking changes in changelogs.`,
'add-tests': `Add missing test coverage for the specified modules. Follow existing test patterns.`,
'add-docs': `Add documentation (JSDoc/docstrings) for the specified public APIs. Follow existing doc style.`,
'restructure': `Restructure module boundaries to reduce coupling. Move code to appropriate locations.`
}
const prompt = typePrompts[batchType] || 'Apply the specified fix to resolve technical debt.'
// 委派给 code-developer
Task({
subagent_type: "code-developer",
run_in_background: false,
description: `Tech debt cleanup: ${batchName} (${actions.length} items)`,
prompt: `## Goal
${prompt}
## Items to Fix
${actions.map(a => `### ${a.debt_id}: ${a.action}
- File: ${a.file || 'N/A'}
- Type: ${a.type}
${a.steps ? '- Steps:\n' + a.steps.map(s => ` 1. ${s}`).join('\n') : ''}`).join('\n\n')}
## Constraints
- Read each file BEFORE modifying
- Make minimal changes - fix only the specified debt item
- Preserve backward compatibility
- Do NOT skip tests or add @ts-ignore
- Do NOT introduce new dependencies unless explicitly required
- Run syntax check after modifications
## Files to Read First
${fileList.map(f => `- ${f}`).join('\n')}`
})
// 验证批次结果
const batchResult = {
batch: batchName,
items: actions.length,
status: 'completed'
}
// 检查文件是否被修改
for (const file of fileList) {
const modified = Bash(`git diff --name-only -- "${file}" 2>/dev/null`).trim()
if (modified) {
fixResults.files_modified.push(file)
}
}
}
```
### Step 3: Result Processing
```javascript
// 统计修复结果
const totalActions = Object.values(finalBatches).flat().length
fixResults.items_fixed = fixResults.files_modified.length
fixResults.items_failed = totalActions - fixResults.items_fixed
fixResults.items_remaining = fixResults.items_failed
// 生成修复摘要
const batchSummaries = Object.entries(finalBatches).map(([name, actions]) =>
`- ${name}: ${actions.length} items`
).join('\n')
```
## Output Format
```
## Remediation Results
### Batches Executed: [count]
### Items Fixed: [count]/[total]
### Files Modified: [count]
### Batch Details
- [batch-name]: [count] items - [status]
### Modified Files
- [file-path]
```
## Error Handling
| Scenario | Resolution |
|----------|------------|
| code-developer fails on a batch | Retry once, mark failed items |
| File locked or read-only | Skip file, log error |
| Syntax error after fix | Revert with git checkout, mark as failed |
| New import/dependency needed | Add minimally, document in fix log |
| Batch too large (>10 items) | Auto-split into sub-batches |
| Agent timeout | Use partial results, continue next batch |