@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.
Files changed (143) hide show
  1. package/README.md +2 -2
  2. package/assets/motion/THIRD-PARTY.md +14 -19
  3. package/assets/motion/bin/flash-check.mjs +314 -0
  4. package/assets/motion/bin/fonts.mjs +17 -13
  5. package/assets/motion/bin/library.mjs +8 -8
  6. package/assets/motion/bin/motion-check.mjs +12 -6
  7. package/assets/motion/fonts/finger-paint/OFL.txt +93 -0
  8. package/assets/motion/fonts/finger-paint/finger-paint-normal.woff2 +0 -0
  9. package/assets/motion/fonts/fonts.json +56 -0
  10. package/assets/motion/fonts/short-stack/OFL.txt +94 -0
  11. package/assets/motion/fonts/short-stack/short-stack-normal.woff2 +0 -0
  12. package/assets/motion/fonts/sora/OFL.txt +93 -0
  13. package/assets/motion/fonts/sora/sora-normal.woff2 +0 -0
  14. package/assets/motion/fonts/specimen.jpg +0 -0
  15. package/assets/motion/fonts/unbounded/OFL.txt +93 -0
  16. package/assets/motion/fonts/unbounded/unbounded-normal.woff2 +0 -0
  17. package/assets/motion/library/README.md +2 -0
  18. package/assets/motion/plugin.json +1 -1
  19. package/assets/motion/references/motion-language.md +128 -0
  20. package/assets/motion/references/runtime/determinism-rules.md +3 -3
  21. package/assets/motion/references/runtime/gsap-easing-and-stagger.md +19 -19
  22. package/assets/motion/references/runtime/gsap.md +3 -3
  23. package/assets/motion/references/runtime/inputs-and-assets.md +19 -9
  24. package/assets/motion/references/runtime/minimal-composition.md +6 -0
  25. package/assets/motion/skills/brand-kit/SKILL.md +16 -15
  26. package/assets/motion/skills/motion/SKILL.md +166 -90
  27. package/assets/motion/skills/source-ingest/SKILL.md +7 -10
  28. package/assets/motion/skills/video-qa/SKILL.md +43 -20
  29. package/dist/cli.js +4 -3
  30. package/dist/cli.js.map +1 -1
  31. package/dist/core/agent-session.d.ts +13 -3
  32. package/dist/core/agent-session.js +32 -6
  33. package/dist/core/agent-session.js.map +1 -1
  34. package/dist/core/agents.js +12 -3
  35. package/dist/core/agents.js.map +1 -1
  36. package/dist/core/auth-providers.js +1 -1
  37. package/dist/core/auth-providers.js.map +1 -1
  38. package/dist/core/autopilot-verdict.d.ts +5 -1
  39. package/dist/core/autopilot-verdict.js +30 -13
  40. package/dist/core/autopilot-verdict.js.map +1 -1
  41. package/dist/core/fast-apply-benchmark.d.ts +1 -1
  42. package/dist/core/fast-apply-benchmark.js +2 -2
  43. package/dist/core/fast-apply-benchmark.js.map +1 -1
  44. package/dist/core/ideal-review-subagent.d.ts +16 -2
  45. package/dist/core/ideal-review-subagent.js +19 -2
  46. package/dist/core/ideal-review-subagent.js.map +1 -1
  47. package/dist/core/nolan-context.d.ts +7 -5
  48. package/dist/core/nolan-context.js +106 -16
  49. package/dist/core/nolan-context.js.map +1 -1
  50. package/dist/core/nolan-prompt.js +24 -21
  51. package/dist/core/nolan-prompt.js.map +1 -1
  52. package/dist/core/project-discovery.js +77 -26
  53. package/dist/core/project-discovery.js.map +1 -1
  54. package/dist/core/semantic-search-benchmark.d.ts +1 -1
  55. package/dist/core/semantic-search-benchmark.js +2 -2
  56. package/dist/core/semantic-search-benchmark.js.map +1 -1
  57. package/dist/core/skills.js +13 -3
  58. package/dist/core/skills.js.map +1 -1
  59. package/dist/core/subagent-manager.d.ts +3 -1
  60. package/dist/core/subagent-manager.js +3 -1
  61. package/dist/core/subagent-manager.js.map +1 -1
  62. package/dist/core/subagent-policy.js +1 -1
  63. package/dist/core/subagent-policy.js.map +1 -1
  64. package/dist/core/worktree-setup.d.ts +23 -0
  65. package/dist/core/worktree-setup.js +128 -9
  66. package/dist/core/worktree-setup.js.map +1 -1
  67. package/dist/core/worktree.d.ts +20 -2
  68. package/dist/core/worktree.js +74 -31
  69. package/dist/core/worktree.js.map +1 -1
  70. package/dist/modes/json-mode.js +11 -2
  71. package/dist/modes/json-mode.js.map +1 -1
  72. package/dist/modes/subagent-worker-mode.d.ts +36 -1
  73. package/dist/modes/subagent-worker-mode.js +68 -38
  74. package/dist/modes/subagent-worker-mode.js.map +1 -1
  75. package/dist/motion-agent/motion-agent.d.ts +1 -1
  76. package/dist/motion-agent/motion-agent.js +1 -1
  77. package/dist/motion-agent/motion-check-tool.d.ts +15 -1
  78. package/dist/motion-agent/motion-check-tool.js +345 -37
  79. package/dist/motion-agent/motion-check-tool.js.map +1 -1
  80. package/dist/motion-agent/motion-prompt.d.ts +1 -1
  81. package/dist/motion-agent/motion-prompt.js +16 -20
  82. package/dist/motion-agent/motion-prompt.js.map +1 -1
  83. package/dist/motion-agent/motion-review-session.js +1 -1
  84. package/dist/motion-agent/motion-review-session.js.map +1 -1
  85. package/dist/motion-agent/motion-studio-context.js +1 -1
  86. package/dist/motion-agent/motion-studio-context.js.map +1 -1
  87. package/dist/system-prompt.d.ts +2 -1
  88. package/dist/system-prompt.js +12 -3
  89. package/dist/system-prompt.js.map +1 -1
  90. package/dist/tools/bash.js +64 -0
  91. package/dist/tools/bash.js.map +1 -1
  92. package/dist/tools/edit.js +1 -1
  93. package/dist/tools/edit.js.map +1 -1
  94. package/dist/tools/goals.d.ts +1 -1
  95. package/dist/tools/index.d.ts +6 -0
  96. package/dist/tools/index.js +2 -1
  97. package/dist/tools/index.js.map +1 -1
  98. package/dist/tools/read-tracker.d.ts +30 -2
  99. package/dist/tools/read-tracker.js +92 -5
  100. package/dist/tools/read-tracker.js.map +1 -1
  101. package/dist/tools/read.js +36 -5
  102. package/dist/tools/read.js.map +1 -1
  103. package/dist/tools/subagent-shared.d.ts +19 -0
  104. package/dist/tools/subagent-shared.js +30 -0
  105. package/dist/tools/subagent-shared.js.map +1 -1
  106. package/dist/tools/write.js +4 -3
  107. package/dist/tools/write.js.map +1 -1
  108. package/dist/ui/components/Footer.js +1 -1
  109. package/dist/ui/components/Footer.js.map +1 -1
  110. package/dist/ui/render.d.ts +2 -0
  111. package/dist/ui/render.js +3 -0
  112. package/dist/ui/render.js.map +1 -1
  113. package/dist/utils/text.d.ts +12 -0
  114. package/dist/utils/text.js +11 -0
  115. package/dist/utils/text.js.map +1 -1
  116. package/package.json +5 -5
  117. package/assets/motion/skills/mixkit-split-text-617/SKILL.md +0 -115
  118. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-480.json +0 -1
  119. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-494.json +0 -1
  120. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-5.json +0 -1
  121. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-508.json +0 -1
  122. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6525.json +0 -1
  123. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6539.json +0 -1
  124. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6647.json +0 -1
  125. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6663.json +0 -1
  126. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6677.json +0 -1
  127. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6691.json +0 -1
  128. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6706.json +0 -1
  129. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6722.json +0 -1
  130. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6736.json +0 -1
  131. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6750.json +0 -1
  132. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6764.json +0 -1
  133. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6780.json +0 -1
  134. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6794.json +0 -1
  135. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6810.json +0 -1
  136. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6823.json +0 -1
  137. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6872.json +0 -1
  138. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-6936.json +0 -1
  139. package/assets/motion/skills/mixkit-split-text-617/data/compositions/comp-76.json +0 -1
  140. package/assets/motion/skills/mixkit-split-text-617/data/manifest.json +0 -495
  141. package/assets/motion/skills/mixkit-split-text-617/references/RECONSTRUCTION.md +0 -201
  142. package/assets/motion/skills/mixkit-split-text-617/references/VERIFICATION.md +0 -107
  143. 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())