@wwkit/harness 1.0.9 → 1.0.11

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 (125) hide show
  1. package/agents/extract.md +2 -14
  2. package/agents/lint.md +368 -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 +631 -0
  8. package/commands/fix.md +77 -0
  9. package/commands/git-sync.md +218 -0
  10. package/commands/net-port.md +364 -0
  11. package/commands/pyit.md +6 -0
  12. package/commands/pyut.md +6 -0
  13. package/commands/resume.md +104 -0
  14. package/package.json +4 -2
  15. package/plugins/work-bootstrap.js +77 -0
  16. package/scripts/work-review-package +50 -0
  17. package/scripts/work-task-brief +27 -0
  18. package/scripts/work-workspace +31 -0
  19. package/skills/better-skill/SKILL.md +124 -0
  20. package/skills/blame-skill/SKILL.md +201 -0
  21. package/skills/lint-ai-fix/SKILL.md +141 -0
  22. package/skills/lint-config-setup/SKILL.md +106 -0
  23. package/skills/lint-config-setup/references/languages/js.md +110 -0
  24. package/skills/lint-config-setup/references/languages/py.md +89 -0
  25. package/skills/lint-env-ensure/SKILL.md +92 -0
  26. package/skills/lint-env-ensure/references/config.md +65 -0
  27. package/skills/lint-language-detect/SKILL.md +79 -0
  28. package/skills/lint-language-detect/references/detect-language.js +65 -0
  29. package/skills/lint-rules-analyze/SKILL.md +129 -0
  30. package/skills/lint-suitability-check/SKILL.md +84 -0
  31. package/skills/lint-tool-fix/SKILL.md +94 -0
  32. package/skills/new-skill/SKILL.md +227 -0
  33. package/skills/new-skill/references/template.md +53 -0
  34. package/skills/new-skill/references/workflow-patterns.md +104 -0
  35. package/skills/pytest-case-create/SKILL.md +327 -0
  36. package/skills/pytest-case-create/references/test-standards.md +244 -0
  37. package/skills/pytest-case-fix/SKILL.md +274 -0
  38. package/skills/pytest-coverage-analyze/SKILL.md +226 -0
  39. package/skills/pytest-coverage-analyze/references/scoring-rules.md +57 -0
  40. package/skills/pytest-env-ensure/SKILL.md +198 -0
  41. package/skills/pytest-env-ensure/references/config.md +145 -0
  42. package/skills/pytest-execute/SKILL.md +155 -0
  43. package/skills/pytest-sample/SKILL.md +164 -0
  44. package/skills/pytest-sample/references/src/pytest-sample/Calculator.py +67 -0
  45. package/skills/pytest-sample/references/src/pytest-sample/ConfigManager.py +68 -0
  46. package/skills/pytest-sample/references/src/pytest-sample/FileProcessor.py +53 -0
  47. package/skills/pytest-sample/references/src/pytest-sample/OrderService.py +82 -0
  48. package/skills/pytest-sample/references/src/pytest-sample/TokenGenerator.py +50 -0
  49. package/skills/pytest-sample/references/src/pytest-sample/UserService.py +45 -0
  50. package/skills/pytest-sample/references/src/pytest-sample/__init__.py +0 -0
  51. package/skills/pytest-suitability-check/SKILL.md +224 -0
  52. package/skills/read-docs/SKILL.md +134 -0
  53. package/skills/read-docs/references/opencode/agents/cases.md +206 -0
  54. package/skills/read-docs/references/opencode/agents/design-pattern.md +47 -0
  55. package/skills/read-docs/references/opencode/agents/detail.md +191 -0
  56. package/skills/read-docs/references/opencode/agents/examples.md +100 -0
  57. package/skills/read-docs/references/opencode/agents/index.md +309 -0
  58. package/skills/read-docs/references/opencode/agents/parallel-dispatch.md +149 -0
  59. package/skills/read-docs/references/opencode/agents/subagent-internals.md +217 -0
  60. package/skills/read-docs/references/opencode/agents/workflow.md +161 -0
  61. package/skills/read-docs/references/opencode/cli/commands/acp.md +32 -0
  62. package/skills/read-docs/references/opencode/cli/commands/agent.md +16 -0
  63. package/skills/read-docs/references/opencode/cli/commands/attach.md +20 -0
  64. package/skills/read-docs/references/opencode/cli/commands/mcp.md +37 -0
  65. package/skills/read-docs/references/opencode/cli/commands/others.md +49 -0
  66. package/skills/read-docs/references/opencode/cli/commands/plugin.md +13 -0
  67. package/skills/read-docs/references/opencode/cli/commands/provider.md +44 -0
  68. package/skills/read-docs/references/opencode/cli/commands/run.md +81 -0
  69. package/skills/read-docs/references/opencode/cli/commands/serve.md +84 -0
  70. package/skills/read-docs/references/opencode/cli/commands/session.md +38 -0
  71. package/skills/read-docs/references/opencode/cli/commands/web.md +15 -0
  72. package/skills/read-docs/references/opencode/cli/env.md +39 -0
  73. package/skills/read-docs/references/opencode/cli/index.md +19 -0
  74. package/skills/read-docs/references/opencode/cli/tui.md +35 -0
  75. package/skills/read-docs/references/opencode/commands/examples.md +42 -0
  76. package/skills/read-docs/references/opencode/commands/index.md +185 -0
  77. package/skills/read-docs/references/opencode/config/provider.md +152 -0
  78. package/skills/read-docs/references/opencode/formatter/index.md +71 -0
  79. package/skills/read-docs/references/opencode/guide/config.md +419 -0
  80. package/skills/read-docs/references/opencode/guide/formatters.md +70 -0
  81. package/skills/read-docs/references/opencode/guide/index.md +37 -0
  82. package/skills/read-docs/references/opencode/guide/providers.md +31 -0
  83. package/skills/read-docs/references/opencode/guide/rules.md +63 -0
  84. package/skills/read-docs/references/opencode/plugins/examples.md +75 -0
  85. package/skills/read-docs/references/opencode/plugins/index.md +188 -0
  86. package/skills/read-docs/references/opencode/reference/index.md +119 -0
  87. package/skills/read-docs/references/opencode/rule/index.md +78 -0
  88. package/skills/read-docs/references/opencode/skills/detail.md +113 -0
  89. package/skills/read-docs/references/opencode/skills/examples.md +141 -0
  90. package/skills/read-docs/references/opencode/skills/index.md +126 -0
  91. package/skills/read-docs/references/opencode/skills/workflow.md +146 -0
  92. package/skills/read-docs/references/opencode/tests/agent.md +10 -0
  93. package/skills/read-docs/references/opencode/tests/config.md +60 -0
  94. package/skills/read-docs/references/opencode/tests/file.md +12 -0
  95. package/skills/read-docs/references/opencode/tests/serve.md +18 -0
  96. package/skills/read-docs/references/opencode/tests/session.md +31 -0
  97. package/skills/read-docs/references/opencode/tests/web.md +17 -0
  98. package/skills/read-docs/references/opencode/tools/arguments.md +305 -0
  99. package/skills/read-docs/references/opencode/tools/context.md +18 -0
  100. package/skills/read-docs/references/opencode/tools/custom.md +111 -0
  101. package/skills/read-docs/references/opencode/tools/detail.md +104 -0
  102. package/skills/read-docs/references/opencode/tools/examples.md +71 -0
  103. package/skills/read-docs/references/opencode/tools/index.md +56 -0
  104. package/skills/read-docs/references/opencode/tools/lsp.md +26 -0
  105. package/skills/read-docs/references/opencode/tools/mcp.md +132 -0
  106. package/skills/read-docs/references/opencode/train/README.md +135 -0
  107. package/skills/read-docs/references/opencode/train/agent-basic.md +772 -0
  108. package/skills/read-docs/references/opencode/train/command-basic.md +668 -0
  109. package/skills/read-docs/references/opencode/train/config-basic.md +509 -0
  110. package/skills/read-docs/references/opencode/train/index.md +164 -0
  111. package/skills/read-docs/references/opencode/train/practice.md +873 -0
  112. package/skills/read-docs/references/opencode/train/skill-basic.md +608 -0
  113. package/skills/read-docs/references/opencode/tui/commands/config.md +32 -0
  114. package/skills/read-docs/references/opencode/tui/commands/editor.md +47 -0
  115. package/skills/read-docs/references/opencode/tui/commands/index.md +125 -0
  116. package/skills/read-docs/references/opencode/tui/commands/init.md +5 -0
  117. package/skills/read-docs/references/opencode/tui/index.md +26 -0
  118. package/skills/read-docs/references/superpowers/bootstrap.md +107 -0
  119. package/skills/read-docs/references/superpowers/comparison.md +77 -0
  120. package/skills/read-docs/references/superpowers/context.md +71 -0
  121. package/skills/read-docs/references/superpowers/index.md +58 -0
  122. package/skills/read-docs/references/superpowers/parallel.md +49 -0
  123. package/skills/read-docs/references/superpowers/sdd.md +183 -0
  124. package/skills/read-docs/references/superpowers/skills.md +68 -0
  125. package/skills/read-docs/references/superpowers/workflow.md +83 -0
