@topy-ai/maggie 0.8.4 → 0.8.5

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/README-zh-TW.md CHANGED
@@ -143,7 +143,7 @@ structure drift 或重複 treatment product 時 fail closed。
143
143
  deployment、memory、feedback 和 MaggieDash。內容先 draft/review,外部寫入、
144
144
  publish 與 production deployment 需要明確確認。
145
145
 
146
- 目前 npm 版本為 `0.8.4`,將技能庫擴展成完整的「一人用 AI 跑一家公司」C-suite,新增八條職能線:maggie-sales(CRM 中立的銷售管線)、maggie-finance(只解釋的 CFO 指標,含確定性 maggie_finance.py 計算器)、maggie-support(面向客戶的客戶成功)、maggie-product(路線圖 + 預註冊實驗)、maggie-fundraising(pitch deck、data room、投資人更新)、maggie-legal(ToS/隱私/DPA/SOC2 readiness)、maggie-monetization(定價/paywall/dunning,金錢操作需人工批准)、maggie-orchestrator(CEO 編排層:將目標拆成帶審批門的 mission 分派到各職能線,含 maggie_orchestrator.py 規劃器)。先前 0.8.3 將 cmo.so/www 開發經驗沉澱進技能庫:新增兩個技能 maggie-skill-authoring(依 catalog 與 MCP 工具白名單撰寫/校驗社區營銷 playbook 技能)與 maggie-feedback-triage(反饋的團隊接收端:決策/定級/分派、PRD + issue 流程、24/7 隊列守護);新增多個 reference(OAuth PKCE 登入、Expo 約定與 Router 骨架、MCP evals 測試框架、conversation cards、WordPress→Firebase 認證遷移手冊);並增補 maggie-assistant-tools(tool≤user 每輪工具過濾、agent loop 安全不變量、preview-only 橋接代理、MCP resources/prompts、注解加固、CLI 與 ChatGPT 插件打包)、maggie-auth-reference(自清理登入測試套件、自簽單次令牌)、maggie-mobile-app(OTA 開機拉取、live==built 部署守衛)、maggie-deployment(pm2 單包發布、live-hash 校驗)與 maggie-ops(template-as-code 郵件同步)。先前 0.8.2 新增 maggie-spirit(為 AI 品牌生成平面像素 spirit/sprite 系統)與 goal-led AI agent 設計參考;0.8.0 為安全優化 roadmap(scan、image-patch、標頭評分、SSVC、GDPR 日誌規則、新 MCP 工具)。先前 0.8.0 為安全優化 roadmap(scan、image-patch、標頭評分、SSVC、GDPR 日誌規則、新 MCP 工具),含 fix-plan 修補風險分級 T1–T4(判斷補丁是否安全套用)與 host-impact 補丁影響面量測(哪些服務需重啟、是否需重開機)、public-check、Maggie Security、batch 31 排程 agent routines、報告收件匣與無人值守 agent 限制、PHP runtime 盤點與主機鎖、pull 網站改寫、query 點子與社群佇列檢查,batch 30 MaggieDash 先裝核心、release privacy gate、feedback 備援、社群連結與圖片檢查、大量頁面產生與 app 檢查,batch 29 預約規則、部署、app QA、助理與社群功能,以及 batch 28 產品 app、assistant tools、mobile、product release、skills catalog 與 bridge host 功能、batch 26、27 feedback 修正與 idempotent `maggie update`與 Booking email-template 合約/CLI validator 同步。本版完成 2026-09-24 booking feedback batch:Calendar grid/free-slot entry 與 host modal focus-restoration evidence。本版新增 Starter marketplace provisioning plan;本版完成 feedback batches 22、23:加入 declarative browser interaction evidence、design markup/style/content-key gate、compiler source anchoring、entity double-escape protection、`update --help` read-only、noindex hypothetical indexability、可過期 baseline acknowledgement、DOM-only link extraction regression,以及 MaggieDash 0.2.10 的 content override、短期 browser session、CDN-safe public-session cache contracts。authentication 和 isolated dev server 仍由 host 負責。`maggie-booking` workflow、傳統 email/password、Stripe、Resend、public booking flow 及既有安全邊界維持不變;provider-bound video generation 與 transactional delivery 仍記錄在 issue #39,前一批延後功能仍在 issue #38,不會直接成為 active memory。0.7.33 記錄並審查一筆更正回饋;確認 0.7.32 已正確處理 batch index,沒有修改已驗證的 shared behavior。0.7.32 加入 feedback 一基索引支援、MaggieDash panel 的 source/freshness/error evidence、Consent Mode 與實際 write/no-op reconciliation、SEO baseline recapture、sitemap origin rebasing、content-diff scope、migration ledger reconciliation、deployment credential preflight、release provenance/runtime preflight、icon release gate、opt-in blog auto-publish gate,以及 least-privilege VPS deployer。也修復 top-level `maggie feedback` dispatcher parity。0.7.31 加入 update 差異摘要、atomic installer copy、subset install manifest merge,以及 inventory drift 時 doctor non-zero。0.7.30 補上 feedback tracking issue closeout gate 與 batch 14/15 audit ledger。0.7.29 修正 npm package landing page 使用英文 README;0.7.28 加入 versioned Gemini model policy、明確 fallback 與 provenance、bundled-first CLI
146
+ 目前 npm 版本為 `0.8.5`,採納兩個設計技能(改編自 MIT 的 `elayadesign/ai-design-skills`):maggie-landing-page(轉化策略 + 視覺系統紀律,具體數值為可被專案 DESIGN.md 覆蓋的預設值;由 maggie-design 生產與驗證)與 maggie-design-motion(靜態設計→像素級動畫 HTML 複刻→匯出 MP4 + GIF)。先前 0.8.4 將技能庫擴展成完整的「一人用 AI 跑一家公司」C-suite,新增八條職能線:maggie-sales(CRM 中立的銷售管線)、maggie-finance(只解釋的 CFO 指標,含確定性 maggie_finance.py 計算器)、maggie-support(面向客戶的客戶成功)、maggie-product(路線圖 + 預註冊實驗)、maggie-fundraising(pitch deck、data room、投資人更新)、maggie-legal(ToS/隱私/DPA/SOC2 readiness)、maggie-monetization(定價/paywall/dunning,金錢操作需人工批准)、maggie-orchestrator(CEO 編排層:將目標拆成帶審批門的 mission 分派到各職能線,含 maggie_orchestrator.py 規劃器)。先前 0.8.3 將 cmo.so/www 開發經驗沉澱進技能庫:新增兩個技能 maggie-skill-authoring(依 catalog 與 MCP 工具白名單撰寫/校驗社區營銷 playbook 技能)與 maggie-feedback-triage(反饋的團隊接收端:決策/定級/分派、PRD + issue 流程、24/7 隊列守護);新增多個 reference(OAuth PKCE 登入、Expo 約定與 Router 骨架、MCP evals 測試框架、conversation cards、WordPress→Firebase 認證遷移手冊);並增補 maggie-assistant-tools(tool≤user 每輪工具過濾、agent loop 安全不變量、preview-only 橋接代理、MCP resources/prompts、注解加固、CLI 與 ChatGPT 插件打包)、maggie-auth-reference(自清理登入測試套件、自簽單次令牌)、maggie-mobile-app(OTA 開機拉取、live==built 部署守衛)、maggie-deployment(pm2 單包發布、live-hash 校驗)與 maggie-ops(template-as-code 郵件同步)。先前 0.8.2 新增 maggie-spirit(為 AI 品牌生成平面像素 spirit/sprite 系統)與 goal-led AI agent 設計參考;0.8.0 為安全優化 roadmap(scan、image-patch、標頭評分、SSVC、GDPR 日誌規則、新 MCP 工具)。先前 0.8.0 為安全優化 roadmap(scan、image-patch、標頭評分、SSVC、GDPR 日誌規則、新 MCP 工具),含 fix-plan 修補風險分級 T1–T4(判斷補丁是否安全套用)與 host-impact 補丁影響面量測(哪些服務需重啟、是否需重開機)、public-check、Maggie Security、batch 31 排程 agent routines、報告收件匣與無人值守 agent 限制、PHP runtime 盤點與主機鎖、pull 網站改寫、query 點子與社群佇列檢查,batch 30 MaggieDash 先裝核心、release privacy gate、feedback 備援、社群連結與圖片檢查、大量頁面產生與 app 檢查,batch 29 預約規則、部署、app QA、助理與社群功能,以及 batch 28 產品 app、assistant tools、mobile、product release、skills catalog 與 bridge host 功能、batch 26、27 feedback 修正與 idempotent `maggie update`與 Booking email-template 合約/CLI validator 同步。本版完成 2026-09-24 booking feedback batch:Calendar grid/free-slot entry 與 host modal focus-restoration evidence。本版新增 Starter marketplace provisioning plan;本版完成 feedback batches 22、23:加入 declarative browser interaction evidence、design markup/style/content-key gate、compiler source anchoring、entity double-escape protection、`update --help` read-only、noindex hypothetical indexability、可過期 baseline acknowledgement、DOM-only link extraction regression,以及 MaggieDash 0.2.10 的 content override、短期 browser session、CDN-safe public-session cache contracts。authentication 和 isolated dev server 仍由 host 負責。`maggie-booking` workflow、傳統 email/password、Stripe、Resend、public booking flow 及既有安全邊界維持不變;provider-bound video generation 與 transactional delivery 仍記錄在 issue #39,前一批延後功能仍在 issue #38,不會直接成為 active memory。0.7.33 記錄並審查一筆更正回饋;確認 0.7.32 已正確處理 batch index,沒有修改已驗證的 shared behavior。0.7.32 加入 feedback 一基索引支援、MaggieDash panel 的 source/freshness/error evidence、Consent Mode 與實際 write/no-op reconciliation、SEO baseline recapture、sitemap origin rebasing、content-diff scope、migration ledger reconciliation、deployment credential preflight、release provenance/runtime preflight、icon release gate、opt-in blog auto-publish gate,以及 least-privilege VPS deployer。也修復 top-level `maggie feedback` dispatcher parity。0.7.31 加入 update 差異摘要、atomic installer copy、subset install manifest merge,以及 inventory drift 時 doctor non-zero。0.7.30 補上 feedback tracking issue closeout gate 與 batch 14/15 audit ledger。0.7.29 修正 npm package landing page 使用英文 README;0.7.28 加入 versioned Gemini model policy、明確 fallback 與 provenance、bundled-first CLI
147
147
  dispatch、`maggie --version`、feedback batch review 聚合與重複偵測、marketplace enrichment evidence、booking
