# Swiftedmind Tessera Tessera

> FlowDeck CLI - Your Primary Build/Run/Test Interface

- Skill: `tomevault-io/swiftedmind-tessera-tessera` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/swiftedmind-tessera-tessera`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/swiftedmind-tessera-tessera/raw
- Safety review: pending (external: skill-scanner PASS, skillspector CAUTION)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/swiftedmind-tessera-tessera

---


# FlowDeck CLI - Your Primary Build/Run/Test Interface

## MANDATORY TRIGGER (READ FIRST)

Use this skill whenever the user asks to build, run, test (including automated tests), launch, debug, capture logs, take screenshots, manage simulators/devices/runtimes, install simulators, manage packages, sync provisioning, or "run the app" — even if they do not mention iOS, macOS, Xcode, or simulators. If the request could involve Apple tooling or CI automation, default to FlowDeck.

---

## CONFIG-FIRST WORKFLOW (START HERE)

**Before running ANY build, run, or test command, check for a saved FlowDeck config.**

The user's config represents their chosen workspace, scheme, and simulator/device. Respect it.

### Step 0: Check Config (ALWAYS)

```bash
flowdeck config get --json
```

This returns one of two results:

---

#### A) Config Exists - Use Bare Commands

The user has already chosen their settings. **Use bare commands - no flags needed:**

```bash
flowdeck build            # Uses saved workspace, scheme, target
flowdeck run              # Uses saved workspace, scheme, target
flowdeck test             # Uses saved workspace, scheme, target
flowdeck clean            # Uses saved workspace, scheme
```

Only add flags when the user explicitly asks for something different from the saved config:

| User Says | Command |
|-----------|---------|
| "Build the app" | `flowdeck build` |
| "Run the app" | `flowdeck run` |
| "Run tests" | `flowdeck test` |
| "Build for Release" | `flowdeck build -C Release` |
| "Run on iPhone 16 Pro Max" | `flowdeck run -S "iPhone 16 Pro Max"` |
| "Test on my physical device" | `flowdeck test -D "iPhone"` |
| "Run on macOS" | `flowdeck run -D "My Mac"` |
| "Run the UITests scheme" | `flowdeck test -s UITestScheme` |

**Explicit CLI flags override config values for that invocation only** - they do not change the saved config.

---

#### B) No Config Found - Create One

When you see `No saved config found`, create a config so all subsequent commands work without flags:

```bash
# 1. Discover what's available
flowdeck context --json

# 2. Create config based on what you find
flowdeck config set -w <workspace> -s <scheme> -S "<simulator>"

