cgraphx 1.1.0 → 1.3.0

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 (201) hide show
  1. package/README.md +0 -1
  2. package/dist/.claude-template/hooks/precommit-check/precommit-check.cjs +90 -0
  3. package/dist/.claude-template/skills/cgraphx/SKILL.md +3 -3
  4. package/dist/.claude-template/skills/cgraphx/agent-prompt.md +1 -1
  5. package/dist/.claude-template/skills/cgraphx-guide/SKILL.md +94 -0
  6. package/dist/.claude-template/skills/cgraphx-guide/how-to-use.html +424 -0
  7. package/dist/.claude-template/skills/clarify-requirements/SKILL.md +19 -8
  8. package/dist/.claude-template/skills/code-impact-docgen/SKILL.md +186 -176
  9. package/dist/.claude-template/skills/code-impact-docgen/template-design-html.md +357 -0
  10. package/dist/.claude-template/skills/code-impact-docgen/template-design-md.md +164 -0
  11. package/dist/.claude-template/skills/code-impact-init/SKILL.md +47 -47
  12. package/dist/.claude-template/skills/developer-timeline/SKILL.md +9 -0
  13. package/dist/.claude-template/skills/precommit-review/SKILL.md +50 -0
  14. package/dist/.claude-template/skills/run-api-test/SKILL.md +187 -0
  15. package/dist/.claude-template/skills/run-api-test/assets/template-test-report.md +103 -0
  16. package/dist/.claude-template/skills/run-api-test/assets/template-test-verify.jsonl +5 -0
  17. package/dist/.claude-template/skills/run-api-test/references/bru-run.md +60 -0
  18. package/dist/.claude-template/skills/run-api-test/references/db-verification.md +81 -0
  19. package/dist/.claude-template/skills/run-api-test/references/report-format.md +104 -0
  20. package/dist/.claude-template/skills/run-api-test/references/service-readiness.md +61 -0
  21. package/dist/.claude-template/skills/run-api-test/references/test-scope.md +64 -0
  22. package/dist/.claude-template/skills/write-api/SKILL.md +150 -0
  23. package/dist/.claude-template/skills/write-api/assets/template-api-spec.md +112 -0
  24. package/dist/.claude-template/skills/write-api/assets/template-request.bru +75 -0
  25. package/dist/.claude-template/skills/write-api/references/ai-prompts.md +133 -0
  26. package/dist/.claude-template/skills/write-api/references/api-spec-format.md +108 -0
  27. package/dist/.claude-template/skills/write-api/references/bru-format.md +144 -0
  28. package/dist/.claude-template/skills/write-api/references/collection-layout.md +81 -0
  29. package/dist/.claude-template/skills/write-api/references/environment-setup.md +105 -0
  30. package/dist/.claude-template/skills/write-api/references/interface-scope.md +74 -0
  31. package/dist/.claude-template/skills/write-api-doc/SKILL.md +317 -0
  32. package/dist/.claude-template/skills/write-api-doc/template-api-html.md +422 -0
  33. package/dist/.claude-template/skills/write-plan/SKILL.md +38 -16
  34. package/dist/.claude-template/skills/write-prd/SKILL.md +32 -8
  35. package/dist/.claude-template/skills/write-spec/SKILL.md +34 -9
  36. package/dist/api-test/ai-fields.d.ts +37 -0
  37. package/dist/api-test/ai-fields.d.ts.map +1 -0
  38. package/dist/api-test/ai-fields.js +114 -0
  39. package/dist/api-test/ai-fields.js.map +1 -0
  40. package/dist/api-test/assemble.d.ts +76 -0
  41. package/dist/api-test/assemble.d.ts.map +1 -0
  42. package/dist/api-test/assemble.js +185 -0
  43. package/dist/api-test/assemble.js.map +1 -0
  44. package/dist/api-test/bru-cli-invoker.d.ts +72 -0
  45. package/dist/api-test/bru-cli-invoker.d.ts.map +1 -0
  46. package/dist/api-test/bru-cli-invoker.js +169 -0
  47. package/dist/api-test/bru-cli-invoker.js.map +1 -0
  48. package/dist/api-test/bru-report-parser.d.ts +24 -0
  49. package/dist/api-test/bru-report-parser.d.ts.map +1 -0
  50. package/dist/api-test/bru-report-parser.js +110 -0
  51. package/dist/api-test/bru-report-parser.js.map +1 -0
  52. package/dist/api-test/bru-runner.d.ts +101 -0
  53. package/dist/api-test/bru-runner.d.ts.map +1 -0
  54. package/dist/api-test/bru-runner.js +316 -0
  55. package/dist/api-test/bru-runner.js.map +1 -0
  56. package/dist/api-test/bru-writer.d.ts +52 -0
  57. package/dist/api-test/bru-writer.d.ts.map +1 -0
  58. package/dist/api-test/bru-writer.js +159 -0
  59. package/dist/api-test/bru-writer.js.map +1 -0
  60. package/dist/api-test/call-chain-extractor.d.ts +80 -0
  61. package/dist/api-test/call-chain-extractor.d.ts.map +1 -0
  62. package/dist/api-test/call-chain-extractor.js +179 -0
  63. package/dist/api-test/call-chain-extractor.js.map +1 -0
  64. package/dist/api-test/cli.d.ts +133 -0
  65. package/dist/api-test/cli.d.ts.map +1 -0
  66. package/dist/api-test/cli.js +1009 -0
  67. package/dist/api-test/cli.js.map +1 -0
  68. package/dist/api-test/config.d.ts +75 -0
  69. package/dist/api-test/config.d.ts.map +1 -0
  70. package/dist/api-test/config.js +406 -0
  71. package/dist/api-test/config.js.map +1 -0
  72. package/dist/api-test/db-query-cli.d.ts +51 -0
  73. package/dist/api-test/db-query-cli.d.ts.map +1 -0
  74. package/dist/api-test/db-query-cli.js +119 -0
  75. package/dist/api-test/db-query-cli.js.map +1 -0
  76. package/dist/api-test/enhance-prepare.d.ts +111 -0
  77. package/dist/api-test/enhance-prepare.d.ts.map +1 -0
  78. package/dist/api-test/enhance-prepare.js +425 -0
  79. package/dist/api-test/enhance-prepare.js.map +1 -0
  80. package/dist/api-test/enhance-write.d.ts +28 -0
  81. package/dist/api-test/enhance-write.d.ts.map +1 -0
  82. package/dist/api-test/enhance-write.js +145 -0
  83. package/dist/api-test/enhance-write.js.map +1 -0
  84. package/dist/api-test/errors.d.ts +48 -0
  85. package/dist/api-test/errors.d.ts.map +1 -0
  86. package/dist/api-test/errors.js +76 -0
  87. package/dist/api-test/errors.js.map +1 -0
  88. package/dist/api-test/field-extractor.d.ts +98 -0
  89. package/dist/api-test/field-extractor.d.ts.map +1 -0
  90. package/dist/api-test/field-extractor.js +327 -0
  91. package/dist/api-test/field-extractor.js.map +1 -0
  92. package/dist/api-test/impl-finder.d.ts +37 -0
  93. package/dist/api-test/impl-finder.d.ts.map +1 -0
  94. package/dist/api-test/impl-finder.js +54 -0
  95. package/dist/api-test/impl-finder.js.map +1 -0
  96. package/dist/api-test/index.d.ts +41 -0
  97. package/dist/api-test/index.d.ts.map +1 -0
  98. package/dist/api-test/index.js +124 -0
  99. package/dist/api-test/index.js.map +1 -0
  100. package/dist/api-test/java-parser.d.ts +89 -0
  101. package/dist/api-test/java-parser.d.ts.map +1 -0
  102. package/dist/api-test/java-parser.js +508 -0
  103. package/dist/api-test/java-parser.js.map +1 -0
  104. package/dist/api-test/md-writer.d.ts +49 -0
  105. package/dist/api-test/md-writer.d.ts.map +1 -0
  106. package/dist/api-test/md-writer.js +202 -0
  107. package/dist/api-test/md-writer.js.map +1 -0
  108. package/dist/api-test/parser-httpservice.d.ts +91 -0
  109. package/dist/api-test/parser-httpservice.d.ts.map +1 -0
  110. package/dist/api-test/parser-httpservice.js +271 -0
  111. package/dist/api-test/parser-httpservice.js.map +1 -0
  112. package/dist/api-test/report.d.ts +188 -0
  113. package/dist/api-test/report.d.ts.map +1 -0
  114. package/dist/api-test/report.js +522 -0
  115. package/dist/api-test/report.js.map +1 -0
  116. package/dist/api-test/snapshot.d.ts +26 -0
  117. package/dist/api-test/snapshot.d.ts.map +1 -0
  118. package/dist/api-test/snapshot.js +150 -0
  119. package/dist/api-test/snapshot.js.map +1 -0
  120. package/dist/api-test/test-history.d.ts +48 -0
  121. package/dist/api-test/test-history.d.ts.map +1 -0
  122. package/dist/api-test/test-history.js +122 -0
  123. package/dist/api-test/test-history.js.map +1 -0
  124. package/dist/api-test/types.d.ts +174 -0
  125. package/dist/api-test/types.d.ts.map +1 -0
  126. package/dist/api-test/types.js +13 -0
  127. package/dist/api-test/types.js.map +1 -0
  128. package/dist/api-test/verify-prepare.d.ts +30 -0
  129. package/dist/api-test/verify-prepare.d.ts.map +1 -0
  130. package/dist/api-test/verify-prepare.js +150 -0
  131. package/dist/api-test/verify-prepare.js.map +1 -0
  132. package/dist/api-test/verify-write.d.ts +31 -0
  133. package/dist/api-test/verify-write.d.ts.map +1 -0
  134. package/dist/api-test/verify-write.js +159 -0
  135. package/dist/api-test/verify-write.js.map +1 -0
  136. package/dist/bin/codegraph.js +0 -100
  137. package/dist/bin/codegraph.js.map +1 -1
  138. package/dist/dbquery/dump-schema.d.ts +46 -0
  139. package/dist/dbquery/dump-schema.d.ts.map +1 -0
  140. package/dist/dbquery/dump-schema.js +379 -0
  141. package/dist/dbquery/dump-schema.js.map +1 -0
  142. package/dist/installer/targets/claude.d.ts +15 -0
  143. package/dist/installer/targets/claude.d.ts.map +1 -1
  144. package/dist/installer/targets/claude.js +53 -0
  145. package/dist/installer/targets/claude.js.map +1 -1
  146. package/dist/resolution/index.d.ts.map +1 -1
  147. package/dist/resolution/index.js +13 -0
  148. package/dist/resolution/index.js.map +1 -1
  149. package/dist/resolution/scope-index.d.ts +86 -0
  150. package/dist/resolution/scope-index.d.ts.map +1 -0
  151. package/dist/resolution/scope-index.js +143 -0
  152. package/dist/resolution/scope-index.js.map +1 -0
  153. package/dist/resolution/stdlib-blocklist.d.ts +53 -0
  154. package/dist/resolution/stdlib-blocklist.d.ts.map +1 -0
  155. package/dist/resolution/stdlib-blocklist.js +143 -0
  156. package/dist/resolution/stdlib-blocklist.js.map +1 -0
  157. package/dist/search/ast-helpers.d.ts +42 -0
  158. package/dist/search/ast-helpers.d.ts.map +1 -0
  159. package/dist/search/ast-helpers.js +106 -0
  160. package/dist/search/ast-helpers.js.map +1 -0
  161. package/dist/search/call-sites.d.ts +398 -0
  162. package/dist/search/call-sites.d.ts.map +1 -0
  163. package/dist/search/call-sites.js +1433 -0
  164. package/dist/search/call-sites.js.map +1 -0
  165. package/dist/search/context.d.ts +134 -0
  166. package/dist/search/context.d.ts.map +1 -0
  167. package/dist/search/context.js +575 -0
  168. package/dist/search/context.js.map +1 -0
  169. package/dist/search/impact.d.ts +139 -0
  170. package/dist/search/impact.d.ts.map +1 -0
  171. package/dist/search/impact.js +646 -0
  172. package/dist/search/impact.js.map +1 -0
  173. package/dist/search/related.d.ts +178 -0
  174. package/dist/search/related.d.ts.map +1 -0
  175. package/dist/search/related.js +667 -0
  176. package/dist/search/related.js.map +1 -0
  177. package/dist/search/slice.d.ts +148 -0
  178. package/dist/search/slice.d.ts.map +1 -0
  179. package/dist/search/slice.js +460 -0
  180. package/dist/search/slice.js.map +1 -0
  181. package/dist/search/snr-constants.d.ts +41 -0
  182. package/dist/search/snr-constants.d.ts.map +1 -0
  183. package/dist/search/snr-constants.js +44 -0
  184. package/dist/search/snr-constants.js.map +1 -0
  185. package/dist/search/types.d.ts +28 -0
  186. package/dist/search/types.d.ts.map +1 -0
  187. package/dist/search/types.js +12 -0
  188. package/dist/search/types.js.map +1 -0
  189. package/dist/timeline/cli.d.ts.map +1 -1
  190. package/dist/timeline/cli.js +22 -3
  191. package/dist/timeline/cli.js.map +1 -1
  192. package/dist/timeline/store.d.ts +5 -0
  193. package/dist/timeline/store.d.ts.map +1 -1
  194. package/dist/timeline/store.js +23 -3
  195. package/dist/timeline/store.js.map +1 -1
  196. package/package.json +1 -1
  197. package/scripts/agent-eval/subagent-token-cost.py +188 -0
  198. package/dist/.claude-template/skills/code-impact-docgen/template-business-html.md +0 -242
  199. package/dist/.claude-template/skills/code-impact-docgen/template-business-md.md +0 -107
  200. package/dist/.claude-template/skills/code-impact-docgen/template-technical-html.md +0 -205
  201. package/dist/.claude-template/skills/code-impact-docgen/template-technical-md.md +0 -155
