La interfaz está localizada; las descripciones y documentos de las Skills se traducen automáticamente con IA a su idioma. El código, los comandos, rutas y términos técnicos se mantienen en el original, y prevalece el documento del autor.
Explorar Skills
Desarrollo · SKILL.md

tab-declutter

tab-declutter

轻量整理本机 Chrome 的浏览器 tab:去重复、清无用(blank/new tab)、清时效性短的页面(如 code.byted.org 的 code review 页),再把剩余 tab 按主题分组,无法明确归类的保持不分组。

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentación de la Skill

GitHub

name: tab-declutter description: 轻量整理本机 Chrome 的浏览器 tab:去重复、清无用(blank/new tab)、清时效性短的页面(如 code.byted.org 的 code review 页),再把剩余 tab 按主题分组,无法明确归类的保持不分组。 trigger:

  • 整理tab
  • 整理 tab
  • 整理标签页
  • 整理 标签页
  • 整理浏览器
  • 整理 浏览器
  • tab整理
  • tab 整理
  • 清理tab
  • 清理 tab
  • tab分组
  • tab 分组
  • 标签页整理
  • 标签页 整理
  • 整理一下标签页
  • 整理一下 tab
  • 标签页太多
  • tab 太多
  • declutter tab
  • declutter tabs

tab-declutter

轻量整理本机 Chrome 的 tab:去重 → 清无用 → 分组,全程用 browser_tab 操作本机真实 Chrome。判断全在内存里做完,整个流程通常 2 次工具调用:user_list 拉清单 + organize 一次性执行(多端连接时前置一次 browser_client)。

硬规则(先读这五条)

  1. 直接执行到底,不中途询问。 不问「要不要关」「按这个清单吗」,不等用户点头。关闭清单放在执行后的汇报里呈现。真正无法判断价值的才留着——别拿「拿不准」当借口把该关的也留着。
  2. 每组至少 2 个 tab。 单 tab 组没有聚合价值,反而把时间线切碎。新建时不建;已有的单 tab 组用 ungroup_all 解散,让那个 tab 回游离(用户明确要求过,别留着「看起来有个组」)。
  3. 组名必带 🦊 前缀 + 真实业务名(如 🦊 HTML 优化)。禁止「文档资料」「其他文档」「杂项」这类兜底名——出现即代表没拆够,回炉重拆。每个 group op 的 title 都要带,不要只在汇报里写。
  4. 归不了类就保持游离,不硬塞进组。分组只是归到 Chrome Tab Group,不改 tab 内容,可放心做。
  5. 汇报前重新 user_list 核验,以真实数据为准:还剩几个 tab、几个在组里、有没有单 tab 组。组名以 organize 返回的 applied.grouped[].title 为准(user_list 不返回组名,别凭记忆编)。

前置:确认浏览器客户端

多端连接时必须先选目标:

browser_client(action="list")   # 多个客户端 → browser_client(action="use", name=...)

只有一个客户端时自动选中,跳过。

第 1 步:拉清单

browser_tab(action="user_list")

拿到 tab 的 tabId / windowId / groupId / url / title / active(不带 favicon)。字段是驼峰 tabId(不是 tab_id);无 groupId(或 -1)表示游离。后续所有判断基于完整清单,不臆造 tab。

先检查是否截断:truncated=true 时,当前 tabs 仅为预览,total 是全部数量、returned 是预览中完整条目数。若有 path,先用 file_read(path=..., offset=1, max_lines=100) 按行分页读完整文件(offset 是 1 起的行号,逐页往后推),再做分类/整理及最终核验,不能把预览当成全量。若落盘失败(无 path),不要根据残缺清单执行全量整理;可用 find_tab 精确定位指定标签,或汇报阻塞。

第 2 步:分类打标(内存里做,不输出)

对每个 tab 打 A/B/C/D 标。中间清单不吐给用户,最终清单随汇报呈现。

