CommunityRédaction et éditiongithub.com

timerise-ai/help-center-markdown

Compétence d'agent : construire un centre d'aide basé sur du Markdown — dossiers de catégories avec articles frontmatter, pages statiques d'accueil/catégorie/tag/article, recherche classée côté client, tags avec identité de slug, repli de locale avec hreflang, JSON-LD et sitemap, validateur de contenu CI — dans Next.js App Router, sans CMS

Qu'est-ce que help-center-markdown ?

Cette compétence permet de générer un centre d'aide statique, une documentation ou une base de connaissances directement à partir de fichiers Markdown dans un dépôt, en utilisant Next.js App Router. Elle garantit que chaque article est accessible via la barre latérale, la recherche, et même lorsqu'une traduction locale n'existe pas encore (avec repli sur la locale par défaut). Le système s'appuie sur un index centralisé qui lit, normalise et met en cache les articles, et fournit des fonctionnalités comme : une recherche client-side tokenisée et classée, des tags avec slugs normalisés, la gestion multilingue avec balises hreflang et sitemap, ainsi qu'un validateur CI qui échoue la build en cas de problèmes (références cassées, ordre ambigu, slugs invalides). La compétence est conçue pour les développeurs souhaitant éviter un CMS tout en maintenant une expérience de navigation robuste et internationalisée.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add timerise-ai/help-center-markdown

Installed? Explore more Rédaction et édition skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Centre d'aide — articles Markdown, recherche, i18n

Un centre d'aide est un petit site statique avec une exigence impérative : chaque article doit être accessible — depuis la barre latérale, depuis la recherche, depuis une locale traduite qui ne l'a pas encore. Écrit par l'ingénieur qui a livré ce module ; l'implémentation précédente était un centre d'aide pour site marketing. Le module ci-dessous vérifie cette exigence comme des propriétés validées : la barre latérale affiche chaque article de chaque catégorie, la recherche classe une requête quelle que soit sa saisie, les liens connexes se résolvent ou le validateur échoue la build. Les suites de chargeur, de recherche et de tags couvrent chacune ; l'historique se trouve dans references/provenance.md.

Quand l'utiliser

Construire ou étendre un centre d'aide, une section de documentation ou une base de connaissances dont les articles sont des fichiers Markdown dans le dépôt, sur Next.js App Router, avec ou sans plusieurs locales.

Quand NE PAS l'utiliser

  • Un blog. Des articles datés, avec auteurs, couvertures et slugs localisés sont un modèle de contenu différent ; gardez le module de blog de l'hôte.
  • Documentation générée à partir de code (OpenAPI, TypeDoc) — utilisez leurs générateurs et liez vers la sortie.
  • Un site d'aide basé sur un CMS dont les éditeurs publient en runtime — le contrat d'index s'applique toujours, mais le chargeur, les paramètres statiques et la validation changent ; voir la note CMS dans extensions.md.
  • Des pages marketing qui sont Markdown. Réutilisez le rendu de l'hôte ; ce module est la navigation, la recherche et le modèle de locale autour de nombreux articles.

Architecture

content/help/<[locale]/><category>/<slug>.md
        │  gray-matter + normalisation
        ▼
getHelpIndex(locale)  ── React cache() : une analyse par requête ──┐
  categories · articles (triés) · byKey · tags · byTag · ignorés   │
        │                                                          │
        ├─► pages : accueil / catégorie / tag / article ── métadonnées, JSON-LD, canonical/hreflang
        ├─► HelpShell ── toSummary → arbre de navigation (barre latérale + tiroir)
        │             ── toSearchDoc → HelpSearch (client, recherche par préfixe tokenisée)
        ├─► helpSitemapEntries()
        └─► validate:help (CI) ── références non résolues, égalités d'ordre, mauvaises dates, mauvais slugs, dérive de tags

Tout lit à partir de l'index. Rien d'autre n'accède au système de fichiers.

Faits critiques

  1. Le système de fichiers est le schéma. Dossier = catégorie, nom de fichier = slug, et le frontmatter n'est que des métadonnées. slug/category dans le frontmatter sont validés par rapport au chemin, jamais utilisés.
  2. Seuls les résumés traversent vers le client. toSummary/toSearchDoc suppriment le corps ; passer HelpArticle à un composant client envoie tout le corpus dans chaque page.
  3. Une page non traduite est un doublon. Elle s'affiche à partir de la locale par défaut, garde sa place dans la navigation, montre un avis, canonicalise vers l'URL de la locale par défaut, et est absente de hreflang et du sitemap.
  4. Le runtime pardonne ; pas la CI. Les mauvaises références sont ignorées, les ordres manquants sont triés en dernier — et validate:help échoue la build pour l'auteur.
  5. La recherche est côté client par conception. ~1 Ko par article, déjà dans la page pour la navigation, résultats sur la première frappe. La recherche dans le corps est une extension.

