Skip to content

Commit 865d931

Browse files
committed
feat: ✨ 重构项目架构,支持 GitLab 和 GitHub 双平台
- ✨ 新增 GitHub 平台支持,实现与 GitLab 同等的链接转换功能 - 🏗️ 重构代码架构,将平台特定逻辑拆分为独立处理器(`gitlab-handler.js`、`github-handler.js`) - 🔧 更新项目名称为 "Lark Project Linker",更准确反映项目功能 - 📝 完善 README 文档,新增架构说明和扩展指南 - 🍱 更新文档图片,添加 GitLab 和 GitHub 的功能预览图 - ♻️ 优化 `index.js` 为核心入口,提供通用功能模块 - 🔨 改进 `store.js` 缓存管理机制,支持多平台配置 📊 影响面评估: - 影响核心架构和所有功能模块 - 新增 GitHub 平台支持,不影响现有 GitLab 功能 - 代码结构更清晰,易于扩展新平台 - 建议在 GitLab 和 GitHub 环境中进行完整功能测试
1 parent f80b861 commit 865d931

25 files changed

+1908
-647
lines changed

README.md

Lines changed: 194 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,49 @@
1-
# GitLab link to Lark
1+
# Lark Project Linker
2+
3+
一个浏览器插件,连接 GitLab/GitHub/Sentry 与飞书项目。自动将项目 ID(如 `#TAP-xxx`)转换为可点击的飞书链接,支持智能类型识别(Story/Issue)和一键创建飞书工单。让你的 DevOps 工作流更高效!
24

