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": {