Skip to content

Справочник API Plannotator

Что вы узнаете

  • Все API-эндпоинты, предоставляемые локальным сервером Plannotator
  • Форматы запросов и ответов для каждого API
  • Различия между интерфейсами проверки планов и проверки кода
  • Справочная информация для интеграции или расширенной разработки

Обзор

Plannotator запускает HTTP-сервер локально (используя Bun.serve), предоставляя RESTful API для проверки планов и проверки кода. Все ответы API в формате JSON, аутентификация не требуется (изолированная локальная среда).

Способы запуска сервера:

  • Случайный порт (локальный режим)
  • Фиксированный порт 19432 (удаленный режим/Devcontainer, можно переопределить через PLANNOTATOR_PORT)

Базовый URL API: http://localhost:<PORT>/api/

Подсказка

Следующие API классифицированы по функциональным модулям, поведение одного и того же пути может отличаться на серверах проверки планов и проверки кода.

API проверки планов

GET /api/plan

Получить текущее содержимое плана и связанные метаданные.

Запрос: нет

Пример ответа:

json
{
  "plan": "# Implementation Plan: User Authentication\n...",
  "origin": "claude-code",
  "permissionMode": "read-write",
  "sharingEnabled": true
}
ПолеТипОписание
planstringСодержимое плана в формате Markdown
originstringИдентификатор источника ("claude-code" или "opencode")
permissionModestringТекущий режим разрешений (только для Claude Code)
sharingEnabledbooleanВключена ли возможность совместного доступа по URL

POST /api/approve

Утвердить текущий план с возможностью сохранения в приложение для заметок.

Тело запроса:

json
{
  "obsidian": {
    "vaultPath": "/Users/xxx/Documents/Obsidian",
    "folder": "Plans",
    "tags": ["plannotator"],
    "plan": "Plan content..."
  },
  "bear": {
    "plan": "Plan content..."
  },
  "feedback": "Примечание при утверждении (только OpenCode)",
  "agentSwitch": "gpt-4",
  "permissionMode": "read-write",
  "planSave": {
    "enabled": true,
    "customPath": "/path/to/custom/folder"
  }
}

Пример ответа:

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

Описание полей:

ПолеТипОбязательноОписание
obsidianobjectНетКонфигурация сохранения в Obsidian
bearobjectНетКонфигурация сохранения в Bear
feedbackstringНетПримечание при утверждении (только OpenCode)
agentSwitchstringНетИмя агента для переключения (только OpenCode)
permissionModestringНетЗапрашиваемый режим разрешений (только Claude Code)
planSaveobjectНетКонфигурация сохранения плана

Поля конфигурации Obsidian:

ПолеТипОбязательноОписание
vaultPathstringДаПуть к файлу хранилища
folderstringНетЦелевая папка (по умолчанию корневая директория)
tagsstring[]НетАвтоматически генерируемые теги
planstringДаСодержимое плана

POST /api/deny

Отклонить текущий план и предоставить обратную связь.

Тело запроса:

json
{
  "feedback": "Необходимо добавить покрытие модульными тестами",
  "planSave": {
    "enabled": true,
    "customPath": "/path/to/custom/folder"
  }
}

Пример ответа:

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

Описание полей:

ПолеТипОбязательноОписание
feedbackstringНетПричина отклонения (по умолчанию "Plan rejected by user")
planSaveobjectНетКонфигурация сохранения плана

GET /api/obsidian/vaults

Обнаружить локально настроенные хранилища Obsidian.

Запрос: нет

Пример ответа:

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

Пути к файлам конфигурации:

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

API проверки кода

GET /api/diff

Получить текущее содержимое git diff.

Запрос: нет

Пример ответа:

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
}
ПолеТипОписание
rawPatchstringПатч в унифицированном формате Git diff
gitRefstringИспользуемая ссылка Git
originstringИдентификатор источника
diffTypestringТекущий тип diff
gitContextobjectКонтекстная информация Git
sharingEnabledbooleanВключена ли возможность совместного доступа по URL

Описание полей gitContext:

ПолеТипОписание
currentBranchstringИмя текущей ветки
defaultBranchstringИмя ветки по умолчанию (main или master)
diffOptionsobject[]Доступные опции типов diff (включая id и label)

POST /api/diff/switch

Переключиться на другой тип git diff.

Тело запроса:

json
{
  "diffType": "staged"
}

Поддерживаемые типы diff:

ТипКоманда GitОписание
uncommittedgit diff HEADНезафиксированные изменения (по умолчанию)
stagedgit diff --stagedПодготовленные изменения
last-commitgit diff HEAD~1..HEADПоследний коммит
vs maingit diff main..HEADТекущая ветка vs main

Пример ответа:

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

POST /api/feedback

Отправить обратную связь по проверке кода AI-агенту.

Тело запроса:

json
{
  "feedback": "Рекомендуется добавить логику обработки ошибок",
  "annotations": [
    {
      "id": "1",
      "type": "suggestion",
      "filePath": "src/index.ts",
      "lineStart": 42,
      "lineEnd": 45,
      "side": "new",
      "text": "Здесь следует использовать try-catch",
      "suggestedCode": "try {\n  // ...\n} catch (err) {\n  console.error(err);\n}"
    }
  ],
  "agentSwitch": "gpt-4"
}

Описание полей:

ПолеТипОбязательноОписание
feedbackstringНетТекстовая обратная связь (LGTM или другое)
annotationsarrayНетМассив структурированных аннотаций
agentSwitchstringНетИмя агента для переключения (только OpenCode)

