@wwkit/harness 1.0.8 → 1.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/agents/extract.md +2 -14
  2. package/agents/lint.md +367 -0
  3. package/agents/pyit.md +361 -0
  4. package/agents/pyut.md +347 -0
  5. package/agents/query.md +2 -14
  6. package/agents/revise.md +2 -14
  7. package/agents/work.md +151 -0
  8. package/commands/git-sync.md +218 -0
  9. package/commands/net-port.md +364 -0
  10. package/commands/pyit.md +6 -0
  11. package/commands/pyut.md +6 -0
  12. package/commands/resume.md +104 -0
  13. package/package.json +2 -2
  14. package/skills/better-skill/SKILL.md +124 -0
  15. package/skills/blame-skill/SKILL.md +201 -0
  16. package/skills/lint-ai-fix/SKILL.md +141 -0
  17. package/skills/lint-config-setup/SKILL.md +106 -0
  18. package/skills/lint-config-setup/references/languages/js.md +110 -0
  19. package/skills/lint-config-setup/references/languages/py.md +89 -0
  20. package/skills/lint-env-ensure/SKILL.md +92 -0
  21. package/skills/lint-env-ensure/references/config.md +65 -0
  22. package/skills/lint-language-detect/SKILL.md +79 -0
  23. package/skills/lint-language-detect/references/detect-language.js +65 -0
  24. package/skills/lint-rules-analyze/SKILL.md +129 -0
  25. package/skills/lint-suitability-check/SKILL.md +84 -0
  26. package/skills/lint-tool-fix/SKILL.md +94 -0
  27. package/skills/new-skill/SKILL.md +227 -0
  28. package/skills/new-skill/references/template.md +53 -0
  29. package/skills/new-skill/references/workflow-patterns.md +104 -0
  30. package/skills/pytest-case-create/SKILL.md +327 -0
  31. package/skills/pytest-case-create/references/test-standards.md +244 -0
  32. package/skills/pytest-case-fix/SKILL.md +274 -0
  33. package/skills/pytest-coverage-analyze/SKILL.md +226 -0
  34. package/skills/pytest-coverage-analyze/references/scoring-rules.md +57 -0
  35. package/skills/pytest-env-ensure/SKILL.md +198 -0
  36. package/skills/pytest-env-ensure/references/config.md +145 -0
  37. package/skills/pytest-execute/SKILL.md +155 -0
  38. package/skills/pytest-sample/SKILL.md +164 -0
  39. package/skills/pytest-sample/references/src/pytest-sample/Calculator.py +67 -0
  40. package/skills/pytest-sample/references/src/pytest-sample/ConfigManager.py +68 -0
  41. package/skills/pytest-sample/references/src/pytest-sample/FileProcessor.py +53 -0
  42. package/skills/pytest-sample/references/src/pytest-sample/OrderService.py +82 -0
  43. package/skills/pytest-sample/references/src/pytest-sample/TokenGenerator.py +50 -0
  44. package/skills/pytest-sample/references/src/pytest-sample/UserService.py +45 -0
  45. package/skills/pytest-sample/references/src/pytest-sample/__init__.py +0 -0
  46. package/skills/pytest-suitability-check/SKILL.md +224 -0
  47. package/skills/read-docs/SKILL.md +134 -0
  48. package/skills/read-docs/references/opencode/agents/cases.md +206 -0
  49. package/skills/read-docs/references/opencode/agents/design-pattern.md +47 -0
  50. package/skills/read-docs/references/opencode/agents/detail.md +191 -0
  51. package/skills/read-docs/references/opencode/agents/examples.md +100 -0
  52. package/skills/read-docs/references/opencode/agents/index.md +307 -0
  53. package/skills/read-docs/references/opencode/agents/workflow.md +161 -0
  54. package/skills/read-docs/references/opencode/cli/commands/acp.md +32 -0
  55. package/skills/read-docs/references/opencode/cli/commands/agent.md +16 -0
  56. package/skills/read-docs/references/opencode/cli/commands/attach.md +20 -0
  57. package/skills/read-docs/references/opencode/cli/commands/mcp.md +37 -0
  58. package/skills/read-docs/references/opencode/cli/commands/others.md +49 -0
  59. package/skills/read-docs/references/opencode/cli/commands/plugin.md +13 -0
  60. package/skills/read-docs/references/opencode/cli/commands/provider.md +44 -0
  61. package/skills/read-docs/references/opencode/cli/commands/run.md +81 -0
  62. package/skills/read-docs/references/opencode/cli/commands/serve.md +84 -0
  63. package/skills/read-docs/references/opencode/cli/commands/session.md +38 -0
  64. package/skills/read-docs/references/opencode/cli/commands/web.md +15 -0
  65. package/skills/read-docs/references/opencode/cli/env.md +39 -0
  66. package/skills/read-docs/references/opencode/cli/index.md +19 -0
  67. package/skills/read-docs/references/opencode/cli/tui.md +35 -0
  68. package/skills/read-docs/references/opencode/commands/examples.md +42 -0
  69. package/skills/read-docs/references/opencode/commands/index.md +185 -0
  70. package/skills/read-docs/references/opencode/config/provider.md +152 -0
  71. package/skills/read-docs/references/opencode/formatter/index.md +71 -0
  72. package/skills/read-docs/references/opencode/guide/config.md +419 -0
  73. package/skills/read-docs/references/opencode/guide/formatters.md +70 -0
  74. package/skills/read-docs/references/opencode/guide/index.md +37 -0
  75. package/skills/read-docs/references/opencode/guide/providers.md +31 -0
  76. package/skills/read-docs/references/opencode/guide/rules.md +63 -0
  77. package/skills/read-docs/references/opencode/plugins/examples.md +75 -0
  78. package/skills/read-docs/references/opencode/plugins/index.md +188 -0
  79. package/skills/read-docs/references/opencode/reference/index.md +119 -0
  80. package/skills/read-docs/references/opencode/rule/index.md +78 -0
  81. package/skills/read-docs/references/opencode/skills/detail.md +113 -0
  82. package/skills/read-docs/references/opencode/skills/examples.md +141 -0
  83. package/skills/read-docs/references/opencode/skills/index.md +126 -0
  84. package/skills/read-docs/references/opencode/skills/workflow.md +146 -0
  85. package/skills/read-docs/references/opencode/tests/agent.md +10 -0
  86. package/skills/read-docs/references/opencode/tests/config.md +60 -0
  87. package/skills/read-docs/references/opencode/tests/file.md +12 -0
  88. package/skills/read-docs/references/opencode/tests/serve.md +18 -0
  89. package/skills/read-docs/references/opencode/tests/session.md +31 -0
  90. package/skills/read-docs/references/opencode/tests/web.md +17 -0
  91. package/skills/read-docs/references/opencode/tools/arguments.md +305 -0
  92. package/skills/read-docs/references/opencode/tools/context.md +18 -0
  93. package/skills/read-docs/references/opencode/tools/custom.md +111 -0
  94. package/skills/read-docs/references/opencode/tools/detail.md +104 -0
  95. package/skills/read-docs/references/opencode/tools/examples.md +71 -0
  96. package/skills/read-docs/references/opencode/tools/index.md +56 -0
  97. package/skills/read-docs/references/opencode/tools/lsp.md +26 -0
  98. package/skills/read-docs/references/opencode/tools/mcp.md +132 -0
  99. package/skills/read-docs/references/opencode/train/README.md +135 -0
  100. package/skills/read-docs/references/opencode/train/agent-basic.md +772 -0
  101. package/skills/read-docs/references/opencode/train/command-basic.md +668 -0
  102. package/skills/read-docs/references/opencode/train/config-basic.md +509 -0
  103. package/skills/read-docs/references/opencode/train/index.md +164 -0
  104. package/skills/read-docs/references/opencode/train/practice.md +873 -0
  105. package/skills/read-docs/references/opencode/train/skill-basic.md +608 -0
  106. package/skills/read-docs/references/opencode/tui/commands/config.md +32 -0
  107. package/skills/read-docs/references/opencode/tui/commands/editor.md +47 -0
  108. package/skills/read-docs/references/opencode/tui/commands/index.md +125 -0
  109. package/skills/read-docs/references/opencode/tui/commands/init.md +5 -0
  110. package/skills/read-docs/references/opencode/tui/index.md +26 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wwkit/harness",
