@assistkick/create 1.6.0 → 1.8.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.
- package/package.json +2 -2
- package/templates/assistkick-product-system/.env.example +1 -0
- package/templates/assistkick-product-system/local.db +0 -0
- package/templates/assistkick-product-system/package.json +4 -2
- package/templates/assistkick-product-system/packages/backend/package.json +2 -0
- package/templates/assistkick-product-system/packages/backend/src/routes/agents.ts +165 -0
- package/templates/assistkick-product-system/packages/backend/src/routes/files.test.ts +358 -0
- package/templates/assistkick-product-system/packages/backend/src/routes/files.ts +356 -0
- package/templates/assistkick-product-system/packages/backend/src/routes/git.ts +96 -1
- package/templates/assistkick-product-system/packages/backend/src/routes/graph.ts +1 -0
- package/templates/assistkick-product-system/packages/backend/src/routes/kanban.ts +43 -4
- package/templates/assistkick-product-system/packages/backend/src/routes/pipeline.ts +200 -84
- package/templates/assistkick-product-system/packages/backend/src/routes/projects.ts +6 -3
- package/templates/assistkick-product-system/packages/backend/src/routes/terminal.ts +53 -17
- package/templates/assistkick-product-system/packages/backend/src/routes/video.ts +218 -0
- package/templates/assistkick-product-system/packages/backend/src/routes/workflow_groups.ts +119 -0
- package/templates/assistkick-product-system/packages/backend/src/routes/workflows.ts +154 -0
- package/templates/assistkick-product-system/packages/backend/src/server.ts +81 -9
- package/templates/assistkick-product-system/packages/backend/src/services/agent_service.test.ts +489 -0
- package/templates/assistkick-product-system/packages/backend/src/services/agent_service.ts +416 -0
- package/templates/assistkick-product-system/packages/backend/src/services/bundle_service.test.ts +189 -0
- package/templates/assistkick-product-system/packages/backend/src/services/bundle_service.ts +182 -0
- package/templates/assistkick-product-system/packages/backend/src/services/init.ts +28 -78
- package/templates/assistkick-product-system/packages/backend/src/services/project_service.test.ts +16 -0
- package/templates/assistkick-product-system/packages/backend/src/services/project_service.ts +73 -2
- package/templates/assistkick-product-system/packages/backend/src/services/project_workspace_service.test.ts +4 -4
- package/templates/assistkick-product-system/packages/backend/src/services/project_workspace_service.ts +87 -11
- package/templates/assistkick-product-system/packages/backend/src/services/pty_session_manager.test.ts +210 -69
- package/templates/assistkick-product-system/packages/backend/src/services/pty_session_manager.ts +210 -215
- package/templates/assistkick-product-system/packages/backend/src/services/ssh_key_service.test.ts +162 -0
- package/templates/assistkick-product-system/packages/backend/src/services/ssh_key_service.ts +148 -0
- package/templates/assistkick-product-system/packages/backend/src/services/terminal_ws_handler.ts +11 -5
- package/templates/assistkick-product-system/packages/backend/src/services/tts_service.test.ts +64 -0
- package/templates/assistkick-product-system/packages/backend/src/services/tts_service.ts +134 -0
- package/templates/assistkick-product-system/packages/backend/src/services/video_render_service.test.ts +256 -0
- package/templates/assistkick-product-system/packages/backend/src/services/video_render_service.ts +258 -0
- package/templates/assistkick-product-system/packages/backend/src/services/workflow_group_service.ts +106 -0
- package/templates/assistkick-product-system/packages/backend/src/services/workflow_service.test.ts +275 -0
- package/templates/assistkick-product-system/packages/backend/src/services/workflow_service.ts +222 -0
- package/templates/assistkick-product-system/packages/frontend/index.html +3 -0
- package/templates/assistkick-product-system/packages/frontend/package-lock.json +800 -11
- package/templates/assistkick-product-system/packages/frontend/package.json +11 -1
- package/templates/assistkick-product-system/packages/frontend/src/App.tsx +24 -7
- package/templates/assistkick-product-system/packages/frontend/src/api/client.ts +456 -16
- package/templates/assistkick-product-system/packages/frontend/src/api/client_files.test.ts +172 -0
- package/templates/assistkick-product-system/packages/frontend/src/api/client_video.test.ts +238 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/AgentsView.tsx +307 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/CoherenceView.tsx +82 -66
- package/templates/assistkick-product-system/packages/frontend/src/components/CompositionPlaceholder.tsx +97 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/DesignSystemView.tsx +383 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/EditorTabBar.tsx +57 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/FileTree.tsx +313 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/FileTreeContextMenu.tsx +61 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/FileTreeInlineInput.tsx +73 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/FilesView.tsx +404 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/GitRepoModal.tsx +193 -64
- package/templates/assistkick-product-system/packages/frontend/src/components/GraphLegend.tsx +71 -73
- package/templates/assistkick-product-system/packages/frontend/src/components/GraphSettings.tsx +8 -8
- package/templates/assistkick-product-system/packages/frontend/src/components/GraphView.tsx +1 -1
- package/templates/assistkick-product-system/packages/frontend/src/components/InviteUserDialog.tsx +15 -11
- package/templates/assistkick-product-system/packages/frontend/src/components/KanbanView.tsx +226 -291
- package/templates/assistkick-product-system/packages/frontend/src/components/LoginPage.tsx +14 -14
- package/templates/assistkick-product-system/packages/frontend/src/components/ProjectSelector.tsx +54 -33
- package/templates/assistkick-product-system/packages/frontend/src/components/QaIssueSheet.tsx +40 -66
- package/templates/assistkick-product-system/packages/frontend/src/components/SidePanel.tsx +55 -115
- package/templates/assistkick-product-system/packages/frontend/src/components/TerminalView.tsx +121 -52
- package/templates/assistkick-product-system/packages/frontend/src/components/Toolbar.tsx +155 -77
- package/templates/assistkick-product-system/packages/frontend/src/components/UsersView.tsx +52 -52
- package/templates/assistkick-product-system/packages/frontend/src/components/VideoGallery.tsx +313 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/VideographyView.tsx +250 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/WorkflowsView.tsx +474 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/AccentBorderList.tsx +53 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/Button.tsx +87 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/ButtonGroup.tsx +29 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/ButtonShowcase.tsx +221 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/CardGlass.tsx +141 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/CompletionRing.tsx +30 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/ContentCard.tsx +34 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/IconButton.tsx +74 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/KanbanCard.tsx +270 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/KanbanCardShowcase.tsx +37 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/Kbd.tsx +11 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/KindBadge.tsx +21 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/NavBarSidekick.tsx +207 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/SidePanelShowcase.tsx +370 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/SideSheet.tsx +64 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/ds/StatusDot.tsx +18 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/workflow/CheckCardPositionNode.tsx +36 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/workflow/CheckCycleCountNode.tsx +60 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/workflow/EndNode.tsx +42 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/workflow/GroupNode.tsx +189 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/workflow/NodePalette.tsx +123 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/workflow/RunAgentNode.tsx +51 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/workflow/SetCardMetadataNode.tsx +53 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/workflow/StartNode.tsx +18 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/workflow/TransitionCardNode.tsx +59 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/workflow/WorkflowCanvas.tsx +335 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/workflow/WorkflowMonitorModal.tsx +634 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/workflow/autoLayout.ts +103 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/workflow/edgeColors.ts +35 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/workflow/monitor_nodes.tsx +208 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/workflow/workflow_types.test.ts +119 -0
- package/templates/assistkick-product-system/packages/frontend/src/components/workflow/workflow_types.ts +107 -0
- package/templates/assistkick-product-system/packages/frontend/src/constants/graph.ts +13 -11
- package/templates/assistkick-product-system/packages/frontend/src/hooks/useAutoSave.ts +75 -0
- package/templates/assistkick-product-system/packages/frontend/src/hooks/useGraph.ts +6 -21
- package/templates/assistkick-product-system/packages/frontend/src/hooks/useProjects.ts +15 -80
- package/templates/assistkick-product-system/packages/frontend/src/hooks/useToast.tsx +16 -3
- package/templates/assistkick-product-system/packages/frontend/src/pages/accept_invitation_page.tsx +30 -27
- package/templates/assistkick-product-system/packages/frontend/src/pages/forgot_password_page.tsx +18 -15
- package/templates/assistkick-product-system/packages/frontend/src/pages/register_page.tsx +21 -18
- package/templates/assistkick-product-system/packages/frontend/src/pages/reset_password_page.tsx +28 -25
- package/templates/assistkick-product-system/packages/frontend/src/routes/AgentsRoute.tsx +6 -0
- package/templates/assistkick-product-system/packages/frontend/src/routes/CoherenceRoute.tsx +19 -0
- package/templates/assistkick-product-system/packages/frontend/src/routes/DashboardLayout.tsx +54 -0
- package/templates/assistkick-product-system/packages/frontend/src/routes/DesignSystemRoute.tsx +6 -0
- package/templates/assistkick-product-system/packages/frontend/src/routes/FilesRoute.tsx +13 -0
- package/templates/assistkick-product-system/packages/frontend/src/routes/GraphRoute.tsx +93 -0
- package/templates/assistkick-product-system/packages/frontend/src/routes/KanbanRoute.tsx +30 -0
- package/templates/assistkick-product-system/packages/frontend/src/routes/TerminalRoute.tsx +9 -0
- package/templates/assistkick-product-system/packages/frontend/src/routes/UsersRoute.tsx +6 -0
- package/templates/assistkick-product-system/packages/frontend/src/routes/VideographyRoute.tsx +13 -0
- package/templates/assistkick-product-system/packages/frontend/src/routes/WorkflowsRoute.tsx +6 -0
- package/templates/assistkick-product-system/packages/frontend/src/stores/useGitModalStore.ts +14 -0
- package/templates/assistkick-product-system/packages/frontend/src/stores/useGraphStore.ts +36 -0
- package/templates/assistkick-product-system/packages/frontend/src/stores/useGraphUIStore.ts +25 -0
- package/templates/assistkick-product-system/packages/frontend/src/stores/useProjectStore.ts +90 -0
- package/templates/assistkick-product-system/packages/frontend/src/stores/useQaSheetStore.ts +27 -0
- package/templates/assistkick-product-system/packages/frontend/src/stores/useSidePanelStore.ts +76 -0
- package/templates/assistkick-product-system/packages/frontend/src/styles/index.css +336 -3632
- package/templates/assistkick-product-system/packages/frontend/src/utils/auto_save_service.test.ts +167 -0
- package/templates/assistkick-product-system/packages/frontend/src/utils/auto_save_service.ts +101 -0
- package/templates/assistkick-product-system/packages/frontend/src/utils/composition_matcher.test.ts +42 -0
- package/templates/assistkick-product-system/packages/frontend/src/utils/composition_matcher.ts +17 -0
- package/templates/assistkick-product-system/packages/frontend/src/utils/file_utils.test.ts +145 -0
- package/templates/assistkick-product-system/packages/frontend/src/utils/file_utils.ts +42 -0
- package/templates/assistkick-product-system/packages/frontend/src/utils/task_status.test.ts +4 -10
- package/templates/assistkick-product-system/packages/frontend/src/utils/task_status.ts +19 -1
- package/templates/assistkick-product-system/packages/frontend/vite.config.ts +7 -1
- package/templates/assistkick-product-system/packages/shared/db/local.db +0 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/0004_tidy_matthew_murdock.sql +9 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/0005_mysterious_falcon.sql +692 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/0006_next_venom.sql +9 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/0007_deep_barracuda.sql +39 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/0008_puzzling_hannibal_king.sql +1 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/0009_amused_beast.sql +8 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/0010_spotty_moira_mactaggert.sql +9 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/0011_goofy_snowbird.sql +3 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/0011_supreme_doctor_octopus.sql +3 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/0013_reflective_prowler.sql +15 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0004_snapshot.json +921 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0005_snapshot.json +1042 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0006_snapshot.json +1101 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0007_snapshot.json +1336 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0008_snapshot.json +1275 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0009_snapshot.json +1327 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0010_snapshot.json +1393 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0011_snapshot.json +1436 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/meta/0013_snapshot.json +1538 -0
- package/templates/assistkick-product-system/packages/shared/db/migrations/meta/_journal.json +70 -0
- package/templates/assistkick-product-system/packages/shared/db/schema.ts +113 -0
- package/templates/assistkick-product-system/packages/shared/lib/claude-service.ts +32 -7
- package/templates/assistkick-product-system/packages/shared/lib/constants.ts +9 -0
- package/templates/assistkick-product-system/packages/shared/lib/git_workflow.ts +12 -4
- package/templates/assistkick-product-system/packages/shared/lib/graph.ts +16 -5
- package/templates/assistkick-product-system/packages/shared/lib/workflow_engine.test.ts +1753 -0
- package/templates/assistkick-product-system/packages/shared/lib/workflow_engine.ts +1281 -0
- package/templates/assistkick-product-system/packages/shared/lib/workflow_orchestrator.ts +211 -0
- package/templates/assistkick-product-system/packages/shared/tools/add_node.test.ts +43 -0
- package/templates/assistkick-product-system/packages/shared/tools/add_node.ts +13 -2
- package/templates/assistkick-product-system/packages/shared/tools/get_kanban.ts +1 -1
- package/templates/assistkick-product-system/packages/shared/tools/migrate_epics.test.ts +226 -0
- package/templates/assistkick-product-system/packages/shared/tools/migrate_epics.ts +251 -0
- package/templates/assistkick-product-system/packages/shared/tools/update_node.ts +2 -2
- package/templates/assistkick-product-system/packages/shared/utils/hello_workflow.test.ts +10 -0
- package/templates/assistkick-product-system/packages/shared/utils/hello_workflow.ts +6 -0
- package/templates/assistkick-product-system/packages/video/Root.tsx +85 -0
- package/templates/assistkick-product-system/packages/video/components/email_scene.tsx +231 -0
- package/templates/assistkick-product-system/packages/video/components/outro_scene.tsx +153 -0
- package/templates/assistkick-product-system/packages/video/components/part_divider.tsx +90 -0
- package/templates/assistkick-product-system/packages/video/components/scene.tsx +226 -0
- package/templates/assistkick-product-system/packages/video/components/theme.ts +22 -0
- package/templates/assistkick-product-system/packages/video/components/title_scene.tsx +169 -0
- package/templates/assistkick-product-system/packages/video/components/video_split_layout.tsx +84 -0
- package/templates/assistkick-product-system/packages/video/compositions/.gitkeep +0 -0
- package/templates/assistkick-product-system/packages/video/index.ts +4 -0
- package/templates/assistkick-product-system/packages/video/package.json +28 -0
- package/templates/assistkick-product-system/packages/video/remotion.config.ts +11 -0
- package/templates/assistkick-product-system/packages/video/scripts/process_script.test.ts +326 -0
- package/templates/assistkick-product-system/packages/video/scripts/process_script.ts +630 -0
- package/templates/assistkick-product-system/packages/video/style.css +1 -0
- package/templates/assistkick-product-system/packages/video/tsconfig.json +18 -0
- package/templates/assistkick-product-system/tests/graph_legend.test.ts +2 -1
- package/templates/assistkick-product-system/tests/video_render_service.test.ts +179 -0
- package/templates/assistkick-product-system/tests/web_terminal.test.ts +219 -455
- package/templates/assistkick-product-system/tests/workflow_integration.test.ts +341 -0
- package/templates/skills/assistkick-bootstrap/SKILL.md +3 -3
- package/templates/skills/assistkick-code-reviewer/SKILL.md +2 -2
- package/templates/skills/assistkick-debugger/SKILL.md +2 -2
- package/templates/skills/assistkick-developer/SKILL.md +6 -3
- package/templates/skills/assistkick-developer/references/react_development_guidelines.md +225 -0
- package/templates/skills/assistkick-interview/SKILL.md +2 -2
- package/templates/skills/product-system/graph.json +1890 -0
- package/templates/skills/product-system/kanban.json +304 -0
- package/templates/skills/product-system/nodes/comp_001.md +56 -0
- package/templates/skills/product-system/nodes/comp_002.md +57 -0
- package/templates/skills/product-system/nodes/data_001.md +51 -0
- package/templates/skills/product-system/nodes/data_002.md +40 -0
- package/templates/skills/product-system/nodes/data_004.md +38 -0
- package/templates/skills/product-system/nodes/dec_001.md +34 -0
- package/templates/skills/product-system/nodes/dec_016.md +32 -0
- package/templates/skills/product-system/nodes/feat_008.md +30 -0
- package/templates/skills/video-composition-agent/SKILL.md +232 -0
- package/templates/skills/video-script-writer/SKILL.md +136 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: video-composition-agent
|
|
3
|
+
description: AI agent that reads a video script markdown and generates Remotion composition code with React components, scene definitions, transitions, and Root.tsx registration.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Video Composition Agent
|
|
7
|
+
|
|
8
|
+
## Your Role
|
|
9
|
+
You are a Remotion composition developer. Given a video script markdown file,
|
|
10
|
+
you generate the full Remotion composition code: React components for each scene,
|
|
11
|
+
a SCENE_IDS array, FALLBACK_DURATIONS map, TransitionSeries layout with transitions,
|
|
12
|
+
and custom scene components as needed. You write into the git worktree and register
|
|
13
|
+
the composition in Root.tsx.
|
|
14
|
+
|
|
15
|
+
## Input
|
|
16
|
+
You receive:
|
|
17
|
+
1. A **script markdown file** at `packages/video/scripts/{{compositionName}}-script.md`
|
|
18
|
+
within the worktree at `{{worktreePath}}`.
|
|
19
|
+
2. The **composition name** (kebab-case): `{{compositionName}}`
|
|
20
|
+
3. Access to **existing shared components** in `packages/video/components/`.
|
|
21
|
+
|
|
22
|
+
## Output
|
|
23
|
+
You produce:
|
|
24
|
+
1. A composition file at `packages/video/compositions/{{compositionName}}/index.tsx`
|
|
25
|
+
2. Any custom scene components needed in `packages/video/components/`
|
|
26
|
+
3. An updated `packages/video/Root.tsx` that imports and registers the new composition
|
|
27
|
+
|
|
28
|
+
## Remotion Best Practices
|
|
29
|
+
|
|
30
|
+
### Frame Rate and Duration
|
|
31
|
+
- Default fps is 30. All duration calculations use frames (seconds * 30).
|
|
32
|
+
- Use `FALLBACK_DURATIONS` as default frame counts per scene. At runtime,
|
|
33
|
+
`durations.json` (generated by the TTS pipeline) overrides these with actual
|
|
34
|
+
audio lengths.
|
|
35
|
+
- Keep fallback durations generous — slightly longer is better than cutting off.
|
|
36
|
+
|
|
37
|
+
### Component Architecture
|
|
38
|
+
- Use `AbsoluteFill` as the root container for scenes.
|
|
39
|
+
- Use `useCurrentFrame()` and `useVideoConfig()` for animation timing.
|
|
40
|
+
- Use `spring()` for entrance animations, `interpolate()` for linear progressions.
|
|
41
|
+
- Use `<OffthreadVideo>` (from `remotion`) for video embeds — never `<video>`.
|
|
42
|
+
- Use `<Audio>` (from `remotion`) for narration audio tracks.
|
|
43
|
+
- Use `<TransitionSeries>` with `<TransitionSeries.Sequence>` and
|
|
44
|
+
`<TransitionSeries.Transition>` for scene flow with transitions.
|
|
45
|
+
|
|
46
|
+
### Transitions
|
|
47
|
+
- Import transitions from `@remotion/transitions/presentations`:
|
|
48
|
+
`fade`, `slide`, `wipe`, `clockWipe`, `flip`.
|
|
49
|
+
- Apply timing with `springTiming` from `@remotion/transitions`.
|
|
50
|
+
- Use `fade()` as the default transition between scenes.
|
|
51
|
+
- Match transitions to the script's Visual descriptions when they mention
|
|
52
|
+
specific transition styles (e.g., "Slide in from right" → `slide()`).
|
|
53
|
+
|
|
54
|
+
### Audio Integration
|
|
55
|
+
- Narration audio files are referenced by their directive ID:
|
|
56
|
+
`{mediaBasePath}/{narrationId}.mp3`
|
|
57
|
+
- The composition receives `mediaBasePath` via `inputProps` at render time.
|
|
58
|
+
- In the composition, define audio sources using the narration IDs from the script.
|
|
59
|
+
- Wrap audio in `<Audio>` components positioned within the corresponding
|
|
60
|
+
`<TransitionSeries.Sequence>`.
|
|
61
|
+
|
|
62
|
+
### Video Integration
|
|
63
|
+
- Screencapture video files are referenced by their directive ID:
|
|
64
|
+
`{mediaBasePath}/{screencaptureId}.mp4`
|
|
65
|
+
- Use `<OffthreadVideo>` inside scenes that include screen recordings.
|
|
66
|
+
- Position videos using `VideoSplitLayout` or full-screen depending on the
|
|
67
|
+
script's Visual description.
|
|
68
|
+
|
|
69
|
+
## Script Format Reference
|
|
70
|
+
|
|
71
|
+
Scripts use `:::` fenced directives for media markers:
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
:::narration scene-1-intro
|
|
75
|
+
Narration text here.
|
|
76
|
+
:::
|
|
77
|
+
|
|
78
|
+
:::screencapture scene-1-demo
|
|
79
|
+
Recording instructions here.
|
|
80
|
+
:::
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Each `## Scene N: Title` section contains:
|
|
84
|
+
- A **Visual** paragraph describing the on-screen layout and animations
|
|
85
|
+
- One or more `:::narration` directives with spoken text
|
|
86
|
+
- Optional `:::screencapture` directives with recording instructions
|
|
87
|
+
|
|
88
|
+
## Shared Components Library
|
|
89
|
+
|
|
90
|
+
Before creating new components, check what already exists in `packages/video/components/`.
|
|
91
|
+
Import and reuse these instead of duplicating:
|
|
92
|
+
|
|
93
|
+
### Available Components
|
|
94
|
+
- **`theme.ts`** — `colors` (primary, secondary, accentPrimary, accentSecondary, baseDark)
|
|
95
|
+
and `fonts` (sans, mono). Always use these for consistent styling.
|
|
96
|
+
- **`TitleScene`** — Opening title card with brand name, title, accent title, subtitle,
|
|
97
|
+
decorative line, and background gradients. Props: `brandName?`, `title`, `subtitle?`, `titleAccent?`.
|
|
98
|
+
- **`Scene`** — Main content scene with step badge, title, bullets, optional video.
|
|
99
|
+
Props: `stepNumber`, `title`, `bullets`, `route?`, `part`, `highlight?`, `video?`, `partLabel?`.
|
|
100
|
+
- **`PartDivider`** — Section break between parts. Props: `partNumber`, `title`, `color`.
|
|
101
|
+
- **`EmailScene`** — Email card display with progressive line reveals.
|
|
102
|
+
Props: `stepNumber?`, `partLabel?`, `title?`, `senderName?`, `subject?`, `emailLines?`.
|
|
103
|
+
- **`OutroScene`** — Closing scene with checkmark, title, subtitle, optional CTA.
|
|
104
|
+
Props: `title?`, `subtitle?`, `callToAction?`.
|
|
105
|
+
- **`VideoSplitLayout`** — 60/40 split layout for video + content side by side.
|
|
106
|
+
Props: `video?`, `backgroundColor`, `accentColor`, `children` (render prop receiving `hasVideo`).
|
|
107
|
+
|
|
108
|
+
### When to Create New Components
|
|
109
|
+
Only create a new component when:
|
|
110
|
+
- The script describes a scene type not covered by existing components
|
|
111
|
+
- The visual layout is fundamentally different from any shared component
|
|
112
|
+
- The component would be reusable across multiple compositions
|
|
113
|
+
|
|
114
|
+
Place new components in `packages/video/components/` with snake_case filenames.
|
|
115
|
+
Follow the same patterns: `/** @jsxImportSource react */`, import from remotion,
|
|
116
|
+
use `theme.ts` colors and fonts, use spring/interpolate for animations.
|
|
117
|
+
|
|
118
|
+
## Composition File Structure
|
|
119
|
+
|
|
120
|
+
Each composition is a single `index.tsx` file in `packages/video/compositions/{compositionName}/`:
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
/** @jsxImportSource react */
|
|
124
|
+
import { AbsoluteFill, Audio, OffthreadVideo, useCurrentFrame, useVideoConfig } from "remotion";
|
|
125
|
+
import { TransitionSeries } from "@remotion/transitions";
|
|
126
|
+
import { fade } from "@remotion/transitions/presentations/fade";
|
|
127
|
+
import { springTiming } from "@remotion/transitions";
|
|
128
|
+
import { TitleScene } from "../../components/title_scene";
|
|
129
|
+
import { Scene } from "../../components/scene";
|
|
130
|
+
import { OutroScene } from "../../components/outro_scene";
|
|
131
|
+
import { colors } from "../../components/theme";
|
|
132
|
+
|
|
133
|
+
// ── Scene IDs ─────────────────────────────────────────────────────────────
|
|
134
|
+
// Ordered list of scene identifiers matching the script sections.
|
|
135
|
+
export const SCENE_IDS = [
|
|
136
|
+
"title",
|
|
137
|
+
"scene-1-overview",
|
|
138
|
+
"scene-2-demo",
|
|
139
|
+
"outro",
|
|
140
|
+
] as const;
|
|
141
|
+
|
|
142
|
+
// ── Fallback Durations ────────────────────────────────────────────────────
|
|
143
|
+
// Default frame counts per scene (at 30 fps). Overridden at render time
|
|
144
|
+
// by durations.json from the TTS pipeline.
|
|
145
|
+
export const FALLBACK_DURATIONS: Record<string, number> = {
|
|
146
|
+
"title": 120, // 4s
|
|
147
|
+
"scene-1-overview": 180, // 6s
|
|
148
|
+
"scene-2-demo": 240, // 8s
|
|
149
|
+
"outro": 120, // 4s
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
// ── Props ─────────────────────────────────────────────────────────────────
|
|
153
|
+
type CompositionProps = {
|
|
154
|
+
durations?: Record<string, number>;
|
|
155
|
+
mediaBasePath?: string;
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
// ── Main Composition ──────────────────────────────────────────────────────
|
|
159
|
+
const MyComposition: React.FC<CompositionProps> = ({
|
|
160
|
+
durations = FALLBACK_DURATIONS,
|
|
161
|
+
mediaBasePath = "",
|
|
162
|
+
}) => {
|
|
163
|
+
const getDuration = (id: string) => durations[id] ?? FALLBACK_DURATIONS[id] ?? 150;
|
|
164
|
+
const audioSrc = (id: string) => mediaBasePath ? `${mediaBasePath}/${id}.mp3` : "";
|
|
165
|
+
const videoSrc = (id: string) => mediaBasePath ? `${mediaBasePath}/${id}.mp4` : "";
|
|
166
|
+
|
|
167
|
+
return (
|
|
168
|
+
<TransitionSeries>
|
|
169
|
+
<TransitionSeries.Sequence durationInFrames={getDuration("title")}>
|
|
170
|
+
<TitleScene title="My Video" subtitle="A walkthrough" />
|
|
171
|
+
{audioSrc("scene-1-intro") && <Audio src={audioSrc("scene-1-intro")} />}
|
|
172
|
+
</TransitionSeries.Sequence>
|
|
173
|
+
|
|
174
|
+
<TransitionSeries.Transition
|
|
175
|
+
presentation={fade()}
|
|
176
|
+
timing={springTiming({ config: { damping: 200 } })}
|
|
177
|
+
/>
|
|
178
|
+
|
|
179
|
+
{/* ... more scenes ... */}
|
|
180
|
+
|
|
181
|
+
<TransitionSeries.Sequence durationInFrames={getDuration("outro")}>
|
|
182
|
+
<OutroScene title="Thanks!" subtitle="See you next time" />
|
|
183
|
+
</TransitionSeries.Sequence>
|
|
184
|
+
</TransitionSeries>
|
|
185
|
+
);
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
// ── Composition Export ────────────────────────────────────────────────────
|
|
189
|
+
// Total duration sums all scene fallback durations.
|
|
190
|
+
const totalDuration = Object.values(FALLBACK_DURATIONS).reduce((a, b) => a + b, 0);
|
|
191
|
+
|
|
192
|
+
export const id = "my-composition";
|
|
193
|
+
export const component = MyComposition;
|
|
194
|
+
export const durationInFrames = totalDuration;
|
|
195
|
+
export const fps = 30;
|
|
196
|
+
export const width = 1920;
|
|
197
|
+
export const height = 1080;
|
|
198
|
+
export const defaultProps: CompositionProps = {};
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Root.tsx Registration
|
|
202
|
+
|
|
203
|
+
After creating the composition, update `packages/video/Root.tsx`:
|
|
204
|
+
|
|
205
|
+
1. Add an import for the new composition module:
|
|
206
|
+
```tsx
|
|
207
|
+
import * as MyComposition from "./compositions/my-composition/index";
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
2. Add it to the `compositions` array:
|
|
211
|
+
```tsx
|
|
212
|
+
const compositions: CompositionEntry[] = [MyComposition];
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
If compositions already exist in the array, append to the existing list.
|
|
216
|
+
|
|
217
|
+
## Instructions
|
|
218
|
+
|
|
219
|
+
1. Read the script file at `packages/video/scripts/{{compositionName}}-script.md`
|
|
220
|
+
2. Parse all scenes: extract scene titles, Visual descriptions, narration IDs, screencapture IDs
|
|
221
|
+
3. List all existing components in `packages/video/components/` — identify which can be reused
|
|
222
|
+
4. For each scene, decide:
|
|
223
|
+
- Can an existing component handle this? → import and use it
|
|
224
|
+
- Is a new component needed? → create it in `packages/video/components/`
|
|
225
|
+
5. Write the composition `index.tsx` with:
|
|
226
|
+
- SCENE_IDS array matching the script's scene structure
|
|
227
|
+
- FALLBACK_DURATIONS with reasonable frame counts based on narration length
|
|
228
|
+
- TransitionSeries layout with appropriate transitions between scenes
|
|
229
|
+
- Audio components for each narration directive
|
|
230
|
+
- OffthreadVideo components for each screencapture directive
|
|
231
|
+
6. Register the composition in Root.tsx
|
|
232
|
+
7. Ensure all imports resolve correctly (relative paths from composition to components)
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: video-script-writer
|
|
3
|
+
description: AI agent that writes video script markdown files from a user's video brief/description using fenced directive format.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Video Script Writer Agent
|
|
7
|
+
|
|
8
|
+
## Your Role
|
|
9
|
+
You are a video script writer. Given a video brief/description, you write a complete
|
|
10
|
+
script markdown file that will be used to produce a video with Remotion.
|
|
11
|
+
Your script follows the video-script-authoring conventions and uses fenced directive
|
|
12
|
+
markers for narration and screencapture segments.
|
|
13
|
+
|
|
14
|
+
## Input
|
|
15
|
+
You receive a **feature description** that describes the video to be produced.
|
|
16
|
+
This is the user's brief — it explains what the video should cover, the tone,
|
|
17
|
+
the target audience, and any specific scenes or topics to include.
|
|
18
|
+
|
|
19
|
+
## Output
|
|
20
|
+
You write a single markdown file at the path:
|
|
21
|
+
```
|
|
22
|
+
packages/video/scripts/{{compositionName}}-script.md
|
|
23
|
+
```
|
|
24
|
+
within the git worktree at `{{worktreePath}}`.
|
|
25
|
+
|
|
26
|
+
The file must be a complete video script following the conventions below.
|
|
27
|
+
|
|
28
|
+
## Video Script Authoring Conventions
|
|
29
|
+
|
|
30
|
+
### Document Structure
|
|
31
|
+
A script is a markdown file with:
|
|
32
|
+
1. A top-level `# Title` heading for the video
|
|
33
|
+
2. A brief intro paragraph describing the video's purpose and audience
|
|
34
|
+
3. Multiple `## Scene N: Scene Title` sections, each containing:
|
|
35
|
+
- A **Visual** paragraph describing what the viewer sees on screen
|
|
36
|
+
- One or more `:::narration` directives with the spoken text
|
|
37
|
+
- Optional `:::screencapture` directives with recording instructions
|
|
38
|
+
|
|
39
|
+
### Fenced Directive Format
|
|
40
|
+
Media markers use `:::` fenced directives — **not** XML tags.
|
|
41
|
+
|
|
42
|
+
**Narration directive** — spoken text for TTS generation:
|
|
43
|
+
```
|
|
44
|
+
:::narration scene-1-intro
|
|
45
|
+
Welcome to our product walkthrough. In this video, we'll explore the key features
|
|
46
|
+
that make our platform powerful and easy to use.
|
|
47
|
+
:::
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Screencapture directive** — recording instructions for screen captures:
|
|
51
|
+
```
|
|
52
|
+
:::screencapture scene-1-demo
|
|
53
|
+
Record the dashboard view at 1920x1080. Navigate from the home page to the
|
|
54
|
+
analytics tab, hover over the main chart, then click the "Export" button.
|
|
55
|
+
:::
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Directive Rules
|
|
59
|
+
- IDs must be unique, descriptive, and kebab-case (e.g., `scene-2-feature-overview`)
|
|
60
|
+
- Narration text is plain prose — no markdown formatting inside directives
|
|
61
|
+
- Screencapture descriptions are instructions for a human or automation to follow
|
|
62
|
+
- Each scene should have at least one narration directive
|
|
63
|
+
- Place directives after the Visual description paragraph in each scene
|
|
64
|
+
- Keep narration segments to 2-4 sentences for natural pacing
|
|
65
|
+
|
|
66
|
+
### Example Script
|
|
67
|
+
```markdown
|
|
68
|
+
# Product Feature Walkthrough
|
|
69
|
+
|
|
70
|
+
A 3-minute walkthrough video for new users demonstrating the core features
|
|
71
|
+
of the platform.
|
|
72
|
+
|
|
73
|
+
## Scene 1: Introduction
|
|
74
|
+
|
|
75
|
+
**Visual:** Title card with the product logo centered on a gradient background.
|
|
76
|
+
Fade in the tagline below the logo.
|
|
77
|
+
|
|
78
|
+
:::narration scene-1-intro
|
|
79
|
+
Welcome to our product walkthrough. Today we'll explore the features that help
|
|
80
|
+
teams collaborate more effectively.
|
|
81
|
+
:::
|
|
82
|
+
|
|
83
|
+
## Scene 2: Dashboard Overview
|
|
84
|
+
|
|
85
|
+
**Visual:** Screen recording of the main dashboard. Highlight the navigation
|
|
86
|
+
sidebar and the activity feed.
|
|
87
|
+
|
|
88
|
+
:::screencapture scene-2-dashboard
|
|
89
|
+
Record the dashboard at 1920x1080. Log in as demo user, wait for the dashboard
|
|
90
|
+
to load completely, then slowly scroll through the activity feed.
|
|
91
|
+
:::
|
|
92
|
+
|
|
93
|
+
:::narration scene-2-overview
|
|
94
|
+
The dashboard gives you a real-time view of your team's activity. On the left
|
|
95
|
+
you'll find the navigation sidebar, and the main area shows your activity feed.
|
|
96
|
+
:::
|
|
97
|
+
|
|
98
|
+
## Scene 3: Conclusion
|
|
99
|
+
|
|
100
|
+
**Visual:** Outro card with call-to-action and website URL.
|
|
101
|
+
|
|
102
|
+
:::narration scene-3-outro
|
|
103
|
+
That's a quick tour of our platform. Sign up today to start collaborating
|
|
104
|
+
with your team.
|
|
105
|
+
:::
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Remotion Best Practices Context
|
|
109
|
+
|
|
110
|
+
The scripts you write will be consumed by a downstream Remotion composition agent
|
|
111
|
+
that converts them into React component code. Keep these constraints in mind:
|
|
112
|
+
|
|
113
|
+
- **Scene pacing**: Each narration segment maps to a timed scene. Keep segments
|
|
114
|
+
focused and concise so the composition agent can assign appropriate frame durations.
|
|
115
|
+
- **Visual descriptions matter**: The composition agent reads your Visual paragraphs
|
|
116
|
+
to decide which React components and layouts to use. Be specific about layout,
|
|
117
|
+
animations, and visual elements.
|
|
118
|
+
- **Screencapture placement**: Screencapture videos are placed as `<OffthreadVideo>`
|
|
119
|
+
elements in Remotion. Reference them in the Visual paragraph so the composition
|
|
120
|
+
agent knows where to position them.
|
|
121
|
+
- **Consistent IDs**: The narration and screencapture IDs are used as file stems
|
|
122
|
+
for audio/video assets (e.g., `scene-1-intro.mp3`, `scene-2-dashboard.mp4`).
|
|
123
|
+
Make them descriptive and unique.
|
|
124
|
+
- **Transitions**: Mention desired transitions between scenes in the Visual paragraph
|
|
125
|
+
(e.g., "Fade in from black", "Slide in from right") so the composition agent
|
|
126
|
+
can apply Remotion transition effects.
|
|
127
|
+
- **30 fps default**: Remotion compositions default to 30 fps. A 3-second narration
|
|
128
|
+
= 90 frames. Structure scenes so narrations align with visual changes.
|
|
129
|
+
|
|
130
|
+
## Instructions
|
|
131
|
+
1. Read the feature description carefully
|
|
132
|
+
2. Plan the video structure: how many scenes, what content in each
|
|
133
|
+
3. Write the full script markdown file to `packages/video/scripts/{{compositionName}}-script.md`
|
|
134
|
+
4. Ensure every scene has a Visual paragraph and at least one narration directive
|
|
135
|
+
5. Use unique, descriptive IDs for all directives
|
|
136
|
+
6. Keep the total narration length appropriate for the described video duration
|