# プロジェクトの管理

`shishoctl project` コマンドは、Shisho Cloudの包括的なプロジェクト管理機能を提供します。このガイドでは、プロジェクトのライフサイクル、メンバー管理、スコープ設定、通知設定など、プロジェクト関連のすべての操作について説明します。

## 前提条件

プロジェクトコマンドを使用する前に、以下を準備してください：

1. `shishoctl` のインストール（[インストール](/docs/ja/c/accessing-via-shishoctl-cli/index.md#インストール)を参照）
2. Shisho Cloud へのサインイン：
   ```shell
   shishoctl auth signin
   ```
3. 組織 ID（Shisho Cloud ダッシュボードの URL から確認可能）

## プロジェクトのライフサイクル管理

### プロジェクトの作成

以下のコマンドにより、組織内に新しいプロジェクトを作成できます：

```shell
shishoctl project create --org <ORGANIZATION_ID> --name <PROJECT_NAME> [--description <DESCRIPTION>]
```

**例：**

```shell
shishoctl project create --org org-a --name "Web Application Security" --description "ウェブアプリケーションのセキュリティ分析"
```

`--quiet` オプションを使用することで、プロジェクト ID のみを取得できます：

```shell
PROJECT_ID=$(shishoctl project create --org org-a --name "My Project" --quiet)
echo "作成されたプロジェクト: $PROJECT_ID"
```

### プロジェクトの一覧表示

以下のコマンドにより、組織内のすべてのプロジェクトを一覧表示できます：

```shell
shishoctl project list --org <ORGANIZATION_ID>
```

**ページネーション付き：**

```shell
# 最初の25プロジェクトを表示
shishoctl project list --org org-a --per-page 25 --page 0

# 1ページあたり50プロジェクトで2ページ目を表示
shishoctl project list --org org-a --per-page 50 --page 1
```

**出力形式：**

```shell
# JSON出力（デフォルト）
shishoctl project list --org org-a --format json

# YAML出力
shishoctl project list --org org-a --format yaml
```

### プロジェクトの削除

以下のコマンドにより、プロジェクトを削除できます（慎重に利用してください）：

```shell
shishoctl project delete --org <ORGANIZATION_ID> --project <PROJECT_ID>
# 確認プロンプトをスキップ
shishoctl project delete --org <ORGANIZATION_ID> --project <PROJECT_ID> --force
```

**例：**

```shell
shishoctl project delete --org org-a --project proj-123 --force
```

:::
プロジェクトの削除は元に戻せません。必ず慎重に利用してください。
`--force` オプションを使用することで、確認プロンプトをスキップできます。
:::

## メンバー管理

### メンバーの追加

**既存の組織ユーザーを追加する場合：**

```shell
# まず、ユーザーIDを取得
USER_ID=$(shishoctl organization users describe --org <ORGANIZATION_ID> --email <USER_EMAIL> --id)

# ロールを指定してユーザーをプロジェクトに追加
shishoctl project member add --org <ORGANIZATION_ID> --project <PROJECT_ID> --user <USER_ID> --role <ROLE>
```

**新しいユーザーを招待する場合：**

```shell
shishoctl project member invite --org <ORGANIZATION_ID> --project <PROJECT_ID> --email <USER_EMAIL> --role <ROLE>
```

**利用可能なロール：**

- `owner` - プロジェクトのフルアクセス権限
- `triager` - 検知事項のトリアージが可能
- `viewer` - 読み取り専用

**ワークフローの例：**

```shell
# 既存ユーザーを検索
USER_EMAIL="alice@company.com"
USER_ID=$(shishoctl organization users describe --org org-a --email $USER_EMAIL --id)

if [ -z "$USER_ID" ]; then
  echo "ユーザーが見つかりません。招待を送信します"
  shishoctl project member invite --org org-a --project proj-123 --email $USER_EMAIL --role viewer
else
  echo "既存ユーザーを追加します"
  shishoctl project member add --org org-a --project proj-123 --user $USER_ID --role owner
fi
```

### メンバーの一覧表示

以下のコマンドにより、すべてのプロジェクトメンバーを表示できます：

```shell
shishoctl project member list --org <ORGANIZATION_ID> --project <PROJECT_ID>
```

### メンバーの削除

以下のコマンドにより、プロジェクトからユーザーを削除できます：

```shell
shishoctl project member remove --org <ORGANIZATION_ID> --project <PROJECT_ID> --user <USER_ID>
```

## スコープ管理

以下のコマンドにより、プロジェクトスコープにリソースの一覧表示、追加、削除ができます：

### スコープの一覧表示

```shell
shishoctl project scope list --org <ORGANIZATION_ID> --project <PROJECT_ID>
```

### クラウドアカウントをスコープに追加

**方法1: Shisho Cloud のリソース ID を指定する**

```shell
# 利用可能なクラウドアカウントのリソース IDを取得
RESOURCE_ID=$(shishoctl cloud-account describe --org <ORGANIZATION_ID> --googlecloud-project-number <GOOGLECLOUD_PROJECT_NUMBER> --id)

# プロジェクトスコープに追加
shishoctl project scope add --org <ORGANIZATION_ID> --project <PROJECT_ID> --scope <RESOURCE_ID>
```

**方法2: Google Cloud プロジェクト番号を指定する**

```shell
shishoctl project scope add --org <ORGANIZATION_ID> --project <PROJECT_ID> --googlecloud-project-number <GOOGLECLOUD_PROJECT_NUMBER>
```

**例：**

```shell
# Google Cloud プロジェクト番号でスコープに追加
GOOGLECLOUD_PROJECT_NUMBER="514893259785"
shishoctl project scope add --org org-a --project proj-123 --googlecloud-project-number $GOOGLECLOUD_PROJECT_NUMBER
```

### スコープから削除

```shell
shishoctl project scope remove --org <ORGANIZATION_ID> --project <PROJECT_ID> --scope <RESOURCE_ID>
```

## 通知管理

プロジェクトの通知は、メール、通知グループ、Slack、三つの方法で設定できます：

### 通知の一覧表示

```shell
shishoctl project notification list --org <ORGANIZATION_ID> --project <PROJECT_ID>
```

### メール通知の設定

```shell
# メール通知を設定
shishoctl project notification set --org <ORGANIZATION_ID> --project <PROJECT_ID> --email <USER_EMAIL>
```

:::
通知設定に使用するメールアドレスは、組織の許可リストに登録されていることが必要です。
:::

### 通知グループの設定

```shell
# 利用可能な通知グループを一覧表示
shishoctl organization notification group list --org <ORGANIZATION_ID>

# 通知グループを設定
shishoctl project notification set --org <ORGANIZATION_ID> --project <PROJECT_ID> --notification-group <GROUP_ID>
```

### Slack通知の設定

```shell
shishoctl project notification set --org <ORGANIZATION_ID> --project <PROJECT_ID> --slack-workspace-id <WORKSPACE_ID> --slack-channel-id <CHANNEL_ID>
```

:::info
利用したい Slack チャンネルは組織に統合されていることが必要です。
:::

### 通知の削除

```shell
# プロジェクトの通知チャンネルIDを一覧表示
shishoctl project notification list --org <ORGANIZATION_ID> --project <PROJECT_ID>

# IDを確認した後、削除したい通知チャンネルを削除
shishoctl project notification delete --org <ORGANIZATION_ID> --project <PROJECT_ID> <CHANNEL_ID>
```

## 例：プロジェクト全体の設定

たとえば、以下は組織に新しいプロジェクトを作成したあと、メンバー、スコープ、通知をそれぞれ設定し、それらをまとめて表示する Shell スクリプトの例です。

```shell
#!/bin/bash

# 設定
ORGANIZATION_ID="org-a"
PROJECT_NAME="Production Security"
USER_EMAIL="security@company.com"
GOOGLECLOUD_PROJECT_NUMBER="514893259785"

# 認証
shishoctl auth signin

# プロジェクト作成
echo "プロジェクトを作成中: $PROJECT_NAME"
PROJECT_ID=$(shishoctl project create --org $ORGANIZATION_ID --name "$PROJECT_NAME" --quiet)
echo "作成されたプロジェクト: $PROJECT_ID"

# ユーザーをオーナーとして追加
echo "ユーザーをプロジェクトオーナーとして追加中"
USER_ID=$(shishoctl organization users describe --org $ORGANIZATION_ID --email $USER_EMAIL --id)
if [ -n "$USER_ID" ]; then
  shishoctl project member add --org $ORGANIZATION_ID --project $PROJECT_ID --user $USER_ID --role owner
  echo "ユーザー $USER_EMAIL をオーナーとして追加しました"
else
  shishoctl project member invite --org $ORGANIZATION_ID --project $PROJECT_ID --email $USER_EMAIL --role owner
  echo "ユーザー $USER_EMAIL をオーナーとして招待しました"
fi

# Google Cloud プロジェクトをスコープに追加
echo "Google Cloud プロジェクトをスコープに追加中"
shishoctl project scope add --org $ORGANIZATION_ID --project $PROJECT_ID --googlecloud-project-number $GOOGLECLOUD_PROJECT_NUMBER

# メール通知を設定
echo "メール通知を設定中"
shishoctl project notification set --org $ORGANIZATION_ID --project $PROJECT_ID --email $USER_EMAIL

# 設定を確認
echo "=== プロジェクト設定完了 ==="
echo "メンバー:"
shishoctl project member list --org $ORGANIZATION_ID --project $PROJECT_ID

echo "スコープ:"
shishoctl project scope list --org $ORGANIZATION_ID --project $PROJECT_ID

echo "通知:"
shishoctl project notification list --org $ORGANIZATION_ID --project $PROJECT_ID
```

## よく使うコマンドオプション

### ページネーションの使用

組織のプロジェクトは一覧コマンドで全部を見れない場合は、ページネーションを使用してください：

```shell
# すべてのプロジェクトを取得
PAGE=0
PER_PAGE=50

while true; do
  PROJECTS=$(shishoctl project list --org $ORGANIZATION_ID --page $PAGE --per-page $PER_PAGE)
  PROJECT_COUNT=$(echo "$PROJECTS" | jq 'length')

  if [ "$PROJECT_COUNT" -eq 0 ]; then
    break
  fi

  echo "ページ $PAGE の $PROJECT_COUNT プロジェクトを処理中"
  # プロジェクトを処理...

  PAGE=$((PAGE + 1))
done
```

### 条件分岐での操作

変更を行う前に、プロジェクトの状態を確認してください：

```shell
# まだ存在しない場合のみスコープを追加
CURRENT_SCOPE=$(shishoctl project scope list --org $ORGANIZATION_ID --project $PROJECT_ID)
SCOPE_COUNT=$(echo "$CURRENT_SCOPE" | jq 'length')

if [ "$SCOPE_COUNT" -eq 0 ]; then
  echo "空のスコープにクラウドアカウントを追加中"
  shishoctl project scope add --org $ORGANIZATION_ID --project $PROJECT_ID --googlecloud-project-number $GOOGLECLOUD_PROJECT_NUMBER
else
  echo "プロジェクトスコープは既に設定されています"
fi
```

## コマンドヘルプ

プロジェクトコマンドのさらなる用法については、`--help` オプションを通して確認してください：

```shell
shishoctl project --help
shishoctl project create --help
shishoctl project member --help
```

組織レベルの操作（ユーザー、チーム、通知グループ）については、以下のコマンドを通して確認してください：

```shell
shishoctl organization --help
```
