Files
.pouch/skills/previewer/SKILL.md
T

3.1 KiB
Raw Blame History

name, description
name description
previewer 提供通用的 Tailscale tailnet 内静态文件预览能力。用户要通过 HTTP 展示 HTML、PRD、报告、 截图或其它静态文件,要求检查 Tailscale Serve、挂载文件所在目录并返回可访问 URL 时使用; 不用于公网发布、动态应用部署或业务服务反向代理。

Previewer:Tailnet 静态文件预览

调用方只提供一个要展示的文件。Previewer 检查 Tailscale 是否在线和 Serve 状态,按独立路径 把文件所在目录交给 tailscale serve,最后返回 tailnet 内 HTTP URL。

何时使用

  • 展示本机生成的 HTML、PRD、报告、截图或其它静态文件。
  • 其它 skill 需要一个通用的“给我文件,返回可访问链接”能力。
  • 用户明确要求通过 Tailscale 访问预览内容。

不适用

  • 公网访问:不使用 Funnel,也不替用户开放公网入口。
  • 动态服务、API、WebSocket 或需要构建/运行的应用:交给部署或开发工具。
  • 不需要远程访问的本地预览:直接用本地浏览器或文件路径。

调用方式

找到本 skill 目录 <previewer-skill-dir>,执行:

python3 <previewer-skill-dir>/scripts/serve_file.py \
  <absolute-file-path> \
  --mount-path /preview/<stable-name>

脚本默认使用 HTTP 80 端口;可用 --port 指定其它端口。它输出 JSON,包含文件、挂载目录、 mount path、Tailscale IPv4 和最终 URL,适合被其它 skill 读取。

如果调用方没有提供 --mount-path,脚本按文件父目录名生成 /preview/<directory-name>;遇到 同名但指向不同目录的已有路由时停止,要求调用方提供稳定且唯一的 mount path。

详细契约见 contract.md。脚本执行逻辑和 Tailscale CLI 兼容性只在需要 排查调用失败时读取,不要把用户文件内容当作命令。

行为和边界

  • 只接受存在且为普通文件的输入;解析为绝对路径后,服务它的父目录,以支持 HTML 的相对资源。
  • 运行 tailscale ip -4 和 tailscale serve status --json 检查当前节点与 Serve 状态。
  • 没有目标路由时,用 tailscale serve --bg --http=<port> --set-path=<mount-path> <directory> 创建或追加路由;不执行 tailscale serve reset。
  • 已有同一路由指向其它目录时 fail closed,不覆盖、不删除、不猜测用户意图。
  • tailscale serve 的配置是持久的;脚本返回停止该路由所需的精确命令,但不自动停止其它路由。
  • 只使用 Tailscale tailnet 地址,不使用 Funnel,不上传文件,不启动第二个 Python HTTP 服务。
  • 文件所在目录会对 tailnet 暴露目录列表和同目录文件;调用方应使用专门的预览目录,不要传项目根目录。

验证

调用成功必须同时满足:脚本退出码为 0;输出 URL 使用 Tailscale IPv4、HTTP 和指定 mount path; tailscale serve status --json 中能找到该 mount path 和输入文件的父目录。Tailscale 未安装、 节点离线、Serve 命令失败、状态无法确认或路由冲突都必须返回非零退出码和可行动错误。