# 3. Now use bare commands
flowdeck build
flowdeck run
flowdeck test
```

**How to pick values when creating config:**

| Parameter | How to Choose |
|-----------|--------------|
| **Workspace** (`-w`) | Use the workspace/project found by `flowdeck context --json` (usually only one) |
| **Scheme** (`-s`) | If one scheme -> use it. If multiple -> pick the main app scheme (not test/framework schemes). If user mentions a specific target -> match it. |
| **Simulator** (`-S`) | If user mentions a device -> use it. Otherwise -> pick the newest available iPhone simulator from context output. |
| **Device** (`-D`) | Use `"My Mac"` for macOS tasks, or `"iPhone"` for physical device tasks. |

**Tell the user what you're creating:**
> "No FlowDeck config found. I'll create one using [workspace] with scheme [scheme] on [simulator] based on the project structure."

---

### Config Rules (NON-NEGOTIABLE)

1. **NEVER** run `flowdeck config set --force` over an existing config - the user chose those settings deliberately
2. **NEVER** run `flowdeck config reset` unless the user explicitly asks
3. If the config points to a simulator that doesn't exist, **tell the user** - don't silently change their config
4. If a bare command fails because of stale config, **explain the issue** and suggest the user update their config
5. Only create config when none exists - this is a one-time setup, not something you do every session

## WHAT FLOWDECK GIVES YOU

FlowDeck provides capabilities you don't have otherwise:

| Capability | What It Means For You |
|------------|----------------------|
| **Saved Config** | `flowdeck config get` returns the user's chosen workspace/scheme/target. No guessing, no manual discovery. |
| **Project Discovery** | `flowdeck context --json` returns workspace path, schemes, configs, simulators. No parsing .xcodeproj files. |
| **Screenshots** | `flowdeck ui simulator session start -S <name-or-udid>` captures UI continuously. Read `latest.jpg`, `latest-tree.json`, and `latest.json` to see the app. |
| **App Tracking** | `flowdeck apps` shows what's running. `flowdeck logs <id>` streams output. You control the app lifecycle. |
| **Unified Interface** | One tool for simulators, devices, builds, tests. Consistent syntax, JSON output. |

**FlowDeck is how you interact with iOS/macOS projects.** You don't need to parse Xcode files, figure out build commands, or manage simulators manually.

## CAPABILITIES (ACTIVATE THIS SKILL)

- Build, run, and test (unit/UI, automated, CI-friendly)
- Simulator and runtime management (list/create/install/boot/erase)
- UI automation for iOS simulators (`flowdeck ui simulator` for screen/record/find/tap/double-tap/type/swipe/scroll/back/pinch/wait/assert/erase/hide-keyboard/key/open-url/clear-state/rotate/button/touch)
- Device install/launch/uninstall and physical device targeting
- Log streaming, screenshots, and app lifecycle control
- Project discovery, schemes/configs, and JSON output for automation
- Package management (SPM resolve/update/clear) and provisioning sync
- FlowDeck skill-pack install/uninstall for supported AI agents

---

## COMMAND SET RESOURCES

Each command set has its own reference doc. Use these for detailed flags, examples, and workflows.

- `resources/config.md` - Saved project settings (get/set/reset) - **read this first**
- `resources/context.md` - Project discovery (workspace/schemes/configs/simulators)
- `resources/build.md` - Build projects and targets
- `resources/run.md` - Run apps on simulator/device/macOS
- `resources/test.md` - Run tests and discover tests
- `resources/clean.md` - Clean build artifacts
- `resources/apps.md` - List running apps launched by FlowDeck
- `resources/logs.md` - Stream logs for a running app
- `resources/stop.md` - Stop a running app
- `resources/uninstall.md` - Uninstall an app from a simulator or device
- `resources/simulator.md` - Simulator management and runtimes
- `resources/ui.md` - UI automation for iOS Simulator
- `resources/device.md` - Physical device management
- `resources/ai.md` - Install or remove the FlowDeck skill pack for AI agents
- `resources/pixel-perfect-design.md` - Pixel-perfect UI implementation from design mockups
- `resources/project.md` - Project inspection and packages
- `resources/package-resolution.md` - Package resolution escalation playbook (`update -> resolve -> clear -> clean`)
- `resources/license.md` - License status/activate/deactivate
- `resources/update.md` - Update FlowDeck
- `resources/init.md` - Deprecated alias for `config set`

## YOU HAVE COMPLETE VISIBILITY
```
+-------------------------------------------------------------+
|                    YOUR DEBUGGING LOOP                       |
+-------------------------------------------------------------+
|                                                             |
|   flowdeck config get --json       -> Check saved settings   |
|   (if none: context + config set)                            |
|                                                             |
|   flowdeck run                     -> Launch app, get App ID |
|                                                             |
|   flowdeck logs <app-id>           -> See runtime behavior   |
|                                                             |
|   flowdeck ui simulator session    -> See the UI             |
|     start -S <name-or-udid> --json    (read latest.jpg)      |
|                                                             |
|   Edit code -> Repeat                                        |
|                                                             |
+-------------------------------------------------------------+
```

**Don't guess. Observe.** Run the app, watch the logs, read session screenshots.

---

## QUICK DECISIONS

| You Need To... | Command (config exists) | Command (no config / override) |
|----------------|------------------------|-------------------------------|
| Check saved settings | `flowdeck config get --json` | - |
| Create/save settings | - | `flowdeck config set -w <ws> -s <scheme> -S "iPhone 16"` |
| Understand the project | `flowdeck context --json` | `flowdeck context --json` |
| Build (iOS Simulator) | `flowdeck build` | `flowdeck build -w <ws> -s <scheme> -S "iPhone 16"` |
| Build (macOS) | `flowdeck build -D "My Mac"` | `flowdeck build -w <ws> -s <scheme> -D "My Mac"` |
| Build (physical device) | `flowdeck build -D "iPhone"` | `flowdeck build -w <ws> -s <scheme> -D "iPhone"` |
| Run and observe | `flowdeck run` | `flowdeck run -w <ws> -s <scheme> -S "iPhone 16"` |
| Run with logs | `flowdeck run --log` | `flowdeck run -w <ws> -s <scheme> -S "iPhone 16" --log` |
| See runtime logs | `flowdeck apps` then `flowdeck logs <id>` | same |
| Uninstall an app | `flowdeck uninstall <app-id-or-bundle-id>` | `flowdeck uninstall <app-id-or-bundle-id> --simulator "iPhone 16"` |
| See the screen (start session) | `flowdeck ui simulator session start -S "iPhone 16" --json` | same |
| See the accessibility tree | Read `latest_tree` from session JSON | same |
| See the screen (fallback) | `flowdeck ui simulator screen -S "iPhone 16" --output <path>` | same |
| Tap / type / interact | `flowdeck ui simulator tap "Login" -S "iPhone 16" --json` | same |
| Run tests | `flowdeck test` | `flowdeck test -w <ws> -s <scheme> -S "iPhone 16"` |
| Run tests from a plan | `flowdeck test --plan "MyPlan"` | `flowdeck test -w <ws> -s <scheme> -S "iPhone 16" --plan "MyPlan"` |
| Run specific tests | `flowdeck test --only LoginTests` | `flowdeck test -w <ws> -s <scheme> -S "iPhone 16" --only LoginTests` |
| Find specific tests | `flowdeck test discover` | `flowdeck test discover -w <ws> -s <scheme>` |
| List test plans | `flowdeck test plans` | `flowdeck test plans -w <ws> -s <scheme>` |
| List simulators | `flowdeck simulator list --json` | same |
| List physical devices | `flowdeck device list --json` | same |
| Create a simulator | `flowdeck simulator create --name "..." --device-type "..." --runtime "..."` | same |
| List installed runtimes | `flowdeck simulator runtime list` | same |
| List downloadable runtimes | `flowdeck simulator runtime available` | same |
| Install a runtime | `flowdeck simulator runtime create iOS 18.0` | same |
| Clean builds | `flowdeck clean` | `flowdeck clean -w <ws> -s <scheme>` |
| Clean all caches | `flowdeck clean --all` | same |
| List schemes | `flowdeck project schemes` | `flowdeck project schemes -w <ws>` |
| List build configs | `flowdeck project configs` | `flowdeck project configs -w <ws>` |
| Resolve SPM packages | `flowdeck project packages resolve` | `flowdeck project packages resolve -w <ws>` |
| Update SPM packages | `flowdeck project packages update` | `flowdeck project packages update -w <ws>` |
| Clear package cache | `flowdeck project packages clear` | `flowdeck project packages clear -w <ws>` |
| Fix package resolution failures | See `resources/package-resolution.md` | See `resources/package-resolution.md` |
| Refresh provisioning | `flowdeck project sync-profiles` | `flowdeck project sync-profiles -w <ws> -s <scheme>` |

---

## COMMON APPLE CLI TRANSLATIONS

- If you see `xcrun simctl spawn <udid> log show ...`, use `flowdeck apps` then `flowdeck logs <id>`, or run with `flowdeck run --log`.
- If a predicate filter is needed, use `flowdeck logs <id> --json | rg 'Pattern|thepattern'` or `flowdeck logs <id> | rg 'Pattern|thepattern'`.
- If you need a bounded window like `--last 2m`, run `flowdeck logs` while reproducing the issue, then stop streaming after the window you need.

---

## CRITICAL RULES

1. **Always check `flowdeck config get --json` first** - It tells you if the user has saved settings. If yes, use bare commands. If no, create a config before proceeding.
2. **Use bare commands when config exists** - `flowdeck build`, `flowdeck run`, `flowdeck test` with no flags. Only add flags for user-requested overrides.
3. **Never overwrite user config** - Don't run `config set --force` or `config reset` unless the user asks. Their config is their choice.
4. **Use `flowdeck run` to launch apps** - It returns an App ID for log streaming (and `targetUdid` in JSON mode)
5. **Start a session BEFORE any UI work** - `flowdeck ui simulator session start -S "iPhone 16" --json`. Parse the JSON output to get the `latest_screenshot` and `latest_tree` file paths. Use your Read tool on these paths to see the screen and inspect elements.
6. **Verify after EVERY UI action** - After each tap/type/swipe, wait ~1 second, then re-read `latest_screenshot` to confirm the UI changed. Never chain actions blindly.
7. **Do not invent FlowDeck syntax** - If a command errors or you are unsure about flags, subcommands, or keycodes, run `flowdeck <command> --help` or read the matching resource before retrying. Do not guess aliases like `--skip-build`, `--x`, `--y`, or string key names.
8. **Use app-native navigation for browser tests** - When validating a browser app, navigate through the browser's own address bar and controls. Do not use `flowdeck ui simulator open-url` for website navigation unless the user is explicitly testing deep links or external handoff.
9. **Check `flowdeck apps` before launching** - Know what's already running
10. **On license errors, STOP** - Tell user to visit flowdeck.studio/cli/purchase/

**Tip:** Most commands support `--examples` to print usage examples.

---

## UI AUTOMATION GUIDANCE

### Targeting a Simulator (`-S`)

Every `flowdeck ui simulator ...` command requires `-S` to target a simulator. It accepts either:
- A **simulator name**: `-S "iPhone 16"` — FlowDeck resolves it to a UDID automatically.
- A **raw UDID**: `-S "A1B2C3D4-E5F6-7890-ABCD-EF1234567890"` — used as-is.

Where to get the name or UDID:
1. **`flowdeck context --json`** — returns all simulators with `name` and `udid` fields.
2. **`flowdeck run ... --json`** — the `app_registered` event includes `targetUdid`.
3. **`flowdeck config get --json`** — returns the resolved UDID if `flowdeck config set -S` was used.

**Never omit `-S`**. Multiple simulators may be booted — omitting `-S` risks acting on the wrong one.

### Sessions: How to See the Screen (MANDATORY)

A session continuously captures the simulator's accessibility tree and screenshot every 500ms and writes them to files on disk. **You MUST start a session before doing any UI work.** This is how you see what is on screen.

#### Step-by-step recipe

```
STEP 1  Start the session (do this ONCE before any UI interaction):

    flowdeck ui simulator session start -S "iPhone 16" --json

    Parse the JSON output. Extract these three absolute file paths:
      - latest_screenshot  →  e.g. "/path/to/.flowdeck/automation/sessions/9E6A58EF/latest.jpg"
      - latest_tree        →  e.g. "/path/to/.flowdeck/automation/sessions/9E6A58EF/latest-tree.json"
      - latest             →  e.g. "/path/to/.flowdeck/automation/sessions/9E6A58EF/latest.json" (in session_dir)

    Save these paths — you will reuse them for the rest of the session.

