playrig 0.1.0 → 0.1.1
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/AGENTS.md +3 -3
- package/README.md +4 -4
- package/editions/ae/README.md +6 -6
- package/editions/ae/lib/actions.json +1 -1
- package/editions/ae/lib/dev.jsxinc +1 -1
- package/editions/ae/lib/panel-core.jsxinc +1 -1
- package/editions/ae/library-starter/README.md +2 -2
- package/editions/ae/package.json +2 -2
- package/editions/ae/panel/Playrig.jsx +1 -1
- package/editions/ae/panel/core.jsx +3 -3
- package/editions/ae/skills/create-ae-recipe/SKILL.md +2 -2
- package/editions/ae/skills/create-ae-recipe/references/ae-patterns.md +1 -1
- package/editions/ae/skills/create-ae-video/scripts/preflight.js +2 -2
- package/editions/ae/skills/use-ae-recipes/SKILL.md +2 -2
- package/editions/pr/README.md +1 -1
- package/editions/pr/SCORE_PROCESS.md +1 -1
- package/editions/pr/package.json +2 -2
- package/editions/pr/plugin/index.js +2 -2
- package/editions/pr/plugin/manifest.json +1 -1
- package/editions/pr/skills/score-video/SKILL.md +2 -2
- package/editions/pr/skills/score-video/scripts/place.js +1 -1
- package/lib/ae.js +1 -1
- package/lib/common.js +2 -2
- package/lib/install.js +1 -0
- package/lib/payload.js +25 -1
- package/lib/pr.js +1 -1
- package/lib/update.js +3 -2
- package/package.json +1 -1
- package/skills/create-video/SKILL.md +1 -1
- package/skills/create-video/scripts/premiere/export-sequences.js +1 -1
- package/skills/create-video/scripts/premiere/make-sequences.js +1 -1
- package/skills/create-video/scripts/premiere/swap-media.js +1 -1
package/AGENTS.md
CHANGED
|
@@ -4,10 +4,10 @@ Playrig lets you control After Effects and Premiere Pro. You write a job script,
|
|
|
4
4
|
|
|
5
5
|
| Edition | App | Job language | Job global |
|
|
6
6
|
|---|---|---|---|
|
|
7
|
-
|
|
|
8
|
-
|
|
|
7
|
+
| `playrig-ae` (`ae`) | After Effects | ExtendScript (ES3), `.jsx` | `PLAYRIG` (`BRIDGE` is an alias) |
|
|
8
|
+
| `playrig-pr` (`pr`) | Premiere Pro 25.6+ | modern JS in an async function body (`await` works), `.js` | `PLAYRIG` (`BRIDGE` is an alias), plus `ppro` (the `premierepro` module), `alert`, `confirm` |
|
|
9
9
|
|
|
10
|
-
Only the editions the user installed work. Check which app is open and that its panel is started before submitting anything (with no panel answering, a job ends with "No result ... Is the app open with the Playrig panel started?").
|
|
10
|
+
Playrig supports macOS only for now. Only the editions the user installed work. Check which app is open and that its panel is started before submitting anything (with no panel answering, a job ends with "No result ... Is the app open with the Playrig panel started?").
|
|
11
11
|
|
|
12
12
|
## Submit a job
|
|
13
13
|
|
package/README.md
CHANGED
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
Playrig lets Claude, Codex or any coding agent control After Effects and Premiere Pro, so you can "vibe edit" your videos while keeping the control and sophistication these apps give you out of the box.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Playrig is one product made of separate packages: **`playrig`** (the command-line tool), **`playrig-ae`** (the After Effects panel) and **`playrig-pr`** (the Premiere Pro panel). Install the ones you need.
|
|
6
6
|
|
|
7
7
|
## Install
|
|
8
8
|
|
|
9
|
-
Requires Node 18 or newer.
|
|
9
|
+
Requires macOS and Node 18 or newer. Windows is not supported yet.
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
12
|
npm install -g playrig # the CLI: `playrig`, short alias `prg`
|
|
13
13
|
|
|
14
|
-
playrig install ae #
|
|
15
|
-
playrig install pr #
|
|
14
|
+
playrig install ae # playrig-ae: panel into After Effects' ScriptUI Panels folder
|
|
15
|
+
playrig install pr # playrig-pr: builds "Playrig (PR).ccx" and opens the Creative Cloud installer
|
|
16
16
|
playrig install skills # optional: agent skills (video workflow, recipes, scoring) into ./.claude/skills (--global for ~/.claude/skills)
|
|
17
17
|
playrig install all # whatever applies of the above
|
|
18
18
|
```
|
package/editions/ae/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# playrig-ae
|
|
2
2
|
|
|
3
3
|
A folder-based link between Claude and a live After Effects project (AE 2026, macOS and Windows).
|
|
4
4
|
Claude writes an ExtendScript job into a watched folder; a dockable panel runs it in your open project and writes back a log, errors, project inspection and PNG frames. You only render the final output.
|
|
@@ -41,7 +41,7 @@ Upgrading from "AE Bridge": delete `AE Bridge.jsx` and `AE Bridge lib/`; saved s
|
|
|
41
41
|
## The panel
|
|
42
42
|
|
|
43
43
|
```
|
|
44
|
-
|
|
44
|
+
playrig-ae ● Idle ⏻ ⚙
|
|
45
45
|
Motion_Videos_AI (open project)
|
|
46
46
|
|
|
47
47
|
Recent jobs 35 jobs
|
|
@@ -51,7 +51,7 @@ Status Action Time
|
|
|
51
51
|
(summary of the selected job) [Details...]
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
-
- **Power icon**: grey = stopped, green = running. **Gear**:
|
|
54
|
+
- **Power icon**: grey = stopped, green = running. **Gear**: playrig-ae Settings (General: bridge folder, Start automatically, Back up the project file before each job; About).
|
|
55
55
|
- **Recent jobs is per project**: it shows the jobs of the project that is open (read from `EDIT_LOGS/results/` beside the `.aep`) and switches when you open another project, even while the bridge is stopped. Latest 50, newest first. For an unsaved project only this session's jobs show ("Save the project to keep its job history with it").
|
|
56
56
|
- Select a row to see a one-line summary of what the job did under the list (ScriptUI has no per-row tooltips); **double-click** a row or press **Details...** for the job details window (what happened, action, id, start + duration, project, error, log, frames, returned value, result path). A `*` after an action means it was inferred from the script rather than declared.
|
|
57
57
|
- Status uses an icon plus the word: ok (green), error (red), rejected (orange), timeout (amber), unknown (grey).
|
|
@@ -101,7 +101,7 @@ Rules for writing jobs are in `CLAUDE.md`.
|
|
|
101
101
|
|
|
102
102
|
## Project-folder log (travels with the project)
|
|
103
103
|
|
|
104
|
-
After every job the panel mirrors its work into `EDIT_LOGS/` next to the `.aep` (the same folder name the
|
|
104
|
+
After every job the panel mirrors its work into `EDIT_LOGS/` next to the `.aep` (the same folder name the playrig-pr uses; an older `AE-BRIDGE/` folder is renamed to it on the first job after the update):
|
|
105
105
|
|
|
106
106
|
```
|
|
107
107
|
<project folder>/EDIT_LOGS/
|
|
@@ -112,7 +112,7 @@ After every job the panel mirrors its work into `EDIT_LOGS/` next to the `.aep`
|
|
|
112
112
|
└── assets.ae.md/.json footage (relative paths, MISSING / EXTERNAL flags), comps and fonts, refreshed each job
|
|
113
113
|
```
|
|
114
114
|
|
|
115
|
-
(`assets.ae.*` is named so it never overwrites the
|
|
115
|
+
(`assets.ae.*` is named so it never overwrites the playrig-pr's `assets.md` when a Premiere and an AE project share a folder; `JOURNAL.md` is shared and each entry says which job it is. The panel's table and `playrig ae tail` only list results whose `project.path` is the open project.)
|
|
116
116
|
|
|
117
117
|
Move the whole project folder and a new session can read `JOURNAL.md` and `assets.ae.md` to see what was done and what is available. The root folder (`inbox/ out/ done/`) stays the transport; `EDIT_LOGS/` is the durable record. If the project has never been saved it has no folder: `result.sync` says so and the jobs are backfilled after the first job that runs on a saved project. Sync failures never fail a job; they are reported in `result.sync` (and by `aeb`). Footage outside the project folder is flagged EXTERNAL because it won't move with it; collect files into the project folder to make it portable.
|
|
118
118
|
|
|
@@ -123,7 +123,7 @@ Move the whole project folder and a new session can read `JOURNAL.md` and `asset
|
|
|
123
123
|
- `project.dirty` is reported only if the scripting DOM exposes it; otherwise `null`.
|
|
124
124
|
- Snapshots use `comp.saveFrameToPng` and then wait up to 10 s for the file to exist with non-zero size.
|
|
125
125
|
- Closing the panel stops polling.
|
|
126
|
-
- Project organization (folders/auto-filing, as in the
|
|
126
|
+
- Project organization (folders/auto-filing, as in the playrig-pr) is deliberately **not** part of the playrig-ae (decided with the user, 2026-10-02).
|
|
127
127
|
- Jobs share one persistent ExtendScript engine (`#targetengine "playrig"`), so globals can leak between jobs.
|
|
128
128
|
|
|
129
129
|
## Status of verification
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_about": "Shared, engine-neutral data for the
|
|
2
|
+
"_about": "Shared, engine-neutral data for the playrig-ae: read by the ExtendScript panel, by aeb (Node) and, later, by a UXP port. Plain JSON on purpose. Labels and summaries are display text only: renaming one renames it for every past and future job.",
|
|
3
3
|
"logFolder": "EDIT_LOGS",
|
|
4
4
|
"legacyLogFolder": "AE-BRIDGE",
|
|
5
5
|
"recipePrefix": "recipe.",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// DEV ONLY. Developer-facing extras for the
|
|
1
|
+
// DEV ONLY. Developer-facing extras for the playrig-ae panel. This whole file is left out of packaged builds: the panel loads it only
|
|
2
2
|
// if it exists (File.exists + $.evalFile) and only uses $.global.PlayrigDev when it is defined, so removing the file removes these features
|
|
3
3
|
// without any other change. Currently: the "Job script" section of the job details window (the script as it was run, for debugging jobs).
|
|
4
4
|
$.global.PlayrigDev = {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//
|
|
1
|
+
// playrig-ae panel core: everything the panel needs that is NOT user interface. ES3 only.
|
|
2
2
|
// Loaded once by the panel (lib/ folder) and defines $.global.PlayrigCore. Kept free of ScriptUI on purpose so it can move to a UXP
|
|
3
3
|
// port nearly unchanged: actions + job-header parsing/inference (data in actions.json), the per-project history reader and the
|
|
4
4
|
// detail-text builder. File access goes through File/Folder only.
|
|
@@ -26,7 +26,7 @@ When the library passes **40 recipes**, `playrig ae lib index` automatically tur
|
|
|
26
26
|
|
|
27
27
|
For agents and for building whole scenes, the **`use-ae-recipes`** skill (`.claude/skills/use-ae-recipes/`) wraps this: it routes through the index, chains recipes, previews, tunes with you and assembles a master comp. To *add* recipes use **`create-ae-recipe`**.
|
|
28
28
|
|
|
29
|
-
Needs After Effects open with the
|
|
29
|
+
Needs After Effects open with the playrig-ae panel started (see the edition README). Run from anywhere:
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
32
|
playrig ae lib list <word> # search ids, names, tags, aliases, summaries
|
|
@@ -136,7 +136,7 @@ playrig ae lib index # rebuild INDEX.md (+ categories/, inde
|
|
|
136
136
|
- Add a category by creating a folder under `recipes/` and (optionally) a line in `categories.json` for its description.
|
|
137
137
|
- Past 40 recipes the index splits by category automatically (`INDEX_SPLIT_THRESHOLD` in the CLI (`playrig/lib/ae.js`)).
|
|
138
138
|
- `index.json` is the machine-readable catalogue (all metadata + params + path), for tools that prefer JSON.
|
|
139
|
-
- The library is just a folder. Copy it anywhere, or point to it with `--lib <dir>` / `AE_LIBRARY`. The scripts are plain ExtendScript; the
|
|
139
|
+
- The library is just a folder. Copy it anywhere, or point to it with `--lib <dir>` / `AE_LIBRARY`. The scripts are plain ExtendScript; the playrig-ae is only needed to run them.
|
|
140
140
|
- Preview images live **next to the recipe** as `<id>--t<seconds>.png` and are embedded in its `## Preview` block (between `<!-- previews:start -->` and `<!-- previews:end -->` markers, kept up to date by `--save-preview`). Moving or copying a recipe means moving its `.md` and its `<id>--t*.png` files together.
|
|
141
141
|
|
|
142
142
|
## Things to know
|
package/editions/ae/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "playrig-ae",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"private": true,
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "playrig-ae: the ScriptUI panel, motion library and skills. Versioned on its own (tags ae-v*).",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE"
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#targetengine "playrig"
|
|
2
|
-
//
|
|
2
|
+
// playrig-ae: stub. This is the only file in After Effects' ScriptUI Panels folder, so it is also the
|
|
3
3
|
// panel's name in the Window menu. It stays tiny and stable, and loads the real panel (core.jsx) from the newest of:
|
|
4
4
|
// 1. the user's data folder (<userData>/Playrig/ae/current), where verified updates are installed without admin rights
|
|
5
5
|
// 2. "Playrig lib" next to this file, the copy that `playrig install ae` put there
|
|
@@ -352,16 +352,16 @@
|
|
|
352
352
|
}
|
|
353
353
|
|
|
354
354
|
// ------------------------------------------------------------ project-folder sync
|
|
355
|
-
// Everything a job produces is mirrored into <project folder>/EDIT_LOGS/ (same folder name as
|
|
355
|
+
// Everything a job produces is mirrored into <project folder>/EDIT_LOGS/ (same folder name as playrig-pr; an older
|
|
356
356
|
// AE-BRIDGE/ folder is renamed to it on the first job) so the project can move to another machine and the next session can
|
|
357
357
|
// read what was done and which assets exist.
|
|
358
358
|
var WS_README = "# EDIT_LOGS\n\n" +
|
|
359
|
-
"Written automatically by
|
|
359
|
+
"Written automatically by playrig-ae next to the .aep. Move this folder together with the project.\n\n" +
|
|
360
360
|
"- `JOURNAL.md`: chronological record of every job (newest last): what ran, status, errors, log, snapshots.\n" +
|
|
361
361
|
"- `jobs/<id>.jsx` (+ `<id>.json` options): the exact scripts that were run on this project.\n" +
|
|
362
362
|
"- `results/<id>/`: `result.json` and the PNG snapshots of each job.\n" +
|
|
363
363
|
"- `assets.ae.md` / `assets.ae.json`: footage, comps and fonts in the project as of the last job (paths relative to the project folder). " +
|
|
364
|
-
"(Named `.ae` so they do not overwrite
|
|
364
|
+
"(Named `.ae` so they do not overwrite playrig-pr's `assets.md` when both projects share a folder.)\n\n" +
|
|
365
365
|
"To continue on another system: open the .aep, read `JOURNAL.md` and `assets.ae.md`, re-link any footage marked MISSING, " +
|
|
366
366
|
"install the listed fonts, then submit new jobs with Playrig as usual. Re-running `jobs/*.jsx` in order rebuilds the scripted work.\n";
|
|
367
367
|
|
|
@@ -5,7 +5,7 @@ description: Add a new recipe (reusable, parameterised After Effects effect, ele
|
|
|
5
5
|
|
|
6
6
|
# create-ae-recipe
|
|
7
7
|
|
|
8
|
-
You add one recipe at a time to `<library>/` (one Markdown file per recipe, see `<library>/README.md`). Recipes run in the user's **open** After Effects project through the
|
|
8
|
+
You add one recipe at a time to `<library>/` (one Markdown file per recipe, see `<library>/README.md`). Recipes run in the user's **open** After Effects project through the playrig-ae, so the work is: build it, **look at it**, show the user, iterate, then save it cleanly.
|
|
9
9
|
|
|
10
10
|
Two entry points, same finish:
|
|
11
11
|
|
|
@@ -20,7 +20,7 @@ Two entry points, same finish:
|
|
|
20
20
|
playrig ae scratch start # remember what's in the project before you add anything
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
- After Effects must be open with the
|
|
23
|
+
- After Effects must be open with the playrig-ae panel started (status `Idle`). If a job times out, tell the user to start the panel.
|
|
24
24
|
- You are working inside the user's real project. **All experiments go in comps named `SCRATCH-<id>-v<n>`.** Never modify their existing layers/comps. Never save the project. Never run `scratch clean --yes` before reading its list and confirming every item is yours.
|
|
25
25
|
- Each Playrig job is one Undo step; the user can Edit > Undo.
|
|
26
26
|
- Fonts: check the requested font is installed (`textInfo.font` via inspect, or a visible substitution in the preview). Default is Inter.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# After Effects patterns for recipes
|
|
2
2
|
|
|
3
|
-
Everything here was verified in After Effects 26.5 through the
|
|
3
|
+
Everything here was verified in After Effects 26.5 through the playrig-ae while building the library. Scripts are **ExtendScript (ES3)**.
|
|
4
4
|
|
|
5
5
|
## ES3 rules (the linter `playrig ae lib check` enforces most)
|
|
6
6
|
|
|
@@ -71,10 +71,10 @@ if (!ae || ae.status !== 'ok') {
|
|
|
71
71
|
// Never leave a stale job behind: it would run later when the panel starts.
|
|
72
72
|
for (const f of [`${id}.jsx`, `${id}.json`, `${id}.jsx.tmp`, `${id}.json.tmp`]) fs.rmSync(path.join(root, 'inbox', f), { force: true });
|
|
73
73
|
const why = ae ? `job ${ae.status}: ${ae.error && ae.error.message}` : `no answer within ${waitSec}s`;
|
|
74
|
-
add('fail', 'After Effects +
|
|
74
|
+
add('fail', 'After Effects + playrig-ae panel', why, 'Open After Effects, then Window > Playrig and press Start (status "Idle"). First time? Install the panel: playrig install ae, and enable Settings > Scripting & Expressions > "Allow Scripts to Write Files and Access Network"');
|
|
75
75
|
} else {
|
|
76
76
|
const v = ae.returnValue;
|
|
77
|
-
add('ok', 'After Effects +
|
|
77
|
+
add('ok', 'After Effects + playrig-ae panel', `AE ${v.ae}, panel answering`);
|
|
78
78
|
add('ok', 'Open project', `${v.project.path || '(unsaved project)'}${v.project.dirty ? ', unsaved changes' : ''}; ${v.project.items} items, ${v.comps} comps${v.active ? `; active comp: ${v.active}` : ''}`);
|
|
79
79
|
const missing = Object.entries(v.fonts).filter(([, ok]) => ok === false).map(([n]) => n);
|
|
80
80
|
const unknown = Object.entries(v.fonts).filter(([, ok]) => ok === null).map(([n]) => n);
|
|
@@ -5,13 +5,13 @@ description: Build After Effects scenes and videos from the user's motion librar
|
|
|
5
5
|
|
|
6
6
|
# use-ae-recipes
|
|
7
7
|
|
|
8
|
-
You turn a brief into finished comps inside the user's **open** After Effects project by running tested recipes from `<library>/` through the
|
|
8
|
+
You turn a brief into finished comps inside the user's **open** After Effects project by running tested recipes from `<library>/` through the playrig-ae: pick, chain, tune, assemble, show.
|
|
9
9
|
|
|
10
10
|
Missing or unsuitable recipe? Switch to the **`create-ae-recipe`** skill rather than improvising a one-off. Don't render final output: that stays with the user (render queue / Media Encoder).
|
|
11
11
|
|
|
12
12
|
## 0. Preflight
|
|
13
13
|
|
|
14
|
-
- After Effects open,
|
|
14
|
+
- After Effects open, playrig-ae panel started (`Idle`). If a job times out, ask the user to start it.
|
|
15
15
|
- You are working in their real project. **Create new comps only**; don't touch existing comps/layers unless asked. Never save the project. Every run is one Undo step.
|
|
16
16
|
- Commands are `playrig ae ...`. Helper-script paths below (`.claude/skills/...`) are relative to the project folder where the skills were installed (`playrig install skills`). `<library>` is the folder printed by `playrig where library`.
|
|
17
17
|
- For frame review you'll use `.claude/skills/create-ae-recipe/scripts/media` (run its `setup.sh` once if `media check` fails).
|
package/editions/pr/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# playrig-pr (UXP) — v0.1 spike
|
|
2
2
|
|
|
3
3
|
Same folder protocol as the After Effects edition (`inbox/ running/ done/ out/<id>/result.json`), driven by a UXP panel in Premiere Pro 25.6+.
|
|
4
4
|
Jobs are **modern JavaScript** (async function bodies; `await` works) receiving `PLAYRIG` (`BRIDGE` is an alias), `ppro` (the `premierepro` module), `alert`, `confirm`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Adding a music score to Premiere sequences (draft process, for a future skill)
|
|
2
2
|
|
|
3
|
-
Worked once on "Quadrant Chips Wide/Portrait" (7 s motion pieces). Epidemic Sound MCP +
|
|
3
|
+
Worked once on "Quadrant Chips Wide/Portrait" (7 s motion pieces). Epidemic Sound MCP + playrig-pr.
|
|
4
4
|
|
|
5
5
|
## Steps
|
|
6
6
|
1. **Read the timeline, not just the brief.** Get each sequence's length, frame size and the moments that carry rhythm (here: chip pops every 0.6 s starting 2.6 s). Derive a music brief from them:
|
package/editions/pr/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "playrig-pr",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"private": true,
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "playrig-pr: the UXP panel and skills. Versioned on its own (tags pr-v*).",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE"
|
|
7
7
|
}
|
|
@@ -320,7 +320,7 @@ async function collectAssets(project, projDir, sequenceNames) {
|
|
|
320
320
|
|
|
321
321
|
function assetsMarkdown(a) {
|
|
322
322
|
const media = a.items.filter((x) => x.kind === "media"), seqs = a.items.filter((x) => x.kind === "sequence");
|
|
323
|
-
let s = `# Project assets\n\nGenerated ${a.generatedAt} by
|
|
323
|
+
let s = `# Project assets\n\nGenerated ${a.generatedAt} by playrig-pr. Relative paths are from the .prproj folder (\`${a.projectFolder}\`).\n\n`;
|
|
324
324
|
s += `## Sequences (${seqs.length})\n\n` + seqs.map((x) => `- ${x.name} (bin ${x.bin})`).join("\n") + "\n\n";
|
|
325
325
|
s += `## Media (${media.length})\n\n`;
|
|
326
326
|
for (const x of media) s += `- ${x.name} (bin ${x.bin}): \`${x.relative}\`${x.offline ? " **OFFLINE/MISSING**" : ""}\n`;
|
|
@@ -331,7 +331,7 @@ function assetsMarkdown(a) {
|
|
|
331
331
|
// ------------------------------------------------------------ project-folder sync
|
|
332
332
|
const WS_README = `# EDIT_LOGS
|
|
333
333
|
|
|
334
|
-
Written automatically by the
|
|
334
|
+
Written automatically by the playrig-pr next to the .prproj. Move this folder with the project.
|
|
335
335
|
|
|
336
336
|
- \`JOURNAL.md\`: chronological record of every job (newest last).
|
|
337
337
|
- \`jobs/<id>.js\` (+ \`<id>.json\`): the exact scripts run on this project.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: score-video
|
|
3
|
-
description: Add a music score plus sound effects to a finished video in Premiere Pro, using Epidemic Sound and the
|
|
3
|
+
description: Add a music score plus sound effects to a finished video in Premiere Pro, using Epidemic Sound and the playrig-pr. Derives a music brief from the video's own timeline (mood, BPM from the motion cadence), finds and length-fits a track, picks SFX for the key moments, builds a typewriter bed, ducks the music under the effects with a measured sidechain, and lays everything on separate audio tracks as one undo step. Use when the user asks for a music bed, score, soundtrack, sound design, SFX, or "make it sound good" for a video or sequence, especially motion graphics made in After Effects.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# score-video
|
|
@@ -10,7 +10,7 @@ You turn a finished (or nearly finished) picture into a scored one: music bed +
|
|
|
10
10
|
**Ground rules:** work in the user's open Premiere project; add audio only, never touch picture; **never save the project**; every Premiere job is one undo step; downloads go in the project's own music/sound folders; say what you could not verify (you cannot listen: only measure).
|
|
11
11
|
|
|
12
12
|
## 0. Preflight (before asking anything)
|
|
13
|
-
-
|
|
13
|
+
- playrig-pr answering: `playrig pr run "$(playrig where pr)/examples/hello.js" --id pre-$RANDOM`. If not, ask the user to start the panel (Window > Extensions > Playrig, then Start).
|
|
14
14
|
- Epidemic Sound tools available (`mcp__epidemic-sound__*`, load via ToolSearch: SearchRecordings, EditRecording, PollEditRecordingJob, DownloadRecordingEdit, SearchSoundEffects, DownloadSoundEffect). If missing, say so and stop; do not substitute other sources.
|
|
15
15
|
- `ffmpeg`, `ffprobe` and `python3` on PATH.
|
|
16
16
|
- Find the project folder from the job log (`project:` line) and look for its music/sound folders (e.g. `3_MUSIC`, `2_SOUND`). Use them; create `2_SOUND/SFX` if needed.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//
|
|
1
|
+
// playrig-pr job: lay the score + SFX on one or more sequences as ONE undo step.
|
|
2
2
|
// Run: playrig pr run .claude/skills/score-video/scripts/place.js --id place-<rand>
|
|
3
3
|
// Edit CONFIG first (copy the placements from mix.py's JSON report). Modern JS, `await` works. Never saves the project.
|
|
4
4
|
const CONFIG = {
|
package/lib/ae.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
-
//
|
|
2
|
+
// playrig-ae client: submits ExtendScript (.jsx) jobs to the panel, reads results, runs the recipe library.
|
|
3
3
|
|
|
4
4
|
const fs = require('fs');
|
|
5
5
|
const path = require('path');
|
package/lib/common.js
CHANGED
|
@@ -11,8 +11,8 @@ const BOOL_FLAGS = new Set(['no-undo', 'json', 'no-snap', 'save-preview', 'full'
|
|
|
11
11
|
|
|
12
12
|
// The two editions. `ext` is the job file extension the panel watches for.
|
|
13
13
|
const APPS = {
|
|
14
|
-
ae: { id: 'ae', name: 'After Effects', product: '
|
|
15
|
-
pr: { id: 'pr', name: 'Premiere Pro', product: '
|
|
14
|
+
ae: { id: 'ae', name: 'After Effects', product: 'playrig-ae', ext: '.jsx', legacyDir: 'AE Bridge', legacyEnv: 'AE_BRIDGE_ROOT' },
|
|
15
|
+
pr: { id: 'pr', name: 'Premiere Pro', product: 'playrig-pr', ext: '.js', legacyDir: 'Premiere Bridge', legacyEnv: 'PREMIERE_BRIDGE_ROOT' },
|
|
16
16
|
};
|
|
17
17
|
|
|
18
18
|
const USAGE = `Playrig: let a coding agent control After Effects and Premiere Pro.
|
package/lib/install.js
CHANGED
|
@@ -134,6 +134,7 @@ function installSkills(flags) {
|
|
|
134
134
|
|
|
135
135
|
function install(pos, flags) {
|
|
136
136
|
const what = pos[0];
|
|
137
|
+
if (process.platform !== 'darwin' && what !== 'skills') die('Playrig supports macOS only for now (Windows is not supported yet).', 1);
|
|
137
138
|
if (what === 'ae') return installAE(flags);
|
|
138
139
|
if (what === 'pr') return installPR(flags);
|
|
139
140
|
if (what === 'skills') return installSkills(flags);
|
package/lib/payload.js
CHANGED
|
@@ -57,4 +57,28 @@ function prPackage(outFile) {
|
|
|
57
57
|
return { version: readJSON(path.join(ed, 'plugin', 'manifest.json')).version, file: outFile };
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
// A download for people who don't use Terminal: the stub, the payload folder and a one-page guide, to drag into ScriptUI Panels.
|
|
61
|
+
const INSTALL_TXT = `playrig-ae: manual install (macOS)
|
|
62
|
+
|
|
63
|
+
1. Quit After Effects.
|
|
64
|
+
2. In Finder choose Go > Go to Folder... and paste:
|
|
65
|
+
/Applications/Adobe After Effects <your version>/Scripts/ScriptUI Panels
|
|
66
|
+
3. Drag Playrig.jsx and the folder "Playrig lib" from this download into that folder.
|
|
67
|
+
Enter your Mac password when asked. If a "Playrig lib" folder is already there, replace it.
|
|
68
|
+
4. Start After Effects. Open Preferences > Scripting & Expressions and turn on
|
|
69
|
+
"Allow Scripts to Write Files and Access Network".
|
|
70
|
+
5. Restart After Effects, open Window > Playrig and press Start.
|
|
71
|
+
|
|
72
|
+
Later updates install from the panel: Settings > About > Check for Updates.
|
|
73
|
+
Use of Playrig is covered by LICENSE.txt (inside "Playrig lib").
|
|
74
|
+
`;
|
|
75
|
+
function aeInstallBundle(dest, version) {
|
|
76
|
+
const ed = C.editionDir('ae');
|
|
77
|
+
fs.rmSync(dest, { recursive: true, force: true });
|
|
78
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
79
|
+
aePayload(path.join(dest, 'Playrig lib'), version);
|
|
80
|
+
fs.copyFileSync(path.join(ed, 'panel', 'Playrig.jsx'), path.join(dest, 'Playrig.jsx'));
|
|
81
|
+
fs.writeFileSync(path.join(dest, 'INSTALL.txt'), INSTALL_TXT);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
module.exports = { aeInstallBundle, STUB_API, aePayload, prPackage, zipFolder, editionVersion, readJSON };
|
package/lib/pr.js
CHANGED
package/lib/update.js
CHANGED
|
@@ -77,7 +77,7 @@ async function updateAE(entry, custom) {
|
|
|
77
77
|
if (fs.existsSync(path.join(base, 'current'))) fs.renameSync(path.join(base, 'current'), path.join(base, 'previous'));
|
|
78
78
|
fs.renameSync(fresh, path.join(base, 'current'));
|
|
79
79
|
} finally { fs.rmSync(tmp, { recursive: true, force: true }); fs.rmSync(fresh, { recursive: true, force: true }); }
|
|
80
|
-
console.log(`
|
|
80
|
+
console.log(`playrig-ae ${entry.version} installed. Restart After Effects to use it.`);
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
async function updatePR(entry, custom) {
|
|
@@ -92,6 +92,7 @@ async function updatePR(entry, custom) {
|
|
|
92
92
|
|
|
93
93
|
async function update(pos, flags) {
|
|
94
94
|
const what = pos[0];
|
|
95
|
+
if (process.platform !== 'darwin' && (what === 'ae' || what === 'pr')) C.die('Playrig supports macOS only for now (Windows is not supported yet).', 1);
|
|
95
96
|
if (what && !['ae', 'pr', 'cli'].includes(what)) C.die('Usage: playrig update [ae|pr|cli] [--check]');
|
|
96
97
|
const { feed, custom } = await getFeed();
|
|
97
98
|
const have = {
|
|
@@ -99,7 +100,7 @@ async function update(pos, flags) {
|
|
|
99
100
|
pr: C.editionDir('pr') ? P.readJSON(path.join(C.editionDir('pr'), 'plugin', 'manifest.json')).version : null,
|
|
100
101
|
cli: P.readJSON(path.join(C.CLI_DIR, 'package.json')).version,
|
|
101
102
|
};
|
|
102
|
-
const names = { ae: '
|
|
103
|
+
const names = { ae: 'playrig-ae', pr: 'playrig-pr', cli: 'playrig' };
|
|
103
104
|
let pending = 0;
|
|
104
105
|
for (const id of (what ? [what] : ['ae', 'pr', 'cli'])) {
|
|
105
106
|
const e = feed[id];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: create-video
|
|
3
|
-
description: End-to-end workflow for making a short motion video with Claude across After Effects, Premiere Pro and Epidemic Sound, using the
|
|
3
|
+
description: End-to-end workflow for making a short motion video with Claude across After Effects, Premiere Pro and Epidemic Sound, using the playrig-ae and playrig-pr, in the user's own project layout. Covers brief and storyboard, building scenes in AE (wide AND portrait), keeping AE tidy, rendering, syncing to Premiere sequences, scoring (music + SFX) via score-video, and exporting to the project's final folders. Use at the start of any request to make, animate, recreate, sync, score or export a video, or when the user continues a video already in progress ("update the pills", "sync it with Premiere", "export the video").
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# create-video
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//
|
|
1
|
+
// playrig-pr job: export sequences immediately with a Media Encoder preset.
|
|
2
2
|
// This job does NOT check for existing files: `ls` the target folder first and never overwrite an existing export without asking.
|
|
3
3
|
// Finals go to <project>/5_FINAL/Wide and 5_FINAL/Vertical with a _FINAL suffix; drafts to 4_EXPORTS.
|
|
4
4
|
// Run: playrig pr run <this file> --id export-$(date +%s) --timeout 400
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//
|
|
1
|
+
// playrig-pr job: import AE renders and create one sequence per render (size taken from the clip). Never saves.
|
|
2
2
|
// Run: playrig pr run <this file> --id seq-$(date +%s)
|
|
3
3
|
const CONFIG = {
|
|
4
4
|
items: [ // render file -> sequence name
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//
|
|
1
|
+
// playrig-pr job: swap a sequence's picture (V1) and audio clips to NEW files, in place, as one undo step.
|
|
2
2
|
// Overwrite replaces the clip underneath; pad replacement audio to the OLD clip's length so no remnant is left.
|
|
3
3
|
// (createRemoveItemsAction does not work through Playrig.) Never overwrite a file Premiere has imported: new file names only.
|
|
4
4
|
// Run: playrig pr run <this file> --id swap-$(date +%s)
|