Skip to content
This repository was archived by the owner on Jun 24, 2026. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 91 additions & 0 deletions docs/sdd/design/chrome-sidecar/api/environment-api.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# API設計: Environment API拡張

## 概要

環境APIの作成・更新エンドポイントにchromeSidecar設定のバリデーションを追加する。

## 対応要件

REQ-003-001, REQ-003-002, REQ-003-003

## 変更エンドポイント

### PUT /api/environments/:id

既存のconfig JSONバリデーションに、chromeSidecar固有のバリデーションルールを追加する。

### POST /api/environments
Comment on lines +13 to +17

Copilot AI Mar 22, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

設計書が /api/environments/:id の PUT/POST を前提にしていますが、このリポジトリでは /api/environments/:id は 410 Gone の deprecated エンドポイントで、後継は /api/projects/[project_id]/environment です(src/app/api/environments/[id]/route.ts 参照)。ドキュメント内のエンドポイント表記とコード例を後継 API に更新してください。

Suggested change
### PUT /api/environments/:id
既存のconfig JSONバリデーションに、chromeSidecar固有のバリデーションルールを追加する。
### POST /api/environments
### PUT /api/projects/:project_id/environment
既存のconfig JSONバリデーションに、chromeSidecar固有のバリデーションルールを追加する。
### POST /api/projects/:project_id/environment

Copilot uses AI. Check for mistakes.

環境作成時も同様のバリデーションを適用する。

## バリデーション仕様

### リクエストボディ (config部分)

```json
{
"config": {
"imageName": "ghcr.io/windschord/claude-work-sandbox",
"imageTag": "latest",
"chromeSidecar": {
"enabled": true,
"image": "ghcr.io/windschord/claude-work-sandbox",
"tag": "chrome-devtools"
}
}
}
```

### バリデーションルール

| フィールド | ルール | HTTPステータス | エラーメッセージ |
|-----------|--------|--------------|-----------------|
| chromeSidecar | オプション(省略時はenabled:falseとして扱う) | - | - |
| chromeSidecar.enabled | boolean型、必須(chromeSidecarが存在する場合) | 400 | "chromeSidecar.enabled is required and must be a boolean" |
| chromeSidecar.image | 文字列型、`/^[-a-z0-9._/]+$/` に適合、必須 | 400 | "chromeSidecar.image must be a valid Docker image name" |
| chromeSidecar.tag | 文字列型、空文字不可、`latest`不可、必須 | 400 | "chromeSidecar.tag must be a specific version (latest is not allowed)" |
| chromeSidecar + type=HOST | chromeSidecarは無視される(HOST環境には適用不可) | - | - |

### バリデーション実装箇所

環境APIのバリデーションロジック内に追加する。

```typescript
function validateChromeSidecarConfig(
config: Record<string, unknown>
): string | null {
if (!config.chromeSidecar) return null; // 省略OK

const sidecar = config.chromeSidecar as Record<string, unknown>;

if (typeof sidecar.enabled !== 'boolean') {
return 'chromeSidecar.enabled is required and must be a boolean';
}

if (!sidecar.enabled) return null; // disabled時はimage/tagのバリデーション不要

if (typeof sidecar.image !== 'string' || !/^[-a-z0-9._/]+$/.test(sidecar.image)) {
return 'chromeSidecar.image must be a valid Docker image name (lowercase alphanumeric, dots, slashes, hyphens)';
}

if (typeof sidecar.tag !== 'string' || sidecar.tag.trim() === '') {
return 'chromeSidecar.tag is required';
}

if (sidecar.tag === 'latest') {
return 'chromeSidecar.tag must be a specific version (latest is not allowed for reproducibility)';
}

return null;
}
```

## レスポンス

変更なし。既存のEnvironmentレスポンスにconfig JSONが含まれており、chromeSidecarもその中に格納される。

## 後方互換性

- chromeSidecarキーが存在しないconfig JSONは引き続き有効
- 既存の環境レコードに変更は不要
- HOST環境のconfigにchromeSidecarが含まれていても無視される(エラーにはしない)
62 changes: 62 additions & 0 deletions docs/sdd/design/chrome-sidecar/api/session-api.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# API設計: Session API拡張

## 概要

セッションAPIのレスポンスにChromeサイドカー情報(コンテナID、デバッグポート)を追加する。

## 対応要件

REQ-004-002, REQ-004-003

## 変更エンドポイント

### GET /api/sessions/:id

レスポンスに chrome_container_id と chrome_debug_port を追加する。

#### レスポンス例 (サイドカーあり)

```json
{
"id": "abc-123",
"name": "my-session",
"status": "running",
"container_id": "claude-env-xxx-12345",
"chrome_container_id": "cw-chrome-abc-123",
"chrome_debug_port": 32789,
...
}
```

#### レスポンス例 (サイドカーなし)

```json
{
"id": "abc-123",
"name": "my-session",
"status": "running",
"container_id": "claude-env-xxx-12345",
"chrome_container_id": null,
"chrome_debug_port": null,
...
}
```

### GET /api/projects/:id/sessions

セッション一覧のレスポンスにも同様に chrome_container_id と chrome_debug_port を含める。

### DELETE /api/sessions/:id

セッション削除時、DockerAdapter.destroySession がサイドカーのクリーンアップを担当するため、APIレイヤーでの追加処理は不要。

## アクセス制御

REQ-004-003 では「セッション所有者または管理者権限を持つユーザーのみ」にChrome情報の表示を制限する要件がある。

現状のclaude-workには認証/認可機能が存在しないため、以下の方針とする:

1. 現時点: chrome_debug_port は全セッションAPIレスポンスに含める
2. 将来の認証機能実装時: APIミドルウェアでユーザー権限を検証し、権限がない場合は chrome_debug_port を null にマスクする

この方針により、将来の認証機能追加時にAPIレスポンスの構造変更が不要となる。
Loading
Loading