Поля объекта annotation:

ПолеТипОбязательноОписание
idstringДаУникальный идентификатор
typestringДаТип: comment, suggestion, concern
filePathstringДаПуть к файлу
lineStartnumberДаНомер начальной строки
lineEndnumberДаНомер конечной строки
sidestringДаСторона: "old" или "new"
textstringНетСодержимое комментария
suggestedCodestringНетПредлагаемый код (тип suggestion)

Пример ответа:

json
{
  "ok": true
}

Общие API

GET /api/image

Получить изображение (локальный путь к файлу или загруженный временный файл).

Параметры запроса:

ПараметрТипОбязательноОписание
pathstringДаПуть к файлу изображения

Пример запроса: GET /api/image?path=/tmp/plannotator/abc-123.png

Ответ: Файл изображения (PNG/JPEG/WebP)

Ответы с ошибками:

  • 400 - Отсутствует параметр path
  • 404 - Файл не существует
  • 500 - Ошибка чтения файла

POST /api/upload

Загрузить изображение во временную директорию, вернуть доступный путь.

Запрос: multipart/form-data

ПолеТипОбязательноОписание
fileFileДаФайл изображения

Поддерживаемые форматы: PNG, JPEG, WebP

Пример ответа:

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

Ответы с ошибками:

  • 400 - Файл не предоставлен
  • 500 - Ошибка загрузки

Примечание

Загруженные изображения сохраняются в директории /tmp/plannotator, автоматическая очистка после закрытия сервера не выполняется.


GET /api/agents

Получить список доступных агентов OpenCode (только OpenCode).

Запрос: нет

Пример ответа:

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"
    }
  ]
}

Правила фильтрации:

  • Возвращаются только агенты с mode === "primary"
  • Исключаются агенты с hidden === true

Ответ с ошибкой:

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

Обработка ошибок

HTTP-коды состояния

Код состоянияОписание
200Запрос успешен
400Ошибка валидации параметров
404Ресурс не найден
500Внутренняя ошибка сервера

Формат ответа с ошибкой

json
{
  "error": "Описание ошибки"
}

Распространенные ошибки

ОшибкаУсловие возникновения
Missing path parameter/api/image отсутствует параметр path
File not found/api/image указанный файл не существует
No file provided/api/upload файл не загружен
Missing diffType/api/diff/switch отсутствует поле diffType
Port ${PORT} in useПорт уже занят (ошибка запуска сервера)

Поведение сервера

Механизм повторных попыток порта

  • Максимальное количество повторных попыток: 5
  • Задержка повторной попытки: 500 миллисекунд
  • Ошибка таймаута: Port ${PORT} in use after 5 retries

Подсказка для удаленного режима

В удаленном режиме/режиме Devcontainer, если порт занят, можно использовать другой порт, установив переменную окружения PLANNOTATOR_PORT.

Ожидание решения

После запуска сервер переходит в состояние ожидания решения пользователя:

Сервер проверки планов:

  • Ожидает вызова /api/approve или /api/deny
  • После вызова возвращает решение и закрывает сервер

Сервер проверки кода:

  • Ожидает вызова /api/feedback
  • После вызова возвращает обратную связь и закрывает сервер

Откат SPA

Все несопоставленные пути возвращают встроенный HTML (одностраничное приложение):

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

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

Это обеспечивает нормальную работу фронтенд-маршрутизации.


Переменные окружения

ПеременнаяОписаниеЗначение по умолчанию
PLANNOTATOR_REMOTEВключить удаленный режимНе установлено
PLANNOTATOR_PORTФиксированный номер портаСлучайный (локальный) / 19432 (удаленный)
PLANNOTATOR_ORIGINИдентификатор источника"claude-code" или "opencode"
PLANNOTATOR_SHAREОтключить совместный доступ по URLНе установлено (включено)

Подсказка

Дополнительную информацию о конфигурации переменных окружения см. в разделе Конфигурация переменных окружения.


Резюме урока

Plannotator предоставляет полный локальный HTTP API, поддерживающий две основные функции: проверку планов и проверку кода:

  • API проверки планов: Получение плана, решения об утверждении/отклонении, интеграция с Obsidian/Bear
  • API проверки кода: Получение diff, переключение типа diff, отправка структурированной обратной связи
  • Общие API: Загрузка и скачивание изображений, запрос списка агентов
  • Обработка ошибок: Унифицированные HTTP-коды состояния и формат ошибок

Все API работают локально, данные не загружаются, безопасно и надежно.


Приложение: Справочник по исходному коду

Нажмите, чтобы развернуть и просмотреть расположение исходного кода

Время обновления: 2026-01-24

ФункцияПуть к файлуНомера строк
Точка входа сервера проверки плановpackages/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 (проверка планов)packages/server/index.ts182-198
Точка входа сервера проверки кодаpackages/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 (проверка кода)packages/server/review.ts203-219

Ключевые константы:

  • MAX_RETRIES = 5: Максимальное количество повторных попыток запуска сервера (packages/server/index.ts:79, packages/server/review.ts:68)
  • RETRY_DELAY_MS = 500: Задержка повторной попытки порта (packages/server/index.ts:80, packages/server/review.ts:69)

Ключевые функции:

  • startPlannotatorServer(options): Запуск сервера проверки планов (packages/server/index.ts:91)
  • startReviewServer(options): Запуск сервера проверки кода (packages/server/review.ts:79)