STEP 2  Read the tree to discover elements:

    Use your Read tool on the latest_tree path.
    The tree is a JSON array of elements with: label, id, role, frame, enabled, visible.
    Use element labels or IDs to target taps, finds, waits, and assertions.

STEP 3  Read the screenshot to see the UI:

    Use your Read tool on the latest_screenshot path.
    This is a JPEG image. You will see the current simulator screen.

STEP 4  Interact (tap, type, swipe, etc.):

    flowdeck ui simulator tap "Login" -S "iPhone 16" --json
    flowdeck ui simulator type "hello@example.com" -S "iPhone 16" --json

STEP 5  VERIFY after every action — read the screenshot and/or tree again:

    Use your Read tool on the SAME latest_screenshot and latest_tree paths.
    The session updates these files automatically (~500ms).
    Wait ~1 second after an action, then read to confirm the UI changed as expected.
    DO NOT skip this step. If you don't verify, you're guessing.

STEP 6  If the session appears stale, RESTART IT instead of switching tools:

    Symptoms of a stale session:
      - latest_screenshot/latest_tree still show the old screen after a real UI change
      - the frontmost app or dialog clearly changed, but the session files did not
      - multiple re-reads after a short wait still disagree with the actual simulator state

    Recovery:
      1. Run `flowdeck ui simulator session start -S "iPhone 16" --json` again.
         Starting a session automatically stops the previous one.
      2. Parse the new JSON output.
      3. Replace your saved `latest_screenshot`, `latest_tree`, and `latest` paths.
      4. Continue using the restarted session.

    Do NOT fall back to `flowdeck ui simulator screen` just because the session might be stale.
    Use `screen` only if the restarted session is still wrong or if you explicitly need a one-off static capture.

