Skip to content

Commit 08e555f

Browse files
Merge pull request #712 from SergeiNikolenko/feature/sparkle-updates
Deliver native updates and finish workspace regression fixes
2 parents 35faa39 + 9acd03f commit 08e555f

240 files changed

Lines changed: 2544 additions & 631 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.codex/skills/burette-release-readiness/SKILL.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ signing, notarization, or user-facing release docs.
2323
- updater zip
2424
- manual dmg
2525
- generated checksum files
26+
- Sparkle framework, nested signed helpers and bundled license
27+
- Native updates:
28+
- paired Sparkle public variable/private secret and embedded public key
29+
- signed final ZIP and reachable appcast matching bundle version, minimum OS,
30+
architecture and stable/beta channel
31+
- legacy ZIP/SHA-256 migration and the older Burrete compatibility bridge
32+
- explicit coverage for DMG/ZIP, Homebrew and unsupported historical versions
33+
- real download, dirty-document cancellation, install, relaunch, Quick Look
34+
and existing plugin refresh; a signed fixture is not native acceptance
35+
- feed publication/retry after a partial release failure
2636
- Signing and notarization:
2737
- Developer ID identity
2838
- Apple team credentials
@@ -40,6 +50,13 @@ signing, notarization, or user-facing release docs.
4050

4151
## Checks
4252

53+
Use this Mac for macOS builds and native acceptance: it is the only available
54+
Mac. Do not send Apple-platform builds to the Linux compute hosts. When the
55+
user requests native update verification, run its necessary local build and
56+
focused native checks without asking again because the build is large.
57+
Preserve the installed app and user documents; use an isolated development
58+
namespace except when deliberately validating canonical release bundles.
59+
4360
Prefer:
4461

