wizz-method 2.11.1 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/package.json +1 -1
  2. package/skills-registry.yaml +19 -5
  3. package/src/modules/lowticket/README.md +1 -1
  4. package/src/modules/lowticket/skills/wizz-lowticket-guia/SKILL.md +1 -1
  5. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/SKILL.md +1 -1
  6. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/02-diagnostico-funil.md +7 -5
  7. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/03-campanha-bidcap.md +9 -10
  8. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/04-criativos.md +3 -3
  9. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/04a-criativos-ia.md +6 -6
  10. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/04b-criativos-formatos.md +1 -1
  11. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/04c-criativos-roteiro.md +3 -3
  12. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/06-pagina-vendas.md +2 -2
  13. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/06a-instagram.md +2 -2
  14. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/07-funil-upsell.md +2 -2
  15. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/11-checklist-roi.md +5 -5
  16. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/12-mineracao-ofertas.md +4 -4
  17. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/12a-mineracao-veredito.md +3 -3
  18. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/12b-fabrica-de-ofertas.md +11 -11
  19. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/12c-anatomia-low-ticket.md +2 -2
  20. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/14-vocabulario.md +1 -1
  21. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/15-como-estender.md +1 -1
  22. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/18-copy-desejo-oferta.md +2 -2
  23. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/INDEX.md +12 -12
  24. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/guardrails.md +41 -55
  25. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/knowledge/pontos-em-aberto.md +24 -24
  26. package/src/modules/lowticket/skills/wizz-lowticket-minerador/SKILL.md +7 -7
  27. package/src/modules/wizz/_shared/video-pipeline.md +11 -3
  28. package/src/modules/wizz/agents/wizz-designer/SKILL.md +1 -1
  29. package/src/modules/wizz/agents/wizz-social/SKILL.md +1 -0
  30. package/src/skills-lib/wizz-remotion-best-practices/rules/sfx.md +3 -1
  31. package/src/skills-lib/wizz-router/references/routing-table-flat.md +1 -0
  32. package/src/skills-lib/wizz-video-effects/SKILL.md +85 -0
  33. package/src/skills-lib/wizz-video-effects/assets/effects.config.template.json +178 -0
  34. package/src/skills-lib/wizz-video-effects/assets/remotion/EffectsLayer.tsx +87 -0
  35. package/src/skills-lib/wizz-video-effects/assets/remotion/README.md +37 -0
  36. package/src/skills-lib/wizz-video-effects/assets/remotion/useEffects.ts +120 -0
  37. package/src/skills-lib/wizz-video-effects/assets/sfx/CREDITS.md +56 -0
  38. package/src/skills-lib/wizz-video-effects/assets/sfx/cash.mp3 +0 -0
  39. package/src/skills-lib/wizz-video-effects/assets/sfx/chime.mp3 +0 -0
  40. package/src/skills-lib/wizz-video-effects/assets/sfx/click-soft.mp3 +0 -0
  41. package/src/skills-lib/wizz-video-effects/assets/sfx/click.mp3 +0 -0
  42. package/src/skills-lib/wizz-video-effects/assets/sfx/coin.mp3 +0 -0
  43. package/src/skills-lib/wizz-video-effects/assets/sfx/error.mp3 +0 -0
  44. package/src/skills-lib/wizz-video-effects/assets/sfx/impact-bass-1.mp3 +0 -0
  45. package/src/skills-lib/wizz-video-effects/assets/sfx/impact-bass-2.mp3 +0 -0
  46. package/src/skills-lib/wizz-video-effects/assets/sfx/key-press.mp3 +0 -0
  47. package/src/skills-lib/wizz-video-effects/assets/sfx/notif.mp3 +0 -0
  48. package/src/skills-lib/wizz-video-effects/assets/sfx/notification.mp3 +0 -0
  49. package/src/skills-lib/wizz-video-effects/assets/sfx/paste.mp3 +0 -0
  50. package/src/skills-lib/wizz-video-effects/assets/sfx/ping.mp3 +0 -0
  51. package/src/skills-lib/wizz-video-effects/assets/sfx/pop.mp3 +0 -0
  52. package/src/skills-lib/wizz-video-effects/assets/sfx/riser-metal.mp3 +0 -0
  53. package/src/skills-lib/wizz-video-effects/assets/sfx/riser.mp3 +0 -0
  54. package/src/skills-lib/wizz-video-effects/assets/sfx/send.mp3 +0 -0
  55. package/src/skills-lib/wizz-video-effects/assets/sfx/sparkle.mp3 +0 -0
  56. package/src/skills-lib/wizz-video-effects/assets/sfx/stamp.mp3 +0 -0
  57. package/src/skills-lib/wizz-video-effects/assets/sfx/success.mp3 +0 -0
  58. package/src/skills-lib/wizz-video-effects/assets/sfx/type.mp3 +0 -0
  59. package/src/skills-lib/wizz-video-effects/assets/sfx/typing.mp3 +0 -0
  60. package/src/skills-lib/wizz-video-effects/assets/sfx/whoosh-cinematic.mp3 +0 -0
  61. package/src/skills-lib/wizz-video-effects/assets/sfx/whoosh-short.mp3 +0 -0
  62. package/src/skills-lib/wizz-video-effects/assets/sfx/whoosh.mp3 +0 -0
  63. package/src/skills-lib/wizz-video-effects/references/audio.md +87 -0
  64. package/src/skills-lib/wizz-video-effects/references/data-contract.md +145 -0
  65. package/src/skills-lib/wizz-video-effects/references/do-not-use.md +54 -0
  66. package/src/skills-lib/wizz-video-effects/references/editing-patterns.md +58 -0
  67. package/src/skills-lib/wizz-video-effects/references/gates.md +37 -0
  68. package/src/skills-lib/wizz-video-effects/references/sfx-licensing.md +40 -0
  69. package/src/skills-lib/wizz-video-effects/references/when-to-use.md +129 -0
  70. package/src/skills-lib/wizz-video-effects/scripts/budget.py +211 -0
  71. package/src/skills-lib/wizz-video-effects/scripts/check_excess.py +218 -0
  72. package/src/skills-lib/wizz-video-effects/scripts/check_loudness.py +175 -0
  73. package/src/skills-lib/wizz-video-effects/scripts/check_rhythm.py +137 -0
  74. package/src/skills-lib/wizz-video-effects/scripts/check_safe_zone.py +221 -0
  75. package/src/skills-lib/wizz-video-effects/scripts/config.py +583 -0
  76. package/src/skills-lib/wizz-video-effects/scripts/fill_breaths.py +355 -0
  77. package/src/skills-lib/wizz-video-effects/scripts/measure_density.py +122 -0
  78. package/src/skills-lib/wizz-video-effects/scripts/normalize_audio.py +189 -0
  79. package/src/skills-lib/wizz-video-effects/scripts/sound.py +342 -0
  80. package/src/skills-lib/wizz-video-effects/scripts/test_budget.py +131 -0
  81. package/src/skills-lib/wizz-video-effects/scripts/test_check_loudness.py +156 -0
  82. package/src/skills-lib/wizz-video-effects/scripts/test_checks.py +190 -0
  83. package/src/skills-lib/wizz-video-effects/scripts/test_config.py +135 -0
  84. package/src/skills-lib/wizz-video-effects/scripts/test_fill_breaths.py +179 -0
  85. package/src/skills-lib/wizz-video-effects/scripts/test_sound.py +173 -0
  86. package/src/skills-lib/wizz-video-effects/scripts/timeline.py +85 -0