3
- "version": "1.0.8",
3
+ "version": "1.0.10",
4
4
  "author": "bluesliu <langcai163@163.com>",
5
5
  "description": "WebWork abilities for opencode",
6
6
  "type": "module",
@@ -38,7 +38,7 @@
38
38
  "access": "public"
39
39
  },
40
40
  "dependencies": {
41
- "@opencode-ai/plugin": "1.18.27",
41
+ "@opencode-ai/plugin": "1.18.30",
42
42
  "ajv": "^8.17.0",
43
43
  "cheerio": "^1.0.0",
44
44
  "json5": "^2.2.3"
@@ -0,0 +1,124 @@
1
+ ---
2
+ name: better-skill
3
+ description: |
4
+ 基于 blame-skill 审计评分,自动迭代优化 Skill 定义文件直到达到优秀等级。
5
+ 提供:迭代优化流程、自动改进策略、评分达标验证。
6
+ 适用:新建 Skill 后自动优化、已有 Skill 质量提升、批量 Skill 质量治理。
7
+ 不适用:非 SKILL.md 文件优化、Agent 定义优化、无需评分的简单修改。
8
+ license: MIT
9
+ ---
10
+
11
+ # Skill 自动优化器
12
+
13
+ ## 工作流模式
14
+
15
+ 本 Skill 采用 **迭代优化** 工作流:
16
+
17
+ 1. **评估**:调用 blame-skill 对目标 Skill 进行审计评分
18
+ 2. **判断**:检查分数是否 >= 90(A 级)或已达最大迭代次数
19
+ 3. **改进**:根据审计报告的改进建议,修改目标 SKILL.md
20
+ 4. **重评**:再次调用 blame-skill 重新评估
21
+ 5. **循环**:重复步骤 2-4 直到达标或累计迭代 5 次
22
+
23
+ ## 输入要求
24
+
25
+ 用户必须提供要优化的 **skill 名称**(如 `git-feat`、`clean-code`)。
26
+
27
+ ## 迭代流程
28
+
29
+ ### 第 1 步:初始评估
30
+
31
+ 调用 blame-skill 对目标 Skill 进行审计评分,使用 `--format=json` 结构化模式获取结果:
32
+
33
+ - 读取 blame-skill 的评分规则
34
+ - 按路径顺序查找目标 SKILL.md
35
+ - 逐项评分并生成结构化审计报告
36
+
37
+ ### 第 2 步:达标判断
38
+
39
+ 从审计结果中提取 `total_score`:
40
+
41
+ | 条件 | 动作 |
42
+ |------|------|
43
+ | `total_score >= 90` | 输出最终报告,流程结束 |
44
+ | `total_score < 90` 且迭代次数 < 5 | 进入第 3 步改进 |
45
+ | `total_score < 90` 且迭代次数 >= 5 | 输出最终报告(含未达标说明),流程结束 |
46
+
47
+ ### 第 3 步:改进 Skill
48
+
49
+ 根据审计报告中的 `issues` 和 `improvement_priority`,对目标 SKILL.md 进行修改:
50
+
51
+ 1. 按 `improvement_priority` 顺序逐项处理
52
+ 2. 对每个 issue,将 `suggestion` 转化为具体的文件修改操作
53
+ 3. 修改时遵循以下原则:
54
+ - **Frontmatter**:补充/修正 name、description 字段,确保 description 在 50-300 字符且包含具体能力、适用场景、不适用场景、提供资源
55
+ - **工作流声明**:在正文开头添加明确的工作流模式声明
56
+ - **失败处理**:补充失败处理机制(回滚、重试、降级、人工介入)
57
+ - **正文结构**:使用标题、列表、表格等结构化格式,补充代码示例和边界说明
58
+ - **渐进式加载**:当内容超过 200 行时,将详细数据拆分到 references/ 目录
59
+ - **Name 规范**:如 name 不符合 `^[a-z0-9]+(-[a-z0-9]+)*$` 格式,提示用户确认是否重命名
60
+
61
+ ### 第 4 步:重新评估
62
+
63
+ 修改完成后,再次调用 blame-skill 进行审计评分,回到第 2 步。
64
+
65
+ ## 迭代控制
66
+
67
+ | 参数 | 值 | 说明 |
68
+ |------|-----|------|
69
+ | 目标分数 | 90 | A 级(优秀) |
70
+ | 最大迭代次数 | 5 | 防止无限循环 |
71
+ | 迭代计数起点 | 1 | 首次评估计为第 1 次 |
72
+
73
+ ## 输出格式
74
+
75
+ 迭代结束后,输出最终报告:
76
+
77
+ ```
78
+ ## Skill 优化报告:[skill-name]
79
+
80
+ ### 最终得分:XX / 100(等级:X)
81
+ ### 迭代次数:X / 5
82
+
83
+ ### 各轮得分变化
84
+
85
+ | 轮次 | 得分 | 等级 | 主要改进项 |
86
+ |------|------|------|-----------|
87
+ | 1 | XX | X | 初始评估 |
88
+ | 2 | XX | X | [改进项1], [改进项2] |
89
+ | ... | ... | ... | ... |
90
+
91
+ ### 改进摘要
92
+
93
+ - [改进项1]:[修改前] → [修改后]
94
+ - [改进项2]:[修改前] → [修改后]
95
+
96
+ ### 未解决项(如有)
97
+
98
+ - [ ] **[项目名]**:[原因说明]
99
+ ```
100
+
101
+ ## 一定要做
102
+
103
+ 1. 每次迭代前必须调用 blame-skill 获取最新评分
104
+ 2. 按改进优先级从高到低处理 issue
105
+ 3. 修改 SKILL.md 后立即重新评估
106
+ 4. 记录每轮迭代的得分变化
107
+ 5. 迭代结束时输出完整的优化报告
108
+
109
+ ## 一定不要做
110
+
111
+ 1. 不要跳过 blame-skill 评估直接修改
112
+ 2. 不要在一次迭代中修改后不重新评估就继续修改
113
+ 3. 不要修改 blame-skill 的评分规则
114
+ 4. 不要在未达到 90 分时提前终止(除非已达 5 次上限)
115
+ 5. 不要修改目标 Skill 的核心功能语义(只优化结构,不改意图)
116
+
117
+ ## 失败处理
118
+
119
+ | 场景 | 处理方式 |
120
+ |------|---------|
121
+ | 目标 Skill 不存在 | 提示用户检查名称,终止流程 |
122
+ | blame-skill 评估失败 | 终止流程,输出已完成的迭代结果 |
123
+ | 5 次迭代仍未达标 | 输出当前最高分和未解决项,建议人工介入 |
124
+ | 修改导致分数下降 | 回滚本次修改,跳过该项,继续下一优先级 |
@@ -0,0 +1,201 @@
1
+ ---
2
+ name: blame-skill
3
+ description: |
4
+ 审计和评分 OpenCode Skill 定义文件(SKILL.md),基于工作流模式和最佳实践规则进行量化评估。
5
+ 提供:评分规则(满分100分)、工作流匹配分析、改进建议生成。
6
+ 适用:审查已有 Skill 质量、改进 Skill 定义、新建 Skill 前参考评分标准。
7
+ 不适用:审查 Agent 定义、审查 Command 定义、通用代码审查。
8
+ ---
9
+
10
+ # Skill 审计评分器
11
+
12
+ ## 工作流模式
13
+
14
+ 本 Skill 采用 **迭代优化** 工作流:
15
+ 1. **读取**:加载目标 SKILL.md 及 references/ 目录
16
+ 2. **评分**:按评分规则逐项打分
17
+ 3. **诊断**:列出未满足项及改进建议
18
+ 4. **输出**:生成结构化审计报告
19
+
20
+ ## 评分规则(满分 100 分)
21
+
22
+ ### 一、工作流匹配(20 分)
23
+
24
+ Skill 是否符合某种明确的工作流模式,是评分的第一标准。
25
+
26
+ | 项目 | 分值 | 评分标准 |
27
+ |------|------|---------|
28
+ | 工作流识别 | 8 分 | 能明确识别属于以下模式之一:顺序工作流、多 MCP 协调、迭代优化、上下文感知、领域智能。无法识别得 0 分 |
29
+ | 工作流完整性 | 5 分 | 工作流步骤完整,有清晰的阶段划分或步骤编号。步骤模糊或不完整扣 3-5 分 |
30
+ | 指令可执行 | 3 分 | 每个步骤的指令具体、可操作,非泛泛而谈。模糊指令扣 2-3 分 |
31
+ | 失败处理 | 4 分 | 包含失败处理机制(回滚、重试、降级、人工介入)。无任何失败处理扣 4 分 |
32
+
33
+ ### 二、Description 质量(20 分)
34
+
35
+ Description 是唯一决定 Skill 是否被触发的因素。
36
+
37
+ | 项目 | 分值 | 评分标准 |
38
+ |------|------|---------|
39
+ | 具体能力 | 5 分 | 一句话说明核心能力,模糊不得分 |
40
+ | 适用场景 | 5 分 | 明确列出触发场景,缺失扣 5 分 |
41
+ | 不适用场景 | 5 分 | 明确列出边界限制,缺失扣 5 分 |
42
+ | 提供资源 | 5 分 | 说明 Skill 包含的资源(表结构、公式、模板等),缺失扣 5 分 |
43
+
44
+ ### 三、Name 规范(10 分)
45
+
46
+ | 项目 | 分值 | 评分标准 |
47
+ |------|------|---------|
48
+ | 命名规范 | 5 分 | 符合 `^[a-z0-9]+(-[a-z0-9]+)*$` 格式。不符合得 0 分 |
49
+ | 语义清晰 | 5 分 | 名称反映核心功能,无法从名称推断用途扣 3-5 分 |
50
+
51
+ ### 四、正文质量(25 分)
52
+
53
+ | 项目 | 分值 | 评分标准 |
54
+ |------|------|---------|
55
+ | Markdown 结构 | 5 分 | 使用标题、列表、表格等结构化格式。纯文本无结构扣 5 分 |
56
+ | 具体示例 | 5 分 | 包含代码块或使用示例。无示例扣 5 分 |
57
+ | 边界说明 | 5 分 | 明确说明不能做什么或限制条件。缺失扣 5 分 |
58
+ | 输入输出规范 | 5 分 | 明确定义 Skill 的输入要求和输出格式。若 Skill 无需输入输出(如纯执行类),自动得 5 分;需要但缺失扣 5 分,定义不完整扣 2-3 分 |
59
+ | 渐进式加载 | 5 分 | 主文件精简,详细数据放 references/。主文件过长(>200 行)且无 references 扣 5 分 |
60
+
61
+ ### 五、Frontmatter 规范(15 分)
62
+
63
+ | 项目 | 分值 | 评分标准 |
64
+ |------|------|---------|
65
+ | name 字段 | 3 分 | 存在且与目录名一致。缺失或不一致扣 3 分 |
66
+ | description 字段 | 5 分 | 存在且 1-1024 字符。缺失扣 5 分 |
67
+ | description 长度 | 4 分 | 描述充分但不冗长(建议 50-300 字符)。过短(<30 字符)扣 2 分,过长(>500 字符)扣 2 分 |
68
+ | 可选字段 | 3 分 | 合理使用 license / compatibility / metadata 等可选字段。无可选字段不扣分,有则检查合理性 |
69
+
70
+ ### 六、目录结构(10 分)
71
+
72
+ | 项目 | 分值 | 评分标准 |
73
+ |------|------|---------|
74
+ | SKILL.md 存在 | 5 分 | 文件名必须为 SKILL.md(大写)。不存在得 0 分 |
75
+ | references/ 使用 | 5 分 | 当内容较多时使用 references/ 目录存放详细文档。内容多但未拆分扣 5 分,内容少不需要则不扣分 |
76
+
77
+ ## 评分等级
78
+
79
+ | 分数 | 等级 | 说明 |
80
+ |------|------|------|
81
+ | 90-100 | A 优秀 | 完全符合最佳实践 |
82
+ | 75-89 | B 良好 | 基本符合,有少量改进空间 |
83
+ | 60-74 | C 合格 | 可用但需要改进 |
84
+ | 40-59 | D 不足 | 存在明显问题 |
85
+ | <40 | E 较差 | 需要重写 |
86
+
87
+ ## 输入要求
88
+
89
+ 用户必须提供要审计的 **skill 名称**(如 `git-feat`、`clean-code`)。
90
+
91
+ ## Skill 加载路径
92
+
93
+ 按以下顺序查找目标 Skill 的 SKILL.md 文件,找到即停止:
94
+
95
+ 1. **项目级**:`.opencode/skills/<name>/SKILL.md`(从当前目录向上遍历至 git worktree)
96
+ 2. **OPENCODE_CONFIG_DIR**:`$OPENCODE_CONFIG_DIR/skills/<name>/SKILL.md`
97
+ 3. **全局**:`~/.config/opencode/skills/<name>/SKILL.md`
98
+
99
+ 如果目录下存在 `references/` 子目录,也一并读取用于评估渐进式加载。
100
+
101
+ ## 审计流程
102
+
103
+ ### 步骤 1:定位并读取目标 Skill
104
+
105
+ 根据用户提供的 skill 名称,按上述路径顺序查找 SKILL.md。未找到则提示用户检查名称或路径。
106
+
107
+ ### 步骤 2:逐项评分
108
+
109
+ 按上述六大类评分规则,逐项评估并记录得分和扣分原因。
110
+
111
+ ### 步骤 3:生成审计报告
112
+
113
+ 按以下格式输出:
114
+
115
+ ```
116
+ ## Skill 审计报告:[skill-name]
117
+
118
+ ### 总分:XX / 100(等级:X)
119
+
120
+ ### 分项得分
121
+
122
+ | 类别 | 得分 | 满分 |
123
+ |------|------|------|
124
+ | 工作流匹配 | XX | 20 |
125
+ | Description 质量 | XX | 20 |
126
+ | Name 规范 | XX | 10 |
127
+ | 正文质量 | XX | 25 |
128
+ | Frontmatter 规范 | XX | 15 |
129
+ | 目录结构 | XX | 10 |
130
+
131
+ ### 未满足项及改进建议
132
+
133
+ - [ ] **[项目名]** (扣 X 分)
134
+ - 现状:[当前情况]
135
+ - 建议:[具体改进方案]
136
+
137
+ ### 改进优先级
138
+
139
+ 1. [最应优先改进的项]
140
+ 2. [次优先改进的项]
141
+ 3. ...
142
+ ```
143
+
144
+ ### 步骤 4:输出格式
145
+
146
+ 支持两种输出模式,根据调用方式自动选择:
147
+
148
+ #### 模式 A:人类阅读模式(默认)
149
+
150
+ 用户直接调用 blame-skill 时使用,输出完整的 Markdown 审计报告。
151
+
152
+ #### 模式 B:结构化模式(程序化调用)
153
+
154
+ 当调用参数包含 `--format=json` 或由其他 Skill 程序化调用时,输出 JSON 结构化结果,便于自动化解析:
155
+
156
+ ```json
157
+ {
158
+ "skill_name": "git-clear",
159
+ "total_score": 76,
160
+ "grade": "B",
161
+ "scores": {
162
+ "workflow_match": 14,
163
+ "description_quality": 9,
164
+ "name_convention": 9,
165
+ "content_quality": 21,
166
+ "frontmatter": 13,
167
+ "directory_structure": 10
168
+ },
169
+ "score_details": {
170
+ "workflow_match": {
171
+ "workflow_identification": 8,
172
+ "workflow_completeness": 5,
173
+ "instruction_executable": 3,
174
+ "failure_handling": 0
175
+ },
176
+ "content_quality": {
177
+ "markdown_structure": 5,
178
+ "concrete_examples": 5,
179
+ "boundary_description": 5,
180
+ "input_output_spec": 0,
181
+ "progressive_loading": 5
182
+ }
183
+ },
184
+ "issues": [
185
+ {
186
+ "item": "工作流识别",
187
+ "deduction": 2,
188
+ "current": "工作流隐含在步骤中,未显式声明工作流模式",
189
+ "suggestion": "在正文开头明确声明工作流模式(如'本 Skill 采用顺序工作流')"
190
+ }
191
+ ],
192
+ "improvement_priority": [
193
+ "Description 补充不适用场景和提供资源",
194
+ "Description 长度扩展"
195
+ ]
196
+ }
197
+ ```
198
+
199
+ ### 步骤 5:如果用户需要,提供改进后的 SKILL.md
200
+
201
+ 根据审计结果,重写一份符合最佳实践的 SKILL.md 供用户参考。
@@ -0,0 +1,141 @@
1
+ ---
2
+ name: lint-ai-fix
3
+ description: |
4
+ 对 linter 无法自动修复的违规进行 AI 语义修复。内部管理 fix→验证→复检 的 loop(max 3),
5
+ 每次修改后做语法验证,失败则 git checkout 回滚并记人工处理项。agent 只接收最终输出。
6
+ 适用:lint agent 的 AI 修复阶段,处理 lint-tool-fix 的剩余违规。
7
+ 不适用:linter --fix 可修复的违规(使用 lint-tool-fix)、规则检查(使用 lint-rules-analyze)。
8
+ ---
9
+
10
+ # Lint AI 语义修复
11
+
12
+ ## 工作流模式
13
+
14
+ 内部迭代执行(max 3 轮),4 个阶段。
15
+
16
+ ## 输入
17
+
18
+ | 参数 | 必填 | 类型 | 说明 |
19
+ |------|------|------|------|
20
+ | remaining_violations | 是 | array | lint-tool-fix 输出的剩余违规列表 |
21
+ | target_dir | 是 | string | 检查目标目录路径 |
22
+ | root_dir | 是 | string | 工程根目录路径 |
23
+ | primary_language | 是 | string | 主语言(`jsts` 或 `python`) |
24
+ | config_file_path | 是 | string | lint 配置文件路径 |
25
+
26
+ ## 输出
27
+
28
+ - `ai_fixed_count`:AI 修复的违规数
29
+ - `final_violations`:修复后剩余的违规列表(结构同输入)
30
+ - `manual_items`:无法修复的人工处理项列表,每条含 `{ ...violation, fix_attempted, reason }`
31
+
32
+ ## 内部 Loop(max 3)
33
+
34
+ ```
35
+ inner_round 1: 逐条修复 → 语法验证 → linter 复检
36
+ inner_round 2: 逐条修复 → 语法验证 → linter 复检
37
+ inner_round 3: 逐条修复 → 语法验证 → linter 复检
38
+
39
+ 退出条件:
40
+ - 0 违规 → 成功退出
41
+ - 无改进(违规数 >= 轮首) → 退出,输出 manual_items
42
+ - inner_round = 3 → 超限退出,输出 manual_items
43
+ ```
44
+
45
+ ## 阶段一:逐条分析修复
46
+
47
+ 对 `remaining_violations` 中的每条违规:
48
+
49
+ 1. 分析违规规则和上下文
50
+ 2. 修改源码文件以消除违规
51
+ 3. 记录修改的文件和修复内容
52
+
53
+ ### 修复策略
54
+
55
+ | 规则类型 | 修复策略 |
56
+ |---------|---------|
57
+ | 未使用变量/import | 删除未使用的声明 |
58
+ | 未定义变量 | 添加定义或修正引用 |
59
+ | debugger 语句 | 删除 debugger |
60
+ | 空语句块 | 添加注释或实现 |
61
+ | 比较使用 None/True/False | 改为 is/is not |
62
+ | 其他规则 | 按规则语义最小改动修复 |
63
+
64
+ ## 阶段二:语法验证
65
+
66
+ 每次修改文件后,执行语法验证:
67
+
68
+ | 主语言 | 验证命令 |
69
+ |--------|---------|
70
+ | jsts | `node --check {file}` |
71
+ | python | `python3 -m py_compile {file}` |
72
+
73
+ | 条件 | 动作 |
74
+ |------|------|
75
+ | 语法验证通过 | 继续阶段三 |
76
+ | 语法验证失败 | `git checkout {file}` 回滚,标记为 manual_item,跳过该文件 |
77
+
78
+ ## 阶段三:linter 复检
79
+
80
+ 对所有修改的文件重新执行 linter 检查(同 lint-rules-analyze 命令),获取当前违规数。
81
+
82
+ ## 阶段四:退出判断
83
+
84
+ | 条件 | 动作 |
85
+ |------|------|
86
+ | 当前违规数 = 0 | 成功退出,输出 ai_fixed_count + 空 final_violations |
87
+ | 当前违规数 >= 轮首违规数 | 无改进退出,输出 final_violations + manual_items |
88
+ | inner_round = 3 | 超限退出,输出 final_violations + manual_items |
89
+ | 否则 | inner_round++,回到阶段一 |
90
+
91
+ ## 输出格式
92
+
93
+ ```
94
+ ## AI 修复结果
95
+
96
+ - AI 修复数: X
97
+ - 最终违规数: X
98
+ - 人工处理项: X
99
+
100
+ ### 修复记录
101
+ | # | 文件 | 规则 | 修复内容 |
102
+ |---|------|------|---------|
103
+ | 1 | src/foo.js | no-unused-vars | 删除未使用变量 x |
104
+
105
+ ### 人工处理项
106
+ | # | 文件 | 行号 | 规则 | 原因 |
107
+ |---|------|------|------|------|
108
+ | 1 | src/bar.js | 20 | no-console | 需确认是否保留 console.log |
109
+ ```
110
+
111
+ ## 决策
112
+
113
+ | 条件 | 动作 |
114
+ |------|------|
115
+ | final_violations 为空 | agent 回到轮尾评分(final_count 应为 0 → 达标) |
116
+ | final_violations 非空 | agent 回到轮尾评分(独立验证) |
117
+
118
+ ## 失败处理
119
+
120
+ | 场景 | 处理方式 |
121
+ |------|---------|
122
+ | 源码修改后语法失败 | git checkout 回滚,记 manual_item |
123
+ | linter 复检失败 | 使用上一次的违规列表作为 final_violations |
124
+ | git checkout 失败 | 报错,保留当前状态,记 manual_item |
125
+ | 文件只读 | 记 manual_item,跳过 |
126
+
127
+ ## 一定要做
128
+
129
+ 1. 每次修改后必须做语法验证
130
+ 2. 语法验证失败必须 git checkout 回滚
131
+ 3. 内部 loop 退出条件清晰(0 违规/无改进/超限)
132
+ 4. 输出 manual_items 含 fix_attempted 和 reason
133
+ 5. 修复是最小改动,不做重构
134
+
135
+ ## 一定不要做
136
+
137
+ 1. 不要做大规模重构
138
+ 2. 不要修改非违规文件的代码
139
+ 3. 不要跳过语法验证
140
+ 4. 不要在语法验证失败时不回滚
141
+ 5. 不要执行网络请求
@@ -0,0 +1,106 @@
1
+ ---
2
+ name: lint-config-setup
3
+ description: |
4
+ 生成或补全 lint 配置文件。读取语言规则清单,按初始启用规则生成 eslint.config.js 或 ruff.toml。
5
+ 已有配置文件时只追加缺失的启用规则,不覆盖用户自定义规则。
6
+ 适用:lint agent 的配置生成阶段,在规则分析前确保配置文件存在且包含初始规则集。
7
+ 不适用:非 lint 场景的配置生成、手动配置调优。
8
+ ---
9
+
10
+ # Lint 配置生成
11
+
12
+ ## 工作流模式
13
+
14
+ 顺序执行,4 个阶段。
15
+
16
+ ## 输入
17
+
18
+ | 参数 | 必填 | 类型 | 说明 |
19
+ |------|------|------|------|
20
+ | root_dir | 是 | string | 工程根目录路径 |
21
+ | primary_language | 是 | string | 主语言(`jsts` 或 `python`) |
22
+
23
+ ## 输出
24
+
25
+ - `config_file_path`:配置文件绝对路径
26
+ - `enabled_rules`:已启用的规则列表
27
+ - `total_rules`:规则清单中的全量规则数
28
+ - `config_generated`:是否新建配置(true=新建,false=已有补全)
29
+
30
+ ## 阶段一:加载规则清单
31
+
32
+ 读取 `references/languages/{primary_language}.md`,解析规则清单表格:
33
+
34
+ | 主语言 | 规则文件 | 配置文件名 |
35
+ |--------|---------|-----------|
36
+ | jsts | `references/languages/js.md` | `eslint.config.js` |
37
+ | python | `references/languages/py.md` | `ruff.toml` |
38
+
39
+ 提取所有"初始启用"标记为 ✓ 的规则。
40
+
41
+ ## 阶段二:检查已有配置
42
+
43
+ 检查 `root_dir` 下是否已有配置文件:
44
+
45
+ | 主语言 | 检查文件 |
46
+ |--------|---------|
47
+ | jsts | `eslint.config.js`、`.eslintrc.json`、`.eslintrc.js` |
48
+ | python | `ruff.toml`、`pyproject.toml`(含 `[tool.ruff]` 段) |
49
+
50
+ ## 阶段三:生成或补全
51
+
52
+ | 条件 | 动作 |
53
+ |------|------|
54
+ | 无配置文件 | 从模板生成新配置文件,写入初始启用规则,`config_generated = true` |
55
+ | 有配置文件 | 读取已有规则,追加缺失的初始启用规则(不覆盖用户自定义),`config_generated = false` |
56
+
57
+ ### 生成模板
58
+
59
+ jsts → `eslint.config.js`(flat config 格式):
60
+ ```javascript
61
+ import js from '@eslint/js';
62
+ export default [
63
+ js.configs.recommended,
64
+ { rules: { /* 初始启用规则 */ } },
65
+ ];
66
+ ```
67
+
68
+ python → `ruff.toml`:
69
+ ```toml
70
+ [lint]
71
+ select = ["F401", "F811", "F841", "E711"]
72
+ ```
73
+
74
+ ## 阶段四:输出
75
+
76
+ 输出配置文件路径、已启用规则列表、全量规则数、是否新建。
77
+
78
+ ## 决策
79
+
80
+ | 条件 | 动作 |
81
+ |------|------|
82
+ | 生成/补全成功 | 输出结果,流程结束 |
83
+ | 生成失败 | 报错,agent 退出 |
84
+ | 规则清单文件缺失 | 报错"规则清单文件不存在",agent 退出 |
85
+
86
+ ## 失败处理
87
+
88
+ | 场景 | 处理方式 |
89
+ |------|---------|
90
+ | 规则清单文件不存在 | 报错退出 |
91
+ | 配置文件写入失败 | 报错退出 |
92
+ | 已有配置解析失败 | 报错退出,提示用户检查配置文件格式 |
93
+
94
+ ## 一定要做
95
+
96
+ 1. 从规则清单文件读取初始启用规则
97
+ 2. 已有配置只追加缺失规则,不覆盖用户自定义
98
+ 3. eslint.config.js 使用 flat config 格式(ESLint 9+)
99
+ 4. 输出 config_generated 标识新建 vs 补全
100
+
101
+ ## 一定不要做
102
+
103
+ 1. 不要覆盖用户已有的自定义规则
104
+ 2. 不要修改非配置文件
105
+ 3. 不要写入初始未启用的规则
106
+ 4. 不要执行网络请求
@@ -0,0 +1,110 @@
1
+ # JS/TS ESLint 规则清单
2
+
3
+ ## 工具信息
4
+
5
+ | 项 | 值 |
6
+ |---|---|
7
+ | 工具 | ESLint |
8
+ | 安装 | `npm install -D eslint` |
9
+ | TS 扩展 | `npm install -D @typescript-eslint/parser @typescript-eslint/eslint-plugin` |
10
+ | 配置文件 | `eslint.config.js`(flat config,ESLint 9+) |
11
+ | 检查命令 | `npx eslint {target_dir} --format json` |
12
+ | 修复命令 | `npx eslint {target_dir} --fix` |
13
+ | 输出格式 | JSON 数组,每元素含 `filePath` + `messages[]` |
14
+
15
+ ## ESLint JSON 输出解析
16
+
17
+ ```json
18
+ [
19
+ {
20
+ "filePath": "/abs/path/to/file.js",
21
+ "messages": [
22
+ {
23
+ "ruleId": "no-unused-vars",
24
+ "severity": 2,
25
+ "message": "'x' is defined but never used",
26
+ "line": 10,
27
+ "column": 5,
28
+ "fix": { "range": [100, 110], "text": "" }
29
+ }
30
+ ]
31
+ }
32
+ ]
33
+ ```
34
+
35
+ - `severity`: 1 = warning, 2 = error
36
+ - `fix` 存在 = 可自动修复(`fixable = true`)
37
+
38
+ ## 规则清单
39
+
40
+ > 初始启用标记 ✓ 的规则在配置生成时写入 config 文件;✗ 的规则仅记录在清单中,后续可逐步放开。
41
+
42
+ ### Possible Errors
43
+
44
+ | 规则 | 描述 | 默认级别 | 初始启用 | 可 fix |
45
+ |------|------|---------|---------|--------|
46
+ | no-unused-vars | 禁止未使用的变量 | error | ✓ | ✗ |
47
+ | no-undef | 禁止未定义的变量 | error | ✓ | ✗ |
48
+ | no-cond-assign | 禁止条件表达式中赋值 | error | ✗ | ✓ |
49
+ | no-debugger | 禁止 debugger 语句 | error | ✓ | ✗ |
50
+ | no-dupe-keys | 禁止对象字面量重复键 | error | ✗ | ✓ |
51
+ | no-dupe-args | 禁止函数参数重复 | error | ✗ | ✓ |
52
+ | no-empty | 禁止空语句块 | error | ✓ | ✓ |
53
+ | no-extra-semi | 禁止多余分号 | error | ✗ | ✓ |
54
+ | no-irregular-whitespace | 禁止不规则的空白字符 | error | ✗ | ✗ |
55
+ | no-unreachable | 禁止 return 后的不可达代码 | error | ✗ | ✓ |
56
+
57
+ ### Best Practices
58
+
59
+ | 规则 | 描述 | 默认级别 | 初始启用 | 可 fix |
60
+ |------|------|---------|---------|--------|
61
+ | no-console | 禁止 console | warn | ✗ | ✓ |
62
+ | no-constant-condition | 禁止常量条件表达式 | error | ✗ | ✗ |
63
+ | no-dupe-else-if | 禁止重复的 else if | error | ✗ | ✓ |
64
+ | no-empty-pattern | 禁止空解构模式 | error | ✗ | ✓ |
65
+ | no-ex-assign | 禁止 catch 中重新赋值异常 | error | ✗ | ✓ |
66
+ | no-fallthrough | 禁止 switch 穿透 | error | ✗ | ✗ |
67
+ | no-redeclare | 禁止重复声明 | error | ✗ | ✓ |
68
+ | no-useless-return | 禁止无用的 return | error | ✗ | ✓ |
69
+ | eqeqeq | 要求严格相等 === | error | ✗ | ✓ |
70
+ | prefer-const | 优先使用 const | error | ✗ | ✓ |
71
+
72
+ ### Stylistic Issues
73
+
74
+ | 规则 | 描述 | 默认级别 | 初始启用 | 可 fix |
75
+ |------|------|---------|---------|--------|
76
+ | semi | 分号一致性 | warn | ✗ | ✓ |
77
+ | quotes | 引号一致性 | warn | ✗ | ✓ |
78
+ | indent | 缩进一致性 | warn | ✗ | ✓ |
79
+ | no-trailing-spaces | 禁止行尾空格 | warn | ✗ | ✓ |
80
+ | eol-last | 文件末尾换行 | warn | ✗ | ✓ |
81
+ | no-multiple-empty-lines | 禁止多个空行 | warn | ✗ | ✓ |
82
+
83
+ ### ES6+
84
+
85
+ | 规则 | 描述 | 默认级别 | 初始启用 | 可 fix |
86
+ |------|------|---------|---------|--------|
87
+ | no-const-assign | 禁止修改 const | error | ✗ | ✗ |
88
+ | no-dupe-class-members | 禁止重复类成员 | error | ✗ | ✓ |
89
+ | no-var | 禁止 var | error | ✗ | ✓ |
90
+ | prefer-arrow-callback | 优先箭头函数回调 | warn | ✗ | ✓ |
91
+
92
+ ## 配置文件模板(eslint.config.js)
93
+
94
+ ```javascript
95
+ import js from '@eslint/js';
96
+
97
+ export default [
98
+ js.configs.recommended,
99
+ {
100
+ rules: {
101
+ 'no-unused-vars': 'error',
102
+ 'no-undef': 'error',
103
+ 'no-debugger': 'error',
104
+ 'no-empty': 'error',
105
+ },
106
+ },
107
+ ];
108
+ ```
109
+
110
+ > 仅写入初始启用 ✓ 的规则。用户已有配置文件时只追加缺失规则,不覆盖。