afterpresets 0.2.0 → 0.4.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 (139) hide show
  1. package/README.md +9 -6
  2. package/native-runtime/CMakeLists.txt +82 -0
  3. package/native-runtime/README.md +40 -0
  4. package/native-runtime/THIRD_PARTY_NOTICES.md +14 -0
  5. package/native-runtime/include/ap_native.h +223 -0
  6. package/native-runtime/src/apply.cpp +199 -0
  7. package/native-runtime/src/crypto.cpp +225 -0
  8. package/native-runtime/src/crypto.hpp +51 -0
  9. package/native-runtime/src/dialog.cpp +62 -0
  10. package/native-runtime/src/dialog.hpp +35 -0
  11. package/native-runtime/src/engine.cpp +909 -0
  12. package/native-runtime/src/engine.hpp +232 -0
  13. package/native-runtime/src/fsutil.cpp +291 -0
  14. package/native-runtime/src/fsutil.hpp +57 -0
  15. package/native-runtime/src/json.cpp +326 -0
  16. package/native-runtime/src/json.hpp +70 -0
  17. package/native-runtime/src/platform.hpp +83 -0
  18. package/native-runtime/src/platform_common.cpp +60 -0
  19. package/native-runtime/src/platform_mac.mm +314 -0
  20. package/native-runtime/src/platform_win.cpp +277 -0
  21. package/native-runtime/src/runtime.cpp +473 -0
  22. package/native-runtime/src/util.cpp +169 -0
  23. package/native-runtime/src/util.hpp +32 -0
  24. package/native-runtime/src/zip.cpp +243 -0
  25. package/native-runtime/src/zip.hpp +58 -0
  26. package/native-runtime/third_party/monocypher/LICENCE.md +167 -0
  27. package/native-runtime/third_party/monocypher/monocypher-ed25519.c +500 -0
  28. package/native-runtime/third_party/monocypher/monocypher-ed25519.h +140 -0
  29. package/native-runtime/third_party/monocypher/monocypher.c +2956 -0
  30. package/native-runtime/third_party/monocypher/monocypher.h +321 -0
  31. package/native-runtime/third_party/tinf/LICENSE +22 -0
  32. package/native-runtime/third_party/tinf/crc32.c +57 -0
  33. package/native-runtime/third_party/tinf/tinf.h +140 -0
  34. package/native-runtime/third_party/tinf/tinflate.c +636 -0
  35. package/native-runtime/vendor-files.json +39 -0
  36. package/package.json +7 -4
  37. package/runtime/docs/cep/host-after-effects.md +3 -3
  38. package/runtime/docs/cep/host-premiere.md +4 -4
  39. package/runtime/docs/cep/host.md +10 -2
  40. package/runtime/docs/common/README.md +1 -1
  41. package/runtime/docs/native/README.md +44 -0
  42. package/runtime/docs/native/debugging.md +140 -0
  43. package/runtime/docs/native/rules.md +402 -0
  44. package/runtime/docs/native/testing.md +154 -0
  45. package/runtime/package.json +1 -1
  46. package/runtime/scripts/ae-sdk-docs/config.js +102 -0
  47. package/runtime/scripts/ae-sdk-docs/convert.js +430 -0
  48. package/runtime/scripts/ae-sdk-docs/index.js +314 -0
  49. package/runtime/scripts/ae-sdk-docs/source.js +205 -0
  50. package/runtime/scripts/ae-sdk-docs/split.js +170 -0
  51. package/runtime/scripts/ae-sdk-docs.js +72 -0
  52. package/runtime/src/host.js +1 -1
  53. package/src/agent/cli-group.js +9 -0
  54. package/src/agent/extendscript.js +10 -0
  55. package/src/agent/host-target.js +1 -0
  56. package/src/agent/panels.js +1 -0
  57. package/src/agent/png.js +1 -0
  58. package/src/agent/run-tool.js +3 -0
  59. package/src/{mcp → agent}/snapshot.js +2 -2
  60. package/src/agent/tool-error.js +1 -0
  61. package/src/agent/tools/capture.js +3 -0
  62. package/src/agent/tools/host.js +1 -0
  63. package/src/agent/tools/native.js +1 -0
  64. package/src/agent/tools/panel.js +7 -0
  65. package/src/agent/tools.js +2 -0
  66. package/src/api/error-messages.js +1 -1
  67. package/src/build/build.js +9 -8
  68. package/src/check/check.js +3 -3
  69. package/src/check/native.js +14 -0
  70. package/src/check/pricing.js +1 -1
  71. package/src/cli.js +3 -3
  72. package/src/commands/build.js +8 -2
  73. package/src/commands/check.js +10 -2
  74. package/src/commands/comp.js +6 -0
  75. package/src/commands/dev.js +29 -2
  76. package/src/commands/docs.js +5 -1
  77. package/src/commands/host.js +1 -0
  78. package/src/commands/init.js +12 -7
  79. package/src/commands/panel.js +1 -0
  80. package/src/commands/push.js +9 -2
  81. package/src/commands/releases.js +8 -3
  82. package/src/commands/sdk.js +14 -0
  83. package/src/commands/testers.js +1 -1
  84. package/src/commands/upgrade.js +2 -2
  85. package/src/commands/whoami.js +1 -1
  86. package/src/dev/bridge.js +8 -0
  87. package/src/dev/native.js +3 -0
  88. package/src/dev/session.js +5 -4
  89. package/src/native/build.js +27 -0
  90. package/src/native/cmake/CMakeLists.txt +88 -0
  91. package/src/native/cmake/zig-windows.cmake +19 -0
  92. package/src/native/effect.js +3 -0
  93. package/src/native/install.js +8 -0
  94. package/src/native/installers.js +4 -0
  95. package/src/native/pipl.js +20 -0
  96. package/src/native/restart.js +2 -0
  97. package/src/native/sdk.js +8 -0
  98. package/src/project/docs.js +3 -3
  99. package/src/project/project.js +2 -2
  100. package/src/project/template.js +5 -4
  101. package/src/prompt.js +1 -1
  102. package/src/release/confirm.js +5 -0
  103. package/src/release/native.js +3 -0
  104. package/src/release/publish.js +1 -1
  105. package/src/system/run-command.js +1 -1
  106. package/src/targets.js +1 -1
  107. package/template/cep/AGENTS.md +102 -164
  108. package/template/cep/README.md +7 -3
  109. package/template/cep/docs/code_guide.md +67 -0
  110. package/template/cep/docs/initial_setup.md +63 -42
  111. package/template/cep/docs/release_checklist.md +25 -0
  112. package/template/cep/gitignore +2 -1
  113. package/template/cep/src/features/update-screen/update-screen.js +1 -1
  114. package/template/hosts/AGENTS.two-apps.md +12 -0
  115. package/template/native/AGENTS.md +106 -0
  116. package/template/native/README.md +71 -0
  117. package/template/native/docs/code_guide.md +72 -0
  118. package/template/native/docs/initial_setup.md +154 -0
  119. package/template/native/docs/release_checklist.md +25 -0
  120. package/template/native/effect.json +16 -0
  121. package/template/native/gitignore +9 -0
  122. package/template/native/package.json +14 -0
  123. package/template/native/src/Effect.cpp +224 -0
  124. package/template/native/src/License.cpp +95 -0
  125. package/template/native/src/License.h +29 -0
  126. package/template/native/src/Render.h +68 -0
  127. package/src/commands/mcp.js +0 -7
  128. package/src/mcp/extendscript.js +0 -9
  129. package/src/mcp/panels.js +0 -1
  130. package/src/mcp/protocol.js +0 -4
  131. package/src/mcp/server.js +0 -2
  132. package/src/mcp/tools/account.js +0 -3
  133. package/src/mcp/tools/host.js +0 -1
  134. package/src/mcp/tools/panel.js +0 -7
  135. package/src/mcp/tools/project.js +0 -40
  136. package/src/mcp/tools/releases.js +0 -29
  137. package/template/cep/.mcp.json +0 -8
  138. /package/src/{mcp → agent}/capture.js +0 -0
  139. /package/src/{mcp → agent}/redact.js +0 -0
