feat(premiere-plugin): ZXP + Windows installer for the Premiere panel #24

Closed
zgaetano wants to merge 0 commits from feat/premiere-installer into main
Owner

Summary

Replaces the manual robocopy / install-windows.ps1 flow with two real distributable artifacts an editor can double-click:

File Platform Install path
dragonflight-premiere-panel-<version>.zxp (35 KB) macOS + Windows Drag into Anastasiy's ZXP Installer
dragonflight-premiere-panel-<version>-windows-setup.exe (2 MB) Windows Double-click → Next → Finish

The Windows installer copies the bundle to %APPDATA%\Adobe\CEP\extensions, sets PlayerDebugMode=1 for CSXS 8 through 13, registers itself in Add/Remove Programs, and offers to remove any legacy com.wilddragon.mam.panel folder so editors don't end up with duplicate panels in Window → Extensions.

The .zxp is signed with a self-signed cert (build/cert/dragonflight-selfsigned.p12, valid until 2051). The cert + passphrase are committed so Adobe's ZXP signature-continuity rule is satisfied across builds — rotating the cert would break upgrade-in-place for every editor.

Also migrates the CEP bundle ID from com.wilddragon.mam.panelnet.wilddragon.dragonflight.panel to match the wild-dragon → dragonflight repo rename. Manifest, .debug, CSInterface.js, README, QUICK_START, PLUGIN_FILES, and the growing-files quickstart all updated.

Build

cd services/premiere-plugin/build
npm install
powershell -File build-all.ps1

Requires Node 18+ and Inno Setup 6 (winget install JRSoftware.InnoSetup). The .zxp alone can be built without Inno Setup on any OS via node build-zxp.mjs.

What's in this PR

  • build/build-all.ps1, build-zxp.mjs, installer.iss, build-installer.ps1, package.json, cert/
  • Bundle ID migration — manifest.xml + .debug + js/CSInterface.js
  • Install docs rewritten — services/premiere-plugin/README.md, QUICK_START.md, PLUGIN_FILES.txt, docs/GROWING_FILES_QUICKSTART.md
  • install-windows.ps1 removed — superseded by .exe
  • .gitignore — narrow exception added so services/premiere-plugin/build/ is tracked despite root-level build/ glob

Verified

  • npm install && powershell -File build-all.ps1 produced both artifacts cleanly on Windows 11 + Node 25 + Inno Setup 6.7.2.
  • ZXP signature verified via zxp.verify({skipChecks: true, info: true})Signature verified successfully, cert valid 2026-05-23 → 2051-05-17.
  • ZXP contents inspected: META-INF/signatures.xml, mimetype, full panel bundle, no build/ cruft leaked in.

Not verified

  • The .exe was not actually executed on this machine — it built cleanly via ISCC but no install/uninstall test ran. First editor to install it is the smoke test; uninstall reverts the file copy but intentionally leaves PlayerDebugMode alone (other CEP panels need it).

Test plan

  • Run the .exe on a Windows editor box that has the legacy com.wilddragon.mam.panel install — confirm the migration checkbox appears and removing the old folder works
  • Restart Premiere → Window → Extensions → Wild Dragon MAM loads
  • Install the .zxp via Anastasiy's on macOS, run defaults write com.adobe.CSXS.11 PlayerDebugMode 1, restart Premiere, confirm panel loads
  • Uninstall via Add/Remove Programs and confirm %APPDATA%\Adobe\CEP\extensions\net.wilddragon.dragonflight.panel\ is gone
