diff --git a/.tests/desktop-emotes.test.mjs b/.tests/cindy-ping.test.mjs similarity index 99% rename from .tests/desktop-emotes.test.mjs rename to .tests/cindy-ping.test.mjs index 77e2695a..2220e39a 100644 --- a/.tests/desktop-emotes.test.mjs +++ b/.tests/cindy-ping.test.mjs @@ -9,10 +9,10 @@ import { join } from 'node:path'; import vm from 'node:vm'; const require = createRequire(import.meta.url); -const plugin = new URL('../desktop-emotes/', import.meta.url); +const plugin = new URL('../cindy-ping/', import.meta.url); const source = name => readFileSync(new URL(name, plugin), 'utf8'); -const library = require('../desktop-emotes/emote-library.js'); -const { validateConfig, migrateConfig } = require('../desktop-emotes/node/config.cjs'); +const library = require('../cindy-ping/emote-library.js'); +const { validateConfig, migrateConfig } = require('../cindy-ping/node/config.cjs'); const defaults = () => migrateConfig(library.defaults('en')); const clone = value => structuredClone(value); const revision = value => createHash('sha256').update(JSON.stringify(value)).digest('hex'); diff --git a/README.md b/README.md index d4b3b07e..86c8ca4f 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ permission gate. | | GitHub | [`cindy-github`](./cindy-github) | Full GitHub workflow: issues / PRs / code review / Actions / releases | | | GitLab | [`cindy-gitlab`](./cindy-gitlab) | GitLab (gitlab.com and self-hosted) issues / MRs / repository operations | | | Mermaid | [`cindy-mermaid`](./cindy-mermaid) | Mermaid diagram source normalization and common syntax fixes | -| | Cindy Ping | [`desktop-emotes`](./desktop-emotes) | Configurable desktop emote wheel and project, conversation or companion delivery; macOS 14+; manual install | +| | Cindy Ping | [`cindy-ping`](./cindy-ping) | Configurable desktop emote wheel and project, conversation or companion delivery; macOS 14+; manual install | | | Notion | [`cindy-notion`](./cindy-notion) | Read/write Notion pages, databases, and knowledge bases | | | Web Search | [`cindy-web-search`](./cindy-web-search) | Public web search (Cindy AI by default; optional user-provided Brave / Tavily / DeepSeek key) | | | World Bank Open Data | [`world-bank-open-data`](./world-bank-open-data) | Public country, economic, social, and development indicators with no API key; staged rollout | diff --git a/README.zh-CN.md b/README.zh-CN.md index 115b33fc..32ea9d81 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -41,7 +41,7 @@ | | GitHub | [`cindy-github`](./cindy-github) | GitHub issue / PR / code review / Actions / release 全流程操作 | | | GitLab | [`cindy-gitlab`](./cindy-gitlab) | GitLab(gitlab.com 及自建实例)issue / MR / 仓库操作 | | | Mermaid | [`cindy-mermaid`](./cindy-mermaid) | Mermaid 图表源码规范化与常见语法修复 | -| | Cindy Ping | [`desktop-emotes`](./desktop-emotes) | 可配置桌面表情轮盘,向项目、会话或伙伴投递;仅 macOS 14+;手动安装 | +| | Cindy Ping | [`cindy-ping`](./cindy-ping) | 可配置桌面表情轮盘,向项目、会话或伙伴投递;仅 macOS 14+;手动安装 | | | Notion | [`cindy-notion`](./cindy-notion) | Notion 页面、数据库与知识库读写 | | | Web Search | [`cindy-web-search`](./cindy-web-search) | 公网搜索(默认 Cindy AI,可选用户自备 Brave / Tavily / DeepSeek Key) | | | 世界银行公开数据 | [`world-bank-open-data`](./world-bank-open-data) | 无需 API Key,查询全球国家、经济、社会与发展指标;定向灰度 | diff --git a/desktop-emotes/.gitignore b/cindy-ping/.gitignore similarity index 100% rename from desktop-emotes/.gitignore rename to cindy-ping/.gitignore diff --git a/desktop-emotes/README.md b/cindy-ping/README.md similarity index 97% rename from desktop-emotes/README.md rename to cindy-ping/README.md index 9bb58d7b..370b290e 100644 --- a/desktop-emotes/README.md +++ b/cindy-ping/README.md @@ -53,7 +53,7 @@ Native helper and shortcuts exit when the worker's input closes, or when Cindy s Reference: [Cindy](https://github.com/makecindy/cindy), [ScreenCaptureKit window filter](https://developer.apple.com/documentation/screencapturekit/sccontentfilter/init(desktopindependentwindow:)). [lolPing](https://github.com/darrenprx/lolPing) inspired the interaction; no code or League of Legends assets are copied. -Run `node --test .tests/desktop-emotes.test.mjs` from the repository root for isolated scheduler, configuration and delivery regressions. These checks do not launch Cindy or send real messages. Native compilation and mocked checks do not replace real-device verification. +Run `node --test .tests/cindy-ping.test.mjs` from the repository root for isolated scheduler, configuration and delivery regressions. These checks do not launch Cindy or send real messages. Native compilation and mocked checks do not replace real-device verification. The icon and eleven cat emotes are original illustrations generated for this plugin, not bundled emoji fonts or copied game assets. The emotes use lossless WebP at their original 1254 × 1254 resolution; all decoded RGBA pixels match the earlier PNG assets. Existing built-in PNG references are mapped to the corresponding WebP without changing instructions or destinations. Custom image paths are unchanged. No image decoder is bundled; Cindy and macOS decode the assets. diff --git a/desktop-emotes/README.zh-CN.md b/cindy-ping/README.zh-CN.md similarity index 97% rename from desktop-emotes/README.zh-CN.md rename to cindy-ping/README.zh-CN.md index 80b5419f..3dc24958 100644 --- a/desktop-emotes/README.zh-CN.md +++ b/cindy-ping/README.zh-CN.md @@ -53,7 +53,7 @@ Worker 输入关闭、插件停用或 Cindy 退出时,原生程序与快捷键 参考:[Cindy](https://github.com/makecindy/cindy)、[ScreenCaptureKit 窗口过滤](https://developer.apple.com/documentation/screencapturekit/sccontentfilter/init(desktopindependentwindow:))。[lolPing](https://github.com/darrenprx/lolPing) 仅提供交互灵感,没有复制代码或英雄联盟素材。 -在仓库根目录运行 `node --test .tests/desktop-emotes.test.mjs`,覆盖调度、配置和投递的隔离回归检查,不启动 Cindy、不发送真实消息。原生编译与模拟检查不能代替实机验收。 +在仓库根目录运行 `node --test .tests/cindy-ping.test.mjs`,覆盖调度、配置和投递的隔离回归检查,不启动 Cindy、不发送真实消息。原生编译与模拟检查不能代替实机验收。 图标与十一张黑猫表情是为本插件生成的原创插画,不内嵌 emoji 字体或复制游戏素材。表情使用原始 1254 × 1254 分辨率的无损 WebP,解码后全部 RGBA 像素与原 PNG 一致。原有内置 PNG 引用自动对应到同图 WebP,不改变指令或目标;自定义图片路径不变。图片由 Cindy 和 macOS 解码,不内嵌额外解码库。 diff --git a/desktop-emotes/assets/emotes/decide.webp b/cindy-ping/assets/emotes/decide.webp similarity index 100% rename from desktop-emotes/assets/emotes/decide.webp rename to cindy-ping/assets/emotes/decide.webp diff --git a/desktop-emotes/assets/emotes/delegate.webp b/cindy-ping/assets/emotes/delegate.webp similarity index 100% rename from desktop-emotes/assets/emotes/delegate.webp rename to cindy-ping/assets/emotes/delegate.webp diff --git a/desktop-emotes/assets/emotes/help.webp b/cindy-ping/assets/emotes/help.webp similarity index 100% rename from desktop-emotes/assets/emotes/help.webp rename to cindy-ping/assets/emotes/help.webp diff --git a/desktop-emotes/assets/emotes/improve.webp b/cindy-ping/assets/emotes/improve.webp similarity index 100% rename from desktop-emotes/assets/emotes/improve.webp rename to cindy-ping/assets/emotes/improve.webp diff --git a/desktop-emotes/assets/emotes/inspire.webp b/cindy-ping/assets/emotes/inspire.webp similarity index 100% rename from desktop-emotes/assets/emotes/inspire.webp rename to cindy-ping/assets/emotes/inspire.webp diff --git a/desktop-emotes/assets/emotes/investigate.webp b/cindy-ping/assets/emotes/investigate.webp similarity index 100% rename from desktop-emotes/assets/emotes/investigate.webp rename to cindy-ping/assets/emotes/investigate.webp diff --git a/desktop-emotes/assets/emotes/keep.webp b/cindy-ping/assets/emotes/keep.webp similarity index 100% rename from desktop-emotes/assets/emotes/keep.webp rename to cindy-ping/assets/emotes/keep.webp diff --git a/desktop-emotes/assets/emotes/organize.webp b/cindy-ping/assets/emotes/organize.webp similarity index 100% rename from desktop-emotes/assets/emotes/organize.webp rename to cindy-ping/assets/emotes/organize.webp diff --git a/desktop-emotes/assets/emotes/respond.webp b/cindy-ping/assets/emotes/respond.webp similarity index 100% rename from desktop-emotes/assets/emotes/respond.webp rename to cindy-ping/assets/emotes/respond.webp diff --git a/desktop-emotes/assets/emotes/undo.webp b/cindy-ping/assets/emotes/undo.webp similarity index 100% rename from desktop-emotes/assets/emotes/undo.webp rename to cindy-ping/assets/emotes/undo.webp diff --git a/desktop-emotes/assets/emotes/verify.webp b/cindy-ping/assets/emotes/verify.webp similarity index 100% rename from desktop-emotes/assets/emotes/verify.webp rename to cindy-ping/assets/emotes/verify.webp diff --git a/desktop-emotes/assets/icon.png b/cindy-ping/assets/icon.png similarity index 100% rename from desktop-emotes/assets/icon.png rename to cindy-ping/assets/icon.png diff --git a/desktop-emotes/emote-library.js b/cindy-ping/emote-library.js similarity index 100% rename from desktop-emotes/emote-library.js rename to cindy-ping/emote-library.js diff --git a/desktop-emotes/ghost.json b/cindy-ping/ghost.json similarity index 97% rename from desktop-emotes/ghost.json rename to cindy-ping/ghost.json index 24b9ebc6..00a5a71e 100644 --- a/desktop-emotes/ghost.json +++ b/cindy-ping/ghost.json @@ -1,12 +1,12 @@ { "schemaVersion": 3, "minCindyVersion": "0.1.114", - "id": "desktop-emotes", + "id": "cindy-ping", "name": "Cindy Ping", "description": "在鼠标位置立即发表情,默认只展示,同时取消上一个待执行动作。可自行配置指令和项目、任务或伙伴目标。当前版本仅支持 macOS 14+ 设备。", "whenToUse": "在鼠标位置立即发表情;采集原窗口内容后,按表情配置选择或直达项目、任务和伙伴。当前版本仅支持 macOS 14+ 设备。", - "version": "0.3.7", - "releaseNotes": "修复设置页与 Agent 同时编辑时的配置覆盖;补齐英文界面和工具本地化;内置表情改用逐像素无损的 WebP,保持两秒撤销等待。", + "version": "0.3.8", + "releaseNotes": "统一为 Cindy Ping 品牌,插件 ID 与包名改为 cindy-ping,原生程序和相关引用同步改名。", "kind": "chip", "entry": "main.js", "launch": "resident", diff --git a/desktop-emotes/locales/en.json b/cindy-ping/locales/en.json similarity index 100% rename from desktop-emotes/locales/en.json rename to cindy-ping/locales/en.json diff --git a/desktop-emotes/locales/ja.json b/cindy-ping/locales/ja.json similarity index 100% rename from desktop-emotes/locales/ja.json rename to cindy-ping/locales/ja.json diff --git a/desktop-emotes/locales/ko.json b/cindy-ping/locales/ko.json similarity index 100% rename from desktop-emotes/locales/ko.json rename to cindy-ping/locales/ko.json diff --git a/desktop-emotes/locales/zh-CN.json b/cindy-ping/locales/zh-CN.json similarity index 100% rename from desktop-emotes/locales/zh-CN.json rename to cindy-ping/locales/zh-CN.json diff --git a/desktop-emotes/main.js b/cindy-ping/main.js similarity index 99% rename from desktop-emotes/main.js rename to cindy-ping/main.js index ea2f7549..d7878dcc 100644 --- a/desktop-emotes/main.js +++ b/cindy-ping/main.js @@ -1,5 +1,5 @@ 'use strict'; -const channel = new BroadcastChannel('desktop-emotes-v1'); +const channel = new BroadcastChannel('cindy-ping-v1'); let state = { config: null, pending: null }; let locale = 'en'; let latest = null; diff --git a/desktop-emotes/native/DesktopEmotes.app/Contents/Info.plist b/cindy-ping/native/Cindy Ping.app/Contents/Info.plist similarity index 74% rename from desktop-emotes/native/DesktopEmotes.app/Contents/Info.plist rename to cindy-ping/native/Cindy Ping.app/Contents/Info.plist index 6ae176ac..97e9bd75 100644 --- a/desktop-emotes/native/DesktopEmotes.app/Contents/Info.plist +++ b/cindy-ping/native/Cindy Ping.app/Contents/Info.plist @@ -1,11 +1,11 @@ -CFBundleIdentifierapp.desktop-emotes.helper +CFBundleIdentifierapp.cindy-ping.helper CFBundleNameCindy Ping -CFBundleExecutableDesktopEmotes +CFBundleExecutableCindy Ping CFBundlePackageTypeAPPL -CFBundleShortVersionString0.3.7 +CFBundleShortVersionString0.3.8 CFBundleVersion10 LSUIElement LSMinimumSystemVersion14.0 diff --git a/desktop-emotes/native/DesktopEmotes.app/Contents/MacOS/DesktopEmotes b/cindy-ping/native/Cindy Ping.app/Contents/MacOS/Cindy Ping similarity index 99% rename from desktop-emotes/native/DesktopEmotes.app/Contents/MacOS/DesktopEmotes rename to cindy-ping/native/Cindy Ping.app/Contents/MacOS/Cindy Ping index 39b2c3a1..eb9c4e17 100755 Binary files a/desktop-emotes/native/DesktopEmotes.app/Contents/MacOS/DesktopEmotes and b/cindy-ping/native/Cindy Ping.app/Contents/MacOS/Cindy Ping differ diff --git a/desktop-emotes/native/DesktopEmotes.app/Contents/_CodeSignature/CodeResources b/cindy-ping/native/Cindy Ping.app/Contents/_CodeSignature/CodeResources similarity index 100% rename from desktop-emotes/native/DesktopEmotes.app/Contents/_CodeSignature/CodeResources rename to cindy-ping/native/Cindy Ping.app/Contents/_CodeSignature/CodeResources diff --git a/desktop-emotes/native/EmoteHelper.swift b/cindy-ping/native/EmoteHelper.swift similarity index 100% rename from desktop-emotes/native/EmoteHelper.swift rename to cindy-ping/native/EmoteHelper.swift diff --git a/desktop-emotes/node/config.cjs b/cindy-ping/node/config.cjs similarity index 100% rename from desktop-emotes/node/config.cjs rename to cindy-ping/node/config.cjs diff --git a/desktop-emotes/node/scheduler.cjs b/cindy-ping/node/scheduler.cjs similarity index 100% rename from desktop-emotes/node/scheduler.cjs rename to cindy-ping/node/scheduler.cjs diff --git a/desktop-emotes/node/worker.cjs b/cindy-ping/node/worker.cjs similarity index 98% rename from desktop-emotes/node/worker.cjs rename to cindy-ping/node/worker.cjs index 9066a619..12d9ac96 100644 --- a/desktop-emotes/node/worker.cjs +++ b/cindy-ping/node/worker.cjs @@ -12,7 +12,7 @@ const bundledImages = new Set(library.presets().map(item => item.imagePath)); const write = message => process.stdout.write(JSON.stringify(message) + '\n'); const notify = (kind, data) => write({ jsonrpc: '2.0', method: 'emote/event', params: { kind, ...data } }); -const nativePath = path.resolve(__dirname, '../native/DesktopEmotes.app/Contents/MacOS/DesktopEmotes'); +const nativePath = path.resolve(__dirname, '../native/Cindy Ping.app/Contents/MacOS/Cindy Ping'); let config = { emotes: [] }; let runtimeEnabled = false; let child = null; diff --git a/cindy-ping/package-lock.json b/cindy-ping/package-lock.json new file mode 100644 index 00000000..7f8ba354 --- /dev/null +++ b/cindy-ping/package-lock.json @@ -0,0 +1,12 @@ +{ + "name": "cindy-ping", + "version": "0.3.8", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cindy-ping", + "version": "0.3.8" + } + } +} diff --git a/desktop-emotes/package.json b/cindy-ping/package.json similarity index 87% rename from desktop-emotes/package.json rename to cindy-ping/package.json index def68a1f..f462e7cd 100644 --- a/desktop-emotes/package.json +++ b/cindy-ping/package.json @@ -1,6 +1,6 @@ { - "name": "desktop-emotes", - "version": "0.3.7", + "name": "cindy-ping", + "version": "0.3.8", "private": true, "scripts": { "build": "node scripts/build.mjs", diff --git a/desktop-emotes/scripts/build.mjs b/cindy-ping/scripts/build.mjs similarity index 87% rename from desktop-emotes/scripts/build.mjs rename to cindy-ping/scripts/build.mjs index 6e780721..02ef823f 100644 --- a/desktop-emotes/scripts/build.mjs +++ b/cindy-ping/scripts/build.mjs @@ -6,16 +6,16 @@ import { execFileSync } from 'node:child_process'; if (process.platform !== 'darwin') throw new Error('Build this native helper on macOS.'); const root = fileURLToPath(new URL('..', import.meta.url)); const build = resolve(root, 'build'); -const app = resolve(root, 'native/DesktopEmotes.app'); +const app = resolve(root, 'native/Cindy Ping.app'); const manifest = JSON.parse(readFileSync(resolve(root, 'ghost.json'), 'utf8')); mkdirSync(build, { recursive: true }); mkdirSync(resolve(app, 'Contents/MacOS'), { recursive: true }); writeFileSync(resolve(app, 'Contents/Info.plist'), ` -CFBundleIdentifierapp.desktop-emotes.helper +CFBundleIdentifierapp.cindy-ping.helper CFBundleNameCindy Ping -CFBundleExecutableDesktopEmotes +CFBundleExecutableCindy Ping CFBundlePackageTypeAPPL CFBundleShortVersionString${manifest.version} CFBundleVersion10 @@ -31,6 +31,6 @@ for (const arch of ['arm64', 'x86_64']) { '-framework', 'ScreenCaptureKit'], { stdio: 'inherit' }); } execFileSync('lipo', ['-create', resolve(build, 'helper-arm64'), resolve(build, 'helper-x86_64'), - '-output', resolve(app, 'Contents/MacOS/DesktopEmotes')], { stdio: 'inherit' }); + '-output', resolve(app, 'Contents/MacOS/Cindy Ping')], { stdio: 'inherit' }); execFileSync('codesign', ['--force', '--sign', '-', app], { stdio: 'inherit' }); console.log('Built macOS 14+ universal helper (arm64 / x86_64).'); diff --git a/desktop-emotes/scripts/stage.mjs b/cindy-ping/scripts/stage.mjs similarity index 71% rename from desktop-emotes/scripts/stage.mjs rename to cindy-ping/scripts/stage.mjs index 63ac026e..617bff7a 100644 --- a/desktop-emotes/scripts/stage.mjs +++ b/cindy-ping/scripts/stage.mjs @@ -4,11 +4,11 @@ import { resolve } from 'node:path'; const root = fileURLToPath(new URL('..', import.meta.url)); const target = resolve(root, 'build/package'); -if (!existsSync(resolve(root, 'native/DesktopEmotes.app/Contents/MacOS/DesktopEmotes'))) throw new Error('Run the native build first.'); +if (!existsSync(resolve(root, 'native/Cindy Ping.app/Contents/MacOS/Cindy Ping'))) throw new Error('Run the native build first.'); mkdirSync(target, { recursive: true }); for (const entry of ['ghost.json', 'main.js', 'shortcuts.js', 'wheel-layout.js', 'emote-library.js', 'settings.html', 'settings.js', 'settings.css', 'node', 'assets', 'locales']) { cpSync(resolve(root, entry), resolve(target, entry), { recursive: true }); } mkdirSync(resolve(target, 'native'), { recursive: true }); -cpSync(resolve(root, 'native/DesktopEmotes.app'), resolve(target, 'native/DesktopEmotes.app'), { recursive: true }); +cpSync(resolve(root, 'native/Cindy Ping.app'), resolve(target, 'native/Cindy Ping.app'), { recursive: true }); console.log(target); diff --git a/desktop-emotes/settings.css b/cindy-ping/settings.css similarity index 100% rename from desktop-emotes/settings.css rename to cindy-ping/settings.css diff --git a/desktop-emotes/settings.html b/cindy-ping/settings.html similarity index 100% rename from desktop-emotes/settings.html rename to cindy-ping/settings.html diff --git a/desktop-emotes/settings.js b/cindy-ping/settings.js similarity index 99% rename from desktop-emotes/settings.js rename to cindy-ping/settings.js index 04b81296..e008f16e 100644 --- a/desktop-emotes/settings.js +++ b/cindy-ping/settings.js @@ -302,7 +302,7 @@ let config, configRevision, T = strings.en, taskList = [], previews = {}, shortc let modelList = [], modelsLoaded = false, modelsLoading = false, modelsError = '', tasksLoaded = false, tasksLoading; let targetSelectionRevision = 0, destinationPicker = null; let editRevision = 0, appliedRevision = 0, saving = false, recording = false, recordingTimer; -const channel = new BroadcastChannel('desktop-emotes-v1'); +const channel = new BroadcastChannel('cindy-ping-v1'); const pending = new Map(); const L = (zh, en) => T === strings['zh-CN'] ? zh : en; function localize() { diff --git a/desktop-emotes/shortcuts.js b/cindy-ping/shortcuts.js similarity index 100% rename from desktop-emotes/shortcuts.js rename to cindy-ping/shortcuts.js diff --git a/desktop-emotes/wheel-layout.js b/cindy-ping/wheel-layout.js similarity index 100% rename from desktop-emotes/wheel-layout.js rename to cindy-ping/wheel-layout.js diff --git a/desktop-emotes/package-lock.json b/desktop-emotes/package-lock.json deleted file mode 100644 index aa4eec86..00000000 --- a/desktop-emotes/package-lock.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "desktop-emotes", - "version": "0.3.7", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "desktop-emotes", - "version": "0.3.7" - } - } -} diff --git a/provisioning.json b/provisioning.json index 1ecffe3e..cf817fff 100644 --- a/provisioning.json +++ b/provisioning.json @@ -1,7 +1,7 @@ { "//": "内置意识受众配置(随包分发;本仓 = cindy-official-plugin 种子根,由主仓 submodule 挂载)。种子不在 ghosts 里 = 默认 all(人人都装)。audience 取值:'all',或 { userIds: [...], emails: [...] } 任一维度命中即装;登录后才有身份,定向种子登录时装上、登出/不命中时回收。tier 取值:'builtin'(缺省,官方内置)或 'enterprise'(企业意识,设置页单列一组)——只影响分组与标签,不改变播种行为。配置解析失败 = 本种子根整轮跳过(fail-closed)。", "ghosts": { - "desktop-emotes": { + "cindy-ping": { "audience": { "emails": [] } }, "my-browser": {