dayuse-vibes
npx skills add https://github.com/dayuse-labs/skills-portfolio --skill dayuse-vibes
Agent 安装分布
Skill 文档
Dayuse Vibe Coding Standards
Ce skill garantit que le code généré pour des non-développeurs respecte des standards professionnels tout en restant compréhensible.
Principes Fondamentaux
Lors de la génération de code, respecter OBLIGATOIREMENT :
- TypeScript uniquement – Tout le code doit être en TypeScript strict
- Pas de type
any– Le typeanyest strictement interdit - Architecture DDD – Organiser le code selon Domain-Driven Design
- Tests systématiques – Chaque fonctionnalité nécessite des tests
- Linting obligatoire – Le code doit passer ESLint et Prettier
- Validation Zod – Valider les entrées externes avec Zod
- Pattern Result – Utiliser Result<T, E> au lieu de throw/catch
- Sécurité par défaut – Audit de sécurité, validation des autorisations et aucun secret en clair
Architecture DDD
Organiser le code en 4 couches distinctes :
src/
âââ domain/ # Logique métier (LE QUOI)
â âââ entities/ # Objets métier avec identité
â âââ value-objects/# Objets immuables sans identité
â âââ repositories/ # Interfaces d'accès aux données
â âââ services/ # Opérations métier complexes
â
âââ application/ # Cas d'usage (LE COMMENT)
â âââ use-cases/ # Opérations métier unitaires
â âââ dtos/ # Objets de transfert de données
â
âââ infrastructure/ # Détails techniques (LE OÃ)
â âââ repositories/ # Implémentations BDD/API
â âââ services/ # Services externes
â âââ persistence/ # Configuration BDD
â
âââ interfaces/ # Points d'entrée (LE QUI)
âââ http/ # Contrôleurs REST
âââ cli/ # Commandes CLI
âââ events/ # Gestionnaires d'événements
Règles des Couches
| Couche | Dépend de | Contient |
|---|---|---|
| Domain | Rien | Entités, Value Objects, Interfaces Repository |
| Application | Domain | Use Cases, DTOs |
| Infrastructure | Domain | Implémentations Repository, Services externes |
| Interfaces | Application | Contrôleurs, CLI, Event Handlers |
TypeScript Strict
Configuration Requise
Tous les projets doivent avoir dans tsconfig.json :
{
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"noImplicitReturns": true,
"noUncheckedIndexedAccess": true
}
}
Alternatives au type any
Au lieu de any |
Utiliser | Quand |
|---|---|---|
any |
unknown |
Type vraiment inconnu (nécessite type guard) |
any[] |
T[] |
Tableaux typés |
any |
Interface spécifique | Structure connue |
any |
Union types | Plusieurs types possibles |
any |
Generic <T> |
Composants réutilisables |
any |
Record<string, unknown> |
Dictionnaires d’objets |
Pattern de Type Guard
function isUser(value: unknown): value is User {
return (
typeof value === 'object' &&
value !== null &&
'id' in value &&
'name' in value
);
}
Validation avec Zod
Utiliser Zod pour valider TOUTES les entrées externes :
import { z } from 'zod';
// Définir le schéma
const CreateUserSchema = z.object({
name: z.string().min(2).max(100),
email: z.string().email(),
age: z.number().int().positive().optional(),
});
// Inférer le type TypeScript
type CreateUserInput = z.infer<typeof CreateUserSchema>;
// Valider les données
function validateInput(data: unknown): Result<CreateUserInput, ValidationError> {
const result = CreateUserSchema.safeParse(data);
if (!result.success) {
return err(new ValidationError(result.error.issues));
}
return ok(result.data);
}
Pattern Result
Ne jamais utiliser throw/catch pour les erreurs métier. Utiliser le pattern Result :
type Result<T, E = Error> =
| { success: true; data: T }
| { success: false; error: E };
// Helpers
const ok = <T>(data: T): Result<T, never> => ({ success: true, data });
const err = <E>(error: E): Result<never, E> => ({ success: false, error });
// Utilisation
function createUser(input: CreateUserInput): Result<User, UserError> {
if (await userExists(input.email)) {
return err(new EmailAlreadyExistsError(input.email));
}
const user = new User(generateId(), input.name, input.email);
return ok(user);
}
// Consommation
const result = createUser(input);
if (!result.success) {
// Gérer l'erreur
return handleError(result.error);
}
// Utiliser result.data
Sécurité et Autorisations (Zero Trust)
L’IA doit adopter une approche Zero Trust : ne jamais faire confiance aux entrées ni à l’état implicite.
1. Vérification Systématique des Autorisations
Toute action métier doit vérifier QUI fait l’action et s’il en a le DROIT.
// â MAUVAIS : On suppose que l'utilisateur a le droit car il est authentifié
function deleteProject(projectId: string, user: User) {
return projectRepo.delete(projectId);
}
// â
BON : Vérification explicite de la permission (Business Logic)
function deleteProject(projectId: string, user: User): Result<void, AppError> {
const project = await projectRepo.findById(projectId);
// Vérification d'appartenance ou de rôle
if (project.ownerId !== user.id && user.role !== 'ADMIN') {
return err(new UnauthorizedError("Vous n'avez pas les droits de suppression sur ce projet"));
}
return projectRepo.delete(projectId);
}
2. Pas de Secrets en Clair
Ne JAMAIS écrire de clés API, tokens, mots de passe ou certificats dans le code.
// â INTERDIT
const API_KEY = "sk-1234567890abcdef";
// â
REQUIS
const API_KEY = process.env.OPENAI_API_KEY;
3. Sanitisation des Entrées
Ne jamais insérer de données utilisateur brutes dans :
- Du HTML (Risque XSS)
- Des requêtes SQL (Risque Injection SQL)
- Des commandes système (Risque Command Injection)
Utiliser Zod pour valider le format et des bibliothèques d’échappement pour l’affichage.
Tests avec Vitest
Localisation des Tests
Placer les tests à côté des fichiers source :
src/domain/entities/
âââ user.ts
âââ user.test.ts
Structure des Tests
import { describe, it, expect, beforeEach } from 'vitest';
describe('User', () => {
describe('changeName', () => {
it('should update name when valid', () => {
// Arrange
const user = new User('1', 'John', email);
// Act
user.changeName('Jane');
// Assert
expect(user.name).toBe('Jane');
});
it('should return error when name too short', () => {
const user = new User('1', 'John', email);
const result = user.changeName('J');
expect(result.success).toBe(false);
});
});
});
Tests Requis Pour
- Toutes les entités et value objects du domaine
- Tous les use cases de l’application
- Toutes les fonctions publiques
- Les cas limites et la gestion d’erreurs
Linting
Commandes à Exécuter
Avant de terminer TOUTE tâche de code :
npm run lint # Vérifier les problèmes
npm run lint:fix # Corriger automatiquement
npm run format # Formater avec Prettier
npm run test # Lancer les tests
Script de Vérification Complète
npm run lint:fix && npm run format && npm run test
Workflow de Génération de Code
Pour chaque nouvelle fonctionnalité :
1. Déterminer la Couche
- Logique métier pure ? â
domain/ - Orchestration d’opérations ? â
application/ - Intégration externe ? â
infrastructure/ - Point d’entrée ? â
interfaces/
2. Créer avec les Bons Types
- Définir les interfaces en premier
- Utiliser des types explicites partout
- Jamais utiliser
any - Valider les entrées avec Zod
3. Gérer les Erreurs avec Result
- Définir les types d’erreur spécifiques
- Retourner Result au lieu de throw
- Documenter les cas d’erreur
4. Ãcrire les Tests
- Créer le fichier test à côté du source
- Tester le chemin nominal
- Tester les cas d’erreur
5. Vérifier la Qualité
npm run lint:fix && npm run format && npm run test
Conventions de Nommage
| Type | Convention | Exemple |
|---|---|---|
| Fichiers | kebab-case | user-repository.ts |
| Classes | PascalCase | UserRepository |
| Interfaces | PascalCase | UserRepository |
| Fonctions | camelCase | createUser |
| Constantes | SCREAMING_SNAKE | MAX_RETRY_COUNT |
| Types | PascalCase | CreateUserDTO |
| Schémas Zod | PascalCase + Schema | CreateUserSchema |
Ressources Additionnelles
Pour des guides détaillés, consulter :
- references/ddd-architecture.md – Patterns DDD complets
- references/typescript-patterns.md – Alternatives au type any
- references/testing-guide.md – Guide complet Vitest
- references/linting-setup.md – Configuration ESLint/Prettier
- references/zod-validation.md – Validation avec Zod
- references/result-pattern.md – Pattern Result détaillé
Quick Reference
TOUJOURS :
â TypeScript strict
â Types explicites partout
â Tests pour tout le code
â Linter avant de terminer
â Structure DDD
â Zod pour les entrées externes
â Result pour les erreurs métier
â Vérification des permissions
JAMAIS :
â Type any
â Sauter les tests
â Ignorer les erreurs linter
â Logique infra dans le domaine
â throw/catch pour erreurs métier
â Données non validées
â Secrets/Clés API en dur