Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .tests/desktop-emotes.test.mjs → .tests/cindy-ping.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ permission gate.
| <img src="./cindy-github/assets/icon.png" width="22" alt=""> | GitHub | [`cindy-github`](./cindy-github) | Full GitHub workflow: issues / PRs / code review / Actions / releases |
| <img src="./cindy-gitlab/assets/icon.png" width="22" alt=""> | GitLab | [`cindy-gitlab`](./cindy-gitlab) | GitLab (gitlab.com and self-hosted) issues / MRs / repository operations |
| <img src="./cindy-mermaid/assets/icon.jpg" width="22" alt=""> | Mermaid | [`cindy-mermaid`](./cindy-mermaid) | Mermaid diagram source normalization and common syntax fixes |
| <img src="./desktop-emotes/assets/icon.png" width="22" alt=""> | Cindy Ping | [`desktop-emotes`](./desktop-emotes) | Configurable desktop emote wheel and project, conversation or companion delivery; macOS 14+; manual install |
| <img src="./cindy-ping/assets/icon.png" width="22" alt=""> | Cindy Ping | [`cindy-ping`](./cindy-ping) | Configurable desktop emote wheel and project, conversation or companion delivery; macOS 14+; manual install |
| <img src="./cindy-notion/assets/icon.png" width="22" alt=""> | Notion | [`cindy-notion`](./cindy-notion) | Read/write Notion pages, databases, and knowledge bases |
| <img src="./cindy-web-search/assets/icon.png" width="22" alt=""> | Web Search | [`cindy-web-search`](./cindy-web-search) | Public web search (Cindy AI by default; optional user-provided Brave / Tavily / DeepSeek key) |
| <img src="./world-bank-open-data/assets/icon.png" width="22" alt=""> | 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 |
Expand Down
2 changes: 1 addition & 1 deletion README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
| <img src="./cindy-github/assets/icon.png" width="22" alt=""> | GitHub | [`cindy-github`](./cindy-github) | GitHub issue / PR / code review / Actions / release 全流程操作 |
| <img src="./cindy-gitlab/assets/icon.png" width="22" alt=""> | GitLab | [`cindy-gitlab`](./cindy-gitlab) | GitLab(gitlab.com 及自建实例)issue / MR / 仓库操作 |
| <img src="./cindy-mermaid/assets/icon.jpg" width="22" alt=""> | Mermaid | [`cindy-mermaid`](./cindy-mermaid) | Mermaid 图表源码规范化与常见语法修复 |
| <img src="./desktop-emotes/assets/icon.png" width="22" alt=""> | Cindy Ping | [`desktop-emotes`](./desktop-emotes) | 可配置桌面表情轮盘,向项目、会话或伙伴投递;仅 macOS 14+;手动安装 |
| <img src="./cindy-ping/assets/icon.png" width="22" alt=""> | Cindy Ping | [`cindy-ping`](./cindy-ping) | 可配置桌面表情轮盘,向项目、会话或伙伴投递;仅 macOS 14+;手动安装 |
| <img src="./cindy-notion/assets/icon.png" width="22" alt=""> | Notion | [`cindy-notion`](./cindy-notion) | Notion 页面、数据库与知识库读写 |
| <img src="./cindy-web-search/assets/icon.png" width="22" alt=""> | Web Search | [`cindy-web-search`](./cindy-web-search) | 公网搜索(默认 Cindy AI,可选用户自备 Brave / Tavily / DeepSeek Key) |
| <img src="./world-bank-open-data/assets/icon.png" width="22" alt=""> | 世界银行公开数据 | [`world-bank-open-data`](./world-bank-open-data) | 无需 API Key,查询全球国家、经济、社会与发展指标;定向灰度 |
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion desktop-emotes/README.md → cindy-ping/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 解码,不内嵌额外解码库。

Expand Down
File renamed without changes
File renamed without changes.
6 changes: 3 additions & 3 deletions desktop-emotes/ghost.json → cindy-ping/ghost.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
{
"schemaVersion": 3,
"minCindyVersion": "0.1.114",
"id": "desktop-emotes",
"id": "cindy-ping",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge 提供插件 ID 改名所需的 Server migration

当这个改名经 .github/workflows/pr-verify.yml 的 Validate official plugin publish contract 步骤检查时,workflow 会设置 BASE_SHA,而 .tests/plugin-contract.test.mjs:469-479 明确要求基线中的 desktop-emotes 目录及其 ID 继续存在;我按该步骤用本提交的父/目标 SHA 运行测试,稳定得到 desktop-emotes: deleting or renaming an official plugin requires an explicit Server migration。因此当前变更的必需发布契约检查必定失败;应先提供可由 gate 验证的显式 Server migration,而不是只新增此 ID。

AGENTS.md reference: AGENTS.md:L66-L67

Useful? React with 👍 / 👎.

"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",
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion desktop-emotes/main.js → cindy-ping/main.js
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>CFBundleIdentifier</key><string>app.desktop-emotes.helper</string>
<key>CFBundleIdentifier</key><string>app.cindy-ping.helper</string>
<key>CFBundleName</key><string>Cindy Ping</string>
<key>CFBundleExecutable</key><string>DesktopEmotes</string>
<key>CFBundleExecutable</key><string>Cindy Ping</string>
<key>CFBundlePackageType</key><string>APPL</string>
<key>CFBundleShortVersionString</key><string>0.3.7</string>
<key>CFBundleShortVersionString</key><string>0.3.8</string>
<key>CFBundleVersion</key><string>10</string>
<key>LSUIElement</key><true/>
<key>LSMinimumSystemVersion</key><string>14.0</string>
Expand Down
Binary file not shown.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
12 changes: 12 additions & 0 deletions cindy-ping/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions desktop-emotes/package.json → cindy-ping/package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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'), `<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>CFBundleIdentifier</key><string>app.desktop-emotes.helper</string>
<key>CFBundleIdentifier</key><string>app.cindy-ping.helper</string>
Comment thread
GaoWeiLiuXD marked this conversation as resolved.
<key>CFBundleName</key><string>Cindy Ping</string>
<key>CFBundleExecutable</key><string>DesktopEmotes</string>
<key>CFBundleExecutable</key><string>Cindy Ping</string>
<key>CFBundlePackageType</key><string>APPL</string>
<key>CFBundleShortVersionString</key><string>${manifest.version}</string>
<key>CFBundleVersion</key><string>10</string>
Expand All @@ -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).');
Original file line number Diff line number Diff line change
Expand Up @@ -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);
File renamed without changes.
File renamed without changes.
2 changes: 1 addition & 1 deletion desktop-emotes/settings.js → cindy-ping/settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
File renamed without changes.
File renamed without changes.
12 changes: 0 additions & 12 deletions desktop-emotes/package-lock.json

This file was deleted.

2 changes: 1 addition & 1 deletion provisioning.json
Original file line number Diff line number Diff line change
@@ -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": {
Expand Down
Loading