Règles strictes

Ne jamais limiter la hauteur d'une liste repliable. Un max-h-* + overflow-hidden coupe ce qui ne tient pas et ne signale rien. Utilisez hidden ou une primitive repliable réelle, afin qu'une liste affiche chaque lien ou aucun.

Ne jamais trier uniquement par order. Les égalités tombent sous l'ordre de readdir, qui diffère entre les systèmes de fichiers. Brisez les égalités par titre, puis slug.

Ne jamais résoudre related sans le valider. Une référence supprimée est invisible sur la page ; le validateur est le seul endroit où un auteur apprend qu'un slug a été renommé.

Ne jamais chercher une requête non nettoyée, et ne jamais chercher uniquement le titre. Nettoyez, tokenisez, repliez les diacritiques, incluez les tags et titres, classez par champ.

Ne jamais coder en dur les chaînes de chrome dans un hôte avec un système i18n. Chaque chaîne passe par HelpStrings, afin que l'en-tête, le pied de page et les avis changent de locale ensemble.

Ne jamais indexer un tag par son orthographe. La casse, les tirets et les pluriels dérivent entre auteurs. Regroupez par tagSlug afin que chaque variante atterrisse sur une page, et laissez le validateur signaler la dérive.

Démarrage rapide

  1. Remplissez le contrat d'adaptation et fixez les IDs de catégorie — adaptation.md.
  2. Choisissez la disposition du contenu et écrivez la configuration — content-model.md.
  3. Copiez le chargeur et l'analyseur frontmatter ; exécutez le validateur sur le contenu réel immédiatement — content-loader.md.
  4. Connectez les chaînes et chemins à l'i18n de l'hôte — i18n.md.
  5. Ajoutez les trois pages, les aides SEO et les entrées de sitemap — routes.md — puis la page de tag et les puces liées — tags.md.
  6. Construisez la coque, l'arbre de navigation et le tiroir — ui.md — puis le fil d'Ariane, les cartes, les listes et le rendu sur les primitives de l'hôte — ui-content.md.
  7. Intégrez la recherche et son hook ; connectez le hook de résultat zéro à l'analytique — search.md.
  8. Exécutez les tests fournis, puis vérifiez le contrat de comportement : catégorie la plus longue entièrement accessible, requête avec espace de fin, requête accentuée, canonical de page non traduite.

Répertoire de références

ScénarioMots-clés de déclenchementRéférence
Intégration dans une application existanteadapter, couture, renommer catégories, sondage hôte, intégrer, dépendancesadaptation.md
Frontmatter, dossiers, slugs, validationfrontmatter, slug, catégorie, ordre, lié, updatedAt, en vedette, valider, CIcontent-model.md
Lecture des fichiers dans l'indexchargeur, gray-matter, cache, repli, titres, trier, index, fscontent-loader.md
Champ de recherche et classementrecherche, combobox, classement, tokeniser, diacritiques, préfixe, clavier, aucun résultatsearch.md
Tags, pages de tag, puces, nuage de tagstag, tags, page de tag, puce, slug de tag, orthographe, pluriel, parcourir par tagtags.md
Locales, chaînes, dates, canoniquesi18n, locale, traduction, repli, hreflang, chaînes, pluriel, Intli18n.md
Pages, métadonnées, JSON-LD, sitemaproute, page.tsx, generateStaticParams, dynamicParams, notFound, canonical, TechArticle, sitemaproutes.md
Coque, en-tête, barre latérale, tiroirlayout, barre latérale, menu mobile, tiroir, repliable, collant, HelpShellui.md
Fil d'Ariane, cartes, listes, rendu, hooks de stylefil d'Ariane, carte de catégorie, liste d'articles, react-markdown, data-help, styleui-content.md
Au-delà du module livréplein texte, Pagefind, TOC, retour, dates git, MDX, CMS, redirectionsextensions.md
Pourquoi les modèles diffèrent de l'implémentation précédenteprovenance, audit, registre, conservé délibérément, correction de l'implémentation précédenteprovenance.md

Skills associés