premiere-cli 0.2.0__tar.gz → 0.3.1__tar.gz
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.
- {premiere_cli-0.2.0/src/premiere_cli.egg-info → premiere_cli-0.3.1}/PKG-INFO +13 -8
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/README.md +12 -7
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/pyproject.toml +2 -1
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/__init__.py +1 -1
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/cli.py +18 -0
- premiere_cli-0.3.1/src/premiere_cli/init_project.py +73 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/.debug +1 -1
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/CSXS/manifest.xml +3 -3
- premiere_cli-0.3.1/src/premiere_cli/panel/host/commands/export-frame.jsx +257 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/js/main.js +1 -1
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel_install.py +1 -1
- premiere_cli-0.3.1/src/premiere_cli/templates/empty-project/Adobe Premiere Pro Auto-Save/Untitled--8627e8e5-eccf-e7ea-8c87-b4de7f17596a-2026-07-10_12-30-47.prproj +0 -0
- premiere_cli-0.3.1/src/premiere_cli/templates/empty-project/Untitled.prproj +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1/src/premiere_cli.egg-info}/PKG-INFO +13 -8
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli.egg-info/SOURCES.txt +3 -0
- premiere_cli-0.2.0/src/premiere_cli/panel/host/commands/export-frame.jsx +0 -381
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/LICENSE +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/setup.cfg +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/log.py +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/css/style.css +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/add-adjustment-layer.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/add-audio-keyframes.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/add-custom-metadata-field.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/add-keyframe.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/add-marker-to-project-item.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/add-marker.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/add-text-overlay.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/add-to-render-queue.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/add-to-timeline.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/add-track.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/add-transition.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/adjust-audio-levels.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/apply-audio-effect.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/apply-effect.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/apply-lut.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/attach-custom-property.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/auto-reframe-sequence.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/batch-add-transitions.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/batch-apply-effect.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/batch-rename-clips.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/batch-set-clips-enabled.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/clear-item-in-out.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/clear-sequence-in-out.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/close-all-source-clips.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/close-sequence.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/close-source-monitor.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/color-correct.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/copy-effect-values.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/copy-effects-between-clips.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/create-bars-and-tone.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/create-bin.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/create-caption-track.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/create-sequence-from-clips.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/create-sequence-from-preset.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/create-sequence.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/create-smart-bin.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/create-subclip.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/create-subsequence.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/debug-qe-inspect.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/debug-qe-try-mutate.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/delete-marker.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/deselect-all-clips.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/detach-proxy.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/duplicate-clip.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/duplicate-sequence.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/encode-file.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/encode-project-item.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/export-aaf.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/export-fcp-xml.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/export-omf.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/export-sequence-as-project.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/export-sequence.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/extract-audio-track.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/extract-selection.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/find-items-by-media-path.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/freeze-frame.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-active-sequence.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-all-project-paths.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-bin-contents.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-clip-adjustment-layer.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-clip-at-playhead.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-clip-at-position.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-clip-links.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-clip-markers.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-clip-speed.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-color-label.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-color-space.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-duplicate-media.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-effect-properties.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-encoder-presets.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-export-file-extension.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-footage-interpretation.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-full-clip-info.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-full-project-overview.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-full-sequence-info.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-graphics-white-luminance.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-insertion-bin.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-item-metadata.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-keyframes.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-mogrt-component.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-next-edit-point.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-offline-media.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-open-projects.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-premiere-state.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-project-info.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-project-item-info.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-project-panel-metadata.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-qe-clip-info.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-render-queue-status.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-sequence-count.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-sequence-in-out.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-sequence-markers-by-type.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-source-monitor-info.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-source-monitor-position.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-target-tracks.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-timeline-gaps.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-timeline-summary.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-total-clip-count.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-track-info.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-unused-media.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-used-media-report.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-value-at-time.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-version-info.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-work-area.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-workspaces.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/get-xmp-metadata.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/import-ae-comps.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/import-fcp-xml.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/import-folder.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/import-image-sequence.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/import-media.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/import-mogrt-from-library.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/import-mogrt.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/import-sequences-from-project.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/insert-from-source.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/inspect-dom-object.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/invert-selection.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/is-work-area-enabled.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/lift-selection.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/link-selection.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/list-available-audio-effects.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/list-available-audio-transitions.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/list-available-effects.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/list-available-transitions.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/list-markers.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/list-project-items.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/lock-track.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/manage-proxies.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/match-frame.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/move-clip-to-track.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/move-clip.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/move-items-to-bin.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/move-playhead-to-edit.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/move-playhead.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/nest-clips.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/open-in-source.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/open-project.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/overwrite-clip-at.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/overwrite-from-source.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/play-source-monitor.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/play-timeline.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/razor-all-tracks.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/redo.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/refresh-media.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/relink-media.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/remove-all-effects.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/remove-effect-by-name.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/remove-effect.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/remove-from-timeline.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/remove-keyframe-range.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/remove-keyframe.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/remove-selected-clips.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/remove-track-intervals.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/remove-transition.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/rename-bin.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/rename-clip.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/rename-project-item.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/rename-track.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/replace-clip-media.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/replace-clip.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/reverse-clip.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/ripple-delete-clip.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/roll-edit.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/save-project-as.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/save-project.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/scene-edit-detection.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/search-project-items.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/select-all-clips.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/select-clips-by-color.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/select-clips-by-name.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/select-clips-in-range.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/select-disabled-clips.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/select-project-item.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-active-project.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-active-sequence.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-all-tracks-targeted.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-anti-alias-quality.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-blend-mode.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-clip-anchor-point.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-clip-enabled.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-clip-opacity.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-clip-pan.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-clip-position.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-clip-properties.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-clip-rotation.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-clip-scale.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-clip-selection.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-clip-speed.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-clip-volume.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-color-label.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-color-value.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-effect-property.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-footage-interpretation.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-frame-blend.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-graphics-white-luminance.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-item-in-out.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-item-metadata.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-item-offline.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-item-start-time.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-keyframe-interpolation.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-override-frame-rate.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-override-pixel-aspect-ratio.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-poster-frame.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-project-panel-metadata.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-scale-to-frame-size.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-scale-width-height.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-sequence-in-out.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-sequence-settings.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-source-in-out.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-target-track.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-time-interpolation.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-track-mute.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-track-visibility.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-transcode-on-ingest.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-uniform-scale.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-work-area.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-workspace.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/set-xmp-metadata.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/slide-edit.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/slip-edit.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/split-clip.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/stabilize-clip.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/stop-playback.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/trim-clip.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/undo.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/unlink-selection.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/unnest-sequence.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/commands/update-marker.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/index.jsx +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/host/presets/default-4k-25fps.sqpreset +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/index.html +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli/panel/js/cs-interface.js +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli.egg-info/dependency_links.txt +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli.egg-info/entry_points.txt +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli.egg-info/requires.txt +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/src/premiere_cli.egg-info/top_level.txt +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/tests/test_cli.py +0 -0
- {premiere_cli-0.2.0 → premiere_cli-0.3.1}/tests/test_log.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: premiere-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.1
|
|
4
4
|
Summary: Drive Adobe Premiere Pro from the command line: a Python CLI plus a bundled CEP bridge panel exposing Premiere's scripting APIs over local HTTP
|
|
5
5
|
License: CC-BY-SA-4.0
|
|
6
6
|
Project-URL: Repository, https://github.com/stefanwebb/premiere-cli
|
|
@@ -22,16 +22,17 @@ ExtendScript / QE scripting APIs as ~230 JSON-in/JSON-out commands —
|
|
|
22
22
|
reading project/sequence/clip state, editing the timeline, applying
|
|
23
23
|
effects, managing markers and bins, exporting media and frames, and more.
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
The Claude Code skill for driving this CLI lives in the separate
|
|
26
|
+
[premiere-ai-skills](https://github.com/stefanwebb/premiere-ai-skills)
|
|
27
|
+
plugin, alongside the AI-assisted workflow skills — install that plugin
|
|
28
|
+
to give Claude the skill.
|
|
28
29
|
|
|
29
30
|
## Install
|
|
30
31
|
|
|
31
32
|
```bash
|
|
32
33
|
# 1. The CLI (isolated, no dependencies)
|
|
33
|
-
pipx install
|
|
34
|
-
# or: uv tool install
|
|
34
|
+
pipx install premiere-cli
|
|
35
|
+
# or: uv tool install premiere-cli
|
|
35
36
|
|
|
36
37
|
# 2. The CEP panel (copies it into Adobe's extensions dir + enables PlayerDebugMode)
|
|
37
38
|
premiere-cli install-panel
|
|
@@ -42,6 +43,10 @@ premiere-cli install-panel
|
|
|
42
43
|
premiere-cli doctor
|
|
43
44
|
```
|
|
44
45
|
|
|
46
|
+
`premiere-cli init-project <name> --base-dir <path>` scaffolds a fresh,
|
|
47
|
+
empty `.prproj` from a bundled template — no Premiere Pro session needed,
|
|
48
|
+
so it works before step 3.
|
|
49
|
+
|
|
45
50
|
Supported: macOS and Windows (CEP does not exist on Linux). The panel
|
|
46
51
|
targets Premiere Pro 2020+ (CEP 10-12); the API behavior notes in
|
|
47
52
|
[docs/BUILD_FINDINGS.md](docs/BUILD_FINDINGS.md) were live-calibrated on
|
|
@@ -65,8 +70,8 @@ Every command prints a JSON object: `{"ok": true, "result": ...}` or
|
|
|
65
70
|
## Use from Claude Code
|
|
66
71
|
|
|
67
72
|
```
|
|
68
|
-
/plugin marketplace add stefanwebb/premiere-
|
|
69
|
-
/plugin install premiere-
|
|
73
|
+
/plugin marketplace add stefanwebb/premiere-ai-skills
|
|
74
|
+
/plugin install premiere-ai-skills@premiere-ai-skills
|
|
70
75
|
```
|
|
71
76
|
|
|
72
77
|
This gives Claude the `premiere-cli` skill — a complete, behavior-annotated
|
|
@@ -9,16 +9,17 @@ ExtendScript / QE scripting APIs as ~230 JSON-in/JSON-out commands —
|
|
|
9
9
|
reading project/sequence/clip state, editing the timeline, applying
|
|
10
10
|
effects, managing markers and bins, exporting media and frames, and more.
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
The Claude Code skill for driving this CLI lives in the separate
|
|
13
|
+
[premiere-ai-skills](https://github.com/stefanwebb/premiere-ai-skills)
|
|
14
|
+
plugin, alongside the AI-assisted workflow skills — install that plugin
|
|
15
|
+
to give Claude the skill.
|
|
15
16
|
|
|
16
17
|
## Install
|
|
17
18
|
|
|
18
19
|
```bash
|
|
19
20
|
# 1. The CLI (isolated, no dependencies)
|
|
20
|
-
pipx install
|
|
21
|
-
# or: uv tool install
|
|
21
|
+
pipx install premiere-cli
|
|
22
|
+
# or: uv tool install premiere-cli
|
|
22
23
|
|
|
23
24
|
# 2. The CEP panel (copies it into Adobe's extensions dir + enables PlayerDebugMode)
|
|
24
25
|
premiere-cli install-panel
|
|
@@ -29,6 +30,10 @@ premiere-cli install-panel
|
|
|
29
30
|
premiere-cli doctor
|
|
30
31
|
```
|
|
31
32
|
|
|
33
|
+
`premiere-cli init-project <name> --base-dir <path>` scaffolds a fresh,
|
|
34
|
+
empty `.prproj` from a bundled template — no Premiere Pro session needed,
|
|
35
|
+
so it works before step 3.
|
|
36
|
+
|
|
32
37
|
Supported: macOS and Windows (CEP does not exist on Linux). The panel
|
|
33
38
|
targets Premiere Pro 2020+ (CEP 10-12); the API behavior notes in
|
|
34
39
|
[docs/BUILD_FINDINGS.md](docs/BUILD_FINDINGS.md) were live-calibrated on
|
|
@@ -52,8 +57,8 @@ Every command prints a JSON object: `{"ok": true, "result": ...}` or
|
|
|
52
57
|
## Use from Claude Code
|
|
53
58
|
|
|
54
59
|
```
|
|
55
|
-
/plugin marketplace add stefanwebb/premiere-
|
|
56
|
-
/plugin install premiere-
|
|
60
|
+
/plugin marketplace add stefanwebb/premiere-ai-skills
|
|
61
|
+
/plugin install premiere-ai-skills@premiere-ai-skills
|
|
57
62
|
```
|
|
58
63
|
|
|
59
64
|
This gives Claude the `premiere-cli` skill — a complete, behavior-annotated
|
|
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
|
|
|
6
6
|
name = "premiere-cli"
|
|
7
7
|
# Keep in lockstep with premiere_cli.__version__ and PANEL_VERSION in
|
|
8
8
|
# src/premiere_cli/panel/js/main.js.
|
|
9
|
-
version = "0.
|
|
9
|
+
version = "0.3.1"
|
|
10
10
|
description = "Drive Adobe Premiere Pro from the command line: a Python CLI plus a bundled CEP bridge panel exposing Premiere's scripting APIs over local HTTP"
|
|
11
11
|
readme = "README.md"
|
|
12
12
|
license = {text = "CC-BY-SA-4.0"}
|
|
@@ -34,4 +34,5 @@ where = ["src"]
|
|
|
34
34
|
premiere_cli = [
|
|
35
35
|
"panel/**/*",
|
|
36
36
|
"panel/.debug",
|
|
37
|
+
"templates/**/*",
|
|
37
38
|
]
|
|
@@ -104,6 +104,20 @@ def main() -> None:
|
|
|
104
104
|
help="Diagnose the CLI -> panel -> Premiere chain: panel installed, panel reachable, versions matching, Premiere responding",
|
|
105
105
|
)
|
|
106
106
|
|
|
107
|
+
init_project_parser = subparsers.add_parser(
|
|
108
|
+
"init-project",
|
|
109
|
+
help="Create a fresh, empty Premiere Pro project from the bundled empty-project template",
|
|
110
|
+
)
|
|
111
|
+
init_project_parser.add_argument("project_name", help="Name of the new project, e.g. project0002")
|
|
112
|
+
init_project_parser.add_argument(
|
|
113
|
+
"--series", default=None,
|
|
114
|
+
help="Optional series name; the project is nested under <base-dir>/<series>/<project_name>",
|
|
115
|
+
)
|
|
116
|
+
init_project_parser.add_argument(
|
|
117
|
+
"--base-dir", required=True,
|
|
118
|
+
help="Directory the project (or series) is created under",
|
|
119
|
+
)
|
|
120
|
+
|
|
107
121
|
create_sequence_parser = subparsers.add_parser("create-sequence", help="Create a new sequence")
|
|
108
122
|
create_sequence_parser.add_argument("--name", required=True, help="Name of the new sequence")
|
|
109
123
|
create_sequence_parser.add_argument(
|
|
@@ -2155,6 +2169,10 @@ def main() -> None:
|
|
|
2155
2169
|
from premiere_cli import panel_install
|
|
2156
2170
|
|
|
2157
2171
|
sys.exit(panel_install.doctor(port=args.port))
|
|
2172
|
+
if args.subcommand == "init-project":
|
|
2173
|
+
from premiere_cli import init_project
|
|
2174
|
+
|
|
2175
|
+
sys.exit(init_project.init_project(args.project_name, args.series, args.base_dir))
|
|
2158
2176
|
|
|
2159
2177
|
if args.subcommand == "create-sequence":
|
|
2160
2178
|
command_args = {"name": args.name, "bin": args.bin, "fps": args.fps, "width": args.width, "height": args.height}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""Create a fresh, empty Premiere Pro project from the bundled empty-project
|
|
2
|
+
template.
|
|
3
|
+
|
|
4
|
+
The template (``premiere_cli/templates/empty-project/``) ships inside this
|
|
5
|
+
package, so ``premiere-cli init-project`` works from any checkout/install
|
|
6
|
+
without needing access to a shared drive.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import os
|
|
11
|
+
import shutil
|
|
12
|
+
from importlib import resources
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _template_dir() -> str:
|
|
16
|
+
"""Filesystem path of the empty-project template bundled inside this package."""
|
|
17
|
+
template = resources.files("premiere_cli") / "templates" / "empty-project"
|
|
18
|
+
path = str(template)
|
|
19
|
+
if not os.path.isdir(path):
|
|
20
|
+
raise RuntimeError(
|
|
21
|
+
f"bundled empty-project template not found at {path} — broken installation?"
|
|
22
|
+
)
|
|
23
|
+
return path
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def create_project(project_name: str, dest_dir: str) -> str:
|
|
27
|
+
"""Copy the bundled empty-project template into dest_dir and rename its
|
|
28
|
+
.prproj file to '<project_name>.prproj'. Returns dest_dir.
|
|
29
|
+
|
|
30
|
+
Raises RuntimeError if dest_dir already exists or the template doesn't
|
|
31
|
+
contain exactly one .prproj file.
|
|
32
|
+
"""
|
|
33
|
+
template_dir = _template_dir()
|
|
34
|
+
|
|
35
|
+
if os.path.exists(dest_dir):
|
|
36
|
+
raise RuntimeError(f"destination already exists, refusing to overwrite: {dest_dir}")
|
|
37
|
+
|
|
38
|
+
shutil.copytree(template_dir, dest_dir)
|
|
39
|
+
|
|
40
|
+
# Copying across some filesystems (e.g. exFAT external drives) emits
|
|
41
|
+
# AppleDouble sidecar files (e.g. "._Untitled.prproj") for xattrs/resource
|
|
42
|
+
# forks. Strip them from the copy so they don't get mistaken for real files.
|
|
43
|
+
for root, _dirs, files in os.walk(dest_dir):
|
|
44
|
+
for f in files:
|
|
45
|
+
if f.startswith("._"):
|
|
46
|
+
os.remove(os.path.join(root, f))
|
|
47
|
+
|
|
48
|
+
prproj_files = [f for f in os.listdir(dest_dir) if f.endswith(".prproj")]
|
|
49
|
+
if len(prproj_files) != 1:
|
|
50
|
+
raise RuntimeError(
|
|
51
|
+
f"expected exactly one .prproj file in the template, found {len(prproj_files)}: {prproj_files}"
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
old_path = os.path.join(dest_dir, prproj_files[0])
|
|
55
|
+
new_path = os.path.join(dest_dir, f"{project_name}.prproj")
|
|
56
|
+
os.rename(old_path, new_path)
|
|
57
|
+
|
|
58
|
+
return dest_dir
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def init_project(project_name: str, series_name: str | None, base_dir: str) -> int:
|
|
62
|
+
"""CLI entry point: build the destination path and create the project,
|
|
63
|
+
printing a JSON result. Returns the process exit code."""
|
|
64
|
+
dest_dir = os.path.join(base_dir, series_name, project_name) if series_name else os.path.join(base_dir, project_name)
|
|
65
|
+
|
|
66
|
+
try:
|
|
67
|
+
create_project(project_name, dest_dir)
|
|
68
|
+
except RuntimeError as exc:
|
|
69
|
+
print(json.dumps({"ok": False, "error": str(exc)}))
|
|
70
|
+
return 1
|
|
71
|
+
|
|
72
|
+
print(json.dumps({"ok": True, "projectDir": dest_dir}))
|
|
73
|
+
return 0
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<ExtensionManifest Version="7.0" ExtensionBundleId="com.
|
|
2
|
+
<ExtensionManifest Version="7.0" ExtensionBundleId="com.stefanwebb.premierecli" ExtensionBundleVersion="1.0.0" ExtensionBundleName="Premiere Bridge">
|
|
3
3
|
<ExtensionList>
|
|
4
|
-
<Extension Id="com.
|
|
4
|
+
<Extension Id="com.stefanwebb.premierecli.panel" Version="1.0.0" />
|
|
5
5
|
</ExtensionList>
|
|
6
6
|
<ExecutionEnvironment>
|
|
7
7
|
<HostList>
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
</RequiredRuntimeList>
|
|
16
16
|
</ExecutionEnvironment>
|
|
17
17
|
<DispatchInfoList>
|
|
18
|
-
<Extension Id="com.
|
|
18
|
+
<Extension Id="com.stefanwebb.premierecli.panel">
|
|
19
19
|
<DispatchInfo>
|
|
20
20
|
<Resources>
|
|
21
21
|
<MainPath>./index.html</MainPath>
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
// Command: export-frame → ppb_exportFrame
|
|
2
|
+
// Loaded lazily by ppb_dispatch (host/index.jsx) on first use, into the
|
|
3
|
+
// same global ExtendScript context — shared helpers (findSequenceByName,
|
|
4
|
+
// findBundledPresetByRelativePath, trySetSequenceRange, getSequenceFps,
|
|
5
|
+
// timecodeToSeconds, ...) are already defined there.
|
|
6
|
+
|
|
7
|
+
// A bundled still-image preset for the AME single-frame export below —
|
|
8
|
+
// confirmed present on this machine's Premiere Pro 2026 install at this
|
|
9
|
+
// relative path; re-verify after a Premiere version upgrade, same caveat
|
|
10
|
+
// as extract-audio-track's FORMAT_PRESET_RELATIVE_PATHS. "Match Source"
|
|
11
|
+
// means the preset inherits the sequence's own frame size, so no
|
|
12
|
+
// width/height override is needed when using it.
|
|
13
|
+
var STILL_IMAGE_PRESET_RELATIVE_PATH =
|
|
14
|
+
"Contents/MediaIO/systempresets/3F3F3F3F_504E4720/PNG Sequence (Match Source).epr";
|
|
15
|
+
|
|
16
|
+
// Premiere treats a still-image preset as a one-frame image *sequence*,
|
|
17
|
+
// appending a frame number to the base name ("frame.png" → "frame0.png",
|
|
18
|
+
// confirmed live; padding may vary by preset/duration). Finds whichever
|
|
19
|
+
// variant was actually written and renames it to the exact requested path
|
|
20
|
+
// so callers reliably get the file where they asked for it.
|
|
21
|
+
//
|
|
22
|
+
// Known variants are checked DIRECTLY by path, not found via a directory
|
|
23
|
+
// scan: enumerating the parent directory returns an empty list on this
|
|
24
|
+
// machine for some directories (e.g. /tmp — same macOS TCC/sandboxing
|
|
25
|
+
// behavior already documented for /Applications in
|
|
26
|
+
// findBundledPresetByRelativePath's notes in host/index.jsx) even though
|
|
27
|
+
// the files themselves are readable at their exact paths. A directory
|
|
28
|
+
// scan runs only as a last resort, for variant names not in the known
|
|
29
|
+
// list.
|
|
30
|
+
function locateAndNormalizeExportedFrame(outputPath) {
|
|
31
|
+
var exact = new File(outputPath);
|
|
32
|
+
if (exact.exists && exact.length > 0) {
|
|
33
|
+
return exact;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
var fullName = decodeURI(exact.name);
|
|
37
|
+
var dot = fullName.lastIndexOf(".");
|
|
38
|
+
var base = dot === -1 ? fullName : fullName.substring(0, dot);
|
|
39
|
+
var ext = dot === -1 ? "" : fullName.substring(dot);
|
|
40
|
+
var parentPath = exact.path;
|
|
41
|
+
|
|
42
|
+
function normalize(produced) {
|
|
43
|
+
if (produced.length <= 0) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
if (produced.fsName !== exact.fsName) {
|
|
48
|
+
produced.rename(fullName);
|
|
49
|
+
}
|
|
50
|
+
} catch (e) {
|
|
51
|
+
// rename best-effort — still report the file under whatever name it has
|
|
52
|
+
return produced;
|
|
53
|
+
}
|
|
54
|
+
return exact.exists ? exact : produced;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
var knownVariants = [
|
|
58
|
+
parentPath + "/" + base + "0" + ext, // AME frame-number suffix
|
|
59
|
+
parentPath + "/" + base + "00" + ext,
|
|
60
|
+
parentPath + "/" + base + "000" + ext,
|
|
61
|
+
parentPath + "/" + base + "0000" + ext
|
|
62
|
+
];
|
|
63
|
+
for (var v = 0; v < knownVariants.length; v++) {
|
|
64
|
+
var candidate = new File(knownVariants[v]);
|
|
65
|
+
if (candidate.exists && candidate.length > 0) {
|
|
66
|
+
return normalize(candidate);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Last resort: scan the parent directory (returns nothing at all in
|
|
71
|
+
// enumeration-blocked directories — see comment above).
|
|
72
|
+
var dir = exact.parent;
|
|
73
|
+
if (!dir || !dir.exists) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
var matches = dir.getFiles(function (item) {
|
|
78
|
+
if (item instanceof Folder) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
var name = decodeURI(item.name);
|
|
82
|
+
if (name.indexOf(base) !== 0) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
var lowerExt = ext.toLowerCase();
|
|
86
|
+
return lowerExt === "" || name.toLowerCase().substring(name.length - lowerExt.length) === lowerExt;
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
if (!matches || matches.length === 0) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return normalize(matches[0]);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Exports a single frame of a sequence, at a given timecode, to a PNG file.
|
|
97
|
+
//
|
|
98
|
+
// qe.project.getActiveSequence().exportFramePNG was tried first in an
|
|
99
|
+
// earlier version of this command (guessing at its version-dependent arg
|
|
100
|
+
// order per PREMIERE_API_NOTES.md), judging success only by whether a file
|
|
101
|
+
// was produced. That check is NOT sufficient: confirmed live 2026-07-20
|
|
102
|
+
// that on this Premiere build, exportFramePNG ignores its position
|
|
103
|
+
// argument in every arg-order variant tried (ticksString, Time object,
|
|
104
|
+
// output-path-as-position, ticks-then-path, path-then-ticks) and always
|
|
105
|
+
// exports whatever frame is currently rendered in the Program Monitor,
|
|
106
|
+
// regardless of the requested timecode — while still writing a real file
|
|
107
|
+
// and returning normally, so the file-existence check reported false
|
|
108
|
+
// positives. Two exports requested 30 seconds apart came back
|
|
109
|
+
// pixel-identical. Neither seq.setPlayerPosition() (standard DOM) nor
|
|
110
|
+
// qeSequence.setCTI() (QE DOM) changed this.
|
|
111
|
+
//
|
|
112
|
+
// This command now exports exclusively via Adobe Media Encoder's
|
|
113
|
+
// exportAsMediaDirect() — the same documented, blocking mechanism
|
|
114
|
+
// ppb_extractAudioTrack already uses successfully — narrowing the
|
|
115
|
+
// sequence's in/out points to exactly one frame around the target
|
|
116
|
+
// timecode. Confirmed live to produce genuinely different, timecode-
|
|
117
|
+
// correct frames (verified via pixel diff, not just file existence).
|
|
118
|
+
function ppb_exportFrame(argsJson) {
|
|
119
|
+
try {
|
|
120
|
+
var args;
|
|
121
|
+
try {
|
|
122
|
+
args = JSON.parse(argsJson);
|
|
123
|
+
} catch (e) {
|
|
124
|
+
return JSON.stringify({ ok: false, error: "invalid args JSON: " + e.toString() });
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (!args.outputPath || typeof args.outputPath !== "string") {
|
|
128
|
+
return JSON.stringify({ ok: false, error: "outputPath is required" });
|
|
129
|
+
}
|
|
130
|
+
var timecodeRe = /^\d{2,3}:\d{2}:\d{2}$/;
|
|
131
|
+
if (!args.timecode || typeof args.timecode !== "string" || !timecodeRe.test(args.timecode)) {
|
|
132
|
+
return JSON.stringify({ ok: false, error: "timecode must be a \"MM:SS:FF\" string" });
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (!app.project) {
|
|
136
|
+
return JSON.stringify({ ok: false, error: "no project open" });
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
var seq = null;
|
|
140
|
+
if (args.sequenceName && typeof args.sequenceName === "string") {
|
|
141
|
+
seq = findSequenceByName(args.sequenceName);
|
|
142
|
+
if (!seq) {
|
|
143
|
+
return JSON.stringify({ ok: false, error: "no sequence named \"" + args.sequenceName + "\" is open" });
|
|
144
|
+
}
|
|
145
|
+
} else {
|
|
146
|
+
seq = app.project.activeSequence;
|
|
147
|
+
if (!seq) {
|
|
148
|
+
return JSON.stringify({ ok: false, error: "no active sequence, and no sequenceName given" });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (app.project.activeSequence !== seq) {
|
|
153
|
+
app.project.activeSequence = seq;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
var fps = getSequenceFps(seq);
|
|
157
|
+
var timeSeconds = timecodeToSeconds(args.timecode, fps);
|
|
158
|
+
|
|
159
|
+
var width = null;
|
|
160
|
+
var height = null;
|
|
161
|
+
try {
|
|
162
|
+
var settings = seq.getSettings();
|
|
163
|
+
width = settings.videoFrameWidth;
|
|
164
|
+
height = settings.videoFrameHeight;
|
|
165
|
+
} catch (e) {
|
|
166
|
+
// best-effort only — reported in the result, not required for export
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
var result = {
|
|
170
|
+
sequenceName: seq.name,
|
|
171
|
+
timecode: args.timecode,
|
|
172
|
+
timeSeconds: timeSeconds,
|
|
173
|
+
outputPath: args.outputPath,
|
|
174
|
+
width: width,
|
|
175
|
+
height: height
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
// Clear any stale leftover from an earlier failed run — the exact
|
|
179
|
+
// requested path plus every known frame-numbered variant Premiere
|
|
180
|
+
// might write it under (see locateAndNormalizeExportedFrame) — so a
|
|
181
|
+
// leftover file's mere existence can't be mistaken for this run's
|
|
182
|
+
// output.
|
|
183
|
+
for (var staleRound = 0; staleRound < 8; staleRound++) {
|
|
184
|
+
var stale = locateAndNormalizeExportedFrame(args.outputPath);
|
|
185
|
+
if (stale === null) {
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
stale.remove();
|
|
190
|
+
} catch (e) {
|
|
191
|
+
// best-effort — a failed cleanup doesn't block the export attempt
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
var amePresetPath = findBundledPresetByRelativePath(STILL_IMAGE_PRESET_RELATIVE_PATH);
|
|
197
|
+
if (!amePresetPath) {
|
|
198
|
+
return JSON.stringify({
|
|
199
|
+
ok: false,
|
|
200
|
+
error: "no bundled still-image preset found for the Media Encoder export"
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
var originalInPoint = null;
|
|
205
|
+
var originalOutPoint = null;
|
|
206
|
+
try {
|
|
207
|
+
originalInPoint = seq.getInPoint();
|
|
208
|
+
originalOutPoint = seq.getOutPoint();
|
|
209
|
+
} catch (e) {
|
|
210
|
+
// best-effort only — if these can't be read, we simply won't restore them
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
var frameDurationSeconds = 1 / fps;
|
|
214
|
+
var ameProducedFile = null;
|
|
215
|
+
var ameError = null;
|
|
216
|
+
|
|
217
|
+
try {
|
|
218
|
+
var rangeOutcome = trySetSequenceRange(seq, timeSeconds, timeSeconds + frameDurationSeconds);
|
|
219
|
+
if (!rangeOutcome.ok) {
|
|
220
|
+
ameError = "could not set sequence in/out points with any known argument form (seconds, ticks string, Time object)";
|
|
221
|
+
} else {
|
|
222
|
+
try {
|
|
223
|
+
seq.exportAsMediaDirect(args.outputPath, amePresetPath, 1 /* ENCODE_IN_TO_OUT */);
|
|
224
|
+
} catch (e) {
|
|
225
|
+
ameError = "exportAsMediaDirect failed: " + e.toString();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
} finally {
|
|
229
|
+
if (originalInPoint !== null && originalOutPoint !== null) {
|
|
230
|
+
try {
|
|
231
|
+
trySetSequenceRange(seq, originalInPoint.seconds, originalOutPoint.seconds);
|
|
232
|
+
} catch (e) {
|
|
233
|
+
// best-effort
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (ameError === null) {
|
|
239
|
+
ameProducedFile = locateAndNormalizeExportedFrame(args.outputPath);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (ameProducedFile === null) {
|
|
243
|
+
return JSON.stringify({
|
|
244
|
+
ok: false,
|
|
245
|
+
error: "Media Encoder export failed" + (ameError ? ": " + ameError : " (no file produced)")
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
result.method = "ame";
|
|
250
|
+
result.presetPath = amePresetPath;
|
|
251
|
+
result.fileSizeBytes = ameProducedFile.length;
|
|
252
|
+
|
|
253
|
+
return JSON.stringify({ ok: true, result: result });
|
|
254
|
+
} catch (e) {
|
|
255
|
+
return JSON.stringify({ ok: false, error: e.toString() });
|
|
256
|
+
}
|
|
257
|
+
}
|
|
@@ -5,7 +5,7 @@ const PORT = 47823;
|
|
|
5
5
|
// Kept in lockstep with the premiere-cli Python package version —
|
|
6
6
|
// `premiere-cli doctor` compares the two and warns when the installed
|
|
7
7
|
// panel is stale relative to the CLI that ships it.
|
|
8
|
-
const PANEL_VERSION = '0.
|
|
8
|
+
const PANEL_VERSION = '0.3.1';
|
|
9
9
|
const VALID_LEVELS = ['info', 'warn', 'error'];
|
|
10
10
|
|
|
11
11
|
// main.js is loaded via a plain <script src="js/main.js"> tag, not
|
|
@@ -16,7 +16,7 @@ import urllib.error
|
|
|
16
16
|
import urllib.request
|
|
17
17
|
from importlib import resources
|
|
18
18
|
|
|
19
|
-
EXTENSION_ID = "com.
|
|
19
|
+
EXTENSION_ID = "com.stefanwebb.premierecli"
|
|
20
20
|
DEFAULT_PORT = 47823
|
|
21
21
|
|
|
22
22
|
# CSXS major versions to enable PlayerDebugMode for. Premiere 2020-2022 use
|
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: premiere-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.1
|
|
4
4
|
Summary: Drive Adobe Premiere Pro from the command line: a Python CLI plus a bundled CEP bridge panel exposing Premiere's scripting APIs over local HTTP
|
|
5
5
|
License: CC-BY-SA-4.0
|
|
6
6
|
Project-URL: Repository, https://github.com/stefanwebb/premiere-cli
|
|
@@ -22,16 +22,17 @@ ExtendScript / QE scripting APIs as ~230 JSON-in/JSON-out commands —
|
|
|
22
22
|
reading project/sequence/clip state, editing the timeline, applying
|
|
23
23
|
effects, managing markers and bins, exporting media and frames, and more.
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
The Claude Code skill for driving this CLI lives in the separate
|
|
26
|
+
[premiere-ai-skills](https://github.com/stefanwebb/premiere-ai-skills)
|
|
27
|
+
plugin, alongside the AI-assisted workflow skills — install that plugin
|
|
28
|
+
to give Claude the skill.
|
|
28
29
|
|
|
29
30
|
## Install
|
|
30
31
|
|
|
31
32
|
```bash
|
|
32
33
|
# 1. The CLI (isolated, no dependencies)
|
|
33
|
-
pipx install
|
|
34
|
-
# or: uv tool install
|
|
34
|
+
pipx install premiere-cli
|
|
35
|
+
# or: uv tool install premiere-cli
|
|
35
36
|
|
|
36
37
|
# 2. The CEP panel (copies it into Adobe's extensions dir + enables PlayerDebugMode)
|
|
37
38
|
premiere-cli install-panel
|
|
@@ -42,6 +43,10 @@ premiere-cli install-panel
|
|
|
42
43
|
premiere-cli doctor
|
|
43
44
|
```
|
|
44
45
|
|
|
46
|
+
`premiere-cli init-project <name> --base-dir <path>` scaffolds a fresh,
|
|
47
|
+
empty `.prproj` from a bundled template — no Premiere Pro session needed,
|
|
48
|
+
so it works before step 3.
|
|
49
|
+
|
|
45
50
|
Supported: macOS and Windows (CEP does not exist on Linux). The panel
|
|
46
51
|
targets Premiere Pro 2020+ (CEP 10-12); the API behavior notes in
|
|
47
52
|
[docs/BUILD_FINDINGS.md](docs/BUILD_FINDINGS.md) were live-calibrated on
|
|
@@ -65,8 +70,8 @@ Every command prints a JSON object: `{"ok": true, "result": ...}` or
|
|
|
65
70
|
## Use from Claude Code
|
|
66
71
|
|
|
67
72
|
```
|
|
68
|
-
/plugin marketplace add stefanwebb/premiere-
|
|
69
|
-
/plugin install premiere-
|
|
73
|
+
/plugin marketplace add stefanwebb/premiere-ai-skills
|
|
74
|
+
/plugin install premiere-ai-skills@premiere-ai-skills
|
|
70
75
|
```
|
|
71
76
|
|
|
72
77
|
This gives Claude the `premiere-cli` skill — a complete, behavior-annotated
|
|
@@ -3,6 +3,7 @@ README.md
|
|
|
3
3
|
pyproject.toml
|
|
4
4
|
src/premiere_cli/__init__.py
|
|
5
5
|
src/premiere_cli/cli.py
|
|
6
|
+
src/premiere_cli/init_project.py
|
|
6
7
|
src/premiere_cli/log.py
|
|
7
8
|
src/premiere_cli/panel_install.py
|
|
8
9
|
src/premiere_cli.egg-info/PKG-INFO
|
|
@@ -248,5 +249,7 @@ src/premiere_cli/panel/host/commands/update-marker.jsx
|
|
|
248
249
|
src/premiere_cli/panel/host/presets/default-4k-25fps.sqpreset
|
|
249
250
|
src/premiere_cli/panel/js/cs-interface.js
|
|
250
251
|
src/premiere_cli/panel/js/main.js
|
|
252
|
+
src/premiere_cli/templates/empty-project/Untitled.prproj
|
|
253
|
+
src/premiere_cli/templates/empty-project/Adobe Premiere Pro Auto-Save/Untitled--8627e8e5-eccf-e7ea-8c87-b4de7f17596a-2026-07-10_12-30-47.prproj
|
|
251
254
|
tests/test_cli.py
|
|
252
255
|
tests/test_log.py
|