premiere-pro-mcp 1.14.4 → 1.14.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +73 -29
  3. package/artifacts/MCPBridgeCEP.zxp +0 -0
  4. package/cep-plugin/CSXS/manifest.xml +3 -3
  5. package/cep-plugin/index.html +1 -1
  6. package/cep-plugin/main.js +19 -7
  7. package/cep-plugin/updater.cjs +1 -1
  8. package/dist/ai/editorial-context-pack.d.ts +53 -0
  9. package/dist/ai/editorial-context-pack.js +133 -0
  10. package/dist/bridge/file-bridge.d.ts +2 -0
  11. package/dist/bridge/file-bridge.js +24 -2
  12. package/dist/bridge/script-builder.js +21 -0
  13. package/dist/context/project-context-store.d.ts +2 -0
  14. package/dist/context/project-context-store.js +21 -2
  15. package/dist/diagnostics.js +1 -1
  16. package/dist/index.js +95 -2
  17. package/dist/platform-capabilities.d.ts +3 -3
  18. package/dist/platform-capabilities.js +7 -0
  19. package/dist/resources/adobe-api-inventory.json +5096 -0
  20. package/dist/resources/adobe-uxp-coverage.json +226 -0
  21. package/dist/resources/cep-reference-inventory.json +25357 -0
  22. package/dist/resources/extendscript-api-inventory.json +2341 -0
  23. package/dist/resources/extendscript-reference.js +3 -4
  24. package/dist/resources/premiere-doc-inventory.json +2243 -0
  25. package/dist/resources/premiere-surface-registry.json +160 -0
  26. package/dist/resources/uxp-js-api-inventory.json +17053 -0
  27. package/dist/security/capabilities.js +15 -0
  28. package/dist/server.d.ts +3 -0
  29. package/dist/server.js +23 -7
  30. package/dist/tool-capability-report.d.ts +2 -2
  31. package/dist/tool-capability-report.js +22 -9
  32. package/dist/tools/audio.d.ts +50 -0
  33. package/dist/tools/audio.js +138 -0
  34. package/dist/tools/clipboard.d.ts +14 -4
  35. package/dist/tools/clipboard.js +15 -25
  36. package/dist/tools/editorial-context-pack.d.ts +91 -0
  37. package/dist/tools/editorial-context-pack.js +129 -0
  38. package/dist/tools/effects.d.ts +16 -0
  39. package/dist/tools/effects.js +85 -0
  40. package/dist/tools/export.d.ts +156 -0
  41. package/dist/tools/export.js +295 -17
  42. package/dist/tools/health.d.ts +3 -3
  43. package/dist/tools/media-analysis.d.ts +231 -0
  44. package/dist/tools/media-analysis.js +200 -3
  45. package/dist/tools/project-context.d.ts +2 -0
  46. package/dist/tools/project-context.js +6 -2
  47. package/dist/tools/project.js +24 -8
  48. package/dist/tools/recovery.js +1 -0
  49. package/dist/tools/sequence.js +13 -1
  50. package/dist/tools/silence-removal.d.ts +24 -0
  51. package/dist/tools/silence-removal.js +66 -0
  52. package/dist/tools/spot-workflows.js +40 -10
  53. package/dist/tools/timeline.js +6 -2
  54. package/dist/tools/transitions.js +122 -29
  55. package/dist/tools/utility.js +65 -14
  56. package/dist/tools/uxp-advanced-workflows.d.ts +238 -0
  57. package/dist/tools/uxp-advanced-workflows.js +168 -5
  58. package/dist/tools/uxp-next-workflows.d.ts +5 -0
  59. package/dist/tools/uxp-next-workflows.js +3 -1
  60. package/dist/tools/uxp-workflows.d.ts +14 -0
  61. package/dist/tools/uxp-workflows.js +5 -0
  62. package/dist/tools/uxp.d.ts +602 -0
  63. package/dist/tools/uxp.js +169 -6
  64. package/dist/update.d.ts +6 -0
  65. package/dist/update.js +85 -0
  66. package/dist/workflows/catalog.d.ts +8 -3
  67. package/dist/workflows/catalog.js +7 -1
  68. package/dist/workflows/tool-metadata.js +2 -0
  69. package/dist/workflows/tool-packs.js +2 -0
  70. package/docs/adobe-api-inventory.md +26 -0
  71. package/docs/cep-reference-inventory.md +11 -0
  72. package/docs/extendscript-api-inventory.md +7 -0
  73. package/docs/native-sdk-header-inventory.md +65 -0
  74. package/docs/premiere-doc-inventory.md +7 -0
  75. package/docs/premiere-surface-registry.md +39 -0
  76. package/docs/supported-actions.md +32 -15
  77. package/docs/uxp-js-api-inventory.md +9 -0
  78. package/package.json +33 -4
  79. package/scripts/copy-adobe-uxp-coverage.mjs +16 -4
  80. package/scripts/generate-adobe-api-inventory.mjs +174 -0
  81. package/scripts/generate-cep-reference-inventory.mjs +113 -0
  82. package/scripts/generate-extendscript-api-inventory.mjs +102 -0
  83. package/scripts/generate-native-sdk-header-inventory.mjs +214 -0
  84. package/scripts/generate-premiere-doc-inventory.mjs +93 -0
  85. package/scripts/generate-supported-actions.mjs +6 -16
  86. package/scripts/generate-uxp-js-api-inventory.mjs +168 -0
  87. package/scripts/native-sdk-header-inventory-contract.mjs +31 -0
  88. package/scripts/update-source.mjs +106 -0
  89. package/scripts/verify-native-sdk-header-inventory.mjs +149 -0
  90. package/scripts/verify-npm-package.mjs +27 -0
  91. package/uxp-plugin/advanced-workflows.cjs +369 -31
  92. package/uxp-plugin/commands.cjs +425 -41
  93. package/uxp-plugin/manifest.json +1 -1
  94. package/uxp-plugin/next-workflows.cjs +46 -3
  95. package/uxp-plugin/workflows.cjs +71 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,43 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [1.14.6] - 2026-09-02