STEP 7  Repeat steps 4-6 for each interaction.

STEP 8  Stop the session when done:

    flowdeck ui simulator session stop -S "iPhone 16"
```

#### Key facts about sessions
- The session updates `latest.jpg` and `latest-tree.json` automatically whenever the UI changes.
- You do NOT need to run `screen` or any capture command between actions — just re-read the same file paths.
- Screenshots are JPEG at 50% quality, normalized to point coordinates (no @2x/@3x scaling needed).
- `latest.json` contains capture metadata (timestamp, dimensions).
- Starting a new session stops any active session automatically.

### Verification Rules

These rules apply to ALL UI automation workflows:

1. **After every tap/type/swipe/scroll action**, wait ~1 second, then read `latest.jpg` to confirm the UI changed.
2. **Before tapping an element**, read `latest-tree.json` to confirm the element exists and is visible.
3. **If an element is not in the tree**, it may be off-screen. Use `flowdeck ui simulator scroll --until "id:yourElement" -S "iPhone 16"` first.
4. **If the UI didn't change after an action**, the action may have failed silently. Read the tree to check element state, then retry or try an alternative approach.
5. **If the session looks stale, restart it immediately.** Re-run `flowdeck ui simulator session start -S ... --json`, save the new file paths, and continue with the restarted session.
6. **If a FlowDeck command errors, stop guessing.** Run `flowdeck ui simulator <subcommand> --help` or read `resources/ui.md` before retrying.
7. **For browser apps, use the browser itself.** Type into the browser's address/search field and use in-app navigation controls. `open-url` is for deep-link/system handoff testing, not browser page validation.
8. **Never chain more than 2-3 actions without verifying.** Tap -> verify -> type -> verify -> tap -> verify.

### One-off Screen Capture (Fallback Only)

Use `flowdeck ui simulator screen` **only** when sessions fail to start, a restarted session is still wrong, or you need a specific format:

```bash
flowdeck ui simulator screen -S "iPhone 16" --output /tmp/screenshot.png
flowdeck ui simulator screen -S "iPhone 16" --tree --json   # tree only
```

### Other UI Automation Tips

- Prefer accessibility identifiers (`--by-id`) over labels — faster and more reliable.
- For off-screen elements, `flowdeck ui simulator scroll --until "id:yourElement" -S "iPhone 16"` before tapping.
- Tune input timing with `FLOWDECK_HID_STABILIZATION_MS` and `FLOWDECK_TYPE_DELAY_MS` when needed.

---

## WORKFLOW EXAMPLES

Every workflow starts the same way: check config, then act.

### User Reports a Bug
```bash
flowdeck config get --json                                  # Check saved settings
# If no config: flowdeck context --json -> flowdeck config set ...
flowdeck run                                                # Launch app
flowdeck apps                                               # Get app ID
flowdeck logs <app-id>                                      # Watch runtime