类判定动作
A 重复URL 归一化后相同(去末尾 /、#... 锚点、无意义 utm_* 等 query);同 URL 不同端口、本地 + 线上部署也算重复留 1 个(优先 active,否则第一个),其余 close
B 无用页about:blank;chrome://newtab、chrome://new-tab-page;title 为「新标签页 / New Tab」且 url 为空的;空白/错误占位页close
C 低价值页code.byted.org 的 code review / diff / MR 详情(看完即过期);门户/首页/入口页(百度首页、飞书云空间首页、搜索引擎首页、空壳工作台);单次排查报告;已过期的临时方案/工位调整等时效文档close
D 保留其余有价值的 tab按下面两层归类分组
  • A 的例外:同表不同视图 / 不同 table_id 是两张不同的表,不算重复,都保留。
  • C 的边界:其余域名同样按此精神判断,明显没用过/无实质内容的一律直接关,不必再问。

两层归类(D 类的重点)

⚠️ 踩坑(已被用户纠正):飞书文档全是 larkoffice.com,止步于「按平台归类」会把一大批文档粗暴塞进一个「文档资料」大组——用户根本分不清哪个是哪个,等于没分。业务 tab 里飞书文档占绝大多数,按平台只是起点,必须下沉到业务主题/项目名,不是按站点归类。

第一层——按内容类型 / 平台粗分:

  • 飞书文档(*.larkoffice.com / *.feishu.cn 的 docx/wiki)、多维表格(链接带 base 或 /base/、table=)、飞书表单(share/base/form)
  • 字节内部平台(*.bytedance.net、cloud.bytedance.net、slardar、code.byted.org、mcp.bytedance.net 等)
  • GitHub(github.com)、技术文章/阅读(bytetech.info、各类 blog/文档站、*.github.io)、本地/开发(localhost、127.0.0.1)
  • 其它按主域名或产品名粗分

第二层——按标题关键词拆成业务组(必须做):

  1. 项目/主题前缀优先:标题里反复出现的专有名词(「CCM」「HTML」「扣子3.5」「豆包」)→ 直接用它命名
  2. 文档性质 + 业务次之(「评测/审计」「PRD/方案」「排期」「团队梳理」)——性质太泛时仍要叠业务词,「评测·审计」优于单叫「报告」
  3. 同业务的上下游文档(PRD、技术方案、问题列表、设计稿)归到同一组——按业务线拆,不按文档类型拆

容量与命名:每组 2~7 个,超过 8 个说明没拆够,继续按上面依据细分。组名 2~6 字(如「HTML 优化」「CCM 团队」「评测·审计」「豆包·PRD」)。配色 grey/blue/red/yellow/green/pink/purple/cyan/orange,相近大类用相近色系。

落单:找不到 ≥2 个同类就保持游离。落单前先多想一轮——同业务/同产品的两个 tab(如都是 Ethan 相关)足以成组,别图省事直接当游离。

第 3 步:一次 organize 执行完

所有操作打包成一个调用,不逐步执行:

browser_tab(action="organize", ops=[
  # 1) 先关:A/B/C 类全部 tab id
  {"op": "close", "tabs": [id1, id2, ...]},
  # 2) 再解散不合格的旧组(单 tab 组、主题已散的组)—— 用 groupId,别用 title
  {"op": "ungroup_all", "groupId": gid1},
  # 3) 再建组:每个主题一条,title 必带 🦊 前缀 + 真实业务名(不是类型名)
  {"op": "group", "title": "🦊 HTML 优化", "tabs": [id3, id4, ...], "color": "blue"},
  {"op": "group", "title": "🦊 CCM 团队", "tabs": [id5, id6, ...], "color": "purple"},
  {"op": "group", "title": "🦊 扣子·调研", "tabs": [id7, id8, ...], "color": "green"},
])
  • op 顺序:close → ungroup_all → group。先关掉要删的,再拆不合格的组,最后分剩余的。落单 tab 不加 group op。
  • tab 已消失 / 已不在任何组 → 自动 skip,不报错(skipped 非空是正常的,不是错误)。
  • 所有操作在扩展侧批量执行,不在浏览器前台弹页面。

解散/摘组:解散整组用 {"op": "ungroup_all", "groupId": N}。groupId 从 user_list 的 groupId 字段读,优先用它——title 查找很脆:同名组跨窗口会直接报错并打断整批 ops(前面的 close 已落地、后面的 group 全没跑),查不到则静默跳过。只把某几个 tab 摘出组、组里还剩 ≥2 个时用 {"op": "ungroup", "tabs": [id, ...]}。

组内排序:tabs 数组顺序即组内顺序——同项目/同标题前缀的挨在一起 → 同文档性质(PRD 挨 PRD、报告挨报告)→ 标题字典序兜底。

折叠(默认自动)

整理后自动折叠本次涉及的 TabGroup,跳过含当前活跃 tab 的那组(不打断你正在看的)。返回里 applied.collapsed 是已折的 groupId,applied.collapseSkipped 是被跳过的。只有用户明确要求「连当前这组也折」才传 collapse=true,「都不要折」才传 collapse=false。折叠失败不影响整理结果(组可能已被 Chrome 销毁),不要为此重试或报错。

汇报时带一句「已自动折叠 N 组,当前使用中的那组保持展开」。

第 4 步:汇报

先重新 user_list 核验(硬规则 5),再给一段简洁汇报:

  • 关闭了几个(重复 X / 无用 Y / 时效 Z,列出 title)
  • 分了几组(组名取自 applied.grouped[].title + 每组 tab 数,每组均 ≥2)
  • 哪些落单未分组(说明「单条不成组」)

干净直接,不输出中间调试日志。

关闭日志(记录到 Obsidian)

执行完把「关掉的实质页面」用 knowledge_edit 追加到 work/tab-declutter-log.md(默认 append,加到文末,每批一条、新的一批在下面)。只记有回看价值的(重复副本、时效性 code review、被关的文档);blank/newtab 这类纯垃圾不记。每条写成 markdown 链接 [title](url),方便点回去:

## 2026-09-22 10:30

**关闭 7 个:**
- [重复] [CCM HTML OnePage(WIP)](https://bytedance.larkoffice.com/wiki/LAav...) ×2(留 1)
- [时效] [stone/coze-claw](https://code.byted.org/stone/coze-claw)
- [无用] [没有权限访问 - 飞书云文档](https://bytedance.larkoffice.com/wiki/VMGG...)

边界与安全

  • 关闭 tab 不可逆——但 A/B/C 类按用户明确要求直接关、不逐项征询;只有既非重复、也非明显无用的才留。
  • 不碰 tab 内容:不填表、不点击页面内元素。
  • 只整理当前这一个浏览器客户端的 tab。
  • 连接被顶替报错时:先 browser_client(action="use", name=...) 重连 → 重新 user_list 拿最新 tabId → 重跑 organize。重跑安全(已关的会以 skipped: not found 返回,不误关、不重复)。若上次已部分生效(关闭落地、仅分组未应用),以最新 user_list 为准补齐差异。
  • ❌ 禁止拿历史 session 里的旧 tabId 挨个 attach 去试探(真实踩过的坑,一次浪费七十多步)。tabId 只在当前这份 user_list 里有效,列表拿不全时唯一正路是读完整清单(见第 1 步),不是逐个 attach 碰运气。
Skills guardadas