@@ -0,0 +1,317 @@
1
+ ---
2
+ name: write-api-doc
3
+ description: 在 feature 接口开发完毕后(可选环节),从 spec 的接口章节 + 实际代码反向提取,生成静态只读 HTML 接口文档,默认输出到 docs/features/<feature-id>/<文件前缀>-接口文档.html。覆盖本次 feature 新增的接口(严格新增,不含修改),支持 Node/Python/Java/Go/Rust/C#/PHP/Ruby 主流 web 框架。不依赖 cgraphx 索引、不做交互式 Swagger、不重新定义 spec。
4
+ ---
5
+
6
+ # Write API Doc
7
+
8
+ ## 定位
9
+
10
+ 把 feature 实际落地的新增接口,整理成**静态只读 HTML 接口文档**,作为事后技术沉淀归档到 feature 目录。
11
+
12
+ 接口文档的目标是让后续维护者、对接方、测试、新成员快速看懂本 feature 加了哪些接口、怎么调、返回什么、出错怎么办。接口文档**不重新定义 spec 已锁定的契约**,只是事实沉淀。
13
+
14
+ <HARD-GATE>
15
+ 不要重新定义 spec 已锁定的接口契约、参数语义、错误码、权限边界。如果发现 spec 与代码现实不符,标注【待确认】而不是自行解释。
16
+ 不要编造未在代码或 spec 中体现的接口、参数、响应字段或错误码。
17
+ 范围严格限定"本次 feature 新增的接口",不得自行扩展到修改的老接口或全项目接口。
18
+ 不依赖 cgraphx 索引;不调用 codegraph_explore / cgraphx CLI;只用 grep + Read。
19
+ </HARD-GATE>
20
+
21
+ ## Trigger
22
+
23
+ 使用此 skill 当:
24
+
25
+ - 用户完成 feature 接口开发后,要求"生成接口文档"、"写 API 文档"、"整理一份 HTML 接口文档"
26
+ - 用户说"自测完了,接口文档沉淀一下"、"该写接口文档了"
27
+ - 用户要求把 feature 新增的接口整理成可分享的 HTML 文档
28
+
29
+ 不要使用此 skill 当:
30
+
31
+ - 写 spec(使用 `write-spec` skill,接口文档不重新定义规格契约)
32
+ - 写设计文档(使用 `code-impact-docgen` skill,设计文档覆盖架构/模块/决策,接口文档只覆盖接口)
33
+ - 探索陌生项目(使用 `code-impact-init` skill)
34
+ - 查询代码调用关系(使用 `cgraphx` skill 或 `codegraph_explore` MCP)
35
+
36
+ ## 与 code-impact-docgen 的边界
37
+
38
+ | 维度 | write-api-doc | code-impact-docgen |
39
+ |---|---|---|
40
+ | 主题 | 仅接口 | 整个 feature 的设计(架构/模块/决策/限制/扩展) |
41
+ | 来源 | spec 接口章节 + 代码 | knowledge + spec + plan |
42
+ | 产物 | `<前缀>-接口文档.html` | `<前缀>-设计文档.md`(或 .html) |
43
+ | 触发时机 | 接口开发完毕即可 | 自测通过后 |
44
+ | 关系 | 独立产物,与设计文档并列 | 独立产物,与接口文档并列 |
45
+
46
+ 两个 skill 互不替代;同一个 feature 可以同时产出设计文档和接口文档,各自服务不同读者。
47
+
48
+ ## 依赖
49
+
50
+ - 当前 feature 目录下有 spec(`docs/features/<feature-id>/<文件前缀>-spec.md`)
51
+ - 用户能提供"本次 feature 改动涉及哪些文件或接口前缀"的提示(若不提供,skill 启动时询问)
52
+
53
+ ## feature-id 与文件前缀规则
54
+
55
+ **feature-id 识别(优先级从高到低)**:
56
+
57
+ 1. 用户调用时显式传 feature-id 或输出路径参数 → 使用用户指定
58
+ 2. skill 自动从 cwd 向上探测最近的 `docs/features/<feature-id>/` 目录 → 使用探测结果
59
+ 3. 都失败 → skill 报错并要求用户显式传 feature-id 或输出路径
60
+
61
+ **文件前缀算法**(与 write-prd / write-spec / write-plan / docgen 一致):
62
+
63
+ feature-id 格式:`YYYY-MM-DD-[业务ID-]<标题>`
64
+
65
+ - 有业务ID:文件前缀 = `<业务ID>-<标题>`(如 `CRM-req19230-号百商品详情查询接口`)
66
+ - 无业务ID:文件前缀 = `<标题>`(如 `features目录结构调整`)
67
+
68
+ 业务ID 段允许字母数字 + 连字符;标题段允许中文、英文或混合。**不得**对中文做英文 slug 转换。
69
+
70
+ 文件名不得包含 `/`、`:`、`*`、`?`、`"`、`<`、`>`、`|`;若含敏感字符,要求用户重命名,不自动替换。
71
+
72
+ **默认输出路径**:`docs/features/<feature-id>/<文件前缀>-接口文档.html`
73
+
74
+ 用户可显式参数覆盖默认路径。
75
+
76
+ ## 工作流
77
+
78
+ 在写任何 api-doc 内容前,**必须**先与用户确认两件事:
79
+
80
+ 1. **业务 ID**:本次需求是否有对应的工单号 / 需求单号 / 项目代号?允许留空,但**留空也必须显式确认**(用户明确说"没有/留空"),不得默认跳过。
81
+ 2. **标题语言**:用中文 / 英文 / 中英混合?由用户选定,**禁止** Agent 因为"目录看起来更整齐"/"和现有 feature 命名一致"/"避免中文路径问题"等原因,擅自把中文需求转成英文 slug。
82
+
83
+ - 用户主动给过完整 feature-id 或文件名 → 直接复用,跳过本步。
84
+ - 用户用 `/write-api-doc` 触发但未给命名决策 → **第一步就问这两个问题**,问完再写。
85
+ - 不得"先写 api-doc 内容,命名最后再说"。命名决策必须在内容产出之前落定,否则会在文件名上反复返工。
86
+
87
+ ### 第一步:确认需求与识别 feature-id
88
+
89
+ 向用户确认(如果未明确指定):
90
+
91
+ 1. **feature-id / 输出路径** — 默认按上方规则识别,用户可覆盖
92
+ 2. **本次 feature 改动涉及哪些文件或接口前缀** — 用于界定"新增接口"的范围
93
+ - 用户可给:文件列表、模块路径、路由前缀(如 `/api/v2/`、`/admin/users`)、handler 函数名等
94
+ - 用户给的越精确,skill 越快锁定
95
+ 3. **可选:补充章节** — 用户可指定排除某些章节或追加自定义章节
96
+
97
+ ### 第二步:读 spec 拿业务口径
98
+
99
+ Read `docs/features/<feature-id>/<文件前缀>-spec.md`,重点关注:
100
+
101
+ - "接口、页面与系统边界"章节 — 拿到本 feature 声明的接口清单、业务输入输出、权限边界、错误语义
102
+ - "数据、状态与口径"章节 — 拿到字段语义和状态枚举
103
+ - "权限、安全与审计"章节 — 拿到鉴权方式和数据可见性
104
+ - "异常与边界场景"章节 — 拿到错误码和异常处理
105
+
106
+ 如果 spec 里没有专门的接口章节,如实记录"spec 未明确接口清单,从代码反向提取"。
107
+
108
+ ### 第三步:grep 找路由注册点
109
+
110
+ 根据用户提示的文件/模块范围,在代码里 grep 路由注册点。下面是常见框架的 grep pattern 库;用户提示的框架优先匹配,其他自适应:
111
+
112
+ **Node / TypeScript / JavaScript**:
113
+ - Express / Fastify / Koa:`app\.(get|post|put|delete|patch)\s*\(`、`router\.(get|post|put|delete|patch)\s*\(`
114
+ - NestJS:`@(Get|Post|Put|Delete|Patch)\s*\(`、`@Controller\s*\(`
115
+
116
+ **Python**:
117
+ - FastAPI:`@(app|router)\.(get|post|put|delete|patch)\s*\(`、`@APIRouter\.(get|post|put|delete|patch)`
118
+ - Django / DRF:`urlpatterns\s*=`、`path\s*\(`、`re_path\s*\(`、`@action\s*\(`
119
+ - Flask:`@(app|bp)\.(route|get|post|put|delete|patch)\s*\(`
120
+
121
+ **Java / Kotlin**:
122
+ - Spring:`@(GetMapping|PostMapping|PutMapping|DeleteMapping|PatchMapping|RequestMapping)\s*\(`、`@RestController\s*(`、`@Controller\s*(`
123
+
124
+ **Go**:
125
+ - Gin:`(r|router|engine)\.(GET|POST|PUT|DELETE|PATCH)\s*\(`、`\.Handle\s*\(`
126
+ - Echo:`(e|echo)\.(GET|POST|PUT|DELETE|PATCH)\s*\(`
127
+ - net/http:`http\.Handle(Func)?\s*\(`、`mux\.Handle(Func)?\s*\(`
128
+
129
+ **Rust**:
130
+ - Axum:`\.route\s*\(`、`Router::new\(\)`、`#\[(get|post|put|delete|patch)\s*\(`
131
+
132
+ **C# / .NET**:
133
+ - ASP.NET:`\[Http(Get|Post|Put|Delete|Patch)\]`、`\[Route\(`、`\.Map(Get|Post|Put|Delete|Patch)\s*\(`
134
+
135
+ **PHP**:
136
+ - Laravel:`Route::(get|post|put|delete|patch)\s*\(`、`Route::(resource|apiResource)\s*\(`
137
+
138
+ **Ruby**:
139
+ - Rails:`(get|post|put|delete|patch)\s+['"]`、`resources?\s+:`、`match\s+['"]`
140
+
141
+ **用户提示其他框架**:agent 根据框架文档自适应 grep pattern,在文档里如实标注"非默认覆盖框架,自适应提取"。
142
+
143
+ ### 第四步:筛选"本次 feature 新增"的接口
144
+
145
+ - 严格只算**新增**(本 feature 新加的路由注册行)
146
+ - 修改老接口(原有路由,handler 内部改了实现) **不在范围**
147
+ - 删除的接口 **不在范围**
148
+ - 判定方式:用户提示 + spec 接口清单对照。spec 声明 + 代码 grep 都命中的优先算新增;只在代码命中但 spec 没声明的,询问用户是否本次新增
149
+ - 找到 0 个新增接口 → 见"失败处理"
150
+
151
+ ### 第五步:Read handler 源码,提取字段
152
+
153
+ 对每个新增接口,Read 对应的 handler 函数,提取:
154
+
155
+ - **方法**:HTTP 方法(GET/POST/PUT/DELETE/PATCH)
156
+ - **路径**:完整路由(包括 base path,若可推断)
157
+ - **请求参数**:
158
+ - path 参数(从路由模板提取,如 `/users/:id` → `id`)
159
+ - query 参数(从 handler 签名 / 框架注入提取)
160
+ - body 参数(从 DTO / 解构代码 / 类型注解提取)
161
+ - header 参数(从鉴权注入 / 自定义 header 提取)
162
+ - **响应示例**:从 return 语句 / 序列化代码 / 类型注解 / spec 错误码推断
163
+ - **错误码**:从异常处理 / 抛错代码 / spec 异常章节提取
164
+ - **业务说明**:结合 spec 的接口业务口径 + handler 实现的关键逻辑,写一句简述
165
+
166
+ 提取不到的字段:在文档里标注"待补充"或"代码未体现",**不要编造**。
167
+
168
+ ### 第六步:组装 HTML 文档
169
+
170
+ 按"章节结构"组装 HTML,生成单文件独立 HTML(内联 CSS、不依赖外部资源)。生成前阅读 [template-api-html.md](template-api-html.md) 获取完整 CSS 和结构参考。
171
+
172
+ ### 第七步:保存文件并反馈
173
+
174
+ 写入 `docs/features/<feature-id>/<文件前缀>-接口文档.html`。
175
+
176
+ 反馈:
177
+ 1. 告知用户文件保存位置
178
+ 2. 列出本次提取的接口总数和清单
179
+ 3. 列出"提取失败 / 字段不全"的接口,提示用户补充代码注释或 spec
180
+ 4. 不触发分析(本 skill 只读取 spec + 代码,不写入 `docs/knowledge/`)
181
+
182
+ ## 章节结构
183
+
184
+ ```html
185
+ <!DOCTYPE html>
186
+ <html>
187
+ <head>...</head>
188
+ <body>
189
+ <div class="container">
190
+ <!-- 文档头 -->
191
+ <h1>{feature 标题} — 接口文档</h1>
192
+ <p class="meta">feature-id: {feature-id} | 生成日期: YYYY-MM-DD | 接口总数: N</p>
193
+
194
+ <!-- 目录 -->
195
+ <nav class="toc">
196
+ <h3>目录</h3>
197
+ <ul>
198
+ <li><a href="#概览">概览</a></li>
199
+ <li><a href="#接口清单">接口清单</a></li>
200
+ <li><a href="#接口详情">接口详情</a>
201
+ <ul>
202
+ <li><a href="#{anchor-1}">{METHOD} {path-1}</a></li>
203
+ <li><a href="#{anchor-2}">{METHOD} {path-2}</a></li>
204
+ ...
205
+ </ul>
206
+ </li>
207
+ </ul>
208
+ </nav>
209
+
210
+ <!-- 概览 -->
211
+ <section id="概览">
212
+ <h2>概览</h2>
213
+ <p>本 feature 新增接口的业务背景(从 spec 摘录)。</p>
214
+ <table>
215
+ <tr><th>Base URL</th><td>{若可推断,否则"待补充"}</td></tr>
216
+ <tr><th>鉴权方式</th><td>{若可推断,否则"待补充"}</td></tr>
217
+ <tr><th>主要内容</th><td>{一句话总结}</td></tr>
218
+ </table>
219
+ </section>
220
+
221
+ <!-- 接口清单 -->
222
+ <section id="接口清单">
223
+ <h2>接口清单</h2>
224
+ <table class="endpoint-list">
225
+ <thead><tr><th>方法</th><th>路径</th><th>简述</th></tr></thead>
226
+ <tbody>
227
+ <tr><td><span class="api-method get">GET</span></td><td>/api/path</td><td>...</td></tr>
228
+ ...
229
+ </tbody>
230
+ </table>
231
+ </section>
232
+
233
+ <!-- 接口详情 -->
234
+ <section id="接口详情">
235
+ <h2>接口详情</h2>
236
+
237
+ <section id="{anchor}" class="endpoint">
238
+ <h3><span class="api-method get">GET</span> <code>/api/path/:id</code></h3>
239
+ <p class="endpoint-desc">业务说明...</p>
240
+
241
+ <h4>请求参数</h4>
242
+ <table>
243
+ <thead><tr><th>位置</th><th>参数</th><th>类型</th><th>必填</th><th>说明</th></tr></thead>
244
+ <tbody>
245
+ <tr><td>path</td><td>id</td><td>string</td><td>是</td><td>资源 ID</td></tr>
246
+ <tr><td>query</td><td>expand</td><td>boolean</td><td>否</td><td>是否展开关联</td></tr>
247
+ ...
248
+ </tbody>
249
+ </table>
250
+
251
+ <h4>响应示例</h4>
252
+ <pre><code class="json">{
253
+ "id": "xxx",
254
+ "name": "xxx"
255
+ }</code></pre>
256
+
257
+ <h4>错误码</h4>
258
+ <table class="error-table">
259
+ <thead><tr><th>状态码</th><th>含义</th><th>触发场景</th></tr></thead>
260
+ <tbody>
261
+ <tr><td>404</td><td>资源不存在</td><td>id 无效</td></tr>
262
+ ...
263
+ </tbody>
264
+ </table>
265
+ </section>
266
+
267
+ ...
268
+ </section>
269
+ </div>
270
+ </body>
271
+ </html>
272
+ ```
273
+
274
+ ## 模板
275
+
276
+ 阅读 [template-api-html.md](template-api-html.md) 获取完整 CSS 和结构参考。
277
+
278
+ 模板复用 `template-design-html.md` 的 CSS 变量(`:root` 里的颜色 / 字体 / 间距变量)以保持视觉一致;额外增加 `.api-method`、`.endpoint`、`.endpoint-list`、`.error-table` 等接口文档专用样式。
279
+
280
+ ## 内容来源与改写规则
281
+
282
+ ### 事实性内容必须可溯源
283
+
284
+ - 接口路径、方法、参数、响应字段:必须来自代码(grep + Read)
285
+ - 业务说明、错误语义、权限边界:必须来自 spec 或代码,二者冲突时以 spec 为准并标注【待确认】
286
+ - base URL、鉴权方式:可推断时填,不可推断时填"待补充",不编造
287
+
288
+ ### 改写但忠实
289
+
290
+ - handler 里的代码注释、参数解构、return 语句 → 改写为表格化的请求参数 / 响应示例
291
+ - spec 里的业务口径 → 改写为接口的"业务说明"短句
292
+ - 不要照贴 handler 源码;不要贴整段 spec 原文
293
+
294
+ ### 不重新定义契约
295
+
296
+ - 接口文档**不得**改写 spec 已锁定的接口契约、参数语义、错误码
297
+ - 发现 spec 与代码冲突时,以 spec 为准;代码明显违背 spec 时,标注【待确认】并提示用户
298
+
299
+ ## 失败处理
300
+
301
+ | 场景 | skill 响应 |
302
+ |---|---|
303
+ | 用户未提供文件/接口前缀提示,且无法从上下文推断 | skill 启动时显式询问,不自行猜测 |
304
+ | grep 找到 0 个新增路由注册点 | 报错并提示:"未在用户指定范围找到新增接口。请确认范围,或检查路由注册是否用框架默认 pattern 之外的方式" |
305
+ | 找到的接口 spec 未声明 | 列出"代码命中但 spec 未声明"的接口清单,询问用户是否本次新增,默认不算 |
306
+ | handler 源码字段提取不全 | 在对应字段标"待补充",在反馈里汇总列出 |
307
+ | spec 与代码明显冲突 | 在文档对应字段标【待确认】,在反馈里列出冲突清单 |
308
+ | 框架不在默认覆盖列表 | agent 自适应 grep pattern,在文档"概览"章节标注"非默认覆盖框架,自适应提取" |
309
+
310
+ ## 收尾方式
311
+
312
+ 输出接口文档后,只提示用户:
313
+ 1. 文件保存位置
314
+ 2. 提取的接口清单
315
+ 3. 字段不全或冲突的待补充清单
316
+
317
+ 不要主动调用 docgen 或其他 skill。不写 knowledge 文件。不修改 spec / plan / 代码。