Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion .claude/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,15 +180,22 @@ bun run install:plugins
bun run build:pkg
```

### 3. 生产部署
### 3. 测试和部署
```bash
# 运行测试
bun run test

# 构建生产版本
bun run build:runtime

# 启动生产服务
bun run start
```

**⚠️ 重要**:
- 测试命令使用 `bun run test` 而不是 `bun test`
- 测试环境使用 Vitest 运行器,支持 mock 和覆盖率

## 快速适配指南

### 1. 工具适配步骤
Expand Down
8 changes: 4 additions & 4 deletions lib/s3/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -249,11 +249,11 @@ export class S3Service {

// const fileId = this.generateFileId();
const prefix = input.prefix
? input.prefix?.endsWith('/')
? input.prefix
: input.prefix + '/'
? !input.prefix?.endsWith('/')
? input.prefix + '/'
: input.prefix
: PluginBaseS3Prefix;
const objectName = `${prefix}${input.keepRawFilename ? '' : this.generateFileId() + '-'}${originalFilename}`;
const objectName = `${prefix}/${input.keepRawFilename ? '' : this.generateFileId() + '-'}${originalFilename}`;
if (input.expireMins) {
await MongoS3TTL.create({
bucketName: this.config.bucket,
Expand Down
12 changes: 12 additions & 0 deletions modules/tool/packages/docDiff/DESIGN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# DocDiff 系统工具

输入:两个 markdown 格式的纯文本内容
输出:一个 html 文件

提供一个 html 模版文件, 对两个文本内容进行对比,逐段对比,分析其中的差异,高亮显示差异。

描述工具集名称,以及子工具,子工具需要包含 ID,名字,哪些输入输出,例如:

---

下面由 AI 生成完整的设计文档
127 changes: 127 additions & 0 deletions modules/tool/packages/docDiff/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
# DocDiff 文档对比工具

一个用于对比两个 Markdown 文档差异的 FastGPT 工具,生成可视化的 HTML 对比报告。

## 功能特性

- 📝 **行级对比**: 逐行分析文档差异,精确识别变更
- 🎨 **可视化报告**: 生成美观的双栏 HTML 对比报告
- 🔄 **导航功能**: 支持按钮和键盘快捷键在变更间跳转
- 📊 **统计信息**: 显示新增、删除、修改、未修改的行数
- 🔒 **安全防护**: 自动转义 HTML 字符,防止 XSS 攻击
- 📱 **响应式设计**: 支持移动端浏览
- ⚡ **高性能**: 基于相似度算法的智能对比

## 使用方法

### 输入参数

- **originalText** (必需): 原始的 Markdown 文档内容
- **modifiedText** (必需): 修改后的 Markdown 文档内容
- **title** (可选): 对比报告的标题,默认为"文档对比报告"

### 输出

返回 HTML 文件访问 URL,包含:
- 文档标题和生成时间
- 变更统计信息
- 双栏对比视图(左为原始文档,右为修改后文档)
- 导航控制按钮
- 响应式设计支持

## 对比算法

工具使用智能的相似度算法来识别文档变化:

1. **行级分割**: 将文档按换行符分割为行
2. **相似度计算**: 基于字符级别的相似度匹配
3. **变更分类**:
- 未修改 (>80% 相似度)
- 修改 (10%-80% 相似度)
- 新增 (仅在修改后文档中存在)
- 删除 (仅在原始文档中存在)
4. **最佳匹配**: 寻找最相似的行配对

## 使用示例

```typescript
const result = await tool({
originalText: `# 项目文档

## 功能介绍
这是一个测试功能。

## 安装步骤
1. 下载代码
2. 运行安装命令`,

modifiedText: `# 项目文档

## 功能介绍
这是一个更新的测试功能。

## 安装步骤
1. 下载代码
2. 运行安装命令
3. 配置环境变量`,

title: "项目文档变更记录"
});

console.log(result.htmlUrl); // 输出 HTML 对比报告 URL
```

## HTML 报告特性

- 🎨 **现代化设计**: 渐变背景、卡片布局、阴影效果
- 📈 **统计仪表板**: 直观显示各类变更数量
- 🔄 **双栏对比**: 左右并排显示原始和修改内容
- 🎯 **导航功能**: 点击按钮或使用键盘快捷键在变更间跳转
- 🏷️ **状态标签**: 不同颜色标识变更类型
- ✨ **高亮效果**: 柔和的高亮提示,自动消失
- 📝 **代码显示**: 使用等宽字体保持格式
- 📱 **响应式布局**: 自适应不同屏幕尺寸

## 技术实现

- **TypeScript**: 类型安全的实现
- **Zod 验证**: 输入参数验证
- **纯函数设计**: 无副作用的处理逻辑
- **HTML 安全**: 自动转义特殊字符

## 适用场景

- 📄 **文档版本对比**: 比较文档的不同版本
- 📝 **内容审核**: 查看内容修改记录
- 🔄 **变更追踪**: 跟踪文档变化
- 📊 **差异分析**: 分析文档变更模式

## 开发和测试

```bash
# 安装依赖
bun install

