@waoooo/claude-skills 1.0.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.
- package/README.md +48 -0
- package/package.json +28 -0
- package/registry.json +431 -0
- package/skills/acceptance-review/SKILL.md +537 -0
- package/skills/all-plan/SKILL.md +19 -0
- package/skills/all-plan/references/flow.md +750 -0
- package/skills/api-docs-generate/SKILL.md +204 -0
- package/skills/api-docs-generate/assets/templates/api.mdx +140 -0
- package/skills/api-docs-generate/scripts/generate-api-docs.ts +308 -0
- package/skills/ask/SKILL.md +42 -0
- package/skills/autonew/SKILL.md +34 -0
- package/skills/capability-analyze/SKILL.md +300 -0
- package/skills/capability-analyze/scripts/analyze-capabilities.ts +531 -0
- package/skills/capability-docs-generate/SKILL.md +155 -0
- package/skills/capability-docs-generate/assets/templates/capability.mdx +271 -0
- package/skills/capability-docs-generate/scripts/generate-capability-docs.ts +358 -0
- package/skills/capability-tree-query/SKILL.md +112 -0
- package/skills/capability-tree-query/scripts/build-capability-tree.ts +402 -0
- package/skills/changelog-generator/SKILL.md +104 -0
- package/skills/continue/SKILL.md +39 -0
- package/skills/continue/agents/openai.yaml +3 -0
- package/skills/creating-skills/SKILL.md +158 -0
- package/skills/creating-skills/references/official_best_practices.md +128 -0
- package/skills/creating-skills/references/skill_examples.md +199 -0
- package/skills/docx/LICENSE.txt +30 -0
- package/skills/docx/SKILL.md +197 -0
- package/skills/docx/docx-js.md +350 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/docx/ooxml/scripts/pack.py +159 -0
- package/skills/docx/ooxml/scripts/unpack.py +29 -0
- package/skills/docx/ooxml/scripts/validate.py +69 -0
- package/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
- package/skills/docx/ooxml/scripts/validation/base.py +951 -0
- package/skills/docx/ooxml/scripts/validation/docx.py +274 -0
- package/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
- package/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
- package/skills/docx/ooxml.md +610 -0
- package/skills/docx/scripts/__init__.py +1 -0
- package/skills/docx/scripts/document.py +1276 -0
- package/skills/docx/scripts/templates/comments.xml +3 -0
- package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/skills/docx/scripts/templates/people.xml +3 -0
- package/skills/docx/scripts/utilities.py +374 -0
- package/skills/git-branch-create/SKILL.md +170 -0
- package/skills/git-branch-merge/SKILL.md +176 -0
- package/skills/git-commit/SKILL.md +56 -0
- package/skills/git-commit/references/commit_examples.md +311 -0
- package/skills/github-actions-trigger/SKILL.md +367 -0
- package/skills/github-issue-create/SKILL.md +294 -0
- package/skills/github-pr-creation/SKILL.md +137 -0
- package/skills/github-pr-creation/references/pr_templates.md +187 -0
- package/skills/github-pr-merge/SKILL.md +112 -0
- package/skills/github-pr-review/SKILL.md +110 -0
- package/skills/github-pr-review/references/severity_guide.md +168 -0
- package/skills/job-create/SKILL.md +294 -0
- package/skills/job-create/scripts/create-job.ts +105 -0
- package/skills/job-workflow/SKILL.md +212 -0
- package/skills/keyword-extract/SKILL.md +229 -0
- package/skills/mcp-builder/LICENSE.txt +202 -0
- package/skills/mcp-builder/SKILL.md +236 -0
- package/skills/mcp-builder/reference/evaluation.md +602 -0
- package/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/skills/mcp-builder/scripts/connections.py +151 -0
- package/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/skills/mdx-to-openspec/SKILL.md +827 -0
- package/skills/mdx-to-openspec/scripts/mdx-to-openspec.ts +320 -0
- package/skills/mounted/SKILL.md +20 -0
- package/skills/multi-model-review/SKILL.md +459 -0
- package/skills/notion-automation/SKILL.md +215 -0
- package/skills/openspec-review/SKILL.md +513 -0
- package/skills/pdf/LICENSE.txt +30 -0
- package/skills/pdf/SKILL.md +294 -0
- package/skills/pdf/forms.md +205 -0
- package/skills/pdf/reference.md +612 -0
- package/skills/pdf/scripts/check_bounding_boxes.py +70 -0
- package/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
- package/skills/pdf/scripts/check_fillable_fields.py +12 -0
- package/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
- package/skills/pdf/scripts/create_validation_image.py +41 -0
- package/skills/pdf/scripts/extract_form_field_info.py +152 -0
- package/skills/pdf/scripts/fill_fillable_fields.py +114 -0
- package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
- package/skills/pend/SKILL.md +33 -0
- package/skills/ping/SKILL.md +39 -0
- package/skills/pptx/LICENSE.txt +30 -0
- package/skills/pptx/SKILL.md +484 -0
- package/skills/pptx/html2pptx.md +625 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/pptx/ooxml/scripts/pack.py +159 -0
- package/skills/pptx/ooxml/scripts/unpack.py +29 -0
- package/skills/pptx/ooxml/scripts/validate.py +69 -0
- package/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
- package/skills/pptx/ooxml/scripts/validation/base.py +951 -0
- package/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
- package/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
- package/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
- package/skills/pptx/ooxml.md +427 -0
- package/skills/pptx/scripts/html2pptx.js +979 -0
- package/skills/pptx/scripts/inventory.py +1020 -0
- package/skills/pptx/scripts/rearrange.py +231 -0
- package/skills/pptx/scripts/replace.py +385 -0
- package/skills/pptx/scripts/thumbnail.py +450 -0
- package/skills/progress-update/SKILL.md +394 -0
- package/skills/progress-update/scripts/update-progress.ts +221 -0
- package/skills/release-automation/SKILL.md +306 -0
- package/skills/requirement-parse/SKILL.md +212 -0
- package/skills/requirement-parse/scripts/infer-builder-config.ts +346 -0
- package/skills/requirement-parse/scripts/merge-requirements.ts +228 -0
- package/skills/requirement-parse/scripts/parse-docs.ts +206 -0
- package/skills/requirement-parse/scripts/parse-openspec.ts +168 -0
- package/skills/roadmap-docs-generate/SKILL.md +483 -0
- package/skills/roadmap-docs-generate/assets/templates/ROADMAP.mdx +75 -0
- package/skills/roadmap-docs-generate/assets/templates/ROADMAP.mdx.template +330 -0
- package/skills/roadmap-docs-generate/assets/templates/TODO.mdx +56 -0
- package/skills/roadmap-docs-generate/assets/templates/TODO.mdx.template +363 -0
- package/skills/roadmap-docs-generate/scripts/json-to-mdx.ts +445 -0
- package/skills/roadmap-docs-generate/scripts/json-to-mdx.ts.backup +411 -0
- package/skills/roadmap-generate/SKILL.md +396 -0
- package/skills/roadmap-generate/scripts/generate-roadmap.ts +496 -0
- package/skills/skill-creator/LICENSE.txt +202 -0
- package/skills/skill-creator/SKILL.md +356 -0
- package/skills/skill-creator/references/output-patterns.md +82 -0
- package/skills/skill-creator/references/workflows.md +28 -0
- package/skills/skill-creator/scripts/init_skill.py +303 -0
- package/skills/skill-creator/scripts/package_skill.py +110 -0
- package/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/skills/spec-generate/SKILL.md +408 -0
- package/skills/spec-generate/scripts/generate-specs.ts +538 -0
- package/skills/spec-generate/scripts/generate-tasks.ts +174 -0
- package/skills/specs-review/SKILL.md +370 -0
- package/skills/task-execute/SKILL.md +399 -0
- package/skills/task-update-status/SKILL.md +349 -0
- package/skills/task-update-status/scripts/update-task-status.ts +192 -0
- package/skills/task-verify/SKILL.md +407 -0
- package/skills/ui-ux-pro-max/SKILL.md +386 -0
- package/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills/ui-ux-pro-max/scripts/core.py +253 -0
- package/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/skills/ui-ux-pro-max/scripts/search.py +114 -0
- package/skills/vercel-automation/SKILL.md +226 -0
- package/skills/webapp-testing/LICENSE.txt +202 -0
- package/skills/webapp-testing/SKILL.md +96 -0
- package/skills/webapp-testing/examples/console_logging.py +35 -0
- package/skills/webapp-testing/examples/element_discovery.py +40 -0
- package/skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/skills/webapp-testing/scripts/with_server.py +106 -0
- package/skills/worktree-manager/SKILL.md +725 -0
- package/skills/worktree-manager/config.json +15 -0
- package/skills/worktree-manager/scripts/allocate-ports.sh +100 -0
- package/skills/worktree-manager/scripts/cleanup.sh +185 -0
- package/skills/worktree-manager/scripts/launch-agent.sh +155 -0
- package/skills/worktree-manager/scripts/register.sh +125 -0
- package/skills/worktree-manager/scripts/release-ports.sh +48 -0
- package/skills/worktree-manager/scripts/status.sh +169 -0
- package/skills/worktree-manager/scripts/sync.sh +168 -0
- package/skills/worktree-manager/templates/worktree.json +23 -0
- package/skills/xlsx/LICENSE.txt +30 -0
- package/skills/xlsx/SKILL.md +289 -0
- package/skills/xlsx/recalc.py +178 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-docs-generate
|
|
3
|
+
description: 从后端代码和 OpenAPI 规范自动生成 API 文档(api-reference/*.mdx),包含端点定义、请求参数、响应格式、使用示例等
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: api-docs-generate
|
|
8
|
+
|
|
9
|
+
## 功能
|
|
10
|
+
|
|
11
|
+
从后端代码注释和 OpenAPI 规范自动生成 API 文档,输出到 waoooo-docs 的 api-reference 目录。
|
|
12
|
+
|
|
13
|
+
## 何时调用
|
|
14
|
+
|
|
15
|
+
- API 开发完成后,需要生成 API 文档
|
|
16
|
+
- API 更新后,需要更新文档
|
|
17
|
+
- 用户说:"生成 API 文档"、"更新 API 文档"
|
|
18
|
+
|
|
19
|
+
## 输入
|
|
20
|
+
|
|
21
|
+
- `backendPath` - 后端代码路径
|
|
22
|
+
- `endpoint` - API 端点(如 `/api/pricing/plans`)
|
|
23
|
+
- `openApiPath` - OpenAPI 规范文件路径(可选)
|
|
24
|
+
|
|
25
|
+
## 输出
|
|
26
|
+
|
|
27
|
+
- `waoooo-docs/developer-docs/api-reference/rest-api/endpoints/<endpoint-name>.mdx`
|
|
28
|
+
|
|
29
|
+
## 执行步骤
|
|
30
|
+
|
|
31
|
+
### 1. 分析后端代码
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# 扫描 FastAPI 路由
|
|
35
|
+
- 查找 @router.get/post/put/delete 装饰器
|
|
36
|
+
- 提取路径参数、查询参数、请求体
|
|
37
|
+
- 提取响应模型
|
|
38
|
+
- 提取文档字符串
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 2. 读取 OpenAPI 规范(如果有)
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# 读取 OpenAPI JSON/YAML
|
|
45
|
+
- 提取端点定义
|
|
46
|
+
- 提取参数说明
|
|
47
|
+
- 提取响应示例
|
|
48
|
+
- 提取错误码
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 3. 生成文档
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# 使用模板生成
|
|
55
|
+
npx tsx .claude/skills/api-docs-generate/scripts/generate-api-docs.ts \
|
|
56
|
+
--backend-path <path> \
|
|
57
|
+
--endpoint <endpoint> \
|
|
58
|
+
--openapi-path <path>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 4. 验证输出
|
|
62
|
+
|
|
63
|
+
- 检查文档是否生成
|
|
64
|
+
- 检查参数说明是否完整
|
|
65
|
+
- 检查代码示例是否正确
|
|
66
|
+
|
|
67
|
+
## 使用示例
|
|
68
|
+
|
|
69
|
+
### 示例 1:生成单个端点文档
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
用户: "生成 /api/pricing/plans 的 API 文档"
|
|
73
|
+
|
|
74
|
+
Agent 行动:
|
|
75
|
+
1. 扫描后端代码: waoooo-service/api/routers/pricing.py
|
|
76
|
+
2. 提取端点信息
|
|
77
|
+
3. 生成文档: api-reference/rest-api/endpoints/get-pricing-plans.mdx
|
|
78
|
+
4. 显示结果
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 示例 2:批量生成 API 文档
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
用户: "生成所有 pricing API 文档"
|
|
85
|
+
|
|
86
|
+
Agent 行动:
|
|
87
|
+
1. 扫描 pricing 路由: waoooo-service/api/routers/pricing.py
|
|
88
|
+
2. 找到所有端点(5个)
|
|
89
|
+
3. 逐个生成文档
|
|
90
|
+
4. 显示结果列表
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 示例 3:从 OpenAPI 规范生成
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
用户: "从 OpenAPI 规范生成 API 文档"
|
|
97
|
+
|
|
98
|
+
Agent 行动:
|
|
99
|
+
1. 读取 OpenAPI 文件: openapi.json
|
|
100
|
+
2. 提取所有端点
|
|
101
|
+
3. 批量生成文档
|
|
102
|
+
4. 显示结果
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## 文档结构
|
|
106
|
+
|
|
107
|
+
生成的文档包含以下章节:
|
|
108
|
+
|
|
109
|
+
1. **端点定义** - 方法、路径、描述
|
|
110
|
+
2. **认证要求** - 是否需要认证、权限要求
|
|
111
|
+
3. **请求参数** - Path/Query/Body 参数说明
|
|
112
|
+
4. **请求示例** - cURL、JavaScript、Python 示例
|
|
113
|
+
5. **响应格式** - 成功响应、错误响应
|
|
114
|
+
6. **错误码** - 可能的错误码和说明
|
|
115
|
+
7. **相关端点** - 链接到相关 API
|
|
116
|
+
|
|
117
|
+
## 模板文件
|
|
118
|
+
|
|
119
|
+
- `assets/templates/api.mdx` - API 文档模板(**使用 Mintlify 标准 API 格式**)
|
|
120
|
+
|
|
121
|
+
<Note>
|
|
122
|
+
**重要:使用 Mintlify 标准 API 格式**
|
|
123
|
+
|
|
124
|
+
生成的 API 文档必须遵循 Mintlify 的标准 API 格式:
|
|
125
|
+
|
|
126
|
+
1. **Frontmatter 格式**:
|
|
127
|
+
```yaml
|
|
128
|
+
---
|
|
129
|
+
title: 'API 端点标题'
|
|
130
|
+
api: 'HTTP方法 /api/v1/路径'
|
|
131
|
+
description: '一句话描述'
|
|
132
|
+
---
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
2. **参数定义**:
|
|
136
|
+
- 使用 `<ParamField>` 组件(不是 `<Param>`)
|
|
137
|
+
- 支持 `header`、`path`、`query`、`body` 类型
|
|
138
|
+
- 示例:`<ParamField path="id" type="string" required>`
|
|
139
|
+
|
|
140
|
+
3. **响应定义**:
|
|
141
|
+
- 使用 `<ResponseField>` 组件
|
|
142
|
+
- 示例:`<ResponseField name="data" type="object" required>`
|
|
143
|
+
|
|
144
|
+
4. **代码示例**:
|
|
145
|
+
- 使用 `<RequestExample>` 和 `<ResponseExample>` 包裹
|
|
146
|
+
- 支持多语言:cURL、TypeScript、Python
|
|
147
|
+
|
|
148
|
+
5. **提示组件**:
|
|
149
|
+
- `<Note>` - 一般说明
|
|
150
|
+
- `<Tip>` - 最佳实践
|
|
151
|
+
- `<Warning>` - 注意事项
|
|
152
|
+
|
|
153
|
+
参考示例:`waoooo-docs/developer-docs/api-reference/rest-api/endpoints/auth-revoke-session.mdx`
|
|
154
|
+
</Note>
|
|
155
|
+
|
|
156
|
+
## 错误处理
|
|
157
|
+
|
|
158
|
+
### 错误 1:后端代码不存在
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
❌ 错误: 后端代码文件不存在
|
|
162
|
+
📁 路径: waoooo-service/api/routers/pricing.py
|
|
163
|
+
|
|
164
|
+
💡 建议:
|
|
165
|
+
1. 检查后端代码路径是否正确
|
|
166
|
+
2. 确认 API 已实现
|
|
167
|
+
3. 检查文件名是否正确
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### 错误 2:端点未找到
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
❌ 错误: 端点未找到
|
|
174
|
+
🔍 端点: /api/pricing/plans
|
|
175
|
+
|
|
176
|
+
💡 建议:
|
|
177
|
+
1. 检查端点路径是否正确
|
|
178
|
+
2. 确认 API 已实现
|
|
179
|
+
3. 查看所有可用端点列表
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### 错误 3:OpenAPI 规范格式错误
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
❌ 错误: OpenAPI 规范解析失败
|
|
186
|
+
📁 文件: openapi.json
|
|
187
|
+
|
|
188
|
+
💡 建议:
|
|
189
|
+
1. 检查 JSON/YAML 格式是否正确
|
|
190
|
+
2. 使用 OpenAPI 验证工具验证
|
|
191
|
+
3. 重新生成 OpenAPI 规范
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## 注意事项
|
|
195
|
+
|
|
196
|
+
1. **文档与代码同步** - 生成的文档应该反映实际 API 实现
|
|
197
|
+
2. **参数说明完整** - 确保所有参数都有清晰的说明
|
|
198
|
+
3. **示例可运行** - 提供的代码示例应该可以直接运行
|
|
199
|
+
4. **错误码准确** - 列出所有可能的错误码和场景
|
|
200
|
+
|
|
201
|
+
## 相关 Skills
|
|
202
|
+
|
|
203
|
+
- `capability-docs-generate` - 生成能力文档
|
|
204
|
+
- `spec-generate` - 生成开发规范
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: '[API 端点标题]'
|
|
3
|
+
api: 'HTTP方法 /api/v1/[路径]'
|
|
4
|
+
description: '[一句话描述端点功能]'
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
[详细描述端点功能和用途,说明该端点的作用、适用场景等]
|
|
8
|
+
|
|
9
|
+
<Note>
|
|
10
|
+
此端点**需要认证**,必须提供有效的 Bearer Token(JWT)。
|
|
11
|
+
</Note>
|
|
12
|
+
|
|
13
|
+
## 认证
|
|
14
|
+
|
|
15
|
+
<ParamField header="Authorization" type="string" required>
|
|
16
|
+
Bearer Token(JWT),从用户登录后获取
|
|
17
|
+
</ParamField>
|
|
18
|
+
|
|
19
|
+
## 路径参数
|
|
20
|
+
|
|
21
|
+
<ParamField path="[参数名]" type="string" required>
|
|
22
|
+
[参数说明]
|
|
23
|
+
</ParamField>
|
|
24
|
+
|
|
25
|
+
## 查询参数
|
|
26
|
+
|
|
27
|
+
<ParamField query="[参数名]" type="string" default="[默认值]">
|
|
28
|
+
[参数说明]
|
|
29
|
+
</ParamField>
|
|
30
|
+
|
|
31
|
+
## 请求体
|
|
32
|
+
|
|
33
|
+
<ParamField body="[字段名]" type="string" required>
|
|
34
|
+
[字段说明]
|
|
35
|
+
</ParamField>
|
|
36
|
+
|
|
37
|
+
## Response
|
|
38
|
+
|
|
39
|
+
<ResponseField name="success" type="boolean" required>
|
|
40
|
+
请求是否成功
|
|
41
|
+
</ResponseField>
|
|
42
|
+
|
|
43
|
+
<ResponseField name="data" type="object" required>
|
|
44
|
+
响应数据对象
|
|
45
|
+
</ResponseField>
|
|
46
|
+
|
|
47
|
+
<ResponseField name="error" type="object">
|
|
48
|
+
错误信息(仅在失败时返回)
|
|
49
|
+
</ResponseField>
|
|
50
|
+
|
|
51
|
+
<RequestExample>
|
|
52
|
+
```bash cURL
|
|
53
|
+
curl -X POST "https://api.waoooo.com/api/v1/[路径]" \
|
|
54
|
+
-H "Authorization: Bearer <your_access_token>" \
|
|
55
|
+
-H "Content-Type: application/json" \
|
|
56
|
+
-d '{
|
|
57
|
+
"[字段名]": "[值]"
|
|
58
|
+
}'
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
```typescript TypeScript
|
|
62
|
+
const response = await fetch(
|
|
63
|
+
'https://api.waoooo.com/api/v1/[路径]',
|
|
64
|
+
{
|
|
65
|
+
method: 'POST',
|
|
66
|
+
headers: {
|
|
67
|
+
'Authorization': `Bearer ${accessToken}`,
|
|
68
|
+
'Content-Type': 'application/json',
|
|
69
|
+
},
|
|
70
|
+
body: JSON.stringify({
|
|
71
|
+
[字段名]: '[值]',
|
|
72
|
+
}),
|
|
73
|
+
}
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
const data = await response.json();
|
|
77
|
+
console.log(data);
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
```python Python
|
|
81
|
+
import requests
|
|
82
|
+
|
|
83
|
+
response = requests.post(
|
|
84
|
+
'https://api.waoooo.com/api/v1/[路径]',
|
|
85
|
+
headers={'Authorization': f'Bearer {access_token}'},
|
|
86
|
+
json={'[字段名]': '[值]'}
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
data = response.json()
|
|
90
|
+
print(data)
|
|
91
|
+
```
|
|
92
|
+
</RequestExample>
|
|
93
|
+
|
|
94
|
+
<ResponseExample>
|
|
95
|
+
```json 成功响应
|
|
96
|
+
{
|
|
97
|
+
"success": true,
|
|
98
|
+
"data": {
|
|
99
|
+
"id": "880e8400-e29b-41d4-a716-446655440001",
|
|
100
|
+
"[字段名]": "[值]"
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
```json 错误响应 (400)
|
|
106
|
+
{
|
|
107
|
+
"success": false,
|
|
108
|
+
"error": {
|
|
109
|
+
"code": "[错误码]",
|
|
110
|
+
"message": "[错误描述]"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
```json 未授权 (401)
|
|
116
|
+
{
|
|
117
|
+
"detail": "Session revoked"
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
</ResponseExample>
|
|
121
|
+
|
|
122
|
+
## 使用场景
|
|
123
|
+
|
|
124
|
+
### 1. [场景标题]
|
|
125
|
+
|
|
126
|
+
[场景描述]
|
|
127
|
+
|
|
128
|
+
## 最佳实践
|
|
129
|
+
|
|
130
|
+
<Tip>
|
|
131
|
+
**[实践标题]**:[实践说明]
|
|
132
|
+
</Tip>
|
|
133
|
+
|
|
134
|
+
<Note>
|
|
135
|
+
**[建议标题]**:[建议说明]
|
|
136
|
+
</Note>
|
|
137
|
+
|
|
138
|
+
<Warning>
|
|
139
|
+
**[注意事项标题]**:[注意事项说明]
|
|
140
|
+
</Warning>
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Generate API Documentation from Backend Code
|
|
4
|
+
*
|
|
5
|
+
* This script generates API endpoint documentation by:
|
|
6
|
+
* 1. Analyzing FastAPI router code
|
|
7
|
+
* 2. Extracting endpoint metadata (path, method, params, response)
|
|
8
|
+
* 3. Filling the api.mdx template with extracted data
|
|
9
|
+
* 4. Outputting to waoooo-docs/developer-docs/api-reference/endpoints/<endpoint>.mdx
|
|
10
|
+
* 5. Updating mint.json navigation
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* npx tsx generate-api-docs.ts \
|
|
14
|
+
* --code <backend-code-path> \
|
|
15
|
+
* --endpoint <endpoint-name>
|
|
16
|
+
*
|
|
17
|
+
* Example:
|
|
18
|
+
* npx tsx generate-api-docs.ts \
|
|
19
|
+
* --code ../../../../../../waoooo-service/app/api/routers/payment.py \
|
|
20
|
+
* --endpoint create-payment
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import fs from 'fs';
|
|
24
|
+
import path from 'path';
|
|
25
|
+
import { fileURLToPath } from 'url';
|
|
26
|
+
|
|
27
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
28
|
+
const __dirname = path.dirname(__filename);
|
|
29
|
+
|
|
30
|
+
// ============================================================================
|
|
31
|
+
// Types
|
|
32
|
+
// ============================================================================
|
|
33
|
+
|
|
34
|
+
interface APIEndpointData {
|
|
35
|
+
title: string;
|
|
36
|
+
method: string;
|
|
37
|
+
path: string;
|
|
38
|
+
description: string;
|
|
39
|
+
requiresAuth: boolean;
|
|
40
|
+
pathParams: Array<{ name: string; type: string; description: string; required: boolean }>;
|
|
41
|
+
queryParams: Array<{ name: string; type: string; description: string; default?: string }>;
|
|
42
|
+
bodyParams: Array<{ name: string; type: string; description: string; required: boolean }>;
|
|
43
|
+
responseFields: Array<{ name: string; type: string; description: string; required: boolean }>;
|
|
44
|
+
errorCodes: Array<{ code: string; status: number; description: string }>;
|
|
45
|
+
examples: {
|
|
46
|
+
request: string;
|
|
47
|
+
response: string;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ============================================================================
|
|
52
|
+
// CLI Arguments Parsing
|
|
53
|
+
// ============================================================================
|
|
54
|
+
|
|
55
|
+
function parseArgs(): {
|
|
56
|
+
codePath: string;
|
|
57
|
+
endpointName: string;
|
|
58
|
+
} {
|
|
59
|
+
const args = process.argv.slice(2);
|
|
60
|
+
const result: any = {};
|
|
61
|
+
|
|
62
|
+
for (let i = 0; i < args.length; i += 2) {
|
|
63
|
+
const key = args[i].replace('--', '');
|
|
64
|
+
const value = args[i + 1];
|
|
65
|
+
result[key] = value;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (!result.code || !result.endpoint) {
|
|
69
|
+
console.error('❌ Missing required arguments');
|
|
70
|
+
console.error('Usage: generate-api-docs.ts --code <path> --endpoint <name>');
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
codePath: result.code,
|
|
76
|
+
endpointName: result.endpoint,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// ============================================================================
|
|
81
|
+
// Code Analysis (FastAPI)
|
|
82
|
+
// ============================================================================
|
|
83
|
+
|
|
84
|
+
function analyzeEndpoint(codePath: string, endpointName: string): Partial<APIEndpointData> {
|
|
85
|
+
if (!fs.existsSync(codePath)) {
|
|
86
|
+
throw new Error(`Code file not found: ${codePath}`);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const code = fs.readFileSync(codePath, 'utf-8');
|
|
90
|
+
|
|
91
|
+
// Extract endpoint decorator (e.g., @router.post("/payment"))
|
|
92
|
+
const decoratorRegex = /@router\.(get|post|put|delete|patch)\s*\(\s*["']([^"']+)["']/g;
|
|
93
|
+
const matches = [...code.matchAll(decoratorRegex)];
|
|
94
|
+
|
|
95
|
+
// Find matching endpoint
|
|
96
|
+
let method = 'POST';
|
|
97
|
+
let apiPath = '/api/v1/unknown';
|
|
98
|
+
let description = '';
|
|
99
|
+
|
|
100
|
+
for (const match of matches) {
|
|
101
|
+
if (match[2].includes(endpointName) || endpointName.includes(match[2].replace(/[\/\{\}]/g, '-'))) {
|
|
102
|
+
method = match[1].toUpperCase();
|
|
103
|
+
apiPath = `/api/v1${match[2]}`;
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Extract docstring
|
|
109
|
+
const docstringMatch = code.match(/"""([\s\S]*?)"""/);
|
|
110
|
+
if (docstringMatch) {
|
|
111
|
+
description = docstringMatch[1].trim().split('\n')[0];
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Extract Pydantic models for request/response
|
|
115
|
+
const modelRegex = /class\s+(\w+)\(BaseModel\):([\s\S]*?)(?=\nclass|\n@|\Z)/g;
|
|
116
|
+
const models = [...code.matchAll(modelRegex)];
|
|
117
|
+
|
|
118
|
+
const bodyParams: any[] = [];
|
|
119
|
+
const responseFields: any[] = [];
|
|
120
|
+
|
|
121
|
+
for (const model of models) {
|
|
122
|
+
const modelName = model[1];
|
|
123
|
+
const modelBody = model[2];
|
|
124
|
+
|
|
125
|
+
// Extract fields
|
|
126
|
+
const fieldRegex = /(\w+):\s*([\w\[\]]+)(?:\s*=\s*Field\((.*?)\))?/g;
|
|
127
|
+
const fields = [...modelBody.matchAll(fieldRegex)];
|
|
128
|
+
|
|
129
|
+
for (const field of fields) {
|
|
130
|
+
const fieldData = {
|
|
131
|
+
name: field[1],
|
|
132
|
+
type: field[2].replace('Optional[', '').replace(']', ''),
|
|
133
|
+
description: field[3] ? field[3].match(/description=["']([^"']+)["']/)?.[1] || '' : '',
|
|
134
|
+
required: !field[2].includes('Optional'),
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// Heuristic: if model name contains "Request" or "Create", it's a body param
|
|
138
|
+
if (modelName.includes('Request') || modelName.includes('Create')) {
|
|
139
|
+
bodyParams.push(fieldData);
|
|
140
|
+
} else if (modelName.includes('Response') || modelName.includes('Result')) {
|
|
141
|
+
responseFields.push(fieldData);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return {
|
|
147
|
+
title: endpointName.split('-').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' '),
|
|
148
|
+
method,
|
|
149
|
+
path: apiPath,
|
|
150
|
+
description: description || `${endpointName} endpoint`,
|
|
151
|
+
requiresAuth: code.includes('Depends(get_current_user)') || code.includes('Depends(verify_token)'),
|
|
152
|
+
bodyParams,
|
|
153
|
+
responseFields,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// ============================================================================
|
|
158
|
+
// Template Filling
|
|
159
|
+
// ============================================================================
|
|
160
|
+
|
|
161
|
+
function fillTemplate(data: APIEndpointData): string {
|
|
162
|
+
const templatePath = path.join(__dirname, '../assets/templates/api.mdx');
|
|
163
|
+
let template = fs.readFileSync(templatePath, 'utf-8');
|
|
164
|
+
|
|
165
|
+
// Replace basic info
|
|
166
|
+
template = template.replace(/\[API 端点标题\]/g, data.title);
|
|
167
|
+
template = template.replace(/HTTP方法/g, data.method);
|
|
168
|
+
template = template.replace(/\/api\/v1\/\[路径\]/g, data.path);
|
|
169
|
+
template = template.replace(/\[一句话描述端点功能\]/g, data.description);
|
|
170
|
+
|
|
171
|
+
// Replace body params
|
|
172
|
+
if (data.bodyParams.length > 0) {
|
|
173
|
+
const bodyParamsText = data.bodyParams
|
|
174
|
+
.map(
|
|
175
|
+
p => `<ParamField body="${p.name}" type="${p.type}" ${p.required ? 'required' : ''}>
|
|
176
|
+
${p.description}
|
|
177
|
+
</ParamField>`
|
|
178
|
+
)
|
|
179
|
+
.join('\n\n');
|
|
180
|
+
template = template.replace(
|
|
181
|
+
/<ParamField body="\[字段名\]"[\s\S]*?<\/ParamField>[\s\S]*?<ParamField body="\[字段名\]"[\s\S]*?<\/Expandable>\s*<\/ParamField>/m,
|
|
182
|
+
bodyParamsText
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Replace response fields
|
|
187
|
+
if (data.responseFields.length > 0) {
|
|
188
|
+
const responseFieldsText = data.responseFields
|
|
189
|
+
.map(
|
|
190
|
+
f => ` <ResponseField name="${f.name}" type="${f.type}" ${f.required ? 'required' : ''}>
|
|
191
|
+
${f.description}
|
|
192
|
+
</ResponseField>`
|
|
193
|
+
)
|
|
194
|
+
.join('\n\n');
|
|
195
|
+
template = template.replace(
|
|
196
|
+
/<ResponseField name="id"[\s\S]*?<ResponseField name="created_at"[\s\S]*?<\/ResponseField>/m,
|
|
197
|
+
responseFieldsText
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Update last updated date
|
|
202
|
+
const today = new Date().toISOString().split('T')[0];
|
|
203
|
+
template = template.replace(/\*\*最后更新\*\*:\d{4}-\d{2}-\d{2}/, `**最后更新**:${today}`);
|
|
204
|
+
|
|
205
|
+
return template;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// ============================================================================
|
|
209
|
+
// Update mint.json (using universal utility)
|
|
210
|
+
// ============================================================================
|
|
211
|
+
|
|
212
|
+
function updateMintJson(endpointName: string, docsPath: string) {
|
|
213
|
+
const projectRoot = path.resolve(__dirname, '../../../../../');
|
|
214
|
+
|
|
215
|
+
// Calculate relative path
|
|
216
|
+
const relativePath = path.relative(
|
|
217
|
+
path.join(projectRoot, 'waoooo-docs'),
|
|
218
|
+
docsPath
|
|
219
|
+
).replace(/\.mdx$/, '');
|
|
220
|
+
|
|
221
|
+
// Call universal update-mint-nav utility
|
|
222
|
+
const updateScript = path.join(__dirname, '../../../../src/scripts/update-mint-nav.ts');
|
|
223
|
+
const { execSync } = require('child_process');
|
|
224
|
+
|
|
225
|
+
try {
|
|
226
|
+
execSync(
|
|
227
|
+
`npx tsx "${updateScript}" --section "API Reference" --group "Endpoints" --page "${relativePath}"`,
|
|
228
|
+
{ stdio: 'inherit' }
|
|
229
|
+
);
|
|
230
|
+
} catch (error) {
|
|
231
|
+
console.warn('⚠️ Failed to update mint.json');
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
} catch (error) {
|
|
235
|
+
console.warn('⚠️ Failed to update mint.json');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// ============================================================================
|
|
240
|
+
// Main
|
|
241
|
+
// ============================================================================
|
|
242
|
+
|
|
243
|
+
async function main() {
|
|
244
|
+
console.log('🚀 Generating API Documentation...\n');
|
|
245
|
+
|
|
246
|
+
const { codePath, endpointName } = parseArgs();
|
|
247
|
+
|
|
248
|
+
console.log('📥 Input:');
|
|
249
|
+
console.log(` - Code: ${codePath}`);
|
|
250
|
+
console.log(` - Endpoint: ${endpointName}\n`);
|
|
251
|
+
|
|
252
|
+
// Step 1: Analyze code
|
|
253
|
+
console.log('🔍 Step 1/4: Analyzing endpoint code...');
|
|
254
|
+
const endpointData = analyzeEndpoint(codePath, endpointName);
|
|
255
|
+
console.log('✅ Endpoint analyzed\n');
|
|
256
|
+
|
|
257
|
+
// Step 2: Fill template
|
|
258
|
+
console.log('📝 Step 2/4: Generating documentation...');
|
|
259
|
+
const apiData: APIEndpointData = {
|
|
260
|
+
title: endpointData.title || endpointName,
|
|
261
|
+
method: endpointData.method || 'POST',
|
|
262
|
+
path: endpointData.path || '/api/v1/unknown',
|
|
263
|
+
description: endpointData.description || '',
|
|
264
|
+
requiresAuth: endpointData.requiresAuth ?? true,
|
|
265
|
+
pathParams: endpointData.pathParams || [],
|
|
266
|
+
queryParams: endpointData.queryParams || [],
|
|
267
|
+
bodyParams: endpointData.bodyParams || [],
|
|
268
|
+
responseFields: endpointData.responseFields || [],
|
|
269
|
+
errorCodes: endpointData.errorCodes || [],
|
|
270
|
+
examples: endpointData.examples || { request: '', response: '' },
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
const output = fillTemplate(apiData);
|
|
274
|
+
console.log('✅ Documentation generated\n');
|
|
275
|
+
|
|
276
|
+
// Step 3: Write output
|
|
277
|
+
console.log('💾 Step 3/4: Writing file...');
|
|
278
|
+
const projectRoot = path.resolve(__dirname, '../../../../../');
|
|
279
|
+
const docsPath = path.join(
|
|
280
|
+
projectRoot,
|
|
281
|
+
'waoooo-docs/developer-docs/api-reference/endpoints',
|
|
282
|
+
`${endpointName}.mdx`
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
fs.mkdirSync(path.dirname(docsPath), { recursive: true });
|
|
286
|
+
fs.writeFileSync(docsPath, output, 'utf-8');
|
|
287
|
+
console.log('✅ File written\n');
|
|
288
|
+
|
|
289
|
+
// Step 4: Update mint.json
|
|
290
|
+
console.log('🔧 Step 4/4: Updating mint.json...');
|
|
291
|
+
updateMintJson(endpointName, docsPath);
|
|
292
|
+
console.log('');
|
|
293
|
+
|
|
294
|
+
console.log('📂 Output:');
|
|
295
|
+
console.log(` ${docsPath}\n`);
|
|
296
|
+
|
|
297
|
+
console.log('🎉 Done!');
|
|
298
|
+
console.log('\n💡 Next steps:');
|
|
299
|
+
console.log(' 1. Review the generated documentation');
|
|
300
|
+
console.log(' 2. Fill in missing sections (examples, error codes, etc.)');
|
|
301
|
+
console.log(' 3. Test the API endpoint');
|
|
302
|
+
console.log(' 4. Commit the changes');
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
main().catch(error => {
|
|
306
|
+
console.error('❌ Error:', error.message);
|
|
307
|
+
process.exit(1);
|
|
308
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ask
|
|
3
|
+
description: Async via ask, end turn immediately; use when user explicitly delegates to any AI provider (gemini/codex/opencode/droid); NOT for questions about the providers themselves.
|
|
4
|
+
metadata:
|
|
5
|
+
short-description: Ask AI provider asynchronously
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Ask AI Provider (Async)
|
|
9
|
+
|
|
10
|
+
Send the user's request to specified AI provider asynchronously.
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
The first argument must be the provider name, followed by the message:
|
|
15
|
+
- `gemini` - Send to Gemini
|
|
16
|
+
- `codex` - Send to Codex
|
|
17
|
+
- `opencode` - Send to OpenCode
|
|
18
|
+
- `droid` - Send to Droid
|
|
19
|
+
|
|
20
|
+
## Execution (MANDATORY)
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
Bash(ask $PROVIDER "$MESSAGE")
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Rules
|
|
27
|
+
|
|
28
|
+
- After running the command, say "[Provider] processing..." and immediately end your turn.
|
|
29
|
+
- Do not wait for results or check status in the same turn.
|
|
30
|
+
- The task ID and log file path will be displayed for tracking.
|
|
31
|
+
|
|
32
|
+
## Examples
|
|
33
|
+
|
|
34
|
+
- `/ask gemini What is 12+12?`
|
|
35
|
+
- `/ask codex Refactor this code`
|
|
36
|
+
- `/ask opencode Analyze this bug`
|
|
37
|
+
- `/ask droid Execute this task`
|
|
38
|
+
|
|
39
|
+
## Notes
|
|
40
|
+
|
|
41
|
+
- `ask` already runs in background by default; no manual `nohup` is needed.
|
|
42
|
+
- If it fails, check backend health with the corresponding ping command (`ping <provider>` (e.g., `ping gemini`)).
|