5 次代码提交
共修改 36 个文件,包含 589 行新增和 40 行删除

没有与搜索条件相匹配的文件

+3
查看文件
@@ -37,3 +37,6 @@ venv/
# Local reference binaries stay outside source history
reference-binaries/
# Reviewed signed release installer (intentional distribution artifact)
!releases/1.2.0/*.pkg
二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 2.6 MiB

+21
查看文件
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2026 Dayu
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+11 -3
查看文件
@@ -6,7 +6,7 @@
## 使用
正式安装路径为 `/Library/Plug-Ins/FxPlug/beatygril.app`。Motion 滤镜分类为「大鱼」,滤镜名「大鱼人像美化」。Final Cut Pro 在「效果 → 大鱼 → 大鱼人像美化」中使用配套 Motion 效果,模板目录必须同时保留 `.moef` 与 `Drop Zone.tiff`。美化会随当前帧的人脸自动更新,不需要点击分析。界面以磨皮、美白、瘦脸三张卡片呈现,默认跟随主要人脸;多人模式对多脸变形。单项眼睛可暂时停用并保留数值,右侧箭头恢复默认;磨皮半径、饱和度、锐化和整体混合等收在「更多设置」。旧手动分析与调试参数仅保留隐藏兼容,实际输出统一使用实时自动跟随。
正式安装路径为 `/Library/Plug-Ins/FxPlug/beatygril.app`。Motion 滤镜分类为「大鱼」,滤镜名「大鱼人像美化」。Final Cut Pro 在「效果 → 大鱼磨皮瘦脸 → 大鱼人像美化」中使用配套 Motion 效果,模板目录必须同时保留 `.moef` 与 `Drop Zone.tiff`。美化会随当前帧的人脸自动更新,不需要点击分析。界面以磨皮、美白、瘦脸三张卡片呈现,默认跟随主要人脸;多人模式对多脸变形。单项眼睛可暂时停用并保留数值,右侧箭头恢复默认;磨皮半径、饱和度、锐化和整体混合等收在「更多设置」。旧手动分析与调试参数仅保留隐藏兼容,实际输出统一使用实时自动跟随。
## 开发和恢复
@@ -21,7 +21,7 @@ xcodebuild -project beatygril/beatygril.xcodeproj -scheme 'Wrapper Application'
工程从 `/Library/Developer/SDKs/FxPlug.sdk` 读取头文件与链接信息,从 `/Library/Developer/Frameworks` 嵌入可运行的 Apple 框架。构建默认使用团队 B3W25FX5H5 的 Developer ID Application 身份;正式交付使用 `python3 scripts/deliver.py` 完成公证、粘附和安装;安装前先关闭 Motion 与 FCP,脚本在检测到宿主仍运行时保留原安装版并停止。原生验收完成后继续脚本的清理阶段,清除临时注册与 APP 副本。
私有源码仓库:`https://dayu.media/git/dayu/paintfcp-fxplug.git`。恢复入口见 [RECOVERY.md](RECOVERY.md),当前验证记录见 [验证记录](docs/验证记录.md)。原始模板保存在 `baseline-20261021` 标签。
源码仓库:`https://dayu.media/git/dayu/paintfcp-fxplug.git`。恢复入口见 [RECOVERY.md](RECOVERY.md),当前验证记录见 [验证记录](docs/验证记录.md)。原始模板保存在 `baseline-20261021` 标签。
## 1.0.5 瘦脸修复
@@ -49,4 +49,12 @@ xcodebuild -project beatygril/beatygril.xcodeproj -scheme 'Wrapper Application'
面板改为先在真实视图的宿主 action 内取得读写接口,修复控件一直禁用的问题。短脸改用76点下半脸闭合区域和鼻梁位移轴,下颌骨改为六组相邻轮廓半径的局部位移,移除旧脸框近似场;详见[分析](docs/analysis/短脸与下颌骨分析.md)。其余五项脸型仍保留近似实现,不能将局部算法恢复视为全部效果逐像素一致。
1551项回归通过,含335项宿主适配、98项OSC和157项面板ASan检查;28种控制/原点组合均核验实际解剖位置,改变原点标签时逐字节一致。额外真实帧ASan专项886项通过,含重复基础用例。1.1.2(13)已完成正式签名、公证、票据、唯一正式路径安装及副本清理。Motion/FCP原生数值、重置和隔离画面响应已验证,Motion保存重开与撤销通过;按住滑杆时画布持续刷新的实际观感仍等待用户反馈。连续步进在松手前提交已通过独立模拟宿主验证,不能将它等同于每个鼠标事件都排出一帧。
1551项回归通过,含335项宿主适配、98项OSC和157项面板ASan检查;28种控制/原点组合均核验实际解剖位置,改变原点标签时逐字节一致。额外真实帧ASan专项886项通过,含重复基础用例。1.1.2(13)已完成正式签名、公证、票据、唯一正式路径安装及副本清理。Motion/FCP原生数值、重置和隔离画面响应已验证,Motion保存重开与撤销通过;用户于2026-10-22实测确认“拖动中已持续更新”;未指定测试宿主,不扩张为两个宿主分别完成动态排帧验收。连续步进在松手前提交已通过独立模拟宿主验证,不能将它等同于每个鼠标事件都排出一帧。
## 1.2.0 免费开源发布
采用 MIT 许可(第三方资源边界见 THIRD_PARTY_NOTICES.md)。安装包同时包含唯一正式 FxPlug4 APP 和 FCP 效果模板;自动注册,无需账号、激活码或付费激活。主 APP 显示古风说明图,窗口显示三秒后自动退出,不影响独立的宿主插件服务。封面人物是生成的宣传插画,非效果前后对比。
`large.png`(640×360)和 `small.png`(192×108)与 `.moef` 同目录,安装器安装后重新锁定。手动复制或从 Git 恢复模板时,需对这两个 PNG 重新执行 `chflags uchg`,不能锁定整个模板目录。FCP 当前分类为「大鱼磨皮瘦脸」,Motion 原生滤镜分类仍为「大鱼」。
仓库属性已设为公开;大鱼站统一 Git 网关目前仍要求登录并校验会员,公开属性并未绕过网关。发布文章另提供可公开下载的当前源码快照,不依赖 Git 登录;安装包始终免费。
+13 -3
查看文件
@@ -1,6 +1,6 @@
# 恢复说明
- 私有远程:`https://dayu.media/git/dayu/paintfcp-fxplug.git`
- 源码远程:`https://dayu.media/git/dayu/paintfcp-fxplug.git`
- 本地项目根:`/Users/dayu/Documents/PaintFCP`
- 工作分支:`main`
- 修改前版本标签:`baseline-20261021`,完整 SHA:`1746f38398588e2367abb37a5c2b31cb64042429`
@@ -12,7 +12,7 @@
```sh
git clone https://dayu.media/git/dayu/paintfcp-fxplug.git
cd paintfcp-fxplug
git switch --detach v1.1.2
git switch --detach v1.2.0
```
需要继续编辑时,基于该提交创建新分支。安装 Xcode 与 Apple FxPlug 4 SDK;盘点版本和构建入口见 README.md。SDK/framework 为 Apple 外部开发依赖,应重新安装匹配版本。证书、私钥和公证凭据需从独立加密备份恢复或重新申请;Git 不包含它们。
@@ -85,4 +85,14 @@ FCP模板从 `Templates/大鱼人像美化/` 恢复,将 `.moef` 和 `Drop Zone
正式Release已使用固定团队逐层签名,Apple公证Accepted `5f5ce378-8430-467b-ae97-048e6bc81573`,票据、Gatekeeper、通用架构和PluginKit正式路径全部通过。唯一正式安装APP为`/Library/Plug-Ins/FxPlug/beatygril.app`,模板moef SHA256为`e9fa97dc14323d0daa7d3d61b06a78ba4000a70ab9f5e67ebffd750d49df1e15`,TIFF逐字节一致。临时APP、旧APP和公证ZIP已清理,有界目录及现存Spotlight索引产品路径中仅发现正式APP,扫描错误0,不宣称扫描了所有卷。
Motion/FCP原生验收范围及未完成项见`docs/verification/v1.1.2/native-qa.json`:数值、重置、隔离短脸/下颌骨响应通过;Motion撤销和保存关闭重开通过。连续步进已改为每步完整宿主action,模拟宿主确认鼠标松开前可发布中间设置;原生按住鼠标期间的画布时序仍待用户反馈。后续人脸素材和全AX只保留本机build,不是产品依赖或上传资源。
Motion/FCP原生验收范围及未完成项见`docs/verification/v1.1.2/native-qa.json`:数值、重置、隔离短脸/下颌骨响应通过;Motion撤销和保存关闭重开通过。连续步进已改为每步完整宿主action,模拟宿主确认鼠标松开前可发布中间设置;用户于2026-10-22实测确认拖动中持续更新;未指定宿主,未测量逐事件排帧时序。后续人脸素材和全AX只保留本机build,不是产品依赖或上传资源。
最终标签`v1.1.2`完整提交SHA为`e9fddda5e13042f761755762fa39dfe090853c6a`,已独立从远端恢复,158文件的bytes/blob/mode与strict/full fsck通过,产品目录与签名源码a2e33e8逐字节一致,无LFS或子模块,恢复临时目录已清理。详见`docs/verification/v1.1.2/final-tag-recovery.json`;后续main仅补充恢复报告和用户验收记录,产品源码保持不变。
## 1.2.0 恢复入口
源码构建节点为 `696d5f39b30404ed5d1d4c25f61d17475c7fc91b`,版本1.2.0(14)。使用同一 Apple SDK、签名团队与正式安装路径;本次仅改变外层启动器、版本及宣传资源,渲染和面板保留1.1.2验收实现。最终安装包和验证记录随 `v1.2.0` 保存。无 LFS / 子模块。正式 APP 只保留 `/Library/Plug-Ins/FxPlug/beatygril.app`;源代码不包含私钥。
模板恢复到 `~/Movies/Motion Templates.localized/Effects.localized/大鱼磨皮瘦脸/大鱼人像美化/`,需同时保留 `.moef`、`Drop Zone.tiff`、`large.png`、`small.png`。Git 不保存 BSD 文件标志,手工复制后对两张 PNG 执行 `chflags uchg` 并核对 `ls -lO`;不要锁目录和工程。自动安装 PKG 会恢复这两个锁。
仓库已为公开属性,但当前网站 Git 网关仍执行登录 / 会员校验。匿名 `ls-remote` 未通过,不宣称无需登录的 Git 恢复已通过;认证的远端克隆和文章的公开源码快照分别核验。服务端备份边界与前文相同。
+12
查看文件
@@ -0,0 +1,12 @@
# 第三方资料与许可边界
本项目自己的 Objective-C、Metal、脚本及原创文档按根目录 MIT License 开源。署名 Dayu 不表示第三方代码、样本与 SDK 的版权转移。
- Apple FxPlug / PluginManager SDK 和随正式插件分发的运行框架属于 Apple;受 Apple 相应 SDK 与再分发条款约束,源码仓库不包含这些框架。编译需自行安装 Xcode 与 FxPlug SDK。macOS Vision、AppKit、CoreImage 属于系统组件。
- `Templates/大鱼人像美化/Drop Zone.tiff` 是 Motion 工程的标准占位资源,随模板保留;不将其声明为 Dayu 原创作品或另行授予 MIT 权利。
- `tests/fixtures/astronaut.png` 来源于 NASA 的 Eileen Collins 图像,经 scikit-image 样本分发,详见同目录 ATTRIBUTION.md。相关分析预览由该公开样本生成。
- `docs/analysis` 中的对照分析、符号和反汇编摘录是互操作研究材料,不包括目标商业 APP、模型或 metallib。MIT 不为其原权利人的内容重新授权。本项目不声称与目标商业插件的模型或画面逐像素一致。
- `Assets/Artwork/portrait-cover.png`、APP 中 `LauncherInfo.png` 及两张模板缩略图由内置图像生成工具创作。人物为虚构成年古风人物,封面是宣传插画,不是真实滤镜前后效果对比;生成说明和提示词见 `docs/design`。未使用目标插件的宣传人像。
- 不包含用户测试素材、用户工程、真实人脸坐标数据、签名私钥、公证密码或账号令牌。签名证书与公证凭据不属于源码恢复范围。
免费发布版本无需激活码、付费注册或联网授权。安装时执行系统插件注册;主 APP 打开后显示说明并在三秒后退出,宿主内的 FxPlug 服务独立运行。
+1 -1
查看文件
@@ -62,7 +62,7 @@
"build": "13",
"Motion": "pass: native number/reset/undo and save-close-reopen; isolated shape/profile images inspected with identical geometry source",
"FCP": "pass: formal load, number/reset and same-frame isolated short/jaw render",
"continuousPreview": "per-step host completion verified automatically; native held-mouse canvas timing pending user observation"
"continuousPreview": "pass: user confirmed held-drag continuous preview on 2026-10-22 (Asia/Shanghai), version1.1.2 build13; host not specified, per-event frame timing not instrumented"
},
"customParameter": {
"id": 210,
二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 444 KiB

二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 44 KiB

@@ -82,6 +82,7 @@
"/Localized: Wrapper Application/MainMenu.xib",
Plugin/Info.plist,
"Wrapper Application/AppDelegate.m",
"Wrapper Application/Resources/LauncherInfo.png",
"Wrapper Application/Info.plist",
"Wrapper Application/main.m",
);
@@ -355,6 +356,7 @@
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_ENTITLEMENTS = "beatygril/Wrapper Application/SandboxEntitlements.entitlements";
OTHER_LDFLAGS = ("$(inherited)", "-framework", CoreServices, );
CODE_SIGN_IDENTITY = "Developer ID Application";
CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO;
CODE_SIGN_STYLE = Manual;
@@ -372,6 +374,7 @@
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_ENTITLEMENTS = "beatygril/Wrapper Application/SandboxEntitlements.entitlements";
OTHER_LDFLAGS = ("$(inherited)", "-framework", CoreServices, );
CODE_SIGN_IDENTITY = "Developer ID Application";
CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO;
CODE_SIGN_STYLE = Manual;
+4 -4
查看文件
@@ -17,9 +17,9 @@
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>1.1.2</string>
<string>1.2.0</string>
<key>CFBundleVersion</key>
<string>13</string>
<string>14</string>
<key>NSHumanReadableCopyright</key>
<string></string>
<key>PlugInKit</key>
@@ -72,7 +72,7 @@
<key>uuid</key>
<string>FB14B0E6-59B2-4836-916F-CD0C559E9241</string>
<key>version</key>
<string>1.1.2</string>
<string>1.2.0</string>
</dict>
<dict>
<key>className</key>
@@ -84,7 +84,7 @@
<key>uuid</key>
<string>E0E432C8-3D71-4ABA-B006-E7F519E06C87</string>
<key>version</key>
<string>1.1.2</string>
<string>1.2.0</string>
<key>protocolNames</key>
<array>
<string>FxOnScreenControl</string>
@@ -1,34 +1,45 @@
#import "AppDelegate.h"
#import <CoreServices/CoreServices.h>
@interface AppDelegate ()
@property (weak) IBOutlet NSWindow *window;
@property (strong) NSTimer *exitTimer;
@end
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)notification {
self.window.title=@"大鱼人像美化";
[self.window setContentSize:NSMakeSize(600,360)];
NSView *content=[NSView new];self.window.contentView=content;
NSStackView *stack=[NSStackView new];stack.orientation=NSUserInterfaceLayoutOrientationVertical;
stack.alignment=NSLayoutAttributeLeading;stack.spacing=16;stack.translatesAutoresizingMaskIntoConstraints=NO;
[content addSubview:stack];
[NSLayoutConstraint activateConstraints:@[[stack.leadingAnchor constraintEqualToAnchor:content.leadingAnchor constant:32],[stack.trailingAnchor constraintEqualToAnchor:content.trailingAnchor constant:-32],[stack.topAnchor constraintEqualToAnchor:content.topAnchor constant:30]]];
NSTextField *title=[NSTextField labelWithString:@"大鱼人像美化"];
title.font=[NSFont systemFontOfSize:28 weight:NSFontWeightSemibold];[stack addArrangedSubview:title];
NSTextField *subtitle=[NSTextField labelWithString:@"beatygril · FxPlug 4"];
subtitle.textColor=NSColor.secondaryLabelColor;[stack addArrangedSubview:subtitle];
NSTextField *description=[NSTextField wrappingLabelWithString:@"在 Motion 的滤镜资源库中选择「大鱼 → 大鱼人像美化」。Final Cut Pro 的效果浏览器中也可使用配套效果。\n\n美化会随画面人脸自动更新,无需先点分析。脸型默认跟随主要人脸,多人模式可处理多张脸。启用「只处理选中人脸」后,可点击画面更换目标。向前/向后分析为可选功能,结果可随工程保存。"];
description.font=[NSFont systemFontOfSize:13];[stack addArrangedSubview:description];
NSStackView *buttons=[NSStackView new];buttons.orientation=NSUserInterfaceLayoutOrientationHorizontal;buttons.spacing=12;
[buttons addArrangedSubview:[NSButton buttonWithTitle:@"打开 Motion" target:self action:@selector(openMotion:)]];
[buttons addArrangedSubview:[NSButton buttonWithTitle:@"打开 Final Cut Pro" target:self action:@selector(openFinalCut:)]];
[stack addArrangedSubview:buttons];
NSTextField *note=[NSTextField wrappingLabelWithString:@"建议先调高中频磨皮,再按需调节肤色与脸型。肤色风格为本插件独立调色预设。"];
note.textColor=NSColor.secondaryLabelColor;note.font=[NSFont systemFontOfSize:11];[stack addArrangedSubview:note];
[self.window center];
self.window.title = @"大鱼人像美化 · 免费开源";
[self.window setContentSize:NSMakeSize(800, 450)];
self.window.styleMask &= ~NSWindowStyleMaskResizable;
self.window.backgroundColor = [NSColor colorWithRed:0.94 green:0.92 blue:0.85 alpha:1];
NSImageView *card = [[NSImageView alloc] initWithFrame:NSMakeRect(0, 0, 800, 450)];
card.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
card.imageScaling = NSImageScaleProportionallyUpOrDown;
NSURL *artwork = [NSBundle.mainBundle URLForResource:@"LauncherInfo" withExtension:@"png"];
card.image = [[NSImage alloc] initWithContentsOfURL:artwork];
card.accessibilityLabel = @"大鱼人像美化,免费开源,自动注册,无需激活码。主程序启动三秒后自动退出;Final Cut Pro 和 Motion 中的滤镜继续独立运行。";
self.window.contentView = card;
if (!card.image) {
NSTextField *fallback = [NSTextField wrappingLabelWithString:card.accessibilityLabel];
fallback.frame = NSMakeRect(48, 160, 704, 130);
fallback.font = [NSFont systemFontOfSize:24 weight:NSFontWeightSemibold];
[card addSubview:fallback];
}
- (void)openMotion:(id)sender {[self openApplication:@"com.apple.motionapp"];}
- (void)openFinalCut:(id)sender {[self openApplication:@"com.apple.FinalCut"];}
- (void)openApplication:(NSString *)identifier {
NSURL *url=[NSWorkspace.sharedWorkspace URLForApplicationWithBundleIdentifier:identifier];
if(url) [NSWorkspace.sharedWorkspace openApplicationAtURL:url configuration:NSWorkspaceOpenConfiguration.configuration completionHandler:nil];
[self.window center];
[self.window makeKeyAndOrderFront:nil];
[NSApp activateIgnoringOtherApps:YES];
// Only this launcher exits. The FxPlug service has its own process/lifetime.
self.exitTimer = [NSTimer scheduledTimerWithTimeInterval:3.0 repeats:NO block:^(NSTimer *timer) {
[NSApp terminate:nil];
}];
// Re-register our own bundle. There is no paid activation or account step.
NSURL *bundleURL = NSBundle.mainBundle.bundleURL;
dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), ^{
OSStatus status = LSRegisterURL((__bridge CFURLRef)bundleURL, true);
if (status != noErr) NSLog(@"LaunchServices registration status: %d", (int)status);
});
}
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender {
return YES;
}
@end
@@ -17,9 +17,9 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.1.2</string>
<string>1.2.0</string>
<key>CFBundleVersion</key>
<string>13</string>
<string>14</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>NSHumanReadableCopyright</key>
二进制文件未显示。

之后

宽度:  |  高度:  |  大小: 2.9 MiB

+41
查看文件
@@ -0,0 +1,41 @@
{
"generator": "built-in image_gen",
"type": "generated promotional artwork, not an actual effect-output comparison",
"style": "宋式青绿古风;成年女性面部近景;金色瘦脸轮廓线与内收箭头",
"thumbnail_text": [
"大鱼人像美化",
"自动瘦脸",
"自动跟随",
"自动美颜",
"免费开源"
],
"app_card_text": [
"大鱼人像美化",
"免费开源",
"自动注册 · 无需激活码",
"启动 3 秒后自动退出",
"Final Cut Pro · Motion",
"dayu.media"
],
"files": [
{
"path": "Assets/Artwork/portrait-cover.png",
"sha256": "a346f06e7793b4e5483ccd4b3b86f34c2036bbe6bbddb7ad9cc70c47e7d014ab"
},
{
"path": "beatygril/beatygril/Wrapper Application/Resources/LauncherInfo.png",
"sha256": "239552eeea738a32fafa70922d3cd1d4c115ff75d672574fa4c5acd941381fba"
},
{
"path": "Templates/大鱼人像美化/large.png",
"sha256": "a02ddb255b1ae255c749bb837a759e2dee1c3b8ffb9bdc1167957761bd5a1b97"
},
{
"path": "Templates/大鱼人像美化/small.png",
"sha256": "1552b838dd88f60dee0795e20aaca652f9c558ecefc93500e895fbff77c2a4d5"
}
],
"thumbnail_lock": "uchg on both PNGs only; installer must restore flags",
"template_sha256": "e9fa97dc14323d0daa7d3d61b06a78ba4000a70ab9f5e67ebffd750d49df1e15",
"revision": "User feedback: reduce three feature lines by approximately one third and increase negative space."
}
+5
查看文件
@@ -0,0 +1,5 @@
{
"mode": "built-in image_gen",
"cover_prompt": "Use case: ads-marketing. Asset type: final 16:9 wide Chinese classical portrait beautification FxPlug product cover and very small Final Cut Pro effect thumbnail.\nEdit the supplied previous cover. Preserve its original jade-green, ivory and antique-gold Song-dynasty Chinese painting direction and the fictional adult Chinese hanfu woman identity, but redesign the composition for thumbnail legibility.\nPrimary request: CLOSE-UP FACE portrait dominates the RIGHT 52 percent; crop from the ornate updo to just below shoulders, face itself very large (about 65 percent of image height), almost frontal with slight elegant three-quarter angle, both cheeks and jaw clearly visible, natural skin texture and beautiful natural proportion. No fan, no hands, no full-body or waist framing. Gold/jade hairpin and small part of hanfu collar retain classical character. Background quiet dark jade and understated distant misty Chinese mountains; remove busy koi and flowers near lettering.\nDraw precise elegant luminous antique-gold contour curves along BOTH cheeks and jaw (following the skin outline, from below cheekbones toward chin) plus two short inward arrows on each side, unmistakably communicating automatic face slimming. Add a few restrained dotted jade landmark points and four fine rounded face-following corner marks. These overlays are design graphics only and must not distort the portrait. Avoid modern blue sci-fi HUD, grids covering eyes, and competitor likeness.\nLEFT 46 percent: extremely clear bold warm ivory Chinese display lettering, restrained gold border, generous spacing and high contrast. Text verbatim and only:\nTop compact brand line: \"大鱼人像美化\"\nThree equally prominent large feature lines stacked vertically:\n\"自动瘦脸\"\n\"自动跟随\"\n\"自动美颜\"\nSmall vermilion seal: \"免费开源\"\nSmall bottom line: \"Final Cut Pro · Motion\"\nNo tiny explanatory paragraphs and no extra slogans. Main three feature lines must be very large and remain distinguishable after downscaling to 192x108. Keep all key text and facial features inside 6 percent edge-safe margins. Refined classical poster with realistic close-up portrait, contemporary clear Chinese typography integrated into antique jade/gold aesthetics. Output a polished landscape 16:9 master image.\n",
"final_refinement_prompt": "Edit this exact cover, changing ONLY the oversized typography layout. Preserve the classical jade-green/gold Chinese backdrop, the SAME adult hanfu woman's close-up face, all natural facial proportions, gold jaw-slimming contour arrows and tracking marks, 16:9 canvas, portrait placement. User says the feature text is too large.\nReduce the three feature lines \"自动瘦脸\", \"自动跟随\", \"自动美颜\" to approximately 62 percent of their current font height and width. Make the type refined, medium-weight warm ivory/gold rather than massive heavy gold brush blocks. Set them as three compact clean evenly spaced lines centered within the left column, with substantial calm dark-jade negative space above, below and around. Entire feature text group should occupy roughly 26 percent of total canvas width and 35 percent of canvas height, not the current 40 percent width and 57 percent height.\nKeep the product name \"大鱼人像美化\" at the top left but reduce it slightly (about 15 percent), preserving visual hierarchy: product name slightly larger than each feature line. Small red \"免费开源\" seal and small \"Final Cut Pro · Motion\" footer remain at bottom left. Remove the horizontal rules between the three feature lines; keep only subtle fine gold divider beneath product name and near footer. No new text. No giant lettering. Quiet elegant premium classical poster with FACE as the main visual focus. Exact required text retained: 大鱼人像美化 / 自动瘦脸 / 自动跟随 / 自动美颜 / 免费开源 / Final Cut Pro · Motion.\n"
}
@@ -10,7 +10,14 @@
"status": "operator_confirmed",
"performedByScript": false,
"scopeDocument": "native-qa.json",
"heldMouseCanvasTiming": "pending user observation"
"heldMouseCanvasTiming": "User confirmed continuous visible updates while dragging on 2026-10-22 (Asia/Shanghai); host not specified, no per-event frame timing claim.",
"userConfirmation": {
"date": "2026-10-22",
"timezone": "Asia/Shanghai",
"response": "拖动中已持续更新",
"version": "1.1.2",
"build": "13"
}
},
"source": {
"commit": "a2e33e8e00a99b95dc29d67a819cb0897eda5756",
@@ -0,0 +1,16 @@
{
"remote": "https://dayu.media/git/dayu/paintfcp-fxplug.git",
"tag": "v1.1.2",
"sourceCommit": "a2e33e8e00a99b95dc29d67a819cb0897eda5756",
"passed": true,
"testsNotRepeated": "Source is byte-identical to the independently recovered and Inspector-ASan-tested signed source node.",
"tagCommit": "e9fddda5e13042f761755762fa39dfe090853c6a",
"productSourceIdenticalToSignedNode": true,
"trackedFiles": 158,
"allBytesBlobsModesMatch": true,
"gitFsck": "",
"lfs": false,
"submodules": false,
"temporaryCloneRemoved": true,
"completedAt": "2026-10-21T16:32:45.814667+00:00"
}
+10 -1
查看文件
@@ -27,7 +27,16 @@
"continuousPreview": {
"production": "Each changed continuous step finishes its FxPlug host action before mouse-up; repeated equal steps are deduplicated.",
"automated": "Three intermediate snapshots published before gesture end; production view/controller exercised under action-scoped mock.",
"nativePointerObservation": "Pending user answer: CUA coordinate drag did not reliably exercise the displayed slider; no native mid-drag frame timing claim."
"nativePointerObservation": "User confirmed on 2026-10-22 (Asia/Shanghai): 拖动中已持续更新. Native held-drag visual behavior is accepted by the user; the host was not specified and per-event frame timing was not instrumented.",
"userAcceptance": {
"date": "2026-10-22",
"timezone": "Asia/Shanghai",
"version": "1.1.2",
"build": "13",
"response": "拖动中已持续更新",
"passed": true,
"scope": "User-observed continuous preview during held slider drag in at least one native host; does not establish separate held-drag acceptance in both Motion and FCP or a frame for every mouse event."
}
},
"limits": [
"No claim that every mouse event is presented as a separate host frame. Host scheduling and render speed can coalesce rapid updates.",
@@ -0,0 +1,44 @@
{
"status": "complete",
"bundleIdentifier": "com.dayu.beatygril",
"installationPath": "/Library/Plug-Ins/FxPlug/beatygril.app",
"options": {
"waitForHosts": false,
"userTests": false
},
"nativeEffectQA": {
"status": "operator_confirmed",
"performedByScript": false
},
"source": {
"commit": "696d5f39b30404ed5d1d4c25f61d17475c7fc91b",
"trackedWorktreeChanges": []
},
"updatedAt": "2026-10-21T17:39:12.166311+00:00",
"version": "1.2.0",
"build": "14",
"stagingSignature": "Executable=/private/tmp/paintfcp-build-20261021/Build/Products/Release/beatygril.app/Contents/MacOS/beatygril\nIdentifier=com.dayu.beatygril\nFormat=app bundle with Mach-O universal (x86_64 arm64)\nCodeDirectory v=20500 size=478 flags=0x10000(runtime) hashes=4+7 location=embedded\nHash type=sha256 size=32\nCandidateCDHash sha256=c229cfbd5d26e1215ace1dd36e4442a412b52220\nCandidateCDHashFull sha256=c229cfbd5d26e1215ace1dd36e4442a412b52220f48215bd108107e1affb0b97\nHash choices=sha256\nCMSDigest=c229cfbd5d26e1215ace1dd36e4442a412b52220f48215bd108107e1affb0b97\nCMSDigestType=2\nCDHash=c229cfbd5d26e1215ace1dd36e4442a412b52220\nSignature size=8968\nAuthority=Developer ID Application: zhong luo (B3W25FX5H5)\nAuthority=Developer ID Certification Authority\nAuthority=Apple Root CA\nTimestamp=Oct 22, 2026 at 01:32:31\nInfo.plist entries=22\nTeamIdentifier=B3W25FX5H5\nRuntime Version=27.0.0\nSealed Resources version=2 rules=13 files=5\nInternal requirements count=1 size=180\nTotal signatures=1\nChosen signature=1\n",
"notarization": {
"status": "Accepted",
"id": "3999fe91-a80e-49d3-9ed0-4003b82f6f54",
"message": "Processing complete"
},
"signingVerified": true,
"stapleValidated": true,
"stagingPluginUnregistered": true,
"runningHosts": [],
"installedSignature": "Executable=/Library/Plug-Ins/FxPlug/beatygril.app/Contents/MacOS/beatygril\nIdentifier=com.dayu.beatygril\nFormat=app bundle with Mach-O universal (x86_64 arm64)\nCodeDirectory v=20500 size=478 flags=0x10000(runtime) hashes=4+7 location=embedded\nHash type=sha256 size=32\nCandidateCDHash sha256=c229cfbd5d26e1215ace1dd36e4442a412b52220\nCandidateCDHashFull sha256=c229cfbd5d26e1215ace1dd36e4442a412b52220f48215bd108107e1affb0b97\nHash choices=sha256\nCMSDigest=c229cfbd5d26e1215ace1dd36e4442a412b52220f48215bd108107e1affb0b97\nCMSDigestType=2\nCDHash=c229cfbd5d26e1215ace1dd36e4442a412b52220\nSignature size=8968\nAuthority=Developer ID Application: zhong luo (B3W25FX5H5)\nAuthority=Developer ID Certification Authority\nAuthority=Apple Root CA\nTimestamp=Oct 22, 2026 at 01:32:31\nNotarization Ticket=stapled\nInfo.plist entries=22\nTeamIdentifier=B3W25FX5H5\nRuntime Version=27.0.0\nSealed Resources version=2 rules=13 files=5\nInternal requirements count=1 size=180\nTotal signatures=1\nChosen signature=1\n",
"installedSignatureVerified": true,
"installedStapleValidated": true,
"gatekeeperAccepted": true,
"pluginDiscovery": {
"bundleIdentifier": "com.dayu.beatygril.fxplug",
"formalPath": "/Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit",
"output": " com.dayu.beatygril.fxplug(1.1)\tDECE2AF1-8D68-43B9-BE2E-6C97FB9EE96D\t2026-10-21 17:33:00 +0000\t/Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit\n (1 plug-in)\n"
},
"removedGeneratedPaths": [
"/Users/dayu/Documents/PaintFCP/build/delivery/previous-beatygril.app",
"/tmp/paintfcp-build-20261021",
"/Users/dayu/Documents/PaintFCP/build/delivery/notarization.zip"
]
}
@@ -0,0 +1,2 @@
com.dayu.beatygril.fxplug(1.1) DECE2AF1-8D68-43B9-BE2E-6C97FB9EE96D 2026-10-21 17:33:00 +0000 /Library/Plug-Ins/FxPlug/beatygril.app/Contents/PlugIns/beatygril XPC Service.pluginkit
(1 plug-in)
@@ -0,0 +1,24 @@
Executable=/Library/Plug-Ins/FxPlug/beatygril.app/Contents/MacOS/beatygril
Identifier=com.dayu.beatygril
Format=app bundle with Mach-O universal (x86_64 arm64)
CodeDirectory v=20500 size=478 flags=0x10000(runtime) hashes=4+7 location=embedded
Hash type=sha256 size=32
CandidateCDHash sha256=c229cfbd5d26e1215ace1dd36e4442a412b52220
CandidateCDHashFull sha256=c229cfbd5d26e1215ace1dd36e4442a412b52220f48215bd108107e1affb0b97
Hash choices=sha256
CMSDigest=c229cfbd5d26e1215ace1dd36e4442a412b52220f48215bd108107e1affb0b97
CMSDigestType=2
CDHash=c229cfbd5d26e1215ace1dd36e4442a412b52220
Signature size=8968
Authority=Developer ID Application: zhong luo (B3W25FX5H5)
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Timestamp=Oct 22, 2026 at 01:32:31
Notarization Ticket=stapled
Info.plist entries=22
TeamIdentifier=B3W25FX5H5
Runtime Version=27.0.0
Sealed Resources version=2 rules=13 files=5
Internal requirements count=1 size=180
Total signatures=1
Chosen signature=1
@@ -0,0 +1,14 @@
[
{
"elapsed": 13.717,
"running": true,
"processes": [
"33709 /Library/Plug-Ins/FxPlug/beatygril.app/Contents/MacOS/beatygril"
]
},
{
"elapsed": 17.944,
"running": false,
"processes": []
}
]
+16
查看文件
@@ -0,0 +1,16 @@
{
"version": "1.2.0",
"build": "14",
"source_commit": "696d5f39b30404ed5d1d4c25f61d17475c7fc91b",
"native_app_card": "Observed correct classical information card, with accessible text",
"exit_timer_seconds_after_window_shown": 3.0,
"observed_process_lifetime_seconds": 4.227,
"process_lifetime_note": "Includes process initialization before didFinishLaunching/window presentation. Not a measurement of timer drift.",
"automatic_registration": "Own bundle registered via LSRegisterURL; installed PluginKit entry remains at unique formal path",
"host_validation": {
"FCP": "Fresh launch, new locked thumbnail visible in 大鱼磨皮瘦脸; applied ours to second clip in existing QA project; panel loaded, brightness set to20%, picture rendered without black output.",
"Motion": "No fresh 1.2.0 UI test; renderer and inspector source unchanged from user-accepted 1.1.2."
},
"screenshots": "Native app and FCP screenshots kept local under ignored build/delivery; user stock imagery not published",
"bounded_duplicate_inventory": "Final cleanup removed known build and backup app paths; final inventory follows in packaging verification."
}
@@ -0,0 +1 @@
{"status":"Accepted","id":"3999fe91-a80e-49d3-9ed0-4003b82f6f54","message":"Processing complete"}
@@ -0,0 +1,6 @@
{
"name": "大鱼人像美化-1.2.0.pkg",
"id": "96a3d1be-a751-4fb8-b062-33a09c01ddf2",
"status": "Accepted",
"createdDate": "2026-10-21T17:39:18.173Z"
}
@@ -0,0 +1,36 @@
{
"package": "releases/1.2.0/大鱼人像美化-1.2.0.pkg",
"bytes": 5011005,
"sha256": "5bd77c28b3a7e54f3d4060be1f16bcb145d9bc4d6b9cfb9eb137c01130440243",
"version": "1.2.0",
"build": "14",
"app_files_compared": 34,
"app_byte_and_symlink_equality": true,
"template_files": {
"大鱼人像美化.moef": "e9fa97dc14323d0daa7d3d61b06a78ba4000a70ab9f5e67ebffd750d49df1e15",
"Drop Zone.tiff": "a7f8e3a2a431dbb3ce9e777040bb55e701cfe9ab9632e8cbb10359732bc8692e",
"large.png": "a02ddb255b1ae255c749bb837a759e2dee1c3b8ffb9bdc1167957761bd5a1b97",
"small.png": "1552b838dd88f60dee0795e20aaca652f9c558ecefc93500e895fbff77c2a4d5"
},
"locked_relative_paths": [
"大鱼人像美化/large.png",
"大鱼人像美化/small.png"
],
"script_sha256": {
"preinstall": "b0562f7705c84a2f34e31df67a4f0d429e60083bab122dad99f56a4b266c0174",
"postinstall": "eeada4e07a284726d70772591c481f6ae12bfda12ed9ae3035d1089bca0bd59b"
},
"isolated_script_tests": [
"fresh install",
"replace old locked thumbnail",
"partial copy failure restores old bytes and locks"
],
"isolation_changes": [
"Console identity/home redirected to task fixture",
"chown replaced with true",
"FxPlug verification skipped; formal app signature and discovery verified separately"
],
"real_installer_execution": false,
"app_and_template_installed": "APP installed through signed delivery workflow; user thumbnail directory updated separately, not by running this PKG",
"fonts": "No editable third-party font dependency; promotional lettering baked into PNG. No optional font ZIP needed."
}
@@ -0,0 +1,11 @@
{
"checked_commit": "906f770805fdbe8329c9d4ecd3594310e23bca6a",
"reachable_blobs_scanned": 356,
"secret_pattern_matches": [],
"disallowed_extensions": [],
"notes": [
"No original competitor app, metallib, model or user stock video is included.",
"NASA astronaut sample retains its source attribution.",
"Tool-generated promotional art is labeled as illustration."
]
}
+7
查看文件
@@ -0,0 +1,7 @@
# 1.2.0 / build 14
本次只修改外层启动器、版本和宣传资源;PGFaceProcessor、PGBeautyRenderer、PGInspectorView、PGInspectorState 与 Metal 渲染算法保持 1.1.2 用户验收版本。缩略图以用户指定的生成宣传画为来源,不冒充真实渲染静帧。
安装分类使用当前用户已移动后的 `Effects.localized/大鱼磨皮瘦脸/大鱼人像美化`。本地磁盘 moef 与源码基线 SHA-256 均为 e9fa97dc14323d0daa7d3d61b06a78ba4000a70ab9f5e67ebffd750d49df1e15,未覆盖任何最新手改。只为 large.png / small.png 设置 uchg。
待验证:正式 Release 构建、双架构、APP 签名 / 公证 / 票据 / 安装 / 插件发现、启动器三秒退出、PKG 签名公证与有效载荷 / 缩略图锁定脚本、远端发布与文章。
@@ -0,0 +1,13 @@
{
"patch": "accepted",
"id": 36,
"private": false,
"url": "https://dayu.media/git/dayu/paintfcp-fxplug",
"anonymous_access": {
"html_http": 302,
"api_http": 401,
"git_ls_remote": "credential request denied in anonymous mode",
"reason": "Site-wide WordPress Git membership gateway is evaluated before Gitea public-repository permissions.",
"server_code_changed": false
}
}
@@ -0,0 +1,26 @@
{
"installationCategory": "大鱼磨皮瘦脸",
"template": "大鱼人像美化.moef",
"files": {
"大鱼人像美化.moef": {
"size": 23073,
"sha256": "e9fa97dc14323d0daa7d3d61b06a78ba4000a70ab9f5e67ebffd750d49df1e15",
"locked": false
},
"Drop Zone.tiff": {
"size": 420128,
"sha256": "a7f8e3a2a431dbb3ce9e777040bb55e701cfe9ab9632e8cbb10359732bc8692e",
"locked": false
},
"large.png": {
"size": 454742,
"sha256": "a02ddb255b1ae255c749bb837a759e2dee1c3b8ffb9bdc1167957761bd5a1b97",
"locked": true
},
"small.png": {
"size": 45373,
"sha256": "1552b838dd88f60dee0795e20aaca652f9c558ecefc93500e895fbff77c2a4d5",
"locked": true
}
}
}
+4
查看文件
@@ -127,3 +127,7 @@ Motion:独立普通视频项目,源PTS0、1920×1080/25fps/10秒,媒体通
实际操作均在独立测试文档/时间线内:Motion最终版数值输入、重置同时更新slider/text、宿主撤销、切换输入不复活旧值、保存关闭重开(短脸0.5/下颌骨0)通过。相同几何源码在build11中已做单独短脸正负、下颌骨、停用同帧对照及侧脸/歪头图像检查;final build13继续沿用相同几何字节。FCP最终版原生面板启用、数值输入、单击重置同步显示、清零其他脸型后分别短脸1/下颌骨1的同帧画面响应通过。截图、完整AX和物理坐标差只留本机,不上传用户影像。
连续预览:生产NSSlider continuous保持开启,view不再把整个拖动包在同一次controller action里;每个有效步进独立结束宿主参数上下文。模拟宿主中三个中间状态在mouse-up前完成发布(旧实现3失败,修复后通过)。CUA坐标拖动未能可靠操纵显示中的滑杆,未记录到可信的原生按住期间排帧证据,已请求用户直接观察;此项保留待反馈,不写作原生连续预览通过。快速更新可能被宿主合并,各项其余五类近似算法和全部组合不宣称原版逐像素一致。详细范围在verification/v1.1.2/native-qa.json。
## 1.1.2 连续预览用户验收补充(2026-10-22)
用户明确回复“拖动中已持续更新”,确认最终1.1.2(13)按住滑杆拖动时画面能够持续更新,关闭上节待反馈项。此项证据来自用户原生实测;未指定具体宿主,不声称两个宿主分别完成按住拖动验收,也没有测量每个鼠标事件的独立排帧。本次仅更新验收记录,不改变产品源码、安装版或既有发布标签。
+66
查看文件
@@ -0,0 +1,66 @@
<!-- wp:paragraph -->
<p>大鱼人像美化是一款适用于 Final Cut Pro 与 Motion 的免费开源人像插件,把磨皮、美白和脸型调整放进同一块原生卡片面板。插件会识别当前画面中的人脸并自动跟随,无需先点击分析;你可以按素材需要调整强度,拖动滑杆时持续查看效果。</p>
<!-- /wp:paragraph -->
<!-- wp:image {"sizeSlug":"full"} -->
<figure class="wp-block-image size-full"><img src="{{media.cover.url}}" alt="大鱼人像美化古风宣传封面,展示自动瘦脸、自动跟随与自动美颜"/><figcaption>古风宣传插画;面部线条用于示意瘦脸与跟随功能。</figcaption></figure>
<!-- /wp:image -->
<!-- wp:heading -->
<h2 class="wp-block-heading">可以做什么</h2>
<!-- /wp:heading -->
<!-- wp:list -->
<ul class="wp-block-list"><li>磨皮:局部磨皮、全局磨皮与五官保护,强度分别控制。</li><li>美白:肤色预设、肤色亮度、皮肤色相和牙齿美白。</li><li>脸型:瘦脸、大眼、短脸、窄脸、下巴、V 脸、下颌骨、颧骨与小头调整。</li><li>自动跟随:默认跟随主要人脸,也提供多人模式、防跳脸范围与检测框预览。</li><li>实时预览:滑杆、数值、单项开关和重置集中在同一面板,便于反复对比。</li></ul>
<!-- /wp:list -->
<!-- wp:paragraph -->
<p>自动识别负责定位处理区域,效果强度由你控制。建议先从较小的数值开始;多人交叉、严重遮挡和极端侧脸的结果需要结合具体素材检查。</p>
<!-- /wp:paragraph -->
<!-- wp:heading -->
<h2 class="wp-block-heading">版本与下载</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>当前版本 <strong>1.2.0(14)</strong>,支持 macOS 13 或更高版本,包含 Apple Silicon 与 Intel 两种架构。下载包包含 FxPlug4 程序和一个配套 FCP 效果模板。APP 与 PKG 均已完成 Developer ID 正式签名、Apple 公证和票据粘附;安装包为所有用户免费资源。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>本次更新加入古风封面与锁定缩略图、免费开源说明页和主 APP 三秒自动退出。人脸处理与面板交互沿用 1.1.2 已验收实现,不需要重新运行手动分析。</p>
<!-- /wp:paragraph -->
<!-- wp:heading -->
<h2 class="wp-block-heading">安装</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>安装前先保存工作并退出 Final Cut Pro 和 Motion,安装期间保持关闭。运行本页提供的 PKG,按安装器提示完成安装;它会把程序安装到 <code>/Library/Plug-Ins/FxPlug/beatygril.app</code>,把配套效果安装到当前登录用户的 Motion Templates 目录,并自动验证和修复系统插件注册。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>本插件免费开源,<strong>无需激活码、付费注册或账号授权</strong>。主 APP 打开时显示说明图,窗口显示三秒后自动退出;宿主中的滤镜由独立服务运行。安装器还会重新锁定两张缩略图,避免被宿主自动替换。</p>
<!-- /wp:paragraph -->
<!-- wp:image {"sizeSlug":"full"} -->
<figure class="wp-block-image size-full"><img src="{{card_url}}" alt="主程序说明页:免费开源,自动注册,无需激活码,启动三秒后自动退出"/></figure>
<!-- /wp:image -->
<!-- wp:heading -->
<h2 class="wp-block-heading">使用</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>Final Cut Pro:打开<strong>效果</strong>浏览器,找到<strong>大鱼磨皮瘦脸</strong>分类,将<strong>大鱼人像美化</strong>添加到人像片段。Motion:在原生滤镜资源库的<strong>大鱼</strong>分类中选择<strong>大鱼人像美化</strong>。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>在检查器中按需调节磨皮、美白和脸型。每项左侧的眼睛可暂时停用该项,数值会保留;右侧回转箭头用于重置。人脸会随画面自动更新,开启检测框预览可以检查跟随位置。多人模式建议先用短片段观察稳定性。</p>
<!-- /wp:paragraph -->
<!-- wp:heading -->
<h2 class="wp-block-heading">常见问题</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>如果效果没有出现或显示红色警告,先退出 Final Cut Pro 和 Motion,再打开一次主 APP,等待其自动退出,然后重新启动宿主。可在“终端”执行下面这条命令:</p>
<!-- /wp:paragraph -->
<!-- wp:code -->
<pre class="wp-block-code"><code>open '/Library/Plug-Ins/FxPlug/beatygril.app'</code></pre>
<!-- /wp:code -->
<!-- wp:paragraph -->
<p>该流程可重新触发系统注册,并不能解决所有报错。仍异常时请核对 macOS、宿主版本及安装包完整性;不要只复制单个 .moef 文件,配套程序与 Drop Zone.tiff 也需要保留。当前仅提供上述一个效果模板。</p>
<!-- /wp:paragraph -->
<!-- wp:heading -->
<h2 class="wp-block-heading">源码与开源许可</h2>
<!-- /wp:heading -->
<!-- wp:paragraph -->
<p>源码仓库:<a href="https://dayu.media/git/dayu/paintfcp-fxplug" target="_blank" rel="noreferrer noopener">大鱼人像美化 · paintfcp-fxplug</a>。仓库已设为公开属性;目前大鱼站的统一 Git 网关仍要求登录并校验会员。为方便所有读者获取源码,另外提供 <a href="{{source_url}}">1.2.0 源码快照 ZIP(免费、免 Git 登录)</a>,可直接下载研究和自行编译。</p>
<!-- /wp:paragraph -->
<!-- wp:paragraph -->
<p>项目原创代码采用 MIT 许可,源码包含 Xcode 工程、Objective-C / Metal 实现、模板及构建与验证说明。Apple SDK、运行框架及样本按各自许可使用,详见源码中的 LICENSE 和 THIRD_PARTY_NOTICES.md。自行编译需要 Xcode 与 FxPlug SDK;证书和签名私钥不包含在源码中。</p>
<!-- /wp:paragraph -->
二进制文件未显示。
+66
查看文件
@@ -0,0 +1,66 @@
#!/usr/bin/env python3
"""Publish this reviewed release through the connected Dayu article publisher.
Secrets are read from macOS Keychain into memory; no auth material is persisted.
"""
from pathlib import Path
import base64,hashlib,html,json,mimetypes,ssl,subprocess,urllib.error,urllib.parse,urllib.request,uuid
ROOT=Path(__file__).resolve().parent.parent
STATE=ROOT/'build/publish-operation.json';STATE.parent.mkdir(exist_ok=True)
state=json.loads(STATE.read_text()) if STATE.exists() else {'operation':str(uuid.uuid4())}
def save():STATE.write_text(json.dumps(state,ensure_ascii=False,indent=2)+'\n')
save()
secret=subprocess.run(['security','find-generic-password','-s','dayu-article-publisher','-a','dayu','-w'],text=True,capture_output=True,check=True).stdout.strip()
auth='Basic '+base64.b64encode(('dayu:'+secret).encode()).decode()
class NoRedirect(urllib.request.HTTPRedirectHandler):
def redirect_request(self,*args,**kwargs):return None
opener=urllib.request.build_opener(NoRedirect,urllib.request.HTTPSHandler(context=ssl.create_default_context(cafile='/etc/ssl/cert.pem')))
def request(path,method='GET',body=None,headers=None):
assert path.startswith('/wp-json/') and '\n' not in path
h={'Authorization':auth,'Accept':'application/json'};h.update(headers or {})
if isinstance(body,dict):body=json.dumps(body,ensure_ascii=False).encode();h['Content-Type']='application/json'
req=urllib.request.Request('https://dayu.media'+path,data=body,headers=h,method=method)
with opener.open(req,timeout=180) as f:return json.load(f)
def upload(name,path,mime):
if name in state:return state[name]
filename=path.name
matches=request('/wp/v2/media?search='+urllib.parse.quote(path.stem)+'&per_page=30&context=edit')
for item in matches:
if urllib.parse.unquote(item.get('source_url','')).endswith('/'+filename):
# Only reuse a byte-identical previous upload.
with urllib.request.urlopen(item['source_url'],context=ssl.create_default_context(cafile='/etc/ssl/cert.pem'),timeout=90) as r:data=r.read()
if hashlib.sha256(data).digest()==hashlib.sha256(path.read_bytes()).digest():
state[name]={'id':item['id'],'url':item['source_url']};save();return state[name]
result=request('/wp/v2/media','POST',path.read_bytes(),{'Content-Type':mime,'Content-Disposition':"attachment; filename*=UTF-8''"+urllib.parse.quote(filename)})
state[name]={'id':result['id'],'url':result['source_url']};save();return state[name]
status=request('/dayu-publisher/v1/status');assert status['can_publish'] and status['can_upload'] and 'seo' in status['fields']
source=upload('source',ROOT/'build/Dayu-Portrait-1.2.0-source.zip','application/zip')
card=upload('card',ROOT/'beatygril/beatygril/Wrapper Application/Resources/LauncherInfo.png','image/png')
content=(ROOT/'releases/1.2.0/article.html').read_text().replace('{{source_url}}',html.escape(source['url'],quote=True)).replace('{{card_url}}',html.escape(card['url'],quote=True))
seo={
'title':{'enabled':True,'value':'大鱼人像美化 1.2.0|FCP / Motion 免费开源自动美颜插件'},
'description':{'enabled':True,'value':'大鱼人像美化是适用于 Final Cut Pro 和 Motion 的免费开源 FxPlug4 插件,支持磨皮、美白、自动人脸跟随及瘦脸调整。提供 Apple 签名公证 PKG 安装包和源码,安装自动注册,无需激活码,并附具体安装、使用及红色警告排查说明。'},
'keywords':{'enabled':True,'value':'大鱼人像美化,FCP美颜插件,Motion磨皮,自动瘦脸,自动跟随,FxPlug4,免费开源'}
}
payload={'title':'大鱼人像美化 1.2.0:FCP / Motion 免费开源自动美颜插件','slug':'dayu-portrait-beauty','status':'publish','content':content,'excerpt':'磨皮、美白、瘦脸与自动人脸跟随,原生卡片面板实时预览。免费开源,自动注册,无需激活码;提供签名公证安装包和源码。','categories':[3],'tags':[], 'resource':{'cao_status':True,'cao_price':0,'cao_vip_rate':1,'cao_close_novip_pay':False,'cao_expire_day':0,'cao_pwd':'','cao_info':[{'title':'版本','desc':'1.2.0(14)'},{'title':'宿主','desc':'Final Cut Pro / Motion'},{'title':'系统','desc':'macOS 13 或更高版本'},{'title':'架构','desc':'Apple Silicon / Intel'},{'title':'授权','desc':'免费开源,无需激活码'}]},'seo':seo}
(ROOT/'releases/1.2.0/article-payload.json').write_text(json.dumps(payload,ensure_ascii=False,indent=2)+'\n')
if 'post_id' not in state:
existing=request('/wp/v2/posts?slug=dayu-portrait-beauty&context=edit');assert not existing,'Matching post exists; inspect and continue its ID instead of creating a duplicate'
boundary='DayuRelease'+uuid.uuid4().hex;parts=[]
def part(name,data,filename=None,mime=None):
head='--'+boundary+'\r\nContent-Disposition: form-data; name="'+name+'"'
if filename:head+='; filename="'+filename+'"'
head+='\r\n'
if mime:head+='Content-Type: '+mime+'\r\n'
parts.append(head.encode()+b'\r\n'+data+b'\r\n')
part('payload',json.dumps(payload,ensure_ascii=False).encode())
part('package',(ROOT/'releases/1.2.0/大鱼人像美化-1.2.0.pkg').read_bytes(),'Dayu-Portrait-1.2.0.pkg','application/octet-stream')
part('cover',(ROOT/'Assets/Artwork/portrait-cover.png').read_bytes(),'Dayu-Portrait-Cover.png','image/png')
body=b''.join(parts)+('--'+boundary+'--\r\n').encode()
result=request('/dayu-publisher/v1/posts','POST',body,{'Content-Type':'multipart/form-data; boundary='+boundary,'Idempotency-Key':state['operation']})
state['response']=result;save()
# Response schema may vary; resolve the exact saved slug through standard REST.
rows=request('/wp/v2/posts?slug=dayu-portrait-beauty&context=edit');assert len(rows)==1
state['post_id']=rows[0]['id'];state['url']=rows[0]['link'];save()
saved=request('/dayu-publisher/v1/posts/'+str(state['post_id']))
(ROOT/'docs/verification/v1.2.0/published-article.json').write_text(json.dumps(saved,ensure_ascii=False,indent=2)+'\n')
print(json.dumps({'post_id':state['post_id'],'url':state['url'],'source':source,'card':card,'snapshot_saved':True},ensure_ascii=False))
+67
查看文件
@@ -0,0 +1,67 @@
#!/usr/bin/env python3
"""Verify an expanded release payload and run template-only update/rollback in isolation."""
from pathlib import Path
import hashlib,json,os,plistlib,shutil,subprocess,sys
root=Path(__file__).resolve().parent.parent
expanded=root/'build/pkg-expanded/Payload.pkg';payload=expanded/'Payload'
formal=Path('/Library/Plug-Ins/FxPlug/beatygril.app');packed=payload/'Library/Plug-Ins/FxPlug/beatygril.app'
sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest()
def files(p):
return {str(x.relative_to(p)):('symlink:'+os.readlink(x) if x.is_symlink() else sha(x)) for x in p.rglob('*') if x.is_file() or x.is_symlink()}
assert files(formal)==files(packed),'APP differs from signed installed product'
subprocess.run(['codesign','--verify','--deep','--strict',str(packed)],check=True)
subprocess.run(['xcrun','stapler','validate',str(packed)],check=True,capture_output=True)
source=root/'Templates/大鱼人像美化';template=next(payload.rglob('大鱼人像美化.moef')).parent
runtime=['大鱼人像美化.moef','Drop Zone.tiff','large.png','small.png']
assert sorted(x.name for x in template.iterdir())==sorted(runtime)
assert all(sha(source/n)==sha(template/n) for n in runtime)
post=(expanded/'Scripts/postinstall').read_text();pre=(expanded/'Scripts/preinstall').read_text()
for p in [expanded/'Scripts/postinstall',expanded/'Scripts/preinstall']:
subprocess.run(['/bin/zsh','-n',str(p)],check=True)
locks=[l for l in post.splitlines() if l.startswith('/usr/bin/chflags uchg "${FINAL_TARGET}')]
assert len(locks)==2 and any('/large.png' in l for l in locks) and any('/small.png' in l for l in locks)
assert 'Template Backups' in post and 'restore_original_locks' in post
# Keep the exact generated functions and template body. Only identity lookup,
# chown and external FxPlug registration are replaced to confine execution.
base=root/'build/pkg-isolation';base.mkdir(exist_ok=False)
volume=base/'volume';home=base/'user';home.mkdir()
start=post.index('CURRENT_ACTIVE=0')
isolated='#!/bin/zsh\nset -eu\nTARGET_VOLUME="'+str(volume)+'"\nCONSOLE_USER="'+os.getlogin()+'"\nCONSOLE_UID="'+str(os.getuid())+'"\nCONSOLE_GROUP="staff"\nUSER_HOME="'+str(home)+'"\n'+post[start:]
isolated=isolated[:isolated.index('fx_verify_app "${TARGET_VOLUME%/}/Library/Plug-Ins/FxPlug/beatygril.app"')]+'exit 0\n'
isolated=isolated.replace('/usr/sbin/chown -R','/usr/bin/true')
new_copy=next(l for l in isolated.splitlines() if l.startswith('/usr/bin/ditto "${TARGET_VOLUME%/}'))
def refill():
target=volume/template.parent.relative_to(payload)
if target.exists():
subprocess.run(['chflags','-R','nouchg',str(target)],check=True);shutil.rmtree(target)
target.parent.mkdir(parents=True,exist_ok=True);shutil.copytree(template.parent,target,symlinks=True)
def run_script(name,text,success):
p=base/name;p.write_text(text)
proc=subprocess.run(['/bin/zsh',str(p)],text=True,capture_output=True)
(base/(name+'.output')).write_text(proc.stdout+proc.stderr)
assert (proc.returncode==0)==success,(name,proc.returncode,proc.stderr)
return proc.returncode
final=home/'Movies/Motion Templates.localized/Effects.localized/大鱼磨皮瘦脸/大鱼人像美化'
refill();run_script('fresh-install.zsh',isolated,True)
assert all(sha(final/n)==sha(source/n) for n in runtime)
assert all((final/n).stat().st_flags & 2 for n in ['large.png','small.png'])
# Locked old images are overwritten, then protected again.
subprocess.run(['chflags','nouchg',str(final/'large.png')],check=True)
(final/'large.png').write_bytes(b'old locked thumbnail');subprocess.run(['chflags','uchg',str(final/'large.png')],check=True)
refill();run_script('update-locked.zsh',isolated,True)
assert all(sha(final/n)==sha(source/n) for n in runtime)
assert all((final/n).stat().st_flags & 2 for n in ['large.png','small.png'])
# Simulate a failed payload copy after corrupting one new file; the actual EXIT
# trap must restore the previous bytes and previous immutable flags.
original=files(final);refill()
failing=isolated.replace(new_copy,'/bin/echo partial > "${FINAL_TARGET}/大鱼人像美化/large.png"\n/usr/bin/false',1)
run_script('failed-copy-rollback.zsh',failing,False)
assert files(final)==original
assert all((final/n).stat().st_flags & 2 for n in ['large.png','small.png'])
backups=list((home/'Library/Application Support/PKGForge/Template Backups').rglob('.locked-paths'))
assert backups and all('/Movies/' not in str(x) for x in backups)
package=root/'releases/1.2.0/大鱼人像美化-1.2.0.pkg'
report={'package':str(package.relative_to(root)),'bytes':package.stat().st_size,'sha256':sha(package),'version':'1.2.0','build':'14','app_files_compared':len(files(formal)),'app_byte_and_symlink_equality':True,'template_files':{n:sha(template/n) for n in runtime},'locked_relative_paths':['大鱼人像美化/large.png','大鱼人像美化/small.png'],'script_sha256':{'preinstall':sha(expanded/'Scripts/preinstall'),'postinstall':sha(expanded/'Scripts/postinstall')},'isolated_script_tests':['fresh install','replace old locked thumbnail','partial copy failure restores old bytes and locks'],'isolation_changes':['Console identity/home redirected to task fixture','chown replaced with true','FxPlug verification skipped; formal app signature and discovery verified separately'],'real_installer_execution':False,'app_and_template_installed':'APP installed through signed delivery workflow; user thumbnail directory updated separately, not by running this PKG','fonts':'No editable third-party font dependency; promotional lettering baked into PNG. No optional font ZIP needed.'}
(root/'docs/verification/v1.2.0/pkg-verification.json').write_text(json.dumps(report,ensure_ascii=False,indent=2)+'\n');print(json.dumps(report,ensure_ascii=False,indent=2))
# This fixture belongs solely to this verifier; remove its locks before cleanup.
subprocess.run(['chflags','-R','nouchg',str(base)],check=True);shutil.rmtree(base)