---
description: Commands for viewing configuration, managing instances, installing AI agent skills, and generating IDE integration scripts.
---

# Setup Commands

Commands for viewing configuration, setting up the development environment, and generating IDE integration scripts.

## b2c setup inspect

Display the resolved configuration from all sources, showing which values are set and where they came from. Useful for debugging configuration issues.

The Safety section summarizes the settings in use, including your instance,
global safety file, and environment variables. Add `--verbose` to see all rules
in the order they are checked, and authentication details. `--json` always includes the complete settings.

The source column shows where each setting came from. `SafetyFile` refers to the
global file listed in Sources; `SafetyEnv` refers to environment variables.
"Level confirmation" controls approval for requests the selected level would
normally block. Individual `confirm` rules still ask for approval when this
setting is disabled. See [Safety Mode](../guide/safety).

**Alias:** `b2c setup config`

### Usage

```bash
b2c setup inspect [FLAGS]
```

### Flags

| Flag                     | Description                                                     | Default                    |
| ------------------------ | --------------------------------------------------------------- | -------------------------- |
| `--unmask`               | Show sensitive values unmasked (passwords, secrets, API keys)   | `false`                    |
| `--verbose`              | Show the full ordered safety ruleset and authentication details | `false`                    |
| `--account-manager-host` | Account Manager hostname for OAuth                              | `account.demandware.com`   |
| `--cloud-origin`         | MRT cloud origin URL                                            | `https://cloud.mobify.com` |
| `--json`                 | Output results as JSON                                          | `false`                    |

### Examples

```bash
# Display resolved configuration (sensitive values masked)
b2c setup inspect

# Include the full safety ruleset
b2c setup inspect --verbose

# Display configuration with sensitive values unmasked
b2c setup inspect --unmask

# Output as JSON for scripting
b2c setup inspect --json

# Debug configuration with a specific instance
b2c setup inspect -i staging
```

### Output

The command displays configuration organized by category:

