create-go-plate 0.0.0-stage → 0.1.1
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/CHANGELOG.md +20 -0
- package/LICENSE +21 -0
- package/README.md +345 -2
- package/bin/create.mjs +198 -0
- package/modules/ai/docs/AI.md +20 -0
- package/modules/ai/evals/README.md +10 -0
- package/modules/ci-github/.github/dependabot.yml +8 -0
- package/modules/ci-github/.github/workflows/ci.yml +38 -0
- package/modules/claude/.claude/hooks/format.mjs +37 -0
- package/modules/claude/.claude/hooks/lib.mjs +32 -0
- package/modules/claude/.claude/hooks/protect-files.mjs +69 -0
- package/modules/claude/.claude/hooks/session-start.mjs +50 -0
- package/modules/claude/.claude/settings.json +61 -0
- package/modules/claude/.mcp.json +12 -0
- package/modules/claude/CLAUDE.md +13 -0
- package/package.json +40 -4
- package/template/.claude/agents/reviewer.md +25 -0
- package/template/.claude/agents/test-writer.md +19 -0
- package/template/.claude/skills/audit-securite/SKILL.md +23 -0
- package/template/.claude/skills/cadrage/SKILL.md +81 -0
- package/template/.claude/skills/fin-de-session/SKILL.md +28 -0
- package/template/.claude/skills/spec/SKILL.md +36 -0
- package/template/.claude/skills/stress-test/SKILL.md +25 -0
- package/template/.editorconfig +18 -0
- package/template/.env.example +7 -0
- package/template/AGENTS.md +98 -0
- package/template/README.md +62 -0
- package/template/TASKS.md +16 -0
- package/template/docs/ARCHITECTURE.md +38 -0
- package/template/docs/DESIGN.md +37 -0
- package/template/docs/PRD.md +38 -0
- package/template/docs/RULES.md +31 -0
- package/template/docs/SECURITY.md +43 -0
- package/template/docs/SESSION-LOG.md +15 -0
- package/template/docs/TESTING.md +34 -0
- package/template/docs/decisions/0000-template.md +16 -0
- package/template/docs/decisions/README.md +8 -0
- package/template/docs/specs/README.md +12 -0
- package/template/docs/specs/_template/plan.md +27 -0
- package/template/docs/specs/_template/spec.md +23 -0
- package/template/docs/specs/_template/tasks.md +8 -0
- package/template/gitignore +30 -0
- package/template/src/README.md +9 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.1 — 2026-10-18
|
|
4
|
+
|
|
5
|
+
- README complet : démarrage rapide, fonctionnement, commandes, garde-fous, options, compatibilité, FAQ.
|
|
6
|
+
- Liens vers le dépôt GitHub dans la fiche npm.
|
|
7
|
+
- Tests automatiques du générateur sur Linux, macOS et Windows (Node 20, 22, 24).
|
|
8
|
+
|
|
9
|
+
## 0.1.0 — 2026-10-18
|
|
10
|
+
|
|
11
|
+
Première version.
|
|
12
|
+
|
|
13
|
+
- Générateur `npm create go-plate` (interactif ou `--yes`), sans dépendance.
|
|
14
|
+
- Cadrage : `AGENTS.md` source unique, PRD, architecture, design, règles, sécurité, tests,
|
|
15
|
+
journal de session, ADR, specs par fonctionnalité.
|
|
16
|
+
- Skills : `/cadrage`, `/stress-test`, `/spec`, `/fin-de-session`, `/audit-securite`.
|
|
17
|
+
- Sous-agents : `reviewer`, `test-writer`.
|
|
18
|
+
- Module Claude Code : permissions, hooks (reprise de contexte, protection des secrets et du git
|
|
19
|
+
destructif, formatage automatique), `.mcp.json` (Context7, Playwright).
|
|
20
|
+
- Modules optionnels : CI GitHub Actions + Dependabot, fonctionnalités IA (`docs/AI.md`, `evals/`).
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jeanpierregaba
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,346 @@
|
|
|
1
|
-
#
|
|
1
|
+
# create-go-plate
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Le point de départ structuré pour développer une application avec un agent de code.**
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/create-go-plate)
|
|
6
|
+
[](https://github.com/Jeanpierregaba/create-go-plate/actions/workflows/test.yml)
|
|
7
|
+
[](https://nodejs.org)
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm create go-plate@latest mon-projet
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Une commande, et ton projet démarre avec tout ce qu'il faut pour que l'agent (Claude Code, Codex,
|
|
15
|
+
Cursor, Copilot, Gemini…) construise **la bonne application, proprement, sans perdre le fil** :
|
|
16
|
+
cadrage produit et technique, spécifications par fonctionnalité, mémoire entre les sessions,
|
|
17
|
+
garde-fous de sécurité et vérifications automatiques.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Sommaire
|
|
22
|
+
|
|
23
|
+
- [Pourquoi go-plate ?](#pourquoi-go-plate-)
|
|
24
|
+
- [Démarrage rapide](#démarrage-rapide)
|
|
25
|
+
- [Comment ça marche](#comment-ça-marche)
|
|
26
|
+
- [Ce qui est généré](#ce-qui-est-généré)
|
|
27
|
+
- [Les commandes de l'agent](#les-commandes-de-lagent)
|
|
28
|
+
- [Les garde-fous automatiques](#les-garde-fous-automatiques)
|
|
29
|
+
- [Options du générateur](#options-du-générateur)
|
|
30
|
+
- [Compatibilité](#compatibilité)
|
|
31
|
+
- [FAQ](#faq)
|
|
32
|
+
- [Contribuer](#contribuer)
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Pourquoi go-plate ?
|
|
37
|
+
|
|
38
|
+
Un agent de code écrit vite. Sans cadre, il écrit aussi vite **dans la mauvaise direction** :
|
|
39
|
+
|
|
40
|
+
| Sans cadrage | Avec go-plate |
|
|
41
|
+
|---|---|
|
|
42
|
+
| L'agent devine ce que tu veux construire | Un PRD et une spec par fonctionnalité, validés avant le code |
|
|
43
|
+
| Chaque session repart de zéro | Le contexte (tâches en cours, dernière session) est réinjecté automatiquement |
|
|
44
|
+
| Les choix techniques sont remis en cause en permanence | Chaque décision est tracée dans un ADR |
|
|
45
|
+
| Clés exposées, accès non contrôlés, dépendances inventées | Checklist sécurité, audit dédié, fichiers sensibles bloqués |
|
|
46
|
+
| « Ça marche » sans preuve | Lint, typecheck et tests lancés par l'agent, CI à chaque push |
|
|
47
|
+
|
|
48
|
+
go-plate ne choisit **aucune stack** à ta place : c'est l'agent qui te la propose pendant le
|
|
49
|
+
cadrage, en fonction de ton projet, et qui vérifie les versions à jour.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Démarrage rapide
|
|
54
|
+
|
|
55
|
+
### Prérequis
|
|
56
|
+
|
|
57
|
+
- [Node.js](https://nodejs.org) 20.16 ou plus récent
|
|
58
|
+
- Un agent de code — de préférence [Claude Code](https://claude.com/claude-code), qui profite de
|
|
59
|
+
toutes les fonctionnalités (voir [Compatibilité](#compatibilité))
|
|
60
|
+
- Git (recommandé)
|
|
61
|
+
|
|
62
|
+
### 1. Créer le projet
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
npm create go-plate@latest mon-projet
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Le générateur pose 4 questions (Claude Code, CI GitHub, fonctionnalités IA, git) puis crée le
|
|
69
|
+
dossier avec un premier commit. Pour accepter les choix par défaut :
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
npm create go-plate@latest mon-projet -- --yes
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 2. Cadrer le projet
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
cd mon-projet
|
|
79
|
+
claude
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Dans l'agent :
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
/cadrage
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
L'agent mène un entretien (4 questions maximum à la fois, avec des réponses proposées) et remplit
|
|
89
|
+
pour toi, étape par étape :
|
|
90
|
+
|
|
91
|
+
1. **Produit** — problème, utilisateurs, parcours, MVP, hors scope
|
|
92
|
+
2. **Architecture** — stack proposée et justifiée, versions vérifiées, ADR
|
|
93
|
+
3. **Design** — intention, design system, écrans, accessibilité
|
|
94
|
+
4. **Stress-test** — ce qui va casser, cas limites oubliés, sur-engineering
|
|
95
|
+
5. **Instructions de l'agent** — `AGENTS.md`
|
|
96
|
+
6. **Garde-fous** — règles, sécurité, stratégie de test
|
|
97
|
+
7. **Backlog** — `TASKS.md`
|
|
98
|
+
8. **Outillage** — CI, formatage automatique, variables d'environnement, serveurs MCP
|
|
99
|
+
9. **Squelette** — structure du code, qui compile et passe les tests à vide
|
|
100
|
+
|
|
101
|
+
Tu peux t'arrêter à tout moment : `/cadrage` reprend à la première étape non terminée.
|
|
102
|
+
|
|
103
|
+
### 3. Développer, une fonctionnalité à la fois
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
/spec inscription par email avec confirmation
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
L'agent crée `docs/specs/001-inscription/` avec la spec (le quoi), le plan (le comment) et la
|
|
110
|
+
liste des tâches. **Tu valides chaque étape avant qu'il écrive du code.**
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Comment ça marche
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
npm create go-plate une fois
|
|
118
|
+
│
|
|
119
|
+
▼
|
|
120
|
+
/cadrage ───────────────────────────── une fois : PRD, architecture, règles, backlog, squelette
|
|
121
|
+
│
|
|
122
|
+
▼
|
|
123
|
+
┌─► /spec <fonctionnalité> ─────────── spec → plan → tâches, validés par toi
|
|
124
|
+
│ │
|
|
125
|
+
│ ▼
|
|
126
|
+
│ implémentation tâche par tâche ── lint + typecheck + tests après chaque tâche, commit
|
|
127
|
+
│ │
|
|
128
|
+
│ ▼
|
|
129
|
+
│ relecture (sous-agent reviewer)
|
|
130
|
+
│ │
|
|
131
|
+
│ ▼
|
|
132
|
+
└── /fin-de-session ────────────────── TASKS.md + SESSION-LOG.md à jour
|
|
133
|
+
│
|
|
134
|
+
▼
|
|
135
|
+
session suivante ───────────────────── le hook SessionStart redonne le contexte à l'agent
|
|
136
|
+
|
|
137
|
+
avant la mise en production : /audit-securite
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Le principe : **les documents sont la mémoire du projet**, les skills sont les procédures, les
|
|
141
|
+
hooks et permissions sont les règles que l'agent ne peut pas contourner.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Ce qui est généré
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
mon-projet/
|
|
149
|
+
├── AGENTS.md instructions de l'agent — source unique, lue par tous les outils
|
|
150
|
+
├── CLAUDE.md importe AGENTS.md + spécificités Claude Code
|
|
151
|
+
├── TASKS.md avancement : en cours / à faire / terminé
|
|
152
|
+
├── README.md
|
|
153
|
+
├── .claude/
|
|
154
|
+
│ ├── skills/ /cadrage, /spec, /stress-test, /fin-de-session, /audit-securite
|
|
155
|
+
│ ├── agents/ sous-agents reviewer et test-writer
|
|
156
|
+
│ ├── hooks/ reprise de contexte, protection des fichiers, formatage
|
|
157
|
+
│ └── settings.json permissions et branchement des hooks
|
|
158
|
+
├── .mcp.json Context7 (doc à jour des bibliothèques), Playwright (navigateur)
|
|
159
|
+
├── .github/
|
|
160
|
+
│ ├── workflows/ci.yml CI à compléter pendant le cadrage
|
|
161
|
+
│ └── dependabot.yml mises à jour de sécurité automatiques
|
|
162
|
+
├── docs/
|
|
163
|
+
│ ├── PRD.md quoi construire et pourquoi
|
|
164
|
+
│ ├── ARCHITECTURE.md comment c'est construit
|
|
165
|
+
│ ├── DESIGN.md interface et expérience
|
|
166
|
+
│ ├── RULES.md interdits stricts
|
|
167
|
+
│ ├── SECURITY.md checklist sécurité
|
|
168
|
+
│ ├── TESTING.md définition de « fini »
|
|
169
|
+
│ ├── SESSION-LOG.md journal des sessions
|
|
170
|
+
│ ├── decisions/ ADR : une décision technique = un fichier
|
|
171
|
+
│ └── specs/ une spec par fonctionnalité (spec → plan → tâches)
|
|
172
|
+
├── src/ squelette créé à la fin du cadrage
|
|
173
|
+
├── .env.example
|
|
174
|
+
├── .editorconfig
|
|
175
|
+
└── .gitignore
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
En option (`--ai`) : `docs/AI.md` et `evals/` pour les applications qui appellent un LLM
|
|
179
|
+
(prompts versionnés, évaluations, coûts, injection de prompt).
|
|
180
|
+
|
|
181
|
+
Tous les fichiers sont des **modèles commentés** : chaque section explique ce qu'elle doit
|
|
182
|
+
contenir. Rien ne t'oblige à passer par l'agent pour les remplir.
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## Les commandes de l'agent
|
|
187
|
+
|
|
188
|
+
| Commande | Quand l'utiliser | Ce qu'elle fait |
|
|
189
|
+
|---|---|---|
|
|
190
|
+
| `/cadrage` | Au début du projet | Entretien guidé et remplissage de tous les documents, jusqu'au squelette du code |
|
|
191
|
+
| `/spec <description>` | Avant chaque fonctionnalité | Crée la spec, le plan et les tâches, à valider avant le code |
|
|
192
|
+
| `/stress-test [fichier]` | Après un document important | Relecture critique : risques, cas limites, sur-engineering, contradictions |
|
|
193
|
+
| `/fin-de-session` | À chaque arrêt | Met à jour l'avancement, le journal et les décisions |
|
|
194
|
+
| `/audit-securite [périmètre]` | Avant une mise en production | Vérifie la checklist sécurité dans le code réel, rapport classé par gravité |
|
|
195
|
+
|
|
196
|
+
Deux **sous-agents** complètent les skills :
|
|
197
|
+
|
|
198
|
+
- **`reviewer`** relit les changements (exactitude, sécurité, règles, tests, simplicité) sans
|
|
199
|
+
modifier le code.
|
|
200
|
+
- **`test-writer`** écrit les tests à partir de la spec, y compris avant l'implémentation pour
|
|
201
|
+
les parties critiques.
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## Les garde-fous automatiques
|
|
206
|
+
|
|
207
|
+
Avec Claude Code, ces règles sont **appliquées techniquement**, pas seulement demandées :
|
|
208
|
+
|
|
209
|
+
| Protection | Mécanisme |
|
|
210
|
+
|---|---|
|
|
211
|
+
| L'agent ne lit ni ne modifie les fichiers `.env`, clés et certificats (`.env.example` reste accessible) | Hook `PreToolUse` + permissions |
|
|
212
|
+
| Pas de `git push --force` ni de `git reset --hard` | Hook `PreToolUse` + permissions |
|
|
213
|
+
| Pas de modification manuelle des fichiers de lock ni du dossier `.git` | Hook `PreToolUse` |
|
|
214
|
+
| `git push`, `rm -rf`, `git clean`, `npm publish` demandent confirmation | Permissions |
|
|
215
|
+
| Chaque fichier modifié est formaté | Hook `PostToolUse` (formateur choisi pendant le cadrage) |
|
|
216
|
+
| Chaque session démarre avec le statut du cadrage, les tâches en cours et la dernière session | Hook `SessionStart` |
|
|
217
|
+
|
|
218
|
+
Les hooks sont de simples scripts Node, lisibles et modifiables dans `.claude/hooks/`.
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Options du générateur
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
npm create go-plate@latest [dossier] -- [options]
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
| Option | Effet |
|
|
229
|
+
|---|---|
|
|
230
|
+
| `-y`, `--yes` | Accepte les choix par défaut sans poser de question |
|
|
231
|
+
| `--no-claude` | Sans les fichiers propres à Claude Code (`CLAUDE.md`, hooks, permissions, `.mcp.json`) |
|
|
232
|
+
| `--no-ci` | Sans GitHub Actions ni Dependabot |
|
|
233
|
+
| `--ai` | Ajoute le module « fonctionnalités IA » |
|
|
234
|
+
| `--no-git` | Sans initialiser de dépôt git |
|
|
235
|
+
| `-f`, `--force` | Autorise un dossier cible non vide (les fichiers de même nom sont écrasés) |
|
|
236
|
+
| `-h`, `--help` | Affiche l'aide |
|
|
237
|
+
| `-v`, `--version` | Affiche la version |
|
|
238
|
+
|
|
239
|
+
Avec `npm create`, les options se placent après `--`. Les commandes suivantes sont équivalentes :
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
npx create-go-plate mon-projet --yes
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
pnpm create go-plate mon-projet --yes
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
```bash
|
|
250
|
+
yarn create go-plate mon-projet --yes
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
bun create go-plate mon-projet --yes
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## Compatibilité
|
|
260
|
+
|
|
261
|
+
| Agent | Niveau de prise en charge |
|
|
262
|
+
|---|---|
|
|
263
|
+
| **Claude Code** | Complet : `CLAUDE.md`, skills en commandes `/`, sous-agents, hooks, permissions, MCP |
|
|
264
|
+
| **Codex, Cursor, GitHub Copilot, Gemini CLI…** | `AGENTS.md` est lu nativement ; les skills sont des fichiers Markdown que l'agent peut suivre (« suis `.claude/skills/spec/SKILL.md` ») |
|
|
265
|
+
|
|
266
|
+
| Système | Remarque |
|
|
267
|
+
|---|---|
|
|
268
|
+
| macOS, Linux | Aucune configuration particulière |
|
|
269
|
+
| Windows | Installer [Git for Windows](https://git-scm.com/download/win) (les hooks passent par Git Bash). Pour le serveur MCP Playwright, remplacer `"command": "npx"` par `"command": "cmd"` et préfixer les `args` par `"/c", "npx"` dans `.mcp.json` |
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## FAQ
|
|
274
|
+
|
|
275
|
+
**Quelle stack technique est utilisée ?**
|
|
276
|
+
Aucune n'est imposée. Pendant `/cadrage`, l'agent propose une stack adaptée à ton projet et à ton
|
|
277
|
+
niveau, avec une alternative et les compromis, puis vérifie les versions actuelles dans la
|
|
278
|
+
documentation officielle.
|
|
279
|
+
|
|
280
|
+
**Je ne suis pas développeur, est-ce pour moi ?**
|
|
281
|
+
Oui : le cadrage est un entretien en langage courant, et l'agent justifie chaque choix technique.
|
|
282
|
+
Le cadre sert justement à éviter les pièges classiques des projets construits avec l'IA.
|
|
283
|
+
|
|
284
|
+
**Puis-je l'ajouter à un projet existant ?**
|
|
285
|
+
Oui, avec `--force` dans le dossier du projet, mais les fichiers de même nom (`README.md`,
|
|
286
|
+
`.gitignore`…) sont **écrasés**. Le plus sûr : générer dans un dossier à part, puis copier ce
|
|
287
|
+
dont tu as besoin.
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
npm create go-plate@latest go-plate-tmp -- --yes --no-git
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**Je n'ai pas besoin de tous les fichiers.**
|
|
294
|
+
Supprime-les : chaque document est indépendant. Pense seulement à retirer sa ligne dans le
|
|
295
|
+
tableau « Où ranger quoi » d'`AGENTS.md`.
|
|
296
|
+
|
|
297
|
+
**Le contenu est-il en anglais ?**
|
|
298
|
+
Non, tous les modèles sont en français. L'agent te répondra dans la langue de tes messages.
|
|
299
|
+
|
|
300
|
+
**Comment mettre à jour un projet déjà généré ?**
|
|
301
|
+
Le générateur ne sait pas mettre à jour un projet existant. Pour profiter d'une nouvelle version, génère
|
|
302
|
+
un projet temporaire et compare les fichiers qui t'intéressent (skills, hooks).
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## Contribuer
|
|
307
|
+
|
|
308
|
+
Les suggestions et corrections sont les bienvenues via les
|
|
309
|
+
[issues](https://github.com/Jeanpierregaba/create-go-plate/issues) et les pull requests.
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
git clone https://github.com/Jeanpierregaba/create-go-plate.git
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
cd create-go-plate && npm test
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
Essayer le générateur en local :
|
|
320
|
+
|
|
321
|
+
```bash
|
|
322
|
+
node bin/create.mjs /tmp/essai --yes
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
| Dossier | Contenu |
|
|
326
|
+
|---|---|
|
|
327
|
+
| `bin/create.mjs` | Le générateur (aucune dépendance, uniquement Node) |
|
|
328
|
+
| `template/` | Fichiers copiés dans tous les projets |
|
|
329
|
+
| `modules/claude/`, `modules/ci-github/`, `modules/ai/` | Fichiers copiés selon les options |
|
|
330
|
+
| `test/` | Tests (`node --test`) |
|
|
331
|
+
|
|
332
|
+
Le fichier `template/gitignore` est renommé en `.gitignore` à la génération, car npm ne publie
|
|
333
|
+
pas les fichiers `.gitignore`.
|
|
334
|
+
|
|
335
|
+
### Publier une version
|
|
336
|
+
|
|
337
|
+
1. Mettre à jour `CHANGELOG.md`.
|
|
338
|
+
2. `npm version patch` (ou `minor` / `major`).
|
|
339
|
+
3. `npm publish` — les tests sont relancés automatiquement avant la publication.
|
|
340
|
+
4. `git push --follow-tags`
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## Licence
|
|
345
|
+
|
|
346
|
+
[MIT](LICENSE) © 2026 Jeanpierregaba
|
package/bin/create.mjs
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Générateur : copie le cadrage de vibecoding dans un nouveau dossier projet.
|
|
3
|
+
// Aucune dépendance : uniquement des modules natifs de Node.
|
|
4
|
+
import { spawnSync } from "node:child_process";
|
|
5
|
+
import { cpSync, existsSync, readdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import readline from "node:readline/promises";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
import { parseArgs } from "node:util";
|
|
10
|
+
|
|
11
|
+
const PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
12
|
+
const { version } = JSON.parse(readFileSync(path.join(PACKAGE_ROOT, "package.json"), "utf8"));
|
|
13
|
+
|
|
14
|
+
const useColor = process.stdout.isTTY && !process.env.NO_COLOR;
|
|
15
|
+
const paint = (code) => (text) => (useColor ? `\x1b[${code}m${text}\x1b[0m` : text);
|
|
16
|
+
const bold = paint(1);
|
|
17
|
+
const dim = paint(2);
|
|
18
|
+
const green = paint(32);
|
|
19
|
+
const red = paint(31);
|
|
20
|
+
const cyan = paint(36);
|
|
21
|
+
|
|
22
|
+
const HELP = `
|
|
23
|
+
${bold("create-go-plate")} ${dim(`v${version}`)}
|
|
24
|
+
|
|
25
|
+
Crée un nouveau projet avec le cadrage pour développer avec un agent de code.
|
|
26
|
+
|
|
27
|
+
${bold("Usage")}
|
|
28
|
+
npm create go-plate@latest [dossier] -- [options]
|
|
29
|
+
npx create-go-plate [dossier] [options]
|
|
30
|
+
|
|
31
|
+
${bold("Options")}
|
|
32
|
+
-y, --yes Accepte les choix par défaut sans poser de question
|
|
33
|
+
--no-claude Sans les fichiers propres à Claude Code (CLAUDE.md, hooks, permissions, .mcp.json)
|
|
34
|
+
--no-ci Sans la CI GitHub Actions ni Dependabot
|
|
35
|
+
--ai Avec le module « fonctionnalités IA » (docs/AI.md, evals/)
|
|
36
|
+
--no-git Sans initialiser de dépôt git
|
|
37
|
+
-f, --force Autorise un dossier cible non vide (les fichiers existants sont écrasés)
|
|
38
|
+
-h, --help Affiche cette aide
|
|
39
|
+
-v, --version Affiche la version
|
|
40
|
+
`;
|
|
41
|
+
|
|
42
|
+
function fail(message) {
|
|
43
|
+
console.error(`\n${red("✖")} ${message}\n`);
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
let args;
|
|
48
|
+
try {
|
|
49
|
+
args = parseArgs({
|
|
50
|
+
allowPositionals: true,
|
|
51
|
+
allowNegative: true,
|
|
52
|
+
options: {
|
|
53
|
+
yes: { type: "boolean", short: "y", default: false },
|
|
54
|
+
claude: { type: "boolean" },
|
|
55
|
+
ci: { type: "boolean" },
|
|
56
|
+
ai: { type: "boolean" },
|
|
57
|
+
git: { type: "boolean" },
|
|
58
|
+
force: { type: "boolean", short: "f", default: false },
|
|
59
|
+
help: { type: "boolean", short: "h", default: false },
|
|
60
|
+
version: { type: "boolean", short: "v", default: false },
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
} catch (error) {
|
|
64
|
+
fail(`${error.message}\nLance avec --help pour voir les options.`);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const { values: flags, positionals } = args;
|
|
68
|
+
if (flags.help) {
|
|
69
|
+
console.log(HELP);
|
|
70
|
+
process.exit(0);
|
|
71
|
+
}
|
|
72
|
+
if (flags.version) {
|
|
73
|
+
console.log(version);
|
|
74
|
+
process.exit(0);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const interactive = process.stdin.isTTY && process.stdout.isTTY && !flags.yes;
|
|
78
|
+
const rl = interactive ? readline.createInterface({ input: process.stdin, output: process.stdout }) : null;
|
|
79
|
+
|
|
80
|
+
function cancel() {
|
|
81
|
+
console.log(`\n\n${dim("Annulé, aucun fichier créé.")}\n`);
|
|
82
|
+
process.exit(130);
|
|
83
|
+
}
|
|
84
|
+
rl?.on("SIGINT", cancel);
|
|
85
|
+
|
|
86
|
+
// Ctrl+D (fin de saisie) pendant une question : on annule proprement au lieu de planter.
|
|
87
|
+
async function ask(prompt) {
|
|
88
|
+
try {
|
|
89
|
+
return (await rl.question(prompt)).trim();
|
|
90
|
+
} catch {
|
|
91
|
+
cancel();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async function askText(question, fallback) {
|
|
96
|
+
if (!rl) return fallback;
|
|
97
|
+
const answer = await ask(`${cyan("?")} ${question} ${dim(`(${fallback})`)} `);
|
|
98
|
+
return answer || fallback;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async function askYesNo(question, fallback) {
|
|
102
|
+
if (!rl) return fallback;
|
|
103
|
+
const hint = fallback ? "O/n" : "o/N";
|
|
104
|
+
const answer = (await ask(`${cyan("?")} ${question} ${dim(`(${hint})`)} `)).toLowerCase();
|
|
105
|
+
if (!answer) return fallback;
|
|
106
|
+
return ["o", "oui", "y", "yes"].includes(answer);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Une option passée en ligne de commande l'emporte ; sinon on pose la question.
|
|
110
|
+
const choose = (flag, question, fallback) => (flag !== undefined ? flag : askYesNo(question, fallback));
|
|
111
|
+
|
|
112
|
+
console.log(`\n${bold("create-go-plate")} ${dim(`v${version}`)}\n`);
|
|
113
|
+
|
|
114
|
+
const targetArg = positionals[0] ?? (await askText("Dossier du projet :", "mon-projet"));
|
|
115
|
+
const targetDir = path.resolve(process.cwd(), targetArg);
|
|
116
|
+
const projectName = path.basename(targetDir);
|
|
117
|
+
|
|
118
|
+
if (existsSync(targetDir) && readdirSync(targetDir).length > 0 && !flags.force) {
|
|
119
|
+
rl?.close();
|
|
120
|
+
fail(`Le dossier ${bold(targetArg)} existe et n'est pas vide. Choisis un autre nom ou ajoute --force.`);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const options = {
|
|
124
|
+
claude: await choose(flags.claude, "Utiliser Claude Code (CLAUDE.md, hooks, permissions, MCP) ?", true),
|
|
125
|
+
ci: await choose(flags.ci, "Ajouter la CI GitHub Actions et Dependabot ?", true),
|
|
126
|
+
ai: await choose(flags.ai, "L'application aura-t-elle des fonctionnalités IA (appels à un LLM) ?", false),
|
|
127
|
+
git: await choose(flags.git, "Initialiser un dépôt git ?", true),
|
|
128
|
+
};
|
|
129
|
+
rl?.close();
|
|
130
|
+
|
|
131
|
+
// 1. Copie de la base, puis des modules choisis.
|
|
132
|
+
const copy = (from) =>
|
|
133
|
+
cpSync(path.join(PACKAGE_ROOT, from), targetDir, { recursive: true, force: true });
|
|
134
|
+
|
|
135
|
+
copy("template");
|
|
136
|
+
if (options.claude) copy("modules/claude");
|
|
137
|
+
if (options.ci) copy("modules/ci-github");
|
|
138
|
+
if (options.ai) copy("modules/ai");
|
|
139
|
+
|
|
140
|
+
// 2. npm ne publie pas les fichiers .gitignore : le template le livre sous le nom "gitignore".
|
|
141
|
+
const shippedGitignore = path.join(targetDir, "gitignore");
|
|
142
|
+
if (existsSync(shippedGitignore)) renameSync(shippedGitignore, path.join(targetDir, ".gitignore"));
|
|
143
|
+
|
|
144
|
+
// 3. Ajustements selon les choix.
|
|
145
|
+
function edit(relativePath, transform) {
|
|
146
|
+
const file = path.join(targetDir, relativePath);
|
|
147
|
+
if (!existsSync(file)) return;
|
|
148
|
+
writeFileSync(file, transform(readFileSync(file, "utf8")));
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
edit("README.md", (text) => text.replaceAll("{{PROJECT_NAME}}", projectName));
|
|
152
|
+
|
|
153
|
+
if (!options.claude) {
|
|
154
|
+
// Sans les permissions et hooks de Claude Code, ces règles ne sont plus bloquées techniquement.
|
|
155
|
+
edit("docs/RULES.md", (text) => text.replaceAll(" [bloqué]", ""));
|
|
156
|
+
edit("README.md", (text) => text.replace(/^\| `\.mcp\.json` .*\n/m, ""));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (options.ai) {
|
|
160
|
+
edit("AGENTS.md", (text) =>
|
|
161
|
+
text.replace(
|
|
162
|
+
/^(\| Charte visuelle.*\n)/m,
|
|
163
|
+
"$1| Fonctionnalités IA : prompts, évals, coûts | `docs/AI.md`, `evals/` |\n"
|
|
164
|
+
)
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// 4. Dépôt git avec un premier commit (ignoré proprement si git n'est pas disponible).
|
|
169
|
+
let gitStatus = "non initialisé";
|
|
170
|
+
if (options.git && !existsSync(path.join(targetDir, ".git"))) {
|
|
171
|
+
const git = (...gitArgs) => spawnSync("git", gitArgs, { cwd: targetDir, stdio: "ignore" }).status === 0;
|
|
172
|
+
if (!git("init", "-q")) {
|
|
173
|
+
gitStatus = "échec (git est-il installé ?)";
|
|
174
|
+
} else if (git("add", "-A") && git("commit", "-q", "-m", "chore: initialisation depuis create-go-plate")) {
|
|
175
|
+
gitStatus = "initialisé avec un premier commit";
|
|
176
|
+
} else {
|
|
177
|
+
gitStatus = "initialisé (premier commit impossible : configure user.name / user.email)";
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// 5. Récapitulatif.
|
|
182
|
+
const fromCwd = path.relative(process.cwd(), targetDir) || ".";
|
|
183
|
+
const relativeTarget = fromCwd.startsWith("..") ? targetDir : fromCwd;
|
|
184
|
+
const check = (on) => (on ? green("✔") : dim("–"));
|
|
185
|
+
console.log(`
|
|
186
|
+
${green("✔")} Projet créé dans ${bold(relativeTarget)}
|
|
187
|
+
|
|
188
|
+
${check(true)} Cadrage (AGENTS.md, docs/, skills, sous-agents)
|
|
189
|
+
${check(options.claude)} Claude Code (CLAUDE.md, hooks, permissions, .mcp.json)
|
|
190
|
+
${check(options.ci)} CI GitHub Actions + Dependabot
|
|
191
|
+
${check(options.ai)} Module IA (docs/AI.md, evals/)
|
|
192
|
+
${check(options.git)} Git : ${gitStatus}
|
|
193
|
+
|
|
194
|
+
${bold("Prochaines étapes")}
|
|
195
|
+
${cyan(`cd ${relativeTarget}`)}
|
|
196
|
+
${cyan("claude")} ${dim("(ou ton agent de code)")}
|
|
197
|
+
${cyan("/cadrage")} ${dim("l'agent te pose les questions et remplit le cadrage")}
|
|
198
|
+
`);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# AI — Fonctionnalités basées sur un modèle de langage
|
|
2
|
+
|
|
3
|
+
<!-- À REMPLIR si l'application appelle un LLM. Supprime ce fichier sinon. -->
|
|
4
|
+
|
|
5
|
+
## Usages
|
|
6
|
+
<!-- Pour chaque fonctionnalité IA : ce qu'elle fait, entrée, sortie attendue, modèle utilisé et pourquoi. -->
|
|
7
|
+
|
|
8
|
+
## Prompts
|
|
9
|
+
<!-- Où sont stockés les prompts (fichiers versionnés, pas des chaînes éparpillées dans le code),
|
|
10
|
+
et règle : toute modification de prompt est suivie d'une exécution des évals. -->
|
|
11
|
+
|
|
12
|
+
## Évaluations
|
|
13
|
+
<!-- Comment on mesure la qualité : jeu de cas dans evals/, critères, seuil minimal. Voir evals/README.md. -->
|
|
14
|
+
|
|
15
|
+
## Sécurité
|
|
16
|
+
<!-- Séparation instructions / données externes (injection de prompt), outils accessibles au modèle,
|
|
17
|
+
données envoyées au fournisseur (RGPD), sorties affichées sans échappement. -->
|
|
18
|
+
|
|
19
|
+
## Coûts et limites
|
|
20
|
+
<!-- Coût estimé par appel et par utilisateur, limites par utilisateur, cache, comportement si le fournisseur est indisponible. -->
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# evals/
|
|
2
|
+
|
|
3
|
+
Jeux de cas pour mesurer la qualité des fonctionnalités IA (voir `docs/AI.md`).
|
|
4
|
+
|
|
5
|
+
Un fichier par fonctionnalité, par exemple `resume-article.jsonl` : une ligne par cas avec
|
|
6
|
+
l'entrée, et soit la sortie attendue, soit les critères qu'elle doit respecter.
|
|
7
|
+
Inclure des cas difficiles et des tentatives d'injection de prompt.
|
|
8
|
+
|
|
9
|
+
À lancer après chaque modification de prompt ou de modèle ; le résultat doit rester au-dessus
|
|
10
|
+
du seuil défini dans `docs/AI.md`.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Mises à jour automatiques des dépendances. Ajoute l'écosystème de ta stack pendant /cadrage
|
|
2
|
+
# (npm, pip, cargo, gomod…) : https://docs.github.com/code-security/dependabot
|
|
3
|
+
version: 2
|
|
4
|
+
updates:
|
|
5
|
+
- package-ecosystem: github-actions
|
|
6
|
+
directory: /
|
|
7
|
+
schedule:
|
|
8
|
+
interval: weekly
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Intégration continue — à compléter pendant /cadrage (étape « Outillage »).
|
|
2
|
+
# Tant que ce n'est pas fait, la CI affiche seulement un avertissement.
|
|
3
|
+
name: CI
|
|
4
|
+
|
|
5
|
+
on:
|
|
6
|
+
push:
|
|
7
|
+
branches: [main]
|
|
8
|
+
pull_request:
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
verify:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- name: CI non configurée
|
|
20
|
+
run: echo "::warning::La CI n'est pas encore configurée — lance /cadrage (étape Outillage)."
|
|
21
|
+
|
|
22
|
+
# --- Exemple Node.js (à adapter) ---
|
|
23
|
+
# - uses: actions/setup-node@v4
|
|
24
|
+
# with:
|
|
25
|
+
# node-version: 22
|
|
26
|
+
# cache: npm
|
|
27
|
+
# - run: npm ci
|
|
28
|
+
# - run: npm run lint
|
|
29
|
+
# - run: npm run typecheck
|
|
30
|
+
# - run: npm test
|
|
31
|
+
# - run: npm run build
|
|
32
|
+
# - run: npm audit --audit-level=high
|
|
33
|
+
|
|
34
|
+
# --- Exemple Python (à adapter) ---
|
|
35
|
+
# - uses: astral-sh/setup-uv@v6
|
|
36
|
+
# - run: uv sync --frozen
|
|
37
|
+
# - run: uv run ruff check .
|
|
38
|
+
# - run: uv run pytest
|