/** * IRPF — Workflow de production complète des 14 thèmes * * Lance build-theme.js en parallèle pour tous les thèmes. * Résultat : 14 fichiers MDX prêts + résumé global. * * Usage : Workflow({ scriptPath: 'workflows/build-all-themes.js' }) * Durée estimée : 45-90 min (parallèle) * Coût estimé : 800k-1,5M tokens (Haiku collecte, Sonnet analyse, Opus synthèse/propositions) */ export const meta = { name: 'irpf-build-all', description: 'Production complète IRPF : 14 thèmes × (collecte intl + FR + deep research + synthèse Opus + propositions + politique + MDX)', phases: [ { title: 'Collecte', detail: 'Sources internationales + françaises pour les 14 thèmes en parallèle' }, { title: 'Synthèse', detail: 'Opus par thème — diagnostic + indicateurs + enjeux' }, { title: 'Propositions', detail: 'Programme 2027-2032 par thème' }, { title: 'Lecture politique', detail: 'Dynamiques françaises par thème' }, { title: 'MDX', detail: '14 fichiers prêts pour le site' }, { title: 'Commit', detail: 'Push vers Forgejo + rebuild VPS' }, ], }; const THEMES = [ { slug: 'economie-finances', label: 'Économie & Finances publiques' }, { slug: 'sante', label: 'Santé & Système de soins' }, { slug: 'education', label: 'Éducation & Formation' }, { slug: 'environnement', label: 'Environnement & Transitions' }, { slug: 'defense', label: 'Défense & Sécurité nationale' }, { slug: 'justice', label: 'Justice & État de droit' }, { slug: 'affaires-etrangeres', label: 'Affaires étrangères & Diplomatie' }, { slug: 'travail-emploi', label: 'Travail, Emploi & Retraites' }, { slug: 'logement', label: 'Logement & Urbanisme' }, { slug: 'agriculture', label: 'Agriculture & Alimentation' }, { slug: 'numerique', label: 'Numérique & Innovation' }, { slug: 'cohesion-sociale', label: 'Cohésion sociale & Inégalités' }, { slug: 'democratie', label: 'Démocratie & Institutions' }, { slug: 'europe', label: 'Europe & Géopolitique' }, ]; // Sélection partielle possible via args const themesToBuild = args?.themes ? THEMES.filter(t => args.themes.includes(t.slug)) : THEMES; log(`Lancement production de ${themesToBuild.length} thèmes en parallèle...`); // Lancer build-theme pour chaque thème (workflow enfant) const results = await parallel( themesToBuild.map(theme => () => workflow('irpf-build-theme', { slug: theme.slug, label: theme.label }) .then(r => { log(`✓ ${theme.label} — ${r?.stats?.propositions || 0} propositions, ${r?.stats?.sources_collectees || 0} sources`); return r; }) .catch(err => { log(`✗ ${theme.label} — erreur: ${err.message}`); return null; }) ) ); const successful = results.filter(Boolean); log(`${successful.length}/${themesToBuild.length} thèmes produits avec succès`); // Résumé global return { total_themes: themesToBuild.length, success: successful.length, echecs: themesToBuild.length - successful.length, themes: successful.map(r => ({ slug: r.slug, label: r.label, sources: r.stats?.sources_collectees, indicateurs: r.stats?.indicateurs, propositions: r.stats?.propositions, })), total_propositions: successful.reduce((s, r) => s + (r.stats?.propositions || 0), 0), total_sources: successful.reduce((s, r) => s + (r.stats?.sources_collectees || 0), 0), mdx_files: successful.map(r => ({ slug: r.slug, content: r.mdx })), };