@xonovex/skills 0.1.0
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/.claude-plugin/plugin.json +21 -0
- package/commands/code-align.md +108 -0
- package/commands/code-harden.md +74 -0
- package/commands/code-simplify.md +145 -0
- package/commands/git-commit.md +146 -0
- package/commands/insights-extract.md +109 -0
- package/commands/insights-integrate.md +100 -0
- package/commands/plan-continue.md +167 -0
- package/commands/plan-create.md +107 -0
- package/commands/plan-research.md +113 -0
- package/commands/plan-subplans-create.md +111 -0
- package/commands/plan-tdd-create.md +128 -0
- package/commands/plan-update.md +99 -0
- package/commands/plan-validate.md +100 -0
- package/commands/plan-worktree-abandon.md +104 -0
- package/commands/plan-worktree-create.md +92 -0
- package/commands/plan-worktree-merge.md +132 -0
- package/package.json +44 -0
- package/skills/astro-guidelines/SKILL.md +23 -0
- package/skills/astro-guidelines/reference/accessibility.md +31 -0
- package/skills/astro-guidelines/reference/components.md +42 -0
- package/skills/astro-guidelines/reference/content-collections.md +32 -0
- package/skills/astro-guidelines/reference/islands-architecture.md +26 -0
- package/skills/astro-guidelines/reference/project-structure.md +32 -0
- package/skills/c99-game-opinionated-guidelines/SKILL.md +43 -0
- package/skills/c99-game-opinionated-guidelines/reference/builder-pattern.md +29 -0
- package/skills/c99-game-opinionated-guidelines/reference/coordinate-system.md +27 -0
- package/skills/c99-game-opinionated-guidelines/reference/geometry-pipeline.md +29 -0
- package/skills/c99-game-opinionated-guidelines/reference/math-types.md +31 -0
- package/skills/c99-game-opinionated-guidelines/reference/mesh-types.md +32 -0
- package/skills/c99-game-opinionated-guidelines/reference/physics-patterns.md +28 -0
- package/skills/c99-game-opinionated-guidelines/reference/spatial-structures.md +26 -0
- package/skills/c99-game-opinionated-guidelines/reference/tagged-unions.md +40 -0
- package/skills/c99-game-opinionated-guidelines/reference/vertex-packing.md +38 -0
- package/skills/c99-guidelines/SKILL.md +29 -0
- package/skills/c99-guidelines/reference/compound-literals.md +33 -0
- package/skills/c99-guidelines/reference/const-correctness.md +32 -0
- package/skills/c99-guidelines/reference/designated-initializers.md +32 -0
- package/skills/c99-guidelines/reference/error-handling.md +49 -0
- package/skills/c99-guidelines/reference/inline-functions.md +37 -0
- package/skills/c99-guidelines/reference/memory-management.md +35 -0
- package/skills/c99-opinionated-guidelines/SKILL.md +44 -0
- package/skills/c99-opinionated-guidelines/reference/alignment.md +50 -0
- package/skills/c99-opinionated-guidelines/reference/caller-owns-memory.md +38 -0
- package/skills/c99-opinionated-guidelines/reference/compound-literals.md +33 -0
- package/skills/c99-opinionated-guidelines/reference/const-correctness.md +32 -0
- package/skills/c99-opinionated-guidelines/reference/data-oriented-design.md +42 -0
- package/skills/c99-opinionated-guidelines/reference/designated-initializers.md +32 -0
- package/skills/c99-opinionated-guidelines/reference/error-handling.md +49 -0
- package/skills/c99-opinionated-guidelines/reference/file-naming.md +33 -0
- package/skills/c99-opinionated-guidelines/reference/implementation-variants.md +35 -0
- package/skills/c99-opinionated-guidelines/reference/inline-functions.md +37 -0
- package/skills/c99-opinionated-guidelines/reference/memory-management.md +35 -0
- package/skills/c99-opinionated-guidelines/reference/safety-validations.md +32 -0
- package/skills/c99-opinionated-guidelines/reference/testing-patterns.md +39 -0
- package/skills/cmake-guidelines/SKILL.md +31 -0
- package/skills/cmake-guidelines/reference/compile-options.md +34 -0
- package/skills/cmake-guidelines/reference/fetchcontent.md +32 -0
- package/skills/cmake-guidelines/reference/find-package.md +29 -0
- package/skills/cmake-guidelines/reference/generator-expressions.md +34 -0
- package/skills/cmake-guidelines/reference/installation.md +38 -0
- package/skills/cmake-guidelines/reference/project-structure.md +40 -0
- package/skills/cmake-guidelines/reference/target-types.md +37 -0
- package/skills/cmake-guidelines/reference/testing.md +30 -0
- package/skills/cmake-guidelines/reference/visibility-specifiers.md +32 -0
- package/skills/content-guidelines/SKILL.md +36 -0
- package/skills/content-guidelines/reference/humanize.md +30 -0
- package/skills/content-guidelines/reference/news.md +28 -0
- package/skills/content-guidelines/reference/travelguide.md +31 -0
- package/skills/docker-guidelines/SKILL.md +23 -0
- package/skills/docker-guidelines/reference/docker-compose.md +40 -0
- package/skills/docker-guidelines/reference/layer-caching.md +25 -0
- package/skills/docker-guidelines/reference/multi-stage-builds.md +37 -0
- package/skills/docker-guidelines/reference/production-config.md +32 -0
- package/skills/docker-guidelines/reference/security.md +27 -0
- package/skills/express.js-guidelines/SKILL.md +32 -0
- package/skills/express.js-guidelines/reference/app-setup.md +39 -0
- package/skills/express.js-guidelines/reference/authentication.md +39 -0
- package/skills/express.js-guidelines/reference/controllers.md +49 -0
- package/skills/express.js-guidelines/reference/error-handling.md +54 -0
- package/skills/express.js-guidelines/reference/project-structure.md +29 -0
- package/skills/express.js-guidelines/reference/responses.md +30 -0
- package/skills/express.js-guidelines/reference/routes.md +29 -0
- package/skills/express.js-guidelines/reference/testing.md +39 -0
- package/skills/express.js-guidelines/reference/validation.md +41 -0
- package/skills/general-fp-guidelines/SKILL.md +28 -0
- package/skills/general-oop-guidelines/SKILL.md +28 -0
- package/skills/git-guidelines/SKILL.md +46 -0
- package/skills/git-guidelines/reference/commit.md +32 -0
- package/skills/git-guidelines/reference/merge-resolve.md +38 -0
- package/skills/git-guidelines/reference/worktree-abandon.md +48 -0
- package/skills/git-guidelines/reference/worktree-cleanup.md +40 -0
- package/skills/git-guidelines/reference/worktree-commit.md +46 -0
- package/skills/git-guidelines/reference/worktree-create.md +42 -0
- package/skills/git-guidelines/reference/worktree-merge.md +45 -0
- package/skills/git-guidelines/reference/worktree-validate.md +44 -0
- package/skills/hono-guidelines/SKILL.md +49 -0
- package/skills/hono-guidelines/reference/application-structure.md +53 -0
- package/skills/hono-guidelines/reference/context-storage.md +46 -0
- package/skills/hono-guidelines/reference/cookie-handling.md +63 -0
- package/skills/hono-guidelines/reference/error-handling.md +69 -0
- package/skills/hono-guidelines/reference/middleware-combine.md +47 -0
- package/skills/hono-guidelines/reference/middleware-patterns.md +58 -0
- package/skills/hono-guidelines/reference/platform-runtime.md +41 -0
- package/skills/hono-guidelines/reference/security-middleware.md +60 -0
- package/skills/hono-guidelines/reference/validation-type-safety.md +43 -0
- package/skills/hono-guidelines/reference/websocket-support.md +59 -0
- package/skills/hono-opinionated-guidelines/SKILL.md +49 -0
- package/skills/hono-opinionated-guidelines/reference/application-structure.md +53 -0
- package/skills/hono-opinionated-guidelines/reference/body-limit.md +57 -0
- package/skills/hono-opinionated-guidelines/reference/context-storage.md +46 -0
- package/skills/hono-opinionated-guidelines/reference/controllers.md +38 -0
- package/skills/hono-opinionated-guidelines/reference/cookie-handling.md +63 -0
- package/skills/hono-opinionated-guidelines/reference/error-handling.md +69 -0
- package/skills/hono-opinionated-guidelines/reference/middleware-combine.md +47 -0
- package/skills/hono-opinionated-guidelines/reference/middleware-patterns.md +58 -0
- package/skills/hono-opinionated-guidelines/reference/openapi-explicit-status-codes.md +61 -0
- package/skills/hono-opinionated-guidelines/reference/openapi-inline-handlers.md +56 -0
- package/skills/hono-opinionated-guidelines/reference/openapi-router-hierarchy.md +64 -0
- package/skills/hono-opinionated-guidelines/reference/openapi-spec-generation.md +57 -0
- package/skills/hono-opinionated-guidelines/reference/platform-runtime.md +41 -0
- package/skills/hono-opinionated-guidelines/reference/router-selection.md +34 -0
- package/skills/hono-opinionated-guidelines/reference/security-middleware.md +60 -0
- package/skills/hono-opinionated-guidelines/reference/validation-type-safety.md +43 -0
- package/skills/hono-opinionated-guidelines/reference/websocket-support.md +59 -0
- package/skills/insights-guidelines/SKILL.md +28 -0
- package/skills/insights-guidelines/reference/insights-extract.md +31 -0
- package/skills/insights-guidelines/reference/insights-integrate.md +35 -0
- package/skills/instruction-guidelines/SKILL.md +26 -0
- package/skills/instruction-guidelines/reference/assimilate.md +38 -0
- package/skills/instruction-guidelines/reference/simplify.md +46 -0
- package/skills/instruction-guidelines/reference/sync.md +41 -0
- package/skills/kubernetes-guidelines/SKILL.md +28 -0
- package/skills/kubernetes-guidelines/reference/configmaps-secrets.md +34 -0
- package/skills/kubernetes-guidelines/reference/deployments.md +55 -0
- package/skills/kubernetes-guidelines/reference/kustomize.md +41 -0
- package/skills/kubernetes-guidelines/reference/network-policies.md +53 -0
- package/skills/kubernetes-guidelines/reference/services.md +36 -0
- package/skills/kubernetes-guidelines/reference/validation.md +32 -0
- package/skills/lua-guidelines/SKILL.md +29 -0
- package/skills/lua-guidelines/reference/coroutines.md +66 -0
- package/skills/lua-guidelines/reference/error-handling.md +41 -0
- package/skills/lua-guidelines/reference/idiomatic-patterns.md +40 -0
- package/skills/lua-guidelines/reference/input-validation.md +42 -0
- package/skills/lua-guidelines/reference/local-variables.md +33 -0
- package/skills/lua-guidelines/reference/metatables.md +52 -0
- package/skills/lua-guidelines/reference/module-pattern.md +37 -0
- package/skills/lua-guidelines/reference/string-concatenation.md +31 -0
- package/skills/lua-opinionated-guidelines/SKILL.md +32 -0
- package/skills/lua-opinionated-guidelines/reference/cache-lookups.md +43 -0
- package/skills/lua-opinionated-guidelines/reference/coroutines.md +66 -0
- package/skills/lua-opinionated-guidelines/reference/error-handling.md +41 -0
- package/skills/lua-opinionated-guidelines/reference/idiomatic-patterns.md +40 -0
- package/skills/lua-opinionated-guidelines/reference/input-validation.md +42 -0
- package/skills/lua-opinionated-guidelines/reference/jit-friendly-tables.md +57 -0
- package/skills/lua-opinionated-guidelines/reference/local-variables.md +33 -0
- package/skills/lua-opinionated-guidelines/reference/metatables.md +52 -0
- package/skills/lua-opinionated-guidelines/reference/module-pattern.md +37 -0
- package/skills/lua-opinionated-guidelines/reference/string-concatenation.md +31 -0
- package/skills/moon-guidelines/SKILL.md +30 -0
- package/skills/moon-guidelines/reference/docker-multistage.md +42 -0
- package/skills/moon-guidelines/reference/project-constraints.md +25 -0
- package/skills/moon-guidelines/reference/query-language.md +27 -0
- package/skills/moon-guidelines/reference/tag-based-filtering.md +28 -0
- package/skills/moon-guidelines/reference/task-configuration.md +38 -0
- package/skills/moon-guidelines/reference/task-inheritance.md +30 -0
- package/skills/motion-react-guidelines/SKILL.md +66 -0
- package/skills/motion-react-guidelines/reference/3d-effects.md +35 -0
- package/skills/motion-react-guidelines/reference/entrance.md +36 -0
- package/skills/motion-react-guidelines/reference/exit.md +35 -0
- package/skills/motion-react-guidelines/reference/gestures.md +23 -0
- package/skills/motion-react-guidelines/reference/layout.md +39 -0
- package/skills/motion-react-guidelines/reference/motion-values.md +33 -0
- package/skills/motion-react-guidelines/reference/performance.md +32 -0
- package/skills/motion-react-guidelines/reference/scroll.md +38 -0
- package/skills/motion-react-guidelines/reference/spring-physics.md +40 -0
- package/skills/motion-react-guidelines/reference/stagger.md +34 -0
- package/skills/motion-react-guidelines/reference/svg-path.md +33 -0
- package/skills/motion-react-guidelines/reference/text-effects.md +39 -0
- package/skills/plan-guidelines/SKILL.md +56 -0
- package/skills/plan-guidelines/reference/code-align.md +23 -0
- package/skills/plan-guidelines/reference/code-barrels-remove.md +24 -0
- package/skills/plan-guidelines/reference/code-comments-remove.md +28 -0
- package/skills/plan-guidelines/reference/code-harden.md +30 -0
- package/skills/plan-guidelines/reference/code-shared-extract.md +25 -0
- package/skills/plan-guidelines/reference/code-simplify.md +33 -0
- package/skills/plan-guidelines/reference/code-template-extract.md +34 -0
- package/skills/plan-guidelines/reference/code-template-scaffold.md +36 -0
- package/skills/plan-guidelines/reference/general-research.md +35 -0
- package/skills/plan-guidelines/reference/plan-create.md +37 -0
- package/skills/plan-guidelines/reference/plan-tdd-create.md +44 -0
- package/skills/plan-guidelines/reference/todos.md +39 -0
- package/skills/presentation-guidelines/SKILL.md +25 -0
- package/skills/presentation-guidelines/reference/presentation-create.md +41 -0
- package/skills/presentation-guidelines/reference/presentation-motion-scaffold.md +38 -0
- package/skills/python-guidelines/SKILL.md +32 -0
- package/skills/python-guidelines/reference/async-await-patterns.md +62 -0
- package/skills/python-guidelines/reference/caching-functions.md +47 -0
- package/skills/python-guidelines/reference/dataclasses-type-hints.md +63 -0
- package/skills/python-guidelines/reference/exception-handling.md +72 -0
- package/skills/python-guidelines/reference/generators-comprehensions.md +54 -0
- package/skills/python-guidelines/reference/pathlib-file-ops.md +60 -0
- package/skills/python-guidelines/reference/resource-management.md +58 -0
- package/skills/python-guidelines/reference/string-formatting.md +41 -0
- package/skills/python-guidelines/reference/type-checking.md +47 -0
- package/skills/react-guidelines/SKILL.md +105 -0
- package/skills/react-guidelines/reference/accessibility.md +31 -0
- package/skills/react-guidelines/reference/activity-effect-event.md +42 -0
- package/skills/react-guidelines/reference/component-design.md +57 -0
- package/skills/react-guidelines/reference/hooks.md +39 -0
- package/skills/react-guidelines/reference/migration-anti-patterns.md +33 -0
- package/skills/react-guidelines/reference/migration-deprecations.md +109 -0
- package/skills/react-guidelines/reference/migration-paradigm-shifts.md +33 -0
- package/skills/react-guidelines/reference/migration-typescript.md +95 -0
- package/skills/react-guidelines/reference/new-hooks.md +94 -0
- package/skills/react-guidelines/reference/performance-optimization.md +41 -0
- package/skills/react-guidelines/reference/react-compiler.md +34 -0
- package/skills/react-guidelines/reference/server-components.md +99 -0
- package/skills/react-guidelines/reference/state-management.md +72 -0
- package/skills/react-guidelines/reference/suspense-streaming.md +36 -0
- package/skills/remotion-guidelines/SKILL.md +67 -0
- package/skills/remotion-guidelines/reference/animations.md +121 -0
- package/skills/remotion-guidelines/reference/assets.md +21 -0
- package/skills/remotion-guidelines/reference/captions.md +33 -0
- package/skills/remotion-guidelines/reference/charts.md +35 -0
- package/skills/remotion-guidelines/reference/compositions.md +40 -0
- package/skills/remotion-guidelines/reference/dom-measurement.md +82 -0
- package/skills/remotion-guidelines/reference/gifs.md +33 -0
- package/skills/remotion-guidelines/reference/lottie.md +41 -0
- package/skills/remotion-guidelines/reference/maps.md +26 -0
- package/skills/remotion-guidelines/reference/media.md +39 -0
- package/skills/remotion-guidelines/reference/mediabunny.md +28 -0
- package/skills/remotion-guidelines/reference/sequencing.md +44 -0
- package/skills/remotion-guidelines/reference/text.md +24 -0
- package/skills/remotion-guidelines/reference/three-d.md +33 -0
- package/skills/remotion-guidelines/reference/timing.md +22 -0
- package/skills/remotion-guidelines/reference/transitions.md +52 -0
- package/skills/shell-scripting-guidelines/SKILL.md +31 -0
- package/skills/shell-scripting-guidelines/reference/argument-parsing.md +67 -0
- package/skills/shell-scripting-guidelines/reference/common-patterns.md +46 -0
- package/skills/shell-scripting-guidelines/reference/error-handling.md +62 -0
- package/skills/shell-scripting-guidelines/reference/functions.md +66 -0
- package/skills/shell-scripting-guidelines/reference/idempotency.md +57 -0
- package/skills/shell-scripting-guidelines/reference/parameter-expansion.md +38 -0
- package/skills/shell-scripting-guidelines/reference/posix-compatibility.md +53 -0
- package/skills/shell-scripting-guidelines/reference/quoting.md +42 -0
- package/skills/shell-scripting-guidelines/reference/script-template.md +70 -0
- package/skills/shell-scripting-guidelines/reference/strict-mode.md +41 -0
- package/skills/shell-scripting-guidelines/reference/validation.md +30 -0
- package/skills/skill-guidelines/SKILL.md +33 -0
- package/skills/skill-guidelines/reference/assimilate.md +51 -0
- package/skills/skill-guidelines/reference/create.md +48 -0
- package/skills/skill-guidelines/reference/extract.md +48 -0
- package/skills/skill-guidelines/reference/simplify.md +56 -0
- package/skills/sql-postgresql-guidelines/SKILL.md +31 -0
- package/skills/sql-postgresql-guidelines/reference/constraints.md +47 -0
- package/skills/sql-postgresql-guidelines/reference/cte-patterns.md +42 -0
- package/skills/sql-postgresql-guidelines/reference/data-types.md +46 -0
- package/skills/sql-postgresql-guidelines/reference/indexing.md +45 -0
- package/skills/sql-postgresql-guidelines/reference/jsonb.md +54 -0
- package/skills/sql-postgresql-guidelines/reference/performance.md +46 -0
- package/skills/sql-postgresql-guidelines/reference/role-based-access.md +47 -0
- package/skills/sql-postgresql-guidelines/reference/row-level-security.md +66 -0
- package/skills/strudel-guidelines/SKILL.md +52 -0
- package/skills/strudel-guidelines/reference/arrangement.md +24 -0
- package/skills/strudel-guidelines/reference/conditionals.md +22 -0
- package/skills/strudel-guidelines/reference/effects.md +22 -0
- package/skills/strudel-guidelines/reference/genre-ambient.md +26 -0
- package/skills/strudel-guidelines/reference/genre-harsh.md +21 -0
- package/skills/strudel-guidelines/reference/genre-trance.md +23 -0
- package/skills/strudel-guidelines/reference/layering.md +22 -0
- package/skills/strudel-guidelines/reference/mini-notation.md +74 -0
- package/skills/strudel-guidelines/reference/modulation.md +22 -0
- package/skills/strudel-guidelines/reference/scales-harmony.md +20 -0
- package/skills/strudel-guidelines/reference/sounds.md +89 -0
- package/skills/strudel-guidelines/reference/tempo-timing.md +23 -0
- package/skills/terraform-guidelines/SKILL.md +28 -0
- package/skills/terraform-guidelines/reference/advanced-patterns.md +88 -0
- package/skills/terraform-guidelines/reference/locals.md +53 -0
- package/skills/terraform-guidelines/reference/module-definition.md +81 -0
- package/skills/terraform-guidelines/reference/module-structure.md +51 -0
- package/skills/terraform-guidelines/reference/remote-state.md +38 -0
- package/skills/terraform-guidelines/reference/root-module.md +71 -0
- package/skills/terraform-guidelines/reference/typed-variables.md +90 -0
- package/skills/threejs-guidelines/SKILL.md +38 -0
- package/skills/threejs-guidelines/reference/animation.md +26 -0
- package/skills/threejs-guidelines/reference/cameras-controls.md +26 -0
- package/skills/threejs-guidelines/reference/geometry.md +22 -0
- package/skills/threejs-guidelines/reference/interaction.md +25 -0
- package/skills/threejs-guidelines/reference/lighting-shadows.md +31 -0
- package/skills/threejs-guidelines/reference/loaders.md +29 -0
- package/skills/threejs-guidelines/reference/materials.md +25 -0
- package/skills/threejs-guidelines/reference/math.md +27 -0
- package/skills/threejs-guidelines/reference/node-materials.md +32 -0
- package/skills/threejs-guidelines/reference/patterns.md +29 -0
- package/skills/threejs-guidelines/reference/performance.md +24 -0
- package/skills/threejs-guidelines/reference/physics-vr.md +36 -0
- package/skills/threejs-guidelines/reference/postprocessing.md +26 -0
- package/skills/threejs-guidelines/reference/scene-fundamentals.md +26 -0
- package/skills/threejs-guidelines/reference/shaders.md +28 -0
- package/skills/threejs-guidelines/reference/textures.md +21 -0
- package/skills/threejs-guidelines/reference/webgpu.md +34 -0
- package/skills/typescript-guidelines/SKILL.md +37 -0
- package/skills/typescript-guidelines/reference/async-without-await.md +32 -0
- package/skills/typescript-guidelines/reference/avoid-barrel-exports.md +25 -0
- package/skills/typescript-guidelines/reference/avoid-eslint-disable.md +28 -0
- package/skills/typescript-guidelines/reference/avoid-reexports.md +26 -0
- package/skills/typescript-guidelines/reference/env-access-bracket-notation.md +29 -0
- package/skills/typescript-guidelines/reference/numeric-separator-enforcement.md +30 -0
- package/skills/typescript-guidelines/reference/template-literals-require-string-conversion.md +26 -0
- package/skills/typescript-guidelines/reference/unbound-method-references.md +32 -0
- package/skills/typescript-guidelines/reference/unnecessary-async-keywords.md +37 -0
- package/skills/typescript-to-lua-guidelines/SKILL.md +33 -0
- package/skills/typescript-to-lua-guidelines/reference/avoiding-heavy-features.md +41 -0
- package/skills/typescript-to-lua-guidelines/reference/coroutine-patterns.md +49 -0
- package/skills/typescript-to-lua-guidelines/reference/function-patterns.md +59 -0
- package/skills/typescript-to-lua-guidelines/reference/lua-interop.md +49 -0
- package/skills/typescript-to-lua-guidelines/reference/module-organization.md +42 -0
- package/skills/typescript-to-lua-guidelines/reference/multi-return-functions.md +47 -0
- package/skills/typescript-to-lua-guidelines/reference/namespaces-vs-classes.md +52 -0
- package/skills/typescript-to-lua-guidelines/reference/performance-tips.md +68 -0
- package/skills/typescript-to-lua-guidelines/reference/stable-tables.md +60 -0
- package/skills/typescript-to-lua-guidelines/reference/tsconfig.md +46 -0
- package/skills/typescript-to-lua-guidelines/reference/tstl-decorators.md +61 -0
- package/skills/typescript-to-lua-guidelines/reference/type-safety.md +79 -0
- package/skills/vitest-guidelines/SKILL.md +32 -0
- package/skills/vitest-guidelines/reference/cors-preflight-status-code.md +34 -0
- package/skills/vitest-guidelines/reference/http-testing.md +57 -0
- package/skills/vitest-guidelines/reference/json-response-type-safety.md +40 -0
- package/skills/vitest-guidelines/reference/mock-patterns.md +53 -0
- package/skills/vitest-guidelines/reference/project-references-path-resolution.md +36 -0
- package/skills/vitest-guidelines/reference/test-organization.md +25 -0
- package/skills/vitest-guidelines/reference/timestamp-testing.md +55 -0
- package/skills/vitest-guidelines/reference/type-safety.md +55 -0
- package/skills/vitest-guidelines/reference/typescript-config.md +43 -0
- package/skills/zod-guidelines/SKILL.md +33 -0
- package/skills/zod-guidelines/reference/default-values-output-type.md +63 -0
- package/skills/zod-guidelines/reference/migration-string-validators.md +38 -0
- package/skills/zod-guidelines/reference/migration-v4.md +46 -0
- package/skills/zod-guidelines/reference/schema-organization.md +73 -0
- package/skills/zod-guidelines/reference/validation-patterns.md +37 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# exception-handling: Specific Exception Handling
|
|
2
|
+
|
|
3
|
+
**Guideline:** Raise and catch specific exception types, never use bare `except`.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Specific exceptions enable precise error handling and better debugging. Bare `except` catches system exceptions like `KeyboardInterrupt` and `SystemExit`, making programs unresponsive. Custom exceptions document error conditions and enable targeted error handling. Specific exception handling improves code reliability and maintainability.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```python
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Optional
|
|
12
|
+
|
|
13
|
+
# Raise specific exceptions
|
|
14
|
+
def read_user_file(user_id: str) -> str:
|
|
15
|
+
path = Path(f"users/{user_id}.json")
|
|
16
|
+
|
|
17
|
+
if not path.exists():
|
|
18
|
+
raise FileNotFoundError(f"User file not found: {user_id}")
|
|
19
|
+
|
|
20
|
+
if not path.is_file():
|
|
21
|
+
raise ValueError(f"Path is not a file: {path}")
|
|
22
|
+
|
|
23
|
+
return path.read_text()
|
|
24
|
+
|
|
25
|
+
# Catch specific exceptions
|
|
26
|
+
def load_user(user_id: str) -> Optional[dict]:
|
|
27
|
+
try:
|
|
28
|
+
data = read_user_file(user_id)
|
|
29
|
+
return parse_json(data)
|
|
30
|
+
except FileNotFoundError:
|
|
31
|
+
print(f"User {user_id} not found")
|
|
32
|
+
return None
|
|
33
|
+
except ValueError as e:
|
|
34
|
+
print(f"Invalid data: {e}")
|
|
35
|
+
return None
|
|
36
|
+
except Exception as e:
|
|
37
|
+
print(f"Unexpected error: {e}")
|
|
38
|
+
raise
|
|
39
|
+
|
|
40
|
+
# Custom exceptions
|
|
41
|
+
class ValidationError(ValueError):
|
|
42
|
+
"""Raised when input validation fails"""
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
class DatabaseError(RuntimeError):
|
|
46
|
+
"""Raised when database operations fail"""
|
|
47
|
+
pass
|
|
48
|
+
|
|
49
|
+
def validate_email(email: str) -> None:
|
|
50
|
+
if "@" not in email:
|
|
51
|
+
raise ValidationError(f"Invalid email format: {email}")
|
|
52
|
+
|
|
53
|
+
# ❌ Avoid bare except
|
|
54
|
+
try:
|
|
55
|
+
risky_operation()
|
|
56
|
+
except: # Don't do this - catches everything including KeyboardInterrupt
|
|
57
|
+
pass
|
|
58
|
+
|
|
59
|
+
# ✅ Better - catch specific exceptions
|
|
60
|
+
try:
|
|
61
|
+
risky_operation()
|
|
62
|
+
except (ValueError, TypeError) as e:
|
|
63
|
+
handle_error(e)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Techniques:**
|
|
67
|
+
- Raise specific built-in exceptions (`ValueError`, `TypeError`, `FileNotFoundError`)
|
|
68
|
+
- Create custom exceptions by subclassing built-in exceptions
|
|
69
|
+
- Catch specific exceptions or tuples of exceptions
|
|
70
|
+
- Use `except Exception` as a catch-all (not bare `except`)
|
|
71
|
+
- Re-raise unexpected exceptions after logging
|
|
72
|
+
- Provide meaningful error messages with context
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# generators-comprehensions: Generators and Comprehensions
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use generators and comprehensions for memory-efficient, lazy data processing.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Generators process items on-demand without loading entire datasets into memory, enabling efficient handling of large files and streams. Comprehensions provide concise, readable syntax for transformations. Generator expressions and functions enable pipeline-style processing with minimal memory overhead.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```python
|
|
10
|
+
from typing import Iterator, Iterable
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
# List comprehension
|
|
14
|
+
numbers = [x * 2 for x in range(10) if x % 2 == 0]
|
|
15
|
+
|
|
16
|
+
# Dict comprehension
|
|
17
|
+
squares = {x: x**2 for x in range(10)}
|
|
18
|
+
|
|
19
|
+
# Set comprehension
|
|
20
|
+
unique_lengths = {len(word) for word in words}
|
|
21
|
+
|
|
22
|
+
# Generator expression (lazy, memory efficient)
|
|
23
|
+
total = sum(x**2 for x in range(1000000))
|
|
24
|
+
|
|
25
|
+
# Generator function
|
|
26
|
+
def read_large_file(path: Path) -> Iterator[str]:
|
|
27
|
+
"""Read file line by line without loading all into memory"""
|
|
28
|
+
with path.open('r') as f:
|
|
29
|
+
for line in f:
|
|
30
|
+
yield line.strip()
|
|
31
|
+
|
|
32
|
+
# Generator with processing
|
|
33
|
+
def process_items(items: Iterable[str]) -> Iterator[dict[str, any]]:
|
|
34
|
+
"""Process items lazily"""
|
|
35
|
+
for item in items:
|
|
36
|
+
if item:
|
|
37
|
+
yield {"value": item, "length": len(item)}
|
|
38
|
+
|
|
39
|
+
# Usage - only processes items as needed
|
|
40
|
+
for processed in process_items(read_large_file(Path("data.txt"))):
|
|
41
|
+
print(processed)
|
|
42
|
+
|
|
43
|
+
# ❌ Bad - loads entire file into memory
|
|
44
|
+
def read_large_file_bad(path: Path) -> list[str]:
|
|
45
|
+
with path.open('r') as f:
|
|
46
|
+
return [line.strip() for line in f] # All in memory!
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Techniques:**
|
|
50
|
+
- Use list/dict/set comprehensions for small, in-memory collections
|
|
51
|
+
- Use generator expressions (parentheses) for large or streamed data
|
|
52
|
+
- Create generator functions with `yield` for lazy iteration
|
|
53
|
+
- Chain generators for pipeline processing
|
|
54
|
+
- Avoid materializing generators until needed (don't convert to list unnecessarily)
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# pathlib-file-ops: Pathlib for File Operations
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use `pathlib.Path` for all file and directory operations instead of `os.path`.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Pathlib provides object-oriented path manipulation with intuitive methods and operators. The `/` operator for path joining is more readable than `os.path.join()`. Built-in methods like `.read_text()`, `.write_text()`, and `.glob()` simplify common operations. Pathlib is cross-platform and type-safe.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```python
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Iterator, Optional
|
|
12
|
+
|
|
13
|
+
# Use Path objects
|
|
14
|
+
config_path = Path("config.json")
|
|
15
|
+
data_dir = Path("data")
|
|
16
|
+
|
|
17
|
+
# Path operations
|
|
18
|
+
if config_path.exists():
|
|
19
|
+
content = config_path.read_text()
|
|
20
|
+
|
|
21
|
+
if data_dir.is_dir():
|
|
22
|
+
for file in data_dir.glob("*.txt"):
|
|
23
|
+
process_file(file)
|
|
24
|
+
|
|
25
|
+
# Path construction
|
|
26
|
+
user_dir = Path("users") / "123" / "profile"
|
|
27
|
+
user_dir.mkdir(parents=True, exist_ok=True)
|
|
28
|
+
|
|
29
|
+
# Read/write operations
|
|
30
|
+
def save_data(path: Path, data: str) -> None:
|
|
31
|
+
path.write_text(data)
|
|
32
|
+
|
|
33
|
+
def load_data(path: Path) -> str:
|
|
34
|
+
return path.read_text()
|
|
35
|
+
|
|
36
|
+
# Iterate directory
|
|
37
|
+
def find_python_files(directory: Path) -> Iterator[Path]:
|
|
38
|
+
return directory.rglob("*.py")
|
|
39
|
+
|
|
40
|
+
# Safe file operations
|
|
41
|
+
def read_if_exists(path: Path) -> Optional[str]:
|
|
42
|
+
if path.exists() and path.is_file():
|
|
43
|
+
return path.read_text()
|
|
44
|
+
return None
|
|
45
|
+
|
|
46
|
+
# ❌ Avoid os.path
|
|
47
|
+
import os
|
|
48
|
+
old_path = os.path.join("users", "123", "profile") # Don't do this
|
|
49
|
+
|
|
50
|
+
# ✅ Use Path instead
|
|
51
|
+
new_path = Path("users") / "123" / "profile"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Techniques:**
|
|
55
|
+
- Create Path objects: `path = Path("file.txt")`
|
|
56
|
+
- Use `/` operator for path joining: `Path("dir") / "file.txt"`
|
|
57
|
+
- Check existence with `.exists()`, `.is_file()`, `.is_dir()`
|
|
58
|
+
- Read/write with `.read_text()`, `.write_text()`, `.read_bytes()`, `.write_bytes()`
|
|
59
|
+
- Glob patterns with `.glob()` and `.rglob()`
|
|
60
|
+
- Create directories with `.mkdir(parents=True, exist_ok=True)`
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# resource-management: Resource Management with Context Managers
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use context managers (`with` and `async with`) for automatic resource cleanup.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Context managers ensure resources are properly released even when exceptions occur. This prevents resource leaks and simplifies error handling. Custom context managers enable reusable resource management patterns like database transactions.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```python
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from contextlib import contextmanager, asynccontextmanager
|
|
12
|
+
import asyncio
|
|
13
|
+
|
|
14
|
+
# File operations with pathlib
|
|
15
|
+
def read_config(path: Path) -> dict[str, str]:
|
|
16
|
+
with path.open('r') as f:
|
|
17
|
+
return parse_config(f.read())
|
|
18
|
+
|
|
19
|
+
def write_config(path: Path, config: dict[str, str]) -> None:
|
|
20
|
+
with path.open('w') as f:
|
|
21
|
+
f.write(serialize_config(config))
|
|
22
|
+
|
|
23
|
+
# Custom context manager
|
|
24
|
+
@contextmanager
|
|
25
|
+
def database_transaction(connection):
|
|
26
|
+
try:
|
|
27
|
+
yield connection
|
|
28
|
+
connection.commit()
|
|
29
|
+
except Exception:
|
|
30
|
+
connection.rollback()
|
|
31
|
+
raise
|
|
32
|
+
|
|
33
|
+
# Usage
|
|
34
|
+
with database_transaction(conn) as db:
|
|
35
|
+
db.execute("INSERT INTO users ...")
|
|
36
|
+
|
|
37
|
+
# Async context manager
|
|
38
|
+
@asynccontextmanager
|
|
39
|
+
async def async_database_transaction(connection):
|
|
40
|
+
try:
|
|
41
|
+
yield connection
|
|
42
|
+
await connection.commit()
|
|
43
|
+
except Exception:
|
|
44
|
+
await connection.rollback()
|
|
45
|
+
raise
|
|
46
|
+
|
|
47
|
+
# Usage
|
|
48
|
+
async with async_database_transaction(conn) as db:
|
|
49
|
+
await db.execute("INSERT INTO users ...")
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Techniques:**
|
|
53
|
+
- Use `with` for synchronous resource operations
|
|
54
|
+
- Use `async with` for asynchronous resource operations
|
|
55
|
+
- Create custom context managers with `@contextmanager` decorator
|
|
56
|
+
- Create async context managers with `@asynccontextmanager`
|
|
57
|
+
- Handle cleanup in finally blocks or with explicit rollback
|
|
58
|
+
- Use pathlib.Path with context managers for file operations
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# string-formatting: Modern String Formatting
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use f-strings for all string formatting and interpolation.
|
|
4
|
+
|
|
5
|
+
**Rationale:** F-strings are more readable, faster, and less error-prone than old `%` formatting or `.format()` methods. They support inline expressions, formatting specifiers, and multiline strings. The syntax is concise and makes variable substitution obvious.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```python
|
|
10
|
+
# f-strings (preferred)
|
|
11
|
+
name = "Alice"
|
|
12
|
+
age = 30
|
|
13
|
+
message = f"Hello, {name}! You are {age} years old."
|
|
14
|
+
|
|
15
|
+
# f-strings with expressions
|
|
16
|
+
result = f"The answer is {2 + 2}"
|
|
17
|
+
|
|
18
|
+
# f-strings with formatting
|
|
19
|
+
pi = 3.14159
|
|
20
|
+
formatted = f"Pi is approximately {pi:.2f}"
|
|
21
|
+
|
|
22
|
+
# Multiline f-strings
|
|
23
|
+
user = User(id="123", email="user@example.com", name="Alice", created_at=datetime.now())
|
|
24
|
+
summary = f"""
|
|
25
|
+
User Information:
|
|
26
|
+
ID: {user.id}
|
|
27
|
+
Email: {user.email}
|
|
28
|
+
Name: {user.name}
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
# ❌ Avoid old-style formatting
|
|
32
|
+
message_old = "Hello, %s! You are %d years old." % (name, age)
|
|
33
|
+
message_format = "Hello, {}! You are {} years old.".format(name, age)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Techniques:**
|
|
37
|
+
- Use f-string syntax: `f"text {variable} more text"`
|
|
38
|
+
- Embed expressions directly: `f"result: {2 + 2}"`
|
|
39
|
+
- Apply format specifiers: `f"{value:.2f}"` for decimals
|
|
40
|
+
- Use multiline f-strings with triple quotes for structured text
|
|
41
|
+
- Avoid old `%` formatting and `.format()` methods
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# type-checking: Type Checking Best Practices
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use type aliases, protocols, and modern type syntax for clear, maintainable type hints.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Type aliases make complex types readable and reusable. Protocols enable structural typing (duck typing with type safety). Using `Sequence` and `Mapping` instead of `list` and `dict` in function parameters enables broader compatibility. Modern union syntax (`|`) is more concise than `Union`. Proper typing enables static analysis and better IDE support.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```python
|
|
10
|
+
from typing import TypeAlias, Protocol, Sequence, Mapping
|
|
11
|
+
|
|
12
|
+
# Type aliases
|
|
13
|
+
UserId: TypeAlias = str
|
|
14
|
+
Config: TypeAlias = dict[str, str | int | bool]
|
|
15
|
+
|
|
16
|
+
# Protocol for structural typing (duck typing with types)
|
|
17
|
+
class Drawable(Protocol):
|
|
18
|
+
def draw(self) -> None: ...
|
|
19
|
+
|
|
20
|
+
def render(item: Drawable) -> None:
|
|
21
|
+
item.draw()
|
|
22
|
+
|
|
23
|
+
# Sequence for read-only list-like
|
|
24
|
+
def sum_numbers(numbers: Sequence[int]) -> int:
|
|
25
|
+
return sum(numbers)
|
|
26
|
+
|
|
27
|
+
# Mapping for read-only dict-like
|
|
28
|
+
def get_value(config: Mapping[str, str], key: str, default: str = "") -> str:
|
|
29
|
+
return config.get(key, default)
|
|
30
|
+
|
|
31
|
+
# Use | for union types (Python 3.10+)
|
|
32
|
+
def parse_value(value: str | int | float) -> float:
|
|
33
|
+
return float(value)
|
|
34
|
+
|
|
35
|
+
# Use None instead of Optional when clear
|
|
36
|
+
def find_user(user_id: str) -> User | None:
|
|
37
|
+
"""Returns User or None if not found"""
|
|
38
|
+
pass
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Techniques:**
|
|
42
|
+
- Create type aliases with `TypeAlias` for complex types
|
|
43
|
+
- Use `Protocol` for structural typing requirements
|
|
44
|
+
- Use `Sequence` for read-only list-like parameters
|
|
45
|
+
- Use `Mapping` for read-only dict-like parameters
|
|
46
|
+
- Use `|` for union types instead of `Optional` or `Union`
|
|
47
|
+
- Return `Type | None` instead of `Optional[Type]` when clear
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: react-guidelines
|
|
3
|
+
description: >-
|
|
4
|
+
Trigger on `.tsx/.jsx` files with React imports, Vite config. Use when building React 19+ components. Apply for Server Components, Form Actions, new hooks, Suspense streaming, React Compiler. Keywords: React 19, RSC, Server Components, useActionState, useOptimistic, use(), Suspense, Form Actions, 'use client', 'use server', ref as prop, React Compiler.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# React Coding Guidelines
|
|
8
|
+
|
|
9
|
+
## Requirements
|
|
10
|
+
|
|
11
|
+
- React ≥ 19, Vite ≥ 6, Tailwind ≥ 4, Headless UI.
|
|
12
|
+
|
|
13
|
+
## React 19 Essentials
|
|
14
|
+
|
|
15
|
+
- **Server-first** - Components run on server by default; add `'use client'` only for interactivity
|
|
16
|
+
- **Compiler handles memoization** - Write clean code; React Compiler optimizes automatically
|
|
17
|
+
- **ref as prop** - Pass `ref` directly, no `forwardRef` wrapper needed
|
|
18
|
+
- **Context as provider** - Use `<Context value={}>` directly, not `.Provider`
|
|
19
|
+
- **Form Actions** - Use `useActionState` and `FormData` instead of controlled inputs
|
|
20
|
+
- **New hooks** - `useActionState`, `useOptimistic`, `use()`, `useFormStatus`
|
|
21
|
+
- **Native metadata** - Use `<title>`, `<meta>`, `<link>` anywhere, auto-hoisted to `<head>`
|
|
22
|
+
|
|
23
|
+
## Quick Reference
|
|
24
|
+
|
|
25
|
+
| Feature | React 18 | React 19+ |
|
|
26
|
+
|---------|----------|-----------|
|
|
27
|
+
| Memoization | Manual (`useMemo`, `useCallback`) | React Compiler (automatic) |
|
|
28
|
+
| Forward refs | `forwardRef()` wrapper | `ref` as regular prop |
|
|
29
|
+
| Context provider | `<Context.Provider value={}>` | `<Context value={}>` |
|
|
30
|
+
| Form state | Custom `useState` | `useActionState` hook |
|
|
31
|
+
| Optimistic updates | Manual state | `useOptimistic` hook |
|
|
32
|
+
| Read promises | Not possible | `use()` hook |
|
|
33
|
+
| Conditional context | Not possible | `use(Context)` after conditionals |
|
|
34
|
+
| Form pending | Manual tracking | `useFormStatus` hook |
|
|
35
|
+
|
|
36
|
+
## Example
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
// React 19 Form with Actions
|
|
40
|
+
'use client';
|
|
41
|
+
import { useActionState } from 'react';
|
|
42
|
+
|
|
43
|
+
function ContactForm() {
|
|
44
|
+
const [state, formAction, isPending] = useActionState(
|
|
45
|
+
async (prev, formData) => {
|
|
46
|
+
const result = await submitForm(Object.fromEntries(formData));
|
|
47
|
+
if (result.error) return { error: result.error };
|
|
48
|
+
return { success: true };
|
|
49
|
+
},
|
|
50
|
+
null
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
return (
|
|
54
|
+
<form action={formAction}>
|
|
55
|
+
<input name="email" type="email" disabled={isPending} />
|
|
56
|
+
<button disabled={isPending}>
|
|
57
|
+
{isPending ? 'Submitting...' : 'Submit'}
|
|
58
|
+
</button>
|
|
59
|
+
{state?.error && <p className="error">{state.error}</p>}
|
|
60
|
+
</form>
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// ref as prop (no forwardRef needed)
|
|
65
|
+
function Input({ ref, ...props }: { ref?: React.Ref<HTMLInputElement> }) {
|
|
66
|
+
return <input ref={ref} {...props} />;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Context as provider
|
|
70
|
+
const ThemeContext = createContext('light');
|
|
71
|
+
|
|
72
|
+
function App({ children }) {
|
|
73
|
+
return <ThemeContext value="dark">{children}</ThemeContext>;
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Essentials
|
|
78
|
+
|
|
79
|
+
- **Component design** - Small, composable; lift/minimize state; derive when possible, see [reference/component-design.md](reference/component-design.md)
|
|
80
|
+
- **Performance** - Let React Compiler handle memoization; manual `useMemo`/`useCallback` for effect deps only, see [reference/performance-optimization.md](reference/performance-optimization.md)
|
|
81
|
+
- **Rendering** - Prefer Server Components; use Suspense for streaming, see [reference/suspense-streaming.md](reference/suspense-streaming.md)
|
|
82
|
+
- **Accessibility** - Semantic HTML, ARIA, keyboard/focus management, see [reference/accessibility.md](reference/accessibility.md)
|
|
83
|
+
- **Custom hooks** - Extract reusable logic, see [reference/hooks.md](reference/hooks.md)
|
|
84
|
+
|
|
85
|
+
## Progressive Disclosure
|
|
86
|
+
|
|
87
|
+
### Guidelines
|
|
88
|
+
|
|
89
|
+
- Read [reference/component-design.md](reference/component-design.md) - When breaking down large components or managing state lifting
|
|
90
|
+
- Read [reference/state-management.md](reference/state-management.md) - When choosing between useState, useReducer, or Context
|
|
91
|
+
- Read [reference/performance-optimization.md](reference/performance-optimization.md) - When components re-render unnecessarily or performance lags
|
|
92
|
+
- Read [reference/hooks.md](reference/hooks.md) - When extracting reusable logic or creating custom hooks
|
|
93
|
+
- Read [reference/accessibility.md](reference/accessibility.md) - When adding keyboard navigation or screen reader support
|
|
94
|
+
- Read [reference/new-hooks.md](reference/new-hooks.md) - When using useActionState, useOptimistic, use(), or useFormStatus
|
|
95
|
+
- Read [reference/server-components.md](reference/server-components.md) - When building with RSC, Server Actions, or 'use server'/'use client' directives
|
|
96
|
+
- Read [reference/suspense-streaming.md](reference/suspense-streaming.md) - When using Suspense boundaries, streaming, or error handling
|
|
97
|
+
- Read [reference/react-compiler.md](reference/react-compiler.md) - When setting up React Compiler or understanding automatic memoization
|
|
98
|
+
- Read [reference/activity-effect-event.md](reference/activity-effect-event.md) - When using Activity component or useEffectEvent
|
|
99
|
+
|
|
100
|
+
### Migration from React 18
|
|
101
|
+
|
|
102
|
+
- Read [reference/migration-paradigm-shifts.md](reference/migration-paradigm-shifts.md) - When adapting mental model from React 18 to React 19
|
|
103
|
+
- Read [reference/migration-anti-patterns.md](reference/migration-anti-patterns.md) - When avoiding outdated patterns (useEffect for data, manual loading states)
|
|
104
|
+
- Read [reference/migration-deprecations.md](reference/migration-deprecations.md) - When migrating from React 18 or handling removed APIs
|
|
105
|
+
- Read [reference/migration-typescript.md](reference/migration-typescript.md) - When fixing TypeScript errors after React 19 upgrade
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# accessibility: Accessibility Best Practices
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use semantic HTML, ARIA labels/roles, proper focus management, and keyboard navigation for inclusive components.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Accessible design works for all users (screen readers, keyboards, assistive tech); legal requirement in many jurisdictions.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
function Modal({ isOpen, onClose, title, children }) {
|
|
10
|
+
const closeButtonRef = useRef<HTMLButtonElement>(null);
|
|
11
|
+
useEffect(() => { if (isOpen) closeButtonRef.current?.focus(); }, [isOpen]);
|
|
12
|
+
if (!isOpen) return null;
|
|
13
|
+
return (
|
|
14
|
+
<div role="dialog" aria-modal="true" aria-labelledby="modal-title">
|
|
15
|
+
<h2 id="modal-title">{title}</h2>
|
|
16
|
+
{children}
|
|
17
|
+
<button ref={closeButtonRef} onClick={onClose} aria-label="Close modal">
|
|
18
|
+
Close
|
|
19
|
+
</button>
|
|
20
|
+
</div>
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Techniques:**
|
|
26
|
+
- Semantic HTML: `<button>`, `<nav>`, `<main>`, `<article>` instead of divs
|
|
27
|
+
- ARIA attributes: aria-label, aria-labelledby, aria-describedby, role="dialog", role="list"
|
|
28
|
+
- Focus management: useRef + useEffect to move focus to interactive elements
|
|
29
|
+
- Visually hidden text: sr-only class for screen readers ("sr-only" Tailwind utility)
|
|
30
|
+
- Icon buttons: Always include aria-label; never icon-only without text
|
|
31
|
+
- Keyboard navigation: All interactive elements must be focusable via Tab
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# activity-effect-event: Activity Component & useEffectEvent
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use `<Activity mode="hidden">` to preserve state; use `useEffectEvent` for Effect logic that reads latest values without re-triggering.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Activity preserves DOM state during hide (tabs, accordions); useEffectEvent eliminates false re-runs caused by dependency changes.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
// Activity - preserve state when hidden
|
|
10
|
+
function TabContainer({ tabs, activeTab }) {
|
|
11
|
+
return tabs.map(tab => (
|
|
12
|
+
<Activity
|
|
13
|
+
key={tab.id}
|
|
14
|
+
mode={tab.id === activeTab ? 'visible' : 'hidden'}
|
|
15
|
+
>
|
|
16
|
+
<TabContent tab={tab} /> {/* State preserved even when hidden */}
|
|
17
|
+
</Activity>
|
|
18
|
+
));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// useEffectEvent - read theme without reconnecting
|
|
22
|
+
function ChatRoom({ roomId, theme }) {
|
|
23
|
+
const onConnected = useEffectEvent(() => {
|
|
24
|
+
showNotification(`Connected to ${roomId}`, theme);
|
|
25
|
+
});
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
const connection = createConnection(roomId);
|
|
28
|
+
connection.on('connected', onConnected);
|
|
29
|
+
connection.connect();
|
|
30
|
+
return () => connection.disconnect();
|
|
31
|
+
}, [roomId]); // theme NOT here - doesn't reconnect
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Techniques:**
|
|
36
|
+
- Activity visible/hidden: Preserves state of hidden components (vs conditional render which destroys state)
|
|
37
|
+
- Activity pre-rendering: Load content in background for faster transition when shown
|
|
38
|
+
- useEffectEvent: Read latest prop/state without adding to dependencies; reads current value
|
|
39
|
+
- Solves false re-runs: Chat reconnect on theme change; analytics re-fires on items change
|
|
40
|
+
- Media handling: Activity doesn't pause video/audio automatically; use useLayoutEffect to pause
|
|
41
|
+
- Deprecating useLayoutEffect: useEffectEvent replaces some useLayoutEffect patterns in React 19
|
|
42
|
+
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# component-design: Component Design Patterns
|
|
2
|
+
|
|
3
|
+
**Guideline:** Build small, composable components with minimal state lifting and derived values.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Small components are easier to test, reuse, and maintain. Keeping state local reduces complexity and re-renders. Deriving values prevents synchronization bugs.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
import {memo, useMemo, useState} from "react";
|
|
11
|
+
|
|
12
|
+
type Item = {id: string; value: number};
|
|
13
|
+
|
|
14
|
+
// Small, focused component
|
|
15
|
+
export const List = memo(function List({items}: {items: Item[]}) {
|
|
16
|
+
const [query, setQuery] = useState("");
|
|
17
|
+
|
|
18
|
+
// Derived state - calculated from items and query
|
|
19
|
+
const filteredItems = useMemo(
|
|
20
|
+
() => items.filter((item) => String(item.value).includes(query)),
|
|
21
|
+
[items, query],
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<div>
|
|
26
|
+
<SearchInput value={query} onChange={setQuery} />
|
|
27
|
+
<ItemList items={filteredItems} />
|
|
28
|
+
</div>
|
|
29
|
+
);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// ✅ Good: Derived state
|
|
33
|
+
function CartTotal({items}: {items: CartItem[]}) {
|
|
34
|
+
const total = useMemo(
|
|
35
|
+
() => items.reduce((sum, item) => sum + item.price, 0),
|
|
36
|
+
[items],
|
|
37
|
+
);
|
|
38
|
+
return <div>Total: ${total}</div>;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// ❌ Bad: Duplicated state
|
|
42
|
+
function CartTotalBad({items}: {items: CartItem[]}) {
|
|
43
|
+
const [total, setTotal] = useState(0);
|
|
44
|
+
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
setTotal(items.reduce((sum, item) => sum + item.price, 0));
|
|
47
|
+
}, [items]);
|
|
48
|
+
|
|
49
|
+
return <div>Total: ${total}</div>;
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Techniques:**
|
|
54
|
+
- Break down large components into smaller, focused pieces
|
|
55
|
+
- Keep state in the lowest common ancestor that needs it
|
|
56
|
+
- Calculate derived values using `useMemo` instead of storing them in state
|
|
57
|
+
- Extract reusable logic into custom hooks
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# filename: hooks
|
|
2
|
+
|
|
3
|
+
**Guideline:** Follow Rules of Hooks (top-level only, from functions/custom hooks); extract reusable logic into custom hooks with `use` prefix.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Hook rules ensure predictable behavior; custom hooks enable logic reuse without prop drilling; focused hooks maintain single responsibility.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
// useApi - fetch with loading/error states
|
|
10
|
+
function useApi<T>(url: string) {
|
|
11
|
+
const [data, setData] = useState<T | null>(null);
|
|
12
|
+
const [loading, setLoading] = useState(true);
|
|
13
|
+
const [error, setError] = useState<Error | null>(null);
|
|
14
|
+
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
let cancelled = false;
|
|
17
|
+
fetch(url).then(r => r.json()).then(json => {
|
|
18
|
+
if (!cancelled) {setData(json); setError(null);}
|
|
19
|
+
}).catch(err => {
|
|
20
|
+
if (!cancelled) setError(err);
|
|
21
|
+
}).finally(() => {
|
|
22
|
+
if (!cancelled) setLoading(false);
|
|
23
|
+
});
|
|
24
|
+
return () => {cancelled = true;};
|
|
25
|
+
}, [url]);
|
|
26
|
+
|
|
27
|
+
return {data, loading, error};
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Techniques:**
|
|
32
|
+
- Rules of Hooks: Call only at top-level (not loops/conditions); only from functions/custom hooks
|
|
33
|
+
- Custom hooks: Extract reusable logic; name with `use` prefix; single responsibility
|
|
34
|
+
- useApi: Fetch with cancellation flag; handle loading/error/data states; type-generic
|
|
35
|
+
- useLocalStorage: Parse JSON on read; stringify on write; handle errors gracefully
|
|
36
|
+
- usePrevious: Store value in `useRef`; update in `useEffect`; return previous on next render
|
|
37
|
+
- useDebounce: Delay state updates with `setTimeout`; cleanup on unmount
|
|
38
|
+
- Error handling: Type check errors (`instanceof Error`); cleanup in finally blocks
|
|
39
|
+
- Dependencies: Always include full dependency array; avoid stale closures
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# migration-anti-patterns: React 19 Anti-Patterns
|
|
2
|
+
|
|
3
|
+
**Guideline:** Replace useEffect data fetching with Server Components; use Form Actions instead of useState for forms; let Compiler handle memoization.
|
|
4
|
+
|
|
5
|
+
**Rationale:** React 19 provides cleaner solutions; old patterns create unnecessary complexity and performance overhead.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
// OLD: useEffect + loading state
|
|
10
|
+
function UserProfile({ userId }) {
|
|
11
|
+
const [user, setUser] = useState(null), [loading, setLoading] = useState(true);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
fetchUser(userId).then(setUser).finally(() => setLoading(false));
|
|
14
|
+
}, [userId]);
|
|
15
|
+
if (loading) return <Spinner />;
|
|
16
|
+
return <Profile user={user} />;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// NEW: Server Component
|
|
20
|
+
async function UserProfile({ userId }) {
|
|
21
|
+
const user = await fetchUser(userId);
|
|
22
|
+
return <Profile user={user} />;
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Techniques:**
|
|
27
|
+
- Remove useEffect data fetching → Use Server Components (async/await, direct DB)
|
|
28
|
+
- Remove manual loading state → Use useActionState and Suspense
|
|
29
|
+
- Remove useState form fields → Use FormData + Server Actions
|
|
30
|
+
- Remove excessive useMemo/useCallback → Let React Compiler optimize
|
|
31
|
+
- Remove forwardRef wrapper → Pass ref as regular prop in React 19
|
|
32
|
+
- Remove 'use client' everywhere → Server Components by default; client islands only
|
|
33
|
+
- Remove <Suspense/> for errors only → Combine with Error Boundaries for full coverage
|