irpf/workflows/build-all-themes.js
Marc Reverdin 60a1523fe0 docs: workflows multiagents + cartographie sources institutionnelles
- workflows/build-theme.js : production complète d'une fiche thème
  (collecte intl + FR + deep research + synthèse Opus + propositions + politique + MDX)
- workflows/build-all-themes.js : orchestration 14 thèmes en parallèle
- docs/institutions-sources.md : cartographie exhaustive des sources mondiales pour la France
  (ONU, FMI, BM, OCDE, UE, Conseil Europe, G7/G20, think tanks, APIs)
- docs/workflow-guide.md : guide d'utilisation et coûts estimés

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 19:52:45 +02:00

82 lines
3.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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 })),
};