用途
paste 用于清理和重新排版内容,通常是从终端复制出来的文本,使其适合粘贴到 Slack、Notion、Twitter/X、LinkedIn、邮件、GitHub 或纯文本等目标。它读取剪贴板内容,去除终端噪声,按目的地规则转换格式,然后把结果写回剪贴板并在对话中预览。
主要能力
- 内容获取:优先使用用户在提示中直接提供或此前对话中出现的内容;否则读取系统剪贴板;两者都为空时询问用户要粘贴什么。
- 目的地解析:根据调用方式确定目标,如
/paste slack、/paste notion、/paste twitter(或x)、/paste linkedin(或li)、/paste email、/paste email rich(或email html)、/paste github(或gh)、/paste markdown(或md)、/paste html。不带参数时默认为 plain。若含义不明确则询问。各目的地的具体规则记录在 references/destinations.md。 - 密钥扫描:在任何清理或复制之前,先按 references/secret-patterns.md 中的模式扫描。命中时停止、以掩码形式(仅显示前 4 位和后 4 位)报告检测到的类型,并询问继续、脱敏(替换为 [REDACTED])还是中止,默认中止。
- 通用清理:去除 ANSI 转义码(如
\x1b\[[0-9;]*[a-zA-Z]及相关颜色、光标移动、屏幕控制码);去除制表框线字符(如 ╭ ─ ╮ │ ╰ ╯ ┌ ┐ └ ┘ ├ ┤ ┬ ┴ ┼ 等),视上下文替换为简单等价符号(-、|)或直接删除;去除终端提示符残留(行首为 $、>、❯、%、# 且看起来像 shell 提示时);将回车符(\r)替换为 \n 或删除;去除每行行尾空白;把连续 3 行以上空行压缩为 2 行。 - 目的地规则:读取 references/destinations.md 并应用对应的转换。
使用方式
调用形式为 /paste 加可选目的地参数。输出行为按目的地不同:
- plain / slack / notion / twitter / linkedin / email / github:在对话中以代码块显示预览;执行剪贴板写入流程,且预览以读回的内容为准。
- email rich:渲染为 HTML,写入 /tmp/paste-<timestamp>.html 并在浏览器打开(macOS 用 open,Linux 用 xdg-open,Windows 用 start)。跳过剪贴板,由用户从浏览器复制以保留富文本。
- markdown:在对话中直接渲染清理后的 markdown,同时通过写入流程把原始 markdown 复制到剪贴板,并可询问是否也以 HTML 打开。
- html:渲染为 HTML,写入临时文件并在浏览器打开,跳过剪贴板。
剪贴板写入流程:用文件写入工具把清理后内容写到临时文件(如 /tmp/paste-<slug>.txt),不要通过 shell heredoc 或 echo 管道写入,因为某些 agent 环境会对 heredoc 硬换行(约 70 字符)并给每行加缩进,导致实际粘贴内容损坏而对话预览看起来正常。之后用对应平台的写入命令从文件复制,再读回剪贴板与文件比对(如 pbpaste | cmp -s - "$f" && echo match),不一致时报告并回退为在代码块中展示文本。预览必须基于读回的内容,而非原本打算复制的内容。验证完成后删除临时文件,因为它可能含有用户复制的任何内容,包括密钥扫描放行的文本。
各平台剪贴板读写命令:
- macOS:读
pbpaste,写pbcopy < "$f" - Linux (Wayland):读
wl-paste -n,写wl-copy < "$f" - Linux (X11):读
xclip -selection clipboard -o,写xclip -selection clipboard < "$f" - Windows:读
powershell Get-Clipboard -Raw,写powershell "Get-Content -Raw '$f' | Set-Clipboard"
若运行在无剪贴板的环境(远程、无头或聊天机器人 agent),跳过剪贴板,内容取自提示,并在代码块中返回清理后的文本。
完成后给出一行摘要说明清理了什么,例如去除了多少 ANSI 码、框线字符、提示符残留,以及字符数情况与剪贴板往返校验结果。
长度与链接处理
- 长度提示:Twitter/X 超过 280 字符时警告并说明超出多少;LinkedIn 超过 400 字符(舒适线,非硬限制)时警告。其他目的地无长度警告。若用户表示要自行删减,不应拒绝或自动截断。
- 链接处理:当内容含 URL 且目的地为 twitter 或 linkedin 时,单独列出 URL(不放进正文),并提醒链接应放在 LinkedIn 的首条评论或 X 的回复中。相关说明见记忆存储中的 feedback_social_link_placement.md。
典型示例
/paste slack:读取剪贴板,去除 ANSI,把**bold**转为*bold*,复制到剪贴板并显示预览。/paste twitter加粘贴的错误日志:使用粘贴内容而忽略剪贴板,完成清理,在 412/280 字符时警告,复制并询问用户是否删减或更换目的地。/paste html加粘贴的 markdown 表格:渲染为 HTML 并在浏览器打开,用户选中后复制到 Notion/邮件可保留格式。/paste加含sk-anthropic-key的内容:停止并提示“发现疑似 Anthropic API 密钥:sk-an...3kf9。继续、脱敏还是中止?”
可组合使用的技能
- jab-hook:当 MCP 路径不适用时,为粘贴进 Typefully 草稿清理输出,并对 X/LinkedIn 目的地执行链接放置规则。
- social-fetch:在草稿或通讯中引用抓取到的帖子前先做清理。
- second-brain:把 paste 的输出干净地捕获到 raw/note-<slug>.md 供后续汇编。
- watch-video:转录或摘要输出常经过 paste 做针对平台的重新排版。
质量说明
- 剪贴板写入流程是强制性的:文件 → 从文件复制 → 读回比对 → 基于读回内容预览。
- 密钥检测始终最先执行,在任何格式转换或目的地逻辑之前扫描 sk-、AKIA、xoxb-*、JWT 形式字符串和长十六进制令牌,命中时先询问再继续。
- 采用目的地感知的转换而非统一处理:Slack 用
*bold*,LinkedIn 用 Unicode 样式加粗,邮件用 HTML,同样输入会产生九种不同的合规输出;目的地标志并非可选。 - 所有目的地都会去除 ANSI 码,因为终端转义序列在源终端之外都会显示为乱码。
- 字符限制按资料描述执行:X 为 280,LinkedIn 为 3000,Twitter 为 25000,超出时拒绝复制并提供删减策略(此处限制数值与上文“警告”描述同时存在,均按资料原文保留)。
- 社交目的地链接放在首条评论而非正文,在目的地为 twitter 或 linkedin 时执行。
- HTML 目的地打开浏览器标签页而非写入剪贴板,因为格式化表格和代码块需要可渲染的表面才能带格式选中复制。