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,45 @@
|
|
|
1
|
+
> 🇫🇷 This is the French translation. [English version](../security.md).
|
|
2
|
+
|
|
3
|
+
# Règles de Sécurité
|
|
4
|
+
|
|
5
|
+
Copiez les sections pertinentes dans le `CLAUDE.md` de votre projet.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Secrets
|
|
10
|
+
|
|
11
|
+
- Ne jamais mettre des secrets dans le code source — ni dans les commentaires, ni dans les fichiers de test, ni dans les configurations d'exemple
|
|
12
|
+
- Ne jamais logger des secrets — vérifier que les appels de logger n'incluent pas des champs `password`, `token`, `key`, `secret`, ou `credential`
|
|
13
|
+
- Utiliser des variables d'environnement pour tous les secrets ; les lire au démarrage, valider leur existence
|
|
14
|
+
- Faire tourner les secrets qui ont été accidentellement committés — traiter tout secret commité comme compromis
|
|
15
|
+
|
|
16
|
+
## Validation des entrées
|
|
17
|
+
|
|
18
|
+
- Valider toutes les entrées aux frontières du système : paramètres API, chaînes de requête, corps de requête, uploads de fichiers, variables d'environnement
|
|
19
|
+
- Valider le type, le format, la longueur et la plage — pas seulement la présence
|
|
20
|
+
- Utiliser une liste d'autorisation (valeurs valides) plutôt qu'une liste de refus (valeurs bloquées) quand c'est possible
|
|
21
|
+
- Ne jamais utiliser les entrées utilisateur directement dans des requêtes SQL, des commandes shell, des chemins de fichiers, ou du HTML sans assainissement
|
|
22
|
+
|
|
23
|
+
## Authentification et autorisation
|
|
24
|
+
|
|
25
|
+
- Vérifier l'authentification sur chaque requête qui le requiert — ne jamais se fier au routage frontend
|
|
26
|
+
- Vérifier l'autorisation (l'utilisateur peut faire CETTE action) séparément de l'authentification (l'utilisateur est connecté)
|
|
27
|
+
- Les vérifications d'autorisation doivent référencer l'utilisateur authentifié depuis le contexte de requête — jamais depuis un paramètre de requête
|
|
28
|
+
- L'expiration des tokens doit être appliquée côté serveur — ne jamais faire confiance aux timestamps de tokens fournis par le client
|
|
29
|
+
|
|
30
|
+
## Bases de données
|
|
31
|
+
|
|
32
|
+
- Utiliser des requêtes paramétrées ou un ORM — ne jamais concaténer du SQL sous forme de chaîne
|
|
33
|
+
- Les utilisateurs de base de données doivent avoir les permissions minimales requises — l'utilisateur de l'app ne doit pas avoir accès au DDL
|
|
34
|
+
- Ne jamais exposer les erreurs internes de la base de données aux clients — logger côté serveur, retourner une erreur générique au client
|
|
35
|
+
|
|
36
|
+
## Dépendances
|
|
37
|
+
|
|
38
|
+
- Épingler les versions des dépendances — ne jamais utiliser `*` ou `latest` en production
|
|
39
|
+
- Exécuter `npm audit` / `pip-audit` / `govulncheck` avant chaque release
|
|
40
|
+
- Supprimer les dépendances inutilisées — chaque dépendance est une surface d'attaque potentielle
|
|
41
|
+
- Vérifier la source des nouvelles dépendances avant de les ajouter
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
> **Travaillez avec nous :** Claudient est soutenu par [Uitbreiden](https://uitbreiden.com/) — nous construisons des produits IA et des solutions B2B avec des communautés de développeurs. [uitbreiden.com](https://uitbreiden.com/)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
> 🇫🇷 This is the French translation. [English version](../testing.md).
|
|
2
|
+
|
|
3
|
+
# Règles de Tests
|
|
4
|
+
|
|
5
|
+
Copiez les sections pertinentes dans le `CLAUDE.md` de votre projet.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Ce qu'il faut tester
|
|
10
|
+
|
|
11
|
+
- Tester le comportement via les APIs publiques — pas les détails d'implémentation internes
|
|
12
|
+
- Les tests doivent survivre au refactoring : si renommer une fonction privée casse les tests, les tests sont incorrects
|
|
13
|
+
- Tester les cas limites : entrées null/vides, valeurs aux bornes, chemins d'erreur
|
|
14
|
+
- Ne pas tester le code du framework ou les builtins du langage
|
|
15
|
+
|
|
16
|
+
## Structure des tests
|
|
17
|
+
|
|
18
|
+
- Une assertion logique par test — si un test vérifie plusieurs choses non liées, le diviser
|
|
19
|
+
- Les noms de tests décrivent CE QUE fait le système, pas COMMENT : `"returns 404 when user not found"` pas `"test findUser"`
|
|
20
|
+
- Arrange → Act → Assert — un bloc chacun, sans interleaving
|
|
21
|
+
- Pas de logique conditionnelle dans les tests — si vous avez besoin d'un `if`, écrire deux tests
|
|
22
|
+
|
|
23
|
+
## Mocking
|
|
24
|
+
|
|
25
|
+
- Ne pas mocker les modules internes — mocker uniquement aux frontières du système (APIs externes, bases de données, système de fichiers)
|
|
26
|
+
- Ne jamais mocker la classe/module en cours de test
|
|
27
|
+
- Les tests d'intégration doivent toucher la vraie base de données — utiliser une base de données de test, pas des mocks
|
|
28
|
+
- Si un test unitaire nécessite 5+ mocks, le code n'est probablement pas bien structuré
|
|
29
|
+
|
|
30
|
+
## Couverture
|
|
31
|
+
|
|
32
|
+
- La couverture est un plancher, pas une cible — 80% de couverture avec de mauvais tests est pire que 60% avec de bons tests
|
|
33
|
+
- Chaque nouvelle fonctionnalité nécessite au moins un test de chemin heureux et un test de chemin d'erreur
|
|
34
|
+
- Chaque correction de bug nécessite un test de régression qui aurait détecté le bug
|
|
35
|
+
|
|
36
|
+
## Données de test
|
|
37
|
+
|
|
38
|
+
- Utiliser des factories ou des fixtures — ne jamais coder en dur des IDs d'utilisateurs, des emails ou des UUIDs dans les tests
|
|
39
|
+
- Les tests doivent être isolés — pas d'état mutable partagé entre les tests
|
|
40
|
+
- Les tests doivent être déterministes — pas de données aléatoires, pas d'assertions dépendantes du temps sans mocker l'horloge
|
|
41
|
+
- Nettoyer après chaque test — tronquer les tables, réinitialiser les mocks, supprimer les fichiers créés
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
> **Travaillez avec nous :** Claudient est soutenu par [Uitbreiden](https://uitbreiden.com/) — nous construisons des produits IA et des solutions B2B avec des communautés de développeurs. [uitbreiden.com](https://uitbreiden.com/)
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Git Rules
|
|
2
|
+
|
|
3
|
+
Copy the relevant sections into your project's `CLAUDE.md`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Commit messages
|
|
8
|
+
|
|
9
|
+
- Format: `type: short description` (imperative mood, ≤ 72 chars)
|
|
10
|
+
- Types: `feat`, `fix`, `docs`, `refactor`, `test`, `chore`, `perf`
|
|
11
|
+
- Examples: `feat: add webhook signature verification`, `fix: handle null user in auth middleware`
|
|
12
|
+
- No generic messages: "update", "changes", "fix bug", "wip" are not acceptable
|
|
13
|
+
- Body (optional): explain WHY, not what. The diff shows what.
|
|
14
|
+
|
|
15
|
+
## Branches
|
|
16
|
+
|
|
17
|
+
- Feature branches: `feat/short-description`
|
|
18
|
+
- Bug fixes: `fix/short-description`
|
|
19
|
+
- Never commit directly to `main` or `master`
|
|
20
|
+
- Delete branches after merge
|
|
21
|
+
|
|
22
|
+
## What never to commit
|
|
23
|
+
|
|
24
|
+
- `.env` files or any file containing secrets
|
|
25
|
+
- `node_modules/`, `__pycache__/`, build artifacts
|
|
26
|
+
- Personal editor settings (`.idea/`, `.vscode/settings.json`)
|
|
27
|
+
- Files > 10MB (use git-lfs or external storage)
|
|
28
|
+
- Generated files that can be reproduced from source
|
|
29
|
+
|
|
30
|
+
## Before pushing
|
|
31
|
+
|
|
32
|
+
- Run tests locally — never push red
|
|
33
|
+
- Review your own diff before every push: `git diff origin/main...HEAD`
|
|
34
|
+
- Squash WIP commits before pushing to a shared branch
|
|
35
|
+
- Never force-push to `main` or any shared branch
|
|
36
|
+
|
|
37
|
+
## Dangerous commands — always confirm before running
|
|
38
|
+
|
|
39
|
+
- `git reset --hard` — destroys uncommitted changes permanently
|
|
40
|
+
- `git clean -f` — deletes untracked files permanently
|
|
41
|
+
- `git push --force` — rewrites remote history
|
|
42
|
+
- `git stash drop` — permanently discards stashed changes
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
> **Work with us:** Claudient is backed by [Uitbreiden](https://uitbreiden.com/) — we build AI products and B2B solutions with developer communities. [uitbreiden.com](https://uitbreiden.com/)
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
> 🇳🇱 Dit is de Nederlandse vertaling. [Engelse versie](../coding-style.md).
|
|
2
|
+
|
|
3
|
+
# Codeerstijlregels
|
|
4
|
+
|
|
5
|
+
Kopieer de relevante secties naar de `CLAUDE.md` van je project.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Naamgeving
|
|
10
|
+
|
|
11
|
+
- Variabelen en functies: `camelCase` (JS/TS), `snake_case` (Python, Go, Rust)
|
|
12
|
+
- Klassen en typen: `PascalCase` in alle talen
|
|
13
|
+
- Constanten: `SCREAMING_SNAKE_CASE` alleen voor echte constanten die nooit veranderen
|
|
14
|
+
- Booleaanse variabelen: voorvoegsel met `is`, `has`, `can`, `should` — `isActive`, `hasPermission`
|
|
15
|
+
- Verkort namen niet tenzij de afkorting universeel bekend is (`id`, `url`, `db`, `ctx`)
|
|
16
|
+
|
|
17
|
+
## Functies
|
|
18
|
+
|
|
19
|
+
- Één verantwoordelijkheid per functie — als je "en" nodig hebt in de beschrijving, splits dan
|
|
20
|
+
- Maximaal 40 regels per functie; als langer, extraheer subfuncties
|
|
21
|
+
- Geen booleaanse parameters — gebruik een opties-object of twee afzonderlijke functies
|
|
22
|
+
- Keer vroeg terug voor bewakende clausules — nest het gelukkige pad niet in conditionals
|
|
23
|
+
|
|
24
|
+
## Opmerkingen
|
|
25
|
+
|
|
26
|
+
- Schrijf geen opmerkingen tenzij het WAAROM niet vanzelfsprekend is
|
|
27
|
+
- Schrijf nooit opmerkingen die beschrijven wat de code doet (de code doet dat al)
|
|
28
|
+
- Schrijf een opmerking wanneer: er een verborgen beperking is, een workaround voor een specifieke bug, of gedrag dat een lezer zou verrassen
|
|
29
|
+
- Schrijf nooit TODO-opmerkingen — maak in plaats daarvan een bijgehouden issue aan
|
|
30
|
+
|
|
31
|
+
## Foutafhandeling
|
|
32
|
+
|
|
33
|
+
- Slik fouten nooit stilletjes in (`catch (e) {}` is altijd fout)
|
|
34
|
+
- Behandel fouten altijd op de grens waar je actie kunt ondernemen
|
|
35
|
+
- Geef fouten naar boven door met context — wikkel in met de relevante ID of operatienaam
|
|
36
|
+
- Gebruik geen `console.error` in productiecode — gebruik de logger van het project
|
|
37
|
+
|
|
38
|
+
## Bestandsorganisatie
|
|
39
|
+
|
|
40
|
+
- Één primaire export per bestand
|
|
41
|
+
- Bestandsnamen komen overeen met hun primaire export: `UserService.ts` exporteert `UserService`
|
|
42
|
+
- Geen barrel-bestanden (`index.ts` re-exports) — importeer direct vanuit het bronbestand
|
|
43
|
+
- Groepeer imports: externe packages eerst, dan interne modules, dan relatieve imports
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
> **Werk met ons:** Claudient wordt ondersteund door [Uitbreiden](https://uitbreiden.com/) — we bouwen AI-producten en B2B-oplossingen met ontwikkelaarsgemeenschappen. [uitbreiden.com](https://uitbreiden.com/)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
> 🇳🇱 Dit is de Nederlandse vertaling. [Engelse versie](../git.md).
|
|
2
|
+
|
|
3
|
+
# Git-regels
|
|
4
|
+
|
|
5
|
+
Kopieer de relevante secties naar de `CLAUDE.md` van je project.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Commit-berichten
|
|
10
|
+
|
|
11
|
+
- Formaat: `type: korte beschrijving` (gebiedende wijs, ≤ 72 tekens)
|
|
12
|
+
- Typen: `feat`, `fix`, `docs`, `refactor`, `test`, `chore`, `perf`
|
|
13
|
+
- Voorbeelden: `feat: add webhook signature verification`, `fix: handle null user in auth middleware`
|
|
14
|
+
- Geen generieke berichten: "update", "changes", "fix bug", "wip" zijn niet acceptabel
|
|
15
|
+
- Berichttekst (optioneel): leg uit WAAROM, niet wat. De diff toont wat.
|
|
16
|
+
|
|
17
|
+
## Branches
|
|
18
|
+
|
|
19
|
+
- Feature-branches: `feat/korte-beschrijving`
|
|
20
|
+
- Bugfixes: `fix/korte-beschrijving`
|
|
21
|
+
- Commit nooit direct naar `main` of `master`
|
|
22
|
+
- Verwijder branches na merge
|
|
23
|
+
|
|
24
|
+
## Wat nooit te committen
|
|
25
|
+
|
|
26
|
+
- `.env`-bestanden of bestanden met secrets
|
|
27
|
+
- `node_modules/`, `__pycache__/`, build-artefacten
|
|
28
|
+
- Persoonlijke editorinstellingen (`.idea/`, `.vscode/settings.json`)
|
|
29
|
+
- Bestanden > 10MB (gebruik git-lfs of externe opslag)
|
|
30
|
+
- Gegenereerde bestanden die kunnen worden gereproduceerd vanuit bron
|
|
31
|
+
|
|
32
|
+
## Voor pushen
|
|
33
|
+
|
|
34
|
+
- Voer tests lokaal uit — push nooit rood
|
|
35
|
+
- Bekijk je eigen diff voor elke push: `git diff origin/main...HEAD`
|
|
36
|
+
- Squash WIP-commits voor push naar een gedeelde branch
|
|
37
|
+
- Force-push nooit naar `main` of een gedeelde branch
|
|
38
|
+
|
|
39
|
+
## Gevaarlijke commando's — bevestig altijd voor uitvoering
|
|
40
|
+
|
|
41
|
+
- `git reset --hard` — vernietigt niet-gecommitte wijzigingen permanent
|
|
42
|
+
- `git clean -f` — verwijdert niet-gevolgde bestanden permanent
|
|
43
|
+
- `git push --force` — herschrijft de externe geschiedenis
|
|
44
|
+
- `git stash drop` — gooit stashed wijzigingen permanent weg
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
> **Werk met ons:** Claudient wordt ondersteund door [Uitbreiden](https://uitbreiden.com/) — we bouwen AI-producten en B2B-oplossingen met ontwikkelaarsgemeenschappen. [uitbreiden.com](https://uitbreiden.com/)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
> 🇳🇱 Dit is de Nederlandse vertaling. [Engelse versie](../performance.md).
|
|
2
|
+
|
|
3
|
+
# Prestatieregels
|
|
4
|
+
|
|
5
|
+
Kopieer de relevante secties naar de `CLAUDE.md` van je project.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Database
|
|
10
|
+
|
|
11
|
+
- Voer nooit queries uit binnen lussen — batch met `IN (...)` of gebruik een join
|
|
12
|
+
- Pagineer altijd queries die onbegrensde resultaten kunnen retourneren — geen `SELECT *` zonder een `LIMIT`
|
|
13
|
+
- Voeg indexen toe voordat de query traag is in productie, niet daarna — analyseer queryplannen tijdens ontwikkeling
|
|
14
|
+
- Selecteer alleen de kolommen die je nodig hebt — `SELECT *` haalt ongebruikte data op en voorkomt index-only scans
|
|
15
|
+
- Gebruik aggregatie op databaseniveau (`COUNT`, `SUM`, `GROUP BY`) — laad geen rijen in geheugen om ze te tellen
|
|
16
|
+
|
|
17
|
+
## API en netwerk
|
|
18
|
+
|
|
19
|
+
- Cache antwoorden die duur zijn om te berekenen en zelden veranderen — stel expliciete TTL's in
|
|
20
|
+
- Pagineer lijst-endpoints — retourneer maximaal N items per verzoek met een cursor of offset
|
|
21
|
+
- Maak geen N+1-queries — batch gerelateerde data met DataLoader, `include` of een join
|
|
22
|
+
- Vermijd synchrone aanroepen naar externe services in verzoekhandlers — gebruik wachtrijen voor niet-kritiek werk
|
|
23
|
+
- Stel time-outs in op alle externe HTTP-aanroepen — laat nooit een trage afhankelijkheid je server ophangen
|
|
24
|
+
|
|
25
|
+
## Geheugen
|
|
26
|
+
|
|
27
|
+
- Laad geen grote datasets in geheugen om ze te verwerken — stream of pagineer
|
|
28
|
+
- Geef referenties vrij wanneer klaar — vermijd onbedoelde closures die garbage collection voorkomen
|
|
29
|
+
- Gebruik generators/iterators voor grote reeksen in plaats van volledige lijsten in geheugen te bouwen
|
|
30
|
+
|
|
31
|
+
## Meting
|
|
32
|
+
|
|
33
|
+
- Profileer voor optimalisatie — raad nooit waar de bottleneck zit
|
|
34
|
+
- Meet onder productie-achtige omstandigheden — lokale benchmarks zijn misleidend
|
|
35
|
+
- Stel een baseline vast voor het maken van wijzigingen — zonder baseline kun je verbetering niet bevestigen
|
|
36
|
+
- Prestatietests horen in CI thuis — regressie die codereview passeert maar het prestatiebudget misloopt moet automatisch worden gevangen
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
> **Werk met ons:** Claudient wordt ondersteund door [Uitbreiden](https://uitbreiden.com/) — we bouwen AI-producten en B2B-oplossingen met ontwikkelaarsgemeenschappen. [uitbreiden.com](https://uitbreiden.com/)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
> 🇳🇱 Dit is de Nederlandse vertaling. [Engelse versie](../security.md).
|
|
2
|
+
|
|
3
|
+
# Beveiligingsregels
|
|
4
|
+
|
|
5
|
+
Kopieer de relevante secties naar de `CLAUDE.md` van je project.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Secrets
|
|
10
|
+
|
|
11
|
+
- Zet nooit secrets in broncode — niet in opmerkingen, niet in testbestanden, niet in voorbeeldconfiguraties
|
|
12
|
+
- Log nooit secrets — controleer dat loggingaanroepen geen `password`-, `token`-, `key`-, `secret`- of `credential`-velden bevatten
|
|
13
|
+
- Gebruik omgevingsvariabelen voor alle secrets; lees ze bij opstarten, valideer dat ze bestaan
|
|
14
|
+
- Roteer secrets die per ongeluk zijn gecommit — behandel elk gecommit secret als gecompromitteerd
|
|
15
|
+
|
|
16
|
+
## Invoervalidatie
|
|
17
|
+
|
|
18
|
+
- Valideer alle invoer bij systeemgrenzen: API-parameters, querystrings, aanvraagbodies, bestandsuploads, omgevingsvariabelen
|
|
19
|
+
- Valideer type, formaat, lengte en bereik — niet alleen aanwezigheid
|
|
20
|
+
- Gebruik een allowlist (geldige waarden) in plaats van een denylist (geblokkeerde waarden) waar mogelijk
|
|
21
|
+
- Gebruik nooit gebruikersinvoer direct in SQL-queries, shell-commando's, bestandspaden of HTML zonder sanering
|
|
22
|
+
|
|
23
|
+
## Authenticatie en autorisatie
|
|
24
|
+
|
|
25
|
+
- Controleer authenticatie op elk verzoek dat dit vereist — vertrouw nooit op frontend-routing
|
|
26
|
+
- Controleer autorisatie (gebruiker kan DEZE actie uitvoeren) apart van authenticatie (gebruiker is ingelogd)
|
|
27
|
+
- Autorisatiecontroles moeten verwijzen naar de geauthenticeerde gebruiker uit de aanvraagcontext — nooit uit een queryparameter
|
|
28
|
+
- Token-vervaldatum moet server-side worden afgedwongen — vertrouw nooit client-verstrekte token-tijdstempels
|
|
29
|
+
|
|
30
|
+
## Databases
|
|
31
|
+
|
|
32
|
+
- Gebruik geparametriseerde queries of ORM — concateneer nooit SQL
|
|
33
|
+
- Databasegebruikers moeten minimaal vereiste rechten hebben — app-gebruiker mag geen DDL-toegang hebben
|
|
34
|
+
- Stel nooit interne databasefouten bloot aan clients — log server-side, retourneer generieke fout aan client
|
|
35
|
+
|
|
36
|
+
## Afhankelijkheden
|
|
37
|
+
|
|
38
|
+
- Pin afhankelijkheidsversies — gebruik nooit `*` of `latest` in productie
|
|
39
|
+
- Voer `npm audit` / `pip-audit` / `govulncheck` uit voor elke release
|
|
40
|
+
- Verwijder ongebruikte afhankelijkheden — elke afhankelijkheid is een potentieel aanvalsoppervlak
|
|
41
|
+
- Bekijk de bron van nieuwe afhankelijkheden voor ze toe te voegen
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
> **Werk met ons:** Claudient wordt ondersteund door [Uitbreiden](https://uitbreiden.com/) — we bouwen AI-producten en B2B-oplossingen met ontwikkelaarsgemeenschappen. [uitbreiden.com](https://uitbreiden.com/)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
> 🇳🇱 Dit is de Nederlandse vertaling. [Engelse versie](../testing.md).
|
|
2
|
+
|
|
3
|
+
# Testregels
|
|
4
|
+
|
|
5
|
+
Kopieer de relevante secties naar de `CLAUDE.md` van je project.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Wat te testen
|
|
10
|
+
|
|
11
|
+
- Test gedrag via publieke API's — geen interne implementatiedetails
|
|
12
|
+
- Tests moeten refactoring overleven: als het hernoemen van een private functie tests breekt, zijn de tests fout
|
|
13
|
+
- Test randgevallen: null/lege invoer, grenswaarden, foutpaden
|
|
14
|
+
- Test geen framework-code of taalbuiltins
|
|
15
|
+
|
|
16
|
+
## Teststructuur
|
|
17
|
+
|
|
18
|
+
- Één logische bewering per test — als een test meerdere niet-gerelateerde zaken controleert, splits dan
|
|
19
|
+
- Testnamen beschrijven WAT het systeem doet, niet HOE: `"returns 404 when user not found"` niet `"test findUser"`
|
|
20
|
+
- Arrange → Act → Assert — één blok per fase, geen vermenging
|
|
21
|
+
- Geen conditionele logica in tests — als je een `if` nodig hebt, schrijf twee tests
|
|
22
|
+
|
|
23
|
+
## Mocken
|
|
24
|
+
|
|
25
|
+
- Mock geen interne modules — mock alleen op systeemgrenzen (externe API's, databases, bestandssysteem)
|
|
26
|
+
- Mock nooit de klasse/module die wordt getest
|
|
27
|
+
- Integratietests moeten de echte database raken — gebruik een testdatabase, geen mocks
|
|
28
|
+
- Als een unit-test 5+ mocks vereist, is de code waarschijnlijk niet goed gestructureerd
|
|
29
|
+
|
|
30
|
+
## Dekking
|
|
31
|
+
|
|
32
|
+
- Dekking is een bodem, geen doel — 80% dekking met slechte tests is erger dan 60% met goede tests
|
|
33
|
+
- Elke nieuwe functie heeft minimaal één happy-path test en één foutpad test nodig
|
|
34
|
+
- Elke bugfix heeft een regressietest nodig die de bug had moeten vangen
|
|
35
|
+
|
|
36
|
+
## Testdata
|
|
37
|
+
|
|
38
|
+
- Gebruik factories of fixtures — codeer nooit gebruikers-ID's, e-mailadressen of UUID's hard in tests
|
|
39
|
+
- Tests moeten geïsoleerd zijn — geen gedeelde veranderlijke state tussen tests
|
|
40
|
+
- Tests moeten deterministisch zijn — geen willekeurige data, geen tijdsafhankelijke beweringen zonder de klok te mocken
|
|
41
|
+
- Ruim na elke test op — verkort tabellen, reset mocks, verwijder gemaakte bestanden
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
> **Werk met ons:** Claudient wordt ondersteund door [Uitbreiden](https://uitbreiden.com/) — we bouwen AI-producten en B2B-oplossingen met ontwikkelaarsgemeenschappen. [uitbreiden.com](https://uitbreiden.com/)
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Performance Rules
|
|
2
|
+
|
|
3
|
+
Copy the relevant sections into your project's `CLAUDE.md`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Database
|
|
8
|
+
|
|
9
|
+
- Never run queries inside loops — batch with `IN (...)` or use a join
|
|
10
|
+
- Always paginate queries that can return unbounded results — no `SELECT *` without a `LIMIT`
|
|
11
|
+
- Add indexes before the query is slow in production, not after — analyze query plans during development
|
|
12
|
+
- Select only the columns you need — `SELECT *` fetches unused data and prevents index-only scans
|
|
13
|
+
- Use database-level aggregation (`COUNT`, `SUM`, `GROUP BY`) — do not load rows into memory to count them
|
|
14
|
+
|
|
15
|
+
## API and network
|
|
16
|
+
|
|
17
|
+
- Cache responses that are expensive to compute and change infrequently — set explicit TTLs
|
|
18
|
+
- Paginate list endpoints — return a maximum of N items per request with a cursor or offset
|
|
19
|
+
- Do not make N+1 queries — batch related data with DataLoader, `include`, or a join
|
|
20
|
+
- Avoid synchronous calls to external services in request handlers — use queues for non-critical work
|
|
21
|
+
- Set timeouts on all external HTTP calls — never let a slow dependency hang your server
|
|
22
|
+
|
|
23
|
+
## Memory
|
|
24
|
+
|
|
25
|
+
- Do not load large datasets into memory to process them — stream or paginate
|
|
26
|
+
- Release references when done — avoid accidental closures that prevent garbage collection
|
|
27
|
+
- Use generators/iterators for large sequences instead of building full lists in memory
|
|
28
|
+
|
|
29
|
+
## Measurement
|
|
30
|
+
|
|
31
|
+
- Profile before optimizing — never guess where the bottleneck is
|
|
32
|
+
- Measure in production-like conditions — local benchmarks are misleading
|
|
33
|
+
- Establish a baseline before making changes — without a baseline, you cannot confirm improvement
|
|
34
|
+
- Performance tests belong in CI — regression that passes code review but fails perf budget must be caught automatically
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
> **Work with us:** Claudient is backed by [Uitbreiden](https://uitbreiden.com/) — we build AI products and B2B solutions with developer communities. [uitbreiden.com](https://uitbreiden.com/)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Security Rules
|
|
2
|
+
|
|
3
|
+
Copy the relevant sections into your project's `CLAUDE.md`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Secrets
|
|
8
|
+
|
|
9
|
+
- Never put secrets in source code — not in comments, not in test files, not in example configs
|
|
10
|
+
- Never log secrets — check that logger calls don't include `password`, `token`, `key`, `secret`, or `credential` fields
|
|
11
|
+
- Use environment variables for all secrets; read them at startup, validate they exist
|
|
12
|
+
- Rotate secrets that have been accidentally committed — treat any committed secret as compromised
|
|
13
|
+
|
|
14
|
+
## Input validation
|
|
15
|
+
|
|
16
|
+
- Validate all input at system boundaries: API params, query strings, request bodies, file uploads, environment variables
|
|
17
|
+
- Validate type, format, length, and range — not just presence
|
|
18
|
+
- Use an allowlist (valid values) not a denylist (blocked values) where possible
|
|
19
|
+
- Never use user input directly in SQL queries, shell commands, file paths, or HTML without sanitization
|
|
20
|
+
|
|
21
|
+
## Authentication and authorization
|
|
22
|
+
|
|
23
|
+
- Check authentication on every request that requires it — never rely on frontend routing
|
|
24
|
+
- Check authorization (user can do THIS action) separately from authentication (user is logged in)
|
|
25
|
+
- Authorization checks must reference the authenticated user from the request context — never from a query parameter
|
|
26
|
+
- Token expiry must be enforced server-side — never trust client-provided token timestamps
|
|
27
|
+
|
|
28
|
+
## Databases
|
|
29
|
+
|
|
30
|
+
- Use parameterized queries or ORM — never string-concatenate SQL
|
|
31
|
+
- Database users must have minimum required permissions — app user should not have DDL access
|
|
32
|
+
- Never expose internal database errors to clients — log server-side, return generic error to client
|
|
33
|
+
|
|
34
|
+
## Dependencies
|
|
35
|
+
|
|
36
|
+
- Pin dependency versions — never use `*` or `latest` in production
|
|
37
|
+
- Run `npm audit` / `pip-audit` / `govulncheck` before every release
|
|
38
|
+
- Remove unused dependencies — every dependency is a potential attack surface
|
|
39
|
+
- Review the source of new dependencies before adding them
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
> **Work with us:** Claudient is backed by [Uitbreiden](https://uitbreiden.com/) — we build AI products and B2B solutions with developer communities. [uitbreiden.com](https://uitbreiden.com/)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Testing Rules
|
|
2
|
+
|
|
3
|
+
Copy the relevant sections into your project's `CLAUDE.md`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What to test
|
|
8
|
+
|
|
9
|
+
- Test behavior through public APIs — not internal implementation details
|
|
10
|
+
- Tests must survive refactoring: if renaming a private function breaks tests, the tests are wrong
|
|
11
|
+
- Test edge cases: null/empty inputs, boundary values, error paths
|
|
12
|
+
- Do not test framework code or language builtins
|
|
13
|
+
|
|
14
|
+
## Test structure
|
|
15
|
+
|
|
16
|
+
- One logical assertion per test — if a test checks multiple unrelated things, split it
|
|
17
|
+
- Test names describe WHAT the system does, not HOW: `"returns 404 when user not found"` not `"test findUser"`
|
|
18
|
+
- Arrange → Act → Assert — one block each, no interleaving
|
|
19
|
+
- No conditional logic in tests — if you need an `if`, write two tests
|
|
20
|
+
|
|
21
|
+
## Mocking
|
|
22
|
+
|
|
23
|
+
- Do not mock internal modules — mock only at system boundaries (external APIs, databases, file system)
|
|
24
|
+
- Never mock the class/module under test
|
|
25
|
+
- Integration tests must hit the real database — use a test database, not mocks
|
|
26
|
+
- If a unit test requires 5+ mocks, the code is probably not well-structured
|
|
27
|
+
|
|
28
|
+
## Coverage
|
|
29
|
+
|
|
30
|
+
- Coverage is a floor, not a target — 80% coverage with bad tests is worse than 60% with good tests
|
|
31
|
+
- Every new feature needs at least one happy-path test and one error-path test
|
|
32
|
+
- Every bug fix needs a regression test that would have caught the bug
|
|
33
|
+
|
|
34
|
+
## Test data
|
|
35
|
+
|
|
36
|
+
- Use factories or fixtures — never hardcode user IDs, emails, or UUIDs in tests
|
|
37
|
+
- Tests must be isolated — no shared mutable state between tests
|
|
38
|
+
- Tests must be deterministic — no random data, no time-dependent assertions without mocking the clock
|
|
39
|
+
- Clean up after each test — truncate tables, reset mocks, delete created files
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
> **Work with us:** Claudient is backed by [Uitbreiden](https://uitbreiden.com/) — we build AI products and B2B solutions with developer communities. [uitbreiden.com](https://uitbreiden.com/)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
> 🇩🇪 Dies ist die deutsche Übersetzung. [Englische Version](../go.md).
|
|
2
|
+
|
|
3
|
+
# Go Regeln
|
|
4
|
+
|
|
5
|
+
## Anwenden auf
|
|
6
|
+
Alle Go-Dateien (`*.go`) in jedem Projekt.
|
|
7
|
+
|
|
8
|
+
## Regeln
|
|
9
|
+
|
|
10
|
+
1. **Fehler sind Werte — mit `%w` umschließen** — `fmt.Errorf("operation failed: %w", err)` erhält den ursprünglichen Fehler für `errors.Is`- und `errors.As`-Prüfungen. Fehler niemals mit `_` verwerfen.
|
|
11
|
+
|
|
12
|
+
2. **Tabellengetriebene Tests** — `[]struct{ name, input, want, wantErr }`-Muster verwenden. Jeder Fall hat einen `t.Run(tt.name, ...)`-Untertest. Macht Testfälle leicht erweiterbar und Fehlermeldungen beschreibend.
|
|
13
|
+
|
|
14
|
+
3. **Context als erstes Argument** — jede Funktion, die I/O durchführt oder blockiert, nimmt `ctx context.Context` als erstes Parameter. Kontext niemals in einer Struct speichern.
|
|
15
|
+
|
|
16
|
+
4. **Interfaces dort definieren, wo sie konsumiert werden, nicht wo implementiert** — das Interface in das Paket legen, das es verwendet, nicht in das Paket, das die Implementierung bereitstellt. Hält Pakete entkoppelt.
|
|
17
|
+
|
|
18
|
+
5. **Interfaces maximal 1-3 Methoden** — größere Interfaces sind schwieriger zu erfüllen und zu mocken. Wenn ein Interface 8 Methoden hat, überlegem, es aufzuteilen.
|
|
19
|
+
|
|
20
|
+
6. **`panic` nur für wirklich nicht behebbare Programmierfehler** — fehlende erforderliche Konfiguration beim Start, verletzte Invarianten, die nie auftreten sollten. Nicht für Laufzeitfehler wie "record not found".
|
|
21
|
+
|
|
22
|
+
7. **Keine nackten Returns** — `return x, nil` nicht nur `return`. Benannte Rückgabewerte sind für die Dokumentation in Ordnung, aber nackte Returns verschleiern, was zurückgegeben wird.
|
|
23
|
+
|
|
24
|
+
8. **`init()` nur für Paket-Level-Nebeneffekte ohne Alternative** — Registrierungsmuster, Treiber-Init. Niemals zum Laden von Konfigurationen oder zum Aufbauen von Verbindungen — das gehört in `main` oder einen Konstruktor.
|
|
25
|
+
|
|
26
|
+
9. **`log/slog` für strukturiertes Logging** — `slog.Info("request", "method", r.Method, "path", r.URL.Path)`. `fmt.Println` nur für CLI-Ausgabe.
|
|
27
|
+
|
|
28
|
+
10. **`sync.Once` für lazy Singleton-Initialisierung** — threadsicher, null Overhead nach dem ersten Aufruf:
|
|
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. **Einbetten statt Erben** — Go hat keine Vererbung. Typen durch Einbettung zusammensetzen: `type AdminUser struct { User; AdminLevel int }`. Interfaces für Polymorphismus verwenden.
|
|
41
|
+
|
|
42
|
+
12. **Schleifenvariablen explizit erfassen** — in Goroutines innerhalb von Schleifen: `i, v := i, v` vor dem `go func()`. In Go 1.22+ sind Schleifenvariablen pro Iteration; in früheren Versionen werden sie geteilt.
|
|
43
|
+
|
|
44
|
+
13. **`errgroup` für parallele Operationen mit Fehler-Propagierung** — `golang.org/x/sync/errgroup` statt manuellem `WaitGroup`, wenn Fehler von Goroutines zurückgegeben werden müssen.
|
|
45
|
+
|
|
46
|
+
14. **Sentinel-Fehler für erwartete Bedingungen, typisierte Fehler für strukturierte Fehler** — `var ErrNotFound = errors.New("not found")` für einfache Bedingungen. Benutzerdefinierte Fehlertypen (die das `error`-Interface implementieren), wenn Aufrufer Felder inspizieren müssen.
|
|
47
|
+
|
|
48
|
+
15. **HTTP-Handler erhalten nur `(w http.ResponseWriter, r *http.Request)`** — Handler nicht in Structs einbetten oder Closures für einfache Handler verwenden. Dependency Injection über eine Handler-Struct mit einer `ServeHTTP`-Methode verwenden, wenn Abhängigkeiten benötigt werden.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
> 🇩🇪 Dies ist die deutsche Übersetzung. [Englische Version](../python.md).
|
|
2
|
+
|
|
3
|
+
# Python Regeln
|
|
4
|
+
|
|
5
|
+
## Anwenden auf
|
|
6
|
+
Alle Python-Dateien (`*.py`) in jedem Projekt.
|
|
7
|
+
|
|
8
|
+
## Regeln
|
|
9
|
+
|
|
10
|
+
1. **Type Hints auf allen Funktionssignaturen** — Parameter und Rückgabetypen. `from __future__ import annotations` für Forward-Referenzen verwenden. Keine ungetypten Funktionen ohne Type Hints in Produktionscode.
|
|
11
|
+
|
|
12
|
+
2. **`pathlib.Path` statt `os.path`** — `Path("dir") / "file.txt"` ist sauberer und funktioniert plattformübergreifend. `os.path` ist Legacy.
|
|
13
|
+
|
|
14
|
+
3. **f-Strings statt `.format()` und `%`** — `f"Hello {name}"` überall. `.format()` nur wenn das Template als String-Variable gespeichert ist.
|
|
15
|
+
|
|
16
|
+
4. **Niemals veränderliche Standardargumente verwenden** — `def fn(items: list = [])` erstellt eine Liste, die über alle Aufrufe geteilt wird. `def fn(items: list | None = None)` verwenden und innen zuweisen.
|
|
17
|
+
|
|
18
|
+
5. **`dataclasses` für Daten-Container, `Pydantic` für validierte externe Daten** — wenn es eine Systemgrenze überquert (HTTP, Datei, Env), Pydantic verwenden. Wenn es rein interner State ist, ist `@dataclass` leichtgewichtiger.
|
|
19
|
+
|
|
20
|
+
6. **`with`-Anweisungen für alle Ressourcenverwaltung bevorzugen** — Dateien, DB-Verbindungen, Locks, HTTP-Sessions. Niemals `.close()` manuell aufrufen.
|
|
21
|
+
|
|
22
|
+
7. **Generator-Ausdrücke statt List-Comprehensions, wenn nur einmal iteriert wird** — `sum(x*x for x in range(1000))` alloziert keine Liste.
|
|
23
|
+
|
|
24
|
+
8. **`__all__` in jedem öffentlichen Modul definieren** — explizite öffentliche API. Verhindert `import *`-Verschmutzung und dokumentiert die Absicht.
|
|
25
|
+
|
|
26
|
+
9. **Spezifische Ausnahmen werfen, spezifische Ausnahmen abfangen** — `raise ValueError("message")` nicht `raise Exception`. `except ValueError` nicht `except Exception`, außer an einer Top-Level-Fehlergrenze.
|
|
27
|
+
|
|
28
|
+
10. **`logging`-Modul für Produktionscode, niemals `print()`** — `import logging; logger = logging.getLogger(__name__)`. `print()` nur in CLI-Ausgabecode.
|
|
29
|
+
|
|
30
|
+
11. **`Enum` für feste Wertmengen verwenden** — keine String-Konstanten. `class Status(str, Enum): ACTIVE = "active"` gibt Typensicherheit und IDE-Vervollständigung.
|
|
31
|
+
|
|
32
|
+
12. **`subprocess.run()` statt `os.system()`** — erfasst Ausgabe, wirft bei Fehler mit `check=True`, vermeidet Shell-Injection mit Listen-Args: `subprocess.run(["git", "status"], check=True)`.
|
|
33
|
+
|
|
34
|
+
13. **`dict.get(key, default)` statt `key in dict` + `dict[key]`** — eine Abfrage statt zwei.
|
|
35
|
+
|
|
36
|
+
14. **Abstrakte Basisklassen via `abc.ABC`** — wenn erzwungene Interface-Verträge benötigt werden. `Protocol` für strukturelles Subtyping (Duck Typing mit Typ-Prüfung).
|
|
37
|
+
|
|
38
|
+
15. **Virtuelle Umgebungen immer, Abhängigkeiten in `pyproject.toml`** — `uv` oder `poetry` für Verwaltung. Kein `requirements.txt` für neue Projekte.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
> 🇩🇪 Dies ist die deutsche Übersetzung. [Englische Version](../typescript.md).
|
|
2
|
+
|
|
3
|
+
# TypeScript Regeln
|
|
4
|
+
|
|
5
|
+
## Anwenden auf
|
|
6
|
+
Alle TypeScript-Dateien (`*.ts`, `*.tsx`) in jedem Projekt.
|
|
7
|
+
|
|
8
|
+
## Regeln
|
|
9
|
+
|
|
10
|
+
1. **`strict: true` in `tsconfig.json`** — immer. Dies aktiviert `strictNullChecks`, `noImplicitAny` und `strictFunctionTypes`. Den Strict-Modus niemals deaktivieren, um Fehler zu unterdrücken; die Typen korrigieren.
|
|
11
|
+
|
|
12
|
+
2. **`unknown` statt `any` für ungetypte externe Daten** — `any` deaktiviert die Typprüfung vollständig. `unknown` erzwingt die Einschränkung des Typs vor der Verwendung. Externe Daten mit Zod oder ähnlichem parsen.
|
|
13
|
+
|
|
14
|
+
3. **`satisfies`-Operator für typgeprüfte Objekt-Literale** — `const config = { port: 3000 } satisfies Config` fängt Typfehler ab, während der Literal-Typ erhalten bleibt (keine Erweiterung auf `Config`).
|
|
15
|
+
|
|
16
|
+
4. **Diskriminierte Unions statt nullbarer Felder** — bevorzugen:
|
|
17
|
+
```ts
|
|
18
|
+
type Result = { status: "ok"; data: User } | { status: "error"; message: string }
|
|
19
|
+
```
|
|
20
|
+
statt `{ data?: User; error?: string }`. Diskriminierte Unions ermöglichen erschöpfende `switch`-Prüfung.
|
|
21
|
+
|
|
22
|
+
5. **Keine `as`-Typ-Assertions in Produktionscode** — `as SomeType` bringt den Compiler zum Schweigen ohne zu prüfen. Typ-Prädikate oder `satisfies` stattdessen verwenden. Ausnahme: DOM-Abfragen, wo TypeScript nicht besser inferieren kann.
|
|
23
|
+
|
|
24
|
+
6. **Typ-Prädikate für Einschränkung** — `function isUser(v: unknown): v is User { return typeof v === "object" && v !== null && "email" in v }`.
|
|
25
|
+
|
|
26
|
+
7. **`interface` für Objektformen, `type` für Unions und Aliase** — `interface` unterstützt `extends` und Deklarations-Merging. `type` wird für Unions und gemappte Typen benötigt.
|
|
27
|
+
|
|
28
|
+
8. **`const`-Assertions für Literal-Typen** — `const ROLES = ["admin", "user"] as const` gibt Typ `readonly ["admin", "user"]` statt `string[]`.
|
|
29
|
+
|
|
30
|
+
9. **Niemals den `Function`-Typ verwenden** — spezifische Signaturen verwenden: `(event: MouseEvent) => void`. `Function` akzeptiert alles und gibt alles zurück.
|
|
31
|
+
|
|
32
|
+
10. **Zod für Laufzeitvalidierung externer Daten** — HTTP-Request-Bodies, API-Antworten, Env-Vars, Konfigurationsdateien. TypeScript-Typen gelten nur zur Kompilierzeit; Zod validiert zur Laufzeit:
|
|
33
|
+
```ts
|
|
34
|
+
const UserSchema = z.object({ email: z.string().email(), age: z.number().int().positive() })
|
|
35
|
+
const user = UserSchema.parse(req.body) // wirft ZodError wenn ungültig
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
11. **`readonly` auf Arrays und Objekten, die nicht verändert werden sollen** — `readonly string[]` verhindert push/splice. `Readonly<Config>` auf Konfigurationsobjekten, die durch Schichten weitergegeben werden.
|
|
39
|
+
|
|
40
|
+
12. **Explizite Rückgabetypen auf öffentlichen/exportierten Funktionen** — verbessert Lesbarkeit und erkennt versehentliche Rückgabetyp-Änderungen.
|
|
41
|
+
|
|
42
|
+
13. **`import type` für nur-Typ-Imports** — `import type { User } from './types'` wird zur Laufzeit gelöscht und vermeidet zirkuläre Abhängigkeitsprobleme.
|
|
43
|
+
|
|
44
|
+
14. **`never` zur erschöpfenden Behandlung** — im Default-Fall eines Switch über eine diskriminierte Union:
|
|
45
|
+
```ts
|
|
46
|
+
default:
|
|
47
|
+
const _exhaustive: never = status // Kompilierfehler wenn ein Fall fehlt
|
|
48
|
+
throw new Error(`Unhandled: ${_exhaustive}`)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
15. **`noUncheckedIndexedAccess` aktivieren** — Array- und Objekt-Indexzugriff gibt `T | undefined` statt `T` zurück, was Null-Prüfungen erzwingt, wo sie benötigt werden.
|