import { AGENT_TOOL_NAME } from '../../tools/AgentTool/constants.js'
import { registerBundledSkill } from '../bundledSkills.js'

const SIMPLIFY_PROMPT = `# 简化：代码审查和清理

审查所有更改的文件以查找可重用性、质量和效率问题。修复发现的任何问题。

## 阶段 1：识别更改

运行 \`git diff\`（或如果有暂存的更改，运行 \`git diff HEAD\`）查看更改了什么。如果没有 git 更改，审查用户提到的或您在此对话中 earlier 编辑的最近修改的文件。

## 阶段 2：并行启动三个审查代理

使用 ${AGENT_TOOL_NAME} 工具在单条消息中同时启动所有三个代理。将完整 diff 传递给每个代理，以便它有完整的上下文。

### 代理 1：代码可重用性审查

对于每个更改：

1. **搜索现有工具和辅助函数**，这些可以替代新编写的代码。在代码库的其他地方寻找相似的模式 — 常见位置是工具目录、共享模块和更改文件附近的文件。
2. **标记任何复制现有功能的新函数。** 建议使用现有函数。
3. **标记任何可以使用现有工具的内联逻辑** — 手写的字符串操作、手动路径处理、自定义环境检查、临时类型守卫，以及类似的模式是常见的候选。

### 代理 2：代码质量审查

审查相同更改中的hack模式：

1. **冗余状态**：复制现有状态的状态、可以派生出的缓存值、可以是直接调用的观察者/效果
2. **参数蔓延**：向函数添加新参数而不是泛化或重构现有参数
3. **复制粘贴稍作更改**：应该通过共享抽象统一的近似重复代码块
4. **泄漏的抽象**：暴露应该封装的内部细节，或破坏现有的抽象边界
5. **字符串类型代码**：在使用已有常量、枚举（字符串联合）或品牌类型的代码中使用原始字符串
6. **不必要的 JSX 嵌套**：没有添加布局值的包装 Boxes/元素 — 检查内部组件 props（flexShrink、alignItems 等）是否已经提供所需行为
7. **不必要的注释**：解释代码做什么的注释（良好命名的标识符已经做到）、叙述更改或引用任务/调用者 — 删除；只保留不明显的 WHY（隐藏约束、微妙的invariants、变通方法）

### 代理 3：效率审查

审查相同更改中的效率问题：

1. **不必要的工作**：冗余计算、重复文件读取、重复网络/API 调用、N+1 模式
2. **错失的并发**：可以并行运行但顺序运行的独立操作
3. **热路径膨胀**：添加到启动或每个请求/渲染热路径的新阻塞工作
4. **重复的无操作更新**：轮询循环、间隔或无条件触发的事件处理器中的状态/存储更新 — 添加变更检测守护，以便下游消费者在未发生变更时不会被通知。此外：如果包装函数接受 updater/reducer 回调，验证它是否遵守相同引用返回（或者任何"无变化"信号是什么）— 否则调用者的提前返回无操作会被静默击败
5. **不必要的存在检查**：在操作前预检查文件/资源存在（TOCTOU 反模式）— 直接操作并处理错误
6. **内存**：无界数据结构、缺失清理、事件监听器泄漏
7. **范围过大的操作**：只需要一部分时读取整个文件，加载所有项目但只过滤一个

## 阶段 3：修复问题

等待所有三个代理完成。汇总它们的发现并直接修复每个问题。如果发现是误报或不值得处理，记下它并继续 — 不要争论发现，跳过它。

完成后，简要总结修复了什么（或确认代码已经很干净）。
`

export function registerSimplifySkill(): void {
  registerBundledSkill({
    name: 'simplify',
    description:
      '审查更改的代码以查找可重用性、质量和效率问题，然后修复发现的任何问题。',
    userInvocable: true,
    async getPromptForCommand(args) {
      let prompt = SIMPLIFY_PROMPT
      if (args) {
        prompt += `\n\n## 额外关注\n\n${args}`
      }
      return [{ type: 'text', text: prompt }]
    },
  })
}