10
+
11
+ ### Added
12
+
13
+ - Added `create_editorial_context_pack`, a review-only, revision-aware Markdown
14
+ reading view for explicitly captured transcript, shot, audio, source,
15
+ timeline, and editor-note context. It is bounded by entry and character
16
+ limits and never invokes a provider, Premiere bridge, or project mutation.
17
+ - Added guarded UXP workflows for sequence playhead and range updates, marker
18
+ batch removal, native transition application, caption-track inventory,
19
+ silence-cut stringouts, atomic split edits, and beat-grid markers.
20
+ - Added local-only delivery conformance, sampled video scopes and motion
21
+ analysis, Warp Stabilizer status inspection, and shot-match planning.
22
+ - Added source-backed inventories for documented UXP, CEP, ExtendScript, and
23
+ native SDK integration surfaces.
24
+
25
+ ### Fixed
26
+
27
+ - Made unsupported sequence pixel-aspect ratios, partial transitions,
28
+ unavailable media timing readback, and incomplete delivery probes fail
29
+ closed instead of reporting unverified success.
30
+ - Corrected marker, encoder, duplicate-media, caption, and capability
31
+ inference contracts, with expanded mutation verification coverage.
32
+
33
+ ## [1.14.5] - 2026-08-31
34
+
35
+ ### Added
36
+
37
+ - Added safe user update commands for global npm installations and guarded
38
+ source check/update scripts. Global updates refresh the CEP connector after
39
+ npm succeeds; source updates require a clean fast-forwardable checkout.
40
+
41
+ ### Fixed
42
+
43
+ - Corrected macOS bridge-directory handling when `TMPDIR` is set and made QE
44
+ transition writes target the intended clip on current Premiere builds.
45
+
9
46
  ## [1.14.4] - 2026-08-29
10
47
 
11
48
  ### Fixed
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  **Give compatible AI assistants structured control over supported Adobe Premiere Pro workflows.**
10
10
 
11
- 321 core tools across 37 modules, 14 resources, and 11 guided workflows. A connected UXP host adds 54 capability-gated tools.
11
+ 327 core tools across 37 modules, 4 resources, and 11 guided workflows. A connected UXP host adds 61 capability-gated tools.
12
12
 
