Skip to content

Référence API Plannotator

Ce que vous apprendrez

  • Découvrir tous les endpoints API fournis par le serveur local Plannotator
  • Consulter les formats de requête et de réponse de chaque API
  • Comprendre les différences entre les interfaces de revue de plan et de revue de code
  • Disposer d'une référence pour l'intégration ou le développement d'extensions

Vue d'ensemble

Plannotator exécute un serveur HTTP local (utilisant Bun.serve) qui fournit des API RESTful pour la revue de plan et la revue de code. Toutes les réponses API sont au format JSON, sans authentification requise (environnement local isolé).

Modes de démarrage du serveur :

  • Port aléatoire (mode local)
  • Port fixe 19432 (mode distant/Devcontainer, configurable via PLANNOTATOR_PORT)

URL de base de l'API : http://localhost:<PORT>/api/

Conseil

Les API suivantes sont classées par module fonctionnel. Le comportement d'un même chemin peut différer entre les serveurs de revue de plan et de revue de code.

API de revue de plan

GET /api/plan

Récupère le contenu du plan actuel et les métadonnées associées.

Requête : Aucune

Exemple de réponse :

json
{
  "plan": "# Implementation Plan: User Authentication\n...",
  "origin": "claude-code",
  "permissionMode": "read-write",
  "sharingEnabled": true
}
ChampTypeDescription
planstringContenu Markdown du plan
originstringIdentifiant de source ("claude-code" ou "opencode")
permissionModestringMode de permission actuel (spécifique à Claude Code)
sharingEnabledbooleanPartage par URL activé

POST /api/approve

Approuve le plan actuel, avec option de sauvegarde dans une application de notes.

Corps de la requête :

json
{
  "obsidian": {
    "vaultPath": "/Users/xxx/Documents/Obsidian",
    "folder": "Plans",
    "tags": ["plannotator"],
    "plan": "Plan content..."
  },
  "bear": {
    "plan": "Plan content..."
  },
  "feedback": "Remarque lors de l'approbation (OpenCode uniquement)",
  "agentSwitch": "gpt-4",
  "permissionMode": "read-write",
  "planSave": {
    "enabled": true,
    "customPath": "/path/to/custom/folder"
  }
}

Exemple de réponse :

json
{
  "ok": true,
  "savedPath": "/Users/xxx/.plannotator/plans/approved-plan-20260124.md"
}

Description des champs :

ChampTypeRequisDescription
obsidianobjectNonConfiguration de sauvegarde Obsidian
bearobjectNonConfiguration de sauvegarde Bear
feedbackstringNonRemarque accompagnant l'approbation (OpenCode uniquement)
agentSwitchstringNonNom de l'Agent vers lequel basculer (OpenCode uniquement)
permissionModestringNonMode de permission demandé (Claude Code uniquement)
planSaveobjectNonConfiguration de sauvegarde du plan

Champs de configuration Obsidian :

ChampTypeRequisDescription
vaultPathstringOuiChemin du fichier Vault
folderstringNonDossier cible (racine par défaut)
tagsstring[]NonTags générés automatiquement
planstringOuiContenu du plan

POST /api/deny

Rejette le plan actuel et fournit un retour.

Corps de la requête :

json
{
  "feedback": "Des tests unitaires supplémentaires sont nécessaires",
  "planSave": {
    "enabled": true,
    "customPath": "/path/to/custom/folder"
  }
}

Exemple de réponse :

json
{
  "ok": true,
  "savedPath": "/Users/xxx/.plannotator/plans/denied-plan-20260124.md"
}

Description des champs :

ChampTypeRequisDescription
feedbackstringNonMotif du rejet (par défaut "Plan rejected by user")
planSaveobjectNonConfiguration de sauvegarde du plan

GET /api/obsidian/vaults

Détecte les vaults Obsidian configurés localement.

Requête : Aucune

Exemple de réponse :

json
{
  "vaults": [
    "/Users/xxx/Documents/Obsidian",
    "/Users/xxx/Documents/OtherVault"
  ]
}

Chemin du fichier de configuration :

  • macOS : ~/Library/Application Support/obsidian/obsidian.json
  • Windows : %APPDATA%\obsidian\obsidian.json
  • Linux : ~/.config/obsidian/obsidian.json

API de revue de code

GET /api/diff

Récupère le contenu du git diff actuel.

Requête : Aucune

Exemple de réponse :