# 运行测试
bun test

# 类型检查
bun run tsc --noEmit

# 构建
bun run build
```

## 测试覆盖

- ✅ 输入验证测试
- ✅ 文档对比逻辑测试
- ✅ HTML 输出质量测试
- ✅ 边界情况测试
- ✅ 安全性测试

## 版本信息

- **当前版本**: 1.0.0
- **FastGPT 兼容性**: 完全兼容
- **依赖**: 仅依赖 Zod,无外部 API 调用
34 changes: 34 additions & 0 deletions modules/tool/packages/docDiff/bun.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"lockfileVersion": 1,
"workspaces": {
"": {
"name": "@fastgpt-plugins/tool-doc-diff",
"dependencies": {
"zod": "^3.25.76",
},
"devDependencies": {
"@types/bun": "latest",
},
"peerDependencies": {
"typescript": "^5.0.0",
},
},
},
"packages": {
"@types/bun": ["@types/bun@1.3.1", "", { "dependencies": { "bun-types": "1.3.1" } }, "sha512-4jNMk2/K9YJtfqwoAa28c8wK+T7nvJFOjxI4h/7sORWcypRNxBpr+TPNaCfVWq70tLCJsqoFwcf0oI0JU/fvMQ=="],

"@types/node": ["@types/node@24.10.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A=="],

"@types/react": ["@types/react@19.2.2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="],

"bun-types": ["bun-types@1.3.1", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-NMrcy7smratanWJ2mMXdpatalovtxVggkj11bScuWuiOoXTiKIu2eVS1/7qbyI/4yHedtsn175n4Sm4JcdHLXw=="],

"csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],

"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],

"undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],

"zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
}
}
67 changes: 67 additions & 0 deletions modules/tool/packages/docDiff/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { defineTool } from '@tool/type';
import { FlowNodeInputTypeEnum, WorkflowIOValueTypeEnum } from '@tool/type/fastgpt';
import { ToolTagEnum } from '@tool/type/tags';

export default defineTool({
name: {
'zh-CN': '文档对比工具',
en: 'DocDiff'
},
tags: [ToolTagEnum.enum.tools],
description: {
'zh-CN': '对比两个 Markdown 文档的差异,生成可视化的 HTML 对比报告',
en: 'Compare differences between two Markdown documents and generate visual HTML comparison report'
},
toolDescription:
'A tool that compares two markdown documents and generates a visual HTML diff report showing differences section by section',

versionList: [
{
value: '1.0.0',
description: 'Initial version',
inputs: [
{
key: 'originalText',
label: '原始文档',
description: '原始的 Markdown 格式文档内容',
required: true,
valueType: WorkflowIOValueTypeEnum.string,
renderTypeList: [FlowNodeInputTypeEnum.textarea, FlowNodeInputTypeEnum.reference],
toolDescription: 'The original markdown document content to compare'
},
{
key: 'modifiedText',
label: '修改后文档',
description: '修改后的 Markdown 格式文档内容',
required: true,
valueType: WorkflowIOValueTypeEnum.string,
renderTypeList: [FlowNodeInputTypeEnum.textarea, FlowNodeInputTypeEnum.reference],
toolDescription: 'The modified markdown document content to compare'
},
{
key: 'title',
label: '对比报告标题',
description: '生成的 HTML 对比报告的标题',
required: false,
valueType: WorkflowIOValueTypeEnum.string,
renderTypeList: [FlowNodeInputTypeEnum.input],
defaultValue: '文档对比报告'
}
],
outputs: [
{
valueType: WorkflowIOValueTypeEnum.string,
key: 'htmlUrl',
label: 'HTML 对比报告连接',
description: '生成的 HTML 对比报告的访问连接'
},
{
valueType: WorkflowIOValueTypeEnum.arrayObject,
key: 'diffs',
label: '差异结果数组',
description: '过滤后的文档差异数组,包含新增、删除、修改的变更'
}
]
}
]
});
10 changes: 10 additions & 0 deletions modules/tool/packages/docDiff/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import config from './config';
import { InputType, OutputType, tool as toolCb } from './src';
import { exportTool } from '@tool/utils/tool';

export default exportTool({
toolCb,
InputType,
OutputType,
config
});
20 changes: 20 additions & 0 deletions modules/tool/packages/docDiff/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
17 changes: 17 additions & 0 deletions modules/tool/packages/docDiff/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"name": "@fastgpt-plugins/tool-doc-diff",
"module": "index.ts",
"type": "module",
"scripts": {
"build": "bun ../../../../scripts/build.ts"
},
"devDependencies": {
"@types/bun": "latest"
},
"peerDependencies": {
"typescript": "^5.0.0"
},
"dependencies": {
"zod": "^3.25.76"
}
}
Loading