claudient 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 +42 -0
- package/CONTEXT.md +58 -0
- package/README.md +165 -0
- package/agents/build-resolvers/de/python-resolver.md +64 -0
- package/agents/build-resolvers/de/typescript-resolver.md +65 -0
- package/agents/build-resolvers/es/python-resolver.md +64 -0
- package/agents/build-resolvers/es/typescript-resolver.md +65 -0
- package/agents/build-resolvers/fr/python-resolver.md +64 -0
- package/agents/build-resolvers/fr/typescript-resolver.md +65 -0
- package/agents/build-resolvers/nl/python-resolver.md +64 -0
- package/agents/build-resolvers/nl/typescript-resolver.md +65 -0
- package/agents/build-resolvers/python-resolver.md +62 -0
- package/agents/build-resolvers/typescript-resolver.md +63 -0
- package/agents/core/architect.md +64 -0
- package/agents/core/code-reviewer.md +78 -0
- package/agents/core/de/architect.md +66 -0
- package/agents/core/de/code-reviewer.md +80 -0
- package/agents/core/de/planner.md +63 -0
- package/agents/core/de/security-reviewer.md +93 -0
- package/agents/core/es/architect.md +66 -0
- package/agents/core/es/code-reviewer.md +80 -0
- package/agents/core/es/planner.md +63 -0
- package/agents/core/es/security-reviewer.md +93 -0
- package/agents/core/fr/architect.md +66 -0
- package/agents/core/fr/code-reviewer.md +80 -0
- package/agents/core/fr/planner.md +63 -0
- package/agents/core/fr/security-reviewer.md +93 -0
- package/agents/core/nl/architect.md +66 -0
- package/agents/core/nl/code-reviewer.md +80 -0
- package/agents/core/nl/planner.md +63 -0
- package/agents/core/nl/security-reviewer.md +93 -0
- package/agents/core/planner.md +61 -0
- package/agents/core/security-reviewer.md +91 -0
- package/guides/agent-orchestration.md +231 -0
- package/guides/de/agent-orchestration.md +174 -0
- package/guides/de/getting-started.md +164 -0
- package/guides/de/hooks-cookbook.md +160 -0
- package/guides/de/memory-management.md +153 -0
- package/guides/de/security.md +180 -0
- package/guides/de/skill-authoring.md +214 -0
- package/guides/de/token-optimization.md +156 -0
- package/guides/es/agent-orchestration.md +174 -0
- package/guides/es/getting-started.md +164 -0
- package/guides/es/hooks-cookbook.md +160 -0
- package/guides/es/memory-management.md +153 -0
- package/guides/es/security.md +180 -0
- package/guides/es/skill-authoring.md +214 -0
- package/guides/es/token-optimization.md +156 -0
- package/guides/fr/agent-orchestration.md +174 -0
- package/guides/fr/getting-started.md +164 -0
- package/guides/fr/hooks-cookbook.md +227 -0
- package/guides/fr/memory-management.md +169 -0
- package/guides/fr/security.md +180 -0
- package/guides/fr/skill-authoring.md +214 -0
- package/guides/fr/token-optimization.md +158 -0
- package/guides/getting-started.md +164 -0
- package/guides/hooks-cookbook.md +423 -0
- package/guides/memory-management.md +192 -0
- package/guides/nl/agent-orchestration.md +174 -0
- package/guides/nl/getting-started.md +164 -0
- package/guides/nl/hooks-cookbook.md +160 -0
- package/guides/nl/memory-management.md +153 -0
- package/guides/nl/security.md +180 -0
- package/guides/nl/skill-authoring.md +214 -0
- package/guides/nl/token-optimization.md +156 -0
- package/guides/security.md +229 -0
- package/guides/skill-authoring.md +226 -0
- package/guides/token-optimization.md +169 -0
- package/hooks/lifecycle/cost-tracker.md +49 -0
- package/hooks/lifecycle/cost-tracker.sh +59 -0
- package/hooks/lifecycle/pre-compact-save.md +56 -0
- package/hooks/lifecycle/pre-compact-save.sh +37 -0
- package/hooks/lifecycle/session-start.md +50 -0
- package/hooks/lifecycle/session-start.sh +47 -0
- package/hooks/post-tool-use/audit-log.md +53 -0
- package/hooks/post-tool-use/audit-log.sh +53 -0
- package/hooks/post-tool-use/prettier.md +53 -0
- package/hooks/post-tool-use/prettier.sh +49 -0
- package/hooks/pre-tool-use/block-dangerous.md +48 -0
- package/hooks/pre-tool-use/block-dangerous.sh +76 -0
- package/hooks/pre-tool-use/git-push-confirm.md +46 -0
- package/hooks/pre-tool-use/git-push-confirm.sh +36 -0
- package/mcp/configs/github.json +11 -0
- package/mcp/configs/postgres.json +11 -0
- package/mcp/de/recommended-servers.md +170 -0
- package/mcp/es/recommended-servers.md +170 -0
- package/mcp/fr/recommended-servers.md +170 -0
- package/mcp/nl/recommended-servers.md +170 -0
- package/mcp/recommended-servers.md +168 -0
- package/package.json +45 -0
- package/prompts/project-starters/de/fastapi-project.md +62 -0
- package/prompts/project-starters/de/nextjs-project.md +82 -0
- package/prompts/project-starters/es/fastapi-project.md +62 -0
- package/prompts/project-starters/es/nextjs-project.md +82 -0
- package/prompts/project-starters/fastapi-project.md +60 -0
- package/prompts/project-starters/fr/fastapi-project.md +62 -0
- package/prompts/project-starters/fr/nextjs-project.md +82 -0
- package/prompts/project-starters/nextjs-project.md +80 -0
- package/prompts/project-starters/nl/fastapi-project.md +62 -0
- package/prompts/project-starters/nl/nextjs-project.md +82 -0
- package/prompts/system-prompts/ai-product.md +80 -0
- package/prompts/system-prompts/data-pipeline.md +76 -0
- package/prompts/system-prompts/de/ai-product.md +82 -0
- package/prompts/system-prompts/de/data-pipeline.md +78 -0
- package/prompts/system-prompts/de/saas-backend.md +71 -0
- package/prompts/system-prompts/es/ai-product.md +82 -0
- package/prompts/system-prompts/es/data-pipeline.md +78 -0
- package/prompts/system-prompts/es/saas-backend.md +71 -0
- package/prompts/system-prompts/fr/ai-product.md +82 -0
- package/prompts/system-prompts/fr/data-pipeline.md +78 -0
- package/prompts/system-prompts/fr/saas-backend.md +71 -0
- package/prompts/system-prompts/nl/ai-product.md +82 -0
- package/prompts/system-prompts/nl/data-pipeline.md +78 -0
- package/prompts/system-prompts/nl/saas-backend.md +71 -0
- package/prompts/system-prompts/saas-backend.md +69 -0
- package/prompts/task-specific/changelog.md +81 -0
- package/prompts/task-specific/de/changelog.md +83 -0
- package/prompts/task-specific/de/debugging.md +78 -0
- package/prompts/task-specific/de/pr-description.md +69 -0
- package/prompts/task-specific/debugging.md +76 -0
- package/prompts/task-specific/es/changelog.md +83 -0
- package/prompts/task-specific/es/debugging.md +78 -0
- package/prompts/task-specific/es/pr-description.md +69 -0
- package/prompts/task-specific/fr/changelog.md +83 -0
- package/prompts/task-specific/fr/debugging.md +78 -0
- package/prompts/task-specific/fr/pr-description.md +69 -0
- package/prompts/task-specific/nl/changelog.md +83 -0
- package/prompts/task-specific/nl/debugging.md +78 -0
- package/prompts/task-specific/nl/pr-description.md +69 -0
- package/prompts/task-specific/pr-description.md +67 -0
- package/rules/common/coding-style.md +45 -0
- package/rules/common/de/coding-style.md +47 -0
- package/rules/common/de/git.md +48 -0
- package/rules/common/de/performance.md +40 -0
- package/rules/common/de/security.md +45 -0
- package/rules/common/de/testing.md +45 -0
- package/rules/common/es/coding-style.md +47 -0
- package/rules/common/es/git.md +48 -0
- package/rules/common/es/performance.md +40 -0
- package/rules/common/es/security.md +45 -0
- package/rules/common/es/testing.md +45 -0
- package/rules/common/fr/coding-style.md +47 -0
- package/rules/common/fr/git.md +48 -0
- package/rules/common/fr/performance.md +40 -0
- package/rules/common/fr/security.md +45 -0
- package/rules/common/fr/testing.md +45 -0
- package/rules/common/git.md +46 -0
- package/rules/common/nl/coding-style.md +47 -0
- package/rules/common/nl/git.md +48 -0
- package/rules/common/nl/performance.md +40 -0
- package/rules/common/nl/security.md +45 -0
- package/rules/common/nl/testing.md +45 -0
- package/rules/common/performance.md +38 -0
- package/rules/common/security.md +43 -0
- package/rules/common/testing.md +43 -0
- package/rules/language-specific/de/go.md +48 -0
- package/rules/language-specific/de/python.md +38 -0
- package/rules/language-specific/de/typescript.md +51 -0
- package/rules/language-specific/es/go.md +48 -0
- package/rules/language-specific/es/python.md +38 -0
- package/rules/language-specific/es/typescript.md +51 -0
- package/rules/language-specific/fr/go.md +48 -0
- package/rules/language-specific/fr/python.md +38 -0
- package/rules/language-specific/fr/typescript.md +51 -0
- package/rules/language-specific/go.md +46 -0
- package/rules/language-specific/nl/go.md +48 -0
- package/rules/language-specific/nl/python.md +38 -0
- package/rules/language-specific/nl/typescript.md +51 -0
- package/rules/language-specific/python.md +36 -0
- package/rules/language-specific/typescript.md +49 -0
- package/scripts/cli.js +161 -0
- package/scripts/link-skills.sh +35 -0
- package/scripts/list-skills.sh +34 -0
- package/skills/ai-engineering/agent-construction.md +285 -0
- package/skills/ai-engineering/claude-api.md +248 -0
- package/skills/ai-engineering/de/agent-construction.md +287 -0
- package/skills/ai-engineering/de/claude-api.md +250 -0
- package/skills/ai-engineering/es/agent-construction.md +287 -0
- package/skills/ai-engineering/es/claude-api.md +250 -0
- package/skills/ai-engineering/fr/agent-construction.md +287 -0
- package/skills/ai-engineering/fr/claude-api.md +250 -0
- package/skills/ai-engineering/nl/agent-construction.md +287 -0
- package/skills/ai-engineering/nl/claude-api.md +250 -0
- package/skills/backend/dotnet/csharp.md +304 -0
- package/skills/backend/dotnet/de/csharp.md +306 -0
- package/skills/backend/dotnet/es/csharp.md +306 -0
- package/skills/backend/dotnet/fr/csharp.md +306 -0
- package/skills/backend/dotnet/nl/csharp.md +306 -0
- package/skills/backend/go/de/go.md +307 -0
- package/skills/backend/go/es/go.md +307 -0
- package/skills/backend/go/fr/go.md +307 -0
- package/skills/backend/go/go.md +305 -0
- package/skills/backend/go/nl/go.md +307 -0
- package/skills/backend/nodejs/de/nestjs.md +274 -0
- package/skills/backend/nodejs/de/nextjs.md +222 -0
- package/skills/backend/nodejs/es/nestjs.md +274 -0
- package/skills/backend/nodejs/es/nextjs.md +222 -0
- package/skills/backend/nodejs/fr/nestjs.md +274 -0
- package/skills/backend/nodejs/fr/nextjs.md +222 -0
- package/skills/backend/nodejs/nestjs.md +272 -0
- package/skills/backend/nodejs/nextjs.md +220 -0
- package/skills/backend/nodejs/nl/nestjs.md +274 -0
- package/skills/backend/nodejs/nl/nextjs.md +222 -0
- package/skills/backend/python/de/django.md +285 -0
- package/skills/backend/python/de/fastapi.md +244 -0
- package/skills/backend/python/django.md +283 -0
- package/skills/backend/python/es/django.md +285 -0
- package/skills/backend/python/es/fastapi.md +244 -0
- package/skills/backend/python/fastapi.md +242 -0
- package/skills/backend/python/fr/django.md +285 -0
- package/skills/backend/python/fr/fastapi.md +244 -0
- package/skills/backend/python/nl/django.md +285 -0
- package/skills/backend/python/nl/fastapi.md +244 -0
- package/skills/data-ml/dbt-data-pipelines.md +155 -0
- package/skills/data-ml/de/dbt-data-pipelines.md +157 -0
- package/skills/data-ml/de/pandas-polars.md +147 -0
- package/skills/data-ml/de/pytorch-tensorflow.md +171 -0
- package/skills/data-ml/es/dbt-data-pipelines.md +157 -0
- package/skills/data-ml/es/pandas-polars.md +147 -0
- package/skills/data-ml/es/pytorch-tensorflow.md +171 -0
- package/skills/data-ml/fr/dbt-data-pipelines.md +157 -0
- package/skills/data-ml/fr/pandas-polars.md +147 -0
- package/skills/data-ml/fr/pytorch-tensorflow.md +171 -0
- package/skills/data-ml/nl/dbt-data-pipelines.md +157 -0
- package/skills/data-ml/nl/pandas-polars.md +147 -0
- package/skills/data-ml/nl/pytorch-tensorflow.md +171 -0
- package/skills/data-ml/pandas-polars.md +145 -0
- package/skills/data-ml/pytorch-tensorflow.md +169 -0
- package/skills/database/de/graphql.md +181 -0
- package/skills/database/es/graphql.md +181 -0
- package/skills/database/fr/graphql.md +181 -0
- package/skills/database/graphql.md +179 -0
- package/skills/database/nl/graphql.md +181 -0
- package/skills/devops-infra/de/docker.md +133 -0
- package/skills/devops-infra/de/github-actions.md +179 -0
- package/skills/devops-infra/de/kubernetes.md +129 -0
- package/skills/devops-infra/de/terraform.md +130 -0
- package/skills/devops-infra/docker.md +131 -0
- package/skills/devops-infra/es/docker.md +133 -0
- package/skills/devops-infra/es/github-actions.md +179 -0
- package/skills/devops-infra/es/kubernetes.md +129 -0
- package/skills/devops-infra/es/terraform.md +130 -0
- package/skills/devops-infra/fr/docker.md +133 -0
- package/skills/devops-infra/fr/github-actions.md +179 -0
- package/skills/devops-infra/fr/kubernetes.md +129 -0
- package/skills/devops-infra/fr/terraform.md +130 -0
- package/skills/devops-infra/github-actions.md +177 -0
- package/skills/devops-infra/kubernetes.md +127 -0
- package/skills/devops-infra/nl/docker.md +133 -0
- package/skills/devops-infra/nl/github-actions.md +179 -0
- package/skills/devops-infra/nl/kubernetes.md +129 -0
- package/skills/devops-infra/nl/terraform.md +130 -0
- package/skills/devops-infra/terraform.md +128 -0
- package/skills/finance-payments/de/stripe.md +187 -0
- package/skills/finance-payments/es/stripe.md +187 -0
- package/skills/finance-payments/fr/stripe.md +187 -0
- package/skills/finance-payments/nl/stripe.md +187 -0
- package/skills/finance-payments/stripe.md +185 -0
- package/workflows/code-review.md +151 -0
- package/workflows/de/code-review.md +153 -0
- package/workflows/de/debugging-session.md +146 -0
- package/workflows/de/feature-development.md +155 -0
- package/workflows/de/new-project-bootstrap.md +175 -0
- package/workflows/de/refactor-safely.md +150 -0
- package/workflows/debugging-session.md +144 -0
- package/workflows/es/code-review.md +153 -0
- package/workflows/es/debugging-session.md +146 -0
- package/workflows/es/feature-development.md +155 -0
- package/workflows/es/new-project-bootstrap.md +175 -0
- package/workflows/es/refactor-safely.md +150 -0
- package/workflows/feature-development.md +153 -0
- package/workflows/fr/code-review.md +153 -0
- package/workflows/fr/debugging-session.md +146 -0
- package/workflows/fr/feature-development.md +155 -0
- package/workflows/fr/new-project-bootstrap.md +175 -0
- package/workflows/fr/refactor-safely.md +150 -0
- package/workflows/new-project-bootstrap.md +173 -0
- package/workflows/nl/code-review.md +153 -0
- package/workflows/nl/debugging-session.md +146 -0
- package/workflows/nl/feature-development.md +155 -0
- package/workflows/nl/new-project-bootstrap.md +175 -0
- package/workflows/nl/refactor-safely.md +150 -0
- package/workflows/refactor-safely.md +148 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
> 🇪🇸 Esta es la traducción en español. [Versión en inglés](../go.md).
|
|
2
|
+
|
|
3
|
+
# Reglas de Go
|
|
4
|
+
|
|
5
|
+
## Aplicar a
|
|
6
|
+
Todos los archivos Go (`*.go`) en cualquier proyecto.
|
|
7
|
+
|
|
8
|
+
## Reglas
|
|
9
|
+
|
|
10
|
+
1. **Los errores son valores — envuelve con `%w`** — `fmt.Errorf("operation failed: %w", err)` preserva el error original para verificaciones con `errors.Is` y `errors.As`. Nunca descartes errores con `_`.
|
|
11
|
+
|
|
12
|
+
2. **Pruebas orientadas a tablas** — usa patrones `[]struct{ name, input, want, wantErr }`. Cada caso tiene una sub-prueba `t.Run(tt.name, ...)`. Facilita agregar casos de prueba y hace los mensajes de fallo descriptivos.
|
|
13
|
+
|
|
14
|
+
3. **Contexto como primer argumento** — cada función que hace I/O o bloquea toma `ctx context.Context` como su primer parámetro. Nunca almacenes el contexto en una estructura.
|
|
15
|
+
|
|
16
|
+
4. **Define interfaces donde se consumen, no donde se implementan** — pon la interfaz en el paquete que la usa, no en el paquete que proporciona la implementación. Mantiene los paquetes desacoplados.
|
|
17
|
+
|
|
18
|
+
5. **Máximo 1-3 métodos en las interfaces** — las interfaces más grandes son más difíciles de satisfacer y mockear. Si una interfaz tiene 8 métodos, considera dividirla.
|
|
19
|
+
|
|
20
|
+
6. **`panic` solo para errores de programador verdaderamente irrecuperables** — configuración requerida faltante al inicio, invariantes violados que nunca deberían ocurrir. No para errores en tiempo de ejecución como "registro no encontrado".
|
|
21
|
+
|
|
22
|
+
7. **Sin retornos desnudos** — `return x, nil` no solo `return`. Los valores de retorno nombrados están bien para documentación, pero los retornos desnudos oscurecen lo que se devuelve.
|
|
23
|
+
|
|
24
|
+
8. **`init()` solo para efectos secundarios a nivel de paquete sin alternativa** — patrones de registro, inicialización de drivers. Nunca para cargar configuración o establecer conexiones — eso pertenece a `main` o un constructor.
|
|
25
|
+
|
|
26
|
+
9. **`log/slog` para logging estructurado** — `slog.Info("request", "method", r.Method, "path", r.URL.Path)`. `fmt.Println` es solo para salida CLI.
|
|
27
|
+
|
|
28
|
+
10. **`sync.Once` para inicialización lazy de singleton** — seguro para hilos, sin sobrecarga después de la primera llamada:
|
|
29
|
+
```go
|
|
30
|
+
var (
|
|
31
|
+
instance *DB
|
|
32
|
+
once sync.Once
|
|
33
|
+
)
|
|
34
|
+
func GetDB() *DB {
|
|
35
|
+
once.Do(func() { instance = newDB() })
|
|
36
|
+
return instance
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
11. **Embedding en lugar de herencia** — Go no tiene herencia. Compón tipos mediante embedding: `type AdminUser struct { User; AdminLevel int }`. Usa interfaces para polimorfismo.
|
|
41
|
+
|
|
42
|
+
12. **Captura las variables del bucle explícitamente** — en goroutines dentro de bucles: `i, v := i, v` antes de `go func()`. En Go 1.22+, las variables del bucle son por iteración; en versiones anteriores son compartidas.
|
|
43
|
+
|
|
44
|
+
13. **`errgroup` para operaciones concurrentes con propagación de errores** — `golang.org/x/sync/errgroup` sobre `WaitGroup` manual cuando necesitas devolver errores de goroutines.
|
|
45
|
+
|
|
46
|
+
14. **Errores centinela para condiciones esperadas, errores tipados para errores estructurados** — `var ErrNotFound = errors.New("not found")` para condiciones simples. Tipos de error personalizados (implementando la interfaz `error`) cuando los llamadores necesitan inspeccionar campos.
|
|
47
|
+
|
|
48
|
+
15. **Los manejadores HTTP obtienen solo `(w http.ResponseWriter, r *http.Request)`** — no embutes manejadores en structs ni uses closures para manejadores simples. Usa inyección de dependencias mediante un struct de manejador con un método `ServeHTTP` cuando se necesitan dependencias.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
> 🇪🇸 Esta es la traducción en español. [Versión en inglés](../python.md).
|
|
2
|
+
|
|
3
|
+
# Reglas de Python
|
|
4
|
+
|
|
5
|
+
## Aplicar a
|
|
6
|
+
Todos los archivos Python (`*.py`) en cualquier proyecto.
|
|
7
|
+
|
|
8
|
+
## Reglas
|
|
9
|
+
|
|
10
|
+
1. **Type hints en todas las firmas de funciones** — parámetros y tipos de retorno. Usa `from __future__ import annotations` para referencias hacia adelante. Sin funciones sin tipado en código de producción.
|
|
11
|
+
|
|
12
|
+
2. **`pathlib.Path` sobre `os.path`** — `Path("dir") / "file.txt"` es más limpio y funciona multiplataforma. `os.path` es legado.
|
|
13
|
+
|
|
14
|
+
3. **f-strings sobre `.format()` y `%`** — `f"Hello {name}"` en todas partes. `.format()` solo cuando la plantilla se almacena como variable de cadena.
|
|
15
|
+
|
|
16
|
+
4. **Nunca uses argumentos mutables por defecto** — `def fn(items: list = [])` crea una lista compartida en todas las llamadas. Usa `def fn(items: list | None = None)` y asigna dentro de la función.
|
|
17
|
+
|
|
18
|
+
5. **`dataclasses` para contenedores de datos, `Pydantic` para datos externos validados** — si cruza un límite del sistema (HTTP, archivo, entorno), usa Pydantic. Si es estado puramente interno, `@dataclass` es más ligero.
|
|
19
|
+
|
|
20
|
+
6. **Prefiere sentencias `with` para toda la gestión de recursos** — archivos, conexiones a BD, bloqueos, sesiones HTTP. Nunca llames `.close()` manualmente.
|
|
21
|
+
|
|
22
|
+
7. **Expresiones generadoras sobre comprensiones de lista cuando solo iteras una vez** — `sum(x*x for x in range(1000))` no asigna una lista.
|
|
23
|
+
|
|
24
|
+
8. **Define `__all__` en cada módulo público** — API pública explícita. Previene la contaminación de `import *` y documenta la intención.
|
|
25
|
+
|
|
26
|
+
9. **Lanza excepciones específicas, captura excepciones específicas** — `raise ValueError("message")` no `raise Exception`. `except ValueError` no `except Exception` a menos que estés en un límite de error de nivel superior.
|
|
27
|
+
|
|
28
|
+
10. **Módulo `logging` para código de producción, nunca `print()`** — `import logging; logger = logging.getLogger(__name__)`. `print()` solo en código de salida CLI.
|
|
29
|
+
|
|
30
|
+
11. **Usa `Enum` para conjuntos fijos de valores** — no constantes de cadena. `class Status(str, Enum): ACTIVE = "active"` proporciona seguridad de tipos y completado en el IDE.
|
|
31
|
+
|
|
32
|
+
12. **`subprocess.run()` sobre `os.system()`** — captura la salida, lanza en caso de fallo con `check=True`, evita inyección de shell con args de lista: `subprocess.run(["git", "status"], check=True)`.
|
|
33
|
+
|
|
34
|
+
13. **`dict.get(key, default)` sobre `key in dict` + `dict[key]`** — una búsqueda en lugar de dos.
|
|
35
|
+
|
|
36
|
+
14. **Clases base abstractas mediante `abc.ABC`** — cuando necesitas contratos de interfaz forzados. `Protocol` para subtipado estructural (duck typing con verificación de tipos).
|
|
37
|
+
|
|
38
|
+
15. **Siempre entornos virtuales, dependencias en `pyproject.toml`** — `uv` o `poetry` para gestión. Sin `requirements.txt` para nuevos proyectos.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
> 🇪🇸 Esta es la traducción en español. [Versión en inglés](../typescript.md).
|
|
2
|
+
|
|
3
|
+
# Reglas de TypeScript
|
|
4
|
+
|
|
5
|
+
## Aplicar a
|
|
6
|
+
Todos los archivos TypeScript (`*.ts`, `*.tsx`) en cualquier proyecto.
|
|
7
|
+
|
|
8
|
+
## Reglas
|
|
9
|
+
|
|
10
|
+
1. **`strict: true` en `tsconfig.json`** — siempre. Esto habilita `strictNullChecks`, `noImplicitAny` y `strictFunctionTypes`. Nunca deshabilites el modo estricto para silenciar errores; corrige los tipos.
|
|
11
|
+
|
|
12
|
+
2. **`unknown` sobre `any` para datos externos sin tipo** — `any` deshabilita la verificación de tipos completamente. `unknown` te obliga a reducir el tipo antes de usarlo. Parsea datos externos con Zod o similar.
|
|
13
|
+
|
|
14
|
+
3. **Operador `satisfies` para literales de objeto con verificación de tipos** — `const config = { port: 3000 } satisfies Config` detecta errores de tipo mientras preserva el tipo literal (sin ampliar a `Config`).
|
|
15
|
+
|
|
16
|
+
4. **Unions discriminadas sobre campos nullable** — prefiere:
|
|
17
|
+
```ts
|
|
18
|
+
type Result = { status: "ok"; data: User } | { status: "error"; message: string }
|
|
19
|
+
```
|
|
20
|
+
sobre `{ data?: User; error?: string }`. Las unions discriminadas hacen posible la verificación exhaustiva con `switch`.
|
|
21
|
+
|
|
22
|
+
5. **Sin aserciones de tipo `as` en código de producción** — `as SomeType` silencia al compilador sin verificar. Usa predicados de tipo o `satisfies` en su lugar. Excepción: consultas DOM donde TypeScript no puede inferir mejor.
|
|
23
|
+
|
|
24
|
+
6. **Predicados de tipo para reducción** — `function isUser(v: unknown): v is User { return typeof v === "object" && v !== null && "email" in v }`.
|
|
25
|
+
|
|
26
|
+
7. **`interface` para formas de objetos, `type` para unions y aliases** — `interface` soporta `extends` y fusión de declaraciones. `type` es necesario para unions y tipos mapeados.
|
|
27
|
+
|
|
28
|
+
8. **Aserciones `const` para tipos literales** — `const ROLES = ["admin", "user"] as const` da el tipo `readonly ["admin", "user"]` en lugar de `string[]`.
|
|
29
|
+
|
|
30
|
+
9. **Nunca uses el tipo `Function`** — usa firmas específicas: `(event: MouseEvent) => void`. `Function` acepta cualquier cosa y devuelve cualquier cosa.
|
|
31
|
+
|
|
32
|
+
10. **Zod para validación en tiempo de ejecución de datos externos** — cuerpos de solicitudes HTTP, respuestas de API, variables de entorno, archivos de configuración. Los tipos de TypeScript son solo en tiempo de compilación; Zod valida en tiempo de ejecución:
|
|
33
|
+
```ts
|
|
34
|
+
const UserSchema = z.object({ email: z.string().email(), age: z.number().int().positive() })
|
|
35
|
+
const user = UserSchema.parse(req.body) // lanza ZodError si es inválido
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
11. **`readonly` en arrays y objetos que no deben mutarse** — `readonly string[]` previene push/splice. `Readonly<Config>` en objetos de configuración pasados a través de capas.
|
|
39
|
+
|
|
40
|
+
12. **Tipos de retorno explícitos en funciones públicas/exportadas** — ayuda a la legibilidad y detecta cambios accidentales en el tipo de retorno.
|
|
41
|
+
|
|
42
|
+
13. **`import type` para importaciones solo de tipos** — `import type { User } from './types'` se elimina en tiempo de ejecución y evita problemas de dependencia circular.
|
|
43
|
+
|
|
44
|
+
14. **`never` para asegurar el manejo exhaustivo** — en el caso por defecto de un switch sobre una union discriminada:
|
|
45
|
+
```ts
|
|
46
|
+
default:
|
|
47
|
+
const _exhaustive: never = status // error de compilación si falta un caso
|
|
48
|
+
throw new Error(`Unhandled: ${_exhaustive}`)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
15. **Habilita `noUncheckedIndexedAccess`** — el acceso a arrays y objetos por índice devuelve `T | undefined` en lugar de `T`, forzando verificaciones de null donde se necesitan.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
> 🇫🇷 This is the French translation. [English version](../go.md).
|
|
2
|
+
|
|
3
|
+
# Règles Go
|
|
4
|
+
|
|
5
|
+
## S'applique à
|
|
6
|
+
Tous les fichiers Go (`*.go`) dans n'importe quel projet.
|
|
7
|
+
|
|
8
|
+
## Règles
|
|
9
|
+
|
|
10
|
+
1. **Les erreurs sont des valeurs — envelopper avec `%w`** — `fmt.Errorf("operation failed: %w", err)` préserve l'erreur originale pour les vérifications `errors.Is` et `errors.As`. Ne jamais ignorer les erreurs avec `_`.
|
|
11
|
+
|
|
12
|
+
2. **Tests table-driven** — utiliser des patterns `[]struct{ name, input, want, wantErr }`. Chaque cas a un sous-test `t.Run(tt.name, ...)`. Facilite l'ajout de cas de test et rend les messages d'échec descriptifs.
|
|
13
|
+
|
|
14
|
+
3. **Context comme premier argument** — chaque fonction qui fait des I/O ou qui bloque prend `ctx context.Context` comme premier paramètre. Ne jamais stocker le context dans une struct.
|
|
15
|
+
|
|
16
|
+
4. **Définir les interfaces là où elles sont consommées, pas là où elles sont implémentées** — placer l'interface dans le package qui l'utilise, pas dans le package qui fournit l'implémentation. Garde les packages découplés.
|
|
17
|
+
|
|
18
|
+
5. **Interfaces de 1-3 méthodes maximum** — les interfaces plus grandes sont plus difficiles à satisfaire et à mocker. Si une interface a 8 méthodes, envisager de la diviser.
|
|
19
|
+
|
|
20
|
+
6. **`panic` uniquement pour les erreurs de programmeur vraiment irrécupérables** — configuration requise manquante au démarrage, invariants violés qui ne devraient jamais arriver. Pas pour les erreurs runtime comme "record not found".
|
|
21
|
+
|
|
22
|
+
7. **Pas de retours nus** — `return x, nil` pas juste `return`. Les valeurs de retour nommées sont acceptables pour la documentation, mais les retours nus obscurcissent ce qui est retourné.
|
|
23
|
+
|
|
24
|
+
8. **`init()` uniquement pour les effets secondaires au niveau package sans alternative** — patterns d'enregistrement, init de driver. Jamais pour charger la config ou établir des connexions — ça appartient à `main` ou un constructeur.
|
|
25
|
+
|
|
26
|
+
9. **`log/slog` pour le logging structuré** — `slog.Info("request", "method", r.Method, "path", r.URL.Path)`. `fmt.Println` est uniquement pour la sortie CLI.
|
|
27
|
+
|
|
28
|
+
10. **`sync.Once` pour l'initialisation paresseuse de singleton** — thread-safe, zéro surcoût après le premier appel :
|
|
29
|
+
```go
|
|
30
|
+
var (
|
|
31
|
+
instance *DB
|
|
32
|
+
once sync.Once
|
|
33
|
+
)
|
|
34
|
+
func GetDB() *DB {
|
|
35
|
+
once.Do(func() { instance = newDB() })
|
|
36
|
+
return instance
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
11. **Embed plutôt qu'héritage** — Go n'a pas d'héritage. Composer les types via embedding : `type AdminUser struct { User; AdminLevel int }`. Utiliser les interfaces pour le polymorphisme.
|
|
41
|
+
|
|
42
|
+
12. **Capturer les variables de boucle explicitement** — dans les goroutines à l'intérieur des boucles : `i, v := i, v` avant le `go func()`. En Go 1.22+, les variables de boucle sont par itération ; dans les versions antérieures elles sont partagées.
|
|
43
|
+
|
|
44
|
+
13. **`errgroup` pour les opérations concurrentes avec propagation d'erreurs** — `golang.org/x/sync/errgroup` plutôt que `WaitGroup` manuel quand vous devez retourner des erreurs depuis des goroutines.
|
|
45
|
+
|
|
46
|
+
14. **Erreurs sentinelles pour les conditions attendues, erreurs typées pour les erreurs structurées** — `var ErrNotFound = errors.New("not found")` pour les conditions simples. Types d'erreur personnalisés (implémentant l'interface `error`) quand les appelants doivent inspecter des champs.
|
|
47
|
+
|
|
48
|
+
15. **Les handlers HTTP reçoivent uniquement `(w http.ResponseWriter, r *http.Request)`** — ne pas imbriquer les handlers dans des structs ou utiliser des fermetures pour les handlers simples. Utiliser l'injection de dépendances via une struct handler avec une méthode `ServeHTTP` quand des dépendances sont nécessaires.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
> 🇫🇷 This is the French translation. [English version](../python.md).
|
|
2
|
+
|
|
3
|
+
# Règles Python
|
|
4
|
+
|
|
5
|
+
## S'applique à
|
|
6
|
+
Tous les fichiers Python (`*.py`) dans n'importe quel projet.
|
|
7
|
+
|
|
8
|
+
## Règles
|
|
9
|
+
|
|
10
|
+
1. **Annotations de type sur toutes les signatures de fonctions** — paramètres et types de retour. Utiliser `from __future__ import annotations` pour les références en avant. Pas de fonctions non typées en code de production.
|
|
11
|
+
|
|
12
|
+
2. **`pathlib.Path` plutôt que `os.path`** — `Path("dir") / "file.txt"` est plus propre et fonctionne sur toutes les plateformes. `os.path` est du code legacy.
|
|
13
|
+
|
|
14
|
+
3. **f-strings plutôt que `.format()` et `%`** — `f"Hello {name}"` partout. `.format()` uniquement quand le template est stocké dans une variable chaîne.
|
|
15
|
+
|
|
16
|
+
4. **Ne jamais utiliser des arguments par défaut mutables** — `def fn(items: list = [])` crée une liste unique partagée entre tous les appels. Utiliser `def fn(items: list | None = None)` et assigner à l'intérieur.
|
|
17
|
+
|
|
18
|
+
5. **`dataclasses` pour les conteneurs de données, `Pydantic` pour les données externes validées** — si elles traversent une frontière système (HTTP, fichier, env), utiliser Pydantic. Si c'est uniquement un état interne, `@dataclass` est plus léger.
|
|
19
|
+
|
|
20
|
+
6. **Préférer les instructions `with` pour toute gestion de ressources** — fichiers, connexions DB, verrous, sessions HTTP. Ne jamais appeler `.close()` manuellement.
|
|
21
|
+
|
|
22
|
+
7. **Expressions génératrices plutôt que compréhensions de listes quand vous n'itérez qu'une fois** — `sum(x*x for x in range(1000))` n'alloue pas de liste.
|
|
23
|
+
|
|
24
|
+
8. **Définir `__all__` dans chaque module public** — API publique explicite. Évite la pollution des `import *` et documente l'intention.
|
|
25
|
+
|
|
26
|
+
9. **Lever des exceptions spécifiques, attraper des exceptions spécifiques** — `raise ValueError("message")` pas `raise Exception`. `except ValueError` pas `except Exception` sauf à une frontière d'erreur de niveau supérieur.
|
|
27
|
+
|
|
28
|
+
10. **Module `logging` pour le code de production, jamais `print()`** — `import logging; logger = logging.getLogger(__name__)`. `print()` uniquement dans le code de sortie CLI.
|
|
29
|
+
|
|
30
|
+
11. **Utiliser `Enum` pour les ensembles de valeurs fixes** — pas des constantes chaînes. `class Status(str, Enum): ACTIVE = "active"` donne la sécurité de type et la complétion IDE.
|
|
31
|
+
|
|
32
|
+
12. **`subprocess.run()` plutôt que `os.system()`** — capture la sortie, lève sur échec avec `check=True`, évite l'injection shell avec des args en liste : `subprocess.run(["git", "status"], check=True)`.
|
|
33
|
+
|
|
34
|
+
13. **`dict.get(key, default)` plutôt que `key in dict` + `dict[key]`** — une recherche au lieu de deux.
|
|
35
|
+
|
|
36
|
+
14. **Classes de base abstraites via `abc.ABC`** — quand vous avez besoin de contrats d'interface appliqués. `Protocol` pour le sous-typage structurel (duck typing avec vérification de type).
|
|
37
|
+
|
|
38
|
+
15. **Environnements virtuels toujours, dépendances dans `pyproject.toml`** — `uv` ou `poetry` pour la gestion. Pas de `requirements.txt` pour les nouveaux projets.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
> 🇫🇷 This is the French translation. [English version](../typescript.md).
|
|
2
|
+
|
|
3
|
+
# Règles TypeScript
|
|
4
|
+
|
|
5
|
+
## S'applique à
|
|
6
|
+
Tous les fichiers TypeScript (`*.ts`, `*.tsx`) dans n'importe quel projet.
|
|
7
|
+
|
|
8
|
+
## Règles
|
|
9
|
+
|
|
10
|
+
1. **`strict: true` dans `tsconfig.json`** — toujours. Cela active `strictNullChecks`, `noImplicitAny` et `strictFunctionTypes`. Ne jamais désactiver le mode strict pour faire taire des erreurs ; corriger les types.
|
|
11
|
+
|
|
12
|
+
2. **`unknown` plutôt que `any` pour les données externes non typées** — `any` désactive complètement la vérification de type. `unknown` vous oblige à restreindre le type avant utilisation. Analyser les données externes avec Zod ou similaire.
|
|
13
|
+
|
|
14
|
+
3. **Opérateur `satisfies` pour les littéraux d'objets vérifiés par type** — `const config = { port: 3000 } satisfies Config` détecte les erreurs de type tout en préservant le type littéral (sans l'élargir à `Config`).
|
|
15
|
+
|
|
16
|
+
4. **Unions discriminées plutôt que champs nullable** — préférer :
|
|
17
|
+
```ts
|
|
18
|
+
type Result = { status: "ok"; data: User } | { status: "error"; message: string }
|
|
19
|
+
```
|
|
20
|
+
plutôt que `{ data?: User; error?: string }`. Les unions discriminées permettent une vérification exhaustive avec `switch`.
|
|
21
|
+
|
|
22
|
+
5. **Pas d'assertions de type `as` dans le code de production** — `as SomeType` fait taire le compilateur sans vérifier. Utiliser des prédicats de type ou `satisfies` à la place. Exception : requêtes DOM où TypeScript ne peut pas inférer mieux.
|
|
23
|
+
|
|
24
|
+
6. **Prédicats de type pour la restriction** — `function isUser(v: unknown): v is User { return typeof v === "object" && v !== null && "email" in v }`.
|
|
25
|
+
|
|
26
|
+
7. **`interface` pour les formes d'objets, `type` pour les unions et les alias** — `interface` supporte `extends` et la fusion de déclarations. `type` est nécessaire pour les unions et les types mappés.
|
|
27
|
+
|
|
28
|
+
8. **Assertions `const` pour les types littéraux** — `const ROLES = ["admin", "user"] as const` donne le type `readonly ["admin", "user"]` plutôt que `string[]`.
|
|
29
|
+
|
|
30
|
+
9. **Ne jamais utiliser le type `Function`** — utiliser des signatures spécifiques : `(event: MouseEvent) => void`. `Function` accepte tout et retourne tout.
|
|
31
|
+
|
|
32
|
+
10. **Zod pour la validation à l'exécution des données externes** — corps de requêtes HTTP, réponses API, variables d'env, fichiers de config. Les types TypeScript ne sont que temps de compilation ; Zod valide à l'exécution :
|
|
33
|
+
```ts
|
|
34
|
+
const UserSchema = z.object({ email: z.string().email(), age: z.number().int().positive() })
|
|
35
|
+
const user = UserSchema.parse(req.body) // lève ZodError si invalide
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
11. **`readonly` sur les tableaux et objets qui ne doivent pas être mutés** — `readonly string[]` empêche push/splice. `Readonly<Config>` sur les objets de config passés à travers les couches.
|
|
39
|
+
|
|
40
|
+
12. **Types de retour explicites sur les fonctions publiques/exportées** — aide à la lisibilité et détecte les changements accidentels de type de retour.
|
|
41
|
+
|
|
42
|
+
13. **`import type` pour les imports uniquement de type** — `import type { User } from './types'` est effacé à l'exécution et évite les problèmes de dépendances circulaires.
|
|
43
|
+
|
|
44
|
+
14. **`never` pour assurer une gestion exhaustive** — dans le cas par défaut d'un switch sur une union discriminée :
|
|
45
|
+
```ts
|
|
46
|
+
default:
|
|
47
|
+
const _exhaustive: never = status // erreur de compilation si un cas manque
|
|
48
|
+
throw new Error(`Unhandled: ${_exhaustive}`)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
15. **Activer `noUncheckedIndexedAccess`** — l'accès par index aux tableaux et objets retourne `T | undefined` plutôt que `T`, forçant les vérifications null là où elles sont nécessaires.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Go Rules
|
|
2
|
+
|
|
3
|
+
## Apply to
|
|
4
|
+
All Go files (`*.go`) in any project.
|
|
5
|
+
|
|
6
|
+
## Rules
|
|
7
|
+
|
|
8
|
+
1. **Errors are values — wrap with `%w`** — `fmt.Errorf("operation failed: %w", err)` preserves the original error for `errors.Is` and `errors.As` checks. Never discard errors with `_`.
|
|
9
|
+
|
|
10
|
+
2. **Table-driven tests** — use `[]struct{ name, input, want, wantErr }` patterns. Each case has a `t.Run(tt.name, ...)` sub-test. Makes test cases easy to add and failure messages descriptive.
|
|
11
|
+
|
|
12
|
+
3. **Context as first argument** — every function that does I/O or blocks takes `ctx context.Context` as its first parameter. Never store context in a struct.
|
|
13
|
+
|
|
14
|
+
4. **Define interfaces where they're consumed, not where implemented** — put the interface in the package that uses it, not the package that provides the implementation. Keeps packages decoupled.
|
|
15
|
+
|
|
16
|
+
5. **Interfaces 1-3 methods max** — larger interfaces are harder to satisfy and mock. If an interface has 8 methods, consider splitting it.
|
|
17
|
+
|
|
18
|
+
6. **`panic` only for truly unrecoverable programmer errors** — missing required configuration at startup, violated invariants that should never happen. Not for runtime errors like "record not found".
|
|
19
|
+
|
|
20
|
+
7. **No naked returns** — `return x, nil` not just `return`. Named return values are fine for documentation, but naked returns obscure what's being returned.
|
|
21
|
+
|
|
22
|
+
8. **`init()` only for package-level side effects with no alternative** — registration patterns, driver init. Never for loading config or establishing connections — that belongs in `main` or a constructor.
|
|
23
|
+
|
|
24
|
+
9. **`log/slog` for structured logging** — `slog.Info("request", "method", r.Method, "path", r.URL.Path)`. `fmt.Println` is for CLI output only.
|
|
25
|
+
|
|
26
|
+
10. **`sync.Once` for lazy singleton initialization** — thread-safe, zero overhead after first call:
|
|
27
|
+
```go
|
|
28
|
+
var (
|
|
29
|
+
instance *DB
|
|
30
|
+
once sync.Once
|
|
31
|
+
)
|
|
32
|
+
func GetDB() *DB {
|
|
33
|
+
once.Do(func() { instance = newDB() })
|
|
34
|
+
return instance
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
11. **Embed don't inherit** — Go has no inheritance. Compose types via embedding: `type AdminUser struct { User; AdminLevel int }`. Use interfaces for polymorphism.
|
|
39
|
+
|
|
40
|
+
12. **Capture loop variables explicitly** — in goroutines inside loops: `i, v := i, v` before the `go func()`. In Go 1.22+, loop variables are per-iteration; in earlier versions they're shared.
|
|
41
|
+
|
|
42
|
+
13. **`errgroup` for concurrent operations with error propagation** — `golang.org/x/sync/errgroup` over manual `WaitGroup` when you need to return errors from goroutines.
|
|
43
|
+
|
|
44
|
+
14. **Sentinel errors for expected conditions, typed errors for structured errors** — `var ErrNotFound = errors.New("not found")` for simple conditions. Custom error types (implementing `error` interface) when callers need to inspect fields.
|
|
45
|
+
|
|
46
|
+
15. **HTTP handlers get only `(w http.ResponseWriter, r *http.Request)`** — don't embed handlers in structs or use closures for simple handlers. Use dependency injection via a handler struct with a `ServeHTTP` method when dependencies are needed.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
> 🇳🇱 Dit is de Nederlandse vertaling. [Engelse versie](../go.md).
|
|
2
|
+
|
|
3
|
+
# Go-regels
|
|
4
|
+
|
|
5
|
+
## Van toepassing op
|
|
6
|
+
Alle Go-bestanden (`*.go`) in elk project.
|
|
7
|
+
|
|
8
|
+
## Regels
|
|
9
|
+
|
|
10
|
+
1. **Fouten zijn waarden — wikkel in met `%w`** — `fmt.Errorf("operation failed: %w", err)` behoudt de oorspronkelijke fout voor `errors.Is`- en `errors.As`-controles. Gooi nooit fouten weg met `_`.
|
|
11
|
+
|
|
12
|
+
2. **Tabelgestuurde tests** — gebruik `[]struct{ name, input, want, wantErr }`-patronen. Elk geval heeft een `t.Run(tt.name, ...)`-subtest. Maakt testgevallen eenvoudig toe te voegen en foutberichten beschrijvend.
|
|
13
|
+
|
|
14
|
+
3. **Context als eerste argument** — elke functie die I/O doet of blokkeert neemt `ctx context.Context` als eerste parameter. Sla nooit context op in een struct.
|
|
15
|
+
|
|
16
|
+
4. **Definieer interfaces waar ze worden verbruikt, niet waar geïmplementeerd** — zet de interface in het pakket dat het gebruikt, niet het pakket dat de implementatie biedt. Houdt pakketten ontkoppeld.
|
|
17
|
+
|
|
18
|
+
5. **Interfaces maximaal 1-3 methoden** — grotere interfaces zijn moeilijker te voldoen en te mocken. Als een interface 8 methoden heeft, overweeg dan te splitsen.
|
|
19
|
+
|
|
20
|
+
6. **`panic` alleen voor echt onherstelbare programmeursfouten** — ontbrekende vereiste configuratie bij opstarten, geschonden invarianten die nooit mogen voorkomen. Niet voor runtime-fouten zoals "record not found".
|
|
21
|
+
|
|
22
|
+
7. **Geen naakte returns** — `return x, nil` niet gewoon `return`. Benoemde retourwaarden zijn goed voor documentatie, maar naakte returns verhullen wat er wordt geretourneerd.
|
|
23
|
+
|
|
24
|
+
8. **`init()` alleen voor bijeffecten op pakketniveau zonder alternatief** — registratiepatronen, driver-init. Nooit voor het laden van configuratie of het opzetten van verbindingen — dat hoort in `main` of een constructor.
|
|
25
|
+
|
|
26
|
+
9. **`log/slog` voor gestructureerde logging** — `slog.Info("request", "method", r.Method, "path", r.URL.Path)`. `fmt.Println` is alleen voor CLI-output.
|
|
27
|
+
|
|
28
|
+
10. **`sync.Once` voor luie singleton-initialisatie** — thread-safe, nul overhead na eerste aanroep:
|
|
29
|
+
```go
|
|
30
|
+
var (
|
|
31
|
+
instance *DB
|
|
32
|
+
once sync.Once
|
|
33
|
+
)
|
|
34
|
+
func GetDB() *DB {
|
|
35
|
+
once.Do(func() { instance = newDB() })
|
|
36
|
+
return instance
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
11. **Embed, niet erven** — Go heeft geen overerving. Stel typen samen via embedding: `type AdminUser struct { User; AdminLevel int }`. Gebruik interfaces voor polymorfisme.
|
|
41
|
+
|
|
42
|
+
12. **Vang loopvariabelen expliciet** — in goroutines binnen lussen: `i, v := i, v` vóór de `go func()`. In Go 1.22+ zijn loopvariabelen per iteratie; in eerdere versies zijn ze gedeeld.
|
|
43
|
+
|
|
44
|
+
13. **`errgroup` voor gelijktijdige operaties met foutpropagatie** — `golang.org/x/sync/errgroup` boven handmatige `WaitGroup` wanneer je fouten moet retourneren vanuit goroutines.
|
|
45
|
+
|
|
46
|
+
14. **Sentinaelfouten voor verwachte omstandigheden, getypeerde fouten voor gestructureerde fouten** — `var ErrNotFound = errors.New("not found")` voor eenvoudige omstandigheden. Aangepaste fouttypen (die de `error`-interface implementeren) wanneer aanroepers velden moeten inspecteren.
|
|
47
|
+
|
|
48
|
+
15. **HTTP-handlers krijgen alleen `(w http.ResponseWriter, r *http.Request)`** — bed handlers niet in in structs of gebruik closures voor eenvoudige handlers. Gebruik dependency injection via een handler-struct met een `ServeHTTP`-methode wanneer afhankelijkheden nodig zijn.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
> 🇳🇱 Dit is de Nederlandse vertaling. [Engelse versie](../python.md).
|
|
2
|
+
|
|
3
|
+
# Python-regels
|
|
4
|
+
|
|
5
|
+
## Van toepassing op
|
|
6
|
+
Alle Python-bestanden (`*.py`) in elk project.
|
|
7
|
+
|
|
8
|
+
## Regels
|
|
9
|
+
|
|
10
|
+
1. **Type-hints op alle functiesignaturen** — parameters en retourtypen. Gebruik `from __future__ import annotations` voor voorwaartse verwijzingen. Geen ongetypeerde bare functies in productiecode.
|
|
11
|
+
|
|
12
|
+
2. **`pathlib.Path` boven `os.path`** — `Path("dir") / "file.txt"` is schoner en werkt cross-platform. `os.path` is verouderd.
|
|
13
|
+
|
|
14
|
+
3. **f-strings boven `.format()` en `%`** — `f"Hello {name}"` overal. `.format()` alleen als de sjabloon is opgeslagen als een stringvariabele.
|
|
15
|
+
|
|
16
|
+
4. **Gebruik nooit veranderlijke standaardargumenten** — `def fn(items: list = [])` maakt één lijst gedeeld over alle aanroepen. Gebruik `def fn(items: list | None = None)` en wijs binnenin toe.
|
|
17
|
+
|
|
18
|
+
5. **`dataclasses` voor datacontainers, `Pydantic` voor gevalideerde externe data** — als het een systeemgrens overschrijdt (HTTP, bestand, omgeving), gebruik Pydantic. Als het puur interne state is, is `@dataclass` lichter.
|
|
19
|
+
|
|
20
|
+
6. **Geef de voorkeur aan `with`-statements voor alle resourcebeheer** — bestanden, DB-verbindingen, locks, HTTP-sessies. Roep nooit handmatig `.close()` aan.
|
|
21
|
+
|
|
22
|
+
7. **Generator-expressies boven lijstbegrippen wanneer je slechts eenmaal itereert** — `sum(x*x for x in range(1000))` alloceert geen lijst.
|
|
23
|
+
|
|
24
|
+
8. **Definieer `__all__` in elke publieke module** — expliciete publieke API. Voorkomt `import *`-vervuiling en documenteert intentie.
|
|
25
|
+
|
|
26
|
+
9. **Gooi specifieke uitzonderingen, vang specifieke uitzonderingen** — `raise ValueError("message")` niet `raise Exception`. `except ValueError` niet `except Exception` tenzij je op een top-level foutgrens bent.
|
|
27
|
+
|
|
28
|
+
10. **`logging`-module voor productiecode, nooit `print()`** — `import logging; logger = logging.getLogger(__name__)`. `print()` alleen in CLI-outputcode.
|
|
29
|
+
|
|
30
|
+
11. **Gebruik `Enum` voor vaste sets van waarden** — geen stringconstanten. `class Status(str, Enum): ACTIVE = "active"` geeft typeveiligheid en IDE-aanvulling.
|
|
31
|
+
|
|
32
|
+
12. **`subprocess.run()` boven `os.system()`** — legt output vast, gooit bij mislukking met `check=True`, vermijdt shell-injectie met lijstargumenten: `subprocess.run(["git", "status"], check=True)`.
|
|
33
|
+
|
|
34
|
+
13. **`dict.get(key, default)` boven `key in dict` + `dict[key]`** — één opzoekactie in plaats van twee.
|
|
35
|
+
|
|
36
|
+
14. **Abstracte basisklassen via `abc.ABC`** — wanneer je afgedwongen interfacecontracten nodig hebt. `Protocol` voor structureel subtypen (duck typing met typecontrole).
|
|
37
|
+
|
|
38
|
+
15. **Altijd virtuele omgevingen, afhankelijkheden in `pyproject.toml`** — `uv` of `poetry` voor beheer. Geen `requirements.txt` voor nieuwe projecten.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
> 🇳🇱 Dit is de Nederlandse vertaling. [Engelse versie](../typescript.md).
|
|
2
|
+
|
|
3
|
+
# TypeScript-regels
|
|
4
|
+
|
|
5
|
+
## Van toepassing op
|
|
6
|
+
Alle TypeScript-bestanden (`*.ts`, `*.tsx`) in elk project.
|
|
7
|
+
|
|
8
|
+
## Regels
|
|
9
|
+
|
|
10
|
+
1. **`strict: true` in `tsconfig.json`** — altijd. Dit schakelt `strictNullChecks`, `noImplicitAny` en `strictFunctionTypes` in. Schakel strict-modus nooit uit om fouten te onderdrukken; herstel de typen.
|
|
11
|
+
|
|
12
|
+
2. **`unknown` boven `any` voor ongetypeerde externe data** — `any` schakelt typecontrole volledig uit. `unknown` dwingt je het type te vernauwen voor gebruik. Parseer externe data met Zod of vergelijkbaar.
|
|
13
|
+
|
|
14
|
+
3. **`satisfies`-operator voor gecontroleerde objectliteralen** — `const config = { port: 3000 } satisfies Config` vangt typefouten terwijl het letterlijke type behouden blijft (niet verbreed naar `Config`).
|
|
15
|
+
|
|
16
|
+
4. **Gediscrimineerde unions boven nullable velden** — geef de voorkeur aan:
|
|
17
|
+
```ts
|
|
18
|
+
type Result = { status: "ok"; data: User } | { status: "error"; message: string }
|
|
19
|
+
```
|
|
20
|
+
boven `{ data?: User; error?: string }`. Gediscrimineerde unions maken uitputtende `switch`-controle mogelijk.
|
|
21
|
+
|
|
22
|
+
5. **Geen `as`-typebeweringen in productiecode** — `as SomeType` maakt de compiler stil zonder te controleren. Gebruik type-predicaten of `satisfies` in plaats daarvan. Uitzondering: DOM-queries waarbij TypeScript niet beter kan afleiden.
|
|
23
|
+
|
|
24
|
+
6. **Type-predicaten voor vernauwen** — `function isUser(v: unknown): v is User { return typeof v === "object" && v !== null && "email" in v }`.
|
|
25
|
+
|
|
26
|
+
7. **`interface` voor objectvormen, `type` voor unions en aliassen** — `interface` ondersteunt `extends` en declaratiesamenvoegen. `type` is nodig voor unions en gemapte typen.
|
|
27
|
+
|
|
28
|
+
8. **`const`-beweringen voor letterlijke typen** — `const ROLES = ["admin", "user"] as const` geeft type `readonly ["admin", "user"]` in plaats van `string[]`.
|
|
29
|
+
|
|
30
|
+
9. **Gebruik nooit het `Function`-type** — gebruik specifieke signaturen: `(event: MouseEvent) => void`. `Function` accepteert alles en retourneert alles.
|
|
31
|
+
|
|
32
|
+
10. **Zod voor runtime-validatie van externe data** — HTTP-verzoekbodies, API-antwoorden, omgevingsvariabelen, configuratiebestanden. TypeScript-typen zijn alleen compilatie-tijd; Zod valideert tijdens runtime:
|
|
33
|
+
```ts
|
|
34
|
+
const UserSchema = z.object({ email: z.string().email(), age: z.number().int().positive() })
|
|
35
|
+
const user = UserSchema.parse(req.body) // gooit ZodError als ongeldig
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
11. **`readonly` op arrays en objecten die niet gemuteerd mogen worden** — `readonly string[]` voorkomt push/splice. `Readonly<Config>` op configuratieobjecten die door lagen worden doorgegeven.
|
|
39
|
+
|
|
40
|
+
12. **Expliciete retourtypen op publieke/geëxporteerde functies** — bevordert leesbaarheid en vangt onbedoelde retourtype-wijzigingen.
|
|
41
|
+
|
|
42
|
+
13. **`import type` voor alleen-type imports** — `import type { User } from './types'` wordt gewist tijdens runtime en vermijdt circulaire afhankelijkheidsproblemen.
|
|
43
|
+
|
|
44
|
+
14. **`never` om uitputtende afhandeling te garanderen** — in het standaardgeval van een switch over een gediscrimineerde union:
|
|
45
|
+
```ts
|
|
46
|
+
default:
|
|
47
|
+
const _exhaustive: never = status // compilatiefout als een geval ontbreekt
|
|
48
|
+
throw new Error(`Unhandled: ${_exhaustive}`)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
15. **Schakel `noUncheckedIndexedAccess` in** — array- en objectindextoegang retourneert `T | undefined` in plaats van `T`, waardoor null-controles worden afgedwongen waar nodig.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Python Rules
|
|
2
|
+
|
|
3
|
+
## Apply to
|
|
4
|
+
All Python files (`*.py`) in any project.
|
|
5
|
+
|
|
6
|
+
## Rules
|
|
7
|
+
|
|
8
|
+
1. **Type hints on all function signatures** — parameters and return types. Use `from __future__ import annotations` for forward references. No bare untyped functions in production code.
|
|
9
|
+
|
|
10
|
+
2. **`pathlib.Path` over `os.path`** — `Path("dir") / "file.txt"` is cleaner and works cross-platform. `os.path` is legacy.
|
|
11
|
+
|
|
12
|
+
3. **f-strings over `.format()` and `%`** — `f"Hello {name}"` everywhere. `.format()` only when the template is stored as a string variable.
|
|
13
|
+
|
|
14
|
+
4. **Never use mutable default arguments** — `def fn(items: list = [])` creates one list shared across all calls. Use `def fn(items: list | None = None)` and assign inside.
|
|
15
|
+
|
|
16
|
+
5. **`dataclasses` for data containers, `Pydantic` for validated external data** — if it crosses a system boundary (HTTP, file, env), use Pydantic. If it's purely internal state, `@dataclass` is lighter.
|
|
17
|
+
|
|
18
|
+
6. **Prefer `with` statements for all resource management** — files, DB connections, locks, HTTP sessions. Never call `.close()` manually.
|
|
19
|
+
|
|
20
|
+
7. **Generator expressions over list comprehensions when you only iterate once** — `sum(x*x for x in range(1000))` doesn't allocate a list.
|
|
21
|
+
|
|
22
|
+
8. **Define `__all__` in every public module** — explicit public API. Prevents `import *` pollution and documents intent.
|
|
23
|
+
|
|
24
|
+
9. **Raise specific exceptions, catch specific exceptions** — `raise ValueError("message")` not `raise Exception`. `except ValueError` not `except Exception` unless you're at a top-level error boundary.
|
|
25
|
+
|
|
26
|
+
10. **`logging` module for production code, never `print()`** — `import logging; logger = logging.getLogger(__name__)`. `print()` only in CLI output code.
|
|
27
|
+
|
|
28
|
+
11. **Use `Enum` for fixed sets of values** — not string constants. `class Status(str, Enum): ACTIVE = "active"` gives type safety and IDE completion.
|
|
29
|
+
|
|
30
|
+
12. **`subprocess.run()` over `os.system()`** — captures output, raises on failure with `check=True`, avoids shell injection with list args: `subprocess.run(["git", "status"], check=True)`.
|
|
31
|
+
|
|
32
|
+
13. **`dict.get(key, default)` over `key in dict` + `dict[key]`** — one lookup instead of two.
|
|
33
|
+
|
|
34
|
+
14. **Abstract base classes via `abc.ABC`** — when you need enforced interface contracts. `Protocol` for structural subtyping (duck typing with type checking).
|
|
35
|
+
|
|
36
|
+
15. **Virtual environments always, dependencies in `pyproject.toml`** — `uv` or `poetry` for management. No `requirements.txt` for new projects.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# TypeScript Rules
|
|
2
|
+
|
|
3
|
+
## Apply to
|
|
4
|
+
All TypeScript files (`*.ts`, `*.tsx`) in any project.
|
|
5
|
+
|
|
6
|
+
## Rules
|
|
7
|
+
|
|
8
|
+
1. **`strict: true` in `tsconfig.json`** — always. This enables `strictNullChecks`, `noImplicitAny`, and `strictFunctionTypes`. Never disable strict mode to silence errors; fix the types.
|
|
9
|
+
|
|
10
|
+
2. **`unknown` over `any` for untyped external data** — `any` disables type checking entirely. `unknown` forces you to narrow the type before use. Parse external data with Zod or similar.
|
|
11
|
+
|
|
12
|
+
3. **`satisfies` operator for type-checked object literals** — `const config = { port: 3000 } satisfies Config` catches type errors while preserving the literal type (not widening to `Config`).
|
|
13
|
+
|
|
14
|
+
4. **Discriminated unions over nullable fields** — prefer:
|
|
15
|
+
```ts
|
|
16
|
+
type Result = { status: "ok"; data: User } | { status: "error"; message: string }
|
|
17
|
+
```
|
|
18
|
+
over `{ data?: User; error?: string }`. Discriminated unions make exhaustive `switch` checking possible.
|
|
19
|
+
|
|
20
|
+
5. **No `as` type assertions in production code** — `as SomeType` silences the compiler without checking. Use type predicates or `satisfies` instead. Exception: DOM queries where TypeScript can't infer better.
|
|
21
|
+
|
|
22
|
+
6. **Type predicates for narrowing** — `function isUser(v: unknown): v is User { return typeof v === "object" && v !== null && "email" in v }`.
|
|
23
|
+
|
|
24
|
+
7. **`interface` for object shapes, `type` for unions and aliases** — `interface` supports `extends` and declaration merging. `type` is needed for unions and mapped types.
|
|
25
|
+
|
|
26
|
+
8. **`const` assertions for literal types** — `const ROLES = ["admin", "user"] as const` gives type `readonly ["admin", "user"]` instead of `string[]`.
|
|
27
|
+
|
|
28
|
+
9. **Never use the `Function` type** — use specific signatures: `(event: MouseEvent) => void`. `Function` accepts anything and returns anything.
|
|
29
|
+
|
|
30
|
+
10. **Zod for runtime validation of external data** — HTTP request bodies, API responses, env vars, config files. TypeScript types are compile-time only; Zod validates at runtime:
|
|
31
|
+
```ts
|
|
32
|
+
const UserSchema = z.object({ email: z.string().email(), age: z.number().int().positive() })
|
|
33
|
+
const user = UserSchema.parse(req.body) // throws ZodError if invalid
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
11. **`readonly` on arrays and objects that shouldn't be mutated** — `readonly string[]` prevents push/splice. `Readonly<Config>` on config objects passed through layers.
|
|
37
|
+
|
|
38
|
+
12. **Explicit return types on public/exported functions** — aids readability and catches accidental return type changes.
|
|
39
|
+
|
|
40
|
+
13. **`import type` for type-only imports** — `import type { User } from './types'` is erased at runtime and avoids circular dependency issues.
|
|
41
|
+
|
|
42
|
+
14. **`never` to ensure exhaustive handling** — in the default case of a switch over a discriminated union:
|
|
43
|
+
```ts
|
|
44
|
+
default:
|
|
45
|
+
const _exhaustive: never = status // compile error if a case is missing
|
|
46
|
+
throw new Error(`Unhandled: ${_exhaustive}`)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
15. **Enable `noUncheckedIndexedAccess`** — array and object index access returns `T | undefined` instead of `T`, forcing null checks where they're needed.
|