argos-harness 0.1.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 (217) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -0
  3. package/assets/agents/auditor.md +140 -0
  4. package/assets/agents/commit-pr-pilot.md +154 -0
  5. package/assets/agents/explorer.md +93 -0
  6. package/assets/agents/implementer.md +117 -0
  7. package/assets/agents/leader.md +149 -0
  8. package/assets/agents/researcher.md +89 -0
  9. package/assets/agents/review-readability.md +87 -0
  10. package/assets/agents/review-reliability.md +100 -0
  11. package/assets/agents/review-resilience.md +87 -0
  12. package/assets/agents/review-risk.md +87 -0
  13. package/assets/agents/reviewer.md +167 -0
  14. package/assets/agents/ticket-audit.md +129 -0
  15. package/assets/hooks/argos-guard-destructive.sh +127 -0
  16. package/assets/hooks/argos-quality-gate.sh +129 -0
  17. package/assets/managed/aterrizaje.md +24 -0
  18. package/assets/managed/formato-respuesta.md +21 -0
  19. package/assets/managed/identidad.md +48 -0
  20. package/assets/managed/operaciones-seguras.md +14 -0
  21. package/assets/managed/orquestacion.md +169 -0
  22. package/assets/output-styles/argos.md +71 -0
  23. package/assets/skills/ai-sdk-5/SKILL.md +230 -0
  24. package/assets/skills/angular/SKILL.md +19 -0
  25. package/assets/skills/angular/references/architecture.md +137 -0
  26. package/assets/skills/angular/references/core.md +197 -0
  27. package/assets/skills/angular/references/forms.md +115 -0
  28. package/assets/skills/angular/references/performance.md +124 -0
  29. package/assets/skills/apollo-client/SKILL.md +61 -0
  30. package/assets/skills/app-blueprint/SKILL.md +45 -0
  31. package/assets/skills/app-blueprint/assets/module-template.md +48 -0
  32. package/assets/skills/app-blueprint/assets/system-template.md +38 -0
  33. package/assets/skills/app-blueprint/references/workflow.md +101 -0
  34. package/assets/skills/app-builder/SKILL.md +43 -0
  35. package/assets/skills/app-builder/phases/0-product.md +58 -0
  36. package/assets/skills/app-builder/phases/1-scaffold.md +33 -0
  37. package/assets/skills/app-builder/phases/10-store.md +40 -0
  38. package/assets/skills/app-builder/phases/2-data.md +34 -0
  39. package/assets/skills/app-builder/phases/3-domain.md +33 -0
  40. package/assets/skills/app-builder/phases/4-ui-nav.md +32 -0
  41. package/assets/skills/app-builder/phases/5-identity.md +30 -0
  42. package/assets/skills/app-builder/phases/6-polish.md +34 -0
  43. package/assets/skills/app-builder/phases/7-brand.md +31 -0
  44. package/assets/skills/app-builder/phases/8-web.md +30 -0
  45. package/assets/skills/app-builder/phases/9-docs.md +31 -0
  46. package/assets/skills/app-ia/SKILL.md +54 -0
  47. package/assets/skills/astro/SKILL.md +39 -0
  48. package/assets/skills/axios/SKILL.md +61 -0
  49. package/assets/skills/branch-pr/SKILL.md +200 -0
  50. package/assets/skills/bullmq/SKILL.md +55 -0
  51. package/assets/skills/chained-pr/SKILL.md +48 -0
  52. package/assets/skills/chained-pr/references/chaining-details.md +99 -0
  53. package/assets/skills/cognitive-doc-design/SKILL.md +81 -0
  54. package/assets/skills/comment-writer/SKILL.md +74 -0
  55. package/assets/skills/dashboard-ia/SKILL.md +54 -0
  56. package/assets/skills/django-drf/SKILL.md +180 -0
  57. package/assets/skills/go-testing/SKILL.md +47 -0
  58. package/assets/skills/go-testing/references/examples.md +89 -0
  59. package/assets/skills/issue-creation/SKILL.md +223 -0
  60. package/assets/skills/jira-epic/SKILL.md +306 -0
  61. package/assets/skills/jira-task/SKILL.md +382 -0
  62. package/assets/skills/judgment-day/SKILL.md +52 -0
  63. package/assets/skills/judgment-day/references/prompts-and-formats.md +98 -0
  64. package/assets/skills/lightsail-deploy/SKILL.md +44 -0
  65. package/assets/skills/lightsail-deploy/references/runbook.md +102 -0
  66. package/assets/skills/loop-back-debug/SKILL.md +102 -0
  67. package/assets/skills/mantine-form/SKILL.md +57 -0
  68. package/assets/skills/mongoose/SKILL.md +66 -0
  69. package/assets/skills/nextjs-15/SKILL.md +144 -0
  70. package/assets/skills/not-boring-mobile/SKILL.md +43 -0
  71. package/assets/skills/not-boring-mobile/references/not-boring-playbook.md +65 -0
  72. package/assets/skills/playwright/SKILL.md +315 -0
  73. package/assets/skills/pr-comments/SKILL.md +93 -0
  74. package/assets/skills/pr-create/SKILL.md +64 -0
  75. package/assets/skills/promo-video/SKILL.md +52 -0
  76. package/assets/skills/promo-video/assets/package.template.json +22 -0
  77. package/assets/skills/promo-video/assets/promo.template.tsx +469 -0
  78. package/assets/skills/promo-video/assets/theme.template.ts +27 -0
  79. package/assets/skills/promo-video/references/pipeline.md +119 -0
  80. package/assets/skills/promo-video-web/SKILL.md +51 -0
  81. package/assets/skills/promo-video-web/assets/browser-promo.template.tsx +385 -0
  82. package/assets/skills/promo-video-web/assets/capture.template.ts +70 -0
  83. package/assets/skills/promo-video-web/assets/package.template.json +26 -0
  84. package/assets/skills/promo-video-web/references/pipeline.md +84 -0
  85. package/assets/skills/pytest/SKILL.md +180 -0
  86. package/assets/skills/react-19/SKILL.md +118 -0
  87. package/assets/skills/react-hook-form/SKILL.md +59 -0
  88. package/assets/skills/react-router/SKILL.md +60 -0
  89. package/assets/skills/redux-toolkit/SKILL.md +60 -0
  90. package/assets/skills/review-diff/SKILL.md +101 -0
  91. package/assets/skills/ship-docs/SKILL.md +45 -0
  92. package/assets/skills/ship-docs/references/ship-docs-playbook.md +31 -0
  93. package/assets/skills/skill-creator/SKILL.md +97 -0
  94. package/assets/skills/skill-creator/assets/SKILL-TEMPLATE.md +68 -0
  95. package/assets/skills/skill-creator/references/skill-style-guide.md +79 -0
  96. package/assets/skills/skill-improver/SKILL.md +50 -0
  97. package/assets/skills/skill-improver/references/skill-style-guide.md +79 -0
  98. package/assets/skills/socketio/SKILL.md +58 -0
  99. package/assets/skills/spec-bootstrap/SKILL.md +62 -0
  100. package/assets/skills/store-ship/SKILL.md +52 -0
  101. package/assets/skills/store-ship/assets/android-supply.template.md +22 -0
  102. package/assets/skills/store-ship/assets/eas.template.json +32 -0
  103. package/assets/skills/store-ship/assets/maestro-flow.template.yaml +27 -0
  104. package/assets/skills/store-ship/assets/store.config.template.json +28 -0
  105. package/assets/skills/store-ship/references/pipeline.md +198 -0
  106. package/assets/skills/stripe/SKILL.md +83 -0
  107. package/assets/skills/tailwind-4/SKILL.md +193 -0
  108. package/assets/skills/tamagui/SKILL.md +60 -0
  109. package/assets/skills/tanstack-query/SKILL.md +58 -0
  110. package/assets/skills/ticket-intake/SKILL.md +55 -0
  111. package/assets/skills/typescript/SKILL.md +134 -0
  112. package/assets/skills/verify-before-done/SKILL.md +111 -0
  113. package/assets/skills/webapp-rebuilder/SKILL.md +48 -0
  114. package/assets/skills/webapp-rebuilder/assets/charter-template.md +46 -0
  115. package/assets/skills/webapp-rebuilder/references/workflow.md +47 -0
  116. package/assets/skills/winston-logging/SKILL.md +61 -0
  117. package/assets/skills/work-unit-commits/SKILL.md +84 -0
  118. package/assets/skills/zod-4/SKILL.md +210 -0
  119. package/assets/skills/zustand-5/SKILL.md +216 -0
  120. package/bin/argos.js +6 -0
  121. package/dist/commands/adopt.d.ts +35 -0
  122. package/dist/commands/adopt.d.ts.map +1 -0
  123. package/dist/commands/adopt.js +347 -0
  124. package/dist/commands/adopt.js.map +1 -0
  125. package/dist/commands/doctor.d.ts +20 -0
  126. package/dist/commands/doctor.d.ts.map +1 -0
  127. package/dist/commands/doctor.js +478 -0
  128. package/dist/commands/doctor.js.map +1 -0
  129. package/dist/commands/init.d.ts +32 -0
  130. package/dist/commands/init.d.ts.map +1 -0
  131. package/dist/commands/init.js +358 -0
  132. package/dist/commands/init.js.map +1 -0
  133. package/dist/commands/remove.d.ts +62 -0
  134. package/dist/commands/remove.d.ts.map +1 -0
  135. package/dist/commands/remove.js +487 -0
  136. package/dist/commands/remove.js.map +1 -0
  137. package/dist/commands/workspace.d.ts +73 -0
  138. package/dist/commands/workspace.d.ts.map +1 -0
  139. package/dist/commands/workspace.js +354 -0
  140. package/dist/commands/workspace.js.map +1 -0
  141. package/dist/index.d.ts +2 -0
  142. package/dist/index.d.ts.map +1 -0
  143. package/dist/index.js +24 -0
  144. package/dist/index.js.map +1 -0
  145. package/dist/lib/assets.d.ts +29 -0
  146. package/dist/lib/assets.d.ts.map +1 -0
  147. package/dist/lib/assets.js +57 -0
  148. package/dist/lib/assets.js.map +1 -0
  149. package/dist/lib/atomic-write.d.ts +17 -0
  150. package/dist/lib/atomic-write.d.ts.map +1 -0
  151. package/dist/lib/atomic-write.js +41 -0
  152. package/dist/lib/atomic-write.js.map +1 -0
  153. package/dist/lib/backup.d.ts +11 -0
  154. package/dist/lib/backup.d.ts.map +1 -0
  155. package/dist/lib/backup.js +42 -0
  156. package/dist/lib/backup.js.map +1 -0
  157. package/dist/lib/config.d.ts +36 -0
  158. package/dist/lib/config.d.ts.map +1 -0
  159. package/dist/lib/config.js +52 -0
  160. package/dist/lib/config.js.map +1 -0
  161. package/dist/lib/detect.d.ts +58 -0
  162. package/dist/lib/detect.d.ts.map +1 -0
  163. package/dist/lib/detect.js +330 -0
  164. package/dist/lib/detect.js.map +1 -0
  165. package/dist/lib/ficha.d.ts +10 -0
  166. package/dist/lib/ficha.d.ts.map +1 -0
  167. package/dist/lib/ficha.js +38 -0
  168. package/dist/lib/ficha.js.map +1 -0
  169. package/dist/lib/git.d.ts +27 -0
  170. package/dist/lib/git.d.ts.map +1 -0
  171. package/dist/lib/git.js +79 -0
  172. package/dist/lib/git.js.map +1 -0
  173. package/dist/lib/managed-files.d.ts +35 -0
  174. package/dist/lib/managed-files.d.ts.map +1 -0
  175. package/dist/lib/managed-files.js +97 -0
  176. package/dist/lib/managed-files.js.map +1 -0
  177. package/dist/lib/markers.d.ts +64 -0
  178. package/dist/lib/markers.d.ts.map +1 -0
  179. package/dist/lib/markers.js +157 -0
  180. package/dist/lib/markers.js.map +1 -0
  181. package/dist/lib/navori-import.d.ts +42 -0
  182. package/dist/lib/navori-import.d.ts.map +1 -0
  183. package/dist/lib/navori-import.js +65 -0
  184. package/dist/lib/navori-import.js.map +1 -0
  185. package/dist/lib/openclaw-agents.d.ts +53 -0
  186. package/dist/lib/openclaw-agents.d.ts.map +1 -0
  187. package/dist/lib/openclaw-agents.js +118 -0
  188. package/dist/lib/openclaw-agents.js.map +1 -0
  189. package/dist/lib/package-root.d.ts +11 -0
  190. package/dist/lib/package-root.d.ts.map +1 -0
  191. package/dist/lib/package-root.js +23 -0
  192. package/dist/lib/package-root.js.map +1 -0
  193. package/dist/lib/paths.d.ts +11 -0
  194. package/dist/lib/paths.d.ts.map +1 -0
  195. package/dist/lib/paths.js +16 -0
  196. package/dist/lib/paths.js.map +1 -0
  197. package/dist/lib/settings-merge.d.ts +125 -0
  198. package/dist/lib/settings-merge.d.ts.map +1 -0
  199. package/dist/lib/settings-merge.js +373 -0
  200. package/dist/lib/settings-merge.js.map +1 -0
  201. package/dist/lib/version.d.ts +3 -0
  202. package/dist/lib/version.d.ts.map +1 -0
  203. package/dist/lib/version.js +13 -0
  204. package/dist/lib/version.js.map +1 -0
  205. package/dist/lib/which.d.ts +8 -0
  206. package/dist/lib/which.d.ts.map +1 -0
  207. package/dist/lib/which.js +30 -0
  208. package/dist/lib/which.js.map +1 -0
  209. package/dist/lib/workspaces.d.ts +133 -0
  210. package/dist/lib/workspaces.d.ts.map +1 -0
  211. package/dist/lib/workspaces.js +241 -0
  212. package/dist/lib/workspaces.js.map +1 -0
  213. package/dist/lib/zod-messages.d.ts +4 -0
  214. package/dist/lib/zod-messages.d.ts.map +1 -0
  215. package/dist/lib/zod-messages.js +28 -0
  216. package/dist/lib/zod-messages.js.map +1 -0
  217. package/package.json +44 -0
