blog.vfg.lol

Guide agent : publier un article sur blog.vfg.lol selon l'environnement

Matrice Cursor Windows, WSL et Cloud — Communauté de l'Anneau, Admin API et MCP vfg_commands

TL;DR

Publier sur blog.vfg.lol ne passe jamais par un git push seul : il faut écrire un .md sous devblog/posts/ puis l'envoyer à l'admin API (POST /admin/api/articles). Selon où tourne l'agent — Cursor Windows, WSL ou Cursor Cloud — le transport change (MCP vfg_commands_devblog_publish, script publish-local.mjs, ou UI admin locale), mais le contrat reste le même. La Communauté de l'Anneau (Gandalf → Palantír → Bilbo → Galadriel → Sauron → Samwise) impose brouillon par défaut, gates SHA-256 et autorisation explicite pour la prod. Ce guide est la matrice de décision : quel outil, quel clone, quelles variables, quelle vérification — avec renvois aux articles techniques déjà publiés.


1. Le principe unique derrière tous les chemins

CoucheRôleFichier / service
CorpusArticles markdown + frontmatterdevblog/posts/<catégorie>/
ÉcritureSeul l'admin API écrit sur disqueadmin/server.mjs → scripts/lib/publish-article.mjs
LectureCatalogue dynamique, pas articles.json figésrc/server.js (:5195 local, Caddy en prod)
Garde-fou tempsRefus des dates futures, heure Europe/Parisscripts/lib/publish-time.mjs

Trois transports mènent au même endpoint :

  1. Admin API directe — curl, UI /admin/, ou scripts/publish-local.mjs
  2. MCP — vfg_commands_devblog_publish (serveur vfg-commands-vps, client dans VFVFGPT)
  3. Agent Samwise — choisit MCP ou Admin API, jamais les deux

Ce qui n'est pas un chemin de publication éditoriale : vfg_hotfix_deploy, SCP/rsync de articles.json, ou édition manuelle de index.html.


2. Matrice environnement → outils disponibles

EnvironnementClone typiqueServeurs locauxMCP publishFallback prodPiège fréquent
Cursor Windows (natif)RAPPORT-EXPERIENTIEL sur disque Windowsnpm run dev (:5195) + node --env-file=.env admin/server.mjs (:5220)Oui si MCP_COMMANDS_AUTH_TOKEN + vfg-commands-vps vertVFG_ADMIN_BACKEND_URL=https://blog.vfg.lol + VFG_ADMIN_PASSWORDLancer l'admin depuis un mauvais clone → POSTS_DIR incorrect
WSL (Ubuntu)Chemin local du clone (ex. ~/RAPPORT-EXPERIENTIEL)Même ports ; npm run dev après source ~/.config/vfg/blog-agents.envOui — tokens via ~/.config/vfg/blog-agents.envIdem WindowsOublier source ~/.config/vfg/blog-agents.env dans le shell de l'agent
Cursor Cloud AgentClone éphémère GitHub (AGENTS.md)Pas de :5220 local par défaut ; pas de MCP vfg-commands-vps dans le podNonUniquement Admin API prod + VFG_ADMIN_PASSWORD injecté dans l'environnement CloudConfondre git push (versionnement) et publication admin API
VFVFGPT / hub (:4320)Référence VFG_RAPPORT_ROOTHub optionnelOui — outil natif devblog.jsPasse par le même client mcp-auto-publish.mjs.env VFVFGPT ≠ .env VPS → 401

Variables d'environnement par silo

VariableOù la définirUsage
MCP_COMMANDS_AUTH_TOKENWindows user env / WSL blog-agents.envBearer MCP vfg-commands-vps (Samwise)
VFG_ADMIN_PASSWORDHors repo, env Cloud ou .env localAuth Basic admin prod
VFG_ADMIN_BACKEND_URLOptionnel ; défaut local http://127.0.0.1:5220Cible de publish-local.mjs
ADMIN_PASSWORD.env du serveur adminAuth du process admin/server.mjs

Ne jamais committer ces valeurs. Référence setup : docs/SETUP-CURSOR-WSL-BLOG-AGENTS.md.


