ae-agent-skills 0.2.4 → 0.2.5
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/README.ja.md +1 -0
- package/README.md +1 -0
- package/bin/ae-agent-setup.mjs +32 -0
- package/docs/cli.ja.md +49 -0
- package/docs/cli.md +49 -0
- package/docs/development.ja.md +62 -0
- package/docs/development.md +62 -0
- package/examples/scene.example.json +46 -0
- package/package.json +4 -1
- package/schemas/scene.schema.json +454 -0
- package/templates/skills/aftereffects-cli.SKILL.md +8 -1
- package/templates/skills/aftereffects-declarative.SKILL.md +21 -13
package/README.ja.md
CHANGED
|
@@ -15,6 +15,7 @@ npx ae-agent-skills install
|
|
|
15
15
|
1. `--agent` 未指定なら、`codex` / `gemini` / `both` の選択を表示します。
|
|
16
16
|
2. 署名済み ZXP を `UPIA` または `ExManCmd` でインストールします。
|
|
17
17
|
3. `ae-cli` と agent skill をインストールします。
|
|
18
|
+
4. `~/ae-agent-skills/` を初期化し、`work/`・`done/`・`scene.schema.json`・`references/` を配置します。
|
|
18
19
|
|
|
19
20
|
## エージェントで実行
|
|
20
21
|
|
package/README.md
CHANGED
|
@@ -15,6 +15,7 @@ What happens:
|
|
|
15
15
|
1. The installer asks which agent to configure (`codex` / `gemini` / `both`) if `--agent` is omitted.
|
|
16
16
|
2. It installs the signed ZXP extension via `UPIA` or `ExManCmd`.
|
|
17
17
|
3. It installs `ae-cli` and agent skills.
|
|
18
|
+
4. It initializes `~/ae-agent-skills/` with `work/`, `done/`, `scene.schema.json`, and `references/`.
|
|
18
19
|
|
|
19
20
|
## Run with your agent
|
|
20
21
|
|
package/bin/ae-agent-setup.mjs
CHANGED
|
@@ -8,10 +8,17 @@ import readline from 'node:readline';
|
|
|
8
8
|
import { fileURLToPath } from 'node:url';
|
|
9
9
|
|
|
10
10
|
const DEFAULT_REPO = 'yumehiko/ae-agent-skills';
|
|
11
|
+
const AGENT_WORKSPACE_NAME = 'ae-agent-skills';
|
|
11
12
|
const SKILL_SOURCES = [
|
|
12
13
|
{ sourceName: 'aftereffects-cli.SKILL.md', destinationName: 'aftereffects-cli' },
|
|
13
14
|
{ sourceName: 'aftereffects-declarative.SKILL.md', destinationName: 'aftereffects-declarative' },
|
|
14
15
|
];
|
|
16
|
+
const WORKSPACE_RESOURCE_SOURCES = [
|
|
17
|
+
{ source: ['schemas', 'scene.schema.json'], destination: ['scene.schema.json'] },
|
|
18
|
+
{ source: ['examples', 'scene.example.json'], destination: ['references', 'scene.example.json'] },
|
|
19
|
+
{ source: ['docs', 'cli.ja.md'], destination: ['references', 'cli.ja.md'] },
|
|
20
|
+
{ source: ['docs', 'cli.md'], destination: ['references', 'cli.md'] },
|
|
21
|
+
];
|
|
15
22
|
|
|
16
23
|
function printHelp() {
|
|
17
24
|
console.log(`ae-agent-setup
|
|
@@ -255,6 +262,29 @@ function installSkills(agent) {
|
|
|
255
262
|
}
|
|
256
263
|
}
|
|
257
264
|
|
|
265
|
+
function setupAgentWorkspace() {
|
|
266
|
+
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
267
|
+
const workspaceRoot = path.join(os.homedir(), AGENT_WORKSPACE_NAME);
|
|
268
|
+
const workDir = path.join(workspaceRoot, 'work');
|
|
269
|
+
const doneDir = path.join(workspaceRoot, 'done');
|
|
270
|
+
const refsDir = path.join(workspaceRoot, 'references');
|
|
271
|
+
|
|
272
|
+
fs.mkdirSync(workDir, { recursive: true });
|
|
273
|
+
fs.mkdirSync(doneDir, { recursive: true });
|
|
274
|
+
fs.mkdirSync(refsDir, { recursive: true });
|
|
275
|
+
|
|
276
|
+
for (const resource of WORKSPACE_RESOURCE_SOURCES) {
|
|
277
|
+
const source = path.join(root, ...resource.source);
|
|
278
|
+
const destination = path.join(workspaceRoot, ...resource.destination);
|
|
279
|
+
if (!fs.existsSync(source)) {
|
|
280
|
+
throw new Error(`Workspace resource not found: ${source}`);
|
|
281
|
+
}
|
|
282
|
+
fs.copyFileSync(source, destination);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
console.log(`Prepared workspace: ${workspaceRoot}`);
|
|
286
|
+
}
|
|
287
|
+
|
|
258
288
|
function installCli(repo) {
|
|
259
289
|
if (!commandExists('python3')) {
|
|
260
290
|
throw new Error('python3 is required to install ae-cli.');
|
|
@@ -272,6 +302,7 @@ function installCli(repo) {
|
|
|
272
302
|
|
|
273
303
|
async function installCommand(opts) {
|
|
274
304
|
console.log('Starting ae-agent setup...');
|
|
305
|
+
setupAgentWorkspace();
|
|
275
306
|
|
|
276
307
|
const agent = await resolveAgent(opts.agent);
|
|
277
308
|
console.log(`Selected agent target: ${agent}`);
|
|
@@ -308,6 +339,7 @@ async function installCommand(opts) {
|
|
|
308
339
|
console.log(' 1) Fully restart After Effects.');
|
|
309
340
|
console.log(' 2) Open the panel: Window > Extensions (Beta) > ae-agent-skill.');
|
|
310
341
|
console.log(' 3) Run: ae-cli health');
|
|
342
|
+
console.log(` 4) Use workspace: ${path.join(os.homedir(), AGENT_WORKSPACE_NAME)}`);
|
|
311
343
|
}
|
|
312
344
|
|
|
313
345
|
async function main() {
|
package/docs/cli.ja.md
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# CLI利用方法
|
|
2
|
+
|
|
3
|
+
## 基本確認
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
ae-cli --help
|
|
7
|
+
ae-cli health
|
|
8
|
+
ae-cli layers
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
`ae-cli` が `PATH` にない場合:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
PYTHONPATH=src python3 -m ae_cli.main --help
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
デフォルトのブリッジURL:
|
|
18
|
+
|
|
19
|
+
- `AE_BRIDGE_URL` があればそれを使用
|
|
20
|
+
- なければ `http://127.0.0.1:8080`
|
|
21
|
+
|
|
22
|
+
## よく使うコマンド
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
ae-cli list-comps
|
|
26
|
+
ae-cli create-comp --name "Main" --width 1920 --height 1080 --duration 8 --frame-rate 30
|
|
27
|
+
ae-cli set-active-comp --comp-name "Main"
|
|
28
|
+
ae-cli selected-properties
|
|
29
|
+
ae-cli expression-errors
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 宣言的シーン適用
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
ae-cli apply-scene --scene-file examples/scene.example.json --validate-only
|
|
36
|
+
ae-cli apply-scene --scene-file examples/scene.example.json
|
|
37
|
+
ae-cli apply-scene --scene-file examples/scene.example.json --mode replace-managed
|
|
38
|
+
ae-cli apply-scene --scene-file examples/scene.example.json --mode clear-all
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
スキーマ:
|
|
42
|
+
|
|
43
|
+
- `schemas/scene.schema.json`
|
|
44
|
+
|
|
45
|
+
`apply-scene` の mode:
|
|
46
|
+
|
|
47
|
+
- `merge`(デフォルト): upsertのみ
|
|
48
|
+
- `replace-managed`: 不要な `aeSceneId:*` 管理レイヤーを削除して適用
|
|
49
|
+
- `clear-all`: compを空にして適用
|
package/docs/cli.md
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# CLI Usage
|
|
2
|
+
|
|
3
|
+
## Basic checks
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
ae-cli --help
|
|
7
|
+
ae-cli health
|
|
8
|
+
ae-cli layers
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
If `ae-cli` is not on your `PATH`:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
PYTHONPATH=src python3 -m ae_cli.main --help
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Default bridge URL:
|
|
18
|
+
|
|
19
|
+
- `AE_BRIDGE_URL` if set
|
|
20
|
+
- otherwise `http://127.0.0.1:8080`
|
|
21
|
+
|
|
22
|
+
## Common commands
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
ae-cli list-comps
|
|
26
|
+
ae-cli create-comp --name "Main" --width 1920 --height 1080 --duration 8 --frame-rate 30
|
|
27
|
+
ae-cli set-active-comp --comp-name "Main"
|
|
28
|
+
ae-cli selected-properties
|
|
29
|
+
ae-cli expression-errors
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Declarative scene apply
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
ae-cli apply-scene --scene-file examples/scene.example.json --validate-only
|
|
36
|
+
ae-cli apply-scene --scene-file examples/scene.example.json
|
|
37
|
+
ae-cli apply-scene --scene-file examples/scene.example.json --mode replace-managed
|
|
38
|
+
ae-cli apply-scene --scene-file examples/scene.example.json --mode clear-all
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Schema:
|
|
42
|
+
|
|
43
|
+
- `schemas/scene.schema.json`
|
|
44
|
+
|
|
45
|
+
`apply-scene` modes:
|
|
46
|
+
|
|
47
|
+
- `merge` (default): upsert only
|
|
48
|
+
- `replace-managed`: remove unmanaged `aeSceneId:*` leftovers, then apply
|
|
49
|
+
- `clear-all`: clear comp, then apply
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# 開発者向け情報
|
|
2
|
+
|
|
3
|
+
## ローカル開発の前提
|
|
4
|
+
|
|
5
|
+
- macOS
|
|
6
|
+
- Adobe After Effects(CEP対応環境)
|
|
7
|
+
- Python 3.10+
|
|
8
|
+
|
|
9
|
+
## 未署名ローカル開発モード
|
|
10
|
+
|
|
11
|
+
未署名拡張で開発する場合は `PlayerDebugMode=1` を有効化します。
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
defaults domains | tr ',' '\n' | rg 'com\.adobe\.CSXS\.'
|
|
15
|
+
# 例: com.adobe.CSXS.11 の場合
|
|
16
|
+
defaults write com.adobe.CSXS.11 PlayerDebugMode 1
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
設定後は After Effects を完全終了して再起動してください。
|
|
20
|
+
|
|
21
|
+
## Python開発セットアップ
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
python3 -m pip install -e ".[dev]"
|
|
25
|
+
PYTHONPATH=src pytest
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## プロジェクト構成
|
|
29
|
+
|
|
30
|
+
### Python CLI
|
|
31
|
+
|
|
32
|
+
- `src/ae_cli/cli_parser.py`
|
|
33
|
+
- `src/ae_cli/cli_runner.py`
|
|
34
|
+
- `src/ae_cli/client.py`
|
|
35
|
+
- `src/ae_cli/main.py`
|
|
36
|
+
|
|
37
|
+
### ExtendScript host
|
|
38
|
+
|
|
39
|
+
- `host/index.jsx`
|
|
40
|
+
- `host/lib/common.jsx`
|
|
41
|
+
- `host/lib/property_utils.jsx`
|
|
42
|
+
- `host/lib/query_handlers.jsx`
|
|
43
|
+
- `host/lib/mutation_handlers.jsx`
|
|
44
|
+
- `host/lib/mutation_keyframe_handlers.jsx`
|
|
45
|
+
- `host/lib/mutation_shape_handlers.jsx`
|
|
46
|
+
- `host/lib/mutation_timeline_handlers.jsx`
|
|
47
|
+
- `host/lib/mutation_layer_structure_handlers.jsx`
|
|
48
|
+
- `host/lib/mutation_scene_handlers.jsx`
|
|
49
|
+
|
|
50
|
+
### CEP panel client
|
|
51
|
+
|
|
52
|
+
- `client/main.js`
|
|
53
|
+
- `client/lib/runtime.js`
|
|
54
|
+
- `client/lib/logging.js`
|
|
55
|
+
- `client/lib/bridge_utils.js`
|
|
56
|
+
- `client/lib/request_handlers_shape.js`
|
|
57
|
+
- `client/lib/request_handlers_scene.js`
|
|
58
|
+
- `client/lib/request_handlers_essential.js`
|
|
59
|
+
- `client/lib/request_handlers_timeline.js`
|
|
60
|
+
- `client/lib/request_handlers_layer_structure.js`
|
|
61
|
+
- `client/lib/request_handlers.js`
|
|
62
|
+
- `client/lib/server.js`
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Development
|
|
2
|
+
|
|
3
|
+
## Local dev requirements
|
|
4
|
+
|
|
5
|
+
- macOS
|
|
6
|
+
- Adobe After Effects (CEP-capable)
|
|
7
|
+
- Python 3.10+
|
|
8
|
+
|
|
9
|
+
## Unsigned local dev mode
|
|
10
|
+
|
|
11
|
+
For local unsigned extension workflows, enable `PlayerDebugMode=1`:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
defaults domains | tr ',' '\n' | rg 'com\.adobe\.CSXS\.'
|
|
15
|
+
# Example for com.adobe.CSXS.11
|
|
16
|
+
defaults write com.adobe.CSXS.11 PlayerDebugMode 1
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Then fully quit and relaunch After Effects.
|
|
20
|
+
|
|
21
|
+
## Python dev setup
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
python3 -m pip install -e ".[dev]"
|
|
25
|
+
PYTHONPATH=src pytest
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Project structure
|
|
29
|
+
|
|
30
|
+
### Python CLI
|
|
31
|
+
|
|
32
|
+
- `src/ae_cli/cli_parser.py`
|
|
33
|
+
- `src/ae_cli/cli_runner.py`
|
|
34
|
+
- `src/ae_cli/client.py`
|
|
35
|
+
- `src/ae_cli/main.py`
|
|
36
|
+
|
|
37
|
+
### ExtendScript host
|
|
38
|
+
|
|
39
|
+
- `host/index.jsx`
|
|
40
|
+
- `host/lib/common.jsx`
|
|
41
|
+
- `host/lib/property_utils.jsx`
|
|
42
|
+
- `host/lib/query_handlers.jsx`
|
|
43
|
+
- `host/lib/mutation_handlers.jsx`
|
|
44
|
+
- `host/lib/mutation_keyframe_handlers.jsx`
|
|
45
|
+
- `host/lib/mutation_shape_handlers.jsx`
|
|
46
|
+
- `host/lib/mutation_timeline_handlers.jsx`
|
|
47
|
+
- `host/lib/mutation_layer_structure_handlers.jsx`
|
|
48
|
+
- `host/lib/mutation_scene_handlers.jsx`
|
|
49
|
+
|
|
50
|
+
### CEP panel client
|
|
51
|
+
|
|
52
|
+
- `client/main.js`
|
|
53
|
+
- `client/lib/runtime.js`
|
|
54
|
+
- `client/lib/logging.js`
|
|
55
|
+
- `client/lib/bridge_utils.js`
|
|
56
|
+
- `client/lib/request_handlers_shape.js`
|
|
57
|
+
- `client/lib/request_handlers_scene.js`
|
|
58
|
+
- `client/lib/request_handlers_essential.js`
|
|
59
|
+
- `client/lib/request_handlers_timeline.js`
|
|
60
|
+
- `client/lib/request_handlers_layer_structure.js`
|
|
61
|
+
- `client/lib/request_handlers.js`
|
|
62
|
+
- `client/lib/server.js`
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"composition": {
|
|
3
|
+
"name": "Main",
|
|
4
|
+
"width": 1920,
|
|
5
|
+
"height": 1080,
|
|
6
|
+
"duration": 8,
|
|
7
|
+
"frameRate": 30,
|
|
8
|
+
"pixelAspect": 1,
|
|
9
|
+
"createIfMissing": true,
|
|
10
|
+
"setActive": true
|
|
11
|
+
},
|
|
12
|
+
"layers": [
|
|
13
|
+
{
|
|
14
|
+
"id": "bg",
|
|
15
|
+
"type": "solid",
|
|
16
|
+
"name": "BG",
|
|
17
|
+
"width": 1920,
|
|
18
|
+
"height": 1080,
|
|
19
|
+
"color": [18, 34, 56],
|
|
20
|
+
"timing": {
|
|
21
|
+
"inPoint": 0,
|
|
22
|
+
"outPoint": 8
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "title",
|
|
27
|
+
"type": "text",
|
|
28
|
+
"name": "Title",
|
|
29
|
+
"text": "Hello Agent",
|
|
30
|
+
"transform": {
|
|
31
|
+
"position": [960, 540],
|
|
32
|
+
"scale": [100, 100],
|
|
33
|
+
"opacity": 100
|
|
34
|
+
},
|
|
35
|
+
"animations": [
|
|
36
|
+
{
|
|
37
|
+
"propertyPath": "ADBE Transform Group.ADBE Position",
|
|
38
|
+
"keyframes": [
|
|
39
|
+
{ "time": 0, "value": [960, 760], "outInterp": "bezier", "easeOut": [0, 70] },
|
|
40
|
+
{ "time": 0.8, "value": [960, 540], "inInterp": "bezier", "easeIn": [0, 80] }
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
]
|
|
46
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ae-agent-skills",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.5",
|
|
4
4
|
"description": "One-command installer for the ae-agent-skill After Effects extension and CLI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -10,6 +10,9 @@
|
|
|
10
10
|
"files": [
|
|
11
11
|
"bin",
|
|
12
12
|
"templates",
|
|
13
|
+
"schemas",
|
|
14
|
+
"examples",
|
|
15
|
+
"docs",
|
|
13
16
|
"scripts/signing",
|
|
14
17
|
"CSXS",
|
|
15
18
|
"client",
|
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://example.com/ae-agent-skills/scene.schema.json",
|
|
4
|
+
"title": "AE Declarative Scene",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": [
|
|
7
|
+
"layers"
|
|
8
|
+
],
|
|
9
|
+
"properties": {
|
|
10
|
+
"composition": {
|
|
11
|
+
"$ref": "#/$defs/composition"
|
|
12
|
+
},
|
|
13
|
+
"layers": {
|
|
14
|
+
"type": "array",
|
|
15
|
+
"minItems": 1,
|
|
16
|
+
"items": {
|
|
17
|
+
"$ref": "#/$defs/layer"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"additionalProperties": false,
|
|
22
|
+
"$defs": {
|
|
23
|
+
"numberArray2": {
|
|
24
|
+
"type": "array",
|
|
25
|
+
"minItems": 2,
|
|
26
|
+
"maxItems": 2,
|
|
27
|
+
"items": {
|
|
28
|
+
"type": "number"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"numberArray3": {
|
|
32
|
+
"type": "array",
|
|
33
|
+
"minItems": 3,
|
|
34
|
+
"maxItems": 3,
|
|
35
|
+
"items": {
|
|
36
|
+
"type": "number"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"numberArray2or3": {
|
|
40
|
+
"oneOf": [
|
|
41
|
+
{
|
|
42
|
+
"$ref": "#/$defs/numberArray2"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"$ref": "#/$defs/numberArray3"
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
"composition": {
|
|
50
|
+
"type": "object",
|
|
51
|
+
"properties": {
|
|
52
|
+
"compId": {
|
|
53
|
+
"type": "integer",
|
|
54
|
+
"minimum": 1
|
|
55
|
+
},
|
|
56
|
+
"compName": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"minLength": 1
|
|
59
|
+
},
|
|
60
|
+
"name": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"minLength": 1
|
|
63
|
+
},
|
|
64
|
+
"width": {
|
|
65
|
+
"type": "number",
|
|
66
|
+
"exclusiveMinimum": 0
|
|
67
|
+
},
|
|
68
|
+
"height": {
|
|
69
|
+
"type": "number",
|
|
70
|
+
"exclusiveMinimum": 0
|
|
71
|
+
},
|
|
72
|
+
"duration": {
|
|
73
|
+
"type": "number",
|
|
74
|
+
"exclusiveMinimum": 0
|
|
75
|
+
},
|
|
76
|
+
"frameRate": {
|
|
77
|
+
"type": "number",
|
|
78
|
+
"exclusiveMinimum": 0
|
|
79
|
+
},
|
|
80
|
+
"pixelAspect": {
|
|
81
|
+
"type": "number",
|
|
82
|
+
"exclusiveMinimum": 0
|
|
83
|
+
},
|
|
84
|
+
"createIfMissing": {
|
|
85
|
+
"type": "boolean"
|
|
86
|
+
},
|
|
87
|
+
"setActive": {
|
|
88
|
+
"type": "boolean"
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
"additionalProperties": false
|
|
92
|
+
},
|
|
93
|
+
"timing": {
|
|
94
|
+
"type": "object",
|
|
95
|
+
"properties": {
|
|
96
|
+
"inPoint": {
|
|
97
|
+
"type": "number"
|
|
98
|
+
},
|
|
99
|
+
"outPoint": {
|
|
100
|
+
"type": "number"
|
|
101
|
+
},
|
|
102
|
+
"startTime": {
|
|
103
|
+
"type": "number"
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
"additionalProperties": false
|
|
107
|
+
},
|
|
108
|
+
"transform": {
|
|
109
|
+
"type": "object",
|
|
110
|
+
"properties": {
|
|
111
|
+
"anchorPoint": {
|
|
112
|
+
"$ref": "#/$defs/numberArray2or3"
|
|
113
|
+
},
|
|
114
|
+
"position": {
|
|
115
|
+
"$ref": "#/$defs/numberArray2or3"
|
|
116
|
+
},
|
|
117
|
+
"scale": {
|
|
118
|
+
"$ref": "#/$defs/numberArray2or3"
|
|
119
|
+
},
|
|
120
|
+
"rotation": {
|
|
121
|
+
"type": "number"
|
|
122
|
+
},
|
|
123
|
+
"opacity": {
|
|
124
|
+
"type": "number"
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
"additionalProperties": false
|
|
128
|
+
},
|
|
129
|
+
"propertyValue": {
|
|
130
|
+
"type": "object",
|
|
131
|
+
"required": [
|
|
132
|
+
"propertyPath",
|
|
133
|
+
"value"
|
|
134
|
+
],
|
|
135
|
+
"properties": {
|
|
136
|
+
"propertyPath": {
|
|
137
|
+
"type": "string",
|
|
138
|
+
"minLength": 1
|
|
139
|
+
},
|
|
140
|
+
"value": {}
|
|
141
|
+
},
|
|
142
|
+
"additionalProperties": false
|
|
143
|
+
},
|
|
144
|
+
"effectParam": {
|
|
145
|
+
"type": "object",
|
|
146
|
+
"required": [
|
|
147
|
+
"value"
|
|
148
|
+
],
|
|
149
|
+
"properties": {
|
|
150
|
+
"propertyPath": {
|
|
151
|
+
"type": "string",
|
|
152
|
+
"minLength": 1
|
|
153
|
+
},
|
|
154
|
+
"matchName": {
|
|
155
|
+
"type": "string",
|
|
156
|
+
"minLength": 1
|
|
157
|
+
},
|
|
158
|
+
"propertyIndex": {
|
|
159
|
+
"type": "integer",
|
|
160
|
+
"minimum": 1
|
|
161
|
+
},
|
|
162
|
+
"value": {}
|
|
163
|
+
},
|
|
164
|
+
"oneOf": [
|
|
165
|
+
{
|
|
166
|
+
"required": [
|
|
167
|
+
"propertyPath"
|
|
168
|
+
]
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"required": [
|
|
172
|
+
"matchName"
|
|
173
|
+
]
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"required": [
|
|
177
|
+
"propertyIndex"
|
|
178
|
+
]
|
|
179
|
+
}
|
|
180
|
+
],
|
|
181
|
+
"additionalProperties": false
|
|
182
|
+
},
|
|
183
|
+
"effect": {
|
|
184
|
+
"type": "object",
|
|
185
|
+
"required": [
|
|
186
|
+
"matchName"
|
|
187
|
+
],
|
|
188
|
+
"properties": {
|
|
189
|
+
"matchName": {
|
|
190
|
+
"type": "string",
|
|
191
|
+
"minLength": 1
|
|
192
|
+
},
|
|
193
|
+
"name": {
|
|
194
|
+
"type": "string"
|
|
195
|
+
},
|
|
196
|
+
"params": {
|
|
197
|
+
"type": "array",
|
|
198
|
+
"items": {
|
|
199
|
+
"$ref": "#/$defs/effectParam"
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
"additionalProperties": false
|
|
204
|
+
},
|
|
205
|
+
"keyframe": {
|
|
206
|
+
"type": "object",
|
|
207
|
+
"required": [
|
|
208
|
+
"time",
|
|
209
|
+
"value"
|
|
210
|
+
],
|
|
211
|
+
"properties": {
|
|
212
|
+
"time": {
|
|
213
|
+
"type": "number"
|
|
214
|
+
},
|
|
215
|
+
"value": {},
|
|
216
|
+
"inInterp": {
|
|
217
|
+
"type": "string",
|
|
218
|
+
"enum": [
|
|
219
|
+
"linear",
|
|
220
|
+
"bezier",
|
|
221
|
+
"hold"
|
|
222
|
+
]
|
|
223
|
+
},
|
|
224
|
+
"outInterp": {
|
|
225
|
+
"type": "string",
|
|
226
|
+
"enum": [
|
|
227
|
+
"linear",
|
|
228
|
+
"bezier",
|
|
229
|
+
"hold"
|
|
230
|
+
]
|
|
231
|
+
},
|
|
232
|
+
"easeIn": {},
|
|
233
|
+
"easeOut": {}
|
|
234
|
+
},
|
|
235
|
+
"additionalProperties": false
|
|
236
|
+
},
|
|
237
|
+
"animation": {
|
|
238
|
+
"type": "object",
|
|
239
|
+
"required": [
|
|
240
|
+
"propertyPath",
|
|
241
|
+
"keyframes"
|
|
242
|
+
],
|
|
243
|
+
"properties": {
|
|
244
|
+
"propertyPath": {
|
|
245
|
+
"type": "string",
|
|
246
|
+
"minLength": 1
|
|
247
|
+
},
|
|
248
|
+
"keyframes": {
|
|
249
|
+
"type": "array",
|
|
250
|
+
"minItems": 1,
|
|
251
|
+
"items": {
|
|
252
|
+
"$ref": "#/$defs/keyframe"
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
},
|
|
256
|
+
"additionalProperties": false
|
|
257
|
+
},
|
|
258
|
+
"expressionBinding": {
|
|
259
|
+
"type": "object",
|
|
260
|
+
"required": [
|
|
261
|
+
"propertyPath",
|
|
262
|
+
"expression"
|
|
263
|
+
],
|
|
264
|
+
"properties": {
|
|
265
|
+
"propertyPath": {
|
|
266
|
+
"type": "string",
|
|
267
|
+
"minLength": 1
|
|
268
|
+
},
|
|
269
|
+
"expression": {
|
|
270
|
+
"type": "string"
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
"additionalProperties": false
|
|
274
|
+
},
|
|
275
|
+
"essentialProperty": {
|
|
276
|
+
"type": "object",
|
|
277
|
+
"required": [
|
|
278
|
+
"propertyPath"
|
|
279
|
+
],
|
|
280
|
+
"properties": {
|
|
281
|
+
"propertyPath": {
|
|
282
|
+
"type": "string",
|
|
283
|
+
"minLength": 1
|
|
284
|
+
},
|
|
285
|
+
"essentialName": {
|
|
286
|
+
"type": "string"
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
"additionalProperties": false
|
|
290
|
+
},
|
|
291
|
+
"repeater": {
|
|
292
|
+
"type": "object",
|
|
293
|
+
"properties": {
|
|
294
|
+
"groupIndex": {
|
|
295
|
+
"type": "integer",
|
|
296
|
+
"minimum": 1
|
|
297
|
+
},
|
|
298
|
+
"name": {
|
|
299
|
+
"type": "string"
|
|
300
|
+
},
|
|
301
|
+
"copies": {
|
|
302
|
+
"type": "number"
|
|
303
|
+
},
|
|
304
|
+
"offset": {
|
|
305
|
+
"type": "number"
|
|
306
|
+
},
|
|
307
|
+
"position": {
|
|
308
|
+
"$ref": "#/$defs/numberArray2"
|
|
309
|
+
},
|
|
310
|
+
"scale": {
|
|
311
|
+
"$ref": "#/$defs/numberArray2"
|
|
312
|
+
},
|
|
313
|
+
"rotation": {
|
|
314
|
+
"type": "number"
|
|
315
|
+
},
|
|
316
|
+
"startOpacity": {
|
|
317
|
+
"type": "number"
|
|
318
|
+
},
|
|
319
|
+
"endOpacity": {
|
|
320
|
+
"type": "number"
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
"additionalProperties": false
|
|
324
|
+
},
|
|
325
|
+
"layer": {
|
|
326
|
+
"type": "object",
|
|
327
|
+
"required": [
|
|
328
|
+
"id",
|
|
329
|
+
"type"
|
|
330
|
+
],
|
|
331
|
+
"properties": {
|
|
332
|
+
"id": {
|
|
333
|
+
"type": "string",
|
|
334
|
+
"minLength": 1
|
|
335
|
+
},
|
|
336
|
+
"type": {
|
|
337
|
+
"type": "string",
|
|
338
|
+
"enum": [
|
|
339
|
+
"text",
|
|
340
|
+
"null",
|
|
341
|
+
"solid",
|
|
342
|
+
"shape"
|
|
343
|
+
]
|
|
344
|
+
},
|
|
345
|
+
"name": {
|
|
346
|
+
"type": "string"
|
|
347
|
+
},
|
|
348
|
+
"parentId": {
|
|
349
|
+
"type": [
|
|
350
|
+
"string",
|
|
351
|
+
"null"
|
|
352
|
+
]
|
|
353
|
+
},
|
|
354
|
+
"text": {
|
|
355
|
+
"type": "string"
|
|
356
|
+
},
|
|
357
|
+
"width": {
|
|
358
|
+
"type": "number"
|
|
359
|
+
},
|
|
360
|
+
"height": {
|
|
361
|
+
"type": "number"
|
|
362
|
+
},
|
|
363
|
+
"color": {
|
|
364
|
+
"$ref": "#/$defs/numberArray3"
|
|
365
|
+
},
|
|
366
|
+
"duration": {
|
|
367
|
+
"type": "number"
|
|
368
|
+
},
|
|
369
|
+
"shapeType": {
|
|
370
|
+
"type": "string",
|
|
371
|
+
"enum": [
|
|
372
|
+
"ellipse",
|
|
373
|
+
"rect"
|
|
374
|
+
]
|
|
375
|
+
},
|
|
376
|
+
"shapeSize": {
|
|
377
|
+
"$ref": "#/$defs/numberArray2"
|
|
378
|
+
},
|
|
379
|
+
"shapePosition": {
|
|
380
|
+
"$ref": "#/$defs/numberArray2"
|
|
381
|
+
},
|
|
382
|
+
"shapeFillColor": {
|
|
383
|
+
"$ref": "#/$defs/numberArray3"
|
|
384
|
+
},
|
|
385
|
+
"shapeFillOpacity": {
|
|
386
|
+
"type": "number"
|
|
387
|
+
},
|
|
388
|
+
"shapeStrokeColor": {
|
|
389
|
+
"$ref": "#/$defs/numberArray3"
|
|
390
|
+
},
|
|
391
|
+
"shapeStrokeOpacity": {
|
|
392
|
+
"type": "number"
|
|
393
|
+
},
|
|
394
|
+
"shapeStrokeWidth": {
|
|
395
|
+
"type": "number"
|
|
396
|
+
},
|
|
397
|
+
"shapeStrokeLineCap": {
|
|
398
|
+
"type": "string",
|
|
399
|
+
"enum": [
|
|
400
|
+
"butt",
|
|
401
|
+
"round",
|
|
402
|
+
"projecting"
|
|
403
|
+
]
|
|
404
|
+
},
|
|
405
|
+
"shapeRoundness": {
|
|
406
|
+
"type": "number"
|
|
407
|
+
},
|
|
408
|
+
"timing": {
|
|
409
|
+
"$ref": "#/$defs/timing"
|
|
410
|
+
},
|
|
411
|
+
"transform": {
|
|
412
|
+
"$ref": "#/$defs/transform"
|
|
413
|
+
},
|
|
414
|
+
"propertyValues": {
|
|
415
|
+
"type": "array",
|
|
416
|
+
"items": {
|
|
417
|
+
"$ref": "#/$defs/propertyValue"
|
|
418
|
+
}
|
|
419
|
+
},
|
|
420
|
+
"effects": {
|
|
421
|
+
"type": "array",
|
|
422
|
+
"items": {
|
|
423
|
+
"$ref": "#/$defs/effect"
|
|
424
|
+
}
|
|
425
|
+
},
|
|
426
|
+
"animations": {
|
|
427
|
+
"type": "array",
|
|
428
|
+
"items": {
|
|
429
|
+
"$ref": "#/$defs/animation"
|
|
430
|
+
}
|
|
431
|
+
},
|
|
432
|
+
"expressions": {
|
|
433
|
+
"type": "array",
|
|
434
|
+
"items": {
|
|
435
|
+
"$ref": "#/$defs/expressionBinding"
|
|
436
|
+
}
|
|
437
|
+
},
|
|
438
|
+
"essentialProperties": {
|
|
439
|
+
"type": "array",
|
|
440
|
+
"items": {
|
|
441
|
+
"$ref": "#/$defs/essentialProperty"
|
|
442
|
+
}
|
|
443
|
+
},
|
|
444
|
+
"repeaters": {
|
|
445
|
+
"type": "array",
|
|
446
|
+
"items": {
|
|
447
|
+
"$ref": "#/$defs/repeater"
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
},
|
|
451
|
+
"additionalProperties": false
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
@@ -33,6 +33,13 @@ description: Command-by-command After Effects editing via ae-cli. Best for surgi
|
|
|
33
33
|
3. 必要な更新コマンドを最小回数で実行
|
|
34
34
|
4. 変更後に `layers` / `properties` で結果確認
|
|
35
35
|
|
|
36
|
+
## 参照ファイル(固定)
|
|
37
|
+
|
|
38
|
+
- schema: `~/ae-agent-skills/scene.schema.json`
|
|
39
|
+
- サンプル: `~/ae-agent-skills/references/scene.example.json`
|
|
40
|
+
- CLIリファレンス(日本語): `~/ae-agent-skills/references/cli.ja.md`
|
|
41
|
+
- CLIリファレンス(英語): `~/ae-agent-skills/references/cli.md`
|
|
42
|
+
|
|
36
43
|
## 宣言型へ切り替える目安
|
|
37
44
|
|
|
38
45
|
- 同種の変更を複数レイヤーへ繰り返す
|
|
@@ -83,4 +90,4 @@ ae-cli layers
|
|
|
83
90
|
- 既存シーンへの単発・部分修正は命令型の方が安全な場合が多い(影響範囲を局所化しやすい)。
|
|
84
91
|
- 同じ処理を複数コマンドで繰り返す必要がある場合は、宣言型 `apply-scene` へ切り替える。
|
|
85
92
|
- expression の不調は `ae-cli expression-errors` で確認する。
|
|
86
|
-
- scene JSON を一時的に作る場合は
|
|
93
|
+
- scene JSON を一時的に作る場合は `~/ae-agent-skills/work/`(作業中)と `~/ae-agent-skills/done/`(完了保管)を使う。
|
|
@@ -30,20 +30,27 @@ After Effects を宣言型 JSON で構築する標準スキル。
|
|
|
30
30
|
## 基本フロー
|
|
31
31
|
|
|
32
32
|
1. 疎通確認: `ae-cli health`
|
|
33
|
-
2. scene
|
|
34
|
-
3.
|
|
35
|
-
4.
|
|
36
|
-
5.
|
|
37
|
-
6.
|
|
33
|
+
2. `~/ae-agent-skills/scene.schema.json` と `~/ae-agent-skills/references/scene.example.json` を確認
|
|
34
|
+
3. scene JSON を作成/更新(作業中は `~/ae-agent-skills/work/` 配下)
|
|
35
|
+
4. `--validate-only` で検証
|
|
36
|
+
5. 実適用
|
|
37
|
+
6. `layers` / `properties` / `expression-errors` で確認
|
|
38
|
+
7. 完了版は `~/ae-agent-skills/done/` 配下へコピーして保管
|
|
39
|
+
|
|
40
|
+
## 参照ファイル(固定)
|
|
41
|
+
|
|
42
|
+
- schema: `~/ae-agent-skills/scene.schema.json`
|
|
43
|
+
- サンプル: `~/ae-agent-skills/references/scene.example.json`
|
|
44
|
+
- CLIリファレンス(日本語): `~/ae-agent-skills/references/cli.ja.md`
|
|
45
|
+
- CLIリファレンス(英語): `~/ae-agent-skills/references/cli.md`
|
|
38
46
|
|
|
39
47
|
## ファイル運用ルール(重要)
|
|
40
48
|
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
- どちらもリポジトリにはコミットしない(`.gitignore` 前提)
|
|
49
|
+
- `~/ae-agent-skills/work/`: 作業中の scene JSON を置くディレクトリ
|
|
50
|
+
- `~/ae-agent-skills/done/`: 完了した scene JSON の保管ディレクトリ
|
|
44
51
|
- 例:
|
|
45
|
-
- `ae-cli apply-scene --scene-file work/main.scene.json --validate-only`
|
|
46
|
-
- `ae-cli apply-scene --scene-file work/main.scene.json`
|
|
52
|
+
- `ae-cli apply-scene --scene-file ~/ae-agent-skills/work/main.scene.json --validate-only`
|
|
53
|
+
- `ae-cli apply-scene --scene-file ~/ae-agent-skills/work/main.scene.json`
|
|
47
54
|
|
|
48
55
|
## コマンド
|
|
49
56
|
|
|
@@ -68,6 +75,7 @@ ae-cli expression-errors
|
|
|
68
75
|
|
|
69
76
|
- `layers[].id` は必須推奨(upsert の安定キー)
|
|
70
77
|
- `layers[].parentId` は scene id を参照
|
|
78
|
+
- 推測でキーを作らず、必ず `~/ae-agent-skills/scene.schema.json` を正として合わせる
|
|
71
79
|
- アニメーション対象プロパティは `animations` で管理
|
|
72
80
|
- 3Dベクトルには2D入力可(`[x,y] -> [x,y,0]` 自動補完)
|
|
73
81
|
- Repeater は `layers[].repeaters[]`
|
|
@@ -78,7 +86,7 @@ ae-cli expression-errors
|
|
|
78
86
|
|
|
79
87
|
## 最小テンプレート(このまま使える)
|
|
80
88
|
|
|
81
|
-
以下を
|
|
89
|
+
以下を `~/ae-agent-skills/work/min.scene.json` として保存して、そのまま `validate/apply` できる。
|
|
82
90
|
|
|
83
91
|
```json
|
|
84
92
|
{
|
|
@@ -108,8 +116,8 @@ ae-cli expression-errors
|
|
|
108
116
|
```
|
|
109
117
|
|
|
110
118
|
```bash
|
|
111
|
-
ae-cli apply-scene --scene-file work/min.scene.json --validate-only
|
|
112
|
-
ae-cli apply-scene --scene-file work/min.scene.json
|
|
119
|
+
ae-cli apply-scene --scene-file ~/ae-agent-skills/work/min.scene.json --validate-only
|
|
120
|
+
ae-cli apply-scene --scene-file ~/ae-agent-skills/work/min.scene.json
|
|
113
121
|
```
|
|
114
122
|
|
|
115
123
|
## propertyPath 運用ルール(汎用)
|