@@ -0,0 +1,43 @@
1
+ ---
2
+ name: not-boring-mobile
3
+ description: Trigger: Not Boring app, playful/delightful app, juguete, maximalist UI, tactile/skeuomorphic mobile, make it delightful. Visual+interaction direction for delight-first React Native/Expo apps — springs, haptics, sound, bespoke components.
4
+ ---
5
+
6
+ ## Activation Contract
7
+
8
+ Activate when the user wants a React Native/Expo app that feels like a TOY, not a tool — the "Not Boring" (Andy Allen) / Apple-editorial register: maximalist, tactile, animation-led, personality-heavy. This is the VISUAL + INTERACTION layer ONLY; architecture, data, and phase gates come from `app-builder`. Do NOT activate for dense tools, clinical/enterprise, or data-heavy products — those want a restrained register.
9
+
10
+ ## Hard Rules
11
+
12
+ - Bespoke everything the user touches: NO stock/system components, NO generic shadcn/reusables look. Owned components with custom shape, depth, and motion.
13
+ - Every meaningful interaction gets BOTH a spring (Reanimated `withSpring`, native driver) AND a haptic; primary "toy" interactions also get sound.
14
+ - Spend boldness on ONE signature interaction the app is remembered by; keep everything else coherent, not noisy.
15
+ - Commit to ONE saturated color world (gradients, light, depth) — never tinted neutrals.
16
+ - Respect OS Reduce Motion with a tasteful non-animated fallback; hold 60fps (no layout-animating hot paths, no JS per-frame work).
17
+ - Complement `app-builder`; never redo its architecture, data layer, or phase gates.
18
+
19
+ ## Decision Gates
20
+
21
+ | Product | Register |
22
+ |---|---|
23
+ | Habit/lifestyle/creative/kids/consumer where delight IS the value | this skill (maximalist) |
24
+ | Tool, clinical, enterprise, dense data, pro workflow | restrained (`app-builder` default) — do NOT use this |
25
+ | Marketing/story surface (editorial, immersive, cinematic) | this skill's editorial mode |
26
+
27
+ ## Execution Steps
28
+
29
+ 1. Confirm the register fits (consumer/delight). If it's a tool, stop and use the restrained register.
30
+ 2. Read `references/not-boring-playbook.md` (libraries, spring presets, sound/haptic/depth recipes) BEFORE building UI.
31
+ 3. Pick the ONE signature "toy" interaction that embodies the app; prototype it first, on device.
32
+ 4. Build bespoke, gesture-reactive components; drive state changes with `withSpring`, not timing curves.
33
+ 5. Layer depth (gradients, layered shadows, glass, light) + one committed color world + big expressive type.
34
+ 6. Wire haptics + sound via owned `lib/haptics.ts` / `lib/sound.ts` wrappers on every interaction.
35
+ 7. Verify on a REAL device (springs/haptics/sound don't read in a simulator); gate on "is it fun to poke?".
36
+
37
+ ## Output Contract
38
+
39
+ Return: the signature interaction built, the bespoke components created, the color/type/depth system, the haptic+sound wiring, and device-verified evidence it feels like a toy — not just a themed form.
40
+
41
+ ## References
42
+
43
+ - `references/not-boring-playbook.md` — libraries, spring presets, sound/haptic/depth recipes, and the Not Boring + Apple-editorial principles.
@@ -0,0 +1,65 @@
1
+ # Not Boring Mobile — Playbook
2
+
3
+ The direction layer for delight-first Expo/RN apps. Read before building UI. Pairs with app-builder (which owns architecture, data, phases).
4
+
5
+ ## The philosophy (Not Boring, Andy Allen)
6
+
7
+ - **Toy, not tool.** The interface should be fun to poke even with no task. Reward curiosity.
8
+ - **Modern skeuomorphism.** Real depth, material, light — not flat, not literal 2010 skeuo. Surfaces feel touchable.
9
+ - **Motion is the protagonist**, not decoration. Everything reacts to touch; nothing snaps instantly. State changes are physical, not timed.
10
+ - **Personality.** A voice, playful copy, optional character/mascot, surprise & delight, easter eggs. The app has an attitude.
11
+ - **Committed color world.** One saturated palette/gradient system owns the app. No timid neutrals.
12
+ - **Sound design.** Short, tactile sounds paired with haptics make interactions feel physical. Always user-mutable.
13
+ - **Restraint inside maximalism.** One signature "hero toy"; everything else is coherent and disciplined so the hero lands.
14
+
15
+ ## Apple-editorial mode (Today stories)
16
+
17
+ Full-bleed cinematic imagery, oversized display type, narrative scroll with parallax, generous negative space, one accent. Use for onboarding, marketing, story surfaces. Same craft, calmer motion.
18
+
19
+ ## Libraries (Expo-compatible)
20
+
21
+ - `react-native-reanimated` (v3/4) — springs, worklets, shared values. Worklets babel plugin is required (v4: `react-native-worklets/plugin`, LAST).
22
+ - `react-native-gesture-handler` — pan/tap/pinch driving animations directly.
23
+ - `expo-haptics` — impact + notification feedback.
24
+ - `expo-audio` (or `expo-av`) — short interaction sounds; preload, keep <300ms.
25
+ - `expo-linear-gradient`, `expo-blur` — gradients + glass.
26
+ - `@shopify/react-native-skia` — advanced visuals: shaders, mesh gradients, custom shapes, glow. Reach for it when gradients/shadows aren't enough.
27
+ - `moti` (optional) — declarative wrapper over Reanimated for quick spring transitions.
28
+
29
+ ## Spring presets (Reanimated `withSpring`)
30
+
31
+ ```ts
32
+ export const springs = {
33
+ gentle: { damping: 18, stiffness: 140, mass: 1 }, // calm settle
34
+ bouncy: { damping: 10, stiffness: 180, mass: 0.9 }, // playful overshoot
35
+ stiff: { damping: 26, stiffness: 320, mass: 1 }, // snappy, immediate
36
+ };
37
+ ```
38
+
39
+ Drive press/toggle/drag with these, not `withTiming`. Overshoot is the personality.
40
+
41
+ ## Haptics + sound wiring
42
+
43
+ - `lib/haptics.ts`: map interaction weight → impact (light for taps, medium for commits, heavy/notification for milestones). Wrap in `.catch(()=>{})`.
44
+ - `lib/sound.ts`: owned wrapper; preload sounds once, expose `play(name)`, honor a user mute setting. Never block the interaction on audio.
45
+ - Rule: press = light haptic; success/complete = notification success + a reward sound; drag threshold crossed = tick.
46
+
47
+ ## Depth recipe
48
+
49
+ Layer, don't flatten: base gradient → surface with layered shadows (a soft wide + a tight dark) → inner light highlight (top edge lighter) → optional blur/glass for overlays. Skia for glow/mesh gradients.
50
+
51
+ ## Performance (non-negotiable)
52
+
53
+ - Native driver only; keep animation math in worklets.
54
+ - No layout animations on list hot paths; use transform/opacity.
55
+ - Memoize heavy components; virtualize long lists.
56
+ - Skia work off the JS thread; avoid per-frame `setState`.
57
+ - Test on a real device — a simulator hides haptics, sound, and true frame timing.
58
+
59
+ ## Anti-patterns
60
+
61
+ - Animating everything → fatigue. Choose the moments.
62
+ - System `Alert`/stock inputs in a delight moment → breaks the toy illusion; build bespoke.
63
+ - Shipping without a device haptic/sound pass → the feel is unverified.
64
+ - Tinted-neutral palette → that's the restrained register; this one commits to color.
65
+ - Reusing shadcn/reusables primitives verbatim → they read generic; here every touched surface is bespoke.
@@ -0,0 +1,315 @@
1
+ ---
2
+ name: playwright
3
+ description: Playwright E2E testing patterns. Trigger: When writing E2E tests - Page Objects, selectors, MCP workflow.
4
+ ---
5
+
6
+ ## MCP Workflow (MANDATORY If Available)
7
+
8
+ **⚠️ If you have Playwright MCP tools, ALWAYS use them BEFORE creating any test:**
9
+
10
+ 1. **Navigate** to target page
11
+ 2. **Take snapshot** to see page structure and elements
12
+ 3. **Interact** with forms/elements to verify exact user flow
13
+ 4. **Take screenshots** to document expected states
14
+ 5. **Verify page transitions** through complete flow (loading, success, error)
15
+ 6. **Document actual selectors** from snapshots (use real refs and labels)
16
+ 7. **Only after exploring** create test code with verified selectors
17
+
18
+ **If MCP NOT available:** Proceed with test creation based on docs and code analysis.
19
+
20
+ **Why This Matters:**
21
+ - ✅ Precise tests - exact steps needed, no assumptions
22
+ - ✅ Accurate selectors - real DOM structure, not imagined
23
+ - ✅ Real flow validation - verify journey actually works
24
+ - ✅ Avoid over-engineering - minimal tests for what exists
25
+ - ✅ Prevent flaky tests - real exploration = stable tests
26
+ - ❌ Never assume how UI "should" work
27
+
28
+ ## File Structure
29
+
30
+ ```
31
+ tests/
32
+ ├── base-page.ts # Parent class for ALL pages
33
+ ├── helpers.ts # Shared utilities
34
+ └── {page-name}/
35
+ ├── {page-name}-page.ts # Page Object Model
36
+ ├── {page-name}.spec.ts # ALL tests here (NO separate files!)
37
+ └── {page-name}.md # Test documentation
38
+ ```
39
+
40
+ **File Naming:**
41
+ - ✅ `sign-up.spec.ts` (all sign-up tests)
42
+ - ✅ `sign-up-page.ts` (page object)
43
+ - ✅ `sign-up.md` (documentation)
44
+ - ❌ `sign-up-critical-path.spec.ts` (WRONG - no separate files)
45
+ - ❌ `sign-up-validation.spec.ts` (WRONG)
46
+
47
+ ## Selector Priority (REQUIRED)
48
+
49
+ ```typescript
50
+ // 1. BEST - getByRole for interactive elements
51
+ this.submitButton = page.getByRole("button", { name: "Submit" });
52
+ this.navLink = page.getByRole("link", { name: "Dashboard" });
53
+
54
+ // 2. BEST - getByLabel for form controls
55
+ this.emailInput = page.getByLabel("Email");
56
+ this.passwordInput = page.getByLabel("Password");
57
+
58
+ // 3. SPARINGLY - getByText for static content only
59
+ this.errorMessage = page.getByText("Invalid credentials");
60
+ this.pageTitle = page.getByText("Welcome");
61
+
62
+ // 4. LAST RESORT - getByTestId when above fail
63
+ this.customWidget = page.getByTestId("date-picker");
64
+
65
+ // ❌ AVOID fragile selectors
66
+ this.button = page.locator(".btn-primary"); // NO
67
+ this.input = page.locator("#email"); // NO
68
+ ```
69
+
70
+ ## Scope Detection (ASK IF AMBIGUOUS)
71
+
72
+ | User Says | Action |
73
+ |-----------|--------|
74
+ | "a test", "one test", "new test", "add test" | Create ONE test() in existing spec |
75
+ | "comprehensive tests", "all tests", "test suite", "generate tests" | Create full suite |
76
+
77
+ **Examples:**
78
+ - "Create a test for user sign-up" → ONE test only
79
+ - "Generate E2E tests for login page" → Full suite
80
+ - "Add a test to verify form validation" → ONE test to existing spec
81
+
82
+ ## Page Object Pattern
83
+
84
+ ```typescript
85
+ import { Page, Locator, expect } from "@playwright/test";
86
+
87
+ // BasePage - ALL pages extend this
88
+ export class BasePage {
89
+ constructor(protected page: Page) {}
90
+
91
+ async goto(path: string): Promise<void> {
92
+ await this.page.goto(path);
93
+ await this.page.waitForLoadState("networkidle");
94
+ }
95
+
96
+ // Common methods go here (see Refactoring Guidelines)
97
+ async waitForNotification(): Promise<void> {
98
+ await this.page.waitForSelector('[role="status"]');
99
+ }
100
+
101
+ async verifyNotificationMessage(message: string): Promise<void> {
102
+ const notification = this.page.locator('[role="status"]');
103
+ await expect(notification).toContainText(message);
104
+ }
105
+ }
106
+
107
+ // Page-specific implementation
108
+ export interface LoginData {
109
+ email: string;
110
+ password: string;
111
+ }
112
+
113
+ export class LoginPage extends BasePage {
114
+ readonly emailInput: Locator;
115
+ readonly passwordInput: Locator;
116
+ readonly submitButton: Locator;
117
+
118
+ constructor(page: Page) {
119
+ super(page);
120
+ this.emailInput = page.getByLabel("Email");
121
+ this.passwordInput = page.getByLabel("Password");
122
+ this.submitButton = page.getByRole("button", { name: "Sign in" });
123
+ }
124
+
125
+ async goto(): Promise<void> {
126
+ await super.goto("/login");
127
+ }
128
+
129
+ async login(data: LoginData): Promise<void> {
130
+ await this.emailInput.fill(data.email);
131
+ await this.passwordInput.fill(data.password);
132
+ await this.submitButton.click();
133
+ }
134
+
135
+ async verifyCriticalOutcome(): Promise<void> {
136
+ await expect(this.page).toHaveURL("/dashboard");
137
+ }
138
+ }
139
+ ```
140
+
141
+ ## Page Object Reuse (CRITICAL)
142
+
143
+ **Always check existing page objects before creating new ones!**
144
+
145
+ ```typescript
146
+ // ✅ GOOD: Reuse existing page objects
147
+ import { SignInPage } from "../sign-in/sign-in-page";
148
+ import { HomePage } from "../home/home-page";
149
+
150
+ test("User can sign up and login", async ({ page }) => {
151
+ const signUpPage = new SignUpPage(page);
152
+ const signInPage = new SignInPage(page); // REUSE
153
+ const homePage = new HomePage(page); // REUSE
154
+
155
+ await signUpPage.signUp(userData);
156
+ await homePage.verifyPageLoaded(); // REUSE method
157
+ await homePage.signOut(); // REUSE method
158
+ await signInPage.login(credentials); // REUSE method
159
+ });
160
+
161
+ // ❌ BAD: Recreating existing functionality
162
+ export class SignUpPage extends BasePage {
163
+ async logout() { /* ... */ } // ❌ HomePage already has this
164
+ async login() { /* ... */ } // ❌ SignInPage already has this
165
+ }
166
+ ```
167
+
168
+ **Guidelines:**
169
+ - Check `tests/` for existing page objects first
170
+ - Import and reuse existing pages
171
+ - Create page objects only when page doesn't exist
172
+ - If test requires multiple pages, ensure all page objects exist (create if needed)
173
+
174
+ ## Refactoring Guidelines
175
+
176
+ ### Move to `BasePage` when:
177
+ - ✅ Navigation helpers used by multiple pages (`waitForPageLoad()`, `getCurrentUrl()`)
178
+ - ✅ Common UI interactions (notifications, modals, theme toggles)
179
+ - ✅ Verification patterns repeated across pages (`isVisible()`, `waitForVisible()`)
180
+ - ✅ Error handling that applies to all pages
181
+ - ✅ Screenshot utilities for debugging
182
+
183
+ ### Move to `helpers.ts` when:
184
+ - ✅ Test data generation (`generateUniqueEmail()`, `generateTestUser()`)
185
+ - ✅ Setup/teardown utilities (`createTestUser()`, `cleanupTestData()`)
186
+ - ✅ Custom assertions (`expectNotificationToContain()`)
187
+ - ✅ API helpers for test setup (`seedDatabase()`, `resetState()`)
188
+ - ✅ Time utilities (`waitForCondition()`, `retryAction()`)
189
+
190
+ **Before (BAD):**
191
+ ```typescript
192
+ // Repeated in multiple page objects
193
+ export class SignUpPage extends BasePage {
194
+ async waitForNotification(): Promise<void> {
195
+ await this.page.waitForSelector('[role="status"]');
196
+ }
197
+ }
198
+ export class SignInPage extends BasePage {
199
+ async waitForNotification(): Promise<void> {
200
+ await this.page.waitForSelector('[role="status"]'); // DUPLICATED!
201
+ }
202
+ }
203
+ ```
204
+
205
+ **After (GOOD):**
206
+ ```typescript
207
+ // BasePage - shared across all pages
208
+ export class BasePage {
209
+ async waitForNotification(): Promise<void> {
210
+ await this.page.waitForSelector('[role="status"]');
211
+ }
212
+ }
213
+
214
+ // helpers.ts - data generation
215
+ export function generateUniqueEmail(): string {
216
+ return `test.${Date.now()}@example.com`;
217
+ }
218
+
219
+ export function generateTestUser() {
220
+ return {
221
+ name: "Test User",
222
+ email: generateUniqueEmail(),
223
+ password: "TestPassword123!",
224
+ };
225
+ }
226
+ ```
227
+
228
+ ## Test Pattern with Tags
229
+
230
+ ```typescript
231
+ import { test, expect } from "@playwright/test";
232
+ import { LoginPage } from "./login-page";
233
+
234
+ test.describe("Login", () => {
235
+ test("User can login successfully",
236
+ { tag: ["@critical", "@e2e", "@login", "@LOGIN-E2E-001"] },
237
+ async ({ page }) => {
238
+ const loginPage = new LoginPage(page);
239
+
240
+ await loginPage.goto();
241
+ await loginPage.login({ email: "user@test.com", password: "pass123" });
242
+
243
+ await expect(page).toHaveURL("/dashboard");
244
+ }
245
+ );
246
+ });
247
+ ```
248
+
249
+ **Tag Categories:**
250
+ - Priority: `@critical`, `@high`, `@medium`, `@low`
251
+ - Type: `@e2e`
252
+ - Feature: `@signup`, `@signin`, `@dashboard`
253
+ - Test ID: `@SIGNUP-E2E-001`, `@LOGIN-E2E-002`
254
+
255
+ ## Test Documentation Format ({page-name}.md)
256
+
257
+ ```markdown
258
+ ### E2E Tests: {Feature Name}
259
+
260
+ **Suite ID:** `{SUITE-ID}`
261
+ **Feature:** {Feature description}
262
+
263
+ ---
264
+
265
+ ## Test Case: `{TEST-ID}` - {Test case title}
266
+
267
+ **Priority:** `{critical|high|medium|low}`
268
+
269
+ **Tags:**
270
+ - type → @e2e
271
+ - feature → @{feature-name}
272
+
273
+ **Description/Objective:** {Brief description}
274
+
275
+ **Preconditions:**
276
+ - {Prerequisites for test to run}
277
+ - {Required data or state}
278
+
279
+ ### Flow Steps:
280
+ 1. {Step 1}
281
+ 2. {Step 2}
282
+ 3. {Step 3}
283
+
284
+ ### Expected Result:
285
+ - {Expected outcome 1}
286
+ - {Expected outcome 2}
287
+
288
+ ### Key verification points:
289
+ - {Assertion 1}
290
+ - {Assertion 2}
291
+
292
+ ### Notes:
293
+ - {Additional considerations}
294
+ ```
295
+
296
+ **Documentation Rules:**
297
+ - ❌ NO general test running instructions
298
+ - ❌ NO file structure explanations
299
+ - ❌ NO code examples or tutorials
300
+ - ❌ NO troubleshooting sections
301
+ - ✅ Focus ONLY on specific test case
302
+ - ✅ Keep under 60 lines when possible
303
+
304
+ ## Commands
305
+
306
+ ```bash
307
+ npx playwright test # Run all
308
+ npx playwright test --grep "login" # Filter by name
309
+ npx playwright test --ui # Interactive UI
310
+ npx playwright test --debug # Debug mode
311
+ npx playwright test tests/login/ # Run specific folder
312
+ ```
313
+
314
+ ## Keywords
315
+ playwright, e2e, testing, page object model, selectors, end-to-end, mcp
@@ -0,0 +1,93 @@
1
+ ---
2
+ name: pr-comments
3
+ description: Review, evaluate, fix, and reply to PR comments in Spanish (MX). Trigger: revisar comentarios del PR, responder comentarios, PR comments, or when the user wants to address reviewer feedback.
4
+ ---
5
+
6
+ ## When to Use
7
+
8
+ The user wants to process reviewer comments on a Pull Request: read them, judge if each is correct or if there's a better solution, apply fixes, and reply.
9
+
10
+ ## Required Skills to Load First
11
+
12
+ Load these BEFORE doing any work:
13
+
14
+ - `comment-writer` — voice and tone for replies
15
+ - `ponytail` — laziest correct fix for any code change
16
+ - `judgment-day` — when a comment is non-trivial and needs adversarial check before agreeing
17
+ - Language/framework skills relevant to the diff (e.g. `react-19`, `nextjs-15`, `typescript`, `django-drf`, `pytest`)
18
+
19
+ ## Workflow
20
+
21
+ ### 1. Fetch comments
22
+
23
+ ```bash
24
+ gh pr view <PR> --json number,title,headRefName,baseRefName
25
+ gh api repos/{owner}/{repo}/pulls/<PR>/comments # inline review comments
26
+ gh api repos/{owner}/{repo}/issues/<PR>/comments # general comments
27
+ ```
28
+
29
+ Group by file/line. Ignore resolved/outdated unless user says otherwise.
30
+
31
+ ### 2. Triage each comment
32
+
33
+ For every comment decide one of:
34
+
35
+ - **AGREE** — reviewer is right, apply fix.
36
+ - **BETTER** — reviewer's intent is valid but there's a better solution. Apply the better one, explain why in the reply.
37
+ - **REJECT** — reviewer is wrong or it's a non-issue. Explain why with technical reasoning.
38
+ - **DISCUSS** — needs user input (ambiguous, product decision, out of scope).
39
+
40
+ Verify before agreeing. Read the code, don't trust the comment blindly. If non-trivial, run `judgment-day` on the proposed fix.
41
+
42
+ ### 3. Apply fixes (ponytail mode)
43
+
44
+ Use the ponytail ladder: stdlib > native > existing dep > one line > minimum code. No speculative refactors. One commit per logical group of comments.
45
+
46
+ ### 4. Draft replies
47
+
48
+ Per comment, draft a short reply in **Mexican Spanish (tú)**, neutral and professional. Match `comment-writer` rules:
49
+
50
+ - Lead with the action: "Listo", "Lo dejé así porque…", "No lo apliqué porque…"
51
+ - 1–3 frases. Sin relleno.
52
+ - Si rechazas, da la razón técnica con evidencia (link a línea, doc, o test).
53
+ - Si propones algo mejor, di qué cambiaste y por qué.
54
+
55
+ ### 5. MANDATORY review gate
56
+
57
+ Before publishing ANYTHING:
58
+
59
+ 1. Show the user a table:
60
+ | Comentario | Veredicto | Fix aplicado | Respuesta propuesta |
61
+ 2. Show the diff of the fixes.
62
+ 3. STOP and ask: "¿Publico estos comentarios y commiteo los fixes, o ajustamos algo?"
63
+
64
+ Do NOT post comments, push commits, or resolve threads until the user approves.
65
+
66
+ ### 6. Publish
67
+
68
+ After approval:
69
+
70
+ - Commit fixes (conventional commits, no AI attribution).
71
+ - Reply per comment: `gh api -X POST repos/{owner}/{repo}/pulls/<PR>/comments/<comment_id>/replies -f body='…'` for inline; `gh pr comment <PR> -b '…'` for general.
72
+ - Resolve threads only if the user said so.
73
+
74
+ ## Reply Examples
75
+
76
+ AGREE:
77
+ > Listo, lo cambié a `useId` para evitar la colisión en SSR.
78
+
79
+ BETTER:
80
+ > Buen punto. En vez de memoizar, extraje el cálculo fuera del render — React Compiler ya cubre el resto. Más simple y sin dependencias.
81
+
82
+ REJECT:
83
+ > No lo aplico: ese branch ya está cubierto por el guard de la línea 42, agregarlo acá duplicaría la validación. Te dejo el test que lo prueba: `auth.spec.ts:88`.
84
+
85
+ ## Anti-patterns
86
+
87
+ - Aceptar todos los comentarios sin verificar.
88
+ - Respuestas largas explicando lo obvio.
89
+ - Aplicar fixes y publicar sin pasar por el gate de revisión.
90
+ - Mezclar fixes de varios comentarios en un commit gigante sin razón.
91
+ - Usar voseo o slang rioplatense.
92
+
93
+ _Adapted from a skill originally authored by gentleman-programming._
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: pr-create
3
+ description: Crea un PR contra la rama destino del repo, delegando título y body a un modelo, con pre-flight bloqueante (gate verde, review aprobado, branch sincronizada) y oficio de commits atómicos y PRs partidos. Trigger: al cerrar el ciclo de una feature tras el APPROVED del reviewer, o al pedir crear/abrir un PR con gh.
4
+ ---
5
+
6
+ # pr-create — crear PR contra la rama destino del repo
7
+
8
+ ## Cuándo usar este skill
9
+
10
+ Al cierre del ciclo, tras el `APPROVED` del reviewer (Fase 8 de `ticket-intake`). El pre-flight es bloqueante: ningún PR sale con el gate en rojo o sin aprobación (harness activo).
11
+
12
+ Este skill no conoce de antemano ni la rama base ni la rama destino del PR: léelas del repo antes de actuar. `branchBase` es el punto de fork; `prTarget` es la rama destino del PR; ambas viven en el `argos.config.json` del repo (y resueltas en texto literal en su ficha, el CLAUDE.md delgado que `argos adopt` escribió). Cuando difieren, el PR y su diff van contra `prTarget`.
13
+
14
+ ## Pre-flight (bloqueante — cualquier check falla → ABORT con mensaje claro)
15
+
16
+ 1. **Working tree limpio** o solo cambios del feature: `git status --porcelain`. Si hay cambios uncommitted que NO son del feature, párate y pregunta.
17
+ 2. **No estás en una rama protegida**: aborta si la rama actual es `main`, `master`, la `branchBase` o la `prTarget` del repo.
18
+ 3. **`gh` autenticado**: `gh auth status`.
19
+ 4. **Gate verde en este turno**: el quality gate fast del repo, resuelto desde `qualityGate.fast` en `argos.config.json` o la ficha. Falla → manda al implementer.
20
+ 5. **Review APPROVED de esta feature** (harness activo): `.claude/progress/review_<feature>.md` puntual — glob `review_*.md` no vale. Ausente/ambiguo/scope distinto → NO aprobado, manda al reviewer. Si lista archivos, compáralos con `git diff --name-only`: archivos tocados que el review NO cubre → NO aprobado, aborta y devuelve al reviewer (no basta con mencionar la diferencia y seguir). Mantén este chequeo de cobertura en sync con el agente `commit-pr-pilot`.
21
+ 6. **Hay commits para el PR**: `git fetch origin <prTarget> --quiet` y `git log origin/<prTarget>..HEAD --oneline`. Vacío → nada que PR-ear.
22
+ 7. **Branch sincronizada**: `git log HEAD..origin/<prTarget> --oneline`. Si origin va adelante, rebase y pregunta.
23
+ 8. **Arrastre de commits** (solo si `branchBase` ≠ `prTarget`): `git rev-list --count origin/<prTarget>..origin/<branchBase>`. Si es > 0, `branchBase` va adelantado de `prTarget` y el PR arrastra esos commits ajenos: avisa y sugiere `git rebase origin/<prTarget>` antes de abrir.
24
+
25
+ ## Push y redacción
26
+
27
+ Si la branch no está pusheada: `git push -u origin "$current_branch"`. Si el upstream diverge, **no fuerces push** — pregunta.
28
+
29
+ Delega title + body a un `Agent` (modelo rápido). Reglas que le impones:
30
+ - **Title**: Conventional Commit (`feat|fix|docs|refactor|test|chore|perf|ci`) con scope de tu dominio, ≤70 chars, español MX, sin emojis ni puntuación final.
31
+ - **Body**: secciones fijas `## Resumen`, `## Cambios`, `## Test plan`, `## Notas` (opcional). Si el trabajo cierra un issue/ticket de GitHub, termina con `Closes #NN`. Tono directo, sin "Generated by Claude".
32
+ - **Contexto al redactor**: branch, `prTarget` resuelto, ticket, `impl_<feature>.md`, `review_<feature>.md`, y el diff REAL del PR — `git log origin/<prTarget>..HEAD --oneline` + `git diff origin/<prTarget>...HEAD --stat`.
33
+ - **Output**: JSON exacto `{"title": "...", "body": "..."}` sin fences.
34
+
35
+ Valida: `title` ≤70 y Conventional Commit; `body` con Resumen, Cambios y Test plan. Si falla, reintenta (máx. 2).
36
+
37
+ ## Crear el PR
38
+
39
+ ```bash
40
+ gh pr create --base "$pr_target" --title "$title" --body "$body"
41
+ ```
42
+
43
+ Donde `$pr_target` es el valor de `prTarget` leído del `argos.config.json` del repo (o de su ficha) en este turno — nunca un literal fijo en el skill. Captura la URL del output y muéstrasela al usuario.
44
+
45
+ ## Oficio del PR
46
+
47
+ - **Commits atómicos**: una cosa por commit (`feat(user): add User model`, luego `test(user): ...`), nunca "add user feature" con todo adentro. Un PR de commits atómicos se revisa solo.
48
+ - **PR gigante**: si el diff supera ~400 líneas o mezcla dominios, propone partirlo en PRs lógicos (models → api → ui). Con harness activo, usa el skill `chained-pr`.
49
+ - **Trabajo en progreso**: `gh pr create --draft` — nunca un PR "normal" a medias esperando que nadie lo mergee.
50
+
51
+ ## Reglas duras
52
+
53
+ - **NUNCA `git push --force`** ni `--no-verify` sin que lo pida el usuario.
54
+ - **Siempre `--base` contra la `prTarget` resuelta del repo.** No la hardcodees ni la asumas de una sesión anterior; si el target del repo cambió, corrígelo en `argos.config.json` (por ejemplo con `argos adopt --refresh` si cambiaron los hechos del repo, o editándolo directo).
55
+ - **Cambios uncommitted ajenos al feature** → párate y pregunta, no los arrastres al PR.
56
+ - **Reviewers/labels**: no los agregues automático salvo que el usuario lo pida.
57
+
58
+ ## Antes de declarar listo
59
+
60
+ - El pre-flight pasó completo y el title/body validaron.
61
+ - El PR se creó contra la `prTarget` resuelta del repo y su URL quedó mostrada al usuario.
62
+ - Post-PR: `mem_save` de decisiones no obvias, entrada en `history.md`, `current.md` a `state: idle`, y `mem_session_summary`.
63
+
64
+ Este skill vive una sola vez en el motor global (`~/.claude/skills/`) y trabaja contra cualquier repo con `argos.config.json`: toda referencia a rama base, rama destino o quality gate se resuelve leyendo la config/ficha de ESE repo en este turno, nunca un valor fijado al escribir el skill.
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: promo-video
3
+ description: Trigger: promo video, promotional video, video promocional, marketing video, app trailer, Remotion, social video. Generate a branded promotional MP4 for an app with Remotion from its real store screenshots and design tokens.
4
+ ---
5
+
6
+ # Promo Video
7
+
8
+ ## Activation Contract
9
+
10
+ Activate when an app needs a promotional/marketing video (social, web, messaging) generated programmatically with Remotion from its real screenshots and brand system. Also the optional Phase 11 executor of `app-builder`.
11
+
12
+ ## Hard Rules
13
+
14
+ - The video project lives at `tools/promo/` OUTSIDE npm workspaces, with its own `node_modules` — Remotion's `react-dom` must never hoist next to the app's React (Expo/RN conflict). Never add it to root `workspaces`.
15
+ - The root script must force the directory context: `"promo:render": "cd tools/promo && npx remotion render Promo out/promo.mp4"` — this guarantees the render resolves `tools/promo`'s own dependencies and never the app bundler's React.
16
+ - Brand fidelity is non-negotiable: colors and fonts derive from the app's token file (e.g. `lib/theme.ts`); copy derives from store metadata (`store.config.json`) / product definition — never invent a palette or product claims.
17
+ - Screenshots come from the store screenshot set (`store/screenshots/`) — real app runs, not mockups.
18
+ - On-screen copy in the store listing's locale; code, identifiers, and comments in English.
19
+ - The output is a MARKETING asset. It is NOT an App Store "App Preview" — Apple requires real screen recordings there and `eas metadata` cannot upload video. Always state this distinction when delivering.
20
+ - Renders run in the FOREGROUND of the session that owns them — a background render dies when its (sub)agent session ends.
21
+ - Timeline math: with `TransitionSeries`, total frames = sum(scene durations) − sum(transition overlaps). Tune scene durations to land exactly on the target length.
22
+
23
+ ## Decision Gates
24
+
25
+ | Situation | Route |
26
+ |---|---|
27
+ | Store screenshots + logo exist | Screenshot-showcase format (default, `assets/promo.template.tsx`) |
28
+ | Motion clips wanted instead of stills | Record simulator via `xcrun simctl io booted recordVideo` during a Maestro flow; embed with `<OffthreadVideo>` — pipeline §7 |
29
+ | Aspect ratio | 1080×1920 vertical (default, social); other ratios only on explicit request |
30
+ | Web app or dashboard promo | Use `promo-video-web` (landscape, browser frame, Playwright captures) — extends the same `tools/promo/` project |
31
+ | Screenshots are horizontal or 4:3 (tablet set) | Never stretch to 9:16 — constrain inside a fixed mobile mockup frame or use a blurred-background fill (same capture scaled up + blur behind) |
32
+ | App Store App Preview requested | Different pipeline (Maestro + simctl + ffmpeg to Apple spec) — out of scope, say so |
33
+
34
+ ## Execution Steps
35
+
36
+ 1. Read `references/pipeline.md`. Inventory inputs: token file, transparent logo PNG, store screenshots (note their pixel aspect), store copy + locale.
37
+ 2. Scaffold `tools/promo/` from `assets/` templates; `npm install` inside it; copy logo + screenshots into `public/` (referenced via `staticFile()`).
38
+ 3. Map app tokens into `src/theme.ts`; load fonts via `@remotion/google-fonts`. Build scenes on the template: intro lockup → 3–4 feature scenes (device-framed screenshot, watermark word, staggered copy) → store outro. Skip visually boring screenshots (e.g. login).
39
+ 4. Audio bed: check for a user-provided `public/audio/bgm.mp3`; if the user explicitly asks you to source one, follow the sourcing protocol in `references/pipeline.md` §4 (license-safe library, brand-vibe search terms, source+license recorded next to the `<Audio>`; never source silently, and state you cannot listen — the pick is by genre/tags). When present, render Remotion's `<Audio src={staticFile('audio/bgm.mp3')}/>` as a SIBLING of the `TransitionSeries` with a volume fade-out over the last second, so the MP4 is social-ready without post-production.
40
+ 5. Render in the foreground: `npx remotion render Promo out/promo.mp4`. Add the root `promo:render` script (cd form — Hard Rules); gitignore `tools/promo/out/`.
41
+ 6. Verify duration/fps/size (Remotion's bundled ffprobe), spot-check 2+ frames with `npx remotion still`, deliver the MP4.
42
+
43
+ ## Output Contract
44
+
45
+ Return: MP4 absolute path with duration/fps/size, files created, root script added, frame spot-check result, and the explicit marketing-vs-App-Preview note.
46
+
47
+ ## References
48
+
49
+ - `references/pipeline.md` — full runbook: setup, brand mapping, scene direction system, timeline math, render/verify, video-clip variant, troubleshooting.
50
+ - `assets/package.template.json` — pinned Remotion deps + `studio`/`render` scripts.
51
+ - `assets/theme.template.ts` — token bridge shape (colors, google-fonts, radial backdrop).
52
+ - `assets/promo.template.tsx` — full scene architecture: TransitionSeries, device frame, watermark, springs, lockup, glow pulse.
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "APP_SLUG-promo",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "description": "Remotion promotional video for the APP_NAME app",
6
+ "scripts": {
7
+ "studio": "remotion studio",
8
+ "render": "remotion render Promo out/promo.mp4"
9
+ },
10
+ "dependencies": {
11
+ "@remotion/cli": "4.0.496",
12
+ "@remotion/google-fonts": "4.0.496",
13
+ "@remotion/transitions": "4.0.496",
14
+ "react": "^19.0.0",
15
+ "react-dom": "^19.0.0",
16
+ "remotion": "4.0.496"
17
+ },
18
+ "devDependencies": {
19
+ "@types/react": "^19.0.0",
20
+ "typescript": "^5.6.0"
21
+ }
22
+ }