148
148
  worker/resolver evidence,以及 read-only migration preflight。它也包含 host-owned mobile app surface contract、signed-in
149
149
  camera-state QA、直接 Astro route resolution、correlated feedback batch,以及
package/README.md CHANGED
@@ -87,9 +87,9 @@ Then invoke the installed skills from your coding agent, for example:
87
87
 
88
88
  Maggie keeps the existing project foundation and asks for decisions before
89
89
  shared routes, analytics, or publishing boundaries change. The current
90
- package ships 34 installable skills and a local-first MaggieDash foundation.
90
+ package ships 36 installable skills and a local-first MaggieDash foundation.
91
91
 
92
- This package is `0.8.4` — it expands the library into a full "one person runs a company with AI" C-suite with eight new function lanes: `maggie-sales` (CRM-neutral pipeline), `maggie-finance` (explain-only CFO metrics + a deterministic `maggie_finance.py` calculator), `maggie-support` (customer success), `maggie-product` (roadmap + pre-registered experiments), `maggie-fundraising` (deck, data room, investor updates), `maggie-legal` (ToS/privacy/DPA/SOC2 readiness), `maggie-monetization` (pricing/paywalls/dunning; money actions human-approved), and `maggie-orchestrator` (the CEO layer that decomposes a goal into gated missions across the lanes, with a `maggie_orchestrator.py` planner). `0.8.3` folded cmo.so/www development learnings in (maggie-skill-authoring, maggie-feedback-triage, and mobile/MCP/auth references); `0.8.2` added `maggie-spirit`; `0.8.0` was the security optimization roadmap.
92
+ This package is `0.8.5` — it adopts two design skills (adapted, MIT, from `elayadesign/ai-design-skills`): `maggie-landing-page` (conversion strategy + a visual-system discipline whose values defer to the project's DESIGN.md) and `maggie-design-motion` (static design → pixel-exact animated HTML replica → MP4 + GIF export). `0.8.4` expanded the library into a full "one person runs a company with AI" C-suite with eight new function lanes: `maggie-sales` (CRM-neutral pipeline), `maggie-finance` (explain-only CFO metrics + a deterministic `maggie_finance.py` calculator), `maggie-support` (customer success), `maggie-product` (roadmap + pre-registered experiments), `maggie-fundraising` (deck, data room, investor updates), `maggie-legal` (ToS/privacy/DPA/SOC2 readiness), `maggie-monetization` (pricing/paywalls/dunning; money actions human-approved), and `maggie-orchestrator` (the CEO layer that decomposes a goal into gated missions across the lanes, with a `maggie_orchestrator.py` planner). `0.8.3` folded cmo.so/www development learnings in (maggie-skill-authoring, maggie-feedback-triage, and mobile/MCP/auth references); `0.8.2` added `maggie-spirit`; `0.8.0` was the security optimization roadmap.
93
93
 
94
94
  The 0.7.59 release made `maggie security host-audit` (the deep
95
95
  lynis audit over SSH) robust on hosts where a storage test can stall: lynis runs
@@ -46,6 +46,10 @@
46
46
  "name": "maggie-design",
47
47
  "description": "Design authorized interior pages, review rendered responsive layouts, or explicitly rebrand a packaged homepage/template. Use rebrand only with a named source brand and target brand."
48
48
  },