json
{
  "rawPatch": "diff --git a/src/index.ts b/src/index.ts\n...",
  "gitRef": "HEAD",
  "origin": "opencode",
  "diffType": "uncommitted",
  "gitContext": {
    "currentBranch": "feature/auth",
    "defaultBranch": "main",
    "diffOptions": [
      { "id": "uncommitted", "label": "Uncommitted changes" },
      { "id": "last-commit", "label": "Last commit" },
      { "id": "branch", "label": "vs main" }
    ]
  },
  "sharingEnabled": true
}
ChampTypeDescription
rawPatchstringPatch au format unifié Git diff
gitRefstringRéférence Git utilisée
originstringIdentifiant de source
diffTypestringType de diff actuel
gitContextobjectInformations de contexte Git
sharingEnabledbooleanPartage par URL activé

Description des champs gitContext :

ChampTypeDescription
currentBranchstringNom de la branche actuelle
defaultBranchstringNom de la branche par défaut (main ou master)
diffOptionsobject[]Options de types de diff disponibles (contient id et label)

POST /api/diff/switch

Bascule vers un type de git diff différent.

Corps de la requête :

json
{
  "diffType": "staged"
}

Types de diff supportés :

TypeCommande GitDescription
uncommittedgit diff HEADModifications non commitées (par défaut)
stagedgit diff --stagedModifications indexées
last-commitgit diff HEAD~1..HEADDernier commit
vs maingit diff main..HEADBranche actuelle vs main

Exemple de réponse :

json
{
  "rawPatch": "diff --git a/src/index.ts b/src/index.ts\n...",
  "gitRef": "--staged",
  "diffType": "staged"
}

POST /api/feedback

Soumet un retour de revue de code à l'Agent IA.

Corps de la requête :

json
{
  "feedback": "Suggère d'ajouter une logique de gestion des erreurs",
  "annotations": [
    {
      "id": "1",
      "type": "suggestion",
      "filePath": "src/index.ts",
      "lineStart": 42,
      "lineEnd": 45,
      "side": "new",
      "text": "Un try-catch devrait être utilisé ici",
      "suggestedCode": "try {\n  // ...\n} catch (err) {\n  console.error(err);\n}"
    }
  ],
  "agentSwitch": "gpt-4"
}

Description des champs :

ChampTypeRequisDescription
feedbackstringNonRetour textuel (LGTM ou autre)
annotationsarrayNonTableau d'annotations structurées
agentSwitchstringNonNom de l'Agent vers lequel basculer (OpenCode uniquement)

Champs de l'objet annotation :

ChampTypeRequisDescription
idstringOuiIdentifiant unique
typestringOuiType : comment, suggestion, concern
filePathstringOuiChemin du fichier
lineStartnumberOuiNuméro de ligne de début
lineEndnumberOuiNuméro de ligne de fin
sidestringOuiCôté : "old" ou "new"
textstringNonContenu du commentaire
suggestedCodestringNonCode suggéré (type suggestion)

Exemple de réponse :

json
{
  "ok": true
}

API partagées

GET /api/image

Récupère une image (chemin de fichier local ou fichier temporaire téléchargé).

Paramètres de requête :

ParamètreTypeRequisDescription
pathstringOuiChemin du fichier image

Exemple de requête : GET /api/image?path=/tmp/plannotator/abc-123.png

Réponse : Fichier image (PNG/JPEG/WebP)

Réponses d'erreur :

  • 400 - Paramètre path manquant
  • 404 - Fichier inexistant
  • 500 - Échec de lecture du fichier

POST /api/upload

Télécharge une image vers le répertoire temporaire et retourne un chemin accessible.

Requête : multipart/form-data

ChampTypeRequisDescription
fileFileOuiFichier image

Formats supportés : PNG, JPEG, WebP

Exemple de réponse :

json
{
  "path": "/tmp/plannotator/abc-123-def456.png"
}

Réponses d'erreur :

  • 400 - Aucun fichier fourni
  • 500 - Échec du téléchargement

Remarque

Les images téléchargées sont sauvegardées dans le répertoire /tmp/plannotator et ne sont pas automatiquement nettoyées à l'arrêt du serveur.


GET /api/agents

Récupère la liste des Agents OpenCode disponibles (OpenCode uniquement).

Requête : Aucune

Exemple de réponse :

json
{
  "agents": [
    {
      "id": "gpt-4",
      "name": "GPT-4",
      "description": "Most capable model for complex tasks"
    },
    {
      "id": "gpt-4o",
      "name": "GPT-4o",
      "description": "Fast and efficient multimodal model"
    }
  ]
}

