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
5255npm 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
71741 . 打开浏览器,访问扩展管理页面:
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```
147119fix: [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+
0 commit comments