Un utilisateur ouvre un projet DSP dans VSCode et lance la commande
Faustforge: Connect.
Le plugin détecte l’instance faustforge (HTTP local), puis:
- crée/met à jour une session live depuis le fichier
.dspactif, - bascule faustforge sur cette session,
- ouvre la vue demandée (
dsp,run, etc.).
Lors des sauvegardes dans VSCode, le fichier live est déjà suivi par faustforge: les artefacts se mettent à jour automatiquement (mécanisme live existant).
Fournir une intégration native VSCode pour réduire la friction entre édition locale et exploration faustforge (UI web + MCP), sans dépendre d’URI externes.
Fonctionnalités MVP:
- connexion à faustforge via HTTP (
FAUSTFORGE_URL, défauthttp://localhost:3000), - commande d’édition d’une session statique en live (
Edit in VSCode), - synchronisation de session courante (
set_session) et vue (set_view), - actions rapides: refresh, run start/stop, ouverture navigateur.
Hors MVP:
- sync temps réel bidirectionnelle fine (WebSocket),
- édition collaborative multi-utilisateur,
- contrôle Orbit avancé depuis VSCode.
- Extension host: runtime Node de VSCode extension.
- Document actif: fichier
.dspactuellement focalisé. - Connexion faustforge: disponibilité API HTTP + version.
- Contexte session:
{ sha1, filename, kind, view }.
ForgeUrl = String
SessionId = SHA1 | LiveId
LiveId = "live-" + SHA1
View = "dsp" | "svg" | "run" | "cpp" | "tasks" | "signals"
PluginConfig ::= {
forgeUrl: ForgeUrl,
autoOpenRunOnBuild: Bool,
autoSyncActiveDsp: Bool
}
ConnectionState ::= {
reachable: Bool,
appVersion?: String,
faustVersion?: String
}
INV-VSC-1 : Le plugin n’écrit jamais hors workspace utilisateur.
INV-VSC-2 : Toute action session cible une session existante ou explicitement créée.
INV-VSC-3 : Les erreurs réseau sont non bloquantes pour l’éditeur (toast + log).
INV-VSC-4 : Les opérations plugin n’altèrent pas l’immuabilité des sessions statiques.
C⟦connect⟧ : () → ConnectionState
Effets:
- GET /api/app-version
- GET /api/version
- met à jour l’état interne de connexion
E⟦edit_static⟧ : (sha1: SHA1) → { liveSha1: LiveId, hostPath: String? }
Effets:
- POST /api/:sha/edit
- si hostPath disponible: ouvre le fichier dans VSCode
- POST /api/state { sha1: liveSha1 }
S⟦sync_active_dsp⟧ : (filePath: String) → { liveSha1: LiveId }
Précondition:
- filePath termine par ".dsp"
Effets:
- POST /api/live/open { filePath }
- POST /api/state { sha1: liveSha1 }
R⟦run⟧ : ("start" | "stop" | "toggle") → Unit
Effets:
- POST /api/state { view: "run" } (optionnel)
- POST /api/run/transport { action }
GET /api/app-versionGET /api/versionPOST /api/live/openPOST /api/:sha/edit(cf.SPECIFICATION-EDIT-MODE.md)GET /api/sessionsGET /api/statePOST /api/statePOST /api/run/transportPOST /api/:sha/refresh
faustforge.connectfaustforge.openWebUifaustforge.syncActiveDspfaustforge.editCurrentStaticSessionfaustforge.refreshCurrentSessionfaustforge.runStartfaustforge.runStopfaustforge.runToggle
- Status bar:
Faustforge: Connected/Disconnected.
- Notifications:
- erreurs réseau,
- session live créée/activée,
- refresh OK/KO.
- Output channel dédié:
- logs techniques (HTTP status, erreurs).
- Aucune exécution shell arbitraire.
- Validation stricte des URLs/config.
- Timeout réseau borné.
- Pas de collecte de données externe par défaut.
- commandes essentielles + sync session/vue.
- panneau latéral faustforge (session, vue, run).
- sync temps réel fine (SSE/WebSocket),
- assistants contextuels DSP (intégration MCP).