# Refonte llms.txt et llms-full.txt avec outils — Implementation Plan

> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.

**Goal:** Intégrer le comparateur d'électricité pro et le simulateur d'exonération d'accise dans `llms.txt` et `llms-full.txt` via un module partagé `lib/tools-data.ts` (single source of truth).

**Architecture:** Création d'un module TypeScript central qui décrit chaque outil (metadata, FAQs, données métier). Les deux routes `llms.txt` / `llms-full.txt` et les deux pages `app/outils/*/page.tsx` consomment ce module pour produire respectivement la liste compacte, les fiches détaillées et le JSON-LD.

**Tech Stack:** Next.js 16 (App Router), TypeScript strict, Content Collections (existant pour les blogs, non modifié), pnpm.

**Branch:** `feature/llms-txt-tools-refresh` (déjà créée).

**Spec source:** `docs/superpowers/specs/2026-05-26-llms-txt-tools-refresh-design.md`

---

## File Structure

À créer :
- `lib/tools-data.ts` — single source of truth pour les outils interactifs

À modifier :
- `app/llms.txt/route.ts` — ajouter section "Outils interactifs"
- `app/llms-full.txt/route.ts` — ajouter section dédiée par outil
- `app/outils/comparateur-electricite-pro/page.tsx` — consommer `tools-data.ts`
- `app/outils/simulateur-exoneration-accise-electricite/page.tsx` — consommer `tools-data.ts`

Pas de test runner mis en place sur ce repo pour ces fichiers (vérifié : pas de `vitest`/`jest` actif sur les routes existantes). La vérification se fait par `pnpm build` + visite locale + `pnpm knip`. Les tests ne sont donc pas écrits sous forme TDD ici — la vérification se fait via build + inspection HTTP, documentée à chaque étape.

---

## Task 1: Créer le module `lib/tools-data.ts`

**Files:**
- Create: `lib/tools-data.ts`

- [ ] **Step 1: Créer le fichier avec les types et le tableau**

