premiere-pro-mcp 1.6.0 → 1.8.0
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.
- package/CHANGELOG.md +42 -0
- package/README.md +42 -18
- package/artifacts/MCPBridgeCEP.zxp +0 -0
- package/cep-plugin/CSXS/manifest.xml +3 -3
- package/cep-plugin/index.html +1 -1
- package/cep-plugin/updater.cjs +1 -1
- package/dist/advanced-feature-support.d.ts +1 -0
- package/dist/advanced-feature-support.js +7 -6
- package/dist/platform-capabilities.d.ts +47 -3
- package/dist/platform-capabilities.js +139 -0
- package/dist/resources/adobe-uxp-coverage.json +371 -0
- package/dist/security/capabilities.js +6 -1
- package/dist/tools/edit-plans.d.ts +3 -3
- package/dist/tools/export.d.ts +1 -1
- package/dist/tools/health.d.ts +6 -4
- package/dist/tools/recovery.d.ts +6 -6
- package/dist/tools/transcript-edits.d.ts +15 -0
- package/dist/tools/transcript-edits.js +64 -0
- package/dist/tools/uxp.d.ts +484 -0
- package/dist/tools/uxp.js +228 -0
- package/dist/workflows/catalog.d.ts +2 -2
- package/dist/workflows/tool-metadata.d.ts +2 -2
- package/package.json +10 -3
- package/scripts/copy-adobe-uxp-coverage.mjs +10 -0
- package/uxp-plugin/README.md +47 -2
- package/uxp-plugin/commands.cjs +390 -11
- package/uxp-plugin/index.cjs +17 -7
- package/uxp-plugin/manifest.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,48 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [1.8.0] - 2026-08-01
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Added three read-only, capability-gated UXP transcript tools: native transcript
|
|
14
|
+
export, native transcript search, and revision-locked transcript edit previews.
|
|
15
|
+
- Added a deterministic SHA-256 transcript revision and confirmation token so a
|
|
16
|
+
proposed edit cannot be confused with a regenerated transcript.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- Expanded the connected UXP surface from 16 to 19 tools while keeping automatic
|
|
21
|
+
transcript-to-timeline application unavailable pending real-host validation.
|
|
22
|
+
- Added repository Copilot instructions and a deterministic Node 24 setup workflow.
|
|
23
|
+
|
|
24
|
+
### Validation
|
|
25
|
+
|
|
26
|
+
- Automated tests cover transcript range validation, revision locking, capability
|
|
27
|
+
registration, and the MCP catalog. A real Premiere 25.6 or 26.3 host still must
|
|
28
|
+
validate transcript semantics before any apply operation is introduced.
|
|
29
|
+
|
|
30
|
+
## [1.7.0] - 2026-08-01
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
|
|
34
|
+
- Added six capability-gated Premiere 26.3+ UXP tools: `rename_track_uxp`,
|
|
35
|
+
`create_subclip_uxp`, `list_markers_uxp`, `set_source_monitor_position_uxp`,
|
|
36
|
+
`has_transcript_uxp`, and `export_aaf_uxp`.
|
|
37
|
+
- Added Adobe 26.3 coverage documentation and contract tests for the public MCP
|
|
38
|
+
schemas, protocol commands, and live-host verification gate.
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
|
|
42
|
+
- Documented the stable 26.3 baseline separately from Adobe's 26.5 beta type
|
|
43
|
+
declarations. Beta-only APIs are not advertised as supported.
|
|
44
|
+
|
|
45
|
+
### Validation
|
|
46
|
+
|
|
47
|
+
- Automated contract tests validate catalog exposure, argument translation, host
|
|
48
|
+
capability probes, and result envelopes. A real Premiere 26.3+ host still must
|
|
49
|
+
validate each mutation and export before it can be called live-host verified.
|
|
50
|
+
|
|
9
51
|
## [1.6.0] - 2026-07-31
|
|
10
52
|
|
|
11
53
|
### Added
|
package/README.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
# Premiere Pro MCP
|
|
3
|
+
# Premiere Pro MCP
|
|
4
4
|
|
|
5
5
|
[](https://mcptoplist.com/server/glama%2Fleancoderkavy%2Fpremiere-pro-mcp)
|
|
6
6
|
|
|
7
7
|
**Give AI full control over Adobe Premiere Pro.**
|
|
8
8
|
|
|
9
|
-
279 core tools across 31 modules, 3 resources, and 4 guided workflows. A connected UXP host adds
|
|
9
|
+
279 core tools across 31 modules, 3 resources, and 4 guided workflows. A connected UXP host adds 19 capability-gated tools.
|
|
10
10
|
|
|
11
11
|
[](LICENSE)
|
|
12
12
|
[](https://nodejs.org)
|
|
@@ -27,14 +27,25 @@ An [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server that l
|
|
|
27
27
|
"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."
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
The AI handles the entire workflow through 279 core tools spanning the supported ExtendScript, QE DOM, local media analysis, and safe edit-planning surfaces. A compatible, authenticated UXP panel adds
|
|
30
|
+
The AI handles the entire workflow through 279 core tools spanning the supported ExtendScript, QE DOM, local media analysis, and safe edit-planning surfaces. A compatible, authenticated UXP panel adds 19 documented, capability-gated workflows without replacing the production CEP bridge.
|
|
31
31
|
|
|
32
|
-
### What's new in 1.
|
|
32
|
+
### What's new in 1.8.0
|
|
33
33
|
|
|
34
|
-
- **
|
|
35
|
-
|
|
36
|
-
-
|
|
37
|
-
- **
|
|
34
|
+
- **Native transcript planning:** compatible UXP hosts can export and search the
|
|
35
|
+
transcript Premiere generated for a clip, then preview a revision-locked set of
|
|
36
|
+
source-time deletion ranges.
|
|
37
|
+
- **No false edit promise:** previews return a deterministic confirmation token and
|
|
38
|
+
never modify a clip or timeline. Automated application remains withheld until the
|
|
39
|
+
documented source-to-sequence reconstruction path passes real-host validation.
|
|
40
|
+
- **19 connected UXP tools:** the capability-gated UXP surface grows from 16 to 19
|
|
41
|
+
without changing the 279 core-tool surface.
|
|
42
|
+
|
|
43
|
+
### Previous release: 1.7.0
|
|
44
|
+
|
|
45
|
+
- **Six documented workflows:** compatible 26.3+ hosts can expose UXP track renaming, subclip creation, stable marker IDs, Source Monitor seeking, transcript presence checks, and AAF export.
|
|
46
|
+
- **Capability first:** a tool is discoverable only with the authenticated local panel; the panel's live `capabilities.get` response—not package metadata—decides whether the current host supports it.
|
|
47
|
+
- **Evidence boundary:** automated tests validate schemas, routing, capability declarations, transactions, and result envelopes. They do not verify a specific Premiere installation. See [Adobe UXP 26.3 coverage](docs/adobe-uxp-26.3-coverage.md) for the exact host gate and the stable-versus-beta policy.
|
|
48
|
+
- **Adobe-aligned validation:** the official Premiere 26.3 declarations and ESLint rules now enforce supported signatures and lock/transaction boundaries in CI.
|
|
38
49
|
|
|
39
50
|
### Added in 1.2.0
|
|
40
51
|
|
|
@@ -248,11 +259,11 @@ From a clone of this repository:
|
|
|
248
259
|
```bash
|
|
249
260
|
codex plugin marketplace add .
|
|
250
261
|
codex plugin add premiere-pro@premiere-pro-mcp
|
|
251
|
-
npx -y premiere-pro-mcp@1.
|
|
262
|
+
npx -y premiere-pro-mcp@1.8.0 --install-cep
|
|
252
263
|
```
|
|
253
264
|
|
|
254
265
|
Restart Premiere Pro and start a new Codex session after installation. The plugin
|
|
255
|
-
launches `premiere-pro-mcp@1.
|
|
266
|
+
launches `premiere-pro-mcp@1.8.0` through `npx`; the separate CEP installation is
|
|
256
267
|
required because the MCP server communicates with the running Premiere host through
|
|
257
268
|
the local bridge.
|
|
258
269
|
|
|
@@ -272,7 +283,7 @@ For Claude Code, add this repository as a marketplace and install the plugin:
|
|
|
272
283
|
Then install the Premiere bridge and start a new Claude Code session:
|
|
273
284
|
|
|
274
285
|
```bash
|
|
275
|
-
npx -y premiere-pro-mcp@1.
|
|
286
|
+
npx -y premiere-pro-mcp@1.8.0 --install-cep
|
|
276
287
|
```
|
|
277
288
|
|
|
278
289
|
The Claude Code package lives in
|
|
@@ -362,14 +373,27 @@ PREMIERE_UXP_TOKEN="replace-with-a-long-random-secret" premiere-pro-mcp
|
|
|
362
373
|
|
|
363
374
|
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.
|
|
364
375
|
|
|
365
|
-
When enabled, MCP discovery includes `get_uxp_capabilities`, `get_uxp_state`, `inspect_project_uxp`, `save_project_uxp`, `create_sequence_with_preset_uxp`, `export_interchange_uxp`, `get_transcript_languages_uxp`, `detect_object_masks_uxp`, `configure_encoder_uxp`, and `
|
|
376
|
+
When enabled, MCP discovery includes `get_uxp_capabilities`, `get_uxp_state`, `inspect_project_uxp`, `save_project_uxp`, `create_sequence_with_preset_uxp`, `export_interchange_uxp`, `get_transcript_languages_uxp`, `get_clip_transcript_uxp`, `search_clip_transcript_uxp`, `preview_transcript_edit_uxp`, `detect_object_masks_uxp`, `configure_encoder_uxp`, `export_frame_uxp`, `rename_track_uxp`, `create_subclip_uxp`, `list_markers_uxp`, `set_source_monitor_position_uxp`, `has_transcript_uxp`, and `export_aaf_uxp`. 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.
|
|
377
|
+
|
|
378
|
+
Native transcript editing starts with a read-only, revision-locked planning flow. Use
|
|
379
|
+
`get_clip_transcript_uxp` to export the transcript Premiere generated for a source
|
|
380
|
+
clip, select source-time ranges from that JSON, and pass its SHA-256 revision to
|
|
381
|
+
`preview_transcript_edit_uxp`. The preview sorts and merges ranges and returns a
|
|
382
|
+
confirmation token without changing the timeline. Premiere does not expose a
|
|
383
|
+
documented operation that directly turns deleted transcript text into timeline cuts,
|
|
384
|
+
so automatic application remains withheld until the source-to-sequence mapping and
|
|
385
|
+
documented reconstruction path pass live-host validation. `search_clip_transcript_uxp`
|
|
386
|
+
provides read-only discovery without substituting an external transcription engine.
|
|
366
387
|
|
|
367
388
|
Premiere 26.2-26.3 hosts also expose documented UXP workflows for revisioned project
|
|
368
389
|
inspection, verified project saves, preset-based sequence creation, OTIO/FCP XML
|
|
369
|
-
interchange, transcript-language discovery, Object Mask detection,
|
|
370
|
-
Encoder control
|
|
371
|
-
|
|
372
|
-
|
|
390
|
+
interchange, transcript-language discovery, Object Mask detection, Adobe Media
|
|
391
|
+
Encoder control, track renaming, subclip creation, stable marker inspection,
|
|
392
|
+
Source Monitor positioning, and clip transcript detection. Mutations accept optional
|
|
393
|
+
idempotency keys and return explicit verification outcomes. See [the Adobe UXP 26.3
|
|
394
|
+
coverage matrix](docs/adobe-uxp-26.3-coverage.md) and [the UXP capability
|
|
395
|
+
foundation](docs/uxp-capability-foundation.md) for the command matrix and live-host
|
|
396
|
+
validation boundary.
|
|
373
397
|
|
|
374
398
|
---
|
|
375
399
|
|
|
@@ -413,7 +437,7 @@ The file-based IPC bridge is simple, reliable, and works across macOS and Window
|
|
|
413
437
|
|
|
414
438
|
---
|
|
415
439
|
|
|
416
|
-
## Tools (279 core total; 277 under the default profile;
|
|
440
|
+
## Tools (279 core total; 277 under the default profile; 296 with a connected UXP bridge)
|
|
417
441
|
|
|
418
442
|
### Discovery & Inspection (10 + 10)
|
|
419
443
|
|
|
@@ -656,7 +680,7 @@ premiere-pro-mcp/
|
|
|
656
680
|
├── src/
|
|
657
681
|
│ ├── index.ts # Entry point — stdio transport setup
|
|
658
682
|
│ ├── http-server.ts # Entry point — HTTP/SSE transport (Fly.io / remote)
|
|
659
|
-
│ ├── server.ts # MCP server — registers 279 tools, filtered by authority profile
|
|
683
|
+
│ ├── server.ts # MCP server — registers 279 core tools, filtered by authority profile
|
|
660
684
|
│ ├── bridge/
|
|
661
685
|
│ │ ├── file-bridge.ts # File-based IPC (write .jsx, poll .json)
|
|
662
686
|
│ │ └── 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.
|
|
2
|
+
<ExtensionManifest Version="7.0" ExtensionBundleId="com.mcp.premiere.bridge" ExtensionBundleVersion="1.8.0" ExtensionBundleName="MCP Bridge">
|
|
3
3
|
<ExtensionList>
|
|
4
|
-
<Extension Id="com.mcp.premiere.bridge.panel" Version="1.
|
|
5
|
-
<Extension Id="com.mcp.premiere.bridge.headless" Version="1.
|
|
4
|
+
<Extension Id="com.mcp.premiere.bridge.panel" Version="1.8.0"/>
|
|
5
|
+
<Extension Id="com.mcp.premiere.bridge.headless" Version="1.8.0"/>
|
|
6
6
|
</ExtensionList>
|
|
7
7
|
<ExecutionEnvironment>
|
|
8
8
|
<HostList>
|
package/cep-plugin/index.html
CHANGED
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
<section class="update-section" aria-live="polite">
|
|
66
66
|
<div class="update-copy">
|
|
67
67
|
<span class="section-label">Connector updates</span>
|
|
68
|
-
<strong id="updateTitle">Version 1.
|
|
68
|
+
<strong id="updateTitle">Version 1.8.0</strong>
|
|
69
69
|
<span id="updateDetail">Checking for updates…</span>
|
|
70
70
|
</div>
|
|
71
71
|
<button id="btnUpdate" class="button button-update" onclick="handleUpdateClick()" type="button" disabled>
|
package/cep-plugin/updater.cjs
CHANGED
|
@@ -94,6 +94,7 @@ export declare function buildAdvancedFeatureSupport(context?: AdvancedFeatureCon
|
|
|
94
94
|
objectMask: {
|
|
95
95
|
status: AdvancedFeatureStatus;
|
|
96
96
|
callableThroughCurrentMcpTransport: boolean;
|
|
97
|
+
prerequisites: string[];
|
|
97
98
|
supportedOperations: string[];
|
|
98
99
|
unsupportedOperations: string[];
|
|
99
100
|
userAssistedWorkflow: string;
|
|
@@ -108,12 +108,13 @@ export function buildAdvancedFeatureSupport(context = {}) {
|
|
|
108
108
|
detection: "No documented flag safely distinguishes a generated extension from an ordinary clip.",
|
|
109
109
|
},
|
|
110
110
|
objectMask: {
|
|
111
|
-
status: "
|
|
112
|
-
callableThroughCurrentMcpTransport:
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
111
|
+
status: "partial",
|
|
112
|
+
callableThroughCurrentMcpTransport: true,
|
|
113
|
+
prerequisites: ["Premiere Pro 26.3+", "connected UXP bridge"],
|
|
114
|
+
supportedOperations: ["detect whether a project or sequence contains an Object Mask"],
|
|
115
|
+
unsupportedOperations: ["invoke object selection", "create an Object Mask", "run tracking", "edit Object Mask parameters"],
|
|
116
|
+
userAssistedWorkflow: "Create and track the mask in Premiere; the MCP can then detect its presence through the documented UXP API.",
|
|
117
|
+
detection: "Premiere Pro 26.3+ exposes ObjectMaskUtils.hasObjectMask through the documented UXP API.",
|
|
117
118
|
},
|
|
118
119
|
captionTranslation: {
|
|
119
120
|
status: "user-assisted",
|
|
@@ -2,6 +2,49 @@ import type { CapabilityConfig } from "./security/capabilities.js";
|
|
|
2
2
|
import { type CatalogToolDefinition } from "./tool-capability-report.js";
|
|
3
3
|
export declare const SUPPORTED_HOST_PLATFORMS: readonly ["darwin", "win32"];
|
|
4
4
|
export type SupportedHostPlatform = (typeof SUPPORTED_HOST_PLATFORMS)[number];
|
|
5
|
+
export type AdobeUxpCoverageAvailability = "current" | "planned";
|
|
6
|
+
export type AdobeUxpCoverageImplementationStatus = "implemented" | "planned";
|
|
7
|
+
export type AdobeUxpCoverageVerificationStatus = "automated_contract_verified" | "committed_unverified" | "not_started";
|
|
8
|
+
export type AdobeUxpCoverageLiveHostVerificationStatus = "not_run" | "verified";
|
|
9
|
+
export interface AdobeUxpCoverageEntry {
|
|
10
|
+
id: string;
|
|
11
|
+
adobeApi: string[];
|
|
12
|
+
documentationUrls: string[];
|
|
13
|
+
minimumPremiereVersion: string;
|
|
14
|
+
backend: "uxp";
|
|
15
|
+
uxpCommand: string | null;
|
|
16
|
+
mcpTools: string[];
|
|
17
|
+
availability: AdobeUxpCoverageAvailability;
|
|
18
|
+
implementationStatus: AdobeUxpCoverageImplementationStatus;
|
|
19
|
+
verificationStatus: AdobeUxpCoverageVerificationStatus;
|
|
20
|
+
liveHostVerificationStatus: AdobeUxpCoverageLiveHostVerificationStatus;
|
|
21
|
+
mutatesProject: boolean;
|
|
22
|
+
undoable: boolean;
|
|
23
|
+
idempotency: "operation_id" | "operation_id_when_supported" | "not_applicable";
|
|
24
|
+
verificationBoundary: string;
|
|
25
|
+
}
|
|
26
|
+
export interface AdobeUxpCoverageManifest {
|
|
27
|
+
schemaVersion: 1;
|
|
28
|
+
source: {
|
|
29
|
+
apiPackage: "@adobe/premierepro";
|
|
30
|
+
apiVersion: string;
|
|
31
|
+
changelogUrl: string;
|
|
32
|
+
};
|
|
33
|
+
entries: AdobeUxpCoverageEntry[];
|
|
34
|
+
}
|
|
35
|
+
export interface AdobeUxpCoverageReport extends AdobeUxpCoverageManifest {
|
|
36
|
+
summary: {
|
|
37
|
+
total: number;
|
|
38
|
+
current: number;
|
|
39
|
+
planned: number;
|
|
40
|
+
implemented: number;
|
|
41
|
+
committedUnverified: number;
|
|
42
|
+
automatedContractVerified: number;
|
|
43
|
+
liveHostVerified: number;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export declare const ADOBE_UXP_COVERAGE_MANIFEST: AdobeUxpCoverageManifest;
|
|
47
|
+
export declare function buildAdobeUxpCoverageReport(): AdobeUxpCoverageReport;
|
|
5
48
|
export declare function platformName(platform: NodeJS.Platform): string;
|
|
6
49
|
export declare function buildPlatformCapabilityReport(capabilities: CapabilityConfig, platform?: NodeJS.Platform, tempDirectory?: string, toolCatalog?: Record<string, CatalogToolDefinition>): {
|
|
7
50
|
schemaVersion: number;
|
|
@@ -23,7 +66,7 @@ export declare function buildPlatformCapabilityReport(capabilities: CapabilityCo
|
|
|
23
66
|
platforms: string[];
|
|
24
67
|
premiereVersions: string;
|
|
25
68
|
transport: string;
|
|
26
|
-
capabilities: ("
|
|
69
|
+
capabilities: ("inspect" | "edit" | "export" | "filesystem" | "unsafe-script")[];
|
|
27
70
|
delivery: {
|
|
28
71
|
interchange: string[];
|
|
29
72
|
presetValidation: boolean;
|
|
@@ -42,6 +85,7 @@ export declare function buildPlatformCapabilityReport(capabilities: CapabilityCo
|
|
|
42
85
|
platforms: string[];
|
|
43
86
|
premiereVersions: string;
|
|
44
87
|
transport: string;
|
|
88
|
+
apiCoverage: AdobeUxpCoverageReport;
|
|
45
89
|
commands: string[];
|
|
46
90
|
unsupportedCommands: {
|
|
47
91
|
"captions.create": string;
|
|
@@ -59,8 +103,8 @@ export declare function buildPlatformCapabilityReport(capabilities: CapabilityCo
|
|
|
59
103
|
};
|
|
60
104
|
authority: {
|
|
61
105
|
source: "default" | "environment" | "explicit";
|
|
62
|
-
enabled: ("
|
|
63
|
-
disabled: ("
|
|
106
|
+
enabled: ("inspect" | "edit" | "export" | "filesystem" | "unsafe-script")[];
|
|
107
|
+
disabled: ("inspect" | "edit" | "export" | "filesystem" | "unsafe-script")[];
|
|
64
108
|
};
|
|
65
109
|
tools: {
|
|
66
110
|
schemaVersion: number;
|
|
@@ -1,8 +1,146 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
1
2
|
import { tmpdir } from "node:os";
|
|
2
3
|
import { join } from "node:path";
|
|
3
4
|
import { buildToolCapabilityReport, } from "./tool-capability-report.js";
|
|
4
5
|
export const SUPPORTED_HOST_PLATFORMS = ["darwin", "win32"];
|
|
5
6
|
const ALL_CAPABILITIES = ["inspect", "edit", "export", "filesystem", "unsafe-script"];
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
const adobeUxpCoverage = require("./resources/adobe-uxp-coverage.json");
|
|
9
|
+
function asRecord(value, label) {
|
|
10
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
11
|
+
throw new Error(`${label} must be an object`);
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
function stringArray(value, label) {
|
|
16
|
+
if (!Array.isArray(value) || value.length === 0 || value.some((item) => typeof item !== "string" || !item)) {
|
|
17
|
+
throw new Error(`${label} must be a non-empty string array`);
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
function stringValue(value, label) {
|
|
22
|
+
if (typeof value !== "string" || !value)
|
|
23
|
+
throw new Error(`${label} must be a non-empty string`);
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
function validateDocumentationUrl(value, label) {
|
|
27
|
+
let url;
|
|
28
|
+
try {
|
|
29
|
+
url = new URL(value);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
throw new Error(`${label} must be a valid URL`);
|
|
33
|
+
}
|
|
34
|
+
if (url.protocol !== "https:" || url.hostname !== "developer.adobe.com" || !url.pathname.startsWith("/premiere-pro/uxp/")) {
|
|
35
|
+
throw new Error(`${label} must point to the official Premiere Pro UXP documentation`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function validateAdobeUxpCoverageManifest(value) {
|
|
39
|
+
const manifest = asRecord(value, "Adobe UXP coverage manifest");
|
|
40
|
+
if (manifest.schemaVersion !== 1)
|
|
41
|
+
throw new Error("Adobe UXP coverage manifest schemaVersion must be 1");
|
|
42
|
+
const source = asRecord(manifest.source, "Adobe UXP coverage manifest source");
|
|
43
|
+
if (source.apiPackage !== "@adobe/premierepro") {
|
|
44
|
+
throw new Error("Adobe UXP coverage manifest must identify @adobe/premierepro as its source package");
|
|
45
|
+
}
|
|
46
|
+
const apiVersion = stringValue(source.apiVersion, "Adobe UXP coverage manifest source.apiVersion");
|
|
47
|
+
const changelogUrl = stringValue(source.changelogUrl, "Adobe UXP coverage manifest source.changelogUrl");
|
|
48
|
+
validateDocumentationUrl(changelogUrl, "Adobe UXP coverage manifest source.changelogUrl");
|
|
49
|
+
if (!Array.isArray(manifest.entries) || manifest.entries.length === 0) {
|
|
50
|
+
throw new Error("Adobe UXP coverage manifest entries must be a non-empty array");
|
|
51
|
+
}
|
|
52
|
+
const ids = new Set();
|
|
53
|
+
const entries = manifest.entries.map((rawEntry, index) => {
|
|
54
|
+
const label = `Adobe UXP coverage manifest entry ${index}`;
|
|
55
|
+
const entry = asRecord(rawEntry, label);
|
|
56
|
+
const id = stringValue(entry.id, `${label}.id`);
|
|
57
|
+
if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(id) || ids.has(id)) {
|
|
58
|
+
throw new Error(`${label}.id must be a unique kebab-case identifier`);
|
|
59
|
+
}
|
|
60
|
+
ids.add(id);
|
|
61
|
+
const documentationUrls = stringArray(entry.documentationUrls, `${label}.documentationUrls`);
|
|
62
|
+
documentationUrls.forEach((url) => validateDocumentationUrl(url, `${label}.documentationUrls`));
|
|
63
|
+
const availability = entry.availability;
|
|
64
|
+
if (availability !== "current" && availability !== "planned") {
|
|
65
|
+
throw new Error(`${label}.availability must be current or planned`);
|
|
66
|
+
}
|
|
67
|
+
const implementationStatus = entry.implementationStatus;
|
|
68
|
+
if (implementationStatus !== "implemented" && implementationStatus !== "planned") {
|
|
69
|
+
throw new Error(`${label}.implementationStatus must be implemented or planned`);
|
|
70
|
+
}
|
|
71
|
+
const verificationStatus = entry.verificationStatus;
|
|
72
|
+
if (verificationStatus !== "automated_contract_verified"
|
|
73
|
+
&& verificationStatus !== "committed_unverified"
|
|
74
|
+
&& verificationStatus !== "not_started") {
|
|
75
|
+
throw new Error(`${label}.verificationStatus is not supported`);
|
|
76
|
+
}
|
|
77
|
+
const liveHostVerificationStatus = entry.liveHostVerificationStatus;
|
|
78
|
+
if (liveHostVerificationStatus !== "not_run" && liveHostVerificationStatus !== "verified") {
|
|
79
|
+
throw new Error(`${label}.liveHostVerificationStatus is not supported`);
|
|
80
|
+
}
|
|
81
|
+
const idempotency = entry.idempotency;
|
|
82
|
+
if (idempotency !== "operation_id" && idempotency !== "operation_id_when_supported" && idempotency !== "not_applicable") {
|
|
83
|
+
throw new Error(`${label}.idempotency is not supported`);
|
|
84
|
+
}
|
|
85
|
+
if (entry.backend !== "uxp")
|
|
86
|
+
throw new Error(`${label}.backend must be uxp`);
|
|
87
|
+
if (entry.uxpCommand !== null && typeof entry.uxpCommand !== "string") {
|
|
88
|
+
throw new Error(`${label}.uxpCommand must be a string or null`);
|
|
89
|
+
}
|
|
90
|
+
if (typeof entry.mutatesProject !== "boolean" || typeof entry.undoable !== "boolean") {
|
|
91
|
+
throw new Error(`${label} mutation metadata must be boolean`);
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
id,
|
|
95
|
+
adobeApi: stringArray(entry.adobeApi, `${label}.adobeApi`),
|
|
96
|
+
documentationUrls,
|
|
97
|
+
minimumPremiereVersion: stringValue(entry.minimumPremiereVersion, `${label}.minimumPremiereVersion`),
|
|
98
|
+
backend: "uxp",
|
|
99
|
+
uxpCommand: entry.uxpCommand,
|
|
100
|
+
mcpTools: stringArray(entry.mcpTools, `${label}.mcpTools`),
|
|
101
|
+
availability,
|
|
102
|
+
implementationStatus,
|
|
103
|
+
verificationStatus,
|
|
104
|
+
liveHostVerificationStatus,
|
|
105
|
+
mutatesProject: entry.mutatesProject,
|
|
106
|
+
undoable: entry.undoable,
|
|
107
|
+
idempotency,
|
|
108
|
+
verificationBoundary: stringValue(entry.verificationBoundary, `${label}.verificationBoundary`),
|
|
109
|
+
};
|
|
110
|
+
});
|
|
111
|
+
return {
|
|
112
|
+
schemaVersion: 1,
|
|
113
|
+
source: {
|
|
114
|
+
apiPackage: "@adobe/premierepro",
|
|
115
|
+
apiVersion,
|
|
116
|
+
changelogUrl,
|
|
117
|
+
},
|
|
118
|
+
entries,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
export const ADOBE_UXP_COVERAGE_MANIFEST = validateAdobeUxpCoverageManifest(adobeUxpCoverage);
|
|
122
|
+
export function buildAdobeUxpCoverageReport() {
|
|
123
|
+
const entries = ADOBE_UXP_COVERAGE_MANIFEST.entries.map((entry) => ({
|
|
124
|
+
...entry,
|
|
125
|
+
adobeApi: [...entry.adobeApi],
|
|
126
|
+
documentationUrls: [...entry.documentationUrls],
|
|
127
|
+
mcpTools: [...entry.mcpTools],
|
|
128
|
+
}));
|
|
129
|
+
return {
|
|
130
|
+
schemaVersion: ADOBE_UXP_COVERAGE_MANIFEST.schemaVersion,
|
|
131
|
+
source: { ...ADOBE_UXP_COVERAGE_MANIFEST.source },
|
|
132
|
+
entries,
|
|
133
|
+
summary: {
|
|
134
|
+
total: entries.length,
|
|
135
|
+
current: entries.filter((entry) => entry.availability === "current").length,
|
|
136
|
+
planned: entries.filter((entry) => entry.availability === "planned").length,
|
|
137
|
+
implemented: entries.filter((entry) => entry.implementationStatus === "implemented").length,
|
|
138
|
+
committedUnverified: entries.filter((entry) => entry.verificationStatus === "committed_unverified").length,
|
|
139
|
+
automatedContractVerified: entries.filter((entry) => entry.verificationStatus === "automated_contract_verified").length,
|
|
140
|
+
liveHostVerified: entries.filter((entry) => entry.liveHostVerificationStatus === "verified").length,
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
}
|
|
6
144
|
export function platformName(platform) {
|
|
7
145
|
if (platform === "darwin")
|
|
8
146
|
return "macOS";
|
|
@@ -53,6 +191,7 @@ export function buildPlatformCapabilityReport(capabilities, platform = process.p
|
|
|
53
191
|
platforms: ["macOS", "Windows"],
|
|
54
192
|
premiereVersions: "25.6+",
|
|
55
193
|
transport: "loopback WebSocket",
|
|
194
|
+
apiCoverage: buildAdobeUxpCoverageReport(),
|
|
56
195
|
commands: [
|
|
57
196
|
"capabilities.get",
|
|
58
197
|
"state.get",
|