diff --git a/Resources/Info.plist b/Resources/Info.plist index 58ae526..e4f580d 100644 --- a/Resources/Info.plist +++ b/Resources/Info.plist @@ -19,9 +19,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.8.3 + 0.8.4 CFBundleVersion - 11 + 12 GlossSafariExtensionAvailable CFBundleDocumentTypes diff --git a/docs/release-notes/v0.8.4.md b/docs/release-notes/v0.8.4.md new file mode 100644 index 0000000..82d9db7 --- /dev/null +++ b/docs/release-notes/v0.8.4.md @@ -0,0 +1,83 @@ +# Gloss 0.8.4 + +Gloss 0.8.4 focuses the product on browser and PDF translation, makes the same +scenario model available to automation, and closes the Homebrew update loop. +It is the first public build after 0.8.2 and carries the complete 0.8.3 release +candidate forward. + +## Capability and scenario model + +- Composes user-facing workflows from a shared capability registry instead of + starting every implemented feature. +- Enables Chrome browser translation and PDF translation by default; an + Apple-signed build also enables Safari. +- Keeps clipboard, screenshot/OCR, system selection, glossary, and history + implementations available in source without exposing their UI or starting + their listeners. +- Uses the same registry for App lifecycle decisions, menus, settings, external + PDF-open requests, and CLI dispatch. +- Reads a signed-build capability flag so Homebrew's ad-hoc package does not + expose an unusable Safari settings entry or claim Safari in CLI output. +- Omits the Safari App Extension from ad-hoc/Homebrew artifacts so PlugInKit + cannot register an unusable system extension. +- Removes dormant text and image Services from the focused App bundle while + retaining their implementation in source. + +## CLI automation + +- Adds `gloss-cli capabilities --json` for stable, machine-readable capability, + scenario, dependency, and command mappings. +- Adds `gloss-cli browser` with webpage translation semantics. +- Adds an explicit `gloss-cli text` mapping for the reusable translation core; + the original flat invocation remains an alias. +- Adds `gloss-cli pdf INPUT... --output DIR` for sequential PDF batches that + reuse one isolated BabelDOC session without taking over the App service. +- Keeps the existing flat text command for compatibility while requiring the + shared text-translation capability. + +## PDF reliability + +- Requires the signed BabelDOC `0.6.4+gloss.5` runtime, which includes the + `o200k_base` tokenizer needed by current translation models. +- Installs a compatible available runtime after the launch-time check instead + of continuing with an incompatible cached version. +- Extends the bounded cold-start window to 180 seconds for a first DocLayout + initialization. + +## Homebrew updates + +- Checks the signed public release manifest silently after launch and at most + once every 24 hours, with manual check and update controls in the App. +- Offers in-App installation only when the running bundle is verified as the + official `sunchj/tap/gloss` Homebrew cask. +- Runs fixed Homebrew commands from a staged helper after Gloss exits, without + a shell or `sudo`, then verifies the version, architecture, ad-hoc signature, + and quarantine state before reopening the App. +- Binds the exact Homebrew Cask bytes and current-architecture App asset to the + signed manifest, waits for a helper readiness acknowledgement, and restores a + verified previous App if an upgrade damages the installed bundle. +- Defers installation while a browser or PDF translation task is active and + surfaces failure results after restart. + +## Release integrity + +- Signs the App update manifest with Ed25519 and publishes its detached + signature with both architecture-specific release archives. +- Packages and signs the CLI, bundled Codex runtime, and update helper as + explicit Homebrew cask components. +- Links the bundled `gloss-cli` into Homebrew's `bin` directory and validates + its capability report in both architecture install smokes. + +## Validation + +- The complete test suite passes: 290 tests, 5 conditionally skipped, and no + failures. +- All three products (`Gloss`, `gloss-cli`, and `gloss-update-helper`) build. +- A real CLI translation of the 15-page *Attention Is All You Need* PDF + completed in 31.56 seconds and produced a 15-page, 2.3 MB PDF with selectable + Chinese text using BabelDOC `0.6.4+gloss.5`. + +## Compatibility + +Gloss 0.8.4 requires macOS 14 or newer. Existing Homebrew installations can +upgrade through the App or with `brew upgrade --cask sunchj/tap/gloss`. diff --git a/docs/runtime-distribution.md b/docs/runtime-distribution.md index e0301af..962d260 100644 --- a/docs/runtime-distribution.md +++ b/docs/runtime-distribution.md @@ -86,8 +86,8 @@ active runtime。 `.github/workflows/release.yml` 在 `v*` tag 上: 1. 分别在 `macos-15` arm64 和 `macos-15-intel` x86_64 runner 构建 `Gloss.app`,并显式使用 - `GLOSS_SIGN_IDENTITY=-` 对 App、helper 与嵌套 extension 做 ad-hoc codesign;不导入 Apple - 证书,也不执行 notarization 或 stapling。 + `GLOSS_SIGN_IDENTITY=-` 对 App 与 helper 做 ad-hoc codesign;Homebrew 产物不包含需要 Apple + 身份配对的 Safari extension,也不执行 notarization 或 stapling。 2. 生成 `Gloss-macos-arm64.zip`、`Gloss-macos-x86_64.zip`、`SHA256SUMS` 和包含两个 architecture asset 的 `gloss-release-manifest.json`。 3. 生成并校验使用 `on_arm` / `on_intel` URL 与 SHA-256 的根级 Release asset @@ -101,17 +101,19 @@ active runtime。 6. Release 上传成功后,dispatch `SunChJ/homebrew-tap` 的 `update-cask.yml`,由公开 tap 下载并二次校验 Release,再更新 `Casks/gloss.rb`。 -完整 App 会同时检出并构建私有浏览器扩展仓库。Release workflow 使用两个职责分离的凭据: +完整 App 会同时检出并构建私有浏览器扩展仓库。Release workflow 使用三个职责分离的凭据: | Secret | 用途 | | --- | --- | | `GLOSS_EXTENSION_SSH_KEY` | 只读检出私有 `SunChJ/personal-immersive-translator` | +| `GLOSS_APP_UPDATE_MANIFEST_SIGNING_KEY` | 使用 Ed25519 对 App 更新 manifest 签名 | | `GLOSS_DISTRIBUTION_TOKEN` | 向公开 binary repo 上传 Release,并 dispatch 公开 tap workflow | -workflow 的第一个 job 始终检查 `GLOSS_EXTENSION_SSH_KEY`;tag 事件以及显式开启 -`publish_release` 的手工恢复任务还会检查 `GLOSS_DISTRIBUTION_TOKEN`。缺失即 fail closed, -不会开始正式构建。手工 `workflow_dispatch` 默认不走 public publication 路径,因此不需要 -distribution token,但仍需只读 extension deploy key 才能构建完整 App。 +workflow 的第一个 job 始终检查 `GLOSS_EXTENSION_SSH_KEY` 和 +`GLOSS_APP_UPDATE_MANIFEST_SIGNING_KEY`;tag 事件以及显式开启 `publish_release` 的手工恢复任务 +还会检查 `GLOSS_DISTRIBUTION_TOKEN`。缺失即 fail closed,不会开始正式构建。手工 +`workflow_dispatch` 默认不走 public publication 路径,因此不需要 distribution token,但仍需 +只读 extension deploy key 与 manifest signing key 才能构建完整 App。 ### 公开仓库与凭据初始化 @@ -196,7 +198,8 @@ brew upgrade --cask sunchj/tap/gloss 1. 先发布兼容的 `SunChJ/BabelDOC` signed runtime,并确认 stable manifest 可下载。 2. 合并 Gloss 的发行提交,确认 `Resources/Info.plist` 版本与准备创建的 `v*` tag 完全一致。 3. 确认两个公开仓库、`update-cask.yml`、`GLOSS_EXTENSION_SSH_KEY`、 - `GLOSS_DISTRIBUTION_TOKEN` 和 tap 的 Actions/branch protection 设置均已就绪。 + `GLOSS_APP_UPDATE_MANIFEST_SIGNING_KEY`、`GLOSS_DISTRIBUTION_TOKEN` 和 tap 的 + Actions/branch protection 设置均已就绪。 4. 在私有 Gloss 仓库的目标 commit 上创建并推送 tag,例如 `v0.8.0`。 5. 等待 Gloss Release workflow 完成 ad-hoc 签名;workflow 会先创建 draft Release,上传全部 资产后再发布,最后 dispatch tap 更新。