@@ -0,0 +1,154 @@
1
+ ---
2
+ title: Testing a native effect
3
+ description: How the agent tests every change itself in After Effects - build, apply the effect with ap host eval, render frames with ap comp capture and look at them - plus the checks to run before saying done.
4
+ ---
5
+
6
+ # Testing a native effect
7
+
8
+ You test your own work. A change is done only when you have built it, applied
9
+ the effect in After Effects, rendered frames, **looked at them**, and shown
10
+ them to the user. "It compiles" is not done.
11
+
12
+ The commands (run them from the project folder as `npx ap ...`):
13
+
14
+ | Command | Use |
15
+ |---|---|
16
+ | `ap host bridge` | Status, install or removal of the dev bridge that lets these commands reach After Effects when the project has no panel |
17
+ | `ap host scratch` | Switch After Effects to a scratch project before changing anything |
18
+ | `ap host eval` | Run ExtendScript in After Effects: build a test comp, apply the effect, set parameters, read values |
19
+ | `ap comp capture` | Render frames of a comp at full quality and save them as PNG files (up to 12 per run) |
20
+
21
+ ## One-time setup
22
+
23
+ 1. The first `ap dev` installs the dev bridge. Run `ap host bridge`; if
24
+ the bridge is not installed, run `ap host bridge install`.
25
+ Then ask the user to save their work and restart After Effects once. Afterwards `ap host bridge` must report the bridge as
26
+ loaded in After Effects.
27
+ 2. Never quit or restart After Effects yourself while the user may have
28
+ unsaved work. Ask them.
29
+
30
+ ## Every change
31
+
32
+ 1. **Build and install.** Save; `ap dev` (or `ap dev --background`) rebuilds, signs
33
+ the plugin for local use and installs it into
34
+ `/Library/Application Support/Adobe/Common/Plug-ins/7.0/MediaCore/AfterPresets Dev/<bundleId>/`.
35
+ Run `ap dev status` until the build is ok; fix compiler errors from its
36
+ `file:line` list. After Effects loads plugins only when it starts, so when
37
+ `ap dev status` says **RESTART NEEDED**: `ap dev` restarts After Effects by
38
+ itself only when that is safe (a saved or scratch project, no dialog
39
+ open); otherwise ask the user to save their work and restart it. Never
40
+ quit, kill or restart After Effects yourself.
41
+ 2. **Scratch project.** Run `ap host scratch` before you add, change or
42
+ delete anything in After Effects. Never test in the user's project.
43
+ 3. **Apply the effect by match name** in a test comp with `ap host eval`:
44
+
45
+ ```js
46
+ var c = app.project.items.addComp("AP Test", 1920, 1080, 1, 4, 30);
47
+ var bg = c.layers.addSolid([0.15, 0.3, 0.6], "Base", 1920, 1080, 1, 4);
48
+ var t = c.layers.addText("Hello"); // something with edges and alpha
49
+ t.property("ADBE Transform Group").property("ADBE Scale").setValue([400, 400]);
50
+ var fx = t.property("ADBE Effect Parade").addProperty("ACME Soft Glow"); // your match name
51
+ if (!fx) return "not applied";
52
+ fx.property(1).setValue(40); // first parameter after the layer
53
+ c.openInViewer();
54
+ return fx.name + " | " + fx.numProperties + " properties";
55
+ ```
56
+
57
+ If `addProperty` throws or returns null, the match name is wrong or After
58
+ Effects did not load the plugin: see [debugging.md](debugging.md).
59
+ 4. **Render and look.** Run `ap comp capture` (for example `--frames 0,60,119`,
60
+ or `--seconds 1.5`). It clears After Effects' caches first by default, so
61
+ every frame comes from the build that is loaded now (undo history is kept).
62
+ Open each image and check what the change
63
+ was meant to do, plus edges, transparency and colour.
64
+ 5. **Show the user** the frames and say what you checked and what you did not.
65
+
66
+ ## Testing the locked (signed-out) state
67
+
68
+ Dev builds from `ap dev` render **without** the licence watermark, so you
69
+ can judge the look. To test what a signed-out buyer sees, create the file
70
+ `~/.afterpresets/native-dev-enforce-license` (or start After Effects with
71
+ `AP_DEV_ENFORCE_LICENSE=1`), restart After Effects (ask the user), and
72
+ capture frames. Delete the file afterwards. Release builds always enforce
73
+ the licence. The status button (`params[AP_PARAM_LICENSE]`, caption
74
+ "License...") shows the state in its name, e.g. "License: sign in"; read it
75
+ with `ap host eval` if needed.
76
+
77
+ ## Before saying done
78
+
79
+ Run what applies to the change. Each line names the classic bug it catches
80
+ (the rules are in [rules.md](rules.md)).
81
+
82
+ | Check | How | Catches |
83
+ |---|---|---|
84
+ | Every parameter | Set each to its minimum, default and maximum; capture | Wrong union member, ranges, division by zero |
85
+ | Animation | Keyframe a parameter (`setValueAtTime`), capture several frames | Values read at the wrong time, cached state |
86
+ | 16 and 32 bpc | `app.project.bitsPerChannel = 16` then `32`, capture the same frames; compare with 8 | Missing depth paths, 32767/65535 white, clamped overbrights |
87
+ | Half resolution | `c.resolutionFactor = [2, 2]`, capture; the result must look like a smaller copy of full resolution | Ignored downsample factors |
88
+ | Small or moved layer | Layer smaller than the comp, partly outside it | Hard-coded sizes, `rowbytes`, origin |
89
+ | Upstream expansion | Put a Gaussian Blur before your effect, capture with the blur on and off | Buffer origin, point parameters |
90
+ | Two instances | Apply the effect to two layers with different settings, capture | Globals and statics shared between instances |
91
+ | Save and reopen | Save the scratch project, `app.open()` it again, capture the same frame | Parameter disk IDs, sequence data flattening |
92
+ | Render speed | Read the render times `ap comp capture` reports (caches are cleared first) | Slow paths, blocking work in render |
93
+
94
+ Not covered yet (say so to the user when it matters): the Windows `.aex` is
95
+ built on the Mac but tested by the user on a Windows PC; Premiere Pro;
96
+ multi-frame rendering under load. For the last one, when the effect declares
97
+ multi-frame rendering, ask the user to render the test comp from the Render
98
+ Queue with Multi-Frame Rendering on and compare it with your captures.
99
+
100
+ ## Scripting pitfalls
101
+
102
+ Some After Effects scripting errors abort the whole `ap host eval` script, and
103
+ `try/catch` cannot catch them. Avoid them:
104
+
105
+ - **Re-fetch an effect after `moveTo()`.** `fx.moveTo(1)` invalidates `fx`;
106
+ the next access to the old reference aborts the script. Get it again by
107
+ index or name:
108
+
109
+ ```js
110
+ fx.moveTo(1);
111
+ fx = layer.property("ADBE Effect Parade").property(1);
112
+ ```
113
+
114
+ - **Never turn an array into a string implicitly** (`"" + value`, `alert(arr)`,
115
+ string concatenation with a colour or point value). Use `value.join(",")`
116
+ or `JSON.stringify(value)`.
117
+ - **Never open a modal dialog** from a script: no `alert`, `confirm`,
118
+ `prompt`, `File.openDialog`, and no `app.project.save()` without a file
119
+ (it shows the Save dialog). While a dialog is open After Effects answers
120
+ no commands.
121
+ - **Save and reopen** (the "Save and reopen" check) without dialogs: save the
122
+ scratch project to an explicit file, open it again, then look everything
123
+ up again by name, because every comp, layer and effect reference from
124
+ before is invalid:
125
+
126
+ ```js
127
+ var f = new File(Folder.temp.fsName + "/ap-test-reopen.aep");
128
+ app.project.save(f);
129
+ app.open(f);
130
+ var c = null;
131
+ for (var i = 1; i <= app.project.numItems; i++) {
132
+ if (app.project.item(i).name === "AP Test") c = app.project.item(i);
133
+ }
134
+ var fx = c.layer("Hello").property("ADBE Effect Parade").property(1);
135
+ return fx.matchName;
136
+ ```
137
+
138
+ Then `ap comp capture` the same frames as before saving and compare them.
139
+ - **The effect's Options dialog is modal.** Never open or click it from a
140
+ script or tool. When it needs checking (sign-in, licence status, update
141
+ text), ask the user to click the effect's **Options** link or its
142
+ **License...** button, and to tell you or screenshot what it shows.
143
+
144
+ ## If something goes wrong
145
+
146
+ - `ap comp capture` times out or After Effects stops answering: a modal dialog
147
+ (error, crash report, licence) may be open. Ask the user what After Effects
148
+ shows; do not retry in a loop.
149
+ - The frame did not change after a rebuild: the old binary is still loaded.
150
+ `ap dev status` says whether a restart is needed; After Effects must restart
151
+ to load a new build.
152
+ - `ap host eval` or `ap comp capture` returns nothing or says the script engine
153
+ is busy: After Effects is probably showing a dialog. Ask the user.
154
+ - Crashes and load failures: [debugging.md](debugging.md).
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@afterpresets/runtime",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "private": true
5
5
  }
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+
3
+ // What the generator reads and how the result is organised.
4
+ //
5
+ // Bumping the pin: clone the repository, check out the new commit, run
6
+ // node scripts/ae-sdk-docs.js --source <checkout> --out <tmp> --allow-unpinned
7
+ // read the output, then copy the printed commit and digest here. The run fails
8
+ // if a page or anchor named in TASKS no longer exists; fix TASKS first.
9
+
10
+ const PIN = {
11
+ repo: "docsforadobe/after-effects-plugin-guide",
12
+ commit: "c3fc3fc4132bbd0088b0b32461a5f21b2a88eb7b",
13
+ date: "2026-11-03",
14
+ sdk: "After Effects 27.0 SDK",
15
+ digest: "sha256:246909fbbd4d9e275ef4355649e4f68039e15eeec63ae3f121fc0c4a69fa2d02",
16
+ site: "https://ae-plugins.docsforadobe.dev",
17
+ };
18
+
19
+ /** Source pages left out: not about effect plug-ins (3D renderers, file importers) or no use to an agent. */
20
+ const EXCLUDE = [/^index\.md$/, /^history\.md$/, /^artisans\//, /^aeios\//];
21
+
22
+ const RENAME = {
23
+ "effect-details/tips-tricks.md": "effect-tips",
24
+ "effect-ui-events/tips-and-tricks.md": "ui-tips",
25
+ "intro/next-steps.md": "intro-next-steps",
26
+ };
27
+
28
+ // Sections whose page names are too generic on their own ("overview",
29
+ // "multithreading", "global-outflags").
30
+ const PREFIX = { "ppro/": "ppro", "audio/": "audio", "aegps/": "aegp" };
31
+
32
+ /** Output file name (without .md) for a source page path like "effect-basics/PF_InData.md". */
33
+ function outputName(sourcePath) {
34
+ if (RENAME[sourcePath]) return RENAME[sourcePath];
35
+ const base = sourcePath
36
+ .split("/")
37
+ .pop()
38
+ .replace(/\.md$/, "")
39
+ .toLowerCase()
40
+ .replace(/_/g, "-");
41
+ const dir = Object.keys(PREFIX).find((d) => sourcePath.indexOf(d) === 0);
42
+ if (!dir) return base;
43
+ const stem = PREFIX[dir];
44
+ if (base === stem || base === stem + "s" || base.indexOf(stem + "-") === 0) return base;
45
+ return stem + "-" + base;
46
+ }
47
+
48
+ // Split thresholds in characters (about 4 characters per token).
49
+ const LIMITS = { maxChars: 14000, singleMax: 18000, minChars: 4000, mergeMax: 9000 };
50
+
51
+ /** Reading order for a first effect. */
52
+ const START_HERE = [
53
+ "intro/what-can-i-do.md",
54
+ "effect-basics/entry-point.md",
55
+ "effect-basics/command-selectors.md#calling-sequence",
56
+ "effect-basics/parameters.md",
57
+ "smartfx/smartfx.md",
58
+ "effect-details/multi-frame-rendering-in-ae.md",
59
+ ];
60
+
61
+ /** Task -> source references ("page.md" or "page.md#anchor"). Every reference must resolve. */
62
+ const TASKS = [
63
+ ["Start a new effect: how plug-ins work, the entry point", ["intro/what-can-i-do.md", "effect-basics/effect-basics.md", "effect-basics/entry-point.md"]],
64
+ ["Copy from an Adobe sample project", ["intro/sample-projects.md#sample-project-descriptions"]],
65
+ ["Handle a command (PF_Cmd_*), know which command comes when", ["effect-basics/command-selectors.md#calling-sequence", "effect-basics/command-selectors.md#command-selectors-table"]],
66
+ ["Read what After Effects passes in (in_data: time, downsampling, extent_hint)", ["effect-basics/PF_InData.md#pf_indata-members", "effect-basics/PF_InData.md#extent_hint-usage"]],
67
+ ["Set capabilities: out_flags / out_flags2", ["effect-basics/PF_OutData.md#pf_outflags", "effect-basics/PF_OutData.md#pf_outflags2"]],
68
+ ["Write or change the PiPL (match name, category, version, flags)", ["intro/pipl-resources.md", "intro/pipl-resources.md#multiple-pipls"]],
69
+ ["Add a parameter (slider, color, point, popup, checkbox, layer...)", ["effect-basics/parameters.md#parameter-types", "effect-basics/PF_ParamDef.md#pf_paramdef-members", "effect-basics/PF_ParamDef.md#parameter-flags"]],
70
+ ["Add, remove or reorder parameters in an effect that has shipped", ["effect-details/changing-parameter-orders.md"]],
71
+ ["Show, hide, enable or change parameters from code", ["effect-details/parameter-supervision.md#updating-parameter-ui", "effect-details/parameter-supervision.md#updating-parameter-values"]],
72
+ ["Read a parameter at another time, or a layer parameter's pixels", ["effect-details/interaction-callback-functions.md#interaction-callbacks", "effect-details/interaction-callback-functions.md#parameter-checkout-behavior"]],
73
+ ["Float values for color, point and angle parameters", ["effect-details/parameters-floating-point-values.md"]],
74
+ ["Store custom data in a parameter (arbitrary data)", ["effect-details/arbitrary-data-parameters.md"]],
75
+ ["Loop over pixels (iterate 8/16/32 bpc)", ["effect-details/iteration-suites.md", "effect-basics/PF_EffectWorld.md#pf_effectworld-structure", "effect-basics/PF_EffectWorld.md#rowbytes-in-pf_effectworlds"]],
76
+ ["Smart Render (PreRender / SmartRender, checking out layers)", ["smartfx/smartfx.md#how-to-smartify", "smartfx/smartfx.md#pf_cmd_smart_pre_render", "smartfx/smartfx.md#pf_cmd_smart_render"]],
77
+ ["Support 16 bpc and 32 bpc (float) color", ["smartfx/smartfx.md#the-way-things-are-now", "effect-ui-events/tips-and-tricks.md#how-deep-are-my-pixels", "effect-basics/PF_EffectWorld.md#pf_pixelptr-accessor-macros"]],
78
+ ["Draw outside the layer bounds (glows, shadows: expand the output)", ["effect-basics/PF_InData.md#point-controls-and-buffer-expansion", "smartfx/smartfx.md#rectangles", "smartfx/smartfx.md#the-size-of-a-layer"]],
79
+ ["Multi-frame rendering and thread safety", ["effect-details/multi-frame-rendering-in-ae.md", "effect-details/multi-frame-rendering-in-ae.md#what-does-it-mean-for-an-effect-to-be-thread-safe", "effect-details/accessing-function-suites.md#threading"]],
80
+ ["Cache expensive results across frames and threads (Compute Cache)", ["effect-details/compute-cache-api.md"]],
81
+ ["Global, sequence and frame data (and flattening)", ["effect-details/global-sequence-frame-data.md", "effect-details/multi-frame-rendering-in-ae.md#sequence-data-in-multi-frame-rendering"]],
82
+ ["Allocate memory and image buffers", ["effect-details/memory-allocation.md", "effect-details/image-buffer-management-functions.md"]],
83
+ ["Use a function suite (AcquireSuite, versions)", ["effect-details/accessing-function-suites.md", "intro/compatibility-across-multiple-versions.md#api-versions"]],
84
+ ["Sample, transform, blend, fill and convert color (utility callbacks)", ["effect-details/graphics-utility-suites.md", "effect-details/color-space-conversion.md", "effect-details/useful-utility-functions.md"]],
85
+ ["Non-square pixels and downsampled previews", ["effect-details/pixel-aspect-ratio.md"]],
86
+ ["Masks and paths, cameras and lights, motion blur", ["effect-details/working-with-paths.md", "effect-details/accessing-camera-light-information.md", "effect-details/motion-blur.md"]],
87
+ ["Custom UI in the comp or Effect Controls (events, Drawbot)", ["effect-ui-events/effect-ui-events.md", "effect-ui-events/custom-ui-and-drawbot.md", "effect-ui-events/PF_EventExtra.md", "effect-ui-events/ui-callbacks.md"]],
88
+ ["GPU rendering (Metal, CUDA, OpenCL, DirectX)", ["intro/gpu-build-instructions.md"]],
89
+ ["Call AEGP suites from an effect (project, layers, streams)", ["aegps/cheating-effect-usage-of-aegp-suites.md", "aegps/aegp-suites.md", "aegps/aegp-details.md#accessing-pixels-from-effect-layer-parameters"]],
90
+ ["Report errors, handle exceptions, out-of-memory", ["effect-basics/errors.md", "intro/exceptions.md"]],
91
+ ["Debug a plug-in (attach a debugger, reset preferences)", ["intro/debugging-plug-ins.md", "intro/debugging-ae-macos.md"]],
92
+ ["Build for Apple silicon (universal) and Windows on Arm, export only the entry point", ["intro/apple-silicon-support.md", "intro/windows-on-arm-support.md", "intro/symbol-export.md"]],
93
+ ["Where the plug-in is installed", ["intro/where-installers-should-put-plug-ins.md", "ppro/plug-in-installation.md"]],
94
+ ["Support older After Effects versions, see what changed in each SDK", ["intro/compatibility-across-multiple-versions.md", "intro/whats-new.md"]],
95
+ ["Effects panel: search keywords, description and preview media", ["intro/pipl-resources.md#search-keywords-and-description", "effect-details/effect-preview-media.md"]],
96
+ ["Localized names and UTF-8 strings", ["intro/localization.md"]],
97
+ ["Make the effect work in Premiere Pro", ["ppro/ppro.md", "ppro/basic-host-differences.md", "ppro/bigger-differences.md", "ppro/multithreading.md", "ppro/unsupported-features.md"]],
98
+ ["Audio effects", ["audio/audio.md", "audio/accessing-audio-data.md"]],
99
+ ["Performance, caching and testing tips from Adobe", ["effect-details/tips-tricks.md", "effect-details/tips-tricks.md#testing", "effect-ui-events/tips-and-tricks.md#ui-performance"]],
100
+ ];
101
+
102
+ module.exports = { PIN, EXCLUDE, RENAME, PREFIX, LIMITS, START_HERE, TASKS, outputName };