```ts
// lib/tools-data.ts
import { siteConfig } from "@/lib/site";

export type ToolFaq = {
  question: string;
  answer: string;
};

export type Tool = {
  slug: string;
  url: string;
  name: string;
  type: "Comparateur" | "Simulateur";
  metaTitle: string;
  metaDescription: string;
  ogDescription: string;
  keywords: string[];
  shortDescription: string;
  longDescription: string;
  audience: string[];
  inputs: string[];
  outputs: string[];
  metricsContext: string;
  faqs: ToolFaq[];
};

const url = (slug: string) => `${siteConfig.url}/outils/${slug}/`;

export const tools: Tool[] = [
  {
    slug: "comparateur-electricite-pro",
    url: url("comparateur-electricite-pro"),
    name: "Comparateur électricité pro",
    type: "Comparateur",
    metaTitle: "Comparatif électricité pro 2026 : Comparateur B2B expert",
    metaDescription:
      "Comparatif électricité pro 2026 : comparateur B2B expert. Profils C5/C4/C3, contrats fixe/indexé/sur-mesure, ARENH, TURPE, mécanisme capacité décryptés.",
    ogDescription:
      "Comparez en 30 secondes les fournisseurs B2B adaptés à votre profil C5/C4/C3 et économisez jusqu'à 25 %.",
    keywords: [
      "comparatif electricite pro",
      "comparateur energie pro",
      "contrat electricite pro",
      "comparateur electricite entreprise",
      "fournisseur electricite professionnel",
    ],
    shortDescription:
      "Compare en 30s les fournisseurs B2B adaptés à votre profil C5/C4/C3, contrats fixe/indexé/sur-mesure.",
    longDescription:
      "Outil de comparaison personnalisé pour les professionnels. À partir de votre profil tarifaire (C5, C4 ou C3), de votre consommation annuelle et de votre tolérance au risque, le comparateur classe les fournisseurs B2B pertinents et recommande le type de contrat (fixe, indexé ARENH, sur-mesure) le mieux adapté. Calcul en 30 secondes, gratuit, sans engagement.",
    audience: ["PME", "ETI", "Industries", "Collectivités", "Commerces"],
    inputs: [
      "Profil tarifaire (C5 ≤ 36 kVA, C4 36-250 kVA, C3 > 250 kVA)",
      "Consommation annuelle (kWh)",
      "Puissance souscrite (kVA)",
      "Tolérance au risque (fixe / indexé / sur-mesure)",
    ],
    outputs: [
      "Classement des fournisseurs adaptés au profil",
      "Recommandation de type de contrat",
      "Estimation d'économies potentielles (jusqu'à 25 %)",
    ],
    metricsContext: [
      "- Profils tarifaires : C5 (≤ 36 kVA), C4 (36-250 kVA), C3 (> 250 kVA)",
      "- Types de contrat : fixe, indexé ARENH, sur-mesure",
      "- Composantes du prix final : fourniture + TURPE + accise + CTA + TVA",
      "- ARENH : prix d'accès régulé (jusqu'à fin 2025), remplacé par le mécanisme post-ARENH en 2026",
      "- Tarif Réglementé de Vente (TRV) : accessible uniquement aux sites ≤ 36 kVA depuis 2021",
      "- Mécanisme de capacité : composante prix pour garantir la disponibilité hivernale",
    ].join("\n"),
    faqs: [
      {
        question:
          "Quel est le fournisseur d'électricité le moins cher pour les professionnels en 2026 ?",
        answer:
          "Le fournisseur le moins cher dépend de votre profil tarifaire (C5, C4 ou C3) et de votre volume annuel. Pour un C5 ≤ 36 kVA, des acteurs comme Mint Energie ou ekWateur sont souvent compétitifs. Pour un C4 ou C3, Alpiq, ENGIE ou TotalEnergies négocient des grilles sur-mesure plus performantes. Notre comparateur propose un classement personnalisé selon votre consommation et votre tolérance au risque.",
      },
      {
        question:
          "Comment comparer efficacement des offres avec des horosaisonnalités différentes ?",
        answer:
          "L'horosaisonnalité regroupe les postes tarifaires (heures pleines/creuses, saisons). Pour comparer deux offres avec des grilles différentes, ramenez chaque tarif à un coût annuel total intégrant votre courbe de charge réelle (relevé Enedis 30 minutes). Sans cette donnée, le simple prix moyen du kWh peut être trompeur, surtout pour les profils C4/C3 dont la consommation varie fortement entre pointe et creux.",
      },
      {
        question:
          "Une entreprise peut-elle revenir au Tarif Réglementé (TRV) après l'avoir quitté ?",
        answer:
          "Le Tarif Réglementé de Vente (TRV) reste accessible uniquement aux sites souscrits ≤ 36 kVA (profil C5) depuis 2021. Une entreprise ayant quitté le TRV peut y revenir sans pénalité tant qu'elle reste éligible. Au-delà de 36 kVA, le retour au TRV n'est plus possible : seules les offres de marché (fixe, indexé, sur-mesure) sont disponibles.",
      },
      {
        question:
          "Quel est le délai de préavis standard pour résilier un contrat électricité pro ?",
        answer:
          "Le préavis légal standard est de 1 mois pour un contrat professionnel d'électricité. Vérifiez votre contrat actuel : certaines clauses spécifiques (engagement triennal, achat en tranches) peuvent imposer des conditions plus restrictives. Enedis garantit ensuite une bascule sans coupure sous 21 jours minimum après notification du nouveau fournisseur.",
      },
      {
        question:
          "Les offres d'électricité verte sont-elles systématiquement plus chères ?",
        answer:
          "Pas systématiquement. Les offres avec Garanties d'Origine (GO) ajoutent un surcoût marché de 2 à 5 €/MWh selon la source (hydraulique, éolien, solaire). Les Power Purchase Agreements (PPA) à long terme peuvent même être moins chers que les offres marché classiques sur la durée, mais nécessitent un engagement de 5 à 15 ans.",
      },
      {
        question:
          "Quelle est la différence entre un contrat unique et un contrat CARD ?",
        answer:
          "Le contrat unique regroupe fourniture et acheminement chez un seul fournisseur (le plus courant en B2B sous 250 kVA). Le contrat CARD (Contrat d'Accès aux Réseaux de Distribution) sépare la fourniture (négociée avec un fournisseur) de l'acheminement (contracté directement avec Enedis). Réservé aux profils > 250 kVA (C3), le CARD permet d'optimiser séparément chaque poste.",
      },
    ],
  },
  {
    slug: "simulateur-exoneration-accise-electricite",
    url: url("simulateur-exoneration-accise-electricite"),
    name: "Simulateur exonération accise électricité",
    type: "Simulateur",
    metaTitle:
      "Simulateur Exonération Accise Électricité 2026 | Calculez vos économies",
    metaDescription:
      "Calculez gratuitement vos économies potentielles sur l'accise électricité (TICFE/CSPE). Taux réduits, exonérations par code NAF. Résultat immédiat.",
    ogDescription:
      "Calculez gratuitement vos économies potentielles sur l'accise électricité (TICFE/CSPE). Résultat immédiat.",
    keywords: [
      "exonération accise électricité",
      "simulateur TICFE",
      "calculateur exonération électricité",
      "taux réduit accise électricité entreprise",
      "exonération CSPE entreprise",
      "remboursement TICFE",
    ],
    shortDescription:
      "Calcule vos économies potentielles sur l'accise (TICFE/CSPE). Taux réduits et exonérations par NAF.",
    longDescription:
      "Outil de simulation gratuit qui calcule, à partir de votre code NAF et de votre consommation annuelle, les économies potentielles sur l'accise sur l'électricité (anciennement TICFE/CSPE). Identifie les taux réduits applicables et les cas d'exonération totale prévus par le Code des impositions sur les biens et services. Inclut une estimation rétroactive sur les deux années précédentes.",
    audience: [
      "Industries (métallurgie, électrolyse, minéraux)",
      "Data centers",
      "Transport ferroviaire",
      "Ports et aérodromes",
      "Entreprises électro-intensives",
    ],
    inputs: [
      "Code NAF de l'activité",
      "Consommation annuelle d'électricité (MWh)",
      "Coût total de l'électricité (€)",
      "Valeur ajoutée de l'entreprise (€)",
    ],
    outputs: [
      "Taux d'accise applicable (normal ou réduit)",
      "Économies annuelles estimées (€)",
      "Économies rétroactives possibles (2024 + 2025)",
      "Liste des démarches à effectuer auprès de la DGFiP",
    ],
    metricsContext: [
      "- Taux normal 2026 : 26,58 €/MWh (entreprises > 36 kVA, depuis le 1er février 2026)",
      "- Taux réduits : 0,50 €/MWh (ferroviaire, électro-intensif, transport collectif)",
      "- Taux réduits : 3,00 €/MWh (électro-sensible)",
      "- Taux réduits : 5,50 €/MWh (grandes consommatrices, aérodromes)",
      "- Taux réduits : 12,00 €/MWh (data centers)",
      "- Exonération totale (0 €/MWh) : production d'électricité, double usages métallurgiques, production très intensive",
      "- Seuil électro-intensif : tarif normal × conso / valeur ajoutée > 0,5 %",
      "- Exonération totale art. L.312-68 CIBS : coût électricité > 50 % du coût du produit fabriqué",
      "- Délai de prescription : 2 ans (rétroactif 2024 jusqu'au 31/12/2026, 2025 jusqu'au 31/12/2027)",
      "- Formulaire DGFiP : CERFA 16196*04 (attestation 2040-TIC-ATT-E 2026)",
    ].join("\n"),
    faqs: [
      {
        question:
          "Quelles entreprises sont éligibles à une exonération d'accise sur l'électricité ?",
        answer:
          "Les entreprises dont l'activité implique des procédés métallurgiques, de l'électrolyse, la fabrication de produits minéraux (div. 23 NACE), ou dont l'électro-intensité (tarif normal × conso / valeur ajoutée) dépasse 0,5 %, sont potentiellement éligibles. Les data centers, le transport ferroviaire, les ports, les aérodromes, le transport collectif, les serres agricoles, la pêche et les IRVE publiques bénéficient aussi de taux réduits. Une exonération totale s'applique aux entreprises dont le coût de l'électricité représente plus de 50 % du coût du produit fabriqué (art. L.312-68 CIBS).",
      },
      {
        question: "Quel est le taux normal d'accise sur l'électricité en 2026 ?",
        answer:
          "Le taux normal pour les entreprises (puissance > 36 kVA) est de 26,58 €/MWh depuis le 1er février 2026. Les taux réduits vont de 0 €/MWh (exonérations totales : production d'électricité, double usages métallurgiques, production très intensive) à 12,00 €/MWh pour les data centers. Entre les deux : 0,50 €/MWh (ferroviaire, électro-intensif, transport collectif), 3,00 €/MWh (électro-sensible) et 5,50 €/MWh (grandes consommatrices, aérodromes).",
      },
      {
        question: "Le remboursement rétroactif est-il possible ?",
        answer:
          "Oui, le délai de prescription est de 2 ans. En 2026, vous pouvez réclamer le trop-versé sur vos consommations de 2024 (jusqu'au 31/12/2026) et 2025 (jusqu'au 31/12/2027). La demande se fait auprès de votre Service des Impôts des Entreprises (DGFiP) via le formulaire CERFA 16196*04 (attestation 2040-TIC-ATT-E 2026).",
      },
      {
        question: "Combien coûte ce simulateur ?",
        answer:
          "Le simulateur est entièrement gratuit. Il vous donne une estimation indicative de vos économies potentielles. Pour un diagnostic complet et la constitution de votre dossier d'exonération, contactez nos experts Acieb Énergie.",
      },
      {
        question: "Que se passe-t-il après la simulation ?",
        answer:
          "Vous recevez par email un rapport personnalisé avec vos économies estimées, les tiers d'exonération applicables et les démarches à suivre. Un conseiller Acieb Énergie peut ensuite vous accompagner gratuitement dans la constitution de votre dossier auprès de la DGFiP.",
      },
    ],
  },
];

export const findTool = (slug: string): Tool | undefined =>
  tools.find((t) => t.slug === slug);
```