@@ -0,0 +1,85 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Read and write the timeline JSON every script shares.
3
+
4
+ The shape is documented in references/data-contract.md. This module only
5
+ normalizes it: absent lists become empty lists, never errors, and every
6
+ instant comes back as a float in seconds.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import json
11
+ from pathlib import Path
12
+
13
+
14
+ class TimelineError(Exception):
15
+ """Timeline file missing or malformed."""
16
+
17
+
18
+ def load(path: str | Path) -> dict:
19
+ p = Path(path)
20
+ if not p.exists():
21
+ raise TimelineError(f"timeline not found: {p}")
22
+ try:
23
+ data = json.loads(p.read_text(encoding="utf-8"))
24
+ except json.JSONDecodeError as e:
25
+ raise TimelineError(f"{p} is not valid JSON: {e}") from e
26
+ if not isinstance(data, dict):
27
+ raise TimelineError(f"{p}: the timeline must be a JSON object")
28
+ return data
29
+
30
+
31
+ def save(path: str | Path, data: dict) -> None:
32
+ Path(path).write_text(json.dumps(data, ensure_ascii=False, indent=1) + "\n",
33
+ encoding="utf-8")
34
+
35
+
36
+ def instants(items, key: str = "at") -> list[float]:
37
+ """A list of numbers OR of objects {key: ...} as sorted floats."""
38
+ if not items:
39
+ return []
40
+ return sorted(float(i[key]) if isinstance(i, dict) else float(i) for i in items)
41
+
42
+
43
+ def transitions(scenes) -> list[float]:
44
+ """Scene starts with a real transition (not empty, not 'cut')."""
45
+ out = []
46
+ for s in scenes or []:
47
+ tr = s.get("transition")
48
+ if tr and tr != "cut" and "start" in s:
49
+ out.append(float(s["start"]))
50
+ return sorted(out)
51
+
52
+
53
+ def duration(data: dict) -> tuple[float, bool]:
54
+ """(duration, derived). Uses `duration`; else the largest scene end."""
55
+ if data.get("duration"):
56
+ return float(data["duration"]), False
57
+ ends = [float(s["start"]) + float(s.get("dur", 0.0))
58
+ for s in (data.get("scenes") or []) if "start" in s]
59
+ return (max(ends), True) if ends else (0.0, True)
60
+
61
+
62
+ def fps(data: dict, default: int) -> int:
63
+ return int(data.get("fps") or default)
64
+
65
+
66
+ def sounds(data: dict) -> list[dict]:
67
+ """Every sound of the piece, sorted by `at`: sfx[] plus scene-level sfx
68
+ (a scene's `sfx` plays at the scene start)."""
69
+ out = [dict(s) for s in (data.get("sfx") or [])]
70
+ for sc in data.get("scenes") or []:
71
+ s = sc.get("sfx")
72
+ if isinstance(s, dict) and "start" in sc:
73
+ out.append({**s, "at": float(sc["start"]), "scene": True})
74
+ return sorted(out, key=lambda s: float(s["at"]))
75
+
76
+
77
+ def effect_events(data: dict) -> dict[str, list[float]]:
78
+ """Visual effect instants by budget kind."""
79
+ return {
80
+ "punch": instants(data.get("punches")),
81
+ "shake": instants(data.get("shakes")),
82
+ "flash": instants(data.get("flashes")),
83
+ "interrupt": instants(data.get("interrupts")),
84
+ "transition": transitions(data.get("scenes")),
85
+ }