- 08-01 (W1): HytaleRecentArticles.vue scaffold + injection hytale.vue + i18n - 08-02 (W2): article tutorial how-to-build-your-first-hytale-plugin FR+EN - 08-03 (W2): article positionnement hytale-plugin-development-2026 FR+EN
15 KiB
phase, plan, type, wave, depends_on, files_modified, autonomous, requirements, tags, must_haves
| phase | plan | type | wave | depends_on | files_modified | autonomous | requirements | tags | must_haves | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 08-content-cocon-semantique | 02 | execute | 2 |
|
|
true |
|
|
|
Purpose: Premier article du cocon sémantique. Anchor text SEO-friendly "commissioner un plugin Hytale" / "commission a Hytale plugin" renvoyant vers l'offre service. Intent transactionnel-info.
Output: 2 fichiers markdown (FR + EN), même slug, tags ['hytale', 'tutorial', 'kotlin'], publiés (draft: false).
<execution_context> @$HOME/.claude/get-shit-done/workflows/execute-plan.md @$HOME/.claude/get-shit-done/templates/summary.md </execution_context>
@.planning/PROJECT.md @.planning/ROADMAP.md @.planning/phases/08-content-cocon-semantique/08-CONTEXT.md @.planning/phases/08-content-cocon-semantique/08-PATTERNS.md @.planning/phases/05-nuxt-content-setup-renderer/05-CONTEXT.md @content/fr/blog/test-kotlin-syntax.md<editorial_brief>
Slug (D-01, D-03) : how-to-build-your-first-hytale-plugin — identique FR+EN.
Titre FR : "Créer son premier plugin Hytale : guide pas à pas" Titre EN : "How to build your first Hytale plugin: a step-by-step guide"
Description FR : "Apprends à coder ton premier plugin Hytale en Kotlin : setup, event listener, et commande custom — avec le code source complet." Description EN : "Learn to build your first Hytale plugin in Kotlin: project setup, event listener, custom command — with the complete source code."
Tags : ["hytale", "tutorial", "kotlin"]
Date : "2026-04-22"
Draft : false
Image : champ omis (fallback /og-blog-default.jpg Phase 7 D-05 s'applique automatiquement).
Champ updated : omis (D-06).
Ton (D-07) : première personne ("je", "I"), technique mais accessible, concret. Voix Killian dev 7 ans, pas corporate. Éviter jargon non-expliqué. Inclure anecdotes pratiques ("la première fois que j'ai lancé...").
Longueur cible : 1000-1300 mots par version.
Outline recommandé (6-8 sections, ~200 mots chacune) :
-
Intro — pourquoi Hytale, pourquoi maintenant (~150 mots)
- Le contexte : Hytale API en 2026, public indie + serveurs custom, opportunité dev.
- Ce qu'on va construire : un plugin de base qui écoute un event et ajoute une commande.
- Placement naturel du 1er lien
/hytale: "Si tu préfères faire commissioner un plugin Hytale plutôt que le coder toi-même, c'est une option." (FR) / "If you'd rather commission a Hytale plugin instead of coding it yourself, that works too." (EN)
-
Prérequis (~100 mots)
- JDK 17+ (ou version actuelle Hytale SDK 2026), IntelliJ IDEA Community, Gradle, connaissances Kotlin basiques.
- Fichier
build.gradle.ktsminimal (snippet court optionnel).
-
Scaffold du projet (~200 mots)
- Arborescence
src/main/kotlin/com/example/myplugin/MyPlugin.kt. plugin.yml/plugin.toml(selon convention Hytale 2026).- Petit exemple de manifest.
- Arborescence
-
Premier event listener — le cœur du plugin (~250 mots) — BLOC CODE KOTLIN OBLIGATOIRE ici :
package com.example.myplugin import io.hytale.api.HytalePlugin import io.hytale.api.event.EventHandler import io.hytale.api.event.player.PlayerJoinEvent class MyPlugin : HytalePlugin() { override fun onEnable() { logger.info("MyPlugin enabled") server.events.register(this) } @EventHandler fun onPlayerJoin(event: PlayerJoinEvent) { event.player.sendMessage("Welcome, ${event.player.name}!") } }- Explication ligne par ligne :
onEnable, registration, annotation handler, accèsevent.player. - Note : l'API exacte 2026 peut varier — préciser "exemple conforme au SDK public 2026, adapter selon la doc officielle au moment de la lecture".
- Explication ligne par ligne :
-
Ajouter une commande custom (~200 mots) — 2e bloc code court :
@Command("hello") fun onHelloCommand(sender: CommandSender, args: List<String>) { sender.sendMessage("Hello from MyPlugin!") }- Où placer dans la classe, comment tester en jeu.
-
Build + deploy local (~150 mots)
./gradlew build- Copier le JAR dans
plugins/, lancer le serveur. - Placement naturel du 2e lien
/hytale(optionnel, 1 suffit) : "Si tu veux déployer un plugin plus ambitieux et que tu préfères déléguer, tu peux commissioner un plugin Hytale sur-mesure." (FR)
-
Prochaines étapes (~150 mots)
- Suggestions : écouter d'autres events, persister des données, optimiser perf.
- Liens externes vers doc Hytale (ne PAS ajouter en Wave 2 — Claude peut si source connue, sinon omettre).
-
Conclusion (~100 mots)
- Résumé, encouragement.
Liens internes — règle absolue (D-08, D-09) :
- Version FR : au moins 1 lien markdown
](/hytale)inline dans la prose. Anchor text en français naturel. Idéalement 2 liens (intro + build section). - Version EN : au moins 1 lien markdown
](/en/hytale)inline. Anchor text en anglais naturel. Path commence par/en/(préfixe i18n explicite). - NE PAS utiliser
localePath()ou<NuxtLink>en markdown — hardcode des paths.
Bloc code Kotlin (D-05) : au moins 1 bloc ```kotlin réaliste (pas pseudo-code — signatures API, imports cohérents). L'exemple onPlayerJoin ci-dessus satisfait l'exigence minimale. Un 2e bloc (commande) est bonus.
Frontmatter exact FR :
---
title: "Créer son premier plugin Hytale : guide pas à pas"
description: "Apprends à coder ton premier plugin Hytale en Kotlin : setup, event listener, et commande custom — avec le code source complet."
date: "2026-04-22"
tags: ["hytale", "tutorial", "kotlin"]
draft: false
---
Frontmatter exact EN :
---
title: "How to build your first Hytale plugin: a step-by-step guide"
description: "Learn to build your first Hytale plugin in Kotlin: project setup, event listener, custom command — with the complete source code."
date: "2026-04-22"
tags: ["hytale", "tutorial", "kotlin"]
draft: false
---
</editorial_brief>
Task 1: Rédiger version FR de l'article tutorial content/fr/blog/how-to-build-your-first-hytale-plugin.md - content/fr/blog/test-kotlin-syntax.md (pattern frontmatter + code block + callouts MDC) - .planning/phases/08-content-cocon-semantique/08-CONTEXT.md §D-01, D-04, D-05, D-06, D-07, D-08 - .planning/phases/08-content-cocon-semantique/08-PATTERNS.md §"content/{fr,en}/blog/..." - Section `` ci-dessus (outline complet) Créer `content/fr/blog/how-to-build-your-first-hytale-plugin.md`.Frontmatter exact (copier depuis <editorial_brief>) — draft: false, tags ["hytale", "tutorial", "kotlin"], date "2026-04-22", pas de champ image, pas de champ updated.
Corps de l'article : suivre l'outline 8 sections du brief éditorial, ton première personne (je/moi/mon), concret, 1000-1300 mots.
Exigences dures non-négociables :
- Au moins 1 bloc ```kotlin avec imports + classe + event handler (réaliste, pas pseudo-code). Voir exemple exact dans le brief §section 4. Un 2e bloc court pour la commande est recommandé.
- Au moins 1 lien markdown inline
](/hytale)— path en dur, paslocalePath(). Anchor text français naturel, ex: "commissioner un plugin Hytale sur-mesure". Idéalement 2 occurrences (intro + build section). - Pas de champ
image:au frontmatter. Pas de champupdated. - Respect strict du schema Zod blog_fr (Phase 5) : les champs non déclarés sont strippés — ne pas inventer.
Interdits :
- Pseudo-code Kotlin (doit compiler conceptuellement).
<NuxtLink>oulocalePath()dans le markdown.- Liens absolus
https://killiandalcin.fr/hytale— utiliser path relatif/hytale. - Contenu AI-slop générique ("dans ce guide, nous allons explorer...") — voix Killian concrète.
Style Markdown :
- Titres
##pour les 8 sections (pas de#qui est réservé au title frontmatter). - Code inline avec backticks pour noms de classes/méthodes.
- Callouts
::alert{type="tip"}ou::alert{type="info"}optionnels si pertinent (pattern Phase 5 MDC). pnpm typecheck- Fichier existe :
test -f content/fr/blog/how-to-build-your-first-hytale-plugin.md grep "draft: false" content/fr/blog/how-to-build-your-first-hytale-plugin.mdpassegrep -E "tags:.*hytale" content/fr/blog/how-to-build-your-first-hytale-plugin.mdpasse (ou check YAML array form)grep -c '\](/hytale)' content/fr/blog/how-to-build-your-first-hytale-plugin.md≥ 1grep -c '```kotlin' content/fr/blog/how-to-build-your-first-hytale-plugin.md≥ 1- Mots ≥ 800 :
wc -w content/fr/blog/how-to-build-your-first-hytale-plugin.md≥ 800 pnpm typecheckexit 0 (validation Zod schema blog_fr passe)
- Fichier existe :
Frontmatter exact :
---
title: "How to build your first Hytale plugin: a step-by-step guide"
description: "Learn to build your first Hytale plugin in Kotlin: project setup, event listener, custom command — with the complete source code."
date: "2026-04-22"
tags: ["hytale", "tutorial", "kotlin"]
draft: false
---
Corps : équivalent à la version FR (mêmes 8 sections, même outline, même blocs code Kotlin identiques — les commentaires code peuvent rester en anglais dans les deux versions).
Règle critique liens internes (D-09) :
- Version EN : lien vers
/en/hytale(préfixe explicite), PAS/hytale. Exemple :[commission a Hytale plugin](/en/hytale). - Au moins 1 occurrence
](/en/hytale)— idéalement 2. - Path en dur dans le markdown. Pas de
localePath().
Longueur : 1000-1300 mots. Voix première personne ("I", "my first plugin"), ton technique accessible.
Blocs code : mêmes snippets Kotlin que la version FR (les imports et signatures API n'ont pas à être traduits). Les explications textuelles autour doivent être en anglais.
Interdits identiques à Task 1.
pnpm typecheck
- Fichier existe
- grep "draft: false" content/en/blog/how-to-build-your-first-hytale-plugin.md passe
- grep -E "tags:.*hytale" content/en/blog/how-to-build-your-first-hytale-plugin.md passe
- grep -c '\](/en/hytale)' content/en/blog/how-to-build-your-first-hytale-plugin.md ≥ 1
- grep -c '```kotlin' content/en/blog/how-to-build-your-first-hytale-plugin.md ≥ 1
- Mots ≥ 800
- pnpm typecheck exit 0
- Run pnpm dev puis curl http://localhost:3000/blog/how-to-build-your-first-hytale-plugin → 200 + HTML contient titre FR
- curl http://localhost:3000/en/blog/how-to-build-your-first-hytale-plugin → 200 + HTML contient titre EN
- curl http://localhost:3000/hytale → HTML contient section "Articles récents" + lien vers le slug (l'article Plan 08-01 est maintenant alimenté)
<threat_model>
Trust Boundaries
| Boundary | Description |
|---|---|
| markdown author → Zod schema → SSR | Contenu statique rédigé par dev, Zod-validé Phase 5, aucun user input |
STRIDE Threat Register
| Threat ID | Category | Component | Disposition | Mitigation Plan |
|---|---|---|---|---|
| T-08-04 | T (Tampering) | frontmatter YAML | mitigate | Schema Zod blog_fr/blog_en strip les champs inconnus, typecheck rattrape les erreurs |
| T-08-05 | I (Info Disclosure) | lien inline | accept | Les paths /hytale / /en/hytale sont publics, pas de leak |
| T-08-06 | S (Spoofing) | auteur article | accept | Pas de champ author user-controlled — author implicite Killian via schema.org Phase 7 |
| </threat_model> |
<success_criteria>
- 2 articles
.mdpubliés (draft: false), mêmes slugs, frontmatter Zod-valide - Cocon sémantique : chaque article a ≥1 lien vers
/hytale(locale-aware, paths en dur) - Bloc code Kotlin réaliste (pas pseudo-code) dans chaque version
- Minimum 800 mots par version, cible 1000-1300
- Section "Articles récents" sur /hytale (livrée Plan 08-01) affiche cet article après deploy </success_criteria>