167 lines
6.3 KiB
JavaScript
167 lines
6.3 KiB
JavaScript
|
|
export const docWriteTool = {
|
|||
|
|
name: "doc_write",
|
|||
|
|
description: "为代码生成文档指引。分析代码结构,提取函数/类/接口信息,返回结构化的文档框架和编写指引。",
|
|||
|
|
inputSchema: {
|
|||
|
|
type: "object",
|
|||
|
|
properties: {
|
|||
|
|
code: {
|
|||
|
|
type: "string",
|
|||
|
|
description: "需要生成文档的代码",
|
|||
|
|
},
|
|||
|
|
doc_type: {
|
|||
|
|
type: "string",
|
|||
|
|
description: "文档类型",
|
|||
|
|
enum: ["readme", "api", "inline", "changelog", "jsdoc"],
|
|||
|
|
},
|
|||
|
|
language: {
|
|||
|
|
type: "string",
|
|||
|
|
description: "编程语言",
|
|||
|
|
},
|
|||
|
|
project_name: {
|
|||
|
|
type: "string",
|
|||
|
|
description: "项目名称(可选,用于 README)",
|
|||
|
|
},
|
|||
|
|
extra_info: {
|
|||
|
|
type: "string",
|
|||
|
|
description: "额外信息(可选,如版本号、变更内容等)",
|
|||
|
|
},
|
|||
|
|
},
|
|||
|
|
required: ["code", "doc_type", "language"],
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
function extractSymbols(code, language) {
|
|||
|
|
const symbols = [];
|
|||
|
|
const lines = code.split("\n");
|
|||
|
|
for (let i = 0; i < lines.length; i++) {
|
|||
|
|
const line = lines[i].trim();
|
|||
|
|
const lineNum = i + 1;
|
|||
|
|
// 函数
|
|||
|
|
let m;
|
|||
|
|
if ((m = line.match(/(?:export\s+)?(?:async\s+)?function\s+(\w+)\s*\(([^)]*)\)/))) {
|
|||
|
|
symbols.push({ type: "function", name: m[1], line: lineNum, signature: m[0] });
|
|||
|
|
}
|
|||
|
|
// 箭头函数 / const 赋值
|
|||
|
|
else if ((m = line.match(/(?:export\s+)?(?:const|let|var)\s+(\w+)\s*=\s*(?:async\s+)?\(?([^)]*)\)?\s*=>/))) {
|
|||
|
|
symbols.push({ type: "function", name: m[1], line: lineNum, signature: m[0] });
|
|||
|
|
}
|
|||
|
|
// 类
|
|||
|
|
else if ((m = line.match(/(?:export\s+)?class\s+(\w+)/))) {
|
|||
|
|
symbols.push({ type: "class", name: m[1], line: lineNum });
|
|||
|
|
}
|
|||
|
|
// 接口 (TS)
|
|||
|
|
else if ((m = line.match(/(?:export\s+)?interface\s+(\w+)/))) {
|
|||
|
|
symbols.push({ type: "interface", name: m[1], line: lineNum });
|
|||
|
|
}
|
|||
|
|
// 路由 (Express/FastAPI)
|
|||
|
|
else if ((m = line.match(/(?:router|app)\.(get|post|put|delete|patch)\s*\(\s*['"]([^'"]+)['"]/))) {
|
|||
|
|
symbols.push({ type: "route", name: `${m[1].toUpperCase()} ${m[2]}`, line: lineNum });
|
|||
|
|
}
|
|||
|
|
// Python 函数
|
|||
|
|
else if ((m = line.match(/(?:async\s+)?def\s+(\w+)\s*\(([^)]*)\)/))) {
|
|||
|
|
symbols.push({ type: "function", name: m[1], line: lineNum, signature: m[0] });
|
|||
|
|
}
|
|||
|
|
// Python 类
|
|||
|
|
else if ((m = line.match(/class\s+(\w+)(?:\(([^)]*)\))?:/))) {
|
|||
|
|
symbols.push({ type: "class", name: m[1], line: lineNum });
|
|||
|
|
}
|
|||
|
|
// export default
|
|||
|
|
else if ((m = line.match(/export\s+default\s+(\w+)/))) {
|
|||
|
|
symbols.push({ type: "export", name: m[1], line: lineNum });
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return symbols;
|
|||
|
|
}
|
|||
|
|
const docTypeInstructions = {
|
|||
|
|
readme: `请生成 README.md,包含以下章节:
|
|||
|
|
# 项目名称
|
|||
|
|
## 简介(一句话描述)
|
|||
|
|
## 功能特性
|
|||
|
|
## 快速开始(安装、配置、运行)
|
|||
|
|
## API / 使用说明
|
|||
|
|
## 项目结构
|
|||
|
|
## License`,
|
|||
|
|
api: `请生成 API 文档,每个端点/函数包含:
|
|||
|
|
- 描述
|
|||
|
|
- 请求方法和路径(如适用)
|
|||
|
|
- 参数(名称、类型、是否必填、描述)
|
|||
|
|
- 返回值(类型、描述)
|
|||
|
|
- 示例代码
|
|||
|
|
- 错误码(如适用)`,
|
|||
|
|
inline: `请为代码添加内联注释:
|
|||
|
|
- 每个函数/方法添加文档注释(JSDoc / docstring)
|
|||
|
|
- 关键逻辑添加简洁的解释性注释
|
|||
|
|
- 不要过度注释显而易见的代码
|
|||
|
|
- 返回带注释的完整代码`,
|
|||
|
|
changelog: `请生成 CHANGELOG.md,遵循 Keep a Changelog 格式:
|
|||
|
|
## [版本号] - 日期
|
|||
|
|
### Added(新增)
|
|||
|
|
### Changed(变更)
|
|||
|
|
### Fixed(修复)
|
|||
|
|
### Removed(移除)`,
|
|||
|
|
jsdoc: `请为所有函数/类/接口生成文档注释:
|
|||
|
|
- @param 参数(类型、描述)
|
|||
|
|
- @returns 返回值(类型、描述)
|
|||
|
|
- @throws 可能的异常
|
|||
|
|
- @example 使用示例
|
|||
|
|
- 返回带完整文档注释的代码`,
|
|||
|
|
};
|
|||
|
|
export async function executeDocWrite(args) {
|
|||
|
|
const { code, doc_type, language, project_name, extra_info } = args;
|
|||
|
|
const symbols = extractSymbols(code, language);
|
|||
|
|
const lines = code.split("\n");
|
|||
|
|
const output = [
|
|||
|
|
`# 文档生成指引`,
|
|||
|
|
``,
|
|||
|
|
`**文档类型**: ${doc_type} | **语言**: ${language}${project_name ? ` | **项目**: ${project_name}` : ""}`,
|
|||
|
|
``,
|
|||
|
|
];
|
|||
|
|
// 代码结构分析
|
|||
|
|
output.push(`## 代码结构分析`, ``);
|
|||
|
|
const functions = symbols.filter((s) => s.type === "function");
|
|||
|
|
const classes = symbols.filter((s) => s.type === "class");
|
|||
|
|
const interfaces = symbols.filter((s) => s.type === "interface");
|
|||
|
|
const routes = symbols.filter((s) => s.type === "route");
|
|||
|
|
if (functions.length > 0) {
|
|||
|
|
output.push(`### 函数 (${functions.length})`);
|
|||
|
|
for (const f of functions) {
|
|||
|
|
output.push(`- **${f.name}** (行 ${f.line})${f.signature ? `: \`${f.signature}\`` : ""}`);
|
|||
|
|
}
|
|||
|
|
output.push(``);
|
|||
|
|
}
|
|||
|
|
if (classes.length > 0) {
|
|||
|
|
output.push(`### 类 (${classes.length})`);
|
|||
|
|
for (const c of classes) {
|
|||
|
|
output.push(`- **${c.name}** (行 ${c.line})`);
|
|||
|
|
}
|
|||
|
|
output.push(``);
|
|||
|
|
}
|
|||
|
|
if (interfaces.length > 0) {
|
|||
|
|
output.push(`### 接口 (${interfaces.length})`);
|
|||
|
|
for (const i of interfaces) {
|
|||
|
|
output.push(`- **${i.name}** (行 ${i.line})`);
|
|||
|
|
}
|
|||
|
|
output.push(``);
|
|||
|
|
}
|
|||
|
|
if (routes.length > 0) {
|
|||
|
|
output.push(`### API 路由 (${routes.length})`);
|
|||
|
|
for (const r of routes) {
|
|||
|
|
output.push(`- **${r.name}** (行 ${r.line})`);
|
|||
|
|
}
|
|||
|
|
output.push(``);
|
|||
|
|
}
|
|||
|
|
if (symbols.length === 0) {
|
|||
|
|
output.push(`_未检测到标准的函数/类/接口/路由定义_`, ``);
|
|||
|
|
}
|
|||
|
|
// 统计
|
|||
|
|
output.push(`### 文件统计`, `- 总行数: ${lines.length}`, `- 代码符号: ${symbols.length} 个`, ``);
|
|||
|
|
// 文档编写指引
|
|||
|
|
const instruction = docTypeInstructions[doc_type] || docTypeInstructions.readme;
|
|||
|
|
output.push(`## 文档编写指引`, ``, instruction, ``);
|
|||
|
|
if (extra_info) {
|
|||
|
|
output.push(`## 补充信息`, extra_info, ``);
|
|||
|
|
}
|
|||
|
|
// 附上源代码
|
|||
|
|
output.push(`## 源代码`, "```" + language, code, "```");
|
|||
|
|
return output.join("\n");
|
|||
|
|
}
|
|||
|
|
//# sourceMappingURL=docWrite.js.map
|