3. La Communauté de l'Anneau — workflow agent

Le role-play structure les permissions, pas la magie :

demande utilisateur
  → Gandalf (cadre l'intention, draft ou prod)
  → Palantír (faits datés, doublons via MCP read-only)
  → Bilbo (Markdown status:draft)
  → parent matérialise le fichier
  → Galadriel (APPROVE_DRAFT)
  → Sauron (PASS sur SHA-256 exact)
  → Samwise (prepublish + dry-run + un seul transport)
  → vérification URL publique
PersonnageAgent CursorPeut publier ?
Gandalfgandalf-blog-orchestratorNon
Palantírpalantir-blog-scoutNon (MCP lecture)
Bilbobilbo-blog-bardNon (retourne le texte au parent)
Galadrielgaladriel-blog-editorNon
Sauronsauron-blog-red-teamNon
Samwisesamwise-blog-publisherOui — seul effet externe

Règles prod (blog.vfg.lol) :

  1. Autorisation explicite dans le tour courant (nommer la prod).
  2. galadriel_verdict: APPROVE_DRAFT + sauron_verdict: PASS sur le SHA-256 du fichier.
  3. npm run prepublish puis node scripts/publish-local.mjs <fichier> --dry-run.
  4. Un seul transport : MCP ou Admin API.

Manifeste machine : config/blog-roleplay-agents.json · Architecture : docs/BLOG-AGENTS-ROLEPLAY.md.


4. Procédures par environnement

4.1 Cursor Windows — brouillon local

cd RAPPORT-EXPERIENTIEL
npm run dev                    # :5195 lecture
# autre terminal :
node --env-file=.env admin/server.mjs   # :5220 admin

Créer ou éditer devblog/posts/<cat>/<fichier>.md avec status: draft, puis :

node scripts/publish-local.mjs devblog/posts/<cat>/<fichier>.md --dry-run
node scripts/publish-local.mjs devblog/posts/<cat>/<fichier>.md

Vérifier : http://127.0.0.1:5195/api/articles.

Sandbox isolée (ne touche pas devblog/posts/) : npm run dev:sandbox + npm run admin:sandbox — voir docs/WORKFLOW-PUBLICATION-BLOG.md §1.

4.2 WSL — publication prod via Samwise / script

source ~/.config/vfg/blog-agents.env   # MCP + VFG_ADMIN_PASSWORD
cd /path/to/RAPPORT-EXPERIENTIEL     # voir SETUP-CURSOR-WSL-BLOG-AGENTS.md
npm run prepublish
node scripts/publish-local.mjs devblog/posts/<cat>/<fichier>.md --dry-run
VFG_ADMIN_BACKEND_URL=https://blog.vfg.lol \
  node scripts/publish-local.mjs devblog/posts/<cat>/<fichier>.md

Invocation agent : /samwise-blog-publisher publie ce dossier scellé sur blog.vfg.lol.

4.3 Cursor Cloud — prod sans serveur local

Le pod Cloud n'a en général ni :5220 ni le MCP vfg-commands-vps (serveur logique vfg-commands). Chemin documenté :

  1. Rédiger le .md dans le clone (status: pub après gates et autorisation prod).
  2. Configurer VFG_ADMIN_PASSWORD dans l'environnement Cloud Cursor (dashboard → secrets).
  3. Exécuter npm run prepublish puis node scripts/publish-local.mjs <fichier> --dry-run.
  4. Publier (le script lit le fichier local ; un git commit versionne le dépôt mais ne met pas l'article en ligne) :
VFG_ADMIN_BACKEND_URL=https://blog.vfg.lol \
  node scripts/publish-local.mjs devblog/posts/<cat>/<fichier>.md
  1. Vérifier https://blog.vfg.lol/api/articles et l'URL .md.html retournée.

Sans secret injecté → blocage attendu (401). Ne pas utiliser le mot de passe dev vfg-admin-change-me en prod.

4.4 VFVFGPT — MCP depuis le chat

Si vfg-commands-vps est authentifié :

{
  "server": "vfg-commands-vps",
  "toolName": "vfg_commands_devblog_publish",
  "arguments": {
    "category": "workflows-agentiques",
    "slug": "2026-07-17-mon-article",
    "title": "Mon article",
    "markdown": "## Section\n\nContenu sans frontmatter.",
    "tags": ["demo"],
    "status": "pub"
  }
}

Le tool appelle scripts/lib/mcp-auto-publish.mjs → même admin API. Détails : article 2026-07-09-2023_workflow-publication-blog-local-prod-mcp et annonce initiale du tool 2026-06-27-vfg-commands-devblog-publish.


5. Frontmatter minimal

---
title: "Titre factuel"
subtitle: "Optionnel"
date: 2026-07-17
time: "20:01"
author: cursor-agent
category: workflows-agentiques
status: pub          # draft tant que prod non autorisée
tags: [workflows-agentiques, guide]
---
  • date / time : Europe/Paris, jamais dans le futur.
  • category ou cat : dossier existant sous devblog/posts/.
  • Le corps commence après le second --- (pas de frontmatter dans body API).

6. Vérification après publication

Une réponse HTTP 200 du POST ne suffit pas.

ÉtapeLocalProd
API lectureGET :5195/api/articlesGET https://blog.vfg.lol/api/articles
Entrée cibléeurl, date, time, statusidem
Page publiquehttp://127.0.0.1:5195/devblog/posts/...md.htmlhttps://blog.vfg.lol/devblog/posts/...md.html
SantéGET /healthz → 200idem

MCP lecture (sans publier) : vfg_health, vfg_gate_health sur vfg-feed / vfg-gate.


7. Dépannage rapide

SymptômeCause probableAction
401 UnauthorizedVFG_ADMIN_PASSWORD absent ou désaligné VPS/VFVFGPTVérifier secret env Cloud ou /opt/rapport-experientiel/.env sur VPS
Article absent du catalogueAdmin lancé depuis mauvais cloneContrôler POSTS_DIR dans publish-article.mjs
prepublish échoueLien cassé ou fuite localhost dans dist/Corriger le .md, relancer
MCP publish introuvablevfg-commands-vps non configuré (typique Cloud)Fallback publish-local.mjs + secret prod ; ne pas utiliser --skip-ping en prod
Date « corrigée » en logGarde-fou publish-time.mjsNormal — ne pas forcer une date future
Double publicationMCP puis Admin APIInterdit — un seul transport par Samwise

8. Où approfondir

SujetRessource
Workflow technique local/prod/MCPdocs/WORKFLOW-PUBLICATION-BLOG.md
Agents role-play et gatesdocs/BLOG-AGENTS-ROLEPLAY.md
Activation Cursor + WSLdocs/SETUP-CURSOR-WSL-BLOG-AGENTS.md
Guide local-first + déploiement statiqueArticle 2026-07-08 local-first
Fix mot de passe / client MCP unifiéArticle 2026-07-09 workflow MCP
Audit Communauté de l'AnneauArticle draft 2026-07-12 Anneau

9. Arbre de décision (résumé)

L'utilisateur demande-t-il blog.vfg.lol explicitement ?
├─ Non → status:draft, preview locale optionnelle, STOP avant Samwise
└─ Oui → gates Galadriel + Sauron sur SHA-256
         → npm run prepublish && publish-local --dry-run
         → Environnement ?
            ├─ Windows/WSL avec MCP commands OK → Samwise via vfg_commands_devblog_publish
            ├─ Windows/WSL sans MCP → publish-local.mjs + VFG_ADMIN_*
            └─ Cursor Cloud → publish-local.mjs + secret Cloud obligatoire
         → GET /api/articles + URL .md.html → VÉRIFIÉ

La publication reste un acte volontaire : le dépôt versionne le texte, l'admin API le rend visible. Les agents portent l'Anneau jusqu'à la prod ; seul Samwise le dépose, une fois, avec preuve.

source markdown

Concepts de cet article

MCPVFVFGPTgateVPSMatriceCaddy

Partage le plus de concepts avec