howone 0.1.19 → 0.1.22
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/package.json +1 -1
- package/templates/vite/.howone/skills/hallmark/LICENSE +21 -0
- package/templates/vite/.howone/skills/hallmark/README.md +147 -0
- package/templates/vite/.howone/skills/hallmark/ROADMAP.md +201 -0
- package/templates/vite/.howone/skills/hallmark/SKILL.md +551 -0
- package/templates/vite/.howone/skills/hallmark/docs/recipes.md +186 -0
- package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-anya.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-bananastudio.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-hyperlane.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-najm.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-slow-pour.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-soroe.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-tally.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-wayfare.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/docs/study-examples.md +176 -0
- package/templates/vite/.howone/skills/hallmark/docs/talk-slides.md +364 -0
- package/templates/vite/.howone/skills/hallmark/package.json +36 -0
- package/templates/vite/.howone/skills/hallmark/references/anti-patterns.md +412 -0
- package/templates/vite/.howone/skills/hallmark/references/assets.md +399 -0
- package/templates/vite/.howone/skills/hallmark/references/color.md +95 -0
- package/templates/vite/.howone/skills/hallmark/references/component-cookbook.md +256 -0
- package/templates/vite/.howone/skills/hallmark/references/components/c1-outlined-chip.md +12 -0
- package/templates/vite/.howone/skills/hallmark/references/components/c2-inline-form-as-cta.md +16 -0
- package/templates/vite/.howone/skills/hallmark/references/components/c3-typographic-link.md +8 -0
- package/templates/vite/.howone/skills/hallmark/references/components/c4-sticky-bottom-bar.md +16 -0
- package/templates/vite/.howone/skills/hallmark/references/components/f1-bento-grid.md +20 -0
- package/templates/vite/.howone/skills/hallmark/references/components/f2-sticky-scroll-stack.md +20 -0
- package/templates/vite/.howone/skills/hallmark/references/components/f3-tabular-spec-sheet.md +11 -0
- package/templates/vite/.howone/skills/hallmark/references/components/f4-step-sequence.md +11 -0
- package/templates/vite/.howone/skills/hallmark/references/components/f5-annotated-screenshot.md +11 -0
- package/templates/vite/.howone/skills/hallmark/references/components/f6-product-card-grid.md +41 -0
- package/templates/vite/.howone/skills/hallmark/references/components/ft1-mast-headed.md +13 -0
- package/templates/vite/.howone/skills/hallmark/references/components/ft2-inline-rule-single-line.md +10 -0
- package/templates/vite/.howone/skills/hallmark/references/components/ft3-index-style-category-list.md +12 -0
- package/templates/vite/.howone/skills/hallmark/references/components/ft4-dense-typographic.md +10 -0
- package/templates/vite/.howone/skills/hallmark/references/components/ft5-statement.md +21 -0
- package/templates/vite/.howone/skills/hallmark/references/components/ft6-letter-close.md +19 -0
- package/templates/vite/.howone/skills/hallmark/references/components/ft7-newsletter-first.md +27 -0
- package/templates/vite/.howone/skills/hallmark/references/components/ft8-marquee-scroll.md +25 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h1-marquee.md +15 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h2-split-diptych.md +15 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h3-quote-led.md +11 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h4-stat-led.md +14 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h5-letter-hero.md +11 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h6-photographic-fold.md +16 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +27 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h8-mockup-split-browser-framed.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +27 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n1-wordmark-2-links.md +12 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +19 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n2-floating-chip.md +14 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n3-side-rail.md +14 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n4-hidden-behind-k.md +9 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n5-floating-pill.md +28 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n6-newspaper-masthead.md +24 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n7-brutal-slab.md +22 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n8-terminal-command.md +21 -0
- package/templates/vite/.howone/skills/hallmark/references/components/n9-edge-aligned-minimal.md +17 -0
- package/templates/vite/.howone/skills/hallmark/references/components/s1-left-margin-numbered.md +15 -0
- package/templates/vite/.howone/skills/hallmark/references/components/s2-hanging.md +13 -0
- package/templates/vite/.howone/skills/hallmark/references/components/s3-sticky-pinned.md +19 -0
- package/templates/vite/.howone/skills/hallmark/references/components/s4-inline-no-break.md +11 -0
- package/templates/vite/.howone/skills/hallmark/references/components/s5-bottom-anchored.md +13 -0
- package/templates/vite/.howone/skills/hallmark/references/components/t1-pull-quote-with-marginalia.md +12 -0
- package/templates/vite/.howone/skills/hallmark/references/components/t2-logo-wall-hairline.md +19 -0
- package/templates/vite/.howone/skills/hallmark/references/components/t3-single-huge-quote.md +11 -0
- package/templates/vite/.howone/skills/hallmark/references/components/t4-numbered-stat-strip.md +14 -0
- package/templates/vite/.howone/skills/hallmark/references/contract.md +24 -0
- package/templates/vite/.howone/skills/hallmark/references/copy.md +182 -0
- package/templates/vite/.howone/skills/hallmark/references/custom-craft.md +626 -0
- package/templates/vite/.howone/skills/hallmark/references/custom-theme.md +329 -0
- package/templates/vite/.howone/skills/hallmark/references/design-md.md +116 -0
- package/templates/vite/.howone/skills/hallmark/references/export-formats.md +328 -0
- package/templates/vite/.howone/skills/hallmark/references/floating-nav.md +89 -0
- package/templates/vite/.howone/skills/hallmark/references/genres/atmospheric.md +65 -0
- package/templates/vite/.howone/skills/hallmark/references/genres/editorial.md +70 -0
- package/templates/vite/.howone/skills/hallmark/references/genres/modern-minimal.md +67 -0
- package/templates/vite/.howone/skills/hallmark/references/genres/playful.md +65 -0
- package/templates/vite/.howone/skills/hallmark/references/hero-enrichment.md +474 -0
- package/templates/vite/.howone/skills/hallmark/references/imagery-kit.md +170 -0
- package/templates/vite/.howone/skills/hallmark/references/interaction-and-states.md +207 -0
- package/templates/vite/.howone/skills/hallmark/references/layout-and-space.md +111 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/01-bento-grid.md +35 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/02-long-document.md +34 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/03-marquee-hero.md +31 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/04-stat-led.md +32 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/05-workbench.md +32 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/06-conversational-faq.md +33 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/07-manifesto.md +32 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/08-photographic.md +34 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/09-quote-led.md +32 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/10-specimen.md +32 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/11-catalogue.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/12-letter.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/13-index-first.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/14-narrative-workflow.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/15-split-studio.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/16-feature-stack.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/17-type-specimen.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/18-portfolio-grid.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/19-map-diagram.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/20-ecosystem-index.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures/21-component-playground.md +23 -0
- package/templates/vite/.howone/skills/hallmark/references/macrostructures.md +89 -0
- package/templates/vite/.howone/skills/hallmark/references/microinteractions.md +260 -0
- package/templates/vite/.howone/skills/hallmark/references/motion.md +109 -0
- package/templates/vite/.howone/skills/hallmark/references/preview-examples.md +49 -0
- package/templates/vite/.howone/skills/hallmark/references/responsive.md +138 -0
- package/templates/vite/.howone/skills/hallmark/references/slop-test.md +205 -0
- package/templates/vite/.howone/skills/hallmark/references/structure.md +164 -0
- package/templates/vite/.howone/skills/hallmark/references/study.md +486 -0
- package/templates/vite/.howone/skills/hallmark/references/typography.md +243 -0
- package/templates/vite/.howone/skills/hallmark/references/verbs/audit.md +25 -0
- package/templates/vite/.howone/skills/hallmark/references/verbs/redesign.md +269 -0
- package/templates/vite/.howone/skills/hallmark/site/OG-hallmark.png +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/brief.md +71 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/index.html +64 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/style.css +240 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/brief.md +65 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/index.html +105 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/style.css +250 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/brief.md +64 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/index.html +131 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/style.css +240 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/brief.md +67 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/index.html +86 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/style.css +262 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/brief.md +63 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/index.html +167 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/style.css +457 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/brief.md +65 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/index.html +159 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/style.css +288 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/brief.md +64 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/index.html +146 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/style.css +484 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/brief.md +64 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/index.html +116 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/style.css +354 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/09-slow-pour/index.html +638 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/10-owl-hours/index.html +515 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/11-soroe-ceramics/index.html +515 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/12-loafer/index.html +608 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/13-alma/index.html +587 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/README.md +157 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-still.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-example.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-still.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-still.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Podcast-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-still.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-still.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/after-quiet-hour.png +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-still.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/audit-example.png +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/before-quiet-hour.png +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/example-redesign-uractivation.png +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-still.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/study-example.png +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/uractivation-after-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-loop.mp4 +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-still.jpg +0 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/index.html +77 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/style.css +238 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/index.html +110 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/style.css +326 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/index.html +134 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/style.css +262 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/custom/README.md +30 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/README.md +17 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/audit-report.md +56 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/input.html +160 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/notes.md +29 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/input.html +63 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/notes.md +72 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/output.html +374 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/diagnosis.md +52 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/input-description.md +29 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/notes.md +61 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.css +193 -0
- package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.html +66 -0
- package/templates/vite/.howone/skills/hallmark/site/css/base.css +194 -0
- package/templates/vite/.howone/skills/hallmark/site/css/components.css +4886 -0
- package/templates/vite/.howone/skills/hallmark/site/css/sections.css +2072 -0
- package/templates/vite/.howone/skills/hallmark/site/css/tokens.css +1129 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/index.html +475 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/styles.css +1584 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/tokens.css +96 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/index.html +344 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/script.js +103 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/styles.css +1103 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/tokens.css +83 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/najm/index.html +368 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/najm/script.js +133 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/najm/styles.css +1062 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/najm/tokens.css +97 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/tally/app.js +84 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/tally/index.html +446 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/tally/styles.css +1087 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/tally/tokens.css +101 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/index.html +359 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/style.css +1168 -0
- package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/tokens.css +81 -0
- package/templates/vite/.howone/skills/hallmark/site/favicon-dark.svg +5 -0
- package/templates/vite/.howone/skills/hallmark/site/favicon-light.svg +5 -0
- package/templates/vite/.howone/skills/hallmark/site/index.html +1043 -0
- package/templates/vite/.howone/skills/hallmark/site/js/main.js +1175 -0
- package/templates/vite/.howone/skills/hallmark/vercel.json +6 -0
- package/templates/vite/.howone/skills/howone-sdk/01-architect/01-app-generation.md +101 -0
- package/templates/vite/.howone/skills/howone-sdk/02-database/01-schema-design.md +147 -0
- package/templates/vite/.howone/skills/howone-sdk/02-database/02-schema-operations.md +96 -0
- package/templates/vite/.howone/skills/howone-sdk/02-database/03-data-access-patterns.md +172 -0
- package/templates/vite/.howone/skills/howone-sdk/{references → 03-sdk}/01-client-setup.md +3 -3
- package/templates/vite/.howone/skills/howone-sdk/{references/04-auth.md → 03-sdk/03-auth.md} +120 -3
- package/templates/vite/.howone/skills/howone-sdk/04-ai/.gitkeep +1 -0
- package/templates/vite/.howone/skills/howone-sdk/SKILL.md +67 -93
- package/templates/vite/.howone/skills/howone-sdk/agents/openai.yaml +3 -3
- package/templates/vite/.howone/skills/impeccable/SKILL.md +168 -0
- package/templates/vite/.howone/skills/impeccable/agents/impeccable-asset-producer.md +101 -0
- package/templates/vite/.howone/skills/impeccable/reference/adapt.md +190 -0
- package/templates/vite/.howone/skills/impeccable/reference/animate.md +175 -0
- package/templates/vite/.howone/skills/impeccable/reference/audit.md +133 -0
- package/templates/vite/.howone/skills/impeccable/reference/bolder.md +113 -0
- package/templates/vite/.howone/skills/impeccable/reference/brand.md +118 -0
- package/templates/vite/.howone/skills/impeccable/reference/clarify.md +174 -0
- package/templates/vite/.howone/skills/impeccable/reference/codex.md +105 -0
- package/templates/vite/.howone/skills/impeccable/reference/cognitive-load.md +106 -0
- package/templates/vite/.howone/skills/impeccable/reference/color-and-contrast.md +105 -0
- package/templates/vite/.howone/skills/impeccable/reference/colorize.md +154 -0
- package/templates/vite/.howone/skills/impeccable/reference/craft.md +123 -0
- package/templates/vite/.howone/skills/impeccable/reference/critique.md +273 -0
- package/templates/vite/.howone/skills/impeccable/reference/delight.md +302 -0
- package/templates/vite/.howone/skills/impeccable/reference/distill.md +111 -0
- package/templates/vite/.howone/skills/impeccable/reference/document.md +427 -0
- package/templates/vite/.howone/skills/impeccable/reference/extract.md +69 -0
- package/templates/vite/.howone/skills/impeccable/reference/harden.md +347 -0
- package/templates/vite/.howone/skills/impeccable/reference/heuristics-scoring.md +234 -0
- package/templates/vite/.howone/skills/impeccable/reference/interaction-design.md +195 -0
- package/templates/vite/.howone/skills/impeccable/reference/layout.md +141 -0
- package/templates/vite/.howone/skills/impeccable/reference/live.md +622 -0
- package/templates/vite/.howone/skills/impeccable/reference/motion-design.md +109 -0
- package/templates/vite/.howone/skills/impeccable/reference/onboard.md +234 -0
- package/templates/vite/.howone/skills/impeccable/reference/optimize.md +258 -0
- package/templates/vite/.howone/skills/impeccable/reference/overdrive.md +130 -0
- package/templates/vite/.howone/skills/impeccable/reference/personas.md +179 -0
- package/templates/vite/.howone/skills/impeccable/reference/polish.md +242 -0
- package/templates/vite/.howone/skills/impeccable/reference/product.md +62 -0
- package/templates/vite/.howone/skills/impeccable/reference/quieter.md +99 -0
- package/templates/vite/.howone/skills/impeccable/reference/responsive-design.md +114 -0
- package/templates/vite/.howone/skills/impeccable/reference/shape.md +165 -0
- package/templates/vite/.howone/skills/impeccable/reference/spatial-design.md +100 -0
- package/templates/vite/.howone/skills/impeccable/reference/teach.md +156 -0
- package/templates/vite/.howone/skills/impeccable/reference/typeset.md +124 -0
- package/templates/vite/.howone/skills/impeccable/reference/typography.md +159 -0
- package/templates/vite/.howone/skills/impeccable/reference/ux-writing.md +107 -0
- package/templates/vite/.howone/skills/impeccable/scripts/cleanup-deprecated.mjs +284 -0
- package/templates/vite/.howone/skills/impeccable/scripts/command-metadata.json +94 -0
- package/templates/vite/.howone/skills/impeccable/scripts/critique-storage.mjs +242 -0
- package/templates/vite/.howone/skills/impeccable/scripts/design-parser.mjs +820 -0
- package/templates/vite/.howone/skills/impeccable/scripts/detect-csp.mjs +198 -0
- package/templates/vite/.howone/skills/impeccable/scripts/detect.mjs +21 -0
- package/templates/vite/.howone/skills/impeccable/scripts/impeccable-paths.mjs +110 -0
- package/templates/vite/.howone/skills/impeccable/scripts/is-generated.mjs +69 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-accept.mjs +595 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-browser-session.js +123 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-browser.js +4860 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-complete.mjs +75 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-completion.mjs +18 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-inject.mjs +446 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-poll.mjs +200 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-resume.mjs +48 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-server.mjs +838 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-session-store.mjs +254 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-status.mjs +47 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live-wrap.mjs +632 -0
- package/templates/vite/.howone/skills/impeccable/scripts/live.mjs +247 -0
- package/templates/vite/.howone/skills/impeccable/scripts/load-context.mjs +141 -0
- package/templates/vite/.howone/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/templates/vite/.howone/skills/impeccable/scripts/pin.mjs +214 -0
- package/templates/vite/AGENTS.md +2 -3
- package/templates/vite/package.json +1 -1
- /package/templates/vite/.howone/skills/howone-sdk/{references/08-manifest-codegen.md → 01-architect/02-manifest-codegen.md} +0 -0
- /package/templates/vite/.howone/skills/howone-sdk/{references → 03-sdk}/02-entity-operations.md +0 -0
- /package/templates/vite/.howone/skills/howone-sdk/{references/06-react-integration.md → 03-sdk/04-react-integration.md} +0 -0
- /package/templates/vite/.howone/skills/howone-sdk/{references → 03-sdk}/05-file-upload.md +0 -0
- /package/templates/vite/.howone/skills/howone-sdk/{references/07-raw-http.md → 03-sdk/06-raw-http.md} +0 -0
- /package/templates/vite/.howone/skills/howone-sdk/{references/03-ai-actions.md → 03-sdk/07-ai-action-calls.md} +0 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# App Generation Architect
|
|
2
|
+
|
|
3
|
+
Use this file to decide the HowOne app implementation path before reading low-level SDK or
|
|
4
|
+
database references.
|
|
5
|
+
|
|
6
|
+
## Responsibility Split
|
|
7
|
+
|
|
8
|
+
HowOne generated apps have three layers:
|
|
9
|
+
|
|
10
|
+
1. **Backend contract**: dynamic entities, access rules, indexes, schema versions, and synced
|
|
11
|
+
manifests.
|
|
12
|
+
2. **SDK binding**: `src/lib/sdk.ts` converts manifests into typed entity and AI clients.
|
|
13
|
+
3. **Frontend experience**: React/UI code calls the SDK and owns app-specific interaction design.
|
|
14
|
+
|
|
15
|
+
Do not skip the binding layer. The UI should call `src/lib/sdk.ts`, not raw entity names guessed
|
|
16
|
+
from the user prompt.
|
|
17
|
+
|
|
18
|
+
Core source-of-truth rule from the HowOne docs:
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
agent proposal != source of truth
|
|
22
|
+
validated backend manifest = source of truth
|
|
23
|
+
generated files = compiler/binding output
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The agent proposes structured changes and writes app code. The runtime/schema tools validate,
|
|
27
|
+
apply, version, and sync manifest facts.
|
|
28
|
+
|
|
29
|
+
## Choose Data Posture First
|
|
30
|
+
|
|
31
|
+
Before designing schema or UI calls, classify the data:
|
|
32
|
+
|
|
33
|
+
| Posture | Backend Access | Frontend Read |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| Private user data | `authenticated: own`, `public: none` | `howone.entities.Entity.query.mine(...)` |
|
|
36
|
+
| Authenticated shared app data | `authenticated: all`, `public: none` | `howone.entities.Entity.query(...)` |
|
|
37
|
+
| Public list data | `authenticated: all`, `public: list` | `howone.public.entities.Entity.query(...)` |
|
|
38
|
+
| Public scoped share data | usually `authenticated: own`, `public: scoped` | `howone.public.entities.Entity.queryScoped(...)` |
|
|
39
|
+
|
|
40
|
+
If the user says "my todos", "my notes", "per user", "login required", or "data isolation",
|
|
41
|
+
default to private user data.
|
|
42
|
+
|
|
43
|
+
## Backend Feature Workflow
|
|
44
|
+
|
|
45
|
+
When a request adds persistence or changes data shape:
|
|
46
|
+
|
|
47
|
+
1. Read `02-database/01-schema-design.md` and `02-database/02-schema-operations.md`.
|
|
48
|
+
2. Inspect the current schema/manifest.
|
|
49
|
+
3. Design one complete schema patch for the feature.
|
|
50
|
+
4. Preview the schema patch.
|
|
51
|
+
5. Apply the exact previewed operations if risk is acceptable.
|
|
52
|
+
6. Sync schema artifacts using the returned `next.versionId`.
|
|
53
|
+
7. Read `.howone/database/manifest.json`.
|
|
54
|
+
8. Read `01-architect/02-manifest-codegen.md`.
|
|
55
|
+
9. Update `src/lib/sdk.ts`.
|
|
56
|
+
10. Read the needed SDK file, usually `03-sdk/02-entity-operations.md` and sometimes `03-sdk/03-auth.md`.
|
|
57
|
+
11. Update the UI.
|
|
58
|
+
12. Validate.
|
|
59
|
+
|
|
60
|
+
Do not preview a patch and then execute different single operations. Related schema changes for
|
|
61
|
+
one feature should be grouped into one preview/apply cycle.
|
|
62
|
+
|
|
63
|
+
## Auth Decision
|
|
64
|
+
|
|
65
|
+
Use hosted auth when the app just needs login:
|
|
66
|
+
|
|
67
|
+
```tsx
|
|
68
|
+
<HowOneProvider auth="required">
|
|
69
|
+
<App />
|
|
70
|
+
</HowOneProvider>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Use custom in-app auth when the user asks for a designed login page or multiple login methods:
|
|
74
|
+
|
|
75
|
+
```tsx
|
|
76
|
+
<HowOneProvider auth="none" brand="hidden">
|
|
77
|
+
<App />
|
|
78
|
+
</HowOneProvider>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Custom login must call `howone.auth.setToken(token)` after Email OTP, Phone OTP, Google, or
|
|
82
|
+
GitHub succeeds, then verify the session with `await howone.me({ refresh: true })`.
|
|
83
|
+
|
|
84
|
+
## Generated Binding Rules
|
|
85
|
+
|
|
86
|
+
- Read manifests after sync, not before.
|
|
87
|
+
- Preserve existing bindings unless the manifest changed.
|
|
88
|
+
- Export explicit `Record`, `Create`, and `Update` types.
|
|
89
|
+
- Do not include system fields in create/update payloads.
|
|
90
|
+
- Do not infer public access from `visibility` alone; inspect `access.public`.
|
|
91
|
+
|
|
92
|
+
## Common Failure Modes
|
|
93
|
+
|
|
94
|
+
- Repeated login after refresh: app used `auth.isAuthenticated()` as first-load truth or stored
|
|
95
|
+
token outside SDK. Read `03-sdk/03-auth.md`.
|
|
96
|
+
- Data is not isolated: app used `query()` instead of `query.mine()` for `authenticated.read =
|
|
97
|
+
"own"`, or wrote owner fields manually.
|
|
98
|
+
- Public page 401/403: app used authenticated namespace for public content or schema does not
|
|
99
|
+
allow public access.
|
|
100
|
+
- Generated types drift from backend: app edited `src/lib/sdk.ts` from memory instead of synced
|
|
101
|
+
manifest.
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Database Architecture Design
|
|
2
|
+
|
|
3
|
+
Use this reference when designing or changing HowOne backend entity schemas. It summarizes
|
|
4
|
+
the contract in `docs/dynamic-entity-architecture.zh.md` for app-building agents.
|
|
5
|
+
|
|
6
|
+
This reference is for **backend entity design**. For schema tool flow, read
|
|
7
|
+
`02-database/02-schema-operations.md`. For frontend read/write calls, read
|
|
8
|
+
`02-database/03-data-access-patterns.md` and `03-sdk/02-entity-operations.md` after schema
|
|
9
|
+
artifacts have been synced.
|
|
10
|
+
|
|
11
|
+
## Core Model
|
|
12
|
+
|
|
13
|
+
An entity is a versioned database contract, not a loose JSON form. Design all relevant parts:
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
type EntityContract = {
|
|
17
|
+
name: string
|
|
18
|
+
type: 'object'
|
|
19
|
+
description?: string
|
|
20
|
+
visibility: 'private' | 'public'
|
|
21
|
+
properties: Record<string, EntityField>
|
|
22
|
+
required?: string[]
|
|
23
|
+
access: {
|
|
24
|
+
authenticated?: AuthenticatedAccess
|
|
25
|
+
public?: PublicAccess
|
|
26
|
+
}
|
|
27
|
+
indexes?: EntityIndex[]
|
|
28
|
+
relations?: Record<string, EntityRelation>
|
|
29
|
+
presentation?: EntityPresentation
|
|
30
|
+
lifecycle?: EntityLifecycle
|
|
31
|
+
performance?: EntityPerformance
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Every schema change should preserve this mental split:
|
|
36
|
+
|
|
37
|
+
- `properties` and `required` define payload validation.
|
|
38
|
+
- `access` defines who can read/write and how ownership is derived.
|
|
39
|
+
- `indexes` and `performance` define expected query paths.
|
|
40
|
+
- `relations` defines valid `include` names.
|
|
41
|
+
- `presentation` helps admin UI and SDK generation.
|
|
42
|
+
- schema versions track the contract applied when future records are written.
|
|
43
|
+
|
|
44
|
+
## Access Contract
|
|
45
|
+
|
|
46
|
+
Every entity should explicitly define both authenticated and public access. Choose the data posture
|
|
47
|
+
in `02-database/03-data-access-patterns.md`, then encode it in the `access` block here.
|
|
48
|
+
|
|
49
|
+
## Field Design Rules
|
|
50
|
+
|
|
51
|
+
- Entity and field names must match `^[a-zA-Z_][a-zA-Z0-9_]*$`.
|
|
52
|
+
- Do not define system fields as business fields: `id`, `_id`, `created_date`, `updated_date`,
|
|
53
|
+
`created_by_id`, `schema_version_id`, `schema_version_number`, `is_sample`.
|
|
54
|
+
- Required fields must be supplied on create unless the field has `default`, `defaultValue`, or
|
|
55
|
+
`autoGenerate`.
|
|
56
|
+
- Use explicit enum fields for UI status values instead of free-form strings when choices are known.
|
|
57
|
+
- Use ISO strings for date/datetime fields at the SDK boundary.
|
|
58
|
+
- Complex JSON Schema validation may need frontend validation too; do not assume every nested
|
|
59
|
+
constraint is fully enforced by backend runtime.
|
|
60
|
+
|
|
61
|
+
## Index and Performance Rules
|
|
62
|
+
|
|
63
|
+
Add indexes for the query paths the UI will actually use:
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"indexes": [
|
|
68
|
+
{
|
|
69
|
+
"name": "owner_status_updated",
|
|
70
|
+
"fields": ["status", "updatedDate"],
|
|
71
|
+
"scope": "owner",
|
|
72
|
+
"order": { "updatedDate": "desc" }
|
|
73
|
+
}
|
|
74
|
+
],
|
|
75
|
+
"performance": {
|
|
76
|
+
"defaultLimit": 20,
|
|
77
|
+
"maxLimit": 100,
|
|
78
|
+
"allowedSorts": ["createdDate", "updatedDate"]
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Guidelines:
|
|
84
|
+
|
|
85
|
+
- Private user lists usually need owner-scoped indexes.
|
|
86
|
+
- Public list pages need `access.public.allowedFilters` and `access.public.allowedSorts`.
|
|
87
|
+
- `performance.allowedSorts` informs SDK/admin generation; public sort enforcement comes from
|
|
88
|
+
`access.public.allowedSorts`.
|
|
89
|
+
|
|
90
|
+
## Todo Example
|
|
91
|
+
|
|
92
|
+
For a personal Todo app:
|
|
93
|
+
|
|
94
|
+
```json
|
|
95
|
+
{
|
|
96
|
+
"name": "Todo",
|
|
97
|
+
"type": "object",
|
|
98
|
+
"description": "User-owned todo item",
|
|
99
|
+
"visibility": "private",
|
|
100
|
+
"properties": {
|
|
101
|
+
"text": { "type": "string" },
|
|
102
|
+
"completed": { "type": "boolean", "default": false }
|
|
103
|
+
},
|
|
104
|
+
"required": ["text"],
|
|
105
|
+
"access": {
|
|
106
|
+
"authenticated": {
|
|
107
|
+
"read": "own",
|
|
108
|
+
"create": "own",
|
|
109
|
+
"update": "own",
|
|
110
|
+
"delete": "own"
|
|
111
|
+
},
|
|
112
|
+
"public": {
|
|
113
|
+
"read": "none",
|
|
114
|
+
"create": "none",
|
|
115
|
+
"update": "none",
|
|
116
|
+
"delete": "none"
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"indexes": [
|
|
120
|
+
{
|
|
121
|
+
"name": "owner_updated",
|
|
122
|
+
"fields": ["updatedDate"],
|
|
123
|
+
"scope": "owner",
|
|
124
|
+
"order": { "updatedDate": "desc" }
|
|
125
|
+
}
|
|
126
|
+
],
|
|
127
|
+
"performance": {
|
|
128
|
+
"defaultLimit": 50,
|
|
129
|
+
"maxLimit": 100,
|
|
130
|
+
"allowedSorts": ["createdDate", "updatedDate"]
|
|
131
|
+
},
|
|
132
|
+
"presentation": {
|
|
133
|
+
"titleField": "text",
|
|
134
|
+
"defaultSort": { "field": "updatedDate", "order": "desc" },
|
|
135
|
+
"listFields": ["text", "completed", "updatedDate"]
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Corresponding frontend read:
|
|
141
|
+
|
|
142
|
+
```ts
|
|
143
|
+
const result = await howone.entities.Todo.query.mine({
|
|
144
|
+
page: { number: 1, size: 50 },
|
|
145
|
+
orderBy: { updatedDate: 'desc' },
|
|
146
|
+
})
|
|
147
|
+
```
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Schema Operations
|
|
2
|
+
|
|
3
|
+
Use this reference when applying backend entity schema changes through HowOne runtime tools.
|
|
4
|
+
|
|
5
|
+
## Source Of Truth
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
agent proposal != source of truth
|
|
9
|
+
validated backend manifest = source of truth
|
|
10
|
+
synced .howone/database files = local copy of a backend version
|
|
11
|
+
src/lib/sdk.ts = app binding generated from synced manifest
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Do not hand-write `.howone/database` files. Sync them from a concrete backend schema version.
|
|
15
|
+
|
|
16
|
+
## Preferred Patch Flow
|
|
17
|
+
|
|
18
|
+
For feature-level schema work:
|
|
19
|
+
|
|
20
|
+
1. Inspect current schema definitions or schema state.
|
|
21
|
+
2. Design one complete patch containing all related operations.
|
|
22
|
+
3. Preview the patch.
|
|
23
|
+
4. Apply the exact same operations if risk is acceptable.
|
|
24
|
+
5. Sync schema artifacts using the returned `next.versionId`.
|
|
25
|
+
6. Read `.howone/database/manifest.json`.
|
|
26
|
+
7. Update `src/lib/sdk.ts` from the manifest.
|
|
27
|
+
8. Update frontend calls according to access.
|
|
28
|
+
9. Validate.
|
|
29
|
+
|
|
30
|
+
Do not preview a patch and then apply a different set of single operations.
|
|
31
|
+
|
|
32
|
+
## Operation Types
|
|
33
|
+
|
|
34
|
+
Supported schema operations:
|
|
35
|
+
|
|
36
|
+
| Type | Purpose |
|
|
37
|
+
|---|---|
|
|
38
|
+
| `list_entities` | List current entity definitions. |
|
|
39
|
+
| `get_entity` | Read one entity definition before modifying it. |
|
|
40
|
+
| `create_entity` | Create a new entity contract. |
|
|
41
|
+
| `update_entity` | Update entity metadata such as description, visibility, access, indexes, relations, presentation, lifecycle, performance. |
|
|
42
|
+
| `delete_entity` | Soft or hard delete an entity definition. |
|
|
43
|
+
| `add_field` | Add a new field. |
|
|
44
|
+
| `update_field` | Patch an existing field definition. |
|
|
45
|
+
| `delete_field` | Remove a field from schema, optionally from historical data. |
|
|
46
|
+
| `set_field_required` | Add a field to top-level `required`. |
|
|
47
|
+
| `unset_field_required` | Remove a field from top-level `required`. |
|
|
48
|
+
|
|
49
|
+
## Payload Rules
|
|
50
|
+
|
|
51
|
+
- `entityName` is required for every operation except `list_entities`.
|
|
52
|
+
- `payload.properties` is required for `create_entity`.
|
|
53
|
+
- `payload.required` must only contain fields that exist in `properties`.
|
|
54
|
+
- `add_field` should use `{ fieldName, field, required }`.
|
|
55
|
+
- `update_field` should use `{ fieldName, patch, required? }`.
|
|
56
|
+
- `delete_field` should use `{ fieldName, removeFromData: false }` by default.
|
|
57
|
+
- `required` belongs to the entity top level, not inside individual field definitions.
|
|
58
|
+
|
|
59
|
+
## Risk Guardrails
|
|
60
|
+
|
|
61
|
+
- Default entity deletion to soft delete.
|
|
62
|
+
- Use hard delete only when the user explicitly asks.
|
|
63
|
+
- Use `deleteData: true` only when the user explicitly asks to delete all records too.
|
|
64
|
+
- Use `removeFromData: true` only after explicit confirmation.
|
|
65
|
+
- Adding a required field to an existing entity should include a default when possible.
|
|
66
|
+
- Changing a field type is high risk; inspect current schema and confirm intent before applying.
|
|
67
|
+
- Schema restore creates a new restore version; it does not roll business data back.
|
|
68
|
+
|
|
69
|
+
## Version Rules
|
|
70
|
+
|
|
71
|
+
Schema versions manage entity definitions only. They do not roll back `entitydatashares`.
|
|
72
|
+
|
|
73
|
+
After apply, use the returned version context:
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"next": {
|
|
78
|
+
"recommendedAction": "sync_schema_artifacts",
|
|
79
|
+
"versionId": "dbv_next"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
The synced manifest must be read before updating SDK bindings.
|
|
85
|
+
|
|
86
|
+
## Narrow Edit Flow
|
|
87
|
+
|
|
88
|
+
Single operations are acceptable for small explicit edits, such as "add priority to Todo":
|
|
89
|
+
|
|
90
|
+
1. `get_entity`
|
|
91
|
+
2. Check whether field already exists.
|
|
92
|
+
3. Preview/apply one `add_field` patch or use the schema operation fallback.
|
|
93
|
+
4. Sync artifacts.
|
|
94
|
+
5. Update SDK/UI.
|
|
95
|
+
|
|
96
|
+
For broader features, batch operations into one patch.
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# Data Access Patterns
|
|
2
|
+
|
|
3
|
+
Use this reference to connect backend `access` design to frontend SDK calls.
|
|
4
|
+
|
|
5
|
+
## Private Per-User Data
|
|
6
|
+
|
|
7
|
+
Use for todos, notes, journals, saved generations, personal files, dashboards, and user-owned
|
|
8
|
+
settings.
|
|
9
|
+
|
|
10
|
+
Schema posture:
|
|
11
|
+
|
|
12
|
+
```json
|
|
13
|
+
{
|
|
14
|
+
"visibility": "private",
|
|
15
|
+
"access": {
|
|
16
|
+
"authenticated": {
|
|
17
|
+
"read": "own",
|
|
18
|
+
"create": "own",
|
|
19
|
+
"update": "own",
|
|
20
|
+
"delete": "own"
|
|
21
|
+
},
|
|
22
|
+
"public": {
|
|
23
|
+
"read": "none",
|
|
24
|
+
"create": "none",
|
|
25
|
+
"update": "none",
|
|
26
|
+
"delete": "none"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Frontend calls:
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
const result = await howone.entities.Todo.query.mine({
|
|
36
|
+
page: { number: 1, size: 50 },
|
|
37
|
+
orderBy: { updatedDate: 'desc' },
|
|
38
|
+
})
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Rules:
|
|
42
|
+
|
|
43
|
+
- Use `query.mine(...)` for list pages.
|
|
44
|
+
- Use authenticated `create/update/delete`.
|
|
45
|
+
- Do not pass owner fields such as `ownerId`, `created_by_id`, `createdById`,
|
|
46
|
+
`created_by_user_id`, or `puid`.
|
|
47
|
+
|
|
48
|
+
## Authenticated Shared Data
|
|
49
|
+
|
|
50
|
+
Use when logged-in users in the app should see shared records.
|
|
51
|
+
|
|
52
|
+
Schema posture:
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"visibility": "private",
|
|
57
|
+
"access": {
|
|
58
|
+
"authenticated": {
|
|
59
|
+
"read": "all",
|
|
60
|
+
"create": "all",
|
|
61
|
+
"update": "all",
|
|
62
|
+
"delete": "all"
|
|
63
|
+
},
|
|
64
|
+
"public": {
|
|
65
|
+
"read": "none",
|
|
66
|
+
"create": "none",
|
|
67
|
+
"update": "none",
|
|
68
|
+
"delete": "none"
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Frontend calls:
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
const result = await howone.entities.Project.query({
|
|
78
|
+
page: { number: 1, size: 20 },
|
|
79
|
+
orderBy: { updatedDate: 'desc' },
|
|
80
|
+
})
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Use `query(...)`, not `query.mine(...)`.
|
|
84
|
+
|
|
85
|
+
## Public Read-Only Content
|
|
86
|
+
|
|
87
|
+
Use for public articles, templates, catalogs, profiles, or landing-page content.
|
|
88
|
+
|
|
89
|
+
Schema posture:
|
|
90
|
+
|
|
91
|
+
```json
|
|
92
|
+
{
|
|
93
|
+
"visibility": "public",
|
|
94
|
+
"access": {
|
|
95
|
+
"authenticated": {
|
|
96
|
+
"read": "all",
|
|
97
|
+
"create": "all",
|
|
98
|
+
"update": "all",
|
|
99
|
+
"delete": "all"
|
|
100
|
+
},
|
|
101
|
+
"public": {
|
|
102
|
+
"read": "list",
|
|
103
|
+
"create": "none",
|
|
104
|
+
"update": "none",
|
|
105
|
+
"delete": "none",
|
|
106
|
+
"allowedFilters": ["slug", "status", "category"],
|
|
107
|
+
"allowedSorts": ["publishedAt", "updatedDate"],
|
|
108
|
+
"defaultLimit": 20,
|
|
109
|
+
"maxLimit": 100
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Frontend calls:
|
|
116
|
+
|
|
117
|
+
```ts
|
|
118
|
+
const result = await howone.public.entities.Article.query({
|
|
119
|
+
where: { status: 'published' },
|
|
120
|
+
page: { number: 1, size: 20 },
|
|
121
|
+
orderBy: { publishedAt: 'desc' },
|
|
122
|
+
})
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Public query types should expose only allowed filters and allowed sorts.
|
|
126
|
+
|
|
127
|
+
## Public Scoped Share Pages
|
|
128
|
+
|
|
129
|
+
Use for public URLs that expose one owner-scoped record, such as QR pages or profile pages.
|
|
130
|
+
|
|
131
|
+
Schema posture:
|
|
132
|
+
|
|
133
|
+
```json
|
|
134
|
+
{
|
|
135
|
+
"visibility": "public",
|
|
136
|
+
"access": {
|
|
137
|
+
"authenticated": {
|
|
138
|
+
"read": "own",
|
|
139
|
+
"create": "own",
|
|
140
|
+
"update": "own",
|
|
141
|
+
"delete": "own"
|
|
142
|
+
},
|
|
143
|
+
"public": {
|
|
144
|
+
"read": "scoped",
|
|
145
|
+
"create": "none",
|
|
146
|
+
"update": "none",
|
|
147
|
+
"delete": "none",
|
|
148
|
+
"requiredScopes": ["ownerId", "slug"],
|
|
149
|
+
"allowedFilters": ["slug", "active"],
|
|
150
|
+
"allowedSorts": ["updatedDate"],
|
|
151
|
+
"defaultLimit": 1,
|
|
152
|
+
"maxLimit": 10
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Frontend calls:
|
|
159
|
+
|
|
160
|
+
```ts
|
|
161
|
+
const result = await howone.public.entities.QrProfile.queryScoped({
|
|
162
|
+
where: { ownerId, slug, active: true },
|
|
163
|
+
page: { number: 1, size: 1 },
|
|
164
|
+
})
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Rules:
|
|
168
|
+
|
|
169
|
+
- Pass every `requiredScopes` field.
|
|
170
|
+
- Do not use current user's `puid` as public owner scope unless schema explicitly stores that
|
|
171
|
+
value as the public scope.
|
|
172
|
+
- Public scoped reads must stay inside `howone.public.entities.*`.
|
|
@@ -86,7 +86,7 @@ client.schema.restore(versionId, reason?)
|
|
|
86
86
|
// AI action runner (low-level)
|
|
87
87
|
client.ai: AiClient
|
|
88
88
|
|
|
89
|
-
// HTTP utilities (low-level — see
|
|
89
|
+
// HTTP utilities (low-level — see 03-sdk/06-raw-http.md)
|
|
90
90
|
client.raw: RawHttpClient
|
|
91
91
|
|
|
92
92
|
// File upload
|
|
@@ -134,7 +134,7 @@ const client = createClient({
|
|
|
134
134
|
})
|
|
135
135
|
|
|
136
136
|
// ── 2. Define entity types & bind ────────────────────────────
|
|
137
|
-
// (see 02-entity-operations.md for full details)
|
|
137
|
+
// (see 03-sdk/02-entity-operations.md for full details)
|
|
138
138
|
export type NoteRecord = EntityRecord & { title: string; body: string }
|
|
139
139
|
export type NoteCreate = { title: string; body: string }
|
|
140
140
|
export type NoteUpdate = Partial<NoteCreate>
|
|
@@ -144,7 +144,7 @@ export const entities = defineEntities({
|
|
|
144
144
|
})
|
|
145
145
|
|
|
146
146
|
// ── 3. Define AI actions ─────────────────────────────────────
|
|
147
|
-
// (see 03-ai-
|
|
147
|
+
// (see 03-sdk/07-ai-action-calls.md for full details)
|
|
148
148
|
export const summarizeInputSchema = z.object({ noteId: z.string() })
|
|
149
149
|
export type SummarizeInput = z.infer<typeof summarizeInputSchema>
|
|
150
150
|
|
package/templates/vite/.howone/skills/howone-sdk/{references/04-auth.md → 03-sdk/03-auth.md}
RENAMED
|
@@ -7,7 +7,7 @@ HowOne has two distinct auth layers:
|
|
|
7
7
|
1. **Client-level auth** (`client.auth.*`) — low-level token management, login/logout redirects.
|
|
8
8
|
2. **HowOne Auth service** (`unifiedAuth`, standalone functions) — headless OTP and OAuth flows for building custom login UIs.
|
|
9
9
|
|
|
10
|
-
For React auth UI, see `
|
|
10
|
+
For React auth UI, see `03-sdk/04-react-integration.md` (`HowOneProvider`, `useHowoneContext`).
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -113,6 +113,15 @@ function useCurrentUser() {
|
|
|
113
113
|
|
|
114
114
|
Use `sendEmailVerificationCode` → `loginWithEmailCode` to build a custom email login form.
|
|
115
115
|
|
|
116
|
+
The SDK normalizes HowOne auth envelopes. Both of these backend response shapes are valid:
|
|
117
|
+
|
|
118
|
+
```ts
|
|
119
|
+
{ success: true, token: 'jwt...' }
|
|
120
|
+
{ code: 0, data: { success: true, token: 'jwt...' } }
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
After normalization, read `result.success`, `result.token`, and `result.message` from the top level.
|
|
124
|
+
|
|
116
125
|
### Standalone functions (imported directly)
|
|
117
126
|
|
|
118
127
|
```ts
|
|
@@ -145,7 +154,7 @@ const loginResult = await loginWithEmailCode(
|
|
|
145
154
|
|
|
146
155
|
if (loginResult.success && loginResult.token) {
|
|
147
156
|
howone.auth.setToken(loginResult.token)
|
|
148
|
-
//
|
|
157
|
+
// Persists the token and updates the active SDK client.
|
|
149
158
|
}
|
|
150
159
|
```
|
|
151
160
|
|
|
@@ -423,6 +432,112 @@ async function checkToken(token: string) {
|
|
|
423
432
|
}
|
|
424
433
|
```
|
|
425
434
|
|
|
435
|
+
## Custom Login UI Pattern
|
|
436
|
+
|
|
437
|
+
Use this when the app should show its own login page instead of redirecting to `/howone/auth`.
|
|
438
|
+
|
|
439
|
+
### SDK setup
|
|
440
|
+
|
|
441
|
+
```ts
|
|
442
|
+
// src/lib/sdk.ts
|
|
443
|
+
import { createClient } from '@howone/sdk'
|
|
444
|
+
|
|
445
|
+
const client = createClient({
|
|
446
|
+
projectId: import.meta.env.VITE_HOWONE_PROJECT_ID,
|
|
447
|
+
env: import.meta.env.VITE_HOWONE_ENV,
|
|
448
|
+
auth: { mode: 'managed' },
|
|
449
|
+
})
|
|
450
|
+
|
|
451
|
+
export default client
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
`managed` is still correct for most custom login pages because `howone.auth.setToken(token)`
|
|
455
|
+
persists the token through the SDK auth store. Use `headless` only when an external auth
|
|
456
|
+
provider owns token storage.
|
|
457
|
+
|
|
458
|
+
### Provider setup
|
|
459
|
+
|
|
460
|
+
```tsx
|
|
461
|
+
<HowOneProvider auth="none" brand="hidden">
|
|
462
|
+
<App />
|
|
463
|
+
</HowOneProvider>
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
`auth="none"` disables the provider redirect so the app can render its own login form.
|
|
467
|
+
|
|
468
|
+
### App startup
|
|
469
|
+
|
|
470
|
+
```tsx
|
|
471
|
+
useEffect(() => {
|
|
472
|
+
let cancelled = false
|
|
473
|
+
|
|
474
|
+
howone.me()
|
|
475
|
+
.then((user) => {
|
|
476
|
+
if (!cancelled) setUser(user)
|
|
477
|
+
})
|
|
478
|
+
.catch(() => {
|
|
479
|
+
if (!cancelled) setUser(null)
|
|
480
|
+
})
|
|
481
|
+
.finally(() => {
|
|
482
|
+
if (!cancelled) setLoading(false)
|
|
483
|
+
})
|
|
484
|
+
|
|
485
|
+
return () => {
|
|
486
|
+
cancelled = true
|
|
487
|
+
}
|
|
488
|
+
}, [])
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
Do not use `howone.auth.isAuthenticated()` as the first-load gate for protected UI. It is a
|
|
492
|
+
synchronous token presence check. `howone.me()` verifies/restores the current session and is the
|
|
493
|
+
right source of truth for initial render.
|
|
494
|
+
|
|
495
|
+
### Login success
|
|
496
|
+
|
|
497
|
+
```ts
|
|
498
|
+
const result = await loginWithEmailCode(email, code)
|
|
499
|
+
if (!result.success || !result.token) {
|
|
500
|
+
setError(result.message ?? 'Invalid code')
|
|
501
|
+
return
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
howone.auth.setToken(result.token)
|
|
505
|
+
const user = await howone.me({ refresh: true })
|
|
506
|
+
setUser(user)
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
Use the same pattern for phone OTP and OAuth popup results.
|
|
510
|
+
|
|
511
|
+
### Logout
|
|
512
|
+
|
|
513
|
+
```ts
|
|
514
|
+
const token = howone.auth.getToken()
|
|
515
|
+
if (token) await unifiedAuth.logout(token)
|
|
516
|
+
howone.auth.logout()
|
|
517
|
+
setUser(null)
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
`howone.auth.logout()` clears the SDK token store and active client token.
|
|
521
|
+
|
|
522
|
+
## Headless External Auth Pattern
|
|
523
|
+
|
|
524
|
+
Use `auth.mode = "headless"` only when another auth system owns the token lifecycle.
|
|
525
|
+
|
|
526
|
+
```ts
|
|
527
|
+
const client = createClient({
|
|
528
|
+
projectId: import.meta.env.VITE_HOWONE_PROJECT_ID,
|
|
529
|
+
env: import.meta.env.VITE_HOWONE_ENV,
|
|
530
|
+
auth: {
|
|
531
|
+
mode: 'headless',
|
|
532
|
+
getToken: async () => externalAuth.getJwt(),
|
|
533
|
+
tokenCacheMs: 30_000,
|
|
534
|
+
},
|
|
535
|
+
})
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
Do not invent a second localStorage key for HowOne OTP/OAuth login. Use `howone.auth.setToken`
|
|
539
|
+
unless the user explicitly asks to integrate an external auth provider.
|
|
540
|
+
|
|
426
541
|
---
|
|
427
542
|
|
|
428
543
|
## Logout
|
|
@@ -495,5 +610,7 @@ const client = createClient({
|
|
|
495
610
|
|---|---|
|
|
496
611
|
| Phone number without country code: `'13800138000'` | Use E.164: `'+8613800138000'` |
|
|
497
612
|
| Using `loginWithEmailCode` without first calling `sendEmailVerificationCode` | Always send the code first |
|
|
498
|
-
|
|
|
613
|
+
| Hand-writing a separate localStorage token key for HowOne OTP/OAuth | Use `howone.auth.setToken(token)` |
|
|
614
|
+
| Using `auth.isAuthenticated()` to decide first render after refresh | Use `await howone.me()` |
|
|
615
|
+
| Setting `HowOneProvider auth="required"` with a custom in-app login form | Use `auth="none"` so the provider does not redirect |
|
|
499
616
|
| Calling `unifiedAuth.logout()` without the token argument | Pass `token`: `await unifiedAuth.logout(howone.auth.getToken()!)` |
|