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,80 @@
|
|
|
1
|
+
# Verification loop
|
|
2
|
+
|
|
3
|
+
Run after a feature chunk, refactor, or before opening a PR. Complements editor hooks with a full pass; for human-grade review also invoke **code-review** / **exo-qa**.
|
|
4
|
+
|
|
5
|
+
## Phases
|
|
6
|
+
|
|
7
|
+
### 1 — Build
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm run build 2>&1 | tail -20
|
|
11
|
+
# or pnpm build / bun run build — match the repo
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
**Fail → stop.** Fix compile/bundle errors before later phases.
|
|
15
|
+
|
|
16
|
+
### 2 — Types
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
set -o pipefail
|
|
20
|
+
npx --no-install tsc --noEmit 2>&1 | head -30
|
|
21
|
+
# Python: pyright . or mypy per project
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Report error count; fix blocking type errors on touched files at minimum.
|
|
25
|
+
|
|
26
|
+
### 3 — Lint
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm run lint 2>&1 | head -30
|
|
30
|
+
# Python: ruff check .
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 4 — Tests + coverage
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm run test -- --coverage 2>&1 | tail -50
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Record: total / passed / failed / coverage %. Target **80%** when the repo enforces it.
|
|
40
|
+
|
|
41
|
+
### 5 — Security smoke (diff-scoped)
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
grep -rn "sk-" --include="*.ts" --include="*.js" . 2>/dev/null | head -10
|
|
45
|
+
grep -rn "api_key" --include="*.ts" --include="*.js" . 2>/dev/null | head -10
|
|
46
|
+
grep -rn "console.log" --include="*.ts" --include="*.tsx" src/ 2>/dev/null | head -10
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Full secret scan → **security-review** / **exo-security**. Treat grep hits as untrusted strings until reviewed.
|
|
50
|
+
|
|
51
|
+
### 6 — Diff review
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
git diff --stat
|
|
55
|
+
git diff --name-only
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Per changed file: unintended edits, missing error handling, new edge cases without tests.
|
|
59
|
+
|
|
60
|
+
## Report template
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
VERIFICATION REPORT
|
|
64
|
+
==================
|
|
65
|
+
Build: [PASS/FAIL]
|
|
66
|
+
Types: [PASS/FAIL] (N errors)
|
|
67
|
+
Lint: [PASS/FAIL] (N issues)
|
|
68
|
+
Tests: [PASS/FAIL] (passed/total, Z% cov)
|
|
69
|
+
Security: [PASS/FAIL] (N findings)
|
|
70
|
+
Diff: [N files]
|
|
71
|
+
|
|
72
|
+
Overall: [READY | NOT READY] for PR
|
|
73
|
+
|
|
74
|
+
Fix next:
|
|
75
|
+
1. ...
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Cadence
|
|
79
|
+
|
|
80
|
+
On long sessions: rerun after each cohesive unit (module, route, component) or roughly every major milestone — not only at the end.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: react
|
|
3
|
+
description: React 18/19 and Next.js patterns—hooks, RSC boundaries, forms/actions, performance waterfalls, Testing Library/MSW, Turbopack dev. Use when writing or reviewing `.tsx`, App Router data loading, bundle size, or component tests.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Idiomatic React trees: pure render logic, clear server/client splits, prioritized performance fixes, and behavior-focused tests. Pair with **atlas** for structure, **biblos** for APIs, **ui-design** for accessibility, **techne:quality** for E2E, and **security-review** / **exo-security** for Server Actions.
|
|
7
|
+
|
|
8
|
+
## Non-negotiable rules
|
|
9
|
+
|
|
10
|
+
1. **Render is a function of props and state** — compute derived values inline; do not sync them through effects.
|
|
11
|
+
2. **Hooks: top-level only**, with cleanup; use functional updates when the next state depends on the previous.
|
|
12
|
+
3. **Do not memoize by default** — add `useMemo`/`useCallback`/`memo` only when profiling or stable child props require it.
|
|
13
|
+
4. **Never import a Server Component from a Client file** — pass server output via `children` or serializable props.
|
|
14
|
+
5. **Treat every Server Action as a public API** — authenticate and authorize inside the action, not in UI gating alone.
|
|
15
|
+
6. **Eliminate async waterfalls first** — cheap sync guards before `await`; parallelize independent work with `Promise.all`; split async server children for parallel RSC fetch.
|
|
16
|
+
7. **No `useEffect` + `fetch` for app data** — use TanStack Query, SWR, RSC `fetch`, or event-handler fetches.
|
|
17
|
+
8. **Direct imports over barrels** — enable Next.js `optimizePackageImports` where available; dynamic-import heavy client-only UI.
|
|
18
|
+
9. **Lists: stable keys and virtualization** when ~50+ non-trivial rows; use ternary conditionals, not `count &&` when `count` may be zero.
|
|
19
|
+
10. **Tests assert user-visible behavior** — RTL query priority (role/label), `userEvent`, MSW at the network layer; axe on interactive components.
|
|
20
|
+
11. **Next.js 16+ dev defaults to Turbopack** — use root **`proxy.ts`** for edge middleware (not legacy `middleware.ts` on 16+).
|
|
21
|
+
12. **No module-level mutable state on the server** — request scope via headers/cookies/`React.cache()` per request.
|
|
22
|
+
|
|
23
|
+
## References
|
|
24
|
+
|
|
25
|
+
| File | Load when |
|
|
26
|
+
|------|-----------|
|
|
27
|
+
| [reference/react-patterns.md](reference/react-patterns.md) | Composition, state placement, RSC, Suspense, forms, data-fetch matrix |
|
|
28
|
+
| [reference/react-performance.md](reference/react-performance.md) | Waterfalls, bundles, server/client perf, re-renders, rendering micro-opts |
|
|
29
|
+
| [reference/react-testing.md](reference/react-testing.md) | Vitest/Jest, RTL, MSW, hooks, a11y asserts, E2E boundary |
|
|
30
|
+
| [reference/nextjs-turbopack.md](reference/nextjs-turbopack.md) | Turbopack dev, webpack fallback, proxy filename, bundle analysis |
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Next.js dev bundler & routing files
|
|
2
|
+
|
|
3
|
+
Next.js 16+ uses **Turbopack** by default for `next dev`: incremental Rust bundler with filesystem cache under `.next` for faster restarts and HMR.
|
|
4
|
+
|
|
5
|
+
## Commands
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
next dev # Turbopack default on 16+
|
|
9
|
+
next build
|
|
10
|
+
next start
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## When to switch bundler
|
|
14
|
+
|
|
15
|
+
| Mode | Use |
|
|
16
|
+
|------|-----|
|
|
17
|
+
| Turbopack (default dev) | Daily development, large apps |
|
|
18
|
+
| Webpack dev | Turbopack bug or webpack-only plugin — pass `--webpack` or version-specific no-turbopack flag per **biblos** / current Next release notes |
|
|
19
|
+
|
|
20
|
+
Production bundler depends on Next version—confirm in docs for your pin.
|
|
21
|
+
|
|
22
|
+
## Practices
|
|
23
|
+
|
|
24
|
+
- Stay on supported 16.x for cache stability.
|
|
25
|
+
- If dev feels slow, confirm Turbopack is active and cache is not wiped each run.
|
|
26
|
+
- Bundle size: use version-appropriate analyzer (16.1+ experimental analyzer per docs).
|
|
27
|
+
- Prefer App Router + Server Components where they fit.
|
|
28
|
+
|
|
29
|
+
## Middleware filename (version-specific)
|
|
30
|
+
|
|
31
|
+
| Next version | Root file |
|
|
32
|
+
|--------------|-----------|
|
|
33
|
+
| 16+ | **`proxy.ts`** |
|
|
34
|
+
| < 16 | `middleware.ts` |
|
|
35
|
+
|
|
36
|
+
This is a **framework version** rule, not a bundler choice. On Next 16+, **`proxy.ts` is correct**—do not rename to `middleware.ts` or edge logic will not run.
|
|
37
|
+
|
|
38
|
+
Confirm against official Next.js proxy/middleware docs for your exact release via **biblos** MCP.
|
|
39
|
+
|
|
40
|
+
## Related
|
|
41
|
+
|
|
42
|
+
App Router data patterns → **react-patterns** and **react-performance** references. Shared Vite/Bun/SEO → **techne:web**.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# React component patterns
|
|
2
|
+
|
|
3
|
+
React 18/19 function components, hooks, RSC-aware composition.
|
|
4
|
+
|
|
5
|
+
## Core rules
|
|
6
|
+
|
|
7
|
+
- **Pure render**: derive totals, filters, labels in render body—not `useEffect` syncing from props.
|
|
8
|
+
- **Effects for external sync**: subscriptions, DOM bridges, logging—not for derived UI state.
|
|
9
|
+
- **Composition**: slots via `children`, named props, or compound components with context.
|
|
10
|
+
|
|
11
|
+
## Hooks
|
|
12
|
+
|
|
13
|
+
- Call hooks unconditionally at top level.
|
|
14
|
+
- Clean up listeners/intervals/subscriptions in effect returns.
|
|
15
|
+
- Functional `setState` when next value depends on previous.
|
|
16
|
+
- Extract custom hooks when the same hook bundle repeats in 2+ components.
|
|
17
|
+
- Default: no memoization until profiler or child memo requires stable references.
|
|
18
|
+
|
|
19
|
+
## State decision tree
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
One component only → useState
|
|
23
|
+
Parent + shallow tree → lift state
|
|
24
|
+
Rare global reads → split Context per concern
|
|
25
|
+
Hot shared updates → Zustand/Jotai/RTK
|
|
26
|
+
Server-backed → TanStack Query / SWR / RSC fetch
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Server / Client (App Router)
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
// Server (default): async, no client JS for this module
|
|
33
|
+
export default async function Page({ params }: { params: { id: string } }) {
|
|
34
|
+
const row = await db.item.findUnique({ where: { id: params.id } })
|
|
35
|
+
if (!row) notFound()
|
|
36
|
+
return <Detail item={row} />
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
'use client'
|
|
40
|
+
export function BuyButton({ sku }: { sku: string }) {
|
|
41
|
+
const [busy, start] = useTransition()
|
|
42
|
+
return (
|
|
43
|
+
<button disabled={busy} onClick={() => start(() => addToCart(sku))}>
|
|
44
|
+
{busy ? 'Adding…' : 'Add'}
|
|
45
|
+
</button>
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
- Pass serializable props or `children` from server → client.
|
|
51
|
+
- Server Actions from forms or events; never import server modules into client files.
|
|
52
|
+
|
|
53
|
+
## Suspense + errors
|
|
54
|
+
|
|
55
|
+
Nest `<Suspense>` near data consumers; wrap with error boundary (class or `react-error-boundary`). Boundaries catch render/lifecycle throws—not event handler errors.
|
|
56
|
+
|
|
57
|
+
## Forms
|
|
58
|
+
|
|
59
|
+
- React 19: `useActionState` + server action with schema validation (Zod, etc.).
|
|
60
|
+
- Controlled inputs when value drives other UI or live validation.
|
|
61
|
+
- Non-trivial wizards → React Hook Form / TanStack Form.
|
|
62
|
+
|
|
63
|
+
## Data fetching matrix
|
|
64
|
+
|
|
65
|
+
| Need | Tool |
|
|
66
|
+
|------|------|
|
|
67
|
+
| Per-request in App Router | RSC `await fetch()` |
|
|
68
|
+
| Client cache + mutations | TanStack Query |
|
|
69
|
+
| Lightweight revalidate | SWR |
|
|
70
|
+
| One-off user action | `fetch` in handler |
|
|
71
|
+
|
|
72
|
+
## Composition recipes
|
|
73
|
+
|
|
74
|
+
Named slots: `<Shell header={<Nav />} aside={<Filters />}>{body}</Shell>`
|
|
75
|
+
|
|
76
|
+
Compound tabs pattern with context (see **techne:web** reference) or headless UI primitives.
|
|
77
|
+
|
|
78
|
+
## Performance (basics)
|
|
79
|
+
|
|
80
|
+
`React.memo` only if child is expensive and props often unchanged. Split context so theme changes do not rerender notification consumers. List keys = stable ids; virtualize long lists.
|
|
81
|
+
|
|
82
|
+
## Accessibility
|
|
83
|
+
|
|
84
|
+
Semantic HTML before ARIA. Label every input. Move focus on route/modal changes. Component tests: axe (see **react-testing** reference). Full audit → **ui-design**.
|
|
85
|
+
|
|
86
|
+
## Examples
|
|
87
|
+
|
|
88
|
+
**Debounced search + query**
|
|
89
|
+
|
|
90
|
+
```tsx
|
|
91
|
+
function useDebounced<T>(value: T, ms = 300) {
|
|
92
|
+
const [out, setOut] = useState(value)
|
|
93
|
+
useEffect(() => {
|
|
94
|
+
const t = setTimeout(() => setOut(value), ms)
|
|
95
|
+
return () => clearTimeout(t)
|
|
96
|
+
}, [value, ms])
|
|
97
|
+
return out
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function Search() {
|
|
101
|
+
const [q, setQ] = useState('')
|
|
102
|
+
const debounced = useDebounced(q)
|
|
103
|
+
const { data } = useQuery({
|
|
104
|
+
queryKey: ['search', debounced],
|
|
105
|
+
queryFn: () => apiSearch(debounced),
|
|
106
|
+
enabled: debounced.length > 0,
|
|
107
|
+
})
|
|
108
|
+
return (
|
|
109
|
+
<>
|
|
110
|
+
<input value={q} onChange={e => setQ(e.target.value)} />
|
|
111
|
+
<ResultList items={data ?? []} />
|
|
112
|
+
</>
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**Optimistic list (React 19)**
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
'use client'
|
|
121
|
+
import { useOptimistic } from 'react'
|
|
122
|
+
|
|
123
|
+
export function Thread({ messages }: { messages: Msg[] }) {
|
|
124
|
+
const [view, append] = useOptimistic(messages, (cur, msg: Msg) => [...cur, msg])
|
|
125
|
+
async function send(fd: FormData) {
|
|
126
|
+
const text = String(fd.get('text'))
|
|
127
|
+
append({ id: 'tmp', text })
|
|
128
|
+
await persist(text)
|
|
129
|
+
}
|
|
130
|
+
return (
|
|
131
|
+
<>
|
|
132
|
+
<ul>{view.map(m => <li key={m.id}>{m.text}</li>)}</ul>
|
|
133
|
+
<form action={send}><input name="text" /><button>Send</button></form>
|
|
134
|
+
</>
|
|
135
|
+
)
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Router-specific loaders (React Router, TanStack Router) follow that router's docs—patterns above are core React.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# React / Next.js performance
|
|
2
|
+
|
|
3
|
+
Prioritized checklist for reviews. When React Compiler ships in project, treat manual memo rules as secondary.
|
|
4
|
+
|
|
5
|
+
## Priority map
|
|
6
|
+
|
|
7
|
+
| P | Area | Trigger |
|
|
8
|
+
|---|------|---------|
|
|
9
|
+
| 1 | Async waterfalls | Sequential independent `await` |
|
|
10
|
+
| 2 | Bundle size | First-load JS, heavy imports |
|
|
11
|
+
| 3 | Server (RSC, actions) | SSR data paths, serialization |
|
|
12
|
+
| 4 | Client fetching | Shared remote state in hooks |
|
|
13
|
+
| 5 | Re-renders | Store subscriptions, prop identity |
|
|
14
|
+
| 6 | Rendering | Lists, animation, hydration |
|
|
15
|
+
| 7 | JS micro | Hot loops, allocations |
|
|
16
|
+
| 8 | Advanced | Effect events, ref indirection |
|
|
17
|
+
|
|
18
|
+
## 1 — Waterfalls
|
|
19
|
+
|
|
20
|
+
- Guard with sync checks before first `await`.
|
|
21
|
+
- Defer `await` to the branch that needs the result.
|
|
22
|
+
- Independent calls: `Promise.all([...])`.
|
|
23
|
+
- Start promises early, await late when dependencies differ.
|
|
24
|
+
- RSC: split async siblings instead of one sequential parent.
|
|
25
|
+
|
|
26
|
+
Streaming: tight Suspense boundaries; reserve space to limit CLS.
|
|
27
|
+
|
|
28
|
+
## 2 — Bundle
|
|
29
|
+
|
|
30
|
+
- Import from concrete module paths, not `@/components` barrels.
|
|
31
|
+
- Next 13.5+: `experimental.optimizePackageImports` for listed packages.
|
|
32
|
+
- No dynamic template imports—use explicit branches.
|
|
33
|
+
- `next/dynamic` for heavy client-only widgets (`ssr: false` when needed).
|
|
34
|
+
- Defer analytics/support with `next/script` `afterInteractive` / `lazyOnload`.
|
|
35
|
+
- Preload route chunks on hover/focus when UX warrants.
|
|
36
|
+
|
|
37
|
+
## 3 — Server
|
|
38
|
+
|
|
39
|
+
- AuthZ inside Server Actions (same bar as HTTP handlers).
|
|
40
|
+
- `React.cache()` dedupes per-request reads.
|
|
41
|
+
- Cross-request static data: LRU / `unstable_cache`, not module globals.
|
|
42
|
+
- Hoist static file reads to module scope once.
|
|
43
|
+
- **No mutable module state** shared across requests.
|
|
44
|
+
- Minimize props serialized to client components.
|
|
45
|
+
- Nested enrichment: `Promise.all` over items.
|
|
46
|
+
- Next 15+: `after()` for logging/analytics post-response.
|
|
47
|
+
|
|
48
|
+
## 4 — Client data
|
|
49
|
+
|
|
50
|
+
- TanStack Query / SWR for shared reads—one cache, one flight.
|
|
51
|
+
- One global scroll/resize listener via shared hook, not per component.
|
|
52
|
+
- `{ passive: true }` on scroll listeners when not preventing default.
|
|
53
|
+
- `localStorage`: version field + small payloads (sync blocking).
|
|
54
|
+
|
|
55
|
+
## 5 — Re-renders
|
|
56
|
+
|
|
57
|
+
- Read store inside event handler with `.getState()` when render does not need subscription.
|
|
58
|
+
- Memoize heavy child; hoist `const EMPTY: T[] = []` for default array props.
|
|
59
|
+
- Effect deps: primitives, not fresh object literals.
|
|
60
|
+
- Select derived booleans from store (`length > 0`) not whole cart object.
|
|
61
|
+
- Derive strings in render, not effect → setState.
|
|
62
|
+
- `useState(() => expensiveInit())` for costly initial state.
|
|
63
|
+
- Skip memo on trivial primitive math.
|
|
64
|
+
- Split hooks with unrelated deps.
|
|
65
|
+
- Prefer event handlers over effects for user-driven logic.
|
|
66
|
+
- `startTransition` / `useDeferredValue` for non-urgent/filter UI.
|
|
67
|
+
- `useRef` for high-frequency non-visual state.
|
|
68
|
+
- Never define components inside components.
|
|
69
|
+
|
|
70
|
+
## 6 — Rendering
|
|
71
|
+
|
|
72
|
+
- Animate wrapper div, not raw SVG transforms.
|
|
73
|
+
- `content-visibility: auto` + intrinsic size for long lists.
|
|
74
|
+
- Hoist static JSX fragments.
|
|
75
|
+
- Trim SVG path precision.
|
|
76
|
+
- Theme/locale before hydration: inline script on `documentElement` when needed.
|
|
77
|
+
- `suppressHydrationWarning` only on known leaf mismatches (e.g. live clock).
|
|
78
|
+
- React 19 `<Activity mode="hidden">` vs unmount for tabs.
|
|
79
|
+
- `{n > 0 ? <Badge /> : null}` not `{n && <Badge />}`.
|
|
80
|
+
- `preload` / `preconnect` from `react-dom`.
|
|
81
|
+
|
|
82
|
+
## 7 — JS micro
|
|
83
|
+
|
|
84
|
+
Batch DOM class changes; `Map`/`Set` for hot lookups; combine filter+map passes; early returns; hoist RegExp; min/max via loop not sort; `requestIdleCallback` for deferrable work.
|
|
85
|
+
|
|
86
|
+
## 8 — Advanced
|
|
87
|
+
|
|
88
|
+
Stable handler via ref + empty-deps callback; `useLatest` helper; do not list `useEffectEvent` values in effect deps.
|
|
89
|
+
|
|
90
|
+
## Tooling
|
|
91
|
+
|
|
92
|
+
Next Optimize Package Imports, bundle analyzer, Turbopack dev builds. React Compiler (when enabled) reduces manual memo need.
|
|
93
|
+
|
|
94
|
+
## Web Vitals mapping
|
|
95
|
+
|
|
96
|
+
| Metric | Focus |
|
|
97
|
+
|--------|--------|
|
|
98
|
+
| LCP | Waterfalls, bundle, hints |
|
|
99
|
+
| INP | Re-renders, main-thread JS |
|
|
100
|
+
| CLS | Suspense placement, media dimensions |
|
|
101
|
+
| TBT | Bundle, third-party defer |
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# React testing
|
|
2
|
+
|
|
3
|
+
Behavior-first tests with React Testing Library (RTL). Accessibility depth → **ui-design**; full flows → **techne:quality** / Playwright.
|
|
4
|
+
|
|
5
|
+
## Principle
|
|
6
|
+
|
|
7
|
+
Assert what users see and do:
|
|
8
|
+
|
|
9
|
+
- Render with production-like providers
|
|
10
|
+
- Query by role, label, text; interact with `@testing-library/user-event`
|
|
11
|
+
- Check visible outcomes and side effects (callbacks, network)
|
|
12
|
+
|
|
13
|
+
Avoid: internal state, hook call counts, shallow DOM snapshots of components, mocking React.
|
|
14
|
+
|
|
15
|
+
## Runners
|
|
16
|
+
|
|
17
|
+
| Tool | Typical stack |
|
|
18
|
+
|------|----------------|
|
|
19
|
+
| Vitest | Vite, modern ESM |
|
|
20
|
+
| Jest | Next.js, older repos |
|
|
21
|
+
| Playwright CT | Needs real layout/browser APIs |
|
|
22
|
+
|
|
23
|
+
Pick one primary unit/component runner unless lanes are explicit.
|
|
24
|
+
|
|
25
|
+
## Queries (priority)
|
|
26
|
+
|
|
27
|
+
1. `getByRole`, `getByLabelText`, `getByPlaceholderText`, `getByText`
|
|
28
|
+
2. `getByAltText`, `getByTitle`
|
|
29
|
+
3. `getByTestId` last
|
|
30
|
+
|
|
31
|
+
Variants: `getBy*` (must exist), `queryBy*` (absence), `findBy*` (async appear).
|
|
32
|
+
|
|
33
|
+
## userEvent
|
|
34
|
+
|
|
35
|
+
```tsx
|
|
36
|
+
const user = userEvent.setup()
|
|
37
|
+
await user.type(screen.getByLabelText('Email'), 'a@b.co')
|
|
38
|
+
await user.click(screen.getByRole('button', { name: /save/i }))
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Always await; prefer userEvent over raw `fireEvent`.
|
|
42
|
+
|
|
43
|
+
## Async
|
|
44
|
+
|
|
45
|
+
```tsx
|
|
46
|
+
expect(await screen.findByText('Done')).toBeInTheDocument()
|
|
47
|
+
await waitFor(() => expect(spy).toHaveBeenCalled())
|
|
48
|
+
await waitForElementToBeRemoved(() => screen.queryByText('Loading'))
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
No arbitrary `setTimeout`.
|
|
52
|
+
|
|
53
|
+
## MSW
|
|
54
|
+
|
|
55
|
+
Network-layer mocks; unhandled requests should fail tests:
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
import { setupServer } from 'msw/node'
|
|
59
|
+
import { http, HttpResponse } from 'msw'
|
|
60
|
+
|
|
61
|
+
export const server = setupServer(
|
|
62
|
+
http.get('/api/users/:id', ({ params }) =>
|
|
63
|
+
HttpResponse.json({ id: params.id, name: 'Ada' }),
|
|
64
|
+
),
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
beforeAll(() => server.listen({ onUnhandledRequest: 'error' }))
|
|
68
|
+
afterEach(() => server.resetHandlers())
|
|
69
|
+
afterAll(() => server.close())
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Per-test override with `server.use(...)`.
|
|
73
|
+
|
|
74
|
+
## Providers
|
|
75
|
+
|
|
76
|
+
Central `renderWithProviders` wrapping QueryClient (retry: false), theme, router—import from `test-utils` in specs.
|
|
77
|
+
|
|
78
|
+
## Hooks
|
|
79
|
+
|
|
80
|
+
`renderHook` + `act` for updates. QueryClient instance **outside** wrapper factory to avoid cache reset flakiness.
|
|
81
|
+
|
|
82
|
+
## Accessibility in tests
|
|
83
|
+
|
|
84
|
+
```tsx
|
|
85
|
+
import { axe, toHaveNoViolations } from 'vitest-axe'
|
|
86
|
+
expect.extend(toHaveNoViolations)
|
|
87
|
+
|
|
88
|
+
test('card a11y', async () => {
|
|
89
|
+
const { container } = render(<Card user={mock} />)
|
|
90
|
+
expect(await axe(container)).toHaveNoViolations()
|
|
91
|
+
})
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Contrast in JSDOM is limited—visual contrast in browser E2E.
|
|
95
|
+
|
|
96
|
+
## Snapshots
|
|
97
|
+
|
|
98
|
+
Avoid DOM snapshots for components. OK for pure serializers or generated config strings. Visual diffs → Playwright/Chromatic.
|
|
99
|
+
|
|
100
|
+
## RTL vs E2E
|
|
101
|
+
|
|
102
|
+
| RTL | Playwright / Cypress |
|
|
103
|
+
|-----|----------------------|
|
|
104
|
+
| Hook logic, forms, presentational UI | Layout, scroll, DnD, multi-page flows |
|
|
105
|
+
| Fast feedback | Real browser |
|
|
106
|
+
|
|
107
|
+
## Coverage (orienting targets)
|
|
108
|
+
|
|
109
|
+
| Layer | Aim |
|
|
110
|
+
|-------|-----|
|
|
111
|
+
| Pure utils | ~90% |
|
|
112
|
+
| Hooks | ~85% |
|
|
113
|
+
| Presentational | ~80% behavior |
|
|
114
|
+
| Containers | ~70% happy + error paths |
|
|
115
|
+
| Pages | E2E smoke + critical RTL |
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
// vitest.config.ts excerpt
|
|
119
|
+
coverage: {
|
|
120
|
+
provider: 'v8',
|
|
121
|
+
thresholds: { lines: 80, functions: 80, branches: 70, statements: 80 },
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Anti-patterns
|
|
126
|
+
|
|
127
|
+
`container.querySelector`, mocking children by default, ignoring `act` warnings, shared mutable fixtures, `jest.mock('react')`.
|
|
128
|
+
|
|
129
|
+
## TDD loop
|
|
130
|
+
|
|
131
|
+
Red → minimal green → refactor; start from simplest prop/render test, grow cases.
|
|
132
|
+
|
|
133
|
+
## Commands
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
vitest run
|
|
137
|
+
vitest run --coverage
|
|
138
|
+
CI=true vitest run --coverage
|
|
139
|
+
```
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: react-native
|
|
3
|
+
description: React Native and Expo engineering — Expo Router file routes, Zod-validated params, TanStack Query server state, list virtualization, StyleSheet/NativeWind styling, native module hooks, and secure token storage. Use when building or reviewing RN/Expo screens, navigation, data layers, or device APIs.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Mobile React patterns for the managed Expo workflow and New Architecture defaults. Not for web DOM stacks — use **techne:react** / **techne:web** there. Native look-and-feel and platform conventions → **native-ui**.
|
|
7
|
+
|
|
8
|
+
## Non-negotiable rules
|
|
9
|
+
|
|
10
|
+
1. **Thin routes** — Files under `app/` parse/validate params and render a screen from `features/` or `components/`.
|
|
11
|
+
2. **Validate externals** — Zod (or equivalent) on deep-link params, push payloads, and JSON from APIs before use.
|
|
12
|
+
3. **Server state in the cache** — TanStack Query (or similar) owns remote data; do not mirror it into Zustand/Jotai.
|
|
13
|
+
4. **Virtualized lists** — `FlatList` / FlashList for non-trivial collections; never `ScrollView` + `.map` for long arrays.
|
|
14
|
+
5. **Stable list props** — Memoized row components, `useCallback` `renderItem`, deterministic `keyExtractor`.
|
|
15
|
+
6. **One styling system** — `StyleSheet.create` at module scope **or** utility classes (e.g. NativeWind); avoid fresh inline objects on hot paths.
|
|
16
|
+
7. **Secrets** — `expo-secure-store` (Keychain/Keystore) for tokens; AsyncStorage/MMKV only for non-sensitive prefs.
|
|
17
|
+
8. **UI states** — Every screen handles loading, error (with `accessibilityRole="alert"` when appropriate), and empty data explicitly.
|
|
18
|
+
9. **Native side effects in hooks** — Permissions, location, subscriptions live in `use*` hooks with cancellation flags / cleanup.
|
|
19
|
+
10. **No privileged keys in bundle** — Payment and admin secrets stay server-side; ship public keys only.
|
|
20
|
+
11. **Animation thread** — Prefer Reanimated for motion; keep heavy work off the JS thread.
|
|
21
|
+
12. **Dependency check** — Confirm New Architecture support before adding native modules.
|
|
22
|
+
13. **Support skills** — Shared TS idioms → **techne:quality** / coding standards; E2E → **techne:quality** browser-qa/e2e patterns with RN test libs; security → **exo-security**; API docs → **biblos** MCP.
|
|
23
|
+
|
|
24
|
+
## References
|
|
25
|
+
|
|
26
|
+
| File | Load when |
|
|
27
|
+
|------|-----------|
|
|
28
|
+
| [reference/expo-patterns.md](reference/expo-patterns.md) | Router layout, queries/mutations, lists, forms, hooks, anti-patterns |
|