@warpgogol/forge 0.14.0 → 0.16.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/AGENTS.md +5 -3
- package/README.md +58 -5
- package/dist/os/adr/frontmatter-io.d.ts +1 -0
- package/dist/os/adr/frontmatter-io.d.ts.map +1 -1
- package/dist/os/adr/frontmatter-io.js +3 -0
- package/dist/os/adr/frontmatter-io.js.map +1 -1
- package/dist/os/adr/handlers/validate.d.ts.map +1 -1
- package/dist/os/adr/handlers/validate.js +2 -2
- package/dist/os/adr/handlers/validate.js.map +1 -1
- package/dist/os/core/core.module.d.ts.map +1 -1
- package/dist/os/core/core.module.js +9 -0
- package/dist/os/core/core.module.js.map +1 -1
- package/dist/src/onboarding/create.d.ts.map +1 -1
- package/dist/src/onboarding/create.js +5 -2
- package/dist/src/onboarding/create.js.map +1 -1
- package/dist/src/onboarding/doctor.d.ts.map +1 -1
- package/dist/src/onboarding/doctor.js +38 -0
- package/dist/src/onboarding/doctor.js.map +1 -1
- package/dist/src/onboarding/invariant-engine.d.ts.map +1 -1
- package/dist/src/onboarding/invariant-engine.js +14 -7
- package/dist/src/onboarding/invariant-engine.js.map +1 -1
- package/dist/src/onboarding/scaffold-project.d.ts.map +1 -1
- package/dist/src/onboarding/scaffold-project.js +25 -5
- package/dist/src/onboarding/scaffold-project.js.map +1 -1
- package/dist/src/profiles/profile-schema.d.ts +73 -8
- package/dist/src/profiles/profile-schema.d.ts.map +1 -1
- package/dist/src/profiles/profile-schema.js +35 -10
- package/dist/src/profiles/profile-schema.js.map +1 -1
- package/dist/src/profiles/stack-profile.d.ts +26 -2
- package/dist/src/profiles/stack-profile.d.ts.map +1 -1
- package/dist/src/profiles/stack-profile.js +4 -0
- package/dist/src/profiles/stack-profile.js.map +1 -1
- package/package.json +1 -1
- package/profiles/editframe-templates/composition-agents.md +70 -0
- package/profiles/editframe-templates/composition.tsx +33 -0
- package/profiles/{editframe-html-templates/composition-agents.md → editframe-templates/html-composition-agents.md} +15 -16
- package/profiles/{editframe-html.yaml → editframe.yaml} +170 -56
- package/skills/fo/ef-brand-video-generator/SKILL.md +101 -0
- package/skills/fo/ef-composition/SKILL.md +147 -0
- package/skills/fo/ef-composition-review/SKILL.md +10 -10
- package/skills/fo/ef-dev-server/SKILL.md +107 -0
- package/skills/fo/ef-editor-gui/SKILL.md +131 -0
- package/skills/fo/ef-motion-design/SKILL.md +118 -0
- package/skills/fo/ef-onboard/SKILL.md +16 -29
- package/skills/fo/ef-render-verify/SKILL.md +2 -2
- package/skills/fo/ef-webhooks/SKILL.md +95 -0
- package/skills/fo/fo-session-retro/SKILL.md +2 -2
- package/profiles/editframe-html-templates/composition.html +0 -32
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile-schema.js","sourceRoot":"","sources":["../../../src/profiles/profile-schema.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"profile-schema.js","sourceRoot":"","sources":["../../../src/profiles/profile-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;EAkBE;AAEF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,8EAA8E;AAC9E,oCAAoC;AACpC,8EAA8E;AAE9E,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,UAAU;IACV,gBAAgB;IAChB,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,UAAU;CACF,CAAC;AAEX,MAAM,CAAC,MAAM,oBAAoB,GAA2B;IAC1D,QAAQ,EAAE,UAAU;IACpB,cAAc,EAAE,WAAW;IAC3B,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;CACrB,CAAC;AAEF,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,EAAE,CAAC;SACP,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9B,CAAC;SACD,QAAQ,EAAE;IACb,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;QAClD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACxC,CAAC;SACD,QAAQ,EAAE;IACb,WAAW,EAAE,CAAC;SACX,MAAM,CAAC;QACN,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;QACrB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC5B,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAoBH,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACtC,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACtC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACxC,CAAC,CAAC;AAaH,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC;KACzC,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,eAAe,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;IAC7F,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC;KACD,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,KAAK,mBAAmB;IAC9B,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,EAC3F;IACE,OAAO,EACL,6FAA6F;CAChG,CACF,CAAC;AAWJ,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,EAAE,EAAE,CAAC;SACF,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,KAAK,CAAC,cAAc,EAAE,uDAAuD,CAAC;IACjF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACtC,KAAK,EAAE,2BAA2B,CAAC,QAAQ,EAAE;CAC9C,CAAC,CAAC;AASH,8EAA8E;AAC9E,uCAAuC;AACvC,8EAA8E;AAE9E,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC5C,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CACzD,CAAC,CAAC;AAQH,8EAA8E;AAC9E,kCAAkC;AAClC,8EAA8E;AAE9E,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACtC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACxC,CAAC,CAAC;AAQH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC;CACvC,CAAC,CAAC;AAOH,8EAA8E;AAC9E,oCAAoC;AACpC,8EAA8E;AAE9E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC;IACzD,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAChD,EAAE,EAAE,CAAC;SACF,MAAM,CAAC;QACN,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;KAC/B,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAcH,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;CACxD,CAAC,CAAC;AAUH,8EAA8E;AAC9E,oDAAoD;AACpD,8EAA8E;AAE9E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC;QACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,KAAK,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,MAAM,CAAC;YACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;SACpB,CAAC,CACH;QACD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;KACzC,CAAC;CACH,CAAC,CAAC;AAYH,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC,MAAM,CAAC;IACrD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxD,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,QAAQ,EAAE;IACpD,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,QAAQ,EAAE;IAC9D,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,QAAQ,EAAE;IACtD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrD,SAAS,EAAE,sBAAsB,CAAC,QAAQ,EAAE;IAC5C,MAAM,EAAE,kBAAkB,CAAC,QAAQ,EAAE;IACrC,OAAO,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACxC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,QAAQ,EAAE;IAC5D,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,QAAQ,EAAE;CACrD,CAAC,CAAC"}
|
|
@@ -67,12 +67,12 @@ export declare const stackProfileSchema: z.ZodObject<{
|
|
|
67
67
|
"filename-pattern": "filename-pattern";
|
|
68
68
|
"file-contains": "file-contains";
|
|
69
69
|
"file-not-contains": "file-not-contains";
|
|
70
|
-
"
|
|
70
|
+
"attribute-pattern": "attribute-pattern";
|
|
71
71
|
}>;
|
|
72
72
|
glob: z.ZodOptional<z.ZodString>;
|
|
73
73
|
pattern: z.ZodOptional<z.ZodString>;
|
|
74
74
|
negatedPattern: z.ZodOptional<z.ZodString>;
|
|
75
|
-
|
|
75
|
+
elements: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
76
76
|
attribute: z.ZodOptional<z.ZodString>;
|
|
77
77
|
}, z.core.$strip>>;
|
|
78
78
|
}, z.core.$strip>>>;
|
|
@@ -108,6 +108,28 @@ export declare const stackProfileSchema: z.ZodObject<{
|
|
|
108
108
|
prefix: z.ZodDefault<z.ZodString>;
|
|
109
109
|
}, z.core.$strip>>;
|
|
110
110
|
}, z.core.$strip>>;
|
|
111
|
+
prerequisites: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
112
|
+
id: z.ZodString;
|
|
113
|
+
name: z.ZodString;
|
|
114
|
+
check: z.ZodString;
|
|
115
|
+
installHint: z.ZodOptional<z.ZodString>;
|
|
116
|
+
severity: z.ZodDefault<z.ZodEnum<{
|
|
117
|
+
error: "error";
|
|
118
|
+
warning: "warning";
|
|
119
|
+
}>>;
|
|
120
|
+
}, z.core.$strip>>>;
|
|
121
|
+
templates: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
122
|
+
id: z.ZodString;
|
|
123
|
+
default: z.ZodOptional<z.ZodBoolean>;
|
|
124
|
+
firstWorkspace: z.ZodObject<{
|
|
125
|
+
path: z.ZodString;
|
|
126
|
+
files: z.ZodArray<z.ZodObject<{
|
|
127
|
+
path: z.ZodString;
|
|
128
|
+
content: z.ZodString;
|
|
129
|
+
}, z.core.$strip>>;
|
|
130
|
+
install: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
131
|
+
}, z.core.$strip>;
|
|
132
|
+
}, z.core.$strip>>>;
|
|
111
133
|
}, z.core.$strip>;
|
|
112
134
|
export interface ProfileFile {
|
|
113
135
|
path: string;
|
|
@@ -130,6 +152,8 @@ export interface StackProfile extends StackProfileDomainFields {
|
|
|
130
152
|
files: ProfileFile[];
|
|
131
153
|
install: string[];
|
|
132
154
|
};
|
|
155
|
+
prerequisites?: import("./profile-schema.ts").ProfilePrerequisite[];
|
|
156
|
+
templates?: import("./profile-schema.ts").ProfileTemplate[];
|
|
133
157
|
}
|
|
134
158
|
export declare function loadStackProfile(profilePath: string): StackProfile;
|
|
135
159
|
export declare function listStackProfiles(forgeRoot: string): StackProfile[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stack-profile.d.ts","sourceRoot":"","sources":["../../../src/profiles/stack-profile.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAkC,KAAK,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAMpG,eAAO,MAAM,kBAAkB
|
|
1
|
+
{"version":3,"file":"stack-profile.d.ts","sourceRoot":"","sources":["../../../src/profiles/stack-profile.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAkC,KAAK,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAMpG,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8C7B,CAAC;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAa,SAAQ,wBAAwB;IAC5D,MAAM,EAAE,uBAAuB,CAAC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC5B,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,KAAK,EAAE,WAAW,EAAE,CAAC;KACtB,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,CAAC,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,WAAW,EAAE,CAAC;QACrB,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;IACF,aAAa,CAAC,EAAE,OAAO,qBAAqB,EAAE,mBAAmB,EAAE,CAAC;IACpE,SAAS,CAAC,EAAE,OAAO,qBAAqB,EAAE,eAAe,EAAE,CAAC;CAC7D;AAMD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,CAkBlE;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE,CAiBnE;AAMD,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,YAAY,GAAG,IAAI,CAO9F"}
|
|
@@ -60,6 +60,10 @@ export const stackProfileSchema = z.object({
|
|
|
60
60
|
assets: stackProfileDomainFieldsSchema.shape.assets,
|
|
61
61
|
// RFC-0680: Release lifecycle declaration
|
|
62
62
|
release: stackProfileDomainFieldsSchema.shape.release,
|
|
63
|
+
// Prerequisites: system-level dependency checks (e.g. FFmpeg)
|
|
64
|
+
prerequisites: stackProfileDomainFieldsSchema.shape.prerequisites,
|
|
65
|
+
// Templates: multi-template profiles (e.g. React + HTML)
|
|
66
|
+
templates: stackProfileDomainFieldsSchema.shape.templates,
|
|
63
67
|
});
|
|
64
68
|
// ---------------------------------------------------------------------------
|
|
65
69
|
// Loader
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stack-profile.js","sourceRoot":"","sources":["../../../src/profiles/stack-profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;EAeE;AAEF,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,8BAA8B,EAAiC,MAAM,qBAAqB,CAAC;AAEpG,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;AAE9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC;IAC1C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;KAClC,CAAC;IACF,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;QAClB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,KAAK,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,MAAM,CAAC;YACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;SACpB,CAAC,CACH;KACF,CAAC;IACF,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACxC,cAAc,EAAE,CAAC;SACd,MAAM,CAAC;QACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACvB,KAAK,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,MAAM,CAAC;YACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;SACpB,CAAC,CACH;QACD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;KACzC,CAAC;SACD,QAAQ,EAAE;IACb,2CAA2C;IAC3C,MAAM,EAAE,8BAA8B,CAAC,KAAK,CAAC,MAAM;IACnD,WAAW,EAAE,8BAA8B,CAAC,KAAK,CAAC,WAAW;IAC7D,SAAS,EAAE,8BAA8B,CAAC,KAAK,CAAC,SAAS;IACzD,cAAc,EAAE,8BAA8B,CAAC,KAAK,CAAC,cAAc;IACnE,UAAU,EAAE,8BAA8B,CAAC,KAAK,CAAC,UAAU;IAC3D,QAAQ,EAAE,8BAA8B,CAAC,KAAK,CAAC,QAAQ;IACvD,0DAA0D;IAC1D,SAAS,EAAE,8BAA8B,CAAC,KAAK,CAAC,SAAS;IACzD,yCAAyC;IACzC,MAAM,EAAE,8BAA8B,CAAC,KAAK,CAAC,MAAM;IACnD,0CAA0C;IAC1C,OAAO,EAAE,8BAA8B,CAAC,KAAK,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"stack-profile.js","sourceRoot":"","sources":["../../../src/profiles/stack-profile.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Composition Workspace
|
|
2
|
+
|
|
3
|
+
This workspace contains an Editframe video composition.
|
|
4
|
+
|
|
5
|
+
## Domain terminology
|
|
6
|
+
|
|
7
|
+
- **Composition** — the artifact this workspace produces (a `.tsx` file using `@editframe/react` components).
|
|
8
|
+
- **Scene** — a structural module within a composition (a `Timegroup` block).
|
|
9
|
+
- **Director** — the operator who creates and renders the composition.
|
|
10
|
+
|
|
11
|
+
## Quality invariants
|
|
12
|
+
|
|
13
|
+
| ID | Description | Severity |
|
|
14
|
+
| --- | --- | --- |
|
|
15
|
+
| VIDEO-01 | Composition filenames must use kebab-case (lowercase letters, digits, hyphens only). | error |
|
|
16
|
+
| VIDEO-02 | Scene durations must use `contain` fit mode by default to avoid unexpected cropping. Use `cover` or `fill` only when intentionally overriding. | warning |
|
|
17
|
+
| VIDEO-03 | All speech audio elements (`Audio` with speech content) must have corresponding `Captions` components for accessibility. | error |
|
|
18
|
+
|
|
19
|
+
Additional time model invariants (VIDEO-04 through VIDEO-09) may be available. Run `forge doctor` to check the full invariant set enforced by the active profile.
|
|
20
|
+
|
|
21
|
+
## Time model concepts
|
|
22
|
+
|
|
23
|
+
Editframe compositions use a time model based on `Timegroup` components from `@editframe/react`:
|
|
24
|
+
|
|
25
|
+
- **`TimelineRoot`** — the root container for the composition.
|
|
26
|
+
- **`Timegroup`** — a container that groups scenes and controls timing. The root Timegroup defines the composition's total duration.
|
|
27
|
+
- **`mode`** — timing behavior for children: `sequence` (play one after another), `fixed` (play at absolute offset), `contain` (fit within parent duration), `fit` (scale to fit).
|
|
28
|
+
- **`duration`** — CSS time string (e.g. `5s`, `300ms`, `2.5s`) defining how long the element plays.
|
|
29
|
+
- **`offset`** — CSS time string defining when the element starts relative to its parent.
|
|
30
|
+
- **`fps`** — positive integer defining frames per second (e.g. `30`, `60`).
|
|
31
|
+
- **`loop`** — boolean, only on the root Timegroup. Nested Timegroups should not loop.
|
|
32
|
+
|
|
33
|
+
## Workflow
|
|
34
|
+
|
|
35
|
+
1. Create a `.tsx` file with `@editframe/react` components (`TimelineRoot`, `Timegroup`, `Video`, `Audio`, `Text`, `Captions`).
|
|
36
|
+
2. Run `editframe preview` to preview the composition in the browser.
|
|
37
|
+
3. Run `ef-composition-review` to review the composition for time model correctness, accessibility, and best practices.
|
|
38
|
+
4. Run `editframe check` to validate the composition structure.
|
|
39
|
+
5. Run `editframe render -o dist/<name>.mp4` to produce the final video output.
|
|
40
|
+
6. Run `ef-render-verify` to verify the render — validation, build, determinism, output inspection.
|
|
41
|
+
|
|
42
|
+
## Skills
|
|
43
|
+
|
|
44
|
+
- **ef-onboard** — onboard a new project: prerequisites, discovery, scaffold, preview. Trigger: "create a new video project".
|
|
45
|
+
- **ef-composition-review** — review a composition for time model correctness, accessibility, and best practices before rendering. Trigger: "review this composition".
|
|
46
|
+
- **ef-render-verify** — verify a render: validate, build, check determinism, inspect output. Trigger: "render and verify".
|
|
47
|
+
- **ef-composition** — guide creating a new video composition with Editframe React components. Trigger: "create a video composition".
|
|
48
|
+
- **ef-dev-server** — set up and manage the Editframe dev server for live preview. Trigger: "set up editframe dev server".
|
|
49
|
+
- **ef-editor-gui** — configure the Editframe editor GUI for visual composition editing. Trigger: "open editframe editor".
|
|
50
|
+
- **ef-webhooks** — configure Editframe webhooks for render status notifications. Trigger: "set up editframe webhooks".
|
|
51
|
+
- **ef-brand-video-generator** — generate brand video compositions from templates. Trigger: "generate a brand video".
|
|
52
|
+
- **ef-motion-design** — apply motion design patterns to compositions. Trigger: "add motion design".
|
|
53
|
+
|
|
54
|
+
## External resources
|
|
55
|
+
|
|
56
|
+
- [Editframe llms.txt](https://editframe.com/llms.txt) — machine-readable index of Editframe domain skills
|
|
57
|
+
- [Editframe composition skill](https://editframe.com/skills/composition.md) — full reference for time model, elements, and rendering
|
|
58
|
+
- [Editframe getting started](https://editframe.com/getting-started) — step-by-step guide and agent prompt
|
|
59
|
+
|
|
60
|
+
## Reference template
|
|
61
|
+
|
|
62
|
+
A sample composition template is available at `editframe-templates/composition.tsx` in the forge profiles directory. Copy it to start a new composition:
|
|
63
|
+
|
|
64
|
+
```sh
|
|
65
|
+
cp node_modules/@warpgogol/forge/profiles/editframe-templates/composition.tsx compositions/my-new-video/composition.tsx
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## File naming
|
|
69
|
+
|
|
70
|
+
Composition files use kebab-case: `my-video.tsx`, `product-demo.tsx`, `intro-clip.tsx`.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Editframe React composition template
|
|
3
|
+
Copy this file to start a new composition. @editframe/react components:
|
|
4
|
+
- TimelineRoot: root container for the composition
|
|
5
|
+
- Timegroup: groups elements into a timed sequence
|
|
6
|
+
- Video: video source with fit mode (contain, cover, fill)
|
|
7
|
+
- Audio: audio source
|
|
8
|
+
- Text: text overlay with positioning
|
|
9
|
+
- Captions: accessibility captions for speech audio
|
|
10
|
+
Run `editframe preview` to preview, `editframe render` to produce output.
|
|
11
|
+
*/
|
|
12
|
+
import { TimelineRoot, Timegroup, Video, Text, Audio, Captions } from "@editframe/react";
|
|
13
|
+
|
|
14
|
+
export default function Composition() {
|
|
15
|
+
return (
|
|
16
|
+
<TimelineRoot>
|
|
17
|
+
<Timegroup duration="10s">
|
|
18
|
+
<Video src="assets/background.mp4" fit="contain" duration="10s" />
|
|
19
|
+
<Text
|
|
20
|
+
text="Your text here"
|
|
21
|
+
x="50%"
|
|
22
|
+
y="50%"
|
|
23
|
+
fontSize="48px"
|
|
24
|
+
color="white"
|
|
25
|
+
textAlign="center"
|
|
26
|
+
duration="5s"
|
|
27
|
+
/>
|
|
28
|
+
<Audio src="assets/narration.mp3" />
|
|
29
|
+
<Captions src="assets/captions.vtt" />
|
|
30
|
+
</Timegroup>
|
|
31
|
+
</TimelineRoot>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# Composition Workspace
|
|
1
|
+
# HTML Composition Workspace
|
|
2
2
|
|
|
3
|
-
This workspace contains an Editframe video composition.
|
|
3
|
+
This workspace contains an Editframe video composition using HTML web components.
|
|
4
4
|
|
|
5
5
|
## Domain terminology
|
|
6
6
|
|
|
7
|
-
- **Composition** — the artifact this workspace produces (an
|
|
7
|
+
- **Composition** — the artifact this workspace produces (an `.html` file using Editframe web components).
|
|
8
8
|
- **Scene** — a structural module within a composition (an `ef-timegroup` block).
|
|
9
9
|
- **Director** — the operator who creates and renders the composition.
|
|
10
10
|
|
|
@@ -14,24 +14,25 @@ This workspace contains an Editframe video composition.
|
|
|
14
14
|
| --- | --- | --- |
|
|
15
15
|
| VIDEO-01 | Composition filenames must use kebab-case (lowercase letters, digits, hyphens only). | error |
|
|
16
16
|
| VIDEO-02 | Scene durations must use `contain` fit mode by default to avoid unexpected cropping. Use `cover` or `fill` only when intentionally overriding. | warning |
|
|
17
|
-
| VIDEO-03 | All speech audio elements (`ef-audio` with speech content) must have corresponding `ef-captions`
|
|
17
|
+
| VIDEO-03 | All speech audio elements (`ef-audio` with speech content) must have corresponding `ef-captions` components for accessibility. | error |
|
|
18
18
|
|
|
19
19
|
Additional time model invariants (VIDEO-04 through VIDEO-09) may be available. Run `forge doctor` to check the full invariant set enforced by the active profile.
|
|
20
20
|
|
|
21
21
|
## Time model concepts
|
|
22
22
|
|
|
23
|
-
Editframe compositions use a time model based on
|
|
23
|
+
Editframe HTML compositions use a time model based on web components:
|
|
24
24
|
|
|
25
|
-
- **`ef-
|
|
25
|
+
- **`ef-timeline`** — the root container for the composition.
|
|
26
|
+
- **`ef-timegroup`** — a container that groups scenes and controls timing. The root ef-timegroup defines the composition's total duration.
|
|
26
27
|
- **`mode`** — timing behavior for children: `sequence` (play one after another), `fixed` (play at absolute offset), `contain` (fit within parent duration), `fit` (scale to fit).
|
|
27
28
|
- **`duration`** — CSS time string (e.g. `5s`, `300ms`, `2.5s`) defining how long the element plays.
|
|
28
29
|
- **`offset`** — CSS time string defining when the element starts relative to its parent.
|
|
29
30
|
- **`fps`** — positive integer defining frames per second (e.g. `30`, `60`).
|
|
30
|
-
- **`loop`** — boolean, only on the root timegroup. Nested timegroups should not loop.
|
|
31
|
+
- **`loop`** — boolean, only on the root ef-timegroup. Nested ef-timegroups should not loop.
|
|
31
32
|
|
|
32
33
|
## Workflow
|
|
33
34
|
|
|
34
|
-
1. Create
|
|
35
|
+
1. Create an `.html` file with Editframe web components (`ef-timeline`, `ef-timegroup`, `ef-video`, `ef-audio`, `ef-text`, `ef-captions`).
|
|
35
36
|
2. Run `editframe preview` to preview the composition in the browser.
|
|
36
37
|
3. Run `ef-composition-review` to review the composition for time model correctness, accessibility, and best practices.
|
|
37
38
|
4. Run `editframe check` to validate the composition structure.
|
|
@@ -43,6 +44,12 @@ Editframe compositions use a time model based on `ef-timegroup` elements:
|
|
|
43
44
|
- **ef-onboard** — onboard a new project: prerequisites, discovery, scaffold, preview. Trigger: "create a new video project".
|
|
44
45
|
- **ef-composition-review** — review a composition for time model correctness, accessibility, and best practices before rendering. Trigger: "review this composition".
|
|
45
46
|
- **ef-render-verify** — verify a render: validate, build, check determinism, inspect output. Trigger: "render and verify".
|
|
47
|
+
- **ef-composition** — guide creating a new video composition with Editframe HTML components. Trigger: "create a video composition".
|
|
48
|
+
- **ef-dev-server** — set up and manage the Editframe dev server for live preview. Trigger: "set up editframe dev server".
|
|
49
|
+
- **ef-editor-gui** — configure the Editframe editor GUI for visual composition editing. Trigger: "open editframe editor".
|
|
50
|
+
- **ef-webhooks** — configure Editframe webhooks for render status notifications. Trigger: "set up editframe webhooks".
|
|
51
|
+
- **ef-brand-video-generator** — generate brand video compositions from templates. Trigger: "generate a brand video".
|
|
52
|
+
- **ef-motion-design** — apply motion design patterns to compositions. Trigger: "add motion design".
|
|
46
53
|
|
|
47
54
|
## External resources
|
|
48
55
|
|
|
@@ -50,14 +57,6 @@ Editframe compositions use a time model based on `ef-timegroup` elements:
|
|
|
50
57
|
- [Editframe composition skill](https://editframe.com/skills/composition.md) — full reference for time model, elements, and rendering
|
|
51
58
|
- [Editframe getting started](https://editframe.com/getting-started) — step-by-step guide and agent prompt
|
|
52
59
|
|
|
53
|
-
## Reference template
|
|
54
|
-
|
|
55
|
-
A sample composition template is available at `editframe-html-templates/composition.html` in the forge profiles directory. Copy it to start a new composition:
|
|
56
|
-
|
|
57
|
-
```sh
|
|
58
|
-
cp node_modules/@warpgogol/forge/profiles/editframe-html-templates/composition.html compositions/my-new-video/composition.html
|
|
59
|
-
```
|
|
60
|
-
|
|
61
60
|
## File naming
|
|
62
61
|
|
|
63
62
|
Composition files use kebab-case: `my-video.html`, `product-demo.html`, `intro-clip.html`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
schema: forge/stack-profile@1
|
|
2
|
-
id: editframe
|
|
3
|
-
displayName: Editframe
|
|
2
|
+
id: editframe
|
|
3
|
+
displayName: Editframe Video
|
|
4
4
|
detect:
|
|
5
5
|
anyOf:
|
|
6
6
|
- editframe.config.*
|
|
@@ -20,8 +20,8 @@ devServer:
|
|
|
20
20
|
artifacts:
|
|
21
21
|
- id: composition
|
|
22
22
|
extensions:
|
|
23
|
-
- .html
|
|
24
23
|
- .tsx
|
|
24
|
+
- .html
|
|
25
25
|
produce:
|
|
26
26
|
command: editframe render
|
|
27
27
|
output: dist/{composition}.mp4
|
|
@@ -30,6 +30,7 @@ artifacts:
|
|
|
30
30
|
determinism:
|
|
31
31
|
hashable: true
|
|
32
32
|
inputs:
|
|
33
|
+
- compositions/**/*.tsx
|
|
33
34
|
- compositions/**/*.html
|
|
34
35
|
- assets/**
|
|
35
36
|
assets:
|
|
@@ -48,8 +49,29 @@ release:
|
|
|
48
49
|
target: local
|
|
49
50
|
outputDir: release
|
|
50
51
|
manifestName: release-manifest.json
|
|
52
|
+
prerequisites:
|
|
53
|
+
- id: nodejs
|
|
54
|
+
name: Node.js 18+
|
|
55
|
+
check: node --version
|
|
56
|
+
installHint: "https://nodejs.org/en/download/"
|
|
57
|
+
severity: error
|
|
58
|
+
- id: ffmpeg
|
|
59
|
+
name: FFmpeg
|
|
60
|
+
check: ffmpeg -version
|
|
61
|
+
installHint: "https://ffmpeg.org/download.html"
|
|
62
|
+
severity: error
|
|
51
63
|
workspaceTypes:
|
|
52
64
|
- id: composition
|
|
65
|
+
detect:
|
|
66
|
+
glob: "*.tsx"
|
|
67
|
+
contains: TimelineRoot
|
|
68
|
+
packageJsonDep: "@editframe/react"
|
|
69
|
+
skills:
|
|
70
|
+
- ef-onboard
|
|
71
|
+
- ef-composition-review
|
|
72
|
+
- ef-render-verify
|
|
73
|
+
agentsMdTemplate: editframe-templates/composition-agents.md
|
|
74
|
+
- id: html-composition
|
|
53
75
|
detect:
|
|
54
76
|
glob: "*.html"
|
|
55
77
|
contains: ef-timegroup
|
|
@@ -58,77 +80,85 @@ workspaceTypes:
|
|
|
58
80
|
- ef-onboard
|
|
59
81
|
- ef-composition-review
|
|
60
82
|
- ef-render-verify
|
|
61
|
-
agentsMdTemplate: editframe-html-
|
|
83
|
+
agentsMdTemplate: editframe-templates/html-composition-agents.md
|
|
62
84
|
invariants:
|
|
63
85
|
- id: VIDEO-01
|
|
64
86
|
rule: Composition filenames must use kebab-case (lowercase letters, digits, hyphens only)
|
|
65
87
|
severity: error
|
|
66
88
|
check:
|
|
67
89
|
kind: filename-pattern
|
|
68
|
-
glob: "compositions/**/*.{html
|
|
69
|
-
pattern: "^[a-z0-9-]+\\.(html
|
|
90
|
+
glob: "compositions/**/*.{tsx,html}"
|
|
91
|
+
pattern: "^[a-z0-9-]+\\.(tsx|html)$"
|
|
70
92
|
- id: VIDEO-02
|
|
71
93
|
rule: Scene durations must use contain mode by default to avoid unexpected cropping
|
|
72
94
|
severity: warning
|
|
73
95
|
check:
|
|
74
96
|
kind: file-contains
|
|
75
|
-
glob: "compositions/**/*.html"
|
|
97
|
+
glob: "compositions/**/*.{tsx,html}"
|
|
76
98
|
pattern: contain
|
|
77
99
|
- id: VIDEO-03
|
|
78
|
-
rule: All speech audio elements must have corresponding
|
|
100
|
+
rule: All speech audio elements must have corresponding Captions components for accessibility
|
|
79
101
|
severity: error
|
|
80
102
|
check:
|
|
81
103
|
kind: file-contains
|
|
82
|
-
glob: "compositions/**/*.html"
|
|
83
|
-
pattern:
|
|
104
|
+
glob: "compositions/**/*.{tsx,html}"
|
|
105
|
+
pattern: Captions
|
|
84
106
|
- id: VIDEO-04
|
|
85
|
-
rule:
|
|
107
|
+
rule: Root Timegroup must declare duration or use mode="contain" or mode="fit"
|
|
86
108
|
severity: error
|
|
87
109
|
check:
|
|
88
110
|
kind: file-contains
|
|
89
|
-
glob: "compositions/**/*.html"
|
|
90
|
-
pattern: 'ef-timegroup[^>]*(duration|mode="contain"|mode="fit")[^>]*>'
|
|
111
|
+
glob: "compositions/**/*.{tsx,html}"
|
|
112
|
+
pattern: 'Timegroup[^>]*(duration|mode="contain"|mode="fit")[^>]*>|ef-timegroup[^>]*(duration|mode="contain"|mode="fit")[^>]*>'
|
|
91
113
|
- id: VIDEO-05
|
|
92
114
|
rule: All duration values must be valid CSS time strings (e.g. 5s, 500ms, 2.5s)
|
|
93
115
|
severity: error
|
|
94
116
|
check:
|
|
95
|
-
kind:
|
|
96
|
-
glob: "compositions/**/*.html"
|
|
97
|
-
|
|
117
|
+
kind: attribute-pattern
|
|
118
|
+
glob: "compositions/**/*.{tsx,html}"
|
|
119
|
+
elements:
|
|
120
|
+
- ef-timegroup
|
|
121
|
+
- Timegroup
|
|
98
122
|
attribute: "duration"
|
|
99
123
|
pattern: "^\\d+(\\.\\d+)?(s|ms)$"
|
|
100
124
|
- id: VIDEO-06
|
|
101
125
|
rule: "mode attribute must be one of: sequence, fixed, contain, fit"
|
|
102
126
|
severity: error
|
|
103
127
|
check:
|
|
104
|
-
kind:
|
|
105
|
-
glob: "compositions/**/*.html"
|
|
106
|
-
|
|
128
|
+
kind: attribute-pattern
|
|
129
|
+
glob: "compositions/**/*.{tsx,html}"
|
|
130
|
+
elements:
|
|
131
|
+
- ef-timegroup
|
|
132
|
+
- Timegroup
|
|
107
133
|
attribute: "mode"
|
|
108
134
|
pattern: "^(sequence|fixed|contain|fit)$"
|
|
109
135
|
- id: VIDEO-07
|
|
110
136
|
rule: fps must be a positive integer (default 30)
|
|
111
137
|
severity: warning
|
|
112
138
|
check:
|
|
113
|
-
kind:
|
|
114
|
-
glob: "compositions/**/*.html"
|
|
115
|
-
|
|
139
|
+
kind: attribute-pattern
|
|
140
|
+
glob: "compositions/**/*.{tsx,html}"
|
|
141
|
+
elements:
|
|
142
|
+
- ef-timegroup
|
|
143
|
+
- Timegroup
|
|
116
144
|
attribute: "fps"
|
|
117
145
|
pattern: "^[1-9]\\d*$"
|
|
118
146
|
- id: VIDEO-08
|
|
119
|
-
rule: loop attribute should only be used on the root
|
|
147
|
+
rule: loop attribute should only be used on the root Timegroup (no effect on render for nested groups)
|
|
120
148
|
severity: warning
|
|
121
149
|
check:
|
|
122
150
|
kind: file-not-contains
|
|
123
|
-
glob: "compositions/**/*.html"
|
|
124
|
-
negatedPattern: "<ef-timegroup[^>]*loop[^>]*>[\\s\\S]*<ef-timegroup[^>]*loop"
|
|
151
|
+
glob: "compositions/**/*.{tsx,html}"
|
|
152
|
+
negatedPattern: "<(Timegroup|ef-timegroup)[^>]*loop[^>]*>[\\s\\S]*<(Timegroup|ef-timegroup)[^>]*loop"
|
|
125
153
|
- id: VIDEO-09
|
|
126
154
|
rule: offset values must be valid CSS time strings (e.g. 0.5s, 3s, 500ms)
|
|
127
155
|
severity: warning
|
|
128
156
|
check:
|
|
129
|
-
kind:
|
|
130
|
-
glob: "compositions/**/*.html"
|
|
131
|
-
|
|
157
|
+
kind: attribute-pattern
|
|
158
|
+
glob: "compositions/**/*.{tsx,html}"
|
|
159
|
+
elements:
|
|
160
|
+
- ef-timegroup
|
|
161
|
+
- Timegroup
|
|
132
162
|
attribute: "offset"
|
|
133
163
|
pattern: "^\\d+(\\.\\d+)?(s|ms)$"
|
|
134
164
|
workspace:
|
|
@@ -331,34 +361,118 @@ firstWorkspace:
|
|
|
331
361
|
"check": "editframe check"
|
|
332
362
|
}
|
|
333
363
|
}
|
|
334
|
-
- path: composition.
|
|
364
|
+
- path: composition.tsx
|
|
335
365
|
content: |
|
|
336
|
-
|
|
337
|
-
Editframe
|
|
338
|
-
This file declares a video composition using
|
|
366
|
+
/*
|
|
367
|
+
Editframe React composition — my-first-video
|
|
368
|
+
This file declares a video composition using @editframe/react components.
|
|
339
369
|
Run `editframe preview` to preview, `editframe render` to produce output.
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
370
|
+
*/
|
|
371
|
+
import { TimelineRoot, Timegroup, Video, Text, Audio, Captions } from "@editframe/react";
|
|
372
|
+
|
|
373
|
+
export default function Composition() {
|
|
374
|
+
return (
|
|
375
|
+
<TimelineRoot>
|
|
376
|
+
<Timegroup duration="10s">
|
|
377
|
+
<Video src="assets/background.mp4" fit="contain" duration="10s" />
|
|
378
|
+
<Text
|
|
379
|
+
text="Hello, Editframe!"
|
|
380
|
+
x="50%"
|
|
381
|
+
y="50%"
|
|
382
|
+
fontSize="48px"
|
|
383
|
+
color="white"
|
|
384
|
+
textAlign="center"
|
|
385
|
+
duration="5s"
|
|
386
|
+
/>
|
|
387
|
+
<Audio src="assets/narration.mp3" />
|
|
388
|
+
<Captions src="assets/captions.vtt" />
|
|
389
|
+
</Timegroup>
|
|
390
|
+
</TimelineRoot>
|
|
391
|
+
);
|
|
392
|
+
}
|
|
363
393
|
install:
|
|
364
|
-
- pnpm add -D vitest
|
|
394
|
+
- pnpm add -D @editframe/react @editframe/vite-plugin react react-dom typescript @types/react @types/react-dom vite @vitejs/plugin-react tailwindcss @tailwindcss/vite vitest
|
|
395
|
+
templates:
|
|
396
|
+
- id: react
|
|
397
|
+
default: true
|
|
398
|
+
firstWorkspace:
|
|
399
|
+
path: compositions/my-first-video
|
|
400
|
+
files:
|
|
401
|
+
- path: package.json
|
|
402
|
+
content: |
|
|
403
|
+
{
|
|
404
|
+
"name": "my-first-video",
|
|
405
|
+
"version": "0.1.0",
|
|
406
|
+
"private": true,
|
|
407
|
+
"type": "module",
|
|
408
|
+
"scripts": {
|
|
409
|
+
"preview": "editframe preview",
|
|
410
|
+
"render": "editframe render -o dist/my-first-video.mp4",
|
|
411
|
+
"check": "editframe check"
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
- path: composition.tsx
|
|
415
|
+
content: |
|
|
416
|
+
/*
|
|
417
|
+
Editframe React composition — my-first-video
|
|
418
|
+
This file declares a video composition using @editframe/react components.
|
|
419
|
+
Run `editframe preview` to preview, `editframe render` to produce output.
|
|
420
|
+
*/
|
|
421
|
+
import { TimelineRoot, Timegroup, Video, Text, Audio, Captions } from "@editframe/react";
|
|
422
|
+
|
|
423
|
+
export default function Composition() {
|
|
424
|
+
return (
|
|
425
|
+
<TimelineRoot>
|
|
426
|
+
<Timegroup duration="10s">
|
|
427
|
+
<Video src="assets/background.mp4" fit="contain" duration="10s" />
|
|
428
|
+
<Text
|
|
429
|
+
text="Hello, Editframe!"
|
|
430
|
+
x="50%"
|
|
431
|
+
y="50%"
|
|
432
|
+
fontSize="48px"
|
|
433
|
+
color="white"
|
|
434
|
+
textAlign="center"
|
|
435
|
+
duration="5s"
|
|
436
|
+
/>
|
|
437
|
+
<Audio src="assets/narration.mp3" />
|
|
438
|
+
<Captions src="assets/captions.vtt" />
|
|
439
|
+
</Timegroup>
|
|
440
|
+
</TimelineRoot>
|
|
441
|
+
);
|
|
442
|
+
}
|
|
443
|
+
install:
|
|
444
|
+
- pnpm add -D @editframe/react @editframe/vite-plugin react react-dom typescript @types/react @types/react-dom vite @vitejs/plugin-react tailwindcss @tailwindcss/vite vitest
|
|
445
|
+
- id: html
|
|
446
|
+
firstWorkspace:
|
|
447
|
+
path: compositions/my-first-video
|
|
448
|
+
files:
|
|
449
|
+
- path: package.json
|
|
450
|
+
content: |
|
|
451
|
+
{
|
|
452
|
+
"name": "my-first-video",
|
|
453
|
+
"version": "0.1.0",
|
|
454
|
+
"private": true,
|
|
455
|
+
"type": "module",
|
|
456
|
+
"scripts": {
|
|
457
|
+
"preview": "editframe preview",
|
|
458
|
+
"render": "editframe render -o dist/my-first-video.mp4",
|
|
459
|
+
"check": "editframe check"
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
- path: index.html
|
|
463
|
+
content: |
|
|
464
|
+
<!--
|
|
465
|
+
Editframe HTML composition — my-first-video
|
|
466
|
+
This file declares a video composition using Editframe web components.
|
|
467
|
+
Run `editframe preview` to preview, `editframe render` to produce output.
|
|
468
|
+
-->
|
|
469
|
+
<ef-timeline duration="10s">
|
|
470
|
+
<ef-timegroup duration="10s" mode="contain">
|
|
471
|
+
<ef-video src="assets/background.mp4" fit="contain" duration="10s"></ef-video>
|
|
472
|
+
<ef-text text="Hello, Editframe!" x="50%" y="50%" font-size="48px" color="white" text-align="center" duration="5s"></ef-text>
|
|
473
|
+
<ef-audio src="assets/narration.mp3"></ef-audio>
|
|
474
|
+
<ef-captions src="assets/captions.vtt"></ef-captions>
|
|
475
|
+
</ef-timegroup>
|
|
476
|
+
</ef-timeline>
|
|
477
|
+
install:
|
|
478
|
+
- pnpm add -D vitest
|