@palate/cli 0.0.0-stage → 0.0.1
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.
- package/LICENSE +20 -0
- package/README.md +151 -2
- package/bin/palate.mjs +894 -0
- package/kb/anatomy/data-table.md +24 -0
- package/kb/anatomy/empty-state.md +16 -0
- package/kb/anatomy/filter-toolbar.md +19 -0
- package/kb/anatomy/meter.md +16 -0
- package/kb/anatomy/product-window.md +18 -0
- package/kb/anatomy/settings-page.md +18 -0
- package/kb/anatomy/status-indicator.md +17 -0
- package/kb/anatomy/toast-undo.md +16 -0
- package/kb/bench/briefs.json +618 -0
- package/kb/craft/SOURCES.md +48 -0
- package/kb/craft/creativity.md +55 -0
- package/kb/craft/details.md +75 -0
- package/kb/craft/landing-demos.md +46 -0
- package/kb/craft/mistakes.md +73 -0
- package/kb/craft/motion.md +53 -0
- package/kb/craft/principles.md +68 -0
- package/kb/index/discovery.json +1 -0
- package/kb/inspiration/index.json +79 -0
- package/kb/moves/animated-comparison-table.md +58 -0
- package/kb/moves/before-after-slider.md +58 -0
- package/kb/moves/bento-live-tiles.md +57 -0
- package/kb/moves/calm-motion-system.md +63 -0
- package/kb/moves/canvas-grain.md +58 -0
- package/kb/moves/changelog-as-magazine.md +56 -0
- package/kb/moves/code-drawn-diagram.md +56 -0
- package/kb/moves/colophon.md +54 -0
- package/kb/moves/command-palette-site-nav.md +58 -0
- package/kb/moves/confetti-free-celebration.md +58 -0
- package/kb/moves/console-easter-egg.md +57 -0
- package/kb/moves/copy-confirmation.md +57 -0
- package/kb/moves/cursor-reactive-light.md +57 -0
- package/kb/moves/dark-band-contrast-section.md +55 -0
- package/kb/moves/designed-dark-mode.md +58 -0
- package/kb/moves/duotone-photography.md +55 -0
- package/kb/moves/editorial-drop-cap.md +58 -0
- package/kb/moves/editorial-grid-pull-quotes.md +55 -0
- package/kb/moves/engraving-colour-lens.md +64 -0
- package/kb/moves/explorable-control.md +57 -0
- package/kb/moves/feature-films-on-painted-stages.md +58 -0
- package/kb/moves/first-win-onboarding.md +59 -0
- package/kb/moves/footer-live-status.md +56 -0
- package/kb/moves/footer-rewards-the-end.md +58 -0
- package/kb/moves/generative-brand-pattern.md +55 -0
- package/kb/moves/gentle-error-nudge.md +59 -0
- package/kb/moves/halftone-dot-imagery.md +55 -0
- package/kb/moves/hand-drawn-annotations.md +55 -0
- package/kb/moves/hero-paints-itself-in.md +65 -0
- package/kb/moves/honest-progress-narration.md +58 -0
- package/kb/moves/honest-testimonial-wall.md +57 -0
- package/kb/moves/inline-sparklines-in-copy.md +57 -0
- package/kb/moves/inspect-our-taste.md +58 -0
- package/kb/moves/interactive-pricing-calculator.md +59 -0
- package/kb/moves/isometric-illustration-system.md +56 -0
- package/kb/moves/kinetic-variable-type.md +57 -0
- package/kb/moves/konami-secret.md +59 -0
- package/kb/moves/layered-paper-depth.md +56 -0
- package/kb/moves/lightweight-3d-object-hero.md +59 -0
- package/kb/moves/line-engraving-from-image.md +63 -0
- package/kb/moves/link-preview-peek.md +57 -0
- package/kb/moves/live-data-ticker.md +61 -0
- package/kb/moves/made-with-proof.md +51 -0
- package/kb/moves/magnetic-buttons.md +55 -0
- package/kb/moves/marquee-done-right.md +58 -0
- package/kb/moves/moves.yaml +450 -0
- package/kb/moves/museum-painting-backdrop.md +59 -0
- package/kb/moves/one-colour-brand-world.md +56 -0
- package/kb/moves/playful-404.md +58 -0
- package/kb/moves/pointer-highlight-word.md +56 -0
- package/kb/moves/product-in-context.md +56 -0
- package/kb/moves/real-world-data.md +58 -0
- package/kb/moves/referral-reward-reveal.md +59 -0
- package/kb/moves/riso-print-texture.md +57 -0
- package/kb/moves/screenshot-detail-crops.md +56 -0
- package/kb/moves/scroll-progress-chapters.md +57 -0
- package/kb/moves/scroll-scrubbed-product-film.md +62 -0
- package/kb/moves/self-playing-product-demo.md +61 -0
- package/kb/moves/shape-continuity-morph.md +58 -0
- package/kb/moves/sliding-nav-indicator.md +58 -0
- package/kb/moves/sticky-scroll-story.md +56 -0
- package/kb/moves/story-led-long-scroll.md +56 -0
- package/kb/moves/tactile-button.md +63 -0
- package/kb/moves/technical-drawing-lines.md +57 -0
- package/kb/moves/time-of-day-theming.md +56 -0
- package/kb/moves/tiny-game-easter-egg.md +60 -0
- package/kb/moves/type-decode-reveal.md +57 -0
- package/kb/moves/typographic-numeral-hero.md +58 -0
- package/kb/moves/view-transitions-between-pages.md +57 -0
- package/kb/moves/waitlist-position-live.md +60 -0
- package/kb/patterns/app-team-members.md +27 -0
- package/kb/patterns/chat-agent-approvals.md +31 -0
- package/kb/patterns/commerce-product-page.md +34 -0
- package/kb/patterns/dashboard-entity-table.md +37 -0
- package/kb/patterns/dashboard-home-today.md +24 -0
- package/kb/patterns/docs-api-reference.md +31 -0
- package/kb/patterns/marketing-product-led-landing.md +30 -0
- package/kb/patterns/mobile-daily-checklist.md +26 -0
- package/kb/references/index.json +1 -0
- package/kb/references/thumbs/004c5e9072.jpg +0 -0
- package/kb/references/thumbs/008915eb21.jpg +0 -0
- package/kb/references/thumbs/0098cf66c2.jpg +0 -0
- package/kb/references/thumbs/012e61b31f.jpg +0 -0
- package/kb/references/thumbs/014d4e46fc.jpg +0 -0
- package/kb/references/thumbs/01e54f394a.jpg +0 -0
- package/kb/references/thumbs/01e99a579c.jpg +0 -0
- package/kb/references/thumbs/01fd014575.jpg +0 -0
- package/kb/references/thumbs/022778ca72.jpg +0 -0
- package/kb/references/thumbs/02717bf1e1.jpg +0 -0
- package/kb/references/thumbs/02a5cfdbe9.jpg +0 -0
- package/kb/references/thumbs/02c9823f8d.jpg +0 -0
- package/kb/references/thumbs/02f3974613.jpg +0 -0
- package/kb/references/thumbs/032427f1ce.jpg +0 -0
- package/kb/references/thumbs/03ba677d07.jpg +0 -0
- package/kb/references/thumbs/04f2476cfe.jpg +0 -0
- package/kb/references/thumbs/0563e7c52e.jpg +0 -0
- package/kb/references/thumbs/05fa6b8eef.jpg +0 -0
- package/kb/references/thumbs/065bce1517.jpg +0 -0
- package/kb/references/thumbs/06c017f113.jpg +0 -0
- package/kb/references/thumbs/0770e2d8d3.jpg +0 -0
- package/kb/references/thumbs/078a26c4cb.jpg +0 -0
- package/kb/references/thumbs/08679b6e84.jpg +0 -0
- package/kb/references/thumbs/088c45a34c.jpg +0 -0
- package/kb/references/thumbs/089e9fd4e4.jpg +0 -0
- package/kb/references/thumbs/08f773231e.jpg +0 -0
- package/kb/references/thumbs/093ca3e2e3.jpg +0 -0
- package/kb/references/thumbs/0963320f74.jpg +0 -0
- package/kb/references/thumbs/09fc1ded85.jpg +0 -0
- package/kb/references/thumbs/0a368f3963.jpg +0 -0
- package/kb/references/thumbs/0a9e0e5201.jpg +0 -0
- package/kb/references/thumbs/0aace67ee7.jpg +0 -0
- package/kb/references/thumbs/0b61ecf793.jpg +0 -0
- package/kb/references/thumbs/0bde18ae09.jpg +0 -0
- package/kb/references/thumbs/0bf7ee8143.jpg +0 -0
- package/kb/references/thumbs/0ca20a13e0.jpg +0 -0
- package/kb/references/thumbs/0cdc0198c4.jpg +0 -0
- package/kb/references/thumbs/0cf9790b28.jpg +0 -0
- package/kb/references/thumbs/0d0202904b.jpg +0 -0
- package/kb/references/thumbs/0d053aba18.jpg +0 -0
- package/kb/references/thumbs/0d0c2c13d2.jpg +0 -0
- package/kb/references/thumbs/0d30be99b0.jpg +0 -0
- package/kb/references/thumbs/0d503da1b7.jpg +0 -0
- package/kb/references/thumbs/0ddad7b740.jpg +0 -0
- package/kb/references/thumbs/0e0a148101.jpg +0 -0
- package/kb/references/thumbs/0e401b6b75.jpg +0 -0
- package/kb/references/thumbs/0e8f32ba0f.jpg +0 -0
- package/kb/references/thumbs/0ef1966a7d.jpg +0 -0
- package/kb/references/thumbs/0efd416d11.jpg +0 -0
- package/kb/references/thumbs/0f3af263ae.jpg +0 -0
- package/kb/references/thumbs/0f9644c3a5.jpg +0 -0
- package/kb/references/thumbs/1020552737.jpg +0 -0
- package/kb/references/thumbs/1037626587.jpg +0 -0
- package/kb/references/thumbs/10512b7e94.jpg +0 -0
- package/kb/references/thumbs/106dc4a7b5.jpg +0 -0
- package/kb/references/thumbs/108943f6f7.jpg +0 -0
- package/kb/references/thumbs/10a5551d51.jpg +0 -0
- package/kb/references/thumbs/10dd01076c.jpg +0 -0
- package/kb/references/thumbs/11b06e39da.jpg +0 -0
- package/kb/references/thumbs/11baa1ec83.jpg +0 -0
- package/kb/references/thumbs/11bbe12167.jpg +0 -0
- package/kb/references/thumbs/11ca37feb8.jpg +0 -0
- package/kb/references/thumbs/11f14d3f12.jpg +0 -0
- package/kb/references/thumbs/124530ceb5.jpg +0 -0
- package/kb/references/thumbs/1276402336.jpg +0 -0
- package/kb/references/thumbs/1280e5c9d6.jpg +0 -0
- package/kb/references/thumbs/12cac0d172.jpg +0 -0
- package/kb/references/thumbs/138be6623a.jpg +0 -0
- package/kb/references/thumbs/13a0c544d1.jpg +0 -0
- package/kb/references/thumbs/13a32cb94c.jpg +0 -0
- package/kb/references/thumbs/144035d641.jpg +0 -0
- package/kb/references/thumbs/1457e41924.jpg +0 -0
- package/kb/references/thumbs/14972e3a86.jpg +0 -0
- package/kb/references/thumbs/15a47f2e4c.jpg +0 -0
- package/kb/references/thumbs/15aa15d22e.jpg +0 -0
- package/kb/references/thumbs/160dcd24b7.jpg +0 -0
- package/kb/references/thumbs/1610978529.jpg +0 -0
- package/kb/references/thumbs/16db30ba37.jpg +0 -0
- package/kb/references/thumbs/16f19ae4f3.jpg +0 -0
- package/kb/references/thumbs/16f758b03f.jpg +0 -0
- package/kb/references/thumbs/1748e5b751.jpg +0 -0
- package/kb/references/thumbs/175d0b0e69.jpg +0 -0
- package/kb/references/thumbs/178f571a36.jpg +0 -0
- package/kb/references/thumbs/17c43dc025.jpg +0 -0
- package/kb/references/thumbs/17c7f05b50.jpg +0 -0
- package/kb/references/thumbs/17f97e61dd.jpg +0 -0
- package/kb/references/thumbs/1804e17365.jpg +0 -0
- package/kb/references/thumbs/195c162ed1.jpg +0 -0
- package/kb/references/thumbs/19e3699c29.jpg +0 -0
- package/kb/references/thumbs/1a48e0a4d5.jpg +0 -0
- package/kb/references/thumbs/1a6cda265e.jpg +0 -0
- package/kb/references/thumbs/1a7e012091.jpg +0 -0
- package/kb/references/thumbs/1a9173a172.jpg +0 -0
- package/kb/references/thumbs/1b34a6b4d2.jpg +0 -0
- package/kb/references/thumbs/1b5284f3b2.jpg +0 -0
- package/kb/references/thumbs/1b93fbd6d3.jpg +0 -0
- package/kb/references/thumbs/1c6728fef6.jpg +0 -0
- package/kb/references/thumbs/1c6f101618.jpg +0 -0
- package/kb/references/thumbs/1cf7011a94.jpg +0 -0
- package/kb/references/thumbs/1d1769e539.jpg +0 -0
- package/kb/references/thumbs/1d1fd23199.jpg +0 -0
- package/kb/references/thumbs/1d7b6602ac.jpg +0 -0
- package/kb/references/thumbs/1dbbc61b9e.jpg +0 -0
- package/kb/references/thumbs/1dbdd6d21d.jpg +0 -0
- package/kb/references/thumbs/1dd873744b.jpg +0 -0
- package/kb/references/thumbs/1df4dd7cf9.jpg +0 -0
- package/kb/references/thumbs/1ece8c35b8.jpg +0 -0
- package/kb/references/thumbs/1f0e5b9aa4.jpg +0 -0
- package/kb/references/thumbs/1f1419651b.jpg +0 -0
- package/kb/references/thumbs/1f2a6da92d.jpg +0 -0
- package/kb/references/thumbs/1f651f33c0.jpg +0 -0
- package/kb/references/thumbs/1f8b697d18.jpg +0 -0
- package/kb/references/thumbs/1fee3824cd.jpg +0 -0
- package/kb/references/thumbs/1ff7757853.jpg +0 -0
- package/kb/references/thumbs/2043182f01.jpg +0 -0
- package/kb/references/thumbs/2059dabcd5.jpg +0 -0
- package/kb/references/thumbs/209d9dbb95.jpg +0 -0
- package/kb/references/thumbs/20d8923554.jpg +0 -0
- package/kb/references/thumbs/210dd3b671.jpg +0 -0
- package/kb/references/thumbs/2120719116.jpg +0 -0
- package/kb/references/thumbs/21a7384429.jpg +0 -0
- package/kb/references/thumbs/225f187391.jpg +0 -0
- package/kb/references/thumbs/230caf7dd2.jpg +0 -0
- package/kb/references/thumbs/235afad355.jpg +0 -0
- package/kb/references/thumbs/2378066687.jpg +0 -0
- package/kb/references/thumbs/241faf68a1.jpg +0 -0
- package/kb/references/thumbs/24d9f1a9b9.jpg +0 -0
- package/kb/references/thumbs/2505c8b9a0.jpg +0 -0
- package/kb/references/thumbs/25593638ca.jpg +0 -0
- package/kb/references/thumbs/25dd454f18.jpg +0 -0
- package/kb/references/thumbs/2602e123e2.jpg +0 -0
- package/kb/references/thumbs/26095c0b11.jpg +0 -0
- package/kb/references/thumbs/26260d6238.jpg +0 -0
- package/kb/references/thumbs/26bba21836.jpg +0 -0
- package/kb/references/thumbs/26bde3520b.jpg +0 -0
- package/kb/references/thumbs/272e22067c.jpg +0 -0
- package/kb/references/thumbs/27421b3226.jpg +0 -0
- package/kb/references/thumbs/2769ebca41.jpg +0 -0
- package/kb/references/thumbs/27e2f6e8b0.jpg +0 -0
- package/kb/references/thumbs/28432ba373.jpg +0 -0
- package/kb/references/thumbs/2846626f19.jpg +0 -0
- package/kb/references/thumbs/28750e821e.jpg +0 -0
- package/kb/references/thumbs/289481230f.jpg +0 -0
- package/kb/references/thumbs/2897967408.jpg +0 -0
- package/kb/references/thumbs/28c0a5fa17.jpg +0 -0
- package/kb/references/thumbs/28c181fba5.jpg +0 -0
- package/kb/references/thumbs/29806f539f.jpg +0 -0
- package/kb/references/thumbs/2997f56ee7.jpg +0 -0
- package/kb/references/thumbs/29b34a10fb.jpg +0 -0
- package/kb/references/thumbs/29bd78cdb4.jpg +0 -0
- package/kb/references/thumbs/29c8c6c22a.jpg +0 -0
- package/kb/references/thumbs/2ac23f7fae.jpg +0 -0
- package/kb/references/thumbs/2b76e13f79.jpg +0 -0
- package/kb/references/thumbs/2b84226479.jpg +0 -0
- package/kb/references/thumbs/2bf2dbf737.jpg +0 -0
- package/kb/references/thumbs/2bf89abbf6.jpg +0 -0
- package/kb/references/thumbs/2c562cd534.jpg +0 -0
- package/kb/references/thumbs/2cfe9d48c4.jpg +0 -0
- package/kb/references/thumbs/2d49f19b27.jpg +0 -0
- package/kb/references/thumbs/2dc8670da7.jpg +0 -0
- package/kb/references/thumbs/2de947c469.jpg +0 -0
- package/kb/references/thumbs/2e075ca79f.jpg +0 -0
- package/kb/references/thumbs/2eb0820e6b.jpg +0 -0
- package/kb/references/thumbs/2ec56a9dc0.jpg +0 -0
- package/kb/references/thumbs/30bb4ad607.jpg +0 -0
- package/kb/references/thumbs/30d19b8444.jpg +0 -0
- package/kb/references/thumbs/3173c71d73.jpg +0 -0
- package/kb/references/thumbs/31e59e4518.jpg +0 -0
- package/kb/references/thumbs/322b8960e8.jpg +0 -0
- package/kb/references/thumbs/325c9be6f4.jpg +0 -0
- package/kb/references/thumbs/3273338982.jpg +0 -0
- package/kb/references/thumbs/32f8387f38.jpg +0 -0
- package/kb/references/thumbs/332f6b74c3.jpg +0 -0
- package/kb/references/thumbs/334b146b6a.jpg +0 -0
- package/kb/references/thumbs/339abd60e4.jpg +0 -0
- package/kb/references/thumbs/33e88ec295.jpg +0 -0
- package/kb/references/thumbs/340931b5d4.jpg +0 -0
- package/kb/references/thumbs/34165a93bd.jpg +0 -0
- package/kb/references/thumbs/34d0575dd7.jpg +0 -0
- package/kb/references/thumbs/3549e75f0a.jpg +0 -0
- package/kb/references/thumbs/35827f1561.jpg +0 -0
- package/kb/references/thumbs/37c50280ec.jpg +0 -0
- package/kb/references/thumbs/37e66ecf11.jpg +0 -0
- package/kb/references/thumbs/3841a04fdc.jpg +0 -0
- package/kb/references/thumbs/38490c088f.jpg +0 -0
- package/kb/references/thumbs/3850319e9f.jpg +0 -0
- package/kb/references/thumbs/3856a64166.jpg +0 -0
- package/kb/references/thumbs/3881f211c2.jpg +0 -0
- package/kb/references/thumbs/38c7dde2f3.jpg +0 -0
- package/kb/references/thumbs/38ce9e486c.jpg +0 -0
- package/kb/references/thumbs/390ea8e01b.jpg +0 -0
- package/kb/references/thumbs/391b7fc27c.jpg +0 -0
- package/kb/references/thumbs/395f7214dc.jpg +0 -0
- package/kb/references/thumbs/39e81a5db2.jpg +0 -0
- package/kb/references/thumbs/3a67c8d655.jpg +0 -0
- package/kb/references/thumbs/3a89c25e3b.jpg +0 -0
- package/kb/references/thumbs/3aa0837542.jpg +0 -0
- package/kb/references/thumbs/3aae18aa8a.jpg +0 -0
- package/kb/references/thumbs/3bdbe767db.jpg +0 -0
- package/kb/references/thumbs/3c0616fc7f.jpg +0 -0
- package/kb/references/thumbs/3c18e9db1d.jpg +0 -0
- package/kb/references/thumbs/3c5a14076c.jpg +0 -0
- package/kb/references/thumbs/3ca9ec15c6.jpg +0 -0
- package/kb/references/thumbs/3d7756fd35.jpg +0 -0
- package/kb/references/thumbs/3dd45bd33d.jpg +0 -0
- package/kb/references/thumbs/3de72d5414.jpg +0 -0
- package/kb/references/thumbs/3dede597af.jpg +0 -0
- package/kb/references/thumbs/3ea948619e.jpg +0 -0
- package/kb/references/thumbs/402c12054c.jpg +0 -0
- package/kb/references/thumbs/403ab4af90.jpg +0 -0
- package/kb/references/thumbs/40773a8c63.jpg +0 -0
- package/kb/references/thumbs/407d9583db.jpg +0 -0
- package/kb/references/thumbs/415dc1d84c.jpg +0 -0
- package/kb/references/thumbs/420b676a4f.jpg +0 -0
- package/kb/references/thumbs/42a1ee85eb.jpg +0 -0
- package/kb/references/thumbs/43059221aa.jpg +0 -0
- package/kb/references/thumbs/432fa0d22c.jpg +0 -0
- package/kb/references/thumbs/43826f20e3.jpg +0 -0
- package/kb/references/thumbs/43ac55c98a.jpg +0 -0
- package/kb/references/thumbs/43d098f3c3.jpg +0 -0
- package/kb/references/thumbs/4449d80c2c.jpg +0 -0
- package/kb/references/thumbs/44625727dc.jpg +0 -0
- package/kb/references/thumbs/4482bb87a1.jpg +0 -0
- package/kb/references/thumbs/44b078acdc.jpg +0 -0
- package/kb/references/thumbs/44d0305850.jpg +0 -0
- package/kb/references/thumbs/456bb6b59e.jpg +0 -0
- package/kb/references/thumbs/45df73ce48.jpg +0 -0
- package/kb/references/thumbs/45edb45d87.jpg +0 -0
- package/kb/references/thumbs/4671d57cd5.jpg +0 -0
- package/kb/references/thumbs/46cc108518.jpg +0 -0
- package/kb/references/thumbs/470022e614.jpg +0 -0
- package/kb/references/thumbs/4719a669ce.jpg +0 -0
- package/kb/references/thumbs/47404f5ad4.jpg +0 -0
- package/kb/references/thumbs/479d3eb977.jpg +0 -0
- package/kb/references/thumbs/479ed92ceb.jpg +0 -0
- package/kb/references/thumbs/47baed50c7.jpg +0 -0
- package/kb/references/thumbs/47fdcfd7b0.jpg +0 -0
- package/kb/references/thumbs/48fd5e94c5.jpg +0 -0
- package/kb/references/thumbs/493807917b.jpg +0 -0
- package/kb/references/thumbs/49a1c67293.jpg +0 -0
- package/kb/references/thumbs/49e2d7fafe.jpg +0 -0
- package/kb/references/thumbs/49f540fcb6.jpg +0 -0
- package/kb/references/thumbs/4a67ec4028.jpg +0 -0
- package/kb/references/thumbs/4a93275b04.jpg +0 -0
- package/kb/references/thumbs/4aae6f52da.jpg +0 -0
- package/kb/references/thumbs/4b1bae66bd.jpg +0 -0
- package/kb/references/thumbs/4b75da15a9.jpg +0 -0
- package/kb/references/thumbs/4b77789b88.jpg +0 -0
- package/kb/references/thumbs/4bc2f3f3a4.jpg +0 -0
- package/kb/references/thumbs/4c48f27b88.jpg +0 -0
- package/kb/references/thumbs/4c52bd8bfb.jpg +0 -0
- package/kb/references/thumbs/4c9b4acc60.jpg +0 -0
- package/kb/references/thumbs/4cbf0752d4.jpg +0 -0
- package/kb/references/thumbs/4cd2672517.jpg +0 -0
- package/kb/references/thumbs/4dd22a8181.jpg +0 -0
- package/kb/references/thumbs/4ee3447314.jpg +0 -0
- package/kb/references/thumbs/4ef29c8144.jpg +0 -0
- package/kb/references/thumbs/4f82fadfd6.jpg +0 -0
- package/kb/references/thumbs/4fc9b643d8.jpg +0 -0
- package/kb/references/thumbs/50549524b0.jpg +0 -0
- package/kb/references/thumbs/509a615883.jpg +0 -0
- package/kb/references/thumbs/50c03ef855.jpg +0 -0
- package/kb/references/thumbs/50cf9acad6.jpg +0 -0
- package/kb/references/thumbs/51131b025c.jpg +0 -0
- package/kb/references/thumbs/51da1124f0.jpg +0 -0
- package/kb/references/thumbs/524d5e7288.jpg +0 -0
- package/kb/references/thumbs/5251247c81.jpg +0 -0
- package/kb/references/thumbs/526b91b7ec.jpg +0 -0
- package/kb/references/thumbs/52f02f6c2e.jpg +0 -0
- package/kb/references/thumbs/530ab530dc.jpg +0 -0
- package/kb/references/thumbs/5335ee4404.jpg +0 -0
- package/kb/references/thumbs/5385b90939.jpg +0 -0
- package/kb/references/thumbs/53c54654cc.jpg +0 -0
- package/kb/references/thumbs/5420794c6c.jpg +0 -0
- package/kb/references/thumbs/542a9dce8b.jpg +0 -0
- package/kb/references/thumbs/5571530a5f.jpg +0 -0
- package/kb/references/thumbs/56cc68d804.jpg +0 -0
- package/kb/references/thumbs/577b7f7c44.jpg +0 -0
- package/kb/references/thumbs/57adf8f1bb.jpg +0 -0
- package/kb/references/thumbs/57c5f5e3a6.jpg +0 -0
- package/kb/references/thumbs/57ffe4e839.jpg +0 -0
- package/kb/references/thumbs/5817dfc7d6.jpg +0 -0
- package/kb/references/thumbs/581a182a7a.jpg +0 -0
- package/kb/references/thumbs/58807679c8.jpg +0 -0
- package/kb/references/thumbs/589a1d9111.jpg +0 -0
- package/kb/references/thumbs/59167391ab.jpg +0 -0
- package/kb/references/thumbs/5a70420166.jpg +0 -0
- package/kb/references/thumbs/5b10df1b8d.jpg +0 -0
- package/kb/references/thumbs/5b7a712fdb.jpg +0 -0
- package/kb/references/thumbs/5bc46b92ad.jpg +0 -0
- package/kb/references/thumbs/5c0546a120.jpg +0 -0
- package/kb/references/thumbs/5c2b6125a8.jpg +0 -0
- package/kb/references/thumbs/5c536b9e42.jpg +0 -0
- package/kb/references/thumbs/5c8e441d30.jpg +0 -0
- package/kb/references/thumbs/5cb6f1baa5.jpg +0 -0
- package/kb/references/thumbs/5ce6c1f21e.jpg +0 -0
- package/kb/references/thumbs/5cef052c0a.jpg +0 -0
- package/kb/references/thumbs/5d08438209.jpg +0 -0
- package/kb/references/thumbs/5d0f9af9b0.jpg +0 -0
- package/kb/references/thumbs/5d300ed332.jpg +0 -0
- package/kb/references/thumbs/5d708a4794.jpg +0 -0
- package/kb/references/thumbs/5de8826a98.jpg +0 -0
- package/kb/references/thumbs/5df7bff22c.jpg +0 -0
- package/kb/references/thumbs/5e087d0f00.jpg +0 -0
- package/kb/references/thumbs/5e44e70ca0.jpg +0 -0
- package/kb/references/thumbs/5eff5d80ce.jpg +0 -0
- package/kb/references/thumbs/5f015c96b1.jpg +0 -0
- package/kb/references/thumbs/5f3289b7c4.jpg +0 -0
- package/kb/references/thumbs/5f830c40eb.jpg +0 -0
- package/kb/references/thumbs/60c4c3527b.jpg +0 -0
- package/kb/references/thumbs/60e9e594dd.jpg +0 -0
- package/kb/references/thumbs/615421d7be.jpg +0 -0
- package/kb/references/thumbs/6176e4004f.jpg +0 -0
- package/kb/references/thumbs/61f0fe5e06.jpg +0 -0
- package/kb/references/thumbs/6213785db4.jpg +0 -0
- package/kb/references/thumbs/62a670ae09.jpg +0 -0
- package/kb/references/thumbs/63cc12981b.jpg +0 -0
- package/kb/references/thumbs/641f15cc71.jpg +0 -0
- package/kb/references/thumbs/642ab2081d.jpg +0 -0
- package/kb/references/thumbs/644a59bf6e.jpg +0 -0
- package/kb/references/thumbs/644da8a8e3.jpg +0 -0
- package/kb/references/thumbs/6458986897.jpg +0 -0
- package/kb/references/thumbs/64cfbd7b93.jpg +0 -0
- package/kb/references/thumbs/661a57686a.jpg +0 -0
- package/kb/references/thumbs/66355a813a.jpg +0 -0
- package/kb/references/thumbs/664396dd44.jpg +0 -0
- package/kb/references/thumbs/66d832d65f.jpg +0 -0
- package/kb/references/thumbs/66de9e9833.jpg +0 -0
- package/kb/references/thumbs/6750964fd9.jpg +0 -0
- package/kb/references/thumbs/67c7164832.jpg +0 -0
- package/kb/references/thumbs/681600b6cd.jpg +0 -0
- package/kb/references/thumbs/682e75afe4.jpg +0 -0
- package/kb/references/thumbs/69274bc952.jpg +0 -0
- package/kb/references/thumbs/696ec08c52.jpg +0 -0
- package/kb/references/thumbs/69760111cc.jpg +0 -0
- package/kb/references/thumbs/697e32664f.jpg +0 -0
- package/kb/references/thumbs/69df92544b.jpg +0 -0
- package/kb/references/thumbs/69e48c5229.jpg +0 -0
- package/kb/references/thumbs/6a5fb75de1.jpg +0 -0
- package/kb/references/thumbs/6a7389e472.jpg +0 -0
- package/kb/references/thumbs/6a9b041e02.jpg +0 -0
- package/kb/references/thumbs/6ab2fa93ee.jpg +0 -0
- package/kb/references/thumbs/6ae3400319.jpg +0 -0
- package/kb/references/thumbs/6b21344bf3.jpg +0 -0
- package/kb/references/thumbs/6bd1b67a8a.jpg +0 -0
- package/kb/references/thumbs/6c99156c4f.jpg +0 -0
- package/kb/references/thumbs/6cc9b65384.jpg +0 -0
- package/kb/references/thumbs/6d15830a73.jpg +0 -0
- package/kb/references/thumbs/6d4c33d180.jpg +0 -0
- package/kb/references/thumbs/6e36815799.jpg +0 -0
- package/kb/references/thumbs/6eddb9cbfc.jpg +0 -0
- package/kb/references/thumbs/6f97968a7c.jpg +0 -0
- package/kb/references/thumbs/6fa0716a7d.jpg +0 -0
- package/kb/references/thumbs/6facd57184.jpg +0 -0
- package/kb/references/thumbs/6fd57b785a.jpg +0 -0
- package/kb/references/thumbs/700b3cb185.jpg +0 -0
- package/kb/references/thumbs/71197443fa.jpg +0 -0
- package/kb/references/thumbs/72082bc9ee.jpg +0 -0
- package/kb/references/thumbs/72453db479.jpg +0 -0
- package/kb/references/thumbs/72cd64d500.jpg +0 -0
- package/kb/references/thumbs/72d1e75283.jpg +0 -0
- package/kb/references/thumbs/72e13f7f5b.jpg +0 -0
- package/kb/references/thumbs/7459f8e644.jpg +0 -0
- package/kb/references/thumbs/7470d55c79.jpg +0 -0
- package/kb/references/thumbs/74c468f02a.jpg +0 -0
- package/kb/references/thumbs/74fed6eb77.jpg +0 -0
- package/kb/references/thumbs/756e05080d.jpg +0 -0
- package/kb/references/thumbs/75df7e5f49.jpg +0 -0
- package/kb/references/thumbs/76226da6ef.jpg +0 -0
- package/kb/references/thumbs/76a34aa056.jpg +0 -0
- package/kb/references/thumbs/76c7076589.jpg +0 -0
- package/kb/references/thumbs/76cccc396c.jpg +0 -0
- package/kb/references/thumbs/774654789f.jpg +0 -0
- package/kb/references/thumbs/7746cc494d.jpg +0 -0
- package/kb/references/thumbs/7766e36aa3.jpg +0 -0
- package/kb/references/thumbs/78049331ef.jpg +0 -0
- package/kb/references/thumbs/78808a0ca5.jpg +0 -0
- package/kb/references/thumbs/7890b0a310.jpg +0 -0
- package/kb/references/thumbs/78911975e6.jpg +0 -0
- package/kb/references/thumbs/78d289d5a0.jpg +0 -0
- package/kb/references/thumbs/794126267e.jpg +0 -0
- package/kb/references/thumbs/7976eb9025.jpg +0 -0
- package/kb/references/thumbs/798519ec7c.jpg +0 -0
- package/kb/references/thumbs/7a6cc5eecc.jpg +0 -0
- package/kb/references/thumbs/7ac8a7cd4a.jpg +0 -0
- package/kb/references/thumbs/7b1341d61d.jpg +0 -0
- package/kb/references/thumbs/7b9c4031e3.jpg +0 -0
- package/kb/references/thumbs/7ba5ad3779.jpg +0 -0
- package/kb/references/thumbs/7be6eb2bd0.jpg +0 -0
- package/kb/references/thumbs/7c30864f5d.jpg +0 -0
- package/kb/references/thumbs/7c379b5e17.jpg +0 -0
- package/kb/references/thumbs/7c4050eb02.jpg +0 -0
- package/kb/references/thumbs/7ca47b3221.jpg +0 -0
- package/kb/references/thumbs/7d43516bd7.jpg +0 -0
- package/kb/references/thumbs/7da9dbb98a.jpg +0 -0
- package/kb/references/thumbs/7ddda8f57c.jpg +0 -0
- package/kb/references/thumbs/7ece6d215c.jpg +0 -0
- package/kb/references/thumbs/7eebf029de.jpg +0 -0
- package/kb/references/thumbs/7f45483c15.jpg +0 -0
- package/kb/references/thumbs/7fde06eaa5.jpg +0 -0
- package/kb/references/thumbs/80407b97e9.jpg +0 -0
- package/kb/references/thumbs/80f0a6cf4b.jpg +0 -0
- package/kb/references/thumbs/8118b451b8.jpg +0 -0
- package/kb/references/thumbs/816baed4a8.jpg +0 -0
- package/kb/references/thumbs/817d2d15d9.jpg +0 -0
- package/kb/references/thumbs/8260cb430d.jpg +0 -0
- package/kb/references/thumbs/827b562899.jpg +0 -0
- package/kb/references/thumbs/8293cf1e92.jpg +0 -0
- package/kb/references/thumbs/8294653169.jpg +0 -0
- package/kb/references/thumbs/83061f871f.jpg +0 -0
- package/kb/references/thumbs/833df778ca.jpg +0 -0
- package/kb/references/thumbs/83d3acaafc.jpg +0 -0
- package/kb/references/thumbs/844c6efeff.jpg +0 -0
- package/kb/references/thumbs/84563d482a.jpg +0 -0
- package/kb/references/thumbs/848082dd94.jpg +0 -0
- package/kb/references/thumbs/8494b1da94.jpg +0 -0
- package/kb/references/thumbs/84b71014be.jpg +0 -0
- package/kb/references/thumbs/84be4a5f3c.jpg +0 -0
- package/kb/references/thumbs/84fd0fd25a.jpg +0 -0
- package/kb/references/thumbs/853e488e22.jpg +0 -0
- package/kb/references/thumbs/858c91585d.jpg +0 -0
- package/kb/references/thumbs/85903e8fe9.jpg +0 -0
- package/kb/references/thumbs/86597d43fd.jpg +0 -0
- package/kb/references/thumbs/866eb99500.jpg +0 -0
- package/kb/references/thumbs/86ac050340.jpg +0 -0
- package/kb/references/thumbs/86afec7b64.jpg +0 -0
- package/kb/references/thumbs/87238127f5.jpg +0 -0
- package/kb/references/thumbs/87321df792.jpg +0 -0
- package/kb/references/thumbs/87460f70cd.jpg +0 -0
- package/kb/references/thumbs/8770dfeaec.jpg +0 -0
- package/kb/references/thumbs/8798451a8c.jpg +0 -0
- package/kb/references/thumbs/87da1f34a3.jpg +0 -0
- package/kb/references/thumbs/882cdf8c05.jpg +0 -0
- package/kb/references/thumbs/8839f4106f.jpg +0 -0
- package/kb/references/thumbs/8844455212.jpg +0 -0
- package/kb/references/thumbs/88abba0497.jpg +0 -0
- package/kb/references/thumbs/88b372435d.jpg +0 -0
- package/kb/references/thumbs/88bd4f35fa.jpg +0 -0
- package/kb/references/thumbs/88c71a075e.jpg +0 -0
- package/kb/references/thumbs/892e5f048e.jpg +0 -0
- package/kb/references/thumbs/893cc8e920.jpg +0 -0
- package/kb/references/thumbs/896c198814.jpg +0 -0
- package/kb/references/thumbs/8a8e22f756.jpg +0 -0
- package/kb/references/thumbs/8a9d8a35cb.jpg +0 -0
- package/kb/references/thumbs/8ab1d67fec.jpg +0 -0
- package/kb/references/thumbs/8ab201fe12.jpg +0 -0
- package/kb/references/thumbs/8ac372c102.jpg +0 -0
- package/kb/references/thumbs/8b15736d62.jpg +0 -0
- package/kb/references/thumbs/8b1d8d6a05.jpg +0 -0
- package/kb/references/thumbs/8bb6050e20.jpg +0 -0
- package/kb/references/thumbs/8c6c9d1577.jpg +0 -0
- package/kb/references/thumbs/8d337851e0.jpg +0 -0
- package/kb/references/thumbs/8d44b33cc5.jpg +0 -0
- package/kb/references/thumbs/8d4536ff3b.jpg +0 -0
- package/kb/references/thumbs/8d9b99454a.jpg +0 -0
- package/kb/references/thumbs/8dda2303ff.jpg +0 -0
- package/kb/references/thumbs/8dec722d62.jpg +0 -0
- package/kb/references/thumbs/8e0ea4ca74.jpg +0 -0
- package/kb/references/thumbs/8ebba84d69.jpg +0 -0
- package/kb/references/thumbs/8ef09140c0.jpg +0 -0
- package/kb/references/thumbs/8f2928a1b0.jpg +0 -0
- package/kb/references/thumbs/8f88f9ddba.jpg +0 -0
- package/kb/references/thumbs/8fa4451009.jpg +0 -0
- package/kb/references/thumbs/90109b0e02.jpg +0 -0
- package/kb/references/thumbs/90e854e5c9.jpg +0 -0
- package/kb/references/thumbs/914e79f893.jpg +0 -0
- package/kb/references/thumbs/9161369197.jpg +0 -0
- package/kb/references/thumbs/9165c87d6f.jpg +0 -0
- package/kb/references/thumbs/9193f6558a.jpg +0 -0
- package/kb/references/thumbs/91ac7df877.jpg +0 -0
- package/kb/references/thumbs/9216bd4931.jpg +0 -0
- package/kb/references/thumbs/922ae8a26a.jpg +0 -0
- package/kb/references/thumbs/92a70e6867.jpg +0 -0
- package/kb/references/thumbs/92c77ece22.jpg +0 -0
- package/kb/references/thumbs/92e5914fbf.jpg +0 -0
- package/kb/references/thumbs/92ee36419a.jpg +0 -0
- package/kb/references/thumbs/94153a60b0.jpg +0 -0
- package/kb/references/thumbs/9449666640.jpg +0 -0
- package/kb/references/thumbs/944be6a646.jpg +0 -0
- package/kb/references/thumbs/945831476e.jpg +0 -0
- package/kb/references/thumbs/94c1af82f4.jpg +0 -0
- package/kb/references/thumbs/9599d6d589.jpg +0 -0
- package/kb/references/thumbs/960710f4cf.jpg +0 -0
- package/kb/references/thumbs/9608f12d64.jpg +0 -0
- package/kb/references/thumbs/962dabfaa0.jpg +0 -0
- package/kb/references/thumbs/965a3a95c6.jpg +0 -0
- package/kb/references/thumbs/9672ed5ae4.jpg +0 -0
- package/kb/references/thumbs/96891ae9c1.jpg +0 -0
- package/kb/references/thumbs/96e1907c99.jpg +0 -0
- package/kb/references/thumbs/96f25b6578.jpg +0 -0
- package/kb/references/thumbs/97211df9ae.jpg +0 -0
- package/kb/references/thumbs/9769d763a5.jpg +0 -0
- package/kb/references/thumbs/9792bd6d05.jpg +0 -0
- package/kb/references/thumbs/97d2837e3e.jpg +0 -0
- package/kb/references/thumbs/97d90d1d85.jpg +0 -0
- package/kb/references/thumbs/97fcd5774a.jpg +0 -0
- package/kb/references/thumbs/980f68564e.jpg +0 -0
- package/kb/references/thumbs/98511fb393.jpg +0 -0
- package/kb/references/thumbs/98f8fa694d.jpg +0 -0
- package/kb/references/thumbs/9a42c6bb97.jpg +0 -0
- package/kb/references/thumbs/9ab3600a06.jpg +0 -0
- package/kb/references/thumbs/9ab48d9130.jpg +0 -0
- package/kb/references/thumbs/9ad519197d.jpg +0 -0
- package/kb/references/thumbs/9b1382c657.jpg +0 -0
- package/kb/references/thumbs/9b6cc1e077.jpg +0 -0
- package/kb/references/thumbs/9beede8480.jpg +0 -0
- package/kb/references/thumbs/9bf8976952.jpg +0 -0
- package/kb/references/thumbs/9cace7b75a.jpg +0 -0
- package/kb/references/thumbs/9cdcc5745e.jpg +0 -0
- package/kb/references/thumbs/9d0b269074.jpg +0 -0
- package/kb/references/thumbs/9d41788b48.jpg +0 -0
- package/kb/references/thumbs/9d475bd6af.jpg +0 -0
- package/kb/references/thumbs/9e6bc543d0.jpg +0 -0
- package/kb/references/thumbs/9ed0e0a206.jpg +0 -0
- package/kb/references/thumbs/9ef538de13.jpg +0 -0
- package/kb/references/thumbs/9efc373ab4.jpg +0 -0
- package/kb/references/thumbs/9f4a939fa5.jpg +0 -0
- package/kb/references/thumbs/9f8d12d7b9.jpg +0 -0
- package/kb/references/thumbs/9fd5e3efa7.jpg +0 -0
- package/kb/references/thumbs/a0a9b9c572.jpg +0 -0
- package/kb/references/thumbs/a29ca9b185.jpg +0 -0
- package/kb/references/thumbs/a2a42884af.jpg +0 -0
- package/kb/references/thumbs/a2f5064e34.jpg +0 -0
- package/kb/references/thumbs/a3112ce672.jpg +0 -0
- package/kb/references/thumbs/a3437736d1.jpg +0 -0
- package/kb/references/thumbs/a372667e76.jpg +0 -0
- package/kb/references/thumbs/a39bae94e9.jpg +0 -0
- package/kb/references/thumbs/a3fc75d94c.jpg +0 -0
- package/kb/references/thumbs/a440487631.jpg +0 -0
- package/kb/references/thumbs/a4993d5fb5.jpg +0 -0
- package/kb/references/thumbs/a500476a86.jpg +0 -0
- package/kb/references/thumbs/a55506bf46.jpg +0 -0
- package/kb/references/thumbs/a59a5f9843.jpg +0 -0
- package/kb/references/thumbs/a5bce0eede.jpg +0 -0
- package/kb/references/thumbs/a5d921e1f0.jpg +0 -0
- package/kb/references/thumbs/a5e19d4637.jpg +0 -0
- package/kb/references/thumbs/a5f92b97d5.jpg +0 -0
- package/kb/references/thumbs/a6562c210a.jpg +0 -0
- package/kb/references/thumbs/a6f61a8d09.jpg +0 -0
- package/kb/references/thumbs/a719fdf663.jpg +0 -0
- package/kb/references/thumbs/a724e5442f.jpg +0 -0
- package/kb/references/thumbs/a852b4319f.jpg +0 -0
- package/kb/references/thumbs/a896c08448.jpg +0 -0
- package/kb/references/thumbs/a8d190a4b8.jpg +0 -0
- package/kb/references/thumbs/a8dcdd57d7.jpg +0 -0
- package/kb/references/thumbs/a951347e18.jpg +0 -0
- package/kb/references/thumbs/a9a1a0bf7d.jpg +0 -0
- package/kb/references/thumbs/a9b72986a8.jpg +0 -0
- package/kb/references/thumbs/aa11555ba8.jpg +0 -0
- package/kb/references/thumbs/aa4aab9093.jpg +0 -0
- package/kb/references/thumbs/aa89b96658.jpg +0 -0
- package/kb/references/thumbs/aaeb3739b6.jpg +0 -0
- package/kb/references/thumbs/ab25a608ec.jpg +0 -0
- package/kb/references/thumbs/ab34b62268.jpg +0 -0
- package/kb/references/thumbs/ab3b0217bb.jpg +0 -0
- package/kb/references/thumbs/ac70c04afb.jpg +0 -0
- package/kb/references/thumbs/ace0879117.jpg +0 -0
- package/kb/references/thumbs/ad0515ae55.jpg +0 -0
- package/kb/references/thumbs/ad66b25b47.jpg +0 -0
- package/kb/references/thumbs/ad68229d2f.jpg +0 -0
- package/kb/references/thumbs/add6480693.jpg +0 -0
- package/kb/references/thumbs/ae5b8c3b8c.jpg +0 -0
- package/kb/references/thumbs/ae81247b47.jpg +0 -0
- package/kb/references/thumbs/af8aa54379.jpg +0 -0
- package/kb/references/thumbs/afa80dedd4.jpg +0 -0
- package/kb/references/thumbs/afe04d730f.jpg +0 -0
- package/kb/references/thumbs/b09a7dc315.jpg +0 -0
- package/kb/references/thumbs/b0c02629f6.jpg +0 -0
- package/kb/references/thumbs/b1cb4f91de.jpg +0 -0
- package/kb/references/thumbs/b1d4c13c92.jpg +0 -0
- package/kb/references/thumbs/b20eef86db.jpg +0 -0
- package/kb/references/thumbs/b3136ccdde.jpg +0 -0
- package/kb/references/thumbs/b3f5e8d7dd.jpg +0 -0
- package/kb/references/thumbs/b44adb81c9.jpg +0 -0
- package/kb/references/thumbs/b457a5894b.jpg +0 -0
- package/kb/references/thumbs/b461281e0f.jpg +0 -0
- package/kb/references/thumbs/b4942644f0.jpg +0 -0
- package/kb/references/thumbs/b49f8eccad.jpg +0 -0
- package/kb/references/thumbs/b56c69be23.jpg +0 -0
- package/kb/references/thumbs/b59786b33c.jpg +0 -0
- package/kb/references/thumbs/b5d368ce5a.jpg +0 -0
- package/kb/references/thumbs/b5eb442406.jpg +0 -0
- package/kb/references/thumbs/b7fdabf4ab.jpg +0 -0
- package/kb/references/thumbs/b88ee8d235.jpg +0 -0
- package/kb/references/thumbs/b8a4e5be8a.jpg +0 -0
- package/kb/references/thumbs/b8c85b661c.jpg +0 -0
- package/kb/references/thumbs/ba1b8e7435.jpg +0 -0
- package/kb/references/thumbs/ba9a593eed.jpg +0 -0
- package/kb/references/thumbs/baa7afc201.jpg +0 -0
- package/kb/references/thumbs/baf74398f7.jpg +0 -0
- package/kb/references/thumbs/bb3e947c10.jpg +0 -0
- package/kb/references/thumbs/bb4c1bb7c1.jpg +0 -0
- package/kb/references/thumbs/bbaa25cc8a.jpg +0 -0
- package/kb/references/thumbs/bc7e7f88cc.jpg +0 -0
- package/kb/references/thumbs/bc9d5b58f5.jpg +0 -0
- package/kb/references/thumbs/bcc99a51f7.jpg +0 -0
- package/kb/references/thumbs/bce13dd1c1.jpg +0 -0
- package/kb/references/thumbs/bd079a6130.jpg +0 -0
- package/kb/references/thumbs/bd2d70dda7.jpg +0 -0
- package/kb/references/thumbs/bd5895c5f2.jpg +0 -0
- package/kb/references/thumbs/bde8e31d62.jpg +0 -0
- package/kb/references/thumbs/be084e78f3.jpg +0 -0
- package/kb/references/thumbs/be94f170c8.jpg +0 -0
- package/kb/references/thumbs/bed33654f7.jpg +0 -0
- package/kb/references/thumbs/beeb9a0c18.jpg +0 -0
- package/kb/references/thumbs/bef42094dc.jpg +0 -0
- package/kb/references/thumbs/bf625496fa.jpg +0 -0
- package/kb/references/thumbs/bf771f1398.jpg +0 -0
- package/kb/references/thumbs/c0ddefa3d9.jpg +0 -0
- package/kb/references/thumbs/c0f01e536e.jpg +0 -0
- package/kb/references/thumbs/c1d592b678.jpg +0 -0
- package/kb/references/thumbs/c1e83e1b3e.jpg +0 -0
- package/kb/references/thumbs/c2168f8096.jpg +0 -0
- package/kb/references/thumbs/c249cd6b17.jpg +0 -0
- package/kb/references/thumbs/c2e3d4feed.jpg +0 -0
- package/kb/references/thumbs/c3cec01df1.jpg +0 -0
- package/kb/references/thumbs/c47bedb42d.jpg +0 -0
- package/kb/references/thumbs/c4b03b4680.jpg +0 -0
- package/kb/references/thumbs/c4e6d18ec3.jpg +0 -0
- package/kb/references/thumbs/c5477e2877.jpg +0 -0
- package/kb/references/thumbs/c566794674.jpg +0 -0
- package/kb/references/thumbs/c5b945afbb.jpg +0 -0
- package/kb/references/thumbs/c5e4659497.jpg +0 -0
- package/kb/references/thumbs/c622786702.jpg +0 -0
- package/kb/references/thumbs/c6250649ca.jpg +0 -0
- package/kb/references/thumbs/c6261a9526.jpg +0 -0
- package/kb/references/thumbs/c62e609076.jpg +0 -0
- package/kb/references/thumbs/c6602d3e85.jpg +0 -0
- package/kb/references/thumbs/c6c1a16e40.jpg +0 -0
- package/kb/references/thumbs/c77f932157.jpg +0 -0
- package/kb/references/thumbs/c79788f01e.jpg +0 -0
- package/kb/references/thumbs/c7a511ad1e.jpg +0 -0
- package/kb/references/thumbs/c7acfbc3c8.jpg +0 -0
- package/kb/references/thumbs/c7bb6d1bb8.jpg +0 -0
- package/kb/references/thumbs/c829eadcb9.jpg +0 -0
- package/kb/references/thumbs/c891fd9d85.jpg +0 -0
- package/kb/references/thumbs/c89f812ee3.jpg +0 -0
- package/kb/references/thumbs/c8a85b9f61.jpg +0 -0
- package/kb/references/thumbs/c8fdf85c9a.jpg +0 -0
- package/kb/references/thumbs/c961ac1031.jpg +0 -0
- package/kb/references/thumbs/c9fd3f88d8.jpg +0 -0
- package/kb/references/thumbs/ca0d6399c3.jpg +0 -0
- package/kb/references/thumbs/ca316c83e4.jpg +0 -0
- package/kb/references/thumbs/ca3b93aa0d.jpg +0 -0
- package/kb/references/thumbs/cb0596a85b.jpg +0 -0
- package/kb/references/thumbs/cb95a5c3ef.jpg +0 -0
- package/kb/references/thumbs/cbe238b656.jpg +0 -0
- package/kb/references/thumbs/cbf530e608.jpg +0 -0
- package/kb/references/thumbs/cc173494ec.jpg +0 -0
- package/kb/references/thumbs/ccb664bddf.jpg +0 -0
- package/kb/references/thumbs/ccf69d36cd.jpg +0 -0
- package/kb/references/thumbs/ccf759db42.jpg +0 -0
- package/kb/references/thumbs/cd2a285807.jpg +0 -0
- package/kb/references/thumbs/cd4a24a8ca.jpg +0 -0
- package/kb/references/thumbs/cdb3fe8938.jpg +0 -0
- package/kb/references/thumbs/cdce1b9bc6.jpg +0 -0
- package/kb/references/thumbs/cde3aa761a.jpg +0 -0
- package/kb/references/thumbs/ce9d5cd9c2.jpg +0 -0
- package/kb/references/thumbs/ceb01f8a34.jpg +0 -0
- package/kb/references/thumbs/cee15c98d0.jpg +0 -0
- package/kb/references/thumbs/cf6944ddae.jpg +0 -0
- package/kb/references/thumbs/d15dd21cd8.jpg +0 -0
- package/kb/references/thumbs/d1633bf2ed.jpg +0 -0
- package/kb/references/thumbs/d16a838000.jpg +0 -0
- package/kb/references/thumbs/d1cf87e9f0.jpg +0 -0
- package/kb/references/thumbs/d32511d913.jpg +0 -0
- package/kb/references/thumbs/d327e9dedd.jpg +0 -0
- package/kb/references/thumbs/d35bf6c85e.jpg +0 -0
- package/kb/references/thumbs/d37afc9d61.jpg +0 -0
- package/kb/references/thumbs/d3b66655c7.jpg +0 -0
- package/kb/references/thumbs/d40b4172b6.jpg +0 -0
- package/kb/references/thumbs/d4c40d1824.jpg +0 -0
- package/kb/references/thumbs/d4cb55a4b6.jpg +0 -0
- package/kb/references/thumbs/d4f0c30f7e.jpg +0 -0
- package/kb/references/thumbs/d51cce3ae5.jpg +0 -0
- package/kb/references/thumbs/d52948f9ba.jpg +0 -0
- package/kb/references/thumbs/d62bd3cba4.jpg +0 -0
- package/kb/references/thumbs/d668a21c92.jpg +0 -0
- package/kb/references/thumbs/d685072c52.jpg +0 -0
- package/kb/references/thumbs/d6d7b96093.jpg +0 -0
- package/kb/references/thumbs/d7cd874b21.jpg +0 -0
- package/kb/references/thumbs/d7e111736a.jpg +0 -0
- package/kb/references/thumbs/d88325f832.jpg +0 -0
- package/kb/references/thumbs/d9272ded76.jpg +0 -0
- package/kb/references/thumbs/d962e7c654.jpg +0 -0
- package/kb/references/thumbs/d97f000ee2.jpg +0 -0
- package/kb/references/thumbs/d9c1ae2543.jpg +0 -0
- package/kb/references/thumbs/d9ccb3cac8.jpg +0 -0
- package/kb/references/thumbs/da99019680.jpg +0 -0
- package/kb/references/thumbs/da9b8bc615.jpg +0 -0
- package/kb/references/thumbs/daafbee2c1.jpg +0 -0
- package/kb/references/thumbs/db0f11f143.jpg +0 -0
- package/kb/references/thumbs/db5dd367f5.jpg +0 -0
- package/kb/references/thumbs/db69677866.jpg +0 -0
- package/kb/references/thumbs/db87c1956e.jpg +0 -0
- package/kb/references/thumbs/dbb86d8bda.jpg +0 -0
- package/kb/references/thumbs/dbd3a8ff2a.jpg +0 -0
- package/kb/references/thumbs/dbdf4b2794.jpg +0 -0
- package/kb/references/thumbs/dd4c19b4b1.jpg +0 -0
- package/kb/references/thumbs/dd98d9f6fa.jpg +0 -0
- package/kb/references/thumbs/ddb00e3b6a.jpg +0 -0
- package/kb/references/thumbs/dde3541a5c.jpg +0 -0
- package/kb/references/thumbs/de2a4da502.jpg +0 -0
- package/kb/references/thumbs/de4c387a66.jpg +0 -0
- package/kb/references/thumbs/de5618fa82.jpg +0 -0
- package/kb/references/thumbs/de6bec2538.jpg +0 -0
- package/kb/references/thumbs/dea13cbb1f.jpg +0 -0
- package/kb/references/thumbs/deff9202aa.jpg +0 -0
- package/kb/references/thumbs/df12835f8d.jpg +0 -0
- package/kb/references/thumbs/df57acbb3d.jpg +0 -0
- package/kb/references/thumbs/df8265009e.jpg +0 -0
- package/kb/references/thumbs/dfc99a1e8e.jpg +0 -0
- package/kb/references/thumbs/dfc9fde460.jpg +0 -0
- package/kb/references/thumbs/e038348eee.jpg +0 -0
- package/kb/references/thumbs/e04c2ae1d5.jpg +0 -0
- package/kb/references/thumbs/e070345c43.jpg +0 -0
- package/kb/references/thumbs/e0a0c84d47.jpg +0 -0
- package/kb/references/thumbs/e0af1e6b9e.jpg +0 -0
- package/kb/references/thumbs/e1025942c4.jpg +0 -0
- package/kb/references/thumbs/e11b6f5b82.jpg +0 -0
- package/kb/references/thumbs/e1553de3fc.jpg +0 -0
- package/kb/references/thumbs/e162ebe7cd.jpg +0 -0
- package/kb/references/thumbs/e1f1e531d8.jpg +0 -0
- package/kb/references/thumbs/e20842e5c9.jpg +0 -0
- package/kb/references/thumbs/e24e7d949b.jpg +0 -0
- package/kb/references/thumbs/e2a3e5d10a.jpg +0 -0
- package/kb/references/thumbs/e2de02615a.jpg +0 -0
- package/kb/references/thumbs/e305dad7dd.jpg +0 -0
- package/kb/references/thumbs/e52e3ef97f.jpg +0 -0
- package/kb/references/thumbs/e570e92d06.jpg +0 -0
- package/kb/references/thumbs/e583932fb9.jpg +0 -0
- package/kb/references/thumbs/e5da3c038f.jpg +0 -0
- package/kb/references/thumbs/e657634af3.jpg +0 -0
- package/kb/references/thumbs/e67946e3e1.jpg +0 -0
- package/kb/references/thumbs/e69e0f3639.jpg +0 -0
- package/kb/references/thumbs/e6ebe66031.jpg +0 -0
- package/kb/references/thumbs/e7db9563c9.jpg +0 -0
- package/kb/references/thumbs/e84a4c3b7b.jpg +0 -0
- package/kb/references/thumbs/e84cf52c27.jpg +0 -0
- package/kb/references/thumbs/e8707cf6e8.jpg +0 -0
- package/kb/references/thumbs/e888890b40.jpg +0 -0
- package/kb/references/thumbs/e8a502b418.jpg +0 -0
- package/kb/references/thumbs/e8ba68371d.jpg +0 -0
- package/kb/references/thumbs/e9098f54cc.jpg +0 -0
- package/kb/references/thumbs/e9144deae9.jpg +0 -0
- package/kb/references/thumbs/e93e98d757.jpg +0 -0
- package/kb/references/thumbs/e9762dd435.jpg +0 -0
- package/kb/references/thumbs/e9db4544c8.jpg +0 -0
- package/kb/references/thumbs/e9ddffeacd.jpg +0 -0
- package/kb/references/thumbs/e9e2cf1d7e.jpg +0 -0
- package/kb/references/thumbs/ea1e23e623.jpg +0 -0
- package/kb/references/thumbs/ea41200f5e.jpg +0 -0
- package/kb/references/thumbs/eaf4916e1a.jpg +0 -0
- package/kb/references/thumbs/eb2c505fc8.jpg +0 -0
- package/kb/references/thumbs/eb47943693.jpg +0 -0
- package/kb/references/thumbs/eb4ffd6625.jpg +0 -0
- package/kb/references/thumbs/eb82ac0a4d.jpg +0 -0
- package/kb/references/thumbs/ebeb345ade.jpg +0 -0
- package/kb/references/thumbs/ec4e2aba0a.jpg +0 -0
- package/kb/references/thumbs/ed683bc9f7.jpg +0 -0
- package/kb/references/thumbs/ed9e236a84.jpg +0 -0
- package/kb/references/thumbs/ee45e1caea.jpg +0 -0
- package/kb/references/thumbs/ee50bbf2e7.jpg +0 -0
- package/kb/references/thumbs/eed6ad3b7b.jpg +0 -0
- package/kb/references/thumbs/eee247fd70.jpg +0 -0
- package/kb/references/thumbs/ef87b6cb99.jpg +0 -0
- package/kb/references/thumbs/ef87dccf04.jpg +0 -0
- package/kb/references/thumbs/ef941bba1e.jpg +0 -0
- package/kb/references/thumbs/effc14fb2c.jpg +0 -0
- package/kb/references/thumbs/f04aa5a191.jpg +0 -0
- package/kb/references/thumbs/f13f12485f.jpg +0 -0
- package/kb/references/thumbs/f16a5c0fd4.jpg +0 -0
- package/kb/references/thumbs/f1ba7a7a8f.jpg +0 -0
- package/kb/references/thumbs/f1bc4c9c19.jpg +0 -0
- package/kb/references/thumbs/f1ee827878.jpg +0 -0
- package/kb/references/thumbs/f21736aeff.jpg +0 -0
- package/kb/references/thumbs/f22bc41213.jpg +0 -0
- package/kb/references/thumbs/f266aaffcc.jpg +0 -0
- package/kb/references/thumbs/f2c0ed0d65.jpg +0 -0
- package/kb/references/thumbs/f32ac710fd.jpg +0 -0
- package/kb/references/thumbs/f32b697ff6.jpg +0 -0
- package/kb/references/thumbs/f39c883904.jpg +0 -0
- package/kb/references/thumbs/f3b9d55e6e.jpg +0 -0
- package/kb/references/thumbs/f3c1763e14.jpg +0 -0
- package/kb/references/thumbs/f40853fd43.jpg +0 -0
- package/kb/references/thumbs/f4fd07dc4d.jpg +0 -0
- package/kb/references/thumbs/f50b756ee5.jpg +0 -0
- package/kb/references/thumbs/f51272e9b3.jpg +0 -0
- package/kb/references/thumbs/f538895eee.jpg +0 -0
- package/kb/references/thumbs/f5d28081b5.jpg +0 -0
- package/kb/references/thumbs/f6046c9501.jpg +0 -0
- package/kb/references/thumbs/f62e4af316.jpg +0 -0
- package/kb/references/thumbs/f6f6bffeb8.jpg +0 -0
- package/kb/references/thumbs/f736e00af6.jpg +0 -0
- package/kb/references/thumbs/f7932da47d.jpg +0 -0
- package/kb/references/thumbs/f879e118ca.jpg +0 -0
- package/kb/references/thumbs/f88257215d.jpg +0 -0
- package/kb/references/thumbs/f88c45a6d7.jpg +0 -0
- package/kb/references/thumbs/f89a7b646e.jpg +0 -0
- package/kb/references/thumbs/f8a1e7a274.jpg +0 -0
- package/kb/references/thumbs/f9183cf2b6.jpg +0 -0
- package/kb/references/thumbs/f995de5ce9.jpg +0 -0
- package/kb/references/thumbs/f9ada2c3e1.jpg +0 -0
- package/kb/references/thumbs/f9d4616f89.jpg +0 -0
- package/kb/references/thumbs/f9f4307bb0.jpg +0 -0
- package/kb/references/thumbs/fa070122c7.jpg +0 -0
- package/kb/references/thumbs/fa29cc1369.jpg +0 -0
- package/kb/references/thumbs/fa791a4dab.jpg +0 -0
- package/kb/references/thumbs/fa8060509e.jpg +0 -0
- package/kb/references/thumbs/fafeed4003.jpg +0 -0
- package/kb/references/thumbs/fb1c024f38.jpg +0 -0
- package/kb/references/thumbs/fb77aa28b3.jpg +0 -0
- package/kb/references/thumbs/fb9f7f1966.jpg +0 -0
- package/kb/references/thumbs/fba8a8c2da.jpg +0 -0
- package/kb/references/thumbs/fce2754c36.jpg +0 -0
- package/kb/references/thumbs/fce2fb83df.jpg +0 -0
- package/kb/references/thumbs/fd4c51bb47.jpg +0 -0
- package/kb/references/thumbs/fd8c269817.jpg +0 -0
- package/kb/references/thumbs/fdb7b250ca.jpg +0 -0
- package/kb/references/thumbs/fe18088de8.jpg +0 -0
- package/kb/references/thumbs/fe4f742ba7.jpg +0 -0
- package/kb/references/thumbs/fe64742ce7.jpg +0 -0
- package/kb/references/thumbs/feb5d62161.jpg +0 -0
- package/kb/references/thumbs/fed21b3e98.jpg +0 -0
- package/kb/references/thumbs/fed2205951.jpg +0 -0
- package/kb/references/thumbs/ffdacf1715.jpg +0 -0
- package/kb/sections/_buttons.md +93 -0
- package/kb/sections/_finish.md +325 -0
- package/kb/sections/about-founder-note.md +85 -0
- package/kb/sections/about-team-roster.md +86 -0
- package/kb/sections/alternating-rows-live-tiles.md +110 -0
- package/kb/sections/annotated-product-shot.md +105 -0
- package/kb/sections/asymmetric-bento-dominant.md +114 -0
- package/kb/sections/before-after-features.md +104 -0
- package/kb/sections/before-after-repair.md +107 -0
- package/kb/sections/bento-lead-tile.md +112 -0
- package/kb/sections/book-a-slot-honest.md +116 -0
- package/kb/sections/capability-prompt-ledger.md +68 -0
- package/kb/sections/case-study-band.md +113 -0
- package/kb/sections/centred-stack-hero.md +107 -0
- package/kb/sections/closing-demo-final-state.md +81 -0
- package/kb/sections/closing-full-bleed-line-and-form.md +86 -0
- package/kb/sections/closing-result-previewed.md +88 -0
- package/kb/sections/closing-three-real-steps.md +87 -0
- package/kb/sections/command-reference-table.md +70 -0
- package/kb/sections/comparison-old-way-bars.md +88 -0
- package/kb/sections/comparison-same-task-two-ways.md +88 -0
- package/kb/sections/day-of-the-place.md +102 -0
- package/kb/sections/docs-reading-rail.md +88 -0
- package/kb/sections/editorial-columns-hero.md +107 -0
- package/kb/sections/editorial-essay-pull-quote.md +112 -0
- package/kb/sections/events-calendar-list.md +107 -0
- package/kb/sections/explorable-control-demo.md +102 -0
- package/kb/sections/faq-open-answers-editorial.md +85 -0
- package/kb/sections/faq-ruled-accordion-aside.md +87 -0
- package/kb/sections/footer-closing-scene.md +84 -0
- package/kb/sections/footer-editorial-sitemap.md +85 -0
- package/kb/sections/footer-minimal-credits.md +80 -0
- package/kb/sections/full-bleed-image-band.md +103 -0
- package/kb/sections/full-bleed-image-hero.md +105 -0
- package/kb/sections/gallery-first-hero.md +109 -0
- package/kb/sections/horizontal-scroll-strip.md +101 -0
- package/kb/sections/how-i-work-own-voice.md +111 -0
- package/kb/sections/how-it-works-in-place.md +109 -0
- package/kb/sections/impact-numbers-sourced.md +109 -0
- package/kb/sections/install-steps-per-agent.md +77 -0
- package/kb/sections/masonry-real-work.md +109 -0
- package/kb/sections/numbered-editorial-columns.md +105 -0
- package/kb/sections/object-first-hero.md +106 -0
- package/kb/sections/object-timeline.md +105 -0
- package/kb/sections/one-huge-number.md +100 -0
- package/kb/sections/one-person-story.md +103 -0
- package/kb/sections/order-ahead-ticket.md +119 -0
- package/kb/sections/press-strip-quoted.md +106 -0
- package/kb/sections/pricing-comparison-table-sticky.md +94 -0
- package/kb/sections/pricing-free-pro-upgrade-moment.md +85 -0
- package/kb/sections/pricing-plan-beside-product.md +88 -0
- package/kb/sections/pricing-plans-ledger.md +94 -0
- package/kb/sections/pricing-usage-calculator.md +93 -0
- package/kb/sections/printed-menu-card.md +110 -0
- package/kb/sections/process-happening.md +102 -0
- package/kb/sections/project-index-ruled.md +106 -0
- package/kb/sections/proof-logo-cloud-with-reasons.md +82 -0
- package/kb/sections/proof-measured-numbers.md +88 -0
- package/kb/sections/proof-output-wall.md +84 -0
- package/kb/sections/proof-single-honest-quote.md +81 -0
- package/kb/sections/resources-searchable-list.md +110 -0
- package/kb/sections/rooms-and-rates.md +107 -0
- package/kb/sections/ruled-facts-table.md +108 -0
- package/kb/sections/ruled-list-pinned-visual.md +107 -0
- package/kb/sections/scroll-scrubbed-product-demo.md +103 -0
- package/kb/sections/self-playing-run-demo.md +104 -0
- package/kb/sections/services-price-ledger.md +106 -0
- package/kb/sections/signup-form-with-next-steps.md +86 -0
- package/kb/sections/signup-waitlist-place-in-line.md +90 -0
- package/kb/sections/spec-sheet-features.md +108 -0
- package/kb/sections/split-hero-live-object.md +108 -0
- package/kb/sections/sticky-feature-narrative.md +104 -0
- package/kb/sections/todays-board-hero.md +112 -0
- package/kb/sections/touchable-tool-hero.md +111 -0
- package/kb/sections/typographic-statement-hero.md +99 -0
- package/kb/sections/visit-hours-map.md +110 -0
- package/kb/sections/ways-to-help-honest.md +115 -0
- package/kb/sources/design-reference.md +991 -0
- package/kb/sources/product-and-docs.md +37 -0
- package/kb/systems/1win/DESIGN.md +463 -0
- package/kb/systems/LICENSE-awesome-design-md +21 -0
- package/kb/systems/README.md +7 -0
- package/kb/systems/airbnb/DESIGN.md +545 -0
- package/kb/systems/airtable/DESIGN.md +554 -0
- package/kb/systems/aljazeera/DESIGN.md +594 -0
- package/kb/systems/apple/DESIGN.md +562 -0
- package/kb/systems/binance/DESIGN.md +634 -0
- package/kb/systems/bmw/DESIGN.md +544 -0
- package/kb/systems/bmw-m/DESIGN.md +503 -0
- package/kb/systems/bugatti/DESIGN.md +454 -0
- package/kb/systems/cal/DESIGN.md +542 -0
- package/kb/systems/categories.json +87 -0
- package/kb/systems/claude/DESIGN.md +589 -0
- package/kb/systems/clay/DESIGN.md +541 -0
- package/kb/systems/clickhouse/DESIGN.md +544 -0
- package/kb/systems/cohere/DESIGN.md +451 -0
- package/kb/systems/coinbase/DESIGN.md +570 -0
- package/kb/systems/composio/DESIGN.md +506 -0
- package/kb/systems/cursor/DESIGN.md +537 -0
- package/kb/systems/dell-1996/DESIGN.md +632 -0
- package/kb/systems/dji/DESIGN.md +882 -0
- package/kb/systems/elevenlabs/DESIGN.md +504 -0
- package/kb/systems/expo/DESIGN.md +526 -0
- package/kb/systems/ferrari/DESIGN.md +531 -0
- package/kb/systems/figma/DESIGN.md +578 -0
- package/kb/systems/framer/DESIGN.md +544 -0
- package/kb/systems/hashicorp/DESIGN.md +575 -0
- package/kb/systems/hp/DESIGN.md +670 -0
- package/kb/systems/ibm/DESIGN.md +550 -0
- package/kb/systems/intercom/DESIGN.md +546 -0
- package/kb/systems/jobright/DESIGN.md +525 -0
- package/kb/systems/kraken/DESIGN.md +125 -0
- package/kb/systems/lamborghini/DESIGN.md +288 -0
- package/kb/systems/linear.app/DESIGN.md +548 -0
- package/kb/systems/lovable/DESIGN.md +298 -0
- package/kb/systems/mastercard/DESIGN.md +365 -0
- package/kb/systems/mercury/DESIGN.md +568 -0
- package/kb/systems/meta/DESIGN.md +683 -0
- package/kb/systems/minimax/DESIGN.md +746 -0
- package/kb/systems/mintlify/DESIGN.md +852 -0
- package/kb/systems/miro/DESIGN.md +825 -0
- package/kb/systems/mistral.ai/DESIGN.md +773 -0
- package/kb/systems/mongodb/DESIGN.md +767 -0
- package/kb/systems/mydealz/DESIGN.md +551 -0
- package/kb/systems/nerdwallet/DESIGN.md +722 -0
- package/kb/systems/nike/DESIGN.md +575 -0
- package/kb/systems/nintendo-2001/DESIGN.md +649 -0
- package/kb/systems/notion/DESIGN.md +821 -0
- package/kb/systems/nvidia/DESIGN.md +640 -0
- package/kb/systems/ollama/DESIGN.md +539 -0
- package/kb/systems/opencode.ai/DESIGN.md +521 -0
- package/kb/systems/oracle/DESIGN.md +778 -0
- package/kb/systems/oura/DESIGN.md +616 -0
- package/kb/systems/pinterest/DESIGN.md +597 -0
- package/kb/systems/playstation/DESIGN.md +661 -0
- package/kb/systems/posthog/DESIGN.md +690 -0
- package/kb/systems/raycast/DESIGN.md +669 -0
- package/kb/systems/renault/DESIGN.md +589 -0
- package/kb/systems/replicate/DESIGN.md +616 -0
- package/kb/systems/resend/DESIGN.md +585 -0
- package/kb/systems/revolut/DESIGN.md +636 -0
- package/kb/systems/runwayml/DESIGN.md +244 -0
- package/kb/systems/sanity/DESIGN.md +357 -0
- package/kb/systems/sap/DESIGN.md +639 -0
- package/kb/systems/sentry/DESIGN.md +551 -0
- package/kb/systems/shopify/DESIGN.md +516 -0
- package/kb/systems/slack/DESIGN.md +482 -0
- package/kb/systems/spacex/DESIGN.md +363 -0
- package/kb/systems/spotify/DESIGN.md +246 -0
- package/kb/systems/starbucks/DESIGN.md +580 -0
- package/kb/systems/stripe/DESIGN.md +487 -0
- package/kb/systems/supabase/DESIGN.md +462 -0
- package/kb/systems/superhuman/DESIGN.md +448 -0
- package/kb/systems/tesla/DESIGN.md +286 -0
- package/kb/systems/theverge/DESIGN.md +339 -0
- package/kb/systems/together.ai/DESIGN.md +633 -0
- package/kb/systems/uber/DESIGN.md +636 -0
- package/kb/systems/vercel/DESIGN.md +736 -0
- package/kb/systems/vodafone/DESIGN.md +538 -0
- package/kb/systems/voltagent/DESIGN.md +521 -0
- package/kb/systems/warp/DESIGN.md +526 -0
- package/kb/systems/webflow/DESIGN.md +588 -0
- package/kb/systems/wired/DESIGN.md +497 -0
- package/kb/systems/wise/DESIGN.md +544 -0
- package/kb/systems/x.ai/DESIGN.md +465 -0
- package/kb/systems/zapier/DESIGN.md +537 -0
- package/kb/taste/garvit-by-job.md +46 -0
- package/kb/taste/garvit-portfolio.md +94 -0
- package/kb/universal/color-roles.md +26 -0
- package/kb/universal/copy.md +16 -0
- package/kb/universal/details.md +31 -0
- package/kb/universal/first-screen.md +30 -0
- package/kb/universal/fit-the-codebase.md +29 -0
- package/kb/universal/layout-width.md +28 -0
- package/kb/universal/motion-feedback.md +23 -0
- package/kb/universal/signature.md +29 -0
- package/kb/universal/states.md +17 -0
- package/kb/universal/type-app.md +33 -0
- package/kb/universal/type-marketing.md +28 -0
- package/package.json +36 -4
- package/scripts/pack-assets.mjs +48 -0
- package/skill/palate/SKILL.md +261 -0
- package/src/auth-recheck.mjs +4 -0
- package/src/auth.mjs +416 -0
- package/src/capture.mjs +182 -0
- package/src/catalog/classify.mjs +96 -0
- package/src/catalog/curated.mjs +128 -0
- package/src/catalog/index-build.mjs +67 -0
- package/src/catalog/literal.mjs +146 -0
- package/src/catalog/store.mjs +40 -0
- package/src/catalog/vibrant.mjs +126 -0
- package/src/check.mjs +93 -0
- package/src/concept.mjs +157 -0
- package/src/context.mjs +226 -0
- package/src/copy.mjs +188 -0
- package/src/devserver.mjs +135 -0
- package/src/fontgenre.mjs +44 -0
- package/src/guard-agents.mjs +213 -0
- package/src/guard.mjs +377 -0
- package/src/kb.mjs +91 -0
- package/src/look.mjs +312 -0
- package/src/loop/ambition.mjs +620 -0
- package/src/loop/animate.mjs +70 -0
- package/src/loop/artdirection.mjs +264 -0
- package/src/loop/bench.mjs +184 -0
- package/src/loop/benchpick.mjs +155 -0
- package/src/loop/blueprint.mjs +620 -0
- package/src/loop/board.html +180 -0
- package/src/loop/build.mjs +393 -0
- package/src/loop/buttons.mjs +413 -0
- package/src/loop/common.mjs +206 -0
- package/src/loop/cost.mjs +63 -0
- package/src/loop/craft.mjs +152 -0
- package/src/loop/craftchecks.mjs +148 -0
- package/src/loop/critique.mjs +393 -0
- package/src/loop/details.mjs +225 -0
- package/src/loop/direction.html +168 -0
- package/src/loop/direction.mjs +256 -0
- package/src/loop/directions.json +8 -0
- package/src/loop/explore.mjs +219 -0
- package/src/loop/fail.mjs +110 -0
- package/src/loop/fix.mjs +194 -0
- package/src/loop/floor.mjs +677 -0
- package/src/loop/forget.mjs +52 -0
- package/src/loop/gate.mjs +1053 -0
- package/src/loop/grid.html +123 -0
- package/src/loop/growth.mjs +118 -0
- package/src/loop/icons.mjs +109 -0
- package/src/loop/imagery.mjs +1280 -0
- package/src/loop/judge-api.mjs +245 -0
- package/src/loop/judge.mjs +167 -0
- package/src/loop/layouts.mjs +492 -0
- package/src/loop/library.mjs +82 -0
- package/src/loop/lookplan.mjs +182 -0
- package/src/loop/lookvec.mjs +645 -0
- package/src/loop/match.mjs +923 -0
- package/src/loop/matched.mjs +26 -0
- package/src/loop/myrefs.mjs +151 -0
- package/src/loop/pick.mjs +213 -0
- package/src/loop/picker.html +118 -0
- package/src/loop/plan.mjs +289 -0
- package/src/loop/polish.mjs +39 -0
- package/src/loop/research-learn.mjs +41 -0
- package/src/loop/research.mjs +1130 -0
- package/src/loop/rulereview.mjs +146 -0
- package/src/loop/rules-board.html +199 -0
- package/src/loop/rules.mjs +939 -0
- package/src/loop/similar.mjs +276 -0
- package/src/loop/states-source.mjs +258 -0
- package/src/loop/states.mjs +1547 -0
- package/src/loop/stats.mjs +78 -0
- package/src/loop/taste.mjs +81 -0
- package/src/loop/timeline.mjs +149 -0
- package/src/loop/variants.mjs +228 -0
- package/src/loop/vary.mjs +249 -0
- package/src/mcp/server.mjs +1246 -0
- package/src/motion.mjs +207 -0
- package/src/moves.mjs +242 -0
- package/src/novelty.mjs +116 -0
- package/src/page-ambition.js +181 -0
- package/src/page-craft.js +724 -0
- package/src/page-details.js +415 -0
- package/src/page-devices.js +365 -0
- package/src/page-fingerprint.js +281 -0
- package/src/page-gate.js +1307 -0
- package/src/page-look.js +698 -0
- package/src/page-metrics.js +78 -0
- package/src/page-principles.js +1167 -0
- package/src/page-rules.js +308 -0
- package/src/page-sections.js +211 -0
- package/src/page-states.js +703 -0
- package/src/paths.mjs +13 -0
- package/src/png.mjs +107 -0
- package/src/point/auto.mjs +224 -0
- package/src/point/locate.mjs +114 -0
- package/src/point/overlay.js +1516 -0
- package/src/point/server.mjs +1122 -0
- package/src/point/trail.mjs +219 -0
- package/src/pool.mjs +80 -0
- package/src/principles.mjs +279 -0
- package/src/refs.mjs +299 -0
- package/src/robots.mjs +145 -0
- package/src/sections.mjs +210 -0
- package/src/shoot.mjs +235 -0
- package/src/systems/apply.mjs +355 -0
- package/src/systems/load.mjs +251 -0
- package/src/systems/pick.mjs +213 -0
- package/templates/vite-react-tw/index.html +12 -0
- package/templates/vite-react-tw/package.json +25 -0
- package/templates/vite-react-tw/src/App.tsx +3 -0
- package/templates/vite-react-tw/src/index.css +1 -0
- package/templates/vite-react-tw/src/main.tsx +10 -0
- package/templates/vite-react-tw/tsconfig.app.json +26 -0
- package/templates/vite-react-tw/tsconfig.json +7 -0
- package/templates/vite-react-tw/tsconfig.node.json +23 -0
- package/templates/vite-react-tw/vite.config.ts +8 -0
package/bin/palate.mjs
ADDED
|
@@ -0,0 +1,894 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { parseArgs } from "node:util";
|
|
5
|
+
import { check } from "../src/check.mjs";
|
|
6
|
+
import { context } from "../src/context.mjs";
|
|
7
|
+
import { card, list, search, show } from "../src/kb.mjs";
|
|
8
|
+
import { shoot } from "../src/shoot.mjs";
|
|
9
|
+
import { closePool, keepAlive } from "../src/pool.mjs";
|
|
10
|
+
|
|
11
|
+
keepAlive();
|
|
12
|
+
|
|
13
|
+
const HELP = `palate: design intelligence for coding agents
|
|
14
|
+
|
|
15
|
+
palate activate <code> Activate palate with your invite code (palate-XXXX-XXXX-XXXX), once per machine
|
|
16
|
+
palate activate --status Whether palate is activated here · palate deactivate: remove it
|
|
17
|
+
palate version The installed version
|
|
18
|
+
|
|
19
|
+
palate context What this project already uses: stack, tokens, fonts, components, screens
|
|
20
|
+
palate search <words> [--scope s] Find patterns and rules for a screen (returns short cards)
|
|
21
|
+
palate show <id> [id...] Read full knowledge entries
|
|
22
|
+
palate list Every entry in the knowledge base
|
|
23
|
+
palate shoot <route> [--widths 1440,390] [--tablet] [--url http://localhost:3000] [--fold] [--like <project>]
|
|
24
|
+
Render a route, save screenshots, report measurable problems
|
|
25
|
+
(--fold: first screen only, no principles pass; for checks while building).
|
|
26
|
+
Fails (exit 1) when the page is over 50% like another of your projects or
|
|
27
|
+
too close to a captured reference; --like <project> when the user asked to match it
|
|
28
|
+
palate check Scan your changed lines for generated-UI tells and token drift; says
|
|
29
|
+
"Not done" while a page fails a rule or the similarity gate
|
|
30
|
+
palate copy [files…] [--all] The words a page shows, read from source: hype, filler, placeholder copy and
|
|
31
|
+
proof with no source, each with what to write instead (changed files; --all: every file)
|
|
32
|
+
palate guard [--install|--uninstall] [--agent claude,codex,cursor,gemini,copilot,git] [--global]
|
|
33
|
+
The stop hook: the agent can't call UI work done until palate looked at every
|
|
34
|
+
changed screen and its copy, code tells, credits and gates pass (3 rounds, then
|
|
35
|
+
it reports). Installs for every agent the project uses (Claude Code, Codex,
|
|
36
|
+
Cursor, Gemini CLI; Copilot reads the Claude hook); --agent git: a pre-commit
|
|
37
|
+
check for any agent
|
|
38
|
+
palate icons <brand…> [--mono] Real brand marks (Simple Icons, CC0 set) as local SVGs in the brand's colour, for
|
|
39
|
+
"works with" rows and integration grids; a brand not in the set is reported
|
|
40
|
+
palate waive <id> [--file f] --reason "…" A finding that is wrong here, with a reason a reviewer would accept
|
|
41
|
+
palate waive · palate waive --remove <id> The project's waivers (every guard report lists them)
|
|
42
|
+
|
|
43
|
+
palate refs [words] --shelf <shelf> [--industry ..] [--audience ..] [--tone ..] [--needs ..] [--theme light|dark]
|
|
44
|
+
Pick 3 distinct real-world references for this screen and fetch their images
|
|
45
|
+
palate refs note <id> "text" Record what worked from a reference (improves future picks)
|
|
46
|
+
palate capture <url> Screenshot any public page and measure its fonts, type scale, colours, radii
|
|
47
|
+
palate shoot <route> --compare <reference id or image path>
|
|
48
|
+
Also save your first screen side by side with the reference
|
|
49
|
+
palate system pick "<request>" Choose the design system whose craft fits this request and codebase
|
|
50
|
+
palate system apply <id> [--type-from <id>]
|
|
51
|
+
Transfer that craft into the project's tokens (keeps your brand colour);
|
|
52
|
+
--type-from blends in another system's display type
|
|
53
|
+
palate concept "<request>" The creative step: a signature move and supporting moves for this screen,
|
|
54
|
+
steering away from what this project and machine used recently
|
|
55
|
+
palate concept record "<screen>" --moves a,b,c
|
|
56
|
+
Remember the moves a finished screen used, so the next one differs
|
|
57
|
+
palate moves [--tags calm,crafted] [--kind hero] [--signature] [--limit 8]
|
|
58
|
+
The moves library (kb/moves): named creative techniques with recipes,
|
|
59
|
+
ranked by how well they fit the brand's tags
|
|
60
|
+
palate moves show <id> [id...] A move in full · palate moves brief <id,id>: their recipes for a brief
|
|
61
|
+
palate system list | show <id> Browse the design systems
|
|
62
|
+
|
|
63
|
+
The default (triage → one build → the finishing pass → the user points at what's wrong):
|
|
64
|
+
palate plan "<request>" [--route /x] [--mode direct|build|direction|research|quick|full|match]
|
|
65
|
+
Run first: what this deserves, and why (direct: change in place; build:
|
|
66
|
+
one build, the default; direction: 3 ideas first; quick/full: variants;
|
|
67
|
+
match: build the user's own design faithfully)
|
|
68
|
+
palate build "<job>" --route /x [--direction <name>] [--refs a.png,https://…] [--like <project>]
|
|
69
|
+
Build mode: one brief for the real route with the user's rules, references
|
|
70
|
+
and notes, taste and chosen direction; logs its estimated token cost
|
|
71
|
+
palate blueprint "<job>" --route /x The design decided before code (a new page's first build step): a planner
|
|
72
|
+
brief for the spec (mood, category truths and clichés), the system, imagery
|
|
73
|
+
per section and one archetype per section from kb/sections
|
|
74
|
+
palate blueprint --file <bp.json> Check it (variety, surfaces, material, contrast) and save it with tokens;
|
|
75
|
+
palate build then builds it section by section
|
|
76
|
+
palate match <image|url|figma link> [--route /x] [--width 1440]
|
|
77
|
+
Build from the user's own design: the screenshot, page or Figma frame is the
|
|
78
|
+
spec (Figma needs FIGMA_TOKEN, else export the frame as PNG). Saves it, measures
|
|
79
|
+
it and writes a fidelity brief; palate's taste, blueprint and house look step aside
|
|
80
|
+
palate match --check [--route /x] The build beside the design at its width, a difference image and one judge
|
|
81
|
+
packet (content, geometry, type, assets, spacing, colour, details, motion)
|
|
82
|
+
palate match --answers <dir> [--route /x]
|
|
83
|
+
The verdict: READY, READY WITH SUBSTITUTIONS, NOT READY (with the fixes, two
|
|
84
|
+
repair rounds) or UNVERIFIED; --restore <n> rolls a worse round back
|
|
85
|
+
palate gate <route> The quality floor, judged independently: palate's floor checks, then judge
|
|
86
|
+
packets (a checklist per section, the page beside strong real sites in both
|
|
87
|
+
orders) for fresh subagents
|
|
88
|
+
palate gate <route> --answers <dir> The verdict; below the bar: one repair brief for one section (2 rounds max)
|
|
89
|
+
palate gate <route> --judge api No subagents (Codex, Cursor): palate runs the packets with a model API itself
|
|
90
|
+
(GEMINI_API_KEY / OPENAI_API_KEY / ANTHROPIC_API_KEY; PALATE_JUDGE picks);
|
|
91
|
+
--judge self: the builder answers, and the verdict says it is self-judged
|
|
92
|
+
palate gate <route> --restore <n> Roll the source back to round n's snapshot (a repair made it worse)
|
|
93
|
+
palate gate <route> --duel hero [--answers <dir>]
|
|
94
|
+
Best of two: the page with ?palate-alt=hero shows the blueprint's alternative;
|
|
95
|
+
blind judges in both orders pick, the user only when they split
|
|
96
|
+
palate finish <route> The finishing pass in one process: shoot, states, details and animate
|
|
97
|
+
--check sharing one browser and dev server, one combined report
|
|
98
|
+
palate section <route> <id|name> A section builder's own check: that section at 1440 and 390 and palate's
|
|
99
|
+
floor checks for it, in seconds (no full-page shoot)
|
|
100
|
+
palate sections [--kind pricing] [--tags warm,crafted]
|
|
101
|
+
palate's section archetypes (kb/sections), ranked for the tags
|
|
102
|
+
palate sections show <id> One archetype in full: structure, finish, phone layout, floor checks
|
|
103
|
+
palate imagery "<query>" [--type Photograph] [--artist "<name>"] [--sources met,cleveland,commons] [--count 12]
|
|
104
|
+
Several searches at once: "wedding party | street at dusk | hands" (side by
|
|
105
|
+
side, one shared cache kept a week). Open-licence images for a section: CC0 museum images (The Met, Cleveland), or
|
|
106
|
+
with --sources commons, Wikimedia Commons photos (CC0, public domain, CC BY;
|
|
107
|
+
CC BY needs its credit on the page, which palate writes), on contact sheets of
|
|
108
|
+
12 with pixel sizes. --type: Photograph, Painting, Print, Drawing, Textile,
|
|
109
|
+
Ceramic, Sculpture, Glass. --artist: one maker's work (a photographer's
|
|
110
|
+
name). Answers are cached for 2 hours in .palate (--refresh skips the cache)
|
|
111
|
+
palate imagery pick <id> [<id>…] [--from <slug>] [--no-trim]
|
|
112
|
+
Download the chosen images into the project with their credits, as web-sized
|
|
113
|
+
JPEGs (longest side 2400 px), a museum mount trimmed (--no-trim keeps it)
|
|
114
|
+
palate imagery treatment <duotone|tone|natural|grain> [--shadow #hex] [--highlight #hex] [--colour #hex]
|
|
115
|
+
The one photo treatment for the page, as CSS in the project
|
|
116
|
+
palate texture <grain|paper|speckle|halftone|linen> [--colour #hex] [--opacity 0.1]
|
|
117
|
+
A material drawn in code, written into the project, with its CSS
|
|
118
|
+
palate bench list [--kind <category>] | new <id> --into <folder> | record <id> --from <gate dir> | report
|
|
119
|
+
The benchmark: 30 fictional briefs judged blind against real sites
|
|
120
|
+
palate direction "<the problem>" [--route /x]
|
|
121
|
+
A job-level ask ("users wait 20s here, what should they see?"): a brief for
|
|
122
|
+
3 ideas with rough wireframes, no builds
|
|
123
|
+
palate research "<job>" [--route /] [--urls a,b,c] [--inspire d,e] [--index-only] [--keep 5]
|
|
124
|
+
A new screen (the triage's research mode): understands the job, prints the
|
|
125
|
+
searches for competitors; with --urls looks at those pages and palate's own
|
|
126
|
+
picks live (robots.txt respected, ≤12 pages), ranks them by craft, taste and
|
|
127
|
+
diversity, and writes .palate/research/<name>/ (research.md, contact sheet)
|
|
128
|
+
palate research --name <n> --like R2 --dislike R4
|
|
129
|
+
What the user thought of a reference (palate learns from it)
|
|
130
|
+
palate direction "<job>" --from-research <name>
|
|
131
|
+
3 art directions from the research: metaphor, one signature moment, brand
|
|
132
|
+
kept or a starter system, section plan, provenance, wireframe
|
|
133
|
+
palate direction --ideas <file> [--auto | --choose user] [--no-open]
|
|
134
|
+
The user picks one idea (and may add a note) in their browser; it feeds
|
|
135
|
+
palate build
|
|
136
|
+
Variants, only when the user asks to explore or for a new kind of screen (sketches → judge → pick → build out):
|
|
137
|
+
palate variants "<job>" --name <n> [--refs a.png,https://…] [--mode m] [--quick] [--count 3] [--per 2] [--full]
|
|
138
|
+
Choose directions, find references, write one brief per direction; the
|
|
139
|
+
count comes from plan unless given. Sketches (first screen + centrepiece)
|
|
140
|
+
unless --full
|
|
141
|
+
palate judge --name <n> [--scores f.json] [--keep 4] [--watch --ready 4]
|
|
142
|
+
Render the variants and drop the weakest (a fresh judge scores the rubric);
|
|
143
|
+
--watch waits until 4 are built
|
|
144
|
+
palate pick --name <n> [--pairs] [--ready 4]
|
|
145
|
+
The user sees the variants side by side, blind, and clicks the best
|
|
146
|
+
(--pairs: answer every A/B pair instead; --ready: open as soon as 4 are built)
|
|
147
|
+
palate build --name <n> After the pick: the brief that builds the winning sketch out in full
|
|
148
|
+
palate forget <project> Drop a project's records from palate's history (a throwaway folder saved as a
|
|
149
|
+
project); --dry-run counts first. Taste is untouched
|
|
150
|
+
palate stats How long recent loops took, stage by stage, tokens per mode (estimated),
|
|
151
|
+
and the triage decisions
|
|
152
|
+
palate polish <route> Final polish on the chosen design (Jakub Krehel + Emil Kowalski skills)
|
|
153
|
+
Commands for specific jobs:
|
|
154
|
+
palate critique <route> A designer's review, section by section: crops, facts, taste and rubric in a
|
|
155
|
+
sheet; the agent writes findings
|
|
156
|
+
palate critique --findings <file> [--no-open]
|
|
157
|
+
The user agrees or disagrees with each finding in the browser (teaches taste)
|
|
158
|
+
palate fix <route> [--verify] A brief from the agreed findings, most severe first (or from shoot's
|
|
159
|
+
measurable problems); --verify re-shoots each finding's section, before | after
|
|
160
|
+
palate vary <route> --section "<name or selector>" [--count 3] [--brief "<what you want>"]
|
|
161
|
+
Fresh variations of one section, each built as a copy of the page; then pick
|
|
162
|
+
palate states <route> [--verify] Every state of the screen, rendered and measured: empty, loading, error,
|
|
163
|
+
long text, 50 items, one item, images failing, 320 wide, 200% zoom with
|
|
164
|
+
the keyboard, forms pressed twice, failing, offline. A contact sheet (a row
|
|
165
|
+
per part, a column per state) and a brief of the missing states;
|
|
166
|
+
--verify renders them again, before | after
|
|
167
|
+
palate details <route> Micro-component pass: avatars, brand marks, inputs, empty states, numbers,
|
|
168
|
+
icons, placeholder text, badges, hover/focus/pressed, favicon and OG image
|
|
169
|
+
palate animate <route> [--check] Motion pass that serves the content, with a frame-strip motion check
|
|
170
|
+
(--check: only the check, to verify; covers reduced motion and no-JS)
|
|
171
|
+
palate ambition <route> The last step of the finishing pass: is it remarkable, not only correct?
|
|
172
|
+
Every section beside the strongest references, measured, with a rubric
|
|
173
|
+
for the agent; picks the weakest section and writes its upgrade brief
|
|
174
|
+
palate ambition <route> --scores <file>
|
|
175
|
+
Your rubric scores: re-picks the weakest section and rewrites the brief
|
|
176
|
+
palate ambition <route> --verify [--moves <id>]
|
|
177
|
+
After the one upgrade: that section before | after with new scores; logs
|
|
178
|
+
the move so palate learns which upgrades this user keeps
|
|
179
|
+
palate point [route] [--url …] Fix things by pointing at them: opens the running app with palate's overlay;
|
|
180
|
+
the user clicks an element and says what should change
|
|
181
|
+
palate point [route] --auto [--agent claude|codex] [--yolo]
|
|
182
|
+
The same, and palate runs your coding agent headless on each pin, one at
|
|
183
|
+
a time (claude -p / codex exec); no chat needed. Claude Code may only read
|
|
184
|
+
and edit files and call palate's crop and done; --yolo skips every
|
|
185
|
+
permission check (warned). --agent-cmd "<cmd>": your own command instead
|
|
186
|
+
palate point next Wait for the next request (element, crop, likely source lines) and take it
|
|
187
|
+
palate point stop The same as the overlay's Done: the agent finishes what's queued, then stops
|
|
188
|
+
palate point crop <id> Re-shoot that element after an edit at the pinned width and the other
|
|
189
|
+
one (phone or desktop, or the width the request names), with a verdict
|
|
190
|
+
for the other width: unchanged, changed or broke
|
|
191
|
+
palate point done <id> "<summary>" [--removed] [--override]
|
|
192
|
+
Mark it done; the user's pin shows before and after at both widths
|
|
193
|
+
(--removed: you removed the element, the after says so). Refuses while
|
|
194
|
+
the other width is broken; --override only when the user accepts it
|
|
195
|
+
|
|
196
|
+
palate refs add <image|url> [--like "…"] [--dislike "…"] [--kind landing]
|
|
197
|
+
Save the user's own references with what they like and dislike about
|
|
198
|
+
them (several notes: separate with ;); the notes become rules
|
|
199
|
+
palate refs mine List the user's saved references and their notes
|
|
200
|
+
palate refs rm <id> Remove a reference and the rules that came only from its notes
|
|
201
|
+
palate mcp Run palate as an MCP server (stdio) for Claude Code, Codex, Cursor
|
|
202
|
+
palate taste [learn | init --from f]
|
|
203
|
+
What palate has learned (rules, hit rate) and the taste profile; learn turns
|
|
204
|
+
patterns in new evidence into proposed rules (for the user's OK), then lists
|
|
205
|
+
the rest for the profile
|
|
206
|
+
palate rule add "<rule>" [--kind landing | --only <Component> | --route /x] [--project <name>]
|
|
207
|
+
A rule in the user's words, active at once (it gets a measured check when
|
|
208
|
+
palate knows one). With no scope given, palate picks one: tied to this
|
|
209
|
+
product (a colour, font, its name, agents, demos) → only in this project;
|
|
210
|
+
a judgement about design → everywhere
|
|
211
|
+
palate rule list [--kind k] | edit <id> ["<rule>"] [--kind k] [--project <name>|all] | rm <id> | learn [--all]
|
|
212
|
+
The user's rules (~/.palate/taste/rules.json): at the top of every brief,
|
|
213
|
+
checked by every shoot, enforced by the judge. Proposed rules are listed apart
|
|
214
|
+
palate rule review [--no-open] The rules palate proposed (from repeated asks, agreed critique findings,
|
|
215
|
+
failures), on a board in the browser: wording, where it applies, keep or discard.
|
|
216
|
+
Nothing palate infers applies anywhere until it is kept
|
|
217
|
+
palate rule ok <id> [--scope <n|id> | --kind team | --only <Component> | --route /x] [--project <name>] [--text "…"]
|
|
218
|
+
Keep a proposed rule (default: its suggested scope). --project <name> keeps a
|
|
219
|
+
rule to one project (its folder's name); it then applies nowhere else
|
|
220
|
+
palate rule no <id> Discard a proposed rule; the same evidence won't propose it again
|
|
221
|
+
palate fail <route> "<why>" [--kind landing] [--shot a.png]
|
|
222
|
+
The user called this screen bad: keeps the screenshot in ~/.palate/failures
|
|
223
|
+
and proposes rules from the why, for the user's OK
|
|
224
|
+
palate catalog sync vibrant Maintainers: refresh the vibrant.design discovery list (polite, one request a second)
|
|
225
|
+
palate catalog index Maintainers: build kb/index/discovery.json (facts and links) that palate ships
|
|
226
|
+
palate catalog stats What's on the shelves
|
|
227
|
+
|
|
228
|
+
--dir <path> project folder (default: current folder)`;
|
|
229
|
+
|
|
230
|
+
const { values: o, positionals } = parseArgs({
|
|
231
|
+
allowPositionals: true,
|
|
232
|
+
options: {
|
|
233
|
+
dir: { type: "string" },
|
|
234
|
+
scope: { type: "string" },
|
|
235
|
+
widths: { type: "string" },
|
|
236
|
+
url: { type: "string" },
|
|
237
|
+
limit: { type: "string" },
|
|
238
|
+
refresh: { type: "boolean" },
|
|
239
|
+
shelf: { type: "string" },
|
|
240
|
+
industry: { type: "string" },
|
|
241
|
+
audience: { type: "string" },
|
|
242
|
+
tone: { type: "string" },
|
|
243
|
+
needs: { type: "string" },
|
|
244
|
+
theme: { type: "string" },
|
|
245
|
+
count: { type: "string" },
|
|
246
|
+
compare: { type: "string" },
|
|
247
|
+
"no-keep-brand": { type: "boolean" },
|
|
248
|
+
"type-from": { type: "string" },
|
|
249
|
+
moves: { type: "string" },
|
|
250
|
+
name: { type: "string" },
|
|
251
|
+
scores: { type: "string" },
|
|
252
|
+
keep: { type: "string" },
|
|
253
|
+
per: { type: "string" },
|
|
254
|
+
from: { type: "string" },
|
|
255
|
+
"no-open": { type: "boolean" },
|
|
256
|
+
"no-trim": { type: "boolean" },
|
|
257
|
+
artist: { type: "string" },
|
|
258
|
+
quick: { type: "boolean" },
|
|
259
|
+
refs: { type: "string" },
|
|
260
|
+
note: { type: "string" },
|
|
261
|
+
pairs: { type: "boolean" },
|
|
262
|
+
findings: { type: "string" },
|
|
263
|
+
section: { type: "string" },
|
|
264
|
+
brief: { type: "string" },
|
|
265
|
+
verify: { type: "boolean" },
|
|
266
|
+
check: { type: "boolean" },
|
|
267
|
+
mode: { type: "string" },
|
|
268
|
+
full: { type: "boolean" },
|
|
269
|
+
route: { type: "string" },
|
|
270
|
+
only: { type: "string" },
|
|
271
|
+
text: { type: "string" },
|
|
272
|
+
ready: { type: "string" },
|
|
273
|
+
watch: { type: "boolean" },
|
|
274
|
+
fold: { type: "boolean" },
|
|
275
|
+
"dry-run": { type: "boolean" },
|
|
276
|
+
tablet: { type: "boolean" },
|
|
277
|
+
kind: { type: "string" },
|
|
278
|
+
// palate moves
|
|
279
|
+
tags: { type: "string" },
|
|
280
|
+
signature: { type: "boolean" },
|
|
281
|
+
shot: { type: "string" },
|
|
282
|
+
project: { type: "string" },
|
|
283
|
+
all: { type: "boolean" },
|
|
284
|
+
// palate guard / waive / icons
|
|
285
|
+
mono: { type: "boolean" },
|
|
286
|
+
hook: { type: "boolean" },
|
|
287
|
+
commit: { type: "boolean" },
|
|
288
|
+
// palate section
|
|
289
|
+
early: { type: "boolean" },
|
|
290
|
+
verdict: { type: "boolean" },
|
|
291
|
+
install: { type: "boolean" },
|
|
292
|
+
uninstall: { type: "boolean" },
|
|
293
|
+
global: { type: "boolean" },
|
|
294
|
+
reason: { type: "string" },
|
|
295
|
+
remove: { type: "string" },
|
|
296
|
+
source: { type: "string" },
|
|
297
|
+
like: { type: "string", multiple: true },
|
|
298
|
+
dislike: { type: "string", multiple: true },
|
|
299
|
+
direction: { type: "string" },
|
|
300
|
+
ideas: { type: "string" },
|
|
301
|
+
auto: { type: "boolean" },
|
|
302
|
+
agent: { type: "string" },
|
|
303
|
+
"agent-cmd": { type: "string" },
|
|
304
|
+
yolo: { type: "boolean" },
|
|
305
|
+
removed: { type: "boolean" },
|
|
306
|
+
override: { type: "boolean" },
|
|
307
|
+
status: { type: "boolean" },
|
|
308
|
+
// palate research
|
|
309
|
+
urls: { type: "string" },
|
|
310
|
+
inspire: { type: "string" },
|
|
311
|
+
"index-only": { type: "boolean" },
|
|
312
|
+
"from-research": { type: "string" },
|
|
313
|
+
choose: { type: "string" },
|
|
314
|
+
// quality floor: blueprint, gate, imagery, bench
|
|
315
|
+
file: { type: "string" },
|
|
316
|
+
answers: { type: "string" },
|
|
317
|
+
duel: { type: "string" },
|
|
318
|
+
judge: { type: "string" },
|
|
319
|
+
dirs: { type: "string" },
|
|
320
|
+
shadow: { type: "string" },
|
|
321
|
+
highlight: { type: "string" },
|
|
322
|
+
restore: { type: "string" },
|
|
323
|
+
sources: { type: "string" },
|
|
324
|
+
type: { type: "string" },
|
|
325
|
+
out: { type: "string" },
|
|
326
|
+
colour: { type: "string" },
|
|
327
|
+
opacity: { type: "string" },
|
|
328
|
+
seed: { type: "string" },
|
|
329
|
+
into: { type: "string" },
|
|
330
|
+
minutes: { type: "string" },
|
|
331
|
+
release: { type: "string" },
|
|
332
|
+
width: { type: "string" },
|
|
333
|
+
version: { type: "boolean", short: "v" },
|
|
334
|
+
help: { type: "boolean", short: "h" },
|
|
335
|
+
},
|
|
336
|
+
});
|
|
337
|
+
const dir = path.resolve(o.dir ?? process.cwd());
|
|
338
|
+
let [cmd, ...args] = positionals;
|
|
339
|
+
|
|
340
|
+
// Invite-only: everything but these and the free commands (auth.FREE_COMMANDS) needs activation (palate mcp starts,
|
|
341
|
+
// and its paid tools say so instead).
|
|
342
|
+
const OPEN = new Set([undefined, "activate", "deactivate", "help", "version", "mcp"]);
|
|
343
|
+
|
|
344
|
+
try {
|
|
345
|
+
if (o.help) cmd = "help";
|
|
346
|
+
if (o.version && !cmd) cmd = "version";
|
|
347
|
+
const { FREE_COMMANDS } = await import("../src/auth.mjs");
|
|
348
|
+
if (!OPEN.has(cmd) && !FREE_COMMANDS.has(cmd)) {
|
|
349
|
+
const { ensureGate, maybeRecheck } = await import("../src/auth.mjs");
|
|
350
|
+
const g = await ensureGate();
|
|
351
|
+
if (!g.ok) {
|
|
352
|
+
console.error(g.message);
|
|
353
|
+
process.exitCode = 1;
|
|
354
|
+
cmd = "blocked";
|
|
355
|
+
} else {
|
|
356
|
+
if (g.note) console.error(g.note);
|
|
357
|
+
maybeRecheck();
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
switch (cmd) {
|
|
361
|
+
case "blocked":
|
|
362
|
+
break;
|
|
363
|
+
case "activate": {
|
|
364
|
+
const A = await import("../src/auth.mjs");
|
|
365
|
+
if (o.status || args[0] === "status") console.log(A.status());
|
|
366
|
+
else if (!args[0]) throw new Error("Usage: palate activate <your code> (codes look like palate-XXXX-XXXX-XXXX) · palate activate --status");
|
|
367
|
+
else console.log(await A.activate(args[0]));
|
|
368
|
+
break;
|
|
369
|
+
}
|
|
370
|
+
case "deactivate":
|
|
371
|
+
console.log((await import("../src/auth.mjs")).deactivate());
|
|
372
|
+
break;
|
|
373
|
+
case "version":
|
|
374
|
+
console.log(JSON.parse(fs.readFileSync(new URL("../package.json", import.meta.url), "utf8")).version);
|
|
375
|
+
break;
|
|
376
|
+
case "help":
|
|
377
|
+
console.log(HELP);
|
|
378
|
+
break;
|
|
379
|
+
case "context":
|
|
380
|
+
console.log(context(dir));
|
|
381
|
+
break;
|
|
382
|
+
case "search": {
|
|
383
|
+
const results = search(args.join(" "), { scope: o.scope });
|
|
384
|
+
console.log(results.length ? results.map(card).join("\n\n") + "\n\nRead the ones that fit with: palate show <id>" : "No matches. Try other words, or palate list.");
|
|
385
|
+
break;
|
|
386
|
+
}
|
|
387
|
+
case "show":
|
|
388
|
+
console.log(show(args).join("\n\n---\n\n"));
|
|
389
|
+
break;
|
|
390
|
+
case "list":
|
|
391
|
+
console.log(list().join("\n"));
|
|
392
|
+
break;
|
|
393
|
+
case "shoot": {
|
|
394
|
+
if (!args[0]) throw new Error("Usage: palate shoot <route>, e.g. palate shoot /team");
|
|
395
|
+
const widths = o.widths ? o.widths.split(",").map(Number) : undefined;
|
|
396
|
+
const { report, gate } = await shoot(dir, args[0], { widths, tablet: Boolean(o.tablet), url: o.url, compare: o.compare, fold: Boolean(o.fold), like: (o.like ?? []).flatMap((x) => x.split(",")) });
|
|
397
|
+
console.log(report);
|
|
398
|
+
// The similarity gate fails the command, like a failing test.
|
|
399
|
+
if (gate && !gate.pass) process.exitCode = 1;
|
|
400
|
+
break;
|
|
401
|
+
}
|
|
402
|
+
// ── palate ambition: the remarkable-not-only-correct pass (src/loop/ambition.mjs) ──
|
|
403
|
+
case "ambition": {
|
|
404
|
+
if (!args[0]) throw new Error("Usage: palate ambition <route> [--scores <file>] [--verify [--moves <id>]]");
|
|
405
|
+
const { ambition } = await import("../src/loop/ambition.mjs");
|
|
406
|
+
console.log(await ambition(dir, args[0], { url: o.url, scores: o.scores, verify: Boolean(o.verify), moves: o.moves ? o.moves.split(",").map((x) => x.trim()).filter(Boolean) : undefined }));
|
|
407
|
+
break;
|
|
408
|
+
}
|
|
409
|
+
// ── end palate ambition ──
|
|
410
|
+
case "check":
|
|
411
|
+
console.log(check(dir));
|
|
412
|
+
break;
|
|
413
|
+
case "copy": {
|
|
414
|
+
const { lintFiles, copyReport } = await import("../src/copy.mjs");
|
|
415
|
+
const { changedFiles } = await import("../src/guard.mjs");
|
|
416
|
+
const { execFileSync } = await import("node:child_process");
|
|
417
|
+
const files = args.length ? args : o.all ? execFileSync("git", ["ls-files", "--cached", "--others", "--exclude-standard"], { cwd: dir, encoding: "utf8" }).split("\n").filter(Boolean) : (changedFiles(dir) ?? []);
|
|
418
|
+
const r = lintFiles(dir, files);
|
|
419
|
+
console.log(copyReport(r, { files: files.length }));
|
|
420
|
+
if (r.findings.some((f) => f.weight === "stop" || f.over)) process.exitCode = 1;
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
case "guard": {
|
|
424
|
+
const G = await import("../src/guard.mjs");
|
|
425
|
+
if (o.hook) {
|
|
426
|
+
// Claude Code's Stop hook: its payload on stdin, the decision as JSON on stdout. Never fails the agent's stop
|
|
427
|
+
// on palate's own error: an exception allows the stop and says why on stderr.
|
|
428
|
+
let input = {};
|
|
429
|
+
try {
|
|
430
|
+
const raw = fs.readFileSync(0, "utf8");
|
|
431
|
+
input = raw.trim() ? JSON.parse(raw) : {};
|
|
432
|
+
} catch {}
|
|
433
|
+
const A = await import("../src/guard-agents.mjs");
|
|
434
|
+
const agent = (o.agent ?? "claude").toLowerCase();
|
|
435
|
+
try {
|
|
436
|
+
const norm = { ...A.parseInput(agent, input), agent };
|
|
437
|
+
const d = G.decide(norm, { dir: o.dir ?? norm.cwd });
|
|
438
|
+
const out = A.formatOutput(agent, d);
|
|
439
|
+
if (out) console.log(out);
|
|
440
|
+
} catch (e) {
|
|
441
|
+
console.error(`palate guard couldn't run (${e.message}); the stop goes ahead.`);
|
|
442
|
+
if (agent === "cursor") console.log("{}");
|
|
443
|
+
}
|
|
444
|
+
break;
|
|
445
|
+
}
|
|
446
|
+
if (o.commit) {
|
|
447
|
+
// The git pre-commit hook: the report on stderr, exit 1 while something is open.
|
|
448
|
+
const r = G.commitCheck(dir);
|
|
449
|
+
if (r.text) console.error(r.text);
|
|
450
|
+
if (!r.ok) process.exitCode = 1;
|
|
451
|
+
break;
|
|
452
|
+
}
|
|
453
|
+
if (o.install || o.uninstall) {
|
|
454
|
+
const agents = o.agent ? o.agent.split(",").map((a) => a.trim()).filter(Boolean) : undefined;
|
|
455
|
+
console.log(G.install(dir, { agents, global: o.global, remove: o.uninstall }));
|
|
456
|
+
break;
|
|
457
|
+
}
|
|
458
|
+
console.log(G.report(dir));
|
|
459
|
+
break;
|
|
460
|
+
}
|
|
461
|
+
case "waive": {
|
|
462
|
+
const G = await import("../src/guard.mjs");
|
|
463
|
+
if (o.remove) console.log(G.removeWaiver(dir, o.remove, o.file));
|
|
464
|
+
else if (!args[0]) {
|
|
465
|
+
const w = G.readWaivers(dir);
|
|
466
|
+
console.log(w.length ? w.map((x) => `${x.id}${x.file ? ` · ${x.file}` : ""} · ${x.reason} (${x.by}, ${x.at.slice(0, 10)})`).join("\n") : "No waivers in this project.");
|
|
467
|
+
} else {
|
|
468
|
+
const r = G.addWaiver(dir, { id: args[0], file: o.file, reason: o.reason, by: "user" });
|
|
469
|
+
console.log(r.message);
|
|
470
|
+
if (!r.ok) process.exitCode = 1;
|
|
471
|
+
}
|
|
472
|
+
break;
|
|
473
|
+
}
|
|
474
|
+
case "refs": {
|
|
475
|
+
const { refsReport, addNote } = await import("../src/refs.mjs");
|
|
476
|
+
if (args[0] === "add" || args[0] === "mine" || args[0] === "rm") {
|
|
477
|
+
const { addRefs, listRefs, refsAddText, removeRef } = await import("../src/loop/myrefs.mjs");
|
|
478
|
+
if (args[0] === "add") {
|
|
479
|
+
if (!args[1]) throw new Error('Usage: palate refs add <image or url> [...] [--like "what you like about it"] [--dislike "what you don\'t"] [--kind landing]');
|
|
480
|
+
const added = await addRefs(args.slice(1), { note: o.note ?? "", like: o.like, dislike: o.dislike, kinds: o.kind ? o.kind.split(",") : undefined });
|
|
481
|
+
console.log(refsAddText(added));
|
|
482
|
+
} else if (args[0] === "rm") {
|
|
483
|
+
if (!args[1]) throw new Error("Usage: palate refs rm <id>");
|
|
484
|
+
const { ref, rules } = removeRef(args[1]);
|
|
485
|
+
console.log(`Removed ${ref.source} (${ref.id})${rules.length ? ` and its rules: ${rules.map((r) => `${r.id} ${r.rule}`).join("; ")}` : ""}`);
|
|
486
|
+
} else {
|
|
487
|
+
const mine = listRefs();
|
|
488
|
+
console.log(mine.length ? mine.map((r) => `${r.id} ${r.source}${r.likes?.length ? ` · likes: ${r.likes.join("; ")}` : ""}${r.dislikes?.length ? ` · dislikes: ${r.dislikes.join("; ")}` : ""}${r.note ? ` · ${r.note}` : ""}${r.rules?.length ? ` · rules ${r.rules.join(", ")}` : ""}`).join("\n") : "No references yet. Add some: palate refs add <image or url> --like \"…\" --dislike \"…\"");
|
|
489
|
+
}
|
|
490
|
+
break;
|
|
491
|
+
}
|
|
492
|
+
if (args[0] === "note") {
|
|
493
|
+
if (!args[1] || !args[2]) throw new Error('Usage: palate refs note <id> "what worked"');
|
|
494
|
+
console.log(`Saved note ${addNote(args[1], args.slice(2).join(" "))} for ${args[1]}`);
|
|
495
|
+
break;
|
|
496
|
+
}
|
|
497
|
+
const query = { shelf: o.shelf, industry: o.industry, audience: o.audience, tone: o.tone, needs: o.needs, theme: o.theme, words: args.join(" ") };
|
|
498
|
+
console.log(await refsReport(query, { dir, count: o.count ? Number(o.count) : 3 }));
|
|
499
|
+
break;
|
|
500
|
+
}
|
|
501
|
+
case "capture": {
|
|
502
|
+
if (!args[0]) throw new Error("Usage: palate capture <url> [--widths 1440,390]");
|
|
503
|
+
const { capture, captureReport } = await import("../src/capture.mjs");
|
|
504
|
+
const widths = o.widths ? o.widths.split(",").map(Number) : [1440];
|
|
505
|
+
console.log(captureReport(await capture(args[0], { widths })));
|
|
506
|
+
break;
|
|
507
|
+
}
|
|
508
|
+
case "system": {
|
|
509
|
+
const [sub, ...rest] = args;
|
|
510
|
+
if (sub === "pick") {
|
|
511
|
+
const { pickReport } = await import("../src/systems/pick.mjs");
|
|
512
|
+
if (!rest.length) throw new Error('Usage: palate system pick "<what you are building, in the user\'s words>"');
|
|
513
|
+
console.log(pickReport(rest.join(" "), { dir }));
|
|
514
|
+
} else if (sub === "apply") {
|
|
515
|
+
const { applySystem } = await import("../src/systems/apply.mjs");
|
|
516
|
+
if (!rest[0]) throw new Error("Usage: palate system apply <id> [--no-keep-brand]");
|
|
517
|
+
console.log(applySystem(rest[0], dir, { keepBrand: !o["no-keep-brand"], typeFrom: o["type-from"] }));
|
|
518
|
+
} else if (sub === "list") {
|
|
519
|
+
const { loadSystems } = await import("../src/systems/load.mjs");
|
|
520
|
+
for (const s of loadSystems()) console.log(`${s.id.padEnd(16)} ${s.facets.theme.padEnd(5)} ${s.facets.accent.padEnd(9)} ${s.facets.radius.padEnd(6)} ${s.facets.elevation.padEnd(8)} ${s.name}`);
|
|
521
|
+
} else if (sub === "show") {
|
|
522
|
+
const { loadSystems } = await import("../src/systems/load.mjs");
|
|
523
|
+
const s = loadSystems().find((x) => x.id === rest[0]);
|
|
524
|
+
if (!s) throw new Error(`No design system "${rest[0]}"`);
|
|
525
|
+
console.log(fs.readFileSync(s.file, "utf8"));
|
|
526
|
+
} else {
|
|
527
|
+
throw new Error("Usage: palate system pick <request> | apply <id> | list | show <id>");
|
|
528
|
+
}
|
|
529
|
+
break;
|
|
530
|
+
}
|
|
531
|
+
case "mcp": {
|
|
532
|
+
// The server keeps the process alive on stdin; nothing else to do here.
|
|
533
|
+
await import("../src/mcp/server.mjs");
|
|
534
|
+
break;
|
|
535
|
+
}
|
|
536
|
+
case "plan": {
|
|
537
|
+
if (!args.length) throw new Error('Usage: palate plan "<the request, in the user\'s words>" [--route /x] [--mode direct|build|direction|quick|full]');
|
|
538
|
+
const { plan, planText } = await import("../src/loop/plan.mjs");
|
|
539
|
+
console.log(planText(plan(dir, args.join(" "), { route: o.route, mode: o.mode, name: o.name }), { name: o.name }));
|
|
540
|
+
break;
|
|
541
|
+
}
|
|
542
|
+
case "variants": {
|
|
543
|
+
const { variants } = await import("../src/loop/variants.mjs");
|
|
544
|
+
console.log(await variants(dir, args.join(" "), { name: o.name, count: o.count ? Number(o.count) : undefined, per: o.per ? Number(o.per) : undefined, quick: Boolean(o.quick), refs: o.refs ? o.refs.split(",") : [], mode: o.mode, full: Boolean(o.full), route: o.route }));
|
|
545
|
+
break;
|
|
546
|
+
}
|
|
547
|
+
case "judge": {
|
|
548
|
+
if (!o.name) throw new Error("Usage: palate judge --name <loop> [--scores file.json] [--keep 4] [--watch --ready 4]");
|
|
549
|
+
const { judge } = await import("../src/loop/judge.mjs");
|
|
550
|
+
console.log(await judge(dir, o.name, { scores: o.scores, keep: o.keep ? Number(o.keep) : 4, url: o.url, watch: Boolean(o.watch), ready: o.ready ? Number(o.ready) : undefined }));
|
|
551
|
+
break;
|
|
552
|
+
}
|
|
553
|
+
case "pick": {
|
|
554
|
+
if (!o.name) throw new Error("Usage: palate pick --name <loop> [--ready 4]");
|
|
555
|
+
const { pick } = await import("../src/loop/pick.mjs");
|
|
556
|
+
console.log(await pick(dir, o.name, { routes: args.length ? args : undefined, url: o.url, open: !o["no-open"], pairsMode: Boolean(o.pairs), ready: o.ready ? Number(o.ready) : undefined }));
|
|
557
|
+
break;
|
|
558
|
+
}
|
|
559
|
+
case "build": {
|
|
560
|
+
if (!o.name && !args[0]) throw new Error('Usage: palate build "<the job>" --route /x (build mode) · palate build --name <loop> (after a variants pick)');
|
|
561
|
+
const { build, buildBrief } = await import("../src/loop/build.mjs");
|
|
562
|
+
// A job in words is build mode; a lone route or --name alone builds out a variants winner.
|
|
563
|
+
const winner = (args.length === 1 && /^\/\S*$/.test(args[0])) || (!args.length && o.name);
|
|
564
|
+
console.log(winner ? build(dir, { name: o.name, route: args[0] }) : await buildBrief(dir, args.join(" "), { route: o.route, name: o.name, direction: o.direction, refs: o.refs ? o.refs.split(",") : [], like: (o.like ?? []).flatMap((x) => x.split(",")), url: o.url, duel: Boolean(o.duel) }));
|
|
565
|
+
break;
|
|
566
|
+
}
|
|
567
|
+
case "blueprint": {
|
|
568
|
+
const B = await import("../src/loop/blueprint.mjs");
|
|
569
|
+
if (o.file) console.log(B.saveBlueprint(dir, o.file, { name: o.name }));
|
|
570
|
+
else console.log(await B.blueprintBrief(dir, args.join(" "), { route: o.route, name: o.name, direction: o.direction, url: o.url }));
|
|
571
|
+
break;
|
|
572
|
+
}
|
|
573
|
+
case "gate": {
|
|
574
|
+
if (!args[0]) throw new Error("Usage: palate gate <route> [--answers <dir|files>] [--restore <round>]");
|
|
575
|
+
const { gate, duel } = await import("../src/loop/gate.mjs");
|
|
576
|
+
if (o.duel) {
|
|
577
|
+
console.log(await duel(dir, args[0], { section: o.duel, url: o.url, answers: o.answers }));
|
|
578
|
+
break;
|
|
579
|
+
}
|
|
580
|
+
const res = await gate(dir, args[0], { url: o.url, answers: o.answers ? o.answers.split(",") : undefined, restore: o.restore, job: o.text, judge: o.judge });
|
|
581
|
+
console.log(res);
|
|
582
|
+
if (/below the bar/.test(res)) process.exitCode = 1;
|
|
583
|
+
break;
|
|
584
|
+
}
|
|
585
|
+
case "match": {
|
|
586
|
+
const { match } = await import("../src/loop/match.mjs");
|
|
587
|
+
const res = await match(dir, args[0], { route: o.route ?? "/", width: o.width ? Number(o.width) : undefined, check: Boolean(o.check), answers: o.answers, restore: o.restore, url: o.url });
|
|
588
|
+
console.log(res.text);
|
|
589
|
+
if (res.stopped || res.notReady) process.exitCode = 1;
|
|
590
|
+
break;
|
|
591
|
+
}
|
|
592
|
+
case "section": {
|
|
593
|
+
if (!args[0] || !args[1]) throw new Error("Usage: palate section <route> <section id, name or selector> [--early | --verdict]");
|
|
594
|
+
const { sectionCheck, sectionVerdict } = await import("../src/loop/gate.mjs");
|
|
595
|
+
if (o.verdict) console.log(sectionVerdict(dir, args[0], args.slice(1).join(" ")));
|
|
596
|
+
else console.log(await sectionCheck(dir, args[0], args.slice(1).join(" "), { url: o.url, judge: Boolean(o.early) }));
|
|
597
|
+
break;
|
|
598
|
+
}
|
|
599
|
+
case "sections": {
|
|
600
|
+
const S = await import("../src/sections.mjs");
|
|
601
|
+
if (args[0] === "show") {
|
|
602
|
+
for (const id of args.slice(1)) console.log(S.sectionBrief(id));
|
|
603
|
+
break;
|
|
604
|
+
}
|
|
605
|
+
const tags = o.tags ? o.tags.split(",").map((x) => x.trim()) : [];
|
|
606
|
+
const list = o.kind ? S.matchSections({ kind: o.kind, tags, limit: o.limit ? Number(o.limit) : 12 }) : S.loadSections();
|
|
607
|
+
for (const s of list) console.log(`${s.id.padEnd(40)} ${s.kind.padEnd(11)} ${String(s.shape).padEnd(18)} ${s.layout}`);
|
|
608
|
+
break;
|
|
609
|
+
}
|
|
610
|
+
case "imagery": {
|
|
611
|
+
const I = await import("../src/loop/imagery.mjs");
|
|
612
|
+
const sources = o.sources ? o.sources.split(",") : undefined;
|
|
613
|
+
if (args[0] === "treatment") {
|
|
614
|
+
// The one treatment every photo on the page shares, as a CSS file in the project (import it once).
|
|
615
|
+
const name = args[1] ?? "duotone";
|
|
616
|
+
const css = I.treatmentCss(name, { shadow: o.shadow, highlight: o.highlight, colour: o.colour, opacity: o.opacity ? Number(o.opacity) : undefined });
|
|
617
|
+
const into = fs.existsSync(path.join(dir, "src")) ? path.join(dir, "src", "palate-photo.css") : path.join(dir, "palate-photo.css");
|
|
618
|
+
fs.writeFileSync(into, `/* palate imagery treatment ${name}: one treatment for every photo on the page. Wrap photos in .palate-photo. */\n${css}\n`);
|
|
619
|
+
console.log(`Wrote ${into.replace(/\\/g, "/")}. Import it once (e.g. @import "./palate-photo.css"; in your main CSS) and wrap each photo in <div class="palate-photo">.`);
|
|
620
|
+
} else if (args[0] === "pick") console.log(await I.pickImages(dir, args.slice(1), { slug: o.from, out: o.out, trim: !o["no-trim"] }));
|
|
621
|
+
else if (/\||\n/.test(args.join(" "))) console.log(await I.imageryMany(dir, args.join(" "), { count: o.count ? Number(o.count) : undefined, sources, type: o.type, refresh: Boolean(o.refresh) }));
|
|
622
|
+
else console.log(await I.imagery(dir, args.join(" "), { count: o.count ? Number(o.count) : undefined, sources, type: o.type, artist: o.artist, refresh: Boolean(o.refresh) }));
|
|
623
|
+
break;
|
|
624
|
+
}
|
|
625
|
+
case "icons": {
|
|
626
|
+
const { icons } = await import("../src/loop/icons.mjs");
|
|
627
|
+
console.log(await icons(dir, args, { mono: o.mono, out: o.out }));
|
|
628
|
+
break;
|
|
629
|
+
}
|
|
630
|
+
case "texture": {
|
|
631
|
+
if (!args[0]) throw new Error("Usage: palate texture <grain|paper|speckle|halftone|linen> [--colour #hex] [--opacity 0.1]");
|
|
632
|
+
const I = await import("../src/loop/imagery.mjs");
|
|
633
|
+
console.log(I.writeTexture(dir, args[0], { colour: o.colour, opacity: o.opacity ? Number(o.opacity) : undefined, seed: o.seed }));
|
|
634
|
+
break;
|
|
635
|
+
}
|
|
636
|
+
case "bench": {
|
|
637
|
+
const Bn = await import("../src/loop/bench.mjs");
|
|
638
|
+
const [sub = "list", id] = args;
|
|
639
|
+
if (sub === "list") for (const b of Bn.listBriefs({ category: o.kind })) console.log(`${b.id.padEnd(24)} ${b.category.padEnd(18)} ${b.job}`);
|
|
640
|
+
else if (sub === "new") {
|
|
641
|
+
if (!id || !o.into) throw new Error("Usage: palate bench new <id> --into <folder>");
|
|
642
|
+
console.log(Bn.scaffold(id, path.resolve(o.into)));
|
|
643
|
+
} else if (sub === "record") {
|
|
644
|
+
if (!id) throw new Error("Usage: palate bench record <id> [--from <gate round dir>] [--minutes n] [--note text]");
|
|
645
|
+
const { benchResultFrom } = await import("../src/loop/gate.mjs");
|
|
646
|
+
const row = Bn.recordResult(id, { ...benchResultFrom(dir, { from: o.from }), minutes: o.minutes ? Number(o.minutes) : undefined, notes: o.note });
|
|
647
|
+
console.log(JSON.stringify(row, null, 1));
|
|
648
|
+
} else if (sub === "report") console.log(Bn.benchReport({ release: o.release }));
|
|
649
|
+
else if (sub === "pick") {
|
|
650
|
+
const { benchPick } = await import("../src/loop/benchpick.mjs");
|
|
651
|
+
console.log(await benchPick({ dirs: o.dirs ? o.dirs.split(",") : [], open: !o["no-open"] }));
|
|
652
|
+
}
|
|
653
|
+
else throw new Error("Usage: palate bench list | new <id> --into <folder> | record <id> | report");
|
|
654
|
+
break;
|
|
655
|
+
}
|
|
656
|
+
case "direction": {
|
|
657
|
+
const D = await import("../src/loop/direction.mjs");
|
|
658
|
+
// --auto: the user said "just build it" (palate picks from taste); --choose user: always the picker.
|
|
659
|
+
if (o.ideas) console.log(await D.pickDirection(dir, { file: o.ideas, name: o.name, open: !o["no-open"], choose: o.auto ? "auto" : o.choose }));
|
|
660
|
+
else console.log(D.direction(dir, args.join(" "), { route: o.route, name: o.name, fromResearch: o["from-research"] }));
|
|
661
|
+
break;
|
|
662
|
+
}
|
|
663
|
+
// ── palate research: competitors and craft, looked at live, before ideation (src/loop/research.mjs) ──
|
|
664
|
+
case "research": {
|
|
665
|
+
const R = await import("../src/loop/research.mjs");
|
|
666
|
+
if (o.like?.length || o.dislike?.length) {
|
|
667
|
+
const v = [...(o.like ?? []).flatMap((x) => x.split(",")).map((id) => ({ id: id.trim(), verdict: "like" })), ...(o.dislike ?? []).flatMap((x) => x.split(",")).map((id) => ({ id: id.trim(), verdict: "dislike" }))];
|
|
668
|
+
const saved = R.recordVerdicts(dir, o.name, v);
|
|
669
|
+
console.log(saved.length ? `Noted: ${saved.map((s) => `${s.verdict} ${s.ref} ${s.name}`).join(", ")}. palate ranks with it next time; the same trait twice becomes a proposed rule at palate taste learn.` : "No matching references (use their ids, R1, R2 …).");
|
|
670
|
+
break;
|
|
671
|
+
}
|
|
672
|
+
const list = (s) => (s == null ? null : s === "none" || s === "" ? [] : s.split(",").map((x) => x.trim()).filter(Boolean));
|
|
673
|
+
const res = await R.research(dir, args.join(" "), { route: o.route, name: o.name, urls: list(o.urls) ?? (o.inspire || o["index-only"] ? [] : null), inspire: list(o.inspire) ?? [], keep: o.keep ? Number(o.keep) : undefined });
|
|
674
|
+
console.log(res.text);
|
|
675
|
+
break;
|
|
676
|
+
}
|
|
677
|
+
// ── end palate research ──
|
|
678
|
+
case "forget": {
|
|
679
|
+
const { forget } = await import("../src/loop/forget.mjs");
|
|
680
|
+
console.log(forget(args[0], { dryRun: Boolean(o["dry-run"]) }));
|
|
681
|
+
break;
|
|
682
|
+
}
|
|
683
|
+
case "stats": {
|
|
684
|
+
const { stats } = await import("../src/loop/stats.mjs");
|
|
685
|
+
console.log(stats(dir, { limit: o.limit ? Number(o.limit) : 10 }));
|
|
686
|
+
break;
|
|
687
|
+
}
|
|
688
|
+
case "polish": {
|
|
689
|
+
if (!args[0]) throw new Error("Usage: palate polish <route>");
|
|
690
|
+
const { polish } = await import("../src/loop/polish.mjs");
|
|
691
|
+
console.log(await polish(dir, args[0], { url: o.url }));
|
|
692
|
+
break;
|
|
693
|
+
}
|
|
694
|
+
case "critique": {
|
|
695
|
+
const { critique, reviewFindings } = await import("../src/loop/critique.mjs");
|
|
696
|
+
if (o.findings) {
|
|
697
|
+
console.log(await reviewFindings(dir, o.findings, { open: !o["no-open"] }));
|
|
698
|
+
break;
|
|
699
|
+
}
|
|
700
|
+
if (!args[0]) throw new Error("Usage: palate critique <route> [--url …] · palate critique --findings <file>");
|
|
701
|
+
console.log((await critique(dir, args[0], { url: o.url })).sheet);
|
|
702
|
+
break;
|
|
703
|
+
}
|
|
704
|
+
case "fix": {
|
|
705
|
+
if (!args[0]) throw new Error("Usage: palate fix <route> [--verify]");
|
|
706
|
+
const { fix } = await import("../src/loop/fix.mjs");
|
|
707
|
+
console.log(await fix(dir, args[0], { url: o.url, verify: Boolean(o.verify) }));
|
|
708
|
+
break;
|
|
709
|
+
}
|
|
710
|
+
case "vary": {
|
|
711
|
+
if (!args[0] || !o.section) throw new Error('Usage: palate vary <route> --section "<name or selector>" [--count 3] [--brief "<what you want>"]');
|
|
712
|
+
const { vary } = await import("../src/loop/vary.mjs");
|
|
713
|
+
console.log(await vary(dir, args[0], { section: o.section, count: o.count ? Number(o.count) : 3, url: o.url, brief: o.brief }));
|
|
714
|
+
break;
|
|
715
|
+
}
|
|
716
|
+
case "details": {
|
|
717
|
+
if (!args[0]) throw new Error("Usage: palate details <route>");
|
|
718
|
+
const { details } = await import("../src/loop/details.mjs");
|
|
719
|
+
console.log(await details(dir, args[0], { url: o.url }));
|
|
720
|
+
break;
|
|
721
|
+
}
|
|
722
|
+
case "states": {
|
|
723
|
+
if (!args[0]) throw new Error("Usage: palate states <route> [--url …] [--verify]");
|
|
724
|
+
const { states } = await import("../src/loop/states.mjs");
|
|
725
|
+
console.log((await states(dir, args[0], { url: o.url, verify: Boolean(o.verify) })).text);
|
|
726
|
+
break;
|
|
727
|
+
}
|
|
728
|
+
// ── palate finish: the finishing pass in one process (one browser, one dev server, kept warm between steps) ──
|
|
729
|
+
case "finish": {
|
|
730
|
+
if (!args[0]) throw new Error("Usage: palate finish <route> [--url …]");
|
|
731
|
+
const route = args[0];
|
|
732
|
+
const t0 = Date.now();
|
|
733
|
+
const step = async (name, fn) => {
|
|
734
|
+
const t = Date.now();
|
|
735
|
+
try {
|
|
736
|
+
const out = await fn();
|
|
737
|
+
return { name, out: typeof out === "string" ? out : out?.text ?? out?.report ?? "", ms: Date.now() - t };
|
|
738
|
+
} catch (e) {
|
|
739
|
+
return { name, out: `${name} failed: ${e.message}`, ms: Date.now() - t, failed: true };
|
|
740
|
+
}
|
|
741
|
+
};
|
|
742
|
+
const { states } = await import("../src/loop/states.mjs");
|
|
743
|
+
const { details } = await import("../src/loop/details.mjs");
|
|
744
|
+
const { animate } = await import("../src/loop/animate.mjs");
|
|
745
|
+
const parts = [];
|
|
746
|
+
parts.push(await step("shoot", async () => (await shoot(dir, route, { url: o.url })).report));
|
|
747
|
+
// The three read the page without changing it: run them side by side on the shared browser and server.
|
|
748
|
+
parts.push(...(await Promise.all([step("states", () => states(dir, route, { url: o.url })), step("details", () => details(dir, route, { url: o.url })), step("animate", () => animate(dir, route, { url: o.url, checkOnly: true }))])));
|
|
749
|
+
const { matchedRoute } = await import("../src/loop/matched.mjs");
|
|
750
|
+
const userDesign = matchedRoute(dir, route);
|
|
751
|
+
console.log(
|
|
752
|
+
[
|
|
753
|
+
...(userDesign ? [`${route} is built from the user's own design (palate match): fix only what breaks (missing states, contrast, clipping, the phone layout) and never restyle what the design shows. Its gate is palate match --check --route ${route}, not palate gate.`, ""] : []),
|
|
754
|
+
`# Finishing pass ${route}: ${parts.map((p) => `${p.name} ${(p.ms / 1000).toFixed(0)}s`).join(" · ")} · ${((Date.now() - t0) / 1000).toFixed(0)}s in all`,
|
|
755
|
+
"",
|
|
756
|
+
"Fix what each part names (the states and details briefs list their files), in that order, then palate states --verify and palate gate.",
|
|
757
|
+
"",
|
|
758
|
+
...parts.flatMap((p) => [`## ${p.name}`, p.out.trim(), ""]),
|
|
759
|
+
].join("\n"),
|
|
760
|
+
);
|
|
761
|
+
break;
|
|
762
|
+
}
|
|
763
|
+
case "animate": {
|
|
764
|
+
if (!args[0]) throw new Error("Usage: palate animate <route> [--check]");
|
|
765
|
+
const { animate } = await import("../src/loop/animate.mjs");
|
|
766
|
+
console.log(await animate(dir, args[0], { url: o.url, checkOnly: Boolean(o.check) }));
|
|
767
|
+
break;
|
|
768
|
+
}
|
|
769
|
+
case "point": {
|
|
770
|
+
const P = await import("../src/point/server.mjs");
|
|
771
|
+
const [sub, ...rest] = args;
|
|
772
|
+
if (sub === "next") {
|
|
773
|
+
console.error("Waiting for the user to point at something…");
|
|
774
|
+
let r = null;
|
|
775
|
+
while (!r) r = await P.nextRequest(dir, { wait: 55, agent: "cli" });
|
|
776
|
+
console.log(r.stopped ? "The user stopped point mode (Done in the overlay). Stop waiting for pins." : P.formatRequest(r, dir));
|
|
777
|
+
} else if (sub === "stop") {
|
|
778
|
+
await P.stopPointMode(dir);
|
|
779
|
+
console.log("Point mode stopped: the agent finishes the pins already sent, then its next call says so.");
|
|
780
|
+
} else if (sub === "done") {
|
|
781
|
+
if (!rest[0]) throw new Error('Usage: palate point done <id> "<one-line summary>" [--removed] [--override]');
|
|
782
|
+
const r = await P.doneRequest(dir, rest[0], rest.slice(1).join(" "), { removed: Boolean(o.removed), override: Boolean(o.override) });
|
|
783
|
+
const ow = r.other?.width ? r.other : null;
|
|
784
|
+
console.log(`Pin ${r.n} is done.${r.removed ? " Removed: the pin shows that instead of an after crop." : r.after ? ` Before: ${r.crop} After: ${r.after}` : " (no after crop: the element could not be shot)"}${ow ? `\nAt ${ow.width}: ${ow.after?.removed ? "removed" : `before ${ow.before?.crop ?? "(none)"} after ${ow.after?.crop ?? "(none)"}`}\n${ow.note ?? ""}${ow.overridden ? " Done anyway (--override)." : ""}` : ""}`);
|
|
785
|
+
} else if (sub === "crop") {
|
|
786
|
+
if (!rest[0]) throw new Error("Usage: palate point crop <id>");
|
|
787
|
+
const c = await P.cropRequest(dir, rest[0]);
|
|
788
|
+
const ow = c.other;
|
|
789
|
+
console.log(`${c.removed ? "Removed: the element is gone (as asked)." : `Now: ${c.file}${c.found === false ? " (selector not found; the region where it was)" : ""}`}${c.trail ? `
|
|
790
|
+
Opened by: ${c.trail}${c.reopen?.state === "couldn't reopen" ? `
|
|
791
|
+
Couldn't reopen it for this check: ${c.reopen.why}. Not a break; check the change in the code.` : " (reopened for the check)"}` : ""}
|
|
792
|
+
Before: ${c.before}${ow ? `\nAt ${ow.width}: now ${ow.after ?? "(none)"} before ${ow.before ?? "(none)"}\n${ow.note}${ow.verdict === "broke" ? `\nFix ${ow.width} before palate point done: it refuses while ${ow.width} is broken.` : ""}` : ""}`);
|
|
793
|
+
} else {
|
|
794
|
+
const s = await P.startPoint(dir, { url: o.url, route: sub ?? "/", open: !o["no-open"] });
|
|
795
|
+
const auto = o.auto || o.agent || o["agent-cmd"] ? await (await import("../src/point/auto.mjs")).runAuto(dir, { agent: o.agent ?? "claude", agentCmd: o["agent-cmd"], yolo: Boolean(o.yolo) }) : null;
|
|
796
|
+
const live = auto && !auto.missing;
|
|
797
|
+
console.log(
|
|
798
|
+
live
|
|
799
|
+
? `Point at anything in ${s.link} and send it: palate runs the agent on each pin by itself.${s.reused ? " (point was already running; this process only runs the agent)" : ""} (Ctrl+C stops)`
|
|
800
|
+
: s.reused
|
|
801
|
+
? `palate point is already running: ${s.link}`
|
|
802
|
+
: `Point at anything in ${s.link} to ask for a change. Your agent takes the pins: in Claude Code run /mcp__palate__point${auto?.missing ? "" : ", or start this with --auto"}. (Ctrl+C stops)`,
|
|
803
|
+
);
|
|
804
|
+
if (!s.reused || live) {
|
|
805
|
+
process.on("SIGINT", async () => {
|
|
806
|
+
await auto?.stop();
|
|
807
|
+
await s.stop();
|
|
808
|
+
process.exit(0);
|
|
809
|
+
});
|
|
810
|
+
await (s.reused ? auto.done : s.done);
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
break;
|
|
814
|
+
}
|
|
815
|
+
case "taste": {
|
|
816
|
+
const { taste } = await import("../src/loop/taste.mjs");
|
|
817
|
+
console.log(taste(args[0], { from: o.from, dir }));
|
|
818
|
+
break;
|
|
819
|
+
}
|
|
820
|
+
case "rule":
|
|
821
|
+
case "rules": {
|
|
822
|
+
const [sub = "list", ...rest] = args;
|
|
823
|
+
if (sub === "review") {
|
|
824
|
+
const { reviewRules } = await import("../src/loop/rulereview.mjs");
|
|
825
|
+
console.log(await reviewRules({ open: !o["no-open"] }));
|
|
826
|
+
break;
|
|
827
|
+
}
|
|
828
|
+
const { rule } = await import("../src/loop/fail.mjs");
|
|
829
|
+
console.log(rule(sub, o.all ? [...rest, "--all"] : rest, { kind: o.kind, source: o.source, only: o.only, route: o.route, scope: o.scope, text: o.text, project: o.project, dir }));
|
|
830
|
+
break;
|
|
831
|
+
}
|
|
832
|
+
case "fail": {
|
|
833
|
+
if (!args[0] || !args[1]) throw new Error('Usage: palate fail <route> "<why it is bad>" [--kind landing] [--shot a.png,b.png]');
|
|
834
|
+
const { fail } = await import("../src/loop/fail.mjs");
|
|
835
|
+
console.log(await fail(dir, args[0], args.slice(1).join(" "), { kind: o.kind, shots: o.shot != null ? o.shot.split(",").filter(Boolean) : undefined, url: o.url, project: o.project }));
|
|
836
|
+
break;
|
|
837
|
+
}
|
|
838
|
+
// ── palate moves: the moves library (src/moves.mjs) ──
|
|
839
|
+
case "moves": {
|
|
840
|
+
const M = await import("../src/moves.mjs");
|
|
841
|
+
if (args[0] === "show") {
|
|
842
|
+
if (!args[1]) throw new Error("Usage: palate moves show <id> [id...]");
|
|
843
|
+
console.log(args.slice(1).map(M.showMove).join("\n\n---\n\n"));
|
|
844
|
+
} else if (args[0] === "brief") {
|
|
845
|
+
if (!args[1]) throw new Error("Usage: palate moves brief <id,id,...>");
|
|
846
|
+
console.log(M.moveBrief(args.slice(1).join(",")));
|
|
847
|
+
} else {
|
|
848
|
+
const tags = [o.tags, ...args].filter(Boolean).join(",").split(",").map((t) => t.trim()).filter(Boolean);
|
|
849
|
+
const q = { tags, kind: o.kind, signature: o.signature ? true : undefined, limit: o.limit ? Number(o.limit) : tags.length ? 8 : 0 };
|
|
850
|
+
console.log(M.movesReport(M.matchMoves(q), q));
|
|
851
|
+
}
|
|
852
|
+
break;
|
|
853
|
+
}
|
|
854
|
+
// ── end palate moves ──
|
|
855
|
+
case "concept": {
|
|
856
|
+
const { conceptReport, recordConcept } = await import("../src/concept.mjs");
|
|
857
|
+
if (args[0] === "record") {
|
|
858
|
+
if (!args[1] || !o.moves) throw new Error('Usage: palate concept record "<screen>" --moves a,b,c');
|
|
859
|
+
console.log(recordConcept(dir, args.slice(1).join(" "), o.moves.split(",").map((m) => m.trim()).filter(Boolean)));
|
|
860
|
+
break;
|
|
861
|
+
}
|
|
862
|
+
if (!args.length) throw new Error('Usage: palate concept "<what you are building, in the user\'s words>"');
|
|
863
|
+
console.log(conceptReport(args.join(" "), { dir, count: o.count ? Number(o.count) : 3 }));
|
|
864
|
+
break;
|
|
865
|
+
}
|
|
866
|
+
case "catalog": {
|
|
867
|
+
const [sub, source] = args;
|
|
868
|
+
if (sub === "sync" && source === "vibrant") {
|
|
869
|
+
const { syncVibrant } = await import("../src/catalog/vibrant.mjs");
|
|
870
|
+
const { file, count } = await syncVibrant({ limit: o.limit ? Number(o.limit) : Infinity, refresh: Boolean(o.refresh) });
|
|
871
|
+
console.log(`Saved ${count} records to ${file}`);
|
|
872
|
+
} else if (sub === "index") {
|
|
873
|
+
const { buildIndex } = await import("../src/catalog/index-build.mjs");
|
|
874
|
+
const { file, count } = await buildIndex();
|
|
875
|
+
console.log(`Wrote ${count} records (facts and links only) to ${file}`);
|
|
876
|
+
} else if (sub === "stats") {
|
|
877
|
+
const { catalogStats } = await import("../src/refs.mjs");
|
|
878
|
+
console.log(catalogStats());
|
|
879
|
+
} else {
|
|
880
|
+
throw new Error("Usage: palate catalog sync vibrant [--limit n] | palate catalog stats");
|
|
881
|
+
}
|
|
882
|
+
break;
|
|
883
|
+
}
|
|
884
|
+
default:
|
|
885
|
+
console.log(HELP);
|
|
886
|
+
if (cmd) process.exitCode = 1;
|
|
887
|
+
}
|
|
888
|
+
} catch (err) {
|
|
889
|
+
console.error(String(err?.message ?? err));
|
|
890
|
+
process.exitCode = 1;
|
|
891
|
+
} finally {
|
|
892
|
+
// One browser and dev server served the whole command; close them (the MCP server keeps its own).
|
|
893
|
+
if (cmd !== "mcp") await closePool();
|
|
894
|
+
}
|