Règles de filtrage :

  • Retourne uniquement les agents avec mode === "primary"
  • Exclut les agents avec hidden === true

Réponse d'erreur :

json
{
  "agents": [],
  "error": "Failed to fetch agents"
}

Gestion des erreurs

Codes de statut HTTP

CodeDescription
200Requête réussie
400Échec de validation des paramètres
404Ressource inexistante
500Erreur interne du serveur

Format des réponses d'erreur

json
{
  "error": "Message de description de l'erreur"
}

Erreurs courantes

ErreurCondition de déclenchement
Missing path parameterParamètre path manquant pour /api/image
File not foundFichier spécifié inexistant pour /api/image
No file providedAucun fichier téléchargé pour /api/upload
Missing diffTypeChamp diffType manquant pour /api/diff/switch
Port ${PORT} in usePort déjà utilisé (échec du démarrage du serveur)

Comportement du serveur

Mécanisme de réessai de port

  • Nombre maximum de tentatives : 5
  • Délai entre les tentatives : 500 millisecondes
  • Erreur de timeout : Port ${PORT} in use after 5 retries

Avertissement pour le mode distant

En mode distant/Devcontainer, si le port est occupé, vous pouvez utiliser un autre port en définissant la variable d'environnement PLANNOTATOR_PORT.

Attente de décision

Après le démarrage, le serveur entre en état d'attente de décision utilisateur :

Serveur de revue de plan :

  • Attend un appel à /api/approve ou /api/deny
  • Retourne la décision et arrête le serveur après l'appel

Serveur de revue de code :

  • Attend un appel à /api/feedback
  • Retourne le retour et arrête le serveur après l'appel

Fallback SPA

Tous les chemins non correspondants retournent le HTML embarqué (application monopage) :

http
HTTP/1.1 200 OK
Content-Type: text/html

<!DOCTYPE html>
<html>
...
</html>

Cela garantit le bon fonctionnement du routage frontend.


Variables d'environnement

VariableDescriptionValeur par défaut
PLANNOTATOR_REMOTEActive le mode distantNon défini
PLANNOTATOR_PORTNuméro de port fixeAléatoire (local) / 19432 (distant)
PLANNOTATOR_ORIGINIdentifiant de source"claude-code" ou "opencode"
PLANNOTATOR_SHAREDésactive le partage par URLNon défini (activé)

Conseil

Pour plus de détails sur la configuration des variables d'environnement, consultez la section Configuration des variables d'environnement.


Résumé

Plannotator fournit une API HTTP locale complète supportant deux fonctionnalités principales : la revue de plan et la revue de code :

  • API de revue de plan : Récupération du plan, décisions d'approbation/rejet, intégration Obsidian/Bear
  • API de revue de code : Récupération du diff, changement de type de diff, soumission de retours structurés
  • API partagées : Téléchargement d'images, requête de liste d'Agents
  • Gestion des erreurs : Codes de statut HTTP et formats d'erreur unifiés

Toutes les API s'exécutent localement, sans téléchargement de données, garantissant sécurité et fiabilité.


Annexe : Référence du code source

Cliquez pour afficher les emplacements du code source

Dernière mise à jour : 2026-01-24

FonctionnalitéChemin du fichierLignes
Point d'entrée du serveur de revue de planpackages/server/index.ts91-355
GET /api/planpackages/server/index.ts132-134
POST /api/approvepackages/server/index.ts200-277
POST /api/denypackages/server/index.ts279-309
GET /api/imagepackages/server/index.ts136-151
POST /api/uploadpackages/server/index.ts153-174
GET /api/obsidian/vaultspackages/server/index.ts176-180
GET /api/agents (revue de plan)packages/server/index.ts182-198
Point d'entrée du serveur de revue de codepackages/server/review.ts79-288
GET /api/diffpackages/server/review.ts117-127
POST /api/diff/switchpackages/server/review.ts129-161
POST /api/feedbackpackages/server/review.ts221-242
GET /api/agents (revue de code)packages/server/review.ts203-219

Constantes clés :

  • MAX_RETRIES = 5 : Nombre maximum de tentatives de démarrage du serveur (packages/server/index.ts:79, packages/server/review.ts:68)
  • RETRY_DELAY_MS = 500 : Délai de réessai de port (packages/server/index.ts:80, packages/server/review.ts:69)

Fonctions clés :

  • startPlannotatorServer(options) : Démarre le serveur de revue de plan (packages/server/index.ts:91)
  • startReviewServer(options) : Démarre le serveur de revue de code (packages/server/review.ts:79)