3-
一个浏览器插件,用于提供 GitLab 项目中关联的飞书项目 ID 转换为飞书链接,并支持在 Sentry 中快速创建飞书 Issue。方便在 GitLab 项目中快速跳转查看飞书项目信息。
45
[飞书参考资料](https://bytedance.larkoffice.com/wiki/XusFwYp2ZiqltkkSTaJc7eMdnYb)
56

67
## ✨ 主要功能
78

8-
### GitLab 集成
9-
- 🔗 **自动转换链接**:将 GitLab 中的 `#XX-xxx``#M-xxx``#F-xxx` 等格式自动转换为飞书链接
9+
### GitLab/GitHub 集成
10+
- 🔗 **自动转换链接**:将 GitLab/GitHub 中的 `#XX-xxx``#M-xxx``#F-xxx` 等格式自动转换为飞书链接
1011
- 🎯 **智能类型识别**:根据 commit 类型前缀自动判断是 Issue 还是 Story
1112
- `fix:``bugfix:``hotfix:` → Issue
1213
- `feat:``chore:``refactor:` → Story
13-
- 💡 **自定义 Tooltip**:显示 "Issue in Lark" 或 "Story in Lark",替代 GitLab 原生的 "Issue in Jira"
14+
- 💡 **自定义 Tooltip**:显示 "Issue in Lark" 或 "Story in Lark",替代原生的 tooltip
1415
- 🚀 **实时监听**:自动检测页面变化、标签切换、URL 变化
1516
-**性能优化**:防抖机制、智能缓存、避免重复处理
1617
- 🔄 **类型统一**:确保同一 tid 的所有链接类型一致
18+
- 🌐 **多平台支持**:同时支持 GitLab 和 GitHub
1719

18-
### Sentry 集成 🆕
20+
### Sentry 集成
1921
- 🎫 **快速创建工单**:在 Sentry Issue 页面一键创建飞书 Issue
2022
- 📝 **自动填充信息**:自动提取 Sentry Issue 标题、描述和 URL
2123
- 🔗 **智能按钮定位**:自动在 Issue Tracking 区域添加"创建飞书 Issue"按钮
2224

23-
# 功能预览
25+
## 功能预览
2426

25-
<img src="./docs/preview1.png" alt="preview1" />
26-
<img src="./docs/preview2.png" alt="preview2" />
27+
### GitLab/GitHub 链接转换
28+
<img src="./docs/preview-1.png" alt="GitLab MR 列表" />
29+
<img src="./docs/preview-2.png" alt="GitHub Commits" />
2730

28-
# 安装
31+
## 安装
2932

30-
## 商店安装
33+
### 商店安装
3134

3235
[Chrome 应用商店](https://chromewebstore.google.com/detail/gitlab-link-to-lark/ocmkgfnifakgckfeofcoakiniljdjcfp)
3336

34-
## 本地开发安装
37+
### 本地开发安装
3538

36-
### 1. 克隆项目
39+
#### 1. 克隆项目
3740

3841
```bash
39-
git clone https://github.com/wangbax/gitlab-link-to-lark.git
40-
cd gitlab-link-to-lark
42+
git clone https://github.com/wangbax/lark-project-linker.git
43+
cd lark-project-linker
4144
```
4245

43-
### 2. 安装依赖
46+
#### 2. 安装依赖
4447

4548
要求:Node.js >= 18
4649

@@ -52,7 +55,7 @@ yarn install
5255
npm install
5356
```
5457

55-
### 3. 构建项目
58+
#### 3. 构建项目
5659

5760
```bash
5861
# 使用 yarn
@@ -64,9 +67,9 @@ npm run build
6467

6568
构建完成后,产物会生成在 `dist` 目录中。
6669

67-
### 4. 在浏览器中加载扩展
70+
#### 4. 在浏览器中加载扩展
6871

69-
#### Chrome/Edge 浏览器
72+
##### Chrome/Edge 浏览器
7073

7174
1. 打开浏览器,访问扩展管理页面:
7275
- Chrome: `chrome://extensions/`
@@ -80,27 +83,20 @@ npm run build
8083

8184
<img src="./docs/install-2.png" alt="install" />
8285

83-
4. 选择项目的 `dist` 文件夹
84-
85-
<img src="./docs/install-3.png" alt="install" />
86-
87-
5. 扩展安装成功!
88-
89-
### 5. 配置扩展
90-
91-
安装完成后,点击扩展图标或在扩展管理页面点击「选项」进行配置:
86+
4. 选择项目的 `dist` 文件夹,扩展安装成功!
9287

93-
<img src="./docs/install-4.png" alt="install" />
88+
## 配置
9489

95-
需要配置以下信息:
90+
安装完成后,点击扩展图标或在扩展管理页面点击「选项」进行配置
9691

97-
#### GitLab 配置
92+
### GitLab/GitHub 配置
9893
- **飞书命名空间**:你的飞书项目空间名称,支持多个,用逗号分隔(如:`pojq34,app1,app2`
9994
- 插件会自动尝试每个命名空间,直到找到有效的那个
100-
- **GitLab 域名地址**:用于匹配激活插件(如:`gitlab.com`
101-
- **项目 ID 前缀**:GitLab 中使用的项目 ID 前缀,多个用逗号分隔(如:`XX,M,F`
95+
- **域名地址**:用于匹配激活插件(如:`gitlab.com,github.com`),支持多个域名,用逗号分隔
96+
- **项目 ID 前缀**:项目中使用的项目 ID 前缀,多个用逗号分隔(如:`XX,M,F,TAP`
97+
- 支持大小写,如 `TAP` 可匹配 `#TAP-6616715346`
10298

103-
#### Sentry 配置(可选)🆕
99+
### Sentry 配置(可选)
104100
- **Sentry 域名地址**:你的 Sentry 域名(如:`sentry.com`),支持多个,用逗号分隔
105101
- **Sentry Issue 创建地址**:后端 API 地址(如:`http://localhost:8080/api/feishu-sentry`
106102
- 用于创建飞书工单、查询现有工单、获取字段选项
@@ -114,35 +110,11 @@ npm run build
114110
- 后端会进一步验证并自动更正类型
115111
- 多个飞书命名空间会按配置顺序依次尝试,并缓存有效的结果
116112

117-
## 智能类型识别
118-
119-
插件会根据以下规则自动判断链接类型:
120-
121-
### 1. 前缀优先
122-
- `M-xxx` → Story
123-
- `F-xxx` → Issue
124-
125-
### 2. 上下文分析(针对其他前缀)
126-
扫描链接所在的 commit message、标题等上下文:
127-
128-
**Issue 类型**(修复类):
129-
- `fix: 修复登录问题 #XX-123456789`
130-
- `bugfix: 解决崩溃 #XX-123456789`
131-
- `hotfix: 紧急修复 #XX-123456789`
132-
133-
**Story 类型**(功能/任务类):
134-
- `feat: 新增用户中心 #XX-123456789`
135-
- `chore: 更新依赖 #XX-123456789`
136-
- `refactor: 代码重构 #XX-123456789`
137-
138-
### 3. 后端验证
139-
插件会向飞书 API 请求实际类型,并自动更新所有相同 tid 的链接。
140-
141113
## 使用场景
142114

143-
### GitLab 使用
115+
### GitLab/GitHub 使用
144116

145-
#### Merge Request 标题
117+
#### Merge Request/Pull Request 标题
146118
```
147119
fix: [AutoTest] Android 三方授权页面顶部无 title #XX-6581113659
148120
@@ -156,12 +128,31 @@ feat: 新增分享功能 #XX-123456789
156128
自动识别为 Story
157129
```
158130

131+
#### GitHub Commits 页面示例
132+
```
133+
feat: 修复 detekt 报错 # TAP-6616715346
134+
135+
点击项目 ID 跳转到飞书
136+
悬浮显示 Lark Tooltip
137+
```
138+
139+
在 GitHub commits 页面(如 `https://github.com/taptap/TapSDK-Monorepo/commits/branch-name/`):
140+
- 📍 commit 标题中的 `# TAP-6616715346` 会被识别
141+
- 🎯 点击项目 ID 部分直接跳转到飞书
142+
- 💡 悬浮显示飞书项目信息
143+
- 🔄 自动根据 commit 类型判断 Issue/Story
144+
145+
**配置示例:**
146+
- 域名地址:`github.com`
147+
- 项目 ID 前缀:`TAP,XX,M,F`(根据实际项目配置)
148+
159149
#### 页面自动刷新
160150
- ✅ 切换到 Commits 标签 → 自动扫描新链接
161151
- ✅ 切换到 Changes 标签 → 自动扫描新链接
162152
- ✅ 浏览器前进/后退 → 自动扫描新链接
153+
- ✅ GitHub Turbo 导航 → 自动扫描新链接
163154

164-
### Sentry 使用 🆕
155+
### Sentry 使用
165156

166157
#### 快速创建飞书工单
167158

@@ -192,13 +183,15 @@ feat: 新增分享功能 #XX-123456789
192183
├── dist/ # 构建产物
193184
├── src/
194185
│ ├── js/ # JavaScript 源码
195-
│ │ ├── background.js # 后台脚本
196-
│ │ ├── index.js # GitLab 内容脚本
197-
│ │ ├── sentry.js # Sentry 内容脚本 🆕
198-
│ │ ├── options.js # 配置页面
199-
│ │ ├── utils.js # 工具函数
200-
│ │ ├── store.js # 配置存储
201-
│ │ └── ...
186+
│ │ ├── index.js # 主入口,核心通用功能
187+
│ │ ├── gitlab-handler.js # GitLab 平台处理器
188+
│ │ ├── github-handler.js # GitHub 平台处理器
189+
│ │ ├── background.js # 后台脚本
190+
│ │ ├── sentry.js # Sentry 内容脚本
191+
│ │ ├── options.js # 配置页面
192+
│ │ ├── store.js # 配置存储与缓存管理
193+
│ │ ├── utils.js # 工具函数
194+
│ │ └── event.js # 事件常量
202195
│ ├── html/ # HTML 页面
203196
│ └── assets/ # 静态资源
204197
├── gulpfile.js # 构建配置
@@ -214,16 +207,132 @@ npm run watch
214207

215208
修改代码后,需要在浏览器扩展管理页面点击「重新加载」按钮。
216209

217-
# 使用
210+
### 代码架构
211+
212+
项目采用模块化架构,平台特定逻辑独立管理:
213+
214+
```
215+
┌─────────────────────────────────────────────┐
216+
│ index.js (主入口) │
217+
│ - 初始化配置和缓存 │
218+
│ - 提供核心功能(Popover、链接生成等) │
219+
│ - 监听通用事件 │
220+
│ - 初始化平台处理器 │
221+
└────────────┬────────────────────────────────┘
222+
│ 使用
223+
224+
┌────────────────────────┐
225+
│ store.js │
226+
│ - 配置管理 │
227+
│ - 缓存管理 │
228+
└────────────────────────┘
229+
230+
│ 创建处理器
231+
┌───────┴────────┐
232+
↓ ↓
233+
┌──────────────┐ ┌──────────────┐
234+
│gitlab-handler│ │github-handler│
235+
│ GitLab │ │ GitHub │
236+
│ 平台处理 │ │ 平台处理 │
237+
└──────────────┘ └──────────────┘
238+
```
239+
240+
### 添加新平台支持
241+
242+
添加新平台只需3步:
243+
244+
#### 1. 创建处理器文件
245+
```javascript
246+
// src/js/bitbucket-handler.js
247+
export function createBitbucketHandler(context) {
248+
function init() {
249+
// 初始化逻辑
250+
}
251+
252+
return { init };
253+
}
254+
```
255+
256+
#### 2. 导入处理器
257+
```javascript
258+
// src/js/index.js
259+
import { createBitbucketHandler } from "./bitbucket-handler";
260+
```
261+
262+
#### 3. 初始化处理器
263+
```javascript
264+
// src/js/index.js
265+
const isBitbucket = window.location.host.includes('bitbucket');
266+
267+
if (isBitbucket) {
268+
platformHandler = createBitbucketHandler(context);
269+
platformHandler.init();
270+
}
271+
```
218272

219-
配置完成后,访问 GitLab 项目页面,插件会自动将 `#XX-xxx``#M-xxx``#F-xxx` 等格式的项目 ID 转换为可点击的飞书链接。
273+
### 调试技巧
220274

221-
# Preview
275+
#### 查看缓存
276+
```javascript
277+
// 在浏览器控制台中
278+
chrome.storage.local.get('LARK_PROJECT_TYPE_CACHE', (result) => {
279+
console.log(result);
280+
});
281+
```
222282

223-
<img src="./docs/preview.png" alt="preview" />
283+
#### 清除缓存
284+
```javascript
285+
// 在浏览器控制台中
286+
chrome.storage.local.remove('LARK_PROJECT_TYPE_CACHE');
287+
```
224288

225289
## 更新日志
226290

291+
### v2.3.0 (2026-01-14)
292+
293+
**新增功能:**
294+
-**GitHub 完整支持**:新增对 GitHub 平台的完整支持
295+
- 支持 GitHub Commits 页面(如 `github.com/user/repo/commits/branch/`
296+
- 智能识别 commit 标题中的项目 ID(如 `# TAP-6616715346`
297+
- 点击项目 ID 部分直接跳转到飞书(无需嵌套链接)
298+
- 支持 GitHub Pull Request 标题和评论
299+
- 支持 GitHub Turbo/PJAX 导航自动刷新
300+
- 自动识别 GitHub issue-link 和 hovercard 链接
301+
- 🌐 **多平台统一体验**:GitLab 和 GitHub 使用相同的智能类型识别和 Tooltip
302+
303+
**代码重构:**
304+
- ♻️ **模块化架构**:将代码拆分为独立的平台处理器
305+
- `gitlab-handler.js` - GitLab 平台特定处理
306+
- `github-handler.js` - GitHub 平台特定处理
307+
- `index.js` - 核心通用功能
308+
- `store.js` - 配置存储与缓存管理
309+
- 📚 **架构优化**
310+
- 平台逻辑完全独立,互不影响
311+
- 通过上下文对象共享状态和功能
312+
- 添加新平台只需 3 步
313+
- 整合 7 个文档文件为统一的 README.md
314+
- 🎯 **代码质量提升**
315+
- 清理所有 console.log 调试日志
316+
- 统一函数命名规范
317+
- 完善代码注释
318+
- 移除所有内联脚本,符合 CSP 规范
319+
320+
**Bug 修复:**
321+
- 🐛 修复 GitLab MR 列表页标题不生效问题
322+
- 🐛 修复飞书链接拼接错误
323+
- 🐛 修复 GitHub Issue 详情页标题不生效
324+
- 🐛 修复 GitHub Issue 描述和评论不可点击
325+
326+
**UI 优化:**
327+
- 🎨 **配置页面优化**
328+
- Sentry 配置改为"其他配置"并默认折叠
329+
- 添加展开/折叠动画效果
330+
- 优化配置项布局,突出核心配置
331+
- 🎨 **交互优化**
332+
- GitHub commit 标题中的项目 ID 显示虚线下划线
333+
- 悬浮显示飞书项目信息 Tooltip
334+
- 点击项目 ID 阻止原 commit 链接跳转,直接打开飞书
335+
227336
### v2.2.0 (2025-01-08)
228337

229338
**新增功能:**
@@ -263,3 +372,16 @@ npm run watch
263372
- 🐛 修复同一 tid 多个链接类型不一致的问题
264373
- 🐛 屏蔽 GitLab 原生的 "Issue in Jira" tooltip
265374
- 🐛 修复 commit 列表中链接无法正确识别的问题
375+
376+
## 贡献指南
377+
378+
1. Fork 项目
379+
2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)
380+
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
381+
4. 推送到分支 (`git push origin feature/AmazingFeature`)
382+
5. 开启 Pull Request
383+
384+
## 许可证
385+
386+
MIT License
387+

docs/icon.png

2.05 MB
Loading

docs/install-2.png

-15.7 KB
Loading

docs/install-3.png

-67 KB
Binary file not shown.

docs/install-4.png

-107 KB
Binary file not shown.

docs/preview-1.png

82.6 KB
Loading
File renamed without changes.

docs/preview-3.png

63.1 KB
Loading

docs/preview-4.png

70.1 KB
Loading

docs/preview-5.png

81.1 KB
Loading

0 commit comments

Comments
 (0)