@haposoft/cafekit 0.16.0-rc.7 → 0.16.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 (299) hide show
  1. package/README.md +116 -27
  2. package/bin/__tests__/codex-hooks-ownership.test.js +239 -0
  3. package/bin/__tests__/codex-hooks.test.js +295 -0
  4. package/bin/__tests__/codex-native.test.js +2289 -34
  5. package/bin/__tests__/develop-contract.test.js +400 -23
  6. package/bin/__tests__/installer-safety.test.js +3 -3
  7. package/bin/__tests__/optional-skill-inventory.test.js +249 -0
  8. package/bin/__tests__/output-styles.test.js +214 -0
  9. package/bin/__tests__/package-inventory.test.js +2131 -16
  10. package/bin/__tests__/runtime-schema.test.js +111 -0
  11. package/bin/__tests__/secret-output-guardrail.test.js +122 -0
  12. package/bin/__tests__/skill-routing-source.test.js +172 -0
  13. package/bin/__tests__/specs-v2-execution-closeout.test.js +1 -1
  14. package/bin/install.js +10 -0
  15. package/bin/lib/codex-install.js +170 -5
  16. package/bin/lib/context.js +14 -0
  17. package/bin/lib/i18n.js +12 -6
  18. package/bin/lib/skill-deps.js +5 -5
  19. package/bin/phases/claude-runtime.js +23 -0
  20. package/bin/phases/claude-settings.js +8 -0
  21. package/bin/phases/codex-hooks.js +156 -0
  22. package/bin/phases/codex-runtime.js +29 -38
  23. package/bin/phases/copy-payload.js +8 -2
  24. package/bin/phases/select-skill-bundles.js +96 -0
  25. package/bin/phases/skill-inventory.js +71 -0
  26. package/bin/phases/skills-setup.js +9 -2
  27. package/bin/phases/write-metadata.js +8 -5
  28. package/package.json +8 -2
  29. package/src/claude/CLAUDE.md +3 -3
  30. package/src/claude/agents/brainstormer.md +52 -69
  31. package/src/claude/agents/code-auditor.md +32 -14
  32. package/src/claude/agents/debugger.md +35 -20
  33. package/src/claude/agents/deployer.md +12 -5
  34. package/src/claude/agents/docs-keeper.md +11 -1
  35. package/src/claude/agents/implementer.md +25 -13
  36. package/src/claude/agents/inspector.md +6 -3
  37. package/src/claude/agents/project-manager.md +1 -1
  38. package/src/claude/agents/researcher.md +26 -55
  39. package/src/claude/agents/spec-maker.md +24 -13
  40. package/src/claude/agents/strategist.md +52 -0
  41. package/src/claude/agents/test-runner.md +117 -132
  42. package/src/claude/agents/ui-ux-designer.md +1 -1
  43. package/src/claude/hooks/__tests__/fixtures/statusline-default.golden +1 -0
  44. package/src/claude/hooks/__tests__/precompact.test.js +158 -0
  45. package/src/claude/hooks/__tests__/spec-gate.test.js +87 -4
  46. package/src/claude/hooks/__tests__/state.test.js +254 -3
  47. package/src/claude/hooks/__tests__/statusline.test.js +196 -0
  48. package/src/claude/hooks/agent.cjs +1 -1
  49. package/src/claude/hooks/docs-sync.cjs +12 -10
  50. package/src/claude/hooks/inspect-block.cjs +1 -1
  51. package/src/claude/hooks/lib/config.cjs +3 -0
  52. package/src/claude/hooks/lib/hook-state-dir.cjs +39 -0
  53. package/src/claude/hooks/lib/secret-keywords.cjs +42 -0
  54. package/src/claude/hooks/precompact.cjs +105 -0
  55. package/src/claude/hooks/rules.cjs +1 -1
  56. package/src/claude/hooks/secret-output-guardrail.cjs +43 -0
  57. package/src/claude/hooks/session.cjs +27 -1
  58. package/src/claude/hooks/spec-gate.cjs +3 -3
  59. package/src/claude/hooks/spec-state.cjs +32 -5
  60. package/src/claude/hooks/state.cjs +1 -1
  61. package/src/claude/hooks/task-scaffold-guard.cjs +1 -1
  62. package/src/claude/hooks/usage.cjs +1 -1
  63. package/src/claude/migration-manifest.json +29 -15
  64. package/src/claude/output-styles/coding-level-0-eli5.md +103 -0
  65. package/src/claude/output-styles/coding-level-1-junior.md +124 -0
  66. package/src/claude/output-styles/coding-level-2-mid.md +146 -0
  67. package/src/claude/output-styles/coding-level-3-senior.md +148 -0
  68. package/src/claude/output-styles/coding-level-4-lead.md +159 -0
  69. package/src/claude/output-styles/coding-level-5-god.md +91 -0
  70. package/src/claude/references/debugger/core-philosophy.md +5 -3
  71. package/src/claude/references/debugger/frontend-verification.md +2 -2
  72. package/src/claude/references/debugger/log-ci-analysis.md +13 -1
  73. package/src/claude/references/debugger/parallel-agent-hydration.md +19 -34
  74. package/src/claude/references/debugger/performance-diagnostics.md +2 -2
  75. package/src/claude/references/debugger/root-cause-tracing.md +37 -6
  76. package/src/claude/references/debugger/side-effect-gate.md +3 -1
  77. package/src/claude/references/debugger/verification-protocol.md +13 -12
  78. package/src/claude/rules/orchestrator.md +7 -1
  79. package/src/claude/rules/process-management.md +39 -0
  80. package/src/claude/rules/review-audit-self-decision.md +48 -0
  81. package/src/claude/rules/skill-domain-routing.md +26 -24
  82. package/src/claude/rules/skill-workflow-routing.md +22 -14
  83. package/src/claude/rules/workflow.md +3 -3
  84. package/src/claude/runtime.json +1 -0
  85. package/src/claude/runtime.schema.json +205 -0
  86. package/src/claude/scripts/generate-skill-catalog.cjs +156 -122
  87. package/src/claude/scripts/provenance.cjs +18 -5
  88. package/src/claude/scripts/spec-receipt.cjs +76 -21
  89. package/src/claude/scripts/spec-resolver.cjs +144 -4
  90. package/src/claude/scripts/workflow-policy.cjs +1 -1
  91. package/src/claude/settings/settings.json +16 -0
  92. package/src/claude/skills/agent-browser/SKILL.md +1 -1
  93. package/src/claude/skills/ai-multimodal/SKILL.md +1 -1
  94. package/src/claude/skills/brainstorm/SKILL.md +193 -172
  95. package/src/claude/skills/brainstorm/references/question-framework.md +105 -167
  96. package/src/claude/skills/chrome-devtools/SKILL.md +1 -1
  97. package/src/claude/skills/code-review/SKILL.md +43 -25
  98. package/src/claude/skills/code-review/references/spec-compliance-review.md +3 -4
  99. package/src/claude/skills/code-review/references/verification-gate.md +1 -1
  100. package/src/claude/skills/debug/SKILL.md +48 -19
  101. package/src/claude/skills/delegate/SKILL.md +1 -1
  102. package/src/claude/skills/develop/SKILL.md +92 -65
  103. package/src/claude/skills/develop/references/parallel-waves.md +36 -63
  104. package/src/claude/skills/develop/references/quality-gate.md +31 -4
  105. package/src/claude/skills/develop/references/subagent-patterns.md +21 -7
  106. package/src/claude/skills/docs/SKILL.md +42 -23
  107. package/src/claude/skills/docs/references/init-workflow.md +4 -4
  108. package/src/claude/skills/docs/references/reconstruct-workflow.md +6 -6
  109. package/src/claude/skills/docs/references/standard-docs-workflow.md +6 -2
  110. package/src/claude/skills/docs/references/summarize-workflow.md +2 -2
  111. package/src/claude/skills/docs/references/update-workflow.md +9 -7
  112. package/src/claude/skills/docs/templates/requirements-as-is.md +1 -1
  113. package/src/claude/skills/docx/SKILL.md +1 -1
  114. package/src/claude/skills/git/SKILL.md +1 -1
  115. package/src/claude/skills/git/references/commit-protocols.md +1 -1
  116. package/src/claude/skills/git/references/finish-branch.md +1 -1
  117. package/src/claude/skills/hotfix/SKILL.md +159 -170
  118. package/src/claude/skills/hotfix/references/diagnosis-protocol.md +14 -9
  119. package/src/claude/skills/hotfix/references/parallel-patterns.md +27 -13
  120. package/src/claude/skills/hotfix/references/prevention-gate.md +5 -0
  121. package/src/claude/skills/hotfix/references/review-cycle.md +21 -15
  122. package/src/claude/skills/hotfix/references/workflow-specialized.md +53 -21
  123. package/src/claude/skills/inspect/SKILL.md +55 -46
  124. package/src/claude/skills/inspect/references/internal-inspection.md +21 -5
  125. package/src/claude/skills/loop/SKILL.md +114 -0
  126. package/src/claude/skills/loop/references/bounded-loop-protocol.md +104 -0
  127. package/src/claude/skills/loop/references/metric-and-guard-contract.md +76 -0
  128. package/src/claude/skills/pdf/SKILL.md +1 -1
  129. package/src/claude/skills/pptx/SKILL.md +1 -1
  130. package/src/claude/skills/question/SKILL.md +16 -13
  131. package/src/claude/skills/research/SKILL.md +70 -43
  132. package/src/claude/skills/route/SKILL.md +94 -0
  133. package/src/claude/skills/route/references/agent-timing.md +46 -0
  134. package/src/claude/skills/route/references/chaining-patterns.md +53 -0
  135. package/src/claude/skills/route/references/task-taxonomy.md +48 -0
  136. package/src/claude/skills/specs/SKILL.md +48 -57
  137. package/src/claude/skills/specs/references/review.md +26 -8
  138. package/src/claude/skills/specs/references/templates.md +76 -31
  139. package/src/claude/skills/specs/templates/requirements-init.md +1 -1
  140. package/src/claude/skills/specs/templates/research.md +2 -2
  141. package/src/claude/skills/sync/SKILL.md +6 -6
  142. package/src/claude/skills/sync/references/sync-protocols.md +1 -1
  143. package/src/claude/skills/test/SKILL.md +120 -120
  144. package/src/claude/skills/test/references/execution-strategy.md +208 -361
  145. package/src/claude/skills/test/references/failure-triage.md +55 -121
  146. package/src/claude/skills/test/references/test-memory.md +20 -34
  147. package/src/claude/skills/ui-ux-pro-max/SKILL.md +1 -1
  148. package/src/claude/skills/web-testing/SKILL.md +1 -1
  149. package/src/claude/skills/xlsx/SKILL.md +1 -1
  150. package/src/claude/status.cjs +135 -33
  151. package/src/codex/AGENTS.md +14 -4
  152. package/src/codex/hooks/docs-sync.cjs +8 -3
  153. package/src/codex/hooks/lib/hook-context.cjs +18 -4
  154. package/src/codex/hooks/rules.cjs +29 -1
  155. package/src/codex/hooks/secret-output-guardrail.cjs +30 -0
  156. package/src/codex/hooks/spec-gate.cjs +3 -8
  157. package/src/codex/hooks/spec-state.cjs +34 -5
  158. package/src/codex/hooks.json +5 -0
  159. package/src/codex/runtime.json +2 -0
  160. package/src/common/.env.example +1 -1
  161. package/src/claude/skills/backend-development/SKILL.md +0 -101
  162. package/src/claude/skills/backend-development/references/backend-api-design.md +0 -495
  163. package/src/claude/skills/backend-development/references/backend-architecture.md +0 -454
  164. package/src/claude/skills/backend-development/references/backend-authentication.md +0 -338
  165. package/src/claude/skills/backend-development/references/backend-code-quality.md +0 -659
  166. package/src/claude/skills/backend-development/references/backend-debugging.md +0 -904
  167. package/src/claude/skills/backend-development/references/backend-devops.md +0 -491
  168. package/src/claude/skills/backend-development/references/backend-mindset.md +0 -387
  169. package/src/claude/skills/backend-development/references/backend-performance.md +0 -397
  170. package/src/claude/skills/backend-development/references/backend-security.md +0 -342
  171. package/src/claude/skills/backend-development/references/backend-technologies.md +0 -256
  172. package/src/claude/skills/backend-development/references/backend-testing.md +0 -429
  173. package/src/claude/skills/devops/.env.example +0 -76
  174. package/src/claude/skills/devops/SKILL.md +0 -102
  175. package/src/claude/skills/devops/references/browser-rendering.md +0 -305
  176. package/src/claude/skills/devops/references/cloudflare-d1-kv.md +0 -123
  177. package/src/claude/skills/devops/references/cloudflare-platform.md +0 -271
  178. package/src/claude/skills/devops/references/cloudflare-r2-storage.md +0 -280
  179. package/src/claude/skills/devops/references/cloudflare-workers-advanced.md +0 -312
  180. package/src/claude/skills/devops/references/cloudflare-workers-apis.md +0 -309
  181. package/src/claude/skills/devops/references/cloudflare-workers-basics.md +0 -418
  182. package/src/claude/skills/devops/references/docker-basics.md +0 -297
  183. package/src/claude/skills/devops/references/docker-compose.md +0 -292
  184. package/src/claude/skills/devops/references/gcloud-platform.md +0 -297
  185. package/src/claude/skills/devops/references/gcloud-services.md +0 -304
  186. package/src/claude/skills/devops/references/kubernetes-basics.md +0 -95
  187. package/src/claude/skills/devops/references/kubernetes-helm-advanced.md +0 -70
  188. package/src/claude/skills/devops/references/kubernetes-helm.md +0 -81
  189. package/src/claude/skills/devops/references/kubernetes-kubectl.md +0 -74
  190. package/src/claude/skills/devops/references/kubernetes-security-advanced.md +0 -94
  191. package/src/claude/skills/devops/references/kubernetes-security.md +0 -89
  192. package/src/claude/skills/devops/references/kubernetes-troubleshooting-advanced.md +0 -74
  193. package/src/claude/skills/devops/references/kubernetes-troubleshooting.md +0 -49
  194. package/src/claude/skills/devops/references/kubernetes-workflows-advanced.md +0 -75
  195. package/src/claude/skills/devops/references/kubernetes-workflows.md +0 -76
  196. package/src/claude/skills/devops/scripts/cloudflare_deploy.py +0 -269
  197. package/src/claude/skills/devops/scripts/docker_optimize.py +0 -332
  198. package/src/claude/skills/devops/scripts/requirements.txt +0 -20
  199. package/src/claude/skills/devops/scripts/tests/requirements.txt +0 -3
  200. package/src/claude/skills/devops/scripts/tests/test_cloudflare_deploy.py +0 -285
  201. package/src/claude/skills/devops/scripts/tests/test_docker_optimize.py +0 -436
  202. package/src/claude/skills/frontend-design/SKILL.md +0 -135
  203. package/src/claude/skills/frontend-design/references/ai-multimodal-overview.md +0 -165
  204. package/src/claude/skills/frontend-design/references/analysis-best-practices.md +0 -80
  205. package/src/claude/skills/frontend-design/references/analysis-prompts.md +0 -141
  206. package/src/claude/skills/frontend-design/references/analysis-techniques.md +0 -118
  207. package/src/claude/skills/frontend-design/references/animejs.md +0 -396
  208. package/src/claude/skills/frontend-design/references/anti-slop-rules.md +0 -103
  209. package/src/claude/skills/frontend-design/references/asset-generation.md +0 -337
  210. package/src/claude/skills/frontend-design/references/bento-motion-engine.md +0 -142
  211. package/src/claude/skills/frontend-design/references/design-extraction-overview.md +0 -71
  212. package/src/claude/skills/frontend-design/references/extraction-best-practices.md +0 -141
  213. package/src/claude/skills/frontend-design/references/extraction-output-templates.md +0 -162
  214. package/src/claude/skills/frontend-design/references/extraction-prompts.md +0 -127
  215. package/src/claude/skills/frontend-design/references/magicui-components.md +0 -129
  216. package/src/claude/skills/frontend-design/references/performance-guardrails.md +0 -169
  217. package/src/claude/skills/frontend-design/references/premium-design-patterns.md +0 -93
  218. package/src/claude/skills/frontend-design/references/redesign-audit-checklist.md +0 -114
  219. package/src/claude/skills/frontend-design/references/technical-accessibility.md +0 -119
  220. package/src/claude/skills/frontend-design/references/technical-best-practices.md +0 -97
  221. package/src/claude/skills/frontend-design/references/technical-optimization.md +0 -44
  222. package/src/claude/skills/frontend-design/references/technical-overview.md +0 -90
  223. package/src/claude/skills/frontend-design/references/technical-workflows.md +0 -150
  224. package/src/claude/skills/frontend-design/references/visual-analysis-overview.md +0 -95
  225. package/src/claude/skills/frontend-design/references/workflow-3d.md +0 -102
  226. package/src/claude/skills/frontend-design/references/workflow-describe.md +0 -87
  227. package/src/claude/skills/frontend-design/references/workflow-immersive.md +0 -87
  228. package/src/claude/skills/frontend-design/references/workflow-quick.md +0 -57
  229. package/src/claude/skills/frontend-design/references/workflow-screenshot.md +0 -63
  230. package/src/claude/skills/frontend-design/references/workflow-video.md +0 -74
  231. package/src/claude/skills/frontend-development/SKILL.md +0 -406
  232. package/src/claude/skills/frontend-development/resources/common-patterns.md +0 -331
  233. package/src/claude/skills/frontend-development/resources/complete-examples.md +0 -872
  234. package/src/claude/skills/frontend-development/resources/component-patterns.md +0 -502
  235. package/src/claude/skills/frontend-development/resources/data-fetching.md +0 -767
  236. package/src/claude/skills/frontend-development/resources/file-organization.md +0 -502
  237. package/src/claude/skills/frontend-development/resources/loading-and-error-states.md +0 -501
  238. package/src/claude/skills/frontend-development/resources/performance.md +0 -406
  239. package/src/claude/skills/frontend-development/resources/routing-guide.md +0 -364
  240. package/src/claude/skills/frontend-development/resources/styling-guide.md +0 -428
  241. package/src/claude/skills/frontend-development/resources/typescript-standards.md +0 -418
  242. package/src/claude/skills/mobile-development/SKILL.md +0 -218
  243. package/src/claude/skills/mobile-development/references/mobile-android.md +0 -604
  244. package/src/claude/skills/mobile-development/references/mobile-best-practices.md +0 -544
  245. package/src/claude/skills/mobile-development/references/mobile-debugging.md +0 -1089
  246. package/src/claude/skills/mobile-development/references/mobile-frameworks.md +0 -465
  247. package/src/claude/skills/mobile-development/references/mobile-ios.md +0 -496
  248. package/src/claude/skills/mobile-development/references/mobile-mindset.md +0 -542
  249. package/src/claude/skills/react-best-practices/AGENTS.md +0 -2249
  250. package/src/claude/skills/react-best-practices/README.md +0 -123
  251. package/src/claude/skills/react-best-practices/SKILL.md +0 -128
  252. package/src/claude/skills/react-best-practices/metadata.json +0 -15
  253. package/src/claude/skills/react-best-practices/rules/_sections.md +0 -46
  254. package/src/claude/skills/react-best-practices/rules/_template.md +0 -28
  255. package/src/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  256. package/src/claude/skills/react-best-practices/rules/advanced-use-latest.md +0 -49
  257. package/src/claude/skills/react-best-practices/rules/async-api-routes.md +0 -38
  258. package/src/claude/skills/react-best-practices/rules/async-defer-await.md +0 -80
  259. package/src/claude/skills/react-best-practices/rules/async-dependencies.md +0 -36
  260. package/src/claude/skills/react-best-practices/rules/async-parallel.md +0 -28
  261. package/src/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +0 -99
  262. package/src/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +0 -59
  263. package/src/claude/skills/react-best-practices/rules/bundle-conditional.md +0 -31
  264. package/src/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +0 -49
  265. package/src/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  266. package/src/claude/skills/react-best-practices/rules/bundle-preload.md +0 -50
  267. package/src/claude/skills/react-best-practices/rules/client-event-listeners.md +0 -74
  268. package/src/claude/skills/react-best-practices/rules/client-swr-dedup.md +0 -56
  269. package/src/claude/skills/react-best-practices/rules/js-batch-dom-css.md +0 -82
  270. package/src/claude/skills/react-best-practices/rules/js-cache-function-results.md +0 -80
  271. package/src/claude/skills/react-best-practices/rules/js-cache-property-access.md +0 -28
  272. package/src/claude/skills/react-best-practices/rules/js-cache-storage.md +0 -70
  273. package/src/claude/skills/react-best-practices/rules/js-combine-iterations.md +0 -32
  274. package/src/claude/skills/react-best-practices/rules/js-early-exit.md +0 -50
  275. package/src/claude/skills/react-best-practices/rules/js-hoist-regexp.md +0 -45
  276. package/src/claude/skills/react-best-practices/rules/js-index-maps.md +0 -37
  277. package/src/claude/skills/react-best-practices/rules/js-length-check-first.md +0 -49
  278. package/src/claude/skills/react-best-practices/rules/js-min-max-loop.md +0 -82
  279. package/src/claude/skills/react-best-practices/rules/js-set-map-lookups.md +0 -24
  280. package/src/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +0 -57
  281. package/src/claude/skills/react-best-practices/rules/rendering-activity.md +0 -26
  282. package/src/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  283. package/src/claude/skills/react-best-practices/rules/rendering-conditional-render.md +0 -40
  284. package/src/claude/skills/react-best-practices/rules/rendering-content-visibility.md +0 -38
  285. package/src/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  286. package/src/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  287. package/src/claude/skills/react-best-practices/rules/rendering-svg-precision.md +0 -28
  288. package/src/claude/skills/react-best-practices/rules/rerender-defer-reads.md +0 -39
  289. package/src/claude/skills/react-best-practices/rules/rerender-dependencies.md +0 -45
  290. package/src/claude/skills/react-best-practices/rules/rerender-derived-state.md +0 -29
  291. package/src/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +0 -74
  292. package/src/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  293. package/src/claude/skills/react-best-practices/rules/rerender-memo.md +0 -44
  294. package/src/claude/skills/react-best-practices/rules/rerender-transitions.md +0 -40
  295. package/src/claude/skills/react-best-practices/rules/server-after-nonblocking.md +0 -73
  296. package/src/claude/skills/react-best-practices/rules/server-cache-lru.md +0 -41
  297. package/src/claude/skills/react-best-practices/rules/server-cache-react.md +0 -26
  298. package/src/claude/skills/react-best-practices/rules/server-parallel-fetching.md +0 -79
  299. package/src/claude/skills/react-best-practices/rules/server-serialization.md +0 -38
