You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
My contribution adds a new instruction, prompt, agent, skill, workflow, or canvas extension file in the correct directory.
The file follows the required naming convention.
The content is clearly structured and follows the example format.
I have tested my instructions, prompt, agent, skill, workflow, or canvas extension with GitHub Copilot.
I have run npm start and verified that README.md is up to date.
I am targeting the main branch for this pull request.
Description
Plugin to help write, edit, or debug Adobe After Effects scripts, expressions, extensions, plugins, and MCP servers, or to build automated tools that assemble and render compositions in Adobe After Effects.
Use the adobe-after-effects-scripting and adobe-after-effects-integrations skills to build "Acme Sting", a small Adobe After Effects extension that makes a brand logo animation for Acme Corp, the kind that closes a TV commercial, and a documentation site for it in docs/ that GitHub Pages can serve.
The logo (built in After Effects, no imported artwork)
1. An ES3 ExtendScript, acme-sting/jsx/acme-sting.jsx, draws the Acme Corp logo in After Effects from shape and text layers, in a precomposition named "Acme Logo": a simple mark (for example a circle or rounded square holding a letter A made from shape paths) beside the word ACME, with the tagline "Quality you can count on" below. Use a font that ships with the operating system (for example Arial); put no font files in the repository. The colors, the word, and the tagline are settings.
The animation
2. The same script builds a 1920 x 1080, 30 fps composition named "Acme Sting", 6 seconds long by default, that reveals the logo with the most familiar logo-reveal effects. Each effect is a setting that turns on or off, with one or two values:
- a scale-up with an overshoot bounce, written as an expression rather than hand-placed keyframes;
- a fade in;
- the mark spinning in;
- the mark's outline drawing on with Trim Paths;
- a light sweep across the logo (CC Light Sweep);
- a glow;
- a drop shadow;
- the word ACME typing on;
- the tagline sliding up;
- a lens flare or a particle burst at the moment of the reveal;
- a gradient background that drifts slowly;
- an end card reading "example.com" for the last second.
Apply effects by match name, looked up once in app.effects. If an effect is missing, skip it and say so in the result rather than failing.
3. Presets: at least three named combinations (for example Classic, Shine, and Bounce), plus a settings object that overrides any value in a preset.
4. The script runs from the panel in item 5 and from outside After Effects with AfterFX.exe -s "var stingJob = { ... }; $.evalFile('...');". Given a job (preset, overrides, render on or off, result file), it opens or creates acme-sting/acme-sting.aep, replaces an existing composition of the same name rather than adding a second, wraps the changes in an undo group, suppresses dialogs, never calls alert, renders to MP4 through the render queue with an H.264 output module template from the installed list when asked, saves the project, and writes what it did, or the error and its line, to the job's JSON result file. If another project with unsaved changes is open, it writes an error instead of opening acme-sting.aep.
The extension
5. A CEP panel for After Effects 2026 (host AEFT, CEP 12) in acme-sting/panel/, named Acme Sting and opened from Window > Extensions > Acme Sting. It has a preset menu, a toggle and its values for each effect, the colors, the word, and the tagline, and Build and Render buttons that call acme-sting.jsx through evalScript and show the result. Include a .debug file and the steps to load it unsigned for development (PlayerDebugMode), and note how a signed ZXP would be packaged later.
6. A PowerShell launcher, acme-sting/run-sting.ps1, that writes a job, runs AfterFX.exe -s, waits for the result file with a timeout, and turns the MP4 into a GIF in docs/images/ with ffmpeg. Write result files, logs, and MP4s to the system temp folder, not the repository.
Test it live
7. In After Effects 2026, build and render every preset and one custom combination of your choice. Render one of them again with aerender from the saved project.
8. Take one or two screenshots of the panel and of the composition with a PowerShell screen capture, cropped so no title bar, file path, or account name shows.
9. Make docs/images/demo.gif, which steps through the renders. Keep every GIF under 5 MB.
The documentation site
10. docs/index.html (what it does, with the GIF), install.html (development install and ZXP), usage.html (each effect and preset, step by step with the screenshots, the command line, and aerender), and changelog.html. Plain HTML and CSS, relative links only, no build step, no external CDNs or fonts.
11. Use placeholder data only (Acme Corp, example.com, Jane Doe). Do not include local paths, user names, or account details anywhere.
Do not save or close any After Effects project other than acme-sting.aep, and do not commit. When you finish, list what you ran, what passed, and anything you could not test.
Results
The test worked in one prompt with no post edits. Copilot CLI (Claude Haiku 5.5, reasoning effort medium) used both skills to build Acme Sting, an After Effects 2026 extension that draws the Acme Corp logo and animates it into the closing sting of a TV spot, and a small docs site for it.
Logo and animation (acme-sting/jsx/acme-sting.jsx): an ES3 script draws the logo in After Effects from shape and text layers, with no imported artwork (a red disc holding an A made from shape paths, the word ACME, and the tagline), and builds a 1920 x 1080, 30 fps, 6-second composition with twelve switchable reveal effects: an overshoot scale-up written as an expression, fade, spin, Trim Paths draw-on, CC Light Sweep, glow, drop shadow, typed word, tagline slide, lens flare or burst, a drifting gradient, and an end card. Effects are found by match name and skipped, and reported, when missing. Presets Classic, Shine, and Bounce, plus overrides.
Extension (acme-sting/panel/): a CEP 12 panel for AEFT[25.0,99.9] with a preset menu, a switch and values for each effect, color and text fields, Build and Render buttons, and a .debug file for unsigned development.
Command line (acme-sting/run-sting.ps1): writes a job, runs AfterFX.exe -s, waits for the JSON result, and turns the MP4 into a GIF with ffmpeg. The GIF steps through renders of the three presets and a custom combination; aerender rendered Classic again from the saved project.
Docs site (docs/): overview with the GIF, install (development and ZXP), usage (each effect and preset, the command line, and aerender), and changelog. Relative links only, no external assets.
Check after the test (After Effects 26.0): every preset and one override rebuilt from the command line in a scratch project: a 1920 x 1080, 30 fps, 6-second composition; a logo precomposition made only of shape and text layers; every effect each preset turns on applied by match name, none skipped; 0 expression errors; the override changed the tagline and turned the spin on and the glow off. aerender rendered the saved project to a 1920 x 1080, 30 fps, 6.00-second H.264 MP4.
Found by the test:
With the documented junction install, the panel cannot reach its script: it builds <extension folder>/../jsx/acme-sting.jsx, ExtendScript collapses the .. before following the junction, $.evalFile returns nothing, and the panel stays at "Ready." without loading presets. The command line works. Keeping the host script inside the extension folder (<ScriptPath>) avoids this, and the integrations skill's cep.md now says so.
The panel's "Render MP4 through the render queue" checkbox is not read; the Build and Render buttons decide.
The command-line example in usage.html passes result:, but the script reads resultFile.
Rebuilding leaves the previous build's solids in the project.
The After Effects project is not committed: acme-sting.jsx creates it on its first run, and its auto-saves and logs hold local paths.
Type of Contribution
New instruction file.
New prompt file.
New agent file.
New plugin.
New skill file.
New agentic workflow.
New canvas extension.
Update to existing instruction, prompt, agent, plugin, skill, workflow, or canvas extension.
Other (please specify):
By submitting this pull request, I confirm that my contribution abides by the Code of Conduct and will be licensed under the MIT License.
Risk tier:merge-risk:medium — New or substantially changed resource without privileged execution Required to merge: passing submission-gate checks plus 1 approval from reviewers with write access.
Why this tier
Adds 9 file(s), e.g. plugins/adobe-after-effects/README.md
Vally currently lints SKILL.md content. Agent files were detected but skipped:
Full linter output
### Linting skills/adobe-after-effects-integrations
✅ adobe-after-effects-integrations (2/2 checks passed)
✓ [spec-compliance] All 1 skill(s) are spec-compliant.
✓ spec-compliance: All spec checks passed.
✓ [valid-refs] All file references across 1 skill(s) are valid.
✓ valid-refs: All file references resolve to existing files within the skill directory.
1 skill(s) linted, 1 passed
### Linting skills/adobe-after-effects-scripting
✅ adobe-after-effects-scripting (2/2 checks passed)
✓ [spec-compliance] All 1 skill(s) are spec-compliant.
✓ spec-compliance: All spec checks passed.
✓ [valid-refs] All file references across 1 skill(s) are valid.
✓ valid-refs: All file references resolve to existing files within the skill directory.
1 skill(s) linted, 1 passed
### Agent files detected (not linted by vally)
ℹ️ Vally currently lints SKILL.md content. Agent files were detected but skipped:
agents/adobe-creative-cloud.agent.md
The reason will be displayed to describe this comment to others. Learn more.
🟡 Changes recommended
The change retains a locale-dependent effect lookup that can fail on non-English installations and omits the Illustrator plugin version bump and marketplace regeneration needed to notify installed users.
The adobe-creative-cloud agent changed in this PR is also part of the
adobe-illustrator plugin, so bump that plugin's version and regenerate
marketplace.json so installed users are offered the update.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The reason will be displayed to describe this comment to others. Learn more.
🔵 Needs a closer look
The positioning example calculates incorrect bounds for negatively scaled layers, and the color-array and template-discovery guidance also need correction.
No open issues 🎉
3 previously missed issues
In code that hasn't changed since last review
Use absolute scale values for bounding-box dimensions
For a flipped layer, either scale component can be negative, but the bounding-box width and height must remain positive. For example, a 200-pixel-wide layer at -100% X scale in a 1920-pixel comp with a 20-pixel margin gets a right edge of 2100 instead of 1900; negative Y scale likewise moves the top above the requested margin. Use the absolute scale components when calculating the dimensions.
Use four-component values for After Effects color properties
After Effects color properties (PropertyValueType.COLOR), including shape fills and Color Control effects, use four-component [r, g, b, a] values. The blanket RGB rule is incorrect for these properties; in particular, a color expression returning only three components fails its dimension check. Please distinguish color properties from APIs such as addSolid and TextDocument.fillColor, which do take three-component RGB arrays.
Document RenderQueueItem.templates for render settings
The example uses both render-settings and output-module templates, but OutputModule.templates lists only the latter. It cannot discover valid names for -RStemplate, so following this lookup instruction gives an incomplete template list. Document RenderQueueItem.templates for render settings as well.
The button passes every selected layer to a helper written for 2D layers; camera and light layers lack sourceRectAtTime(), so selecting one throws and stops processing the remaining layers. Filter the selection to supported 2D layers, or extend the helper before exposing it to other layer types.
The reason will be displayed to describe this comment to others. Learn more.
🔵 Needs a closer look
Human assessment is needed because 3D or keyframed transforms can cause the centering handler to throw, leaving later selected layers unprocessed.
No open issues 🎉
Review effort: Balanced
This branch has not been deployed
No deployments
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pull Request Checklist
npm startand verified thatREADME.mdis up to date.mainbranch for this pull request.Description
Plugin to help write, edit, or debug Adobe After Effects scripts, expressions, extensions, plugins, and MCP servers, or to build automated tools that assemble and render compositions in Adobe After Effects.
For full test results
ctrl + clicksupport-repo.Test Conditions
Full test results (ctrl + click) at support repo.
Evaluation Context
Copilot Pro+ Plan Credit Usage
Prompt
Results
The test worked in one prompt with no post edits. Copilot CLI (Claude Haiku 5.5, reasoning effort medium) used both skills to build Acme Sting, an After Effects 2026 extension that draws the Acme Corp logo and animates it into the closing sting of a TV spot, and a small docs site for it.
AEFT[25.0,99.9]with a preset menu, a switch and values for each effect, color and text fields, Build and Render buttons, and a.debugfile for unsigned development.AfterFX.exe -s, waits for the JSON result, and turns the MP4 into a GIF with ffmpeg. The GIF steps through renders of the three presets and a custom combination;aerenderrendered Classic again from the saved project.aerender), and changelog. Relative links only, no external assets.aerenderrendered the saved project to a 1920 x 1080, 30 fps, 6.00-second H.264 MP4.Found by the test:
<extension folder>/../jsx/acme-sting.jsx, ExtendScript collapses the..before following the junction,$.evalFilereturns nothing, and the panel stays at "Ready." without loading presets. The command line works. Keeping the host script inside the extension folder (<ScriptPath>) avoids this, and the integrations skill'scep.mdnow says so.usage.htmlpassesresult:, but the script readsresultFile.acme-sting.jsxcreates it on its first run, and its auto-saves and logs hold local paths.Type of Contribution
By submitting this pull request, I confirm that my contribution abides by the Code of Conduct and will be licensed under the MIT License.