diff --git a/README.md b/README.md index 2e2fda10..ae0cec02 100644 --- a/README.md +++ b/README.md @@ -79,8 +79,8 @@ 暗色 · 真实注入截图(未发送输入已在截图时遮蔽,仅预览)

-这组人物素材留在源码仓库用于参考与权利核验,不进入公开 DMG / Setup.exe;公开安装包只预置已确认 -可分发的 Gothic Void Crusade。普通用户仍可从菜单里的「更换背景图」导入自己有权使用的纯背景, +这组人物素材留在源码仓库用于参考与权利核验,不进入公开 DMG / Setup.exe;公开 macOS 安装包预置已确认 +可分发的 Gothic Void Crusade 与原创「青蓝虚拟歌姬」。普通用户仍可从菜单里的「更换背景图」导入自己有权使用的纯背景, 保存后继续一键切换。 > 可下载的用户源图是 [`docs/images/presets/arina-hashimoto-source.png`](./docs/images/presets/arina-hashimoto-source.png)(`1672 × 941`);源码参考预设使用 [`macos/presets/preset-arina-hashimoto/background.jpg`](./macos/presets/preset-arina-hashimoto/background.jpg)(规范化派生 `2560 × 1440`)。上面两个效果图包含真实 UI,**只作预览,绝不能当背景导入**。背景为用户提供的 AI 生成示例,不代表 OpenAI/Codex 官方视觉或背书;未确认人物与素材权利前不得把它打进公开安装包。 diff --git a/macos/CHANGELOG.md b/macos/CHANGELOG.md index 7b5315d7..dc765d5e 100644 --- a/macos/CHANGELOG.md +++ b/macos/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 未发布 + +### 新增 + +- 新增可公开分发的「青蓝虚拟歌姬」浅色预设,随 macOS 安装包播种,并用固定素材与元数据哈希保护已审核内容。 + ## 1.3.3 — 2026-07-23 ### 修复 diff --git a/macos/NOTICE.md b/macos/NOTICE.md index 862c222f..471be06b 100644 --- a/macos/NOTICE.md +++ b/macos/NOTICE.md @@ -26,6 +26,16 @@ this MIT-licensed project. It is the redistributable default artwork included in the public macOS and Windows installers. Its name and artwork do not imply OpenAI/Codex affiliation or endorsement. +## Cyan Virtual Diva + +`presets/preset-cyan-virtual-diva/background.jpg` is maintainer-supplied +original artwork depicting a fictional adult virtual singer. It was created +for this project without an identifiable real-person likeness, named +third-party character, or official OpenAI/Codex artwork. The maintainer grants +permission to redistribute the image and its theme metadata as part of Codex +Dream Skin source archives and public installers. The preset does not imply +OpenAI/Codex affiliation or endorsement. + ## Arina Hashimoto reference material The following user/maintainer-supplied files are excluded from the MIT software license: diff --git a/macos/README.md b/macos/README.md index 7c82fc90..8aefbf2c 100644 --- a/macos/README.md +++ b/macos/README.md @@ -89,8 +89,8 @@ CDP is powerful and unauthenticated on loopback. Prefer Restore when you are don ## Bundled presets -The public DMG seeds **Gothic Void Crusade**, contributed through PR #134, as -its redistributable default. A source checkout also contains the +The public DMG seeds **Gothic Void Crusade**, contributed through PR #134, and +the original **青蓝虚拟歌姬 / Cyan Virtual Diva** light preset. A source checkout also contains the **桥本有菜 / Arina Hashimoto** reference material, but the public app bundle deliberately excludes it until independent likeness and redistribution rights are confirmed. diff --git a/macos/presets/README.md b/macos/presets/README.md index 00adff08..ce668010 100644 --- a/macos/presets/README.md +++ b/macos/presets/README.md @@ -6,11 +6,14 @@ ## 内置实测预设 -当前内置 `preset-gothic-void-crusade/`(Gothic Void Crusade)与 -`preset-arina-hashimoto/`(桥本有菜 / Arina Hashimoto)两套实机验证主题。 -前者是社区作者提供的原创哥特科幻背景;后者使用一张 +当前内置 `preset-gothic-void-crusade/`(Gothic Void Crusade)、 +`preset-cyan-virtual-diva/`(青蓝虚拟歌姬)与 +`preset-arina-hashimoto/`(桥本有菜 / Arina Hashimoto)三套实机验证主题。 +前两套是可进入公开安装包的原创虚构作品;后者使用一张 `2560 × 1440`(16:9)纯背景:左侧低信息留白承载 Codex 原生标题,人物和花卉主视觉集中在右侧。浅色与暗色截图均来自真实 Codex 注入,不是 AI 绘制的整窗 UI。 +青蓝虚拟歌姬背景为维护者提供的原创虚构成年角色作品,未使用真人肖像、第三方角色名称或官方 Codex/OpenAI 素材;`2400 × 1350` JPEG 与主题元数据按贡献声明授权随本项目公开安装包再分发。具体哈希由 macOS 构建脚本锁定,素材声明见 [`../NOTICE.md`](../NOTICE.md)。 + 来源尺寸必须如实区分:归档的用户源图(不随 preset 播种)是 `1672 × 941` PNG;preset 内的 `background.jpg` 保持其近 16:9 构图,标准化导出为 `2560 × 1440` JPEG,并不代表补回或新增了源图细节。派生文件使用 `sips -z 1440 2560 -s format jpeg -s formatOptions 90` 生成。 - 可导入/可播种的主题素材只有 [`background.jpg`](./preset-arina-hashimoto/background.jpg) 与 [`theme.json`](./preset-arina-hashimoto/theme.json)。 @@ -23,7 +26,7 @@ ```bash ~/.codex/codex-dream-skin-studio/scripts/switch-theme-macos.sh \ - --id preset-arina-hashimoto + --id preset-cyan-virtual-diva ``` ## 一套预设的结构 diff --git a/macos/presets/preset-cyan-virtual-diva/background.jpg b/macos/presets/preset-cyan-virtual-diva/background.jpg new file mode 100644 index 00000000..e59844f7 Binary files /dev/null and b/macos/presets/preset-cyan-virtual-diva/background.jpg differ diff --git a/macos/presets/preset-cyan-virtual-diva/theme.json b/macos/presets/preset-cyan-virtual-diva/theme.json new file mode 100644 index 00000000..0638b875 --- /dev/null +++ b/macos/presets/preset-cyan-virtual-diva/theme.json @@ -0,0 +1,31 @@ +{ + "schemaVersion": 1, + "id": "preset-cyan-virtual-diva", + "name": "青蓝虚拟歌姬", + "brandSubtitle": "CYAN WAVE STAGE", + "tagline": "让灵感沿着光与节拍流动。", + "projectPrefix": "选择项目 · ", + "projectLabel": "◉ 选择项目", + "statusText": "CYAN WAVE ONLINE", + "quote": "BUILD IN YOUR OWN FREQUENCY", + "image": "background.jpg", + "appearance": "light", + "art": { + "focusX": 0.79, + "focusY": 0.44, + "safeArea": "left", + "taskMode": "ambient" + }, + "colors": { + "background": "#eef8fc", + "panel": "#f6fcff", + "panelAlt": "#dff4f8", + "accent": "#1abbd0", + "accentAlt": "#54dce2", + "secondary": "#155b8e", + "highlight": "#786ee8", + "text": "#153b55", + "muted": "#5b7788", + "line": "rgba(28, 164, 196, .24)" + } +} diff --git a/macos/scripts/build-dmg.sh b/macos/scripts/build-dmg.sh index de37193b..79d5b251 100755 --- a/macos/scripts/build-dmg.sh +++ b/macos/scripts/build-dmg.sh @@ -62,6 +62,8 @@ MOUNTED_APP="$MOUNT/Codex Dream Skin.app" || { printf 'Mounted app is missing license notices.\n' >&2; exit 1; } [ -f "$MOUNTED_APP/Contents/Resources/engine/presets/preset-gothic-void-crusade/theme.json" ] \ || { printf 'Mounted app is missing the public release preset.\n' >&2; exit 1; } +[ -f "$MOUNTED_APP/Contents/Resources/engine/presets/preset-cyan-virtual-diva/theme.json" ] \ + || { printf 'Mounted app is missing the Cyan Virtual Diva preset.\n' >&2; exit 1; } [ ! -e "$MOUNTED_APP/Contents/Resources/engine/presets/preset-arina-hashimoto" ] \ || { printf 'Mounted app contains a rights-restricted preset.\n' >&2; exit 1; } for excluded in build-client-release.sh build-dmg.sh build-menubar-app.sh build-release.sh \ diff --git a/macos/scripts/build-menubar-app.sh b/macos/scripts/build-menubar-app.sh index e78564ef..48e78b73 100755 --- a/macos/scripts/build-menubar-app.sh +++ b/macos/scripts/build-menubar-app.sh @@ -112,21 +112,33 @@ for name in "${RUNTIME_SCRIPTS[@]}"; do done [ -d "$ROOT/assets" ] || { printf 'Engine directory missing: assets\n' >&2; exit 1; } /usr/bin/rsync -a "$ROOT/assets/" "$ENGINE/assets/" -PUBLIC_PRESET="preset-gothic-void-crusade" -PUBLIC_PRESET_SHA256="b76a7cbe2ff9d923846e931984d243a7ba1f25de8d190b5c6412c809c41aee42" -PUBLIC_PRESET_THEME_SHA256="8316c6ad29e3b84806358ab4a730c7e063b261e379179b9608cf751c282d66a7" -[ -d "$ROOT/presets/$PUBLIC_PRESET" ] \ - || { printf 'Public release preset missing: %s\n' "$PUBLIC_PRESET" >&2; exit 1; } -actual_public_preset_sha256="$(LC_ALL=C /usr/bin/shasum -a 256 \ - "$ROOT/presets/$PUBLIC_PRESET/background.jpg" | /usr/bin/awk '{print $1}')" -[ "$actual_public_preset_sha256" = "$PUBLIC_PRESET_SHA256" ] \ - || { printf 'Reviewed public preset hash changed: %s\n' "$actual_public_preset_sha256" >&2; exit 1; } -actual_public_preset_theme_sha256="$(LC_ALL=C /usr/bin/shasum -a 256 \ - "$ROOT/presets/$PUBLIC_PRESET/theme.json" | /usr/bin/awk '{print $1}')" -[ "$actual_public_preset_theme_sha256" = "$PUBLIC_PRESET_THEME_SHA256" ] \ - || { printf 'Reviewed public preset metadata hash changed: %s\n' "$actual_public_preset_theme_sha256" >&2; exit 1; } -/bin/mkdir -p "$ENGINE/presets/$PUBLIC_PRESET" -/usr/bin/rsync -a "$ROOT/presets/$PUBLIC_PRESET/" "$ENGINE/presets/$PUBLIC_PRESET/" +copy_public_preset() { + local preset_id="$1" + local expected_image_sha256="$2" + local expected_theme_sha256="$3" + local actual_image_sha256 + local actual_theme_sha256 + [ -d "$ROOT/presets/$preset_id" ] \ + || { printf 'Public release preset missing: %s\n' "$preset_id" >&2; exit 1; } + actual_image_sha256="$(LC_ALL=C /usr/bin/shasum -a 256 \ + "$ROOT/presets/$preset_id/background.jpg" | /usr/bin/awk '{print $1}')" + [ "$actual_image_sha256" = "$expected_image_sha256" ] \ + || { printf 'Reviewed public preset image hash changed: %s %s\n' "$preset_id" "$actual_image_sha256" >&2; exit 1; } + actual_theme_sha256="$(LC_ALL=C /usr/bin/shasum -a 256 \ + "$ROOT/presets/$preset_id/theme.json" | /usr/bin/awk '{print $1}')" + [ "$actual_theme_sha256" = "$expected_theme_sha256" ] \ + || { printf 'Reviewed public preset metadata hash changed: %s %s\n' "$preset_id" "$actual_theme_sha256" >&2; exit 1; } + /bin/mkdir -p "$ENGINE/presets/$preset_id" + /usr/bin/rsync -a "$ROOT/presets/$preset_id/" "$ENGINE/presets/$preset_id/" +} +copy_public_preset \ + "preset-gothic-void-crusade" \ + "b76a7cbe2ff9d923846e931984d243a7ba1f25de8d190b5c6412c809c41aee42" \ + "8316c6ad29e3b84806358ab4a730c7e063b261e379179b9608cf751c282d66a7" +copy_public_preset \ + "preset-cyan-virtual-diva" \ + "124d1f8a74fb580ed8a3412a09087e5cce1a84845a872a399cc540f217f50bef" \ + "8ae4995aad670f815431c15aec5bb801d52a6587ba23b98e472f1b54dfccc573" /bin/cp "$ROOT/VERSION" "$ENGINE/VERSION" /bin/cp "$ROOT/LICENSE" "$RESOURCES/LICENSE.txt" /bin/cp "$ROOT/NOTICE.md" "$RESOURCES/NOTICE.md" diff --git a/macos/tests/image-metadata.test.mjs b/macos/tests/image-metadata.test.mjs index 082013e5..328b2c3d 100644 --- a/macos/tests/image-metadata.test.mjs +++ b/macos/tests/image-metadata.test.mjs @@ -40,6 +40,21 @@ assert.deepEqual(readImageMetadata(gothic, ".jpg"), { taskMode: "ambient", }); +const cyanVirtualDiva = await fs.readFile(path.join( + macosRoot, + "presets", + "preset-cyan-virtual-diva", + "background.jpg", +)); +assert.deepEqual(readImageMetadata(cyanVirtualDiva, ".jpg"), { + width: 2400, + height: 1350, + ratio: 2400 / 1350, + wide: true, + aspect: "wide", + taskMode: "ambient", +}); + assert.deepEqual(classifyImageDimensions({ width: 2400, height: 1350 }), { width: 2400, height: 1350, diff --git a/macos/tests/run-tests.sh b/macos/tests/run-tests.sh index 21b2a323..46b40a11 100755 --- a/macos/tests/run-tests.sh +++ b/macos/tests/run-tests.sh @@ -89,6 +89,14 @@ if ! /usr/bin/grep -F -q "presets/preset-arina-hashimoto/" \ printf 'Standalone release builders must explicitly exclude the restricted Arina preset.\n' >&2 exit 1 fi +for public_release_script in build-menubar-app.sh build-dmg.sh; do + if ! /usr/bin/grep -F -q "preset-cyan-virtual-diva" \ + "$ROOT/scripts/$public_release_script"; then + printf 'Public release script must include the Cyan Virtual Diva preset: %s\n' \ + "$public_release_script" >&2 + exit 1 + fi +done if ! /usr/bin/grep -F -q 'DEPLOY_PREVIOUS' "$ROOT/scripts/install-dream-skin-macos.sh" || ! /usr/bin/grep -F -q 'rollback_deployed_project' "$ROOT/scripts/install-dream-skin-macos.sh"; then printf 'The macOS outer installer must roll back a failed engine deployment.\n' >&2 @@ -281,10 +289,12 @@ fi [ -f "$themes/preset-gothic-void-crusade/background.jpg" ] || exit 1 [ -f "$themes/preset-arina-hashimoto/theme.json" ] || exit 1 [ -f "$themes/preset-arina-hashimoto/background.jpg" ] || exit 1 + [ -f "$themes/preset-cyan-virtual-diva/theme.json" ] || exit 1 + [ -f "$themes/preset-cyan-virtual-diva/background.jpg" ] || exit 1 [ -f "$themes/custom-keepme/theme.json" ] || exit 1 for id in $retired; do [ ! -e "$themes/$id" ] || exit 1; done seeded="$(/usr/bin/find "$themes" -maxdepth 1 -type d -name "preset-*" | /usr/bin/wc -l | /usr/bin/tr -d " ")" - [ "$seeded" -eq 2 ] || exit 1 + [ "$seeded" -eq 3 ] || exit 1 ' _ "$ROOT" run_signed_runtime_switch_test() {