协作头脑风暴
brainstorming
在实现前澄清需求、探索设计选择,并形成清晰的开发方向。
tab-declutter【开发与工程】轻量整理本机 Chrome 的浏览器 tab:去重复、清无用(blank/new tab)、清时效性短的页面(如 code.byted.org 的 code review 页),再把剩余 tab 按主题分组,无法明确归类的保持不分组。
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
name: tab-declutter description: 轻量整理本机 Chrome 的浏览器 tab:去重复、清无用(blank/new tab)、清时效性短的页面(如 code.byted.org 的 code review 页),再把剩余 tab 按主题分组,无法明确归类的保持不分组。 trigger:
轻量整理本机 Chrome 的 tab:去重 → 清无用 → 分组,全程用 browser_tab 操作本机真实 Chrome。判断全在内存里做完,整个流程通常 2 次工具调用:user_list 拉清单 + organize 一次性执行(多端连接时前置一次 browser_client)。
ungroup_all 解散,让那个 tab 回游离(用户明确要求过,别留着「看起来有个组」)。🦊 前缀 + 真实业务名(如 🦊 HTML 优化)。禁止「文档资料」「其他文档」「杂项」这类兜底名——出现即代表没拆够,回炉重拆。每个 group op 的 title 都要带,不要只在汇报里写。user_list 核验,以真实数据为准:还剩几个 tab、几个在组里、有没有单 tab 组。组名以 organize 返回的 applied.grouped[].title 为准(user_list 不返回组名,别凭记忆编)。多端连接时必须先选目标:
browser_client(action="list") # 多个客户端 → browser_client(action="use", name=...)
只有一个客户端时自动选中,跳过。
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 精确定位指定标签,或汇报阻塞。
对每个 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 | 按下面两层归类分组 |
table_id 是两张不同的表,不算重复,都保留。⚠️ 踩坑(已被用户纠正):飞书文档全是
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.com)、技术文章/阅读(bytetech.info、各类 blog/文档站、*.github.io)、本地/开发(localhost、127.0.0.1)第二层——按标题关键词拆成业务组(必须做):
容量与命名:每组 2~7 个,超过 8 个说明没拆够,继续按上面依据细分。组名 2~6 字(如「HTML 优化」「CCM 团队」「评测·审计」「豆包·PRD」)。配色 grey/blue/red/yellow/green/pink/purple/cyan/orange,相近大类用相近色系。
落单:找不到 ≥2 个同类就保持游离。落单前先多想一轮——同业务/同产品的两个 tab(如都是 Ethan 相关)足以成组,别图省事直接当游离。
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"},
])
close → ungroup_all → group。先关掉要删的,再拆不合格的组,最后分剩余的。落单 tab 不加 group op。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 组,当前使用中的那组保持展开」。
先重新 user_list 核验(硬规则 5),再给一段简洁汇报:
applied.grouped[].title + 每组 tab 数,每组均 ≥2)干净直接,不输出中间调试日志。
执行完把「关掉的实质页面」用 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...)
browser_client(action="use", name=...) 重连 → 重新 user_list 拿最新 tabId → 重跑 organize。重跑安全(已关的会以 skipped: not found 返回,不误关、不重复)。若上次已部分生效(关闭落地、仅分组未应用),以最新 user_list 为准补齐差异。attach 去试探(真实踩过的坑,一次浪费七十多步)。tabId 只在当前这份 user_list 里有效,列表拿不全时唯一正路是读完整清单(见第 1 步),不是逐个 attach 碰运气。