@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,35 @@
|
|
|
1
|
+
# memory-management: Memory Management Patterns
|
|
2
|
+
|
|
3
|
+
**Guideline:** Prefer stack allocation and ensure proper cleanup of heap allocations with clear ownership tracking.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Proper memory management prevents leaks and use-after-free bugs. Stack allocation is simpler as it's automatically cleaned up when the function returns.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
// Stack allocation (preferred)
|
|
11
|
+
void process_data(void) {
|
|
12
|
+
char buffer[1024];
|
|
13
|
+
int values[100];
|
|
14
|
+
// Automatically freed when function returns
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Heap allocation with explicit free
|
|
18
|
+
void dynamic_array(size_t size) {
|
|
19
|
+
int *array = malloc(size * sizeof(int));
|
|
20
|
+
if (!array) {
|
|
21
|
+
return; // Handle allocation failure
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Use array...
|
|
25
|
+
|
|
26
|
+
free(array); // Always free
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Techniques:**
|
|
31
|
+
- Default stack: Use stack allocation for fixed-size data by default
|
|
32
|
+
- Heap when needed: Use malloc/calloc only for dynamic or longer-lived data
|
|
33
|
+
- Malloc/free pairing: Always pair every malloc with corresponding free call
|
|
34
|
+
- Failure checking: Check allocation return value before dereferencing
|
|
35
|
+
- Clear ownership: Document who owns and must free each allocation
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: c99-opinionated-guidelines
|
|
3
|
+
description: >-
|
|
4
|
+
Trigger on `.c/.h` files for systems/game/embedded development. Opinionated patterns: caller-owns-memory, data-oriented design (SoA), SIMD variants, strict file naming. Keywords: C99, alignment, SIMD, AoS/SoA, caller-owns-memory, data-oriented design.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# C99 Opinionated Guidelines (Systems/Game/Embedded)
|
|
8
|
+
|
|
9
|
+
## Essentials
|
|
10
|
+
|
|
11
|
+
- **Memory management** - Prefer stack, free all heap allocations, 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, see [reference/inline-functions.md](reference/inline-functions.md)
|
|
14
|
+
- **Data-oriented design** - Structure for cache locality, see [reference/data-oriented-design.md](reference/data-oriented-design.md)
|
|
15
|
+
- **Quality** - Treat warnings as errors, run static analysis
|
|
16
|
+
|
|
17
|
+
## Architecture
|
|
18
|
+
|
|
19
|
+
- **Implementation variants** - Scalar → AoS → SoA → SIMD, see [reference/implementation-variants.md](reference/implementation-variants.md)
|
|
20
|
+
- **Caller-owns-memory** - Libraries never allocate, caller provides arrays, see [reference/caller-owns-memory.md](reference/caller-owns-memory.md)
|
|
21
|
+
- **Alignment** - 16-byte for SIMD, cache line for hot data, see [reference/alignment.md](reference/alignment.md)
|
|
22
|
+
- **File naming** - `*_type.h`, `*_impl.h`, `*_aos.h`, `*_soa.h`, `*_simde.h`, see [reference/file-naming.md](reference/file-naming.md)
|
|
23
|
+
|
|
24
|
+
## Safety
|
|
25
|
+
|
|
26
|
+
- **Input validation** - Check capacity, bounds, NULL, division, overflow, see [reference/safety-validations.md](reference/safety-validations.md)
|
|
27
|
+
- **Work buffers** - Complex functions use caller-provided buffers, see [reference/caller-owns-memory.md](reference/caller-owns-memory.md)
|
|
28
|
+
- **SIMD parity** - Test variants against scalar reference, see [reference/testing-patterns.md](reference/testing-patterns.md)
|
|
29
|
+
|
|
30
|
+
## Progressive disclosure
|
|
31
|
+
|
|
32
|
+
- Read [reference/memory-management.md](reference/memory-management.md) - When allocating memory or managing resource lifetimes
|
|
33
|
+
- Read [reference/designated-initializers.md](reference/designated-initializers.md) - When initializing structs or arrays with specific values
|
|
34
|
+
- Read [reference/inline-functions.md](reference/inline-functions.md) - When replacing macros or writing small utility functions
|
|
35
|
+
- Read [reference/compound-literals.md](reference/compound-literals.md) - When creating temporary values without named variables
|
|
36
|
+
- Read [reference/const-correctness.md](reference/const-correctness.md) - When marking immutable data or understanding pointer const
|
|
37
|
+
- Read [reference/data-oriented-design.md](reference/data-oriented-design.md) - When optimizing cache performance or data layouts
|
|
38
|
+
- Read [reference/error-handling.md](reference/error-handling.md) - When implementing error codes or handling failures
|
|
39
|
+
- Read [reference/implementation-variants.md](reference/implementation-variants.md) - When choosing between scalar, AoS, SoA, or SIMD implementations
|
|
40
|
+
- Read [reference/caller-owns-memory.md](reference/caller-owns-memory.md) - When designing APIs where caller provides memory
|
|
41
|
+
- Read [reference/alignment.md](reference/alignment.md) - When aligning data for SIMD or cache performance
|
|
42
|
+
- Read [reference/file-naming.md](reference/file-naming.md) - When organizing headers by type, implementation, and variant
|
|
43
|
+
- Read [reference/testing-patterns.md](reference/testing-patterns.md) - When writing tests with assertions, epsilon comparisons, or parity checks
|
|
44
|
+
- Read [reference/safety-validations.md](reference/safety-validations.md) - When validating inputs for capacity, bounds, NULL, or overflow
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# alignment: Memory Alignment
|
|
2
|
+
|
|
3
|
+
**Guideline:** 16 bytes for SIMD, cache line (64/128B) for hot data.
|
|
4
|
+
|
|
5
|
+
**Rationale:** SIMD loads require alignment. Misalignment causes penalties/crashes. Cache alignment prevents false sharing in concurrent code.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
// SIMD-friendly vec3 (16 bytes)
|
|
11
|
+
typedef struct { float x, y, z, _pad; } vec3_t;
|
|
12
|
+
|
|
13
|
+
// Compiler alignment
|
|
14
|
+
typedef struct { _Alignas(16) float data[4]; } aligned_vec4_t;
|
|
15
|
+
|
|
16
|
+
// Cache-line aligned hot data
|
|
17
|
+
#define CACHE_LINE_SIZE 64
|
|
18
|
+
typedef struct {
|
|
19
|
+
_Alignas(CACHE_LINE_SIZE) uint32_t counter;
|
|
20
|
+
char pad[CACHE_LINE_SIZE - sizeof(uint32_t)];
|
|
21
|
+
} atomic_counter_t;
|
|
22
|
+
|
|
23
|
+
// SoA arrays
|
|
24
|
+
typedef struct {
|
|
25
|
+
_Alignas(16) float *x, *y, *z;
|
|
26
|
+
size_t count;
|
|
27
|
+
} vec3_soa_t;
|
|
28
|
+
|
|
29
|
+
// Aligned allocation
|
|
30
|
+
void *aligned_alloc_16(size_t size) {
|
|
31
|
+
void *ptr;
|
|
32
|
+
return posix_memalign(&ptr, 16, size) == 0 ? ptr : NULL;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Platform detection
|
|
36
|
+
#if defined(__x86_64__) || defined(_M_X64)
|
|
37
|
+
#define CACHE_LINE_SIZE 64
|
|
38
|
+
#elif defined(__aarch64__)
|
|
39
|
+
#define CACHE_LINE_SIZE 128
|
|
40
|
+
#else
|
|
41
|
+
#define CACHE_LINE_SIZE 64
|
|
42
|
+
#endif
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Techniques:**
|
|
46
|
+
- SIMD alignment: Pad vec3 to 16-byte aligned structures for SIMD instructions
|
|
47
|
+
- Compiler directives: Use `_Alignas(16)` for explicit struct field alignment
|
|
48
|
+
- SoA layout: Align array-of-structures for batch SIMD operations
|
|
49
|
+
- Cache alignment: Align hot data to 64B (x86) or 128B (ARM) cache line size
|
|
50
|
+
- Platform detection: Use conditional compilation for architecture-specific alignment
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# caller-owns-memory: Caller-Owns-Memory Pattern
|
|
2
|
+
|
|
3
|
+
**Guideline:** Libraries never allocate. Caller provides all storage; library operates on it.
|
|
4
|
+
|
|
5
|
+
**Rationale:** No hidden allocations. Caller controls memory strategy (stack, pool, arena). No leaks. Batch-friendly.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
typedef struct {
|
|
11
|
+
float *pos_x, *pos_y;
|
|
12
|
+
uint32_t count, capacity;
|
|
13
|
+
} entity_system_t;
|
|
14
|
+
|
|
15
|
+
status_t entity_system_init(entity_system_t *sys,
|
|
16
|
+
float *x, float *y, uint32_t cap) {
|
|
17
|
+
sys->pos_x = x;
|
|
18
|
+
sys->pos_y = y;
|
|
19
|
+
sys->count = 0;
|
|
20
|
+
sys->capacity = cap;
|
|
21
|
+
return STATUS_OK;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
status_t entity_add(entity_system_t *sys, float x, float y) {
|
|
25
|
+
if (sys->count >= sys->capacity) return STATUS_FULL;
|
|
26
|
+
sys->pos_x[sys->count] = x;
|
|
27
|
+
sys->pos_y[sys->count] = y;
|
|
28
|
+
sys->count++;
|
|
29
|
+
return STATUS_OK;
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Techniques:**
|
|
34
|
+
- Functions receive pointers: Accept caller-provided storage instead of allocating
|
|
35
|
+
- Init functions: Bind library state to caller-owned arrays with capacity tracking
|
|
36
|
+
- Status returns: Return status codes, never allocated pointers
|
|
37
|
+
- Work buffers: Accept scratch space from caller for temporary operations
|
|
38
|
+
- Batch-friendly: Enable processing arrays without individual allocations
|
|
@@ -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,42 @@
|
|
|
1
|
+
# data-oriented-design: Data-Oriented Design
|
|
2
|
+
|
|
3
|
+
**Guideline:** Organize data structures for cache locality using Struct of Arrays (SoA) instead of Array of Structs (AoS) when processing arrays of data.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Modern CPUs load data in cache lines. Struct of Arrays layout ensures sequential memory access patterns that maximize cache utilization.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
// Array of Structs (AoS) - poor cache locality
|
|
11
|
+
struct Entity {
|
|
12
|
+
float x, y, z; // Position
|
|
13
|
+
float vx, vy, vz; // Velocity
|
|
14
|
+
int health;
|
|
15
|
+
int type;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
struct Entity entities[1000];
|
|
19
|
+
for (size_t i = 0; i < 1000; i++) {
|
|
20
|
+
entities[i].x += entities[i].vx;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Struct of Arrays (SoA) - better cache locality
|
|
24
|
+
struct EntitySystem {
|
|
25
|
+
float *positions_x, *positions_y, *positions_z;
|
|
26
|
+
float *velocities_x, *velocities_y, *velocities_z;
|
|
27
|
+
int *health, *type;
|
|
28
|
+
size_t count;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// Sequential memory access, better cache usage
|
|
32
|
+
for (size_t i = 0; i < system.count; i++) {
|
|
33
|
+
system.positions_x[i] += system.velocities_x[i];
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Techniques:**
|
|
38
|
+
- Separate fields: Move frequently accessed fields into their own arrays
|
|
39
|
+
- Cache locality: Sequential memory access maximizes CPU cache utilization
|
|
40
|
+
- Array sync: Keep indices synchronized across all component arrays
|
|
41
|
+
- Hot loops: Identify performance-critical loops for SoA conversion
|
|
42
|
+
- Measurement: Profile before and after refactoring to verify improvements
|
|
@@ -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,33 @@
|
|
|
1
|
+
# file-naming: File Naming Conventions
|
|
2
|
+
|
|
3
|
+
**Guideline:** Suffixes for purpose: `_type.h` (types), `_impl.h` (scalar), `_aos/_soa/_simd` (variants).
|
|
4
|
+
|
|
5
|
+
**Rationale:** Enables quick file identification, prevents include order issues, supports multiple variant implementations.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
vector_type.h # Types only
|
|
11
|
+
vector_impl.h # Scalar implementations
|
|
12
|
+
vector.h # Includes _type + _impl
|
|
13
|
+
vector_aos.h # Batch AoS
|
|
14
|
+
vector_soa.h # Batch SoA (cache-friendly)
|
|
15
|
+
vector_simd_impl.h # SIMD scalar
|
|
16
|
+
vector_soa_simd.h # SIMD SoA batch
|
|
17
|
+
vector.test.c # Scalar tests
|
|
18
|
+
|
|
19
|
+
// vector.h
|
|
20
|
+
#include "vector_type.h"
|
|
21
|
+
#include "vector_impl.h"
|
|
22
|
+
|
|
23
|
+
// vector_soa_simd.h
|
|
24
|
+
#include "vector_type.h"
|
|
25
|
+
#include "vector_soa.h"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Techniques:**
|
|
29
|
+
- Type suffix: Use `_type.h` for type definitions only
|
|
30
|
+
- Impl suffix: Use `_impl.h` for inline scalar implementations
|
|
31
|
+
- Batch variants: Use `_aos.h`, `_soa.h` for batch implementations
|
|
32
|
+
- SIMD suffix: Use `_simd.h` for SIMD implementations
|
|
33
|
+
- Dimension modules: Use `{name}{dim}.h` pattern like `aabb2d.h`, `sphere3d_simd.h`
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# implementation-variants: Implementation Variant Strategy
|
|
2
|
+
|
|
3
|
+
**Guideline:** Progressive variants: scalar single → AoS batch → SoA batch → SIMD.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Different use cases need different trade-offs: debugging (single), existing structs (AoS), cache-friendly (SoA), peak throughput (SIMD).
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
// Scalar single (reference)
|
|
11
|
+
float vec3_dot(const vec3_t *a, const vec3_t *b) {
|
|
12
|
+
return a->x*b->x + a->y*b->y + a->z*b->z;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// AoS batch (struct arrays)
|
|
16
|
+
void vec3_dot_aos(float *out, const vec3_t *a, const vec3_t *b, size_t n) {
|
|
17
|
+
for (size_t i = 0; i < n; i++)
|
|
18
|
+
out[i] = a[i].x*b[i].x + a[i].y*b[i].y + a[i].z*b[i].z;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// SoA batch (component arrays, cache-friendly)
|
|
22
|
+
typedef struct { float *x, *y, *z; size_t count; } vec3_soa_t;
|
|
23
|
+
|
|
24
|
+
void vec3_dot_soa(float *out, const vec3_soa_t *a, const vec3_soa_t *b) {
|
|
25
|
+
for (size_t i = 0; i < a->count; i++)
|
|
26
|
+
out[i] = a->x[i]*b->x[i] + a->y[i]*b->y[i] + a->z[i]*b->z[i];
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Techniques:**
|
|
31
|
+
- Scalar single: Start with single-object reference implementation for debugging
|
|
32
|
+
- AoS batch: Add batch processing for struct arrays (1.5x speedup)
|
|
33
|
+
- SoA batch: Add cache-friendly variant for large workloads (2-3x speedup)
|
|
34
|
+
- SIMD variants: Add vectorized implementations for critical paths (4-10x)
|
|
35
|
+
- Parity testing: Test correctness across all variants with same test suite
|
|
@@ -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
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# memory-management: Memory Management Patterns
|
|
2
|
+
|
|
3
|
+
**Guideline:** Prefer stack allocation and ensure proper cleanup of heap allocations with clear ownership tracking.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Proper memory management prevents leaks, reduces fragmentation, and improves performance. Stack allocation is faster and automatically cleaned up.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
// Stack allocation (preferred)
|
|
11
|
+
void process_data(void) {
|
|
12
|
+
char buffer[1024];
|
|
13
|
+
int values[100];
|
|
14
|
+
// Automatically freed when function returns
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Heap allocation with explicit free
|
|
18
|
+
void dynamic_array(size_t size) {
|
|
19
|
+
int *array = malloc(size * sizeof(int));
|
|
20
|
+
if (!array) {
|
|
21
|
+
return; // Handle allocation failure
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Use array...
|
|
25
|
+
|
|
26
|
+
free(array); // Always free
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Techniques:**
|
|
31
|
+
- Default stack: Use stack allocation for fixed-size data by default
|
|
32
|
+
- Heap when needed: Use malloc/calloc only for dynamic or longer-lived data
|
|
33
|
+
- Malloc/free pairing: Always pair every malloc with corresponding free call
|
|
34
|
+
- Failure checking: Check allocation return value before dereferencing
|
|
35
|
+
- Clear ownership: Document who owns and must free each allocation
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# safety-validations: Safety Validations
|
|
2
|
+
|
|
3
|
+
**Guideline:** Validate capacity, bounds, NULL pointers, division-by-zero, overflow before use.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Prevents undefined behavior, crashes, security vulnerabilities. Return status codes for graceful error handling.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
status_t buffer_write(buffer_t *buf, const void *data, size_t size) {
|
|
11
|
+
if (buf->used + size > buf->capacity) return STATUS_FULL;
|
|
12
|
+
if (size > SIZE_MAX - buf->used) return STATUS_OVERFLOW;
|
|
13
|
+
memcpy(buf->data + buf->used, data, size);
|
|
14
|
+
buf->used += size;
|
|
15
|
+
return STATUS_OK;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
vec3_t vec3_normalize(const vec3_t *v) {
|
|
19
|
+
if (!v) return (vec3_t){0};
|
|
20
|
+
float len = sqrtf(v->x*v->x + v->y*v->y + v->z*v->z);
|
|
21
|
+
if (len < 1e-6f) return (vec3_t){0};
|
|
22
|
+
float inv = 1.0f / len;
|
|
23
|
+
return (vec3_t){v->x*inv, v->y*inv, v->z*inv, 0};
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Techniques:**
|
|
28
|
+
- Capacity checks: Validate `used + size <= capacity` before writing
|
|
29
|
+
- Bounds checks: Check `idx < count` before array access
|
|
30
|
+
- NULL checks: Test `if (!ptr)` at function entry
|
|
31
|
+
- Epsilon division: Use `len < 1e-6f` for zero checks in float operations
|
|
32
|
+
- Overflow checks: Test `count > SIZE_MAX / size` before multiplication
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# testing-patterns: Testing Patterns
|
|
2
|
+
|
|
3
|
+
**Guideline:** Typed assertions, epsilon for floats, parity tests for variants.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Catches type mismatches. Epsilon handles float imprecision. Parity ensures variants produce identical results.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```c
|
|
10
|
+
void test_vec3_dot(void) {
|
|
11
|
+
vec3_t a = {1, 2, 3, 0}, b = {4, 5, 6, 0};
|
|
12
|
+
assert_float_eq(vec3_dot(&a, &b), 32.0f); // 1*4+2*5+3*6
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
void test_vec3_dot_soa_parity(void) {
|
|
16
|
+
float ax[100], ay[100], az[100];
|
|
17
|
+
float bx[100], by[100], bz[100];
|
|
18
|
+
float scalar_out[100], soa_out[100];
|
|
19
|
+
|
|
20
|
+
for (size_t i = 0; i < 100; i++) {
|
|
21
|
+
vec3_t a = {ax[i], ay[i], az[i], 0};
|
|
22
|
+
vec3_t b = {bx[i], by[i], bz[i], 0};
|
|
23
|
+
scalar_out[i] = vec3_dot(&a, &b);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
vec3_soa_t a_soa = {ax, ay, az, 100};
|
|
27
|
+
vec3_dot_soa(soa_out, &a_soa, &(vec3_soa_t){bx, by, bz, 100});
|
|
28
|
+
|
|
29
|
+
for (size_t i = 0; i < 100; i++)
|
|
30
|
+
assert_float_near(soa_out[i], scalar_out[i], 1e-5f);
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Techniques:**
|
|
35
|
+
- Typed assertions: Use `assert_int_eq`, `assert_float_eq`, `assert_ptr_not_null`
|
|
36
|
+
- Epsilon values: Use 1e-4f general, 1e-5f cumulative, 5e-4f for SIMD
|
|
37
|
+
- Scalar tests: Validate against known values for correctness
|
|
38
|
+
- Parity tests: Compare variant implementations against scalar reference
|
|
39
|
+
- Edge cases: Test zero, negative, denormal, infinity, and boundary conditions
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cmake-guidelines
|
|
3
|
+
description: >-
|
|
4
|
+
Trigger on `CMakeLists.txt` files. Use when writing CMake 3.20+ build systems for C/C++ projects. Apply for target-based builds, dependency management, testing setup, visibility specifiers. Keywords: CMake, add_library, add_executable, target_link_libraries, PUBLIC/PRIVATE/INTERFACE, find_package, FetchContent, CTest.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# CMake Coding Guidelines
|
|
8
|
+
|
|
9
|
+
## Requirements
|
|
10
|
+
|
|
11
|
+
- CMake ≥ 3.20; modern target-based usage.
|
|
12
|
+
|
|
13
|
+
## Essentials
|
|
14
|
+
|
|
15
|
+
- **Target-based builds** - Use targets, no global include/link dirs, see [reference/target-types.md](reference/target-types.md), [reference/compile-options.md](reference/compile-options.md)
|
|
16
|
+
- **Visibility specifiers** - Use PUBLIC/PRIVATE/INTERFACE correctly, see [reference/visibility-specifiers.md](reference/visibility-specifiers.md)
|
|
17
|
+
- **Dependencies** - Declare explicitly with FetchContent/find_package, see [reference/find-package.md](reference/find-package.md), [reference/fetchcontent.md](reference/fetchcontent.md)
|
|
18
|
+
- **Testing** - Enable testing with CTest, see [reference/testing.md](reference/testing.md)
|
|
19
|
+
- **Project structure** - Organize multi-directory projects, see [reference/project-structure.md](reference/project-structure.md)
|
|
20
|
+
|
|
21
|
+
## Progressive disclosure
|
|
22
|
+
|
|
23
|
+
- Read [reference/target-types.md](reference/target-types.md) - When choosing between library types or executables
|
|
24
|
+
- Read [reference/visibility-specifiers.md](reference/visibility-specifiers.md) - When deciding PUBLIC vs PRIVATE vs INTERFACE
|
|
25
|
+
- Read [reference/compile-options.md](reference/compile-options.md) - When adding compiler flags to targets
|
|
26
|
+
- Read [reference/find-package.md](reference/find-package.md) - When integrating external dependencies
|
|
27
|
+
- Read [reference/fetchcontent.md](reference/fetchcontent.md) - When vendoring dependencies from git/archives
|
|
28
|
+
- Read [reference/testing.md](reference/testing.md) - When setting up CTest or test targets
|
|
29
|
+
- Read [reference/project-structure.md](reference/project-structure.md) - When organizing multi-directory CMake projects
|
|
30
|
+
- Read [reference/generator-expressions.md](reference/generator-expressions.md) - When using conditional build configuration
|
|
31
|
+
- Read [reference/installation.md](reference/installation.md) - When creating install targets or package exports
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# compile-options: Compile Options and Definitions
|
|
2
|
+
|
|
3
|
+
**Guideline:** Set compiler flags, definitions, and features on targets using target_compile_* commands with appropriate visibility.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Target-scoped settings prevent pollution of the global build environment and allow different targets to have different requirements.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```cmake
|
|
10
|
+
# Set compile options
|
|
11
|
+
target_compile_options(mylib
|
|
12
|
+
PRIVATE
|
|
13
|
+
$<$<CXX_COMPILER_ID:GNU,Clang>:-Wall -Wextra -pedantic>
|
|
14
|
+
$<$<CXX_COMPILER_ID:MSVC>:/W4>
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
# Set compile definitions
|
|
18
|
+
target_compile_definitions(mylib
|
|
19
|
+
PUBLIC API_VERSION=2
|
|
20
|
+
PRIVATE
|
|
21
|
+
$<$<CONFIG:Debug>:DEBUG_BUILD>
|
|
22
|
+
$<$<CONFIG:Release>:RELEASE_BUILD>
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
# Set compile features
|
|
26
|
+
target_compile_features(mylib PUBLIC cxx_std_20)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Techniques:**
|
|
30
|
+
- target_compile_options(): Set compiler-specific flags with generator expressions
|
|
31
|
+
- target_compile_definitions(): Define preprocessor macros with visibility control
|
|
32
|
+
- target_compile_features(): Require C++ standard using cxx_std_20, cxx_std_17, etc
|
|
33
|
+
- Compiler detection: Use $<$<CXX_COMPILER_ID:GNU,Clang>:flags> for portability
|
|
34
|
+
- Configuration-based: Apply $<$<CONFIG:Debug>:DEBUG> for build-type-specific settings
|