astro-site
Logique de décision pour les projets Astro statiques dans cet environnement. Objectif : maintenir la cohérence des nouveaux sites avec la lignée astro-template et éviter les pièges récurrents en SEO/build.
Déclencheurs
Chargez cette compétence si l'UN des éléments suivants est présent :
- Fichiers :
astro.config.{mjs,ts,js},src/content.config.ts,src/content/, fichiers*.astro - Dépendances :
astro,@astrojs/mdx,@astrojs/sitemap,@astrojs/rss,@tailwindcss/vite,astro-custom-toc - Mentions utilisateur : astro, content collection, sitemap, MDX, RSS, Tailwind v4, WP migration, redirect, getCollection,
<Image>
Signature de pile canonique
Les projets Astro de cette lignée partagent une pile restreinte — confirmez avant de supposer :
"astro": "^5.x"
"@astrojs/mdx", "@astrojs/sitemap", "@astrojs/rss" # toujours
"@tailwindcss/vite", "tailwindcss": "^4.x" # Tailwind v4 via le plugin Vite (PAS v3 PostCSS)
"astro-custom-toc" # généralement
"zod": "^4.x" # schémas de contenu
"@astrojs/check" # vérification de types
Si le projet a @astrojs/cloudflare, @astrojs/netlify, @astrojs/vercel, ou @astrojs/node, il s'agit d'un projet Astro rendu côté serveur — la plupart des règles ci-dessous s'appliquent toujours, mais vérifiez d'abord output: dans astro.config.mjs.
Disposition canonique de src/
src/
components/ # composants .astro / .ts
config/ # configuration du site (nav, marque, pied de page)
content/
blog/
services/ # ou locations/, team/, projects/, etc.
team/ # auteurs, référencés depuis blog via reference('team')
content.config.ts # schémas Zod pour chaque collection
data/ # fichiers de données statiques (.ts/.json)
layouts/ # mises en page de base + par type de page
pages/ # routes
styles/
utils/
public/ # actifs statiques, robots.txt, favicon
prd/PRD.md # exigences produit (convention du modèle)
Lors de l'ajout d'un nouveau type de contenu, ajoutez d'abord le schéma dans src/content.config.ts, puis ajoutez le répertoire et la première entrée. La couche de contenu d'Astro échoue au build si le répertoire existe mais pas le schéma.
Playbooks
Ajouter une collection de contenu
- Modifiez
src/content.config.ts— ajoutez un blocdefineCollectionavecloader: glob(...)et un schéma Zod. - Utilisez
reference('<autre-collection>')pour les références croisées (ex : article de blog → auteur de l'équipe). - Utilisez
z.coerce.date()pourpubDateafin que les chaînes frontmatter soient analysées correctement. - Rendez les champs facultatifs explicites avec
.optional()— Astro v5 est strict ; les champs obligatoires manquants font échouer le build. - Exécutez
npm run check(=astro check) après les modifications de schéma ; il détecte les incohérences schéma/données avant le build. - Référence :
astro-template/src/content.config.tsest l'exemple canonique (blog + équipe avecreference()).
Ajouter une page ou une route
- Nouvelle page →
src/pages/<route>.astroousrc/pages/<route>/index.astro. Le routage Astro est basé sur le système de fichiers. - Si la page doit être exclue du sitemap (page de remerciement, 404, doublons de pagination), mettez à jour le filtre
sitemap()dansastro.config.mjs— voir "Discipline du sitemap" ci-dessous. - Si vous remplacez ou déplacez un chemin, ajoutez une redirection dans
astro.config.mjs(redirects: { '/old': '/new' }). Ne comptez pas sur les 404. - Pour les routes dynamiques (
[slug].astro), implémentezgetStaticPaths()et lisez les collections viagetCollection('<nom>').
Discipline du sitemap (piège récurrent)
Chaque projet de cette lignée filtre le sitemap. Modèle :
sitemap({
filter: (page) => {
const path = new URL(page).pathname;
// Pages de pagination en double
if (/\/blog\/\d+\/$/.test(path)) return false;
if (/\/blog\/tags\/[^/]+\/\d+\/$/.test(path)) return false;
if (/\/blog\/categories\/[^/]+\/\d+\/$/.test(path)) return false;
// Pages sans indexation
if (path === '/thank-you/') return false;
if (path === '/404/') return false;
return true;
},
changefreq: 'weekly',
priority: 0.7,
lastmod: new Date(),
})
Lors de l'ajout de routes paginées (tags, catégories, archives annuelles), étendez le filtre en même temps. Sinon, le sitemap se remplit de /blog/2/, /blog/3/, etc. et dilue le SEO.
Migration WordPress (cas d'usage récurrent)
Deux projets de cette lignée ont migré depuis WordPress (arp-astro, gkn-static). Le modèle :
- Redirections — chaque ancienne URL WP a besoin d'une entrée
redirects:dansastro.config.mjs. Modèles de chemins WP courants :/feed,/feed/atom,/?p=N,/category/...,/tag/...,/<slug>(règles de réécriture WP), et les chemins singuliers/service/...ou/location/.... - Slash final — définissez
trailingSlash: 'always'si le site WP utilisait des slashes finaux, pour garder les URL canoniques stables. Des slashes finaux incompatibles brisent les liens entrants et les classements de recherche. - Scripts de migration —
gkn-staticascripts/migrate/{parse,transform,extract,media,redirects,validate}.tspiloté parnpm run migrate:all. Si vous commencez une nouvelle migration WP, copiez cette structure de script plutôt que d'improviser. - Validez avant le lancement : lancez un crawl de l'ancien site, diffèrez-le avec le nouveau sitemap, confirmez que chaque ancienne URL résout ou redirige.
Pièges Tailwind v4 (cette lignée est en v4)
- Le plugin est
@tailwindcss/vite, PAS le plugin v3 PostCSS. N'ajoutez paspostcss.config.js. - La configuration vit dans le CSS via des blocs
@theme { ... }, pastailwind.config.js. Certains agents ajoutent par réflexe un fichier de configuration de style v3 — ne le faites pas. @tailwindcss/typographyfonctionne en v4 mais est configuré différemment — vérifiez lessrc/styles/existants avant d'ajouter.- Les noms de classes se transfèrent majoritairement depuis v3, mais certains noms d'utilitaires ont changé (ex : échelle d'ombre). Lorsque vous portez des exemples v3, vérifiez dans la documentation v4.
Images
astro:assets d'Astro v5 est le bon outil — import { Image } from 'astro:assets' et passez un actif importé (pas un chemin de chaîne). Pour les images du frontmatter de collection, utilisez image() dans le schéma Zod :
schema: ({ image }) => z.object({
cover: image(),
...
})
Cela vous donne automatiquement width/height/format et permet à la pipeline de build d'optimiser.
Build, check et tests
npm run check(=astro check) — vérifie les types.astro+ les schémas de contenu. Exécutez avant chaque PR.npm run build— strict ; échoue en cas de références de collection cassées, frontmatter obligatoire manquant, liens cassés dans MDX.npm run test— Vitest avechappy-dom; principalement des tests unitaires pour les utilitaires, pas le rendu des pages.npm run dev— HMR. Les modifications de schéma de contenu nécessitent parfois un redémarrage complet, pas seulement HMR.
Beads (suivi des problèmes) — notez la version
Ces projets utilisent bd (beads legacy), pas br (beads_rust). Si vous mettez à jour des documents ou commandes de workflow, la compétence bd-to-br-migration s'applique — mais ne migrez pas sauf demande explicite, car le reste des outils du projet attend bd.
Drapeaux rouges — arrêtez-vous et demandez
- Ajout de
tailwind.config.jsoupostcss.config.js— c'est Tailwind v4, configurez dans le CSS à la place - Un nouveau répertoire de contenu sous
src/content/sansdefineCollectioncorrespondant danssrc/content.config.ts - Nouvelles routes paginées sans mise à jour du filtre de sitemap
- Remplacement/renommage d'une page sans ajout d'une redirection
- Chemins d'image sous forme de chaîne nue (
<img src="/photos/foo.jpg">) dans des endroits oùastro:assetsdevrait être utilisé — perte d'optimisation - Changement de
output:destaticàserversans adaptateur et plan de déploiement correspondant - Ajout d'une fonctionnalité côté serveur (routes API, SSR dynamique) à un projet qui n'a ni adaptateur ni histoire de déploiement pour SSR
Que lire en premier dans un dépôt Astro inconnu
astro.config.mjs— URL du site, intégrations, redirections, filtre sitemap, mode de sortiesrc/content.config.ts— chaque schéma de collection ; vérifiez avant de modifier tout frontmatter markdown- Scripts
package.json— confirmez quedev/build/check/testsont les noms conventionnels src/layouts/— les mises en page de base enveloppent chaque page ; SEO/méta vit icisrc/config/— configuration à l'échelle du site (navigation, pied de page, marque)prd/PRD.mdsi présent — exigences produit pour ce site spécifiqueCLAUDE.md/AGENTS.mdpour les surcharges spécifiques au projet
