howone 0.1.28 → 0.1.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/package.json +1 -1
  2. package/templates/vite/.howone/skills/hallmark/SKILL.md +48 -42
  3. package/templates/vite/.howone/skills/hallmark/references/anti-patterns.md +12 -6
  4. package/templates/vite/.howone/skills/hallmark/references/assets.md +7 -0
  5. package/templates/vite/.howone/skills/hallmark/references/component-cookbook.md +19 -10
  6. package/templates/vite/.howone/skills/hallmark/references/components/f2-sticky-scroll-stack.md +1 -1
  7. package/templates/vite/.howone/skills/hallmark/references/components/ft6-letter-close.md +1 -1
  8. package/templates/vite/.howone/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +1 -1
  9. package/templates/vite/.howone/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +1 -1
  10. package/templates/vite/.howone/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +1 -1
  11. package/templates/vite/.howone/skills/hallmark/references/components/n11-mega-menu.md +40 -0
  12. package/templates/vite/.howone/skills/hallmark/references/components/n12-banner-retract.md +34 -0
  13. package/templates/vite/.howone/skills/hallmark/references/components/n13-inline-cmdk-pill.md +39 -0
  14. package/templates/vite/.howone/skills/hallmark/references/components/n1b-saas-three-section.md +35 -0
  15. package/templates/vite/.howone/skills/hallmark/references/components/n9-edge-aligned-minimal.md +1 -1
  16. package/templates/vite/.howone/skills/hallmark/references/components/s3-sticky-pinned.md +2 -2
  17. package/templates/vite/.howone/skills/hallmark/references/copy.md +8 -8
  18. package/templates/vite/.howone/skills/hallmark/references/custom-craft.md +2 -2
  19. package/templates/vite/.howone/skills/hallmark/references/custom-theme.md +50 -12
  20. package/templates/vite/.howone/skills/hallmark/references/export-formats.md +1 -1
  21. package/templates/vite/.howone/skills/hallmark/references/genres/atmospheric.md +11 -7
  22. package/templates/vite/.howone/skills/hallmark/references/genres/editorial.md +6 -4
  23. package/templates/vite/.howone/skills/hallmark/references/genres/modern-minimal.md +10 -6
  24. package/templates/vite/.howone/skills/hallmark/references/genres/playful.md +15 -10
  25. package/templates/vite/.howone/skills/hallmark/references/hero-enrichment.md +13 -12
  26. package/templates/vite/.howone/skills/hallmark/references/interaction-and-states.md +2 -1
  27. package/templates/vite/.howone/skills/hallmark/references/layout-and-space.md +4 -3
  28. package/templates/vite/.howone/skills/hallmark/references/macrostructures/04-stat-led.md +3 -1
  29. package/templates/vite/.howone/skills/hallmark/references/macrostructures/12-letter.md +1 -1
  30. package/templates/vite/.howone/skills/hallmark/references/macrostructures.md +1 -1
  31. package/templates/vite/.howone/skills/hallmark/references/microinteractions.md +1 -3
  32. package/templates/vite/.howone/skills/hallmark/references/preview-examples.md +12 -12
  33. package/templates/vite/.howone/skills/hallmark/references/responsive.md +8 -8
  34. package/templates/vite/.howone/skills/hallmark/references/slop-test.md +72 -85
  35. package/templates/vite/.howone/skills/hallmark/references/structure.md +9 -13
  36. package/templates/vite/.howone/skills/hallmark/references/study.md +40 -17
  37. package/templates/vite/.howone/skills/hallmark/references/themes/carnival.md +301 -0
  38. package/templates/vite/.howone/skills/hallmark/references/themes/cobalt.md +146 -0
  39. package/templates/vite/.howone/skills/hallmark/references/themes/hum.md +403 -0
  40. package/templates/vite/.howone/skills/hallmark/references/themes/lumen.md +478 -0
  41. package/templates/vite/.howone/skills/hallmark/references/typography.md +3 -3
  42. package/templates/vite/.howone/skills/hallmark/references/verbs/redesign.md +1 -1
  43. package/templates/vite/.howone/skills/howone/03-sdk/07-ai-action-calls.md +28 -86
  44. package/templates/vite/.howone/skills/howone/03-sdk/09-workflow-execute-sse.md +105 -0
  45. package/templates/vite/.howone/skills/howone/04-ai/03-ai-sdk-handoff.md +15 -13
  46. package/templates/vite/.howone/skills/howone/SKILL.md +2 -2
  47. package/templates/vite/package.json +1 -1
  48. package/templates/vite/.howone/skills/hallmark/LICENSE +0 -21
  49. package/templates/vite/.howone/skills/hallmark/README.md +0 -147
  50. package/templates/vite/.howone/skills/hallmark/ROADMAP.md +0 -201
  51. package/templates/vite/.howone/skills/hallmark/docs/recipes.md +0 -186
  52. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-anya.jpg +0 -0
  53. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-bananastudio.jpg +0 -0
  54. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-hyperlane.jpg +0 -0
  55. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-najm.jpg +0 -0
  56. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-slow-pour.jpg +0 -0
  57. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-soroe.jpg +0 -0
  58. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-tally.jpg +0 -0
  59. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-wayfare.jpg +0 -0
  60. package/templates/vite/.howone/skills/hallmark/docs/study-examples.md +0 -176
  61. package/templates/vite/.howone/skills/hallmark/docs/talk-slides.md +0 -364
  62. package/templates/vite/.howone/skills/hallmark/package.json +0 -36
  63. package/templates/vite/.howone/skills/hallmark/site/OG-hallmark.png +0 -0
  64. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/brief.md +0 -71
  65. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/index.html +0 -64
  66. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/style.css +0 -240
  67. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/brief.md +0 -65
  68. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/index.html +0 -105
  69. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/style.css +0 -250
  70. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/brief.md +0 -64
  71. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/index.html +0 -131
  72. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/style.css +0 -240
  73. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/brief.md +0 -67
  74. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/index.html +0 -86
  75. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/style.css +0 -262
  76. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/brief.md +0 -63
  77. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/index.html +0 -167
  78. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/style.css +0 -457
  79. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/brief.md +0 -65
  80. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/index.html +0 -159
  81. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/style.css +0 -288
  82. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/brief.md +0 -64
  83. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/index.html +0 -146
  84. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/style.css +0 -484
  85. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/brief.md +0 -64
  86. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/index.html +0 -116
  87. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/style.css +0 -354
  88. package/templates/vite/.howone/skills/hallmark/site/_tests/09-slow-pour/index.html +0 -638
  89. package/templates/vite/.howone/skills/hallmark/site/_tests/10-owl-hours/index.html +0 -515
  90. package/templates/vite/.howone/skills/hallmark/site/_tests/11-soroe-ceramics/index.html +0 -515
  91. package/templates/vite/.howone/skills/hallmark/site/_tests/12-loafer/index.html +0 -608
  92. package/templates/vite/.howone/skills/hallmark/site/_tests/13-alma/index.html +0 -587
  93. package/templates/vite/.howone/skills/hallmark/site/_tests/README.md +0 -157
  94. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-loop.mp4 +0 -0
  95. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-still.jpg +0 -0
  96. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-example.mp4 +0 -0
  97. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-still.jpg +0 -0
  98. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-loop.mp4 +0 -0
  99. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-still.jpg +0 -0
  100. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Podcast-loop.mp4 +0 -0
  101. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-loop.mp4 +0 -0
  102. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-still.jpg +0 -0
  103. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-loop.mp4 +0 -0
  104. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-still.jpg +0 -0
  105. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/after-quiet-hour.png +0 -0
  106. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-loop.mp4 +0 -0
  107. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-still.jpg +0 -0
  108. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/audit-example.png +0 -0
  109. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/before-quiet-hour.png +0 -0
  110. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/example-redesign-uractivation.png +0 -0
  111. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-loop.mp4 +0 -0
  112. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-still.jpg +0 -0
  113. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/study-example.png +0 -0
  114. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/uractivation-after-loop.mp4 +0 -0
  115. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-loop.mp4 +0 -0
  116. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-still.jpg +0 -0
  117. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/index.html +0 -77
  118. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/style.css +0 -238
  119. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/index.html +0 -110
  120. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/style.css +0 -326
  121. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/index.html +0 -134
  122. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/style.css +0 -262
  123. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/README.md +0 -30
  124. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/README.md +0 -17
  125. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/audit-report.md +0 -56
  126. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/input.html +0 -160
  127. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/notes.md +0 -29
  128. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/input.html +0 -63
  129. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/notes.md +0 -72
  130. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/output.html +0 -374
  131. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/diagnosis.md +0 -52
  132. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/input-description.md +0 -29
  133. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/notes.md +0 -61
  134. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.css +0 -193
  135. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.html +0 -66
  136. package/templates/vite/.howone/skills/hallmark/site/css/base.css +0 -194
  137. package/templates/vite/.howone/skills/hallmark/site/css/components.css +0 -4886
  138. package/templates/vite/.howone/skills/hallmark/site/css/sections.css +0 -2072
  139. package/templates/vite/.howone/skills/hallmark/site/css/tokens.css +0 -1129
  140. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/index.html +0 -475
  141. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/styles.css +0 -1584
  142. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/tokens.css +0 -96
  143. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/index.html +0 -344
  144. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/script.js +0 -103
  145. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/styles.css +0 -1103
  146. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/tokens.css +0 -83
  147. package/templates/vite/.howone/skills/hallmark/site/examples/najm/index.html +0 -368
  148. package/templates/vite/.howone/skills/hallmark/site/examples/najm/script.js +0 -133
  149. package/templates/vite/.howone/skills/hallmark/site/examples/najm/styles.css +0 -1062
  150. package/templates/vite/.howone/skills/hallmark/site/examples/najm/tokens.css +0 -97
  151. package/templates/vite/.howone/skills/hallmark/site/examples/tally/app.js +0 -84
  152. package/templates/vite/.howone/skills/hallmark/site/examples/tally/index.html +0 -446
  153. package/templates/vite/.howone/skills/hallmark/site/examples/tally/styles.css +0 -1087
  154. package/templates/vite/.howone/skills/hallmark/site/examples/tally/tokens.css +0 -101
  155. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/index.html +0 -359
  156. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/style.css +0 -1168
  157. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/tokens.css +0 -81
  158. package/templates/vite/.howone/skills/hallmark/site/favicon-dark.svg +0 -5
  159. package/templates/vite/.howone/skills/hallmark/site/favicon-light.svg +0 -5
  160. package/templates/vite/.howone/skills/hallmark/site/index.html +0 -1043
  161. package/templates/vite/.howone/skills/hallmark/site/js/main.js +0 -1175
  162. package/templates/vite/.howone/skills/hallmark/vercel.json +0 -6
  163. package/templates/vite/.howone/skills/impeccable/SKILL.md +0 -168
  164. package/templates/vite/.howone/skills/impeccable/agents/impeccable-asset-producer.md +0 -101
  165. package/templates/vite/.howone/skills/impeccable/reference/adapt.md +0 -190
  166. package/templates/vite/.howone/skills/impeccable/reference/animate.md +0 -175
  167. package/templates/vite/.howone/skills/impeccable/reference/audit.md +0 -133
  168. package/templates/vite/.howone/skills/impeccable/reference/bolder.md +0 -113
  169. package/templates/vite/.howone/skills/impeccable/reference/brand.md +0 -118
  170. package/templates/vite/.howone/skills/impeccable/reference/clarify.md +0 -174
  171. package/templates/vite/.howone/skills/impeccable/reference/codex.md +0 -105
  172. package/templates/vite/.howone/skills/impeccable/reference/cognitive-load.md +0 -106
  173. package/templates/vite/.howone/skills/impeccable/reference/color-and-contrast.md +0 -105
  174. package/templates/vite/.howone/skills/impeccable/reference/colorize.md +0 -154
  175. package/templates/vite/.howone/skills/impeccable/reference/craft.md +0 -123
  176. package/templates/vite/.howone/skills/impeccable/reference/critique.md +0 -273
  177. package/templates/vite/.howone/skills/impeccable/reference/delight.md +0 -302
  178. package/templates/vite/.howone/skills/impeccable/reference/distill.md +0 -111
  179. package/templates/vite/.howone/skills/impeccable/reference/document.md +0 -427
  180. package/templates/vite/.howone/skills/impeccable/reference/extract.md +0 -69
  181. package/templates/vite/.howone/skills/impeccable/reference/harden.md +0 -347
  182. package/templates/vite/.howone/skills/impeccable/reference/heuristics-scoring.md +0 -234
  183. package/templates/vite/.howone/skills/impeccable/reference/interaction-design.md +0 -195
  184. package/templates/vite/.howone/skills/impeccable/reference/layout.md +0 -141
  185. package/templates/vite/.howone/skills/impeccable/reference/live.md +0 -622
  186. package/templates/vite/.howone/skills/impeccable/reference/motion-design.md +0 -109
  187. package/templates/vite/.howone/skills/impeccable/reference/onboard.md +0 -234
  188. package/templates/vite/.howone/skills/impeccable/reference/optimize.md +0 -258
  189. package/templates/vite/.howone/skills/impeccable/reference/overdrive.md +0 -130
  190. package/templates/vite/.howone/skills/impeccable/reference/personas.md +0 -179
  191. package/templates/vite/.howone/skills/impeccable/reference/polish.md +0 -242
  192. package/templates/vite/.howone/skills/impeccable/reference/product.md +0 -62
  193. package/templates/vite/.howone/skills/impeccable/reference/quieter.md +0 -99
  194. package/templates/vite/.howone/skills/impeccable/reference/responsive-design.md +0 -114
  195. package/templates/vite/.howone/skills/impeccable/reference/shape.md +0 -165
  196. package/templates/vite/.howone/skills/impeccable/reference/spatial-design.md +0 -100
  197. package/templates/vite/.howone/skills/impeccable/reference/teach.md +0 -156
  198. package/templates/vite/.howone/skills/impeccable/reference/typeset.md +0 -124
  199. package/templates/vite/.howone/skills/impeccable/reference/typography.md +0 -159
  200. package/templates/vite/.howone/skills/impeccable/reference/ux-writing.md +0 -107
  201. package/templates/vite/.howone/skills/impeccable/scripts/cleanup-deprecated.mjs +0 -284
  202. package/templates/vite/.howone/skills/impeccable/scripts/command-metadata.json +0 -94
  203. package/templates/vite/.howone/skills/impeccable/scripts/critique-storage.mjs +0 -242
  204. package/templates/vite/.howone/skills/impeccable/scripts/design-parser.mjs +0 -820
  205. package/templates/vite/.howone/skills/impeccable/scripts/detect-csp.mjs +0 -198
  206. package/templates/vite/.howone/skills/impeccable/scripts/detect.mjs +0 -21
  207. package/templates/vite/.howone/skills/impeccable/scripts/impeccable-paths.mjs +0 -110
  208. package/templates/vite/.howone/skills/impeccable/scripts/is-generated.mjs +0 -69
  209. package/templates/vite/.howone/skills/impeccable/scripts/live-accept.mjs +0 -595
  210. package/templates/vite/.howone/skills/impeccable/scripts/live-browser-session.js +0 -123
  211. package/templates/vite/.howone/skills/impeccable/scripts/live-browser.js +0 -4860
  212. package/templates/vite/.howone/skills/impeccable/scripts/live-complete.mjs +0 -75
  213. package/templates/vite/.howone/skills/impeccable/scripts/live-completion.mjs +0 -18
  214. package/templates/vite/.howone/skills/impeccable/scripts/live-inject.mjs +0 -446
  215. package/templates/vite/.howone/skills/impeccable/scripts/live-poll.mjs +0 -200
  216. package/templates/vite/.howone/skills/impeccable/scripts/live-resume.mjs +0 -48
  217. package/templates/vite/.howone/skills/impeccable/scripts/live-server.mjs +0 -838
  218. package/templates/vite/.howone/skills/impeccable/scripts/live-session-store.mjs +0 -254
  219. package/templates/vite/.howone/skills/impeccable/scripts/live-status.mjs +0 -47
  220. package/templates/vite/.howone/skills/impeccable/scripts/live-wrap.mjs +0 -632
  221. package/templates/vite/.howone/skills/impeccable/scripts/live.mjs +0 -247
  222. package/templates/vite/.howone/skills/impeccable/scripts/load-context.mjs +0 -141
  223. package/templates/vite/.howone/skills/impeccable/scripts/modern-screenshot.umd.js +0 -14
  224. package/templates/vite/.howone/skills/impeccable/scripts/pin.mjs +0 -214
