feat(opencode): add language-specific coding skills

- add conventions for Bash, C#, Go, Python, and TypeScript
- add frontend guidance for HTMX, PrimeVue, and Vue
- document formatting, typing, testing, async, and framework-specific practices
- reference official documentation for framework API details
This commit is contained in:
colem
2026-08-11 15:28:09 -05:00
parent 71f73fccbc
commit a4fc747df2
8 changed files with 192 additions and 0 deletions
+21
View File
@@ -0,0 +1,21 @@
---
name: bash
description: Shell scripting conventions (set -euo pipefail, quoting, shellcheck). Use when editing .sh or .bash files.
---
# Bash Conventions
## Robustness
- Begin scripts with `#!/usr/bin/env bash` and `set -euo pipefail`.
- Pass `shellcheck` cleanly; treat its warnings as bugs.
## Quoting and expansion
- Double-quote all variable expansions (`"$var"`, `"${array[@]}"`).
- Prefer `[[ ]]` over `[ ]`; use arrays for argument lists rather than space-separated strings.
- Avoid `eval`; do not parse `ls` output.
## Structure
- Declare function-local variables with `local`.
- Use `trap` to clean up temporary files and directories.
- Use `printf` over `echo` for predictable output.
- Prefer a `$TMPDIR`-based path over hardcoded `/tmp` literals.
+37
View File
@@ -0,0 +1,37 @@
---
name: csharp
description: C# and .NET coding conventions. Use when reading, writing, or reviewing .cs, .razor, .csproj, or .sln files, or any .NET (C#) code.
---
# C# / .NET Conventions
Follow the Microsoft [Common C# code conventions](https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions) and [.NET naming guidelines](https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/naming-guidelines). Match patterns already established in the target codebase.
## Structure
- Use file-scoped namespaces (`namespace Example.Services;`).
- Nullable reference types are enabled solution-wide; do not suppress warnings without cause.
- Use `record` types for DTOs and data carriers.
- Use `required` / `init`-only properties for immutable domain models.
- Use primary constructors for services and repositories that take injected dependencies.
- Mark classes `sealed` by default unless inheritance is intended.
- Prefix interfaces with `I` (`IRenderer`, `IRepository`).
## Expressions
- Use raw string literals (`""" ... """`) for multi-line SQL.
- Use `[GeneratedRegex]` partial methods for regex.
- Use collection expressions (`[]`, `[a, b]`).
## Async and cancellation
- Every async method takes `CancellationToken ct = default` and honors it cooperatively (`ct.ThrowIfCancellationRequested()` in long loops).
- Never drop the token when calling downstream async APIs.
## Logging
- Inject `ILogger<T>` and use structured logging with named parameters:
`_logger.LogInformation("Generated {Count} transactions", count);`
## Naming
- `PascalCase` for types and members.
- `_camelCase` for private fields.
## Testing
- Use xUnit. Mirror the source structure under a `Tests/` directory with a `Tests` suffix on file names.
+22
View File
@@ -0,0 +1,22 @@
---
name: go
description: Idiomatic Go conventions. Use when editing .go files or go.mod/go.sum.
---
# Go Conventions
Write strictly idiomatic Go following standard formatting and best practices.
## Formatting and style
- `gofmt` / `goimports` formatting is mandatory.
- Follow [Effective Go](https://go.dev/doc/effective_go) and the [Go Code Review Comments](https://github.com/golang/go/wiki/CodeReviewComments).
## Design
- Accept `context.Context` as the first parameter on functions doing I/O or long work; honor cancellation.
- Compose via small interfaces; accept interfaces, return structs.
- Wire dependencies explicitly via constructor injection; avoid package-level mutable globals and DI frameworks.
- Return errors explicitly; wrap with `%w` (`fmt.Errorf("do thing: %w", err)`); classify with `errors.Is` / `errors.As`; never discard errors.
## Testing
- Write table-driven tests in `_test.go` using the standard `testing` package.
- Use `t.Run` for subtests; report failures with `t.Errorf` / `t.Fatalf`.
+22
View File
@@ -0,0 +1,22 @@
---
name: htmx
description: HTMX v2 progressive-enhancement and hypermedia patterns.
---
# HTMX Conventions
Follow [HTMX](https://htmx.org) v2 and [Hypermedia Systems](https://hypermedia.systems/book/contents/) best practices.
## Philosophy
- Treat the server as the source of truth; return HTML fragments, not JSON, for hypermedia interactions.
- Prefer `hx-*` attributes over client-side JavaScript; reach for client JavaScript only when htmx cannot express the interaction.
- Build progressively: ensure pages function without JavaScript, then enhance with htmx.
## Patterns
- Target fragments with `hx-target` and swap with `hx-swap` (prefer `outerHTML` or `innerHTML` as appropriate).
- Return partial templates or fragments from endpoints; treat partials as isolated components that receive data via the page model.
- Use Out-of-Band Swaps (`hx-swap-oob`) to update multiple regions from a single response.
- Handle errors with a 4xx/5xx partial or `hx-on::responseError`.
## Keep clean
- Return semantic HTML from endpoints; avoid mixing `hx-*` attributes with conflicting client-side handlers.
+19
View File
@@ -0,0 +1,19 @@
---
name: primevue
description: PrimeVue v4 component patterns and Tailwind integration. Use when writing or styling PrimeVue components.
---
# PrimeVue v4 Conventions
Assume PrimeVue v4 is installed when answering Vue questions. Use the Composition API with `<script setup>`.
## Usage
- Register components via the PrimeVue plugin or import per component.
- Prefer official presets and theming over hand-rolled overrides.
## Tailwind integration
- TailwindCSS is available; when needed, apply utility classes through the component passthrough (`pt`) or the unstyled/preset mechanism rather than overriding internal DOM.
- Keep utility usage consistent with the project's styling layer.
## API detail
- For component props, events, slots, and passthrough (`pt`) keys, fetch the PrimeVue LLM docs index on demand: `https://v4.primevue.org/llms/llms.txt`. Follow the relevant component link for the exact signature.
+23
View File
@@ -0,0 +1,23 @@
---
name: python
description: Python conventions (PEP 8, ruff, type hints). Use when editing .py files.
---
# Python Conventions
## Style
- Follow PEP 8; run `ruff check` and `ruff format` for linting and formatting.
- Let ruff manage line length and import ordering; do not hand-format against it.
## Typing
- Add type hints on all function signatures; prefer modern syntax (`list[int]`, `X | None`) on supported Python versions.
- Use `dataclasses` (or Pydantic where validation is required) for structured data.
- Prefer an explicit exception hierarchy over bare `except:`.
## Idioms
- Prefer `pathlib.Path` over `os.path`.
- Use f-strings for interpolation; use the `logging` module with structured handlers instead of `print` in libraries.
- Prefer comprehensions and generator expressions over manual loops where readability is preserved.
## Testing
- Use `unittest` (or `pytest` if the project adopts it); mirror the source layout under a `tests/` directory.
@@ -0,0 +1,23 @@
---
name: typescript
description: TypeScript conventions (Google style, strict mode, no any). Use when editing .ts or .tsx files, or tsconfig/jsconfig files.
---
# TypeScript Conventions
Follow the [Google TypeScript Style Guide](https://google.github.io/styleguide/tsguide.html).
## Typing
- `strict: true` in tsconfig; no implicit or explicit `any`.
- Strictly type all variables, functions, and interfaces.
- Prefer `unknown` over `any` when the type is genuinely unknown, then narrow.
- Prefer discriminated unions and type narrowing over runtime checks.
- Declare explicit return types on public and shared APIs.
## Style
- Prefer `interface` for object shapes; use `type` for unions and mapped types.
- Use `const` by default; `let` only when reassignment is required; never `var`.
- Prefer async/await over raw `.then`/`.catch` chains.
## Project overrides
A project's tsconfig or eslint config may relax rules (for example, disable `@typescript-eslint/no-explicit-any`); project configuration overrides these defaults.
+25
View File
@@ -0,0 +1,25 @@
---
name: vue
description: Vue 3 (Composition API, script setup, Pinia, Vue Router) conventions. Use when editing .vue files.
---
# Vue 3 Conventions
Use Vue 3 with the Composition API exclusively.
## Components
- Use `<script setup lang="ts">`; avoid the Options API.
- Type props with `defineProps<T>()` and emits with `defineEmits<T>()`.
- Keep components focused and small; organize by feature directory.
## State and routing
- Use Pinia setup stores (`defineStore('name', () => { ... })`) for shared state.
- Cancel superseded fetches with `AbortController`; expose loading and error state from stores.
- Use Vue Router with route guards for protected views.
## Reactivity
- Prefer `ref` / `reactive` and `computed` over manual watchers.
- Clean up side effects (timers, listeners, observers) in `onScopeDispose` or `onUnmounted`.
## API detail
- For exact reactivity, built-in component, and compiler behavior, fetch the Vue LLM docs index on demand: `https://vuejs.org/llms.txt`. Follow the relevant guide link for the specific API.