howone 0.1.20 → 0.1.23
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/nextjs/lib/sdk.ts +3 -0
- 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 +126 -0
- package/templates/vite/.howone/skills/howone-sdk/{references/08-manifest-codegen.md → 01-architect/02-manifest-codegen.md} +31 -19
- 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/{references/06-react-integration.md → 03-sdk/04-react-integration.md} +2 -4
- package/templates/vite/.howone/skills/howone-sdk/{references/03-ai-actions.md → 03-sdk/07-ai-action-calls.md} +31 -34
- package/templates/vite/.howone/skills/howone-sdk/04-ai/.gitkeep +1 -0
- package/templates/vite/.howone/skills/howone-sdk/04-ai/01-ai-capability-architecture.md +142 -0
- package/templates/vite/.howone/skills/howone-sdk/04-ai/02-workflow-contract-rules.md +169 -0
- package/templates/vite/.howone/skills/howone-sdk/04-ai/03-ai-sdk-handoff.md +80 -0
- package/templates/vite/.howone/skills/howone-sdk/SKILL.md +118 -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 -12
- package/templates/vite/package.json +1 -1
- package/templates/vite/src/lib/sdk.ts +3 -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 → 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
|
@@ -0,0 +1,126 @@
|
|
|
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. **AI contract + workflow implementation**: AI capability contracts are versioned by HowOne;
|
|
13
|
+
external workflow create/update is submitted from synced AI manifests.
|
|
14
|
+
3. **SDK binding**: `src/lib/sdk.ts` converts manifests into typed entity and AI clients.
|
|
15
|
+
4. **Frontend experience**: React/UI code calls the SDK and owns app-specific interaction design.
|
|
16
|
+
|
|
17
|
+
Do not skip the binding layer. The UI should call `src/lib/sdk.ts`, not raw entity names guessed
|
|
18
|
+
from the user prompt.
|
|
19
|
+
|
|
20
|
+
Core source-of-truth rule from the HowOne docs:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
agent proposal != source of truth
|
|
24
|
+
validated backend manifest = source of truth
|
|
25
|
+
generated files = compiler/binding output
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
The agent proposes structured changes and writes app code. The runtime/schema tools validate,
|
|
29
|
+
apply, version, and sync manifest facts.
|
|
30
|
+
|
|
31
|
+
## Choose Data Posture First
|
|
32
|
+
|
|
33
|
+
Before designing schema or UI calls, classify the data:
|
|
34
|
+
|
|
35
|
+
| Posture | Backend Access | Frontend Read |
|
|
36
|
+
|---|---|---|
|
|
37
|
+
| Private user data | `authenticated: own`, `public: none` | `howone.entities.Entity.query.mine(...)` |
|
|
38
|
+
| Authenticated shared app data | `authenticated: all`, `public: none` | `howone.entities.Entity.query(...)` |
|
|
39
|
+
| Public list data | `authenticated: all`, `public: list` | `howone.public.entities.Entity.query(...)` |
|
|
40
|
+
| Public scoped share data | usually `authenticated: own`, `public: scoped` | `howone.public.entities.Entity.queryScoped(...)` |
|
|
41
|
+
|
|
42
|
+
If the user says "my todos", "my notes", "per user", "login required", or "data isolation",
|
|
43
|
+
default to private user data.
|
|
44
|
+
|
|
45
|
+
## Backend Feature Workflow
|
|
46
|
+
|
|
47
|
+
When a request adds persistence or changes data shape:
|
|
48
|
+
|
|
49
|
+
1. Read `02-database/01-schema-design.md` and `02-database/02-schema-operations.md`.
|
|
50
|
+
2. Inspect the current schema/manifest.
|
|
51
|
+
3. Design one complete schema patch for the feature.
|
|
52
|
+
4. Preview the schema patch.
|
|
53
|
+
5. Apply the exact previewed operations if risk is acceptable.
|
|
54
|
+
6. Sync schema artifacts using the returned `next.versionId`.
|
|
55
|
+
7. Read `.howone/database/manifest.json`.
|
|
56
|
+
8. Read `01-architect/02-manifest-codegen.md`.
|
|
57
|
+
9. Update `src/lib/sdk.ts`.
|
|
58
|
+
10. Read the needed SDK file, usually `03-sdk/02-entity-operations.md` and sometimes `03-sdk/03-auth.md`.
|
|
59
|
+
11. Update the UI.
|
|
60
|
+
12. Validate.
|
|
61
|
+
|
|
62
|
+
Do not preview a patch and then execute different single operations. Related schema changes for
|
|
63
|
+
one feature should be grouped into one preview/apply cycle.
|
|
64
|
+
|
|
65
|
+
## AI Feature Workflow
|
|
66
|
+
|
|
67
|
+
When a request adds an AI capability or changes an AI workflow:
|
|
68
|
+
|
|
69
|
+
1. Read `04-ai/01-ai-capability-architecture.md` and
|
|
70
|
+
`04-ai/02-workflow-contract-rules.md`.
|
|
71
|
+
2. Inspect current AI capability state.
|
|
72
|
+
3. Design one complete AI capability patch for the feature.
|
|
73
|
+
4. Preview the AI patch.
|
|
74
|
+
5. Apply the exact previewed operations.
|
|
75
|
+
6. Sync AI artifacts.
|
|
76
|
+
7. Read `.howone/ai/manifest.json`.
|
|
77
|
+
8. Submit external workflow create/update with `external-ai-capability`.
|
|
78
|
+
9. Preserve returned request IDs for the status/background-task layer.
|
|
79
|
+
10. Read `04-ai/03-ai-sdk-handoff.md`, `01-architect/02-manifest-codegen.md`, and
|
|
80
|
+
`03-sdk/07-ai-action-calls.md`.
|
|
81
|
+
11. Update `src/lib/sdk.ts` from the synced manifest.
|
|
82
|
+
12. Update the UI.
|
|
83
|
+
13. Validate.
|
|
84
|
+
|
|
85
|
+
If generated output must be saved, design the AI capability first. Then derive persistence entities
|
|
86
|
+
from the synced AI `outputSchema`, plus only necessary request metadata.
|
|
87
|
+
|
|
88
|
+
## Auth Decision
|
|
89
|
+
|
|
90
|
+
Use hosted auth when the app just needs login:
|
|
91
|
+
|
|
92
|
+
```tsx
|
|
93
|
+
<HowOneProvider auth="required">
|
|
94
|
+
<App />
|
|
95
|
+
</HowOneProvider>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Use custom in-app auth when the user asks for a designed login page or multiple login methods:
|
|
99
|
+
|
|
100
|
+
```tsx
|
|
101
|
+
<HowOneProvider auth="none" brand="hidden">
|
|
102
|
+
<App />
|
|
103
|
+
</HowOneProvider>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Custom login must call `howone.auth.setToken(token)` after Email OTP, Phone OTP, Google, or
|
|
107
|
+
GitHub succeeds, then verify the session with `await howone.me({ refresh: true })`.
|
|
108
|
+
|
|
109
|
+
## Generated Binding Rules
|
|
110
|
+
|
|
111
|
+
- Read manifests after sync, not before.
|
|
112
|
+
- Preserve existing bindings unless the manifest changed.
|
|
113
|
+
- Export explicit `Record`, `Create`, and `Update` types.
|
|
114
|
+
- Do not include system fields in create/update payloads.
|
|
115
|
+
- Do not infer public access from `visibility` alone; inspect `access.public`.
|
|
116
|
+
|
|
117
|
+
## Common Failure Modes
|
|
118
|
+
|
|
119
|
+
- Repeated login after refresh: app used `auth.isAuthenticated()` as first-load truth or stored
|
|
120
|
+
token outside SDK. Read `03-sdk/03-auth.md`.
|
|
121
|
+
- Data is not isolated: app used `query()` instead of `query.mine()` for `authenticated.read =
|
|
122
|
+
"own"`, or wrote owner fields manually.
|
|
123
|
+
- Public page 401/403: app used authenticated namespace for public content or schema does not
|
|
124
|
+
allow public access.
|
|
125
|
+
- Generated types drift from backend: app edited `src/lib/sdk.ts` from memory instead of synced
|
|
126
|
+
manifest.
|
|
@@ -13,6 +13,11 @@ HowOne apps are driven by two backend-synced manifests:
|
|
|
13
13
|
|
|
14
14
|
Sync tools (`sync_schema_artifacts`, `sync_ai_artifacts`) write the manifests. The coding agent reads the manifests and writes `src/lib/sdk.ts`.
|
|
15
15
|
|
|
16
|
+
For AI capabilities, external workflow create/update is submitted by `external-ai-capability` from
|
|
17
|
+
the synced manifest. Do not duplicate AI schemas in app code beyond generated zod/type bindings.
|
|
18
|
+
For workflow edits, `workflowConfigID` belongs to the external workflow operation; it is not an SDK
|
|
19
|
+
binding field.
|
|
20
|
+
|
|
16
21
|
---
|
|
17
22
|
|
|
18
23
|
## Reading `.howone/database/manifest.json`
|
|
@@ -157,6 +162,7 @@ export type CommentUpdate = Partial<CommentCreate>
|
|
|
157
162
|
{
|
|
158
163
|
"id": "generateStory",
|
|
159
164
|
"name": "Generate Story",
|
|
165
|
+
"workflowId": "d69ab648-2c00-4d94-928e-01bd7b2a5bb2",
|
|
160
166
|
"inputSchema": {
|
|
161
167
|
"type": "object",
|
|
162
168
|
"properties": {
|
|
@@ -179,6 +185,7 @@ export type CommentUpdate = Partial<CommentCreate>
|
|
|
179
185
|
{
|
|
180
186
|
"id": "translateText",
|
|
181
187
|
"name": "Translate Text",
|
|
188
|
+
"workflowId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
|
182
189
|
"inputSchema": {
|
|
183
190
|
"type": "object",
|
|
184
191
|
"properties": {
|
|
@@ -219,12 +226,12 @@ export const generateStoryInputSchema = z.object({
|
|
|
219
226
|
})
|
|
220
227
|
export type GenerateStoryInput = z.infer<typeof generateStoryInputSchema>
|
|
221
228
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
229
|
+
export const generateStoryOutputSchema = z.object({
|
|
230
|
+
title: z.string(),
|
|
231
|
+
content: z.string(),
|
|
232
|
+
summary: z.string().optional(),
|
|
233
|
+
})
|
|
234
|
+
export type GenerateStoryOutput = z.infer<typeof generateStoryOutputSchema>
|
|
228
235
|
|
|
229
236
|
// ── translateText ─────────────────────────────────────────────
|
|
230
237
|
export const translateTextInputSchema = z.object({
|
|
@@ -235,6 +242,10 @@ export const translateTextInputSchema = z.object({
|
|
|
235
242
|
export type TranslateTextInput = z.infer<typeof translateTextInputSchema>
|
|
236
243
|
```
|
|
237
244
|
|
|
245
|
+
Do not make required output fields optional to silence validation failures. Do not add
|
|
246
|
+
`.passthrough()` as a workaround for EAX execution envelopes. `defineAiAction` validates the
|
|
247
|
+
workflow `finalResult` payload when an `outputSchema` is configured.
|
|
248
|
+
|
|
238
249
|
---
|
|
239
250
|
|
|
240
251
|
## Full Generated `src/lib/sdk.ts`
|
|
@@ -303,11 +314,12 @@ export const generateStoryInputSchema = z.object({
|
|
|
303
314
|
language: z.string().optional(),
|
|
304
315
|
})
|
|
305
316
|
export type GenerateStoryInput = z.infer<typeof generateStoryInputSchema>
|
|
306
|
-
export
|
|
307
|
-
title: string
|
|
308
|
-
content: string
|
|
309
|
-
summary
|
|
310
|
-
}
|
|
317
|
+
export const generateStoryOutputSchema = z.object({
|
|
318
|
+
title: z.string(),
|
|
319
|
+
content: z.string(),
|
|
320
|
+
summary: z.string().optional(),
|
|
321
|
+
})
|
|
322
|
+
export type GenerateStoryOutput = z.infer<typeof generateStoryOutputSchema>
|
|
311
323
|
|
|
312
324
|
export const translateTextInputSchema = z.object({
|
|
313
325
|
text: z.string(),
|
|
@@ -315,10 +327,6 @@ export const translateTextInputSchema = z.object({
|
|
|
315
327
|
formality: z.enum(['formal', 'informal']).optional(),
|
|
316
328
|
})
|
|
317
329
|
export type TranslateTextInput = z.infer<typeof translateTextInputSchema>
|
|
318
|
-
export type TranslateTextOutput = {
|
|
319
|
-
translatedText: string
|
|
320
|
-
detectedLang?: string
|
|
321
|
-
}
|
|
322
330
|
|
|
323
331
|
// ═══════════════════════════════════════════════════════════════
|
|
324
332
|
// CLIENT
|
|
@@ -344,9 +352,12 @@ export const entities = defineEntities({
|
|
|
344
352
|
|
|
345
353
|
export const ai = defineAiActions({
|
|
346
354
|
generateStory: defineAiAction('generateStory', {
|
|
355
|
+
workflowId: 'd69ab648-2c00-4d94-928e-01bd7b2a5bb2',
|
|
347
356
|
inputSchema: generateStoryInputSchema,
|
|
357
|
+
outputSchema: generateStoryOutputSchema,
|
|
348
358
|
}),
|
|
349
359
|
translateText: defineAiAction('translateText', {
|
|
360
|
+
workflowId: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
|
|
350
361
|
inputSchema: translateTextInputSchema,
|
|
351
362
|
}),
|
|
352
363
|
})
|
|
@@ -371,7 +382,11 @@ Before finalising generated code, verify:
|
|
|
371
382
|
- [ ] System fields are not present in create/update input types
|
|
372
383
|
- [ ] Public query/write types are generated only from `access.public.allowedFilters`, `allowedSorts`, `requiredScopes`, and write permissions
|
|
373
384
|
- [ ] Every AI action from `.howone/ai/manifest.json` has an `inputSchema` zod object
|
|
385
|
+
- [ ] Every AI action with manifest `outputSchema` has a matching zod `outputSchema`
|
|
386
|
+
- [ ] Every AI action binding includes the exact manifest `workflowId`
|
|
374
387
|
- [ ] Required input fields are not `.optional()` in zod
|
|
388
|
+
- [ ] Required output fields are not `.optional()` in zod
|
|
389
|
+
- [ ] AI output schemas do not use `.passthrough()` to hide execution-envelope mismatches
|
|
375
390
|
- [ ] AI action names match the manifest `id` exactly (case-sensitive)
|
|
376
391
|
- [ ] `createClient` uses `import.meta.env.*` only
|
|
377
392
|
- [ ] `withEntities` is applied before `withAiActions` in the composition chain
|
|
@@ -418,10 +433,7 @@ When the app generates data with AI and saves it to an entity:
|
|
|
418
433
|
// Save it to Story entity which adds: authorId, status, wordCount
|
|
419
434
|
|
|
420
435
|
async function generateAndSave(input: GenerateStoryInput, authorId: string) {
|
|
421
|
-
const
|
|
422
|
-
if (!result.success) throw new Error(result.errors.join(', '))
|
|
423
|
-
|
|
424
|
-
const output = result.finalResult as GenerateStoryOutput
|
|
436
|
+
const output = await howone.ai.generateStory.run(input)
|
|
425
437
|
|
|
426
438
|
return howone.entities.Story.create({
|
|
427
439
|
title: output.title,
|
|
@@ -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
|
|