@@ -62,27 +62,14 @@ type AiActionConfig<TInput, TOutput> = {
62
62
  ```ts
63
63
  type AiResult = {
64
64
  success: boolean
65
+ runId?: string
65
66
  /** Terminal outcome of the run */
66
67
  outcome: 'success' | 'credit_insufficient' | 'run_error' | null
67
- finalResult: Record<string, unknown> | null // the workflow output payload (from run_complete)
68
- /** Accumulated state data from state_update / state_snapshot events */
69
- stateData: Record<string, unknown>
70
- nodeExecutions: Array<{
71
- nodeName: string
72
- agentName?: string
73
- timestamp: number
74
- }>
75
- toolExecutions: Array<{
76
- toolCallId: string
77
- toolName: string
78
- args?: Record<string, unknown>
79
- result?: unknown
80
- durationMs?: number
81
- cost?: number
82
- timestamp: number
83
- }>
68
+ finalResult: Record<string, unknown> | null // run_complete.message
69
+ progressLogs: string[] // progress.message lines
84
70
  totalDuration: number
85
71
  errors: string[]
72
+ events: AiEvent[]
86
73
  }
87
74
  ```
88
75
 
@@ -98,42 +85,20 @@ type AiSession = {
98
85
 
99
86
  ### AiEvent (SSE events)
100
87
 
101
- All events share a common base, then carry a typed `payload`:
88
+ All workflow execute SSE events use the current envelope shape:
102
89
 
103
90
  ```ts
104
91
  type AiEvent = {
105
- type: string // see channel catalog below
106
92
  id: string
107
- run_id: string
108
- workflow_id: string
109
- timestamp: string // ISO 8601 UTC
110
- seq: number // monotonic ordering within the run
111
- // Context fields — present when applicable
112
- node_name?: string
113
- node_status?: 'pending' | 'running' | 'completed' | 'failed'
114
- action_step?: number
115
- agent_name?: string
116
- action_name?: string
117
- agent_loop_step?: number
118
- message_id?: string
119
- tool_call_id?: string
120
- payload?: Record<string, unknown>
93
+ type: 'run_start' | 'progress' | 'run_complete' | 'run_error' | 'credit_insufficient'
94
+ event: AiEvent['type']
95
+ message: string | Record<string, unknown>
96
+ payload?: Record<string, unknown> // present for run_complete as a compatibility alias of message
121
97
  }
122
98
  ```
123
99
 
124
- **SSE Channels and event types:**
125
-
126
- | Channel | Key event types |
127
- |---|---|
128
- | `lifecycle` | `run_start`, `run_complete`, `credit_insufficient`, `run_error` |
129
- | `node` | `node_scheduled`, `node_start`, `node_complete`, `node_failed` |
130
- | `action` | `action_scheduled`, `action_start`, `action_complete` |
131
- | `messages` | `ai_message_start`, `ai_message_chunk`, `ai_message_end`, `action_output` |
132
- | `tools` | `tool_call_start`, `tool_call_end`, `tool_call_error` |
133
- | `state` | `state_update`, `state_snapshot` |
134
- | `metadata` | `progress` |
135
-
136
100
  Stream terminates after exactly one of: `run_complete`, `credit_insufficient`, or `run_error`.
101
+ For the full wire protocol, read `03-sdk/09-workflow-execute-sse.md`.
137
102
 
138
103
  ---
139
104
 
@@ -230,17 +195,12 @@ When an action omits `outputSchema`, `run()` returns the raw `AiResult` executio
230
195
 
231
196
  ```ts
232
197
  const result = await howone.ai.generateStory.run(input, {
233
- onMessageChunk: (text) => {
234
- console.log('chunk:', text)
235
- },
236
- onNodeStart: (event) => {
237
- console.log(`Node ${event.node_name} started`)
238
- },
239
- onStateUpdate: (delta) => {
240
- console.log('State delta:', delta)
198
+ onMessageChunk: (line) => {
199
+ appendLog(line)
241
200
  },
242
- onProgress: (percent) => {
243
- setProgress(percent)
201
+ onProgress: (percent, line) => {
202
+ if (line?.startsWith('[DISPLAY]')) setStatus(line.replace('[DISPLAY]', '').trim())
203
+ if (percent === 100) setProgress(100)
244
204
  },
245
205
  onError: (error) => {
246
206
  console.error('SSE error:', error)
@@ -302,27 +262,20 @@ const result = await session.result
302
262
  async function consumeEvents(input: GenerateStoryInput) {
303
263
  for await (const event of howone.ai.generateStory.events(input)) {
304
264
  switch (event.type) {
305
- case 'ai_message_chunk':
306
- // streaming LLM text delta
307
- setOutput(prev => prev + (event.payload?.content_block?.text ?? event.payload?.content ?? ''))
265
+ case 'run_start':
266
+ setStatus('running')
308
267
  break
309
- case 'node_start':
310
- console.log('Node started:', event.node_name)
311
- break
312
- case 'tool_call_end':
313
- console.log('Tool result:', event.tool_call_id, event.payload?.result)
314
- break
315
- case 'state_update':
316
- console.log('State delta:', event.payload?.delta)
268
+ case 'progress':
269
+ appendLog(String(event.message))
317
270
  break
318
271
  case 'run_complete':
319
- console.log('Final result:', event.payload?.result)
272
+ console.log('Final result:', event.message)
320
273
  break
321
274
  case 'credit_insufficient':
322
- showCreditError(event.payload?.details?.reason)
275
+ showCreditError(String(event.message))
323
276
  break
324
277
  case 'run_error':
325
- showExecutionError(event.payload?.details?.reason)
278
+ showExecutionError(String(event.message))
326
279
  break
327
280
  }
328
281
  }
@@ -397,7 +350,7 @@ export const analyzeDataInputSchema = z.object({
397
350
 
398
351
  ```ts
399
352
  type SSEExecutionOptions = {
400
- // Called for every parsed event with its SSE channel
353
+ // Called for every parsed workflow envelope. channel is always "workflow".
401
354
  onEvent?: (event: AiEvent, channel: string) => void
402
355
 
403
356
  // Lifecycle
@@ -408,23 +361,10 @@ type SSEExecutionOptions = {
408
361
  /** Workflow logic failed — show retry/support UI */
409
362
  onRunError?: (event: RunErrorEvent) => void
410
363
 
411
- // Nodes
412
- onNodeStart?: (event: NodeStartEvent) => void
413
- onNodeComplete?: (event: NodeCompleteEvent) => void
414
-
415
- // Messages — streaming LLM text
416
- onMessageChunk?: (text: string, event: AiMessageChunkEvent) => void
417
- onMessageEnd?: (event: AiMessageEndEvent) => void
418
-
419
- // Tools
420
- onToolCallStart?: (event: ToolCallStartEvent) => void
421
- onToolCallEnd?: (event: ToolCallEndEvent) => void
422
- onToolCallError?: (event: ToolCallErrorEvent) => void
423
-
424
- // State — live output panel updates
425
- onStateUpdate?: (delta: Record<string, unknown>, event: StateUpdateEvent) => void
364
+ // Progress log lines from progress.message
365
+ onMessageChunk?: (text: string, event: ProgressEvent) => void
426
366
 
427
- // Progress percent 0-100
367
+ // Progress compatibility callback: progress lines fire as (0, message), success fires as (100)
428
368
  onProgress?: (percent: number, message?: string) => void
429
369
 
430
370
  // Internal transport log
@@ -448,6 +388,8 @@ type SSEExecutionOptions = {
448
388
  }
449
389
  ```
450
390
 
391
+ > The current workflow execute SSE endpoint does not emit `node_start`, `tool_call_end`,
392
+ > `state_update`, or `ai_message_chunk`. Do not write generated app code that expects those events.
451
393
  > `onCreditInsufficient` and `onRunError` are **mutually exclusive** terminal events.
452
394
  > Do not use a generic `onError` to distinguish them — use the dedicated callbacks.
453
395
 
@@ -0,0 +1,105 @@
1
+ # Workflow Execute SSE
2
+
3
+ Use this reference for `@howone/sdk` AI action streaming and raw workflow execution calls.
4
+
5
+ ## Endpoint Contract
6
+
7
+ The SDK uses the current workflow execute SSE endpoint:
8
+
9
+ | Method | Path |
10
+ |---|---|
11
+ | `POST` | `/workflow/execute/{project_short_id}/{config_id}` |
12
+
13
+ The request body is:
14
+
15
+ ```json
16
+ {
17
+ "inputs": {},
18
+ "priority": "normal"
19
+ }
20
+ ```
21
+
22
+ `priority` is optional. All requests require `Authorization: Bearer <JWT>`.
23
+
24
+ The successful HTTP response includes:
25
+
26
+ | Header | Meaning |
27
+ |---|---|
28
+ | `Content-Type: text/event-stream` | Streaming response |
29
+ | `X-Run-Id` | Execution task id for status/cancel follow-up |
30
+
31
+ Do not use or generate code for old endpoints such as
32
+ `/workflow/{appId}/{workflowId}/execute_sse`.
33
+
34
+ ## Wire Format
35
+
36
+ Frames contain only a `data:` line and a blank line:
37
+
38
+ ```text
39
+ data: {"id":"evt_8ae6d6e8a4ea","event":"run_start","message":"execution with sse is started"}
40
+
41
+ data: {"id":"evt_241ff985450b","event":"progress","message":"[DISPLAY] Executing node: Extract"}
42
+
43
+ data: {"id":"evt_f3a1b2c3d4e5","event":"run_complete","message":{"video_url":"https://..."}}
44
+ ```
45
+
46
+ There are no separate SSE `event:` or `id:` lines. The JSON envelope owns those fields.
47
+
48
+ ## Envelope
49
+
50
+ ```ts
51
+ type WorkflowSseEnvelope = {
52
+ id: string
53
+ event: 'run_start' | 'progress' | 'run_complete' | 'run_error' | 'credit_insufficient'
54
+ message: string | Record<string, unknown>
55
+ }
56
+ ```
57
+
58
+ Event meanings:
59
+
60
+ | Event | Message | Meaning |
61
+ |---|---|---|
62
+ | `run_start` | string | Stream opened and execution started. |
63
+ | `progress` | string | One worker log line. `[DISPLAY]` lines are intended for UI. |
64
+ | `run_complete` | object | Final workflow-specific output. SDK maps this to `AiResult.finalResult`. |
65
+ | `run_error` | string | Workflow failed. |
66
+ | `credit_insufficient` | string | Billing/credit block. |
67
+
68
+ The terminal event is exactly one of `run_complete`, `run_error`, or `credit_insufficient`.
69
+ There is no `stream_end` event.
70
+
71
+ ## SDK Mapping
72
+
73
+ `howone.ai.run(configId, inputs)` and typed action `.run()` call the endpoint above.
74
+
75
+ `AiResult` maps the stream as:
76
+
77
+ ```ts
78
+ type AiResult = {
79
+ success: boolean
80
+ runId?: string
81
+ outcome: 'success' | 'credit_insufficient' | 'run_error' | null
82
+ finalResult: Record<string, unknown> | null
83
+ progressLogs: string[]
84
+ errors: string[]
85
+ events: AiEvent[]
86
+ }
87
+ ```
88
+
89
+ For typed actions with an `outputSchema`, `.run()` returns the validated `run_complete.message`
90
+ object directly.
91
+
92
+ ## Callback Rules
93
+
94
+ - `onRunStart(event)` receives the `run_start` envelope.
95
+ - `onMessageChunk(text, event)` receives each `progress.message` line.
96
+ - `onProgress(0, message)` receives each progress line; `onProgress(100)` fires on success.
97
+ - `onRunComplete(event, result)` receives `event.message` as the final object.
98
+ - `onRunError(event)` receives `event.message` as the error string.
99
+ - `onCreditInsufficient(event)` receives `event.message` as the credit error string.
100
+ - `onEvent(event, 'workflow')` fires for every parsed envelope.
101
+
102
+ Do not write UI code that expects `event.payload.result`, `event.payload.details.reason`,
103
+ `node_start`, `tool_call_end`, `state_update`, or `ai_message_chunk`. Those belong to an old
104
+ multi-channel protocol and are not part of the current workflow execute SSE contract.
105
+
@@ -6,6 +6,9 @@ workflow through `@howone/sdk`.
6
6
  This file answers: **how does `.howone/ai/manifest.json` become `src/lib/sdk.ts`, and how should UI
7
7
  call it?**
8
8
 
9
+ For live stream wire details, read `03-sdk/09-workflow-execute-sse.md`. The current endpoint emits
10
+ only `run_start`, `progress`, `run_complete`, `run_error`, and `credit_insufficient`.
11
+
9
12
  ## Binding Source
10
13
 
11
14
  Generate `src/lib/sdk.ts` from `.howone/ai/manifest.json`. Do not write AI bindings from memory,
@@ -117,11 +120,13 @@ Use `.stream()` when UI needs live output or cancellation:
117
120
 
118
121
  ```ts
119
122
  const session = howone.ai.generateStory.stream(input, {
120
- onMessageChunk: (text) => setDraft((prev) => prev + text),
121
- onStateUpdate: (delta) => updateLivePanel(delta),
122
- onProgress: (percent) => setProgress(percent),
123
- onCreditInsufficient: (event) => showCreditError(event.payload?.details?.reason),
124
- onRunError: (event) => showExecutionError(event.payload?.details?.reason),
123
+ onMessageChunk: (line) => appendLog(line),
124
+ onProgress: (percent, line) => {
125
+ if (line?.startsWith('[DISPLAY]')) setStatus(line.replace('[DISPLAY]', '').trim())
126
+ if (percent === 100) setProgress(100)
127
+ },
128
+ onCreditInsufficient: (event) => showCreditError(event.message),
129
+ onRunError: (event) => showExecutionError(event.message),
125
130
  onError: (error) => setError(error.message),
126
131
  onComplete: (result) => setRawResult(result),
127
132
  })
@@ -134,20 +139,17 @@ Use `.events()` when code wants an async iterable:
134
139
 
135
140
  ```ts
136
141
  for await (const event of howone.ai.generateStory.events(input)) {
137
- if (event.type === 'ai_message_chunk') {
138
- appendText(String(event.payload?.content_block?.text ?? event.payload?.content ?? ''))
139
- }
140
- if (event.type === 'state_update') {
141
- updateLivePanel(event.payload?.delta ?? {})
142
+ if (event.type === 'progress') {
143
+ appendLog(String(event.message))
142
144
  }
143
145
  if (event.type === 'run_complete') {
144
- setFinalResult(event.payload?.result)
146
+ setFinalResult(event.message)
145
147
  }
146
148
  if (event.type === 'credit_insufficient') {
147
- showCreditError(event.payload?.details?.reason)
149
+ showCreditError(String(event.message))
148
150
  }
149
151
  if (event.type === 'run_error') {
150
- showExecutionError(event.payload?.details?.reason)
152
+ showExecutionError(String(event.message))
151
153
  }
152
154
  }
153
155
  ```
@@ -50,7 +50,7 @@ Read references by task shape. Prefer exact references over generic examples.
50
50
  - File upload: read `03-sdk/05-file-upload.md`.
51
51
  - Raw HTTP escape hatch: read `03-sdk/06-raw-http.md`.
52
52
  - App-side AI action calls after `.howone/ai/manifest.json` exists: read
53
- `03-sdk/07-ai-action-calls.md`.
53
+ `03-sdk/07-ai-action-calls.md` and `03-sdk/09-workflow-execute-sse.md`.
54
54
  - External workflow create/update/status: read `04-ai/05-workflow-operations.md`.
55
55
  - Common AI feature templates: read `04-ai/06-ai-feature-playbooks.md`.
56
56
 
@@ -71,7 +71,7 @@ Before writing code, classify the touched surfaces:
71
71
  | AI capability or workflow design | `04-ai/01-ai-capability-architecture.md`, `04-ai/04-service-capability-catalog.md`, `04-ai/02-workflow-contract-rules.md` |
72
72
  | External workflow create/update/status | `04-ai/05-workflow-operations.md` |
73
73
  | Common AI feature examples | `04-ai/06-ai-feature-playbooks.md` |
74
- | AI manifest handoff to app code | `04-ai/03-ai-sdk-handoff.md`, `03-sdk/07-ai-action-calls.md` |
74
+ | AI manifest handoff to app code | `04-ai/03-ai-sdk-handoff.md`, `03-sdk/07-ai-action-calls.md`, `03-sdk/09-workflow-execute-sse.md` |
75
75
  | File upload | `03-sdk/05-file-upload.md` |
76
76
  | Raw HTTP escape hatch | `03-sdk/06-raw-http.md` |
77
77
  | SDK extensibility / adapter boundaries | `03-sdk/08-extension-boundaries.md` |
@@ -14,7 +14,7 @@
14
14
  "dependencies": {
15
15
  "@base-ui/react": "^1.4.1",
16
16
  "@fontsource-variable/inter": "^5.2.8",
17
- "@howone/sdk": "2.0.0-beta.20",
17
+ "@howone/sdk": "2.0.0-beta.21",
18
18
  "@tailwindcss/vite": "^4.2.1",
19
19
  "class-variance-authority": "^0.7.1",
20
20
  "clsx": "^2.1.1",
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Hallmark contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1,147 +0,0 @@
1
- # Hallmark
2
-
3
- **A design skill for Claude Code, Cursor, and Codex that refuses to look AI-generated.**
4
-
5
- [Live demo →](https://www.usehallmark.com) &nbsp;·&nbsp; twenty-two themes &nbsp;·&nbsp; four verbs &nbsp;·&nbsp; press `T` to cycle.
6
-
7
- Made by Together AI.
8
-
9
- <p align="center">
10
- <img src="site/OG-hallmark.png" alt="Hallmark — A design skill that refuses to look AI-generated" />
11
- </p>
12
-
13
- Hallmark encodes the anti-AI-slop consensus — typography, colour, layout, motion, microinteractions, structural variety — into one opinionated rule-set. It picks a macrostructure for the brief, dresses it in one of twenty-two themes, runs sixty-five slop-test gates plus a pre-emit self-critique before handing back, and refuses the on-distribution defaults every LLM was trained into.
14
-
15
- > **v1.0.0** — pre-emit critique on six axes, honest-copy enforcement, locked-token discipline, re-drawn-chrome ban, and a no-wrap rule for clickable text. Five new slop-test gates (56–60). The full rule-set lives in [`SKILL.md`](SKILL.md) and [`references/`](references/).
16
-
17
-
18
- ---
19
-
20
- ## What's distinct — quick map vs the field
21
-
22
- | | Hallmark | [frontend-design](https://github.com/anthropics/skills) (Anthropic) | [Open Design](https://github.com/nexu-io/open-design) | [Dembrandt](https://github.com/dembrandt/dembrandt) |
23
- | --- | --- | --- | --- | --- |
24
- | **Source of taste** | extracts DNA from a screenshot OR a URL (`study` verb) — image mode names roles + candidates; URL mode names exact fonts + tokens | art-director brief + ban list | menu of 72 brand presets (Linear, Stripe, Vercel, Notion…) | scrapes a live URL, emits computed tokens |
25
- | **Output unit** | macrostructure + theme + custom-craft, optional portable `design.md` | bans + brief framing | preset application | DTCG `tokens.json` |
26
- | **Refuses font ID** | image mode: yes — names role only; URL mode: names what the page declares | n/a | n/a | n/a (computes from CSS) |
27
- | **Refuses pixel-clone** | yes — DNA only, never pixels (both modes) | n/a | n/a | n/a (full token export) |
28
- | **Refuses third-party extraction** | yes — paid templates / competitors / unrelated sites auto-refused; `design.md` emission has a tighter layer with URL-mode attestation | n/a | n/a | n/a (extracts anything) |
29
- | **Tactile-rebellion alignment** | warm-paper, custom-craft, slopless canon | strong | medium | none — token-only |
30
- | **Pages by archetype** | 21 named macrostructures, picked per brief | by brief | 5 deterministic directions | n/a |
31
- | **Verbs** | 4 (default · `audit` · `redesign` · `study`) | 1 | 31 | 1 (CLI) |
32
-
33
- Hallmark's edge is **`study`** — every other tool ships a preset menu or a scraper. Hallmark is the only one that takes a screenshot *or* a URL of a design you admire, names what it sees (roles in image mode, exact fonts + tokens in URL mode), refuses paid-template-marketplace listings outright, and either rebuilds your content with the extracted DNA or emits a portable `design.md` you can hand to another AI tool — with a tighter refusal layer for the portable spec than for the diagnosis itself. Three worked study examples in [`docs/study-examples.md`](docs/study-examples.md).
34
-
35
- ---
36
-
37
- ## Four verbs
38
-
39
- | Verb | What it does |
40
- | --- | --- |
41
- | *(default)* | Build new UI. Asks for audience + use + tone (skippable — the skill states what it inferred). Picks a macrostructure, applies the rule-set, runs the slop test before handing back. |
42
- | `hallmark audit <target>` | Score existing code against the named anti-patterns + structural sameness. Punch list, no edits. |
43
- | `hallmark redesign <target> [--mood <name>]` | Throw out the structure, keep copy + IA + brand, rebuild with a deliberately different fingerprint. |
44
- | **`hallmark study <screenshot \| URL>`** | The differentiator. Extract the **DNA** from a design the user admires — macrostructure, archetypes, type-pairing, colour anchor — and produce a diagnosis report. Accepts either an attached screenshot or a URL to a live page. After the diagnosis the user can optionally rebuild *their* content using the extracted DNA, **or** lock the DNA into a portable `design.md` other AI tools (Cursor, v0, Bolt) can read directly. **URL mode** reads HTML / CSS via WebFetch — names exact fonts and exact colour values, can't judge rhythm, and falls back to asking for a screenshot if the page is auth-walled or a JS-only shell. **Refuses paid templates and competitor pages. Image mode names font roles (never font IDs); URL mode names actual fonts (the page declares them). Never copies pixels. `design.md` emission has a tighter refusal layer than the diagnosis itself — URL-mode emission asks the user to attest the source is theirs or a public reference for their own brand.** |
45
-
46
- ---
47
-
48
- ## Different briefs, different shapes
49
-
50
- A handful of examples below — each generated by exercising the skill on a different brief. The skill picks differently for every prompt; no two share a macrostructure or theme.
51
-
52
- <table>
53
- <tr>
54
- <td width="25%"><a href="https://www.usehallmark.com/examples/tally/"><img src="docs/screenshots/hero-tally.jpg" alt="Tally — SaaS product page hero" /></a></td>
55
- <td width="25%"><a href="https://www.usehallmark.com/examples/wayfare/"><img src="docs/screenshots/hero-wayfare.jpg" alt="Wayfare travel booking hero" /></a></td>
56
- <td width="25%"><a href="https://www.usehallmark.com/_tests/09-slow-pour/"><img src="docs/screenshots/hero-slow-pour.jpg" alt="Slow Pour coffee subscription hero" /></a></td>
57
- <td width="25%"><a href="https://www.usehallmark.com/examples/bananastudio/"><img src="docs/screenshots/hero-bananastudio.jpg" alt="BananaStudio creative studio hero" /></a></td>
58
- </tr>
59
- <tr>
60
- <td><b>Tally</b><br/><sub>SaaS product page · modern-minimal</sub></td>
61
- <td><b>Wayfare</b><br/><sub>Travel booking · atmospheric</sub></td>
62
- <td><b>Slow Pour</b><br/><sub>Small-batch coffee subscription</sub></td>
63
- <td><b>BananaStudio</b><br/><sub>Creative studio · playful motion</sub></td>
64
- </tr>
65
- <tr>
66
- <td><a href="https://www.usehallmark.com/_tests/06-anya-portfolio/"><img src="docs/screenshots/hero-anya.jpg" alt="Anya Reis personal site hero" /></a></td>
67
- <td><a href="https://www.usehallmark.com/examples/najm/"><img src="docs/screenshots/hero-najm.jpg" alt="NAJM Moroccan fashion brand hero" /></a></td>
68
- <td><a href="https://www.usehallmark.com/_tests/11-soroe-ceramics/"><img src="docs/screenshots/hero-soroe.jpg" alt="Søroe ceramics studio hero" /></a></td>
69
- <td><a href="https://www.usehallmark.com/examples/hyperlane/"><img src="docs/screenshots/hero-hyperlane.jpg" alt="Hyperlane developer infrastructure hero" /></a></td>
70
- </tr>
71
- <tr>
72
- <td><b>Anya Reis</b><br/><sub>Software architect personal site</sub></td>
73
- <td><b>NAJM</b><br/><sub>Moroccan fashion brand</sub></td>
74
- <td><b>Søroe</b><br/><sub>Small ceramics studio</sub></td>
75
- <td><b>Hyperlane</b><br/><sub>Developer infrastructure</sub></td>
76
- </tr>
77
- </table>
78
-
79
- Each page is its own self-contained HTML + CSS — no shared theme, no shared layout. Every one carries a `/* Hallmark · macrostructure: … */` stamp at the top of its CSS. See the full set under [`site/_tests/`](site/_tests/) or live at [www.usehallmark.com](https://www.usehallmark.com).
80
-
81
- ---
82
-
83
- ## What's inside
84
-
85
- - **[`SKILL.md`](SKILL.md)** — the routing file. Six-step design flow (including `Step 2.5 · Check project memory` reading `.hallmark/log.json`), 65-gate slop test, output contract, always-on `tokens.css` export.
86
- - **[`references/`](references/)** — short, opinionated rule files: typography, colour, layout, motion, microinteractions, interaction-and-states (with the input-state checklist), responsive, copy, anti-patterns, the 21 named macrostructures, the **40 component archetypes** with variation knobs (9 hero · 6 feature · 4 CTA · 4 testimonial · **8 footer · 9 nav**), the **4 hero polish patterns** (in `hero-enrichment.md`), the 6 primitive structure axes, the vision-extraction protocol for `study`, hero enrichment, custom-craft (CSS art over Lottie), assets, the slop-test gates, four genre rule-overlays (each with nav + footer voice routing), per-verb dispatchers, and the export-formats reference (Tailwind / DTCG / shadcn / tokens.css).
87
- - **[`docs/`](docs/)** — human-reading content: **[`recipes.md`](docs/recipes.md)** (8 worked briefs + a canonical try-it prompt) and **[`study-examples.md`](docs/study-examples.md)** (3 worked DNA-extractions). Not auto-loaded by the skill.
88
- - **[`site/`](site/)** — a self-demonstrating landing page. Hand-written HTML + CSS + ES module, no framework, no build step. **Twenty-two themes** clustered into four genres: **editorial** (Specimen, Editorial, Atelier, Newsprint, Salon, Linen, Almanac, Garden, Studio, Sport, Riso, Brutal, Manifesto), **modern-minimal** (Quiet, Coral, Violet), **atmospheric** (Midnight, Terminal, Bloom, Aurora, Halo), **playful** (Plume). Switching themes literally rebuilds the page — different hero archetype, different footer archetype, different nav archetype.
89
-
90
- ---
91
-
92
- ## What's distinct (the long list)
93
-
94
- - **One skill, four verbs.** Not eighteen commands.
95
- - **Genres broaden the range.** Hallmark routes a brief through one of four genres before picking a theme: **editorial** (default · the canonical anti-slop voice), **modern-minimal** (Stripe / Linear / ElevenLabs school), **atmospheric** (Suno / Runway / dark-AI-tool school), **playful** (post-Linear soft school). Each genre is its own rule overlay — atmospheric allows radial blooms; modern-minimal allows pure white and pill CTAs; editorial bans both. Detection is signal-based, silent default to editorial.
96
- - **Tone is a first-class decision.** "Clean and modern" is rejected. Pick an extreme — *editorial · brutalist · soft · technical · luxury · playful · austere*.
97
- - **Macrostructures over axes.** Pick one of 21 named whole-page shapes wholesale; the macrostructure stamp lives in the CSS comment, so the next Hallmark run picks something different.
98
- - **Within-archetype variation.** Two Bento Grids should not be twins; each archetype has 2–3 picked-per-output knobs.
99
- - **Microinteractions as discipline.** Silent success over celebratory toasts. Optimistic update + Undo over confirm dialogs. Hover delay 800 ms, focus delay 0 ms.
100
- - **A 65-gate slop test** runs before every output. One yes fails the build. Recent additions: typography discipline gates (39–40: max three font families per page, outlier face used in ≤ 2 slots), input-state gates (41–45: no border-width layout shift, focus ring via outline not border, input height matches button height, helper-text slot reserves height, disabled state needs three independent signals), contrast gates (46–50: APCA / WCAG thresholds, accent-ink token requirement, dark-section ink-on-ink check), **nav · footer · hero structural gates (51–55: AI nav fingerprint, AI footer fingerprint, hero centred-everything, hero padding asymmetry, decorative-without-purpose)**, **honest-copy + chrome + token + responsive gates (56–60: invented metrics, re-drawn UI chrome, mid-render token improvisation, two-line clickable text, emoji-as-feature-icon)**, and **layout-safety gates (61–65: 1fr image-track overflow, missing `overflow-x: clip`, display-header word-break, theme section-head mobile collapse, CSS-only radio tabs scroll-jumping)**.
101
- - **Project memory.** A per-project `.hallmark/log.json` records each run's macrostructure + theme + enrichment + brief summary. The skill reads the last 3–5 entries before picking and writes a new entry after each build, so consecutive Hallmark outputs in the same project don't repeat shapes or themes.
102
- - **Theme-diversification rule.** Two consecutive themes must differ on at least one of three axes: paper band (dark / mid / light), display style (italic-serif / roman-serif / geometric-sans / mono / display-heavy / system-native), accent hue (warm / cool / neutral / chromatic-other).
103
- - **Voice fixtures over LLM defaults.** Each of the 21 macrostructures ships with 2–3 example opening lines tuned to its tone. "Built for the modern team" is in the banned-phrases list.
104
- - **Hero enrichment is opt-in.** A typographic-only hero is always acceptable. When enrichment is right, the skill picks from a six-tier hierarchy: typography only → custom-built CSS art → hand-built SVG → generated illustration (Nanobanana / Recraft) → library → Lottie (last resort).
105
- - **Microinteractions default-on for SaaS-shaped archetypes.** Bento Grid, Stat-Led, Workbench, Marquee Hero pages ship with 2–3 purposeful microinteractions (number reveal, pricing lift, marquee, stagger) without the user having to ask. Editorial / Manifesto / Letter / Quote-Led pages stay still.
106
- - **SaaS page sequence.** Hero → social proof → features → testimonials → pricing → FAQ → CTA → footer. Real prices, not "contact sales for pricing." Specific testimonials with role + company.
107
- - **Wordmark may use a different display face.** A Geist-bodied SaaS page can set its wordmark in Fraunces. Same-family collapse on Bento / Stat-Led / Workbench / Marquee Hero is the new "un-branded" tell.
108
- - **`study` extracts DNA, not pixels.** Refusal heuristics, type-role vocabulary (no font ID guessing in image mode), confirmation step before any code. Accepts a screenshot *or* a URL — URL mode reads HTML / CSS via WebFetch and names exact fonts + exact tokens (trades the rhythm pass for accuracy on everything else), with a graceful screenshot fallback when the URL is auth-walled or a JS-only shell. Three worked examples in [`docs/study-examples.md`](docs/study-examples.md).
109
- - **Opt-in `design.md` lock-the-system flow — two entry points.** Iterate freely on the first builds; when the system is settled, say *"lock the system"* (or *"give me a design.md"*) and Hallmark extracts the build's tokens + voice into a portable design system at the project root. **Or**, after a `study` diagnosis, say *"lock the DNA"* and Hallmark emits the same `design.md` format seeded from the studied source — URL mode populates exact tokens + fonts; image mode populates estimated bands + candidate fonts. From that point on every Hallmark run defers to the file, the diversification rule inverts to consistency, and the file becomes the single source of truth for scaling the design across a real app. The study-mode emission carries a tighter refusal layer than the diagnosis itself — third-party URLs require user attestation (your own site / public reference for your own brand), competitors and paid templates are auto-refused. Phrase-triggered from either entry point, never auto-emitted. See [`references/design-md.md`](references/design-md.md).
110
-
111
- ---
112
-
113
- ## Install
114
-
115
- ```
116
- npx skills add nutlope/hallmark
117
- ```
118
-
119
- Or copy [`SKILL.md`](SKILL.md) + [`references/`](references/) into one of:
120
-
121
- - **Claude Code** — `~/.claude/skills/hallmark/`
122
- - **Cursor** — `.cursor/rules/hallmark.mdc` (body of `SKILL.md`, no frontmatter)
123
- - **Codex** — `~/.codex/skills/hallmark/` (personal, all projects) or `.codex/skills/hallmark/` (project-scoped, commit to repo)
124
-
125
- ## Updating
126
-
127
- ```
128
- npx skills add nutlope/hallmark
129
- ```
130
-
131
- Re-run any time to pull the latest. If the CLI complains the skill already exists, delete the install path first (`~/.claude/skills/hallmark/` on Claude Code, or `.agents/skills/hallmark/` if you ran `skills add` from a project directory) and re-run.
132
-
133
- To preview the landing page locally:
134
-
135
- ```
136
- cd site && python3 -m http.server 4173 # → http://localhost:4173
137
- ```
138
-
139
- Press `T` to cycle themes, the **shuffle button** (or `R`) to randomise, `?theme=studio` for a shareable link.
140
-
141
- Or visit the live deploy at **[www.usehallmark.com](https://www.usehallmark.com)**.
142
-
143
- ---
144
-
145
- ## Licence
146
-
147
- MIT. Use it, fork it, ship it.