- [ ] **Step 2: Vérifier que le typecheck passe**

Run: `pnpm tsc --noEmit`
Expected: aucune erreur sur `lib/tools-data.ts`.

- [ ] **Step 3: Commit**

```bash
git add lib/tools-data.ts
git commit -m "feat(outils): add lib/tools-data.ts as single source of truth"
```

---

## Task 2: Refactor `app/llms.txt/route.ts` pour intégrer la section Outils

**Files:**
- Modify: `app/llms.txt/route.ts`

- [ ] **Step 1: Réécrire le fichier**

```ts
import { allBlogs } from "content-collections";
import { siteConfig } from "@/lib/site";
import { tools } from "@/lib/tools-data";

const SITE_URL = siteConfig.url;

export async function GET() {
  const blogs = [...allBlogs].sort(
    (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime(),
  );

  const blogList = blogs
    .map(
      (blog) =>
        `- [${blog.title}](${SITE_URL}/${blog.category}/${blog.slug}): ${blog.description}`,
    )
    .join("\n");

  const toolsList = tools
    .map((tool) => `- [${tool.name}](${tool.url}): ${tool.shortDescription}`)
    .join("\n");

  const content = `# Acieb Énergie

> Courtier en énergie B2B pour les professionnels en France. Nous accompagnons les PME, ETI et collectivités dans l'optimisation de leurs contrats d'électricité et de gaz naturel.

