{"id":47742604,"url":"https://github.com/limecloud/lime-pet","last_synced_at":"2026-04-08T05:00:59.398Z","repository":{"id":348614450,"uuid":"1198342182","full_name":"limecloud/lime-pet","owner":"limecloud","description":"lime  桌宠","archived":false,"fork":false,"pushed_at":"2026-04-05T09:21:13.000Z","size":15053,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-07T04:03:19.487Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/limecloud.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-Live2D.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-01T10:34:29.000Z","updated_at":"2026-04-05T09:21:11.000Z","dependencies_parsed_at":"2026-04-05T02:01:06.172Z","dependency_job_id":"412bfa23-bf21-401f-82b6-4701548c6579","html_url":"https://github.com/limecloud/lime-pet","commit_stats":null,"previous_names":["limecloud/lime-pet"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/limecloud/lime-pet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/limecloud%2Flime-pet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/limecloud%2Flime-pet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/limecloud%2Flime-pet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/limecloud%2Flime-pet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/limecloud","download_url":"https://codeload.github.com/limecloud/lime-pet/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/limecloud%2Flime-pet/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31540826,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"online","status_checked_at":"2026-04-08T02:00:06.127Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-03T00:01:41.460Z","updated_at":"2026-04-08T05:00:59.385Z","avatar_url":"https://github.com/limecloud.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Lime Pet\n\n`Lime Pet` 是 `Lime` 的独立桌面 companion app 仓库。当前仓库包含 macOS 原生 `SwiftUI + AppKit` 壳，以及 Windows `Tauri + WebView` companion 壳；它负责桌面端的桌宠呈现、移动、点击和轻提示，不承载 Lime 的主会话运行时。\n\n## 当前能力\n\n- 原生 `SwiftUI + AppKit` 桌宠窗口\n- 更完整的桌宠角色表现：呼吸、眨眼、眼神跟随、嘴型、胡须、尾巴摆动、思考态 / 完成态氛围反馈\n- 角色资源化：通过 `Resources/character-library.json` 描述多角色主题、配色、几何参数与符号资源\n- 角色性格资源化：每个角色都可以定义自己的移动节奏、巡航范围、眨眼频率与陪伴文案\n- 角色配件槽位资源化：围脖 / 蝴蝶结 / 项圈、头饰、移动尾迹、脸部标记都由角色配置驱动\n- 角色渲染后端资源化：同一套角色库里可以同时声明 `sprite` 与 `live2d` 角色\n- 菜单栏支持多角色切换，并持久记住上次选中的外观\n- 支持更像桌宠的自主节奏：中央巡航、边缘蹲守、短暂停步、撞边回弹\n- 支持拖拽重定位，松手后会记住停靠位置，下次启动自动回到上次区域\n- 本地 `WebSocket` companion 协议客户端\n- 点击桌宠后向 Lime 发送 `pet.clicked` / `pet.open_chat`\n- 单击 / 双击 / 三击支持不同动作：单击唤起 Lime，双击生成一句青柠鼓励，三击生成一句“下一步建议”\n- 支持从桌宠右键或状态栏菜单直接输入一句话，请求 Lime 宿主侧模型生成回复，并在桌宠本地朗读\n- 断线时会给出提示气泡并自动重连\n- 空闲时会有轻量陪伴气泡，不打断主流程\n- 菜单栏支持重连、回到屏幕中央、左/中/右停靠、显示 / 隐藏桌宠\n- macOS 菜单栏与桌宠右键菜单、Windows 桌宠右键菜单都可直接查看 Companion 连接诊断、最近同步时间与脱敏服务商摘要，并可主动请求 Lime 立即重发摘要\n- 新增 `Live2D` 渲染通路：Windows 通过 `Tauri/WebView`，macOS 通过 `WKWebView` 复用同一套本地 runtime\n- 默认仅内置青柠；其他 `Live2D` 角色改为服务端模型目录 + 客户端本地安装\n- 支持 `Live2D` 模型目录、状态动作映射、点按动作映射，以及 `pet.live2d_action` 协议事件\n- 接收 Lime 发来的 `pet.show` / `pet.hide` / `pet.state_changed` / `pet.show_bubble`\n- GitHub Actions 质量校验与 tag 发布流程\n- Windows companion 预览壳：透明无边框、始终置顶、可拖拽、点击唤起、右键菜单、位置记忆与基础氛围动画\n\n## 仓库结构\n\n- `LimePet.xcodeproj`：Xcode 工程\n- `LimePet/`：Swift 源码、`Info.plist` 与 `Resources/` 资源目录\n- `WindowsPet/`：Windows companion 子项目，基于 `Tauri v2`\n- `LICENSE-Live2D.md`：Live2D 示例模型相关许可说明\n- `docs/protocol.md`：Companion 协议说明\n- `docs/release.md`：CI/CD 与签名说明\n- `.github/workflows/`：构建与打包工作流\n\n## 本地构建\n\n```bash\nxcodebuild \\\n  -project \"LimePet.xcodeproj\" \\\n  -target \"LimePet\" \\\n  -configuration Debug \\\n  CODE_SIGNING_ALLOWED=NO \\\n  CODE_SIGNING_REQUIRED=NO \\\n  -derivedDataPath \"/tmp/LimePet-DerivedData\" \\\n  build\n```\n\n也可以直接用 Xcode 打开 `LimePet.xcodeproj`。如果要做签名运行，请在 Xcode 里给 target 配置自己的 Team。\n\n## 无 Xcode 本地开发\n\n如果当前机器只有 Command Line Tools，没有完整 `Xcode.app`，也可以走仓库内置的本地链路：\n\n```bash\nswift build --configuration debug\n./scripts/run-dev-app.sh\n```\n\n如果只想先产出一个本地调试 `.app` 包：\n\n```bash\n./scripts/build-dev-app.sh\nopen \"dist/Lime Pet.app\"\n```\n\n这条链路基于 `Swift Package Manager` 构建可执行文件，再由脚本封装成 `.app`。它适合本地开发、调试和快速验证；当前仓库的 GitHub Actions 也已经统一走这条路径，避免本地与 CI 使用两套不同构建主线。\n\n如果你正在联调 `lime` 主宿主与桌宠语音链路，也可以直接跑：\n\n```bash\n./scripts/run-companion-dev-stack.sh\n```\n\n这条脚本会：\n\n- 用 `local-whisper` 特性构建 `lime` 宿主\n- 自动重启本地 `lime` companion 监听进程\n- 重新启动 `LimePet`\n- 默认把桌宠模型目录指向 `http://127.0.0.1:8080` 的 `control-plane-svc`\n\n默认会从 `../aiclientproxy/lime` 查找主仓；如果你的主仓不在这个位置，可以先指定：\n\n```bash\nLIME_ROOT=\"/absolute/path/to/lime\" ./scripts/run-companion-dev-stack.sh\n```\n\n如果你只是想快速确认当前联调栈是否健康，可以跑：\n\n```bash\n./scripts/check-companion-dev-stack.sh\n```\n\n它会检查：\n\n- `DevBridge` 是否在线\n- 当前默认 ASR 凭证是否存在\n- 桌宠是否连上 `45554`\n- 如果本地有 `STT` 测试样本，还会顺手打一遍本地 Whisper 转写\n\n## 发布产物\n\n本地生成 release bundle：\n\n```bash\n./scripts/package-release.sh --version \"0.4.0\" --build-number \"1\"\n```\n\n产物默认会按当前宿主架构输出，例如 Apple Silicon 机器上会得到：\n\n```text\ndist/release/LimePet-v0.4.0-macos-arm64.dmg\ndist/release/LimePet-v0.4.0-macos-arm64.dmg.sha256\ndist/release/LimePet-v0.4.0-macos-arm64-unsigned.zip\ndist/release/LimePet-v0.4.0-macos-arm64-unsigned.zip.sha256\n```\n\nGitHub Actions 发布策略：\n\n- `ci.yml`\n  - 在 `pull_request`、`push main`、`workflow_dispatch` 时执行\n  - 校验 macOS Apple Silicon 与 macOS Intel 两条构建链都能产出 `.app` 与 release preview\n  - 校验 Windows companion 可打出 installer preview\n  - 额外上传 `macos-arm64`、`macos-x64` 与 Windows NSIS preview，确保发布链路不腐坏\n- `release.yml`\n  - 在推送 `v*` tag 时自动执行\n  - 也支持手动 `workflow_dispatch`\n  - 会同时上传 `macos-arm64`、`macos-x64` 两个 macOS dmg、unsigned zip、对应 `sha256` 与 Windows NSIS installer，并发布到 GitHub Release\n  - 若仓库已配置 Apple signing / notarization secrets，会自动把 macOS dmg 升级为已签名且已 notarize 的正式分发包\n\n## Windows 本地开发\n\nWindows 壳位于 `WindowsPet/`，它复用同一套 companion 协议和共享素材，但不复用 macOS 的窗口层代码。\n\n常用命令：\n\n```bash\ncd WindowsPet\nnpm install\nnpm run build\n```\n\n如果在 Windows 机器上做本地桌宠调试：\n\n```bash\ncd WindowsPet\nnpm install\nnpm run tauri dev\n```\n\n如果在 Windows 机器上产出 installer：\n\n```bash\ncd WindowsPet\nnpm install\nnpm run tauri build\n```\n\n## Companion 连接\n\n默认连接地址：\n\n```text\nws://127.0.0.1:45554/companion/pet\n```\n\n也支持通过启动参数覆盖：\n\n```bash\nopen -a \"Lime Pet.app\" --args \\\n  --connect \"ws://127.0.0.1:45554/companion/pet\" \\\n  --control-plane-base-url \"http://127.0.0.1:8080\" \\\n  --tenant-id \"tenant-0001\" \\\n  --client-id \"lime\" \\\n  --protocol-version \"1\"\n```\n\n详细消息格式见 [docs/protocol.md](docs/protocol.md)。\n\n## 模型安装\n\n当前桌宠的事实源已经拆成两层：\n\n- 内置角色：`LimePet/Resources/character-library.json`，当前默认只保留青柠\n- 可安装角色：`LimePet/Resources/live2d-model-catalog.json`，同时会生成到 `limecore` 的 seed 文件\n\nmacOS 客户端会优先尝试从：\n\n```text\nGET http://127.0.0.1:8080/api/v1/public/tenants/tenant-0001/client/model-catalog\n```\n\n拉取公开模型目录；拿不到时会回退到 bundle 内置的 catalog。模型文件实际安装到：\n\n```text\n~/Library/Application Support/LimePet/live2d-models\n```\n\n安装记录保存在：\n\n```text\n~/Library/Application Support/LimePet/model-installs.json\n```\n\n角色外观与动作配置仍然优先沿用 JSON 描述 + Swift 渲染器 / Live2D runtime 的组合，而不是把外观和节奏写死在视图里。\n\n如果要本地启动 `control-plane-svc` 做联调，可以在 `limecore` 仓库执行：\n\n```bash\ncd ~/Documents/dev/ai/limecloud/limecore\nSERVER_MODEL_ASSET_ROOT_DIR=\"/absolute/path/to/live2d-models/models\" \\\ngo run ./services/control-plane-svc/cmd/server\n```\n\n推荐把你本地克隆的 `live2d-models/models` 目录挂进 `control-plane-svc`。这样公开模型目录返回的下载地址会指向当前本地服务，例如：\n\n```text\nhttp://127.0.0.1:8080/api/v1/public/assets/live2d/koharu/model.json\n```\n\n这条链路可以避开 `model.oml2d.com` 证书或 TLS 握手异常导致的安装失败。\n\n如果准备把模型正式迁到 Cloudflare 托管，不再依赖本地目录或 `model.oml2d.com`，统一在 `limecore` 仓库执行批量导入：\n\n```bash\ncd ~/Documents/dev/ai/limecloud/limecore\nnpm run import:cloudflare:live2d -- \\\n  --source-dir \"/absolute/path/to/live2d-models\" \\\n  --bucket \"\u003cyour-r2-bucket\u003e\" \\\n  --asset-base-url \"https://\u003cyour-asset-domain\u003e\"\n```\n\n这条命令会整批上传模型目录，并同步改写 `lime-pet` / `limecore` 的模型目录 seed，不需要后台逐个上传。\n\n## 跨平台策略\n\n当前仓库采用“同仓双壳”的做法：\n\n- macOS：保留原生 `SwiftUI + AppKit`\n- Windows：新增 `Tauri + WebView` 壳\n- 协议：两侧统一复用 `docs/protocol.md` 定义的 companion WebSocket 协议\n- 资源：Windows 壳通过同步脚本复用主仓的青柠精灵素材，而不是维护第二份角色源图\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flimecloud%2Flime-pet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flimecloud%2Flime-pet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flimecloud%2Flime-pet/lists"}