qwen-superpowers 1.0.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/AGENTS.md +106 -0
- package/CHANGELOG.md +30 -0
- package/LICENSE +21 -0
- package/README.md +257 -0
- package/cli/index.js +335 -0
- package/hooks/post-execute.js +103 -0
- package/hooks/pre-execute.js +106 -0
- package/package.json +65 -0
- package/scripts/install.js +71 -0
- package/scripts/release.js +97 -0
- package/scripts/verify-skills.js +81 -0
- package/scripts/version.js +43 -0
- package/skills/brainstorming/SKILL.md +94 -0
- package/skills/code-review/SKILL.md +101 -0
- package/skills/executing-plans/SKILL.md +71 -0
- package/skills/git-worktrees/SKILL.md +105 -0
- package/skills/subagent-driven-development/SKILL.md +109 -0
- package/skills/systematic-debugging/SKILL.md +74 -0
- package/skills/test-driven-development/SKILL.md +88 -0
- package/skills/verification-before-completion/SKILL.md +109 -0
- package/skills/writing-plans/SKILL.md +101 -0
- package/skills/writing-skills/SKILL.md +112 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script de release.
|
|
3
|
+
* Usage: node scripts/release.js [patch|minor|major]
|
|
4
|
+
*
|
|
5
|
+
* Automatise le bump de version, le tag git et la préparation du release.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const { execSync } = require('child_process');
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
|
|
12
|
+
const PACKAGE_PATH = path.join(__dirname, '..', 'package.json');
|
|
13
|
+
|
|
14
|
+
const bumpType = process.argv[2] || 'patch';
|
|
15
|
+
const validBumps = ['patch', 'minor', 'major'];
|
|
16
|
+
|
|
17
|
+
if (!validBumps.includes(bumpType)) {
|
|
18
|
+
console.error(`Usage: node scripts/release.js [${validBumps.join('|')}]`);
|
|
19
|
+
console.error(` patch: 1.0.0 -> 1.0.1`);
|
|
20
|
+
console.error(` minor: 1.0.0 -> 1.1.0`);
|
|
21
|
+
console.error(` major: 1.0.0 -> 2.0.0`);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Lire la version actuelle
|
|
26
|
+
const pkg = JSON.parse(fs.readFileSync(PACKAGE_PATH, 'utf-8'));
|
|
27
|
+
const currentVersion = pkg.version;
|
|
28
|
+
console.log(`Version actuelle: ${currentVersion}`);
|
|
29
|
+
|
|
30
|
+
// Calculer la nouvelle version
|
|
31
|
+
const [major, minor, patch] = currentVersion.split('.').map(Number);
|
|
32
|
+
let newVersion;
|
|
33
|
+
|
|
34
|
+
switch (bumpType) {
|
|
35
|
+
case 'patch':
|
|
36
|
+
newVersion = `${major}.${minor}.${patch + 1}`;
|
|
37
|
+
break;
|
|
38
|
+
case 'minor':
|
|
39
|
+
newVersion = `${major}.${minor + 1}.0`;
|
|
40
|
+
break;
|
|
41
|
+
case 'major':
|
|
42
|
+
newVersion = `${major + 1}.0.0`;
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
console.log(`Nouvelle version: ${newVersion} (bump: ${bumpType})`);
|
|
47
|
+
|
|
48
|
+
// Vérifier que le dépôt est propre
|
|
49
|
+
try {
|
|
50
|
+
const status = execSync('git status --porcelain', { encoding: 'utf-8' }).trim();
|
|
51
|
+
if (status) {
|
|
52
|
+
console.error('\n❌ Le dépôt contient des modifications non committées.');
|
|
53
|
+
console.error('Commitez ou stash vos changements avant de créer un release.');
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
} catch {
|
|
57
|
+
console.log('⚠️ Impossible de vérifier l\'état git (pas un dépôt git ?)');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Appliquer la nouvelle version
|
|
61
|
+
pkg.version = newVersion;
|
|
62
|
+
fs.writeFileSync(PACKAGE_PATH, JSON.stringify(pkg, null, 2) + '\n');
|
|
63
|
+
console.log(`\n✓ package.json mis à jour: ${newVersion}`);
|
|
64
|
+
|
|
65
|
+
// Exécuter les tests
|
|
66
|
+
console.log('\nExécution des tests...');
|
|
67
|
+
try {
|
|
68
|
+
execSync('npm test', { stdio: 'inherit' });
|
|
69
|
+
console.log('✓ Tests passés');
|
|
70
|
+
} catch (e) {
|
|
71
|
+
console.error('\n❌ Les tests ont échoué — annulation du release.');
|
|
72
|
+
// Rollback
|
|
73
|
+
pkg.version = currentVersion;
|
|
74
|
+
fs.writeFileSync(PACKAGE_PATH, JSON.stringify(pkg, null, 2) + '\n');
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Créer le tag git
|
|
79
|
+
const tagName = `v${newVersion}`;
|
|
80
|
+
console.log(`\nCréation du tag ${tagName}...`);
|
|
81
|
+
|
|
82
|
+
try {
|
|
83
|
+
execSync(`git add package.json CHANGELOG.md`, { stdio: 'inherit' });
|
|
84
|
+
execSync(`git commit -m "chore: release ${tagName}"`, { stdio: 'inherit' });
|
|
85
|
+
execSync(`git tag -a ${tagName} -m "Release ${tagName}"`, { stdio: 'inherit' });
|
|
86
|
+
console.log(`\n✓ Tag ${tagName} créé`);
|
|
87
|
+
console.log(`\nPoussez avec: git push && git push origin ${tagName}`);
|
|
88
|
+
console.log(`Le workflow GitHub Actions publiera automatiquement sur npm.`);
|
|
89
|
+
} catch (e) {
|
|
90
|
+
console.log('⚠️ Erreur git (normal si pas de repo git)');
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
console.log(`\n============================================`);
|
|
94
|
+
console.log(` Release ${tagName} prêt !`);
|
|
95
|
+
console.log(` Pusher le tag pour déclencher la publication:`);
|
|
96
|
+
console.log(` git push && git push origin ${tagName}`);
|
|
97
|
+
console.log(`============================================\n`);
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script de vérification de l'intégrité des skills.
|
|
3
|
+
* Utilisé dans les tests CI pour s'assurer que tous les skills sont valides.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
|
|
9
|
+
const SKILLS_DIR = path.join(__dirname, '..', 'skills');
|
|
10
|
+
const REQUIRED_SECTIONS = ['Triggers', 'Instructions', 'Règles', 'Sortie attendue', 'Sortie Attendue'];
|
|
11
|
+
|
|
12
|
+
let hasErrors = false;
|
|
13
|
+
|
|
14
|
+
function verifySkills() {
|
|
15
|
+
const skills = fs.readdirSync(SKILLS_DIR).filter(d =>
|
|
16
|
+
fs.statSync(path.join(SKILLS_DIR, d)).isDirectory()
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
console.log(`\nVérification de ${skills.length} skills...\n`);
|
|
20
|
+
|
|
21
|
+
skills.forEach(skill => {
|
|
22
|
+
const skillFile = path.join(SKILLS_DIR, skill, 'SKILL.md');
|
|
23
|
+
|
|
24
|
+
if (!fs.existsSync(skillFile)) {
|
|
25
|
+
console.error(` ❌ ${skill}: SKILL.md manquant`);
|
|
26
|
+
hasErrors = true;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const content = fs.readFileSync(skillFile, 'utf-8');
|
|
31
|
+
|
|
32
|
+
// Vérifier la présence des sections requises (au moins une variante)
|
|
33
|
+
const missingSections = REQUIRED_SECTIONS.filter(section => {
|
|
34
|
+
// "Sortie attendue" et "Sortie Attendue" sont équivalents
|
|
35
|
+
if (section === 'Sortie attendue' || section === 'Sortie Attendue') {
|
|
36
|
+
return !content.includes('Sortie attendue') && !content.includes('Sortie Attendue');
|
|
37
|
+
}
|
|
38
|
+
return !content.includes(section);
|
|
39
|
+
});
|
|
40
|
+
if (missingSections.filter(s => s !== 'Sortie Attendue').length > 0) {
|
|
41
|
+
console.error(` ⚠️ ${skill}: sections manquantes: ${missingSections.filter(s => s !== 'Sortie Attendue').join(', ')}`);
|
|
42
|
+
hasErrors = true;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Vérifier que le fichier n'est pas vide
|
|
46
|
+
if (content.trim().length < 50) {
|
|
47
|
+
console.error(` ❌ ${skill}: SKILL.md trop court (${content.trim().length} chars)`);
|
|
48
|
+
hasErrors = true;
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
console.log(` ✅ ${skill} (${content.trim().length} chars)`);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// Vérifier les hooks
|
|
56
|
+
console.log('\nVérification des hooks...');
|
|
57
|
+
const hooksDir = path.join(__dirname, '..', 'hooks');
|
|
58
|
+
const hooks = fs.readdirSync(hooksDir).filter(f => f.endsWith('.js'));
|
|
59
|
+
|
|
60
|
+
hooks.forEach(hook => {
|
|
61
|
+
const hookPath = path.join(hooksDir, hook);
|
|
62
|
+
try {
|
|
63
|
+
require(hookPath);
|
|
64
|
+
console.log(` ✅ ${hook}`);
|
|
65
|
+
} catch (e) {
|
|
66
|
+
console.error(` ❌ ${hook}: ${e.message}`);
|
|
67
|
+
hasErrors = true;
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// Résumé
|
|
72
|
+
console.log('');
|
|
73
|
+
if (hasErrors) {
|
|
74
|
+
console.error('❌ Vérification échouée — corrigez les erreurs avant de continuer.');
|
|
75
|
+
process.exit(1);
|
|
76
|
+
} else {
|
|
77
|
+
console.log('✅ Tous les skills et hooks sont valides.');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
verifySkills();
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script de gestion de version.
|
|
3
|
+
* Met à jour le CHANGELOG.md avec la date du jour et la nouvelle version.
|
|
4
|
+
* Exécuté automatiquement via npm version.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const fs = require('fs');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
|
|
10
|
+
const CHANGELOG_PATH = path.join(__dirname, '..', 'CHANGELOG.md');
|
|
11
|
+
const PACKAGE_PATH = path.join(__dirname, '..', 'package.json');
|
|
12
|
+
|
|
13
|
+
function updateChangelog(version) {
|
|
14
|
+
let changelog = '';
|
|
15
|
+
|
|
16
|
+
if (fs.existsSync(CHANGELOG_PATH)) {
|
|
17
|
+
changelog = fs.readFileSync(CHANGELOG_PATH, 'utf-8');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const today = new Date().toISOString().split('T')[0];
|
|
21
|
+
const newSection = `## [${version}] - ${today}\n\n### Added\n- \n\n### Changed\n- \n\n### Fixed\n- \n\n`;
|
|
22
|
+
|
|
23
|
+
// Insérer après l'en-tête du changelog
|
|
24
|
+
const headerEnd = changelog.indexOf('\n\n## [');
|
|
25
|
+
if (headerEnd > 0) {
|
|
26
|
+
changelog = changelog.slice(0, headerEnd + 2) + newSection + changelog.slice(headerEnd + 2);
|
|
27
|
+
} else {
|
|
28
|
+
// Chercher juste après les lignes de description initiale
|
|
29
|
+
const descEnd = changelog.indexOf('\n\n## ');
|
|
30
|
+
if (descEnd > 0) {
|
|
31
|
+
changelog = changelog.slice(0, descEnd + 2) + newSection + changelog.slice(descEnd + 2);
|
|
32
|
+
} else {
|
|
33
|
+
changelog += '\n\n' + newSection;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
fs.writeFileSync(CHANGELOG_PATH, changelog);
|
|
38
|
+
console.log(`CHANGELOG.md mis à jour pour la version ${version}`);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Récupérer la version depuis package.json
|
|
42
|
+
const pkg = JSON.parse(fs.readFileSync(PACKAGE_PATH, 'utf-8'));
|
|
43
|
+
updateChangelog(pkg.version);
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Brainstorming
|
|
2
|
+
|
|
3
|
+
> Questionnement socratique pour affiner les idées avant de coder. Produire un document de design validé.
|
|
4
|
+
|
|
5
|
+
## Triggers
|
|
6
|
+
- L'utilisateur exprime une idée vague ("je voudrais faire...", "ce serait bien si...")
|
|
7
|
+
- L'utilisateur demande une nouvelle fonctionnalité sans spécifications détaillées
|
|
8
|
+
- Le projet nécessite une décision architecturale
|
|
9
|
+
- L'agent détecte une ambiguïté dans la demande
|
|
10
|
+
|
|
11
|
+
## Instructions
|
|
12
|
+
|
|
13
|
+
### 1. Phase d'Exploration
|
|
14
|
+
Poser des questions ouvertes pour comprendre l'intention :
|
|
15
|
+
- **Quel est le problème** que tu cherches à résoudre ?
|
|
16
|
+
- **Qui** utilisera cette fonctionnalité ?
|
|
17
|
+
- **Quel est le cas d'usage principal** ? Et les cas limites ?
|
|
18
|
+
- **Y a-t-il des contraintes** techniques ou business ?
|
|
19
|
+
|
|
20
|
+
### 2. Phase de Clarification
|
|
21
|
+
Approfondir avec des questions ciblées :
|
|
22
|
+
- "Que se passe-t-il si... ?" (cas limites)
|
|
23
|
+
- "Comment l'utilisateur interagit avec... ?" (UX)
|
|
24
|
+
- "Quelles sont les dépendances existantes ?" (architecture)
|
|
25
|
+
- "Est-ce que ça existe déjà sous une autre forme ?" (réutilisation)
|
|
26
|
+
|
|
27
|
+
### 3. Phase de Convergence
|
|
28
|
+
Proposer une synthèse et valider :
|
|
29
|
+
- Résumer l'idée en 2-3 phrases
|
|
30
|
+
- Lister les composants/entités principaux
|
|
31
|
+
- Identifier les risques et complexités
|
|
32
|
+
- Proposer 2-3 approches avec trade-offs
|
|
33
|
+
|
|
34
|
+
### 4. Production du Design Doc
|
|
35
|
+
Générer un document structuré sauvegardé dans `.qwen-designs/` :
|
|
36
|
+
|
|
37
|
+
```markdown
|
|
38
|
+
# Design: [Nom de la feature]
|
|
39
|
+
|
|
40
|
+
## Problème
|
|
41
|
+
[Description du problème résolu]
|
|
42
|
+
|
|
43
|
+
## Solution Proposée
|
|
44
|
+
[Architecture et approche choisie]
|
|
45
|
+
|
|
46
|
+
## Composants
|
|
47
|
+
- [Composant A]: [Rôle]
|
|
48
|
+
- [Composant B]: [Rôle]
|
|
49
|
+
|
|
50
|
+
## API / Interface
|
|
51
|
+
[Signature des fonctions ou endpoints]
|
|
52
|
+
|
|
53
|
+
## Cas Limites
|
|
54
|
+
- [Cas 1]: [Comportement]
|
|
55
|
+
- [Cas 2]: [Comportement]
|
|
56
|
+
|
|
57
|
+
## Trade-offs
|
|
58
|
+
- [Choix X]: avantage/inconvénient
|
|
59
|
+
- [Choix Y]: avantage/inconvénient
|
|
60
|
+
|
|
61
|
+
## Décisions
|
|
62
|
+
1. [Décision 1] car [raison]
|
|
63
|
+
2. [Décision 2] car [raison]
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Règles
|
|
67
|
+
|
|
68
|
+
1. **Ne JAMAIS sauter directement au code** — le design d'abord
|
|
69
|
+
2. **Poser au moins 3 questions** avant de proposer une solution
|
|
70
|
+
3. **Toujours sauvegarder** le design doc dans `.qwen-designs/`
|
|
71
|
+
4. **Proposer des alternatives** quand le choix n'est pas évident
|
|
72
|
+
5. **Valider avec l'utilisateur** avant de passer à l'étape suivante
|
|
73
|
+
|
|
74
|
+
## Sortie Attendue
|
|
75
|
+
|
|
76
|
+
- [ ] Au moins 3 questions posées à l'utilisateur
|
|
77
|
+
- [ ] Compréhension validée par l'utilisateur
|
|
78
|
+
- [ ] Design doc produit et sauvegardé
|
|
79
|
+
- [ ] Prochaine étape identifiée (writing-plans)
|
|
80
|
+
|
|
81
|
+
## Exemple d'Utilisation
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
Utilisateur: "Je voudrais un système de cache pour les requêtes API"
|
|
85
|
+
|
|
86
|
+
Agent (Brainstorming):
|
|
87
|
+
1. "Quel type de requêtes API ? (GET uniquement ? avec paramètres ?)"
|
|
88
|
+
2. "Combien de temps les données doivent-elles rester en cache ?"
|
|
89
|
+
3. "Le cache doit-il être persistant (fichier/DB) ou en mémoire ?"
|
|
90
|
+
4. "Y a-t-il des contraintes de mémoire à considérer ?"
|
|
91
|
+
5. "Est-ce que invalidation manuelle est nécessaire ?"
|
|
92
|
+
|
|
93
|
+
→ Après réponses → Production du Design Doc → Writing Plans
|
|
94
|
+
```
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Code Review
|
|
2
|
+
|
|
3
|
+
> Comparer le code produit au plan initial et identifier les problèmes avant de merger.
|
|
4
|
+
|
|
5
|
+
## Triggers
|
|
6
|
+
- Du code a été produit après exécution d'un plan
|
|
7
|
+
- L'utilisateur demande une revue de code
|
|
8
|
+
- Avant de merger une branche
|
|
9
|
+
- Après un refactoring significatif
|
|
10
|
+
|
|
11
|
+
## Instructions
|
|
12
|
+
|
|
13
|
+
### 1. Vérifier la Conformité au Plan
|
|
14
|
+
1. Relire le plan d'exécution initial
|
|
15
|
+
2. Comparer chaque tâche avec le code produit
|
|
16
|
+
3. Vérifier que toutes les tâches sont implémentées
|
|
17
|
+
4. Identifier les écarts (code manquant, code ajouté non planifié)
|
|
18
|
+
|
|
19
|
+
### 2. Analyse Statique
|
|
20
|
+
Examiner le code pour :
|
|
21
|
+
- **Lisibilité** : noms de variables, structure, commentaires
|
|
22
|
+
- **Complexité** : fonctions trop longues, nesting excessif
|
|
23
|
+
- **Duplication** : code copié-collé, logique répétée
|
|
24
|
+
- **Architecture** : respect des responsabilités, couplage
|
|
25
|
+
- **Sécurité** : injections, données sensibles, validation
|
|
26
|
+
|
|
27
|
+
### 3. Vérification des Tests
|
|
28
|
+
1. Tous les tests passent-ils ?
|
|
29
|
+
2. Les cas limites sont-ils couverts ?
|
|
30
|
+
3. Les tests sont-ils lisibles et maintenables ?
|
|
31
|
+
4. Y a-t-il des chemins non testés ?
|
|
32
|
+
|
|
33
|
+
### 4. Rapport par Sévérité
|
|
34
|
+
|
|
35
|
+
```markdown
|
|
36
|
+
# Rapport de Revue de Code
|
|
37
|
+
|
|
38
|
+
## 🔴 Critical (Bloquant — empêche le merge)
|
|
39
|
+
- [ ] Problème 1: description + localisation + suggestion
|
|
40
|
+
- [ ] Problème 2: ...
|
|
41
|
+
|
|
42
|
+
## 🟡 Warning (Devrait être corrigé)
|
|
43
|
+
- [ ] Problème 1: description + suggestion
|
|
44
|
+
- [ ] Problème 2: ...
|
|
45
|
+
|
|
46
|
+
## 🟢 Suggestion (Optionnel)
|
|
47
|
+
- [ ] Problème 1: description + suggestion
|
|
48
|
+
|
|
49
|
+
## ✅ Points Positifs
|
|
50
|
+
- Point fort 1
|
|
51
|
+
- Point fort 2
|
|
52
|
+
|
|
53
|
+
## Résumé
|
|
54
|
+
- Critical: X | Warning: Y | Suggestions: Z
|
|
55
|
+
- Statut: 🔴 BLOQUÉ / 🟡 CONDITIONNEL / ✅ APPROUVÉ
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Règles
|
|
59
|
+
|
|
60
|
+
1. **Critical = veto** — aucun merge si un problème critical existe
|
|
61
|
+
2. **Être constructif** — toujours proposer une solution, pas juste critiquer
|
|
62
|
+
3. **Vérifier contre le plan** — pas juste contre des standards généraux
|
|
63
|
+
4. **Revue en 2 passes** : (1) conformité plan, (2) qualité code
|
|
64
|
+
5. **Documenter les décisions** — pourquoi quelque chose est un problème
|
|
65
|
+
|
|
66
|
+
## Sortie Attendue
|
|
67
|
+
|
|
68
|
+
- [ ] Rapport de revue complet avec sévérités
|
|
69
|
+
- [ ] Problèmes critical bloquent la progression
|
|
70
|
+
- [ ] Suggestions documentées
|
|
71
|
+
- [ ] Statut clair : BLOQUÉ / CONDITIONNEL / APPROUVÉ
|
|
72
|
+
- [ ] Si CONDITIONNEL : re-revue après corrections
|
|
73
|
+
|
|
74
|
+
## Exemple d'Utilisation
|
|
75
|
+
|
|
76
|
+
```markdown
|
|
77
|
+
# Rapport de Revue de Code
|
|
78
|
+
|
|
79
|
+
## 🔴 Critical
|
|
80
|
+
- [ ] `cache.ts:15` — La méthode `get` ne vérifie pas l'expiration.
|
|
81
|
+
Un item expiré est retourné comme valide.
|
|
82
|
+
**Fix:** Vérifier `Date.now() < item.expiry` avant de retourner.
|
|
83
|
+
|
|
84
|
+
## 🟡 Warning
|
|
85
|
+
- [ ] `cache.test.ts:22` — Pas de test pour l'éviction LRU.
|
|
86
|
+
**Fix:** Ajouter un test avec capacity=2 et 3 insertions.
|
|
87
|
+
- [ ] `cache.ts:8` — Le Map n'a pas de taille maximale.
|
|
88
|
+
**Fix:** Ajouter une option `maxSize` au constructeur.
|
|
89
|
+
|
|
90
|
+
## 🟢 Suggestions
|
|
91
|
+
- [ ] Utiliser `Record` au lieu de `Map` si les clés sont toujours strings.
|
|
92
|
+
|
|
93
|
+
## ✅ Points Positifs
|
|
94
|
+
- Architecture claire et bien séparée
|
|
95
|
+
- Tests complets pour les cas nominaux
|
|
96
|
+
- Bons noms de variables et fonctions
|
|
97
|
+
|
|
98
|
+
## Résumé
|
|
99
|
+
- Critical: 1 | Warning: 2 | Suggestions: 1
|
|
100
|
+
- Statut: 🔴 BLOQUÉ — corriger l'expiration avant merge
|
|
101
|
+
```
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Executing Plans
|
|
2
|
+
|
|
3
|
+
> Exécuter un plan d'exécution étape par étape en suivant le workflow TDD.
|
|
4
|
+
|
|
5
|
+
## Triggers
|
|
6
|
+
- Un plan a été écrit et validé par l'utilisateur
|
|
7
|
+
- L'utilisateur donne le feu vert pour l'exécution
|
|
8
|
+
- L'agent est en mode développement actif
|
|
9
|
+
|
|
10
|
+
## Instructions
|
|
11
|
+
|
|
12
|
+
### 1. Préparer l'Environnement
|
|
13
|
+
1. Vérifier que tous les tests existants passent
|
|
14
|
+
2. Créer une branche de travail (ou worktree) si pas déjà fait
|
|
15
|
+
3. Identifier le premier test en échec attendu (RED)
|
|
16
|
+
|
|
17
|
+
### 2. Exécuter Chaque Tâche
|
|
18
|
+
Pour chaque tâche du plan :
|
|
19
|
+
|
|
20
|
+
1. **Lire la description** de la tâche
|
|
21
|
+
2. **Créer/modifier les fichiers** spécifiés
|
|
22
|
+
3. **Si c'est un test** : s'assurer qu'il échoue initialement (RED)
|
|
23
|
+
4. **Si c'est de l'implémentation** : écrire le minimum pour passer le test (GREEN)
|
|
24
|
+
5. **Exécuter la vérification** spécifiée
|
|
25
|
+
6. **Refactorer** si nécessaire (tests doivent rester verts)
|
|
26
|
+
7. **Cocher la tâche** comme terminée
|
|
27
|
+
|
|
28
|
+
### 3. Progression et Communication
|
|
29
|
+
- Annoncer le début de chaque tâche
|
|
30
|
+
- Montrer le résultat de la vérification
|
|
31
|
+
- Signaler immédiatement si une tâche bloque
|
|
32
|
+
- Mettre à jour la progression (X/Y tâches)
|
|
33
|
+
|
|
34
|
+
### 4. Gestion des Blocages
|
|
35
|
+
Si une tâche est plus complexe que prévu :
|
|
36
|
+
1. **NE PAS** improviser — revenir au plan
|
|
37
|
+
2. Identifier pourquoi la tâche est sous-estimée
|
|
38
|
+
3. Proposer un re-découpage si nécessaire
|
|
39
|
+
4. Valider avec l'utilisateur avant de continuer
|
|
40
|
+
|
|
41
|
+
## Règles
|
|
42
|
+
|
|
43
|
+
1. **Suivre le plan à la lettre** — pas de déviation sans validation
|
|
44
|
+
2. **TDD à chaque étape** — test d'abord, code ensuite
|
|
45
|
+
3. **Vérifier après chaque tâche** — les tests doivent passer
|
|
46
|
+
4. **Un commit par tâche** ou groupe logique de tâches
|
|
47
|
+
5. **Signaler les blocages** immédiatement
|
|
48
|
+
|
|
49
|
+
## Sortie Attendue
|
|
50
|
+
|
|
51
|
+
- [ ] Toutes les tâches du plan exécutées
|
|
52
|
+
- [ ] Tous les tests passent
|
|
53
|
+
- [ ] Code commité incrémentalement
|
|
54
|
+
- [ ] Prêt pour la code review
|
|
55
|
+
|
|
56
|
+
## Exemple de Progression
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
📋 Exécution du Plan: Système de Cache API
|
|
60
|
+
Progression: 2/6 tâches
|
|
61
|
+
|
|
62
|
+
✅ Tâche 1: Test - Cache create/empty
|
|
63
|
+
→ Test écrit, échoue initialement (RED) ✅
|
|
64
|
+
|
|
65
|
+
✅ Tâche 2: Implémenter Cache class
|
|
66
|
+
→ Classe Cache créée, test passe (GREEN) ✅
|
|
67
|
+
→ Commit: "feat: implement Cache class with size()"
|
|
68
|
+
|
|
69
|
+
🔄 Tâche 3: Test - Cache set/get
|
|
70
|
+
→ En cours...
|
|
71
|
+
```
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Git Worktrees
|
|
2
|
+
|
|
3
|
+
> Créer un environnement de travail isolé pour développer une feature sans perturber la branche principale.
|
|
4
|
+
|
|
5
|
+
## Triggers
|
|
6
|
+
- L'utilisateur demande de commencer à travailler sur une feature
|
|
7
|
+
- Le début d'un cycle de développement (après brainstorming)
|
|
8
|
+
- Quand plusieurs features doivent être développées en parallèle
|
|
9
|
+
|
|
10
|
+
## Instructions
|
|
11
|
+
|
|
12
|
+
### 1. Vérifier l'État du Dépôt
|
|
13
|
+
1. Vérifier que le dépôt est propre (`git status`)
|
|
14
|
+
2. S'assurer que la branche principale est à jour
|
|
15
|
+
3. Vérifier qu'aucun worktree n'existe déjà pour cette feature
|
|
16
|
+
|
|
17
|
+
### 2. Créer le Worktree
|
|
18
|
+
```bash
|
|
19
|
+
# Créer une nouvelle branche et un worktree associé
|
|
20
|
+
git worktree add ../<projet>-<feature-name> -b feature/<feature-name>
|
|
21
|
+
|
|
22
|
+
# Se déplacer dans le worktree
|
|
23
|
+
cd ../<projet>-<feature-name>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 3. Setup Initial
|
|
27
|
+
1. Installer les dépendances (`npm install` ou équivalent)
|
|
28
|
+
2. Vérifier que les tests passent sur la branche fraîche
|
|
29
|
+
3. Configurer les hooks Git si nécessaires
|
|
30
|
+
|
|
31
|
+
### 4. Travailler dans le Worktree
|
|
32
|
+
- Tout le développement de la feature se fait dans ce worktree
|
|
33
|
+
- La branche principale reste inchangée
|
|
34
|
+
- On peut ouvrir un éditeur séparé pour ce worktree
|
|
35
|
+
|
|
36
|
+
### 5. Nettoyage (Finalization)
|
|
37
|
+
Après merge de la feature :
|
|
38
|
+
```bash
|
|
39
|
+
# Supprimer le worktree
|
|
40
|
+
git worktree remove ../<projet>-<feature-name>
|
|
41
|
+
|
|
42
|
+
# Supprimer la branche si mergée
|
|
43
|
+
git branch -d feature/<feature-name>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Règles
|
|
47
|
+
|
|
48
|
+
1. **Un worktree par feature** — isolation stricte
|
|
49
|
+
2. **Jamais de travail direct sur main/master** — toujours une branche
|
|
50
|
+
3. **Vérifier les tests avant de commencer** — baseline propre requise
|
|
51
|
+
4. **Nettoyer après merge** — supprimer worktrees et branches inutiles
|
|
52
|
+
5. **Nommage cohérent** — `feature/nom-court-descriptif`
|
|
53
|
+
|
|
54
|
+
## Commandes Utiles
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# Lister les worktrees
|
|
58
|
+
git worktree list
|
|
59
|
+
|
|
60
|
+
# Ajouter un worktree
|
|
61
|
+
git worktree add <path> -b <branch-name>
|
|
62
|
+
|
|
63
|
+
# Supprimer un worktree
|
|
64
|
+
git worktree remove <path>
|
|
65
|
+
|
|
66
|
+
# Forcer la suppression (si probleme)
|
|
67
|
+
git worktree remove <path> --force
|
|
68
|
+
|
|
69
|
+
# Nettoyer les worktrees manquants
|
|
70
|
+
git worktree prune
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Sortie Attendue
|
|
74
|
+
|
|
75
|
+
- [ ] Branche créée et checkout
|
|
76
|
+
- [ ] Worktree configuré
|
|
77
|
+
- [ ] Dépendances installées
|
|
78
|
+
- [ ] Tests de base passent (baseline propre)
|
|
79
|
+
- [ ] Prêt à écrire le plan
|
|
80
|
+
|
|
81
|
+
## Exemple d'Utilisation
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
🌳 Git Worktree Setup
|
|
85
|
+
|
|
86
|
+
Feature: systeme-cache-api
|
|
87
|
+
|
|
88
|
+
1. Vérification de l'état du dépôt...
|
|
89
|
+
✓ Dépôt propre
|
|
90
|
+
✓ Branche main à jour
|
|
91
|
+
|
|
92
|
+
2. Création du worktree...
|
|
93
|
+
$ git worktree add ../monprojet-cache -b feature/systeme-cache
|
|
94
|
+
✓ Worktree créé
|
|
95
|
+
|
|
96
|
+
3. Setup...
|
|
97
|
+
$ npm install
|
|
98
|
+
✓ Dépendances installées
|
|
99
|
+
|
|
100
|
+
4. Vérification des tests...
|
|
101
|
+
$ npm test
|
|
102
|
+
✓ 42 tests passent (baseline propre)
|
|
103
|
+
|
|
104
|
+
✅ Prêt pour le plan d'exécution
|
|
105
|
+
```
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Subagent-Driven Development
|
|
2
|
+
|
|
3
|
+
> Dispatch les tâches du plan à des sous-agents frais avec revue en deux étapes pour un développement autonome et fiable.
|
|
4
|
+
|
|
5
|
+
## Triggers
|
|
6
|
+
- Un plan avec des tâches parallélisables a été validé
|
|
7
|
+
- L'utilisateur accepte le développement par sous-agents
|
|
8
|
+
- Plus de 3 tâches dans le plan et certaines sont indépendantes
|
|
9
|
+
|
|
10
|
+
## Instructions
|
|
11
|
+
|
|
12
|
+
### 1. Préparer le Dispatch
|
|
13
|
+
1. Identifier les tâches indépendantes (peuvent être faites en parallle)
|
|
14
|
+
2. Grouper les tâches dépendantes en séquences
|
|
15
|
+
3. Pour chaque groupe, préparer un **contexte d'agent** :
|
|
16
|
+
- Le design doc
|
|
17
|
+
- Le plan complet
|
|
18
|
+
- La/les tâches spécifiques à exécuter
|
|
19
|
+
- Les conventions du projet
|
|
20
|
+
|
|
21
|
+
### 2. Dispatcher un Sous-Agent
|
|
22
|
+
Pour chaque tâche ou groupe :
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
PROMPT TYPE pour sous-agent :
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
CONTEXTE:
|
|
29
|
+
- Design Doc: [contenu ou référence]
|
|
30
|
+
- Plan: [contenu ou référence]
|
|
31
|
+
|
|
32
|
+
TÂCHE ASSIGNÉE:
|
|
33
|
+
[Tâche N: description, fichiers, snippets attendus]
|
|
34
|
+
|
|
35
|
+
RÈGLES:
|
|
36
|
+
1. TDD strict — test d'abord
|
|
37
|
+
2. Suivre le plan exactement
|
|
38
|
+
3. Vérifier avec la commande spécifiée
|
|
39
|
+
4. Retourner le code produit + résultat des tests
|
|
40
|
+
|
|
41
|
+
SORTIE ATTENDUE:
|
|
42
|
+
- Code complet des fichiers modifiés/créés
|
|
43
|
+
- Résultat de la vérification
|
|
44
|
+
- Notes ou problèmes rencontrés
|
|
45
|
+
---
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 3. Revue en Deux Étapes
|
|
49
|
+
|
|
50
|
+
#### Étape 1: Revue de Conformité
|
|
51
|
+
- Le code suit-il le plan exactement ?
|
|
52
|
+
- Toutes les tâches assignées sont-elles faites ?
|
|
53
|
+
- Les tests spécifi passent-ils ?
|
|
54
|
+
- **Si NON** → Renvoyer au sous-agent avec feedback
|
|
55
|
+
|
|
56
|
+
#### Étape 2: Revue de Qualité
|
|
57
|
+
- Appliquer le skill `code-review`
|
|
58
|
+
- Vérifier lisibilité, complexité, duplication
|
|
59
|
+
- **Si problèmes** → Demander corrections
|
|
60
|
+
|
|
61
|
+
### 4. Continuer ou Corriger
|
|
62
|
+
- Si les 2 revues passent → merger le code
|
|
63
|
+
- Si échec → corriger ou réassigner
|
|
64
|
+
- Progression mise à jour après chaque tâche
|
|
65
|
+
|
|
66
|
+
## Règles
|
|
67
|
+
|
|
68
|
+
1. **Contexte frais** — chaque sous-agent reçoit un contexte propre
|
|
69
|
+
2. **Toujours 2 revues** — conformité + qualité
|
|
70
|
+
3. **Plan = contrat** — le sous-agent ne dévie pas du plan
|
|
71
|
+
4. **Feedback constructif** — expliquer pourquoi ça ne va pas
|
|
72
|
+
5. **Progression visible** — toujours montrer X/Y tâches faites
|
|
73
|
+
|
|
74
|
+
## Sortie Attendue
|
|
75
|
+
|
|
76
|
+
- [ ] Sous-agents dispatchés avec contexte complet
|
|
77
|
+
- [ ] Chaque sortie revue (conformité + qualité)
|
|
78
|
+
- [ ] Tâches mergées ou retournées pour correction
|
|
79
|
+
- [ ] Progression mise à jour
|
|
80
|
+
- [ ] Prêt pour l'étape suivante du workflow
|
|
81
|
+
|
|
82
|
+
## Exemple d'Utilisation
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
🤖 Subagent-Driven Development
|
|
86
|
+
|
|
87
|
+
Plan: Système de Cache API (6 tâches)
|
|
88
|
+
|
|
89
|
+
📦 Dispatch:
|
|
90
|
+
Groupe A (parallèle): Tâches 1, 2, 3 → Agent Alpha
|
|
91
|
+
Groupe B (parallèle): Tâches 4, 5 → Agent Beta
|
|
92
|
+
Séquentiel: Tâche 6 → Principal (dépend de A et B)
|
|
93
|
+
|
|
94
|
+
🔄 Agent Alpha — Tâches 1-3:
|
|
95
|
+
Revue Conformité: ✅ OK
|
|
96
|
+
Revue Qualité: 🟡 1 warning (test LRU manquant)
|
|
97
|
+
→ Correction demandée → ✅ OK après
|
|
98
|
+
|
|
99
|
+
🔄 Agent Beta — Tâches 4-5:
|
|
100
|
+
Revue Conformité: ✅ OK
|
|
101
|
+
Revue Qualité: ✅ OK
|
|
102
|
+
|
|
103
|
+
🔄 Principal — Tâche 6:
|
|
104
|
+
(après merging A et B)
|
|
105
|
+
✅ Terminé
|
|
106
|
+
|
|
107
|
+
Progression: 6/6 tâches ✅
|
|
108
|
+
→ Prêt pour Code Review globale
|
|
109
|
+
```
|