## À propos

Acieb Énergie est un courtier en énergie indépendant spécialisé dans le secteur B2B. Nos experts négocient les contrats d'électricité et de gaz auprès de 20+ fournisseurs pour obtenir les meilleurs tarifs. Service gratuit pour l'entreprise.

## Secteurs d'intervention

- Industrie : optimisation des contrats haute tension, TURPE, accise
- Tertiaire : bureaux, commerces, décret tertiaire, OPERAT
- Collectivités : marchés publics, achats groupés
- Commerces & artisans : TPE, offres adaptées

## Outils interactifs

${toolsList}

## Contenu disponible

${blogList}

## Pages principales

- [Accueil](${SITE_URL}): Présentation d'Acieb Énergie, courtier en énergie B2B
- [Contact](${SITE_URL}/contact): Demander un audit gratuit de vos contrats d'énergie
- [Ressources](${SITE_URL}/ressources): Outils et ressources pour la gestion de l'énergie
- [Guides](${SITE_URL}/guides): Guides complets sur l'énergie professionnelle
- [Actualités](${SITE_URL}/actualites): Actualités du marché de l'énergie
- [Réglementation](${SITE_URL}/reglementation): Décryptage réglementaire énergie

## Version complète

Pour le contenu détaillé de chaque article, consultez [llms-full.txt](${SITE_URL}/llms-full.txt).
`;

  return new Response(content, {
    headers: {
      "Content-Type": "text/plain; charset=utf-8",
      "Cache-Control": "public, max-age=86400, s-maxage=86400",
    },
  });
}
```

**Notes** :
- La section `## Outils interactifs` est insérée **après "Secteurs d'intervention"** et **avant "Contenu disponible"**.
- Les pages principales ne contiennent **pas** d'entrée duplicate pour les outils.
- Aucun changement de cache, d'encodage ou de header.

- [ ] **Step 2: Démarrer le dev server**

Run: `pnpm dev`
Expected: dev server démarre sans erreur.

- [ ] **Step 3: Visiter `/llms.txt` localement**

Run: `curl -sS http://localhost:3000/llms.txt | head -40`
Expected (extrait attendu) :

```
# Acieb Énergie
...
## Outils interactifs

- [Comparateur électricité pro](https://www.aciebenergie.fr/outils/comparateur-electricite-pro/): Compare en 30s les fournisseurs B2B adaptés à votre profil C5/C4/C3, contrats fixe/indexé/sur-mesure.
- [Simulateur exonération accise électricité](https://www.aciebenergie.fr/outils/simulateur-exoneration-accise-electricite/): Calcule vos économies potentielles sur l'accise (TICFE/CSPE). Taux réduits et exonérations par NAF.
```

Vérifications visuelles :
- Caractères accentués corrects (`Énergie`, `électricité`, `é/è/à`)
- Section "Outils interactifs" présente en position 3
- Pas de doublon dans "Pages principales"

- [ ] **Step 4: Arrêter le dev server**

Stop avec `Ctrl+C`.

- [ ] **Step 5: Commit**

```bash
git add app/llms.txt/route.ts
git commit -m "feat(llms): add Outils interactifs section to llms.txt"
```

---

## Task 3: Refactor `app/llms-full.txt/route.ts` pour intégrer les fiches outils

**Files:**
- Modify: `app/llms-full.txt/route.ts`

- [ ] **Step 1: Réécrire le fichier**