49
+ {
50
+ "name": "maggie-design-motion",
51
+ "description": "Turn a static design (a Figma frame, screenshot, dashboard, card set, app screen, or a UI on a photo) into a pixel-exact HTML replica that loads from an empty state, then has every visual act out what it does in a seamless loop, and export an MP4 plus GIFs. Use when asked to animate a design, a Figma link, a screenshot, UI cards, a dashboard or hero image, or to make a showcase loop, motion mockup, or a video/GIF of a design. Also for bento/feature cards on a landing page."
52
+ },
49
53
  {
50
54
  "name": "maggie-feedback",
51
55
  "description": "Collect, review, and explicitly submit privacy-safe feedback about a Maggie skill run, workflow result, bug, or feature request."
@@ -62,6 +66,10 @@
62
66
  "name": "maggie-fundraising",
63
67
  "description": "Fundraising and investor relations for a founder - draft a pitch deck and narrative, assemble a data room, write investor updates, keep cap-table and round hygiene, and prepare SEIS/EIS materials. Use when the user asks to prepare to raise, build a deck or data room, write an investor update, or organise round documents. Factual only; not securities, investment, legal, or tax advice. Pairs with maggie-finance and the TOPY/CEO tools."
64
68
  },
69
+ {
70
+ "name": "maggie-landing-page",
71
+ "description": "Build a high-converting landing page - intake, page structure, layout selection, conversion copy, SEO/AEO, plus a visual-system discipline (typography, spacing, radius, backgrounds, hero, icons, motion) whose specific values are defaults the project's DESIGN.md overrides. Use when building, editing, styling, or writing copy for a landing page, marketing page, or a page section meant to convert. Designs the page; maggie-design produces and validates it."
72
+ },
65
73
  {
66
74
  "name": "maggie-legal",
67
75
  "description": "Draft and maintain the routine legal and compliance documents a small company needs - terms of service, privacy policy, cookie/consent notice, DPA, and a SOC2/ISO readiness checklist - jurisdiction-aware and from reviewed templates. Use when the user asks for ToS/privacy/cookie/DPA documents, GDPR/CCPA compliance, or a security-compliance readiness map. Starting points for a qualified lawyer to review; not legal advice. Pairs with maggie-security."
@@ -0,0 +1,289 @@
1
+ ---
2
+ name: maggie-design-motion
3
+ description: Turn a static design (a Figma frame, screenshot, dashboard, card set, app screen, or a UI on a photo) into a pixel-exact HTML replica that loads from an empty state, then has every visual act out what it does in a seamless loop, and export an MP4 plus GIFs. Use when asked to animate a design, a Figma link, a screenshot, UI cards, a dashboard or hero image, or to make a showcase loop, motion mockup, or a video/GIF of a design. Also for bento/feature cards on a landing page.
4
+ metadata:
5
+ version: 0.1.0
6
+ ---
7
+
8
+ # Maggie Design Motion
9
+
10
+ A showcase animation is not a redesign. The viewer must see **the exact design**,
11
+ and see that **it is alive**: exact frame -> empty state -> smooth load -> every
12
+ visual acts out its story -> seamless repeat.
13
+
14
+ This is the design-replica + video pipeline. For deterministic brand sprites and
15
+ avatars use [`maggie-spirit`](../maggie-spirit/SKILL.md); when the animation lives
16
+ on a landing page, pair with [`maggie-landing-page`](../maggie-landing-page/SKILL.md)
17
+ and produce through [`maggie-design`](../maggie-design/SKILL.md).
18
+
19
+ Follow the [Maggie Memory Hook](../../references/memory-hook.md) at invocation and
20
+ completion. Timing/distance/curve values live in **Make it yours** (defaults;
21
+ override there, never ad hoc). Adapted from `elayadesign/ai-design-skills` (MIT);
22
+ see Credits.
23
+
24
+ ## Two contexts (decide first)
25
+
26
+ | | Showcase | Website |
27
+ |---|---|---|
28
+ | Request | "animate this design", a Figma link alone | building/editing a landing page/site |
29
+ | Animated | the whole frame | only sections with a visual, plus the hero |
30
+ | Start | page load, from empty | when the section scrolls into view, once |
31
+ | After intro | stories run, frame dissolves, cycle repeats | stories run while on screen; no dissolve |
32
+ | Text | exported layers (pixel-exact) | live HTML text (SEO/a11y); only visuals exported |
33
+ | Deliver | page + MP4 + website GIF + 800x500 GIF | the animated sections in the site; exports on request |
34
+
35
+ Inside a site's codebase assume website; with only a design assume showcase; if
36
+ still unclear, ask once. On a website, animate the hero (a small 6px-rise + blur
37
+ appear, reading order, ~1.2s, once on load) and bento/feature cards (intro on
38
+ scroll + a story loop on each visual); leave text-only sections to the page's normal
39
+ scroll reveal. Trigger with `IntersectionObserver`, pause stories off screen,
40
+ respect `prefers-reduced-motion`.
41
+
42
+ # Part A - Fidelity (the finished still must be indistinguishable from the source)
43
+
44
+ ## A1. Intake (one batch)
45
+
46
+ Context (showcase/website); source (a Figma link with a node id is best; a
47
+ screenshot works but every layer is rebuilt from pixels); layout (app frame vs
48
+ separate cards, decided from the tree); background (a photo/texture must stay
49
+ exact); which parts are visuals that should act out a story; deliverables; camera
50
+ (default none). State any assumption in one line and continue.
51
+
52
+ ## A2. Source of truth
53
+
54
+ - **Figma REST API** with a personal token. **Read the token from a secure store
55
+ (env var or OS keychain); never print, echo, paste, or commit it.**
56
+ `GET /v1/files/:key/nodes?ids=:node&geometry=paths` for the tree/bounds/fills/
57
+ effects/radii; `GET /v1/images/:key?ids=:node&format=png&scale=2` for the
58
+ reference frame; note the frame origin (layer pos = absolute bounds - origin);
59
+ retry CDN downloads and size-check each PNG.
60
+ - **Screenshot / flat image:** find the pixel ratio (image width / common frame
61
+ widths 1440/1280/1920/390, checked against ~14-18px body text). Measure in
62
+ screenshot pixels (pixel `i` centre is `i+0.5`). Make each element by the first
63
+ fitting method: rebuild surfaces/cards/bars in CSS (sample fills as a median
64
+ patch; trace gradients per 10-20px; fit shadows against the edge profile); keep
65
+ website text live HTML; for showcase text, match the font and overlay, else lift
66
+ it out of the pixels (`alpha = (bg - px)/(bg - fg)` per pixel against the rebuilt
67
+ surface); redraw simple icons as SVG; trace lines/charts as SVG; crop only photos/
68
+ avatars/logos to their radius. **What is hidden stays hidden - never invent it
69
+ silently.** Tell the user, in a short list, what was rebuilt / lifted / cropped /
70
+ not separable / guessed before animating.
71
+
72
+ ## A3. Layer export (Figma)
73
+
74
+ Export every moving element as its own PNG at 3x (batched 20-25 ids), placed from
75
+ `absoluteRenderBounds` (text always) or the overhang formula / `strokeGeometry`
76
+ bounds for uneven overhang. Keep Figma z-order; render frame strokes as an overlay
77
+ above clipped content; rebuild a container in CSS when its children must move
78
+ separately (so the API does not bake them in); map Figma drop-shadow blur `R` to a
79
+ CSS `box-shadow` blur `R` (or `filter: drop-shadow()` ~`R/2` on a group); a group
80
+ shadow is the shadow of the union; skip hidden layers. For a line that draws on,
81
+ write its centerline as an SVG mask over the exported PNG and animate
82
+ `stroke-dashoffset` 1 -> 0 (`pathLength="1"`).
83
+
84
+ ## A4. Background (sacred)
85
+
86
+ When the design sits on a photo/texture, the background is part of the design: it
87
+ never changes, moves, blurs, scales, fades, or recolours, in any variant. Export
88
+ the original image (`GET /v1/files/:key/images`) and apply the fill's scale mode /
89
+ `imageTransform` as CSS. Frosted panels (`backdrop-filter: blur()`) must be a
90
+ sibling above the background with `transform: translateZ(0)` + a `z-index` so
91
+ headless Chrome renders them. Verify the background region by PSNR (aim > 45 dB). If
92
+ you cannot reproduce it, say so before building - never swap in a flat colour
93
+ silently.
94
+
95
+ ## A5. Layout: app frame or separate cards
96
+
97
+ - **App frame (joined surfaces):** sidebar + body etc. are present, opaque, and
98
+ still from the first frame; only the elements inside them load. Keep Figma
99
+ stacking where surfaces meet.
100
+ - **Separate cards (bento/widgets):** the cards themselves rise in (the `card` kind
101
+ in B2), staggered in reading order, contents following; the empty state is the
102
+ background alone.
103
+ - Both: each container clips its own contents to its exact radii; image-shaped
104
+ surfaces get an average-colour placeholder; nested content loads like any element.
105
+
106
+ ## A6. Page architecture (showcase)
107
+
108
+ One self-contained HTML file: a fixed-size stage at the frame's exact size, scaled
109
+ to fit; images inline as base64 (deduped); wait for `<img>` decode. Modes: `?still`
110
+ (exact frame, no motion, also reduced-motion), `?loop` (repeats like exports),
111
+ `?capture` (rAF off; exposes `window.__start()`, `__tick(dt)`, loop time `__lt` so
112
+ the recorder drives the clock). One JS clock (`requestAnimationFrame`) drives all
113
+ time-based effects from loop time, never wall clock. On a website, build inside the
114
+ site's code instead; the clock/units/modes still apply per section.
115
+
116
+ ## A7. Verify the still
117
+
118
+ Render `?still` at 2x and compare with the reference before any motion: PSNR whole
119
+ frame and per container after a light blur (aim > 35 dB overall, > 30 dB per
120
+ container; text-heavy containers sit near 30 dB); look at a blurred amplified diff
121
+ for structural errors (misplaced glow, wrong stacking, missing stroke); for
122
+ screenshot sources also score the rebuilt surfaces with lifted regions masked out.
123
+ Fix structure, not sub-pixel antialiasing.
124
+
125
+ # Part B - Motion system
126
+
127
+ ## B1-B3. Start empty, load in, bars
128
+
129
+ The first frame of every load/export is the empty state (never the finished frame).
130
+ Elements **rise from below and resolve blur -> sharp**, staggered. Loading kinds:
131
+ `card` (whole separate cards, with shadow), `up`/`down`/`left` (text, bars, rows,
132
+ sidebars), `pop` (icons/badges/avatars from their own centre), `photo` (skeleton
133
+ shimmer then blur -> sharp), `wipe` (left-to-right `clip-path` reveal in pixels on
134
+ the full-stage unit), `line`/`grow` (draw from the start edge), `donut` (conic
135
+ sweep), `tray`/`rise` (slide up inside the container), `fade` (covered layers).
136
+ Containers load in reading order 80-90ms apart; items 30-80ms. Never `scale(0)` an
137
+ object (only lines/bars grow from zero). Data bars/meters fill like progress
138
+ (left-to-right `clip-path`, 0.7-1.1s). **Never add loading lines not in the design.**
139
+
140
+ ## B4. Story loops (the main act)
141
+
142
+ The intro is the opening; the main act is every visual **acting out what it does**,
143
+ on a loop - a lead list receives leads, a chart is read, a calendar finds a slot, a
144
+ prompt is typed. Write each story in one sentence first. Rules: start and end on the
145
+ exact design (at rest the frame equals `?still`); use the design's own elements;
146
+ change text only when it is the point (counters need live text in the matching font;
147
+ typing reveals the exported text layer glyph by glyph, 45-70ms, with a blinking
148
+ caret); obvious not busy (a clear action every 1-2s); readable at the 800x500 GIF
149
+ size; offset cards so attention travels in reading order; one story per card, 3-8s,
150
+ may repeat. Build stories from eased keyframe tracks on the JS clock:
151
+
152
+ ```js
153
+ // [[time, value], ...] eased per segment; values may be numbers or arrays
154
+ function track(keys, t, ease = easeInOut) {
155
+ if (t <= keys[0][0]) return keys[0][1];
156
+ for (let i = 1; i < keys.length; i++) {
157
+ const [t1, v1] = keys[i], [t0, v0] = keys[i - 1];
158
+ if (t <= t1) {
159
+ const k = ease(Math.min(1, (t - t0) / (t1 - t0 || 1)));
160
+ return Array.isArray(v0) ? v0.map((v, j) => v + (v1[j] - v) * k) : v0 + (v1 - v0) * k;
161
+ }
162
+ }
163
+ return keys[keys.length - 1][1];
164
+ }
165
+ ```
166
+
167
+ Accents sit on top of stories (pulse ring, heartbeat, gentle bob, sheen sweep,
168
+ skeleton glimmer), starting after the intro lands (~2.4s).
169
+
170
+ ## B5-B8. Cycle, easing, camera, perf
171
+
172
+ Showcase cycle (default): build in 0->2.4s, stories 2.4->11.0s, dissolve
173
+ 11.0->11.6s, empty beat 11.6->12.0s; the story phase holds at least one full story
174
+ of every card; dissolve back to the empty state (app frame keeps its joined
175
+ surfaces, background never dissolves); reset every JS value too, so the end frame
176
+ equals the start frame. On a website there is no cycle (intro once on scroll,
177
+ stories until off screen). Easing defaults: `--e` `cubic-bezier(0.16,1,0.3,1)`
178
+ (entrance transforms ~1.05s), `--e2` `cubic-bezier(0.33,1,0.68,1)` (opacity/blur
179
+ 0.7-0.8s), `--io` `cubic-bezier(0.65,0,0.35,1)` (wipes/fills/sweeps), `linear` only
180
+ for constant motion. No zoom/pan unless asked (then only the app frame scales, the
181
+ background never moves). Animate `transform`/`opacity`/`filter`/`clip-path` only,
182
+ never `top`/`left`/`width`/`height`; keep animated blur <= 14px; reduced motion
183
+ renders the still.
184
+
185
+ ## B9. Motion checks (before encoding, on the recorded frames)
186
+
187
+ - **Overflow:** build a mask from the page's real container shapes (exact radii,
188
+ grown 2px). App frame: every pixel outside the joined surfaces equals the empty
189
+ first frame (PSNR inf). Separate cards: during stories, every pixel outside the
190
+ cards (and their shadows) equals `?still`.
191
+ - **Seam:** the first export frame equals the frame one cycle later.
192
+ - **Empty beat:** every empty-beat frame equals the frame before `__start` (catches
193
+ JS state that failed to reset).
194
+ - **Rest:** the last frame before the dissolve equals the landed frame (PSNR inf),
195
+ proving every story returned to the design.
196
+ - **Contact sheet:** tile key moments and look for overflow, ghosting, pops, and
197
+ stories too timid to notice.
198
+
199
+ # Part C - Recording and export
200
+
201
+ ## C1. Deterministic capture (never real-time screen recording)
202
+
203
+ Step a fake clock and screenshot every frame. Three details make the loop smooth
204
+ and the seam clean (all in the snippet): whole-millisecond steps that average
205
+ 1000/60; `__start()` inside the same evaluate as the seek; the page clock advances
206
+ through `__tick`, never rAF.
207
+
208
+ ```js
209
+ await page.clock.install({ time: 0 });
210
+ await page.goto(url + '?capture', { waitUntil: 'load' });
211
+ await page.evaluate(() => document.fonts.ready);
212
+ await page.clock.pauseAt(10000);
213
+ for (let i = 0; i < frames; i++) {
214
+ const dt = Math.round((i + 1) * 1000 / 60) - Math.round(i * 1000 / 60);
215
+ await page.clock.runFor(dt);
216
+ await page.evaluate(([i, PRE, dt]) => {
217
+ if (i === PRE) window.__start();
218
+ if (i >= PRE) window.__tick(dt / 1000);
219
+ const now = performance.now();
220
+ for (const a of document.getAnimations()) { a.__m ??= window.__mark; a.pause(); a.currentTime = Math.max(0, now - a.__m); }
221
+ }, [i, PRE, dt]);
222
+ await page.screenshot({ path: `${out}/${String(i).padStart(5, '0')}.png` });
223
+ }
224
+ ```
225
+
226
+ `PRE` is ~15 settle frames before the start. Viewport = frame size;
227
+ `deviceScaleFactor = min(1920/W, 1200/H)`; the export window starts at frame
228
+ `PRE-1` (loop time 0) and spans `cycle x 60` frames, recording ~10 past it for the
229
+ seam check.
230
+
231
+ ## C2. Formats
232
+
233
+ - `<name>-x.mp4` - H.264, `yuv420p`, 60fps, CRF 14-15, preset slow, `+faststart`,
234
+ max 1920x1200, even dimensions.
235
+ - `<name>-loop.gif` - 960px wide, 15-20fps, ~2-3MB, for the website.
236
+ - `<name>-800x500.gif` - always delivered; crop to content at 1.6:1 (or fit + pad
237
+ with the page background), 20fps (12 if heavy). Keep bayer dithering whenever a
238
+ photo is in frame.
239
+
240
+ ```bash
241
+ ffmpeg -start_number $A -framerate 60 -i frames/%05d.png -frames:v $N \
242
+ -vf "crop=trunc(iw/2)*2:trunc(ih/2)*2" -c:v libx264 -preset slow -crf 15 \
243
+ -pix_fmt yuv420p -movflags +faststart name-x.mp4
244
+ ```
245
+
246
+ # Make it yours (defaults; edit here, never inline)
247
+
248
+ Rise 10px (`up`), 8px (`down`/`left`); entrance blur 4px (photos 14px); pop scale
249
+ 0.82-0.88; transform 1.05s `--e`; opacity/blur 0.7-0.8s `--e2`; wipe 0.7s (slow bars
250
+ 1.1s) `--io`; card rise 24px + `scale(0.985)` + `blur(6px)`; website hero appear 6px
251
+ rise + 2px blur, 50-70ms stagger, ~1.2s; container stagger 80-90ms; typing 45-70ms/
252
+ glyph; story start 2.4s; story length 3-8s; cycle 12s; MP4 60fps CRF 15; GIFs 960px
253
+ and 800x500 at 20fps.
254
+
255
+ # Output format
256
+
257
+ Before building: context (showcase/website, with per-section mapping on a website);
258
+ layout (app frame + static surfaces, or separate cards); background (kept exactly or
259
+ what cannot be reproduced); choreography (load order + kind per group); stories (one
260
+ sentence per visual + accents); cycle (length + phases). After building: still
261
+ fidelity (overall + worst-surface PSNR); overflow + seam results; the files with
262
+ size/dimensions/fps/duration; anything not reproduced exactly, named plainly.
263
+
264
+ # Guardrails
265
+
266
+ - The Figma token is read from a secure store and is **never printed, echoed,
267
+ pasted into chat, or committed**; do not store it in Maggie artifacts.
268
+ - Never fake fidelity: never animate the screenshot as one block, move crops that
269
+ carry their old background, or invent hidden areas silently. Report what was
270
+ rebuilt / lifted / cropped / guessed before animating.
271
+ - The background is sacred (A4); every variant keeps it.
272
+ - Local tools only (Figma REST is free, Playwright + ffmpeg run locally); no
273
+ third-party upload of the user's design.
274
+
275
+ # Related skills
276
+
277
+ - `maggie-spirit` - deterministic brand sprites/avatars (a different motion job).
278
+ - `maggie-landing-page` / `maggie-design` - where website motion lives and is
279
+ produced.
280
+
281
+ # Credits
282
+
283
+ Adapted (not transcribed) from
284
+ [`elayadesign/ai-design-skills`](https://github.com/elayadesign/ai-design-skills)
285
+ `design-to-motion` by Elaya (MIT), which adapts general motion rules from
286
+ [`emilkowalski/skills`](https://github.com/emilkowalski/skills),
287
+ [`Owl-Listener/designer-skills`](https://github.com/Owl-Listener/designer-skills),
288
+ and [`dylantarre/animation-principles`](https://github.com/dylantarre/animation-principles)
289
+ (all MIT). Defaults originate there.
@@ -0,0 +1,227 @@
1
+ ---
2
+ name: maggie-landing-page
3
+ description: Build a high-converting landing page - intake, page structure, layout selection, conversion copy, SEO/AEO, plus a visual-system discipline (typography, spacing, radius, backgrounds, hero, icons, motion) whose specific values are defaults the project's DESIGN.md overrides. Use when building, editing, styling, or writing copy for a landing page, marketing page, or a page section meant to convert. Designs the page; maggie-design produces and validates it.
4
+ metadata:
5
+ version: 0.1.0
6
+ ---
7
+
8
+ # Maggie Landing Page
9
+
10
+ A landing page is not a homepage. A homepage serves many intents; a landing page
11
+ wins one: **one offer -> one audience -> one primary action.** This skill decides
12
+ what the page says and how it looks; [`maggie-design`](../maggie-design/SKILL.md)
13
+ produces it and runs the responsive/icon/QA evidence gates, and
14
+ [`maggie-seo-geo`](../maggie-seo-geo/SKILL.md) owns the SEO/AEO content side.
15
+
16
+ Follow the [Maggie Memory Hook](../../references/memory-hook.md) at invocation and
17
+ completion.
18
+
19
+ **Values defer to the project.** The specific numbers and choices in Part B
20
+ (fonts, type scale, spacing, radii, colours, motion curves) are sensible
21
+ **defaults**. Precedence is: the user's explicit prompt, then the project's own
22
+ system (a `DESIGN.md`, token set, or brand - see `maggie-design` and the
23
+ artifact-design fundamentals), then these defaults. Never override a project's
24
+ established palette or type system with the defaults below; use them only to fill
25
+ gaps or when there is no system yet.
26
+
27
+ Adapted from `elayadesign/ai-design-skills` (MIT); see Credits.
28
+
29
+ # Part A - Strategy and structure
30
+
31
+ Work through A before B.
32
+
33
+ ## A1. Intake (ask once, in one batch, only what is missing)
34
+
35
+ - **Purpose:** the ONE primary action (trial, demo, buy, waitlist, download); the
36
+ exact offer; what counts as a conversion.
37
+ - **Audience:** the ICP; the problem they are solving; their top three objections;
38
+ the traffic source (ads/search/social/email); what they already know on arrival.
39
+ - **Proof/assets:** logos, testimonials, numbers, case studies; screenshots, demo,
40
+ product GIFs; guarantees and refund/cancel terms.
41
+ - **Constraints:** brand voice; design direction; mobile priority.
42
+
43
+ If the user cannot answer, make a reasonable assumption, state it in one line, and
44
+ continue. Do not stall the build.
45
+
46
+ ## A2. Page structure
47
+
48
+ **Above the fold (required):** headline (outcome + audience); subheadline
49
+ (the how + specificity); one primary CTA (verb + what they get); one proof signal
50
+ (logo strip, stat, short testimonial); hero visual.
51
+
52
+ **Mid page (the argument):** problem -> solution; three to five outcome-driven
53
+ benefits; a three-step "how it works"; social proof. Place the mandatory **tagline
54
+ reveal** (B8) here as its own moment, not stacked under the hero.
55
+
56
+ **Bottom (objection handling):** FAQ (six to twelve); risk reversal; a final CTA
57
+ identical to the top.
58
+
59
+ ## A3. Layout selection (pick one, say why)
60
+
61
+ | Type | Use when |
62
+ |---|---|
63
+ | A. Classic hero + sections | The product reads from a hero screenshot. Most common. |
64
+ | B. Long-form story | You must educate and overcome skepticism. |
65
+ | C. Minimal conversion page | High-intent traffic, or a short offer (download, waitlist). |
66
+ | D. Comparison page | Search intent includes alternatives ("X vs Y", "best for"). |
67
+
68
+ ## A4. Conversion rules
69
+
70
+ - **Match message to source** - mirror the ad/email promise and tone in the hero.
71
+ - **One primary CTA**; never competing CTAs above the fold.
72
+ - **Benefit first** - what the feature means for them, not what it does.
73
+ - **Be specific** - "cut weekly reporting from 4 hours to 15 minutes", not "save
74
+ time and streamline".
75
+ - **Reduce risk** - at least one of: free trial, free plan, no card, cancel
76
+ anytime, money-back.
77
+ - **Objections are a section, not a footnote**; put proof beside the claim it
78
+ supports.
79
+
80
+ ## A5. Copywriting
81
+
82
+ - **Headlines:** "{Outcome} without {pain}"; "The {category} for {audience}";
83
+ "Ship {result} in {time}".
84
+ - **Subheadline:** one or two sentences; what it is and who it is for.
85
+ - **CTA:** verb + what they get ("Start free trial", "Book a demo"), never "Learn
86
+ more" or "Submit".
87
+ - **Benefit bullets:** bold benefit, then proof/detail.
88
+
89
+ ## A6. Build order (section by section, never rebuild the whole page each pass)
90
+
91
+ Hero -> Benefits -> How it works -> Proof -> FAQ -> Final CTA. This keeps diffs
92
+ reviewable and is how `maggie-design` produces each band.
93
+
94
+ ## A7. SEO and AEO
95
+
96
+ `noindex` ad-only or time-bound pages; index evergreen offers where search intent
97
+ matches the promise, with a clear title + meta, internal links, and the FAQ in
98
+ plain Q&A (add FAQ schema if apt). Hand the SEO/AEO specifics to
99
+ [`maggie-seo-geo`](../maggie-seo-geo/SKILL.md).
100
+
101
+ ## A8. Pitfalls
102
+
103
+ Too many CTAs above the fold; vague value props; a feature list with no outcomes;
104
+ proof buried; mobile that breaks readability; no clear next step.
105
+
106
+ # Part B - Visual system (defaults; the project's DESIGN.md wins)
107
+
108
+ Resolve every visual value through a rule, never ad hoc. When the project has a
109
+ token system, use it; the values below are the starting defaults.
110
+
111
+ ## B1. Typography
112
+
113
+ - **Default fonts:** a clean geometric/grotesk (the upstream default set is Geist /
114
+ Manrope / Poppins, plus a mono only for code/numeric UI). Avoid defaulting to
115
+ Inter/Roboto/Arial. No italics in UI; one typeface per site unless asked; cap
116
+ weight at bold (no 900/black). The **project's font choice always wins.**
117
+ - **Copy:** no hyphens inside sentences (rewrite the phrase); no orphaned last-line
118
+ words (`text-wrap: balance` for headings, `pretty` for body).
119
+ - **Type scale:** snap every size to a defined scale step (the default is Tailwind's
120
+ scale); never leave arbitrary `text-[19px]`/`1.4rem`. Snap to the closest step
121
+ below, taking its paired line height.
122
+
123
+ ## B2. Spacing
124
+
125
+ Use one spacing token set (default: 0, 2, 4, 8, 12, 16, 24, 32, 40, 48, 64, 80,
126
+ 96 px); nothing between or outside it. Main buttons: 8px vertical / 12px horizontal
127
+ padding.
128
+
129
+ ## B3. Corner radius
130
+
131
+ Use the token radii. **Nested-radius formula** when a shape sits inside another and
132
+ the gap is under 32px: `inner = outer - gap`, applied only when the result is > 2px
133
+ (else leave square).
134
+
135
+ ## B4. Borders and backgrounds
136
+
137
+ Never border only one side of a card (all around or none). Backgrounds are flat -
138
+ no gradients (the one exception is gradient *text* on the hero heading). This is a
139
+ default; a project whose brand uses gradient surfaces overrides it.
140
+
141
+ ## B5. Hero
142
+
143
+ Hero heading may use a left-to-right text gradient (light->mid). Cap heading and
144
+ subheading width (default ~680px) and break lines at meaningful points, never
145
+ mid-phrase.
146
+
147
+ ## B6. Icons
148
+
149
+ Default to a consistent modern set (upstream: Phosphor / Solar / Iconamoon); avoid
150
+ Material by default. The project's icon set wins; validate it with `maggie-design`'s
151
+ icon inventory + glyph-render gates before release.
152
+
153
+ ## B7. Motion
154
+
155
+ Weighted, decelerating motion; never a browser-default curve. Default base curve
156
+ `cubic-bezier(0.22,1,0.36,1)` ~500ms for layout/position; 300ms (never under 200ms)
157
+ for hover colour/opacity. Animate only `transform`/`opacity`. Respect
158
+ `prefers-reduced-motion` (replace movement with a plain opacity change). Scroll
159
+ reveals rise ~32px and fade over 600-800ms, once, via `IntersectionObserver` (never
160
+ an unthrottled scroll listener). If the animation becomes a showcase/video, hand it
161
+ to [`maggie-design-motion`](../maggie-design-motion/SKILL.md).
162
+
163
+ ## B8. Content, states, ship, tagline reveal
164
+
165
+ - **Content realism:** real draft copy (no lorem, no "Your headline here");
166
+ believable, non-repeating names; industry-fitting invented brands; non-round
167
+ numbers; sentence case; calm specific system messages. Banned filler:
168
+ "revolutionize", "supercharge", "cutting edge", "effortless", "transform your
169
+ workflow", "world class", and the like.
170
+ - **States:** every interactive element ships hover / active / **focus ring** /
171
+ loading (skeletons shaped like the layout, not spinners) / empty (a composed
172
+ getting-started view) / error (inline, specific, never `alert()`). No dead links;
173
+ the current nav item is indicated.
174
+ - **Ship requirements:** privacy/terms links, branded 404, client-side form
175
+ validation, skip-to-content, cookie consent where required (see `maggie-legal`),
176
+ branded favicon, `<title>`/meta/`og:image`, alt text, semantic HTML, a way back
177
+ from every page.
178
+ - **Tagline reveal (mandatory):** one large-type section (default `text-4xl`..`6xl`)
179
+ stating the core benefit, min two lines, width-capped, separate from the hero.
180
+ Each word transitions from a muted tone (~25-35% opacity) to full colour in
181
+ reading order as it crosses a trigger line (base curve, `IntersectionObserver`
182
+ per word or an rAF-throttled listener - never unthrottled).
183
+
184
+ # Output format
185
+
186
+ Before code, return: page outline; hero copy (headline/subheadline/CTA/proof);
187
+ three to five benefits; three "how it works" steps; six to twelve FAQ Q&A;
188
+ SEO/AEO (index or noindex + title/meta); layout recommendation (A/B/C/D) and why.
189
+ Then build section by section per A6, through `maggie-design`.
190
+
191
+ # Quality bar
192
+
193
+ - One offer / one audience / one primary action; no competing CTAs above the fold;
194
+ specific numbers; at least one risk reversal; proof beside its claim.
195
+ - Every visual value resolves through a rule or the project's token system, never
196
+ ad hoc; the project's brand/palette/type is respected over the defaults.
197
+ - All six states present; no dead links; 404/legal/validation/favicon/meta/alt done.
198
+ - Tagline reveal present; motion uses the base curve and IntersectionObserver.
199
+
200
+ # Guardrails
201
+
202
+ - Values here are defaults; the user's prompt and the project's DESIGN.md/tokens
203
+ win. Never repaint an established brand with the defaults.
204
+ - Real content only; never invent testimonials, customer logos, or metrics as if
205
+ genuine - draft clearly-sample copy, and mark placeholder proof as placeholder.
206
+ - Production, responsive review, icon gates, and QA evidence run through
207
+ `maggie-design`; this skill does not bypass them.
208
+ - Legal/consent wording belongs to `maggie-legal`; SEO specifics to
209
+ `maggie-seo-geo`.
210
+
211
+ # Related skills
212
+
213
+ - `maggie-design` - produces and validates the page (bands, icon inventory,
214
+ responsive/QA evidence).
215
+ - `maggie-seo-geo` - SEO/AEO content and measurement.
216
+ - `maggie-design-motion` - when a section becomes an animated showcase or a
217
+ video/GIF.
218
+ - `maggie-spirit` - brand marks and avatars; `maggie-legal` - consent/terms.
219
+
220
+ # Credits
221
+
222
+ Adapted (not transcribed) from
223
+ [`elayadesign/ai-design-skills`](https://github.com/elayadesign/ai-design-skills)
224
+ `landing-page-design` by Elaya (MIT), which itself adapts content-realism and
225
+ motion ideas from [`Leonxlnx/taste-skill`](https://github.com/Leonxlnx/taste-skill)
226
+ by Leon Lin (MIT). The specific numeric defaults originate there; our version makes
227
+ them overridable and defers to the project's design system.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topy-ai/maggie",
3
- "version": "0.8.4",
3
+ "version": "0.8.5",
4
4
  "description": "Install and manage Maggie Skills for AI coding agents",
5
5
  "license": "MIT",
6
6
  "type": "module",