exonous 0.0.0-stage → 2.10.4
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/README.md +100 -2
- package/assets/THIRD-PARTY-NOTICES.md +29 -0
- package/assets/adapters/opencode/exonous.js +54 -0
- package/assets/agents/exo-backend.md +22 -0
- package/assets/agents/exo-cto.md +22 -0
- package/assets/agents/exo-data-ai.md +22 -0
- package/assets/agents/exo-designer.md +22 -0
- package/assets/agents/exo-devops.md +22 -0
- package/assets/agents/exo-frontend.md +22 -0
- package/assets/agents/exo-infra.md +22 -0
- package/assets/agents/exo-mobile.md +22 -0
- package/assets/agents/exo-pm.md +22 -0
- package/assets/agents/exo-qa.md +22 -0
- package/assets/agents/exo-researcher.md +22 -0
- package/assets/agents/exo-security.md +22 -0
- package/assets/agents/roster.json +209 -0
- package/assets/agents/taxis.js +189 -0
- package/assets/editors/cursor/frontend-skills.mdc +27 -0
- package/assets/editors/hooks/cursor/hooks.json +11 -0
- package/assets/machine/PR-TEMPLATE.md +21 -0
- package/assets/machine/hooks/anamnesis.cjs +61 -0
- package/assets/machine/hooks/ethos.cjs +48 -0
- package/assets/machine/hooks/kairos.cjs +46 -0
- package/assets/machine/hooks/lib/cli-options.cjs +133 -0
- package/assets/machine/hooks/lib/memory.cjs +488 -0
- package/assets/machine/hooks/lib/metron.cjs +52 -0
- package/assets/machine/hooks/lib/paths.cjs +99 -0
- package/assets/machine/hooks/lib/payload.cjs +81 -0
- package/assets/machine/hooks/lib/pr-template-validate.cjs +103 -0
- package/assets/machine/hooks/lib/release.cjs +58 -0
- package/assets/machine/hooks/lib/repo.cjs +138 -0
- package/assets/machine/hooks/lib/sanitize.cjs +37 -0
- package/assets/machine/hooks/lib/selfupdate.cjs +354 -0
- package/assets/machine/hooks/lib/shell.cjs +722 -0
- package/assets/machine/hooks/lib/template.cjs +70 -0
- package/assets/machine/hooks/lib/token.cjs +110 -0
- package/assets/machine/hooks/lib/validate-pr-body.cjs +21 -0
- package/assets/machine/hooks/pyle.cjs +302 -0
- package/assets/rules/nomos.md +59 -0
- package/assets/rules/praxis.md +38 -0
- package/assets/skills/code-review/SKILL.md +124 -0
- package/assets/skills/commit-changes/SKILL.md +49 -0
- package/assets/skills/deliver/SKILL.md +114 -0
- package/assets/skills/deliver/references/parallel.md +37 -0
- package/assets/skills/doc/SKILL.md +140 -0
- package/assets/skills/doc/doc.mjs +277 -0
- package/assets/skills/issue-board/SKILL.md +84 -0
- package/assets/skills/issue-board/board.mjs +389 -0
- package/assets/skills/issue-board/config.example.json +9 -0
- package/assets/skills/issue-board/render.py +189 -0
- package/assets/skills/make-pr/SKILL.md +24 -0
- package/assets/skills/native-ui/SKILL.md +67 -0
- package/assets/skills/native-ui/reference/apple.md +180 -0
- package/assets/skills/native-ui/reference/mobile-feel.md +221 -0
- package/assets/skills/native-ui/reference/swift.md +289 -0
- package/assets/skills/project-memory/SKILL.md +59 -0
- package/assets/skills/project-memory/config.example.json +4 -0
- package/assets/skills/project-memory/project-memory.mjs +478 -0
- package/assets/skills/security-review/SKILL.md +102 -0
- package/assets/skills/session-handoff/SKILL.md +23 -0
- package/assets/skills/session-handoff/config.example.json +3 -0
- package/assets/skills/ui-design/SKILL.md +75 -0
- package/assets/skills/ui-design/reference/adapt.md +151 -0
- package/assets/skills/ui-design/reference/adapt.native.md +35 -0
- package/assets/skills/ui-design/reference/android.md +50 -0
- package/assets/skills/ui-design/reference/animate.md +87 -0
- package/assets/skills/ui-design/reference/audit.md +76 -0
- package/assets/skills/ui-design/reference/audit.native.md +126 -0
- package/assets/skills/ui-design/reference/bolder.md +33 -0
- package/assets/skills/ui-design/reference/clarify.md +84 -0
- package/assets/skills/ui-design/reference/colorize.md +86 -0
- package/assets/skills/ui-design/reference/craft-floor.md +25 -0
- package/assets/skills/ui-design/reference/critique.md +345 -0
- package/assets/skills/ui-design/reference/degraded/asset-producer.md +35 -0
- package/assets/skills/ui-design/reference/degraded/documenter.md +23 -0
- package/assets/skills/ui-design/reference/degraded/finish-reviewer.md +43 -0
- package/assets/skills/ui-design/reference/degraded/manual-edit-applier.md +56 -0
- package/assets/skills/ui-design/reference/delight.md +63 -0
- package/assets/skills/ui-design/reference/distill.md +98 -0
- package/assets/skills/ui-design/reference/doctor.md +49 -0
- package/assets/skills/ui-design/reference/document.md +273 -0
- package/assets/skills/ui-design/reference/extract.md +52 -0
- package/assets/skills/ui-design/reference/harden.md +122 -0
- package/assets/skills/ui-design/reference/hooks.md +114 -0
- package/assets/skills/ui-design/reference/init.md +47 -0
- package/assets/skills/ui-design/reference/ios.md +55 -0
- package/assets/skills/ui-design/reference/layout.md +81 -0
- package/assets/skills/ui-design/reference/live-setup.md +75 -0
- package/assets/skills/ui-design/reference/live.md +326 -0
- package/assets/skills/ui-design/reference/new-work.md +350 -0
- package/assets/skills/ui-design/reference/onboard.md +85 -0
- package/assets/skills/ui-design/reference/operate.md +29 -0
- package/assets/skills/ui-design/reference/optimize.md +101 -0
- package/assets/skills/ui-design/reference/overdrive.md +83 -0
- package/assets/skills/ui-design/reference/polish.md +77 -0
- package/assets/skills/ui-design/reference/quieter.md +95 -0
- package/assets/skills/ui-design/reference/routing.md +37 -0
- package/assets/skills/ui-design/reference/shape.md +43 -0
- package/assets/skills/ui-design/reference/styles/brutalist.md +45 -0
- package/assets/skills/ui-design/reference/styles/design-md.md +70 -0
- package/assets/skills/ui-design/reference/styles/direction.md +95 -0
- package/assets/skills/ui-design/reference/styles/full-output.md +42 -0
- package/assets/skills/ui-design/reference/styles/minimalist.md +64 -0
- package/assets/skills/ui-design/reference/styles/premium.md +65 -0
- package/assets/skills/ui-design/reference/styles/redesign.md +59 -0
- package/assets/skills/ui-design/reference/typeset.md +73 -0
- package/assets/skills/ui-design/reference/visualize.md +156 -0
- package/assets/skills/ui-design/scripts/ENGINE-LICENSE +191 -0
- package/assets/skills/ui-design/scripts/VERSION +1 -0
- package/assets/skills/ui-design/scripts/bin/darwin-arm64/impeccable +0 -0
- package/assets/skills/ui-design/scripts/command-metadata.json +94 -0
- package/assets/skills/ui-design/scripts/data/font-index-failures.json +121 -0
- package/assets/skills/ui-design/scripts/data/font-index.json +1 -0
- package/assets/skills/ui-design/scripts/impeccable +206 -0
- package/assets/skills/ui-design/scripts/impeccable.cmd +214 -0
- package/assets/skills/ui-design/scripts/live-browser-dom.js +167 -0
- package/assets/skills/ui-design/scripts/live-browser-ignores.js +242 -0
- package/assets/skills/ui-design/scripts/live-browser-session.js +144 -0
- package/assets/skills/ui-design/scripts/live-browser.js +12990 -0
- package/assets/skills/ui-design/scripts/modern-screenshot.umd.js +14 -0
- package/assets/skills/ui-design/scripts/ui-design +6 -0
- package/assets/skills/ui-design/scripts/ui-design.cmd +3 -0
- package/assets/skills/ui-design/scripts/ui-design.mjs +124 -0
- package/assets/skills/ui-mockup/SKILL.md +68 -0
- package/assets/skills/ui-mockup/reference/brandkit.md +101 -0
- package/assets/skills/ui-mockup/reference/image-to-code.md +83 -0
- package/assets/skills/ui-mockup/reference/mobile-comps.md +94 -0
- package/assets/skills/ui-mockup/reference/web-comps.md +83 -0
- package/assets/skills/ui-motion/SKILL.md +112 -0
- package/assets/skills/ui-motion/reference/expo.md +224 -0
- package/assets/skills/ui-motion/reference/opportunities.md +81 -0
- package/assets/skills/ui-motion/reference/prototype.md +238 -0
- package/assets/skills/ui-motion/reference/review.md +163 -0
- package/assets/skills/ui-motion/reference/toasts.md +144 -0
- package/assets/skills/ui-motion/reference/ui-libraries.md +71 -0
- package/assets/skills/ui-motion/reference/vocabulary.md +130 -0
- package/assets/skills/ui-motion/reference/web.md +294 -0
- package/assets/skills/ui-patterns/SKILL.md +105 -0
- package/assets/skills/ui-patterns/references/stacks/html-tailwind.md +40 -0
- package/assets/skills/ui-patterns/references/stacks/nextjs.md +52 -0
- package/assets/skills/ui-patterns/references/stacks/nuxt.md +100 -0
- package/assets/skills/ui-patterns/references/stacks/react-native.md +48 -0
- package/assets/skills/ui-patterns/references/stacks/react.md +49 -0
- package/assets/skills/ui-patterns/references/stacks/shadcn.md +57 -0
- package/assets/skills/ui-patterns/references/stacks/vue.md +37 -0
- package/assets/techne/.claude-plugin/marketplace.json +31 -0
- package/assets/techne/.claude-plugin/plugin.json +24 -0
- package/assets/techne/.mcp.json +8 -0
- package/assets/techne/commands/build-fix.md +48 -0
- package/assets/techne/commands/refactor-clean.md +46 -0
- package/assets/techne/commands/test-coverage.md +42 -0
- package/assets/techne/hooks/hooks.json +49 -0
- package/assets/techne/rules/angular/coding-style.md +49 -0
- package/assets/techne/rules/angular/hooks.md +23 -0
- package/assets/techne/rules/angular/patterns.md +48 -0
- package/assets/techne/rules/angular/security.md +26 -0
- package/assets/techne/rules/angular/testing.md +46 -0
- package/assets/techne/rules/arkts/coding-style.md +63 -0
- package/assets/techne/rules/arkts/hooks.md +38 -0
- package/assets/techne/rules/arkts/patterns.md +42 -0
- package/assets/techne/rules/arkts/security.md +35 -0
- package/assets/techne/rules/arkts/testing.md +39 -0
- package/assets/techne/rules/common/agents.md +6 -0
- package/assets/techne/rules/common/code-review.md +15 -0
- package/assets/techne/rules/common/coding-style.md +13 -0
- package/assets/techne/rules/common/development-workflow.md +5 -0
- package/assets/techne/rules/common/git-workflow.md +30 -0
- package/assets/techne/rules/common/hooks.md +7 -0
- package/assets/techne/rules/common/patterns.md +3 -0
- package/assets/techne/rules/common/performance.md +3 -0
- package/assets/techne/rules/common/security.md +5 -0
- package/assets/techne/rules/common/testing.md +3 -0
- package/assets/techne/rules/cpp/coding-style.md +31 -0
- package/assets/techne/rules/cpp/hooks.md +26 -0
- package/assets/techne/rules/cpp/patterns.md +31 -0
- package/assets/techne/rules/cpp/security.md +37 -0
- package/assets/techne/rules/cpp/testing.md +31 -0
- package/assets/techne/rules/csharp/coding-style.md +30 -0
- package/assets/techne/rules/csharp/hooks.md +24 -0
- package/assets/techne/rules/csharp/patterns.md +28 -0
- package/assets/techne/rules/csharp/security.md +32 -0
- package/assets/techne/rules/csharp/testing.md +27 -0
- package/assets/techne/rules/dart/coding-style.md +47 -0
- package/assets/techne/rules/dart/hooks.md +26 -0
- package/assets/techne/rules/dart/patterns.md +38 -0
- package/assets/techne/rules/dart/security.md +44 -0
- package/assets/techne/rules/dart/testing.md +39 -0
- package/assets/techne/rules/fsharp/coding-style.md +34 -0
- package/assets/techne/rules/fsharp/hooks.md +25 -0
- package/assets/techne/rules/fsharp/patterns.md +43 -0
- package/assets/techne/rules/fsharp/security.md +32 -0
- package/assets/techne/rules/fsharp/testing.md +27 -0
- package/assets/techne/rules/golang/coding-style.md +30 -0
- package/assets/techne/rules/golang/hooks.md +17 -0
- package/assets/techne/rules/golang/patterns.md +43 -0
- package/assets/techne/rules/golang/security.md +33 -0
- package/assets/techne/rules/golang/testing.md +20 -0
- package/assets/techne/rules/java/coding-style.md +51 -0
- package/assets/techne/rules/java/hooks.md +18 -0
- package/assets/techne/rules/java/patterns.md +55 -0
- package/assets/techne/rules/java/security.md +33 -0
- package/assets/techne/rules/java/testing.md +33 -0
- package/assets/techne/rules/kotlin/coding-style.md +50 -0
- package/assets/techne/rules/kotlin/hooks.md +17 -0
- package/assets/techne/rules/kotlin/patterns.md +44 -0
- package/assets/techne/rules/kotlin/security.md +34 -0
- package/assets/techne/rules/kotlin/testing.md +38 -0
- package/assets/techne/rules/nuxt/coding-style.md +20 -0
- package/assets/techne/rules/nuxt/hooks.md +16 -0
- package/assets/techne/rules/nuxt/patterns.md +46 -0
- package/assets/techne/rules/nuxt/security.md +19 -0
- package/assets/techne/rules/nuxt/testing.md +15 -0
- package/assets/techne/rules/perl/coding-style.md +33 -0
- package/assets/techne/rules/perl/hooks.md +22 -0
- package/assets/techne/rules/perl/patterns.md +43 -0
- package/assets/techne/rules/perl/security.md +39 -0
- package/assets/techne/rules/perl/testing.md +42 -0
- package/assets/techne/rules/php/coding-style.md +30 -0
- package/assets/techne/rules/php/hooks.md +24 -0
- package/assets/techne/rules/php/patterns.md +26 -0
- package/assets/techne/rules/php/security.md +27 -0
- package/assets/techne/rules/php/testing.md +28 -0
- package/assets/techne/rules/python/coding-style.md +38 -0
- package/assets/techne/rules/python/fastapi.md +57 -0
- package/assets/techne/rules/python/hooks.md +19 -0
- package/assets/techne/rules/python/patterns.md +37 -0
- package/assets/techne/rules/python/security.md +26 -0
- package/assets/techne/rules/python/testing.md +32 -0
- package/assets/techne/rules/react/coding-style.md +24 -0
- package/assets/techne/rules/react/hooks.md +62 -0
- package/assets/techne/rules/react/patterns.md +48 -0
- package/assets/techne/rules/react/security.md +45 -0
- package/assets/techne/rules/react/testing.md +42 -0
- package/assets/techne/rules/react-native/accessibility.md +14 -0
- package/assets/techne/rules/react-native/coding-style.md +16 -0
- package/assets/techne/rules/react-native/hooks.md +16 -0
- package/assets/techne/rules/react-native/patterns.md +18 -0
- package/assets/techne/rules/react-native/performance.md +14 -0
- package/assets/techne/rules/react-native/production-readiness.md +16 -0
- package/assets/techne/rules/react-native/security.md +16 -0
- package/assets/techne/rules/react-native/testing.md +14 -0
- package/assets/techne/rules/ruby/coding-style.md +40 -0
- package/assets/techne/rules/ruby/hooks.md +33 -0
- package/assets/techne/rules/ruby/patterns.md +33 -0
- package/assets/techne/rules/ruby/security.md +39 -0
- package/assets/techne/rules/ruby/testing.md +35 -0
- package/assets/techne/rules/rust/coding-style.md +41 -0
- package/assets/techne/rules/rust/hooks.md +16 -0
- package/assets/techne/rules/rust/patterns.md +42 -0
- package/assets/techne/rules/rust/security.md +33 -0
- package/assets/techne/rules/rust/testing.md +30 -0
- package/assets/techne/rules/swift/coding-style.md +30 -0
- package/assets/techne/rules/swift/hooks.md +20 -0
- package/assets/techne/rules/swift/patterns.md +30 -0
- package/assets/techne/rules/swift/security.md +22 -0
- package/assets/techne/rules/swift/testing.md +28 -0
- package/assets/techne/rules/typescript/coding-style.md +38 -0
- package/assets/techne/rules/typescript/hooks.md +14 -0
- package/assets/techne/rules/typescript/patterns.md +12 -0
- package/assets/techne/rules/typescript/security.md +14 -0
- package/assets/techne/rules/typescript/testing.md +12 -0
- package/assets/techne/rules/vue/coding-style.md +19 -0
- package/assets/techne/rules/vue/hooks.md +13 -0
- package/assets/techne/rules/vue/patterns.md +29 -0
- package/assets/techne/rules/vue/security.md +11 -0
- package/assets/techne/rules/vue/testing.md +11 -0
- package/assets/techne/rules/web/coding-style.md +25 -0
- package/assets/techne/rules/web/design-quality.md +21 -0
- package/assets/techne/rules/web/hooks.md +39 -0
- package/assets/techne/rules/web/patterns.md +23 -0
- package/assets/techne/rules/web/performance.md +25 -0
- package/assets/techne/rules/web/security.md +23 -0
- package/assets/techne/rules/web/testing.md +21 -0
- package/assets/techne/scripts/hooks/config-guard.js +50 -0
- package/assets/techne/scripts/hooks/edit-tracker.js +26 -0
- package/assets/techne/scripts/hooks/lib/shell.js +204 -0
- package/assets/techne/scripts/hooks/no-verify-guard.js +205 -0
- package/assets/techne/scripts/hooks/run.js +92 -0
- package/assets/techne/scripts/hooks/stop-checks.js +136 -0
- package/assets/techne/skills/angular/SKILL.md +34 -0
- package/assets/techne/skills/angular/reference/components-and-templates.md +63 -0
- package/assets/techne/skills/angular/reference/dependency-injection.md +44 -0
- package/assets/techne/skills/angular/reference/forms.md +97 -0
- package/assets/techne/skills/angular/reference/routing.md +50 -0
- package/assets/techne/skills/angular/reference/signals-and-state.md +59 -0
- package/assets/techne/skills/angular/reference/styling-motion-a11y.md +54 -0
- package/assets/techne/skills/angular/reference/testing.md +52 -0
- package/assets/techne/skills/angular/reference/tooling.md +31 -0
- package/assets/techne/skills/cpp/SKILL.md +27 -0
- package/assets/techne/skills/cpp/reference/coding-standards.md +160 -0
- package/assets/techne/skills/databases/SKILL.md +35 -0
- package/assets/techne/skills/databases/reference/clickhouse.md +102 -0
- package/assets/techne/skills/databases/reference/migrations.md +94 -0
- package/assets/techne/skills/databases/reference/mysql.md +101 -0
- package/assets/techne/skills/databases/reference/postgres.md +72 -0
- package/assets/techne/skills/databases/reference/prisma.md +105 -0
- package/assets/techne/skills/databases/reference/redis.md +108 -0
- package/assets/techne/skills/delivery/SKILL.md +35 -0
- package/assets/techne/skills/delivery/reference/deployment-patterns.md +58 -0
- package/assets/techne/skills/delivery/reference/docker-patterns.md +77 -0
- package/assets/techne/skills/delivery/reference/git-workflow.md +64 -0
- package/assets/techne/skills/delivery/reference/github-ops.md +67 -0
- package/assets/techne/skills/delivery/reference/jira-integration.md +53 -0
- package/assets/techne/skills/delivery/reference/kubernetes-patterns.md +67 -0
- package/assets/techne/skills/dotnet/SKILL.md +27 -0
- package/assets/techne/skills/dotnet/reference/dotnet-core.md +131 -0
- package/assets/techne/skills/flutter/SKILL.md +29 -0
- package/assets/techne/skills/flutter/reference/code-review.md +76 -0
- package/assets/techne/skills/flutter/reference/patterns.md +201 -0
- package/assets/techne/skills/go/SKILL.md +28 -0
- package/assets/techne/skills/go/reference/patterns.md +87 -0
- package/assets/techne/skills/go/reference/testing.md +142 -0
- package/assets/techne/skills/java/SKILL.md +29 -0
- package/assets/techne/skills/java/reference/java-standards.md +117 -0
- package/assets/techne/skills/java/reference/springboot.md +108 -0
- package/assets/techne/skills/kotlin/SKILL.md +35 -0
- package/assets/techne/skills/kotlin/reference/android-clean-architecture.md +115 -0
- package/assets/techne/skills/kotlin/reference/compose-multiplatform-patterns.md +113 -0
- package/assets/techne/skills/kotlin/reference/kotlin-coroutines-flows.md +93 -0
- package/assets/techne/skills/kotlin/reference/kotlin-patterns.md +74 -0
- package/assets/techne/skills/kotlin/reference/kotlin-testing.md +115 -0
- package/assets/techne/skills/ml/SKILL.md +34 -0
- package/assets/techne/skills/ml/reference/ai-regression-testing.md +99 -0
- package/assets/techne/skills/ml/reference/cost-aware-llm-pipeline.md +133 -0
- package/assets/techne/skills/ml/reference/eval-harness.md +94 -0
- package/assets/techne/skills/ml/reference/mle-workflow.md +177 -0
- package/assets/techne/skills/ml/reference/prompt-optimizer.md +107 -0
- package/assets/techne/skills/ml/reference/pytorch-patterns.md +164 -0
- package/assets/techne/skills/php/SKILL.md +27 -0
- package/assets/techne/skills/php/reference/laravel.md +142 -0
- package/assets/techne/skills/python/SKILL.md +33 -0
- package/assets/techne/skills/python/reference/django.md +104 -0
- package/assets/techne/skills/python/reference/fastapi.md +118 -0
- package/assets/techne/skills/python/reference/python-core.md +88 -0
- package/assets/techne/skills/python/reference/python-testing.md +105 -0
- package/assets/techne/skills/quality/SKILL.md +34 -0
- package/assets/techne/skills/quality/reference/benchmark.md +55 -0
- package/assets/techne/skills/quality/reference/browser-qa.md +60 -0
- package/assets/techne/skills/quality/reference/coding-standards.md +88 -0
- package/assets/techne/skills/quality/reference/e2e-testing.md +99 -0
- package/assets/techne/skills/quality/reference/tdd-workflow.md +89 -0
- package/assets/techne/skills/quality/reference/verification-loop.md +80 -0
- package/assets/techne/skills/react/SKILL.md +30 -0
- package/assets/techne/skills/react/reference/nextjs-turbopack.md +42 -0
- package/assets/techne/skills/react/reference/react-patterns.md +139 -0
- package/assets/techne/skills/react/reference/react-performance.md +101 -0
- package/assets/techne/skills/react/reference/react-testing.md +139 -0
- package/assets/techne/skills/react-native/SKILL.md +28 -0
- package/assets/techne/skills/react-native/reference/expo-patterns.md +196 -0
- package/assets/techne/skills/research/SKILL.md +35 -0
- package/assets/techne/skills/research/reference/architecture-decision-records.md +65 -0
- package/assets/techne/skills/research/reference/codebase-onboarding.md +44 -0
- package/assets/techne/skills/research/reference/deep-research.md +50 -0
- package/assets/techne/skills/research/reference/iterative-retrieval.md +62 -0
- package/assets/techne/skills/research/reference/product-lens.md +38 -0
- package/assets/techne/skills/research/reference/search-first.md +50 -0
- package/assets/techne/skills/rust/SKILL.md +28 -0
- package/assets/techne/skills/rust/reference/patterns.md +108 -0
- package/assets/techne/skills/rust/reference/testing.md +142 -0
- package/assets/techne/skills/services/SKILL.md +32 -0
- package/assets/techne/skills/services/reference/api-contracts.md +139 -0
- package/assets/techne/skills/services/reference/backend-layers.md +95 -0
- package/assets/techne/skills/services/reference/errors-and-resilience.md +146 -0
- package/assets/techne/skills/services/reference/hexagonal-boundaries.md +93 -0
- package/assets/techne/skills/services/reference/mcp-servers.md +50 -0
- package/assets/techne/skills/services/reference/nestjs.md +96 -0
- package/assets/techne/skills/swift/SKILL.md +29 -0
- package/assets/techne/skills/swift/reference/concurrency.md +83 -0
- package/assets/techne/skills/swift/reference/swiftui.md +139 -0
- package/assets/techne/skills/vue/SKILL.md +29 -0
- package/assets/techne/skills/vue/reference/nuxt4-patterns.md +90 -0
- package/assets/techne/skills/vue/reference/ui-to-vue.md +90 -0
- package/assets/techne/skills/vue/reference/vue-patterns.md +151 -0
- package/assets/techne/skills/web/SKILL.md +30 -0
- package/assets/techne/skills/web/reference/bun-runtime.md +55 -0
- package/assets/techne/skills/web/reference/frontend-patterns.md +54 -0
- package/assets/techne/skills/web/reference/seo.md +77 -0
- package/assets/techne/skills/web/reference/vite-patterns.md +96 -0
- package/bin/native.cjs +30 -0
- package/native/aarch64-apple-darwin/exonous +0 -0
- package/native/aarch64-unknown-linux-gnu/exonous +0 -0
- package/native/x86_64-apple-darwin/exonous +0 -0
- package/native/x86_64-pc-windows-msvc/exonous.exe +0 -0
- package/native/x86_64-unknown-linux-gnu/exonous +0 -0
- package/package.json +1 -6
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# NestJS patterns
|
|
2
|
+
|
|
3
|
+
## Layout
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
src/
|
|
7
|
+
main.ts
|
|
8
|
+
app.module.ts
|
|
9
|
+
common/ # filters, guards, interceptors, pipes
|
|
10
|
+
config/
|
|
11
|
+
modules/<feature>/
|
|
12
|
+
*.module.ts
|
|
13
|
+
*.controller.ts
|
|
14
|
+
*.service.ts
|
|
15
|
+
dto/
|
|
16
|
+
entities/ or repositories/
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Feature modules own domain code; export only providers other modules need.
|
|
20
|
+
|
|
21
|
+
## Bootstrap
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
const app = await NestFactory.create(AppModule, { bufferLogs: true });
|
|
25
|
+
app.useGlobalPipes(new ValidationPipe({
|
|
26
|
+
whitelist: true,
|
|
27
|
+
forbidNonWhitelisted: true,
|
|
28
|
+
transform: true,
|
|
29
|
+
transformOptions: { enableImplicitConversion: true },
|
|
30
|
+
}));
|
|
31
|
+
app.useGlobalFilters(new HttpExceptionFilter());
|
|
32
|
+
await app.listen(process.env.PORT ?? 3000);
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Validate environment at startup via `ConfigModule` + schema (`validate` function).
|
|
36
|
+
|
|
37
|
+
## Controllers and services
|
|
38
|
+
|
|
39
|
+
Controllers: parse params/body, delegate, return response DTOs. Services hold rules and coordinate repos. Use `ParseUUIDPipe` and similar built-ins at the edge.
|
|
40
|
+
|
|
41
|
+
## DTOs
|
|
42
|
+
|
|
43
|
+
Request DTOs with `class-validator`; separate response DTOs / `@SerializeOptions` — never return entities with password hashes or internal columns.
|
|
44
|
+
|
|
45
|
+
## Auth
|
|
46
|
+
|
|
47
|
+
Module-local strategies/guards unless shared. Guards for coarse roles; services for row-level checks (`order.ownerId === user.id`).
|
|
48
|
+
|
|
49
|
+
## Errors
|
|
50
|
+
|
|
51
|
+
Global filter maps `HttpException` and unknown errors to one JSON shape; expected client faults use `BadRequestException`, `NotFoundException`, etc.
|
|
52
|
+
|
|
53
|
+
## Persistence
|
|
54
|
+
|
|
55
|
+
Repository providers wrap Prisma/TypeORM; multi-step writes live in a service method with explicit transaction API.
|
|
56
|
+
|
|
57
|
+
## Tests
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
const moduleRef = await Test.createTestingModule({ imports: [UsersModule] }).compile();
|
|
61
|
+
app = moduleRef.createNestApplication();
|
|
62
|
+
app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true }));
|
|
63
|
+
await app.init();
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Mirror production pipes/filters in tests. Unit-test services with mocked ports; e2e-test HTTP with supertest or project pattern.
|
|
67
|
+
|
|
68
|
+
## Production defaults
|
|
69
|
+
|
|
70
|
+
Structured logging + request id; fail boot on bad config; health checks for DB; rate limit and audit on public routes; background consumers in dedicated modules, not inside controllers.
|
|
71
|
+
|
|
72
|
+
## Exception filter (consistent envelope)
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
@Catch()
|
|
76
|
+
export class AllExceptionsFilter implements ExceptionFilter {
|
|
77
|
+
catch(err: unknown, host: ArgumentsHost) {
|
|
78
|
+
const ctx = host.switchToHttp();
|
|
79
|
+
const res = ctx.getResponse<Response>();
|
|
80
|
+
if (err instanceof HttpException) {
|
|
81
|
+
const payload = err.getResponse();
|
|
82
|
+
return res.status(err.getStatus()).json({
|
|
83
|
+
error: typeof payload === 'string' ? { code: 'http_error', message: payload } : payload,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
this.logger.error(err);
|
|
87
|
+
return res.status(500).json({ error: { code: 'internal_error', message: 'Internal server error' } });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Align `code` values with `reference/api-contracts.md` so web and mobile clients share one catalog.
|
|
93
|
+
|
|
94
|
+
## Module boundaries vs hexagonal
|
|
95
|
+
|
|
96
|
+
Nest modules often mirror features (`UsersModule`). Treat `UsersService` as application layer only if it avoids importing `Request`/`Response`. When logic sprawls, extract plain use-case classes and keep Nest providers as adapters that delegate — see `reference/hexagonal-boundaries.md`.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: swift
|
|
3
|
+
description: SwiftUI engineering on Apple platforms — Observation-based state, NavigationStack routing, render performance, and Swift 6.2 approachable concurrency (@MainActor, @concurrent, isolated conformances). Use for Swift/SwiftUI features, view models, navigation, concurrency migration, or data-race fixes.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Engineering guidance for declarative Apple UI and modern Swift concurrency. Covers architecture and performance; platform visuals, HIG, and motion belong in the **native-ui** skill.
|
|
7
|
+
|
|
8
|
+
## Non-negotiable rules
|
|
9
|
+
|
|
10
|
+
1. **Observation first** — New code uses `@Observable` classes, not `ObservableObject` / `@Published` / `@StateObject` / `@EnvironmentObject`.
|
|
11
|
+
2. **Minimal wrappers** — `@State` for view-owned values; `@Binding` for parent two-way links; `@Bindable` for observable two-way fields; `@Environment(Type.self)` for injected services.
|
|
12
|
+
3. **Small view structs** — Extract subviews so invalidation stays local; avoid `AnyView`; prefer `@ViewBuilder` / `Group` for conditionals.
|
|
13
|
+
4. **No work in `body`** — Network, disk, and heavy CPU stay out of `body` and `init`; load with `.task` (auto-cancel on disappear) or explicit async entry points.
|
|
14
|
+
5. **Type-safe navigation** — `NavigationStack` + `NavigationPath` (or bound path) with `Hashable` destinations and `.navigationDestination(for:)`.
|
|
15
|
+
6. **List performance** — `LazyVStack` / lazy stacks in scroll views; `ForEach` with stable IDs, never raw indices; limit shadows/blur/mask in scrolling content.
|
|
16
|
+
7. **Swift 6.2 default** — `async` stays on the **calling actor** unless you explicitly offload; do not assume background execution.
|
|
17
|
+
8. **`@concurrent` sparingly** — Only after Instruments shows CPU-bound hotspots; mark container `nonisolated`, function `@concurrent`, callers `await`.
|
|
18
|
+
9. **MainActor for UI domain** — View models, shared singletons, and global mutable app state belong on `@MainActor` (or MainActor default inference for app targets).
|
|
19
|
+
10. **Isolated conformances** — Prefer `@MainActor` protocol conformances over `nonisolated` hacks or unsafe type erasure when UI types implement shared protocols.
|
|
20
|
+
11. **Sendable at boundaries** — Data crossing actors/tasks must satisfy isolation rules; treat compiler data-race diagnostics as real bugs.
|
|
21
|
+
12. **Previews with fakes** — `#Preview` variants with injected mock repositories/services for empty, loading, and populated states.
|
|
22
|
+
13. **Design vs engineering** — Layout polish, SF Symbols usage, platform chrome → **native-ui**; structural code → **atlas** MCP; API docs → **biblos** MCP.
|
|
23
|
+
|
|
24
|
+
## References
|
|
25
|
+
|
|
26
|
+
| File | Load when |
|
|
27
|
+
|------|-----------|
|
|
28
|
+
| [reference/swiftui.md](reference/swiftui.md) | Composing views, state wiring, navigation router, list/chart performance, preview setup |
|
|
29
|
+
| [reference/concurrency.md](reference/concurrency.md) | Migrating to Swift 6.2, fixing isolation errors, `@concurrent` offload, globals and protocol conformances |
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Swift 6.2 concurrency
|
|
2
|
+
|
|
3
|
+
Approachable Concurrency keeps most code on one actor until you opt into parallelism. Enable features incrementally in Xcode build settings or SPM `SwiftSettings` (MainActor default inference, nonisolated-nonsending-by-default).
|
|
4
|
+
|
|
5
|
+
## Calling actor stays put
|
|
6
|
+
|
|
7
|
+
Earlier runtimes could hop threads implicitly inside `async` work on `@MainActor` types, surfacing false-positive send errors. Swift 6.2 keeps continuation on the caller’s executor unless you mark otherwise:
|
|
8
|
+
|
|
9
|
+
```swift
|
|
10
|
+
@MainActor
|
|
11
|
+
final class ImportModel {
|
|
12
|
+
let pipeline = ImagePipeline()
|
|
13
|
+
|
|
14
|
+
func buildSticker(from pickerItem: PhotosPickerItem) async throws -> Sticker? {
|
|
15
|
+
guard let payload = try await pickerItem.loadTransferable(type: Data.self) else { return nil }
|
|
16
|
+
return await pipeline.renderSticker(payload, id: pickerItem.itemIdentifier)
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Isolated protocol conformances
|
|
22
|
+
|
|
23
|
+
UI-bound types can conform without erasing isolation:
|
|
24
|
+
|
|
25
|
+
```swift
|
|
26
|
+
protocol Exporting { func exportPNG() }
|
|
27
|
+
|
|
28
|
+
extension ImportModel: @MainActor Exporting {
|
|
29
|
+
func exportPNG() { pipeline.flushPNG() }
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Using that conformance from a nonisolated store fails at compile time — intentional.
|
|
34
|
+
|
|
35
|
+
## Globals and shared caches
|
|
36
|
+
|
|
37
|
+
Annotate process-wide mutable singletons with `@MainActor`:
|
|
38
|
+
|
|
39
|
+
```swift
|
|
40
|
+
@MainActor
|
|
41
|
+
final class AssetCache {
|
|
42
|
+
static let shared = AssetCache()
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
With **MainActor default inference** (recommended for app executables), class members inherit main-actor isolation without repeating annotations.
|
|
47
|
+
|
|
48
|
+
## Explicit background work
|
|
49
|
+
|
|
50
|
+
Requirements: approachable-concurrency flags enabled (otherwise the sample below races).
|
|
51
|
+
|
|
52
|
+
```swift
|
|
53
|
+
nonisolated final class ImagePipeline {
|
|
54
|
+
private var memo: [String: Sticker] = [:]
|
|
55
|
+
|
|
56
|
+
func renderSticker(_ data: Data, id: String?) async -> Sticker {
|
|
57
|
+
if let id, let hit = memo[id] { return hit }
|
|
58
|
+
let sticker = await Self.segmentSubject(from: data)
|
|
59
|
+
if let id { memo[id] = sticker }
|
|
60
|
+
return sticker
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@concurrent
|
|
64
|
+
static func segmentSubject(from data: Data) async -> Sticker { /* CPU work */ }
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Steps to offload: container `nonisolated`, hot function `@concurrent` + `async`, call sites `await`.
|
|
69
|
+
|
|
70
|
+
## Migration checklist
|
|
71
|
+
|
|
72
|
+
1. Turn on Swift 6 language mode concurrency checks.
|
|
73
|
+
2. Enable MainActor inference for app targets first.
|
|
74
|
+
3. Fix globals and protocol conformances with isolation, not suppression.
|
|
75
|
+
4. Profile, then add `@concurrent` on proven CPU bottlenecks (decode, compression, layout solvers).
|
|
76
|
+
5. Re-run tests — many races become build failures instead of heisenbugs.
|
|
77
|
+
|
|
78
|
+
## Avoid
|
|
79
|
+
|
|
80
|
+
- Sprinkling `@concurrent` on every `async` function.
|
|
81
|
+
- `nonisolated` solely to silence diagnostics.
|
|
82
|
+
- Legacy `DispatchQueue` patterns where actors express the same contract more clearly.
|
|
83
|
+
- Assuming all `async` calls run off the main thread.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# SwiftUI structure and performance
|
|
2
|
+
|
|
3
|
+
## State and view models
|
|
4
|
+
|
|
5
|
+
Track mutations at property granularity with `@Observable`:
|
|
6
|
+
|
|
7
|
+
```swift
|
|
8
|
+
@Observable
|
|
9
|
+
final class CatalogModel {
|
|
10
|
+
private(set) var entries: [Entry] = []
|
|
11
|
+
private(set) var busy = false
|
|
12
|
+
var filter = ""
|
|
13
|
+
private let gateway: any CatalogGateway
|
|
14
|
+
|
|
15
|
+
init(gateway: any CatalogGateway = LiveCatalogGateway()) {
|
|
16
|
+
self.gateway = gateway
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
func refresh() async {
|
|
20
|
+
busy = true
|
|
21
|
+
defer { busy = false }
|
|
22
|
+
entries = (try? await gateway.load()) ?? []
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Host owned models with `@State` on the root screen:
|
|
28
|
+
|
|
29
|
+
```swift
|
|
30
|
+
struct CatalogScreen: View {
|
|
31
|
+
@State private var model: CatalogModel
|
|
32
|
+
|
|
33
|
+
init(model: CatalogModel = CatalogModel()) {
|
|
34
|
+
_model = State(initialValue: model)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
var body: some View {
|
|
38
|
+
List(model.entries) { row in EntryRow(entry: row) }
|
|
39
|
+
.searchable(text: $model.filter)
|
|
40
|
+
.overlay { if model.busy { ProgressView() } }
|
|
41
|
+
.task { await model.refresh() }
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Inject shared services via environment:
|
|
47
|
+
|
|
48
|
+
```swift
|
|
49
|
+
RootTabs()
|
|
50
|
+
.environment(sessionCoordinator)
|
|
51
|
+
|
|
52
|
+
struct AccountPane: View {
|
|
53
|
+
@Environment(SessionCoordinator.self) private var session
|
|
54
|
+
var body: some View { Text(session.displayName ?? "Signed out") }
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Composition
|
|
59
|
+
|
|
60
|
+
Pass only the data each child reads:
|
|
61
|
+
|
|
62
|
+
```swift
|
|
63
|
+
struct CheckoutScreen: View {
|
|
64
|
+
@State private var model = CheckoutModel()
|
|
65
|
+
var body: some View {
|
|
66
|
+
VStack {
|
|
67
|
+
CheckoutHeader(title: model.title)
|
|
68
|
+
LineItemStack(items: model.lines)
|
|
69
|
+
CheckoutFooter(total: model.grandTotal)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Reusable chrome via modifiers:
|
|
76
|
+
|
|
77
|
+
```swift
|
|
78
|
+
struct PanelChrome: ViewModifier {
|
|
79
|
+
func body(content: Content) -> some View {
|
|
80
|
+
content.padding().background(.regularMaterial)
|
|
81
|
+
.clipShape(RoundedRectangle(cornerRadius: 12))
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
extension View { func panelChrome() -> some View { modifier(PanelChrome()) } }
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Navigation
|
|
88
|
+
|
|
89
|
+
Centralize path mutations:
|
|
90
|
+
|
|
91
|
+
```swift
|
|
92
|
+
@Observable
|
|
93
|
+
final class AppRouter {
|
|
94
|
+
var stack = NavigationPath()
|
|
95
|
+
func open(_ target: Screen) { stack.append(target) }
|
|
96
|
+
func reset() { stack = NavigationPath() }
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
enum Screen: Hashable {
|
|
100
|
+
case detail(UUID)
|
|
101
|
+
case preferences
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
struct ShellView: View {
|
|
105
|
+
@State private var router = AppRouter()
|
|
106
|
+
var body: some View {
|
|
107
|
+
NavigationStack(path: $router.stack) {
|
|
108
|
+
HubView()
|
|
109
|
+
.navigationDestination(for: Screen.self) { screen in
|
|
110
|
+
switch screen {
|
|
111
|
+
case .detail(let id): DetailPane(id: id)
|
|
112
|
+
case .preferences: PreferencesPane()
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
.environment(router)
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Performance tactics
|
|
122
|
+
|
|
123
|
+
- Lazy stacks inside `ScrollView` for long content.
|
|
124
|
+
- `Equatable` on expensive leaf views when inputs are equatable — compare only fields that affect rendering.
|
|
125
|
+
- Avoid expensive effects in cells; prefer `.geometryGroup()` and haptics outside fast scroll regions when needed.
|
|
126
|
+
|
|
127
|
+
```swift
|
|
128
|
+
ScrollView {
|
|
129
|
+
LazyVStack(spacing: 8) {
|
|
130
|
+
ForEach(rows, id: \.persistentKey) { row in RowView(row: row) }
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Avoid
|
|
136
|
+
|
|
137
|
+
- Child-owned `@State` view models for data the parent already owns — pass the model down.
|
|
138
|
+
- Legacy observation wrappers in greenfield code.
|
|
139
|
+
- Async side effects directly inside `body`.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vue
|
|
3
|
+
description: Vue 3 Composition API, Pinia, Vue Router, Nuxt 4 SSR/hydration, and screenshot-to-Vue conversion flows. Use for `.vue` SFCs, composables, Nuxt data fetching, route rules, or batch UI imports (Vant, Element Plus, Ant Design Vue).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Vue 3 with `<script setup>`: feature-oriented folders, composables over mixins, Pinia for shared state, and Nuxt-aware SSR. **techne:web** covers Vite/Bun/SEO shared ground; **ui-design** for a11y polish; **biblos** for API details; **techne:quality** for Playwright E2E.
|
|
7
|
+
|
|
8
|
+
## Non-negotiable rules
|
|
9
|
+
|
|
10
|
+
1. **`<script setup lang="ts">` for new code** — ordered blocks: imports → props/emits → composables → state → computed → methods → watchers → lifecycle.
|
|
11
|
+
2. **Composables start with `use`**, accept `MaybeRef` inputs, return refs/computed, and tear down in `onUnmounted` / watcher cleanup.
|
|
12
|
+
3. **Never mutate props** — emit events or use `defineModel()` / `v-model`.
|
|
13
|
+
4. **Stable `:key` on `v-for`** — entity ids, not array index; filter lists in computed, not `v-if` + `v-for` on one node.
|
|
14
|
+
5. **Pinia setup stores** — async actions expose loading/error; prefer actions over scattered `$patch` for business rules.
|
|
15
|
+
6. **Lazy routes** via dynamic `import()` for non-critical pages; `v-show` for frequent toggles, `v-if` for rare mounts.
|
|
16
|
+
7. **Nuxt: `await useFetch` / `useAsyncData` for SSR page data** — not bare top-level `$fetch`; stable cache keys; side-effect-free fetch handlers.
|
|
17
|
+
8. **Hydration-safe first paint** — no `Date.now()`, random, or `localStorage` in SSR templates; use `ClientOnly`, `.client.vue`, or `onMounted`.
|
|
18
|
+
9. **Use `useRoute()` from Nuxt in Nuxt apps** — not vue-router's import; avoid `route.fullPath` driving SSR markup (fragments are client-only).
|
|
19
|
+
10. **`routeRules` per segment** — prerender marketing, SWR/ISR catalogs, `ssr: false` only for true client-only areas.
|
|
20
|
+
11. **Sanitize before `v-html`** — user HTML is XSS risk; prefer text bindings.
|
|
21
|
+
12. **Screenshot conversion sends images to external APIs** — get permission, pin tool version, never commit keys or customer assets; review generated code before merge.
|
|
22
|
+
|
|
23
|
+
## References
|
|
24
|
+
|
|
25
|
+
| File | Load when |
|
|
26
|
+
|------|-----------|
|
|
27
|
+
| [reference/vue-patterns.md](reference/vue-patterns.md) | Project layout, SFC architecture, Pinia, router, Vue 3.5 APIs, testing |
|
|
28
|
+
| [reference/nuxt4-patterns.md](reference/nuxt4-patterns.md) | Hydration, `useFetch`, route rules, lazy components and hydration |
|
|
29
|
+
| [reference/ui-to-vue.md](reference/ui-to-vue.md) | Batch design screenshot → Vue with component libraries |
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Nuxt 4 SSR & routing
|
|
2
|
+
|
|
3
|
+
Build/debug Nuxt 4 with hybrid rendering, payload discipline, and hydration-safe UI.
|
|
4
|
+
|
|
5
|
+
## Hydration safety
|
|
6
|
+
|
|
7
|
+
First server and client render must match.
|
|
8
|
+
|
|
9
|
+
- No `Date.now()`, `Math.random()`, `window`, or storage reads in SSR template state.
|
|
10
|
+
- Defer browser-only work: `onMounted`, `import.meta.client`, `<ClientOnly>`, `*.client.vue`.
|
|
11
|
+
- In Nuxt apps use **`useRoute()` from `#app`**, not a direct `vue-router` import.
|
|
12
|
+
- Do not drive SSR markup from `route.fullPath` (hash is client-only).
|
|
13
|
+
- `ssr: false` route rule is last resort for truly client-only surfaces—not a default mismatch fix.
|
|
14
|
+
|
|
15
|
+
## Data fetching
|
|
16
|
+
|
|
17
|
+
| API | When |
|
|
18
|
+
|-----|------|
|
|
19
|
+
| `await useFetch(url)` | Standard SSR read; hydrates from payload |
|
|
20
|
+
| `await useAsyncData(key, fn)` | Custom fetcher, composed sources, explicit cache key |
|
|
21
|
+
| `$fetch` in handlers | User actions, mutations, client-only reads |
|
|
22
|
+
| `lazy: true` / `useLazyFetch` | Non-blocking; show `pending` UI |
|
|
23
|
+
| `server: false` | Data not needed for SEO/first paint |
|
|
24
|
+
|
|
25
|
+
Handlers must be side-effect free (run on server + hydration). Trim payload with `pick`; avoid deep reactivity when unnecessary.
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
const route = useRoute()
|
|
29
|
+
|
|
30
|
+
const { data: article, status, refresh } = await useAsyncData(
|
|
31
|
+
() => `article:${route.params.slug}`,
|
|
32
|
+
() => $fetch(`/api/articles/${route.params.slug}`),
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
const { data: comments } = await useFetch(
|
|
36
|
+
`/api/articles/${route.params.slug}/comments`,
|
|
37
|
+
{ lazy: true, server: false },
|
|
38
|
+
)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## routeRules
|
|
42
|
+
|
|
43
|
+
Configure in `nuxt.config.ts` by path pattern:
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
export default defineNuxtConfig({
|
|
47
|
+
routeRules: {
|
|
48
|
+
'/': { prerender: true },
|
|
49
|
+
'/products/**': { swr: 3600 },
|
|
50
|
+
'/blog/**': { isr: true },
|
|
51
|
+
'/admin/**': { ssr: false },
|
|
52
|
+
'/api/**': { cache: { maxAge: 3600 } },
|
|
53
|
+
},
|
|
54
|
+
})
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
| Rule | Effect |
|
|
58
|
+
|------|--------|
|
|
59
|
+
| `prerender` | Static HTML at build |
|
|
60
|
+
| `swr` | Stale-while-revalidate |
|
|
61
|
+
| `isr` | Platform incremental static regen |
|
|
62
|
+
| `ssr: false` | SPA render for route |
|
|
63
|
+
| `cache` / `redirect` | Nitro response behavior |
|
|
64
|
+
|
|
65
|
+
Tune per section (marketing vs app vs API)—not one global mode.
|
|
66
|
+
|
|
67
|
+
## Lazy loading & perf
|
|
68
|
+
|
|
69
|
+
- Pages already code-split by route—keep routes meaningful.
|
|
70
|
+
- Prefix `Lazy` on components for dynamic import; gate with `v-if` so chunk loads only when needed.
|
|
71
|
+
- Below-fold interactivity: `hydrate-on-visible` or `defineLazyHydrationComponent`.
|
|
72
|
+
- New props to a lazy-hydrated component force immediate hydration.
|
|
73
|
+
- Internal nav: `<NuxtLink>` for prefetch of route + payload.
|
|
74
|
+
|
|
75
|
+
Example:
|
|
76
|
+
|
|
77
|
+
```vue
|
|
78
|
+
<template>
|
|
79
|
+
<LazyRecommendations v-if="openRecs" />
|
|
80
|
+
<LazyProductGallery hydrate-on-visible />
|
|
81
|
+
</template>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Review checklist
|
|
85
|
+
|
|
86
|
+
- [ ] SSR and client HTML align on first paint
|
|
87
|
+
- [ ] Page data via `useFetch` / `useAsyncData`, not top-level `$fetch`
|
|
88
|
+
- [ ] Lazy fetches show loading states
|
|
89
|
+
- [ ] `routeRules` match SEO/freshness needs
|
|
90
|
+
- [ ] Heavy islands lazy-loaded or lazy-hydrated
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Design screenshots → Vue components
|
|
2
|
+
|
|
3
|
+
First-pass conversion of batched UI images into Vue 3 SFCs with Vant, Element Plus, or Ant Design Vue. **External model APIs process images—treat responses as untrusted; review all generated code before commit.**
|
|
4
|
+
|
|
5
|
+
## When to use
|
|
6
|
+
|
|
7
|
+
- Folder of module/page screenshots or exports
|
|
8
|
+
- Vue 3 target with a named component library
|
|
9
|
+
- Need scaffold pages, shared widgets, and starter routes
|
|
10
|
+
|
|
11
|
+
## When to skip
|
|
12
|
+
|
|
13
|
+
- Single bespoke screen (implement manually)
|
|
14
|
+
- Non-Vue stack
|
|
15
|
+
- Needs full interaction design, data layer, or a11y sign-off (**ui-design**)
|
|
16
|
+
- Sensitive customer imagery without consent to send to third-party APIs
|
|
17
|
+
|
|
18
|
+
## Input layout
|
|
19
|
+
|
|
20
|
+
Group by module and state:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
screenshots/
|
|
24
|
+
HomePage/
|
|
25
|
+
HomePage-Default@3x.png
|
|
26
|
+
List/HomePage-List-Default@3x.png
|
|
27
|
+
cut-images/
|
|
28
|
+
cut-images/
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Asset folder names: `assets`, `icons`, `sprites`, `cut`, `images`, `cut-images`.
|
|
32
|
+
|
|
33
|
+
## Conversion rules
|
|
34
|
+
|
|
35
|
+
- Merge related shots (list/detail/form/empty) into one page SFC when they belong together
|
|
36
|
+
- Map controls to library components (Vant / Element Plus / Ant Design Vue)
|
|
37
|
+
- Prefer page-level cut assets, then module, then global
|
|
38
|
+
- Extract repeated regions to `components/` only when reuse is obvious
|
|
39
|
+
|
|
40
|
+
## CLI
|
|
41
|
+
|
|
42
|
+
Pin version in repeatable workflows:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
export DASHSCOPE_API_KEY=your_key
|
|
46
|
+
npx ui-to-vue-converter@1.0.2 --input ./screenshots --ui vant --output ./src
|
|
47
|
+
npx ui-to-vue-converter@1.0.2 --input ./designs --ui element-plus --output ./src
|
|
48
|
+
npx ui-to-vue-converter@1.0.2 --input ./designs --ui antd-vue --output ./src
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Global install optional: `ui-to-vue` binary from same package.
|
|
52
|
+
|
|
53
|
+
| Flag | Purpose | Default |
|
|
54
|
+
|------|---------|---------|
|
|
55
|
+
| `--input` | Image root | `./screenshots` |
|
|
56
|
+
| `--ui` | `vant` \| `element-plus` \| `antd-vue` | `vant` |
|
|
57
|
+
| `--output` | Generated tree | `./src` |
|
|
58
|
+
| `--config` | JSON config path | `./.ui-to-vue.config.json` |
|
|
59
|
+
|
|
60
|
+
## Secrets
|
|
61
|
+
|
|
62
|
+
Prefer env var `DASHSCOPE_API_KEY`. If using config file, gitignore it:
|
|
63
|
+
|
|
64
|
+
```gitignore
|
|
65
|
+
.ui-to-vue.config.json
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Never commit API keys, customer screenshots, or generated credentials.
|
|
69
|
+
|
|
70
|
+
## Post-generation review
|
|
71
|
+
|
|
72
|
+
- [ ] Pages under chosen output (e.g. `views/`)
|
|
73
|
+
- [ ] Shared pieces only where duplication is real
|
|
74
|
+
- [ ] Router matches project style (Vue Router vs Nuxt pages)
|
|
75
|
+
- [ ] Library imports consistent with `--ui`
|
|
76
|
+
- [ ] CSS units match design baseline
|
|
77
|
+
- [ ] Formatter, linter, `vue-tsc`, and build pass
|
|
78
|
+
- [ ] Placeholder copy and mock data replaced
|
|
79
|
+
|
|
80
|
+
## Troubleshooting
|
|
81
|
+
|
|
82
|
+
| Symptom | Check |
|
|
83
|
+
|---------|--------|
|
|
84
|
+
| 401 | `DASHSCOPE_API_KEY` in shell running CLI |
|
|
85
|
+
| Command missing | Use `npx ui-to-vue-converter@1.0.2` |
|
|
86
|
+
| Assets skipped | Supported folder name under correct page/module |
|
|
87
|
+
| Wrong library | Explicit `--ui`; inspect imports |
|
|
88
|
+
| Layout scale off | Screenshot width vs library baseline |
|
|
89
|
+
|
|
90
|
+
npm package name: `ui-to-vue-converter`.
|