```ts
import { allBlogs } from "content-collections";
import { siteConfig } from "@/lib/site";
import { tools, type Tool } from "@/lib/tools-data";

const SITE_URL = siteConfig.url;

function renderToolEntry(tool: Tool): string {
  const inputs = tool.inputs.map((i) => `- ${i}`).join("\n");
  const outputs = tool.outputs.map((o) => `- ${o}`).join("\n");
  const audience = tool.audience.join(", ");
  const faqs =
    tool.faqs
      .map((faq) => `Q: ${faq.question}\nA: ${faq.answer}`)
      .join("\n\n") || "";

  return `## ${tool.name}

- URL: ${tool.url}
- Type: ${tool.type}
- Audience: ${audience}
- Coût: Gratuit

### Description

${tool.longDescription}

### Données d'entrée

${inputs}

### Résultat produit

${outputs}

### Contexte métier

${tool.metricsContext}

### Questions fréquentes

${faqs}

---`;
}

export async function GET() {
  const blogs = [...allBlogs].sort(
    (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime(),
  );

  const blogEntries = blogs
    .map((blog) => {
      const url = `${SITE_URL}/${blog.category}/${blog.slug}`;
      const keywords = blog.keywords?.join(", ") || "";
      const topics = blog.topics?.join(", ") || "";
      const faqs =
        blog.faqs
          ?.map(
            (faq: { question: string; answer: string }) =>
              `  Q: ${faq.question}\n  A: ${faq.answer}`,
          )
          .join("\n\n") || "";

      return `## ${blog.title}

- URL: ${url}
- Date: ${blog.date}
- Auteur: ${blog.author}
- Catégorie: ${blog.category}
- Mots-clés: ${keywords}
- Thématiques: ${topics}
- Description: ${blog.description}

### Questions fréquentes

${faqs}

---`;
    })
    .join("\n\n");

  const toolsSection = tools.map(renderToolEntry).join("\n\n");

  const content = `# Acieb Énergie — Contenu complet

> Courtier en énergie B2B pour les professionnels en France. Ce fichier contient le détail de tous les contenus publiés sur aciebenergie.fr, optimisé pour les moteurs de recherche IA.

## Informations sur l'entreprise

- Nom: Acieb Énergie
- Site: ${SITE_URL}
- Activité: Courtier en énergie B2B (électricité et gaz naturel)
- Cible: PME, ETI, collectivités, industries en France
- Service: Gratuit pour l'entreprise (rémunération par le fournisseur retenu)
- Fournisseurs partenaires: 20+
- Économies constatées: 8 à 22 % sur la part fourniture
- Expertises: Négociation contrats, optimisation TURPE, conformité décret tertiaire, accompagnement CSRD

## Outils interactifs

${toolsSection}

## Articles publiés

${blogEntries}
`;

  return new Response(content, {
    headers: {
      "Content-Type": "text/plain; charset=utf-8",
      "Cache-Control": "public, max-age=86400, s-maxage=86400",
    },
  });
}
```

**Notes** :
- Helper `renderToolEntry` encapsule le rendu d'un outil pour rester DRY.
- La section `## Outils interactifs` est placée **après "Informations sur l'entreprise"** et **avant "Articles publiés"**.
- L'ordre des champs respecte le spec (URL, Type, Audience, Coût, Description, Données d'entrée, Résultat produit, Contexte métier, FAQ).

- [ ] **Step 2: Démarrer le dev server**

Run: `pnpm dev`
Expected: démarre sans erreur.

- [ ] **Step 3: Visiter `/llms-full.txt`**

Run: `curl -sS http://localhost:3000/llms-full.txt | sed -n '15,60p'`
Expected (extrait) :

```
## Outils interactifs

## Comparateur électricité pro

- URL: https://www.aciebenergie.fr/outils/comparateur-electricite-pro/
- Type: Comparateur
- Audience: PME, ETI, Industries, Collectivités, Commerces
- Coût: Gratuit

### Description
...
```

Vérifications visuelles :
- Les deux outils apparaissent dans l'ordre déclaré (comparateur en premier, simulateur en second)
- Section "Contexte métier" rendue avec retours à la ligne préservés
- Les 6 FAQs du comparateur + 5 FAQs du simulateur sont présentes
- Caractères spéciaux (€, /, accents) corrects

- [ ] **Step 4: Arrêter le dev server**

Stop avec `Ctrl+C`.

- [ ] **Step 5: Commit**

```bash
git add app/llms-full.txt/route.ts
git commit -m "feat(llms): add tool fiches with business context to llms-full.txt"
```

---

## Task 4: Refactor `app/outils/comparateur-electricite-pro/page.tsx` pour consommer `tools-data.ts`

**Files:**
- Modify: `app/outils/comparateur-electricite-pro/page.tsx`

- [ ] **Step 1: Identifier les blocs à remplacer**

Bloc 1 : `metadata` (lignes ~10-29) → utilise `tool.metaTitle`, `tool.metaDescription`, `tool.keywords`, `tool.ogDescription`.

