- 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>
82 lines
3.4 KiB
JavaScript
82 lines
3.4 KiB
JavaScript
/**
|
||
* 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 })),
|
||
};
|