@@ -0,0 +1,65 @@
1
+ import { existsSync, readdirSync, statSync } from 'fs';
2
+ import { join, extname } from 'path';
3
+
4
+ const JSTS_EXTENSIONS = new Set(['.js', '.jsx', '.ts', '.tsx', '.vue', '.mjs', '.cjs']);
5
+ const PY_EXTENSIONS = new Set(['.py']);
6
+ const MAX_SCAN_DEPTH = 10;
7
+ const EXCLUDE_DIRS = new Set([
8
+ 'node_modules', 'dist', 'build', '.git', '__pycache__',
9
+ '.venv', 'venv', '.webwork', 'reports', 'coverage',
10
+ '.next', '.nuxt', '.output', 'eggs', '.eggs',
11
+ ]);
12
+
13
+ export function detectLanguage(rootDir) {
14
+ if (existsSync(join(rootDir, 'package.json'))) {
15
+ return 'jsts';
16
+ }
17
+ if (existsSync(join(rootDir, 'pyproject.toml')) || existsSync(join(rootDir, 'setup.py'))) {
18
+ return 'python';
19
+ }
20
+
21
+ const counts = { jsts: 0, python: 0 };
22
+ _countFiles(rootDir, counts, 0);
23
+
24
+ if (counts.jsts === 0 && counts.python === 0) {
25
+ throw new Error(
26
+ 'No lintable source files found: no package.json, pyproject.toml, or .js/.ts/.py files detected'
27
+ );
28
+ }
29
+
30
+ return counts.jsts >= counts.python ? 'jsts' : 'python';
31
+ }
32
+
33
+ function _countFiles(dir, counts, depth) {
34
+ if (depth > MAX_SCAN_DEPTH) return;
35
+
36
+ let entries;
37
+ try {
38
+ entries = readdirSync(dir);
39
+ } catch {
40
+ return;
41
+ }
42
+
43
+ for (const entry of entries) {
44
+ const fullPath = join(dir, entry);
45
+ let stat;
46
+ try {
47
+ stat = statSync(fullPath);
48
+ } catch {
49
+ continue;
50
+ }
51
+
52
+ if (stat.isDirectory()) {
53
+ if (!EXCLUDE_DIRS.has(entry)) {
54
+ _countFiles(fullPath, counts, depth + 1);
55
+ }
56
+ } else {
57
+ const ext = extname(entry).toLowerCase();
58
+ if (JSTS_EXTENSIONS.has(ext)) {
59
+ counts.jsts++;
60
+ } else if (PY_EXTENSIONS.has(ext)) {
61
+ counts.python++;
62
+ }
63
+ }
64
+ }
65
+ }
@@ -0,0 +1,129 @@
1
+ ---
2
+ name: lint-rules-analyze
3
+ description: |
4
+ 执行 linter 检查并解析 JSON 输出,产出违规清单。按主语言调用对应 linter(eslint/ruff),
5
+ 解析输出为统一的 violations 结构。二元制评分:0 违规=100,1+违规=0。
6
+ 适用:lint agent 的规则分析阶段,用于基线检查和轮尾独立验证。
7
+ 不适用:修复违规(使用 lint-tool-fix / lint-ai-fix)、非 lint 场景的代码分析。
8
+ ---
9
+
10
+ # Lint 规则分析
11
+
12
+ ## 工作流模式
13
+
14
+ 顺序执行,4 个阶段。
15
+
16
+ ## 输入
17
+
18
+ | 参数 | 必填 | 类型 | 说明 |
19
+ |------|------|------|------|
20
+ | target_dir | 是 | string | 检查目标目录路径 |
21
+ | root_dir | 是 | string | 工程根目录路径 |
22
+ | primary_language | 是 | string | 主语言(`jsts` 或 `python`) |
23
+ | config_file_path | 是 | string | lint 配置文件路径 |
24
+
25
+ ## 输出
26
+
27
+ - `violation_count`:违规总数
28
+ - `violations`:违规列表,每条含 `{ file, line, column, rule, severity, message, fixable }`
29
+ - `score`:评分(100 或 0)
30
+
31
+ ## 阶段一:执行 linter
32
+
33
+ 按主语言执行 linter,输出 JSON 格式:
34
+
35
+ | 主语言 | 命令 |
36
+ |--------|------|
37
+ | jsts | `cd {root_dir} && npx eslint {target_dir} --format json` |
38
+ | python | `cd {root_dir} && ruff check {target_dir} --output-format json` |
39
+
40
+ ## 阶段二:解析 JSON 输出
41
+
42
+ ### ESLint JSON 解析
43
+
44
+ ESLint 输出 JSON 数组,每元素含 `filePath` 和 `messages[]`:
45
+
46
+ ```
47
+ 对每条 message 提取:
48
+ - file: filePath(转为相对 root_dir 的相对路径)
49
+ - line: message.line
50
+ - column: message.column
51
+ - rule: message.ruleId
52
+ - severity: message.severity === 2 ? 'error' : 'warning'
53
+ - message: message.message
54
+ - fixable: message.fix != null
55
+ ```
56
+
57
+ ### Ruff JSON 解析
58
+
59
+ Ruff 输出 JSON 数组,每元素含 `code`、`filename`、`location`:
60
+
61
+ ```
62
+ 对每条 violation 提取:
63
+ - file: filename(转为相对 root_dir 的相对路径)
64
+ - line: location[0]
65
+ - column: location[1]
66
+ - rule: code
67
+ - severity: code.startsWith('F') || code.startsWith('E') ? 'error' : 'warning'
68
+ - message: message
69
+ - fixable: fix != null
70
+ ```
71
+
72
+ ## 阶段三:评分计算
73
+
74
+ | 条件 | score |
75
+ |------|-------|
76
+ | violation_count = 0 | 100 |
77
+ | violation_count > 0 | 0 |
78
+
79
+ ## 阶段四:输出报告
80
+
81
+ 输出违规清单和评分。
82
+
83
+ ```
84
+ ## Lint 检查结果
85
+
86
+ - 违规总数: X
87
+ - 评分: 100|0
88
+ - error 数: X
89
+ - warning 数: X
90
+ - 可修复数: X
91
+
92
+ ### 违规明细
93
+ | # | 文件 | 行号 | 规则 | 严重级别 | 描述 | 可修复 |
94
+ |---|------|------|------|---------|------|--------|
95
+ | 1 | src/foo.js | 10 | no-unused-vars | error | 'x' is defined but never used | ✗ |
96
+ ```
97
+
98
+ ## 决策
99
+
100
+ | 条件 | 动作 |
101
+ |------|------|
102
+ | violation_count = 0 | score=100,agent 判断达标 |
103
+ | violation_count > 0 | score=0,agent 判断需修复 |
104
+
105
+ ## 失败处理
106
+
107
+ | 场景 | 处理方式 |
108
+ |------|---------|
109
+ | linter 未安装 | 报错"linter 不可用,请先运行环境检查" |
110
+ | linter exit code 1(有违规) | 正常行为,解析 JSON 输出违规清单 |
111
+ | linter exit code 2(配置错误) | 报错"linter 配置错误" |
112
+ | linter 执行超时 | 报错"检查超时" |
113
+ | JSON 解析失败 | 报错"linter 输出解析失败" |
114
+ | target_dir 不存在 | 报错"检查目录不存在" |
115
+ | 无违规(exit code 0) | 输出 violation_count=0, score=100 |
116
+
117
+ ## 一定要做
118
+
119
+ 1. 使用 JSON 格式输出,便于解析
120
+ 2. 将文件路径转为相对 root_dir 的相对路径
121
+ 3. 统一 violations 数据结构(file/line/column/rule/severity/message/fixable)
122
+ 4. 二元制评分:0 违规=100,1+违规=0
123
+
124
+ ## 一定不要做
125
+
126
+ 1. 不要修复任何违规(只检查)
127
+ 2. 不要修改源码文件
128
+ 3. 不要省略 warning 级别的违规
129
+ 4. 不要执行网络请求
@@ -0,0 +1,84 @@
1
+ ---
2
+ name: lint-suitability-check
3
+ description: |
4
+ 扫描目标目录,筛选出可 lint 的源码文件列表。按主语言扩展名过滤,排除依赖/构建/缓存目录。
5
+ 适用:lint agent 的适用性检查阶段,在环境检查前确定可检查的文件范围。
6
+ 不适用:非 lint 场景的文件筛选、语言检测(使用 lint-language-detect)。
7
+ ---
8
+
9
+ # 可 Lint 文件筛选
10
+
11
+ ## 工作流模式
12
+
13
+ 顺序执行,3 个阶段。
14
+
15
+ ## 输入
16
+
17
+ | 参数 | 必填 | 类型 | 说明 |
18
+ |------|------|------|------|
19
+ | root_dir | 是 | string | 工程根目录路径 |
20
+ | target_dir | 是 | string | 检查目标目录路径 |
21
+ | primary_language | 是 | string | 主语言(`jsts` 或 `python`) |
22
+
23
+ ## 输出
24
+
25
+ - `lintable_files`:可 lint 文件路径列表(相对 root_dir 的相对路径)
26
+ - `file_count`:文件数量
27
+ - `excluded_count`:被排除的文件数量
28
+
29
+ ## 阶段一:确定扩展名过滤集
30
+
31
+ | 主语言 | 匹配扩展名 |
32
+ |--------|-----------|
33
+ | jsts | `.js`、`.jsx`、`.ts`、`.tsx`、`.vue`、`.mjs`、`.cjs` |
34
+ | python | `.py` |
35
+
36
+ ## 阶段二:递归扫描
37
+
38
+ 递归扫描 `target_dir`,排除以下目录:
39
+
40
+ | 排除目录 | 原因 |
41
+ |---------|------|
42
+ | `node_modules/` | 依赖目录 |
43
+ | `dist/`、`build/`、`.output/` | 构建产物 |
44
+ | `.git/` | 版本控制 |
45
+ | `__pycache__/`、`.eggs/` | Python 缓存 |
46
+ | `.venv/`、`venv/` | 虚拟环境 |
47
+ | `.webwork/` | 工具输出目录 |
48
+ | `reports/`、`coverage/` | 报告目录 |
49
+ | `.next/`、`.nuxt/` | 框架缓存 |
50
+
51
+ 最大扫描深度 10 层。
52
+
53
+ ## 阶段三:输出文件清单
54
+
55
+ 将匹配的文件路径转为相对 `root_dir` 的相对路径,输出列表。
56
+
57
+ ## 决策
58
+
59
+ | 条件 | 动作 |
60
+ |------|------|
61
+ | file_count > 0 | 输出文件清单,agent 继续 |
62
+ | file_count = 0 | 输出空列表,agent 退出 |
63
+
64
+ ## 失败处理
65
+
66
+ | 场景 | 处理方式 |
67
+ |------|---------|
68
+ | target_dir 不存在 | 报错"检查目录不存在" |
69
+ | target_dir 是文件 | 对该单文件检查 |
70
+ | 扫描权限不足 | 跳过不可读目录 |
71
+
72
+ ## 一定要做
73
+
74
+ 1. 按主语言扩展名精确过滤
75
+ 2. 排除所有依赖/构建/缓存目录
76
+ 3. 输出相对路径而非绝对路径
77
+ 4. 统计 file_count 供 agent 判断
78
+
79
+ ## 一定不要做
80
+
81
+ 1. 不要扫描 node_modules 等排除目录
82
+ 2. 不要返回非目标语言的文件
83
+ 3. 不要修改任何文件
84
+ 4. 不要执行网络请求
@@ -0,0 +1,94 @@
1
+ ---
2
+ name: lint-tool-fix
3
+ description: |
4
+ 执行 linter 的 --fix 自动修复,然后内部复跑 linter 获取剩余违规清单。
5
+ 只处理 linter 可自动修复的规则,不可修复的规则交由 lint-ai-fix 处理。
6
+ 适用:lint agent 的工具修复阶段,在 AI 修复前先自动修复可修复项。
7
+ 不适用:AI 语义修复(使用 lint-ai-fix)、规则检查(使用 lint-rules-analyze)。
8
+ ---
9
+
10
+ # Lint 工具自动修复
11
+
12
+ ## 工作流模式
13
+
14
+ 顺序执行,3 个阶段。
15
+
16
+ ## 输入
17
+
18
+ | 参数 | 必填 | 类型 | 说明 |
19
+ |------|------|------|------|
20
+ | target_dir | 是 | string | 检查目标目录路径 |
21
+ | root_dir | 是 | string | 工程根目录路径 |
22
+ | primary_language | 是 | string | 主语言(`jsts` 或 `python`) |
23
+ | config_file_path | 是 | string | lint 配置文件路径 |
24
+
25
+ ## 输出
26
+
27
+ - `tool_fixed_count`:自动修复的违规数
28
+ - `remaining_violations`:修复后剩余的违规列表(结构同 lint-rules-analyze 的 violations)
29
+
30
+ ## 阶段一:执行 --fix
31
+
32
+ 按主语言执行 linter 的自动修复命令:
33
+
34
+ | 主语言 | 命令 |
35
+ |--------|------|
36
+ | jsts | `cd {root_dir} && npx eslint {target_dir} --fix` |
37
+ | python | `cd {root_dir} && ruff check {target_dir} --fix` |
38
+
39
+ `--fix` 会自动修复所有可自动修复的违规。不可自动修复的规则不受影响。
40
+
41
+ ## 阶段二:复跑 linter 获取剩余违规
42
+
43
+ 修复后重新执行 linter 检查(同 lint-rules-analyze 的命令),获取剩余违规:
44
+
45
+ | 主语言 | 命令 |
46
+ |--------|------|
47
+ | jsts | `cd {root_dir} && npx eslint {target_dir} --format json` |
48
+ | python | `cd {root_dir} && ruff check {target_dir} --output-format json` |
49
+
50
+ 解析 JSON 输出为 `remaining_violations`(结构与 lint-rules-analyze 一致)。
51
+
52
+ ## 阶段三:输出
53
+
54
+ ```
55
+ ## 工具修复结果
56
+
57
+ - 自动修复数: X
58
+ - 剩余违规数: X
59
+ - 剩余可修复数: X(理论上应为 0,--fix 已尽力修复)
60
+ - 剩余不可修复数: X(需 AI 修复)
61
+
62
+ ### 剩余违规明细
63
+ | # | 文件 | 行号 | 规则 | 严重级别 | 描述 | 可修复 |
64
+ |---|------|------|------|---------|------|--------|
65
+ | 1 | src/foo.js | 10 | no-unused-vars | error | ... | ✗ |
66
+ ```
67
+
68
+ ## 决策
69
+
70
+ | 条件 | 动作 |
71
+ |------|------|
72
+ | remaining_violations 为空 | agent 回到轮尾评分(final_count 应为 0 → 达标) |
73
+ | remaining_violations 非空 | agent 进入 AI 修复(Step 8) |
74
+
75
+ ## 失败处理
76
+
77
+ | 场景 | 处理方式 |
78
+ |------|---------|
79
+ | --fix 执行失败 | 报错,agent 跳过工具修复直接进入 AI 修复 |
80
+ | 复跑 linter 失败 | 报错,remaining_violations 设为空列表,agent 将在轮尾独立验证中获取真实违规数 |
81
+ | linter 未安装 | 报错退出 |
82
+
83
+ ## 一定要做
84
+
85
+ 1. --fix 后必须复跑 linter 获取剩余违规
86
+ 2. 输出 remaining_violations 的数据结构与 lint-rules-analyze 一致
87
+ 3. 统计 tool_fixed_count(修复前违规数 - 修复后违规数)
88
+
89
+ ## 一定不要做
90
+
91
+ 1. 不要执行 AI 语义修复(那是 lint-ai-fix 的职责)
92
+ 2. 不要修改 linter 配置文件
93
+ 3. 不要跳过复跑 linter 步骤
94
+ 4. 不要执行网络请求
@@ -0,0 +1,227 @@
1
+ ---
2
+ name: new-skill
3
+ description: |
4
+ 交互式引导创建符合最佳实践的 OpenCode Skill 定义文件,基于 blame-skill 评分规则逐项收集信息并生成高质量 SKILL.md。
5
+ 提供:交互式引导流程、工作流模式参考、SKILL.md 模板、自动评分验证。
6
+ 适用:新建 Skill 定义、Skill 脚手架生成、从零创建规范技能。
7
+ 不适用:修改已有 Skill(使用 better-skill)、审查 Skill 质量(使用 blame-skill)、非 SKILL.md 文件创建。
8
+ ---
9
+
10
+ # Skill 创建向导
11
+
12
+ ## 工作流模式
13
+
14
+ 本 Skill 采用 **上下文感知** 工作流:
15
+
16
+ 1. **收集**:通过交互式问答逐项收集 Skill 定义所需信息
17
+ 2. **决策**:根据收集的信息选择工作流模式和步骤设计
18
+ 3. **生成**:基于模板和收集的信息生成 SKILL.md 及 references/ 文件
19
+ 4. **验证**:调用 blame-skill 评分,确保达到 B 级(75分)以上
20
+
21
+ ## 输入
22
+
23
+ | 参数 | 必填 | 类型 | 说明 |
24
+ |------|------|------|------|
25
+ | name | 是 | 字符串 | Skill 名称,须符合 `^[a-z0-9]+(-[a-z0-9]+)*$` 格式 |
26
+ | 其他信息 | 否 | 交互收集 | 通过阶段一的问答逐步收集,用户也可一次性提供 |
27
+
28
+ ## 输出
29
+
30
+ - `packages/agent/src/skills/<name>/SKILL.md` — Skill 定义文件
31
+ - `packages/agent/src/skills/<name>/references/` — 参考文档目录(如需要)
32
+ - 创建报告(含 blame-skill 评分结果)
33
+
34
+ ---
35
+
36
+ ## 阶段一:收集
37
+
38
+ **输入**:用户提供的 name 参数(或全部信息)
39
+
40
+ **操作**:通过交互式问答,逐项收集 Skill 定义的 6 类信息。如果用户在调用时已提供完整信息,则跳过对应问答。
41
+
42
+ ### 1.1 基本信息(对应 Frontmatter 规范 15 分)
43
+
44
+ 向用户收集:
45
+
46
+ | # | 问题 | 对应字段 | 约束 |
47
+ |---|------|---------|------|
48
+ | 1 | Skill 名称? | name | 必须符合 `^[a-z0-9]+(-[a-z0-9]+)*$`,与目录名一致 |
49
+ | 2 | 一句话描述核心能力? | description.具体能力 | 如"根据X规则对Y执行Z操作" |
50
+ | 3 | 适用场景? | description.适用 | 如"首次执行、定期扫描、问题修复" |
51
+ | 4 | 不适用场景? | description.不适用 | 如"功能逻辑Bug修复、性能优化" |
52
+ | 5 | 提供的资源? | description.提供 | 如"规则库、修复策略、迭代验证" |
53
+
54
+ **description 拼接规则**:将 2-5 的回答拼接为完整 description,控制在 50-300 字符:
55
+ ```
56
+ {{核心能力}}。提供:{{提供资源}}。适用:{{适用场景}}。不适用:{{不适用场景}}。
57
+ ```
58
+
59
+ ### 1.2 工作流模式(对应工作流匹配 20 分)
60
+
61
+ 向用户收集:
62
+
63
+ | # | 问题 | 说明 |
64
+ |---|------|------|
65
+ | 6 | Skill 的核心执行逻辑是哪种? | 展示 5 种工作流模式供选择 |
66
+
67
+ **展示选项**(读取 `references/workflow-patterns.md` 中的摘要):
68
+
69
+ | 模式 | 特征 | 典型场景 |
70
+ |------|------|---------|
71
+ | 顺序工作流 | 步骤按固定顺序执行,无循环 | 提交流程、部署、迁移 |
72
+ | 迭代优化 | 执行→检查→改进→再检查,循环直到达标 | 质量修复、评分达标 |
73
+ | 多 MCP 协调 | 协调多个外部技能/工具 | 跨系统操作、多技能编排 |
74
+ | 上下文感知 | 根据运行时条件动态选择路径 | 条件分支、多模式切换 |
75
+ | 领域智能 | 基于知识库推理匹配 | 规则匹配、智能推荐 |
76
+
77
+ 用户选择后,告知该模式的必要定义项(如迭代优化需定义目标条件和最大迭代次数)。
78
+
79
+ ### 1.3 步骤设计(对应工作流完整性 5 分 + 指令可执行 3 分)
80
+
81
+ 向用户收集:
82
+
83
+ | # | 问题 | 说明 |
84
+ |---|------|------|
85
+ | 7 | 列出 Skill 的主要执行步骤 | 每个步骤用一句话描述做什么 |
86
+ | 8 | 每个步骤的输入和输出分别是什么? | 如"输入:规则列表;输出:违规项清单" |
87
+ | 9 | 哪些步骤之间有循环? | 仅迭代优化模式需要,定义循环条件和终止策略 |
88
+
89
+ **步骤设计原则**:
90
+ - 每个步骤必须有明确的输入和输出
91
+ - 步骤粒度适中:太粗("处理文件")→ 拆分;太细("读取第1行")→ 合并
92
+ - 迭代类步骤必须定义:目标条件、最大迭代次数、终止策略
93
+ - 协调类步骤必须定义:调用的技能/工具、数据传递方式
94
+
95
+ ### 1.4 输入输出规范(对应输入输出规范 5 分)
96
+
97
+ 向用户收集:
98
+
99
+ | # | 问题 | 说明 |
100
+ |---|------|------|
101
+ | 10 | Skill 接受哪些参数? | 参数名、是否必填、类型、说明 |
102
+ | 11 | Skill 产生哪些输出? | 输出文件、报告格式、副作用 |
103
+
104
+ ### 1.5 失败处理(对应失败处理 4 分)
105
+
106
+ 向用户收集:
107
+
108
+ | # | 问题 | 说明 |
109
+ |---|------|------|
110
+ | 12 | 可能遇到哪些失败场景? | 文件不存在、语法错误、外部调用失败等 |
111
+ | 13 | 每种失败如何处理? | 回滚、重试、降级、跳过、人工介入 |
112
+
113
+ ### 1.6 边界与资源(对应边界说明 5 分 + 渐进式加载 5 分)
114
+
115
+ 向用户收集:
116
+
117
+ | # | 问题 | 说明 |
118
+ |---|------|------|
119
+ | 14 | 一定要做的事情? | 列出 3-8 条核心约束 |
120
+ | 15 | 一定不要做的事情? | 列出 3-8 条禁止项 |
121
+ | 16 | 是否有大量参考数据? | 如规则库、模板、配置等,有则放入 references/ |
122
+
123
+ **输出**:完整的 Skill 定义信息清单
124
+
125
+ ---
126
+
127
+ ## 阶段二:生成
128
+
129
+ **输入**:阶段一收集的完整信息清单
130
+
131
+ **操作**:基于 `references/template.md` 模板和收集的信息,生成 SKILL.md 文件
132
+
133
+ **生成规则**:
134
+
135
+ 1. **Frontmatter**:按模板格式拼接 name 和 description
136
+ 2. **工作流声明**:在正文开头(一级标题后)添加工作流模式声明,列出步骤编号和名称
137
+ 3. **输入输出表**:生成参数表和输出说明
138
+ 4. **步骤正文**:每个步骤包含 `输入`/`操作`/`输出`/`失败`(如适用)四要素
139
+ 5. **失败处理表**:汇总所有失败场景和处理方式
140
+ 6. **一定要做/一定不要做**:列表格式
141
+ 7. **references/ 目录**:如果用户提供了大量参考数据(规则库、模板等),创建对应文件
142
+ 8. **行数控制**:主文件(SKILL.md)控制在 200 行以内,超出部分拆分到 references/
143
+
144
+ **输出**:
145
+ - `packages/agent/src/skills/<name>/SKILL.md`
146
+ - `packages/agent/src/skills/<name>/references/` 目录及文件(如需要)
147
+
148
+ ---
149
+
150
+ ## 阶段三:验证
151
+
152
+ **输入**:生成的 SKILL.md 文件路径
153
+
154
+ **操作**:调用 blame-skill 对生成的 Skill 进行审计评分
155
+
156
+ **输出**:评分结果
157
+
158
+ **决策**:
159
+
160
+ | 条件 | 动作 |
161
+ |------|------|
162
+ | 得分 >= 75(B 级) | 输出创建报告,流程结束 |
163
+ | 得分 < 75 且迭代次数 < 3 | 调用 better-skill 自动优化,回到验证 |
164
+ | 得分 < 75 且迭代次数 >= 3 | 输出创建报告(含未达标说明和改进建议),流程结束 |
165
+
166
+ ---
167
+
168
+ ## 阶段四:输出
169
+
170
+ **输入**:生成的文件 + 评分结果
171
+
172
+ **操作**:生成创建报告
173
+
174
+ **输出**:
175
+
176
+ ```markdown
177
+ ## Skill 创建报告:[name]
178
+
179
+ ### 生成文件
180
+ - SKILL.md:[行数] 行
181
+ - references/:[文件列表]
182
+
183
+ ### 评分结果
184
+ - 得分:XX / 100(等级:X)
185
+ - 各项得分:[来自 blame-skill 的分项得分]
186
+
187
+ ### 后续建议
188
+ - [如有未达标项,列出改进建议]
189
+ - 可使用 better-skill 进一步优化至 A 级
190
+ ```
191
+
192
+ ---
193
+
194
+ ## 失败处理
195
+
196
+ | 场景 | 处理方式 |
197
+ |------|---------|
198
+ | name 不符合命名规范 | 提示格式要求,要求用户重新输入 |
199
+ | 同名 Skill 已存在 | 提示用户确认是否覆盖,确认后继续 |
200
+ | 用户信息不完整 | 根据已有信息推断缺失项,用默认值填充并提示用户确认 |
201
+ | blame-skill 评分失败 | 跳过验证阶段,直接输出文件和手动验证建议 |
202
+ | better-skill 优化失败 | 输出当前文件和改进建议,由用户手动修改 |
203
+
204
+ ## 一定要做
205
+
206
+ 1. 按阶段一的问题顺序逐项收集信息,确保 6 类信息完整
207
+ 2. 用户已提供的信息不重复询问
208
+ 3. description 拼接后控制在 50-300 字符,包含具体能力、适用场景、不适用场景、提供资源
209
+ 4. 工作流模式必须从 5 种标准模式中选择
210
+ 5. 每个步骤必须定义输入和输出
211
+ 6. 生成的 SKILL.md 必须包含工作流声明、输入输出表、失败处理、一定要做/一定不要做
212
+ 7. 主文件控制在 200 行以内,超出部分拆分到 references/
213
+ 8. 生成后必须调用 blame-skill 验证评分
214
+
215
+ ## 一定不要做
216
+
217
+ 1. 不要跳过交互收集直接生成(除非用户提供了完整信息)
218
+ 2. 不要使用 5 种标准工作流以外的自定义模式
219
+ 3. 不要生成没有输入输出定义的步骤
220
+ 4. 不要在 description 中省略适用场景或不适用场景
221
+ 5. 不要生成超过 200 行且无 references/ 拆分的 SKILL.md
222
+ 6. 不要修改 blame-skill 的评分规则或 better-skill 的优化逻辑
223
+
224
+ ## 参考资源
225
+
226
+ - `references/template.md`:SKILL.md 生成模板
227
+ - `references/workflow-patterns.md`:5 种工作流模式详细参考
@@ -0,0 +1,53 @@
1
+ # Skill 模板
2
+
3
+ 本文件为 new-skill 技能使用的 SKILL.md 生成模板。`{{占位符}}` 由收集的信息填充。
4
+
5
+ ---
6
+
7
+ ```yaml
8
+ ---
9
+ name: {{name}}
10
+ description: |
11
+ {{description_capability}}。提供:{{description_resources}}。适用:{{description_applicable}}。不适用:{{description_not_applicable}}。
12
+ ---
13
+ ```
14
+
15
+ ```markdown
16
+ # {{title}}
17
+
18
+ ## 工作流模式
19
+
20
+ 本 Skill 采用 **{{workflow_type}}** 工作流:
21
+
22
+ {{workflow_steps}}
23
+
24
+ ## 输入
25
+
26
+ | 参数 | 必填 | 类型 | 说明 |
27
+ |------|------|------|------|
28
+ {{input_rows}}
29
+
30
+ ## 输出
31
+
32
+ {{output_desc}}
33
+
34
+ ---
35
+
36
+ {{stages}}
37
+
38
+ ---
39
+
40
+ ## 失败处理
41
+
42
+ | 场景 | 处理方式 |
43
+ |------|---------|
44
+ {{failure_rows}}
45
+
46
+ ## 一定要做
47
+
48
+ {{must_do_items}}
49
+
50
+ ## 一定不要做
51
+
52
+ {{must_not_do_items}}
53
+ ```