playrig 0.0.0-stage → 0.1.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.
Files changed (118) hide show
  1. package/AGENTS.md +106 -0
  2. package/LICENSE +37 -0
  3. package/README.md +77 -2
  4. package/bin/playrig.js +4 -0
  5. package/editions/ae/README.md +144 -0
  6. package/editions/ae/client/aeb.js +9 -0
  7. package/editions/ae/examples/hello.jsx +3 -0
  8. package/editions/ae/examples/inspect.jsx +7 -0
  9. package/editions/ae/examples/snap.jsx +15 -0
  10. package/editions/ae/lib/actions.json +159 -0
  11. package/editions/ae/lib/bridge-api.jsxinc +474 -0
  12. package/editions/ae/lib/dev.jsxinc +21 -0
  13. package/editions/ae/lib/icons/README.md +4 -0
  14. package/editions/ae/lib/icons/dot-error.svg +3 -0
  15. package/editions/ae/lib/icons/dot-idle.svg +3 -0
  16. package/editions/ae/lib/icons/dot-running.svg +3 -0
  17. package/editions/ae/lib/icons/make-png.js +25 -0
  18. package/editions/ae/lib/icons/png/dot-error.png +0 -0
  19. package/editions/ae/lib/icons/png/dot-error@2x.png +0 -0
  20. package/editions/ae/lib/icons/png/dot-idle.png +0 -0
  21. package/editions/ae/lib/icons/png/dot-idle@2x.png +0 -0
  22. package/editions/ae/lib/icons/png/dot-running.png +0 -0
  23. package/editions/ae/lib/icons/png/dot-running@2x.png +0 -0
  24. package/editions/ae/lib/icons/png/power-off.png +0 -0
  25. package/editions/ae/lib/icons/png/power-off@2x.png +0 -0
  26. package/editions/ae/lib/icons/png/power-on.png +0 -0
  27. package/editions/ae/lib/icons/png/power-on@2x.png +0 -0
  28. package/editions/ae/lib/icons/png/settings.png +0 -0
  29. package/editions/ae/lib/icons/png/settings@2x.png +0 -0
  30. package/editions/ae/lib/icons/png/status-error.png +0 -0
  31. package/editions/ae/lib/icons/png/status-error@2x.png +0 -0
  32. package/editions/ae/lib/icons/png/status-ok.png +0 -0
  33. package/editions/ae/lib/icons/png/status-ok@2x.png +0 -0
  34. package/editions/ae/lib/icons/png/status-rejected.png +0 -0
  35. package/editions/ae/lib/icons/png/status-rejected@2x.png +0 -0
  36. package/editions/ae/lib/icons/png/status-timeout.png +0 -0
  37. package/editions/ae/lib/icons/png/status-timeout@2x.png +0 -0
  38. package/editions/ae/lib/icons/png/status-unknown.png +0 -0
  39. package/editions/ae/lib/icons/png/status-unknown@2x.png +0 -0
  40. package/editions/ae/lib/icons/power-off.svg +4 -0
  41. package/editions/ae/lib/icons/power-on.svg +4 -0
  42. package/editions/ae/lib/icons/settings.svg +4 -0
  43. package/editions/ae/lib/icons/status-error.svg +4 -0
  44. package/editions/ae/lib/icons/status-ok.svg +4 -0
  45. package/editions/ae/lib/icons/status-rejected.svg +4 -0
  46. package/editions/ae/lib/icons/status-timeout.svg +4 -0
  47. package/editions/ae/lib/icons/status-unknown.svg +5 -0
  48. package/editions/ae/lib/panel-core.jsxinc +249 -0
  49. package/editions/ae/lib/update-key.pem +11 -0
  50. package/editions/ae/lib/updater.jsxinc +148 -0
  51. package/editions/ae/library-starter/INDEX.md +5 -0
  52. package/editions/ae/library-starter/README.md +161 -0
  53. package/editions/ae/library-starter/_common.jsx +187 -0
  54. package/editions/ae/library-starter/categories.json +9 -0
  55. package/editions/ae/library-starter/recipes/.gitkeep +0 -0
  56. package/editions/ae/package.json +7 -0
  57. package/editions/ae/panel/Playrig.jsx +39 -0
  58. package/editions/ae/panel/core.jsx +1026 -0
  59. package/editions/ae/skills/create-ae-recipe/SKILL.md +85 -0
  60. package/editions/ae/skills/create-ae-recipe/references/ae-patterns.md +88 -0
  61. package/editions/ae/skills/create-ae-recipe/references/video-analysis.md +72 -0
  62. package/editions/ae/skills/create-ae-recipe/scripts/media +5 -0
  63. package/editions/ae/skills/create-ae-recipe/scripts/media.py +253 -0
  64. package/editions/ae/skills/create-ae-recipe/scripts/setup.sh +17 -0
  65. package/editions/ae/skills/create-ae-video/SKILL.md +88 -0
  66. package/editions/ae/skills/create-ae-video/references/templates.md +90 -0
  67. package/editions/ae/skills/create-ae-video/scripts/preflight.js +99 -0
  68. package/editions/ae/skills/use-ae-recipes/SKILL.md +99 -0
  69. package/editions/ae/skills/use-ae-recipes/scripts/contact-sheet.jsx +10 -0
  70. package/editions/ae/skills/use-ae-recipes/scripts/edit-text.jsx +12 -0
  71. package/editions/ae/skills/use-ae-recipes/scripts/remove-comp.jsx +18 -0
  72. package/editions/pr/README.md +60 -0
  73. package/editions/pr/SCORE_PROCESS.md +41 -0
  74. package/editions/pr/client/aeb.js +9 -0
  75. package/editions/pr/examples/frame.js +6 -0
  76. package/editions/pr/examples/hello.js +4 -0
  77. package/editions/pr/organize.default.json +245 -0
  78. package/editions/pr/package.json +7 -0
  79. package/editions/pr/plugin/actions.js +79 -0
  80. package/editions/pr/plugin/dev.js +19 -0
  81. package/editions/pr/plugin/icons/README.md +4 -0
  82. package/editions/pr/plugin/icons/file-code.svg +6 -0
  83. package/editions/pr/plugin/icons/folder.svg +3 -0
  84. package/editions/pr/plugin/icons/power-off.svg +4 -0
  85. package/editions/pr/plugin/icons/power-on.svg +4 -0
  86. package/editions/pr/plugin/icons/settings.svg +4 -0
  87. package/editions/pr/plugin/icons/status-error.svg +4 -0
  88. package/editions/pr/plugin/icons/status-ok.svg +4 -0
  89. package/editions/pr/plugin/icons/status-rejected.svg +4 -0
  90. package/editions/pr/plugin/icons/status-timeout.svg +4 -0
  91. package/editions/pr/plugin/icons/status-unknown.svg +5 -0
  92. package/editions/pr/plugin/incremental.js +212 -0
  93. package/editions/pr/plugin/index.html +195 -0
  94. package/editions/pr/plugin/index.js +710 -0
  95. package/editions/pr/plugin/manifest.json +45 -0
  96. package/editions/pr/plugin/organize.js +223 -0
  97. package/editions/pr/skills/score-video/SKILL.md +69 -0
  98. package/editions/pr/skills/score-video/scripts/mix.py +112 -0
  99. package/editions/pr/skills/score-video/scripts/place.js +63 -0
  100. package/lib/ae.js +754 -0
  101. package/lib/common.js +132 -0
  102. package/lib/install.js +148 -0
  103. package/lib/main.js +107 -0
  104. package/lib/payload.js +60 -0
  105. package/lib/pr.js +239 -0
  106. package/lib/update.js +118 -0
  107. package/package.json +35 -4
  108. package/skills/create-video/SKILL.md +72 -0
  109. package/skills/create-video/references/lessons.md +31 -0
  110. package/skills/create-video/references/project-conventions.md +46 -0
  111. package/skills/create-video/scripts/ae/list-project.jsx +8 -0
  112. package/skills/create-video/scripts/ae/move-chips.jsx +14 -0
  113. package/skills/create-video/scripts/ae/organize-project.jsx +25 -0
  114. package/skills/create-video/scripts/ae/quadrant-chips.jsx +143 -0
  115. package/skills/create-video/scripts/ae/render-comps.jsx +16 -0
  116. package/skills/create-video/scripts/premiere/export-sequences.js +22 -0
  117. package/skills/create-video/scripts/premiere/make-sequences.js +24 -0
  118. package/skills/create-video/scripts/premiere/swap-media.js +43 -0
