@warpgogol/forge 1.1.0 → 1.2.2
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/AGENTS.md +7 -19
- package/README.md +64 -50
- package/README.uk.md +64 -50
- package/package.json +16 -3
- package/profiles/astro-typescript-turborepo.yaml +1 -1
- package/profiles/godot-csharp.yaml +1 -1
- package/profiles/phaser-turborepo.yaml +1 -1
- package/skills/fo/fo-spec-ingest/SKILL.md +1 -1
- package/profiles/editframe-templates/composition-agents.md +0 -69
- package/profiles/editframe-templates/composition.tsx +0 -81
- package/profiles/editframe-templates/html-composition-agents.md +0 -62
- package/profiles/editframe.yaml +0 -729
- package/profiles/obsidian-vault.yaml +0 -103
- package/skills/fo/ef-brand-video-generator/SKILL.md +0 -92
- package/skills/fo/ef-composition/SKILL.md +0 -156
- package/skills/fo/ef-composition-review/SKILL.md +0 -68
- package/skills/fo/ef-dev-server/SKILL.md +0 -107
- package/skills/fo/ef-editor-gui/SKILL.md +0 -131
- package/skills/fo/ef-motion-design/SKILL.md +0 -118
- package/skills/fo/ef-onboard/SKILL.md +0 -77
- package/skills/fo/ef-render-verify/SKILL.md +0 -56
- package/skills/fo/ef-webhooks/SKILL.md +0 -95
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ef-motion-design
|
|
3
|
-
description: "Apply motion design patterns to Editframe compositions — transitions, animations, easing, kinetic typography. Use when the operator asks to add motion design or animation patterns."
|
|
4
|
-
invocation: user
|
|
5
|
-
category: fo
|
|
6
|
-
concerns: read-only
|
|
7
|
-
dependsOn: []
|
|
8
|
-
languagePolicy: ref(PREFERENCES.md)
|
|
9
|
-
triggers:
|
|
10
|
-
- "add motion design"
|
|
11
|
-
- "animate text"
|
|
12
|
-
- "kinetic typography"
|
|
13
|
-
- "transition between scenes"
|
|
14
|
-
source: domain-knowledge
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
<!-- skill-lint-disable SKILL-17 -->
|
|
18
|
-
|
|
19
|
-
Before starting, read `PREFERENCES.md` at the repository root. If the file is missing or `aiLanguage` is unset, ask the operator once and create the file using the `my-preferences` skill semantics.
|
|
20
|
-
|
|
21
|
-
# Motion Design
|
|
22
|
-
|
|
23
|
-
Motion design patterns for Editframe compositions: transitions, animations, easing, and kinetic typography. These patterns enhance video compositions with professional motion graphics.
|
|
24
|
-
|
|
25
|
-
## Transitions
|
|
26
|
-
|
|
27
|
-
Use `ef-transition` or the `transition` prop to declare CSS-like transitions between scenes:
|
|
28
|
-
|
|
29
|
-
```tsx
|
|
30
|
-
<Timegroup mode="sequence">
|
|
31
|
-
<Video src="assets/scene1.mp4" duration="5s" transition="fade" />
|
|
32
|
-
<Video src="assets/scene2.mp4" duration="5s" transition="slide-left" />
|
|
33
|
-
</Timegroup>
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
### Transition types
|
|
37
|
-
|
|
38
|
-
- **`fade`** — cross-fade between elements
|
|
39
|
-
- **`slide-left`** / **`slide-right`** — slide in from left/right
|
|
40
|
-
- **`slide-up`** / **`slide-down`** — slide in from top/bottom
|
|
41
|
-
- **`zoom-in`** / **`zoom-out`** — scale transition
|
|
42
|
-
- **`wipe`** — directional wipe
|
|
43
|
-
|
|
44
|
-
## Kinetic typography
|
|
45
|
-
|
|
46
|
-
Animate text with `ef-text` or the `Text` component using timing and positioning:
|
|
47
|
-
|
|
48
|
-
```tsx
|
|
49
|
-
<Timegroup mode="sequence">
|
|
50
|
-
<Text text="First" x="50%" y="50%" fontSize="72px" duration="1s" />
|
|
51
|
-
<Text text="Second" x="50%" y="50%" fontSize="72px" duration="1s" />
|
|
52
|
-
<Text text="Third" x="50%" y="50%" fontSize="72px" duration="1s" />
|
|
53
|
-
</Timegroup>
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### Text animation patterns
|
|
57
|
-
|
|
58
|
-
- **Sequential reveal** — words appear one after another in a `mode="sequence"` Timegroup
|
|
59
|
-
- **Position animation** — animate `x`/`y` props across time
|
|
60
|
-
- **Scale animation** — animate `fontSize` across time
|
|
61
|
-
- **Color transitions** — animate `color` across time
|
|
62
|
-
|
|
63
|
-
## Easing
|
|
64
|
-
|
|
65
|
-
Editframe supports CSS easing functions for transitions and animations:
|
|
66
|
-
|
|
67
|
-
- `ease` (default)
|
|
68
|
-
- `ease-in`
|
|
69
|
-
- `ease-out`
|
|
70
|
-
- `ease-in-out`
|
|
71
|
-
- `linear`
|
|
72
|
-
- `cubic-bezier(x1, y1, x2, y2)` — custom bezier curve
|
|
73
|
-
|
|
74
|
-
## Pan and zoom
|
|
75
|
-
|
|
76
|
-
Use `ef-pan-zoom` or the `PanZoom` component for Ken Burns-style effects:
|
|
77
|
-
|
|
78
|
-
```tsx
|
|
79
|
-
<PanZoom
|
|
80
|
-
src="assets/photo.jpg"
|
|
81
|
-
duration="5s"
|
|
82
|
-
startX="0%"
|
|
83
|
-
startY="0%"
|
|
84
|
-
endX="100%"
|
|
85
|
-
endY="100%"
|
|
86
|
-
startScale="1"
|
|
87
|
-
endScale="1.5"
|
|
88
|
-
/>
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
## Motion blur
|
|
92
|
-
|
|
93
|
-
Apply motion blur to moving elements with `ef-motionblur` or the `MotionBlur` component:
|
|
94
|
-
|
|
95
|
-
```tsx
|
|
96
|
-
<MotionBlur intensity="0.5">
|
|
97
|
-
<Video src="assets/fast-pan.mp4" duration="3s" />
|
|
98
|
-
</MotionBlur>
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
## CSS variables for time-based animation
|
|
102
|
-
|
|
103
|
-
Editframe compositions support CSS custom properties for time-based values, enabling complex animation sequences without JavaScript:
|
|
104
|
-
|
|
105
|
-
```css
|
|
106
|
-
:root {
|
|
107
|
-
--scene-duration: 5s;
|
|
108
|
-
--transition-duration: 0.5s;
|
|
109
|
-
}
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
## Best practices
|
|
113
|
-
|
|
114
|
-
- Keep transitions consistent within a composition — use 1-2 transition types
|
|
115
|
-
- Match transition duration to content pacing (fast cuts for energy, slow for drama)
|
|
116
|
-
- Use kinetic typography sparingly — it draws attention
|
|
117
|
-
- Preview with `ref(forge.yaml bindings.commands.devServer)` before rendering
|
|
118
|
-
- Run `ref(forge.yaml bindings.commands.validate)` to check composition structure
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ef-onboard
|
|
3
|
-
description: Onboard a new Editframe video project — check prerequisites, discover requirements, scaffold, and start preview. Use when the operator asks to create a new video project.
|
|
4
|
-
invocation: user
|
|
5
|
-
category: fo
|
|
6
|
-
concerns: content-mutation
|
|
7
|
-
dependsOn: []
|
|
8
|
-
languagePolicy: ref(PREFERENCES.md)
|
|
9
|
-
triggers:
|
|
10
|
-
- "create a new editframe project"
|
|
11
|
-
- "start a new video project"
|
|
12
|
-
- "build a video with editframe"
|
|
13
|
-
- "create a video composition"
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
<!-- skill-lint-disable SKILL-17 -->
|
|
17
|
-
|
|
18
|
-
# ef-onboard
|
|
19
|
-
|
|
20
|
-
Before starting, read `PREFERENCES.md` at the repository root. If the file is missing or `aiLanguage` is unset, ask the operator once and create the file using the `my-preferences` skill semantics.
|
|
21
|
-
|
|
22
|
-
Guide the operator through creating a new Editframe video project within a Forge-managed workspace. The skill covers prerequisites check, discovery, scaffold, domain knowledge reading, and build + preview.
|
|
23
|
-
|
|
24
|
-
## Process
|
|
25
|
-
|
|
26
|
-
### 1. Prerequisites check
|
|
27
|
-
|
|
28
|
-
- **Node.js 24+**: Run `node --version`. If missing or below 24, direct the operator to `https://nodejs.org/en/download/` or install via the system package manager.
|
|
29
|
-
- **FFmpeg**: Run `ffmpeg -version`. If missing, direct the operator to `https://ffmpeg.org/download.html` or install via the system package manager (`apt install ffmpeg`, `brew install ffmpeg`).
|
|
30
|
-
- If either prerequisite is missing and cannot be installed automatically, stop and ask the operator to install it manually.
|
|
31
|
-
|
|
32
|
-
### 2. Discovery
|
|
33
|
-
|
|
34
|
-
Ask the operator:
|
|
35
|
-
|
|
36
|
-
1. **Project type**:
|
|
37
|
-
- Single video (product demo, social media video, personal project)
|
|
38
|
-
- Video template (reusable with different assets — birthday card, wedding announcement)
|
|
39
|
-
- Video editing tool (custom editor built with Editframe as the engine)
|
|
40
|
-
- Video workflow automation (script that generates videos from triggers)
|
|
41
|
-
- Something else (ask them to describe it)
|
|
42
|
-
|
|
43
|
-
2. **Existing assets**:
|
|
44
|
-
- Video clips, images, or audio files (file paths or URLs)
|
|
45
|
-
- Website URLs to use as content source — if provided, download and cache all relevant assets locally before building
|
|
46
|
-
- No existing assets — start from scratch
|
|
47
|
-
|
|
48
|
-
3. **Node.js/React libraries**: Ask if the operator has any libraries in mind (e.g. AnimeJS for animations, Tailwind for styling).
|
|
49
|
-
|
|
50
|
-
Prioritize getting all answers before starting to build. This minimizes wait time for the operator.
|
|
51
|
-
|
|
52
|
-
### 3. Scaffold
|
|
53
|
-
|
|
54
|
-
Run `forge create --name <project-name> --profile editframe` to scaffold the project with Forge governance (invariants, AGENTS.md templates, forge skills). The `editframe` profile scaffolds a React + TypeScript + Vite project with `@editframe/react` pre-configured.
|
|
55
|
-
|
|
56
|
-
If `forge create` fails (missing profile, network error, permission issue), report the error to the operator and stop. Do not proceed to subsequent steps without a scaffolded project.
|
|
57
|
-
|
|
58
|
-
### 4. Read domain knowledge
|
|
59
|
-
|
|
60
|
-
Before building, the agent MUST read the vendored Editframe domain skills. These are bundled with `@warpgogol/forge` and available in `.agents/skills/`:
|
|
61
|
-
|
|
62
|
-
- **ef-composition** — time model, media elements, rendering pipeline
|
|
63
|
-
- **ef-dev-server** — Vite plugin setup, local asset serving
|
|
64
|
-
- **ef-editor-gui** — editor toolkit for visual composition editing
|
|
65
|
-
- **ef-webhooks** — webhook notifications for render completion
|
|
66
|
-
- **ef-brand-video-generator** — brand video generation templates
|
|
67
|
-
- **ef-motion-design** — motion design patterns, transitions, kinetic typography
|
|
68
|
-
|
|
69
|
-
The agent should also read **ef-composition-review** and **ef-render-verify** for quality assurance workflows.
|
|
70
|
-
|
|
71
|
-
### 5. Build and preview
|
|
72
|
-
|
|
73
|
-
1. Build the initial composition based on the operator's answers from Step 2. Use the discovery answers (project type, assets, libraries) to determine composition structure, asset placement, and optional dependencies.
|
|
74
|
-
2. Run `forge dev` to start the preview server (delegates to `editframe preview` per the `editframe` profile's `devServer.command`).
|
|
75
|
-
3. Report the localhost URL to the operator.
|
|
76
|
-
4. Run `forge doctor` to check all profile invariants on the initial composition. For the `editframe` profile, this covers VIDEO-01 through VIDEO-09.
|
|
77
|
-
5. Report any invariant violations and suggest fixes.
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ef-render-verify
|
|
3
|
-
description: Verify an Editframe render — validate, build, check determinism, inspect output
|
|
4
|
-
invocation: user
|
|
5
|
-
category: fo
|
|
6
|
-
concerns: read-only
|
|
7
|
-
dependsOn: []
|
|
8
|
-
languagePolicy: ref(PREFERENCES.md)
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
<!-- skill-lint-disable SKILL-17 -->
|
|
12
|
-
|
|
13
|
-
# ef-render-verify
|
|
14
|
-
|
|
15
|
-
Before starting, read `PREFERENCES.md` at the repository root. If the file is missing or `aiLanguage` is unset, ask the operator once and create the file using the `my-preferences` skill semantics.
|
|
16
|
-
|
|
17
|
-
A read-only verification of an Editframe render pipeline. The skill runs validation, build, determinism check, and output inspection, then reports pass/fail for each step. It does **not** modify any file.
|
|
18
|
-
|
|
19
|
-
## Scope
|
|
20
|
-
|
|
21
|
-
This skill verifies render output for `.tsx` composition files using the `editframe` stack profile. It uses `forge validate`, `forge build`, and `forge determinism check` — all profile-driven commands.
|
|
22
|
-
|
|
23
|
-
## Process
|
|
24
|
-
|
|
25
|
-
### 1. Pre-render validation
|
|
26
|
-
|
|
27
|
-
Run `forge validate` to check the composition with the profile's validate command (typically `editframe check`). Review the output for any validation errors. If validation fails, report the errors and stop — do not proceed to render.
|
|
28
|
-
|
|
29
|
-
### 2. Render
|
|
30
|
-
|
|
31
|
-
Run `forge build` to produce the MP4 output. Review the output for any build errors. If the build fails, report the errors and stop.
|
|
32
|
-
|
|
33
|
-
### 3. Determinism check
|
|
34
|
-
|
|
35
|
-
Run `forge determinism check` to verify the render is reproducible — two builds produce identical output. Review the output hash comparison. If the hashes differ, report the mismatch and stop.
|
|
36
|
-
|
|
37
|
-
### 4. Output inspection
|
|
38
|
-
|
|
39
|
-
Check the render output:
|
|
40
|
-
|
|
41
|
-
- Verify the output MP4 file exists at the expected path (`dist/{composition}.mp4`).
|
|
42
|
-
- Check that the file size is non-zero.
|
|
43
|
-
- Check that the duration matches the root `Timegroup`'s `duration` prop (if ffprobe or equivalent is available).
|
|
44
|
-
|
|
45
|
-
### 5. Report
|
|
46
|
-
|
|
47
|
-
Summarize the verification results — pass/fail for each step:
|
|
48
|
-
|
|
49
|
-
| Step | Status | Details |
|
|
50
|
-
| ----------------- | ----------- | -------------------------------------- |
|
|
51
|
-
| Validation | pass / fail | <error details or "all checks passed"> |
|
|
52
|
-
| Build | pass / fail | <error details or "build completed"> |
|
|
53
|
-
| Determinism | pass / fail | <hash comparison result> |
|
|
54
|
-
| Output inspection | pass / fail | <file exists, size, duration check> |
|
|
55
|
-
|
|
56
|
-
If all steps pass, the render is verified. If any step fails, provide specific recommendations for fixing the issue.
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ef-webhooks
|
|
3
|
-
description: "Configure Editframe webhooks for render completion and file processing notifications. Use when the operator asks to set up webhooks for Editframe events."
|
|
4
|
-
invocation: user
|
|
5
|
-
category: fo
|
|
6
|
-
concerns: read-only
|
|
7
|
-
dependsOn: []
|
|
8
|
-
languagePolicy: ref(PREFERENCES.md)
|
|
9
|
-
triggers:
|
|
10
|
-
- "set up editframe webhooks"
|
|
11
|
-
- "render completion notification"
|
|
12
|
-
- "file processing webhook"
|
|
13
|
-
- "webhook signature verification"
|
|
14
|
-
source: https://editframe.com/skills/webhooks.md
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
<!-- skill-lint-disable SKILL-17 -->
|
|
18
|
-
|
|
19
|
-
Before starting, read `PREFERENCES.md` at the repository root. If the file is missing or `aiLanguage` is unset, ask the operator once and create the file using the `my-preferences` skill semantics.
|
|
20
|
-
|
|
21
|
-
# Webhooks
|
|
22
|
-
|
|
23
|
-
Use webhooks to receive real-time HTTP POST notifications when a render completes or a file finishes processing. Use them instead of polling `getRenderProgress`/`getFileProcessingProgress`.
|
|
24
|
-
|
|
25
|
-
No SDK function registers a webhook. Configure one on an API key, through the dashboard (Settings → API Keys, or `editframe.com/resource/api_keys`). Set a **Webhook URL** (must use HTTPS). Select which **Webhook Events** (topics) to receive. When you create or update the key, the dashboard generates a **Webhook Secret**, used to sign deliveries. Copy this secret and store it alongside the API key.
|
|
26
|
-
|
|
27
|
-
## Handling a webhook
|
|
28
|
-
|
|
29
|
-
```typescript
|
|
30
|
-
import express from "express";
|
|
31
|
-
import crypto from "node:crypto";
|
|
32
|
-
|
|
33
|
-
const app = express();
|
|
34
|
-
|
|
35
|
-
app.post("/webhooks/editframe", express.raw({ type: "*/*" }), (req, res) => {
|
|
36
|
-
const signature = req.headers["x-webhook-signature"] as string;
|
|
37
|
-
const rawBody = req.body as Buffer;
|
|
38
|
-
|
|
39
|
-
const expected = crypto
|
|
40
|
-
.createHmac("sha256", process.env.EDITFRAME_WEBHOOK_SECRET!)
|
|
41
|
-
.update(rawBody)
|
|
42
|
-
.digest("hex");
|
|
43
|
-
|
|
44
|
-
if (!crypto.timingSafeEqual(Buffer.from(signature, "hex"), Buffer.from(expected, "hex"))) {
|
|
45
|
-
return res.status(401).send("Invalid signature");
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
res.status(200).send("OK");
|
|
49
|
-
const payload = JSON.parse(rawBody.toString("utf-8"));
|
|
50
|
-
processWebhookEvent(payload).catch(console.error);
|
|
51
|
-
});
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
Every request carries an `X-Webhook-Signature` header: `HMAC-SHA256(webhook_secret, raw_json_body)`, hex-encoded. Verify with `crypto.timingSafeEqual`, not `===`.
|
|
55
|
-
|
|
56
|
-
Use `express.raw()`, not `express.json()`. Signature verification needs the exact raw bytes. Re-serializing parsed JSON can reorder keys or change whitespace, which changes the hash and breaks verification.
|
|
57
|
-
|
|
58
|
-
## Payload
|
|
59
|
-
|
|
60
|
-
```typescript
|
|
61
|
-
{ topic: string, data: {...} }
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
### Render topics
|
|
65
|
-
|
|
66
|
-
`render.created`, `render.pending`, `render.rendering`, `render.completed`, `render.failed`
|
|
67
|
-
|
|
68
|
-
`data` includes `id`, `status`, `created_at`, `completed_at`, `failed_at`, `width`, `height`, `fps`, `byte_size`, `duration_ms`, `md5`, `metadata`, `expires_at` (`null` = permanent), `download_url` (populated once complete), `error` (populated on failure).
|
|
69
|
-
|
|
70
|
-
### File topics
|
|
71
|
-
|
|
72
|
-
`file.created`, `file.uploading`, `file.processing`, `file.ready`, `file.failed`, `file.updated`
|
|
73
|
-
|
|
74
|
-
`data` includes `id`, `type` (`video`/`image`/`caption`), `status`, `filename`, `byte_size`, `md5`, `mime_type`, `width`, `height`, `expires_at`. Editframe sends `file.updated` for a file status change that doesn't match one of the other file topics.
|
|
75
|
-
|
|
76
|
-
### Legacy topics
|
|
77
|
-
|
|
78
|
-
`image_file.created`, `isobmff_file.created`, `isobmff_track.created`, `unprocessed_file.created`. Do not build new integrations against these.
|
|
79
|
-
|
|
80
|
-
## Delivery
|
|
81
|
-
|
|
82
|
-
- Each event arrives as one HTTP POST with a JSON body.
|
|
83
|
-
- Editframe retries on a fixed 10-second interval, up to 3 attempts total, with a 30-second timeout per attempt.
|
|
84
|
-
- Editframe may deliver an event more than once. Key side effects off `data.id` to stay idempotent.
|
|
85
|
-
- Always hash the **raw** request body for signature verification.
|
|
86
|
-
|
|
87
|
-
## Testing
|
|
88
|
-
|
|
89
|
-
```bash
|
|
90
|
-
npx editframe webhook -t render.completed
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
This sends a real test event to the URL configured on your API key. There is no `--webhookURL` flag — the target URL always comes from the key's dashboard configuration. The dashboard's API key detail page has an equivalent "Test Webhook" button.
|
|
94
|
-
|
|
95
|
-
For local development, tunnel your dev server (e.g. `ngrok http 3000`) and point the API key's Webhook URL at the tunnel URL.
|