Bloc 2 : `softwareAppJsonLd.description` (ligne ~58) → utilise une description équivalente, ou conserve le texte existant (on garde le texte existant pour ne pas changer le JSON-LD visible — voir note ci-dessous).

Bloc 3 : `faqJsonLd.mainEntity` (lignes ~89-139) → mappé depuis `tool.faqs`.

**Note importante** : seuls `metadata` et le contenu des FAQs sont migrés vers `tools-data.ts`. Les autres `JsonLd` (`softwareAppJsonLd`, `articleJsonLd`, `breadcrumbJsonLd`) ont des structures spécifiques (Article, BreadcrumbList) qui restent dans la page pour ne pas surcharger `tools-data.ts` avec du Schema.org. **Aucun changement de contenu** sur ces blocs — c'est un pur refacto interne sur les FAQs et metadata.

- [ ] **Step 2: Réécrire la partie haut du fichier (imports, metadata, début du composant)**

Remplacer les lignes 1-29 par :

```ts
import type { Metadata } from "next";
import { Suspense } from "react";
import { siteConfig } from "@/lib/site";
import { JsonLd } from "@/lib/json-ld";
import { findTool } from "@/lib/tools-data";
import { CalculatorWizard } from "./_components/calculator-wizard";
import { LongFormContent } from "./_components/long-form-content";

const tool = findTool("comparateur-electricite-pro");
if (!tool) {
  throw new Error("Tool 'comparateur-electricite-pro' not found in tools-data");
}

const PAGE_URL = tool.url;

export const metadata: Metadata = {
  title: tool.metaTitle,
  description: tool.metaDescription,
  keywords: tool.keywords,
  alternates: { canonical: PAGE_URL },
  openGraph: {
    title: tool.metaTitle,
    description: tool.ogDescription,
    url: PAGE_URL,
    type: "website",
  },
};
```

- [ ] **Step 3: Remplacer le bloc `faqJsonLd` (lignes ~87-140)**