flowdeck ui simulator session start -S "iPhone 16" --json   # Start session on the active simulator
# Parse JSON → save latest_screenshot and latest_tree paths

# Read latest_screenshot with Read tool                     # SEE the current screen
# Read latest_tree with Read tool                           # SEE element labels/IDs

# Ask user to reproduce the bug, then:
# Read latest_screenshot again                              # SEE what changed
# Read latest_tree again                                    # INSPECT element state
# Analyze, fix code, re-run, verify again

flowdeck ui simulator session stop -S "iPhone 16"            # Stop session when done
```

### User Says "It's Not Working"
```bash
flowdeck config get --json                                  # Check saved settings
# If no config: flowdeck context --json -> flowdeck config set ...
flowdeck run
flowdeck apps                                               # Get app ID

flowdeck ui simulator session start -S "iPhone 16" --json   # Start session on the active simulator
# Parse JSON → save latest_screenshot and latest_tree paths

flowdeck logs <app-id>                                      # See what's happening
# Read latest_screenshot with Read tool                     # NOW you have data, not guesses

flowdeck ui simulator session stop -S "iPhone 16"            # Stop session when done
```

### Add a Feature
```bash
flowdeck config get --json                                  # Check saved settings
# If no config: flowdeck context --json -> flowdeck config set ...

# Implement the feature
flowdeck build                                              # Verify compilation
flowdeck run                                                # Test it

flowdeck ui simulator session start -S "iPhone 16" --json   # Start session on the active simulator
# Parse JSON → save latest_screenshot and latest_tree paths

# Read latest_screenshot with Read tool                     # Verify the feature looks right
# Read latest_tree with Read tool                           # Verify elements exist

# If you need to interact:
# flowdeck ui simulator tap "Button" -S "iPhone 16" --json  # Tap
# Read latest_screenshot again                              # VERIFY the tap worked

flowdeck ui simulator session stop -S "iPhone 16"            # Stop session when done
```

---

## GLOBAL FLAGS & INTERACTIVE MODE

### Top-level Flags

- `-i, --interactive` - Launch interactive mode (terminal UI with build/run/test shortcuts)
- `--changelog` - Show release notes
- `--version` - Show installed version

**Interactive Mode Highlights:**
- Guided setup on first run (workspace, scheme, target)
- Status bar with scheme/target/config/app state
- Shortcuts: `B` build, `R` run, `Shift+R` run without build, `T`/`U` tests, `C`/`K` clean, `L` logs, `X` stop app
- Build settings: `S` scheme, `D` device/simulator, `G` build config, `W` workspace/project
- Tools & support: `E` devices/sims/runtimes, `P` project tools, `F` FlowDeck settings, `H` support, `?` help overlay, `V` version, `Q` quit
- Export config: use Project Tools (`P`) → **Export Project Config**

### Legacy Aliases (Hidden from Help)

These still work for compatibility but prefer full commands:
`log` (logs), `sim` (simulator), `dev` (device), `up` (update)

### Environment Variables

- `FLOWDECK_LICENSE_KEY` - License key for CI/CD (avoids machine activation)
- `DEVELOPER_DIR` - Override Xcode installation path
- `FLOWDECK_NO_UPDATE_CHECK=1` - Disable update checks

---

## DEBUGGING WORKFLOW (Primary Use Case)

### Step 1: Launch the App

```bash
# For iOS Simulator (get workspace and scheme from 'flowdeck context --json')
flowdeck run -w App.xcworkspace -s MyApp -S "iPhone 16"

# For macOS
flowdeck run -w App.xcworkspace -s MyApp -D "My Mac"

# For physical iOS device
flowdeck run -w App.xcworkspace -s MyApp -D "iPhone"
```

This builds, installs, and launches the app. Note the **App ID** returned.

### Step 2: Attach to Logs

```bash
# See running apps and their IDs
flowdeck apps

