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.
Files changed (43) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/LICENSE +21 -0
  3. package/README.md +345 -2
  4. package/bin/create.mjs +198 -0
  5. package/modules/ai/docs/AI.md +20 -0
  6. package/modules/ai/evals/README.md +10 -0
  7. package/modules/ci-github/.github/dependabot.yml +8 -0
  8. package/modules/ci-github/.github/workflows/ci.yml +38 -0
  9. package/modules/claude/.claude/hooks/format.mjs +37 -0
  10. package/modules/claude/.claude/hooks/lib.mjs +32 -0
  11. package/modules/claude/.claude/hooks/protect-files.mjs +69 -0
  12. package/modules/claude/.claude/hooks/session-start.mjs +50 -0
  13. package/modules/claude/.claude/settings.json +61 -0
  14. package/modules/claude/.mcp.json +12 -0
  15. package/modules/claude/CLAUDE.md +13 -0
  16. package/package.json +40 -4
  17. package/template/.claude/agents/reviewer.md +25 -0
  18. package/template/.claude/agents/test-writer.md +19 -0
  19. package/template/.claude/skills/audit-securite/SKILL.md +23 -0
  20. package/template/.claude/skills/cadrage/SKILL.md +81 -0
  21. package/template/.claude/skills/fin-de-session/SKILL.md +28 -0
  22. package/template/.claude/skills/spec/SKILL.md +36 -0
  23. package/template/.claude/skills/stress-test/SKILL.md +25 -0
  24. package/template/.editorconfig +18 -0
  25. package/template/.env.example +7 -0
  26. package/template/AGENTS.md +98 -0
  27. package/template/README.md +62 -0
  28. package/template/TASKS.md +16 -0
  29. package/template/docs/ARCHITECTURE.md +38 -0
  30. package/template/docs/DESIGN.md +37 -0
  31. package/template/docs/PRD.md +38 -0
  32. package/template/docs/RULES.md +31 -0
  33. package/template/docs/SECURITY.md +43 -0
  34. package/template/docs/SESSION-LOG.md +15 -0
  35. package/template/docs/TESTING.md +34 -0
  36. package/template/docs/decisions/0000-template.md +16 -0
  37. package/template/docs/decisions/README.md +8 -0
  38. package/template/docs/specs/README.md +12 -0
  39. package/template/docs/specs/_template/plan.md +27 -0
  40. package/template/docs/specs/_template/spec.md +23 -0
  41. package/template/docs/specs/_template/tasks.md +8 -0
  42. package/template/gitignore +30 -0
  43. 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
- # Temporary Holding Version
1
+ # create-go-plate
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **Le point de départ structuré pour développer une application avec un agent de code.**
4
+
5
+ [![npm](https://img.shields.io/npm/v/create-go-plate?color=cb3837&logo=npm)](https://www.npmjs.com/package/create-go-plate)
6
+ [![Tests](https://github.com/Jeanpierregaba/create-go-plate/actions/workflows/test.yml/badge.svg)](https://github.com/Jeanpierregaba/create-go-plate/actions/workflows/test.yml)
7
+ [![Node](https://img.shields.io/node/v/create-go-plate?logo=node.js&logoColor=white)](https://nodejs.org)
8
+ [![Licence MIT](https://img.shields.io/npm/l/create-go-plate)](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