13
13
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
14
14
  [![Node.js](https://img.shields.io/badge/Node.js-20.19%2B-green.svg)](https://nodejs.org)
@@ -31,22 +31,22 @@ An [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server that l
31
31
  "Add the B-roll clips to V2, apply a cross dissolve between each, color correct them to match the A-roll, and export a 1080p ProRes."
32
32
  ```
33
33
 
34
- The AI handles the entire workflow through 321 core tools spanning the supported ExtendScript, QE DOM, local media and interchange analysis, revisioned project-context retrieval, safe edit-planning, project-intake preview, review handoff, and connection-verification surfaces. A compatible, authenticated UXP panel adds 54 documented, capability-gated tools without replacing the production CEP bridge.
34
+ The AI handles the entire workflow through 327 core tools spanning the supported ExtendScript, QE DOM, local media and interchange analysis, revisioned project-context retrieval, safe edit-planning, project-intake preview, review handoff, and connection-verification surfaces. A compatible, authenticated UXP panel adds 56 documented, capability-gated tools without replacing the production CEP bridge.
35
35
 
36
- ### Latest release: 1.14.4
36
+ ### Latest release: 1.14.6
37
37
 
38
- - **Verified editing semantics:** QE razor operations use sequence timecode and
39
- batch effect application preflights every target before reporting a verified
40
- component readback.
41
- - **Honest playback state:** legacy playback tools report an accepted request,
42
- not movement or stoppage, until a separate position readback confirms it.
43
- - **Fail-closed catalogs:** empty QE audio-transition catalogs are errors, and
44
- effect fallback results are explicitly bounded and partial.
38
+ - **Guarded UXP editing:** compatible hosts can use verified sequence ranges,
39
+ playhead, marker, transition, caption, silence-cut, and split-edit workflows.
40
+ - **Review-first evidence:** local delivery checks, sampled media analysis, and
41
+ editorial context packs remain bounded and avoid unapproved provider writes.
42
+ - **Narrowed host behavior:** unsupported sequence pixel-aspect ratios and
43
+ partial UXP transition writes fail closed; other mutations retain their
44
+ documented verified or explicitly `committed_unverified` outcome.
45
45
  - **Explicit boundary:** the hosted endpoint remains an operator-managed MCP
46
46
  service; unauthenticated callers are rejected and it does not pair users to
47
47
  local Premiere processes.
48
48
 
49
- See the [v1.14.4 release notes](https://github.com/leancoderkavy/premiere-pro-mcp/releases/tag/v1.14.4)
49
+ See the [v1.14.6 release notes](https://github.com/leancoderkavy/premiere-pro-mcp/releases/tag/v1.14.6)
50
50
  for complete details. Live installation in Premiere Pro still requires host verification.
51
51
 
52
52
  ### Current MCP protocol support
@@ -88,9 +88,9 @@ their bins, media rules, and organization rules before a facility uses one.
88
88
 
89
89
  ### Easiest supported path: Claude Desktop
90
90
 
91
- 1. Download the current [Claude Desktop bundle (`.mcpb`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.14.4/premiere-pro-mcp-1.14.4.mcpb).
91
+ 1. Download the current [Claude Desktop bundle (`.mcpb`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.14.6/premiere-pro-mcp-1.14.6.mcpb).
92
92
  2. In Claude Desktop, open **Settings > Extensions > Advanced settings > Install Extension**, select the downloaded bundle, and restart Claude Desktop.
93
- 3. Download the separate [signed Premiere connector (`.zxp`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.14.4/MCPBridgeCEP.zxp). Open it with your trusted ZXP installer. If your computer has no ZXP installer, use the npm connector installer in **Advanced setup** below.
93
+ 3. Download the separate [signed Premiere connector (`.zxp`)](https://github.com/leancoderkavy/premiere-pro-mcp/releases/download/v1.14.6/MCPBridgeCEP.zxp). Open it with your trusted ZXP installer. If your computer has no ZXP installer, use the npm connector installer in **Advanced setup** below.
94
94
  4. Restart Premiere, open a project, then open **Window > Extensions > MCP for Adobe Premiere Pro**.
95
95
  5. In Claude, enter: `Safely check my Premiere connection with verify_premiere_connection. Make no changes.`
96
96
 
@@ -165,6 +165,38 @@ premiere-pro-mcp --doctor
165
165
 
166
166
  Then ask your MCP client to run `verify_premiere_connection`. The check is read-only.
167
167
 
168
+ #### Update an existing installation
169
+
170
+ New **releases** update the local server and Premiere connector; a deployment of
171
+ the hosted MCP service does not replace software on your computer. Fully quit
172
+ Premiere before updating the connector.
173
+
174
+ **Installed globally from npm:**
175
+
176
+ ```bash
177
+ premiere-pro-mcp --check-update
178
+ premiere-pro-mcp --update
179
+ ```
180
+
181
+ `--update` only changes a global npm installation. It installs the published
182
+ `latest` package, refreshes the bundled CEP connector, and leaves your MCP
183
+ client configuration and projects untouched. Restart Premiere and your MCP
184
+ client afterward, then run `verify_premiere_connection` before editing.
185
+
186
+ **Installed from a Git clone:**
187
+
188
+ ```bash
189
+ npm run check-update:source
190
+ npm run update:source
191
+ ```
192
+
193
+ The source updater refuses a checkout with uncommitted files or local commits,
194
+ fast-forwards only to its configured upstream, runs `npm ci` and the production
195
+ build, then refreshes the CEP connector. This avoids silently overwriting local
196
+ code. If you installed the Claude Desktop `.mcpb` bundle, download and install
197
+ the newer bundle from the GitHub release instead; Claude controls extension
198
+ updates.
199
+
168
200
  #### Remove the CEP connector
169
201
 
170
202
  Fully quit Premiere, then remove only this connector:
@@ -325,7 +357,7 @@ Add to your VS Code MCP server configuration:
325
357
  4. Ask your AI assistant to run `get_capabilities`, then `ping`, with Premiere open.
326
358
  5. For a safe first request, ask: *"What is my current Premiere Pro project and active sequence? Do not make changes."*
327
359
 
328
- The default bridge directory is derived from the operating system on both sides, so most local setups should not set `PREMIERE_TEMP_DIR`. If you override it, use the same absolute path in the MCP server and CEP panel; Windows and macOS paths are not interchangeable.
360
+ The default bridge directory is derived from the operating system on both sides, so most local setups should not set `PREMIERE_TEMP_DIR`. On macOS, the server resolves the per-user system temporary directory even when a GUI-launched client strips `TMPDIR`, keeping it aligned with Premiere's CEP panel. If you override it, use the same absolute path in the MCP server and CEP panel; Windows and macOS paths are not interchangeable.
329
361
 
330
362
  ### Codex plugin
331
363
 
@@ -337,11 +369,11 @@ From a clone of this repository:
337
369
  ```bash
338
370
  codex plugin marketplace add .
339
371
  codex plugin add premiere-pro@premiere-pro-mcp
340
- npx -y premiere-pro-mcp@1.14.4 --install-cep
372
+ npx -y premiere-pro-mcp@1.14.6 --install-cep
341
373
  ```
342
374
 
343
375
  Restart Premiere Pro and start a new Codex session after installation. The plugin
344
- launches `premiere-pro-mcp@1.14.4` through `npx`; the separate CEP installation is
376
+ launches `premiere-pro-mcp@1.14.6` through `npx`; the separate CEP installation is
345
377
  required because the MCP server communicates with the running Premiere host through
346
378
  the local bridge.
347
379
 
@@ -361,7 +393,7 @@ For Claude Code, add this repository as a marketplace and install the plugin:
361
393
  Then install the Premiere bridge and start a new Claude Code session:
362
394
 
363
395
  ```bash
364
- npx -y premiere-pro-mcp@1.14.4 --install-cep
396
+ npx -y premiere-pro-mcp@1.14.6 --install-cep
365
397
  ```
366
398
 
367
399
  The Claude Code package lives in
@@ -400,7 +432,7 @@ installed separately.
400
432
  QE-backed tools are reported as `experimental` because QE is undocumented and can vary between Premiere builds. Authority availability is reported separately from implementation support, so disabling `edit`, for example, does not incorrectly label editing tools as unsupported. Static metadata never claims that a Premiere operation succeeded; use `ping` and inspect each tool result for runtime evidence.
401
433
 
402
434
  MCP `tools/list` is filtered to the active authority profile. The default
403
- `inspect,edit,export,filesystem` profile advertises 319 of the 321 registered
435
+ `inspect,edit,export,filesystem` profile advertises 325 of the 327 registered
404
436
  tools and omits `execute_extendscript` and `evaluate_expression`, which require
405
437
  explicit `unsafe-script` authority. `ping` and `get_capabilities` remain visible
406
438
  under every profile so a restricted or misconfigured server can still explain
@@ -503,7 +535,7 @@ PREMIERE_UXP_TOKEN="replace-with-a-long-random-secret" premiere-pro-mcp
503
535
 
504
536
  Enter the same token in the UXP panel. The listener binds only to `127.0.0.1:7777`, authenticates the WebSocket upgrade, requires a versioned capability handshake, correlates concurrent requests, and fails pending work on timeout or disconnect. Set `PREMIERE_UXP_PORT` to use another loopback port.
505
537
 
506
- When enabled, MCP discovery includes 54 capability-gated UXP additions. The first expansion covers effects, deterministic timeline selection, selection batches, scene detection, proxy/ingest, relink, metadata, color conformance, Source Monitor audition, storage, and least-privilege workspace access. The second adds Project-panel selection, marker CRUD, bin organization, sequence settings, imports, typed effect parameters/keyframes, track-item transforms, SequenceEditor timeline edits, sequence lifecycle, and AME encoding. The third wave begins with a redacted event journal, conservative AME terminal receipts, explicit host-readiness gates, safe multi-project sessions, lease-based growing-media control, namespaced workflow checkpoints, bounded media-health maintenance, caption-aware track mute state, and transactional source trim/framing documented in [the third-wave workflow matrix](docs/third-wave-uxp-workflows.md). The bounded migration surface also includes a non-ripple selected-item lift plus native video-transition listing and transactions; it does not claim direct empty-track create/delete or global redo support. A separate [hybrid benchmark gate](docs/uxp-hybrid-benchmark.md) keeps native acceleration disabled until reproducible cross-platform evidence exists. See also [the first stable workflow matrix](docs/uxp-stable-workflows.md) and [the next-ten workflow matrix](docs/uxp-next-ten-workflows.md). Commands are advertised only while the authenticated local UXP bridge is connected; the host capability handshake remains the authority for support in the running Premiere build. A failed UXP command is never silently retried through CEP because the first operation may have partially succeeded.
538
+ When enabled, MCP discovery includes 61 capability-gated UXP additions. The first expansion covers effects, deterministic timeline selection, selection batches, scene detection, proxy/ingest, relink, metadata, color conformance, read-only Premiere/After Effects environment inspection, Source Monitor audition, storage, and least-privilege workspace access. The second adds Project-panel selection, marker CRUD, single-transaction undoable beat-grid marker application, bin organization, sequence settings, imports, typed effect parameters/keyframes, track-item transforms, atomic J/L split edits, SequenceEditor timeline edits, sequence lifecycle, and AME encoding. The third wave begins with a redacted event journal, conservative AME terminal receipts, explicit host-readiness gates, safe multi-project sessions, lease-based growing-media control, namespaced workflow checkpoints, bounded media-health maintenance, caption-aware track mute state, transactional source trim/framing, and guarded sequence-range updates documented in [the third-wave workflow matrix](docs/third-wave-uxp-workflows.md). The bounded migration surface also includes a non-ripple selected-item lift plus native video-transition listing, target inspection, and guarded transactions; it does not claim direct empty-track create/delete or global redo support. A separate [hybrid benchmark gate](docs/uxp-hybrid-benchmark.md) keeps native acceleration disabled until reproducible cross-platform evidence exists. See also [the first stable workflow matrix](docs/uxp-stable-workflows.md) and [the next-ten workflow matrix](docs/uxp-next-ten-workflows.md). Commands are advertised only while the authenticated local UXP bridge is connected; the host capability handshake remains the authority for support in the running Premiere build. A failed UXP command is never silently retried through CEP because the first operation may have partially succeeded.
507
539
 
508
540
  The panel now requests access to one operator-selected workspace instead of declaring full filesystem access. Choose the folder in the panel before invoking a path-based UXP workflow. Media, relink, preset, export, and Source Monitor file paths must remain inside it; the persistent capability token and native root path are never returned over MCP. Lexical containment alone cannot exclude symlink, junction, or reparse-point escapes, and Adobe's request-scoped UXP filesystem API does not document canonical-path resolution. Builds without a host-supplied canonical resolver therefore advertise path-based UXP commands as unsupported and fail closed at invocation; use the existing CEP fallback for those operations.
509
541
 
@@ -527,6 +559,16 @@ coverage matrix](docs/adobe-uxp-26.3-coverage.md) and [the UXP capability
527
559
  foundation](docs/uxp-capability-foundation.md) for the command matrix and live-host
528
560
  validation boundary.
529
561
 
562
+ The [Premiere surface registry](docs/premiere-surface-registry.md) separately
563
+ tracks the Premiere DOM, general UXP JavaScript, HTML/CSS, Spectrum, plugin
564
+ guides, UXP Hybrid C++, the standalone Premiere C++ PrSDK, CEP/ExtendScript,
565
+ the CEP platform, QE, and pinned competitor sources. The exhaustive
566
+ [general UXP JavaScript inventory](docs/uxp-js-api-inventory.md) is generated
567
+ from Adobe's pinned declarations, while the exhaustive
568
+ [Premiere documentation inventory](docs/premiere-doc-inventory.md) tracks every
569
+ page in Adobe's live sitemap. This keeps declaration and documentation
570
+ inventory distinct from implementation and licensed-host coverage.
571
+
530
572
  The stable workflow expansion adds native component-chain effects, deterministic
531
573
  timeline selection, compound selection batches, scene-edit detection, proxy/ingest control, guarded offline
532
574
  relink, transactional project/XMP metadata, color and footage-conformance
@@ -578,11 +620,11 @@ The file-based IPC bridge is simple, reliable, and works across macOS and Window
578
620
 
579
621
  ---
580
622
 
581
- ## Tools (321 core total; 319 under the default profile; 373 with a connected UXP bridge)
623
+ ## Tools (327 core total; 325 under the default profile; 386 with a connected UXP bridge)
582
624
 
583
625
  The [complete supported-actions catalog](docs/supported-actions.md) lists every
584
626
  registered core tool, the two tools restricted behind explicit `unsafe-script`
585
- authority, and all 54 authenticated UXP additions with their current action or mode
627
+ authority, and all 61 authenticated UXP additions with their current action or mode
586
628
  values. It is generated from the same MCP registration surface returned to clients;
587
629
  the tables below are a shorter workflow-oriented overview.
588
630
 
@@ -635,12 +677,14 @@ the tables below are a shorter workflow-oriented overview.
635
677
  > (`ripple_delete`, razor/split) and existing effect-parameter writes. These tools now verify
636
678
  > the resulting sequence state and return an error instead of a false success. For structural
637
679
  > edits, rebuild the wanted source ranges into a new sequence with `create_sequence` and
638
- > `add_to_timeline`. Native transitions are unavailable when the host does not expose
639
- > `qeTrack.addTransition`; overlay clips remain a workaround for transitions that do not need
640
- > to blend adjacent source frames. See [issue #21](https://github.com/leancoderkavy/premiere-pro-mcp/issues/21).
641
-
642
- > **Speed, caption, and visual-keyframe boundaries:** Premiere Pro 26.3 exposes no supported
643
- > scripting setter or Time Remapping component for timeline-clip speed or direction. `reverse_clip`,
680
+ > `add_to_timeline`. The legacy CEP transition path targets `qeClip.addTransition` (not the
681
+ > QE track) and reports success only after DOM transition-count readback. Prefer the connected
682
+ > UXP transition tools where available; overlay clips remain a workaround when a legacy QE
683
+ > write is rejected or not verified. See [issue #21](https://github.com/leancoderkavy/premiere-pro-mcp/issues/21).
684
+
685
+ > **Speed, caption, and visual-keyframe boundaries:** Premiere Pro 26.3 may reflect legacy QE
686
+ > speed/direction methods, but exposes no supported scripting setter or Time Remapping component
687
+ > for timeline-clip speed or direction. `reverse_clip`,
644
688
  > `speed_change`, `set_clip_speed_qe`, and `set_clip_properties` with `speed` now stop before host mutation;
645
689
  > use the Speed/Duration UI or pre-render retimed media. `add_text_overlay` likewise stops
646
690
  > before mutation because a raw-text-to-caption API is not exposed; import an `.srt`/`.vtt`
@@ -898,7 +942,7 @@ user/device authorization are implemented.
898
942
 
899
943
  | Variable | Description | Default |
900
944
  | :------- | :---------- | :------ |
901
- | `PREMIERE_TEMP_DIR` | Shared temp directory for MCP ↔ CEP communication | OS temp dir + `/premiere-mcp-bridge` |
945
+ | `PREMIERE_TEMP_DIR` | Shared temp directory for MCP ↔ CEP communication | OS user temp dir + `/premiere-mcp-bridge` (macOS fallback is independent of `TMPDIR`) |
902
946
  | `PREMIERE_TIMEOUT_MS` | Command timeout in milliseconds | `30000` |
903
947
  | `PREMIERE_DEFAULT_SEQUENCE_PRESET` | Override the auto-discovered `.sqpreset` used by `create_sequence` | auto-discovered |
904
948
  | `PREMIERE_MCP_CAPABILITIES` | Comma-separated authority profile; add `unsafe-script` only when raw scripting is required | `inspect,edit,export,filesystem` |
@@ -952,7 +996,7 @@ premiere-pro-mcp/
952
996
  ├── src/
953
997
  │ ├── index.ts # Entry point — stdio transport setup
954
998
  │ ├── http-server.ts # Entry point — HTTP/SSE transport (Fly.io / remote)
955
- │ ├── server.ts # MCP server — registers 321 tools, filtered by authority profile
999
+ │ ├── server.ts # MCP server — registers 327 tools, filtered by authority profile
956
1000
  │ ├── bridge/
957
1001
  │ │ ├── file-bridge.ts # File-based IPC (write .jsx, poll .json)
958
1002
  │ │ └── script-builder.ts # ExtendScript generator with ES3 helpers
Binary file
@@ -1,8 +1,8 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <ExtensionManifest Version="7.0" ExtensionBundleId="com.mcp.premiere.bridge" ExtensionBundleVersion="1.14.4" ExtensionBundleName="MCP for Adobe Premiere Pro">
2
+ <ExtensionManifest Version="7.0" ExtensionBundleId="com.mcp.premiere.bridge" ExtensionBundleVersion="1.14.6" ExtensionBundleName="MCP for Adobe Premiere Pro">
3
3
  <ExtensionList>
4
- <Extension Id="com.mcp.premiere.bridge.panel" Version="1.14.4"/>
5
- <Extension Id="com.mcp.premiere.bridge.headless" Version="1.14.4"/>
4
+ <Extension Id="com.mcp.premiere.bridge.panel" Version="1.14.6"/>
5
+ <Extension Id="com.mcp.premiere.bridge.headless" Version="1.14.6"/>
6
6
  </ExtensionList>
7
7
  <ExecutionEnvironment>
8
8
  <HostList>
@@ -81,7 +81,7 @@
81
81
  <section class="update-section" aria-live="polite">
82
82
  <div class="update-copy">
83
83
  <span class="section-label">Connector updates</span>
84
- <strong id="updateTitle">Version 1.14.4</strong>
84
+ <strong id="updateTitle">Version 1.14.6</strong>
85
85
  <span id="updateDetail">Checking for updates…</span>
86
86
  </div>
87
87
  <button id="btnUpdate" class="button button-update" onclick="handleUpdateClick()" type="button" disabled>
@@ -61,16 +61,18 @@ function refreshConnectionCenter() {
61
61
  setConnectionCheck("checkProject", "waiting", "Checking…");
62
62
  setConnectionCheck("checkSequence", "waiting", "Checking…");
63
63
  cs.evalScript(
64
- '(function(){var p=app&&app.project;return JSON.stringify({projectOpen:!!(p&&typeof p.name!=="undefined"),sequenceOpen:!!(p&&p.activeSequence)});}())',
64
+ '(function(){var p=app&&app.project;return "mcpstate:"+(p&&typeof p.name!=="undefined"?"1":"0")+","+(p&&p.activeSequence?"1":"0");}())',
65
65
  function (raw) {
66
- try {
67
- var state = JSON.parse(raw || "{}");
68
- setConnectionCheck("checkProject", state.projectOpen ? "ready" : "needs-attention", state.projectOpen ? "Project open" : "Open a project in Premiere Pro");
69
- setConnectionCheck("checkSequence", state.sequenceOpen ? "ready" : "needs-attention", state.sequenceOpen ? "Active sequence open" : "Open a sequence in Premiere Pro");
70
- } catch (e) {
66
+ var match = /^mcpstate:([01]),([01])$/.exec(String(raw || ""));
67
+ if (!match) {
71
68
  setConnectionCheck("checkProject", "needs-attention", "Could not read Premiere state");
72
69
  setConnectionCheck("checkSequence", "needs-attention", "Could not read Premiere state");
70
+ return;
73
71
  }
72
+ var projectOpen = match[1] === "1";
73
+ var sequenceOpen = match[2] === "1";
74
+ setConnectionCheck("checkProject", projectOpen ? "ready" : "needs-attention", projectOpen ? "Project open" : "Open a project in Premiere Pro");
75
+ setConnectionCheck("checkSequence", sequenceOpen ? "ready" : "needs-attention", sequenceOpen ? "Active sequence open" : "Open a sequence in Premiere Pro");
74
76
  }
75
77
  );
76
78
  }
@@ -95,7 +97,17 @@ var fs = nodeRequire("fs");
95
97
  var path = nodeRequire("path");
96
98
  var os = nodeRequire("os");
97
99
  var https = nodeRequire("https");
98
- tempDir = path.join(os.tmpdir(), "premiere-mcp-bridge");
100
+ function defaultBridgeDirectory() {
101
+ try {
102
+ var nodeProcess = nodeRequire("process");
103
+ var configured = nodeProcess && nodeProcess.env && nodeProcess.env.PREMIERE_TEMP_DIR;
104
+ if (typeof configured === "string" && configured.trim()) return configured.trim();
105
+ } catch (e) {
106
+ // The panel still has a safe OS temporary-directory fallback.
107
+ }
108
+ return path.join(os.tmpdir(), "premiere-mcp-bridge");
109
+ }
110
+ tempDir = defaultBridgeDirectory();
99
111
  var latestUpdate = null;
100
112
 
101
113
  function ensureDir(dir) {
@@ -7,7 +7,7 @@
7
7
  })(this, function () {
8
8
  "use strict";
9
9
 
10
- var CURRENT_VERSION = "1.14.4";
10
+ var CURRENT_VERSION = "1.14.6";
11
11
  var LATEST_RELEASE_API =
12
12
  "https://api.github.com/repos/leancoderkavy/premiere-pro-mcp/releases/latest";
13
13
  var RELEASES_URL =
@@ -0,0 +1,53 @@
1
+ import { type ProjectContextDocument, type ProjectContextKind, type ProjectContextSearchResult } from "../context/project-context-store.js";
2
+ export declare const EDITORIAL_CONTEXT_PACK_SCHEMA_VERSION = 1;
3
+ export declare const DEFAULT_EDITORIAL_CONTEXT_PACK_ENTRIES = 12;
4
+ export declare const MAX_EDITORIAL_CONTEXT_PACK_ENTRIES = 50;
5
+ export declare const DEFAULT_EDITORIAL_CONTEXT_PACK_CHARACTERS = 12000;
6
+ export declare const MIN_EDITORIAL_CONTEXT_PACK_CHARACTERS = 1024;
7
+ export declare const MAX_EDITORIAL_CONTEXT_PACK_CHARACTERS = 24000;
8
+ export interface EditorialContextPackEvidence {
9
+ evidenceId: string;
10
+ kind: ProjectContextKind;
11
+ name: string;
12
+ score: number;
13
+ matchedTerms: string[];
14
+ textExcerpt: string;
15
+ textTruncated: boolean;
16
+ sequenceId?: string;
17
+ sourceId?: string;
18
+ timelineItemId?: string;
19
+ startSeconds?: number;
20
+ endSeconds?: number;
21
+ sourceRevision?: string;
22
+ timelineRevision?: string;
23
+ }
24
+ export interface EditorialContextPack {
25
+ schemaVersion: typeof EDITORIAL_CONTEXT_PACK_SCHEMA_VERSION;
26
+ projectId: string;
27
+ projectName: string;
28
+ intent: string;
29
+ expectedContextRevision: string;
30
+ expectedSourceRevision: string;
31
+ expectedTimelineRevision: string;
32
+ evidence: EditorialContextPackEvidence[];
33
+ omittedEvidenceCount: number;
34
+ truncated: boolean;
35
+ markdown: string;
36
+ applied: false;
37
+ }
38
+ export interface BuildEditorialContextPackOptions {
39
+ intent: string;
40
+ results: ProjectContextSearchResult[];
41
+ /** Exact pre-limit relevant-match count used for honest truncation metadata. */
42
+ totalResultCount?: number;
43
+ maxEntries?: number;
44
+ maxCharacters?: number;
45
+ }
46
+ /**
47
+ * Produces a compact reading surface from evidence already captured in the
48
+ * local project-context store. It intentionally knows nothing about Premiere's
49
+ * private transcript JSON shape: callers must explicitly enrich context with
50
+ * the transcript passages or other analysis they want to expose.
51
+ */
52
+ export declare function buildEditorialContextPack(document: ProjectContextDocument, options: BuildEditorialContextPackOptions): EditorialContextPack;
53
+ //# sourceMappingURL=editorial-context-pack.d.ts.map
@@ -0,0 +1,133 @@
1
+ import { normalizeContextText, } from "../context/project-context-store.js";
2
+ export const EDITORIAL_CONTEXT_PACK_SCHEMA_VERSION = 1;
3
+ export const DEFAULT_EDITORIAL_CONTEXT_PACK_ENTRIES = 12;
4
+ export const MAX_EDITORIAL_CONTEXT_PACK_ENTRIES = 50;
5
+ export const DEFAULT_EDITORIAL_CONTEXT_PACK_CHARACTERS = 12_000;
6
+ export const MIN_EDITORIAL_CONTEXT_PACK_CHARACTERS = 1_024;
7
+ export const MAX_EDITORIAL_CONTEXT_PACK_CHARACTERS = 24_000;
8
+ function boundedInteger(value, fallback, minimum, maximum, label) {
9
+ if (value === undefined)
10
+ return fallback;
11
+ if (!Number.isInteger(value) || typeof value !== "number" || value < minimum || value > maximum) {
12
+ throw new Error(`${label} must be an integer from ${minimum} through ${maximum}`);
13
+ }
14
+ return value;
15
+ }
16
+ function finiteSeconds(value) {
17
+ return typeof value === "number" && Number.isFinite(value) ? Number(value.toFixed(3)) : undefined;
18
+ }
19
+ function compactText(value, maximum) {
20
+ return value.length <= maximum ? value : `${value.slice(0, maximum - 1).trimEnd()}…`;
21
+ }
22
+ function sourceRange(record) {
23
+ const startSeconds = finiteSeconds(record.startSeconds);
24
+ const endSeconds = finiteSeconds(record.endSeconds);
25
+ if (startSeconds === undefined || endSeconds === undefined)
26
+ return undefined;
27
+ return `${startSeconds.toFixed(3)}s–${endSeconds.toFixed(3)}s`;
28
+ }
29
+ function evidenceHeader(index, record, score, matchedTerms) {
30
+ const facts = [
31
+ `evidence ${compactText(record.id, 96)}`,
32
+ `score ${Number(score.toFixed(3))}`,
33
+ record.sourceId ? `source ${compactText(record.sourceId, 96)}` : undefined,
34
+ record.sequenceId ? `sequence ${compactText(record.sequenceId, 96)}` : undefined,
35
+ sourceRange(record),
36
+ matchedTerms.length ? `matched ${compactText(matchedTerms.join(", "), 160)}` : undefined,
37
+ ].filter(Boolean).join(" · ");
38
+ return `## ${String(index + 1).padStart(2, "0")} · ${record.kind} · ${compactText(record.name, 160)}\n${facts}`;
39
+ }
40
+ function entryText(header, text) {
41
+ return `${header}\n${text}`;
42
+ }
43
+ function truncateTextToFit(header, text, availableCharacters) {
44
+ const prefix = `${header}\n`;
45
+ if (availableCharacters < prefix.length + 32)
46
+ return undefined;
47
+ const suffix = " … [excerpt truncated]";
48
+ const textBudget = availableCharacters - prefix.length - suffix.length;
49
+ if (textBudget < 1)
50
+ return undefined;
51
+ return `${prefix}${text.slice(0, textBudget).trimEnd()}${suffix}`;
52
+ }
53
+ function evidenceFromResult(result, textExcerpt, textTruncated) {
54
+ const { record } = result;
55
+ return {
56
+ evidenceId: record.id,
57
+ kind: record.kind,
58
+ name: record.name,
59
+ score: Number(result.score.toFixed(3)),
60
+ matchedTerms: [...result.matchedTerms],
61
+ textExcerpt,
62
+ textTruncated,
63
+ ...(record.sequenceId ? { sequenceId: record.sequenceId } : {}),
64
+ ...(record.sourceId ? { sourceId: record.sourceId } : {}),
65
+ ...(record.timelineItemId ? { timelineItemId: record.timelineItemId } : {}),
66
+ ...(finiteSeconds(record.startSeconds) === undefined ? {} : { startSeconds: finiteSeconds(record.startSeconds) }),
67
+ ...(finiteSeconds(record.endSeconds) === undefined ? {} : { endSeconds: finiteSeconds(record.endSeconds) }),
68
+ ...(record.sourceRevision ? { sourceRevision: record.sourceRevision } : {}),
69
+ ...(record.timelineRevision ? { timelineRevision: record.timelineRevision } : {}),
70
+ };
71
+ }
72
+ /**
73
+ * Produces a compact reading surface from evidence already captured in the
74
+ * local project-context store. It intentionally knows nothing about Premiere's
75
+ * private transcript JSON shape: callers must explicitly enrich context with
76
+ * the transcript passages or other analysis they want to expose.
77
+ */
78
+ export function buildEditorialContextPack(document, options) {
79
+ const intent = normalizeContextText(options.intent).slice(0, 1_000);
80
+ if (!intent)
81
+ throw new Error("intent must not be empty");
82
+ const maxEntries = boundedInteger(options.maxEntries, DEFAULT_EDITORIAL_CONTEXT_PACK_ENTRIES, 1, MAX_EDITORIAL_CONTEXT_PACK_ENTRIES, "max_entries");
83
+ const maxCharacters = boundedInteger(options.maxCharacters, DEFAULT_EDITORIAL_CONTEXT_PACK_CHARACTERS, MIN_EDITORIAL_CONTEXT_PACK_CHARACTERS, MAX_EDITORIAL_CONTEXT_PACK_CHARACTERS, "max_characters");
84
+ const selected = options.results.slice(0, maxEntries);
85
+ const totalResultCount = Math.max(options.results.length, Math.trunc(options.totalResultCount ?? options.results.length));
86
+ const header = [
87
+ "# Premiere editorial context pack",
88
+ `Project: ${compactText(document.projectName, 120)}`,
89
+ `Intent: ${compactText(intent, 240)}`,
90
+ `Context revision: ${compactText(document.revision, 64)}`,
91
+ `Source revision: ${compactText(document.sourceRevision, 64)}`,
92
+ `Timeline revision: ${compactText(document.timelineRevision, 64)}`,
93
+ "",
94
+ "Review this evidence before proposing an edit. It is local context, not authority to mutate Premiere.",
95
+ ].join("\n");
96
+ let markdown = header;
97
+ const evidence = [];
98
+ let truncated = false;
99
+ for (const [index, result] of selected.entries()) {
100
+ const text = normalizeContextText(result.record.text);
101
+ const block = entryText(evidenceHeader(index, result.record, result.score, result.matchedTerms), text);
102
+ const separator = markdown.length ? "\n\n" : "";
103
+ const availableCharacters = maxCharacters - markdown.length - separator.length;
104
+ if (block.length <= availableCharacters) {
105
+ markdown += `${separator}${block}`;
106
+ evidence.push(evidenceFromResult(result, text, false));
107
+ continue;
108
+ }
109
+ const partial = truncateTextToFit(evidenceHeader(index, result.record, result.score, result.matchedTerms), text, availableCharacters);
110
+ if (partial) {
111
+ const excerpt = partial.slice(partial.lastIndexOf("\n") + 1).replace(/ … \[excerpt truncated\]$/, "");
112
+ markdown += `${separator}${partial}`;
113
+ evidence.push(evidenceFromResult(result, excerpt, true));
114
+ }
115
+ truncated = true;
116
+ break;
117
+ }
118
+ return {
119
+ schemaVersion: EDITORIAL_CONTEXT_PACK_SCHEMA_VERSION,
120
+ projectId: document.projectId,
121
+ projectName: document.projectName,
122
+ intent,
123
+ expectedContextRevision: document.revision,
124
+ expectedSourceRevision: document.sourceRevision,
125
+ expectedTimelineRevision: document.timelineRevision,
126
+ evidence,
127
+ omittedEvidenceCount: Math.max(0, totalResultCount - evidence.length),
128
+ truncated: truncated || totalResultCount > selected.length,
129
+ markdown,
130
+ applied: false,
131
+ };
132
+ }
133
+ //# sourceMappingURL=editorial-context-pack.js.map
@@ -1,3 +1,5 @@
1
+ export declare function getDarwinUserTempDirectory(): string | null;
2
+ export declare function getDefaultBridgeTempDir(platform?: NodeJS.Platform, fallbackTempDirectory?: string, readDarwinUserTempDirectory?: () => string | null, environment?: NodeJS.ProcessEnv): string;
1
3
  export declare const BRIDGE_HEARTBEAT_FILE = "bridge-heartbeat.json";
2
4
  export declare const BRIDGE_HEARTBEAT_STALE_MS = 3000;
3
5
  export interface BridgeOptions {
@@ -1,9 +1,31 @@
1
1
  import { mkdirSync, writeFileSync, readFileSync, unlinkSync, existsSync, readdirSync, renameSync, statSync, chmodSync, watch } from "node:fs";
2
- import { basename, dirname, join } from "node:path";
2
+ import { basename, dirname, isAbsolute, join } from "node:path";
3
3
  import { tmpdir } from "node:os";
4
4
  import { randomUUID } from "node:crypto";
5
+ import { execFileSync } from "node:child_process";
5
6
  import { getHelpersSource, helpersFileName, buildBootstrap } from "./script-builder.js";
6
- const DEFAULT_TEMP_DIR = join(tmpdir(), "premiere-mcp-bridge");
7
+ export function getDarwinUserTempDirectory() {
8
+ try {
9
+ // GUI-launched MCP clients can omit TMPDIR. On macOS, getconf still returns
10
+ // the same per-user temporary root inherited by Premiere's CEP process.
11
+ const value = execFileSync("/usr/bin/getconf", ["DARWIN_USER_TEMP_DIR"], {
12
+ encoding: "utf-8",
13
+ stdio: ["ignore", "pipe", "ignore"],
14
+ }).trim();
15
+ return value && isAbsolute(value) ? value : null;
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ }
21
+ export function getDefaultBridgeTempDir(platform = process.platform, fallbackTempDirectory = tmpdir(), readDarwinUserTempDirectory = getDarwinUserTempDirectory, environment = process.env) {
22
+ const hasConfiguredNodeTempDirectory = Boolean(environment.TMPDIR || environment.TMP || environment.TEMP);
23
+ const temporaryRoot = platform === "darwin" && !hasConfiguredNodeTempDirectory
24
+ ? readDarwinUserTempDirectory() ?? fallbackTempDirectory
25
+ : fallbackTempDirectory;
26
+ return join(temporaryRoot, "premiere-mcp-bridge");
27
+ }
28
+ const DEFAULT_TEMP_DIR = getDefaultBridgeTempDir();
7
29
  const POLL_FALLBACK_MS = 250;
8
30
  const DEFAULT_TIMEOUT_MS = 30000;
9
31
  export const BRIDGE_HEARTBEAT_FILE = "bridge-heartbeat.json";
@@ -141,6 +141,27 @@ function __findClip(nodeId) {
141
141
  return null;
142
142
  }
143
143
 
144
+ // QE tracks include gaps and transitions in addition to clips, so a DOM clip
145
+ // index cannot safely be passed to qeTrack.getItemAt(). Resolve a QE clip by
146
+ // its timeline start instead. Return null rather than a nearest candidate: a
147
+ // mutation must never be redirected to a neighbouring clip.
148
+ function __findQeClipByDomClip(qeTrack, domClip) {
149
+ if (!qeTrack || !domClip) return null;
150
+ var wantedStart = null;
151
+ try { wantedStart = parseFloat(domClip.start.ticks); } catch (eStart) {}
152
+ if (wantedStart === null || isNaN(wantedStart)) return null;
153
+
154
+ for (var qi = 0; qi < qeTrack.numItems; qi++) {
155
+ var candidate = null;
156
+ try { candidate = qeTrack.getItemAt(qi); } catch (eItem) {}
157
+ if (!candidate || String(candidate.type) !== "Clip") continue;
158
+ try {
159
+ if (Math.abs(parseFloat(candidate.start.ticks) - wantedStart) < 1) return candidate;
160
+ } catch (eCandidate) {}
161
+ }
162
+ return null;
163
+ }
164
+
144
165
  // CEP's legacy QE path can enumerate a host's effect catalog before adding an
145
166
  // effect to a timeline clip. Recent Premiere builds can expose QE yet return an
146
167
  // empty catalog, so distinguish that host limitation from a misspelled effect
@@ -71,6 +71,8 @@ export interface ProjectContextSearchResult {
71
71
  record: ProjectContextRecord;
72
72
  matchedTerms: string[];
73
73
  }
74
+ /** Counts exact keyword-relevant records without materializing their evidence. */
75
+ export declare function countProjectContextMatches(document: ProjectContextDocument, options: Omit<ProjectContextSearchOptions, "limit">): number;
74
76
  export declare function searchProjectContext(document: ProjectContextDocument, options: ProjectContextSearchOptions): ProjectContextSearchResult[];
75
77
  export declare function contextRevision(sourceRevision: string, timelineRevision: string, records: ProjectContextRecord[]): string;
76
78
  export declare function stableContextId(...parts: unknown[]): string;