SuperAPI AI 工具集

dock-app

办公与效率

查看项目

更新于 10-30 12:15

技能介绍

Dock app 是一个 macOS 专用的技能,用于把用户 Mac 上的本地文件、配置或文件夹变成一个 Dock 中可一键启动的小应用。其核心思路是:网页本身不能访问用户磁盘,而 Dock 应用可以——由一个本地 Bun 服务器负责读写文件,一个纯 HTML 页面作为界面,再由一个 .app 包装器从 Dock 或 Spotlight 启动全部组件。整个过程不使用 Electron,没有构建步骤,也不接入网络。

启动流程为:点击 Dock 图标打开 Name.app(AppleScript),执行 open.sh 检查服务器是否已启动;若未启动,则在后台运行 bun server.ts,随后在默认浏览器中打开 http://localhost:<port>。

适用前提:仅支持 macOS,且需要安装 Bun。

使用方式分为四个阶段。

一、确定数据来源。编写界面之前,先明确页面到底要修改什么。优先使用官方支持的配置键,而不是直接搬动文件:可查阅文档、--help、工具的设置 schema,或用 strings <binary> | grep <猜测> 查找。设置项可逆且能在更新后保留,而重命名或删除文件则不具备这些特性。需要阅读真实文件,记录所有格式差异(带引号的值、多行 YAML、符号链接、并非条目的文件夹、与文件夹名不同的名称),并明确只写入其中一个文件。

二、构建应用。在任意代码仓库之外为工具建立文件夹,例如 ~/.<tool>/<app-name>/ 或 ~/.local/share/<app-name>/,从技能的 assets/ 目录开始:server.ts 仅在 127.0.0.1 上提供服务,GET 返回状态,POST 应用补丁,/ 返回 index.html,并提供轻量的健康检查路由;每次写入时重新读取文件、只修改提交的键再写回,保留其他所有键;键恢复默认值时删除该键以保持文件精简;按允许值校验输入,失败时返回 400 及原因。index.html 是单个自包含文件,不使用 CDN 和框架,在 :root 定义颜色令牌并配合 prefers-color-scheme: dark 覆盖,页面宽度适配 375px,短控件标签使用 white-space: nowrap;每次变更即保存并显示简短的“Saved”提示,批量修改前使用 confirm();展示每项变更的代价或作用,而不只是名称。open.sh 负责设置端口和健康路由,由于从 Dock 启动的应用 PATH 很精简,需用绝对路径查找 bun,通过 nohup 启动服务器使其在启动器退出后继续运行,等待就绪后再打开页面。端口需选择未被占用者(lsof -iTCP:<port> -sTCP:LISTEN 无输出即可);首次写入用户关心的文件前,在原文件旁备份一次(<file>.bak-<app-name>)。

三、包装为应用。先询问用户是否固定到 Dock,因为固定操作会重启 Dock,图标会闪烁一次。执行 chmod +x <folder>/open.sh,再运行 sh <技能目录>/scripts/make-app.sh "<App Name>" <folder>/open.sh --dock。脚本会生成 /Applications/<App Name>.app(/Applications 不可写时改用 ~/Applications),为其建立 Spotlight 索引,并在带 --dock 时将其固定(已固定则跳过);省略 --dock 则不做固定。

四、端到端验证。必须完成每一步并通过后再报告可用:API 检查(curl GET 路由,核对数据与磁盘文件一致);往返测试(通过 API 或页面修改一个值,确认文件变化且其他键未变,再改回并与备份 diff);冷启动(杀掉服务器后打开 /Applications/<App Name>.app,确认服务器响应且父进程 PID 为 1,即已脱离);界面检查(如有浏览器面板,检查浅色、深色和 375px 宽度,修复控件换行、标签断词、工具栏单按钮独占一行等问题)。

注意事项:~/Applications 并非用户在 Finder 中浏览的 /Applications 文件夹,应构建到 /Applications 并告知位置;从自身 shell 启动的服务器会随会话结束而终止,需通过 open.sh 以 nohup 和 & 启动;修改服务器文件后要杀掉运行中的服务器,否则应用会继续提供旧文件;绝不能绑定 0.0.0.0,因为页面可以在用户机器上写文件;工具设置的修改通常只对新会话或重启后生效,需告知用户。

完成后应告知用户:应用及其文件的位置、写入哪个文件及备份位置、服务器会在后台持续运行并在重启后首次打开时再次启动,以及移除方法:lsof -t -iTCP:<port> -sTCP:LISTEN | xargs kill; rm -rf "/Applications/<App Name>.app" <folder>。技能中的 skill-manager 是遵循此模式的完整示例。