- **Instance**: hostname, webdavHostname, codeVersion, and a one-line summary of how the instance authenticates (for example `WebDAV: signed in as dev@example.com`)
- **Authentication (Basic)**: username, password
- **Authentication (OAuth)**: clientId, clientSecret, and configured OAuth options
- **Authentication (JWT Bearer)**: JWT certificate, key, and passphrase settings (when configured)
- **Authentication (SLAS)**: SLAS client settings (when configured)
- **SCAPI**: shortCode and tenantId
- **On-Demand Sandbox (ODS)**: sandbox API host and realm (when configured)
- **Commerce Intelligence (CIP)**: CIP host override (when configured)
- **Managed Runtime (MRT)**: mrtProject, mrtEnvironment, mrtApiKey, mrtOrigin
- **Project**: configured deployment, content, and documentation defaults
- **Metadata**: siteId, instanceName, and projectDirectory (when configured)
- **Safety**: safety configuration (when configured)
- **Effective Authentication**: with `--verbose`, how file and API requests to the instance authenticate (see also [`b2c auth status`](./auth#b2c-auth-status))
- **Sources**: List of configuration sources that contributed values

Each value shows its source in brackets (e.g., `[dw.json]`, `[SFCC_CLIENT_ID]`, `[~/.mobify]`).

Example output:

```
Configuration
────────────────────────────────────────────────────────────

Instance
  hostname              my-sandbox.dx.commercecloud.salesforce.com  [DwJsonSource]
  webdavHostname        -
  codeVersion           version1                                     [DwJsonSource]

Authentication (Basic)
  username              admin                                        [DwJsonSource]
  password              admi...REDACTED                              [DwJsonSource]

Authentication (OAuth)
  clientId              my-client-id                                 [password-store]
  clientSecret          my-c...REDACTED                              [password-store]
  accountManagerHost    -

SCAPI
  shortCode             abc123                                       [DwJsonSource]

Managed Runtime (MRT)
  mrtProject            my-project                                   [MobifySource]
  mrtApiKey             mrtk...REDACTED                              [MobifySource]

Sources
────────────────────────────────────────────────────────────
  1. DwJsonSource         /path/to/project/dw.json
  2. MobifySource         /Users/user/.mobify
  3. password-store       pass:b2c-cli/_default
```

### Sensitive Values

By default, sensitive fields are masked to prevent accidental exposure:

- `password` - Basic auth access key
- `clientSecret` - OAuth client secret
- `jwtPassphrase` - JWT private key passphrase
- `slasClientSecret` - SLAS private client secret
- `mrtApiKey` - MRT API key

Use `--unmask` to reveal the actual values when needed for debugging.

The Sources section lists the project and shared default `dw.json` files. An `*`
marks the file used for the selected instance. Values from the shared default
file show `[default]` in the source column. JSON output also identifies that file
with `"scope": "global"`.

### See Also

- [Configuration Guide](/guide/configuration) - How to configure the CLI

## b2c setup get / set / unset

Read and change one configuration value without editing files by hand. Each
command resolves configuration the same way as `b2c setup inspect`, then reads
or writes the value at the source that supplies it:

- If the value comes from a `dw.json` entry, it's written there: the entry
  selected with `--instance`, the active instance, or the root config.
- If it comes from the project `.env` file, it's written there, using the
  `SFCC_*` environment variable form.
- If nothing sets it yet, it's written to the source that defines the instance
  (usually the `dw.json` entry that selected it).
- Plugin config sources take part when they implement the write methods
  described in [Extending the CLI](../guide/extending#field-write-methods). That
  includes credential stores such as a keychain plugin.

A credential pair (client ID and secret, username and password) stays in one
source, so the secret goes where the client ID is set.

The commands refuse, without writing anything, when:

- the value comes from a source that can't be written (shell environment
  variables, `~/.mobify`, `package.json`, flags)
- no instance is selected, for example when `dw.json` has several instances and
  none is active
- the value is empty (`b2c setup set code-version=`). Use `b2c setup unset`
  to remove a value.

Keys use `dw.json` names (`code-version`, `scapi-schemas`, `client-id`); the
camelCase forms also work. String keys store the value as given. Other keys
take JSON (`true`, `["a","b"]`, `{"level":"NO_DELETE"}`), and list keys also
accept comma-separated values. Values are checked against the
[dw.json schema](../guide/configuration) before writing.

### Usage

```bash
b2c setup get <KEY> [--unmask]
b2c setup set <KEY> <VALUE>
b2c setup set <KEY>=<VALUE>
b2c setup unset <KEY>
```

All three accept `--instance`, `--config`, `--project-directory`,
`--dotenv-file`, and `--json`.

### Examples

```bash
# Point the MCP server and CLI at local SCAPI schemas for this project
b2c setup set scapi-schemas=./scapi-schemas

# Change the code version for a named instance
b2c setup set code-version version2 --instance staging

# Store structured values as JSON
b2c setup set cartridges '["app_custom","app_storefront_base"]'
b2c setup set safety '{"level":"NO_DELETE"}'

# Print a value (stdout) and its source (stderr)
b2c setup get code-version

# Sensitive values are masked unless --unmask
b2c setup get client-secret --unmask

# Remove a value; reports a lower-priority source that still sets it
b2c setup unset code-version
```

`b2c setup get` prints string values as-is and other values as JSON, so the
output works in scripts. `b2c setup set` never prints sensitive values.

## Global Default Configuration

Use a global `dw.json` when you want the CLI, MCP server, and B2C DX VS Code extension to share instances across projects. A project-local `dw.json` remains the primary file, and the global file adds its instances. An explicit `--config` or `SFCC_CONFIG` path is used on its own, without the global file.

Instances from the primary and global files are shown as one catalog. `--instance` / `-i` searches the primary file first, so a same-name primary instance shadows the global one. Instance fields are not combined across files.

`b2c setup instance create` writes to the primary file when it exists and otherwise uses the global `dw.json`. List, remove, and set-active operate across both files, checking the primary file first.

### b2c setup default-config set

Set the shared global `dw.json`. The file must exist and use the `dw.json` format.

Paths are normally stored as absolute paths. When the configuration file is inside the shared B2C settings directory, the command stores a relative path such as `./dw.json`, making it easy to keep the files together.

```bash
b2c setup default-config set /Users/you/code/dw.json
b2c setup default-config set ./shared.dw.json --json
```

### b2c setup default-config get

Show the configured path and report if the file is missing.

```bash
b2c setup default-config get
b2c setup default-config get --json
```

### b2c setup default-config unset

Remove the global `dw.json` setting without changing or deleting the file itself.

```bash
b2c setup default-config unset
```

## b2c setup ide

Show help for IDE integration setup commands.

### Usage

```bash
b2c setup ide
```

### Examples

```bash
# Show setup ide subcommands
b2c setup ide --help

# Vendor Script API TypeScript definitions for IDE IntelliSense
b2c setup ide vscode-types

# Print TS Server plugin path for LSP-based editors (Neovim, Helix, Zed, etc.)
b2c setup ide tsserver-plugin --json
```

## b2c setup ide vscode-types

Vendor B2C Commerce Script API TypeScript definitions and write a `jsconfig.json` into the workspace so any IDE that drives `tsserver` (plain VS Code, WebStorm, IntelliJ Ultimate, Neovim, Helix, Zed, Sublime Text) gets `dw/*` IntelliSense, hover docs, and signature help in cartridge JavaScript files.

The Salesforce B2C Commerce VS Code extension does not need this command — it injects the same TypeScript Server plugin at runtime without writing files into your repo. Use this command only when you're not running the extension.

### Usage

```bash
b2c setup ide vscode-types [FLAGS]
```

### Flags

| Flag             | Description                                                       | Default         |
| ---------------- | ----------------------------------------------------------------- | --------------- |
| `--output`, `-o` | Path for the generated `jsconfig.json` (relative to project root) | `jsconfig.json` |
| `--force`, `-f`  | Overwrite output files if they already exist                      | `false`         |
| `--[no-]copy`    | Copy bundled types into `./.b2c-script-types/`                    | `true`          |
| `--json`         | Output results as JSON                                            | `false`         |

The generated `paths` mappings are written relative to the repo root, so `--output` is only intended for renaming the file itself (e.g., `--output jsconfig.cartridges.json`), not for relocating it into a subdirectory.

### Examples

```bash
# Default: write ./jsconfig.json and ./.b2c-script-types/types/ at the repo root
b2c setup ide vscode-types

# Re-vendor after upgrading the CLI
b2c setup ide vscode-types --force

# Regenerate jsconfig only (skip the type bundle copy; types must already be vendored)
b2c setup ide vscode-types --no-copy --force
```

### Output

The command produces:

- `./.b2c-script-types/types/` — vendored copy of the Script API definitions, version-pinned to the CLI release. Safe to commit.
- `./jsconfig.json` (or the path passed to `--output`) — TypeScript Language Service configuration mapping `dw/*` to the vendored types. Cartridge-relative requires (`~/cartridge/...`, `*/cartridge/...`) can't be expressed in standalone TypeScript `paths` mappings and will appear unresolved without the Salesforce B2C Commerce VS Code extension.

See the [IDE Integration guide](/guide/ide-integration#script-api-intellisense) for editor-specific setup notes (Neovim, Helix, Zed, etc.).

## b2c setup ide tsserver-plugin

Print absolute paths to the bundled `@salesforce/b2c-script-types` TypeScript Server plugin and types directory. Use this when configuring an LSP-based editor (Neovim, Helix, Zed, Sublime, etc.) to load the plugin via `init_options.plugins[]` — full feature parity with the Salesforce B2C Commerce VS Code extension, including cartridge-relative require resolution.

The command performs no filesystem writes; it just resolves and prints paths.

### Usage

```bash
b2c setup ide tsserver-plugin [FLAGS]
```

### Flags

| Flag     | Description            | Default |
| -------- | ---------------------- | ------- |
| `--json` | Output results as JSON | `false` |

### Examples

```bash
# Human-readable
b2c setup ide tsserver-plugin

# JSON for tooling (e.g. nvim-sfcc)
b2c setup ide tsserver-plugin --json
```

### Output

```json
{
  "pluginName": "@salesforce/b2c-script-types",
  "pluginPath": "/usr/local/lib/node_modules/@salesforce/b2c-cli/dist/script-types",
  "typesPath": "/usr/local/lib/node_modules/@salesforce/b2c-cli/dist/script-types/types",
  "version": "26.9.0"
}
```

Pass `pluginName` as `name` and `pluginPath` as `location` in your editor's `tsserver` `init_options.plugins[]` entry. The plugin auto-discovers cartridges in the project root and honors `dw.json`'s `cartridges` field for ordering — no host-side wiring needed.

## b2c setup instance list

List all configured B2C Commerce instances: those in dw.json, plus any from
[plugin config sources](../guide/extending#instance-management-methods). The
`Source` column shows where each instance is stored. `set-active` and `remove`
act on the source that lists the instance.

### Usage

```bash
b2c setup instance list [FLAGS]
```

### Flags

| Flag               | Description                                                          | Default |
| ------------------ | -------------------------------------------------------------------- | ------- |
| `--columns`, `-c`  | Columns to display (comma-separated): name, hostname, source, active | All     |
| `--extended`, `-x` | Show all columns including extended fields                           | `false` |
| `--json`           | Output results as JSON                                               | `false` |

### Examples

```bash
# List all configured instances
b2c setup instance list

# Output as JSON
b2c setup instance list --json
```

### Output

The command displays a table of configured instances:

```
Instances
────────────────────────────────────────────────────────────
Name           Hostname                          Source        Active
production     prod.demandware.net               DwJsonSource
staging        staging.demandware.net            DwJsonSource  ✓
development    dev.demandware.net                DwJsonSource
```

## b2c setup instance create

Create a new B2C Commerce instance configuration. The instance goes to dw.json
unless a higher-priority plugin config source can store instances, or you
choose a source with `--source`.

If a plugin credential store (such as a keychain plugin) declares both halves
of a credential pair, for example the client ID and secret, that pair is stored
there instead. `b2c setup instance remove` removes them again.

The command prints the dw.json it wrote. That is `dw.json` in the current
directory (or the file selected with `--config` or `--project-directory`), or
the [global default](#global-default-configuration) when no local `dw.json`
exists. The CLI reads a project `dw.json` only from the directory it runs in
and doesn't search parent directories, so to use the instance from elsewhere,
pass `--config` or `--project-directory`, or register the file with
`b2c setup default-config set <path>`.

To change an existing instance, use [`b2c setup set`](#b2c-setup-get-set-unset)
(for example `b2c setup set password <access-key> --instance staging`), or
remove it with `b2c setup instance remove` and create it again. Running
`create` with an existing name fails.

### Usage

```bash
b2c setup instance create [NAME] [FLAGS]
```

### Arguments

| Argument | Description   | Required          |
| -------- | ------------- | ----------------- |
| `NAME`   | Instance name | Yes (or prompted) |

### Flags

| Flag               | Description                                                                             | Default                                   |
| ------------------ | --------------------------------------------------------------------------------------- | ----------------------------------------- |
| `--hostname`, `-s` | B2C instance hostname                                                                   | Prompted                                  |
| `--username`       | WebDAV username                                                                         |                                           |
| `--password`       | WebDAV password                                                                         | Prompted if username set                  |
| `--client-id`      | OAuth client ID                                                                         |                                           |
| `--client-secret`  | OAuth client secret                                                                     | Prompted if client-id set                 |
| `--short-code`     | SCAPI short code (optional; enables SCAPI-first code-version detection)                 |                                           |
| `--tenant-id`      | SCAPI tenant/organization ID (optional; enables SCAPI-first detection)                  |                                           |
| `--api-backend`    | Saved API preference: `auto`, `scapi`, or `ocapi`                                       | `auto`                                    |
| `--code-version`   | Code version used by `code deploy` and `code watch` (optional)                          | Auto-detected or prompted                 |
| `--active`         | Set as active instance                                                                  | `false`                                   |
| `--force`          | Non-interactive mode                                                                    | `false`                                   |
| `--source`         | Config source to store the instance in, by name (`b2c setup instance list` shows names) | Highest-priority source that can store it |
| `--json`           | Output results as JSON                                                                  | `false`                                   |

### Examples

```bash
# Interactive mode (prompts for all values)
b2c setup instance create staging

# Create with hostname
b2c setup instance create staging --hostname staging.example.com

# Create and set as active
b2c setup instance create staging --hostname staging.example.com --active

# Non-interactive mode (CI/CD)
b2c setup instance create staging --hostname staging.example.com --username admin --password <access-key> --force
```

### Interactive Mode

When run without `--force`, the command provides an interactive experience:

1. Prompts for instance name (if not provided)
2. Prompts for hostname (if not provided)
3. Prompts for authentication type (Basic, OAuth, Both, or Skip)
4. Prompts for credentials based on selection
5. Finds the active code version, or prompts for it if it can't be found
6. Asks whether to set as active instance
7. Shows summary and confirms before creating

## b2c setup instance remove

Remove a B2C Commerce instance configuration from dw.json.

### Usage

```bash
b2c setup instance remove NAME [FLAGS]
```

### Arguments

| Argument | Description             | Required |
| -------- | ----------------------- | -------- |
| `NAME`   | Instance name to remove | Yes      |

### Flags

| Flag      | Description              | Default |
| --------- | ------------------------ | ------- |
| `--force` | Skip confirmation prompt | `false` |
| `--json`  | Output results as JSON   | `false` |

### Examples

```bash
# Remove with confirmation
b2c setup instance remove staging

# Remove without confirmation
b2c setup instance remove staging --force
```

## b2c setup instance set-active

Set a B2C Commerce instance as the default (active) instance.

### Usage

```bash
b2c setup instance set-active NAME [FLAGS]
```

### Arguments

| Argument | Description                    | Required |
| -------- | ------------------------------ | -------- |
| `NAME`   | Instance name to set as active | Yes      |

### Flags

| Flag     | Description            | Default |
| -------- | ---------------------- | ------- |
| `--json` | Output results as JSON | `false` |

### Examples

```bash
# Set staging as the active instance
b2c setup instance set-active staging

# Set production as active
b2c setup instance set-active production
```

### How Active Instance Works

The active instance is used as the default when no `--instance` or `-i` flag is provided to other commands. This allows you to work with multiple instances without specifying which one to use each time.

Example workflow:

```bash
# Configure multiple instances
b2c setup instance create staging --hostname staging.example.com
b2c setup instance create production --hostname prod.example.com

# Set staging as active
b2c setup instance set-active staging

# Commands now use staging by default
b2c code list              # Uses staging
b2c code list -i production # Uses production
```

With a [plugin config source](../guide/extending#instance-management-methods), each source keeps its own active instance, and the highest-priority source's active instance is the default. If another source's active instance still wins after `set-active`, the command warns and names it.

## b2c setup openshell

::: warning Beta
The OpenShell integration is in beta, and OpenShell itself is alpha software.
:::

Create an [NVIDIA OpenShell](https://github.com/NVIDIA/OpenShell) sandbox for the B2C CLI from your current configuration. Your secrets are stored on the OpenShell gateway, and the sandbox can reach only the B2C Commerce hosts your configuration uses, at your [Safety Mode](../guide/safety) level. Run the command again to apply changes. See [Agent Sandboxing](../guide/agent-sandboxing#openshell).

### Usage

```bash
b2c setup openshell [FLAGS]
```

### Flags

| Flag                | Description                                                               | Default                           |
| ------------------- | ------------------------------------------------------------------------- | --------------------------------- |
| `--name`            | Sandbox name                                                              | `b2c-<instance>`                  |
| `--directory`, `-d` | Directory for the generated files                                         | `.openshell/<sandbox>`            |
| `--safety-level`    | What the sandbox may do on B2C hosts: `READ_ONLY`, `NO_DELETE`, or `NONE` | Your Safety Mode level, or `NONE` |
| `--allow-host`      | Additional host the sandbox may reach (repeatable)                        |                                   |
| `--mcp`             | Also install the B2C DX MCP server in the sandbox image                   | `false`                           |
| `--image`           | Use this container image instead of building one                          |                                   |
| `--[no-]sandbox`    | Create the sandbox. Use `--no-sandbox` to only store the credentials      | `true`                            |
| `--recreate`        | Delete and recreate an existing sandbox, removing anything added to it    | `false`                           |
| `--force`           | Replace an edited `policy.yaml` with a newly generated one                | `false`                           |
| `--dry-run`         | Write the files and print the commands without running them               | `false`                           |
| `--json`            | Output results as JSON (never includes secrets)                           | `false`                           |

Instance and authentication flags such as `--instance` select the configuration to use.

### Examples

```bash
# Create a sandbox for the active instance at your Safety Mode level
b2c setup openshell

# Read-only sandbox
b2c setup openshell --safety-level READ_ONLY

# Allow writes but not deletes
b2c setup openshell --safety-level NO_DELETE

# Create a sandbox for another instance
b2c setup openshell --instance staging --name b2c-staging

# Include the MCP server in the image
b2c setup openshell --mcp

# Review the generated files and commands without changing anything
b2c setup openshell --dry-run
```

### See Also

- [Agent Sandboxing](../guide/agent-sandboxing)
- [Safety Mode](../guide/safety)

## b2c setup skills

Install agent skills from the B2C Developer Tooling project to AI-powered IDEs.

This command downloads skills from GitHub releases and installs them to the configuration directories of supported IDEs. Skills teach AI assistants about B2C Commerce development, CLI commands, and best practices.

### Usage

```bash
b2c setup skills [SKILLSET]
```

### Arguments

| Argument   | Description                                                             | Default                |
| ---------- | ----------------------------------------------------------------------- | ---------------------- |
| `SKILLSET` | Skill set to install: `b2c`, `b2c-cli`, `storefront-next`, or `cap-dev` | Prompted interactively |

### Flags

| Flag                | Description                                                                                     | Default     |
| ------------------- | ----------------------------------------------------------------------------------------------- | ----------- |
| `--list`, `-l`      | List available skills without installing                                                        | `false`     |
| `--skill`           | Install specific skill(s) (can be repeated)                                                     |             |
| `--ide`             | Target IDE(s): claude-code, cursor, windsurf, vscode, codex, opencode, agentforce-vibes, manual | Auto-detect |
| `--directory`, `-d` | Custom installation directory (overrides IDE default path)                                      |             |
| `--global`, `-g`    | Install to user home directory (global scope)                                                   | `false`     |
| `--update`, `-u`    | Update existing skills (overwrite)                                                              | `false`     |
| `--version`         | Specific release version                                                                        | `latest`    |
| `--force`           | Skip confirmation prompts (non-interactive)                                                     | `false`     |
| `--columns`, `-c`   | Columns to display (comma-separated): name, description, skillSet, hasReferences                |             |
| `--extended`, `-x`  | Show all columns including extended fields                                                      | `false`     |
| `--json`            | Output results as JSON                                                                          | `false`     |

### Supported IDEs

| IDE Value          | IDE Name                 | Project Path        | Global Path                                                     |
| ------------------ | ------------------------ | ------------------- | --------------------------------------------------------------- |
| `claude-code`      | Claude Code              | `.claude/skills/`   | `~/.claude/skills/`                                             |
| `cursor`           | Cursor                   | `.cursor/skills/`   | `~/.cursor/skills/`                                             |
| `windsurf`         | Windsurf                 | `.windsurf/skills/` | `~/.codeium/windsurf/skills/`                                   |
| `vscode`           | VS Code / GitHub Copilot | `.github/skills/`   | `~/.copilot/skills/`                                            |
| `codex`            | OpenAI Codex CLI         | `.codex/skills/`    | `~/.codex/skills/`                                              |
| `opencode`         | OpenCode                 | `.opencode/skills/` | `~/.config/opencode/skills/`                                    |
| `agentforce-vibes` | Agentforce Vibes         | `.a4drules/skills/` | `~/Library/Application Support/Code/User/globalStorage` (macOS) |
| `manual`           | Manual                   | `.agents/skills/`   | `~/.agents/skills/`                                             |

Use `agentforce-vibes` for Salesforce Agentforce for VS Code. Use `manual` for generic installation with a custom `--directory` path.

### Examples

```bash
# Interactive mode (prompts for skillset and IDEs)
b2c setup skills

# List available skills in a skillset
b2c setup skills b2c --list
b2c setup skills b2c-cli --list
b2c setup skills storefront-next --list

# Install b2c skills to Cursor (project scope)
b2c setup skills b2c --ide cursor

# Install b2c-cli skills to Cursor (global/user scope)
b2c setup skills b2c-cli --ide cursor --global

# Install to multiple IDEs
b2c setup skills b2c --ide cursor --ide windsurf

# Install specific skills only
b2c setup skills b2c-cli --skill b2c-code --skill b2c-webdav --ide cursor

# Install to Agentforce Vibes (.a4drules/skills/)
b2c setup skills b2c --ide agentforce-vibes

# Install to a custom directory
b2c setup skills b2c --ide manual --directory ./my-skills

# Update existing skills
b2c setup skills b2c --ide cursor --update

# Non-interactive mode (for CI/CD) - skillset required
b2c setup skills b2c-cli --ide cursor --global --force

# Install a specific version
b2c setup skills b2c --version v0.1.0 --ide cursor

# Output as JSON
b2c setup skills b2c --list --json
```

### Interactive Mode

When run without `--force`, the command provides an interactive experience:

1. Prompts you to select skill set(s) (if not provided as argument) - you can select multiple sets
2. Downloads skills from the latest release (or specified version)
3. Auto-detects installed IDEs
4. Prompts you to select target IDEs
5. Shows installation preview
6. Confirms before installing
7. Reports results

In non-interactive mode (`--force`), the skillset argument is required.

### Claude Code Recommendation

For Claude Code users, we recommend using the plugin marketplace for automatic updates:

```bash
claude plugin marketplace add SalesforceCommerceCloud/b2c-developer-tooling
claude plugin install b2c-cli
claude plugin install b2c
claude plugin install storefront-next
# Add storefront-next-figma for Figma design-kit workflows (requires the Figma MCP server)
claude plugin install storefront-next-figma
```

The marketplace provides:

- Automatic updates when new versions are released
- Centralized plugin management
- Version tracking

Use `--ide manual` if you prefer manual installation, or `--ide agentforce-vibes` to install to the `.a4drules/skills/` directory used by Salesforce Agentforce for VS Code.

### Skill Sets

| Skill Set               | Description                                                                                                       |
| ----------------------- | ----------------------------------------------------------------------------------------------------------------- |
| `b2c`                   | B2C Commerce development patterns and practices                                                                   |
| `b2c-cli`               | B2C CLI commands and operations                                                                                   |
| `b2c-ops`               | Operator and administrator runbooks for job health, checkout failures, edge traffic and bots, and incident triage |
| `storefront-next`       | Storefront Next development — routing, components, deployment                                                     |
| `storefront-next-figma` | Storefront Next Figma design-kit workflows (requires Figma MCP server)                                            |
| `cap-dev`               | Commerce App Package scaffolding, validation, and submission                                                      |

### Output

When installing, the command reports:

- Successfully installed skills with paths
- Skipped skills (already exist, use `--update` to overwrite)
- Errors encountered during installation

Example output:

```
Downloading skills from release latest...
Detecting installed IDEs...
Installing 12 skills to Cursor (project)

Successfully installed 12 skill(s):
  - b2c-code → .cursor/skills/b2c-code/
  - b2c-webdav → .cursor/skills/b2c-webdav/
  ...
```

### Environment

Skills are downloaded from the GitHub releases of the [b2c-developer-tooling](https://github.com/SalesforceCommerceCloud/b2c-developer-tooling) repository:

| Artifact             | Contents                                     |
| -------------------- | -------------------------------------------- |
| `b2c-cli-skills.zip` | Skills for B2C CLI commands and operations   |
| `b2c-skills.zip`     | Skills for B2C Commerce development patterns |

Downloaded artifacts are cached locally at: `~/.cache/b2c-cli/skills/{version}/{skillset}/`

### See Also

- [Agent Skills & Plugins Guide](/guide/agent-skills) - Overview of available skills
- [Claude Code Skills Documentation](https://claude.ai/code) - Claude Code skill format
- [Cursor Skills Documentation](https://cursor.com/docs/skills) - Cursor skill format. Cursor also auto-loads skills from `.claude/skills/` and `~/.claude/skills/`, so `--ide claude-code` installs are picked up by Cursor automatically.
