Skip to content

Plannotator API リファレンス

学習目標

  • Plannotator ローカルサーバーが提供するすべての API エンドポイントを理解する
  • 各 API のリクエストとレスポンス形式を確認する
  • 計画レビューとコードレビューのインターフェースの違いを理解する
  • 統合や拡張開発のための参考資料を得る

概要

Plannotator はローカルで HTTP サーバー(Bun.serve を使用)を実行し、計画レビューとコードレビュー用の RESTful API を提供します。すべての API レスポンスは JSON 形式で、認証は不要です(ローカル隔離環境)。

サーバー起動方式

  • ランダムポート(ローカルモード)
  • 固定ポート 19432(リモート/Devcontainer モード、PLANNOTATOR_PORT で上書き可能)

API ベース URLhttp://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 専用)
sharingEnabledbooleanURL 共有が有効かどうか

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いいえ切り替え先の Agent 名(OpenCode のみ)
permissionModestringいいえリクエストする権限モード(Claude Code のみ)
planSaveobjectいいえ計画保存設定

Obsidian 設定フィールド

フィールド必須説明
vaultPathstringはいVault ファイルパス
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 vault を検出します。

リクエスト:なし

レスポンス例

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
}
フィールド説明
rawPatchstringGit diff 統一形式パッチ
gitRefstring使用された Git 参照
originstringソース識別子
diffTypestring現在の diff タイプ
gitContextobjectGit コンテキスト情報
sharingEnabledbooleanURL 共有が有効かどうか

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 Agent に送信します。

リクエストボディ

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いいえ切り替え先の Agent 名(OpenCode のみ)

annotation オブジェクトフィールド

フィールド必須説明
idstringはい一意識別子
typestringはいタイプ:commentsuggestionconcern
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 Agent のリストを取得します(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" の agent のみを返す
  • hidden === true の agent を除外

エラーレスポンス

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

エラーハンドリング

HTTP ステータスコード

ステータスコード説明
200リクエスト成功
400パラメータ検証失敗
404リソースが存在しません
500サーバー内部エラー

エラーレスポンス形式

json
{
  "error": "エラー説明メッセージ"
}

よくあるエラー

エラートリガー条件
Missing path parameter/api/imagepath パラメータがない
File not found/api/image で指定されたファイルが存在しない
No file provided/api/upload でファイルがアップロードされていない
Missing diffType/api/diff/switchdiffType フィールドがない
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_SHAREURL 共有を無効化未設定(有効)

ヒント

環境変数の詳細な設定については、環境変数設定 セクションを参照してください。


本課のまとめ

Plannotator は完全なローカル HTTP API を提供し、計画レビューとコードレビューの 2 つのコア機能をサポートしています:

  • 計画レビュー API:計画の取得、承認/却下の決定、Obsidian/Bear 統合
  • コードレビュー API:diff の取得、diff タイプの切り替え、構造化フィードバックの送信
  • 共有 API:画像のアップロード/ダウンロード、Agent リストのクエリ
  • エラーハンドリング:統一された 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:79packages/server/review.ts:68
  • RETRY_DELAY_MS = 500:ポートリトライ遅延(packages/server/index.ts:80packages/server/review.ts:69

重要な関数

  • startPlannotatorServer(options):計画レビューサーバーを起動(packages/server/index.ts:91
  • startReviewServer(options):コードレビューサーバーを起動(packages/server/review.ts:79