@@ -1,114 +0,0 @@
1
- # Redesign Audit Checklist
2
-
3
- Use when upgrading an existing project. Follow Scan → Diagnose → Fix in order.
4
-
5
- ## Workflow
6
-
7
- 1. **Scan** — Read the codebase. Identify framework, styling method (Tailwind, vanilla CSS, styled-components), and current design patterns.
8
- 2. **Diagnose** — Run through each category below. List every generic pattern, weak point, and missing state.
9
- 3. **Fix** — Apply targeted upgrades working with the existing stack. Do not rewrite from scratch.
10
-
11
- **Rules:**
12
- - Work with the existing tech stack. Do not migrate frameworks.
13
- - Do not break existing functionality. Test after every change.
14
- - Check `package.json` before adding any new dependency.
15
- - Keep changes focused and reviewable — small targeted improvements over big rewrites.
16
-
17
- ---
18
-
19
- ## Audit Categories
20
-
21
- ### 1. Typography
22
- - [ ] Browser default fonts or Inter everywhere → replace with `Geist`, `Outfit`, `Cabinet Grotesk`, or `Satoshi`
23
- - [ ] Headlines lack presence → tighten tracking, reduce line-height, increase display size
24
- - [ ] Body text too wide → limit to ~65ch, increase line-height
25
- - [ ] Only 400 + 700 weights → introduce 500/600 for subtler hierarchy
26
- - [ ] Numbers in proportional font → use monospace or `font-variant-numeric: tabular-nums`
27
- - [ ] All-caps subheaders everywhere → try lowercase italic or sentence case
28
- - [ ] Orphaned last words → fix with `text-wrap: balance` or `text-wrap: pretty`
29
- - [ ] Serif fonts on dashboard UI → use high-end sans-serif pairs only
30
-
31
- ### 2. Color and Surfaces
32
- - [ ] Pure `#000000` → replace with off-black or tinted dark
33
- - [ ] Oversaturated accents → desaturate below 80%
34
- - [ ] More than one accent color → reduce to one
35
- - [ ] Mixing warm and cool grays → pick one family, stay consistent
36
- - [ ] Purple/blue AI gradient aesthetic → replace with neutral base + singular accent
37
- - [ ] Generic `box-shadow` → tint shadows to background hue
38
- - [ ] Flat surfaces with zero texture → add subtle noise/grain overlay
39
- - [ ] Perfectly even linear gradients → use radial, mesh, or noise-overlaid gradients
40
- - [ ] Random dark section in light-mode page (or vice versa) → commit to consistent tone or use slightly darker shade of same palette
41
-
42
- ### 3. Layout
43
- - [ ] Everything centered and symmetrical → break with offset margins, mixed aspect ratios
44
- - [ ] Three equal card columns as feature row → use 2-col zig-zag, asymmetric grid, or horizontal scroll
45
- - [ ] `h-screen` / `height: 100vh` → replace with `min-height: 100dvh`
46
- - [ ] Complex flexbox `calc()` math → replace with CSS Grid
47
- - [ ] No max-width container → add 1200-1440px constraint with auto margins
48
- - [ ] Uniform border-radius everywhere → vary inner/outer elements
49
- - [ ] No overlap or depth → use negative margins for layering
50
- - [ ] Dashboard always has left sidebar → consider top nav, command menu, or collapsible panel
51
- - [ ] Buttons not bottom-aligned in card groups → pin CTAs to card bottom
52
- - [ ] Missing whitespace on marketing pages → double spacing, let design breathe
53
-
54
- ### 4. Interactivity and States
55
- - [ ] No hover states on buttons → add background shift, scale, or translate
56
- - [ ] No active/pressed feedback → add `scale(0.98)` or `translateY(1px)` on press
57
- - [ ] Instant transitions → add 200-300ms smooth transitions
58
- - [ ] Missing focus ring → visible focus indicator (accessibility requirement)
59
- - [ ] Generic circular spinner → replace with skeleton loader matching layout shape
60
- - [ ] No empty state → design a composed "getting started" view
61
- - [ ] No error state → inline error messages on forms (no `window.alert()`)
62
- - [ ] Dead links (`href="#"`) → link real destinations or visually disable
63
- - [ ] No current-page indicator in nav → style active link distinctly
64
- - [ ] Scroll jumping on anchor links → add `scroll-behavior: smooth`
65
- - [ ] Animations using `top`/`left`/`width`/`height` → switch to `transform` + `opacity`
66
-
67
- ### 5. Content
68
- - [ ] Generic placeholder names → use diverse, realistic names
69
- - [ ] Round fake numbers → use organic messy data
70
- - [ ] AI copywriting clichés → plain, specific language
71
- - [ ] Lorem Ipsum → real draft copy
72
- - [ ] Exclamation marks in success states → remove
73
- - [ ] Title Case On Every Header → use sentence case
74
- - [ ] Same avatar for multiple users → unique assets per person
75
- - [ ] Blog post dates all identical → randomize
76
-
77
- ### 6. Components and Code
78
- - [ ] Generic card (border + shadow + white bg) at high density → use spacing/dividers
79
- - [ ] Always one filled + one ghost button → add text links, reduce visual noise
80
- - [ ] Lucide/Feather icons only → try Phosphor or Heroicons for differentiation
81
- - [ ] Cliché icon metaphors (rocketship, shield) → less obvious alternatives
82
- - [ ] Div soup → use semantic HTML: `nav`, `main`, `article`, `aside`, `section`
83
- - [ ] Inline styles mixed with CSS classes → move all styling to the project's system
84
- - [ ] Arbitrary z-index values (`z-[9999]`) → establish a clean z-index scale
85
- - [ ] Missing alt text on meaningful images → describe content for screen readers
86
- - [ ] Missing meta tags → add `title`, `description`, `og:image`
87
-
88
- ---
89
-
90
- ## Fix Priority Order
91
-
92
- Apply in this order for maximum impact with minimum risk:
93
-
94
- 1. **Font swap** — biggest instant improvement, lowest risk
95
- 2. **Color cleanup** — remove clashing or oversaturated colors
96
- 3. **Hover and active states** — makes interface feel alive
97
- 4. **Layout and spacing** — proper grid, max-width, consistent padding
98
- 5. **Replace generic components** — swap cliché patterns for modern alternatives
99
- 6. **Add loading, empty, error states** — makes it feel finished
100
- 7. **Polish typography scale** — the premium final touch
101
-
102
- ---
103
-
104
- ## Strategic Omissions (What AI Typically Forgets)
105
-
106
- These are rarely in AI-generated output. Check explicitly:
107
-
108
- - **No legal links** → add privacy policy + terms in footer
109
- - **No "back" navigation** → every page needs a way back
110
- - **No custom 404 page** → design a helpful branded "not found" experience
111
- - **No form validation** → client-side validation for emails, required fields, formats
112
- - **No "skip to content" link** → essential for keyboard users
113
- - **No favicon** → always include a branded favicon
114
- - **No social sharing meta** → `og:image`, `og:title`, `twitter:card`
@@ -1,119 +0,0 @@
1
- # Accessibility Checks
2
-
3
- WCAG compliance and accessibility guidelines for generated assets.
4
-
5
- ## Text Overlay Readability
6
-
7
- ### Color Contrast Ratios
8
- - **WCAG AA**: 4.5:1 for normal text, 3:1 for large text
9
- - **WCAG AAA**: 7:1 for normal text, 4.5:1 for large text
10
-
11
- ### Testing Requirements
12
- - Test across image variations
13
- - Consider adding gradient overlays in code
14
- - Add text shadows for increased legibility
15
-
16
- ### Alt Text Guidelines
17
- - Describe the asset's purpose and mood
18
- - Don't repeat visible text
19
- - Keep concise (150 characters max)
20
-
21
- ## CSS Techniques for Accessibility
22
-
23
- ### Gradient Overlay for Text Readability
24
- ```css
25
- .hero {
26
- position: relative;
27
- background-image: url('hero.webp');
28
- }
29
- .hero::before {
30
- content: '';
31
- position: absolute;
32
- inset: 0;
33
- background: linear-gradient(
34
- to bottom,
35
- rgba(0,0,0,0.3) 0%,
36
- rgba(0,0,0,0.6) 100%
37
- );
38
- }
39
- ```
40
-
41
- ### Text Shadow for Contrast
42
- ```css
43
- .hero-text {
44
- text-shadow: 0 2px 4px rgba(0,0,0,0.5);
45
- }
46
- ```
47
-
48
- ### Ensure Minimum Contrast
49
- ```css
50
- .hero-cta {
51
- background: var(--color-primary-600);
52
- color: white; /* Ensure 4.5:1 contrast */
53
- }
54
- ```
55
-
56
- ## Integration Testing Analysis
57
-
58
- Analyze how asset works with UI elements:
59
-
60
- ```bash
61
- python scripts/gemini_batch_process.py \
62
- --files docs/assets/hero-with-text-overlay.png \
63
- --task analyze \
64
- --prompt "Analyze this design asset with UI elements overlaid:
65
-
66
- 1. Text Readability: Can all text be read clearly?
67
- 2. Contrast Issues: Identify any WCAG violations
68
- 3. Visual Hierarchy: Do buttons and CTAs stand out?
69
- 4. Spacing Problems: Any crowding or poor breathing room?
70
- 5. Responsive Concerns: Will this work on mobile at 9:16?
71
-
72
- Provide specific recommendations for adjustments." \
73
- --output docs/assets/integration-analysis.md \
74
- --model gemma-4-31b-it
75
- ```
76
-
77
- ## Next.js Integration Example
78
-
79
- ```tsx
80
- // app/components/Hero.tsx
81
- import Image from 'next/image'
82
-
83
- export function Hero() {
84
- return (
85
- <section className="relative h-screen">
86
- {/* Background image with optimization */}
87
- <Image
88
- src="/assets/hero-desktop.webp"
89
- alt="Minimalist desert landscape"
90
- fill
91
- priority
92
- quality={85}
93
- className="object-cover"
94
- sizes="100vw"
95
- />
96
-
97
- {/* Gradient overlay for text readability */}
98
- <div className="absolute inset-0 bg-gradient-to-b from-black/30 to-black/60" />
99
-
100
- {/* Content */}
101
- <div className="relative z-10 flex h-full items-center justify-center">
102
- <h1 className="text-6xl font-bold text-white drop-shadow-lg">
103
- Your Headline
104
- </h1>
105
- </div>
106
- </section>
107
- )
108
- }
109
- ```
110
-
111
- ## Common Issues
112
-
113
- ### Issue: Poor Text Overlay Readability
114
- **Symptoms**: Text hard to read over generated background
115
- **Solutions**:
116
- - Add CSS gradient overlay (see above)
117
- - Regenerate with "clean composition for text overlay" in prompt
118
- - Use darker/lighter areas strategically
119
- - Add text shadows or backdrop-blur
@@ -1,97 +0,0 @@
1
- # Best Practices Checklists
2
-
3
- Quality gates and checklists for asset generation workflows.
4
-
5
- ## Asset Generation Workflow
6
-
7
- ### Before Generating Assets
8
- - [ ] Defined clear aesthetic direction from design brief
9
- - [ ] Extracted color palette and typography character
10
- - [ ] Identified asset purpose and integration context
11
- - [ ] Considered accessibility and text overlay needs
12
-
13
- ### During Generation
14
- - [ ] Crafted design-driven, contextual prompt
15
- - [ ] Selected appropriate model and quality level
16
- - [ ] Specified correct aspect ratio for use case
17
- - [ ] Generated multiple variations if exploring
18
-
19
- ### After Generation
20
- - [ ] Ran comprehensive visual analysis (score ≥ 7/10)
21
- - [ ] Extracted exact color palette with hex codes
22
- - [ ] Compared multiple variations and selected best
23
- - [ ] Tested with overlaid text/UI elements
24
- - [ ] Optimized file size for web performance
25
- - [ ] Created responsive variants if needed
26
- - [ ] Documented asset usage and guidelines
27
-
28
- ## Design Guideline Extraction Workflow
29
-
30
- ### When Analyzing Existing Designs
31
- - [ ] Captured high-quality reference screenshots
32
- - [ ] Ran comprehensive design analysis with structured prompts
33
- - [ ] Extracted specific values (hex codes, px sizes, ms timings)
34
- - [ ] Analyzed multiple screens for pattern consistency
35
- - [ ] Validated font predictions against Google Fonts
36
- - [ ] Documented findings in actionable format
37
- - [ ] Created CSS variable specifications
38
- - [ ] Saved extracted guidelines in project docs/
39
-
40
- ## Quality Gates
41
-
42
- ### Never Proceed to Integration Without
43
- - [ ] Visual analysis score ≥ 7/10
44
- - [ ] Extracted color palette documented
45
- - [ ] Accessibility contrast checks passed
46
- - [ ] Responsive variants generated
47
- - [ ] File optimization completed
48
- - [ ] Asset usage guidelines documented
49
-
50
- ## Final Checklist
51
-
52
- Before considering any asset "done":
53
- - [ ] Generated with design-driven prompt (not generic)
54
- - [ ] Analyzed and scored ≥ 7/10
55
- - [ ] Extracted color palette for CSS implementation
56
- - [ ] Tested with UI overlays for readability
57
- - [ ] Optimized for web (WebP/JPEG)
58
- - [ ] Created responsive variants
59
- - [ ] Documented usage guidelines
60
- - [ ] Accessibility checks passed (contrast, alt text)
61
- - [ ] Integrated into frontend with proper optimization
62
-
63
- ## Common Issues & Solutions
64
-
65
- ### Issue 1: Generated Asset Too Generic
66
- **Symptoms**: Asset looks like stock photography, lacks design character
67
- **Solution**:
68
- - Refine prompt with specific aesthetic movements
69
- - Reference artists/designers/styles explicitly
70
- - Use more distinctive color directions
71
- - Add contextual details that make it unique
72
-
73
- ### Issue 2: Inconsistent Design Language
74
- **Symptoms**: Each generated asset feels unrelated
75
- **Solution**:
76
- - Extract and document design system from first successful generation
77
- - Reuse color palette keywords in all subsequent prompts
78
- - Maintain consistent aesthetic direction across generations
79
- - Reference previous successful assets in new prompts
80
-
81
- ### Issue 3: Low Analysis Scores
82
- **Symptoms**: Consistently getting scores < 7/10
83
- **Solutions**:
84
- - Review evaluation criteria—are they realistic?
85
- - Study high-scoring designs for patterns
86
- - Use design extraction on inspiration to learn what works
87
- - Iterate prompt with specific improvements from analysis
88
-
89
- ### Issue 4: Slow Generation Times
90
- **Symptoms**: Waiting too long for results
91
- **Solutions**:
92
- - Use fast model for exploration phase
93
- - Generate in batches rather than sequentially
94
- - Reserve ultra model only for final production assets
95
- - Run analysis while next generation processes
96
-
97
- **Remember**: Design first, generate second. Context is king. Iterate ruthlessly. Analysis is mandatory. Demand specifics, not generalities.
@@ -1,44 +0,0 @@
1
- # Cost & Performance Optimization
2
-
3
- Model selection strategies and budget guidelines.
4
-
5
- ## Model Selection Strategy
6
-
7
- ### 1. Exploration Phase
8
- Use fast model (3-5 variations):
9
- - **Cost**: ~$0.02 per image
10
- - **Speed**: ~5-10 seconds per generation
11
- - **Use for**: Rapid iteration, aesthetic exploration
12
-
13
- ### 2. Refinement Phase
14
- Use standard model (1-2 variations):
15
- - **Cost**: ~$0.04 per image
16
- - **Speed**: ~10-20 seconds per generation
17
- - **Use for**: Production-ready assets
18
-
19
- ### 3. Final Polish
20
- Use ultra model (1 generation):
21
- - **Cost**: ~$0.08 per image
22
- - **Speed**: ~20-30 seconds per generation
23
- - **Use for**: Hero images, marketing materials, critical assets
24
-
25
- ## Analysis Model Strategy
26
-
27
- - Use gemma-4-31b-it for all analysis (vision understanding)
28
- - **Cost**: ~$0.001 per analysis
29
- - **Speed**: ~2-5 seconds per analysis
30
- - **Token-efficient**: Images count as ~258-1548 tokens
31
-
32
- ## Budget Guidelines
33
-
34
- - **Small project**: 10-20 images, ~$2-5 total
35
- - **Medium project**: 50-100 images, ~$10-20 total
36
- - **Large project**: 200+ images, ~$50+ total
37
-
38
- ## Optimization Tips
39
-
40
- 1. **Use fast model first**: Explore variations cheaply before committing to production quality
41
- 2. **Batch analyze**: Analyze multiple variations simultaneously to save time
42
- 3. **Reuse successful prompts**: Once you find a working prompt, reuse it with variations
43
- 4. **Generate responsive variants separately**: Only create mobile versions for assets that need them
44
- 5. **Skip ultra model unless critical**: Standard quality often sufficient for most assets
@@ -1,90 +0,0 @@
1
- # Technical Guide Overview
2
-
3
- Technical considerations and best practices for AI multimodal integration in frontend design.
4
-
5
- ## Quick Reference
6
-
7
- ### File Optimization
8
- ```bash
9
- python scripts/media_optimizer.py \
10
- --input docs/assets/hero-image.png \
11
- --output docs/assets/hero-optimized.webp \
12
- --quality 85
13
- ```
14
-
15
- ### Format Selection
16
- - **WebP**: Best for web, 25-35% smaller than PNG, wide browser support
17
- - **AVIF**: Cutting edge, 50% smaller than WebP, limited support
18
- - **PNG**: Lossless, large file size, use for transparency
19
- - **JPEG**: Lossy, smaller than PNG, photos without transparency
20
-
21
- ### Responsive Variants
22
- ```bash
23
- # Desktop hero (16:9)
24
- --aspect-ratio 16:9
25
-
26
- # Mobile hero (9:16 or 3:4)
27
- --aspect-ratio 9:16
28
-
29
- # Square cards (1:1)
30
- --aspect-ratio 1:1
31
- ```
32
-
33
- ## Detailed References
34
-
35
- - `technical-accessibility.md` - WCAG compliance, contrast checks, alt text
36
- - `technical-workflows.md` - Complete pipeline examples
37
- - `technical-best-practices.md` - Checklists, quality gates
38
- - `technical-optimization.md` - Cost strategies, model selection
39
-
40
- ## Quick Commands
41
-
42
- ```bash
43
- # Generate (standard quality)
44
- python scripts/gemini_batch_process.py --task generate \
45
- --prompt "[design-driven prompt]" \
46
- --output docs/assets/[name] \
47
- --model imagen-4.0-generate-001 \
48
- --aspect-ratio 16:9
49
-
50
- # Analyze
51
- python scripts/gemini_batch_process.py --files docs/assets/[image].png \
52
- --task analyze \
53
- --prompt "[evaluation criteria]" \
54
- --output docs/assets/analysis.md \
55
- --model gemma-4-31b-it
56
-
57
- # Optimize
58
- python scripts/media_optimizer.py \
59
- --input docs/assets/[image].png \
60
- --output docs/assets/[image].webp \
61
- --quality 85
62
-
63
- # Extract colors
64
- python scripts/gemini_batch_process.py --files docs/assets/[image].png \
65
- --task analyze \
66
- --prompt "Extract 5-8 dominant colors with hex codes. Classify as primary/accent/neutral." \
67
- --output docs/assets/color-palette.md \
68
- --model gemma-4-31b-it
69
- ```
70
-
71
- ## Responsive Image Strategies
72
-
73
- **Art Direction (different crops)**:
74
- ```html
75
- <picture>
76
- <source media="(min-width: 768px)" srcset="hero-desktop.webp">
77
- <source media="(max-width: 767px)" srcset="hero-mobile.webp">
78
- <img src="hero-desktop.jpg" alt="Hero image">
79
- </picture>
80
- ```
81
-
82
- **Resolution Switching (same crop, different sizes)**:
83
- ```html
84
- <img
85
- srcset="hero-400w.webp 400w, hero-800w.webp 800w, hero-1200w.webp 1200w"
86
- sizes="(max-width: 600px) 400px, (max-width: 1000px) 800px, 1200px"
87
- src="hero-800w.jpg"
88
- alt="Hero image"
89
- />
90
- ```
@@ -1,150 +0,0 @@
1
- # Complete Workflow Examples
2
-
3
- End-to-end pipeline examples for asset generation and analysis.
4
-
5
- ## Example 1: Hero Section (Complete Pipeline)
6
-
7
- ```bash
8
- # 1. Generate hero image with design context
9
- python scripts/gemini_batch_process.py \
10
- --task generate \
11
- --prompt "Minimalist desert landscape, warm beige sand dunes,
12
- soft morning light, serene and spacious, muted earth tones
13
- (tan, cream, soft ochre), clean composition for text overlay,
14
- sophisticated travel aesthetic, 16:9 cinematic" \
15
- --output docs/assets/hero-desert \
16
- --model imagen-4.0-generate-001 \
17
- --aspect-ratio 16:9
18
-
19
- # 2. Evaluate aesthetic quality
20
- python scripts/gemini_batch_process.py \
21
- --files docs/assets/hero-desert.png \
22
- --task analyze \
23
- --prompt "Rate this image 1-10 for: visual appeal, color harmony,
24
- suitability for overlaying white text, professional quality.
25
- List any improvements needed." \
26
- --output docs/assets/hero-evaluation.md \
27
- --model gemma-4-31b-it
28
-
29
- # 3. If score ≥ 7/10, optimize for web
30
- python scripts/media_optimizer.py \
31
- --input docs/assets/hero-desert.png \
32
- --output docs/assets/hero-desktop.webp \
33
- --quality 85
34
-
35
- # 4. Generate mobile variant (9:16)
36
- python scripts/gemini_batch_process.py \
37
- --task generate \
38
- --prompt "Minimalist desert landscape, warm beige sand dunes,
39
- soft morning light, serene and spacious, muted earth tones
40
- (tan, cream, soft ochre), clean composition for text overlay,
41
- sophisticated travel aesthetic, 9:16 portrait" \
42
- --output docs/assets/hero-mobile \
43
- --model imagen-4.0-generate-001 \
44
- --aspect-ratio 9:16
45
-
46
- # 5. Optimize mobile variant
47
- python scripts/media_optimizer.py \
48
- --input docs/assets/hero-mobile.png \
49
- --output docs/assets/hero-mobile.webp \
50
- --quality 85
51
- ```
52
-
53
- ## Example 2: Extract, Generate, Analyze Loop
54
-
55
- ```bash
56
- # 1. Extract design guidelines from inspiration
57
- python scripts/gemini_batch_process.py \
58
- --files docs/inspiration/competitor-hero.png \
59
- --task analyze \
60
- --prompt "[use extraction prompt from extraction-prompts.md]" \
61
- --output docs/design-guidelines/competitor-analysis.md \
62
- --model gemma-4-31b-it
63
-
64
- # 2. Generate asset based on extracted guidelines
65
- # (Review competitor-analysis.md for color palette, aesthetic)
66
- python scripts/gemini_batch_process.py \
67
- --task generate \
68
- --prompt "[craft prompt using extracted aesthetic and colors]" \
69
- --output docs/assets/our-hero \
70
- --model imagen-4.0-generate-001 \
71
- --aspect-ratio 16:9
72
-
73
- # 3. Analyze our generated asset
74
- python scripts/gemini_batch_process.py \
75
- --files docs/assets/our-hero.png \
76
- --task analyze \
77
- --prompt "Compare to competitor design. Rate differentiation (1-10).
78
- Are we too similar or successfully distinct?" \
79
- --output docs/assets/differentiation-analysis.md \
80
- --model gemma-4-31b-it
81
-
82
- # 4. Extract colors from our final asset for CSS
83
- python scripts/gemini_batch_process.py \
84
- --files docs/assets/our-hero.png \
85
- --task analyze \
86
- --prompt "[use color extraction prompt from visual-analysis-overview.md]" \
87
- --output docs/assets/color-palette.md \
88
- --model gemma-4-31b-it
89
- ```
90
-
91
- ## Example 3: A/B Test Assets
92
-
93
- ```bash
94
- # Generate 2 design directions
95
- python scripts/gemini_batch_process.py \
96
- --task generate \
97
- --prompt "Minimalist approach: [prompt]" \
98
- --output docs/assets/variant-a \
99
- --model imagen-4.0-fast-generate-001 \
100
- --aspect-ratio 16:9
101
-
102
- python scripts/gemini_batch_process.py \
103
- --task generate \
104
- --prompt "Bold approach: [prompt]" \
105
- --output docs/assets/variant-b \
106
- --model imagen-4.0-fast-generate-001 \
107
- --aspect-ratio 16:9
108
-
109
- # Compare variants
110
- python scripts/gemini_batch_process.py \
111
- --files docs/assets/variant-a.png docs/assets/variant-b.png \
112
- --task analyze \
113
- --prompt "A/B comparison for [target audience]:
114
- 1. Attention capture
115
- 2. Brand alignment
116
- 3. Conversion potential
117
- Recommend which to test." \
118
- --output docs/assets/ab-comparison.md \
119
- --model gemma-4-31b-it
120
-
121
- # Generate production version of winner
122
- python scripts/gemini_batch_process.py \
123
- --task generate \
124
- --prompt "[winning approach prompt]" \
125
- --output docs/assets/final-hero \
126
- --model imagen-4.0-generate-001 \
127
- --aspect-ratio 16:9
128
- ```
129
-
130
- ## Batch Analysis for Rapid Iteration
131
-
132
- ```bash
133
- # Generate 3 variations with fast model
134
- for i in {1..3}; do
135
- python scripts/gemini_batch_process.py \
136
- --task generate \
137
- --prompt "[prompt with variation-$i twist]" \
138
- --output docs/assets/var-$i \
139
- --model imagen-4.0-fast-generate-001 \
140
- --aspect-ratio 16:9
141
- done
142
-
143
- # Batch analyze all variations
144
- python scripts/gemini_batch_process.py \
145
- --files docs/assets/var-*.png \
146
- --task analyze \
147
- --prompt "Rank these variations 1-3 with scores. Identify winner." \
148
- --output docs/assets/batch-analysis.md \
149
- --model gemma-4-31b-it
150
- ```