@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,32 @@
|
|
|
1
|
+
# content-collections: Content Collections with Type Safety
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use Astro content collections API with Zod schemas for type-safe content management.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Content collections provide type safety, schema validation, IntelliSense, standardized organization, and build-time frontmatter validation.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// src/content/config.ts
|
|
11
|
+
import {defineCollection, z} from "astro:content";
|
|
12
|
+
|
|
13
|
+
export const collections = {
|
|
14
|
+
posts: defineCollection({
|
|
15
|
+
type: "content",
|
|
16
|
+
schema: z.object({
|
|
17
|
+
title: z.string(),
|
|
18
|
+
published: z.date(),
|
|
19
|
+
author: z.string(),
|
|
20
|
+
tags: z.array(z.string()),
|
|
21
|
+
draft: z.boolean().default(false),
|
|
22
|
+
}),
|
|
23
|
+
}),
|
|
24
|
+
};
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Techniques:**
|
|
28
|
+
- Collection schemas: Define Zod schemas in `src/content/config.ts` for validation
|
|
29
|
+
- Directory structure: Organize content in `src/content/[collection-name]/` directories
|
|
30
|
+
- Query functions: Use `getCollection()` and `getEntry()` for type-safe queries
|
|
31
|
+
- Filtering: Apply runtime filters in `getCollection()` callback
|
|
32
|
+
- Rendering: Use `.render()` method to compile markdown to HTML components
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# islands-architecture: Islands Architecture and Hydration
|
|
2
|
+
|
|
3
|
+
**Guideline:** Ship minimal JavaScript by hydrating only interactive components; static HTML by default.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Astro renders to static HTML by default (zero JS). Framework components only hydrate when marked with directives, resulting in faster loads and better performance.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```astro
|
|
10
|
+
---
|
|
11
|
+
import Counter from "../components/Counter.tsx";
|
|
12
|
+
import SearchBar from "../components/SearchBar.tsx";
|
|
13
|
+
---
|
|
14
|
+
<Layout title="Home">
|
|
15
|
+
<h1>Static Content</h1>
|
|
16
|
+
<Counter client:visible /> <!-- Hydrate on viewport entry -->
|
|
17
|
+
<SearchBar client:load /> <!-- Hydrate immediately -->
|
|
18
|
+
</Layout>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Techniques:**
|
|
22
|
+
- Static by default: Build pages with Astro components that render zero JavaScript
|
|
23
|
+
- Framework components: Import React, Vue, Svelte only for interactive features
|
|
24
|
+
- client:load: Hydrate immediately for critical interactive components
|
|
25
|
+
- client:visible: Hydrate when component enters viewport for lazy interactivity
|
|
26
|
+
- client:idle: Hydrate during browser idle time for lower-priority features
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# project-structure: Project Structure and Organization
|
|
2
|
+
|
|
3
|
+
**Guideline:** Organize using conventional directories: pages, components, layouts, content, public.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Opinionated defaults enable file-based routing, clear separation of concerns, better maintainability, easier navigation.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
src/
|
|
11
|
+
├── pages/
|
|
12
|
+
│ ├── index.astro # → /
|
|
13
|
+
│ ├── about.astro # → /about
|
|
14
|
+
│ └── blog/[slug].astro # → /blog/:slug
|
|
15
|
+
├── components/
|
|
16
|
+
│ ├── Header.astro
|
|
17
|
+
│ ├── Card.tsx
|
|
18
|
+
├── layouts/
|
|
19
|
+
│ ├── BaseLayout.astro
|
|
20
|
+
│ └── BlogLayout.astro
|
|
21
|
+
├── content/
|
|
22
|
+
│ ├── config.ts
|
|
23
|
+
│ └── posts/
|
|
24
|
+
└── styles/global.css
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Techniques:**
|
|
28
|
+
- Pages directory: Place routes in `src/pages/` for automatic file-based routing
|
|
29
|
+
- Components folder: Store reusable components in `src/components/`
|
|
30
|
+
- Layouts directory: Create reusable layouts in `src/layouts/`
|
|
31
|
+
- Content collections: Organize structured content in `src/content/[collection]/`
|
|
32
|
+
- Static assets: Place static files in `public/` directory for direct access
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: c99-game-opinionated-guidelines
|
|
3
|
+
description: >-
|
|
4
|
+
Trigger on `.c/.h` files in game/engine directories. Opinionated game engine patterns: caller-owns-memory, inverse mass, SoA optimization, builder pattern. Keywords: vectors, matrices, quaternions, physics, meshes, spatial structures, tagged unions, inverse mass.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# C99 Game Engine Opinionated Guidelines
|
|
8
|
+
|
|
9
|
+
## Requirements
|
|
10
|
+
|
|
11
|
+
- C99; extends `c99-guidelines` skill.
|
|
12
|
+
|
|
13
|
+
## Math
|
|
14
|
+
|
|
15
|
+
- **Types** - 16-byte aligned vectors/matrices/quaternions, see [reference/math-types.md](reference/math-types.md)
|
|
16
|
+
- **Access** - Use accessor functions for matrices, direct fields for vectors, see [reference/math-types.md](reference/math-types.md)
|
|
17
|
+
- **Coordinates** - Right-handed Y-up, CCW winding, configurable clip depth, see [reference/coordinate-system.md](reference/coordinate-system.md)
|
|
18
|
+
- **Suffixes** - `_aos/_soa` layouts, `_simde` SIMD, `2d/3d` dimensions
|
|
19
|
+
|
|
20
|
+
## Geometry Pipeline
|
|
21
|
+
|
|
22
|
+
- **Analytic → Discrete → Packing** - Separate logic/rendering/GPU layers, see [reference/geometry-pipeline.md](reference/geometry-pipeline.md)
|
|
23
|
+
- **Builder pattern** - `*_req()` query size, `*_build()` write to caller buffer, see [reference/builder-pattern.md](reference/builder-pattern.md)
|
|
24
|
+
|
|
25
|
+
## Patterns
|
|
26
|
+
|
|
27
|
+
- **Caller-owns-memory** - Libraries never allocate, app provides arrays
|
|
28
|
+
- **Tagged unions** - Type enum + union for polymorphism, see [reference/tagged-unions.md](reference/tagged-unions.md)
|
|
29
|
+
- **Inverse mass** - Store `1/mass`, static objects use `0.0`, see [reference/physics-patterns.md](reference/physics-patterns.md)
|
|
30
|
+
- **SoA optimization** - AoS for single objects, SoA for batches, see [reference/mesh-types.md](reference/mesh-types.md)
|
|
31
|
+
- **Validation** - Check capacity, bounds, NULL, overflow before operations
|
|
32
|
+
|
|
33
|
+
## Progressive disclosure
|
|
34
|
+
|
|
35
|
+
- Read [reference/math-types.md](reference/math-types.md) - When working with vectors, matrices, or quaternions
|
|
36
|
+
- Read [reference/coordinate-system.md](reference/coordinate-system.md) - When setting up camera, projection, or mesh normals
|
|
37
|
+
- Read [reference/tagged-unions.md](reference/tagged-unions.md) - When implementing shape or entity polymorphism
|
|
38
|
+
- Read [reference/physics-patterns.md](reference/physics-patterns.md) - When implementing rigid bodies, collision, or constraints
|
|
39
|
+
- Read [reference/geometry-pipeline.md](reference/geometry-pipeline.md) - When converting analytic shapes to renderable meshes
|
|
40
|
+
- Read [reference/builder-pattern.md](reference/builder-pattern.md) - When generating meshes or other variable-size data
|
|
41
|
+
- Read [reference/vertex-packing.md](reference/vertex-packing.md) - When preparing vertex data for GPU upload
|
|
42
|
+
- Read [reference/mesh-types.md](reference/mesh-types.md) - When working with 2D or 3D mesh structures
|
|
43
|
+
- Read [reference/spatial-structures.md](reference/spatial-structures.md) - When implementing broad-phase collision or spatial queries
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# builder-pattern: Builder Pattern for Meshes
|
|
2
|
+
|
|
3
|
+
**Guideline:** Two-phase construction: `*_req()` queries memory, `*_build()` fills caller-provided buffer.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Caller controls allocation (stack, pool, arena). Builder never allocates. Exact sizes prevent over-allocation.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
// Query
|
|
11
|
+
mesh_req_t req = sphere_mesh3d_req(1.0f, 32, 16);
|
|
12
|
+
|
|
13
|
+
// Allocate (caller decides strategy)
|
|
14
|
+
vertex3f_t vertices[req.vertex_count];
|
|
15
|
+
uint32_t indices[req.index_count];
|
|
16
|
+
|
|
17
|
+
// Build
|
|
18
|
+
mesh3d_t mesh = {.vertices = vertices, .indices = indices,
|
|
19
|
+
.vertex_capacity = req.vertex_count,
|
|
20
|
+
.index_capacity = req.index_count};
|
|
21
|
+
status_t status = sphere_mesh3d_build(&mesh, 1.0f, 32, 16);
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Techniques:**
|
|
25
|
+
- Query phase: Call `*_req()` to get exact vertex/index counts needed
|
|
26
|
+
- Caller allocation: Choose strategy (stack, malloc, arena) for complete control
|
|
27
|
+
- Build phase: Call `*_build()` to fill pre-allocated caller buffer
|
|
28
|
+
- Status checking: Always check return status for insufficient capacity errors
|
|
29
|
+
- Function naming: Use `{shape}_mesh{dim}_req` and `{shape}_mesh{dim}_build` pattern
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# coordinate-system: Coordinate System Conventions
|
|
2
|
+
|
|
3
|
+
**Guideline:** Right-handed Y-up coordinates, CCW winding. Use suffixes `_rh`/`_lh` for explicit handedness. Override with defines.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Consistent handedness and winding across geometry reduces bugs and ensures interoperability with standard graphics APIs.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
// Default (right-handed)
|
|
11
|
+
matrix4f_t proj = matrix4f_perspective(fov, aspect, near, far);
|
|
12
|
+
matrix4f_t view = matrix4f_look_at(eye, target, up);
|
|
13
|
+
|
|
14
|
+
// Explicit or Vulkan setup
|
|
15
|
+
matrix4f_t view_rh = matrix4f_look_at_rh(eye, target, up);
|
|
16
|
+
matrix4f_t view_lh = matrix4f_look_at_lh(eye, target, up);
|
|
17
|
+
|
|
18
|
+
#define MATH_COORDINATE_SYSTEM_LEFT_HANDED 1
|
|
19
|
+
#define MATH_CLIP_SPACE_DEPTH_ZERO_TO_ONE 1
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**Techniques:**
|
|
23
|
+
- Right-handed default: Use +X right, +Y up, +Z forward as base convention
|
|
24
|
+
- CCW winding: Define front faces with counter-clockwise vertex order
|
|
25
|
+
- Suffix variants: Provide `_rh` and `_lh` function suffixes for explicit systems
|
|
26
|
+
- Compile-time overrides: Use defines like `MATH_COORDINATE_SYSTEM_LEFT_HANDED`
|
|
27
|
+
- Normal calculation: Cross product respects handedness for correct face normals
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# geometry-pipeline: Geometry Pipeline
|
|
2
|
+
|
|
3
|
+
**Guideline:** Three-layer pipeline: Analytic (logic) → Discrete (mesh) → Packing (GPU).
|
|
4
|
+
|
|
5
|
+
**Rationale:** Each layer handles specific concerns: math/physics, rendering data, GPU format optimization.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
// 1. Analytic
|
|
11
|
+
sphere3d_t sphere = {.center = {0, 1, 0}, .radius = 2.0f};
|
|
12
|
+
|
|
13
|
+
// 2. Discrete: Build mesh
|
|
14
|
+
mesh_req_t req = sphere_mesh3d_req(&sphere, 32, 16);
|
|
15
|
+
mesh3d_t mesh = {.vertices = verts, .indices = idx,
|
|
16
|
+
.vertex_capacity = req.vertex_count};
|
|
17
|
+
sphere_mesh3d_build(&mesh, &sphere, 32, 16);
|
|
18
|
+
|
|
19
|
+
// 3. Packing: GPU format
|
|
20
|
+
size_t size = mesh3d_pack_size(&mesh, VERTEX_FORMAT_3F_4U8);
|
|
21
|
+
mesh3d_pack_3f_4u8(packed, &mesh, color);
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Techniques:**
|
|
25
|
+
- Analytic layer: Define shapes like `sphere3d_t`, `circle2d_t` for physics/logic
|
|
26
|
+
- Discrete layer: Build indexed meshes from analytic shapes with builder pattern
|
|
27
|
+
- Packing layer: Convert mesh to GPU-ready vertex formats (interleaved/streaming)
|
|
28
|
+
- Separation of concerns: Keep physics, rendering, and GPU separate
|
|
29
|
+
- Conversion functions: Provide `*_req` and `*_build` for shape-to-mesh conversion
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# math-types: Game Math Types
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use 16-byte aligned vectors/matrices/quaternions. Union-based for named and indexed access.
|
|
4
|
+
|
|
5
|
+
**Rationale:** 16-byte alignment enables SIMD operations and efficient cache access; unions allow both semantic and array-based access.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
typedef union {
|
|
11
|
+
struct { float x, y, z, _pad; };
|
|
12
|
+
float col[4];
|
|
13
|
+
} vec3f_t;
|
|
14
|
+
|
|
15
|
+
typedef union {
|
|
16
|
+
float col[16];
|
|
17
|
+
vec4f_t columns[4];
|
|
18
|
+
} matrix4f_t;
|
|
19
|
+
|
|
20
|
+
// Usage
|
|
21
|
+
vec3f_t pos = {.x = 1.0f, .y = 2.0f, .z = 3.0f};
|
|
22
|
+
matrix4f_t m;
|
|
23
|
+
m.columns[3] = (vec4f_t){.x = tx, .y = ty, .z = tz, .w = 1.0f};
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Techniques:**
|
|
27
|
+
- 16-byte alignment: Pad vec3 with _pad field for SIMD-friendly 16B size
|
|
28
|
+
- Union design: Combine named fields with array access for flexibility
|
|
29
|
+
- Column-major matrices: Store matrix4f_t as 4 column vectors
|
|
30
|
+
- Quaternion format: Use x, y, z, w order with normalization constraint
|
|
31
|
+
- Array access: Support both `.x`, `.y` named and `[0]`, `[1]` indexed access
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# mesh-types: Mesh Data Structures
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use `mesh2d_t`/`mesh3d_t` with capacity tracking. Builders generate from analytic shapes.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Separate count/capacity enables efficient reuse; builder pattern decouples construction from memory strategy.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
typedef struct {
|
|
11
|
+
vertex2f_t *vertices;
|
|
12
|
+
uint32_t *indices;
|
|
13
|
+
size_t vertex_count, index_count;
|
|
14
|
+
size_t vertex_capacity, index_capacity;
|
|
15
|
+
} mesh2d_t;
|
|
16
|
+
|
|
17
|
+
typedef struct {
|
|
18
|
+
vertex3f_t *vertices;
|
|
19
|
+
vec3f_t *normals; // Optional
|
|
20
|
+
vec2f_t *uvs; // Optional
|
|
21
|
+
uint32_t *indices;
|
|
22
|
+
size_t vertex_count, index_count;
|
|
23
|
+
size_t vertex_capacity, index_capacity;
|
|
24
|
+
} mesh3d_t;
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Techniques:**
|
|
28
|
+
- Capacity tracking: Maintain separate count and capacity for dynamic growth
|
|
29
|
+
- Builder pattern: Use `{shape}_mesh{dim}_{req|build}` naming convention
|
|
30
|
+
- Optional data: Include normals/UVs in mesh3d for advanced rendering
|
|
31
|
+
- Operations: Provide bounds calculation, normal computation, merging
|
|
32
|
+
- Vertex types: Use aligned types like `vertex3f_t` with padding for SIMD
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# physics-patterns: Physics Engine Patterns
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use inverse mass (0 = static), bit flags for state, sync maps for decoupled systems.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Inverse mass simplifies static bodies and impulse application; flags enable efficient state management; sync maps decouple physics from entity systems.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
typedef struct {
|
|
11
|
+
vec3f_t position, velocity;
|
|
12
|
+
float inv_mass; // 0 = static (never moves)
|
|
13
|
+
} rigidbody_t;
|
|
14
|
+
|
|
15
|
+
// Automatically handles static (inv_mass=0 zeroes impulse)
|
|
16
|
+
void apply_impulse(rigidbody_t *rb, vec3f_t impulse) {
|
|
17
|
+
rb->velocity.x += impulse.x * rb->inv_mass;
|
|
18
|
+
rb->velocity.y += impulse.y * rb->inv_mass;
|
|
19
|
+
rb->velocity.z += impulse.z * rb->inv_mass;
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Techniques:**
|
|
24
|
+
- Inverse mass: Store `inv_mass` (1/mass); zero for static bodies to disable movement
|
|
25
|
+
- Bit flags: Use `uint32_t` with bitmask enums for state like ACTIVE, SLEEPING
|
|
26
|
+
- Sync maps: Index maps decouple physics arrays from entity system arrays
|
|
27
|
+
- Flag operations: Use `|=` (set), `&= ~` (clear), `&` (test) for bit manipulation
|
|
28
|
+
- Update loop: Separate integration, broadphase detection, and narrowphase solving
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# spatial-structures: Spatial Data Structures
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use dimension-suffixed structures (grid, tree, bvh) for broad-phase queries. Choose by density/pattern.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Different structures suit different spatial distributions; dimension suffixes (_2d, _3d) enable consistent APIs across dimensions.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
typedef struct {
|
|
11
|
+
uint32_t *cells, *objects;
|
|
12
|
+
aabb2d_t bounds;
|
|
13
|
+
uint32_t cells_x, cells_y;
|
|
14
|
+
} grid2d_t;
|
|
15
|
+
|
|
16
|
+
uint32_t cell_x = (uint32_t)((pos.x - g->bounds.min.x) / cell_width);
|
|
17
|
+
uint32_t cell_y = (uint32_t)((pos.y - g->bounds.min.y) / cell_height);
|
|
18
|
+
uint32_t cell_idx = cell_y * g->cells_x + cell_x;
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Techniques:**
|
|
22
|
+
- Uniform grids: Use for dense/uniform object distributions with O(1) insertion
|
|
23
|
+
- Quadtrees/Octrees: Use for sparse/varying density with O(log n) operations
|
|
24
|
+
- BVH structures: Use for static geometry and ray casting queries
|
|
25
|
+
- KD-trees: Use for point clouds and nearest-neighbor searches
|
|
26
|
+
- SoA variants: Provide `_soa` versions for batch processing same-type queries
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# tagged-unions: Tagged Union Pattern
|
|
2
|
+
|
|
3
|
+
**Guideline:** Type enum + union for polymorphism without virtual functions. Cache-friendly, compiler optimizable.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Avoids virtual function overhead and pointer chasing; enables compiler exhaustiveness checks and efficient batch processing.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
typedef enum {
|
|
11
|
+
SHAPE_SPHERE, SHAPE_BOX, SHAPE_CAPSULE,
|
|
12
|
+
} shape_type_t;
|
|
13
|
+
|
|
14
|
+
typedef struct {
|
|
15
|
+
shape_type_t type;
|
|
16
|
+
union {
|
|
17
|
+
struct { float radius; } sphere;
|
|
18
|
+
struct { vec3f_t half_extents; } box;
|
|
19
|
+
struct { float radius, height; } capsule;
|
|
20
|
+
};
|
|
21
|
+
} shape_t;
|
|
22
|
+
|
|
23
|
+
float shape_volume(const shape_t *s) {
|
|
24
|
+
switch (s->type) {
|
|
25
|
+
case SHAPE_SPHERE:
|
|
26
|
+
return (4.0f/3.0f) * PI * s->sphere.radius * s->sphere.radius * s->sphere.radius;
|
|
27
|
+
case SHAPE_BOX:
|
|
28
|
+
return 8 * s->box.half_extents.x * s->box.half_extents.y * s->box.half_extents.z;
|
|
29
|
+
case SHAPE_CAPSULE:
|
|
30
|
+
return PI * s->capsule.radius * s->capsule.radius * s->capsule.height;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Techniques:**
|
|
36
|
+
- Type enum: Define all variant types in single enum for exhaustiveness
|
|
37
|
+
- Union members: Create named structs within union for each type variant
|
|
38
|
+
- Switch dispatch: Use switch on type field with no default clause
|
|
39
|
+
- Designated init: Use `.type = SHAPE_BOX, .box = {...}` for clarity
|
|
40
|
+
- Small members: Keep union data small; use pointers for large heap data
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# vertex-packing: Vertex Packing for GPU
|
|
2
|
+
|
|
3
|
+
**Guideline:** Pack mesh data to GPU-ready formats. Support interleaved (single buffer) and non-interleaved (streaming).
|
|
4
|
+
|
|
5
|
+
**Rationale:** GPU-ready vertex formats maximize performance; flexible layouts support different rendering pipelines and optimization strategies.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
typedef struct {
|
|
11
|
+
float x, y, z;
|
|
12
|
+
uint8_t r, g, b, a;
|
|
13
|
+
} vertex_3f_4u8_t;
|
|
14
|
+
|
|
15
|
+
void mesh3d_pack_3f_4u8(vertex_3f_4u8_t *out, const mesh3d_t *m, color4u8_t c) {
|
|
16
|
+
for (size_t i = 0; i < m->vertex_count; i++) {
|
|
17
|
+
out[i] = (vertex_3f_4u8_t){
|
|
18
|
+
m->vertices[i].x, m->vertices[i].y, m->vertices[i].z,
|
|
19
|
+
c.r, c.g, c.b, c.a
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
size_t mesh3d_pack_size(const mesh3d_t *m, vertex_format_t fmt) {
|
|
25
|
+
switch(fmt) {
|
|
26
|
+
case VERTEX_FORMAT_3F: return m->vertex_count * 12;
|
|
27
|
+
case VERTEX_FORMAT_3F_4U8: return m->vertex_count * 16;
|
|
28
|
+
}
|
|
29
|
+
return 0;
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Techniques:**
|
|
34
|
+
- Vertex format naming: Use `vertex_{components}_{types}_t` (e.g., `vertex_3f_4u8_t`)
|
|
35
|
+
- Interleaved layout: Pack all attributes per-vertex in single buffer
|
|
36
|
+
- Streaming layout: Separate position/normal/UV into different buffers
|
|
37
|
+
- Size queries: Provide `*_pack_size` functions before allocation
|
|
38
|
+
- No GPU calls: Library never touches graphics APIs; caller handles upload
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: c99-guidelines
|
|
3
|
+
description: >-
|
|
4
|
+
Trigger on `.c/.h` files. Use when writing C99 code. Apply for memory management, data structures, low-level operations. Keywords: C99, malloc/free, const-correctness, designated initializers, inline functions, error handling.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# C99 Coding Guidelines
|
|
8
|
+
|
|
9
|
+
## Essentials
|
|
10
|
+
|
|
11
|
+
- **Memory management** - Free all heap allocations, avoid leaks, see [reference/memory-management.md](reference/memory-management.md)
|
|
12
|
+
- **Modern C99** - Use `const`, designated initializers, small functions, see [reference/designated-initializers.md](reference/designated-initializers.md), [reference/const-correctness.md](reference/const-correctness.md)
|
|
13
|
+
- **Type safety** - Favor `inline` functions over macros where practical, see [reference/inline-functions.md](reference/inline-functions.md)
|
|
14
|
+
- **Quality** - Enable warnings, run static analysis
|
|
15
|
+
|
|
16
|
+
## Best practices
|
|
17
|
+
|
|
18
|
+
- **Error handling** - Use return codes, check all fallible operations, see [reference/error-handling.md](reference/error-handling.md)
|
|
19
|
+
- **Input validation** - Check bounds, NULL pointers, division by zero
|
|
20
|
+
- **Readability** - Small functions, clear naming, comments for non-obvious logic
|
|
21
|
+
|
|
22
|
+
## Progressive disclosure
|
|
23
|
+
|
|
24
|
+
- Read [reference/memory-management.md](reference/memory-management.md) - When allocating memory or managing resource lifetimes
|
|
25
|
+
- Read [reference/designated-initializers.md](reference/designated-initializers.md) - When initializing structs or arrays with specific values
|
|
26
|
+
- Read [reference/inline-functions.md](reference/inline-functions.md) - When replacing macros or writing small utility functions
|
|
27
|
+
- Read [reference/compound-literals.md](reference/compound-literals.md) - When creating temporary values without named variables
|
|
28
|
+
- Read [reference/const-correctness.md](reference/const-correctness.md) - When marking immutable data or understanding pointer const
|
|
29
|
+
- Read [reference/error-handling.md](reference/error-handling.md) - When implementing error codes or handling failures
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# compound-literals: Compound Literals
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use compound literals to create temporary values inline without declaring separate variables.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Compound literals reduce boilerplate code and improve readability by creating temporary structs or arrays directly in expressions.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
struct Point {
|
|
11
|
+
int x, y;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
int distance(struct Point a, struct Point b);
|
|
15
|
+
|
|
16
|
+
void example(void) {
|
|
17
|
+
// Create temporary Point inline
|
|
18
|
+
int d = distance(
|
|
19
|
+
(struct Point){.x = 0, .y = 0},
|
|
20
|
+
(struct Point){.x = 3, .y = 4}
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
// Initialize array inline
|
|
24
|
+
int arr[] = {(int[]){1, 2, 3, 4, 5}};
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Techniques:**
|
|
29
|
+
- Inline syntax: Use `(Type){initializer-list}` to create temporaries inline
|
|
30
|
+
- With designators: Combine with designated initializers for clarity
|
|
31
|
+
- Function arguments: Create temporary structs directly in function calls
|
|
32
|
+
- Aggregate types: Works with any struct or array type
|
|
33
|
+
- Automatic cleanup: Lifetime extends to end of enclosing scope automatically
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# const-correctness: Const Correctness
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use const qualifier to mark immutable data, function parameters, and return values to prevent unintended modifications.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Const correctness catches bugs at compile time, documents intent, and helps maintain API contracts.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
// Use const for immutable data
|
|
11
|
+
void process_buffer(const char *input, size_t len) {
|
|
12
|
+
// input cannot be modified
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Const pointers
|
|
16
|
+
const int *p1; // pointer to const int
|
|
17
|
+
int *const p2; // const pointer to int
|
|
18
|
+
const int *const p3; // const pointer to const int
|
|
19
|
+
|
|
20
|
+
// Const in function return
|
|
21
|
+
const char *get_name(void) {
|
|
22
|
+
static const char name[] = "example";
|
|
23
|
+
return name;
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Techniques:**
|
|
28
|
+
- Read-only parameters: Mark function parameters with const when not modified
|
|
29
|
+
- Pointer variants: Distinguish `const T *p` (pointer to const) vs `T *const p` (const pointer)
|
|
30
|
+
- Return values: Use const for immutable return values to prevent modification
|
|
31
|
+
- Intent documentation: Const clearly indicates what can/cannot be modified
|
|
32
|
+
- Compile-time safety: Catches unintended modifications at compile time
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# designated-initializers: Designated Initializers
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use designated initializers for struct and array initialization to make code self-documenting and reduce errors.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Designated initializers explicitly name fields being initialized, making code more readable and maintainable.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
struct Point {
|
|
11
|
+
int x, y, z;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
// Named field initialization
|
|
15
|
+
struct Point p = {.x = 1, .y = 2, .z = 3};
|
|
16
|
+
|
|
17
|
+
// Partial initialization (rest zeroed)
|
|
18
|
+
struct Point origin = {.x = 0, .y = 0};
|
|
19
|
+
|
|
20
|
+
// Array designated initializers
|
|
21
|
+
int days[12] = {
|
|
22
|
+
[0] = 31, [1] = 28, [2] = 31,
|
|
23
|
+
[3] = 30, [4] = 31, [5] = 30
|
|
24
|
+
};
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Techniques:**
|
|
28
|
+
- Field syntax: Use `.field = value` for struct initialization with clarity
|
|
29
|
+
- Array syntax: Use `[index] = value` for sparse array initialization
|
|
30
|
+
- Partial init: Unspecified fields are automatically zeroed without explicit values
|
|
31
|
+
- Order-independent: Fields can be specified in any order within initializer
|
|
32
|
+
- Large structs: Especially useful for structs with many fields or optional fields
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# error-handling: Error Handling Patterns
|
|
2
|
+
|
|
3
|
+
**Guideline:** Return error codes from functions and use output parameters for results to enable proper error checking and recovery.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Error codes force callers to handle errors explicitly, unlike exceptions. Using return values for errors and output parameters for results creates a consistent pattern throughout the codebase.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
typedef enum {
|
|
11
|
+
ERR_OK = 0,
|
|
12
|
+
ERR_NOMEM,
|
|
13
|
+
ERR_INVALID,
|
|
14
|
+
ERR_IO
|
|
15
|
+
} error_t;
|
|
16
|
+
|
|
17
|
+
error_t load_file(const char *path, char **out, size_t *len) {
|
|
18
|
+
FILE *f = fopen(path, "rb");
|
|
19
|
+
if (!f) return ERR_IO;
|
|
20
|
+
|
|
21
|
+
fseek(f, 0, SEEK_END);
|
|
22
|
+
long size = ftell(f);
|
|
23
|
+
fseek(f, 0, SEEK_SET);
|
|
24
|
+
|
|
25
|
+
char *buf = malloc(size);
|
|
26
|
+
if (!buf) {
|
|
27
|
+
fclose(f);
|
|
28
|
+
return ERR_NOMEM;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (fread(buf, 1, size, f) != (size_t)size) {
|
|
32
|
+
free(buf);
|
|
33
|
+
fclose(f);
|
|
34
|
+
return ERR_IO;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
fclose(f);
|
|
38
|
+
*out = buf;
|
|
39
|
+
*len = size;
|
|
40
|
+
return ERR_OK;
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**Techniques:**
|
|
45
|
+
- Error enums: Define descriptive error types with zero for success
|
|
46
|
+
- Output parameters: Use pointers to return multiple results alongside error codes
|
|
47
|
+
- Error checking: Always check return values immediately after function calls
|
|
48
|
+
- Cleanup: Properly free resources in all error paths before returning
|
|
49
|
+
- Context: Provide specific error codes to indicate failure reason, not generic errors
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# inline-functions: Inline Functions vs Macros
|
|
2
|
+
|
|
3
|
+
**Guideline:** Prefer static inline functions over macros for type safety and predictable behavior.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Inline functions provide type checking, proper scoping, and avoid macro side effects like multiple evaluation of arguments.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
// Macro - unsafe, no type checking
|
|
11
|
+
#define CLAMP(v, lo, hi) ((v) < (lo) ? (lo) : ((v) > (hi) ? (hi) : (v)))
|
|
12
|
+
|
|
13
|
+
// Inline function - type safe
|
|
14
|
+
static inline int clampi(int v, int lo, int hi) {
|
|
15
|
+
if (v < lo) return lo;
|
|
16
|
+
if (v > hi) return hi;
|
|
17
|
+
return v;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
static inline float clampf(float v, float lo, float hi) {
|
|
21
|
+
if (v < lo) return lo;
|
|
22
|
+
if (v > hi) return hi;
|
|
23
|
+
return v;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Macro side effect: x++ evaluated multiple times
|
|
27
|
+
// Inline function: x++ evaluated once safely
|
|
28
|
+
int x = 5;
|
|
29
|
+
int result = clampi(x++, 0, 10);
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Techniques:**
|
|
33
|
+
- Replace macros: Replace function-like macros with `static inline` functions
|
|
34
|
+
- Type-specific variants: Create `clampi`, `clampf` instead of generic macro
|
|
35
|
+
- Header placement: Use inline functions in headers for no multiple definition issues
|
|
36
|
+
- Avoid side effects: Inline functions safely evaluate arguments once
|
|
37
|
+
- Simple logic: Keep inline functions simple for compiler optimization
|