@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,24 @@
|
|
|
1
|
+
# performance: Performance Optimization
|
|
2
|
+
|
|
3
|
+
**Guideline:** Minimize draw calls with InstancedMesh; use LOD for distance; dispose unused; reuse geometry/materials; profile before optimizing.
|
|
4
|
+
|
|
5
|
+
**Rationale:** GPU efficiency depends on draw calls and memory; InstancedMesh renders 1000+ copies in one call vs. 1000 separate meshes.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```javascript
|
|
9
|
+
const mesh = new THREE.InstancedMesh(geometry, material, 1000);
|
|
10
|
+
for (let i = 0; i < 1000; i++) {
|
|
11
|
+
dummy.position.set(...);
|
|
12
|
+
dummy.updateMatrix();
|
|
13
|
+
mesh.setMatrixAt(i, dummy.matrix);
|
|
14
|
+
}
|
|
15
|
+
mesh.instanceMatrix.needsUpdate = true;
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Techniques:**
|
|
19
|
+
- InstancedMesh: Render thousands of copies in one draw call (vs. 1000 draw calls)
|
|
20
|
+
- LOD (Level of Detail): High detail near (0-50), medium mid-range (50-200), low far (200+)
|
|
21
|
+
- Merge geometries: Combine static meshes with BufferGeometryUtils.mergeGeometries()
|
|
22
|
+
- Memory: Dispose geometry/material/texture; reuse between meshes; unload offscreen
|
|
23
|
+
- Rendering: Shadow map 1024×1024; limit lights to 3-5; prefer alphaTest over transparency
|
|
24
|
+
- Profiling: `renderer.info.render.calls` (target <1000), `renderer.info.memory`
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# filename: physics-vr
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use Rapier (or Cannon-es) for physics; sync physics bodies to meshes each frame; use `renderer.setAnimationLoop()` for WebXR.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Three.js has no built-in physics; external engines require frame-based sync. WebXR requires specific animation loop API.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```javascript
|
|
9
|
+
// Physics setup
|
|
10
|
+
const world = new RAPIER.World(new RAPIER.Vector3(0, -9.81, 0));
|
|
11
|
+
const bodyDesc = RAPIER.RigidBodyDesc.dynamic().setTranslation(0, 10, 0);
|
|
12
|
+
const body = world.createRigidBody(bodyDesc);
|
|
13
|
+
const shape = RAPIER.ColliderDesc.cuboid(0.5, 0.5, 0.5);
|
|
14
|
+
world.createCollider(shape, body);
|
|
15
|
+
|
|
16
|
+
// Sync loop
|
|
17
|
+
function animate() {
|
|
18
|
+
world.step();
|
|
19
|
+
const {x, y, z} = body.translation();
|
|
20
|
+
const {x: qx, y: qy, z: qz, w: qw} = body.rotation();
|
|
21
|
+
mesh.position.set(x, y, z);
|
|
22
|
+
mesh.quaternion.set(qx, qy, qz, qw);
|
|
23
|
+
renderer.render(scene, camera);
|
|
24
|
+
}
|
|
25
|
+
renderer.setAnimationLoop(animate);
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Techniques:**
|
|
29
|
+
- Physics engines: Rapier (recommended), Cannon-es, Oimo; create world with gravity
|
|
30
|
+
- Bodies: RigidBodyDesc dynamic/static/kinematic; add shapes (colliders)
|
|
31
|
+
- Forces: `.applyForce()`, `.applyImpulse()`, `.setLinvel()`, `.setAngvel()`
|
|
32
|
+
- Raycasting: `world.castRay()` for hit detection with physics bodies
|
|
33
|
+
- WebXR setup: `renderer.xr.enabled = true`; `renderer.setAnimationLoop(animate)` (not requestAnimationFrame)
|
|
34
|
+
- XR input: `renderer.xr.getController(0/1)` for controllers; listen to 'select'/'squeeze' events
|
|
35
|
+
- AR hit testing: `frame.getHitTestResults()` returns positions to place objects
|
|
36
|
+
- VR comfort: Minimize latency, avoid sudden motions; limit physics timestep to ≤16.67ms
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# postprocessing: Post-Processing Effects
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use EffectComposer to chain passes (RenderPass→effects→screen); render to intermediate targets for complex pipelines.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Post-processing applies cinematic effects (bloom, grain, color grading) after rendering without modifying materials.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```javascript
|
|
9
|
+
const composer = new EffectComposer(renderer);
|
|
10
|
+
composer.addPass(new RenderPass(scene, camera));
|
|
11
|
+
composer.addPass(new UnrealBloomPass(
|
|
12
|
+
new THREE.Vector2(w, h),
|
|
13
|
+
1.5, // Strength
|
|
14
|
+
0.4, // Radius
|
|
15
|
+
0.85 // Threshold
|
|
16
|
+
));
|
|
17
|
+
function animate() { composer.render(); }
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Techniques:**
|
|
21
|
+
- UnrealBloomPass: Glow on emissive materials; adjust threshold for control
|
|
22
|
+
- FilmPass: Grain/noise effect with intensity and grayscale toggle
|
|
23
|
+
- ShaderPass: Custom fragment shader effects with uniforms for animation
|
|
24
|
+
- WebGLRenderTarget: Intermediate render passes for multi-stage pipelines
|
|
25
|
+
- Color grading: ShaderPass with saturation/brightness uniforms
|
|
26
|
+
- Performance: Bloom expensive; SSAO slow; half-res passes for efficiency; only final pass sets renderToScreen
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# scene-fundamentals: Scene, Renderer, and Core Concepts
|
|
2
|
+
|
|
3
|
+
**Guideline:** Configure Scene/Renderer; use Object3D hierarchy with proper dispose patterns; animate with setAnimationLoop and delta time.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Proper setup ensures memory safety, correct rendering, and frame-rate independence; improper disposal causes memory leaks.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```javascript
|
|
9
|
+
const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
|
|
10
|
+
renderer.outputColorSpace = THREE.SRGBColorSpace;
|
|
11
|
+
renderer.shadowMap.enabled = true;
|
|
12
|
+
const clock = new THREE.Clock();
|
|
13
|
+
renderer.setAnimationLoop(() => {
|
|
14
|
+
const delta = clock.getDelta();
|
|
15
|
+
mesh.rotation.y += delta * 0.5;
|
|
16
|
+
renderer.render(scene, camera);
|
|
17
|
+
});
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Techniques:**
|
|
21
|
+
- Renderer config: antialias, alpha (transparency), outputColorSpace (sRGB), toneMaps, shadowMap
|
|
22
|
+
- Scene setup: background (color/texture), environment map (PBR), fog, traverse()
|
|
23
|
+
- Object3D: position/rotation/scale, add/remove, visible (hide without disposal), layers, userData
|
|
24
|
+
- Dispose order: geometry → texture → material → renderer (prevents memory leaks)
|
|
25
|
+
- Animation: Use setAnimationLoop() not requestAnimationFrame (WebXR); use delta for frame-rate independence
|
|
26
|
+
- Coordinate system: Right-handed (+X right, +Y up, +Z toward viewer); helpers for debugging
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# filename: shaders
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use ShaderMaterial with uniforms for parameter control; modify built-in shaders via `onBeforeCompile`; move expensive calculations to vertex shader.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Custom shaders enable advanced effects; uniform updates avoid recompilation; vertex-side calculations reduce fragment shader load.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```javascript
|
|
9
|
+
const material = new THREE.ShaderMaterial({
|
|
10
|
+
uniforms: { time: { value: 0 } },
|
|
11
|
+
vertexShader: `varying vec2 vUv;
|
|
12
|
+
void main() {
|
|
13
|
+
vUv = uv;
|
|
14
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
15
|
+
}`,
|
|
16
|
+
fragmentShader: `varying vec2 vUv;
|
|
17
|
+
void main() { gl_FragColor = vec4(vUv, 1.0, 1.0); }`
|
|
18
|
+
});
|
|
19
|
+
material.uniforms.time.value = clock.getElapsedTime();
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Techniques:**
|
|
23
|
+
- Uniform types: float, vec2/vec3, Color, sampler2D (texture), Matrix4, arrays
|
|
24
|
+
- Varyings: Pass data vertex→fragment (vUv, vNormal, vWorldPos)
|
|
25
|
+
- Built-in matrices: modelMatrix, modelViewMatrix, projectionMatrix, normalMatrix auto-provided
|
|
26
|
+
- onBeforeCompile: Inject into Three.js shaders using `#include <begin_vertex>` injection points
|
|
27
|
+
- GLSL math: `mix()`, `step()`, `smoothstep()`, `dot()`, `normalize()`, `cross()`
|
|
28
|
+
- Performance: Use `lowp/mediump` precision; minimize branching; move expensive ops to vertex shader
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# textures: Texture Loading and Configuration
|
|
2
|
+
|
|
3
|
+
**Guideline:** Set correct color space per texture type (sRGB for colors, no color space for data), use power-of-2 dimensions, enable mipmaps.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Color space errors cause washed-out/dark rendering; mipmaps ensure quality at distance; compression saves VRAM.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```javascript
|
|
9
|
+
const colorTex = loader.load('albedo.jpg');
|
|
10
|
+
colorTex.colorSpace = THREE.SRGBColorSpace;
|
|
11
|
+
const normalTex = loader.load('normal.jpg');
|
|
12
|
+
normalTex.colorSpace = THREE.NoColorSpace; // Data, not color
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
**Techniques:**
|
|
16
|
+
- Color spaces: sRGB for color/albedo/emissive, NoColorSpace for normal/roughness/metalness/displacement/AO
|
|
17
|
+
- Mipmaps: Auto-generate for most textures; disable for canvas/video (dynamic updates)
|
|
18
|
+
- Wrapping: RepeatWrapping or MirroredRepeatWrapping for tiling; ClampToEdgeWrapping default
|
|
19
|
+
- Filtering: LinearMipmapLinearFilter (smooth, quality), NearestFilter (pixelated retro)
|
|
20
|
+
- Anisotropy: `.anisotropy = renderer.capabilities.getMaxAnisotropy()` for sharp distant angles
|
|
21
|
+
- Compression: KTX2 (best modern), WebP (browser support), Data Textures (procedural)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# filename: webgpu
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use WebGPU for compute shaders and modern GPU features; call `await renderer.init()` before rendering; use TSL for cross-renderer materials.
|
|
4
|
+
|
|
5
|
+
**Rationale:** WebGPU provides lower CPU overhead, compute shaders, native Metal/DirectX support; async init required for GPU device setup.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```javascript
|
|
9
|
+
import * as THREE from 'three/webgpu';
|
|
10
|
+
|
|
11
|
+
const renderer = new THREE.WebGPURenderer({antialias: true});
|
|
12
|
+
renderer.setSize(w, h);
|
|
13
|
+
await renderer.init(); // Required async init
|
|
14
|
+
|
|
15
|
+
const scene = new THREE.Scene();
|
|
16
|
+
const material = new THREE.MeshStandardNodeMaterial({
|
|
17
|
+
color: vec3(1.0, 0.0, 0.0)
|
|
18
|
+
});
|
|
19
|
+
const mesh = new THREE.Mesh(geometry, material);
|
|
20
|
+
scene.add(mesh);
|
|
21
|
+
renderer.render(scene, camera);
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Techniques:**
|
|
25
|
+
- Setup: `new THREE.WebGPURenderer()` + `await renderer.init()`; async required for device
|
|
26
|
+
- Fallback: Check `navigator.gpu` before creating; fall back to WebGL if unavailable
|
|
27
|
+
- Compute shaders: `Fn([args], returnType)` defines GPU-side computation; `renderer.compute()` executes
|
|
28
|
+
- Storage: `storageTexture()` and `storageBuffer()` for read/write GPU data
|
|
29
|
+
- TSL materials: Work with both WebGL (→GLSL) and WebGPU (→WGSL) automatically
|
|
30
|
+
- Performance: Lower CPU overhead, better batching, native driver support vs WebGL
|
|
31
|
+
- Debugging: `renderer.info`, `renderer.getDevice()` for device limits/features
|
|
32
|
+
- Limitations: Chrome 113+, Firefox Nightly, Safari TP; no polyfill; mobile support limited
|
|
33
|
+
- Migration: Change import from `'three'` to `'three/webgpu'`; add async init; use TSL for shaders
|
|
34
|
+
- Tips: Use compute for physics/particles; minimize CPU↔GPU transfers; batch similar operations
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: typescript-guidelines
|
|
3
|
+
description: >-
|
|
4
|
+
Trigger on `.ts` files with Node.js/ESM patterns. Use when writing TypeScript code for Node.js ESM projects. Apply for async functions, module imports, type safety, linting. Keywords: TypeScript, ESM, strict mode, async/await, Zod, type inference, avoid barrel exports, process.env, template literals, numeric separators.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# TypeScript Coding Guidelines
|
|
8
|
+
|
|
9
|
+
## Requirements
|
|
10
|
+
|
|
11
|
+
- Node.js ESM, TypeScript ≥ 5.8, Vitest ≥ 3, Zod ≥ 4.
|
|
12
|
+
|
|
13
|
+
## Essentials
|
|
14
|
+
|
|
15
|
+
- **Strict mode** - Enable strict flags, avoid `@ts-ignore` without comment+issue
|
|
16
|
+
- **Type safety** - Explicit public types, `unknown` over `any`, derive from generated types
|
|
17
|
+
- **Imports** - Named ESM imports, `import type` for types, direct from source, see [reference/avoid-barrel-exports.md](reference/avoid-barrel-exports.md), [reference/avoid-reexports.md](reference/avoid-reexports.md)
|
|
18
|
+
- **Async/await** - Handle errors explicitly, only use `async` with `await`, see [reference/async-without-await.md](reference/async-without-await.md), [reference/unnecessary-async-keywords.md](reference/unnecessary-async-keywords.md)
|
|
19
|
+
- **Immutability** - Use `const`/`readonly` where possible
|
|
20
|
+
- **Validation** - Zod for I/O boundaries, infer types from schemas
|
|
21
|
+
- **Linting** - Never suppress with eslint-disable, fix root causes, see [reference/avoid-eslint-disable.md](reference/avoid-eslint-disable.md)
|
|
22
|
+
- **Template literals** - Convert numbers with `String(value)`, see [reference/template-literals-require-string-conversion.md](reference/template-literals-require-string-conversion.md)
|
|
23
|
+
- **Numeric literals** - Use underscores in large numbers (`30_000`), see [reference/numeric-separator-enforcement.md](reference/numeric-separator-enforcement.md)
|
|
24
|
+
- **Method references** - Keep object references to maintain `this` binding, see [reference/unbound-method-references.md](reference/unbound-method-references.md)
|
|
25
|
+
- **Environment** - Use dot notation for `process.env` access, see [reference/env-access-bracket-notation.md](reference/env-access-bracket-notation.md)
|
|
26
|
+
|
|
27
|
+
## Progressive disclosure
|
|
28
|
+
|
|
29
|
+
- Read [reference/async-without-await.md](reference/async-without-await.md) - When seeing async functions that don't use await
|
|
30
|
+
- Read [reference/unnecessary-async-keywords.md](reference/unnecessary-async-keywords.md) - When simplifying synchronous controller functions
|
|
31
|
+
- Read [reference/avoid-eslint-disable.md](reference/avoid-eslint-disable.md) - When tempted to suppress linting warnings
|
|
32
|
+
- Read [reference/template-literals-require-string-conversion.md](reference/template-literals-require-string-conversion.md) - When inserting numbers in template literals
|
|
33
|
+
- Read [reference/numeric-separator-enforcement.md](reference/numeric-separator-enforcement.md) - When writing large numeric literals
|
|
34
|
+
- Read [reference/unbound-method-references.md](reference/unbound-method-references.md) - When passing methods as callbacks or references
|
|
35
|
+
- Read [reference/avoid-barrel-exports.md](reference/avoid-barrel-exports.md) - When creating or importing from index.ts files
|
|
36
|
+
- Read [reference/avoid-reexports.md](reference/avoid-reexports.md) - When organizing module exports
|
|
37
|
+
- Read [reference/env-access-bracket-notation.md](reference/env-access-bracket-notation.md) - When accessing process.env variables
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# async-without-await: Only Use Async When Function Contains Await
|
|
2
|
+
|
|
3
|
+
**Guideline:** Only use `async` when function contains `await` or must return Promise.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Unnecessary `async` adds overhead and misleads readers about async behavior.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// ❌ Bad: async without await
|
|
11
|
+
const middleware = async (c, next) => {
|
|
12
|
+
c.set("user", getUser());
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// ✅ Good: Remove async
|
|
16
|
+
const middleware = (c, next) => {
|
|
17
|
+
c.set("user", getUser());
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// ✅ Good: Return Promise explicitly if needed
|
|
21
|
+
const middleware = (c, next) => {
|
|
22
|
+
c.set("user", getUser());
|
|
23
|
+
return Promise.resolve();
|
|
24
|
+
};
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Techniques:**
|
|
28
|
+
- Review each `async` function for `await` expressions
|
|
29
|
+
- Remove `async` keyword if no `await` found
|
|
30
|
+
- Return `Promise.resolve()` explicitly if signature requires Promise
|
|
31
|
+
- Run ESLint to find @typescript-eslint/require-await violations
|
|
32
|
+
- Verify function behavior unchanged after removal
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# avoid-barrel-exports: Import Directly from Specific Files
|
|
2
|
+
|
|
3
|
+
**Guideline:** Avoid `index.ts` barrel exports in subdirectories; import directly from specific files.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Subdirectory barrels add indirection, obscure source, and cause circular dependency issues.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// ✅ Good: Direct imports, no index.ts
|
|
11
|
+
import {authMiddleware} from "./middlewares/jwt.js";
|
|
12
|
+
import {csrfProtection} from "./middlewares/csrf.js";
|
|
13
|
+
|
|
14
|
+
// ❌ Bad: Subdirectory barrel exports
|
|
15
|
+
// src/middlewares/index.ts
|
|
16
|
+
export {authMiddleware} from "./jwt.js";
|
|
17
|
+
export {csrfProtection} from "./csrf.js";
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Techniques:**
|
|
21
|
+
- Remove `index.ts` from subdirectories (middlewares, utils, services, controllers)
|
|
22
|
+
- Update imports to specific files directly
|
|
23
|
+
- Use IDE refactoring tools to update all imports automatically
|
|
24
|
+
- Run tests to verify no broken imports
|
|
25
|
+
- Never create new subdirectory barrel exports
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# avoid-eslint-disable: Never Suppress Warnings - Fix Root Causes
|
|
2
|
+
|
|
3
|
+
**Guideline:** Never use `eslint-disable`, `@ts-ignore`, or `any` types; fix root causes instead.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Suppressing warnings hides architectural issues and creates technical debt.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// ❌ WRONG: Suppress error
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
12
|
+
itemsRouter.openapi(listItemsRoute, itemsController.listItems as any);
|
|
13
|
+
|
|
14
|
+
// ✅ CORRECT: Fix type mismatch
|
|
15
|
+
itemsRouter.openapi(listItemsRoute, (c) => {
|
|
16
|
+
const {page, limit} = c.req.valid("query");
|
|
17
|
+
const {items, total} = itemsService.listItems(page, limit);
|
|
18
|
+
return c.json({items, pagination: {page, limit, total}}, 200);
|
|
19
|
+
});
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Techniques:**
|
|
23
|
+
- Read error message carefully and understand what it indicates
|
|
24
|
+
- Research framework documentation and TypeScript behavior
|
|
25
|
+
- Refactor code to align with type expectations
|
|
26
|
+
- Never use `any`, `@ts-ignore`, or `eslint-disable` comments
|
|
27
|
+
- Verify fix resolves issue completely with type checking
|
|
28
|
+
- Run tests after refactoring to ensure correctness
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# avoid-reexports: Import from Source Packages Directly
|
|
2
|
+
|
|
3
|
+
**Guideline:** Import directly from source packages, don't re-export external utilities through your modules.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Re-exports obscure code origin and complicate dependency understanding.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// ❌ Bad: Re-export from shared packages
|
|
11
|
+
// src/middlewares/jwt.ts
|
|
12
|
+
export {getUserId, type JwtContext} from "@acme/shared-utils";
|
|
13
|
+
|
|
14
|
+
// ✅ Good: Import directly from source
|
|
15
|
+
import {getUserId, type JwtContext} from "@acme/shared-utils";
|
|
16
|
+
|
|
17
|
+
// src/middlewares/jwt.ts - only local exports
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Techniques:**
|
|
21
|
+
- Identify files re-exporting from external/shared packages
|
|
22
|
+
- Remove re-export statements from module exports
|
|
23
|
+
- Update consuming code to import directly from source packages
|
|
24
|
+
- Use IDE find-and-replace for bulk import updates
|
|
25
|
+
- Verify imports resolve correctly with type checking
|
|
26
|
+
- Run tests to ensure behavior unchanged
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# env-access-bracket-notation: Use Dot Notation for process.env
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use dot notation for `process.env` (not bracket notation) unless dynamic or special chars.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Dot notation is more idiomatic and improves readability.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// ❌ Bad: Bracket notation for static
|
|
11
|
+
const secret = process.env["JWT_SECRET"];
|
|
12
|
+
|
|
13
|
+
// ✅ Good: Dot notation for static
|
|
14
|
+
const secret = process.env.JWT_SECRET;
|
|
15
|
+
|
|
16
|
+
// OK: Bracket for dynamic keys
|
|
17
|
+
const configKey = "MY_VAR";
|
|
18
|
+
const value = process.env[configKey];
|
|
19
|
+
|
|
20
|
+
// OK: Bracket for special characters
|
|
21
|
+
const value = process.env["MY-VAR-WITH-DASHES"];
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Techniques:**
|
|
25
|
+
- Replace all `process.env["VAR"]` with `process.env.VAR` for static keys
|
|
26
|
+
- Keep bracket notation only for dynamic keys or special characters
|
|
27
|
+
- Run ESLint to find @typescript-eslint/dot-notation violations
|
|
28
|
+
- Verify runtime behavior unchanged after conversion
|
|
29
|
+
- Update all affected import statements and config files
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# numeric-separator-enforcement: Use Underscores in Large Numbers
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use underscores in large numeric literals (e.g., `30_000`) for improved readability.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Numeric separators improve readability and prevent misreading similar values.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// ❌ Bad: Hard to read
|
|
11
|
+
const timeout = 30000;
|
|
12
|
+
const secondsPerDay = 86400;
|
|
13
|
+
const maxUsers = 1000000;
|
|
14
|
+
|
|
15
|
+
// ✅ Good: Clear and readable
|
|
16
|
+
const timeout = 30_000;
|
|
17
|
+
const secondsPerDay = 86_400;
|
|
18
|
+
const maxUsers = 1_000_000;
|
|
19
|
+
|
|
20
|
+
// OK: Smaller numbers don't need separators
|
|
21
|
+
const smallTimeout = 5000;
|
|
22
|
+
const port = 3000;
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**Techniques:**
|
|
26
|
+
- Add underscores for numbers >= 10_000 grouped by thousands
|
|
27
|
+
- Do not add separators for smaller numbers (< 10_000)
|
|
28
|
+
- Run ESLint to find numeric-separators-style violations
|
|
29
|
+
- Use consistent grouping by thousands (e.g., 1_000_000 not 100_0000)
|
|
30
|
+
- Verify numeric values are correct after adding separators
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# template-literals-require-string-conversion: Explicitly Convert Numbers in Template Literals
|
|
2
|
+
|
|
3
|
+
**Guideline:** Explicitly convert numbers to strings in templates using `String(value)`, not implicit coercion.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Explicit conversion is clearer and avoids relying on implicit type coercion.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// ❌ Bad: Implicit number coercion
|
|
11
|
+
const port = 3000;
|
|
12
|
+
console.log(`Server running on port: ${port}`);
|
|
13
|
+
|
|
14
|
+
// ✅ Good: Explicit string conversion
|
|
15
|
+
const port = 3000;
|
|
16
|
+
console.log(`Server running on port: ${String(port)}`);
|
|
17
|
+
|
|
18
|
+
throw new Error(`Timeout after ${String(5000)}ms`);
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Techniques:**
|
|
22
|
+
- Wrap numeric values in `String()` when using template literals
|
|
23
|
+
- Apply to all primitive types in templates (numbers, booleans)
|
|
24
|
+
- Run ESLint to find @typescript-eslint/restrict-template-expressions violations
|
|
25
|
+
- Replace `` `text: ${value}` `` with `` `text: ${String(value)}` ``
|
|
26
|
+
- Verify tests pass after adding explicit conversions
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# unbound-method-references: Keep Object References for Method Calls
|
|
2
|
+
|
|
3
|
+
**Guideline:** Keep object reference when calling methods, don't destructure them.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Destructuring methods breaks `this` binding and causes runtime errors.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// ❌ Bad: Destructuring breaks this
|
|
11
|
+
const {injectWebSocket} = createNodeWebSocket({app});
|
|
12
|
+
injectWebSocket(server); // May fail
|
|
13
|
+
|
|
14
|
+
// ✅ Good: Keep object reference
|
|
15
|
+
const wsHelpers = createNodeWebSocket({app});
|
|
16
|
+
wsHelpers.injectWebSocket(server); // Maintains this binding
|
|
17
|
+
|
|
18
|
+
// ❌ Bad: DOM API destructuring
|
|
19
|
+
const {addEventListener} = document;
|
|
20
|
+
addEventListener("click", handler); // Fails
|
|
21
|
+
|
|
22
|
+
// ✅ Good: Use object reference
|
|
23
|
+
document.addEventListener("click", handler);
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Techniques:**
|
|
27
|
+
- Never destructure methods: avoid `const {method} = object`
|
|
28
|
+
- Keep object reference: `const helpers = object`
|
|
29
|
+
- Call methods on object: `helpers.method()`
|
|
30
|
+
- Use object reference for DOM API calls
|
|
31
|
+
- Run ESLint to find @typescript-eslint/unbound-method violations
|
|
32
|
+
- Refactor destructured methods to keep object references
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# unnecessary-async-keywords: Remove Async Keyword Without Await Usage
|
|
2
|
+
|
|
3
|
+
**Guideline:** Remove `async` from functions that don't use `await`; frameworks allow returning Promises directly.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Unnecessary `async` adds overhead and creates false async expectations.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// ❌ Bad: async without await
|
|
11
|
+
async function getUser(id: string) {
|
|
12
|
+
return database.users.find(id);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// ✅ Good: Remove async, return Promise directly
|
|
16
|
+
function getUser(id: string) {
|
|
17
|
+
return database.users.find(id);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// ❌ Bad: Hono handler with async, no await
|
|
21
|
+
app.get("/users", async (c) => {
|
|
22
|
+
return c.json(getUsers());
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// ✅ Good: Remove async
|
|
26
|
+
app.get("/users", (c) => {
|
|
27
|
+
return c.json(getUsers());
|
|
28
|
+
});
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Techniques:**
|
|
32
|
+
- Run ESLint to find @typescript-eslint/require-await violations
|
|
33
|
+
- Remove `async` keyword for each flagged function
|
|
34
|
+
- Verify return types still match (Promises ok without `async`)
|
|
35
|
+
- Return Promise directly without `async` wrapper
|
|
36
|
+
- Run tests to ensure behavior unchanged
|
|
37
|
+
- Commit with clear explanation of changes
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: typescript-to-lua-guidelines
|
|
3
|
+
description: >-
|
|
4
|
+
Trigger on `.ts` files in game/scripting dirs with TSTL config. Use when transpiling TypeScript to Lua with TSTL 1.24+. Apply for game scripting, clean Lua output, multi-return functions. Keywords: TSTL, TypeScript-to-Lua, namespaces, LuaMultiReturn, decorators, stable tables, coroutines, Lua interop.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# TypeScript-to-Lua Coding Guidelines
|
|
8
|
+
|
|
9
|
+
## Requirements
|
|
10
|
+
|
|
11
|
+
- TSTL ≥ 1.24; TS strict mode; Lua ≥ 5.3 / LuaJIT 2.1.
|
|
12
|
+
|
|
13
|
+
## Essentials
|
|
14
|
+
|
|
15
|
+
- **Code organization** - Favor namespaces/functions over classes for clean Lua output, see [reference/namespaces-vs-classes.md](reference/namespaces-vs-classes.md), [reference/function-patterns.md](reference/function-patterns.md)
|
|
16
|
+
- **Performance** - Keep tables stable, design for Lua GC and coroutines, see [reference/stable-tables.md](reference/stable-tables.md), [reference/coroutine-patterns.md](reference/coroutine-patterns.md)
|
|
17
|
+
- **TSTL features** - Use LuaMultiReturn, decorators when beneficial, see [reference/multi-return-functions.md](reference/multi-return-functions.md), [reference/tstl-decorators.md](reference/tstl-decorators.md)
|
|
18
|
+
- **Optimization** - Avoid heavy TypeScript features, see [reference/avoiding-heavy-features.md](reference/avoiding-heavy-features.md), [reference/performance-tips.md](reference/performance-tips.md)
|
|
19
|
+
|
|
20
|
+
## Progressive disclosure
|
|
21
|
+
|
|
22
|
+
- Read [reference/namespaces-vs-classes.md](reference/namespaces-vs-classes.md) - When choosing code organization for clean Lua output
|
|
23
|
+
- Read [reference/multi-return-functions.md](reference/multi-return-functions.md) - When implementing Lua-style multiple return values
|
|
24
|
+
- Read [reference/function-patterns.md](reference/function-patterns.md) - When defining functions that transpile cleanly
|
|
25
|
+
- Read [reference/module-organization.md](reference/module-organization.md) - When structuring TSTL projects or exports
|
|
26
|
+
- Read [reference/stable-tables.md](reference/stable-tables.md) - When optimizing for Lua GC or JIT performance
|
|
27
|
+
- Read [reference/coroutine-patterns.md](reference/coroutine-patterns.md) - When implementing cooperative multitasking
|
|
28
|
+
- Read [reference/lua-interop.md](reference/lua-interop.md) - When calling Lua code from TypeScript
|
|
29
|
+
- Read [reference/tstl-decorators.md](reference/tstl-decorators.md) - When using TSTL-specific decorators
|
|
30
|
+
- Read [reference/performance-tips.md](reference/performance-tips.md) - When generated Lua code is slow or bloated
|
|
31
|
+
- Read [reference/type-safety.md](reference/type-safety.md) - When maintaining types across TS/Lua boundary
|
|
32
|
+
- Read [reference/avoiding-heavy-features.md](reference/avoiding-heavy-features.md) - When transpiled output is unexpectedly large
|
|
33
|
+
- Read [reference/tsconfig.md](reference/tsconfig.md) - When configuring TSTL compiler options
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# avoiding-heavy-features: Avoiding Heavy TypeScript Features
|
|
2
|
+
|
|
3
|
+
**Guideline:** Avoid complex inheritance, async/await, and heavy OOP patterns that bloat Lua output.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Complex features require substantial runtime support and generate verbose Lua. Simpler patterns align with Lua's lightweight nature.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```typescript
|
|
9
|
+
// AVOID: Heavy inheritance
|
|
10
|
+
class Entity { move() {} }
|
|
11
|
+
class GameObject extends Entity { render() {} }
|
|
12
|
+
class Enemy extends GameObject { attack() {} }
|
|
13
|
+
|
|
14
|
+
// PREFER: Composition with namespaces
|
|
15
|
+
namespace Physics {
|
|
16
|
+
export interface Body { x: number; y: number }
|
|
17
|
+
export function move(b: Body, dx: number) { b.x += dx }
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
namespace Rendering {
|
|
21
|
+
export function render(b: Body) { /* draw */ }
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// AVOID: async/await
|
|
25
|
+
async function loadData() { return await fetch() }
|
|
26
|
+
|
|
27
|
+
// PREFER: Generators (become coroutines in Lua)
|
|
28
|
+
function* loadData() {
|
|
29
|
+
const data = yield fetchAsync()
|
|
30
|
+
return data
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Techniques:**
|
|
35
|
+
- Use composition patterns instead of inheritance to keep Lua output lightweight
|
|
36
|
+
- Replace async/await with callback functions or coroutines (not supported in Lua)
|
|
37
|
+
- Prefer interfaces and namespaces for code organization over class-based designs
|
|
38
|
+
- Design data structures as plain objects without methods or properties
|
|
39
|
+
- Use function* generators for cooperative multitasking instead of async APIs
|
|
40
|
+
- Keep class hierarchies shallow, prefer interfaces for type contracts
|
|
41
|
+
- Avoid decorators and complex OOP patterns that require runtime support
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# coroutine-patterns: Coroutine-Friendly Patterns
|
|
2
|
+
|
|
3
|
+
**Guideline:** Design generators for seamless Lua coroutine integration without runtime overhead.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Lua coroutines provide cooperative multitasking naturally. TypeScript generators compile to coroutines, enabling timers, sequences, and state machines.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```typescript
|
|
9
|
+
// Timer using generator/coroutine
|
|
10
|
+
function* timer(seconds: number): Generator<void, void> {
|
|
11
|
+
let elapsed = 0
|
|
12
|
+
while (elapsed < seconds) {
|
|
13
|
+
const delta = yield // Receives delta-time from Lua
|
|
14
|
+
elapsed += delta
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Animation sequence
|
|
19
|
+
function* animatePosition(
|
|
20
|
+
target: { x: number },
|
|
21
|
+
endX: number,
|
|
22
|
+
duration: number
|
|
23
|
+
): Generator<void, boolean> {
|
|
24
|
+
let elapsed = 0
|
|
25
|
+
const startX = target.x
|
|
26
|
+
while (elapsed < duration) {
|
|
27
|
+
const delta = yield
|
|
28
|
+
elapsed += delta
|
|
29
|
+
const progress = elapsed / duration
|
|
30
|
+
target.x = startX + (endX - startX) * progress
|
|
31
|
+
}
|
|
32
|
+
return true
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Chaining coroutines
|
|
36
|
+
function* sequence(): Generator<void, void> {
|
|
37
|
+
yield* timer(2) // Wait 2 seconds
|
|
38
|
+
yield* animatePosition(obj, 100, 1) // Animate 1 second
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Techniques:**
|
|
43
|
+
- Use `function*` syntax to define generators that compile to Lua coroutines
|
|
44
|
+
- Yield control points with `yield` to pause execution and allow other tasks
|
|
45
|
+
- Accept delta-time as yield result to measure elapsed time accurately
|
|
46
|
+
- Return final values after completion to signal coroutine success or results
|
|
47
|
+
- Chain generators with `yield*` to compose coroutines without overhead
|
|
48
|
+
- Type generators as `Generator<YieldType, ReturnType>`
|
|
49
|
+
- Use for implementing timers, animations, state machines, and task sequences
|