## Summary Replaces the manual robocopy / install-windows.ps1 flow with two real distributable artifacts an editor can double-click: | File | Platform | Install path | |------|----------|--------------| | `dragonflight-premiere-panel-<version>.zxp` (35 KB) | macOS + Windows | Drag into [Anastasiy's ZXP Installer](https://install.anastasiy.com/) | | `dragonflight-premiere-panel-<version>-windows-setup.exe` (2 MB) | Windows | Double-click → Next → Finish | The Windows installer copies the bundle to `%APPDATA%\Adobe\CEP\extensions`, sets `PlayerDebugMode=1` for CSXS 8 through 13, registers itself in Add/Remove Programs, and offers to remove any legacy `com.wilddragon.mam.panel` folder so editors don't end up with duplicate panels in **Window → Extensions**. The `.zxp` is signed with a self-signed cert (`build/cert/dragonflight-selfsigned.p12`, valid until 2051). The cert + passphrase are committed so Adobe's ZXP signature-continuity rule is satisfied across builds — rotating the cert would break upgrade-in-place for every editor. Also migrates the CEP bundle ID from `com.wilddragon.mam.panel` → `net.wilddragon.dragonflight.panel` to match the wild-dragon → dragonflight repo rename. Manifest, `.debug`, `CSInterface.js`, README, QUICK_START, PLUGIN_FILES, and the growing-files quickstart all updated. ## Build ``` cd services/premiere-plugin/build npm install powershell -File build-all.ps1 ``` Requires Node 18+ and Inno Setup 6 (`winget install JRSoftware.InnoSetup`). The `.zxp` alone can be built without Inno Setup on any OS via `node build-zxp.mjs`. ## What's in this PR - **build/** — `build-all.ps1`, `build-zxp.mjs`, `installer.iss`, `build-installer.ps1`, `package.json`, `cert/` - **Bundle ID migration** — manifest.xml + .debug + js/CSInterface.js - **Install docs rewritten** — services/premiere-plugin/README.md, QUICK_START.md, PLUGIN_FILES.txt, docs/GROWING_FILES_QUICKSTART.md - **install-windows.ps1 removed** — superseded by `.exe` - **.gitignore** — narrow exception added so `services/premiere-plugin/build/` is tracked despite root-level `build/` glob ## Verified - `npm install && powershell -File build-all.ps1` produced both artifacts cleanly on Windows 11 + Node 25 + Inno Setup 6.7.2. - ZXP signature verified via `zxp.verify({skipChecks: true, info: true})` — `Signature verified successfully`, cert valid 2026-05-23 → 2051-05-17. - ZXP contents inspected: `META-INF/signatures.xml`, `mimetype`, full panel bundle, no `build/` cruft leaked in. ## Not verified - The `.exe` was not actually executed on this machine — it built cleanly via ISCC but no install/uninstall test ran. First editor to install it is the smoke test; uninstall reverts the file copy but intentionally leaves `PlayerDebugMode` alone (other CEP panels need it). ## Test plan - [ ] Run the `.exe` on a Windows editor box that has the legacy `com.wilddragon.mam.panel` install — confirm the migration checkbox appears and removing the old folder works - [ ] Restart Premiere → Window → Extensions → **Wild Dragon MAM** loads - [ ] Install the `.zxp` via Anastasiy's on macOS, run `defaults write com.adobe.CSXS.11 PlayerDebugMode 1`, restart Premiere, confirm panel loads - [ ] Uninstall via Add/Remove Programs and confirm `%APPDATA%\Adobe\CEP\extensions\net.wilddragon.dragonflight.panel\` is gone
zgaetano added 4 commits 2026-05-23 16:23:24 -04:00
Replaces the manual robocopy / install-windows.ps1 flow with two real
distributable artifacts:

  - dragonflight-premiere-panel-<version>.zxp          (Mac + Win)
  - dragonflight-premiere-panel-<version>-windows-setup.exe (Win)

The Windows installer copies the bundle to %APPDATA%\Adobe\CEP\extensions,
sets PlayerDebugMode=1 for CSXS 8..13, registers an uninstaller, and
offers to remove any legacy com.wilddragon.mam.panel folder so editors
don't end up with duplicate panels.

The .zxp is signed with a self-signed cert generated on first build and
committed to build/cert/ so signature continuity is preserved across
builds (Adobe rejects ZXP upgrades with a different cert fingerprint).

Also migrates the CEP bundle ID from com.wilddragon.mam.panel to
net.wilddragon.dragonflight.panel to match the wild-dragon -> dragonflight
repo rename. Manifest, .debug, CSInterface.js, install docs, and the
growing-files quickstart all updated.

build/ is normally swept by the root .gitignore; added an explicit
negation so the packaging pipeline stays tracked.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The initial pass referenced zxp-sign-cmd@0.2.2 which never shipped (latest
is 2.0.0) and used the v1.x callback API. v2 is promise-based — rewrote
build-zxp.mjs accordingly.

Also commits the freshly-generated self-signed cert + passphrase from the
first local build run. From now on every build reuses these so Adobe's
ZXP signature-continuity rule is satisfied across versions.

Verified end-to-end: `npm install && node build-zxp.mjs` produces
dist/dragonflight-premiere-panel-1.0.0.zxp (34.7 KB), signature verifies,
cert valid until 2051.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The Premiere-running check passed a Boolean to Exec's var ResultCode (Integer)
parameter — Pascal type error. The block also did nothing useful: it only
checked but never warned or prompted. Drop it. {InstallDelete] of the legacy
folder still works through the Tasks checkbox + Check function.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
End-to-end verification on a fresh Windows machine surfaced three issues:

1. pwsh isn't installed by default — Windows ships powershell.exe (5.1).
   Switched all script invocations + docs from `pwsh` to `powershell`.
2. .NET's strict XML parser rejects manifest.xml because the <Resources>
   comment legally contains `--` (inside `--enable-nodejs`/`--mixed-context`
   CEF flag names). Switched build-installer.ps1 to regex extraction,
   matching what build-zxp.mjs already does.
3. winget installs Inno Setup 6 to %LOCALAPPDATA%\Programs by default, not
   Program Files (x86). Added the user-scope path to the ISCC.exe fallback
   list.

Verified: `powershell -File build-all.ps1` produces both artifacts —
dragonflight-premiere-panel-1.0.0.zxp (35 KB, signature valid)
dragonflight-premiere-panel-1.0.0-windows-setup.exe (2 MB).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
zgaetano added 1 commit 2026-05-23 16:30:46 -04:00
Drops dragonflight-premiere-panel-1.0.0-windows-setup.exe (2 MB) and
dragonflight-premiere-panel-1.0.0.zxp (35 KB) at
services/premiere-plugin/build/releases/v1.0.0/ so the binaries have
stable URLs on the forge without needing a separate release artifact
flow.

Heads-up: this commits 2 MB of binary into git history. Future bumps
should use Forgejo Releases (release assets are external to git history
and easy to delete) rather than another commit under releases/.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
zgaetano added 1 commit 2026-05-23 19:24:31 -04:00
End-to-end debugging against a live Premiere Pro 2025 + auth-enabled mam-api
surfaced four real bugs that made v1.0.0 install cleanly but never load,
plus the missing auth flow. All four are fixed and the panel is verified
connected (status dot green, Reconnect button shown, project list populated).

  - manifest.xml: a comment in the <Resources> block contained "--" (inside
    "--enable-nodejs"/"--mixed-context"), which is illegal per the XML spec.
    CEP 12's strict parser logged
        ERROR XPATH Double hyphen within comment
    and skipped the panel entirely. Comment rewritten without double hyphens.

  - manifest.xml: lacked the Version="X.Y" attribute on <ExtensionManifest>
    and used a non-standard AbstractionLayers/empty <ExtensionList/>
    structure. CEP rejected it with
        Unsupported Manifest version ''
    Manifest rewritten to the standard CSXS 7.0 schema (ExtensionList +
    DispatchInfoList + RequiredRuntimeList), matching the working AMPP
    panel template.

  - main.js: re-declared `const csInterface = new CSInterface()` at top
    level even though CSInterface.js already declared the same binding.
    CEP 12 shares script-realm lexical scope across <script> tags, so the
    second const threw
        Identifier 'csInterface' has already been declared
    The throw fired before setupEventListeners(), so the Connect button's
    click handler was never attached. This is the root cause of the
    original "clicking Connect does nothing" symptom; everything else was
    secondary. Removed the duplicate declaration; main.js now uses the
    binding from CSInterface.js.

  - No auth support against AUTH_ENABLED=true servers. mam-api supports
    Bearer tokens (POST /api/v1/tokens), so added:
      • API token input field (password-masked) next to Server URL
      • localStorage persistence on every keystroke
      • window.fetch monkey-patch that injects
          Authorization: Bearer <token>
        on every request whose URL starts with the configured server.
        Signed S3 download URLs are NOT touched.

Drive-by fixes that came out of the same debugging pass:
  - Server URL input listener was 'change' (fires on blur); switched to
    'input' so typing-then-clicking-Connect immediately commits.
  - restoreSettings() now strips trailing slashes from the stored URL so
    older saved values like 'http://host/' stop producing //api/v1 404s.
  - CSS selector `input[type="text"].server-url` didn't match the new
    password input → the token field was unstyled and effectively invisible.
    Generalized to `input.server-url`; restructured the connection bar into
    `.connection-controls--stacked` (flex column) of two `.server-input-row`
    rows so two input fields fit cleanly.
  - Build scripts now parse ExtensionBundleVersion from both element form
    (<ExtensionBundleVersion>X</...>) and attribute form
    (ExtensionBundleVersion="X"), since the manifest rewrite switched
    schemas.

Version bumped 1.0.0 → 1.0.1. New artifacts committed at
services/premiere-plugin/build/releases/v1.0.1/ (.exe 2 MB, .zxp 35 KB).
v1.0.0 left in place so editors who downloaded it can verify they're on
the broken version.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
zgaetano closed this pull request 2026-05-24 13:20:13 -04:00

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: WildDragonLLC/dragonflight#24
No description provided.