# Attach to logs for a specific app
flowdeck logs <app-id>
```

**Why separate run and logs?**
- You can attach/detach from logs without restarting the app
- You can attach to apps that are already running
- The app continues running even if log streaming stops
- You can restart log streaming at any time

### Step 3: Observe Runtime Behavior

With logs streaming, **ask the user to interact with the app**:

> "I'm watching the app logs. Please tap the Login button and tell me what happens on screen."

Watch for:
- Error messages
- Unexpected state changes
- Missing log output (indicates code not executing)
- Crashes or exceptions

### Step 4: Observe the UI via Session

```bash
# Start a session
flowdeck ui simulator session start -S "iPhone 16" --json
```

The JSON output tells you where to read. Example:
```json
{
  "success": true,
  "udid": "A1B2C3D4-...",
  "latest_screenshot": "/Users/you/project/.flowdeck/automation/sessions/9E6A58EF/latest.jpg",
  "latest_tree": "/Users/you/project/.flowdeck/automation/sessions/9E6A58EF/latest-tree.json"
}
```

**Save these absolute paths.** Then use your Read tool on them:

1. **Read `latest_screenshot`** — you will see the current simulator screen as a JPEG image.
2. **Read `latest_tree`** — you will see element labels, accessibility IDs, roles, and frames as JSON.

These files update automatically (~500ms). After any UI action, wait ~1 second and read them again to see the result.

**Fallback (only if sessions are not working even after a restart):**
```bash
flowdeck ui simulator screen -S "iPhone 16" --output /tmp/screenshot.png
```

### Step 5: Fix and Iterate

```bash
# After making code changes
flowdeck run -w App.xcworkspace -s MyApp -S "iPhone 16"

# Reattach to logs
flowdeck apps
flowdeck logs <new-app-id>

# Session continues capturing — read latest_screenshot with Read tool to verify the fix
# If the session looks stale after relaunch, restart the session and replace the saved paths
# IMPORTANT: always verify by reading the screenshot after code changes
# Stop session when done
flowdeck ui simulator session stop -S "iPhone 16"
```

Repeat until the issue is resolved.

---

## DECISION GUIDE: When to Do What

### User reports a bug
```
1. flowdeck config get --json                          # Check for saved settings
   (if none: flowdeck context --json -> config set)
2. flowdeck run                                        # Launch app
3. flowdeck apps                                        # Get app ID
4. flowdeck logs <app-id>                               # Attach to logs
5. flowdeck ui simulator session start -S "iPhone 16" --json  # Start session on the active simulator
6. Parse JSON → save latest_screenshot and latest_tree paths
7. Read tool on latest_screenshot                       # SEE the current screen
8. Read tool on latest_tree                             # SEE element labels/IDs
9. Ask user to reproduce → re-read latest_screenshot    # SEE what changed
10. Analyze and fix code → re-run → re-read screenshot  # VERIFY fix
11. flowdeck ui simulator session stop -S "iPhone 16"   # Stop when done
```

### User asks to add a feature
```
1. flowdeck config get --json                          # Check for saved settings
   (if none: flowdeck context --json -> config set)
2. Implement the feature                                # Write code
3. flowdeck build                                      # Verify it compiles
4. flowdeck run                                        # Launch and test
5. flowdeck ui simulator session start -S "iPhone 16" --json  # Start session on the active simulator
6. Parse JSON → save latest_screenshot and latest_tree paths
7. Read tool on latest_screenshot                       # VERIFY the feature looks right
8. Read tool on latest_tree                             # VERIFY elements exist
9. flowdeck apps + logs                                 # Check for errors
10. flowdeck ui simulator session stop -S "iPhone 16"   # Stop when done
```

### User says "it's not working"
```
1. flowdeck config get --json                          # Check for saved settings
   (if none: flowdeck context --json -> config set)
2. flowdeck run                                        # Run it yourself
3. flowdeck apps                                        # Get app ID
4. flowdeck logs <app-id>                               # Watch what happens
5. flowdeck ui simulator session start -S "iPhone 16" --json  # Start session on the active simulator
6. Parse JSON → save latest_screenshot and latest_tree paths
7. Read tool on latest_screenshot                       # SEE what's on screen
8. Ask user what they expected                          # Compare with what you see
9. flowdeck ui simulator session stop -S "iPhone 16"    # Stop when done
```

### User provides a screenshot of an issue
```
1. flowdeck config get --json                          # Check for saved settings
   (if none: flowdeck context --json -> config set)
2. flowdeck run                                        # Run the app
3. flowdeck ui simulator session start -S "iPhone 16" --json  # Start session on the active simulator
4. Parse JSON → save latest_screenshot path
5. Read tool on latest_screenshot                       # SEE current state
6. Compare user screenshot with what you see            # Identify differences
7. flowdeck logs <app-id>                               # Check for related errors
8. flowdeck ui simulator session stop -S "iPhone 16"    # Stop when done
```

### App crashes on launch
```
1. flowdeck config get --json                          # Check for saved settings
   (if none: flowdeck context --json -> config set)
2. flowdeck run --log                                  # Use --log to capture startup
3. Read the crash/error logs
4. Fix the issue
5. flowdeck run                                        # Rebuild and test
```

---

## CONFIGURATION

### Explicit Flags (No Config)

If you need to pass all parameters manually (rare - prefer creating config):

```bash
flowdeck build -w App.xcworkspace -s MyApp -S "iPhone 16"
flowdeck run -w App.xcworkspace -s MyApp -S "iPhone 16"
flowdeck test -w App.xcworkspace -s MyApp -S "iPhone 16"
```

### Use config set for Repeated Configurations

If you run many commands with the same settings, use `flowdeck config set`:

```bash
# 1. Save settings once
flowdeck config set -w App.xcworkspace -s MyApp -S "iPhone 16"

