pm-workflow-studio 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (592) hide show
  1. package/.claude/CLAUDE.md +31 -0
  2. package/.claude/agents/demand-analyst.md +26 -0
  3. package/.claude/agents/dev-planner.md +22 -0
  4. package/.claude/agents/product-manager.md +25 -0
  5. package/.claude/agents/quality-reviewer.md +31 -0
  6. package/.claude/agents/tech-architect.md +22 -0
  7. package/.claude/agents/ui-designer.md +39 -0
  8. package/.claude/commands/pm-workflow/analyze.md +6 -0
  9. package/.claude/commands/pm-workflow/architect.md +6 -0
  10. package/.claude/commands/pm-workflow/deliver.md +6 -0
  11. package/.claude/commands/pm-workflow/design.md +6 -0
  12. package/.claude/commands/pm-workflow/help.md +6 -0
  13. package/.claude/commands/pm-workflow/init.md +8 -0
  14. package/.claude/commands/pm-workflow/plan.md +6 -0
  15. package/.claude/commands/pm-workflow/review.md +6 -0
  16. package/.claude/commands/pm-workflow/status.md +6 -0
  17. package/.claude/commands/pm-workflow.md +13 -0
  18. package/.claude/settings.json +15 -0
  19. package/.claude/skills/demand-analysis/SKILL.md +50 -0
  20. package/.claude/skills/demand-analysis/templates/handoff-prd.md +39 -0
  21. package/.claude/skills/demand-analysis/templates/prd.md +85 -0
  22. package/.claude/skills/dev-task-planning/SKILL.md +37 -0
  23. package/.claude/skills/dev-task-planning/templates/dev-tasks.md +54 -0
  24. package/.claude/skills/impeccable/SKILL.md +169 -0
  25. package/.claude/skills/impeccable/reference/adapt.md +190 -0
  26. package/.claude/skills/impeccable/reference/animate.md +175 -0
  27. package/.claude/skills/impeccable/reference/audit.md +133 -0
  28. package/.claude/skills/impeccable/reference/bolder.md +113 -0
  29. package/.claude/skills/impeccable/reference/brand.md +118 -0
  30. package/.claude/skills/impeccable/reference/clarify.md +174 -0
  31. package/.claude/skills/impeccable/reference/codex.md +105 -0
  32. package/.claude/skills/impeccable/reference/cognitive-load.md +106 -0
  33. package/.claude/skills/impeccable/reference/color-and-contrast.md +105 -0
  34. package/.claude/skills/impeccable/reference/colorize.md +154 -0
  35. package/.claude/skills/impeccable/reference/craft.md +123 -0
  36. package/.claude/skills/impeccable/reference/critique.md +236 -0
  37. package/.claude/skills/impeccable/reference/delight.md +302 -0
  38. package/.claude/skills/impeccable/reference/distill.md +111 -0
  39. package/.claude/skills/impeccable/reference/document.md +427 -0
  40. package/.claude/skills/impeccable/reference/extract.md +69 -0
  41. package/.claude/skills/impeccable/reference/harden.md +347 -0
  42. package/.claude/skills/impeccable/reference/heuristics-scoring.md +234 -0
  43. package/.claude/skills/impeccable/reference/interaction-design.md +195 -0
  44. package/.claude/skills/impeccable/reference/layout.md +141 -0
  45. package/.claude/skills/impeccable/reference/live.md +622 -0
  46. package/.claude/skills/impeccable/reference/motion-design.md +109 -0
  47. package/.claude/skills/impeccable/reference/onboard.md +234 -0
  48. package/.claude/skills/impeccable/reference/optimize.md +258 -0
  49. package/.claude/skills/impeccable/reference/overdrive.md +130 -0
  50. package/.claude/skills/impeccable/reference/personas.md +179 -0
  51. package/.claude/skills/impeccable/reference/polish.md +242 -0
  52. package/.claude/skills/impeccable/reference/product.md +62 -0
  53. package/.claude/skills/impeccable/reference/quieter.md +99 -0
  54. package/.claude/skills/impeccable/reference/responsive-design.md +114 -0
  55. package/.claude/skills/impeccable/reference/shape.md +165 -0
  56. package/.claude/skills/impeccable/reference/spatial-design.md +100 -0
  57. package/.claude/skills/impeccable/reference/teach.md +156 -0
  58. package/.claude/skills/impeccable/reference/typeset.md +124 -0
  59. package/.claude/skills/impeccable/reference/typography.md +159 -0
  60. package/.claude/skills/impeccable/reference/ux-writing.md +107 -0
  61. package/.claude/skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
  62. package/.claude/skills/impeccable/scripts/command-metadata.json +94 -0
  63. package/.claude/skills/impeccable/scripts/critique-storage.mjs +242 -0
  64. package/.claude/skills/impeccable/scripts/design-parser.mjs +820 -0
  65. package/.claude/skills/impeccable/scripts/detect-csp.mjs +198 -0
  66. package/.claude/skills/impeccable/scripts/detect.mjs +21 -0
  67. package/.claude/skills/impeccable/scripts/detector/browser/injected/index.mjs +1688 -0
  68. package/.claude/skills/impeccable/scripts/detector/cli/main.mjs +232 -0
  69. package/.claude/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +4030 -0
  70. package/.claude/skills/impeccable/scripts/detector/detect-antipatterns.mjs +43 -0
  71. package/.claude/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +251 -0
  72. package/.claude/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +420 -0
  73. package/.claude/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +954 -0
  74. package/.claude/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +174 -0
  75. package/.claude/skills/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +189 -0
  76. package/.claude/skills/impeccable/scripts/detector/findings.mjs +12 -0
  77. package/.claude/skills/impeccable/scripts/detector/node/file-system.mjs +198 -0
  78. package/.claude/skills/impeccable/scripts/detector/profile/profiler.mjs +166 -0
  79. package/.claude/skills/impeccable/scripts/detector/registry/antipatterns.mjs +278 -0
  80. package/.claude/skills/impeccable/scripts/detector/rules/checks.mjs +1948 -0
  81. package/.claude/skills/impeccable/scripts/detector/shared/color.mjs +124 -0
  82. package/.claude/skills/impeccable/scripts/detector/shared/constants.mjs +101 -0
  83. package/.claude/skills/impeccable/scripts/detector/shared/page.mjs +7 -0
  84. package/.claude/skills/impeccable/scripts/impeccable-paths.mjs +110 -0
  85. package/.claude/skills/impeccable/scripts/is-generated.mjs +69 -0
  86. package/.claude/skills/impeccable/scripts/live-accept.mjs +595 -0
  87. package/.claude/skills/impeccable/scripts/live-browser-session.js +123 -0
  88. package/.claude/skills/impeccable/scripts/live-browser.js +4860 -0
  89. package/.claude/skills/impeccable/scripts/live-complete.mjs +75 -0
  90. package/.claude/skills/impeccable/scripts/live-completion.mjs +18 -0
  91. package/.claude/skills/impeccable/scripts/live-inject.mjs +446 -0
  92. package/.claude/skills/impeccable/scripts/live-poll.mjs +200 -0
  93. package/.claude/skills/impeccable/scripts/live-resume.mjs +48 -0
  94. package/.claude/skills/impeccable/scripts/live-server.mjs +838 -0
  95. package/.claude/skills/impeccable/scripts/live-session-store.mjs +254 -0
  96. package/.claude/skills/impeccable/scripts/live-status.mjs +47 -0
  97. package/.claude/skills/impeccable/scripts/live-wrap.mjs +632 -0
  98. package/.claude/skills/impeccable/scripts/live.mjs +247 -0
  99. package/.claude/skills/impeccable/scripts/load-context.mjs +141 -0
  100. package/.claude/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
  101. package/.claude/skills/impeccable/scripts/pin.mjs +214 -0
  102. package/.claude/skills/pm-workflow/SKILL.md +371 -0
  103. package/.claude/skills/pm-workflow/assets/design-themes/README.md +56 -0
  104. package/.claude/skills/pm-workflow/assets/design-themes/open-design/OPEN_DESIGN_COMMIT +1 -0
  105. package/.claude/skills/pm-workflow/assets/design-themes/open-design/OPEN_DESIGN_IMPORT.md +28 -0
  106. package/.claude/skills/pm-workflow/assets/design-themes/open-design/OPEN_DESIGN_LICENSE +201 -0
  107. package/.claude/skills/pm-workflow/assets/design-themes/open-design/README.md +103 -0
  108. package/.claude/skills/pm-workflow/assets/design-themes/open-design/agentic/DESIGN.md +71 -0
  109. package/.claude/skills/pm-workflow/assets/design-themes/open-design/airbnb/DESIGN.md +393 -0
  110. package/.claude/skills/pm-workflow/assets/design-themes/open-design/airbnb/examples.html +23 -0
  111. package/.claude/skills/pm-workflow/assets/design-themes/open-design/airtable/DESIGN.md +92 -0
  112. package/.claude/skills/pm-workflow/assets/design-themes/open-design/apple/DESIGN.md +250 -0
  113. package/.claude/skills/pm-workflow/assets/design-themes/open-design/apple/examples.html +23 -0
  114. package/.claude/skills/pm-workflow/assets/design-themes/open-design/application/DESIGN.md +71 -0
  115. package/.claude/skills/pm-workflow/assets/design-themes/open-design/arc/DESIGN.md +152 -0
  116. package/.claude/skills/pm-workflow/assets/design-themes/open-design/artistic/DESIGN.md +71 -0
  117. package/.claude/skills/pm-workflow/assets/design-themes/open-design/atelier-zero/DESIGN.md +316 -0
  118. package/.claude/skills/pm-workflow/assets/design-themes/open-design/bento/DESIGN.md +71 -0
  119. package/.claude/skills/pm-workflow/assets/design-themes/open-design/binance/DESIGN.md +348 -0
  120. package/.claude/skills/pm-workflow/assets/design-themes/open-design/bmw/DESIGN.md +183 -0
  121. package/.claude/skills/pm-workflow/assets/design-themes/open-design/bmw-m/DESIGN.md +246 -0
  122. package/.claude/skills/pm-workflow/assets/design-themes/open-design/bold/DESIGN.md +71 -0
  123. package/.claude/skills/pm-workflow/assets/design-themes/open-design/brutalism/DESIGN.md +71 -0
  124. package/.claude/skills/pm-workflow/assets/design-themes/open-design/bugatti/DESIGN.md +271 -0
  125. package/.claude/skills/pm-workflow/assets/design-themes/open-design/cafe/DESIGN.md +71 -0
  126. package/.claude/skills/pm-workflow/assets/design-themes/open-design/cal/DESIGN.md +262 -0
  127. package/.claude/skills/pm-workflow/assets/design-themes/open-design/canva/DESIGN.md +157 -0
  128. package/.claude/skills/pm-workflow/assets/design-themes/open-design/cisco/DESIGN.md +201 -0
  129. package/.claude/skills/pm-workflow/assets/design-themes/open-design/claude/DESIGN.md +315 -0
  130. package/.claude/skills/pm-workflow/assets/design-themes/open-design/clay/DESIGN.md +307 -0
  131. package/.claude/skills/pm-workflow/assets/design-themes/open-design/claymorphism/DESIGN.md +71 -0
  132. package/.claude/skills/pm-workflow/assets/design-themes/open-design/clean/DESIGN.md +71 -0
  133. package/.claude/skills/pm-workflow/assets/design-themes/open-design/clickhouse/DESIGN.md +284 -0
  134. package/.claude/skills/pm-workflow/assets/design-themes/open-design/cohere/DESIGN.md +269 -0
  135. package/.claude/skills/pm-workflow/assets/design-themes/open-design/coinbase/DESIGN.md +132 -0
  136. package/.claude/skills/pm-workflow/assets/design-themes/open-design/colorful/DESIGN.md +71 -0
  137. package/.claude/skills/pm-workflow/assets/design-themes/open-design/composio/DESIGN.md +310 -0
  138. package/.claude/skills/pm-workflow/assets/design-themes/open-design/contemporary/DESIGN.md +71 -0
  139. package/.claude/skills/pm-workflow/assets/design-themes/open-design/corporate/DESIGN.md +71 -0
  140. package/.claude/skills/pm-workflow/assets/design-themes/open-design/cosmic/DESIGN.md +71 -0
  141. package/.claude/skills/pm-workflow/assets/design-themes/open-design/creative/DESIGN.md +71 -0
  142. package/.claude/skills/pm-workflow/assets/design-themes/open-design/cursor/DESIGN.md +312 -0
  143. package/.claude/skills/pm-workflow/assets/design-themes/open-design/dashboard/DESIGN.md +71 -0
  144. package/.claude/skills/pm-workflow/assets/design-themes/open-design/default/DESIGN.md +62 -0
  145. package/.claude/skills/pm-workflow/assets/design-themes/open-design/discord/DESIGN.md +162 -0
  146. package/.claude/skills/pm-workflow/assets/design-themes/open-design/dithered/DESIGN.md +71 -0
  147. package/.claude/skills/pm-workflow/assets/design-themes/open-design/doodle/DESIGN.md +71 -0
  148. package/.claude/skills/pm-workflow/assets/design-themes/open-design/dramatic/DESIGN.md +71 -0
  149. package/.claude/skills/pm-workflow/assets/design-themes/open-design/duolingo/DESIGN.md +154 -0
  150. package/.claude/skills/pm-workflow/assets/design-themes/open-design/editorial/DESIGN.md +71 -0
  151. package/.claude/skills/pm-workflow/assets/design-themes/open-design/elegant/DESIGN.md +71 -0
  152. package/.claude/skills/pm-workflow/assets/design-themes/open-design/elevenlabs/DESIGN.md +268 -0
  153. package/.claude/skills/pm-workflow/assets/design-themes/open-design/energetic/DESIGN.md +72 -0
  154. package/.claude/skills/pm-workflow/assets/design-themes/open-design/enterprise/DESIGN.md +71 -0
  155. package/.claude/skills/pm-workflow/assets/design-themes/open-design/expo/DESIGN.md +284 -0
  156. package/.claude/skills/pm-workflow/assets/design-themes/open-design/expressive/DESIGN.md +71 -0
  157. package/.claude/skills/pm-workflow/assets/design-themes/open-design/fantasy/DESIGN.md +71 -0
  158. package/.claude/skills/pm-workflow/assets/design-themes/open-design/ferrari/DESIGN.md +317 -0
  159. package/.claude/skills/pm-workflow/assets/design-themes/open-design/figma/DESIGN.md +223 -0
  160. package/.claude/skills/pm-workflow/assets/design-themes/open-design/flat/DESIGN.md +71 -0
  161. package/.claude/skills/pm-workflow/assets/design-themes/open-design/framer/DESIGN.md +249 -0
  162. package/.claude/skills/pm-workflow/assets/design-themes/open-design/friendly/DESIGN.md +71 -0
  163. package/.claude/skills/pm-workflow/assets/design-themes/open-design/futuristic/DESIGN.md +71 -0
  164. package/.claude/skills/pm-workflow/assets/design-themes/open-design/glassmorphism/DESIGN.md +71 -0
  165. package/.claude/skills/pm-workflow/assets/design-themes/open-design/gradient/DESIGN.md +71 -0
  166. package/.claude/skills/pm-workflow/assets/design-themes/open-design/hashicorp/DESIGN.md +281 -0
  167. package/.claude/skills/pm-workflow/assets/design-themes/open-design/hud/DESIGN.md +173 -0
  168. package/.claude/skills/pm-workflow/assets/design-themes/open-design/huggingface/DESIGN.md +149 -0
  169. package/.claude/skills/pm-workflow/assets/design-themes/open-design/huggingface/examples.html +11 -0
  170. package/.claude/skills/pm-workflow/assets/design-themes/open-design/intercom/DESIGN.md +149 -0
  171. package/.claude/skills/pm-workflow/assets/design-themes/open-design/kami/DESIGN.md +410 -0
  172. package/.claude/skills/pm-workflow/assets/design-themes/open-design/kraken/DESIGN.md +128 -0
  173. package/.claude/skills/pm-workflow/assets/design-themes/open-design/lamborghini/DESIGN.md +291 -0
  174. package/.claude/skills/pm-workflow/assets/design-themes/open-design/levels/DESIGN.md +71 -0
  175. package/.claude/skills/pm-workflow/assets/design-themes/open-design/linear-app/DESIGN.md +370 -0
  176. package/.claude/skills/pm-workflow/assets/design-themes/open-design/linear-app/examples.html +56 -0
  177. package/.claude/skills/pm-workflow/assets/design-themes/open-design/lingo/DESIGN.md +71 -0
  178. package/.claude/skills/pm-workflow/assets/design-themes/open-design/loom/DESIGN.md +201 -0
  179. package/.claude/skills/pm-workflow/assets/design-themes/open-design/lovable/DESIGN.md +301 -0
  180. package/.claude/skills/pm-workflow/assets/design-themes/open-design/luxury/DESIGN.md +71 -0
  181. package/.claude/skills/pm-workflow/assets/design-themes/open-design/mastercard/DESIGN.md +368 -0
  182. package/.claude/skills/pm-workflow/assets/design-themes/open-design/material/DESIGN.md +71 -0
  183. package/.claude/skills/pm-workflow/assets/design-themes/open-design/material/examples.html +11 -0
  184. package/.claude/skills/pm-workflow/assets/design-themes/open-design/meta/DESIGN.md +369 -0
  185. package/.claude/skills/pm-workflow/assets/design-themes/open-design/minimal/DESIGN.md +71 -0
  186. package/.claude/skills/pm-workflow/assets/design-themes/open-design/minimax/DESIGN.md +260 -0
  187. package/.claude/skills/pm-workflow/assets/design-themes/open-design/mintlify/DESIGN.md +329 -0
  188. package/.claude/skills/pm-workflow/assets/design-themes/open-design/miro/DESIGN.md +111 -0
  189. package/.claude/skills/pm-workflow/assets/design-themes/open-design/mission-control/DESIGN.md +474 -0
  190. package/.claude/skills/pm-workflow/assets/design-themes/open-design/mistral-ai/DESIGN.md +264 -0
  191. package/.claude/skills/pm-workflow/assets/design-themes/open-design/modern/DESIGN.md +71 -0
  192. package/.claude/skills/pm-workflow/assets/design-themes/open-design/mongodb/DESIGN.md +269 -0
  193. package/.claude/skills/pm-workflow/assets/design-themes/open-design/mongodb/examples.html +14 -0
  194. package/.claude/skills/pm-workflow/assets/design-themes/open-design/mono/DESIGN.md +71 -0
  195. package/.claude/skills/pm-workflow/assets/design-themes/open-design/neobrutalism/DESIGN.md +71 -0
  196. package/.claude/skills/pm-workflow/assets/design-themes/open-design/neon/DESIGN.md +71 -0
  197. package/.claude/skills/pm-workflow/assets/design-themes/open-design/neumorphism/DESIGN.md +71 -0
  198. package/.claude/skills/pm-workflow/assets/design-themes/open-design/nike/DESIGN.md +366 -0
  199. package/.claude/skills/pm-workflow/assets/design-themes/open-design/notion/DESIGN.md +312 -0
  200. package/.claude/skills/pm-workflow/assets/design-themes/open-design/notion/examples.html +64 -0
  201. package/.claude/skills/pm-workflow/assets/design-themes/open-design/nvidia/DESIGN.md +296 -0
  202. package/.claude/skills/pm-workflow/assets/design-themes/open-design/ollama/DESIGN.md +270 -0
  203. package/.claude/skills/pm-workflow/assets/design-themes/open-design/openai/DESIGN.md +140 -0
  204. package/.claude/skills/pm-workflow/assets/design-themes/open-design/openai/examples.html +14 -0
  205. package/.claude/skills/pm-workflow/assets/design-themes/open-design/opencode-ai/DESIGN.md +284 -0
  206. package/.claude/skills/pm-workflow/assets/design-themes/open-design/pacman/DESIGN.md +71 -0
  207. package/.claude/skills/pm-workflow/assets/design-themes/open-design/paper/DESIGN.md +71 -0
  208. package/.claude/skills/pm-workflow/assets/design-themes/open-design/perspective/DESIGN.md +71 -0
  209. package/.claude/skills/pm-workflow/assets/design-themes/open-design/pinterest/DESIGN.md +233 -0
  210. package/.claude/skills/pm-workflow/assets/design-themes/open-design/playstation/DESIGN.md +367 -0
  211. package/.claude/skills/pm-workflow/assets/design-themes/open-design/posthog/DESIGN.md +259 -0
  212. package/.claude/skills/pm-workflow/assets/design-themes/open-design/premium/DESIGN.md +71 -0
  213. package/.claude/skills/pm-workflow/assets/design-themes/open-design/professional/DESIGN.md +71 -0
  214. package/.claude/skills/pm-workflow/assets/design-themes/open-design/publication/DESIGN.md +71 -0
  215. package/.claude/skills/pm-workflow/assets/design-themes/open-design/raycast/DESIGN.md +271 -0
  216. package/.claude/skills/pm-workflow/assets/design-themes/open-design/raycast/examples.html +11 -0
  217. package/.claude/skills/pm-workflow/assets/design-themes/open-design/refined/DESIGN.md +71 -0
  218. package/.claude/skills/pm-workflow/assets/design-themes/open-design/renault/DESIGN.md +314 -0
  219. package/.claude/skills/pm-workflow/assets/design-themes/open-design/replicate/DESIGN.md +264 -0
  220. package/.claude/skills/pm-workflow/assets/design-themes/open-design/resend/DESIGN.md +306 -0
  221. package/.claude/skills/pm-workflow/assets/design-themes/open-design/retro/DESIGN.md +71 -0
  222. package/.claude/skills/pm-workflow/assets/design-themes/open-design/revolut/DESIGN.md +188 -0
  223. package/.claude/skills/pm-workflow/assets/design-themes/open-design/runwayml/DESIGN.md +247 -0
  224. package/.claude/skills/pm-workflow/assets/design-themes/open-design/sanity/DESIGN.md +360 -0
  225. package/.claude/skills/pm-workflow/assets/design-themes/open-design/sentry/DESIGN.md +265 -0
  226. package/.claude/skills/pm-workflow/assets/design-themes/open-design/shadcn/DESIGN.md +71 -0
  227. package/.claude/skills/pm-workflow/assets/design-themes/open-design/shadcn/examples.html +24 -0
  228. package/.claude/skills/pm-workflow/assets/design-themes/open-design/shopify/DESIGN.md +353 -0
  229. package/.claude/skills/pm-workflow/assets/design-themes/open-design/shopify/examples.html +11 -0
  230. package/.claude/skills/pm-workflow/assets/design-themes/open-design/simple/DESIGN.md +71 -0
  231. package/.claude/skills/pm-workflow/assets/design-themes/open-design/skeumorphism/DESIGN.md +71 -0
  232. package/.claude/skills/pm-workflow/assets/design-themes/open-design/sleek/DESIGN.md +71 -0
  233. package/.claude/skills/pm-workflow/assets/design-themes/open-design/spacex/DESIGN.md +197 -0
  234. package/.claude/skills/pm-workflow/assets/design-themes/open-design/spacious/DESIGN.md +71 -0
  235. package/.claude/skills/pm-workflow/assets/design-themes/open-design/spotify/DESIGN.md +249 -0
  236. package/.claude/skills/pm-workflow/assets/design-themes/open-design/starbucks/DESIGN.md +583 -0
  237. package/.claude/skills/pm-workflow/assets/design-themes/open-design/storytelling/DESIGN.md +71 -0
  238. package/.claude/skills/pm-workflow/assets/design-themes/open-design/stripe/DESIGN.md +325 -0
  239. package/.claude/skills/pm-workflow/assets/design-themes/open-design/stripe/examples.html +58 -0
  240. package/.claude/skills/pm-workflow/assets/design-themes/open-design/supabase/DESIGN.md +258 -0
  241. package/.claude/skills/pm-workflow/assets/design-themes/open-design/supabase/examples.html +26 -0
  242. package/.claude/skills/pm-workflow/assets/design-themes/open-design/superhuman/DESIGN.md +255 -0
  243. package/.claude/skills/pm-workflow/assets/design-themes/open-design/tesla/DESIGN.md +289 -0
  244. package/.claude/skills/pm-workflow/assets/design-themes/open-design/tetris/DESIGN.md +71 -0
  245. package/.claude/skills/pm-workflow/assets/design-themes/open-design/theverge/DESIGN.md +342 -0
  246. package/.claude/skills/pm-workflow/assets/design-themes/open-design/together-ai/DESIGN.md +266 -0
  247. package/.claude/skills/pm-workflow/assets/design-themes/open-design/totality-festival/DESIGN.md +206 -0
  248. package/.claude/skills/pm-workflow/assets/design-themes/open-design/trading-terminal/DESIGN.md +178 -0
  249. package/.claude/skills/pm-workflow/assets/design-themes/open-design/uber/DESIGN.md +298 -0
  250. package/.claude/skills/pm-workflow/assets/design-themes/open-design/urdu/DESIGN.md +1002 -0
  251. package/.claude/skills/pm-workflow/assets/design-themes/open-design/vercel/DESIGN.md +313 -0
  252. package/.claude/skills/pm-workflow/assets/design-themes/open-design/vercel/examples.html +55 -0
  253. package/.claude/skills/pm-workflow/assets/design-themes/open-design/vibrant/DESIGN.md +71 -0
  254. package/.claude/skills/pm-workflow/assets/design-themes/open-design/vintage/DESIGN.md +71 -0
  255. package/.claude/skills/pm-workflow/assets/design-themes/open-design/vodafone/DESIGN.md +426 -0
  256. package/.claude/skills/pm-workflow/assets/design-themes/open-design/voltagent/DESIGN.md +326 -0
  257. package/.claude/skills/pm-workflow/assets/design-themes/open-design/warm-editorial/DESIGN.md +65 -0
  258. package/.claude/skills/pm-workflow/assets/design-themes/open-design/warp/DESIGN.md +256 -0
  259. package/.claude/skills/pm-workflow/assets/design-themes/open-design/webex/DESIGN.md +207 -0
  260. package/.claude/skills/pm-workflow/assets/design-themes/open-design/webflow/DESIGN.md +95 -0
  261. package/.claude/skills/pm-workflow/assets/design-themes/open-design/webflow/examples.html +11 -0
  262. package/.claude/skills/pm-workflow/assets/design-themes/open-design/wired/DESIGN.md +281 -0
  263. package/.claude/skills/pm-workflow/assets/design-themes/open-design/wise/DESIGN.md +176 -0
  264. package/.claude/skills/pm-workflow/assets/design-themes/open-design/x-ai/DESIGN.md +260 -0
  265. package/.claude/skills/pm-workflow/assets/design-themes/open-design/x-ai/examples.html +12 -0
  266. package/.claude/skills/pm-workflow/assets/design-themes/open-design/xiaohongshu/DESIGN.md +402 -0
  267. package/.claude/skills/pm-workflow/assets/design-themes/open-design/zapier/DESIGN.md +331 -0
  268. package/.claude/skills/pm-workflow/assets/design-themes/revenuecat/DESIGN.md +209 -0
  269. package/.claude/skills/pm-workflow/assets/design-themes/revenuecat/examples.html +122 -0
  270. package/.claude/skills/pm-workflow/assets/design-themes/vben/DESIGN.md +685 -0
  271. package/.claude/skills/pm-workflow/assets/design-themes/vben/examples.html +155 -0
  272. package/.claude/skills/pm-workflow/assets/vendor/flow-viewer/MERMAID_LICENSE +21 -0
  273. package/.claude/skills/pm-workflow/assets/vendor/flow-viewer/SVG_PAN_ZOOM_LICENSE +23 -0
  274. package/.claude/skills/pm-workflow/assets/vendor/flow-viewer/THIRD_PARTY_LICENSES.md +21 -0
  275. package/.claude/skills/pm-workflow/assets/vendor/flow-viewer/mermaid.min.js +3298 -0
  276. package/.claude/skills/pm-workflow/assets/vendor/flow-viewer/svg-pan-zoom.min.js +3 -0
  277. package/.claude/skills/pm-workflow/references/commands/analyze.md +39 -0
  278. package/.claude/skills/pm-workflow/references/commands/architect.md +41 -0
  279. package/.claude/skills/pm-workflow/references/commands/deliver.md +29 -0
  280. package/.claude/skills/pm-workflow/references/commands/design.md +92 -0
  281. package/.claude/skills/pm-workflow/references/commands/help.md +24 -0
  282. package/.claude/skills/pm-workflow/references/commands/init.md +40 -0
  283. package/.claude/skills/pm-workflow/references/commands/plan.md +41 -0
  284. package/.claude/skills/pm-workflow/references/commands/review.md +33 -0
  285. package/.claude/skills/pm-workflow/references/commands/status.md +20 -0
  286. package/.claude/skills/pm-workflow/scripts/package_delivery.js +195 -0
  287. package/.claude/skills/pm-workflow/scripts/review_stage.js +622 -0
  288. package/.claude/skills/quality-review/SKILL.md +49 -0
  289. package/.claude/skills/quality-review/templates/review-stage.md +39 -0
  290. package/.claude/skills/tech-architecture/SKILL.md +49 -0
  291. package/.claude/skills/tech-architecture/templates/handoff-architecture.md +28 -0
  292. package/.claude/skills/tech-architecture/templates/tech-architecture.md +54 -0
  293. package/.claude/skills/ui-prototype-design/SKILL.md +125 -0
  294. package/.claude/skills/ui-prototype-design/templates/handoff-ui.md +40 -0
  295. package/.claude/skills/ui-prototype-design/templates/prototype-review.md +57 -0
  296. package/.claude/skills/ui-prototype-design/templates/ui-design.md +142 -0
  297. package/.codex/SKILL.md +374 -0
  298. package/.codex/agents/demand-analyst.toml +87 -0
  299. package/.codex/agents/dev-planner.toml +47 -0
  300. package/.codex/agents/openai.yaml +4 -0
  301. package/.codex/agents/product-manager.toml +81 -0
  302. package/.codex/agents/quality-reviewer.toml +76 -0
  303. package/.codex/agents/tech-architect.toml +57 -0
  304. package/.codex/agents/ui-designer.toml +132 -0
  305. package/.codex/assets/design-themes/README.md +56 -0
  306. package/.codex/assets/design-themes/open-design/OPEN_DESIGN_COMMIT +1 -0
  307. package/.codex/assets/design-themes/open-design/OPEN_DESIGN_IMPORT.md +28 -0
  308. package/.codex/assets/design-themes/open-design/OPEN_DESIGN_LICENSE +201 -0
  309. package/.codex/assets/design-themes/open-design/README.md +103 -0
  310. package/.codex/assets/design-themes/open-design/agentic/DESIGN.md +71 -0
  311. package/.codex/assets/design-themes/open-design/airbnb/DESIGN.md +393 -0
  312. package/.codex/assets/design-themes/open-design/airbnb/examples.html +23 -0
  313. package/.codex/assets/design-themes/open-design/airtable/DESIGN.md +92 -0
  314. package/.codex/assets/design-themes/open-design/apple/DESIGN.md +250 -0
  315. package/.codex/assets/design-themes/open-design/apple/examples.html +23 -0
  316. package/.codex/assets/design-themes/open-design/application/DESIGN.md +71 -0
  317. package/.codex/assets/design-themes/open-design/arc/DESIGN.md +152 -0
  318. package/.codex/assets/design-themes/open-design/artistic/DESIGN.md +71 -0
  319. package/.codex/assets/design-themes/open-design/atelier-zero/DESIGN.md +316 -0
  320. package/.codex/assets/design-themes/open-design/bento/DESIGN.md +71 -0
  321. package/.codex/assets/design-themes/open-design/binance/DESIGN.md +348 -0
  322. package/.codex/assets/design-themes/open-design/bmw/DESIGN.md +183 -0
  323. package/.codex/assets/design-themes/open-design/bmw-m/DESIGN.md +246 -0
  324. package/.codex/assets/design-themes/open-design/bold/DESIGN.md +71 -0
  325. package/.codex/assets/design-themes/open-design/brutalism/DESIGN.md +71 -0
  326. package/.codex/assets/design-themes/open-design/bugatti/DESIGN.md +271 -0
  327. package/.codex/assets/design-themes/open-design/cafe/DESIGN.md +71 -0
  328. package/.codex/assets/design-themes/open-design/cal/DESIGN.md +262 -0
  329. package/.codex/assets/design-themes/open-design/canva/DESIGN.md +157 -0
  330. package/.codex/assets/design-themes/open-design/cisco/DESIGN.md +201 -0
  331. package/.codex/assets/design-themes/open-design/claude/DESIGN.md +315 -0
  332. package/.codex/assets/design-themes/open-design/clay/DESIGN.md +307 -0
  333. package/.codex/assets/design-themes/open-design/claymorphism/DESIGN.md +71 -0
  334. package/.codex/assets/design-themes/open-design/clean/DESIGN.md +71 -0
  335. package/.codex/assets/design-themes/open-design/clickhouse/DESIGN.md +284 -0
  336. package/.codex/assets/design-themes/open-design/cohere/DESIGN.md +269 -0
  337. package/.codex/assets/design-themes/open-design/coinbase/DESIGN.md +132 -0
  338. package/.codex/assets/design-themes/open-design/colorful/DESIGN.md +71 -0
  339. package/.codex/assets/design-themes/open-design/composio/DESIGN.md +310 -0
  340. package/.codex/assets/design-themes/open-design/contemporary/DESIGN.md +71 -0
  341. package/.codex/assets/design-themes/open-design/corporate/DESIGN.md +71 -0
  342. package/.codex/assets/design-themes/open-design/cosmic/DESIGN.md +71 -0
  343. package/.codex/assets/design-themes/open-design/creative/DESIGN.md +71 -0
  344. package/.codex/assets/design-themes/open-design/cursor/DESIGN.md +312 -0
  345. package/.codex/assets/design-themes/open-design/dashboard/DESIGN.md +71 -0
  346. package/.codex/assets/design-themes/open-design/default/DESIGN.md +62 -0
  347. package/.codex/assets/design-themes/open-design/discord/DESIGN.md +162 -0
  348. package/.codex/assets/design-themes/open-design/dithered/DESIGN.md +71 -0
  349. package/.codex/assets/design-themes/open-design/doodle/DESIGN.md +71 -0
  350. package/.codex/assets/design-themes/open-design/dramatic/DESIGN.md +71 -0
  351. package/.codex/assets/design-themes/open-design/duolingo/DESIGN.md +154 -0
  352. package/.codex/assets/design-themes/open-design/editorial/DESIGN.md +71 -0
  353. package/.codex/assets/design-themes/open-design/elegant/DESIGN.md +71 -0
  354. package/.codex/assets/design-themes/open-design/elevenlabs/DESIGN.md +268 -0
  355. package/.codex/assets/design-themes/open-design/energetic/DESIGN.md +72 -0
  356. package/.codex/assets/design-themes/open-design/enterprise/DESIGN.md +71 -0
  357. package/.codex/assets/design-themes/open-design/expo/DESIGN.md +284 -0
  358. package/.codex/assets/design-themes/open-design/expressive/DESIGN.md +71 -0
  359. package/.codex/assets/design-themes/open-design/fantasy/DESIGN.md +71 -0
  360. package/.codex/assets/design-themes/open-design/ferrari/DESIGN.md +317 -0
  361. package/.codex/assets/design-themes/open-design/figma/DESIGN.md +223 -0
  362. package/.codex/assets/design-themes/open-design/flat/DESIGN.md +71 -0
  363. package/.codex/assets/design-themes/open-design/framer/DESIGN.md +249 -0
  364. package/.codex/assets/design-themes/open-design/friendly/DESIGN.md +71 -0
  365. package/.codex/assets/design-themes/open-design/futuristic/DESIGN.md +71 -0
  366. package/.codex/assets/design-themes/open-design/glassmorphism/DESIGN.md +71 -0
  367. package/.codex/assets/design-themes/open-design/gradient/DESIGN.md +71 -0
  368. package/.codex/assets/design-themes/open-design/hashicorp/DESIGN.md +281 -0
  369. package/.codex/assets/design-themes/open-design/hud/DESIGN.md +173 -0
  370. package/.codex/assets/design-themes/open-design/huggingface/DESIGN.md +149 -0
  371. package/.codex/assets/design-themes/open-design/huggingface/examples.html +11 -0
  372. package/.codex/assets/design-themes/open-design/intercom/DESIGN.md +149 -0
  373. package/.codex/assets/design-themes/open-design/kami/DESIGN.md +410 -0
  374. package/.codex/assets/design-themes/open-design/kraken/DESIGN.md +128 -0
  375. package/.codex/assets/design-themes/open-design/lamborghini/DESIGN.md +291 -0
  376. package/.codex/assets/design-themes/open-design/levels/DESIGN.md +71 -0
  377. package/.codex/assets/design-themes/open-design/linear-app/DESIGN.md +370 -0
  378. package/.codex/assets/design-themes/open-design/linear-app/examples.html +56 -0
  379. package/.codex/assets/design-themes/open-design/lingo/DESIGN.md +71 -0
  380. package/.codex/assets/design-themes/open-design/loom/DESIGN.md +201 -0
  381. package/.codex/assets/design-themes/open-design/lovable/DESIGN.md +301 -0
  382. package/.codex/assets/design-themes/open-design/luxury/DESIGN.md +71 -0
  383. package/.codex/assets/design-themes/open-design/mastercard/DESIGN.md +368 -0
  384. package/.codex/assets/design-themes/open-design/material/DESIGN.md +71 -0
  385. package/.codex/assets/design-themes/open-design/material/examples.html +11 -0
  386. package/.codex/assets/design-themes/open-design/meta/DESIGN.md +369 -0
  387. package/.codex/assets/design-themes/open-design/minimal/DESIGN.md +71 -0
  388. package/.codex/assets/design-themes/open-design/minimax/DESIGN.md +260 -0
  389. package/.codex/assets/design-themes/open-design/mintlify/DESIGN.md +329 -0
  390. package/.codex/assets/design-themes/open-design/miro/DESIGN.md +111 -0
  391. package/.codex/assets/design-themes/open-design/mission-control/DESIGN.md +474 -0
  392. package/.codex/assets/design-themes/open-design/mistral-ai/DESIGN.md +264 -0
  393. package/.codex/assets/design-themes/open-design/modern/DESIGN.md +71 -0
  394. package/.codex/assets/design-themes/open-design/mongodb/DESIGN.md +269 -0
  395. package/.codex/assets/design-themes/open-design/mongodb/examples.html +14 -0
  396. package/.codex/assets/design-themes/open-design/mono/DESIGN.md +71 -0
  397. package/.codex/assets/design-themes/open-design/neobrutalism/DESIGN.md +71 -0
  398. package/.codex/assets/design-themes/open-design/neon/DESIGN.md +71 -0
  399. package/.codex/assets/design-themes/open-design/neumorphism/DESIGN.md +71 -0
  400. package/.codex/assets/design-themes/open-design/nike/DESIGN.md +366 -0
  401. package/.codex/assets/design-themes/open-design/notion/DESIGN.md +312 -0
  402. package/.codex/assets/design-themes/open-design/notion/examples.html +64 -0
  403. package/.codex/assets/design-themes/open-design/nvidia/DESIGN.md +296 -0
  404. package/.codex/assets/design-themes/open-design/ollama/DESIGN.md +270 -0
  405. package/.codex/assets/design-themes/open-design/openai/DESIGN.md +140 -0
  406. package/.codex/assets/design-themes/open-design/openai/examples.html +14 -0
  407. package/.codex/assets/design-themes/open-design/opencode-ai/DESIGN.md +284 -0
  408. package/.codex/assets/design-themes/open-design/pacman/DESIGN.md +71 -0
  409. package/.codex/assets/design-themes/open-design/paper/DESIGN.md +71 -0
  410. package/.codex/assets/design-themes/open-design/perspective/DESIGN.md +71 -0
  411. package/.codex/assets/design-themes/open-design/pinterest/DESIGN.md +233 -0
  412. package/.codex/assets/design-themes/open-design/playstation/DESIGN.md +367 -0
  413. package/.codex/assets/design-themes/open-design/posthog/DESIGN.md +259 -0
  414. package/.codex/assets/design-themes/open-design/premium/DESIGN.md +71 -0
  415. package/.codex/assets/design-themes/open-design/professional/DESIGN.md +71 -0
  416. package/.codex/assets/design-themes/open-design/publication/DESIGN.md +71 -0
  417. package/.codex/assets/design-themes/open-design/raycast/DESIGN.md +271 -0
  418. package/.codex/assets/design-themes/open-design/raycast/examples.html +11 -0
  419. package/.codex/assets/design-themes/open-design/refined/DESIGN.md +71 -0
  420. package/.codex/assets/design-themes/open-design/renault/DESIGN.md +314 -0
  421. package/.codex/assets/design-themes/open-design/replicate/DESIGN.md +264 -0
  422. package/.codex/assets/design-themes/open-design/resend/DESIGN.md +306 -0
  423. package/.codex/assets/design-themes/open-design/retro/DESIGN.md +71 -0
  424. package/.codex/assets/design-themes/open-design/revolut/DESIGN.md +188 -0
  425. package/.codex/assets/design-themes/open-design/runwayml/DESIGN.md +247 -0
  426. package/.codex/assets/design-themes/open-design/sanity/DESIGN.md +360 -0
  427. package/.codex/assets/design-themes/open-design/sentry/DESIGN.md +265 -0
  428. package/.codex/assets/design-themes/open-design/shadcn/DESIGN.md +71 -0
  429. package/.codex/assets/design-themes/open-design/shadcn/examples.html +24 -0
  430. package/.codex/assets/design-themes/open-design/shopify/DESIGN.md +353 -0
  431. package/.codex/assets/design-themes/open-design/shopify/examples.html +11 -0
  432. package/.codex/assets/design-themes/open-design/simple/DESIGN.md +71 -0
  433. package/.codex/assets/design-themes/open-design/skeumorphism/DESIGN.md +71 -0
  434. package/.codex/assets/design-themes/open-design/sleek/DESIGN.md +71 -0
  435. package/.codex/assets/design-themes/open-design/spacex/DESIGN.md +197 -0
  436. package/.codex/assets/design-themes/open-design/spacious/DESIGN.md +71 -0
  437. package/.codex/assets/design-themes/open-design/spotify/DESIGN.md +249 -0
  438. package/.codex/assets/design-themes/open-design/starbucks/DESIGN.md +583 -0
  439. package/.codex/assets/design-themes/open-design/storytelling/DESIGN.md +71 -0
  440. package/.codex/assets/design-themes/open-design/stripe/DESIGN.md +325 -0
  441. package/.codex/assets/design-themes/open-design/stripe/examples.html +58 -0
  442. package/.codex/assets/design-themes/open-design/supabase/DESIGN.md +258 -0
  443. package/.codex/assets/design-themes/open-design/supabase/examples.html +26 -0
  444. package/.codex/assets/design-themes/open-design/superhuman/DESIGN.md +255 -0
  445. package/.codex/assets/design-themes/open-design/tesla/DESIGN.md +289 -0
  446. package/.codex/assets/design-themes/open-design/tetris/DESIGN.md +71 -0
  447. package/.codex/assets/design-themes/open-design/theverge/DESIGN.md +342 -0
  448. package/.codex/assets/design-themes/open-design/together-ai/DESIGN.md +266 -0
  449. package/.codex/assets/design-themes/open-design/totality-festival/DESIGN.md +206 -0
  450. package/.codex/assets/design-themes/open-design/trading-terminal/DESIGN.md +178 -0
  451. package/.codex/assets/design-themes/open-design/uber/DESIGN.md +298 -0
  452. package/.codex/assets/design-themes/open-design/urdu/DESIGN.md +1002 -0
  453. package/.codex/assets/design-themes/open-design/vercel/DESIGN.md +313 -0
  454. package/.codex/assets/design-themes/open-design/vercel/examples.html +55 -0
  455. package/.codex/assets/design-themes/open-design/vibrant/DESIGN.md +71 -0
  456. package/.codex/assets/design-themes/open-design/vintage/DESIGN.md +71 -0
  457. package/.codex/assets/design-themes/open-design/vodafone/DESIGN.md +426 -0
  458. package/.codex/assets/design-themes/open-design/voltagent/DESIGN.md +326 -0
  459. package/.codex/assets/design-themes/open-design/warm-editorial/DESIGN.md +65 -0
  460. package/.codex/assets/design-themes/open-design/warp/DESIGN.md +256 -0
  461. package/.codex/assets/design-themes/open-design/webex/DESIGN.md +207 -0
  462. package/.codex/assets/design-themes/open-design/webflow/DESIGN.md +95 -0
  463. package/.codex/assets/design-themes/open-design/webflow/examples.html +11 -0
  464. package/.codex/assets/design-themes/open-design/wired/DESIGN.md +281 -0
  465. package/.codex/assets/design-themes/open-design/wise/DESIGN.md +176 -0
  466. package/.codex/assets/design-themes/open-design/x-ai/DESIGN.md +260 -0
  467. package/.codex/assets/design-themes/open-design/x-ai/examples.html +12 -0
  468. package/.codex/assets/design-themes/open-design/xiaohongshu/DESIGN.md +402 -0
  469. package/.codex/assets/design-themes/open-design/zapier/DESIGN.md +331 -0
  470. package/.codex/assets/design-themes/revenuecat/DESIGN.md +209 -0
  471. package/.codex/assets/design-themes/revenuecat/examples.html +122 -0
  472. package/.codex/assets/design-themes/vben/DESIGN.md +685 -0
  473. package/.codex/assets/design-themes/vben/examples.html +155 -0
  474. package/.codex/assets/vendor/flow-viewer/MERMAID_LICENSE +21 -0
  475. package/.codex/assets/vendor/flow-viewer/SVG_PAN_ZOOM_LICENSE +23 -0
  476. package/.codex/assets/vendor/flow-viewer/THIRD_PARTY_LICENSES.md +21 -0
  477. package/.codex/assets/vendor/flow-viewer/mermaid.min.js +3298 -0
  478. package/.codex/assets/vendor/flow-viewer/svg-pan-zoom.min.js +3 -0
  479. package/.codex/bundled-skills/impeccable/SKILL.md +163 -0
  480. package/.codex/bundled-skills/impeccable/agents/openai.yaml +4 -0
  481. package/.codex/bundled-skills/impeccable/reference/adapt.md +190 -0
  482. package/.codex/bundled-skills/impeccable/reference/animate.md +175 -0
  483. package/.codex/bundled-skills/impeccable/reference/audit.md +132 -0
  484. package/.codex/bundled-skills/impeccable/reference/bolder.md +113 -0
  485. package/.codex/bundled-skills/impeccable/reference/brand.md +118 -0
  486. package/.codex/bundled-skills/impeccable/reference/clarify.md +174 -0
  487. package/.codex/bundled-skills/impeccable/reference/codex.md +105 -0
  488. package/.codex/bundled-skills/impeccable/reference/cognitive-load.md +106 -0
  489. package/.codex/bundled-skills/impeccable/reference/color-and-contrast.md +105 -0
  490. package/.codex/bundled-skills/impeccable/reference/colorize.md +154 -0
  491. package/.codex/bundled-skills/impeccable/reference/craft.md +123 -0
  492. package/.codex/bundled-skills/impeccable/reference/critique.md +259 -0
  493. package/.codex/bundled-skills/impeccable/reference/delight.md +302 -0
  494. package/.codex/bundled-skills/impeccable/reference/distill.md +111 -0
  495. package/.codex/bundled-skills/impeccable/reference/document.md +427 -0
  496. package/.codex/bundled-skills/impeccable/reference/extract.md +68 -0
  497. package/.codex/bundled-skills/impeccable/reference/harden.md +347 -0
  498. package/.codex/bundled-skills/impeccable/reference/heuristics-scoring.md +234 -0
  499. package/.codex/bundled-skills/impeccable/reference/interaction-design.md +195 -0
  500. package/.codex/bundled-skills/impeccable/reference/layout.md +141 -0
  501. package/.codex/bundled-skills/impeccable/reference/live.md +622 -0
  502. package/.codex/bundled-skills/impeccable/reference/motion-design.md +109 -0
  503. package/.codex/bundled-skills/impeccable/reference/onboard.md +234 -0
  504. package/.codex/bundled-skills/impeccable/reference/optimize.md +258 -0
  505. package/.codex/bundled-skills/impeccable/reference/overdrive.md +130 -0
  506. package/.codex/bundled-skills/impeccable/reference/personas.md +179 -0
  507. package/.codex/bundled-skills/impeccable/reference/polish.md +242 -0
  508. package/.codex/bundled-skills/impeccable/reference/product.md +62 -0
  509. package/.codex/bundled-skills/impeccable/reference/quieter.md +99 -0
  510. package/.codex/bundled-skills/impeccable/reference/responsive-design.md +114 -0
  511. package/.codex/bundled-skills/impeccable/reference/shape.md +165 -0
  512. package/.codex/bundled-skills/impeccable/reference/spatial-design.md +100 -0
  513. package/.codex/bundled-skills/impeccable/reference/teach.md +156 -0
  514. package/.codex/bundled-skills/impeccable/reference/typeset.md +124 -0
  515. package/.codex/bundled-skills/impeccable/reference/typography.md +159 -0
  516. package/.codex/bundled-skills/impeccable/reference/ux-writing.md +107 -0
  517. package/.codex/bundled-skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
  518. package/.codex/bundled-skills/impeccable/scripts/command-metadata.json +94 -0
  519. package/.codex/bundled-skills/impeccable/scripts/critique-storage.mjs +242 -0
  520. package/.codex/bundled-skills/impeccable/scripts/design-parser.mjs +820 -0
  521. package/.codex/bundled-skills/impeccable/scripts/detect-csp.mjs +198 -0
  522. package/.codex/bundled-skills/impeccable/scripts/detect.mjs +21 -0
  523. package/.codex/bundled-skills/impeccable/scripts/detector/browser/injected/index.mjs +1688 -0
  524. package/.codex/bundled-skills/impeccable/scripts/detector/cli/main.mjs +232 -0
  525. package/.codex/bundled-skills/impeccable/scripts/detector/detect-antipatterns-browser.js +4030 -0
  526. package/.codex/bundled-skills/impeccable/scripts/detector/detect-antipatterns.mjs +43 -0
  527. package/.codex/bundled-skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +251 -0
  528. package/.codex/bundled-skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +420 -0
  529. package/.codex/bundled-skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +954 -0
  530. package/.codex/bundled-skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +174 -0
  531. package/.codex/bundled-skills/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +189 -0
  532. package/.codex/bundled-skills/impeccable/scripts/detector/findings.mjs +12 -0
  533. package/.codex/bundled-skills/impeccable/scripts/detector/node/file-system.mjs +198 -0
  534. package/.codex/bundled-skills/impeccable/scripts/detector/profile/profiler.mjs +166 -0
  535. package/.codex/bundled-skills/impeccable/scripts/detector/registry/antipatterns.mjs +278 -0
  536. package/.codex/bundled-skills/impeccable/scripts/detector/rules/checks.mjs +1948 -0
  537. package/.codex/bundled-skills/impeccable/scripts/detector/shared/color.mjs +124 -0
  538. package/.codex/bundled-skills/impeccable/scripts/detector/shared/constants.mjs +101 -0
  539. package/.codex/bundled-skills/impeccable/scripts/detector/shared/page.mjs +7 -0
  540. package/.codex/bundled-skills/impeccable/scripts/impeccable-paths.mjs +110 -0
  541. package/.codex/bundled-skills/impeccable/scripts/is-generated.mjs +69 -0
  542. package/.codex/bundled-skills/impeccable/scripts/live-accept.mjs +595 -0
  543. package/.codex/bundled-skills/impeccable/scripts/live-browser-session.js +123 -0
  544. package/.codex/bundled-skills/impeccable/scripts/live-browser.js +4860 -0
  545. package/.codex/bundled-skills/impeccable/scripts/live-complete.mjs +75 -0
  546. package/.codex/bundled-skills/impeccable/scripts/live-completion.mjs +18 -0
  547. package/.codex/bundled-skills/impeccable/scripts/live-inject.mjs +446 -0
  548. package/.codex/bundled-skills/impeccable/scripts/live-poll.mjs +200 -0
  549. package/.codex/bundled-skills/impeccable/scripts/live-resume.mjs +48 -0
  550. package/.codex/bundled-skills/impeccable/scripts/live-server.mjs +838 -0
  551. package/.codex/bundled-skills/impeccable/scripts/live-session-store.mjs +254 -0
  552. package/.codex/bundled-skills/impeccable/scripts/live-status.mjs +47 -0
  553. package/.codex/bundled-skills/impeccable/scripts/live-wrap.mjs +632 -0
  554. package/.codex/bundled-skills/impeccable/scripts/live.mjs +247 -0
  555. package/.codex/bundled-skills/impeccable/scripts/load-context.mjs +141 -0
  556. package/.codex/bundled-skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
  557. package/.codex/bundled-skills/impeccable/scripts/pin.mjs +214 -0
  558. package/.codex/references/commands/analyze.md +39 -0
  559. package/.codex/references/commands/architect.md +41 -0
  560. package/.codex/references/commands/deliver.md +29 -0
  561. package/.codex/references/commands/design.md +92 -0
  562. package/.codex/references/commands/help.md +24 -0
  563. package/.codex/references/commands/init.md +40 -0
  564. package/.codex/references/commands/plan.md +41 -0
  565. package/.codex/references/commands/review.md +33 -0
  566. package/.codex/references/commands/status.md +20 -0
  567. package/.codex/role-skills/demand-analysis/SKILL.md +50 -0
  568. package/.codex/role-skills/demand-analysis/templates/handoff-prd.md +39 -0
  569. package/.codex/role-skills/demand-analysis/templates/prd.md +85 -0
  570. package/.codex/role-skills/dev-task-planning/SKILL.md +37 -0
  571. package/.codex/role-skills/dev-task-planning/templates/dev-tasks.md +54 -0
  572. package/.codex/role-skills/quality-review/SKILL.md +49 -0
  573. package/.codex/role-skills/quality-review/templates/review-stage.md +39 -0
  574. package/.codex/role-skills/tech-architecture/SKILL.md +49 -0
  575. package/.codex/role-skills/tech-architecture/templates/handoff-architecture.md +28 -0
  576. package/.codex/role-skills/tech-architecture/templates/tech-architecture.md +54 -0
  577. package/.codex/role-skills/ui-prototype-design/SKILL.md +125 -0
  578. package/.codex/role-skills/ui-prototype-design/templates/handoff-ui.md +40 -0
  579. package/.codex/role-skills/ui-prototype-design/templates/prototype-review.md +57 -0
  580. package/.codex/role-skills/ui-prototype-design/templates/ui-design.md +142 -0
  581. package/.codex/scripts/package_delivery.js +195 -0
  582. package/.codex/scripts/review_stage.js +622 -0
  583. package/.codex/templates/AGENTS.md +44 -0
  584. package/.codex/templates/delivery-README.md +37 -0
  585. package/.codex/templates/framework-AGENTS.md +74 -0
  586. package/.codex/templates/framework-README.md +65 -0
  587. package/.codex/templates/project-config.md +117 -0
  588. package/.codex/templates/prototype-README.md +45 -0
  589. package/.codex/templates/workflow-state.json +47 -0
  590. package/README.md +28 -0
  591. package/bin/pmflow.js +463 -0
  592. package/package.json +30 -0