@@ -0,0 +1,195 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <style>
6
+ /* 8px spacing grid. UXP ignores flex `gap`, so every space is an explicit margin. Icons: Tabler (see icons/README.md). */
7
+ html, body { height: 100%; margin: 0; padding: 0; }
8
+ body { font-size: 12px; color: #d4d4d4; background: #232323; display: flex; flex-direction: column; }
9
+ #app { flex: 1; display: flex; flex-direction: column; padding: 16px; }
10
+
11
+ .header { display: flex; flex-direction: row; align-items: center; justify-content: space-between; margin-bottom: 16px; }
12
+ .titleblock { min-width: 0; margin-right: 12px; }
13
+ .title { font-size: 14px; font-weight: bold; color: #f0f0f0; }
14
+ .proj { font-size: 11px; color: #8c8c8c; overflow: hidden; white-space: nowrap; margin-top: 4px; }
15
+ .spacer16 { height: 16px; }
16
+ .state { display: flex; flex-direction: row; align-items: center; min-width: 0; }
17
+ .state-text { color: #a0a0a0; min-width: 0; overflow: hidden; white-space: nowrap; }
18
+ .dot { width: 8px; height: 8px; border-radius: 4px; background: #6b6b6b; margin-right: 8px; flex-shrink: 0; }
19
+ .dot.on { background: #3fb950; } .dot.run { background: #e3b341; } .dot.err { background: #f85149; }
20
+
21
+ /* Icon-only button (settings gear, open out folder) */
22
+ .icon-btn { width: 28px; height: 28px; border-radius: 4px; display: flex; flex-direction: row; align-items: center; justify-content: center; cursor: pointer; flex-shrink: 0; }
23
+ .icon-btn:hover { background: #3a3a3a; }
24
+ .state .icon-btn { margin-left: 8px; }
25
+
26
+ /* Text button with an icon */
27
+ .btn { display: flex; flex-direction: row; align-items: center; justify-content: center; padding: 6px 12px; background: #3a3a3a; border: 1px solid #555555; border-radius: 4px; color: #e6e6e6; cursor: pointer; }
28
+ .btn:hover { background: #454545; }
29
+ .btn img { margin-right: 8px; }
30
+ .btn.primary { background: #2680eb; border-color: #2680eb; color: #ffffff; }
31
+ .btn.primary:hover { background: #3b8ff0; }
32
+ .btn.wide { width: 100%; }
33
+
34
+ .label { font-size: 11px; color: #8c8c8c; }
35
+ .section { margin-bottom: 16px; }
36
+
37
+ .grow { flex: 0 1 auto; display: flex; flex-direction: column; min-height: 0; margin-bottom: 8px; }
38
+ .jobs-head { display: flex; flex-direction: row; align-items: center; justify-content: space-between; margin-bottom: 6px; }
39
+ .count { font-size: 11px; color: #6b6b6b; }
40
+ #jobsTable { display: flex; flex-direction: column; min-height: 0; flex: 0 1 auto; background: #1a1a1a; border: 1px solid #3d3d3d; border-radius: 4px; }
41
+ .thead { display: flex; flex-direction: row; align-items: center; padding: 4px 10px; border-bottom: 1px solid #3d3d3d; font-size: 10px; color: #8c8c8c; }
42
+ #jobs { flex: 0 1 auto; overflow-y: auto; padding: 2px 0; }
43
+ .job { display: flex; flex-direction: row; align-items: center; padding: 5px 10px; cursor: pointer; }
44
+ .job:hover { background: #262626; }
45
+ .c-status { width: 82px; flex-shrink: 0; display: flex; flex-direction: row; align-items: center; font-size: 11px; }
46
+ .c-status img { margin-right: 6px; flex-shrink: 0; }
47
+ .c-name { flex: 1; min-width: 0; margin-right: 8px; overflow: hidden; white-space: nowrap; color: #e6e6e6; }
48
+ .c-when { width: 92px; flex-shrink: 0; text-align: right; font-size: 11px; color: #8c8c8c; }
49
+ .st-ok { color: #3fb950; } .st-error { color: #f85149; } .st-rejected { color: #f0883e; } .st-timeout { color: #e3b341; } .st-unknown { color: #8c8c8c; }
50
+ .empty { padding: 12px 10px; color: #6b6b6b; }
51
+ #msg { margin-top: 4px; font-size: 11px; color: #e3b341; }
52
+ #msg:empty { display: none; }
53
+
54
+ /* Settings dialog: two panes (section list | content). Explicit pixel sizes: the window is requested at exactly 560 x 440
55
+ (minSize = maxSize = size), and the default dialog padding is removed so nothing can spill over the edge. */
56
+ dialog { padding: 0; margin: 0; }
57
+ .dlg { width: 560px; display: flex; flex-direction: column; }
58
+ .dlg-body { display: flex; flex-direction: row; height: 396px; }
59
+ .nav { width: 112px; flex-shrink: 0; padding: 6px 0; background: #1f1f1f; border-right: 1px solid #3a3a3a; }
60
+ .nav-item { padding: 4px 12px; color: #a0a0a0; cursor: pointer; }
61
+ .nav-item:hover { color: #e6e6e6; background: #2a2a2a; }
62
+ .nav-item.active { color: #ffffff; background: #333333; }
63
+ .panes { width: 446px; height: 380px; overflow-y: auto; padding: 8px 12px; }
64
+ .pane-title { font-size: 13px; font-weight: bold; color: #f0f0f0; margin-bottom: 6px; }
65
+ .field-label { font-size: 11px; color: #c8c8c8; margin-bottom: 2px; }
66
+ .hint { font-size: 11px; color: #8c8c8c; margin-bottom: 6px; }
67
+ .path-input { width: 100%; padding: 3px 8px; margin-bottom: 6px; background: #1a1a1a; border: 1px solid #3d3d3d; border-radius: 4px; color: #e6e6e6; font-size: 12px; }
68
+ .path { padding: 3px 8px; margin-bottom: 6px; background: #1a1a1a; border: 1px solid #3d3d3d; border-radius: 4px; color: #c8c8c8; }
69
+ .opt { margin-bottom: 4px; }
70
+ .opt .btn { display: inline-flex; }
71
+ .about-name { font-size: 15px; font-weight: bold; color: #f0f0f0; }
72
+ .about-text { color: #d4d4d4; margin-bottom: 4px; }
73
+ .link { color: #4d9bff; cursor: pointer; margin-bottom: 2px; }
74
+ .link:hover { color: #7db6ff; }
75
+ .about-block { margin-bottom: 10px; }
76
+ .note { margin-top: 4px; font-size: 11px; color: #e3b341; }
77
+ .note:empty { display: none; }
78
+ .dlg-foot { display: flex; flex-direction: row; justify-content: flex-end; padding: 6px 12px; border-top: 1px solid #3a3a3a; }
79
+ .btn.small { padding: 3px 10px; }
80
+ .jd-scroll { height: 360px; overflow-y: auto; padding: 10px 14px; }
81
+ .jd-head { display: flex; flex-direction: row; align-items: center; margin-bottom: 8px; }
82
+ .jd-head img { margin-right: 8px; }
83
+ .jd-status { margin-left: 10px; font-size: 12px; }
84
+ .jd-title { font-size: 14px; font-weight: bold; color: #f0f0f0; }
85
+ .jd-row { display: flex; flex-direction: row; margin-bottom: 2px; font-size: 11px; }
86
+ .jd-k { width: 86px; flex-shrink: 0; color: #8c8c8c; }
87
+ .jd-v { flex: 1; min-width: 0; color: #d4d4d4; }
88
+ .jd-h { font-size: 11px; font-weight: bold; color: #c8c8c8; margin-top: 10px; margin-bottom: 4px; }
89
+ .jd-pre { font-family: Menlo, Consolas, monospace; font-size: 10px; color: #c8c8c8; background: #1a1a1a; border: 1px solid #333333; border-radius: 4px; padding: 6px 8px; white-space: pre-wrap; }
90
+ .jd-err { color: #f85149; }
91
+ /* fallback if this build has no modal dialogs: show the same content as an overlay inside the panel */
92
+ dialog.fallback { display: block; position: absolute; top: 48px; left: 12px; right: 12px; background: #2b2b2b; border: 1px solid #555555; border-radius: 6px; }
93
+ dialog.fallback .dlg { width: auto; } dialog.fallback .panes { width: auto; flex: 1; min-width: 0; }
94
+ </style>
95
+ </head>
96
+ <body>
97
+ <div id="app">
98
+ <div class="header">
99
+ <div class="titleblock"><div class="title">Playrig</div><div class="proj" id="projName">No project open</div></div>
100
+ <div class="state">
101
+ <div class="dot" id="dot"></div><div class="state-text" id="status">Stopped</div>
102
+ <div class="icon-btn" id="toggle" title="Start / Stop the bridge"><img id="powerIcon" src="icons/power-off.svg" width="20" height="20"></div>
103
+ <div class="icon-btn" id="openSettings" title="Settings"><img src="icons/settings.svg" width="20" height="20"></div>
104
+ </div>
105
+ </div>
106
+
107
+ <div class="note" id="updateBanner" style="display: none; cursor: pointer"></div>
108
+
109
+ <div class="section">
110
+ <div class="btn wide" id="organizeNow" title="Create missing bins and put every item in its place"><span>Organize Project</span></div>
111
+ </div>
112
+
113
+ <div class="spacer16"></div>
114
+
115
+ <div class="grow">
116
+ <div class="jobs-head"><div class="label">Recent jobs</div><div class="count" id="jobsCount"></div></div>
117
+ <div id="jobsTable">
118
+ <div class="thead"><div class="c-status">Status</div><div class="c-name">Action</div><div class="c-when">Time</div></div>
119
+ <div id="jobs"></div>
120
+ </div>
121
+ </div>
122
+
123
+ <div id="msg"></div>
124
+ </div>
125
+
126
+ <dialog id="settingsDialog">
127
+ <div class="dlg">
128
+ <div class="dlg-body">
129
+ <div class="nav">
130
+ <div class="nav-item active" data-pane="general">General</div>
131
+ <div class="nav-item" data-pane="organization">Organization</div>
132
+ <div class="nav-item" data-pane="about">About</div>
133
+ </div>
134
+ <div class="panes">
135
+ <div class="pane" id="pane-general">
136
+ <div class="pane-title">General</div>
137
+ <div class="field-label">Playrig folder</div>
138
+ <input class="path-input" id="root" type="text" spellcheck="false" title="Full path of the bridge folder; press Enter to apply">
139
+ <div class="opt"><div class="btn small" id="choose"><img src="icons/folder.svg" width="16" height="16"><span>Browse...</span></div></div>
140
+ <div class="note" id="folderMsg"></div>
141
+ <div class="hint">Where jobs and results are exchanged: <b>inbox</b> (jobs waiting), <b>out</b> (results, frames), <b>done</b>, <b>backups</b>. Not your project folder. Keep it private: anything that can write to inbox can run code in Premiere.</div>
142
+ <div class="opt"><sp-checkbox id="auto">Start automatically</sp-checkbox></div>
143
+ <div class="opt"><sp-checkbox id="backup">Back up the project file before each job</sp-checkbox></div>
144
+ </div>
145
+ <div class="pane" id="pane-organization" style="display: none">
146
+ <div class="pane-title">Organization</div>
147
+ <div class="opt"><sp-checkbox id="organize">Keep the project organized</sp-checkbox></div>
148
+ <div class="hint">After each job, new loose items are filed into the bin structure. Use <b>Organize Project</b> on the main screen for a full pass.</div>
149
+ <div class="field-label">Structure</div>
150
+ <div class="hint">The bins and the rules that place items live in <b>organize.json</b> in the project's EDIT_LOGS folder. Edit it to change the scheme.</div>
151
+ <div class="opt"><div class="btn small" id="editStructure"><img src="icons/file-code.svg" width="16" height="16"><span>Edit structure</span></div></div>
152
+ <div class="note" id="structMsg"></div>
153
+ </div>
154
+ <div class="pane" id="pane-about" style="display: none">
155
+ <div class="pane-title">About</div>
156
+ <div class="about-block">
157
+ <div class="about-name">Playrig</div>
158
+ <div class="hint" id="versionText">Version 0.1.0 (preview)</div>
159
+ <div class="opt"><div class="btn small" id="checkUpdate"><span>Check for Updates</span></div></div>
160
+ <div class="note" id="updateMsg"></div>
161
+ <div class="link" id="updateLink" style="display: none">Download the update</div>
162
+ <div class="opt"><sp-checkbox id="updateAuto">Check for updates automatically (once a day)</sp-checkbox></div>
163
+ <div class="hint">Installed from Adobe's marketplace? Creative Cloud updates it for you. Otherwise download the new .ccx and install it.</div>
164
+ </div>
165
+ <div class="about-block">
166
+ <div class="field-label">Developed by</div>
167
+ <div class="about-text">Vivek Nigam</div>
168
+ <div class="link" id="linkTwitter">Twitter @viveknigam_</div>
169
+ <div class="link" id="linkInstagram">Instagram @viveknigam3003</div>
170
+ </div>
171
+ <div class="hint">&copy; 2026 Vivek Nigam. All rights reserved.</div>
172
+ <div class="hint">Icons by Tabler Icons (MIT License).</div>
173
+ <div class="note" id="aboutMsg"></div>
174
+ </div>
175
+ </div>
176
+ </div>
177
+ <div class="dlg-foot"><div class="btn small primary" id="closeSettings"><span>Done</span></div></div>
178
+ </div>
179
+ </dialog>
180
+
181
+ <dialog id="jobDialog">
182
+ <div class="dlg" style="width: 560px">
183
+ <div class="jd-scroll" id="jobDetail"></div>
184
+ <div class="dlg-foot"><div class="btn small primary" id="closeJob"><span>Close</span></div></div>
185
+ </div>
186
+ </dialog>
187
+
188
+ <script src="actions.js"></script>
189
+ <script src="incremental.js"></script>
190
+ <script src="organize.js"></script>
191
+ <!-- DEV ONLY: dev.js adds developer sections (e.g. the job script in the job details). Remove this line and the file from packaged builds. -->
192
+ <script src="dev.js"></script>
193
+ <script src="index.js"></script>
194
+ </body>
195
+ </html>