Skip to content
Back to skills

Setup

ASecurity

Start DeployGate onboarding — set up app distribution from first upload to team-wide deployment

  • 3 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added May 29, 2026
developmentgokotlinbashtestinggitapici/cdsecurity

Works with

  • cli
  • api
  • mcp

Security analysis

A100/100

Pro scans all 6 files and shows the line behind each finding

Scanned May 29, 2026

npx -y skills add DeployGate/deploygate-agent-plugin --skill setup --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Setup?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Setup
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/deploygate-setup/badge)](https://www.skillsdirectory.com/skills/deploygate-setup)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: setup
description: Start DeployGate onboarding — set up app distribution from first upload to team-wide deployment
allowed-tools: mcp__deploygate__* Bash(./gradlew:*) Bash(xcodebuild:*) Bash(fastlane:*) Bash(security find-identity:*) Bash(git rev-parse:*) Bash(which:*) Bash(mkdir:*) Bash(cp:*) Bash(zip:*) Bash(cd:*) Bash(ls:*) Read Glob AskUserQuestion
---

## Response Language

Detect the user's language from their first message in the conversation.
If they wrote in Japanese, use the `(ja)` block at every user-facing
location below. Otherwise (English or any other language), use the
`(en)` block. If unsure, default to `(en)`.

User-facing locations are written as paired blocks marked `(en)` and
`(ja)`. **Use only one — never both.** This applies to: AskUserQuestion
text, progress-display labels, and any prose you quote to the user.
Internal instructions, code blocks, file paths, tool names, and JSON
examples stay English regardless of language.

# DeployGate Onboarding

Guide users through setting up DeployGate for app distribution — from first upload to team-wide deployment.

## When to use

When the user wants to:
- Set up DeployGate for the first time
- Upload and distribute an app
- Get started with DeployGate

## Reference files

Load these on demand when the flow reaches the matching step. Do NOT preload them — each file is substantial and wastes context if unused.

- `references/terminology.md` — **Read this first**, before writing any user-facing response. Defines the user-facing terms (Workspace / Project / Team / Shared Team) and their Japanese equivalents.
- `references/ios-build.md` — iOS build detail: fastlane vs xcodebuild, code signing pre-flight, Personal Team pitfall. Read when handling iOS in Step 2.
- `references/ios-udid.md` — Step 5b UDID registration flow (fastlane register_devices / sigh). Read when a tester cannot install an Ad Hoc build.
- `references/next-steps.md` — Phase 2+ guidance (CI/CD, SDK, team expansion). Read after Phase 1 completes.
- `references/troubleshooting.md` — troubleshooting table. Read on error.

## Progress Display

At the beginning of each step, display a progress indicator. Use ✅ for completed, ▶ for current, and ○ for upcoming. Android skips Step 5.

**Android example (at Step 3) — (en):**
```
📋 Phase 1: DeployGate Setup [3/4]
  Step 1 ✅ Account creation
  Step 2 ✅ App upload
  Step 3 ▶  Distribution page        ← now
  Step 4 ○  Notification setup
```

**Android example (at Step 3) — (ja):**
```
📋 Phase 1: DeployGate セットアップ [3/4]
  Step 1 ✅ アカウント作成
  Step 2 ✅ アプリのアップロード
  Step 3 ▶  配布ページの作成        ← now
  Step 4 ○  通知連携の設定
```

**iOS example (at Step 3) — (en):**
```
📋 Phase 1: DeployGate Setup [3/5]
  Step 1 ✅ Account creation
  Step 2 ✅ App upload
  Step 3 ▶  Distribution page        ← now
  Step 4 ○  Notification setup
  Step 5 ○  iOS device setup
```

**iOS example (at Step 3) — (ja):**
```
📋 Phase 1: DeployGate セットアップ [3/5]
  Step 1 ✅ アカウント作成
  Step 2 ✅ アプリのアップロード
  Step 3 ▶  配布ページの作成        ← now
  Step 4 ○  通知連携の設定
  Step 5 ○  iOS端末セットアップ
```

Show this every time you begin or return to a step. When Phase 1 completes, keep the `[5/5]` (iOS) or `[4/4]` (Android) header and mark every step ✅ — do NOT replace the numeric ratio with `[完了]` or similar.

## User Input Collection

Use the `AskUserQuestion` tool at key decision points — each section below specifies when.

## Initial Assessment

Before starting, detect the platform automatically, then use `AskUserQuestion` to confirm the user's situation:

1. **Platform auto-detection.** Run `ls` in the project root (do NOT use `Glob` for iOS — `*.xcodeproj` and `*.xcworkspace` are macOS bundle directories and Glob will return zero matches). Inspect the output:
   - Contains `build.gradle` or `build.gradle.kts` → Android candidate
   - Contains any name ending in `.xcodeproj` or `.xcworkspace` → iOS candidate
   - If neither is visible at the root, also `ls` any likely platform subdirectories that appear in the root listing (e.g. `app-ios/`, `ios/`, `iosApp/`, `app-android/`, `android/`). KMP / Kotlin Multiplatform and many multi-module repos nest platform projects one level deep — the `.xcodeproj` is often inside `app-ios/`, the Android module inside `app-android/`
   - Both platforms detected (at root or in subdirs) → multi-platform project

2. **Use `AskUserQuestion` to ask:**

   - Question 1 (en): "Do you have a DeployGate account?" (header: "Account")
     - "Yes, I have one" — Continue with browser-based login
     - "No, not yet" — Start with account creation
   - Question 1 (ja): "DeployGate のアカウントはお持ちですか?" (header: "アカウント")
     - "はい、持っています" — ブラウザ認証でログインしてセットアップを続けます
     - "いいえ、まだです" — アカウント作成から始めます

   If both platforms are detected, add a second question:
   - Question 2 (en): "Which platform should we set up first?" (header: "Platform")
     - "Android" / "iOS" / "Both"
   - Question 2 (ja): "どのプラットフォームからセットアップしますか?" (header: "プラットフォーム")
     - "Android" / "iOS" / "両方"

3. **Is there source code available?** If no, the user must provide a pre-built binary.

## API Identifiers (used throughout Phase 1)

DeployGate has two identifier slugs you will reuse across tool calls. Both come from the `get_user_info` / `login_wait` response. Read terminology.md first for the user-facing names; this section is just the API-side mapping.

Response shape (simplified):

```json
[
  {
    "name": "example-workspace",        // workspace slug (legacy: "enterprise")
    "groups": [
      { "name": "shaker-app", ... }      // project slug (legacy: "organization")
    ]
  }
]
```

Mapping — use these consistently:

| Skill placeholder | Source field | Used in |
|---|---|---|
| `owner_name` | project slug (`groups[i].name`) — or the user's own login name for a personal account | `upload_app`, `create_distribution`, `get_notification_settings_url`, member tools |
| `{ENTERPRISE_NAME}` | workspace slug (top-level `name`) | Instant Device enable URL only |
| `app_id` | `package_name` from the `upload_app` response | `create_distribution` |

If the user belongs to multiple projects (more than one entry in `groups`), ask **once** at Step 1 which project to use and reuse that choice for every subsequent tool call — do not re-prompt at Step 2.

## Phase 1: Distribution Setup

### Step 1: Account Creation

Login is browser-based via a device authorization code. The user never pastes a token.

**If the user already has an account:**

1. Call `login_start`. It returns a URL (format: `https://deploygate.com/app/sessions/codes?code=XXXXXXXX`) and a short code. Present the URL to the user and ask them to open it in a browser where they are signed in to DeployGate, then approve the login.
2. Call `login_wait` immediately after — it blocks until the user approves (or the code expires in 5 minutes). On success it returns workspace/project info and saves the token to `~/.config/deploygate/token` (0600).
3. If `login_wait` returns an error (rejected, expired, nonce mismatch), call `login_start` again and retry.

**If the user doesn't have a DeployGate account:**

1. Direct them to sign up: https://deploygate.com/app/register/signup?via=agent-plugin
2. After signup, run the same `login_start` → `login_wait` flow described above.

The saved token persists across future agent sessions — the user does not need to log in again unless they run `logout` or the token is revoked server-side.

If `login_wait` or any later tool returns "stored token is invalid," the local token file has already been cleared; the user just needs to call `login_start` again.

### Step 2: Build and Upload

Use the `owner_name` (project slug) chosen at Step 1. If it was not captured, call `get_user_info` now. See the API Identifiers section for the mapping.

**Enable Instant Device (Beta):** Instant Device (browser-based app preview) is beta and must be enabled per workspace. Present this URL **as the first thing in Step 2**, before reading `ios-build.md` or asking the build-method question — the user clicks it once and you proceed in parallel without waiting:

    https://deploygate.com/app/enterprises/{ENTERPRISE_NAME}/instant-device

Substitute `{ENTERPRISE_NAME}` per the API Identifiers section (workspace slug). The action is idempotent; do not block on confirmation.

**Android:**
```bash
./gradlew assembleDebug
```

Output path depends on module layout:
- **Single-module (module name `app`)**: `app/build/outputs/apk/debug/app-debug.apk`
- **Multi-module / KMP (e.g. module `app-android`)**: `<module>/build/outputs/apk/debug/<module>-debug.apk`
- **With product flavors** (e.g. `dev` / `prod`): adds a flavor segment — `<module>/build/outputs/apk/<flavor>/debug/<module>-<flavor>-debug.apk`

Check `settings.gradle.kts` / `settings.gradle` for the app module name. If the project has multiple Android modules, scope the task: `./gradlew :<app-module>:assembleDebug` (e.g. `./gradlew :app-android:assembleDebug`). After the build, ask the user for the exact APK path before calling `upload_app` rather than guessing.

> IMPORTANT: Do NOT use APKs from Android Studio's Instant Run / Apply Changes — these are incomplete. Always use a full Gradle build.

**iOS:** Read `references/ios-build.md` for the full build procedure (fastlane vs xcodebuild, code signing pre-flight, simulator zip for Instant Device). The IPA is **required**; the simulator zip is an optional addition. Do NOT suggest uploading only the simulator zip as a workaround for a failing IPA build.

**Upload** using the `upload_app` tool:
- `owner_name`: from `get_user_info`
- `file_path`: path to the IPA / APK / AAB
- `ios_simulator_zip`: (iOS only) path to the simulator .zip if built
- `message`: include Git info — e.g. `"feature/login (abc1234)"` or `"PR #42: Login redesign (abc1234)"`

The response contains `package_name` (bundle identifier on iOS, package name on Android) — you will pass this as `app_id` in Step 3.

Auto-detect Git info if available:
```bash
git rev-parse --short HEAD       # commit hash
git rev-parse --abbrev-ref HEAD  # branch name
```

### Step 3: Create Distribution Page

First, use `AskUserQuestion`:

- Question (en): "What is the purpose of this distribution page?" (header: "Distribution purpose")
  - "Development team (Development)" — A page for developers to verify the latest builds
  - "QA testing (QA Build)" — A page for testers to run QA
  - "Beta (Beta)" — A page for internal/external beta testers
- Question (ja): "配布ページの用途を選択してください" (header: "配布用途")
  - "開発チーム向け (Development)" — 開発メンバーが最新ビルドを確認するための配布ページ
  - "QA テスト向け (QA Build)" — テスターがテストするための配布ページ
  - "ベータ版 (Beta)" — 社内・外部ベータテスター向けの配布ページ

Then use `create_distribution`:
- `owner_name`: same as upload
- `platform`: `"ios"` or `"android"`
- `app_id`: the `package_name` field from the upload response
- `title`: based on the user's choice (e.g. `"Development"`, `"QA Build"`, `"Beta"`)

The response includes `access_key`. The distribution page URL is:
```
https://deploygate.com/distributions/{access_key}
```

Share this URL with testers. They can:
- **Mobile**: install the app directly
- **PC**: preview via Instant Device in a browser (no device needed)

**Instant Device requires login.** Testers must be DeployGate members to preview. Member invitation is Phase 4 work — defer entirely. Mention it in one line — (en) "Previewing with Instant Device requires team invitations from Phase 4." / (ja) "Instant Device でのプレビューには Phase 4 のチーム招待が必要です" — and move on; do NOT call `add_member` in Phase 1 regardless of what the user says.

**If the app is an iOS Development or Ad Hoc build (not In-House/Enterprise)**, tell the user:

**(en):**

> When testers open the distribution page link in Safari, they'll be prompted to install the DeployGate configuration profile. Installing the profile registers their device's UDID with DeployGate.
>
> For Ad Hoc / Development builds, testers cannot install on a device unless their UDID is in the Provisioning Profile. Share the link first so they install the profile. If you need physical-device installs, do UDID registration in Step 5 (skip Step 5 if Instant Device browser preview is enough).

**(ja):**

> テスターが配布ページのリンクをSafariで開くと、DeployGateの構成プロファイルのインストールを求められます。プロファイルをインストールすると、そのデバイスのUDIDがDeployGateに登録されます。
>
> Ad Hoc / Development ビルドでは、テスターの UDID が Provisioning Profile に含まれていないと実機インストールできません。まずリンクを共有してプロファイルをインストールしてもらってください。実機インストールが必要な場合は Step 5 で UDID 登録を行います(テスターが Instant Device ブラウザプレビューのみで十分なら Step 5 はスキップ可)。

### Step 4: Notification Setup

**Do not skip this step. Complete it before moving to Step 5.**

Notifications enable:
- Automatic alerts when new builds are uploaded
- Notifications when testers install the app
- Visibility into team activity

Use `get_notification_settings_url` with `level: "distribution"` and the `access_key` from Step 3. The tool returns a text message containing the URL — extract the URL verbatim and share it with the user; do not reformat or add query parameters.

Tell the user:
- (en): "Open this URL in your browser to connect Slack, Microsoft Teams, or Chatwork. The setup takes about 1-2 minutes."
- (ja): "このURLをブラウザで開いて Slack / Microsoft Teams / Chatwork と連携してください。設定は1〜2分で完了します。"

After setup, verify by uploading a test build — a notification should arrive in the connected channel.

**Once notification setup is confirmed, proceed to Step 5 (if iOS) or the Phase 1 Completion Check (if Android).**

### Step 5: iOS Device Setup (if applicable)

> **Prerequisite:** Complete Step 4 before starting this step.

Skip for Android. For iOS, use `AskUserQuestion`:

- Question (en): "Do you need to install the app on testers' physical iOS devices?" (header: "Physical-device test")
  - "Yes, install on devices" — Register UDIDs and update the Provisioning Profile
  - "No, Instant Device (browser preview) is enough" — Proceed to the Phase 1 completion check
- Question (ja): "テスターの iOS 実機にアプリをインストールする必要がありますか?" (header: "実機テスト")
  - "はい、実機にインストールしたい" — UDID 登録と Provisioning Profile の更新を行います
  - "いいえ、Instant Device(ブラウザプレビュー)で十分" — Phase 1 完了チェックに進みます

If the user chooses Instant Device only, skip to the completion check.

#### 5a: Tester Profile Installation

Share the distribution page link with testers and guide them through:

1. Open the distribution page link in **Safari** (other browsers are not supported)
2. Install the DeployGate configuration profile
3. Settings → General → VPN & Device Management → Downloaded Profile → Install
4. Enter the device passcode (not the DeployGate password)

When a tester installs the profile, a notification like "xxx joined 'yyy'" appears in the chat channel configured in Step 4 — this signals the tester is ready.

#### 5b: UDID Registration (Ad Hoc or Development)

If a tester's device UDID is not in the provisioning profile, they see an error asking to contact the developer. Both Ad Hoc and Development builds use device-scoped profiles, so UDID registration applies to both. (In-House / Enterprise builds bypass this — all devices are allowed.)

**Codex can automate the entire UDID registration process.** Read `references/ios-udid.md` for the full fastlane-based workflow (`get_udids` → `fastlane register_devices` → `fastlane sigh` → rebuild → re-upload with the same `distribution_key`).

### Phase 1 Completion Check

Before declaring Phase 1 complete, use `AskUserQuestion`:

- Question 1 (en): "Were testers able to access the app?" (header: "App check", multiSelect: false)
  - "Yes, confirmed" — Verified launch via Instant Device or installed app
  - "Not yet" — Share the distribution page link with testers and follow up
  - "Hitting a problem" — Move to troubleshooting
- Question 1 (ja): "テスターはアプリにアクセスできましたか?" (header: "アプリ確認", multiSelect: false)
  - "はい、確認できました" — Instant Device またはインストールで起動確認済み
  - "まだ確認できていない" — テスターに配布ページのリンクを共有して確認してもらいます
  - "問題が発生している" — トラブルシューティングを行います

- Question 2 (en): "Did the build-upload notification reach the channel you set up in Step 4?" (header: "Notification check", multiSelect: false)
  - "Yes, received" / "No, not received" / "Skipped notification setup"
- Question 2 (ja): "ビルドアップロード時に通知は届きましたか?(Step 4 で設定したチャンネル)" (header: "通知確認", multiSelect: false)
  - "はい、届きました" / "いいえ、届いていない" / "通知設定をスキップした"

Only after both are confirmed, say:
- (en): "Phase 1 is complete — your app is being distributed to testers via DeployGate."
- (ja): "Phase 1 が完了しました — アプリは DeployGate 経由でテスターに配布されています。"

If the user reports issues, read `references/troubleshooting.md` before re-asking.

## Next Steps

After Phase 1 completes, read `references/next-steps.md` for Phase 2 (CI/CD via the `ci-setup` skill), Phase 3 (SDK via the `sdk-setup` skill, Android only), and Phase 4 (team expansion via `add_member` / `create_shared_team` / `assign_shared_team_to_app`).

Files in this skill

  • SKILL.md18.2 KB
  • references/ios-build.md4.5 KB
  • references/ios-udid.md3.1 KB
  • references/next-steps.md1022 B
  • references/terminology.md1.3 KB
  • references/troubleshooting.md975 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.