@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,52 @@
|
|
|
1
|
+
# transitions: Scene Transitions
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use `<TransitionSeries>` from `@remotion/transitions` for fullscreen scene transitions.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Transitions overlap scenes, reducing total composition duration. `<TransitionSeries>` handles complex timing automatically.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```tsx
|
|
9
|
+
import { TransitionSeries } from '@remotion/transitions'
|
|
10
|
+
import { linearTiming, springTiming } from '@remotion/transitions'
|
|
11
|
+
import { fade, slide } from '@remotion/transitions'
|
|
12
|
+
import { useVideoConfig } from 'remotion'
|
|
13
|
+
|
|
14
|
+
export const MyComposition = () => {
|
|
15
|
+
const { fps } = useVideoConfig()
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<TransitionSeries>
|
|
19
|
+
<TransitionSeries.Sequence durationInFrames={2 * fps}>
|
|
20
|
+
<Scene1 />
|
|
21
|
+
</TransitionSeries.Sequence>
|
|
22
|
+
<TransitionSeries.Transition
|
|
23
|
+
timing={linearTiming({ durationInFrames: 0.5 * fps })}
|
|
24
|
+
effect={fade()}
|
|
25
|
+
/>
|
|
26
|
+
<TransitionSeries.Sequence durationInFrames={3 * fps}>
|
|
27
|
+
<Scene2 />
|
|
28
|
+
</TransitionSeries.Sequence>
|
|
29
|
+
<TransitionSeries.Transition
|
|
30
|
+
timing={springTiming({ durationInFrames: 0.75 * fps })}
|
|
31
|
+
effect={slide({ direction: 'from-left' })}
|
|
32
|
+
/>
|
|
33
|
+
<TransitionSeries.Sequence durationInFrames={2 * fps}>
|
|
34
|
+
<Scene3 />
|
|
35
|
+
</TransitionSeries.Sequence>
|
|
36
|
+
</TransitionSeries>
|
|
37
|
+
)
|
|
38
|
+
// Total: (2 + 0.5 + 3 + 0.75 + 2) * fps frames
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Techniques:**
|
|
43
|
+
- Install `@remotion/transitions` package before use
|
|
44
|
+
- Wrap all scenes with `<TransitionSeries>` container
|
|
45
|
+
- Use `<TransitionSeries.Sequence>` for each scene's content
|
|
46
|
+
- Add `<TransitionSeries.Transition>` between sequences for effects
|
|
47
|
+
- Account for overlap in duration math: `total = scene1 + scene2 - transition`
|
|
48
|
+
- Choose transition effect: `fade()`, `slide({direction})`, `wipe({direction})`, `flip({direction})`, `clockWipe()`
|
|
49
|
+
- Set timing with `linearTiming({durationInFrames})` for constant speed
|
|
50
|
+
- Use `springTiming({config, durationInFrames})` for animated spring transitions
|
|
51
|
+
- Calculate total duration accounting for overlapping transitions
|
|
52
|
+
- Test duration math carefully to ensure smooth transitions
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: shell-scripting-guidelines
|
|
3
|
+
description: >-
|
|
4
|
+
Trigger on `.sh` files and shell scripts. Use when writing POSIX shell scripts for automation. Apply for strict mode, quoting, error handling, idempotent operations. Keywords: shell, bash, POSIX, shellcheck, shfmt, strict mode, quoting, parameter expansion, exit codes, idempotency.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Shell Scripting Coding Guidelines
|
|
8
|
+
|
|
9
|
+
## Essentials
|
|
10
|
+
|
|
11
|
+
- **POSIX compatibility** - Use POSIX sh, lint with shellcheck, format with shfmt, see [reference/posix-compatibility.md](reference/posix-compatibility.md)
|
|
12
|
+
- **Strict mode** - Use strict mode and safe defaults, see [reference/strict-mode.md](reference/strict-mode.md)
|
|
13
|
+
- **Quoting** - Quote all expansions to avoid word splitting, see [reference/quoting.md](reference/quoting.md)
|
|
14
|
+
- **Functions** - Write small, focused functions, see [reference/functions.md](reference/functions.md)
|
|
15
|
+
- **Parameter expansion** - Set default values and manipulate variables, see [reference/parameter-expansion.md](reference/parameter-expansion.md)
|
|
16
|
+
- **Error handling** - Implement exit codes and error messages, see [reference/error-handling.md](reference/error-handling.md)
|
|
17
|
+
- **Idempotency** - Make scripts safely re-runnable, see [reference/idempotency.md](reference/idempotency.md)
|
|
18
|
+
|
|
19
|
+
## Progressive disclosure
|
|
20
|
+
|
|
21
|
+
- Read [reference/posix-compatibility.md](reference/posix-compatibility.md) - When ensuring portability across shells
|
|
22
|
+
- Read [reference/strict-mode.md](reference/strict-mode.md) - When setting up error handling and safety flags
|
|
23
|
+
- Read [reference/quoting.md](reference/quoting.md) - When variables expand incorrectly or word splitting occurs
|
|
24
|
+
- Read [reference/functions.md](reference/functions.md) - When organizing script logic or creating reusable code
|
|
25
|
+
- Read [reference/parameter-expansion.md](reference/parameter-expansion.md) - When setting default values or manipulating variables
|
|
26
|
+
- Read [reference/error-handling.md](reference/error-handling.md) - When implementing exit codes or error messages
|
|
27
|
+
- Read [reference/argument-parsing.md](reference/argument-parsing.md) - When parsing command-line flags or arguments
|
|
28
|
+
- Read [reference/validation.md](reference/validation.md) - When checking preconditions or input validity
|
|
29
|
+
- Read [reference/idempotency.md](reference/idempotency.md) - When scripts should be safely re-runnable
|
|
30
|
+
- Read [reference/common-patterns.md](reference/common-patterns.md) - When learning common shell idioms
|
|
31
|
+
- Read [reference/script-template.md](reference/script-template.md) - When starting a new shell script
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# argument-parsing: Argument Parsing
|
|
2
|
+
|
|
3
|
+
**Guideline:** Validate script arguments and parse flags with clear usage messages.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Proper argument parsing prevents script misuse, provides helpful feedback to users, and makes scripts more robust and user-friendly.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
# ✅ Simple argument parsing
|
|
11
|
+
parse_args() {
|
|
12
|
+
if [ "$#" -lt 1 ]; then
|
|
13
|
+
die "Usage: $0 <input> [output]" 2
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
input="$1"
|
|
17
|
+
output="${2:-output.txt}"
|
|
18
|
+
|
|
19
|
+
if [ ! -f "$input" ]; then
|
|
20
|
+
die "Input file not found: $input" 2
|
|
21
|
+
fi
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
# ✅ Flag parsing
|
|
25
|
+
parse_flags() {
|
|
26
|
+
verbose=0
|
|
27
|
+
force=0
|
|
28
|
+
|
|
29
|
+
while [ "$#" -gt 0 ]; do
|
|
30
|
+
case "$1" in
|
|
31
|
+
-v|--verbose)
|
|
32
|
+
verbose=1
|
|
33
|
+
shift
|
|
34
|
+
;;
|
|
35
|
+
-f|--force)
|
|
36
|
+
force=1
|
|
37
|
+
shift
|
|
38
|
+
;;
|
|
39
|
+
-h|--help)
|
|
40
|
+
show_usage
|
|
41
|
+
exit 0
|
|
42
|
+
;;
|
|
43
|
+
-*)
|
|
44
|
+
die "Unknown option: $1" 2
|
|
45
|
+
;;
|
|
46
|
+
*)
|
|
47
|
+
break
|
|
48
|
+
;;
|
|
49
|
+
esac
|
|
50
|
+
done
|
|
51
|
+
|
|
52
|
+
# Remaining args
|
|
53
|
+
if [ "$#" -lt 1 ]; then
|
|
54
|
+
die "Missing required argument" 2
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
input="$1"
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Techniques:**
|
|
62
|
+
- Check argument count before accessing positional parameters
|
|
63
|
+
- Provide clear usage messages showing required and optional arguments
|
|
64
|
+
- Use a while loop with case statement for flag parsing
|
|
65
|
+
- Support both short (-v) and long (--verbose) flags
|
|
66
|
+
- Handle unknown flags with an error message
|
|
67
|
+
- Validate argument values after parsing
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# common-patterns: Common Patterns
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use well-tested patterns for common operations like reading files, processing output, and managing temporary resources.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Standard patterns are proven to handle edge cases correctly and avoid common pitfalls like word splitting, missing the last line, or resource leaks.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
# ✅ Read file line by line
|
|
11
|
+
while IFS= read -r line; do
|
|
12
|
+
process_line "$line"
|
|
13
|
+
done < "$input_file"
|
|
14
|
+
|
|
15
|
+
# ✅ Process command output
|
|
16
|
+
find . -name '*.txt' | while IFS= read -r file; do
|
|
17
|
+
process_file "$file"
|
|
18
|
+
done
|
|
19
|
+
|
|
20
|
+
# ✅ Temporary directory
|
|
21
|
+
temp_dir="$(mktemp -d)"
|
|
22
|
+
trap 'rm -rf "$temp_dir"' EXIT
|
|
23
|
+
|
|
24
|
+
# ✅ Check if running as root
|
|
25
|
+
if [ "$(id -u)" -eq 0 ]; then
|
|
26
|
+
log "Running as root"
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
# ✅ Get script directory
|
|
30
|
+
script_dir="$(cd "$(dirname "$0")" && pwd)"
|
|
31
|
+
|
|
32
|
+
# ✅ Check exit status
|
|
33
|
+
if command arg1 arg2; then
|
|
34
|
+
log "Command succeeded"
|
|
35
|
+
else
|
|
36
|
+
error "Command failed with exit code: $?"
|
|
37
|
+
fi
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Techniques:**
|
|
41
|
+
- Use `while IFS= read -r line` to read files line by line
|
|
42
|
+
- Create temp files/dirs with `mktemp` and always trap cleanup
|
|
43
|
+
- Use command substitution in conditionals for proper error handling
|
|
44
|
+
- Get script directory with `cd "$(dirname "$0")" && pwd`
|
|
45
|
+
- Check root with `[ "$(id -u)" -eq 0 ]`
|
|
46
|
+
- Preserve IFS in read loops to handle whitespace correctly
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# error-handling: Error Handling
|
|
2
|
+
|
|
3
|
+
**Guideline:** Provide clear error messages with context, validate operations, and implement cleanup handlers.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Good error handling makes scripts easier to debug and prevents resource leaks. Clear error messages help users understand and fix problems quickly.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
# ✅ Clear error messages with context
|
|
11
|
+
die() {
|
|
12
|
+
printf 'ERROR: %s\n' "$1" >&2
|
|
13
|
+
exit "${2:-1}"
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
# ✅ Check command existence
|
|
17
|
+
require_command() {
|
|
18
|
+
local cmd="$1"
|
|
19
|
+
if ! command -v "$cmd" >/dev/null 2>&1; then
|
|
20
|
+
die "Required command not found: $cmd" 127
|
|
21
|
+
fi
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
# ✅ Validate file operations
|
|
25
|
+
read_config() {
|
|
26
|
+
local config="$1"
|
|
27
|
+
|
|
28
|
+
if [ ! -f "$config" ]; then
|
|
29
|
+
die "Config file not found: $config" 2
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
if [ ! -r "$config" ]; then
|
|
33
|
+
die "Config file not readable: $config" 2
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
cat "$config"
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
# ✅ Cleanup on exit
|
|
40
|
+
cleanup() {
|
|
41
|
+
local exit_code=$?
|
|
42
|
+
if [ -n "${temp_file:-}" ]; then
|
|
43
|
+
rm -f "$temp_file"
|
|
44
|
+
fi
|
|
45
|
+
exit "$exit_code"
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
trap cleanup EXIT INT TERM
|
|
49
|
+
|
|
50
|
+
# Create temp file
|
|
51
|
+
temp_file="$(mktemp)"
|
|
52
|
+
# Use temp_file...
|
|
53
|
+
# Cleanup happens automatically
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**Techniques:**
|
|
57
|
+
- Create a `die()` function for fatal errors with exit codes
|
|
58
|
+
- Check command existence with `command -v`
|
|
59
|
+
- Validate file operations before performing them
|
|
60
|
+
- Use trap to ensure cleanup on exit, interrupt, or termination
|
|
61
|
+
- Include context in error messages (filenames, expected values)
|
|
62
|
+
- Use appropriate exit codes (0=success, 1=general error, 2=usage error, 127=command not found)
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# functions: Function Best Practices
|
|
2
|
+
|
|
3
|
+
**Guideline:** Write small, focused functions with local variables and meaningful return codes.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Small functions improve readability, testability, and reusability. Local variables prevent variable pollution, and return codes enable proper error handling.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
# ✅ Small focused functions
|
|
11
|
+
is_file() {
|
|
12
|
+
[ -f "$1" ]
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
is_dir() {
|
|
16
|
+
[ -d "$1" ]
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
file_exists() {
|
|
20
|
+
[ -e "$1" ]
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
# ✅ Use local variables
|
|
24
|
+
process_file() {
|
|
25
|
+
local file="$1"
|
|
26
|
+
local output="$2"
|
|
27
|
+
|
|
28
|
+
if ! is_file "$file"; then
|
|
29
|
+
error "Not a file: $file"
|
|
30
|
+
return 1
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
# Process file...
|
|
34
|
+
log "Processed: $file -> $output"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
# ✅ Return status codes
|
|
38
|
+
validate_input() {
|
|
39
|
+
local input="$1"
|
|
40
|
+
|
|
41
|
+
if [ -z "$input" ]; then
|
|
42
|
+
return 1
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
if [ "${#input}" -lt 3 ]; then
|
|
46
|
+
return 2
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
return 0
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
# Usage
|
|
53
|
+
if validate_input "$user_input"; then
|
|
54
|
+
log "Valid input"
|
|
55
|
+
else
|
|
56
|
+
die "Invalid input" "$?"
|
|
57
|
+
fi
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Techniques:**
|
|
61
|
+
- Keep functions focused on a single task
|
|
62
|
+
- Declare all function variables as `local`
|
|
63
|
+
- Return 0 for success, non-zero for failure
|
|
64
|
+
- Use descriptive function names (verb_noun format)
|
|
65
|
+
- Validate function arguments before use
|
|
66
|
+
- Use return codes, not exit, within functions
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# idempotency: Idempotent Scripts
|
|
2
|
+
|
|
3
|
+
**Guideline:** Design scripts to be safely run multiple times without unintended side effects.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Idempotent scripts are essential for automation, deployment, and configuration management. They allow safe retries after failures and prevent duplicate operations.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
# ✅ Check before creating
|
|
11
|
+
create_directory() {
|
|
12
|
+
local dir="$1"
|
|
13
|
+
|
|
14
|
+
if [ -d "$dir" ]; then
|
|
15
|
+
log "Directory exists: $dir"
|
|
16
|
+
return 0
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
mkdir -p "$dir"
|
|
20
|
+
log "Created directory: $dir"
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
# ✅ Check before modifying
|
|
24
|
+
ensure_line_in_file() {
|
|
25
|
+
local line="$1"
|
|
26
|
+
local file="$2"
|
|
27
|
+
|
|
28
|
+
if grep -qF "$line" "$file" 2>/dev/null; then
|
|
29
|
+
log "Line already present: $file"
|
|
30
|
+
return 0
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
printf '%s\n' "$line" >> "$file"
|
|
34
|
+
log "Added line to: $file"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
# ✅ Atomic operations with temp files
|
|
38
|
+
update_config() {
|
|
39
|
+
local config="$1"
|
|
40
|
+
local temp
|
|
41
|
+
temp="$(mktemp)"
|
|
42
|
+
|
|
43
|
+
# Generate new config
|
|
44
|
+
generate_config > "$temp"
|
|
45
|
+
|
|
46
|
+
# Atomic replace
|
|
47
|
+
mv "$temp" "$config"
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Techniques:**
|
|
52
|
+
- Check if resources exist before creating them
|
|
53
|
+
- Use conditional operations that skip when already done
|
|
54
|
+
- Use atomic operations with temporary files
|
|
55
|
+
- Log actions taken vs. skipped for observability
|
|
56
|
+
- Use `mkdir -p` and similar idempotent commands
|
|
57
|
+
- Verify state before and after modifications
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# parameter-expansion: Default Values and Parameter Expansion
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use parameter expansion to set default values, require variables, and perform string operations.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Parameter expansion provides safe, portable ways to handle optional and required variables without external commands, improving script robustness and performance.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
# ✅ Default value if unset or empty
|
|
11
|
+
: "${CONFIG_FILE:=/etc/app/config.conf}"
|
|
12
|
+
: "${PORT:=8080}"
|
|
13
|
+
: "${DEBUG:=0}"
|
|
14
|
+
|
|
15
|
+
# ✅ Default value only if unset (keeps empty string)
|
|
16
|
+
: "${NAME:=default}"
|
|
17
|
+
|
|
18
|
+
# ✅ Use in assignments
|
|
19
|
+
config="${CONFIG_FILE:-/etc/default.conf}"
|
|
20
|
+
|
|
21
|
+
# ✅ Error if variable unset
|
|
22
|
+
: "${REQUIRED_VAR:?Variable REQUIRED_VAR must be set}"
|
|
23
|
+
|
|
24
|
+
# ✅ Alternate value if set
|
|
25
|
+
message="${DEBUG:+Debug mode enabled}"
|
|
26
|
+
|
|
27
|
+
# ✅ String operations
|
|
28
|
+
filename="document.txt"
|
|
29
|
+
basename="${filename%.*}" # document
|
|
30
|
+
extension="${filename##*.}" # txt
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Techniques:**
|
|
34
|
+
- Use `${VAR:-default}` for default if unset or empty
|
|
35
|
+
- Use `: "${VAR:=value}"` to set defaults
|
|
36
|
+
- Use `${VAR:?message}` to require variables
|
|
37
|
+
- Use `${VAR:+value}` for alternate values when set
|
|
38
|
+
- Use `${var%pattern}` and `${var##pattern}` for string operations
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# posix-compatibility: POSIX Compatibility
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use POSIX-compliant syntax for maximum portability across different shells and systems.
|
|
4
|
+
|
|
5
|
+
**Rationale:** POSIX-compliant scripts run on any POSIX shell (sh, dash, bash, zsh, etc.), ensuring scripts work reliably across different systems without modification.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
# ✅ Use POSIX test constructs
|
|
11
|
+
if [ -f "$file" ]; then
|
|
12
|
+
log "File exists"
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
# ❌ Avoid bash-specific [[
|
|
16
|
+
if [[ -f $file ]]; then # Not POSIX
|
|
17
|
+
log "File exists"
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
# ✅ POSIX string comparison
|
|
21
|
+
if [ "$status" = "success" ]; then
|
|
22
|
+
log "Success"
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
# ✅ POSIX numeric comparison
|
|
26
|
+
if [ "$count" -gt 10 ]; then
|
|
27
|
+
log "Count exceeds 10"
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# ✅ POSIX command existence check
|
|
31
|
+
if command -v git >/dev/null 2>&1; then
|
|
32
|
+
log "git is available"
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
# ❌ Avoid type/which
|
|
36
|
+
if type git >/dev/null 2>&1; then # Less portable
|
|
37
|
+
log "git is available"
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
# ✅ POSIX-compatible string operations
|
|
41
|
+
string="hello world"
|
|
42
|
+
# Use parameter expansion instead of bash ${var^^}
|
|
43
|
+
upper="$(printf '%s' "$string" | tr '[:lower:]' '[:upper:]')"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Techniques:**
|
|
47
|
+
- Use `[ ]` instead of bash-specific `[[ ]]`
|
|
48
|
+
- Use `=` for string comparison, not `==`
|
|
49
|
+
- Use `-gt`, `-lt`, etc. for numeric comparisons
|
|
50
|
+
- Use `command -v` instead of `which` or `type`
|
|
51
|
+
- Use `tr` and `cut` instead of bash string operations
|
|
52
|
+
- Avoid bash arrays, use positional parameters or temp files
|
|
53
|
+
- Test scripts with `sh` (dash) not just bash
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# quoting: Quoting Variables and Expansions
|
|
2
|
+
|
|
3
|
+
**Guideline:** Always quote variable expansions with double quotes to prevent word splitting and glob expansion.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Unquoted variables are subject to word splitting on whitespace and pathname expansion, leading to subtle bugs when filenames contain spaces or special characters.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
# ✅ Always quote variable expansions
|
|
11
|
+
name="John Doe"
|
|
12
|
+
log "Hello, $name"
|
|
13
|
+
file="/path/to/my file.txt"
|
|
14
|
+
cat "$file"
|
|
15
|
+
|
|
16
|
+
# ❌ Unquoted variables cause word splitting
|
|
17
|
+
cat $file # Tries to cat "/path/to/my" and "file.txt" separately!
|
|
18
|
+
|
|
19
|
+
# ✅ Quote arrays in loops
|
|
20
|
+
for file in "$@"; do
|
|
21
|
+
process "$file"
|
|
22
|
+
done
|
|
23
|
+
|
|
24
|
+
# ❌ Unquoted $@ splits on spaces
|
|
25
|
+
for file in $@; do # Wrong!
|
|
26
|
+
process "$file"
|
|
27
|
+
done
|
|
28
|
+
|
|
29
|
+
# ✅ Use "${var}" for clarity
|
|
30
|
+
config_file="${CONFIG_DIR}/app.conf"
|
|
31
|
+
|
|
32
|
+
# ✅ Quote command substitution
|
|
33
|
+
current_date="$(date +%Y-%m-%d)"
|
|
34
|
+
files="$(find . -name '*.txt')"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Techniques:**
|
|
38
|
+
- Quote all variable expansions: `"$var"`
|
|
39
|
+
- Quote command substitutions: `"$(command)"`
|
|
40
|
+
- Quote `"$@"` in loops to preserve arguments with spaces
|
|
41
|
+
- Use `"${var}"` for clarity in complex expansions
|
|
42
|
+
- Never use unquoted variables in file operations
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# script-template: Basic Script Template
|
|
2
|
+
|
|
3
|
+
**Guideline:** Start all shell scripts with a standard template including shebang, strict mode, logging functions, and argument validation.
|
|
4
|
+
|
|
5
|
+
**Rationale:** A consistent template ensures scripts follow safety best practices from the start, reducing common errors and improving maintainability.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
#!/usr/bin/env sh
|
|
11
|
+
# Description: Brief description of what this script does
|
|
12
|
+
# Usage: script.sh <arg1> [arg2]
|
|
13
|
+
|
|
14
|
+
set -eu # Exit on error, error on undefined variable
|
|
15
|
+
# Note: pipefail not in POSIX, use only if targeting bash
|
|
16
|
+
|
|
17
|
+
# Default values
|
|
18
|
+
: "${TMPDIR:=/tmp}"
|
|
19
|
+
: "${VERBOSE:=0}"
|
|
20
|
+
|
|
21
|
+
# Logging functions
|
|
22
|
+
log() {
|
|
23
|
+
printf '%s\n' "$@"
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
log_verbose() {
|
|
27
|
+
if [ "$VERBOSE" = "1" ]; then
|
|
28
|
+
printf '[VERBOSE] %s\n' "$@" >&2
|
|
29
|
+
fi
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
error() {
|
|
33
|
+
printf 'ERROR: %s\n' "$@" >&2
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
die() {
|
|
37
|
+
error "$1"
|
|
38
|
+
exit "${2:-1}"
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
# Check requirements
|
|
42
|
+
command -v required_tool >/dev/null 2>&1 || die "required_tool not found" 2
|
|
43
|
+
|
|
44
|
+
# Validate arguments
|
|
45
|
+
if [ "$#" -lt 1 ]; then
|
|
46
|
+
die "Usage: $0 <name> [options]" 2
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
# Main logic
|
|
50
|
+
main() {
|
|
51
|
+
local name="$1"
|
|
52
|
+
log "Processing: $name"
|
|
53
|
+
|
|
54
|
+
# Do work...
|
|
55
|
+
|
|
56
|
+
log "Done"
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
# Run main
|
|
60
|
+
main "$@"
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Techniques:**
|
|
64
|
+
- Begin with `#!/usr/bin/env sh` for portability
|
|
65
|
+
- Add script description and usage in comments
|
|
66
|
+
- Set strict mode with `set -eu`
|
|
67
|
+
- Define logging and error functions
|
|
68
|
+
- Check for required dependencies
|
|
69
|
+
- Validate arguments before processing
|
|
70
|
+
- Implement main logic in a main() function
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# strict-mode: Strict Mode and Safety
|
|
2
|
+
|
|
3
|
+
**Guideline:** Enable strict mode with `set -eu` (POSIX) or `set -euo pipefail` (bash/zsh) to catch errors early.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Strict mode prevents scripts from continuing after errors, catches undefined variable usage, and makes pipeline failures visible, preventing silent failures that can cause data loss or security issues.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
# ✅ Basic strict mode (POSIX)
|
|
11
|
+
set -eu
|
|
12
|
+
|
|
13
|
+
# ✅ Full strict mode (bash/zsh)
|
|
14
|
+
set -euo pipefail
|
|
15
|
+
|
|
16
|
+
# What each flag does:
|
|
17
|
+
# -e: Exit immediately if command fails
|
|
18
|
+
# -u: Error on undefined variable
|
|
19
|
+
# -o pipefail: Fail if any command in pipeline fails
|
|
20
|
+
|
|
21
|
+
# ✅ Safer alternative for POSIX (no pipefail)
|
|
22
|
+
set -eu
|
|
23
|
+
IFS=$(printf '\n\t')
|
|
24
|
+
|
|
25
|
+
# ✅ Handle expected failures explicitly
|
|
26
|
+
if ! command_that_might_fail; then
|
|
27
|
+
log "Expected failure occurred"
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# ✅ Temporary disable strict mode
|
|
31
|
+
set +e
|
|
32
|
+
optional_command || true
|
|
33
|
+
set -e
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Techniques:**
|
|
37
|
+
- Add `set -eu` at the top of POSIX scripts
|
|
38
|
+
- Add `set -euo pipefail` for bash/zsh scripts
|
|
39
|
+
- Handle expected failures explicitly with `if ! command; then`
|
|
40
|
+
- Temporarily disable strict mode only when necessary
|
|
41
|
+
- Set IFS to newline and tab for POSIX compatibility
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# validation: Shellcheck and Shfmt Integration
|
|
2
|
+
|
|
3
|
+
**Guideline:** Validate scripts with shellcheck and format with shfmt for consistent, error-free code.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Shellcheck catches common bugs, portability issues, and anti-patterns automatically. Shfmt ensures consistent formatting across scripts, improving readability and maintainability.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
# Run shellcheck on script
|
|
11
|
+
shellcheck script.sh
|
|
12
|
+
|
|
13
|
+
# Check all shell scripts in directory
|
|
14
|
+
find . -name '*.sh' -exec shellcheck {} +
|
|
15
|
+
|
|
16
|
+
# Disable specific warnings (use sparingly)
|
|
17
|
+
# shellcheck disable=SC2086
|
|
18
|
+
variable_without_quotes=$1
|
|
19
|
+
|
|
20
|
+
# Better: Fix the actual issue
|
|
21
|
+
variable_with_quotes="$1"
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Techniques:**
|
|
25
|
+
- Run `shellcheck script.sh` before committing
|
|
26
|
+
- Use `find . -name '*.sh' -exec shellcheck {} +` to check multiple scripts
|
|
27
|
+
- Fix shellcheck warnings rather than disabling them
|
|
28
|
+
- Format scripts with `shfmt -w script.sh`
|
|
29
|
+
- Use shfmt options: `-i 2` (2-space indent), `-bn` (binary ops), `-ci` (case indent), `-sr` (space after redirect)
|
|
30
|
+
- Integrate shellcheck and shfmt into CI/CD pipelines
|