# 2. Run commands without parameters
flowdeck build
flowdeck run
flowdeck test
```

If you need to clear saved settings for the current folder:

```bash
flowdeck config reset
flowdeck config reset --json
```

### Config Files (CI/Advanced)

```bash
# 1. Create a temporary config file
cat > /tmp/flowdeck-config.json << 'EOF'
{
  "workspace": "App.xcworkspace",
  "scheme": "MyApp-iOS",
  "configuration": "Debug",
  "platform": "iOS",
  "version": "18.0",
  "simulatorUdid": "A1B2C3D4-E5F6-7890-ABCD-EF1234567890",
  "derivedDataPath": "~/Library/Developer/FlowDeck/DerivedData",
  "xcodebuild": {
    "args": ["-enableCodeCoverage", "YES"],
    "env": {
      "CI": "true"
    }
  },
  "appLaunch": {
    "args": ["-SkipOnboarding"],
    "env": {
      "DEBUG_MODE": "1"
    }
  }
}
EOF

# 2. Use --config to load from file
flowdeck build --config /tmp/flowdeck-config.json
flowdeck run --config /tmp/flowdeck-config.json
flowdeck test --config /tmp/flowdeck-config.json

# 3. Clean up when done
rm /tmp/flowdeck-config.json
```

**Note:** `workspace` paths in config files are relative to the project root (where you run FlowDeck), not the config file location.

### Local Settings Files (Auto-loaded)

FlowDeck auto-loads local settings files from your project root:

- `.flowdeck/build-settings.json` - xcodebuild args/env for build/run/test
- `.flowdeck/app-launch-settings.json` - app launch args/env (run only)

`.flowdeck/build-settings.json`
```json
{
  "args": ["-enableCodeCoverage", "YES"],
  "env": { "CI": "true" }
}
```

`.flowdeck/app-launch-settings.json`
```json
{
  "args": ["-SkipOnboarding"],
  "env": { "API_ENVIRONMENT": "staging" }
}
```

### Config Priority

Settings are merged in this order (lowest -> highest):
1. Saved config (`flowdeck config set`)
2. `--config` JSON file
3. Local settings files in `.flowdeck/`
4. CLI flags (`-S`, `-D`, `-C`, `--xcodebuild-options`, etc.)

### Target Resolution (Config Files)

When resolving a target from a config file, FlowDeck prioritizes:
1. `deviceUdid` (physical device)
2. `simulatorUdid` (exact simulator)
3. `platform` + `version` (auto-resolve best match)
4. `platform: "macOS"` (native Mac build)

### Generate Config Files

- Interactive mode: run `flowdeck -i`, open Project Tools (`P`), then **Export Project Config**
- From context: `flowdeck context --json > .flowdeck/config.json`

---

## LICENSE ERRORS - STOP IMMEDIATELY

If you see "LICENSE REQUIRED", "trial expired", or similar:

1. **STOP** - Do not continue
2. **Do NOT use xcodebuild, Xcode, or Apple tools**
3. **Tell the user:**
   - Visit https://flowdeck.studio/cli/purchase/ to purchase
   - Or run `flowdeck license activate <key>` if they have a key
   - Or run `flowdeck license status` to check current status
   - In CI/CD, set `FLOWDECK_LICENSE_KEY` instead of activating

---

## COMMON ERRORS & SOLUTIONS

| Error | Solution |
|-------|----------|
| "No saved config found" | Run `flowdeck context --json` then `flowdeck config set -w <ws> -s <scheme> -S "<sim>"` |
| "Missing required target" | Add `-S "iPhone 16"` for simulator, `-D "My Mac"`/`"My Mac Catalyst"` for macOS, or `-D "iPhone"` for device (or create a config) |
| "Missing required parameter: --workspace" | Create a config with `flowdeck config set -w <ws> ...` or pass `-w` explicitly |
| "Simulator not found" | Ask the user if they want to create a new simulator. Use `flowdeck simulator list --available-only` to check, then `flowdeck simulator create ...` |
| "Device not found" | Run `flowdeck device list` to see connected devices |
| "Scheme not found" | Run `flowdeck context --json` or `flowdeck project schemes -w <ws>` to list schemes |
| "License required" | Activate with `flowdeck license activate <key>` or purchase at flowdeck.studio/cli/purchase/ |
| "App not found" | Run `flowdeck apps` to list running apps |
| "No logs available" | App may not be running; use `flowdeck run` first |
| "Need different simulator/runtime" | Ask user to confirm, then `flowdeck simulator runtime create iOS <version>` and `flowdeck simulator create ...` |
| "Runtime not installed" | Use `flowdeck simulator runtime create iOS <version>` to install |
| "Package not found" / SPM errors | See `resources/package-resolution.md` |
| Outdated packages | Run `flowdeck project packages update` |
| "Provisioning profile" errors | Run `flowdeck project sync-profiles` |

---

## JSON OUTPUT

Most commands support `--json` (often `-j`) for programmatic parsing. Common examples:
```bash
flowdeck config get --json
flowdeck context --json
flowdeck build --json
flowdeck run --json
flowdeck test --json
flowdeck apps --json
flowdeck simulator list --json
flowdeck ui simulator screen -S <name-or-udid> --json
flowdeck device list --json
flowdeck project schemes --json
flowdeck project configs --json
flowdeck project packages resolve --json
flowdeck project sync-profiles --json
flowdeck simulator runtime list --json
flowdeck license status --json
```

**Note:** When config is saved, JSON commands also work without explicit flags.

---

## IMPLEMENTING UI FROM DESIGN MOCKUPS

When the user provides a design reference — an image, a Figma link, or a verbal description — and asks you to build UI from it, follow this automated workflow. See `resources/pixel-perfect-design.md` for the complete methodology.

The workflow is the same regardless of the design source. The only difference is **how you extract specs** in step 1:
- **Image/screenshot**: Visually analyze the image to estimate measurements (Phase 0 + Phase 1 in the resource)
- **Figma link**: Use the Figma MCP server to fetch exact design tokens, spacing, colors, typography, and effects — no estimation needed
- **Verbal description**: Ask clarifying questions about specific values (colors, spacing, font sizes) before implementing

### When to Activate

Activate this workflow when ANY of these conditions are true:

**Explicit signals (user provides a design reference):**
- User attaches an image file (PNG, JPG, screenshot, mockup, exported comp)
- User provides a Figma URL (e.g., `figma.com/design/...`, `figma.com/file/...`)
- User says "build this", "create this screen", "implement this design", "make it look like this"
- User says "pixel perfect", "match the design", "design fidelity"

**Implicit signals (user is describing a UI to build):**
- User describes a specific screen layout with visual details (colors, spacing, typography)
- User references a design system, brand guidelines, or specific visual treatment
- User provides a sketch or wireframe (even hand-drawn)
- User asks to "recreate" or "clone" an existing app's UI from a screenshot

**During implementation (mid-task triggers):**
- You just implemented a UI view and haven't visually verified it yet — run the validation loop
- User says "does it look right?", "check the UI", "how does it look?"
- User reports the UI "doesn't match", "looks off", "spacing is wrong"
- You made changes to a view's layout, colors, typography, or effects — re-validate

### Automated Workflow

```
1. EXTRACT SPECS from the design source

   If IMAGE: Read the image with the Read tool
   - Identify visual hierarchy, layout strategy, spacing rhythm
   - Estimate measurements, typography, colors, effects
   - See Phase 0 + Phase 1 in resources/pixel-perfect-design.md

   If FIGMA LINK: Use the Figma MCP server
   - Fetch exact spacing, typography, colors, effects, and component structure
   - No estimation needed — use the exact values returned

   In both cases: Document all specs as code comments before writing any views

