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,622 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("node:fs");
4
+ const path = require("node:path");
5
+
6
+ const SKILL_ROOT = path.resolve(__dirname, "..");
7
+ const TEMPLATE_DIR = path.join(SKILL_ROOT, "templates");
8
+ const ROLE_SKILLS_DIR = path.join(SKILL_ROOT, "role-skills");
9
+ const REPO_SKILLS_DIR = path.dirname(SKILL_ROOT);
10
+ const REVIEW_TEMPLATE = "quality-review/templates/review-stage.md";
11
+
12
+ const STAGE_ARTIFACTS = {
13
+ init: ["docs/project-config.md"],
14
+ analyze: ["docs/prd.md", "docs/handoff-prd.md"],
15
+ architect: ["docs/tech-architecture.md", "docs/handoff-architecture.md"],
16
+ design: [
17
+ "docs/ui-design.md",
18
+ "docs/handoff-ui.md",
19
+ "docs/prototype-review.md",
20
+ "prototype/directions/index.html",
21
+ "prototype/index.html",
22
+ ],
23
+ plan: ["docs/dev-tasks.md"],
24
+ deliver: [
25
+ "docs/project-config.md",
26
+ "docs/prd.md",
27
+ "docs/tech-architecture.md",
28
+ "docs/ui-design.md",
29
+ "docs/dev-tasks.md",
30
+ "AGENTS.md",
31
+ "prototype/index.html",
32
+ ],
33
+ };
34
+
35
+ const NEXT_STAGE = {
36
+ init: "analyze",
37
+ analyze: "architect",
38
+ architect: "design",
39
+ design: "plan",
40
+ plan: "deliver",
41
+ deliver: "status",
42
+ };
43
+
44
+ const DOWNSTREAM_ROLE = {
45
+ init: "需求分析师",
46
+ analyze: "技术架构师",
47
+ architect: "界面设计师",
48
+ design: "开发规划师",
49
+ plan: "Codex 执行者",
50
+ deliver: "最终接包人",
51
+ };
52
+
53
+ const PLACEHOLDER_PATTERNS = ["待补充", "TODO", "[TODO]", "{{"];
54
+ const EMOJI_PATTERN = /[\u{1F1E6}-\u{1F1FF}\u{1F300}-\u{1FAFF}\u{2700}-\u{27BF}\u{2600}-\u{26FF}]/u;
55
+ const FONT_SIZE_PATTERN = /font-size\s*:\s*([0-9]+(?:\.[0-9]+)?)px/gi;
56
+ const REQUIRED_CLARIFICATION_CRITERIA = {
57
+ target_user: "产品给谁用",
58
+ high_frequency_need: "用户真正的高频需求",
59
+ scenario_problem: "解决什么场景问题",
60
+ desired_outcome: "用户想达成什么结果",
61
+ core_usage_flow: "用户从开始到结束的真实使用流程",
62
+ first_platform: "首版平台与使用设备",
63
+ mvp_boundary: "MVP 必做和暂不做边界,包括功能整合和页面/模块减负原则",
64
+ no_blocking_questions: "无阻塞开放问题,包括关键术语和概念没有歧义",
65
+ };
66
+
67
+ function defaultClarification() {
68
+ return {
69
+ status: "not_started",
70
+ summary: "",
71
+ missing_context: [
72
+ "目标用户",
73
+ "高频真实需求",
74
+ "核心场景",
75
+ "用户想达成的结果",
76
+ "真实使用流程",
77
+ "首版平台与使用设备",
78
+ "MVP 必做和暂不做边界",
79
+ "页面/模块减负边界",
80
+ "阻塞开放问题",
81
+ "关键术语和概念歧义",
82
+ ],
83
+ materials_needed: [],
84
+ terminology: [],
85
+ concepts_aligned: false,
86
+ completion_criteria: {
87
+ target_user: false,
88
+ high_frequency_need: false,
89
+ scenario_problem: false,
90
+ desired_outcome: false,
91
+ core_usage_flow: false,
92
+ first_platform: false,
93
+ mvp_boundary: false,
94
+ no_blocking_questions: false,
95
+ },
96
+ user_confirmed_at: null,
97
+ };
98
+ }
99
+
100
+ function exists(target) {
101
+ return fs.existsSync(target);
102
+ }
103
+
104
+ function isDirectory(target) {
105
+ try {
106
+ return fs.statSync(target).isDirectory();
107
+ } catch (_error) {
108
+ return false;
109
+ }
110
+ }
111
+
112
+ function readText(target) {
113
+ if (!exists(target) || isDirectory(target)) return "";
114
+ return fs.readFileSync(target, "utf8");
115
+ }
116
+
117
+ function writeText(target, content) {
118
+ fs.mkdirSync(path.dirname(target), { recursive: true });
119
+ fs.writeFileSync(target, content, "utf8");
120
+ }
121
+
122
+ function relativeTo(root, target) {
123
+ return path.relative(root, target).split(path.sep).join("/");
124
+ }
125
+
126
+ function templatePath(name) {
127
+ const candidates = [
128
+ path.join(TEMPLATE_DIR, name),
129
+ path.join(ROLE_SKILLS_DIR, name),
130
+ path.join(REPO_SKILLS_DIR, name),
131
+ ];
132
+ const found = candidates.find(exists);
133
+ if (!found) {
134
+ throw new Error(`Template not found: ${name}`);
135
+ }
136
+ return found;
137
+ }
138
+
139
+ function loadState(root) {
140
+ const statePath = path.join(root, "docs", "workflow-state.json");
141
+ if (!exists(statePath)) {
142
+ return {
143
+ project_name: path.basename(root),
144
+ current_stage: "init",
145
+ recommended_next: "clarify init",
146
+ clarification: defaultClarification(),
147
+ pending_user_questions: [],
148
+ user_confirmation_required: true,
149
+ artifacts: {},
150
+ reviews: {},
151
+ notes: [],
152
+ };
153
+ }
154
+ try {
155
+ return JSON.parse(fs.readFileSync(statePath, "utf8"));
156
+ } catch (_error) {
157
+ return {
158
+ project_name: path.basename(root),
159
+ current_stage: "init",
160
+ recommended_next: "clarify init",
161
+ clarification: defaultClarification(),
162
+ pending_user_questions: [],
163
+ user_confirmation_required: true,
164
+ artifacts: {},
165
+ reviews: {},
166
+ notes: ["workflow-state.json was invalid JSON when review ran."],
167
+ };
168
+ }
169
+ }
170
+
171
+ function saveState(root, state) {
172
+ writeText(path.join(root, "docs", "workflow-state.json"), `${JSON.stringify(state, null, 2)}\n`);
173
+ }
174
+
175
+ function extractIds(text, prefix) {
176
+ if (prefix === "feature") {
177
+ return new Set(text.match(/\bM\d+-F\d+\b/g) || []);
178
+ }
179
+ if (prefix === "task") {
180
+ return new Set(text.match(/\bT\d{3,}\b/g) || []);
181
+ }
182
+ return new Set();
183
+ }
184
+
185
+ function clarificationConfirmed(state) {
186
+ const clarification = state.clarification || {};
187
+ return (
188
+ clarification.status === "user_confirmed" &&
189
+ !Boolean(state.user_confirmation_required ?? true) &&
190
+ missingClarificationCriteria(state).length === 0 &&
191
+ Boolean(clarification.concepts_aligned)
192
+ );
193
+ }
194
+
195
+ function missingClarificationCriteria(state) {
196
+ const criteria = ((state.clarification || {}).completion_criteria) || {};
197
+ return Object.entries(REQUIRED_CLARIFICATION_CRITERIA)
198
+ .filter(([key]) => !Boolean(criteria[key]))
199
+ .map(([, label]) => label);
200
+ }
201
+
202
+ function hasBlockingAnalyzeQuestions(state, prd) {
203
+ const pending = state.pending_user_questions || [];
204
+ if (pending.length) return true;
205
+ if (/当前状态[::]\s*draft/i.test(prd)) return true;
206
+ if (prd.includes("用户问题是否已回答:否") || prd.includes("用户问题是否已回答: 否")) return true;
207
+ const unansweredBlockingRow = /\|[^|\n]+未回答[^|\n]*\|[^|\n]*是[^|\n]*\|/.test(prd);
208
+ return prd.includes("## 待用户回答问题") && unansweredBlockingRow;
209
+ }
210
+
211
+ function designUiRuleViolations(root) {
212
+ const targets = [];
213
+ const uiDoc = path.join(root, "docs", "ui-design.md");
214
+ if (exists(uiDoc)) targets.push(uiDoc);
215
+ const prototypeDir = path.join(root, "prototype");
216
+ if (exists(prototypeDir)) {
217
+ for (const file of walkFiles(prototypeDir)) {
218
+ if ([".html", ".css", ".js", ".md"].includes(path.extname(file).toLowerCase())) {
219
+ targets.push(file);
220
+ }
221
+ }
222
+ }
223
+
224
+ const emojiHits = [];
225
+ const smallFontHits = [];
226
+ for (const target of targets) {
227
+ const text = readText(target);
228
+ if (EMOJI_PATTERN.test(text)) emojiHits.push(relativeTo(root, target));
229
+ for (const line of text.split(/\r?\n/)) {
230
+ if (smallFontLineViolation(line)) {
231
+ smallFontHits.push(relativeTo(root, target));
232
+ break;
233
+ }
234
+ }
235
+ }
236
+
237
+ const violations = [];
238
+ if (emojiHits.length) {
239
+ violations.push(`UI 可见内容疑似包含 emoji: ${uniqueSorted(emojiHits).slice(0, 8).join(", ")}`);
240
+ }
241
+ if (smallFontHits.length) {
242
+ violations.push(`UI 主体字号疑似小于 16px: ${uniqueSorted(smallFontHits).slice(0, 8).join(", ")}`);
243
+ }
244
+ return violations;
245
+ }
246
+
247
+ function walkFiles(root) {
248
+ const files = [];
249
+ if (!exists(root)) return files;
250
+ for (const name of fs.readdirSync(root)) {
251
+ const current = path.join(root, name);
252
+ const stat = fs.statSync(current);
253
+ if (stat.isDirectory()) files.push(...walkFiles(current));
254
+ else files.push(current);
255
+ }
256
+ return files;
257
+ }
258
+
259
+ function uniqueSorted(items) {
260
+ return [...new Set(items)].sort();
261
+ }
262
+
263
+ function smallFontLineViolation(line) {
264
+ if (["辅助说明", "不得低于", "不小于", "UI 硬规则"].some((marker) => line.includes(marker))) {
265
+ return false;
266
+ }
267
+ const lowered = line.toLowerCase();
268
+ FONT_SIZE_PATTERN.lastIndex = 0;
269
+ let match;
270
+ while ((match = FONT_SIZE_PATTERN.exec(line))) {
271
+ const size = Number.parseFloat(match[1]);
272
+ if (size >= 16) continue;
273
+ if (size < 14) return true;
274
+ const selector = cssSelectorBeforeFont(lowered, match.index);
275
+ if (selector && ["small", "helper", "caption", "hint", "meta", "secondary", "note", "assist"].some((marker) => selector.includes(marker))) {
276
+ continue;
277
+ }
278
+ if (
279
+ selector &&
280
+ [
281
+ "body",
282
+ "main",
283
+ "p",
284
+ "li",
285
+ "button",
286
+ "input",
287
+ "textarea",
288
+ "select",
289
+ "label",
290
+ "nav",
291
+ ".btn",
292
+ ".button",
293
+ ".list",
294
+ ".form",
295
+ ".content",
296
+ ".body",
297
+ ].some((marker) => selector.includes(marker))
298
+ ) {
299
+ return true;
300
+ }
301
+ if (!selector && lowered.includes("style=")) return true;
302
+ }
303
+ return false;
304
+ }
305
+
306
+ function cssSelectorBeforeFont(loweredLine, fontStart) {
307
+ const before = loweredLine.slice(0, fontStart);
308
+ if (!before.includes("{")) return "";
309
+ return before.split("}").pop().split("{")[0].trim();
310
+ }
311
+
312
+ function scoreStage(root, stage) {
313
+ const state = loadState(root);
314
+ const expected = STAGE_ARTIFACTS[stage];
315
+ const present = expected.filter((item) => exists(path.join(root, item)));
316
+ const missing = expected.filter((item) => !present.includes(item));
317
+ let requiredCount = expected.length;
318
+ let presentCount = present.length;
319
+
320
+ if (stage === "design") {
321
+ requiredCount += 2;
322
+ const screenshotsDir = path.join(root, "prototype", "review", "screenshots");
323
+ const screenshotFiles = exists(screenshotsDir)
324
+ ? walkFiles(screenshotsDir).filter((file) => [".png", ".jpg", ".jpeg", ".webp"].includes(path.extname(file).toLowerCase()))
325
+ : [];
326
+ if (screenshotFiles.length) presentCount += 1;
327
+ else missing.push("prototype/review/screenshots/");
328
+ if (
329
+ exists(path.join(root, ".agents", "skills", "impeccable", "SKILL.md")) ||
330
+ exists(path.join(root, ".claude", "skills", "impeccable", "SKILL.md"))
331
+ ) {
332
+ presentCount += 1;
333
+ } else {
334
+ missing.push(".agents/skills/impeccable/SKILL.md or .claude/skills/impeccable/SKILL.md");
335
+ }
336
+ }
337
+
338
+ const contents = expected.map((item) => readText(path.join(root, item))).join("\n\n");
339
+ const hasPlaceholder = PLACEHOLDER_PATTERNS.some((pattern) => contents.includes(pattern));
340
+ const totalChars = contents.trim().length;
341
+ const clarification = state.clarification || {};
342
+ const initConceptsNotAligned = stage === "init" && !Boolean(clarification.concepts_aligned);
343
+ const initNotConfirmed = stage === "init" && !clarificationConfirmed(state);
344
+ const initMissingCriteria = stage === "init" ? missingClarificationCriteria(state) : [];
345
+ const analyzeHasOpenQuestions = stage === "analyze" && hasBlockingAnalyzeQuestions(state, readText(path.join(root, "docs", "prd.md")));
346
+ const designUiViolations = stage === "design" ? designUiRuleViolations(root) : [];
347
+
348
+ if (initNotConfirmed) {
349
+ if (clarification.status !== "user_confirmed") missing.push("docs/workflow-state.json: clarification.status=user_confirmed");
350
+ if (state.user_confirmation_required ?? true) missing.push("docs/workflow-state.json: user_confirmation_required=false");
351
+ if (initMissingCriteria.length) {
352
+ missing.push(`docs/workflow-state.json: clarification.completion_criteria 缺失或未完成:${initMissingCriteria.join(", ")}`);
353
+ }
354
+ }
355
+ if (initConceptsNotAligned) missing.push("docs/workflow-state.json: clarification.concepts_aligned=true");
356
+ if (analyzeHasOpenQuestions) missing.push("docs/prd.md: 待用户回答问题未清空或文档仍为 draft");
357
+ missing.push(...designUiViolations);
358
+
359
+ let completeness = missing.length ? Math.max(1, Math.round((10 * presentCount) / Math.max(requiredCount, 1))) : 10;
360
+ if (hasPlaceholder) completeness = Math.min(completeness, 6);
361
+ if (initNotConfirmed || analyzeHasOpenQuestions || designUiViolations.length) completeness = Math.min(completeness, 5);
362
+
363
+ let clarity = totalChars > 2500 && !hasPlaceholder ? 9 : totalChars > 800 ? 6 : 3;
364
+ if (hasPlaceholder) clarity = Math.min(clarity, 5);
365
+ if (analyzeHasOpenQuestions || designUiViolations.length) clarity = Math.min(clarity, 5);
366
+
367
+ let [consistency, consistencyNote] = consistencyScore(root, stage);
368
+ if (initNotConfirmed) {
369
+ consistency = Math.min(consistency, 5);
370
+ consistencyNote = "需求澄清尚未获得用户确认或关键术语概念未对齐,不能视为初始化完成。";
371
+ }
372
+ let executability = executabilityScore(contents, stage, hasPlaceholder);
373
+ if (initNotConfirmed || analyzeHasOpenQuestions || designUiViolations.length) executability = Math.min(executability, 5);
374
+
375
+ const scores = {
376
+ completeness,
377
+ clarity,
378
+ consistency,
379
+ executability,
380
+ };
381
+ scores.average = Number(((completeness + clarity + consistency + executability) / 4).toFixed(1));
382
+ scores.missing = missing;
383
+ scores.has_placeholder = hasPlaceholder;
384
+ scores.consistency_note = consistencyNote;
385
+ scores.init_not_confirmed = initNotConfirmed;
386
+ scores.init_concepts_not_aligned = initConceptsNotAligned;
387
+ scores.analyze_has_open_questions = analyzeHasOpenQuestions;
388
+ scores.design_ui_violations = designUiViolations;
389
+ return scores;
390
+ }
391
+
392
+ function consistencyScore(root, stage) {
393
+ const prd = readText(path.join(root, "docs", "prd.md"));
394
+ const tech = readText(path.join(root, "docs", "tech-architecture.md"));
395
+ const ui = readText(path.join(root, "docs", "ui-design.md"));
396
+ const tasks = readText(path.join(root, "docs", "dev-tasks.md"));
397
+ const prdIds = extractIds(prd, "feature");
398
+ if (stage === "init") return [8, "初始化阶段主要检查项目配置自身一致性。"];
399
+ if (!prdIds.size && stage !== "analyze") return [4, "上游需求功能编号缺失,无法做跨阶段对账。"];
400
+
401
+ const targetText = {
402
+ analyze: prd,
403
+ architect: tech,
404
+ design: ui,
405
+ plan: tasks,
406
+ deliver: [tech, ui, tasks].join("\n"),
407
+ }[stage] || "";
408
+ const targetIds = extractIds(targetText, "feature");
409
+ if (stage === "analyze") {
410
+ return targetIds.size ? [8, "需求文档已出现功能编号。"] : [4, "需求文档未出现 Mx-Fx 功能编号。"];
411
+ }
412
+ const missingIds = [...prdIds].filter((id) => !targetIds.has(id)).sort();
413
+ if (missingIds.length) return [5, `以下需求功能编号未在本阶段产物中出现:${missingIds.join(", ")}`];
414
+ return [9, "需求功能编号在本阶段产物中均有出现。"];
415
+ }
416
+
417
+ function executabilityScore(contents, stage, hasPlaceholder) {
418
+ const requiredTerms = {
419
+ init: ["下一步", "工作量", "核心场景"],
420
+ analyze: ["验收", "P0", "不做"],
421
+ architect: ["接口", "数据库", "部署"],
422
+ design: ["原型", "状态", "prototype", "directions", "impeccable", "screenshots"],
423
+ plan: ["T001", "验证方式", "前置依赖"],
424
+ deliver: ["AGENTS", "dev-tasks", "prototype"],
425
+ }[stage];
426
+ const hits = requiredTerms.filter((term) => contents.includes(term)).length;
427
+ let score = 4 + hits * 2;
428
+ if (hasPlaceholder) score = Math.min(score, 6);
429
+ return Math.max(1, Math.min(score, 10));
430
+ }
431
+
432
+ function resultFromScores(scores, override) {
433
+ if (override === "pass" || override === "fail") return override === "pass" ? "通过" : "不通过";
434
+ if (
435
+ scores.average >= 8 &&
436
+ ["completeness", "clarity", "consistency", "executability"].every((key) => scores[key] >= 6)
437
+ ) {
438
+ return "通过";
439
+ }
440
+ return "不通过";
441
+ }
442
+
443
+ function buildReport(root, stage, roundNo, result, scores) {
444
+ let template = readText(templatePath(REVIEW_TEMPLATE));
445
+ const missing = scores.missing;
446
+ const placeholderNote = scores.has_placeholder ? "存在待补充占位。" : "未发现明显占位。";
447
+ const simulationResult =
448
+ result === "通过"
449
+ ? "结论:下游角色可以基于当前产物继续工作;如用户有偏好调整,可作为非阻塞微调处理。"
450
+ : "结论:若存在缺失或占位,下游执行会产生猜测,需要返工。";
451
+ const simulation = [
452
+ `以下游角色“${DOWNSTREAM_ROLE[stage]}”视角检查:`,
453
+ "",
454
+ `- 可以使用的内容:已找到 ${STAGE_ARTIFACTS[stage].length - missing.length} 个阶段产物。`,
455
+ `- 主要阻碍:${missing.length ? `缺失 ${missing.join(", ")}` : placeholderNote}`,
456
+ `- ${simulationResult}`,
457
+ ].join("\n");
458
+
459
+ const replacements = {
460
+ "{{STAGE}}": stage,
461
+ "{{ROUND}}": String(roundNo),
462
+ "{{RESULT}}": result,
463
+ "{{COMPLETENESS}}": String(scores.completeness),
464
+ "{{COMPLETENESS_NOTE}}": missing.length ? `缺失:${missing.join(", ")}` : `阶段产物齐全。${scores.has_placeholder ? " 但存在占位。" : ""}`,
465
+ "{{CLARITY}}": String(scores.clarity),
466
+ "{{CLARITY_NOTE}}": "内容长度和占位情况的启发式评分。",
467
+ "{{CONSISTENCY}}": String(scores.consistency),
468
+ "{{CONSISTENCY_NOTE}}": scores.consistency_note,
469
+ "{{EXECUTABILITY}}": String(scores.executability),
470
+ "{{EXECUTABILITY_NOTE}}": "按该阶段是否包含验收、验证、接口、任务或原型等执行要素评分。",
471
+ "{{AVERAGE}}": String(scores.average),
472
+ "{{AVERAGE_NOTE}}": "平均分 >= 8 且单项 >= 6 时视为脚本草稿通过。",
473
+ "{{SIMULATION}}": simulation,
474
+ "{{RECONCILIATION}}": reconciliationTable(root, stage),
475
+ "{{ISSUES}}": buildIssues(scores, roundNo),
476
+ "{{REWORK}}": buildRework(stage, result, scores, roundNo),
477
+ "{{NEXT_STEP}}": buildNextStep(stage, result, roundNo),
478
+ };
479
+ for (const [key, value] of Object.entries(replacements)) {
480
+ template = template.split(key).join(value);
481
+ }
482
+ return template;
483
+ }
484
+
485
+ function reconciliationTable(root, stage) {
486
+ const prdIds = extractIds(readText(path.join(root, "docs", "prd.md")), "feature");
487
+ if (!prdIds.size) return "| 对账项 | 状态 |\n|---|---|\n| 需求功能编号 | 未找到 Mx-Fx 编号 |";
488
+
489
+ const targetPaths = {
490
+ architect: ["docs/tech-architecture.md"],
491
+ design: ["docs/ui-design.md"],
492
+ plan: ["docs/dev-tasks.md"],
493
+ deliver: ["docs/tech-architecture.md", "docs/ui-design.md", "docs/dev-tasks.md"],
494
+ }[stage] || ["docs/prd.md"];
495
+ const targetText = targetPaths.map((item) => readText(path.join(root, item))).join("\n");
496
+ const targetIds = extractIds(targetText, "feature");
497
+ const lines = ["| 需求功能编号 | 本阶段覆盖 |", "|---|---|"];
498
+ for (const featureId of [...prdIds].sort()) {
499
+ lines.push(`| ${featureId} | ${targetIds.has(featureId) ? "是" : "否"} |`);
500
+ }
501
+ return lines.join("\n");
502
+ }
503
+
504
+ function buildIssues(scores, roundNo) {
505
+ const issues = [];
506
+ if (scores.missing.length) issues.push(`- 缺失阶段产物:${scores.missing.join(", ")}`);
507
+ if (scores.has_placeholder) issues.push("- 文档仍包含“待补充”或 TODO,占位内容需要替换为真实决策。");
508
+ if (scores.init_not_confirmed) issues.push("- 需求澄清尚未获得用户确认,`init` 不能判定完成。");
509
+ if (scores.init_concepts_not_aligned) issues.push("- 关键术语和概念尚未对齐,容易导致 AI 与用户说的是不同东西。");
510
+ if (scores.analyze_has_open_questions) issues.push("- PRD 仍是草稿或存在待用户回答问题,不能触发 analyze 通过。");
511
+ if (scores.design_ui_violations.length) issues.push("- UI 原型存在 emoji 或主体字号小于 16px 的问题,需要改为图标资源并提高默认字号。");
512
+ if (scores.consistency < 6) issues.push("- 跨阶段追溯不足,需求功能编号没有完整映射到当前阶段产物。");
513
+ if (scores.executability < 6) issues.push("- 下游执行信号不足,缺少验收、验证、接口、状态或任务粒度信息。");
514
+ if (roundNo >= 3 && scores.average < 8) issues.push("- 已达到第三轮未通过,建议停止推进并先修复关键问题。");
515
+ return issues.length ? issues.join("\n") : "- 未发现阻塞性问题。";
516
+ }
517
+
518
+ function buildRework(stage, result, scores, roundNo) {
519
+ if (result === "通过") return "本阶段已通过,无需返工。可根据用户偏好做非阻塞微调。";
520
+ const suggestions = {
521
+ init: "补齐 8 项澄清完成标准、六个核心问题、高频真实需求、真实使用流程、参考产品、功能整合边界和工作量粗估。",
522
+ analyze: "先让用户回答 PRD 草稿中的待确认问题,再补齐 P0/P1/P2、Mx-Fx 功能编号、业务规则、不做清单和验收标准,并把文档状态改为 final。",
523
+ architect: "补齐需求到数据库、字段、接口、部署配置和技术风险的映射。",
524
+ design: "补齐 2-3 个设计方向、每个方向的首页 demo、prototype/directions/index.html 预览索引、docs/prototype-review.md、Playwright 截图证据、Impeccable 审查记录、页面清单、需求到界面映射和完整原型路径。",
525
+ plan: "补齐 Txxx 任务、前置依赖、涉及文件、执行指令、验证方式和边缘情况。",
526
+ deliver: "补齐缺失文档、审核报告、AGENTS.md 和 prototype 后重新打包。",
527
+ };
528
+ const extra = roundNo >= 3 && scores.average < 8 ? "\n\n第三轮仍未通过:请向用户报告继续推进的具体风险。" : "";
529
+ return suggestions[stage] + extra;
530
+ }
531
+
532
+ function buildNextStep(stage, result, roundNo) {
533
+ const nextStage = NEXT_STAGE[stage];
534
+ if (result === "通过") return `建议进入 \`${nextStage}\`,或根据用户反馈继续微调本阶段。`;
535
+ if (roundNo >= 3) return "建议先返工,不要继续扩大后续阶段的不确定性;如用户坚持推进,需要明确记录风险。";
536
+ return `建议按返工建议修复后重新运行 \`$pm-workflow review ${stage}\`;也可由用户决定带风险进入 \`${nextStage}\`。`;
537
+ }
538
+
539
+ function updateReviewState(root, stage, roundNo, result, reportPath) {
540
+ const state = loadState(root);
541
+ state.artifacts = state.artifacts || {};
542
+ state.reviews = state.reviews || {};
543
+ state.clarification = state.clarification || defaultClarification();
544
+ state.pending_user_questions = state.pending_user_questions || [];
545
+ state.user_confirmation_required = state.user_confirmation_required ?? true;
546
+ state.current_stage = stage;
547
+ state.recommended_next = result === "通过" ? NEXT_STAGE[stage] : `review ${stage}`;
548
+ state.artifacts[stage] = STAGE_ARTIFACTS[stage];
549
+ state.reviews[stage] = {
550
+ round: roundNo,
551
+ last_result: result,
552
+ report: relativeTo(root, reportPath),
553
+ updated_at: new Date().toISOString(),
554
+ };
555
+ saveState(root, state);
556
+ }
557
+
558
+ function review(rootInput, stage, override) {
559
+ const root = path.resolve(rootInput);
560
+ if (!Object.prototype.hasOwnProperty.call(STAGE_ARTIFACTS, stage)) {
561
+ throw new Error(`Unknown stage: ${stage}. Available: ${Object.keys(STAGE_ARTIFACTS).join(", ")}`);
562
+ }
563
+ const state = loadState(root);
564
+ const previous = (((state.reviews || {})[stage] || {}).round) || 0;
565
+ const roundNo = Math.min(previous + 1, 3);
566
+ const scores = scoreStage(root, stage);
567
+ const result = resultFromScores(scores, override);
568
+ const report = buildReport(root, stage, roundNo, result, scores);
569
+ const reportPath = path.join(root, "docs", `review-${stage}.md`);
570
+ writeText(reportPath, report);
571
+ updateReviewState(root, stage, roundNo, result, reportPath);
572
+ return reportPath;
573
+ }
574
+
575
+ function parseArgs(argv) {
576
+ const options = { root: ".", stage: "", result: "auto" };
577
+ for (let index = 0; index < argv.length; index += 1) {
578
+ const arg = argv[index];
579
+ if (arg === "--root") {
580
+ options.root = argv[++index];
581
+ } else if (arg.startsWith("--root=")) {
582
+ options.root = arg.slice("--root=".length);
583
+ } else if (arg === "--stage") {
584
+ options.stage = argv[++index];
585
+ } else if (arg.startsWith("--stage=")) {
586
+ options.stage = arg.slice("--stage=".length);
587
+ } else if (arg === "--result") {
588
+ options.result = argv[++index];
589
+ } else if (arg.startsWith("--result=")) {
590
+ options.result = arg.slice("--result=".length);
591
+ } else if (arg === "-h" || arg === "--help") {
592
+ printHelp();
593
+ process.exit(0);
594
+ } else {
595
+ throw new Error(`Unknown argument: ${arg}`);
596
+ }
597
+ }
598
+ if (!options.stage) throw new Error("--stage is required.");
599
+ if (!Object.keys(STAGE_ARTIFACTS).includes(options.stage)) throw new Error(`--stage must be one of: ${Object.keys(STAGE_ARTIFACTS).join(", ")}`);
600
+ if (!["auto", "pass", "fail"].includes(options.result)) throw new Error("--result must be auto, pass, or fail.");
601
+ return options;
602
+ }
603
+
604
+ function printHelp() {
605
+ console.log(`Generate a PM Workflow stage review draft.
606
+
607
+ Usage:
608
+ node review_stage.js --root . --stage <init|analyze|architect|design|plan|deliver> [--result auto|pass|fail]`);
609
+ }
610
+
611
+ function main() {
612
+ try {
613
+ const args = parseArgs(process.argv.slice(2));
614
+ const reportPath = review(args.root, args.stage, args.result);
615
+ console.log(`Review report generated: ${reportPath}`);
616
+ } catch (error) {
617
+ console.error(`ERROR: ${error.message}`);
618
+ process.exit(1);
619
+ }
620
+ }
621
+
622
+ main();
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: quality-review
3
+ description: "质量审核官使用:对阶段产物评分、仿真下游使用、核对追溯关系,并产出审核报告。"
4
+ ---
5
+
6
+ # 质量审核角色技能
7
+
8
+ 服务于本工作室的质量审核官角色。
9
+
10
+ ## 输入
11
+
12
+ - 当前阶段产物
13
+ - `docs/workflow-state.json`
14
+ - 上游阶段文档
15
+
16
+ ## 输出
17
+
18
+ - `docs/review-{stage}.md`
19
+ - 更新后的 `docs/workflow-state.json`
20
+
21
+ ## 审核机制
22
+
23
+ 1. 多维度评分:完整性、清晰度、一致性、可执行性。
24
+ 2. 仿真测试:扮演下游角色验证是否能继续工作。
25
+ 3. 结构化对账:需求功能编号到架构、界面、任务的映射。
26
+
27
+ ## 脚本
28
+
29
+ 在框架目录内运行:
30
+
31
+ ```bash
32
+ node .claude/skills/pm-workflow/scripts/review_stage.js --root . --stage <stage>
33
+ ```
34
+
35
+ ## 检查表
36
+
37
+ - 平均分是否 >= 8,且单项是否都 >= 6。
38
+ - 是否存在待补充、待办占位或空表。
39
+ - init 阶段是否已经在 `workflow-state.json` 中达到 `clarification.status=user_confirmed`、`clarification.concepts_aligned=true`,且 8 项澄清标准均完成。
40
+ - analyze 阶段是否为 `文档状态:final`,并且没有未回答的阻塞问题。
41
+ - init 阶段 8 项澄清完成标准是否全部完成,尤其是高频真实需求和真实使用流程。
42
+ - analyze 阶段是否基于高频真实需求和真实使用流程识别真需求与伪需求,P0 是否映射到高频场景和流程位置。
43
+ - design 阶段 UI 可见内容是否使用 emoji,主体字号是否低于 16px。
44
+ - design 阶段页面访问逻辑是否来自真实使用流程,页面和模块是否避免堆叠并记录整合理由。
45
+ - 下游文档如改变上游事实,是否同步回写上游源文档,并在 `workflow-state.json` notes 记录同步说明。
46
+ - 是否存在跨阶段新增范围。
47
+ - design 阶段是否为每个候选方向生成可打开的首页 demo,并提供 `prototype/directions/index.html` 预览索引。
48
+ - design 阶段是否提供 `docs/prototype-review.md`、`prototype/review/screenshots/`、Playwright 三视口截图和 Impeccable 审查修正记录。
49
+ - 三轮仍不通过时是否明确提醒风险。