@@ -0,0 +1,820 @@
1
+ // Parse a DESIGN.md (Stitch-spec format) into a structured JSON model that
2
+ // the live-mode design-system panel can render. Deterministic, dependency-free.
3
+ //
4
+ // Two-layer: YAML frontmatter (machine-readable tokens) + markdown body
5
+ // (prose with six canonical H2 sections). When frontmatter is present, it's
6
+ // exposed on `model.frontmatter` alongside the prose-scraped sections;
7
+ // consumers can prefer frontmatter values and fall back to prose.
8
+
9
+ const CANONICAL_SECTIONS = [
10
+ 'Overview',
11
+ 'Colors',
12
+ 'Typography',
13
+ 'Elevation',
14
+ 'Components',
15
+ "Do's and Don'ts",
16
+ ];
17
+
18
+ // ---------- Frontmatter (Stitch YAML subset) ----------
19
+
20
+ function parseFrontmatter(md) {
21
+ const lines = md.split(/\r?\n/);
22
+ if (lines[0]?.trim() !== '---') return { frontmatter: null, body: md };
23
+
24
+ let end = -1;
25
+ for (let i = 1; i < lines.length; i++) {
26
+ if (lines[i].trim() === '---') { end = i; break; }
27
+ }
28
+ if (end === -1) return { frontmatter: null, body: md };
29
+
30
+ const yaml = lines.slice(1, end).join('\n');
31
+ const body = lines.slice(end + 1).join('\n');
32
+ try {
33
+ return { frontmatter: parseYamlSubset(yaml), body };
34
+ } catch {
35
+ return { frontmatter: null, body: md };
36
+ }
37
+ }
38
+
39
+ // Minimal YAML reader for the Stitch frontmatter subset: scalar maps with
40
+ // one level of nested objects (typography roles, components). Indent-based,
41
+ // 2-space convention. No arrays, no anchors, no multi-line scalars — Stitch's
42
+ // schema doesn't need them and accepting them would require a real YAML
43
+ // dependency we don't want to vendor.
44
+ function parseYamlSubset(yaml) {
45
+ const lines = yaml.split(/\r?\n/);
46
+ const root = {};
47
+ const stack = [{ indent: -1, obj: root }];
48
+
49
+ for (const raw of lines) {
50
+ // Skip blanks and line-only comments. Don't strip inline comments:
51
+ // unquoted hex values start with `#` and can't be safely distinguished
52
+ // from a comment after whitespace.
53
+ if (!raw.trim() || /^\s*#/.test(raw)) continue;
54
+
55
+ const indent = raw.match(/^\s*/)[0].length;
56
+ const content = raw.slice(indent);
57
+
58
+ const colonIdx = findTopLevelColon(content);
59
+ if (colonIdx === -1) continue;
60
+
61
+ while (stack.length > 1 && stack[stack.length - 1].indent >= indent) {
62
+ stack.pop();
63
+ }
64
+
65
+ const key = content.slice(0, colonIdx).trim();
66
+ const rest = content.slice(colonIdx + 1).trim();
67
+ const parent = stack[stack.length - 1].obj;
68
+
69
+ if (rest === '') {
70
+ const obj = {};
71
+ parent[key] = obj;
72
+ stack.push({ indent, obj });
73
+ } else {
74
+ parent[key] = parseScalar(rest);
75
+ }
76
+ }
77
+
78
+ return root;
79
+ }
80
+
81
+ function findTopLevelColon(s) {
82
+ let inQuote = null;
83
+ for (let i = 0; i < s.length; i++) {
84
+ const ch = s[i];
85
+ if (inQuote) {
86
+ if (ch === inQuote && s[i - 1] !== '\\') inQuote = null;
87
+ } else if (ch === '"' || ch === "'") {
88
+ inQuote = ch;
89
+ } else if (ch === ':') {
90
+ return i;
91
+ }
92
+ }
93
+ return -1;
94
+ }
95
+
96
+ function parseScalar(raw) {
97
+ const s = raw.trim();
98
+ if ((s.startsWith('"') && s.endsWith('"')) || (s.startsWith("'") && s.endsWith("'"))) {
99
+ return s.slice(1, -1);
100
+ }
101
+ if (s === 'true') return true;
102
+ if (s === 'false') return false;
103
+ if (s === 'null' || s === '~') return null;
104
+ if (/^-?\d+$/.test(s)) return Number(s);
105
+ if (/^-?\d*\.\d+$/.test(s)) return Number(s);
106
+ return s;
107
+ }
108
+
109
+ const HEX_RE = /#[0-9a-fA-F]{3,8}\b/g;
110
+ const OKLCH_RE = /oklch\([^)]+\)/gi;
111
+ const RGBA_RE = /rgba?\([^)]+\)/gi;
112
+ const BOX_SHADOW_RE = /(?:box-shadow:\s*)?((?:-?\d[\w\d\s\-.,/()#%]*)+)/;
113
+ const NAMED_RULE_RE = /\*\*(The [^*]+?Rule)\.\*\*\s*(.+)/;
114
+
115
+ // ---------- Section splitting ----------
116
+
117
+ function splitSections(md) {
118
+ const lines = md.split(/\r?\n/);
119
+ let title = null;
120
+ const sections = {};
121
+ let current = null;
122
+
123
+ for (const raw of lines) {
124
+ const line = raw.trimEnd();
125
+
126
+ if (!title && line.startsWith('# ') && !line.startsWith('## ')) {
127
+ title = line.replace(/^#\s+/, '').trim();
128
+ continue;
129
+ }
130
+
131
+ const h2 = line.match(/^##\s+(?:\d+\.\s*)?([^:\n]+?)(?::\s*(.+))?$/);
132
+ if (h2) {
133
+ const rawName = normalizeApostrophes(h2[1].trim());
134
+ const subtitle = h2[2] ? h2[2].trim() : null;
135
+ const canonical = matchCanonicalSection(rawName);
136
+ if (canonical) {
137
+ current = { name: canonical, subtitle, lines: [] };
138
+ sections[canonical] = current;
139
+ continue;
140
+ }
141
+ // non-canonical H2 — ignore but stop feeding into current
142
+ current = null;
143
+ continue;
144
+ }
145
+
146
+ if (current) current.lines.push(raw);
147
+ }
148
+
149
+ return { title, sections };
150
+ }
151
+
152
+ function normalizeApostrophes(s) {
153
+ return s.replace(/[\u2018\u2019]/g, "'");
154
+ }
155
+
156
+ function matchCanonicalSection(name) {
157
+ const normalized = normalizeApostrophes(name).toLowerCase();
158
+ // Exact match first
159
+ for (const c of CANONICAL_SECTIONS) {
160
+ if (normalizeApostrophes(c).toLowerCase() === normalized) return c;
161
+ }
162
+ // Keyword-contained match: "Overview & Creative North Star" -> "Overview",
163
+ // "Elevation & Depth" -> "Elevation", etc.
164
+ for (const c of CANONICAL_SECTIONS) {
165
+ const key = normalizeApostrophes(c).toLowerCase();
166
+ const pattern = new RegExp(`\\b${key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\b`);
167
+ if (pattern.test(normalized)) return c;
168
+ }
169
+ return null;
170
+ }
171
+
172
+ // ---------- Subsection splitting (inside a canonical section) ----------
173
+
174
+ function splitSubsections(lines) {
175
+ const subs = [];
176
+ let current = { name: null, lines: [] };
177
+ subs.push(current);
178
+
179
+ for (const raw of lines) {
180
+ const h3 = raw.match(/^###\s+(.+?)\s*$/);
181
+ if (h3) {
182
+ current = { name: h3[1].trim(), lines: [] };
183
+ subs.push(current);
184
+ continue;
185
+ }
186
+ current.lines.push(raw);
187
+ }
188
+
189
+ return subs;
190
+ }
191
+
192
+ // ---------- Generic helpers ----------
193
+
194
+ function collectParagraphs(lines) {
195
+ const paragraphs = [];
196
+ let buf = [];
197
+ const flush = () => {
198
+ if (buf.length) {
199
+ paragraphs.push(buf.join(' ').trim());
200
+ buf = [];
201
+ }
202
+ };
203
+ for (const raw of lines) {
204
+ const trimmed = raw.trim();
205
+ if (trimmed === '') { flush(); continue; }
206
+ // Horizontal rules (---, ***) and headings/bullets end a paragraph.
207
+ if (/^(?:-{3,}|\*{3,}|_{3,})$/.test(trimmed)) { flush(); continue; }
208
+ if (raw.startsWith('#') || raw.match(/^[-*]\s/)) { flush(); continue; }
209
+ buf.push(trimmed);
210
+ }
211
+ flush();
212
+ return paragraphs.filter(Boolean);
213
+ }
214
+
215
+ function collectBullets(lines) {
216
+ const bullets = [];
217
+ let current = null;
218
+ for (const raw of lines) {
219
+ const m = raw.match(/^\s*[-*]\s+(.+)$/);
220
+ if (m) {
221
+ if (current) bullets.push(current);
222
+ current = m[1];
223
+ continue;
224
+ }
225
+ // continuation of a bullet (indented line)
226
+ if (current && raw.match(/^\s{2,}\S/)) {
227
+ current += ' ' + raw.trim();
228
+ continue;
229
+ }
230
+ // blank line ends a bullet
231
+ if (raw.trim() === '' && current) {
232
+ bullets.push(current);
233
+ current = null;
234
+ }
235
+ }
236
+ if (current) bullets.push(current);
237
+ return bullets;
238
+ }
239
+
240
+ function stripBold(s) {
241
+ return s.replace(/\*\*(.+?)\*\*/g, '$1');
242
+ }
243
+
244
+ function extractNamedRules(lines) {
245
+ const rules = [];
246
+ const seen = new Set();
247
+
248
+ // Style A (Impeccable): "**The X Rule.** body body body" — can span lines.
249
+ const joined = lines.join('\n');
250
+ const inlineStart = /\*\*(The [^*]+?Rule)\.\*\*/g;
251
+ const inlineMatches = [];
252
+ let m;
253
+ while ((m = inlineStart.exec(joined)) !== null) {
254
+ inlineMatches.push({ name: m[1], start: m.index, end: inlineStart.lastIndex });
255
+ }
256
+ for (let i = 0; i < inlineMatches.length; i++) {
257
+ const mm = inlineMatches[i];
258
+ const bodyEnd = i + 1 < inlineMatches.length ? inlineMatches[i + 1].start : joined.length;
259
+ const body = joined
260
+ .slice(mm.end, bodyEnd)
261
+ .replace(/\n##[^\n]*$/s, '')
262
+ .replace(/\n###[^\n]*$/s, '')
263
+ .trim();
264
+ const name = stripBold(mm.name).trim();
265
+ seen.add(name.toLowerCase());
266
+ rules.push({ name, body: stripBold(body) });
267
+ }
268
+
269
+ // Style B (Stitch): `### The "X" Rule` or `### The X Fallback`, body is the
270
+ // bullets/paragraphs until the next heading. Accept Rule / Fallback / Principle.
271
+ for (let i = 0; i < lines.length; i++) {
272
+ const h3 = lines[i].match(/^###\s+(.+?)\s*$/);
273
+ if (!h3) continue;
274
+ const headerName = stripBold(h3[1]).replace(/["“”]/g, '').trim();
275
+ if (!/^The\b.*\b(Rule|Fallback|Principle)\b/i.test(headerName)) continue;
276
+ if (seen.has(headerName.toLowerCase())) continue;
277
+
278
+ const bodyLines = [];
279
+ for (let j = i + 1; j < lines.length; j++) {
280
+ if (/^##\s|^###\s/.test(lines[j])) break;
281
+ bodyLines.push(lines[j]);
282
+ }
283
+ const body = stripBold(bodyLines.join('\n').replace(/\n+/g, ' ')).trim();
284
+ if (body) {
285
+ seen.add(headerName.toLowerCase());
286
+ rules.push({ name: headerName, body });
287
+ }
288
+ }
289
+
290
+ // Style C (Stitch bullet form): "* **The Layering Principle:** body"
291
+ // Colon/period lives inside the bold, so match "**...**" then inspect.
292
+ for (const b of collectBullets(lines)) {
293
+ const mm = b.match(/^\*\*([^*]+?)\*\*\s*(.+)$/);
294
+ if (!mm) continue;
295
+ const nameRaw = mm[1].replace(/[.:]\s*$/, '').replace(/["“”]/g, '').trim();
296
+ if (!/^The\b.+\b(Rule|Fallback|Principle)$/i.test(nameRaw)) continue;
297
+ if (seen.has(nameRaw.toLowerCase())) continue;
298
+ seen.add(nameRaw.toLowerCase());
299
+ rules.push({ name: nameRaw, body: stripBold(mm[2]).trim() });
300
+ }
301
+
302
+ return rules;
303
+ }
304
+
305
+ // ---------- Per-section extractors ----------
306
+
307
+ function extractOverview(section) {
308
+ if (!section) return null;
309
+ const text = section.lines.join('\n');
310
+ const northStar = text.match(/\*\*Creative North Star:\s*"([^"]+)"\*\*/);
311
+ const keyChars = [];
312
+ const keyCharMatch = text.match(/\*\*Key Characteristics:\*\*\s*\n([\s\S]+?)(?:\n##|\n###|$)/);
313
+ if (keyCharMatch) {
314
+ for (const line of keyCharMatch[1].split('\n')) {
315
+ const m = line.match(/^\s*[-*]\s+(.+)$/);
316
+ if (m) keyChars.push(stripBold(m[1].trim()));
317
+ }
318
+ }
319
+
320
+ // Philosophy paragraphs: everything that isn't a rule header or key-char block
321
+ const paragraphs = collectParagraphs(section.lines).filter(
322
+ (p) =>
323
+ !p.startsWith('**Creative North Star') &&
324
+ !p.startsWith('**Key Characteristics')
325
+ );
326
+
327
+ return {
328
+ subtitle: section.subtitle,
329
+ creativeNorthStar: northStar ? northStar[1] : null,
330
+ philosophy: paragraphs,
331
+ keyCharacteristics: keyChars,
332
+ };
333
+ }
334
+
335
+ function extractColors(section) {
336
+ if (!section) return null;
337
+ const subs = splitSubsections(section.lines);
338
+
339
+ const description = collectParagraphs(subs[0].lines).join(' ');
340
+ const groups = [];
341
+ const ROLE_KEYWORDS = /^(primary|secondary|tertiary|neutral|accent)\b/i;
342
+
343
+ for (const sub of subs.slice(1)) {
344
+ if (!sub.name || /Named Rules?/i.test(sub.name) || /^The\s/i.test(sub.name)) continue;
345
+
346
+ const bullets = collectBullets(sub.lines);
347
+ const parsed = bullets.map((b) => parseColorBullet(b)).filter(Boolean);
348
+ if (parsed.length === 0) continue;
349
+
350
+ // If every bullet starts with a role keyword (Primary/Secondary/...), promote
351
+ // each bullet to its own group. Otherwise keep the subsection as the group.
352
+ const allRoleBullets =
353
+ parsed.length > 0 && parsed.every((p) => p.name && ROLE_KEYWORDS.test(p.name));
354
+
355
+ if (allRoleBullets) {
356
+ for (const p of parsed) {
357
+ groups.push({ role: p.name, colors: [p] });
358
+ }
359
+ } else {
360
+ groups.push({ role: sub.name, colors: parsed });
361
+ }
362
+ }
363
+
364
+ // If the Colors section has no subsections at all (unlikely), fall back to
365
+ // scanning the whole section as a flat bullet list.
366
+ if (groups.length === 0) {
367
+ const flat = collectBullets(section.lines)
368
+ .map((b) => parseColorBullet(b))
369
+ .filter(Boolean);
370
+ if (flat.length) {
371
+ for (const p of flat) {
372
+ if (p.name && ROLE_KEYWORDS.test(p.name)) {
373
+ groups.push({ role: p.name, colors: [p] });
374
+ } else {
375
+ const fallback = groups.find((g) => g.role === 'Palette');
376
+ if (fallback) fallback.colors.push(p);
377
+ else groups.push({ role: 'Palette', colors: [p] });
378
+ }
379
+ }
380
+ }
381
+ }
382
+
383
+ return {
384
+ subtitle: section.subtitle,
385
+ description: description || null,
386
+ groups,
387
+ rules: extractNamedRules(section.lines),
388
+ };
389
+ }
390
+
391
+ function parseColorBullet(bullet) {
392
+ const text = bullet.trim();
393
+
394
+ // Case 1 (Impeccable): **Name** (value-with-maybe-nested-parens): description
395
+ const bold = text.match(/^\*\*(.+?)\*\*\s*(.*)$/);
396
+ if (bold && bold[2].startsWith('(')) {
397
+ const value = extractParenGroup(bold[2]);
398
+ if (value !== null) {
399
+ const after = bold[2].slice(value.length + 2).trimStart();
400
+ if (after.startsWith(':')) {
401
+ return buildColor(bold[1], value, after.slice(1).trim());
402
+ }
403
+ }
404
+ }
405
+
406
+ // Case 2 (Stitch): **Name (values):** description — value embedded in bold.
407
+ const stitch = text.match(/^\*\*([^*]+?)\s*\(([^)]+)\):\*\*\s*(.*)$/);
408
+ if (stitch) {
409
+ return buildColor(stitch[1].trim(), stitch[2], stitch[3]);
410
+ }
411
+
412
+ // Case 3: bullet without bold, just hex/oklch inside.
413
+ const values = collectColorValues(text);
414
+ if (values.length) {
415
+ return buildColor(null, values.join(' to '), text);
416
+ }
417
+ return null;
418
+ }
419
+
420
+ function extractParenGroup(s) {
421
+ if (s[0] !== '(') return null;
422
+ let depth = 0;
423
+ for (let i = 0; i < s.length; i++) {
424
+ if (s[i] === '(') depth++;
425
+ else if (s[i] === ')') {
426
+ depth--;
427
+ if (depth === 0) return s.slice(1, i);
428
+ }
429
+ }
430
+ return null;
431
+ }
432
+
433
+ function buildColor(name, rawValue, description) {
434
+ const values = collectColorValues(rawValue);
435
+ const primary = values[0] ?? rawValue.trim();
436
+ return {
437
+ name: name ? stripBold(name).trim() : null,
438
+ value: primary,
439
+ valueRange: values.length > 1 ? values : null,
440
+ format: detectFormat(primary),
441
+ description: stripBold(description || '').trim() || null,
442
+ };
443
+ }
444
+
445
+ function collectColorValues(s) {
446
+ const out = [];
447
+ s.replace(HEX_RE, (v) => {
448
+ out.push(v);
449
+ return v;
450
+ });
451
+ s.replace(OKLCH_RE, (v) => {
452
+ out.push(v);
453
+ return v;
454
+ });
455
+ return out;
456
+ }
457
+
458
+ function detectFormat(v) {
459
+ if (!v) return 'unknown';
460
+ if (v.startsWith('#')) return 'hex';
461
+ if (/^oklch/i.test(v)) return 'oklch';
462
+ if (/^rgb/i.test(v)) return 'rgb';
463
+ return 'unknown';
464
+ }
465
+
466
+ function scanInlineColors(lines) {
467
+ const out = [];
468
+ for (const line of lines) {
469
+ if (!/^\s*[-*]\s/.test(line)) continue;
470
+ const trimmed = line.replace(/^\s*[-*]\s+/, '');
471
+ const color = parseColorBullet(trimmed);
472
+ if (color) out.push(color);
473
+ }
474
+ return out;
475
+ }
476
+
477
+ function parseStitchInlineGroups(lines) {
478
+ // Stitch writes: `* **Primary (`#00478d` to `#005eb8`):** Use for "..."`
479
+ // Each bullet IS its own role. Group them under the spoken role name.
480
+ const out = [];
481
+ for (const line of lines) {
482
+ if (!/^\s*[-*]\s/.test(line)) continue;
483
+ const trimmed = line.replace(/^\s*[-*]\s+/, '').trim();
484
+ const m = trimmed.match(
485
+ /^\*\*([A-Z][a-zA-Z]+)\s*\(([^)]+)\):\*\*\s*(.*)$/
486
+ );
487
+ if (m) {
488
+ const role = m[1];
489
+ const color = buildColor(role, m[2], m[3]);
490
+ out.push({ role, colors: [color] });
491
+ }
492
+ }
493
+ return out;
494
+ }
495
+
496
+ function extractTypography(section) {
497
+ if (!section) return null;
498
+ const text = section.lines.join('\n');
499
+
500
+ const fonts = {};
501
+ // Pattern A: **Display Font:** Family (with fallback)
502
+ const fontLineRe = /\*\*([\w\s/]+?)Font:\*\*\s*([^\n(]+?)(?:\s*\(with\s+([^)]+)\))?\s*$/gm;
503
+ let fm;
504
+ while ((fm = fontLineRe.exec(text)) !== null) {
505
+ const rawRole = fm[1].trim().toLowerCase().replace(/\s+/g, '-');
506
+ const role = normalizeFontRole(rawRole) || 'display';
507
+ fonts[role] = {
508
+ family: fm[2].trim(),
509
+ fallback: fm[3] ? fm[3].trim() : null,
510
+ };
511
+ }
512
+
513
+ // Pattern B (Stitch): * **Display & Headlines (Noto Serif):** description
514
+ if (Object.keys(fonts).length === 0) {
515
+ const stitchRe = /\*\*([\w\s&/]+?)\s*\(([^)]+)\):\*\*\s*(.+)/g;
516
+ let sm;
517
+ while ((sm = stitchRe.exec(text)) !== null) {
518
+ const rawRole = sm[1]
519
+ .trim()
520
+ .toLowerCase()
521
+ .replace(/\s*&\s*/g, '-')
522
+ .replace(/\s+/g, '-');
523
+ const role = normalizeFontRole(rawRole) || rawRole;
524
+ fonts[role] = { family: sm[2].trim(), fallback: null, purpose: sm[3].trim() };
525
+ }
526
+ }
527
+
528
+ // Character paragraph — either a **Character:** label, or fall back to the
529
+ // first free paragraph under the section header (Stitch style).
530
+ const characterMatch = text.match(/\*\*Character:\*\*\s*([^\n]+(?:\n[^\n]+)*?)(?=\n\n|\n###|\n##|$)/);
531
+ let character = characterMatch ? characterMatch[1].replace(/\n/g, ' ').trim() : null;
532
+ if (!character) {
533
+ const paragraphs = collectParagraphs(section.lines).filter(
534
+ (p) => !/^\*\*[\w\s/&]+Font/i.test(p) && !/^\*\*[\w\s/&]+\([^)]+\)/.test(p)
535
+ );
536
+ if (paragraphs.length) character = paragraphs[0];
537
+ }
538
+
539
+ // Hierarchy bullets under ### Hierarchy
540
+ const subs = splitSubsections(section.lines);
541
+ let hierarchy = [];
542
+ const hierSub = subs.find((s) => s.name && /hierarch/i.test(s.name));
543
+ if (hierSub) {
544
+ const bullets = collectBullets(hierSub.lines);
545
+ hierarchy = bullets.map(parseTypeBullet).filter(Boolean);
546
+ }
547
+
548
+ return {
549
+ subtitle: section.subtitle,
550
+ fonts,
551
+ character,
552
+ hierarchy,
553
+ rules: extractNamedRules(section.lines),
554
+ };
555
+ }
556
+
557
+ function normalizeFontRole(raw) {
558
+ // Canonical roles the panel cares about: display, body, label, mono.
559
+ // Stitch often writes compound roles like "display-&-headlines" or "ui-&-body"
560
+ // — collapse them to the first canonical role present.
561
+ const tokens = raw.split(/[-/&\s]+/).filter(Boolean);
562
+ const priority = ['display', 'headline', 'body', 'ui', 'label', 'mono'];
563
+ const canonical = { headline: 'display', ui: 'body' };
564
+ for (const p of priority) {
565
+ if (tokens.includes(p)) return canonical[p] || p;
566
+ }
567
+ return null;
568
+ }
569
+
570
+ function parseTypeBullet(bullet) {
571
+ // - **Display** (family, weight 300, italic, clamp(...), line-height 1): purpose
572
+ const m = bullet.match(/^\*\*(.+?)\*\*\s*\(([^)]+)\):\s*(.*)$/);
573
+ if (!m) return null;
574
+ const name = m[1].trim();
575
+ const specs = m[2].split(',').map((s) => s.trim());
576
+ return {
577
+ name,
578
+ specs,
579
+ purpose: stripBold(m[3] || '').trim() || null,
580
+ };
581
+ }
582
+
583
+ function extractElevation(section) {
584
+ if (!section) return null;
585
+ const subs = splitSubsections(section.lines);
586
+
587
+ const description = collectParagraphs(subs[0].lines).join(' ') || null;
588
+
589
+ const shadows = [];
590
+ const seen = new Set();
591
+ const dedupe = (entry) => {
592
+ const key = (entry.name || '') + '::' + entry.value;
593
+ if (seen.has(key)) return;
594
+ seen.add(key);
595
+ shadows.push(entry);
596
+ };
597
+
598
+ for (const b of collectBullets(section.lines)) {
599
+ const parsed = parseShadowBullet(b);
600
+ if (parsed) dedupe(parsed);
601
+ }
602
+
603
+ // Fallback: extract shadows written inline in prose. Stitch style is
604
+ // "...use an extra-diffused shadow: `box-shadow: 0 12px 40px rgba(...)`."
605
+ for (const p of collectParagraphs(section.lines)) {
606
+ for (const inline of extractInlineShadows(p)) dedupe(inline);
607
+ }
608
+ for (const b of collectBullets(section.lines)) {
609
+ for (const inline of extractInlineShadows(b)) dedupe(inline);
610
+ }
611
+
612
+ return {
613
+ subtitle: section.subtitle,
614
+ description,
615
+ shadows,
616
+ rules: extractNamedRules(section.lines),
617
+ };
618
+ }
619
+
620
+ function extractInlineShadows(text) {
621
+ // Find `box-shadow: ...` anywhere in prose and capture the value. Work on the
622
+ // raw string so it handles both backtick-fenced and unfenced variants.
623
+ const out = [];
624
+ const re = /box-shadow\s*:\s*([^`;\n]+)/gi;
625
+ let m;
626
+ while ((m = re.exec(text)) !== null) {
627
+ const value = m[1].replace(/[`.)]+$/, '').trim();
628
+ if (!value) continue;
629
+ // Name heuristic: the noun immediately before the shadow phrase.
630
+ // e.g. "an extra-diffused shadow: ..." -> "extra-diffused shadow"
631
+ const before = text.slice(0, m.index);
632
+ const nameMatch = before.match(/\b([A-Za-z][A-Za-z\- ]{2,40})\s+shadow\b[^A-Za-z0-9]*$/i);
633
+ let name = null;
634
+ if (nameMatch) {
635
+ const stripped = nameMatch[1]
636
+ .replace(/^(?:use|using|apply|applying|is|are|looks? like)\s+/i, '')
637
+ .replace(/^(?:a|an|the)\s+/i, '')
638
+ .trim();
639
+ if (stripped) {
640
+ name =
641
+ stripped.charAt(0).toUpperCase() + stripped.slice(1) + ' shadow';
642
+ }
643
+ }
644
+ out.push({
645
+ name,
646
+ value,
647
+ purpose: null,
648
+ });
649
+ }
650
+ return out;
651
+ }
652
+
653
+ function parseShadowBullet(bullet) {
654
+ // - **Name** (`box-shadow: value`): purpose
655
+ // - **Name** (`value`): purpose
656
+ // Only accept if the paren content looks like a shadow value (contains px,
657
+ // rem, rgba, or box-shadow). This filters out `**Rule Name:**` bullets.
658
+ const m = bullet.match(/^\*\*(.+?)\*\*\s*\(`?([^`]+?)`?\):\s*(.*)$/);
659
+ if (!m) return null;
660
+ const rawValue = m[2].replace(/^box-shadow:\s*/i, '').trim();
661
+ const looksLikeShadow =
662
+ /box-shadow|rgba?\(|\bpx\b|\brem\b|^-?\d+\s/i.test(rawValue) &&
663
+ /\d/.test(rawValue);
664
+ if (!looksLikeShadow) return null;
665
+ const name = stripBold(m[1]).trim();
666
+ return {
667
+ name,
668
+ value: rawValue,
669
+ purpose: stripBold(m[3] || '').trim() || null,
670
+ };
671
+ }
672
+
673
+ function extractComponents(section) {
674
+ if (!section) return null;
675
+ const subs = splitSubsections(section.lines);
676
+ const components = [];
677
+
678
+ for (const sub of subs.slice(1)) {
679
+ if (!sub.name) continue;
680
+
681
+ const bullets = collectBullets(sub.lines);
682
+ const paragraphs = collectParagraphs(sub.lines);
683
+
684
+ const variants = [];
685
+ const properties = {};
686
+
687
+ for (const b of bullets) {
688
+ // - **Key:** value
689
+ const m = b.match(/^\*\*(.+?):?\*\*:?\s*(.+)$/);
690
+ if (m) {
691
+ const key = stripBold(m[1]).trim();
692
+ const value = stripBold(m[2]).trim();
693
+ // Heuristic: "Primary", "Secondary", "Hover", "Focus" etc are variants;
694
+ // "Shape", "Background", "Padding" are properties.
695
+ if (/^(primary|secondary|tertiary|ghost|hover|focus|active|disabled|default|error|selected|unselected|state)$/i.test(key.split(/[\s/]/)[0])) {
696
+ variants.push({ name: key, description: value });
697
+ } else {
698
+ properties[key.toLowerCase()] = value;
699
+ }
700
+ }
701
+ }
702
+
703
+ components.push({
704
+ name: sub.name,
705
+ description: paragraphs.join(' ') || null,
706
+ properties,
707
+ variants,
708
+ });
709
+ }
710
+
711
+ return {
712
+ subtitle: section.subtitle,
713
+ components,
714
+ };
715
+ }
716
+
717
+ function extractDosDonts(section) {
718
+ if (!section) return null;
719
+ const subs = splitSubsections(section.lines);
720
+ const dos = [];
721
+ const donts = [];
722
+
723
+ for (const sub of subs.slice(1)) {
724
+ if (!sub.name) continue;
725
+ const subName = normalizeApostrophes(sub.name);
726
+ const bullets = collectBullets(sub.lines).map((b) => stripBold(b).trim());
727
+ if (/^do'?t?:?$/i.test(subName) || /^do:?$/i.test(subName)) {
728
+ dos.push(...bullets);
729
+ } else if (/^don'?t:?$/i.test(subName)) {
730
+ donts.push(...bullets);
731
+ }
732
+ }
733
+
734
+ // Classify by bullet prefix as a backup (catches loose bullets outside H3 wrappers)
735
+ for (const b of collectBullets(section.lines)) {
736
+ const stripped = normalizeApostrophes(stripBold(b).trim());
737
+ if (/^don'?t\b/i.test(stripped)) {
738
+ if (!donts.some((d) => normalizeApostrophes(d) === stripped)) donts.push(stripped);
739
+ } else if (/^do\b/i.test(stripped)) {
740
+ if (!dos.some((d) => normalizeApostrophes(d) === stripped)) dos.push(stripped);
741
+ }
742
+ }
743
+
744
+ return { dos, donts };
745
+ }
746
+
747
+ // ---------- Coverage assessment ----------
748
+
749
+ function assessCoverage(model) {
750
+ const report = {};
751
+
752
+ report.overview = model.overview
753
+ ? {
754
+ northStar: Boolean(model.overview.creativeNorthStar),
755
+ philosophy: model.overview.philosophy.length > 0,
756
+ keyCharacteristics: model.overview.keyCharacteristics.length,
757
+ }
758
+ : 'missing';
759
+
760
+ report.colors = model.colors
761
+ ? {
762
+ groups: model.colors.groups.length,
763
+ totalColors: model.colors.groups.reduce((n, g) => n + g.colors.length, 0),
764
+ rules: model.colors.rules.length,
765
+ }
766
+ : 'missing';
767
+
768
+ report.typography = model.typography
769
+ ? {
770
+ fonts: Object.keys(model.typography.fonts).length,
771
+ hierarchyEntries: model.typography.hierarchy.length,
772
+ character: Boolean(model.typography.character),
773
+ rules: model.typography.rules.length,
774
+ }
775
+ : 'missing';
776
+
777
+ report.elevation = model.elevation
778
+ ? {
779
+ shadows: model.elevation.shadows.length,
780
+ rules: model.elevation.rules.length,
781
+ description: Boolean(model.elevation.description),
782
+ }
783
+ : 'missing';
784
+
785
+ report.components = model.components
786
+ ? {
787
+ count: model.components.components.length,
788
+ variantTotal: model.components.components.reduce((n, c) => n + c.variants.length, 0),
789
+ }
790
+ : 'missing';
791
+
792
+ report.dosDonts = model.dosDonts
793
+ ? {
794
+ dos: model.dosDonts.dos.length,
795
+ donts: model.dosDonts.donts.length,
796
+ }
797
+ : 'missing';
798
+
799
+ return report;
800
+ }
801
+
802
+ // ---------- Main ----------
803
+
804
+ export function parseDesignMd(md) {
805
+ const { frontmatter, body } = parseFrontmatter(md);
806
+ const { title, sections } = splitSections(body);
807
+ return {
808
+ schemaVersion: 2,
809
+ title,
810
+ frontmatter,
811
+ overview: extractOverview(sections['Overview']),
812
+ colors: extractColors(sections['Colors']),
813
+ typography: extractTypography(sections['Typography']),
814
+ elevation: extractElevation(sections['Elevation']),
815
+ components: extractComponents(sections['Components']),
816
+ dosDonts: extractDosDonts(sections["Do's and Don'ts"]),
817
+ };
818
+ }
819
+
820
+ export { assessCoverage };