2. IMPLEMENT in layers (structure → typography → colors → shapes → effects)
   - Use explicit spacing (spacing: 0 on stacks, fixed Spacers)
   - Use exact colors (hex values, not .gray/.blue approximations)
   - Use .continuous corner style for rounded rectangles
   - Never use default .padding() — always specify exact values

3. BUILD and LAUNCH
   flowdeck run

4. START SESSION and NAVIGATE TO THE TARGET SCREEN
   flowdeck ui simulator session start -S "<simulator>" --json
   # Parse JSON → save latest_screenshot and latest_tree paths
   # Read latest_tree to find navigation elements
   # Tap/scroll through the app to reach the screen you're implementing:
   flowdeck ui simulator tap "Tab Name" -S "<simulator>" --json
   flowdeck ui simulator tap "List Item" -S "<simulator>" --json
   # Read latest_screenshot to confirm you're on the right screen

5. COMPARE against design
   - Read latest_screenshot with Read tool
   - Compare against original design image
   - Squint test: do they have the same visual weight and rhythm?
   - Check: margins, spacing, typography, colors, shadows, alignment

6. DOCUMENT discrepancies specifically
   // e.g., "Title top margin: 52pt in impl, ~60pt in design → increase by 8pt"

7. FIX one discrepancy at a time
   - Edit code
   - flowdeck run (rebuild)
   - Navigate back to the target screen (repeat step 4 navigation)
   - Read latest_screenshot to verify the fix
   - Do NOT batch fixes — one change at a time

8. REPEAT steps 5-7 until no visible differences remain

9. VERIFY on multiple screen sizes (navigate to screen on each)
   flowdeck run -S "iPhone SE (3rd generation)"
   # Navigate to screen, capture, check for overflow/clipping
   flowdeck run -S "iPhone 16 Pro Max"
   # Navigate to screen, capture, check proportions
```

### Key Rules for Design Implementation

- **Navigate, don't assume** — 

…(truncated)
