@kensaurus/skills 0.0.0-stage → 2.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 (425) hide show
  1. package/.claude-plugin/marketplace.json +53 -0
  2. package/.claude-plugin/plugin.json +40 -0
  3. package/.cursor-plugin/plugin.json +38 -0
  4. package/.mcp.json +28 -0
  5. package/CHANGELOG.md +1790 -0
  6. package/LICENSE +21 -0
  7. package/LICENSE-APACHE +62 -0
  8. package/NOTICE +13 -0
  9. package/README.md +821 -2
  10. package/SECURITY.md +55 -0
  11. package/agents/code-reviewer.md +60 -0
  12. package/agents/completion-judge.md +89 -0
  13. package/agents/db-migrator.md +125 -0
  14. package/agents/debugger.md +47 -0
  15. package/agents/deploy-checker.md +100 -0
  16. package/agents/perf-monitor.md +74 -0
  17. package/assets/favicon.png +0 -0
  18. package/assets/logo-light.png +0 -0
  19. package/assets/logo.png +0 -0
  20. package/assets/logo.svg +6 -0
  21. package/assets/og.png +0 -0
  22. package/bin/install.mjs +1127 -0
  23. package/bin/kenji.js +2 -0
  24. package/commands/adr.md +17 -0
  25. package/commands/aeo-plan.md +18 -0
  26. package/commands/arch-boundaries.md +17 -0
  27. package/commands/aso-plan.md +18 -0
  28. package/commands/auth-flows.md +19 -0
  29. package/commands/backup-plan.md +17 -0
  30. package/commands/burndown-full.md +25 -0
  31. package/commands/capacitor-plan.md +18 -0
  32. package/commands/codemod-safety.md +22 -0
  33. package/commands/commit.md +18 -0
  34. package/commands/complete-everything.md +40 -0
  35. package/commands/cost-plan.md +19 -0
  36. package/commands/deadcode-plan.md +26 -0
  37. package/commands/deadcode.md +32 -0
  38. package/commands/debug-issue.md +17 -0
  39. package/commands/deps-plan.md +18 -0
  40. package/commands/docs-plan.md +17 -0
  41. package/commands/doctrine.md +19 -0
  42. package/commands/error-plan.md +19 -0
  43. package/commands/feedback-to-closure.md +36 -0
  44. package/commands/fix-issue.md +76 -0
  45. package/commands/gate-logic.md +26 -0
  46. package/commands/green-repo.md +36 -0
  47. package/commands/grill-me.md +19 -0
  48. package/commands/gtm-plan.md +21 -0
  49. package/commands/gtm-weekly.md +17 -0
  50. package/commands/gtm.md +22 -0
  51. package/commands/handoff.md +15 -0
  52. package/commands/housekeep-backlog.md +18 -0
  53. package/commands/housekeep-files.md +22 -0
  54. package/commands/housekeep-gates.md +18 -0
  55. package/commands/instant-nav.md +11 -0
  56. package/commands/integrity-plan.md +19 -0
  57. package/commands/launch-kit.md +16 -0
  58. package/commands/mcp-guide.md +40 -0
  59. package/commands/mobile-plan.md +19 -0
  60. package/commands/native-rn-monorepo/README.md +78 -0
  61. package/commands/native-rn-monorepo/android-build.md +26 -0
  62. package/commands/native-rn-monorepo/android-install.md +32 -0
  63. package/commands/native-rn-monorepo/android-logcat.md +37 -0
  64. package/commands/native-rn-monorepo/ios-ci-logs.md +56 -0
  65. package/commands/native-rn-monorepo/ios-ci-status.md +52 -0
  66. package/commands/native-rn-monorepo/ios-ci-trigger.md +59 -0
  67. package/commands/native-rn-monorepo/rn-reset.md +50 -0
  68. package/commands/native-rn-monorepo/rn-ship-ios.md +67 -0
  69. package/commands/native-rn-monorepo/rn-verify.md +53 -0
  70. package/commands/perf-plan.md +18 -0
  71. package/commands/plan-mode.md +74 -0
  72. package/commands/pr.md +16 -0
  73. package/commands/pricing-plan.md +20 -0
  74. package/commands/privacy-plan.md +18 -0
  75. package/commands/readability.md +12 -0
  76. package/commands/readme.md +15 -0
  77. package/commands/refactor.md +15 -0
  78. package/commands/release-prep.md +17 -0
  79. package/commands/research.md +25 -0
  80. package/commands/responsive-audit.md +21 -0
  81. package/commands/review-code.md +18 -0
  82. package/commands/rls-plan.md +18 -0
  83. package/commands/secrets-plan.md +18 -0
  84. package/commands/security-plan.md +19 -0
  85. package/commands/ship-and-observe.md +36 -0
  86. package/commands/skill-conflicts.md +19 -0
  87. package/commands/slop-plan.md +18 -0
  88. package/commands/stub-plan.md +18 -0
  89. package/commands/test-mutation.md +16 -0
  90. package/commands/test-plan.md +17 -0
  91. package/commands/test.md +29 -0
  92. package/commands/thirdparty-web-interface-guidelines.md +185 -0
  93. package/commands/uiux-plan.md +18 -0
  94. package/commands/uiux.md +45 -0
  95. package/commands/update-deps.md +21 -0
  96. package/commands/validation-plan.md +19 -0
  97. package/commands-portable/fix-issue.md +72 -0
  98. package/commands-portable/plan-mode.md +92 -0
  99. package/commands-portable/research.md +91 -0
  100. package/docs/screenshots/README.md +5 -0
  101. package/docs/screenshots/audit-dark.png +0 -0
  102. package/docs/screenshots/build-dark.png +0 -0
  103. package/docs/screenshots/grill-dark.png +0 -0
  104. package/docs/screenshots/hero-dark.png +0 -0
  105. package/docs/screenshots/hero-light.png +0 -0
  106. package/docs/screenshots/ship-dark.png +0 -0
  107. package/docs/screenshots/src/showcase.html +320 -0
  108. package/hooks/completion-gate.mjs +258 -0
  109. package/hooks/cursor-hooks.json +13 -0
  110. package/hooks/hooks.json +15 -0
  111. package/install.sh +21 -0
  112. package/llms.txt +40 -0
  113. package/mcp/README.md +266 -0
  114. package/mcp/VERSIONS.md +41 -0
  115. package/mcp/mcp-full.json.template +124 -0
  116. package/mcp/mcp.json.template +29 -0
  117. package/mcp/pinned-versions.json +27 -0
  118. package/package.json +94 -4
  119. package/rules/approved-plan-execution.mdc +65 -0
  120. package/rules/full-stack-ship-discipline.mdc +37 -0
  121. package/rules/native-rn-monorepo/README.md +63 -0
  122. package/rules/native-rn-monorepo/_project.mdc +69 -0
  123. package/rules/native-rn-monorepo/native-android.mdc +72 -0
  124. package/rules/native-rn-monorepo/native-ios.mdc +61 -0
  125. package/rules/native-rn-monorepo/react-native-js.mdc +78 -0
  126. package/rules/native-rn-monorepo/web.mdc +60 -0
  127. package/rules/project-starter/components.mdc +54 -0
  128. package/rules/project-starter/data-fetching.mdc +77 -0
  129. package/rules/project-starter/git.mdc +41 -0
  130. package/rules/project-starter/supabase.mdc +37 -0
  131. package/rules/project-starter/tailwind.mdc +48 -0
  132. package/rules/project-starter/typescript.mdc +36 -0
  133. package/rules/project-starter/web-performance.mdc +42 -0
  134. package/rules/senior-engineer.mdc +30 -0
  135. package/rules/shell-first-search.mdc +19 -0
  136. package/rules/skill-workflows.mdc +35 -0
  137. package/rules/verification-before-completion.mdc +57 -0
  138. package/skills/audit-accessibility/SKILL.md +441 -0
  139. package/skills/audit-agent-speed/SKILL.md +181 -0
  140. package/skills/audit-agent-speed/scripts/stop-typecheck.mjs +151 -0
  141. package/skills/audit-analytics/SKILL.md +138 -0
  142. package/skills/audit-auth-flows/SKILL.md +267 -0
  143. package/skills/audit-backend-architecture/SKILL.md +266 -0
  144. package/skills/audit-backend-architecture/references/patterns.md +386 -0
  145. package/skills/audit-bundle-size/SKILL.md +295 -0
  146. package/skills/audit-cicd/SKILL.md +218 -0
  147. package/skills/audit-code-quality/SKILL.md +314 -0
  148. package/skills/audit-code-review/SKILL.md +289 -0
  149. package/skills/audit-codemod-safety/SKILL.md +159 -0
  150. package/skills/audit-db-schema/SKILL.md +465 -0
  151. package/skills/audit-db-schema/references/details.md +110 -0
  152. package/skills/audit-doctrine/SKILL.md +189 -0
  153. package/skills/audit-env-parity/SKILL.md +133 -0
  154. package/skills/audit-fe-api/SKILL.md +458 -0
  155. package/skills/audit-gate-logic/SKILL.md +219 -0
  156. package/skills/audit-i18n/SKILL.md +339 -0
  157. package/skills/audit-infra-cost/SKILL.md +142 -0
  158. package/skills/audit-langfuse-llm/SKILL.md +468 -0
  159. package/skills/audit-langfuse-llm/references/details.md +226 -0
  160. package/skills/audit-llm-security/SKILL.md +147 -0
  161. package/skills/audit-monetization-iap/SKILL.md +137 -0
  162. package/skills/audit-payment-system/SKILL.md +268 -0
  163. package/skills/audit-payment-system/references/checklist.md +283 -0
  164. package/skills/audit-performance/SKILL.md +383 -0
  165. package/skills/audit-performance/references/loading-priority-2026.md +81 -0
  166. package/skills/audit-realworld/SKILL.md +287 -0
  167. package/skills/audit-registry-listing/SKILL.md +122 -0
  168. package/skills/audit-resilience/SKILL.md +153 -0
  169. package/skills/audit-responsive/SKILL.md +221 -0
  170. package/skills/audit-responsive/references/checklist.md +166 -0
  171. package/skills/audit-security/SKILL.md +289 -0
  172. package/skills/audit-skill-conflicts/SKILL.md +178 -0
  173. package/skills/audit-ui-states/SKILL.md +146 -0
  174. package/skills/audit-uiux-design-system/SKILL.md +475 -0
  175. package/skills/audit-uiux-design-system/references/details.md +71 -0
  176. package/skills/audit-ux/SKILL.md +381 -0
  177. package/skills/audit-ux/references/details.md +245 -0
  178. package/skills/audit-ux-journeys/SKILL.md +215 -0
  179. package/skills/audit-ux-journeys/references/checklist.md +179 -0
  180. package/skills/backend-db-performance/SKILL.md +441 -0
  181. package/skills/backend-error-handling/SKILL.md +489 -0
  182. package/skills/backend-error-handling/references/details.md +58 -0
  183. package/skills/backend-observability/SKILL.md +88 -0
  184. package/skills/backend-patterns/SKILL.md +499 -0
  185. package/skills/backend-patterns/references/architecture-patterns.md +298 -0
  186. package/skills/backend-realtime/SKILL.md +403 -0
  187. package/skills/backend-realtime/references/patterns.md +74 -0
  188. package/skills/burndown-full/SKILL.md +174 -0
  189. package/skills/complete-everything/SKILL.md +295 -0
  190. package/skills/data-pipeline/SKILL.md +109 -0
  191. package/skills/data-visualization/SKILL.md +488 -0
  192. package/skills/debug-error/SKILL.md +322 -0
  193. package/skills/debug-fe-be-integration/SKILL.md +459 -0
  194. package/skills/debug-sentry-monitor/SKILL.md +497 -0
  195. package/skills/debug-sentry-monitor/references/details.md +165 -0
  196. package/skills/deploy-npm/SKILL.md +394 -0
  197. package/skills/deploy-npm/references/example-mushi-mushi.md +52 -0
  198. package/skills/deploy-verify/SKILL.md +489 -0
  199. package/skills/design-api/SKILL.md +379 -0
  200. package/skills/design-canvas/SKILL.md +155 -0
  201. package/skills/design-email/SKILL.md +370 -0
  202. package/skills/design-frontend/SKILL.md +143 -0
  203. package/skills/design-generative-art/SKILL.md +474 -0
  204. package/skills/design-mobile-first/SKILL.md +506 -0
  205. package/skills/design-motion/SKILL.md +333 -0
  206. package/skills/design-motion/references/delight-interactions.md +191 -0
  207. package/skills/design-prd/SKILL.md +443 -0
  208. package/skills/design-system/SKILL.md +457 -0
  209. package/skills/design-theme/SKILL.md +226 -0
  210. package/skills/design-theme/themes/tsumagoi-ranch.md +150 -0
  211. package/skills/docs-adr/SKILL.md +168 -0
  212. package/skills/docs-coauthor/SKILL.md +368 -0
  213. package/skills/docs-comparison-pages/SKILL.md +117 -0
  214. package/skills/docs-domain-modeling/SKILL.md +97 -0
  215. package/skills/docs-launch-kit/SKILL.md +139 -0
  216. package/skills/docs-writer/SKILL.md +469 -0
  217. package/skills/enhance-agent-guardrails/SKILL.md +164 -0
  218. package/skills/enhance-arch-boundaries/SKILL.md +154 -0
  219. package/skills/enhance-capacitor-ui/SKILL.md +463 -0
  220. package/skills/enhance-capacitor-ui/references/details.md +750 -0
  221. package/skills/enhance-email-deliverability/SKILL.md +143 -0
  222. package/skills/enhance-growth-loops/SKILL.md +122 -0
  223. package/skills/enhance-lifecycle-email/SKILL.md +130 -0
  224. package/skills/enhance-motion/SKILL.md +193 -0
  225. package/skills/enhance-onboarding/SKILL.md +148 -0
  226. package/skills/enhance-pwa/SKILL.md +303 -0
  227. package/skills/enhance-readability/SKILL.md +146 -0
  228. package/skills/enhance-readme/SKILL.md +496 -0
  229. package/skills/enhance-readme/package-lock.json +187 -0
  230. package/skills/enhance-readme/package.json +17 -0
  231. package/skills/enhance-readme/scripts/generate-readme-blocks.mjs +199 -0
  232. package/skills/enhance-readme/scripts/record-readme-tour.mjs +442 -0
  233. package/skills/enhance-skill-prompts/SKILL.md +167 -0
  234. package/skills/enhance-skill-prompts/references/exemplar-audit-auth-flows.md +311 -0
  235. package/skills/enhance-ux-laws/SKILL.md +409 -0
  236. package/skills/enhance-web-conversion/SKILL.md +155 -0
  237. package/skills/enhance-web-forms/SKILL.md +154 -0
  238. package/skills/enhance-web-instant-nav/SKILL.md +138 -0
  239. package/skills/enhance-web-instant-nav/references/bfcache-blockers.md +23 -0
  240. package/skills/enhance-web-instant-nav/references/early-hints.md +33 -0
  241. package/skills/enhance-web-instant-nav/references/speculation-rules.md +44 -0
  242. package/skills/enhance-web-landing/SKILL.md +459 -0
  243. package/skills/enhance-web-landing/references/details.md +773 -0
  244. package/skills/enhance-web-redesign/SKILL.md +228 -0
  245. package/skills/enhance-web-seo/SKILL.md +276 -0
  246. package/skills/enhance-web-ui/SKILL.md +473 -0
  247. package/skills/enhance-web-ui/references/details.md +674 -0
  248. package/skills/enhance-web-ux/HEURISTICS.md +248 -0
  249. package/skills/enhance-web-ux/PATTERNS.md +375 -0
  250. package/skills/enhance-web-ux/SKILL.md +464 -0
  251. package/skills/enhance-web-ux/examples.md +222 -0
  252. package/skills/enhance-web-ux/references/details.md +406 -0
  253. package/skills/enhance-web-web3d/SKILL.md +397 -0
  254. package/skills/enhance-web-web3d/references/css-canvas-effects.md +180 -0
  255. package/skills/handoff/SKILL.md +66 -0
  256. package/skills/housekeep-backlog/SKILL.md +149 -0
  257. package/skills/housekeep-dead-code/SKILL.md +387 -0
  258. package/skills/housekeep-dead-code/references/ratchet-ci.md +205 -0
  259. package/skills/housekeep-dead-code/references/supabase-hygiene.md +152 -0
  260. package/skills/housekeep-design/SKILL.md +207 -0
  261. package/skills/housekeep-files/SKILL.md +220 -0
  262. package/skills/housekeep-files/references/naming-and-catalog.md +86 -0
  263. package/skills/housekeep-files/scripts/housekeep-files.ps1 +360 -0
  264. package/skills/housekeep-files/scripts/housekeep-files.sh +238 -0
  265. package/skills/housekeep-gates/SKILL.md +174 -0
  266. package/skills/iterate-agent-harness/SKILL.md +137 -0
  267. package/skills/iterate-gtm-weekly/SKILL.md +103 -0
  268. package/skills/iterate-post-launch/SKILL.md +292 -0
  269. package/skills/meta-mcp-builder/SKILL.md +313 -0
  270. package/skills/meta-skill-creator/SKILL.md +304 -0
  271. package/skills/mobile-capacitor-platform/SKILL.md +103 -0
  272. package/skills/mobile-emulator-start/SKILL.md +296 -0
  273. package/skills/mobile-emulator-test/SKILL.md +491 -0
  274. package/skills/mobile-emulator-test/references/details.md +478 -0
  275. package/skills/mobile-rn-performance/SKILL.md +107 -0
  276. package/skills/mobile-rn-screen/SKILL.md +476 -0
  277. package/skills/mobile-rn-screen/references/details.md +785 -0
  278. package/skills/mushi-health/SKILL.md +206 -0
  279. package/skills/mushi-integration/SKILL.md +257 -0
  280. package/skills/plan-aeo-readiness/SKILL.md +166 -0
  281. package/skills/plan-antislop/SKILL.md +281 -0
  282. package/skills/plan-aso/SKILL.md +149 -0
  283. package/skills/plan-backup-dr/SKILL.md +131 -0
  284. package/skills/plan-capacitor-hardening/SKILL.md +217 -0
  285. package/skills/plan-data-integrity/SKILL.md +187 -0
  286. package/skills/plan-dead-code/SKILL.md +386 -0
  287. package/skills/plan-dead-code/references/knip-config.md +214 -0
  288. package/skills/plan-dead-code/references/output-templates.md +133 -0
  289. package/skills/plan-dead-code/references/preservation-contract.md +50 -0
  290. package/skills/plan-dead-code/references/residue-greps.md +84 -0
  291. package/skills/plan-dependency-provenance/SKILL.md +200 -0
  292. package/skills/plan-docs-sync/SKILL.md +143 -0
  293. package/skills/plan-docs-sync/references/drift-taxonomy.md +43 -0
  294. package/skills/plan-docs-sync/references/output-templates.md +33 -0
  295. package/skills/plan-docs-sync/references/preservation-contract.md +17 -0
  296. package/skills/plan-error-handling/SKILL.md +205 -0
  297. package/skills/plan-gtm/SKILL.md +276 -0
  298. package/skills/plan-gtm/references/benchmarks-2026.md +183 -0
  299. package/skills/plan-input-validation/SKILL.md +179 -0
  300. package/skills/plan-llm-cost-guardrails/SKILL.md +176 -0
  301. package/skills/plan-mobile-readiness/SKILL.md +171 -0
  302. package/skills/plan-perf-audit/SKILL.md +145 -0
  303. package/skills/plan-perf-audit/references/audit-scope.md +51 -0
  304. package/skills/plan-perf-audit/references/output-templates.md +33 -0
  305. package/skills/plan-perf-audit/references/preservation-contract.md +13 -0
  306. package/skills/plan-pricing/SKILL.md +173 -0
  307. package/skills/plan-privacy-compliance/SKILL.md +148 -0
  308. package/skills/plan-rls-audit/SKILL.md +231 -0
  309. package/skills/plan-secrets-audit/SKILL.md +181 -0
  310. package/skills/plan-security-audit/SKILL.md +168 -0
  311. package/skills/plan-security-audit/references/output-templates.md +36 -0
  312. package/skills/plan-security-audit/references/owasp-supabase-scope.md +55 -0
  313. package/skills/plan-security-audit/references/preservation-contract.md +18 -0
  314. package/skills/plan-stub-checker/SKILL.md +216 -0
  315. package/skills/plan-stub-checker/references/detection-methodology.md +75 -0
  316. package/skills/plan-stub-checker/references/detection-taxonomy.md +34 -0
  317. package/skills/plan-stub-checker/references/output-templates.md +63 -0
  318. package/skills/plan-stub-checker/references/preservation-contract.md +24 -0
  319. package/skills/plan-test-coverage/SKILL.md +170 -0
  320. package/skills/plan-test-coverage/references/methodology.md +54 -0
  321. package/skills/plan-test-coverage/references/output-templates.md +34 -0
  322. package/skills/plan-test-coverage/references/preservation-contract.md +15 -0
  323. package/skills/plan-uiux-unification/SKILL.md +230 -0
  324. package/skills/plan-uiux-unification/references/output-templates.md +67 -0
  325. package/skills/plan-uiux-unification/references/phase-workbook.md +85 -0
  326. package/skills/plan-uiux-unification/references/preservation-contract.md +24 -0
  327. package/skills/protocol-browser-anti-stall/SKILL.md +211 -0
  328. package/skills/protocol-browser-anti-stall/references/mcp-to-cli-map.md +113 -0
  329. package/skills/protocol-browser-anti-stall/references/playwright-session-coordination.md +170 -0
  330. package/skills/research/SKILL.md +422 -0
  331. package/skills/test-exploratory/SKILL.md +165 -0
  332. package/skills/test-exploratory/references/charter-template.md +29 -0
  333. package/skills/test-load/SKILL.md +126 -0
  334. package/skills/test-mutation/SKILL.md +160 -0
  335. package/skills/test-playwright/SKILL.md +354 -0
  336. package/skills/test-qa/SKILL.md +364 -0
  337. package/skills/test-qa/references/details.md +268 -0
  338. package/skills/test-red-team/SKILL.md +386 -0
  339. package/skills/test-red-team/references/owasp-attack-checklist.md +193 -0
  340. package/skills/test-unit/SKILL.md +259 -0
  341. package/skills/test-unit/references/details.md +267 -0
  342. package/skills/test-visual-regression/SKILL.md +132 -0
  343. package/skills/thirdparty-emil-design-eng/ATTRIBUTION.md +20 -0
  344. package/skills/thirdparty-emil-design-eng/SKILL.md +21 -0
  345. package/skills/thirdparty-emil-design-eng/references/emil-design-eng.md +676 -0
  346. package/skills/thirdparty-ui-ux-pro-max/ATTRIBUTION.md +22 -0
  347. package/skills/thirdparty-ui-ux-pro-max/SKILL.md +304 -0
  348. package/skills/thirdparty-ui-ux-pro-max/data/charts.csv +26 -0
  349. package/skills/thirdparty-ui-ux-pro-max/data/colors.csv +97 -0
  350. package/skills/thirdparty-ui-ux-pro-max/data/icons.csv +101 -0
  351. package/skills/thirdparty-ui-ux-pro-max/data/landing.csv +31 -0
  352. package/skills/thirdparty-ui-ux-pro-max/data/products.csv +97 -0
  353. package/skills/thirdparty-ui-ux-pro-max/data/react-performance.csv +45 -0
  354. package/skills/thirdparty-ui-ux-pro-max/data/stacks/astro.csv +54 -0
  355. package/skills/thirdparty-ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  356. package/skills/thirdparty-ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  357. package/skills/thirdparty-ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  358. package/skills/thirdparty-ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  359. package/skills/thirdparty-ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  360. package/skills/thirdparty-ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  361. package/skills/thirdparty-ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  362. package/skills/thirdparty-ui-ux-pro-max/data/stacks/react.csv +54 -0
  363. package/skills/thirdparty-ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  364. package/skills/thirdparty-ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  365. package/skills/thirdparty-ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  366. package/skills/thirdparty-ui-ux-pro-max/data/stacks/vue.csv +50 -0
  367. package/skills/thirdparty-ui-ux-pro-max/data/styles.csv +68 -0
  368. package/skills/thirdparty-ui-ux-pro-max/data/typography.csv +58 -0
  369. package/skills/thirdparty-ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  370. package/skills/thirdparty-ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  371. package/skills/thirdparty-ui-ux-pro-max/data/web-interface.csv +31 -0
  372. package/skills/thirdparty-ui-ux-pro-max/scripts/core.py +253 -0
  373. package/skills/thirdparty-ui-ux-pro-max/scripts/design_system.py +1067 -0
  374. package/skills/thirdparty-ui-ux-pro-max/scripts/search.py +114 -0
  375. package/skills/thirdparty-web-interface-guidelines/ATTRIBUTION.md +23 -0
  376. package/skills/thirdparty-web-interface-guidelines/SKILL.md +190 -0
  377. package/skills/workflow-build-feature/SKILL.md +118 -0
  378. package/skills/workflow-coding-discipline/SKILL.md +140 -0
  379. package/skills/workflow-environment-ready/SKILL.md +128 -0
  380. package/skills/workflow-feature-flag/SKILL.md +262 -0
  381. package/skills/workflow-feedback-to-closure/SKILL.md +165 -0
  382. package/skills/workflow-fix-and-ship/SKILL.md +136 -0
  383. package/skills/workflow-git-commit/SKILL.md +200 -0
  384. package/skills/workflow-green-repo/SKILL.md +166 -0
  385. package/skills/workflow-grilling/SKILL.md +73 -0
  386. package/skills/workflow-gtm/SKILL.md +153 -0
  387. package/skills/workflow-housekeep/SKILL.md +453 -0
  388. package/skills/workflow-housekeep/references/templates.md +109 -0
  389. package/skills/workflow-launch-ready/SKILL.md +145 -0
  390. package/skills/workflow-merge-conflicts/SKILL.md +62 -0
  391. package/skills/workflow-onboard/SKILL.md +99 -0
  392. package/skills/workflow-parallel-agents/SKILL.md +164 -0
  393. package/skills/workflow-pr/SKILL.md +197 -0
  394. package/skills/workflow-quality-gate/SKILL.md +147 -0
  395. package/skills/workflow-refactor/SKILL.md +274 -0
  396. package/skills/workflow-release-prep/SKILL.md +207 -0
  397. package/skills/workflow-ship-and-observe/SKILL.md +164 -0
  398. package/skills/workflow-spec-tdd/SKILL.md +141 -0
  399. package/skills/workflow-spec-tdd/references/spec-template.md +126 -0
  400. package/skills/workflow-spec-tdd/references/tdd-patterns.md +167 -0
  401. package/skills-cursor/babysit/SKILL.md +17 -0
  402. package/skills-cursor/canvas/SKILL.md +142 -0
  403. package/skills-cursor/canvas/sdk/canvas-tokens.d.ts +235 -0
  404. package/skills-cursor/canvas/sdk/chart-primitives.d.ts +200 -0
  405. package/skills-cursor/canvas/sdk/dag-layout.d.ts +102 -0
  406. package/skills-cursor/canvas/sdk/diff-view.d.ts +130 -0
  407. package/skills-cursor/canvas/sdk/form-primitives.d.ts +194 -0
  408. package/skills-cursor/canvas/sdk/hooks.d.ts +117 -0
  409. package/skills-cursor/canvas/sdk/index.d.ts +47 -0
  410. package/skills-cursor/canvas/sdk/theme.d.ts +61 -0
  411. package/skills-cursor/canvas/sdk/todo-list.d.ts +49 -0
  412. package/skills-cursor/canvas/sdk/ui-primitives.d.ts +549 -0
  413. package/skills-cursor/canvas/sdk/ui-primitives.test.d.ts +2 -0
  414. package/skills-cursor/create-hook/SKILL.md +238 -0
  415. package/skills-cursor/create-rule/SKILL.md +185 -0
  416. package/skills-cursor/create-skill/SKILL.md +269 -0
  417. package/skills-cursor/create-skill/references/authoring-guide.md +182 -0
  418. package/skills-cursor/create-subagent/SKILL.md +228 -0
  419. package/skills-cursor/migrate-to-skills/SKILL.md +121 -0
  420. package/skills-cursor/shell/SKILL.md +22 -0
  421. package/skills-cursor/split-to-prs/SKILL.md +47 -0
  422. package/skills-cursor/statusline/SKILL.md +193 -0
  423. package/skills-cursor/update-cli-config/SKILL.md +85 -0
  424. package/skills-cursor/update-cursor-settings/SKILL.md +137 -0
  425. package/skills.sh.json +297 -0
