mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-10 02:24:35 +08:00
- Improved the reading of the discovery index by adding a fallback mechanism to scan directories for discovery folders if the index.json is invalid or missing. - Added sorting of discoveries by creation time in descending order. - Enhanced the `appendToIssuesJsonl` function to include deduplication logic for issues based on ID and source finding ID. - Updated the discovery route handler to reflect the number of issues added and skipped during export. - Introduced UI elements for selecting and deselecting findings in the dashboard. - Added CSS styles for exported findings and action buttons. - Implemented search functionality for filtering findings based on title, file, and description. - Added internationalization support for new UI elements. - Created scripts for automated API extraction from various project types, including FastAPI and TypeScript. - Documented the API extraction process and library bundling instructions.
246 lines
6.1 KiB
Markdown
246 lines
6.1 KiB
Markdown
# API 文档提取脚本
|
|
|
|
根据项目类型自动提取 API 文档,支持 FastAPI、Next.js、Python 模块。
|
|
|
|
## 支持的技术栈
|
|
|
|
| 类型 | 技术栈 | 工具 | 输出格式 |
|
|
|------|--------|------|----------|
|
|
| Backend | FastAPI | openapi-to-md | Markdown |
|
|
| Frontend | Next.js/TypeScript | TypeDoc | Markdown |
|
|
| Python Module | Python | pdoc | Markdown/HTML |
|
|
|
|
## 使用方法
|
|
|
|
### 1. FastAPI Backend (OpenAPI)
|
|
|
|
```bash
|
|
# 提取 OpenAPI JSON
|
|
cd D:/dongdiankaifa9/backend
|
|
python -c "
|
|
from app.main import app
|
|
import json
|
|
print(json.dumps(app.openapi(), indent=2))
|
|
" > api-docs/openapi.json
|
|
|
|
# 转换为 Markdown (使用 widdershins)
|
|
npx widdershins api-docs/openapi.json -o api-docs/API_REFERENCE.md --language_tabs 'python:Python' 'javascript:JavaScript' 'bash:cURL'
|
|
```
|
|
|
|
**备选方案 (无需启动服务)**:
|
|
```python
|
|
# scripts/extract_fastapi_openapi.py
|
|
import sys
|
|
sys.path.insert(0, 'D:/dongdiankaifa9/backend')
|
|
|
|
from app.main import app
|
|
import json
|
|
|
|
openapi_schema = app.openapi()
|
|
with open('api-docs/openapi.json', 'w', encoding='utf-8') as f:
|
|
json.dump(openapi_schema, f, indent=2, ensure_ascii=False)
|
|
|
|
print(f"Extracted {len(openapi_schema.get('paths', {}))} endpoints")
|
|
```
|
|
|
|
### 2. Next.js Frontend (TypeDoc)
|
|
|
|
```bash
|
|
cd D:/dongdiankaifa9/frontend
|
|
|
|
# 安装 TypeDoc
|
|
npm install --save-dev typedoc typedoc-plugin-markdown
|
|
|
|
# 生成文档
|
|
npx typedoc --plugin typedoc-plugin-markdown \
|
|
--out api-docs \
|
|
--entryPoints "./lib" "./hooks" "./components" \
|
|
--entryPointStrategy expand \
|
|
--exclude "**/node_modules/**" \
|
|
--exclude "**/*.test.*" \
|
|
--readme none
|
|
```
|
|
|
|
**typedoc.json 配置**:
|
|
```json
|
|
{
|
|
"$schema": "https://typedoc.org/schema.json",
|
|
"entryPoints": ["./lib", "./hooks", "./components"],
|
|
"entryPointStrategy": "expand",
|
|
"out": "api-docs",
|
|
"plugin": ["typedoc-plugin-markdown"],
|
|
"exclude": ["**/node_modules/**", "**/*.test.*", "**/*.spec.*"],
|
|
"excludePrivate": true,
|
|
"excludeInternal": true,
|
|
"readme": "none",
|
|
"name": "Frontend API Reference"
|
|
}
|
|
```
|
|
|
|
### 3. Python Module (pdoc)
|
|
|
|
```bash
|
|
# 安装 pdoc
|
|
pip install pdoc
|
|
|
|
# hydro_generator_module
|
|
cd D:/dongdiankaifa9
|
|
pdoc hydro_generator_module \
|
|
--output-dir api-docs/hydro_generator \
|
|
--format markdown \
|
|
--no-show-source
|
|
|
|
# multiphysics_network
|
|
pdoc multiphysics_network \
|
|
--output-dir api-docs/multiphysics \
|
|
--format markdown \
|
|
--no-show-source
|
|
```
|
|
|
|
**备选: Sphinx (更强大)**:
|
|
```bash
|
|
# 安装 Sphinx
|
|
pip install sphinx sphinx-markdown-builder
|
|
|
|
# 生成 API 文档
|
|
sphinx-apidoc -o docs/source hydro_generator_module
|
|
cd docs && make markdown
|
|
```
|
|
|
|
## 集成脚本
|
|
|
|
```python
|
|
#!/usr/bin/env python3
|
|
# scripts/extract_all_apis.py
|
|
|
|
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
PROJECTS = {
|
|
'backend': {
|
|
'path': 'D:/dongdiankaifa9/backend',
|
|
'type': 'fastapi',
|
|
'output': 'api-docs/backend'
|
|
},
|
|
'frontend': {
|
|
'path': 'D:/dongdiankaifa9/frontend',
|
|
'type': 'typescript',
|
|
'output': 'api-docs/frontend'
|
|
},
|
|
'hydro_generator_module': {
|
|
'path': 'D:/dongdiankaifa9/hydro_generator_module',
|
|
'type': 'python',
|
|
'output': 'api-docs/hydro_generator'
|
|
},
|
|
'multiphysics_network': {
|
|
'path': 'D:/dongdiankaifa9/multiphysics_network',
|
|
'type': 'python',
|
|
'output': 'api-docs/multiphysics'
|
|
}
|
|
}
|
|
|
|
def extract_fastapi(config):
|
|
"""提取 FastAPI OpenAPI 文档"""
|
|
path = Path(config['path'])
|
|
sys.path.insert(0, str(path))
|
|
|
|
try:
|
|
from app.main import app
|
|
import json
|
|
|
|
output_dir = Path(config['output'])
|
|
output_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
# 导出 OpenAPI JSON
|
|
with open(output_dir / 'openapi.json', 'w', encoding='utf-8') as f:
|
|
json.dump(app.openapi(), f, indent=2, ensure_ascii=False)
|
|
|
|
print(f"✓ FastAPI: {len(app.openapi().get('paths', {}))} endpoints")
|
|
return True
|
|
except Exception as e:
|
|
print(f"✗ FastAPI error: {e}")
|
|
return False
|
|
|
|
def extract_typescript(config):
|
|
"""提取 TypeScript 文档"""
|
|
try:
|
|
subprocess.run([
|
|
'npx', 'typedoc',
|
|
'--plugin', 'typedoc-plugin-markdown',
|
|
'--out', config['output'],
|
|
'--entryPoints', './lib', './hooks',
|
|
'--entryPointStrategy', 'expand'
|
|
], cwd=config['path'], check=True)
|
|
print(f"✓ TypeDoc: {config['path']}")
|
|
return True
|
|
except Exception as e:
|
|
print(f"✗ TypeDoc error: {e}")
|
|
return False
|
|
|
|
def extract_python(config):
|
|
"""提取 Python 模块文档"""
|
|
try:
|
|
module_name = Path(config['path']).name
|
|
subprocess.run([
|
|
'pdoc', module_name,
|
|
'--output-dir', config['output'],
|
|
'--format', 'markdown'
|
|
], cwd=Path(config['path']).parent, check=True)
|
|
print(f"✓ pdoc: {module_name}")
|
|
return True
|
|
except Exception as e:
|
|
print(f"✗ pdoc error: {e}")
|
|
return False
|
|
|
|
EXTRACTORS = {
|
|
'fastapi': extract_fastapi,
|
|
'typescript': extract_typescript,
|
|
'python': extract_python
|
|
}
|
|
|
|
if __name__ == '__main__':
|
|
for name, config in PROJECTS.items():
|
|
print(f"\n[{name}]")
|
|
extractor = EXTRACTORS.get(config['type'])
|
|
if extractor:
|
|
extractor(config)
|
|
```
|
|
|
|
## Phase 3 集成
|
|
|
|
在 `api-reference` Agent 提示词中添加:
|
|
|
|
```
|
|
[PRE-EXTRACTION]
|
|
运行 API 提取脚本获取结构化文档:
|
|
- python scripts/extract_all_apis.py
|
|
|
|
[INPUT FILES]
|
|
- api-docs/backend/openapi.json (FastAPI endpoints)
|
|
- api-docs/frontend/*.md (TypeDoc output)
|
|
- api-docs/hydro_generator/*.md (pdoc output)
|
|
- api-docs/multiphysics/*.md (pdoc output)
|
|
```
|
|
|
|
## 输出结构
|
|
|
|
```
|
|
api-docs/
|
|
├── backend/
|
|
│ ├── openapi.json # Raw OpenAPI spec
|
|
│ └── API_REFERENCE.md # Converted Markdown
|
|
├── frontend/
|
|
│ ├── modules.md
|
|
│ ├── functions.md
|
|
│ └── classes/
|
|
├── hydro_generator/
|
|
│ ├── assembler.md
|
|
│ ├── blueprint.md
|
|
│ └── builders/
|
|
└── multiphysics/
|
|
├── analysis_domain.md
|
|
├── builders.md
|
|
└── compilers.md
|
|
```
|