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 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
 
@@ -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.4",
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 を一時的に作る場合は `work/`(作業中)と `done/`(完了保管)を使い、どちらもコミットしない。
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 JSON を作成/更新(作業中は `work/` 配下)
34
- 3. `--validate-only` で検証
35
- 4. 実適用
36
- 5. `layers` / `properties` / `expression-errors` で確認
37
- 6. 完了版は `done/` 配下へコピーして保管
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
- - `work/`: 作業中の scene JSON を置くディレクトリ
42
- - `done/`: 完了した scene JSON の保管ディレクトリ
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
- 以下を `work/min.scene.json` として保存して、そのまま `validate/apply` できる。
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 運用ルール(汎用)