@@ -0,0 +1,409 @@
1
+ ---
2
+ name: enhance-ux-laws
3
+ description: >
4
+ Measured fix pass on one screen or flow against seven Laws of UX: Fitts,
5
+ Hick, Miller, Jakob, Zeigarnik, Goal-Gradient, Von Restorff. Use when "too
6
+ many choices", "hard to tap", or "users drop off mid-flow". NN/g pass →
7
+ enhance-web-ux.
8
+ license: MIT
9
+ ---
10
+
11
+ # Enhance UX with the Laws of UX
12
+
13
+ **Degree of freedom: MIXED.** Probe run, thresholds, and re-measure
14
+ `[LOW freedom — run exactly]`; scoping, diagnosis, law conflicts, and fix
15
+ design `[HIGH freedom]`.
16
+
17
+ Takes one screen or flow and improves it against seven behavioural laws, using
18
+ measured values in place of impressions. Each law answers one question about
19
+ the person using the screen:
20
+
21
+ | Question | Law | Lever |
22
+ |---|---|---|
23
+ | Can they hit it? | Fitts | target size and travel distance |
24
+ | Can they decide? | Hick | number and weight of simultaneous choices |
25
+ | Do they see what matters? | Von Restorff | one distinct element per view |
26
+ | Can they hold it in mind? | Miller | chunking; nothing carried between screens |
27
+ | Does it work the way they expect? | Jakob | conventions from products they already use |
28
+ | Will they come back and finish? | Zeigarnik | visible, resumable unfinished work |
29
+ | Will they push through to the end? | Goal-Gradient | visible, honest progress |
30
+
31
+ Fix by default. When the request is for a review only, stop after the
32
+ findings table.
33
+
34
+ ## How to reason
35
+
36
+ 1. **Scope** — one screen or flow, its primary task, who uses it (first-time or daily), pointer type per layout
37
+ 2. **Measure** — probe at phone and desktop widths, then the flow walk for what the DOM cannot show
38
+ 3. **Diagnose** — each finding = law + measured value + threshold + why the law's precondition holds here
39
+ 4. **Resolve** — where two laws pull apart, pick by the conflict table and say so
40
+ 5. **Fix** — repair a broken flow first, then the smallest change at the shared component or token, driven by real product state
41
+ 6. **Verify** — re-run the probe and the flow walk; report before → after per metric
42
+
43
+ ## Worked example
44
+
45
+ Illustrative. Probe values are from a real run against a test booking page.
46
+
47
+ > **Scope:** `/book`, phone (touch) and desktop. Primary task: pick a site type and pay. First-time visitors.
48
+ > **Measure @390×844:** `under24` 17 of 38 targets; Edit/Delete 23×14 and 39×14, 2px apart; `accentsInFold` 8 filled blue; `repeatedActions` Choose ×6; nav 14 flat links; form 11 fields, 0 groups, 8 `placeholderOnly`, 3 `unlabeled`; `longCodes` one 16-digit reference; `stepButtons` Back/Next with 0 `indicators`; `fakeControls` `div:Pay now`; `homeLink` false. Flow walk: reload at step 2 empties the form; Next does nothing; a pasted card number with spaces is cut short.
49
+ > **Diagnose:** Jakob — "Pay now" is a `div` that submits nothing and the keyboard cannot reach (blocker). Zeigarnik — reload wipes the form (blocker). Fitts — Delete is 14px tall, 2px from Edit: destructive mis-tap (blocker). Von Restorff + Hick — 8 equal accents, six equally weighted plans (major). Miller — labels vanish on typing; reference must be retyped by hand (major). Goal-Gradient — no position in a 3-step flow (major).
50
+ > **Not a finding:** the prefecture select has 21 options, but people look up a known answer in a conventional order, so Hick does not apply. Left as is.
51
+ > **Resolve:** hiding three plans under "More site types" adds a tap (Hick vs Fitts); accepted because those three are 8% of bookings.
52
+ > **Fix:** `<button type="submit">` and working steps first; `Button` primitive gets a 44px min height and 8px gap; Delete moves away from Edit, behind a confirm; three plans visible, one preselected "Most booked"; one filled CTA per view, the rest outline; persistent labels in three fieldsets; reference rendered `8842 0193 7745 1206` with Copy; "Step 2 of 3" from the real step index; draft saved per field, card number excluded.
53
+ > **Verify:** `under24` 17 → 0, `accentsInFold` 8 → 1, `placeholderOnly` 8 → 0, `fakeControls` 1 → 0, `indicators` 0 → 1; reload at step 2 restores input; the pasted card number is kept whole.
54
+ > **Contract change:** `/book` now receives a `plan` field; the plan was never submitted before.
55
+
56
+ ## Self-critique before reporting
57
+
58
+ - **Measured** — every finding carries a probe value or a flow-walk observation, and its after-value from a re-run
59
+ - **Precondition stated** — each finding says why the law applies here (Hick: the options need evaluating; Miller: the user must hold the item in memory)
60
+ - **Real state** — every progress, draft, or completeness cue reads product data; the report names the field
61
+ - **Nothing sensitive stored** — drafts exclude card numbers, security codes, passwords, and one-time codes; the report lists what is persisted and for how long
62
+ - **One accent** — `accentsInFold` shows one filled accent action per view at both widths
63
+ - **Primitive-first** — a finding that repeats is fixed in the shared component or token, with the call sites listed
64
+ - **Conflicts named** — where two laws disagreed, the report says which won and why
65
+ - **Right owner** — full WCAG sweep → `audit-accessibility`; breakpoints → `audit-responsive`; NN/g page pass → `enhance-web-ux`
66
+
67
+ ## What each law claims, and what it does not
68
+
69
+ Most damage done in the name of these laws comes from applying one outside its
70
+ precondition. Check the middle column before writing a finding.
71
+
72
+ | Law | Claim | Applies when | It does not say |
73
+ |---|---|---|---|
74
+ | **Fitts** (1954) | Time to acquire a target grows with distance and shrinks with size: `T = a + b·log₂(D/W + 1)` | The user points at something: tap, click, drag | "Bigger is always better" — the gain is logarithmic, and size should track frequency and importance |
75
+ | **Hick–Hyman** (1952) | Decision time grows with the log of the number of equally likely options | Options must be read and weighed: plans, actions, filters, unfamiliar categories | Anything about looking up a known item in an ordered list (countries, prefectures) — that is search, so give it typeahead |
76
+ | **Miller** (1956) | Working memory holds about 7 ± 2 chunks; later work puts it nearer 4 (Cowan, 2001) | The user must hold something in mind: a code, a value from another screen, instructions | "Menus may have at most 7 items" — a visible menu is read, not memorised |
77
+ | **Jakob** (Nielsen, 2000) | People spend most of their time in other products and expect yours to work the same | A convention exists for this pattern on this platform and in this locale | "Copy the market leader" — a convention is what users already do, including name order, address order, and date format for the locale |
78
+ | **Zeigarnik** (1927) | Unfinished tasks stay on the mind more than finished ones; replications are mixed, so treat it as a design heuristic | Work spans interruptions or sessions | "Create open loops" — invented incompleteness is a dark pattern |
79
+ | **Goal-Gradient** (Hull, 1932; Kivetz et al., 2006) | Effort rises as the goal gets closer; a head start raises completion (Nunes & Drèze, 2006: 34% vs 19%) | A multi-step goal with a visible end | "Any progress bar helps" — slow early progress raises abandonment (Conrad et al., 2010) |
80
+ | **Von Restorff** (1933) | The item that differs from its neighbours is noticed and remembered | One item should win attention in this view | "Highlight the important things" — distinctiveness is a budget of one; a second accent spends it |
81
+
82
+ ## Step 1 — Scope [HIGH freedom]
83
+
84
+ Read the route file and its top-level components. Record:
85
+
86
+ - **Primary task** — the one thing a person comes to this screen to do, and the action that completes it
87
+ - **Users** — first-time, occasional, or daily. Daily users tolerate density and want speed; first-time users need conventions and guidance
88
+ - **Pointer** — touch, mouse, or both per layout. Touch thresholds apply to every layout a phone or tablet will see
89
+ - **Flow** — steps before and after this screen, and whether the task can span sessions
90
+ - **Primitives and tokens** — the shared `Button`, `Input`, `Field`, `Badge`, progress component, colour tokens
91
+ - **Real state available** — step index, completion flags, timestamps, draft storage, usage counts per option. Progress and resume cues are built from these
92
+
93
+ ## Step 2 — Measure [LOW freedom — run exactly]
94
+
95
+ ### 2a. Probe
96
+
97
+ Save the probe as `ux-laws-probe.js` in a scratch directory outside the repo
98
+ and work from there: the CLI writes its `.playwright-cli/` folder, the JSON,
99
+ and the screenshots into the current directory. Evaluate the probe in the
100
+ live page at a phone width and a desktop width. Resize before navigating so
101
+ the page lays out at the target width from first paint. With the pack
102
+ installed, follow `protocol-browser-anti-stall` for browser sessions.
103
+
104
+ ```bash
105
+ PW="npx --yes @playwright/cli@latest"; S="-s=ux-laws"
106
+ $PW $S open "<app-url>"
107
+ for wh in "390 844" "1440 900"; do
108
+ $PW $S resize $wh && $PW $S goto "<route>"
109
+ $PW $S eval "$(cat ux-laws-probe.js)" --filename "before-${wh// /x}.json" > /dev/null
110
+ $PW $S screenshot --filename "before-${wh// /x}.png" --full-page
111
+ done
112
+ $PW $S close
113
+ ```
114
+
115
+ Read the JSON files. The probe measures the state the page is in, so repeat
116
+ it for each state that matters — filled, error, menu open, every step of a
117
+ flow — by driving the same session there (`fill`, `click`) and evaluating
118
+ again to a new file. Any driver that evaluates JavaScript in the page works
119
+ as well: Playwright `page.evaluate`, a DevTools or browser-automation script
120
+ tool, or pasting `(<probe>)()` into the console.
121
+
122
+ ```js
123
+ () => {
124
+ const vw = innerWidth, vh = innerHeight, cap = a => a.slice(0, 12);
125
+ const R = el => el.getBoundingClientRect(), CS = el => getComputedStyle(el);
126
+ const vis = el => { const r = R(el), s = CS(el); // checkVisibility also catches closed <details> and hidden ancestors
127
+ return r.width > 0 && r.height > 0 && s.visibility !== 'hidden' && +s.opacity > 0.05 &&
128
+ (!el.checkVisibility || el.checkVisibility()); };
129
+ const label = el => (el.getAttribute('aria-label') || (el.tagName === 'SELECT' ? el.name : el.innerText) ||
130
+ el.value || el.placeholder || el.name || el.tagName).trim().replace(/\s+/g, ' ').slice(0, 32);
131
+ const SEL = 'a[href],button,input:not([type=hidden]),select,textarea,summary,[role=button],' +
132
+ '[role=link],[role=tab],[role=menuitem],[role=checkbox],[role=switch],[role=radio]';
133
+ const targets = [...document.querySelectorAll(SEL)].filter(vis);
134
+ const inFold = el => { const r = R(el); return r.top < vh && r.bottom > 0 && r.left < vw && r.right > 0; };
135
+ // Hit area = element box, extended by its <label> when it has one.
136
+ const hit = el => { let r = R(el), b = { l: r.left, t: r.top, r: r.right, b: r.bottom };
137
+ for (const lb of el.labels || []) { const q = R(lb);
138
+ b = { l: Math.min(b.l, q.left), t: Math.min(b.t, q.top), r: Math.max(b.r, q.right), b: Math.max(b.b, q.bottom) }; }
139
+ return { ...b, w: Math.round(b.r - b.l), h: Math.round(b.b - b.t) }; };
140
+ // Links inside a sentence are exempt from WCAG 2.5.8: their size follows the line of text.
141
+ const inline = el => el.tagName === 'A' && CS(el).display === 'inline' && !!el.closest('p,li,dd,td,blockquote,figcaption') &&
142
+ [...el.parentElement.childNodes].some(n => n.nodeType === 3 && n.textContent.trim().length > 12);
143
+ const gap = (a, b) => Math.round(Math.max(a.l - b.r, b.l - a.r, a.t - b.b, b.t - a.b, 0));
144
+ const hits = targets.filter(el => !inline(el)).map(el => ({ el, ...hit(el) }));
145
+
146
+ // FITTS — size, spacing, position of the main action
147
+ const small = hits.filter(t => Math.min(t.w, t.h) < 44);
148
+ const tiny = small.filter(t => Math.min(t.w, t.h) < 24);
149
+ const sized = t => ({ name: label(t.el), w: t.w, h: t.h });
150
+ const crowded = [];
151
+ hits.forEach((a, i) => hits.slice(i + 1).forEach(b => {
152
+ if (Math.min(a.w, a.h, b.w, b.h) >= 44 || a.el.contains(b.el) || b.el.contains(a.el)) return;
153
+ const g = gap(a, b); if (g < 8) crowded.push({ a: label(a.el), b: label(b.el), gapPx: g }); }));
154
+ crowded.sort((p, q) => p.gapPx - q.gapPx);
155
+
156
+ // VON RESTORFF — filled, saturated controls competing in the first fold
157
+ const rgb = c => (c.match(/[\d.]+/g) || []).map(Number);
158
+ const filled = el => { const [r, g, b, a = 1] = rgb(CS(el).backgroundColor);
159
+ return a > 0.5 && (Math.max(r, g, b) - Math.min(r, g, b)) > 60; };
160
+ const pointerRoots = [...document.querySelectorAll('body *')].filter(el => vis(el) &&
161
+ CS(el).cursor === 'pointer' && CS(el.parentElement).cursor !== 'pointer' &&
162
+ !el.matches(SEL + ',label') && !el.closest(SEL + ',label'));
163
+ const accents = {};
164
+ [...targets, ...pointerRoots].filter(el => inFold(el) && filled(el)).forEach(el => {
165
+ const k = CS(el).backgroundColor; (accents[k] = accents[k] || []).push(label(el)); });
166
+
167
+ // HICK — sets of options offered at once
168
+ const choiceSets = [];
169
+ document.querySelectorAll('nav,[role=navigation],[role=tablist],[role=toolbar],[role=menu],[role=radiogroup]')
170
+ .forEach(c => { const n = [...c.querySelectorAll(SEL)].filter(vis).length;
171
+ if (n) choiceSets.push({ set: c.getAttribute('aria-label') || c.tagName.toLowerCase(), options: n,
172
+ grouped: !!c.querySelector('h2,h3,h4,h5,[role=group],hr,ul ul,details') }); });
173
+ document.querySelectorAll('select').forEach(s => { if (vis(s)) choiceSets.push({ set: 'select:' + label(s),
174
+ options: s.options.length, grouped: !!s.querySelector('optgroup') }); });
175
+ const radios = {};
176
+ document.querySelectorAll('input[type=radio][name]').forEach(r => {
177
+ if (vis(r) || [...(r.labels || [])].some(vis)) (radios[r.name] = radios[r.name] || []).push(r); });
178
+ Object.entries(radios).forEach(([name, rs]) => choiceSets.push({ set: 'radio:' + name, options: rs.length,
179
+ preselected: rs.some(r => r.checked) }));
180
+ const byLabel = {};
181
+ targets.filter(el => /^(BUTTON|A)$/.test(el.tagName) || el.getAttribute('role') === 'button')
182
+ .forEach(el => { const k = label(el); byLabel[k] = (byLabel[k] || 0) + 1; });
183
+ const repeatedActions = Object.entries(byLabel).filter(([, n]) => n >= 3).map(([name, count]) => ({ name, count }));
184
+
185
+ // MILLER — things the user has to hold in their head
186
+ const inputs = targets.filter(el => /^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName) && !/^(submit|button|reset|image)$/.test(el.type));
187
+ const named = el => (el.labels && el.labels.length) || el.getAttribute('aria-label') || el.getAttribute('aria-labelledby') || el.title;
188
+ const forms = [...document.forms].map(f => { const fs = inputs.filter(el => f.contains(el));
189
+ return { form: f.getAttribute('aria-label') || f.getAttribute('name') || f.getAttribute('action') || 'form',
190
+ fields: fs.filter(el => el.type !== 'radio').length + new Set(fs.filter(el => el.type === 'radio').map(el => el.name)).size,
191
+ groups: [...f.querySelectorAll('fieldset,[role=group],h2,h3,h4')].filter(vis).length,
192
+ required: fs.filter(el => el.required).length }; });
193
+ const longNumericInputs = inputs.filter(el => el.tagName === 'INPUT' && (el.inputMode === 'numeric' || el.type === 'tel' ||
194
+ /cc-number|one-time-code/.test(el.autocomplete) || /card|otp|code|iban|account/i.test(el.name + el.id)))
195
+ .map(el => ({ name: label(el), maxLength: el.maxLength }));
196
+ const longCodes = cap([...new Set((document.body.innerText.match(/\b(?=[A-Z0-9]*\d{4})[A-Z0-9]{10,}\b/g) || []))]);
197
+
198
+ // GOAL-GRADIENT + ZEIGARNIK — is progress visible, and is this a multi-step flow?
199
+ const stepWords = /^(next|continue|back|previous)\b|^(次へ|戻る|進む|続ける)/i;
200
+ const progressText = (document.body.innerText.match(
201
+ /(step|ステップ)\s*\d+\s*(of|\/|/)\s*\d+|\d+\s*(of|\/|/)\s*\d+\s*(steps?|complete|done|完了)|\d{1,3}\s*%\s*(complete|done|完了)/gi) || []);
202
+ const progress = { indicators: document.querySelectorAll('progress,meter,[role=progressbar],[aria-current=step]').length,
203
+ text: cap(progressText), stepButtons: targets.filter(el => stepWords.test(label(el))).map(label) };
204
+
205
+ // JAKOB — conventions users bring from every other product
206
+ const isHome = a => { try { const u = new URL(a.href); return u.origin === location.origin && u.pathname === '/'; } catch { return false; } };
207
+ const jakob = {
208
+ homeLink: [...document.querySelectorAll('header a[href],[role=banner] a[href]')].some(isHome),
209
+ search: !!document.querySelector('input[type=search],[role=search],[role=searchbox]'),
210
+ fakeControls: cap(pointerRoots.map(el => el.tagName.toLowerCase() + ':' + label(el))),
211
+ inlineLinksNoUnderline: cap(targets.filter(el => inline(el) && CS(el).textDecorationLine === 'none').map(label)),
212
+ inputsUnder16px: inputs.filter(el => !/^(radio|checkbox|range|color|file)$/.test(el.type) && parseFloat(CS(el).fontSize) < 16).length,
213
+ noAutocomplete: inputs.filter(el => el.tagName === 'INPUT' && !el.autocomplete &&
214
+ (/^(email|tel|password)$/.test(el.type) || /name|mail|phone|tel|postal|zip|addr|card/i.test(el.name + el.id))).map(label),
215
+ };
216
+ const primary = hits.filter(t => inFold(t.el) && filled(t.el)).sort((a, b) => b.w * b.h - a.w * a.h)[0];
217
+
218
+ return {
219
+ viewport: { vw, vh, touch: matchMedia('(pointer: coarse)').matches },
220
+ fitts: { targets: hits.length, under24: tiny.length, under44: small.length,
221
+ smallest: cap(small.sort((a, b) => Math.min(a.w, a.h) - Math.min(b.w, b.h)).map(sized)),
222
+ crowdedPairs: crowded.length, tightest: cap(crowded),
223
+ primaryGuess: primary ? { ...sized(primary), xPct: Math.round(100 * (primary.l + primary.w / 2) / vw),
224
+ yPct: Math.round(100 * (primary.t + primary.h / 2) / vh) } : null },
225
+ hick: { targetsInFold: targets.filter(inFold).length, choiceSets: choiceSets.filter(c => c.options > 4), repeatedActions },
226
+ vonRestorff: { accentsInFold: Object.entries(accents).map(([bg, names]) => ({ bg, count: names.length, names: cap(names) })),
227
+ loopingAnimations: cap([...document.querySelectorAll('body *')].filter(el => vis(el) &&
228
+ CS(el).animationName !== 'none' && CS(el).animationIterationCount === 'infinite').map(label)) },
229
+ miller: { forms, placeholderOnly: cap(inputs.filter(el => !named(el) && el.placeholder).map(label)),
230
+ unlabeled: cap(inputs.filter(el => !named(el) && !el.placeholder).map(label)), longNumericInputs, longCodes },
231
+ progress, jakob,
232
+ };
233
+ }
234
+ ```
235
+
236
+ The probe reports candidates. Confirm each one against the page before it
237
+ becomes a finding:
238
+
239
+ - It measures element boxes. A hit area extended by a pseudo-element or a padded parent handler reads smaller than it is
240
+ - `touch` reflects the device running the probe, not the resized width. Decide touch from the product
241
+ - `primaryGuess` is the largest filled control in the fold. When `accentsInFold` holds several, the guess is arbitrary — which is the Von Restorff finding. `null` means no filled action is visible before scrolling
242
+ - `fakeControls` relies on `cursor: pointer`. Click handlers without it need a code search (`onClick` on `div`/`span`). A real `<button>` that does nothing passes; flow walk 7 catches it
243
+ - `choiceSets` and `repeatedActions` count options (the same label on three or more buttons is usually a picker). Whether they need evaluating is the Hick precondition, judged in Step 3
244
+ - `longNumericInputs` lists fields to try by hand in flow walk 8; the DOM does not show how a field formats what is typed
245
+ - `longCodes` reads text content, so a code grouped only by CSS spacing still appears. Confirm by eye
246
+
247
+ ### 2b. Flow walk
248
+
249
+ Eight checks the DOM cannot answer. Record one line each.
250
+
251
+ 1. **Leave and return** — fill half the flow, reload, press Back, close and reopen. What survives? Is there a cue on return that work is waiting?
252
+ 2. **Promise vs delivery** — count the steps the flow announces and the steps it takes. Note any step that appears after the announced last one
253
+ 3. **Carry-over** — at each step, list what the user needs from an earlier screen: a code, a price, an instruction, a selection
254
+ 4. **Travel** — trace the pointer or thumb through the primary task. Note long jumps between consecutive actions (last field bottom-left, submit top-right)
255
+ 5. **Keyboard** — Tab through. Every target reachable, in visual order, with Enter and Esc doing what they do elsewhere
256
+ 6. **Evaluate or look up** — for each choice set over 4, does the user weigh options or find a known one?
257
+ 7. **Dead controls** — press every button and link on the primary path. Note any that does nothing, and any choice that never reaches the submitted data
258
+ 8. **Type and paste** — in each long numeric field, type a value and paste one with spaces (`4242 4242 4242 4242`). Is it kept whole and grouped?
259
+
260
+ ## Step 3 — Diagnose [LOW freedom thresholds, HIGH freedom judgment]
261
+
262
+ One row per finding: law, evidence, threshold, why the precondition holds,
263
+ severity. Thresholds marked *house* are working targets, adjustable for a
264
+ dense professional tool with a stated reason.
265
+
266
+ | Law | Evidence | Threshold | Basis |
267
+ |---|---|---|---|
268
+ | Fitts | `under24`, `smallest` | 0 targets under 24×24 CSS px, unless a 24px circle around each stays clear, the link sits in a sentence, or the control is an unstyled native default | WCAG 2.2 SC 2.5.8 (AA) |
269
+ | Fitts | `under44` on touch layouts | primary and frequent targets ≥ 44×44 CSS px (48 on Android) | Apple HIG 44pt, Material 48dp, WCAG 2.5.5 (AAA) |
270
+ | Fitts | `tightest` | ≥ 8px between targets when either is under 44; a destructive action never within 8px of a frequent one | Material spacing; *house* |
271
+ | Fitts | flow walk 4, `primaryGuess.yPct` | the completing action sits directly after the last input; on phones, within thumb reach or in a sticky bottom bar | *house* |
272
+ | Hick | `choiceSets`, flow walk 6 | choice sets over 7 that need evaluating are grouped, staged, or given a default | *house* |
273
+ | Hick | `repeatedActions`, `radio:` sets | pickers show ≤ 4 options with one recommended and preselected, when usage data supports the choice | *house* |
274
+ | Von Restorff | `accentsInFold` | one filled accent action per view | *house* |
275
+ | Von Restorff | `loopingAnimations` | nothing loops past 5s without a pause control; `prefers-reduced-motion` honoured | WCAG 2.2.2 (A) |
276
+ | Von Restorff | emphasis channels | emphasis uses colour plus size, weight, icon, or position, at ≥ 3:1 against neighbours | WCAG 1.4.1, 1.4.11 |
277
+ | Miller | `placeholderOnly`, `unlabeled` | 0 — every field keeps a visible label while filled | WCAG 3.3.2; *house* |
278
+ | Miller | `longCodes`, flow walk 8 | strings of 7+ characters shown in groups of 3–4 with Copy; inputs accept spaces and dashes | *house* |
279
+ | Miller | `forms[].fields` vs `groups` | forms over 7 fields split into labelled groups of 3–5 | *house* |
280
+ | Miller | flow walk 3 | nothing must be remembered from an earlier screen; entered data is reused | WCAG 3.3.7 (A) |
281
+ | Jakob | `fakeControls`, flow walk 5 and 7 | 0 — every control is a native element, or carries role, name, and keyboard support, and does something | WCAG 4.1.2, 2.1.1 |
282
+ | Jakob | `homeLink`, `search`, `inlineLinksNoUnderline`, `noAutocomplete` | logo links home; sentence links differ by more than colour; standard `autocomplete` tokens set | WCAG 1.4.1, 1.3.5 |
283
+ | Jakob | `inputsUnder16px` on phone layouts | 0 — iOS zooms the page when a focused field's text is under 16px | platform behaviour |
284
+ | Goal-Gradient | `progress`, flow walk 2 | flows of 3+ steps show position and total; the indicator never moves backward; the total never grows after start | *house* |
285
+ | Zeigarnik | flow walk 1 | input survives reload and Back; the return screen offers a way to resume | *house* |
286
+
287
+ **Severity.** *Blocker*: the task fails or work is lost (a primary target
288
+ under 24px, a control that does nothing or that the keyboard cannot reach,
289
+ input wiped on Back or reload). *Major*: the primary task is measurably
290
+ slower or misleading (several equal accents, placeholder-only labels on a
291
+ long form, a 5-step flow with no position). *Minor*: secondary paths and
292
+ polish.
293
+
294
+ ## Step 4 — Resolve conflicts [HIGH freedom]
295
+
296
+ The laws optimise different things, so a fix for one can break another.
297
+
298
+ | Conflict | Resolution |
299
+ |---|---|
300
+ | Hick vs Fitts — hiding options adds taps and travel | Keep the top 3–5 options by real usage visible; hide only the long tail. One extra tap costs more than two extra options |
301
+ | Hick vs Jakob — trimming an item users expect to find | Conventional items stay (search, cart, account, back). Trim what is specific to this product |
302
+ | Von Restorff vs Jakob — a distinct control that no longer reads as a control | Differ in colour, size, or position; keep the conventional shape and behaviour |
303
+ | Fitts vs density — larger targets push content off screen and into memory | On dense desktop tools, enlarge the hit area with padding or a pseudo-element while the visible control stays compact |
304
+ | Miller vs Goal-Gradient — more, smaller steps lengthen the road | Split until each step holds one decision or 3–5 fields, then show position and total |
305
+ | Zeigarnik and Goal-Gradient vs calm — every cue is a demand on attention | One open-loop cue per surface, tied to real state, with a way to finish it or dismiss it |
306
+
307
+ When no row applies, order by what fails hardest: can't hit or can't operate
308
+ → breaks an expectation → too many choices → weak emphasis → weak motivation.
309
+ The first two stop the task; the rest slow it.
310
+
311
+ ## Step 5 — Fix [HIGH freedom]
312
+
313
+ Repair a broken flow before tuning it: no law helps a task that cannot
314
+ complete. Dead controls get behaviour or get removed, and a choice the user
315
+ makes has to reach the submitted data. Record every resulting change to what
316
+ the backend receives.
317
+
318
+ Then fix in the shared component or token when a finding repeats, and use the
319
+ design system's existing variants. Progress, drafts, and completeness cues
320
+ read real state; when the state does not exist, add the smallest persistence
321
+ that makes the cue true, or propose it.
322
+
323
+ **Fitts**
324
+ - Raise the minimum height and padding on the `Button`, `IconButton`, and row-action primitives; add gap tokens between adjacent targets
325
+ - Extend hit areas without enlarging chrome: padding, a wrapping `<label>`, or an inset pseudo-element
326
+ - Shorten travel: submit directly under the last field, row actions on the row, the next step where the last one ended. On phones, a sticky bottom action bar clear of the safe area
327
+ - Screen edges are effectively infinite targets for a mouse only when the control touches the edge with no margin; touch gets no such benefit
328
+ - Separate destructive from frequent actions by distance. Offer undo where the server can reverse the action; otherwise confirm
329
+
330
+ **Hick**
331
+ - Recommend one option: preselected, labelled with a reason that is true ("Most booked")
332
+ - Disclose progressively: frequent options visible, the rest behind "More" or an advanced section
333
+ - Stage decisions one per step when each depends on the last
334
+ - Group related options under headings; replace long known-item lists with typeahead
335
+ - Fill defaults from real data: last used, locale, the account's plan
336
+ - Without usage data, keep every option visible, group them, preselect nothing, and list the missing data as an open item. A recommendation needs a true reason
337
+
338
+ **Von Restorff**
339
+ - Give one action per view the filled accent variant; move the others to outline, ghost, or text variants
340
+ - Isolate with whitespace and position as well as colour
341
+ - Spend the accent on the user's task, not on promotion; emphasis styled like an advert gets ignored
342
+ - Stop looping animation after the first cycle or on interaction
343
+
344
+ **Miller**
345
+ - Add persistent labels; move help text beside the field it explains; show errors inline at the field
346
+ - Format long strings in groups and add Copy; accept any spacing on input
347
+ - Keep earlier choices in view: a summary panel, selected filters as chips, a review step before commit
348
+ - Put compared items in one view, side by side
349
+ - Group long forms into labelled fieldsets of 3–5 fields
350
+
351
+ **Jakob**
352
+ - Replace `div`/`span` controls with `<button>`, `<a>`, `<select>`, `<label>`
353
+ - Put the logo, navigation, search, account, and cart where the platform puts them; use the words users already know ("Sign in", "Cart", "Settings")
354
+ - Keep Enter, Esc, Back, and swipe-back doing what they do everywhere else; Back preserves input
355
+ - Set `autocomplete` tokens so the browser fills what it knows
356
+ - Compare against two or three products the target users open daily, in their locale. When a deviation is worth it, make one and teach it
357
+ - For a redesign of a product people already use, their expectations come from the old version: stage the change or offer a preview
358
+
359
+ **Zeigarnik**
360
+ - Autosave drafts per field or per step; restore on return
361
+ - Add a resume entry where returning users land: "Continue your booking"
362
+ - Show what remains as a short checklist built from real completion flags
363
+ - Every cue offers a way to finish and a way to dismiss
364
+ - Drafts never hold card numbers, security codes, passwords, or one-time codes; they expire; and the draft and its cue are cleared when the task completes
365
+
366
+ **Goal-Gradient**
367
+ - Show position and total ("Step 2 of 3"), or time remaining when length varies
368
+ - Count completed prerequisites as progress: an account already created is step 1 done
369
+ - Make the first step quick so progress is felt early; announce every step up front
370
+ - Break long goals into sub-goals so a finish line is always near; near the end, show what is left ("1 step left")
371
+ - Make steps behave like pages: each gets a history entry so Back moves one step, focus moves to the step heading, and validation runs per step
372
+
373
+ Cues with no state behind them are out of scope as fixes: unread badges for
374
+ nothing, a meter that cannot reach 100%, a bar driven by a timer, a head
375
+ start that was not earned. They work once and cost the product its
376
+ credibility.
377
+
378
+ ## Step 6 — Verify [LOW freedom — run exactly]
379
+
380
+ 1. Re-run the probe at the same widths and states; save `after-*.json` and `after-*.png`
381
+ 2. Repeat the flow-walk checks that produced findings
382
+ 3. Fill the before → after column for every finding. A metric still over threshold stays in the report with its reason
383
+ 4. Run the repo's lint, typecheck, and tests for the touched components. Where none exist, script the flow walk and report that
384
+
385
+ ## Output format
386
+
387
+ 1. **Scope** — route, primary task, users, pointer types, widths and states measured
388
+ 2. **Measurements** — law | metric | threshold | before (phone / desktop) | after (phone / desktop)
389
+ 3. **Flow walk** — check | before | after
390
+ 4. **Findings** — # | law | evidence | precondition | severity | fix | file
391
+ 5. **Not findings** — probe candidates dismissed, with the precondition that failed
392
+ 6. **Conflicts** — which laws disagreed, which won, why
393
+ 7. **Changes** — files touched, primitive-level changes first; then contract changes: fields the backend now receives differently, new required or optional decisions, what is persisted and for how long
394
+ 8. **Open items** — metrics still over threshold with the reason; state or data that must exist before a cue can be built; handoffs
395
+
396
+ ## Other surfaces
397
+
398
+ - **Native (React Native, SwiftUI, Compose)** — the probe is web-only. Measure with layout callbacks or the inspector; thresholds are 44pt on iOS and 48dp on Android. With the pack installed, `mobile-rn-screen` owns the screen
399
+ - **Mockup or screenshot only** — run the same pass by estimating from the image, and mark every value "estimated"
400
+
401
+ ## Related
402
+
403
+ - `enhance-web-ux` — NN/g heuristics and DOM forensics for one page
404
+ - `audit-ux` — heuristic report without fixes
405
+ - `audit-accessibility` — full WCAG sweep; this skill uses a few criteria as thresholds
406
+ - `enhance-web-forms` — validation, schema parity, form structure
407
+ - `enhance-onboarding` — activation event and steps to first value
408
+ - `enhance-web-conversion` — pricing and landing-page persuasion
409
+ - `audit-responsive` — breakpoint layout
@@ -0,0 +1,155 @@
1
+ ---
2
+ name: enhance-web-conversion
3
+ description: >
4
+ Conversion pass for landing, pricing, and upgrade paths: positioned hero,
5
+ one CTA, real proof, anchored tiers, upgrade prompts at value moments. Use
6
+ when "pricing page", "improve conversion", or "paywall UX". Page build →
7
+ enhance-web-landing.
8
+ license: MIT
9
+ ---
10
+
11
+ # enhance-web-conversion — Message, offer, proof, prompt
12
+
13
+ **Degree of freedom: MIXED.** Copy angle, packaging, and proof selection
14
+ `[HIGH freedom]`; the hero five-second check, the dark-pattern ban, and the
15
+ event names `[LOW freedom — run exactly]`.
16
+
17
+ Apply-now. `enhance-web-landing` makes the page look hand-crafted; this skill
18
+ makes it **say the right thing to the right person and ask once**. It touches
19
+ hero copy, CTA, pricing packaging, social proof, trust signals, and in-app
20
+ upgrade moments — and measures each with an event.
21
+
22
+ ## This skill vs neighbors
23
+
24
+ | Skill | Owns |
25
+ |---|---|
26
+ | **enhance-web-conversion** (this) | What the page claims, offers, proves, and asks |
27
+ | `enhance-web-landing` | Layout, type, motion, visual system of the page |
28
+ | `enhance-onboarding` | Getting the free user to first value (before any ask) |
29
+ | `audit-payment-system` | Whether checkout, webhooks, and refunds actually work |
30
+ | `audit-monetization-iap` | Mobile store purchases |
31
+ | `plan-gtm` | Chose the model and the ICP this skill writes for |
32
+ | `plan-antislop` | Voice audit when the copy reads generated |
33
+ | `enhance-web-seo` | Titles, meta, schema for the same pages |
34
+
35
+ Do **not** fire for "make the pricing page prettier" alone → `enhance-web-landing`.
36
+
37
+ ## How to reason
38
+
39
+ 1. **Message** — does the hero state who it is for, what it does, why not the alternative — in five seconds?
40
+ 2. **Offer** — does the packaging match the monetization model and make one tier the obvious pick?
41
+ 3. **Proof** — is every claim backed by a named person, a number, or a screenshot?
42
+ 4. **Prompt** — does the upgrade ask appear where value was just felt, and say what unlocks?
43
+ 5. **Measure** — does each of the above fire an event so the change can be judged?
44
+
45
+ ## Worked example
46
+
47
+ > **Message:** hero reads "145 skills · 57 commands"; the positioning says
48
+ > "refuses done while unchecked work remains". Rewrite: *"Coding agents call it
49
+ > done when it compiles. These playbooks don't."* CTA "Install in 30 seconds".
50
+ > **Offer:** free forever — so the only ask is the install; remove the second CTA.
51
+ > **Proof:** replace "used by developers" with the skills.sh install badge (live
52
+ > number) and one named quote from an issue thread.
53
+ > **Prompt:** none — no paid tier; add a "star if this saved you a rework" line
54
+ > after the first successful run (in-app, not on the landing page).
55
+ > **Measure:** `cta_clicked { location }`, `install_copied`; before/after
56
+ > visit→install unmeasured → measured.
57
+
58
+ ## Self-critique before reporting
59
+
60
+ - **Five-second pass** — a stranger reading only the hero can say who/what/why-different
61
+ - **One primary CTA per screen** — its verb matches the model ("Start free" / "Start 14-day trial" / "Book a demo")
62
+ - **Every proof is real** — names, logos, numbers, and quotes exist in the repo or were supplied
63
+ - **No dark patterns** — cancel path visible; no fake timers, confirm-shaming, or pre-checked add-ons
64
+ - **Events added** — pricing and upgrade events listed with where they fire
65
+ - **Right owner** — visual system → `enhance-web-landing`; checkout bugs → `audit-payment-system`
66
+
67
+ ---
68
+
69
+ ## Procedure
70
+
71
+ ### 1. Hero and CTA [LOW freedom — check; HIGH freedom — write]
72
+
73
+ Five-second check on the current hero: **who** (ICP named or implied), **what**
74
+ (outcome, not feature count), **why not the alternative**, **one CTA** above the
75
+ fold. Rewrite what fails. Sub-headline carries the mechanism; the H1 carries the
76
+ outcome. Model-matched CTA copy:
77
+
78
+ | Model | Primary CTA | Under it |
79
+ |---|---|---|
80
+ | Freemium / ungated | Start free · Try it now | "No account needed" / "Free forever for …" |
81
+ | Trial, no card | Start 14-day trial | "No credit card required" (lifts visit→signup) |
82
+ | Trial, card | Start trial | Price after trial + cancel-anytime, visible |
83
+ | Open-core / hosted | Deploy on cloud · Self-host | Link to the other path |
84
+ | Sales-assisted | Book a demo | Who it is for (team size / ACV) |
85
+
86
+ ### 2. Pricing page [HIGH freedom]
87
+
88
+ - **≤3 self-serve tiers** good-better-best; the recommended middle tier is
89
+ visually and verbally the default; the higher tier sits on the right as the
90
+ anchor. An enterprise column shows "from $X" — hiding its price removes the
91
+ anchor and hurts middle-tier conversion.
92
+ - **Same CTA verb on every column**; "No credit card required" under the
93
+ button when true.
94
+ - **Annual toggle** — default monthly for self-serve products with a free
95
+ tier; state the saving as "2 months free", not "save 17%" (norm 15–25%).
96
+ - **Free tier limits explicit** — what runs out (seats, rows, runs), never vague "basic".
97
+ - **Usage / credits** — if the model meters, show the unit, the included
98
+ amount, and a live estimate; bill shock is the top objection.
99
+ - **Feature table** lists outcomes people search for; hide internals.
100
+ - **FAQ** answers cancel, refund, data export, security — the objections that stall checkout.
101
+ - A dual CTA (free plan **or** 14-day card trial) lifted premium trial starts
102
+ 26% in one 2026 case; offer it only when `plan-gtm` chose both paths.
103
+ - Benchmarks to set expectations (2026, ChartMogul × Kyle Poyar × ProductLed):
104
+ freemium good 3–5%, trial no-card 4–6%, card-required 25–35%; median 8%.
105
+ Judge the change by Signup→Paid, not visits. Rows and URLs:
106
+ `plan-gtm/references/benchmarks-2026.md`.
107
+
108
+ ### 3. Proof and trust [HIGH freedom]
109
+
110
+ Order of strength: live numbers (installs, stars, customers) → named quotes with
111
+ role → recognizable logos → screenshots of the real product → security/privacy
112
+ pages. Place the strongest one directly under the hero CTA and again beside the
113
+ pricing CTA. Fabricated or anonymous "Jane D., CEO" quotes are removed, not kept.
114
+
115
+ ### 4. In-app upgrade prompts [HIGH freedom]
116
+
117
+ Ask at **value moments**: a limit reached, a premium feature touched, a result
118
+ worth keeping. The prompt names what unlocks, shows price, and completes in one
119
+ step. Dismiss is one click and remembered. Never interrupt the activation path
120
+ (`enhance-onboarding` owns that stretch). For a free tier, a "powered by"
121
+ badge on shared output is the cheapest loop (0.5–3% conversion, near-total
122
+ exposure); a referral credit follows once activation is measured.
123
+
124
+ ### 5. Events [LOW freedom — names]
125
+
126
+ ```
127
+ cta_clicked { location, label }
128
+ pricing_viewed · plan_selected { plan, interval }
129
+ checkout_started · checkout_completed { plan, interval }
130
+ upgrade_prompt_shown { trigger } · upgrade_prompt_clicked { trigger }
131
+ ```
132
+
133
+ Reconcile with `audit-analytics`; consent-gated; no PII.
134
+
135
+ ### 6. Verify
136
+
137
+ - Five-second read of the new hero by someone outside the project (or a fresh model with only the screenshot): what is it, for whom, what outcome — then the doppelganger check with the logo removed (could this be a competitor's page?)
138
+ - Playwright: pricing → checkout start path; cancel/downgrade path still reachable
139
+ - Events observed in the debug view
140
+ - Report: before/after copy, packaging diff, proof sources, events, files
141
+
142
+ ## Guardrails
143
+
144
+ - **No dark patterns** — no fake countdowns or scarcity, hidden cancel, confirm-shaming, pre-checked upsells, or bait pricing.
145
+ - **Claims need evidence** — a number or a name; otherwise cut the claim.
146
+ - **Model is not yours to change** — packaging follows the `plan-gtm` decision.
147
+ - **Voice** — if it reads like every other SaaS page, hand the copy to `plan-antislop`.
148
+
149
+ ## Chains with
150
+
151
+ - **`plan-gtm`** → positioning statement and monetization verdict this skill implements.
152
+ - **`enhance-web-landing`** → visual pass on the same pages.
153
+ - **`enhance-web-seo`** → title/meta/schema for landing and pricing.
154
+ - **`audit-payment-system`** → before turning on a card-required trial.
155
+ - **`test-playwright`** → lock checkout and cancel paths.