Remplacer toute la définition de `faqJsonLd` (depuis `const faqJsonLd = {` jusqu'à la `};` finale du bloc) par :

```ts
  const faqJsonLd = {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    mainEntity: tool.faqs.map((faq) => ({
      "@type": "Question",
      name: faq.question,
      acceptedAnswer: {
        "@type": "Answer",
        text: faq.answer,
      },
    })),
  };
```

**Vérification visuelle** : Les blocs `softwareAppJsonLd`, `articleJsonLd`, `breadcrumbJsonLd` restent inchangés. Le `return (<>...</>)` reste inchangé.

- [ ] **Step 4: Vérifier qu'il n'y a plus de référence à `siteConfig.url` superflue**

Run: `grep -n "siteConfig" app/outils/comparateur-electricite-pro/page.tsx`
Expected: `siteConfig` n'est utilisé que dans les blocs JSON-LD (Article author/publisher, Breadcrumb home). Garder l'import.

- [ ] **Step 5: Typecheck**

Run: `pnpm tsc --noEmit`
Expected: aucune erreur.

- [ ] **Step 6: Démarrer le dev server**

Run: `pnpm dev`
Expected: démarre sans erreur.

- [ ] **Step 7: Vérifier la page outil + JSON-LD inchangé**

Run: `curl -sS http://localhost:3000/outils/comparateur-electricite-pro/ | grep -A1 'application/ld+json' | head -20`
Expected : les balises `<script type="application/ld+json">` apparaissent. Vérifier visuellement dans le HTML que les 6 FAQs sont présentes dans le `FAQPage`.

Vérification additionnelle : ouvrir la page dans un navigateur, F12 → onglet Elements → vérifier :
- `<title>` = "Comparatif électricité pro 2026 : Comparateur B2B expert"
- `<meta name="description">` identique à avant
- `<meta name="keywords">` identique à avant
- Script JSON-LD `FAQPage` contient bien 6 questions

- [ ] **Step 8: Arrêter le dev server**

Stop avec `Ctrl+C`.

- [ ] **Step 9: Commit**

```bash
git add app/outils/comparateur-electricite-pro/page.tsx
git commit -m "refactor(outils): consume tools-data.ts in comparateur page"
```

---

## Task 5: Refactor `app/outils/simulateur-exoneration-accise-electricite/page.tsx`

**Files:**
- Modify: `app/outils/simulateur-exoneration-accise-electricite/page.tsx`

- [ ] **Step 1: Identifier les blocs à remplacer**

Bloc 1 : `metadata` (lignes ~9-33) → utilise les champs du tool.

Bloc 2 : `const faqs = [...]` (lignes ~35-62) → **à supprimer entièrement** (déplacé dans `tools-data.ts`).

Bloc 3 : `faqJsonLd` (à identifier dans la suite du fichier au-delà de la ligne 80) → mappé depuis `tool.faqs`.

- [ ] **Step 2: Lire le reste du fichier pour identifier la structure JSON-LD**

Run: `grep -nE "(faqJsonLd|webAppJsonLd|return)" app/outils/simulateur-exoneration-accise-electricite/page.tsx`

Cette commande révèle où sont placés les blocs JSON-LD. Adapter Step 4 ci-dessous en fonction.

- [ ] **Step 3: Réécrire le haut du fichier (imports + metadata)**

Remplacer les lignes 1-33 par :

```ts
import type { Metadata } from "next";
import { Suspense } from "react";
import { siteConfig } from "@/lib/site";
import { JsonLd, GRAPH_IDS } from "@/lib/json-ld";
import { findTool } from "@/lib/tools-data";
import { SimulateurWizard } from "./_components/simulateur-wizard";

const tool = findTool("simulateur-exoneration-accise-electricite");
if (!tool) {
  throw new Error(
    "Tool 'simulateur-exoneration-accise-electricite' not found in tools-data",
  );
}

const PAGE_URL = tool.url;

export const metadata: Metadata = {
  title: tool.metaTitle,
  description: tool.metaDescription,
  keywords: tool.keywords,
  alternates: { canonical: PAGE_URL },
  openGraph: {
    title: tool.metaTitle,
    description: tool.ogDescription,
    url: PAGE_URL,
    type: "website",
  },
};
```

- [ ] **Step 4: Supprimer la constante `faqs` hard-codée**

Supprimer entièrement le bloc `const faqs = [...]` (lignes ~35-62) ainsi que la ligne vide qui suit.

- [ ] **Step 5: Mettre à jour les usages de `faqs` dans le composant**

Run: `grep -nE "\\bfaqs\\b" app/outils/simulateur-exoneration-accise-electricite/page.tsx`

Pour chaque occurrence de la variable `faqs` (ex. dans le `faqJsonLd.mainEntity` ou dans un rendu visible de FAQ), remplacer par `tool.faqs`.

Exemple type de remplacement attendu pour `faqJsonLd` :

```ts
  const faqJsonLd = {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    mainEntity: tool.faqs.map((faq) => ({
      "@type": "Question",
      name: faq.question,
      acceptedAnswer: {
        "@type": "Answer",
        text: faq.answer,
      },
    })),
  };
```

Si le composant rend visuellement les FAQs dans le JSX, remplacer également `{faqs.map(...)}` par `{tool.faqs.map(...)}`.

- [ ] **Step 6: Typecheck**

Run: `pnpm tsc --noEmit`
Expected: aucune erreur.

- [ ] **Step 7: Démarrer le dev server**

Run: `pnpm dev`
Expected: démarre sans erreur.

- [ ] **Step 8: Vérifier la page outil + JSON-LD inchangé**

Run: `curl -sS http://localhost:3000/outils/simulateur-exoneration-accise-electricite/ | grep -c 'application/ld+json'`
Expected: au moins 2 (WebApp + FAQPage).

Vérification navigateur (F12) :
- `<title>` = "Simulateur Exonération Accise Électricité 2026 | Calculez vos économies"
- `<meta name="description">` identique à avant
- Script JSON-LD `FAQPage` contient bien 5 questions (les mêmes qu'avant)
- Si les FAQs sont rendues visuellement, elles s'affichent toujours (texte identique)

- [ ] **Step 9: Arrêter le dev server**

Stop avec `Ctrl+C`.

- [ ] **Step 10: Commit**

```bash
git add app/outils/simulateur-exoneration-accise-electricite/page.tsx
git commit -m "refactor(outils): consume tools-data.ts in simulateur page"
```

---

## Task 6: Vérification globale (build, knip, oxlint)

**Files:** aucun fichier modifié — uniquement des vérifications.

- [ ] **Step 1: Build complet**

Run: `pnpm build`
Expected: build réussit sans erreur ni warning bloquant. Vérifier qu'aucun warning du type `unused import` ou `unused variable` n'apparaît dans les 5 fichiers modifiés.

- [ ] **Step 2: Knip — détection de code mort**

Run: `pnpm knip`
Expected: aucun nouveau warning sur `lib/tools-data.ts`, les routes `llms*.txt`, ou les pages outils. Si knip signale `findTool` comme non utilisé (parce qu'il est utilisé conditionnellement), soit on garde, soit on l'inline dans les pages — décision à prendre au moment de l'exécution.

- [ ] **Step 3: Lint**

Run: `pnpm lint` (équivalent oxlint dans ce repo — vérifier dans `package.json` la commande exacte)
Expected: aucune erreur sur les fichiers modifiés.

Si `pnpm lint` n'existe pas, run : `pnpm exec oxlint lib/tools-data.ts app/llms.txt/route.ts app/llms-full.txt/route.ts app/outils/comparateur-electricite-pro/page.tsx app/outils/simulateur-exoneration-accise-electricite/page.tsx`
Expected: 0 erreur, 0 warning.

- [ ] **Step 4: Vérification de cohérence finale**

Run: `curl -sS http://localhost:3000/llms.txt > /tmp/llms.txt && curl -sS http://localhost:3000/llms-full.txt > /tmp/llms-full.txt`

(Nécessite `pnpm dev` actif — relancer si besoin.)

Vérifier :
- `/tmp/llms.txt` contient bien la section `## Outils interactifs` avec les 2 outils
- `/tmp/llms-full.txt` contient bien la section `## Outils interactifs` avec les 2 fiches complètes (Description, Données d'entrée, Résultat produit, Contexte métier, FAQs)
- Aucun caractère mal encodé (`Ã©` au lieu de `é`, etc.)

- [ ] **Step 5: Pas de commit si rien à committer**

Si les vérifications passent sans modification → pas de commit pour cette tâche.

---

## Task 7: Push, PR, merge dans `dev`

**Files:** aucun — opérations git.

- [ ] **Step 1: Vérifier l'historique de la branche**

Run: `git log --oneline dev..HEAD`
Expected (6 commits) :
```
<sha> refactor(outils): consume tools-data.ts in simulateur page
<sha> refactor(outils): consume tools-data.ts in comparateur page
<sha> feat(llms): add tool fiches with business context to llms-full.txt
<sha> feat(llms): add Outils interactifs section to llms.txt
<sha> feat(outils): add lib/tools-data.ts as single source of truth
<sha> docs: spec refonte llms.txt et llms-full.txt avec outils
```

- [ ] **Step 2: Push de la branche**

Run: `git push -u origin feature/llms-txt-tools-refresh`
Expected: la branche est créée sur le remote.

- [ ] **Step 3: Créer la PR (optionnel — demander confirmation utilisateur)**

Ne pas créer de PR automatiquement. Demander à l'utilisateur s'il veut une PR ou un merge fast-forward direct dans `dev`.

Si PR demandée :

```bash
gh pr create --title "feat(llms): intégrer comparateur et simulateur dans llms.txt" --body "$(cat <<'EOF'
## Summary
- Création de `lib/tools-data.ts` comme single source of truth pour les outils interactifs
- Ajout d'une section `## Outils interactifs` dans `llms.txt` et `llms-full.txt`
- Refacto des pages outils pour consommer `tools-data.ts` (suppression des FAQs hard-codées)

## Spec
docs/superpowers/specs/2026-05-26-llms-txt-tools-refresh-design.md

## Test plan
- [ ] `pnpm build` passe
- [ ] `pnpm knip` ne signale pas de dead code
- [ ] `curl /llms.txt` retourne la section Outils en position 3
- [ ] `curl /llms-full.txt` retourne les 2 fiches outils avec données métier
- [ ] Pages `/outils/comparateur-electricite-pro/` et `/outils/simulateur-exoneration-accise-electricite/` : metadata + JSON-LD identiques visuellement à avant le refacto

🤖 Generated with [Claude Code](https://claude.com/claude-code)
EOF
)"
```

Si merge fast-forward direct demandé :

```bash
git checkout dev
git merge feature/llms-txt-tools-refresh --ff-only
git push
git branch -d feature/llms-txt-tools-refresh
git push origin --delete feature/llms-txt-tools-refresh
```

---

## Self-Review

**1. Spec coverage**
- Section "Architecture / Single source of truth" → Task 1 ✓
- Section "Structure de llms.txt (court)" → Task 2 ✓
- Section "Structure de llms-full.txt (long)" → Task 3 ✓
- Section "Refacto des pages outils existantes" → Tasks 4 et 5 ✓
- Section "Tests / vérification" → Task 6 ✓
- Section "Plan de migration" → Tasks 1-7 (mappent les 7 étapes du spec dans l'ordre) ✓
- Édit du spec : FAQs du comparateur récupérées (6 FAQs), pas rédigées → reflété dans Task 1 (Step 1, tableau `faqs`) et Task 4 (Step 3) ✓

**2. Placeholder scan**
- Pas de TBD/TODO.
- Une zone "à décider au moment de l'exécution" dans Task 6 Step 2 (knip + `findTool`) : c'est explicite et acceptable car dépend du résultat exact de knip.
- Task 5 Step 2 demande un `grep` pour confirmer la structure du fichier avant le refacto — c'est intentionnel car je n'ai pas relu les lignes 80+ du fichier simulateur.

**3. Type consistency**
- `Tool` type défini en Task 1, consommé en Tasks 2-5 → champs cohérents (`name`, `url`, `shortDescription`, `longDescription`, `audience`, `inputs`, `outputs`, `metricsContext`, `faqs`).
- `findTool(slug)` défini en Task 1, utilisé en Tasks 4 et 5 → signature identique.
- `ToolFaq` (`question`, `answer`) cohérent partout.

Plan prêt.
