@prestyj/cli 5.28.0 → 5.28.1
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.md +2 -2
- package/assets/motion/THIRD-PARTY.md +14 -19
- package/assets/motion/bin/flash-check.mjs +314 -0
- package/assets/motion/bin/fonts.mjs +17 -13
- package/assets/motion/bin/library.mjs +8 -8
- package/assets/motion/bin/motion-check.mjs +12 -6
- package/assets/motion/fonts/finger-paint/OFL.txt +93 -0
- package/assets/motion/fonts/finger-paint/finger-paint-normal.woff2 +0 -0
- package/assets/motion/fonts/fonts.json +56 -0
- package/assets/motion/fonts/short-stack/OFL.txt +94 -0
- package/assets/motion/fonts/short-stack/short-stack-normal.woff2 +0 -0
- package/assets/motion/fonts/sora/OFL.txt +93 -0
- package/assets/motion/fonts/sora/sora-normal.woff2 +0 -0
- package/assets/motion/fonts/specimen.jpg +0 -0
- package/assets/motion/fonts/unbounded/OFL.txt +93 -0
- package/assets/motion/fonts/unbounded/unbounded-normal.woff2 +0 -0
- package/assets/motion/library/README.md +2 -0
- package/assets/motion/plugin.json +1 -1
- package/assets/motion/references/motion-language.md +128 -0
- package/assets/motion/references/runtime/determinism-rules.md +3 -3
- package/assets/motion/references/runtime/gsap-easing-and-stagger.md +19 -19
- package/assets/motion/references/runtime/gsap.md +3 -3
- package/assets/motion/references/runtime/inputs-and-assets.md +19 -9
- package/assets/motion/references/runtime/minimal-composition.md +6 -0
- package/assets/motion/skills/brand-kit/SKILL.md +16 -15
- package/assets/motion/skills/motion/SKILL.md +166 -90
- package/assets/motion/skills/source-ingest/SKILL.md +7 -10
- package/assets/motion/skills/video-qa/SKILL.md +43 -20
- package/dist/cli.js +4 -3
- package/dist/cli.js.map +1 -1
- package/dist/core/agent-session.d.ts +13 -3
- package/dist/core/agent-session.js +32 -6
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agents.js +12 -3
- package/dist/core/agents.js.map +1 -1
- package/dist/core/auth-providers.js +1 -1
- package/dist/core/auth-providers.js.map +1 -1
- package/dist/core/autopilot-verdict.d.ts +5 -1
- package/dist/core/autopilot-verdict.js +30 -13
- package/dist/core/autopilot-verdict.js.map +1 -1
- package/dist/core/fast-apply-benchmark.d.ts +1 -1
- package/dist/core/fast-apply-benchmark.js +2 -2
- package/dist/core/fast-apply-benchmark.js.map +1 -1
- package/dist/core/ideal-review-subagent.d.ts +16 -2
- package/dist/core/ideal-review-subagent.js +19 -2
- package/dist/core/ideal-review-subagent.js.map +1 -1
- package/dist/core/nolan-context.d.ts +7 -5
- package/dist/core/nolan-context.js +106 -16
- package/dist/core/nolan-context.js.map +1 -1
- package/dist/core/nolan-prompt.js +24 -21
- package/dist/core/nolan-prompt.js.map +1 -1
- package/dist/core/project-discovery.js +77 -26
- package/dist/core/project-discovery.js.map +1 -1
- package/dist/core/semantic-search-benchmark.d.ts +1 -1
- package/dist/core/semantic-search-benchmark.js +2 -2
- package/dist/core/semantic-search-benchmark.js.map +1 -1
- package/dist/core/skills.js +13 -3
- package/dist/core/skills.js.map +1 -1
- package/dist/core/subagent-manager.d.ts +3 -1
- package/dist/core/subagent-manager.js +3 -1
- package/dist/core/subagent-manager.js.map +1 -1
- package/dist/core/subagent-policy.js +1 -1
- package/dist/core/subagent-policy.js.map +1 -1
- package/dist/core/worktree-setup.d.ts +23 -0
- package/dist/core/worktree-setup.js +128 -9
- package/dist/core/worktree-setup.js.map +1 -1
- package/dist/core/worktree.d.ts +20 -2
- package/dist/core/worktree.js +74 -31
- package/dist/core/worktree.js.map +1 -1
- package/dist/modes/json-mode.js +11 -2
- package/dist/modes/json-mode.js.map +1 -1
- package/dist/modes/subagent-worker-mode.d.ts +36 -1
- package/dist/modes/subagent-worker-mode.js +68 -38
- package/dist/modes/subagent-worker-mode.js.map +1 -1
- package/dist/motion-agent/motion-agent.d.ts +1 -1
- package/dist/motion-agent/motion-agent.js +1 -1
- package/dist/motion-agent/motion-check-tool.d.ts +15 -1
- package/dist/motion-agent/motion-check-tool.js +345 -37
- package/dist/motion-agent/motion-check-tool.js.map +1 -1
- package/dist/motion-agent/motion-prompt.d.ts +1 -1
- package/dist/motion-agent/motion-prompt.js +16 -20
- package/dist/motion-agent/motion-prompt.js.map +1 -1
- package/dist/motion-agent/motion-review-session.js +1 -1
- package/dist/motion-agent/motion-review-session.js.map +1 -1
- package/dist/motion-agent/motion-studio-context.js +1 -1
- package/dist/motion-agent/motion-studio-context.js.map +1 -1
- package/dist/system-prompt.d.ts +2 -1
- package/dist/system-prompt.js +12 -3
- package/dist/system-prompt.js.map +1 -1
- package/dist/tools/bash.js +64 -0
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/edit.js +1 -1
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/goals.d.ts +1 -1
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.js +2 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/read-tracker.d.ts +30 -2
- package/dist/tools/read-tracker.js +92 -5
- package/dist/tools/read-tracker.js.map +1 -1
- package/dist/tools/read.js +36 -5
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/subagent-shared.d.ts +19 -0
- package/dist/tools/subagent-shared.js +30 -0
- package/dist/tools/subagent-shared.js.map +1 -1
- package/dist/tools/write.js +4 -3
- package/dist/tools/write.js.map +1 -1
- package/dist/ui/components/Footer.js +1 -1
- package/dist/ui/components/Footer.js.map +1 -1
- package/dist/ui/render.d.ts +2 -0
- package/dist/ui/render.js +3 -0
- package/dist/ui/render.js.map +1 -1
- package/dist/utils/text.d.ts +12 -0
- package/dist/utils/text.js +11 -0
- package/dist/utils/text.js.map +1 -1
- package/package.json +5 -5
- package/assets/motion/skills/mixkit-split-text-617/SKILL.md +0 -115
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-480.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-494.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-5.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-508.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6525.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6539.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6647.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6663.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6677.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6691.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6706.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6722.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6736.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6750.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6764.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6780.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6794.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6810.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6823.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6872.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6936.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-76.json +0 -1
- package/assets/motion/skills/mixkit-split-text-617/data/manifest.json +0 -495
- package/assets/motion/skills/mixkit-split-text-617/references/RECONSTRUCTION.md +0 -201
- package/assets/motion/skills/mixkit-split-text-617/references/VERIFICATION.md +0 -107
- package/assets/motion/skills/mixkit-split-text-617/tools/inspect_motion.py +0 -130
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
# Evidence, uncertainty and acceptance
|
|
2
|
-
|
|
3
|
-
## What is verified already
|
|
4
|
-
|
|
5
|
-
The user's AEP was parsed using `forticheprod/py-aep` at commit
|
|
6
|
-
`e12a451c35bacd3f34a080090265f9370e66162b`. All 194 fetched parser source files
|
|
7
|
-
were checked against that commit's Git blob hashes. The exporter reported
|
|
8
|
-
zero field/serialization errors. Repeating extraction returned the same
|
|
9
|
-
content except elapsed time. No expressions were evaluated.
|
|
10
|
-
|
|
11
|
-
The skill's JSON composition files preserve the full exported records,
|
|
12
|
-
including numeric values and flags marking parser-synthesized defaults.
|
|
13
|
-
They are not a handwritten approximation or a newly designed timeline.
|
|
14
|
-
`data/manifest.json` records their SHA-256 hashes and source AEP fingerprint.
|
|
15
|
-
|
|
16
|
-
Source counts:
|
|
17
|
-
- 22 compositions, 99 layers.
|
|
18
|
-
- 1,875 leaf properties backed by non-synthetic binary chunks.
|
|
19
|
-
- 17,795 parser-synthesized leaf properties. Do not call those authored values.
|
|
20
|
-
- Exported animation-key counts can duplicate separated Position data; do not
|
|
21
|
-
describe every exported key entry as a distinct authored keyframe.
|
|
22
|
-
|
|
23
|
-
### Opening-reveal spot-check
|
|
24
|
-
|
|
25
|
-
The first scene's matte-height Bezier was independently evaluated from its
|
|
26
|
-
exported times, values, speeds and influences, without the parser's interpolator.
|
|
27
|
-
At ten timestamps the height was compared with a brightness-based edge
|
|
28
|
-
measurement of the real 640×360 Mixkit preview. Maximum absolute difference:
|
|
29
|
-
**1.728 pixels**. Actual preview frame timestamps were checked with ffprobe.
|
|
30
|
-
All samples are preserved in the manifest.
|
|
31
|
-
|
|
32
|
-
This is a **limited numeric spot-check**, not a full render comparison.
|
|
33
|
-
It is affected by compression and thresholded edge measurement. It does not
|
|
34
|
-
validate text animators, all scenes, all effects or the complete choreography.
|
|
35
|
-
|
|
36
|
-
## What is not verified
|
|
37
|
-
|
|
38
|
-
- No whole-video reconstruction has been generated or compared.
|
|
39
|
-
- No export/render inside After Effects has independently checked the full
|
|
40
|
-
parser output. The parser is a reverse-engineered implementation, not AE.
|
|
41
|
-
- Per-letter selector weighting, randomized order, font layout and combination
|
|
42
|
-
of text animators have not been reproduced and checked in another renderer.
|
|
43
|
-
- Fast Blur, stroke/outline rendering and other compositing semantics may differ
|
|
44
|
-
from apparently similar browser/Canvas/SVG effects.
|
|
45
|
-
- Original footage is absent and intentionally replaceable. Font substitution
|
|
46
|
-
is allowed. Neither asset substitution validates the surrounding motion.
|
|
47
|
-
- No reference audio was supplied. No sound timing was extracted.
|
|
48
|
-
|
|
49
|
-
A future agent must not turn "all data files passed integrity checks" into
|
|
50
|
-
"the video is visually verified."
|
|
51
|
-
|
|
52
|
-
## Acceptance procedure after a reconstruction exists
|
|
53
|
-
|
|
54
|
-
1. **Validate the data package.**
|
|
55
|
-
Run `python3 "<skill-root>/tools/inspect_motion.py" verify`. This only validates
|
|
56
|
-
bundled hashes, counts and links; it does not render anything.
|
|
57
|
-
2. **Record the implementation mapping.**
|
|
58
|
-
For every used source composition/layer, record the target object and where
|
|
59
|
-
its keyed properties, selectors, effects, matte, stack and clock are handled.
|
|
60
|
-
Mark every unsupported or approximate semantic explicitly. Do not invent a
|
|
61
|
-
coverage percentage from raw property counts (most exposed defaults are unused).
|
|
62
|
-
3. **Check actual technical output.**
|
|
63
|
-
Confirm 1920×1080, 30 fps, 361 frames, complete layer/media/font loading,
|
|
64
|
-
deterministic seeking, no render errors and no substituted silent fallbacks.
|
|
65
|
-
In EZ Motion, retain the existing HyperFrames validation and completion review.
|
|
66
|
-
4. **Check source timing, not only screenshots.**
|
|
67
|
-
Sample exact keys and intermediate times, including steep Bezier sections,
|
|
68
|
-
HOLD boundaries, negative-start echoes, overlapping scenes and stretched
|
|
69
|
-
decorative instances. The source video's ~59.94 fps and the project's 30 fps
|
|
70
|
-
are different: compare by seconds, not matching frame indices.
|
|
71
|
-
5. **Compare the entire sequence in motion.**
|
|
72
|
-
Cover at least 0–2.2 s, 2.1–4.8 s, 4.7–7.2 s, 7.0–9.7 s and 9.4 s through
|
|
73
|
-
the end. These overlapping review windows are for inspection, not new cuts.
|
|
74
|
-
Compare reveal dimensions, zoom timing, directions, silhouettes, overlaps,
|
|
75
|
-
outline echo spacing and final settling/hold. A contact sheet alone is not
|
|
76
|
-
playback evidence. Report if the available tooling only inspected frames.
|
|
77
|
-
6. **Separate content differences from motion differences.**
|
|
78
|
-
A different person/image or changed glyph silhouette is expected. A different
|
|
79
|
-
reveal axis, easing shape, stagger rule, outline-copy count, scene overlap or
|
|
80
|
-
duration is a reconstruction defect unless the user explicitly requested it.
|
|
81
|
-
A raw pixel-diff score with different content is not a useful fidelity verdict.
|
|
82
|
-
7. **Resolve or disclose failures.**
|
|
83
|
-
Fix concrete mismatches from the source data and recheck the affected interval.
|
|
84
|
-
When semantics cannot be reproduced/validated, deliver an honestly labelled
|
|
85
|
-
draft with the exact unresolved layer/interval. Do not replace it with a
|
|
86
|
-
stylistically similar effect and claim fidelity.
|
|
87
|
-
|
|
88
|
-
Reference page:
|
|
89
|
-
https://mixkit.co/free-after-effects-templates/split-text-intro-617/
|
|
90
|
-
|
|
91
|
-
Known public preview URL (availability may change):
|
|
92
|
-
https://assets.mixkit.co/video-templates/617/mixkit-617-360.mp4
|
|
93
|
-
|
|
94
|
-
No reference video is bundled. Use the user's supplied/cached reference or an
|
|
95
|
-
otherwise authorized source through the host's normal media workflow. Access
|
|
96
|
-
failure does not authorize bypassing a site's restrictions.
|
|
97
|
-
|
|
98
|
-
## Reporting language
|
|
99
|
-
|
|
100
|
-
- **Source-grounded:** implemented from the recorded values and mechanisms.
|
|
101
|
-
- **Integrity checked:** data/hash/link checks passed, not visual verification.
|
|
102
|
-
- **Partially verified:** identify the actual tested intervals/mechanisms.
|
|
103
|
-
- **Visually compared:** state what was watched or which frames were inspected;
|
|
104
|
-
list remaining deviations. Do not imply human approval or pixel identity.
|
|
105
|
-
|
|
106
|
-
This skill currently has source data and limited extraction evidence. It is
|
|
107
|
-
not a certificate of rendering correctness and should not claim otherwise.
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
"""Read the bundled animation evidence without loading it all into an agent's context.
|
|
2
|
-
Python standard library only. No writes, network, dependency loading, or rendering.
|
|
3
|
-
"""
|
|
4
|
-
import argparse
|
|
5
|
-
import hashlib
|
|
6
|
-
import json
|
|
7
|
-
from pathlib import Path
|
|
8
|
-
import sys
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def load_manifest(root: Path) -> dict:
|
|
12
|
-
path = root / 'data' / 'manifest.json'
|
|
13
|
-
if path.stat().st_size > 65536:
|
|
14
|
-
raise ValueError('Manifest exceeds 64 KiB')
|
|
15
|
-
data = json.loads(path.read_text(encoding='utf-8'))
|
|
16
|
-
if data.get('schema_version') != 1 or not isinstance(data.get('compositions'), list):
|
|
17
|
-
raise ValueError('Unsupported manifest')
|
|
18
|
-
return data
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def load_comp(root: Path, manifest: dict, comp_id: int) -> dict:
|
|
22
|
-
entry = next((c for c in manifest['compositions'] if c['id'] == comp_id), None)
|
|
23
|
-
if entry is None:
|
|
24
|
-
raise ValueError(f'Unknown composition ID: {comp_id}')
|
|
25
|
-
path = (root / 'data' / 'compositions' / f'comp-{comp_id}.json').resolve()
|
|
26
|
-
if not path.is_relative_to(root) or path.stat().st_size > 8 * 1024 * 1024:
|
|
27
|
-
raise ValueError('Composition path or size is not allowed')
|
|
28
|
-
raw = path.read_bytes()
|
|
29
|
-
if hashlib.sha256(raw).hexdigest() != entry['sha256']:
|
|
30
|
-
raise ValueError(f'Composition {comp_id} failed its integrity check')
|
|
31
|
-
comp = json.loads(raw)
|
|
32
|
-
if comp['id'] != comp_id or len(comp['layers']) != entry['layer_count']:
|
|
33
|
-
raise ValueError('Composition identity/count mismatch')
|
|
34
|
-
return comp
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def walk(nodes: list, ancestors: tuple = (), depth: int = 0):
|
|
38
|
-
if depth > 32:
|
|
39
|
-
raise ValueError('Property nesting exceeds the inspection limit')
|
|
40
|
-
for ordinal, node in enumerate(nodes):
|
|
41
|
-
path = ancestors + (f"{ordinal}:{node['match_name']} ({node['name']})",)
|
|
42
|
-
yield path, node
|
|
43
|
-
yield from walk(node.get('children', []), path, depth + 1)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
def layer_summary(layer: dict) -> dict:
|
|
47
|
-
return {k: v for k, v in layer.items() if k != 'properties'}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def verify(root: Path, manifest: dict) -> dict:
|
|
51
|
-
comps = [load_comp(root, manifest, c['id']) for c in manifest['compositions']]
|
|
52
|
-
ids = {c['id'] for c in comps}
|
|
53
|
-
if len(ids) != len(comps):
|
|
54
|
-
raise ValueError('Duplicate composition IDs')
|
|
55
|
-
totals = {'compositions': len(comps), 'layers': 0, 'stored_properties': 0, 'synthetic_properties': 0}
|
|
56
|
-
for comp in comps:
|
|
57
|
-
layer_ids = {l['id'] for l in comp['layers']}
|
|
58
|
-
if len(layer_ids) != len(comp['layers']):
|
|
59
|
-
raise ValueError('Duplicate layer IDs')
|
|
60
|
-
totals['layers'] += len(comp['layers'])
|
|
61
|
-
for layer in comp['layers']:
|
|
62
|
-
source = layer.get('source')
|
|
63
|
-
if source and source['type'] == 'CompItem' and source['id'] not in ids:
|
|
64
|
-
raise ValueError('Missing source composition')
|
|
65
|
-
for link in ('parent', 'track_matte_layer'):
|
|
66
|
-
ref = layer.get(link)
|
|
67
|
-
if ref and ref['id'] not in layer_ids:
|
|
68
|
-
raise ValueError(f'Missing linked layer: {link}')
|
|
69
|
-
for _, prop in walk(layer['properties']):
|
|
70
|
-
if 'binary_chunk_synthetic' in prop:
|
|
71
|
-
key = 'synthetic_properties' if prop['binary_chunk_synthetic'] else 'stored_properties'
|
|
72
|
-
totals[key] += 1
|
|
73
|
-
for key, actual in totals.items():
|
|
74
|
-
if actual != manifest['expected_counts'][key]:
|
|
75
|
-
raise ValueError(f'Evidence count mismatch: {key}')
|
|
76
|
-
return {'integrity': 'PASS', 'counts': totals, 'full_video_reconstruction_verified': False}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
def main() -> int:
|
|
80
|
-
parser = argparse.ArgumentParser(description=__doc__)
|
|
81
|
-
sub = parser.add_subparsers(dest='command', required=True)
|
|
82
|
-
sub.add_parser('list', help='List compositions, dynamic slots and evidence scope')
|
|
83
|
-
sub.add_parser('verify', help='Check data integrity and links; does not render or validate motion')
|
|
84
|
-
for name in ('layers', 'keys'):
|
|
85
|
-
p = sub.add_parser(name)
|
|
86
|
-
p.add_argument('composition', type=int)
|
|
87
|
-
prop_parser = sub.add_parser('property')
|
|
88
|
-
prop_parser.add_argument('composition', type=int)
|
|
89
|
-
prop_parser.add_argument('layer', type=int)
|
|
90
|
-
prop_parser.add_argument('match_name')
|
|
91
|
-
prop_parser.add_argument('--include-defaults', action='store_true', help='Also show explicitly labelled parser-synthesized defaults')
|
|
92
|
-
args = parser.parse_args()
|
|
93
|
-
root = Path(__file__).resolve().parents[1]
|
|
94
|
-
try:
|
|
95
|
-
manifest = load_manifest(root)
|
|
96
|
-
if args.command == 'list':
|
|
97
|
-
result = manifest
|
|
98
|
-
elif args.command == 'verify':
|
|
99
|
-
result = verify(root, manifest)
|
|
100
|
-
else:
|
|
101
|
-
comp = load_comp(root, manifest, args.composition)
|
|
102
|
-
if args.command == 'layers':
|
|
103
|
-
result = {k: v for k, v in comp.items() if k != 'layers'}
|
|
104
|
-
result['layers'] = [layer_summary(l) for l in comp['layers']]
|
|
105
|
-
else:
|
|
106
|
-
matches = []
|
|
107
|
-
if args.command == 'property' and not any(l['id'] == args.layer for l in comp['layers']):
|
|
108
|
-
raise ValueError(f'Unknown layer ID: {args.layer}')
|
|
109
|
-
for layer in comp['layers']:
|
|
110
|
-
if args.command == 'property' and layer['id'] != args.layer:
|
|
111
|
-
continue
|
|
112
|
-
for path, prop in walk(layer['properties']):
|
|
113
|
-
if args.command == 'property':
|
|
114
|
-
selected = prop['match_name'] == args.match_name and (args.include_defaults or not prop.get('binary_chunk_synthetic', False))
|
|
115
|
-
else:
|
|
116
|
-
selected = bool(prop.get('keyframes')) and prop['match_name'] != 'ADBE Marker'
|
|
117
|
-
if selected:
|
|
118
|
-
matches.append({'layer_id': layer['id'], 'layer_name': layer['name'], 'indexed_path': list(path), 'property': prop})
|
|
119
|
-
if args.command == 'property' and not matches:
|
|
120
|
-
raise ValueError('No stored property matched that exact name; use --include-defaults to inspect labelled parser defaults')
|
|
121
|
-
result = matches
|
|
122
|
-
print(json.dumps(result, indent=2, ensure_ascii=False, allow_nan=False))
|
|
123
|
-
return 0
|
|
124
|
-
except (OSError, ValueError, KeyError, TypeError) as exc:
|
|
125
|
-
print(f'Inspection failed: {exc}', file=sys.stderr)
|
|
126
|
-
return 1
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
if __name__ == '__main__':
|
|
130
|
-
raise SystemExit(main())
|