4562
```bash

.codex/skills/burette-review-testing/SKILL.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,16 @@ vp test
4242

4343
For packaged desktop or Finder Quick Look changes, browser checks are not
4444
enough. Require the documented build/install/smoke flow with a unique
45-
`BURETTE_DEV_FLAVOR` unless the user explicitly scoped the task away from native
46-
verification.
45+
`BURETTE_DEV_FLAVOR` unless verifying canonical release bundles. Run macOS
46+
builds and native tests on this Mac, the only available Mac; do not route them
47+
to Linux compute hosts. An explicit request for native verification already
48+
authorizes its necessary local build and focused tests.
49+
50+
For updater work, distinguish compilation/launch, signed archive verification,
51+
real Sparkle bundle replacement, Burette's update UI/scheduling, dirty-document
52+
termination, and public release delivery. Test the intended installation route;
53+
development builds intentionally disable the in-app updater. Preserve the
54+
installed app and user documents during canonical release acceptance.
4755

4856
## Output
4957

.github/blob-size-allowlist.txt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,9 @@ plugins/burette-agent/preview-web/molstar.js
1414
plugins/burette-agent/preview-web/openchemlib/openchemlib.js
1515
plugins/burette-agent/preview-web/rdkit-conformer/Burette_rdkit_conformer.wasm
1616
plugins/burette-agent/browser-shell-dist/assets/Burette_rdkit_conformer-BA7plZBF.wasm
17-
plugins/burette-agent/browser-shell-dist/assets/RDKit_minimal-tnscgqxm.wasm
18-
plugins/burette-agent/browser-shell-dist/assets/dist-ByPD0_Hs.js
19-
plugins/burette-agent/browser-shell-dist/assets/index.modern-BmjV2ZLw.js
20-
plugins/burette-agent/browser-shell-dist/assets/index.modern-CT0VIV_p.js
2117
plugins/burette-agent/browser-shell-dist/assets/indigo-ketcher-1.43.0-uUo-NEHL.wasm
2218
plugins/burette-agent/browser-shell-dist/assets/plotly-basic.min-BGGwveDV.js
2319
plugins/burette-agent/browser-shell-dist/assets/three.module-B9xciExR.js
24-
plugins/burette-agent/browser-shell-dist/assets/index.modern-610bH81i.js
2520
plugins/burette-agent/browser-shell-dist/assets/index.modern-DN6_6mNQ.js
2621
plugins/burette-agent/browser-shell-dist/index.js
2722
tests/test-ui-shell-contract.mjs
@@ -42,7 +37,6 @@ plugins/burette-agent/browser-shell-dist/assets/resources-D5ymtJwZ.json
4237
plugins/burette-agent/browser-shell-dist/assets/pdf.worker.min-BGUT02Us.mjs
4338
plugins/burette-agent/browser-shell-dist/assets/openchemlib-BteEtxM3.js
4439
plugins/burette-agent/browser-shell-dist/assets/PptxViewJS.es-CWh08j7b.js
45-
plugins/burette-agent/browser-shell-dist/assets/markdown-greenfield-content-DzW3sAaS.js
4640
plugins/burette-agent/browser-shell-dist/assets/markdown-greenfield-document.worker-qen7HUVU.js
4741
plugins/burette-agent/browser-shell-dist/assets/chunk-KEIR6QF5-CUuuYsZ_.js
4842
plugins/burette-agent/browser-shell-dist/assets/cluster-fingerprint.worker-Q1HfNbxv.js
@@ -62,3 +56,7 @@ apps/burette-public-plugin/public/demo-library/Quantum/base-pair-dens.cube
6256
apps/burette-public-plugin/public/demo-library/Quantum/base-pair-grad.cube
6357
apps/burette-public-plugin/public/demo-library/Quantum/caffeine_dens.cube
6458
apps/burette-public-plugin/public/demo-library/Quantum/caffeine_homo.cube
59+
60+
# Regenerated bundled Markdown renderer for the Story panel.
61+
plugins/burette-agent/browser-shell-dist/assets/dist-DJBUnT_G.js
62+
plugins/burette-agent/browser-shell-dist/assets/markdown-greenfield-content-C4fTLC7O.js

.github/workflows/ci.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,13 @@ jobs:
8989
- name: Build native bundle
9090
env:
9191
BURETTE_DEV_FLAVOR: pr${{ github.event.number }}
92+
# Compile and package Sparkle without enabling updates in the dev namespace.
93+
BURETTE_SPARKLE_PUBLIC_KEY: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
9294
run: ./scripts/build.sh
9395

96+
- name: Verify Sparkle signing and feed generation
97+
run: bun tests/test-sparkle-signing.mjs
98+
9499
- name: Archive isolated app for native acceptance
95100
env:
96101
BURETTE_DEV_FLAVOR: pr${{ github.event.number }}

.github/workflows/release.yml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ on:
99
permissions:
1010
contents: write
1111

12+
concurrency:
13+
group: burette-release
14+
cancel-in-progress: false
15+
1216
jobs:
1317
release:
1418
name: Build and Publish Release
@@ -60,6 +64,16 @@ jobs:
6064
echo "::warning::HOMEBREW_TAP_TOKEN is not set; skipping the Homebrew cask update. The app release is still built and published."
6165
fi
6266
67+
- name: Validate Sparkle credentials
68+
env:
69+
BURETTE_SPARKLE_PUBLIC_KEY: ${{ vars.BURETTE_SPARKLE_PUBLIC_KEY }}
70+
BURETTE_SPARKLE_PRIVATE_KEY: ${{ secrets.BURETTE_SPARKLE_PRIVATE_KEY }}
71+
run: |
72+
if [[ -z "$BURETTE_SPARKLE_PUBLIC_KEY" || -z "$BURETTE_SPARKLE_PRIVATE_KEY" ]]; then
73+
echo '::error::Native updates require BURETTE_SPARKLE_PUBLIC_KEY (variable) and BURETTE_SPARKLE_PRIVATE_KEY (secret).'
74+
exit 1
75+
fi
76+
6377
- name: Resolve release capabilities
6478
id: capabilities
6579
env:
@@ -110,6 +124,7 @@ jobs:
110124
- name: Build app
111125
env:
112126
BURETTE_BUILD_MODE: release
127+
BURETTE_SPARKLE_PUBLIC_KEY: ${{ vars.BURETTE_SPARKLE_PUBLIC_KEY }}
113128
BURETTE_RELEASE_ALLOW_ADHOC: ${{ steps.capabilities.outputs.allow_adhoc == 'true' && '1' || '0' }}
114129
BURETTE_CODESIGN_IDENTITY: ${{ secrets.BURETTE_CODESIGN_IDENTITY }}
115130
BURETTE_DEVELOPMENT_TEAM: ${{ secrets.APPLE_TEAM_ID }}
@@ -139,6 +154,7 @@ jobs:
139154

140155
- name: Package app
141156
env:
157+
BURETTE_SPARKLE_PRIVATE_KEY: ${{ secrets.BURETTE_SPARKLE_PRIVATE_KEY }}
142158
BURETTE_UPDATE_MANIFEST_PRIVATE_KEY_PEM: ${{ secrets.BURETTE_UPDATE_MANIFEST_PRIVATE_KEY_PEM }}
143159
BURETTE_UPDATE_MANIFEST_PUBLIC_KEY_HEX: ${{ secrets.BURETTE_UPDATE_MANIFEST_PUBLIC_KEY_HEX }}
144160
run: |
@@ -152,6 +168,9 @@ jobs:
152168
if [[ -n "${BURETTE_UPDATE_MANIFEST_PRIVATE_KEY_PEM:-}" && -n "${BURETTE_UPDATE_MANIFEST_PUBLIC_KEY_HEX:-}" ]]; then
153169
bun scripts/sign-update-manifest.mjs "Burette-${{ steps.version.outputs.version }}.zip" .
154170
fi
171+
if [[ -n "${BURETTE_SPARKLE_PRIVATE_KEY:-}" ]]; then
172+
python3 scripts/sparkle-appcast.py "Burette-${{ steps.version.outputs.version }}.zip" build/Burette.app build/sparkle/release-appcast.xml
173+
fi
155174
156175
- name: Create GitHub release
157176
env:
@@ -184,6 +203,13 @@ jobs:
184203
--title "Burette ${{ steps.version.outputs.version }}" \
185204
--generate-notes
186205
206+
- name: Publish Sparkle feed
207+
if: vars.BURETTE_SPARKLE_PUBLIC_KEY != ''
208+
env:
209+
GH_TOKEN: ${{ github.token }}
210+
BURETTE_SPARKLE_PRIVATE_KEY: ${{ secrets.BURETTE_SPARKLE_PRIVATE_KEY }}
211+
run: ./scripts/publish-sparkle-feed.sh '${{ steps.version.outputs.version }}'
212+
187213
- name: Checkout Homebrew tap
188214
if: steps.version.outputs.prerelease != 'true' && steps.capabilities.outputs.homebrew == 'true'
189215
uses: actions/checkout@v7
@@ -212,6 +238,7 @@ jobs:
212238
exit 1
213239
fi
214240
ruby -0pi -e "gsub(/version \"[^\"]+\"/, \"version \\\"${version}\\\"\"); gsub(/sha256 \"[a-f0-9]{64}\"/, \"sha256 \\\"${sha256}\\\"\"); gsub(/depends_on macos: \">= :monterey\"/, \"depends_on macos: :monterey\")" "$cask"
241+
ruby -0pi -e 'sub(/^ auto_updates .*\n/, ""); sub(/^ depends_on arch: .*\n/, ""); sub(/^ depends_on macos:/, " auto_updates true\n depends_on arch: :arm64\n depends_on macos:")' "$cask"
215242
git diff -- "$cask"
216243
git diff --quiet -- "$cask" && {
217244
echo "Homebrew cask already points to ${version}."

AGENTS.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ changing.
8484
and verify the intended surface: generic build, Simulator, or real device.
8585
- For Apple-platform build/run/test work, invoke the relevant plugin first:
8686
`@build-ios-apps` for iOS and `@build-macos-apps` for macOS/Quick Look.
87+
- This is the only available Mac. Build, sign, package and verify macOS apps,
88+
Quick Look and native updates here; the remote compute hosts cannot run
89+
these Apple-platform workloads. Hosted CI remains an additional check.
90+
A requested native build or update verification authorizes its necessary
91+
local build and focused native tests; do not ask again solely for build size.
8792
- For Apple-platform UI, UX, icon, SF Symbols, SwiftUI/AppKit, or visual polish
8893
work, invoke `$apple-design`; invoke `@product-design` for product flow,
8994
prototype, or design-context work before implementation.

Burette.xcodeproj/project.pbxproj

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@
450450
GENERATE_INFOPLIST_FILE = NO;
451451
INFOPLIST_FILE = PreviewExtension/Info.plist;
452452
LD_RUNPATH_SEARCH_PATHS = ("$(inherited)", "@executable_path/../Frameworks", "@executable_path/../../../../Frameworks", );
453-
MARKETING_VERSION = 2.3.20;
453+
MARKETING_VERSION = 2.3.21;
454454
PRODUCT_BUNDLE_IDENTIFIER = com.local.BuretteV10.Preview;
455455
PRODUCT_NAME = "$(TARGET_NAME)";
456456
SKIP_INSTALL = YES;
@@ -475,7 +475,7 @@
475475
GENERATE_INFOPLIST_FILE = NO;
476476
INFOPLIST_FILE = PreviewExtension/Info.plist;
477477
LD_RUNPATH_SEARCH_PATHS = ("$(inherited)", "@executable_path/../Frameworks", "@executable_path/../../../../Frameworks", );
478-
MARKETING_VERSION = 2.3.20;
478+
MARKETING_VERSION = 2.3.21;
479479
PRODUCT_BUNDLE_IDENTIFIER = com.local.BuretteV10.Preview;
480480
PRODUCT_NAME = "$(TARGET_NAME)";
481481
SKIP_INSTALL = YES;
@@ -500,7 +500,7 @@
500500
GENERATE_INFOPLIST_FILE = NO;
501501
INFOPLIST_FILE = PreviewExtension/ThumbnailInfo.plist;
502502
LD_RUNPATH_SEARCH_PATHS = ("$(inherited)", "@executable_path/../Frameworks", "@executable_path/../../../../Frameworks", );
503-
MARKETING_VERSION = 2.3.20;
503+
MARKETING_VERSION = 2.3.21;
504504
PRODUCT_BUNDLE_IDENTIFIER = com.local.BuretteV10.Thumbnail;
505505
PRODUCT_NAME = "$(TARGET_NAME)";
506506
SKIP_INSTALL = YES;
@@ -525,7 +525,7 @@
525525
GENERATE_INFOPLIST_FILE = NO;
526526
INFOPLIST_FILE = PreviewExtension/ThumbnailInfo.plist;
527527
LD_RUNPATH_SEARCH_PATHS = ("$(inherited)", "@executable_path/../Frameworks", "@executable_path/../../../../Frameworks", );
528-
MARKETING_VERSION = 2.3.20;
528+
MARKETING_VERSION = 2.3.21;
529529
PRODUCT_BUNDLE_IDENTIFIER = com.local.BuretteV10.Thumbnail;
530530
PRODUCT_NAME = "$(TARGET_NAME)";
531531
SKIP_INSTALL = YES;
@@ -546,7 +546,7 @@
546546
GENERATE_INFOPLIST_FILE = NO;
547547
INFOPLIST_FILE = ios/BuretteMobile/Info.plist;
548548
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
549-
MARKETING_VERSION = 2.3.20;
549+
MARKETING_VERSION = 2.3.21;
550550
PRODUCT_BUNDLE_IDENTIFIER = com.local.BuretteV10.Mobile;
551551
PRODUCT_NAME = "$(TARGET_NAME)";
552552
SDKROOT = iphoneos;
@@ -569,7 +569,7 @@
569569
GENERATE_INFOPLIST_FILE = NO;
570570
INFOPLIST_FILE = ios/BuretteMobile/Info.plist;
571571
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
572-
MARKETING_VERSION = 2.3.20;
572+
MARKETING_VERSION = 2.3.21;
573573
PRODUCT_BUNDLE_IDENTIFIER = com.local.BuretteV10.Mobile;
574574
PRODUCT_NAME = "$(TARGET_NAME)";
575575
SDKROOT = iphoneos;

Cargo.lock

Lines changed: 49 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

PreviewExtension/Web/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
<script src="./molstar-preset-preview-controller.js"></script>
4343
<script src="./superposition-panel.js"></script>
4444
<script src="./molecule-preview-interactions.js"></script>
45+
<script src="./renderer-view-state.js"></script>
4546
<script src="./color-picker.js"></script>
4647
<script src="./sequence-panel.js"></script>
4748
<script src="./scene-file-actions.js"></script>

0 commit comments

Comments
 (0)