JFrog CLI for Agent Plugins

Manage agent plugins in JFrog Artifactory with jf agent plugins: publish, install, update, search, list, and delete plugins using flags and environment variables for CI and interactive workflows.

This page is the complete CLI reference for jf agent plugins in JFrog CLI v2.106.0 or later. It covers every command, flag, and environment variable.

For repository setup, marketplace files, and agent connection walkthroughs, see Agent Plugins Repositories.

All examples use the full command path (for example, jf agent plugins publish). Agent Plugins commands require JFrog CLI v2.106.0 or later (introduced with the jf agent namespace). Standard JFrog CLI server override flags (--url, --user, --password, --access-token, --server-id) apply to every command. When omitted, credentials and server URL come from your active jf config profile.


Commands and reference

When to Use

Use jf agent plugins when you publish, install, update, search, list, or delete AI agent plugin packages stored in JFrog Artifactory repositories with package type agentplugins. Plugins are distributed as zip bundles described by plugin.json.

Prerequisites

Before using jf agent plugins, you need:

  • A local JFrog Artifactory repository configured for the agentplugins package type.
  • JFrog CLI v2.106.0 or later configured to point to your JFrog Artifactory server. For installation steps, see Download and Install the JFrog CLI.
  • For harness-based installs when you omit --version, a HARNESS-marketplace.json file in the repository root (for example, cursor-marketplace.json).

The following tasks cover each command in the jf agent plugins namespace:

Interactive and CI Non-Interactive Modes

Agent Plugins commands follow the same interactive rules as JFrog CLI for Skills: prompts appear in a normal terminal; CI, piped stdin, or --quiet skip prompts and require explicit flags. Per-command Expected Output and Examples are under Publish, Install, and Update.

Search, list, and delete have no Expected Output subsection: those commands do not prompt in the terminal. If --repo is omitted and more than one agentplugins repository exists, the repository picker applies. See Plugins Repository Resolution.

What to Set Explicitly for CI or Quiet Mode

ScenarioWhat to provide in CI
More than one agentplugins repository--repo REPO or JFROG_AGENT_PLUGINS_REPO
Publish when version already existsCI errors: version 1.0.0 of plugin 'my-plugin' already exists. Use a different version or remove the existing one
Harness install without --versionRequires HARNESS-marketplace.json in the repository root, or pass --version
Install with failed evidence checkInstall fails unless JFROG_PLUGINS_DISABLE_QUIET_FAILURE=true
update --allConfirmation is skipped; the command proceeds immediately
📘

JFrog Xray

Post-publish Xray security gating applies to Skills (jf agent skills publish), not to jf agent plugins publish. Enable Xray on Skills repositories per Skills Repositories.

Commands at a Glance

The following table summarizes each command in the jf agent plugins namespace (same order as jf agent plugins --help).

CommandWhat it does
jf agent plugins publishPackage and upload a plugin folder to JFrog Artifactory
jf agent plugins installDownload and install a plugin for one or more harnesses
jf agent plugins updateUpgrade installed plugins to a newer version, or update all discovered plugins with --all
jf agent plugins deleteRemove a specific plugin version from a repository
jf agent plugins listBrowse plugins in a repository or inspect locally installed plugins
jf agent plugins searchSearch for plugins by name across Agent Plugins repositories

Publish a Plugin

Packages the local plugin folder into a zip and uploads it to JFrog Artifactory. The version is read from plugin.json. Version prompts match Publish a Skill (Enter version to publish:, collision menu). Plugins do not run the Skills Xray post-publish gate.

📘

Note

The CLI does not rewrite plugin.json on disk before upload. The published version comes from the manifest and optional --version flag at publish time; your local files are unchanged.

To publish a plugin folder:

  1. Run the publish command with the plugin folder path and target repository:

    jf agent plugins publish PATH_TO_PLUGIN_FOLDER --repo REPOSITORY_NAME

    Where:

    • PATH_TO_PLUGIN_FOLDER: Path to the plugin folder containing plugin.json (CLI argument name: path)
    • REPOSITORY_NAME: Agent plugins local repository key in JFrog Artifactory

Flags

The following table lists flags for jf agent plugins publish.

FlagDescriptionDefault
--repoTarget agent plugins repository key. If omitted, auto-discovered (see Plugins Repository Resolution).Auto-discovered
--versionOverride the version from plugin.json.From plugin.json
--signing-keyPath to PGP private key for evidence signing. Overrides EVD_SIGNING_KEY_PATH.
--key-aliasAlias for the signing key. Overrides EVD_KEY_ALIAS.
--quietSkip interactive prompts (version collision, missing version). Enabled automatically in CI ($CI=true).$CI
--build-nameBuild name for JFrog build-info collection. Requires --build-number.
--build-numberBuild number for JFrog build-info collection. Requires --build-name.
--moduleModule name in build-info for the published artifact.Plugin slug

Expected Output

When the requested version already exists:

10:14:02 [Warn] Version 1.0.0 of plugin 'my-plugin' already exists in repository 'agents-local'.
Choose an action:
  [o] Overwrite the existing version
  [n] Enter a new version
  [a] Abort
Your choice (o/n/a): o
10:14:03 [Info] Overwriting version 1.0.0...

For missing-version prompts, see Publish a Skill.

CI Behavior

Version collision errors: version 1.0.0 of plugin 'my-plugin' already exists. Use a different version or remove the existing one. See What to Set Explicitly for CI or Quiet Mode on this page and JFrog CLI for Skills.

Examples

jf agent plugins publish ~/plugins/my-plugin --repo agents-local

Publish with evidence signing:

jf agent plugins publish ~/plugins/my-plugin --repo agents-local \
  --signing-key ./private.key \
  --key-alias my-evd-key

Install a Plugin

Downloads a plugin zip from JFrog Artifactory and installs it for one or more harnesses, or to a custom local directory.

To install a plugin:

  1. Run the install command with the plugin name and target harness or path:

    jf agent plugins install PLUGIN_NAME \
      (--harness HARNESS_NAME[,HARNESS_NAME...] [--project-dir DIR] | --harness HARNESS_NAME --global | --path DIR) \
      [--repo REPOSITORY_NAME] \
      [--version PLUGIN_VERSION]

    This matches the usage string registered in the CLI: jf agent plugins install SLUG (--harness … | --path DIR) [--repo REPO] [--version VER].

    Where:

  • PLUGIN_NAME: Plugin slug in the repository (CLI argument name: slug)
  • HARNESS_NAME: Built-in or custom harness name (comma-separated for multiple harnesses on install)
  • REPOSITORY_NAME: Agent plugins repository key (optional when auto-discovered)
  • PLUGIN_VERSION: SemVer, latest, or omitted

One of --harness or --path is required.

Version Resolution

Mode--version valueBehavior
Harness installOmittedDownloads each HARNESS-marketplace.json from the repository root and uses the version listed for the plugin slug. All harnesses must resolve to the same version.
Harness installlatestResolves the highest available SemVer in the repository.
Harness installExact SemVerUses the version if it exists in the repository. In interactive mode, if the version is missing, the CLI prompts you to pick from available versions. In CI or --quiet mode, the command fails with the list of available versions.
Path install (--path)Omitted or latestResolves the highest available SemVer in the repository.
Path installExact SemVerSame validation and prompt behavior as harness install.

If marketplace lookup fails, re-run with --version VER (for example, --version 1.0.0 or --version latest) to install directly from JFrog Artifactory.

Plugin slugs must match ^[a-z0-9][a-z0-9-]*$ (lowercase letters, digits, and hyphens; must start with a letter or digit).

Install Modes

ModeFlag combinationWhere the plugin lands
Project-scoped (per harness)--harness NAME (+ optional --project-dir)PROJECT_DIR/HARNESS_PROJECT_PATH/SLUG
Global (per harness)--harness NAME --globalHARNESS_GLOBAL_DIR/SLUG
Direct path--path DIRDIR/SLUG

Flags

The following table lists flags for jf agent plugins install.

FlagDescriptionDefault
--repoAgent plugins repository to download from. See Plugins Repository Resolution.Auto-discovered
--versionVersion to install. See Version Resolution.Marketplace or latest SemVer
--harnessComma-separated harness names. Paths resolved from ~/.jfrog/agents/agent-config.json (plugins-agents key), then built-in defaults. Mutually exclusive with --path.
--project-dirProject root directory. Mutually exclusive with --global..
--globalInstall under each harness's configured globalDir. Mutually exclusive with --project-dir.false
--pathLocal base directory for a direct install at PATH/SLUG. Mutually exclusive with --harness, --project-dir, and --global.
--formatOutput format: table or json.table
--quietSkip interactive prompts. In quiet or CI mode, evidence verification failure causes the install to fail unless JFROG_PLUGINS_DISABLE_QUIET_FAILURE=true is set.$CI

During installation, the CLI verifies evidence when signing keys are configured in JFrog Artifactory.

Expected Output

When evidence verification fails:

10:14:10 [Warn] Evidence verification failed: <reason from server>
The plugin is unattested. Continue with installation? (y/n) [n]? y

For path installs with a missing --version, the version picker matches Install a Skill (Select a version:).

CI Behavior

Evidence verification failure fails unless JFROG_PLUGINS_DISABLE_QUIET_FAILURE=true. See What to Set Explicitly for CI or Quiet Mode.

Examples

Install for Cursor using marketplace version:

jf agent plugins install my-plugin --harness cursor --repo agents-local

Install a specific version for multiple harnesses:

jf agent plugins install my-plugin --harness cursor,claude --repo agents-local --version 1.0.0

Install globally for Codex:

jf agent plugins install my-plugin --harness codex --global --repo agents-local --version latest

Install to a custom path:

jf agent plugins install my-plugin --path ./vendor/plugins --repo agents-local

Install Metadata

On successful install, the CLI writes .jfrog/plugin-info.json under each installed plugin directory. This manifest records the source repository, installed version, harness, scope, and project directory. jf agent plugins list --harness uses this file for registry comparisons.

Supported Built-in Harnesses

The following harnesses are supported out of the box for plugins. Paths are resolved from ~/.jfrog/agents/agent-config.json under the plugins-agents key.

Harness nameProject pathGlobal path
claude.claude/plugins~/.claude/plugins
cursor.cursor/plugins~/.cursor/plugins
codex.codex/plugins~/.codex/plugins

To add or override a harness:

{
  "plugins-agents": {
    "my-agent": {
      "projectDir": ".my-agent/plugins",
      "globalDir": "~/.my-agent/plugins"
    }
  }
}

You can also set plugin-manifest-paths in the same file to customize the ordered list of relative plugin.json paths checked during publish.

Update a Plugin

Updates an installed plugin to a newer (or specific) version. The command compares the currently installed version against the target version and skips targets that are already up to date. If the update fails, the previous install is automatically restored from a backup.

Version resolution uses the Artifactory storage API directly (no marketplace lookup). When --version is omitted, the CLI resolves the latest SemVer in the repository. When you specify an exact version that does not exist, interactive mode prompts you to pick from available versions; CI or --quiet mode fails with the list of available versions.

To update an installed plugin to a newer or specific version:

  1. Run the update command with the plugin slug or --all and target harness:

    jf agent plugins update \

(--slug PLUGIN_NAME (--harness HARNESS_NAME[,HARNESS_NAME...] [--project-dir DIR] | --harness HARNESS_NAME --global | --path DIR)
[--repo REPOSITORY_NAME] [--version TARGET_VERSION])
| (--all --harness HARNESS_NAME[,HARNESS_NAME...] [--project-dir DIR] | --global) [--repo REPOSITORY_NAME])


Where:

* `PLUGIN_NAME`: Plugin slug to update (`--slug`; not a positional argument)
* `HARNESS_NAME`, `DIR`, `REPOSITORY_NAME`: Same as [`jf agent plugins install`](#install-a-plugin)
* `TARGET_VERSION`: Target SemVer or `latest` (default when using `--slug`)

#### Flags

The following table lists flags for `jf agent plugins update`.

| Flag | Description | Default |
| ----- | ----- | ----- |
| `--slug` | Plugin slug to update. Required unless `--all` is set. Mutually exclusive with `--all`. | — |
| `--all` | Update every plugin discovered under the given `--harness` list to the latest version in the repository. Requires `--harness`; mutually exclusive with `--slug`, `--version`, and `--path`. Prompts for confirmation in interactive mode. | `false` |
| `--repo` | Agent plugins repository to download from. See [Plugins Repository Resolution](#plugins-repository-resolution). | Auto-discovered |
| `--version` | Target version. Omit for latest. Mutually exclusive with `--all`. | `latest` |
| `--harness` | Comma-separated harness names. Same resolution as `jf agent plugins install`. Required for `--all`. | — |
| `--project-dir` | Project root directory. Default: current directory. Mutually exclusive with `--global`. | `.` |
| `--global` | Update under each harness's global directory. Mutually exclusive with `--project-dir`. | `false` |
| `--path` | Base directory of the existing direct install to update (`PATH/SLUG`). The base directory must already exist. Mutually exclusive with `--all`. | — |
| `--dry-run` | Preview what would be updated without downloading or changing files. | `false` |
| `--force` | Re-download and reinstall even if the plugin is already at the target version. | `false` |
| `--format` | Output format for the update summary: `table` or `json`. | `table` |
| `--quiet` | Skip interactive prompts. When not quiet, skip and failure reasons are logged to the terminal. | `$CI` |

#### Expected Output

When using `--all`:

```text
Update all discovered plugins under the given harness(es) to their latest version in the repository? Each install folder name is used as the repository slug (same as update --slug). Matching packages will be updated, including installs that were not made with JFrog CLI. (y/n) [n]? y

With --slug and a missing --version, see Install a Skill.

CI Behavior

update --all skips confirmation in CI or with --quiet. See What to Set Explicitly for CI or Quiet Mode.

Behavior

  • Targets not yet installed are reported as failed (run jf agent plugins install first).
  • Targets already at the target version are reported as skipped (use --force to reinstall).
  • With --all, each install folder name under the harness directories is treated as the repository slug (including installs not made with JFrog CLI).
  • Downloads the zip once and copies it to all eligible targets.
  • On failure for any individual target, the previous install is restored from a temporary backup under INSTALL_BASE/.plugin-backup/ (for example, .cursor/plugins/.plugin-backup/ in project-scoped mode).

Examples

Update my-plugin to the latest version for the Cursor harness (project-scoped):

jf agent plugins update --slug my-plugin --harness cursor --repo agents-local

Update to a specific version with dry-run preview:

jf agent plugins update --slug my-plugin --harness cursor --repo agents-local --version 2.0.0 --dry-run

Update all discovered plugins under Cursor and Claude to latest:

jf agent plugins update --all --harness cursor,claude --repo agents-local

Force reinstall even if already at target version:

jf agent plugins update --slug my-plugin --harness cursor --repo agents-local --force

Get machine-readable update summary:

jf agent plugins update --slug my-plugin --harness cursor --repo agents-local --format json

Example JSON response:

{
  "slug": "my-plugin",
  "version": "2.0.0",
  "results": [
    {
      "agent": "cursor",
      "scope": "project",
      "path": "/path/to/project/.cursor/plugins/my-plugin",
      "status": "ok",
      "detail": "Executed successfully with no issues."
    }
  ]
}

Delete a Plugin

Removes a specific version of a plugin from an agent plugins repository. The CLI does not show an interactive confirmation prompt or other terminal prompts. Repository auto-discovery behaves like other commands; see Plugins Repository Resolution.

To delete a plugin version from an agent plugins repository:

  1. Run the delete command with the plugin name, version, and optional repository:

    jf agent plugins delete PLUGIN_NAME --version PLUGIN_VERSION [--repo REPOSITORY_NAME]

    Where:

  • PLUGIN_NAME: Plugin slug to delete (CLI argument name: slug)
  • PLUGIN_VERSION: Version to remove (required)
  • REPOSITORY_NAME: Agent plugins repository key (optional when auto-discovered)

Flags

FlagDescriptionDefault
--versionVersion to delete. Required.
--repoAgent plugins repository key. See Plugins Repository Resolution.Auto-discovered
--dry-runShow what would be deleted without making any changes.false

Examples

jf agent plugins delete my-plugin --version 1.0.0 --repo agents-local

Preview deletion:

jf agent plugins delete my-plugin --version 1.0.0 --repo agents-local --dry-run

List Plugins

Lists plugins in the following modes (matching jf agent plugins list --help). This command has no interactive prompts except when --repo is auto-discovered from multiple repositories; see Plugins Repository Resolution.

  • Registry (--repo): Plugins in an agent plugins repository
  • Project-local: --harness with optional --project-dir (default: current directory)
  • Global-local: --harness --global

Exactly one of --repo or --harness is required. For list mode, --harness accepts a single harness name (not comma-separated).

To list plugins in a repository or installed for a harness:

# List plugins in a repository
jf agent plugins list --repo REPOSITORY_NAME [--limit N] [--sort-by updated|downloads]

# List locally installed plugins (project-scoped)
jf agent plugins list --harness HARNESS_NAME [--project-dir DIR]

# List locally installed plugins (global)
jf agent plugins list --harness HARNESS_NAME --global

Where:

  • REPOSITORY_NAME: Agent plugins repository to list (mutually exclusive with --harness)
  • HARNESS_NAME: Harness for installed-plugin listing (single name only)
  • N: Maximum number of results when listing a repository

Flags

FlagDescriptionDefault
--repoAgent plugins repository to list. Mutually exclusive with --harness.
--harnessSingle harness name for installed-plugin listing. Mutually exclusive with --repo.
--project-dirProject root for harness-scoped listing. Mutually exclusive with --global..
--globalList from the harness global directory. Mutually exclusive with --project-dir.false
--limitMaximum number of results to return (registry mode).All
--sort-byWith --repo: updated (default) or downloads. With --harness: name (only option).updated / name
--sort-orderSort order for --harness mode: asc or desc. Not supported with --repo.asc
--check-updatesWith --harness only: compare installed versions against the registry.false
--formatOutput format: table or json.table

Examples

jf agent plugins list --repo agents-local --sort-by downloads
jf agent plugins list --harness claude --check-updates
jf agent plugins list --harness cursor --format json

Search Plugins

Searches for plugins by name across Agent Plugins repositories using the Artifactory property search API. The CLI matches against the agentplugins.name property. Use --repo to limit the search to one repository; when omitted, all local repositories with package type agentplugins are searched. This command has no interactive prompts; see Interactive and CI (non-interactive) modes.

To search for plugins by name:

  1. Run the search command with a query and optional repository or format:

    jf agent plugins search QUERY [--repo REPOSITORY_NAME] [--format json]

    Where:

  • QUERY: Plugin name or search term (required positional argument)
  • REPOSITORY_NAME: Optional repository to search (when omitted, searches all agentplugins repositories)

Flags

FlagDescriptionDefault
--repoAgent plugins repository to search. When omitted, searches all agentplugins repositories.All agentplugins repositories
--formatOutput format: table or json.table

Examples

Search all agentplugins repositories:

jf agent plugins search web-scraper

Search a specific repository with JSON output:

jf agent plugins search web-scraper --repo agents-local --format json

Example JSON response:

[
  {
    "name": "web-scraper",
    "version": "1.2.0",
    "repository": "agents-local",
    "description": "Scrapes web pages for agent workflows."
  }
]

Plugins Repository Resolution

All jf agent plugins commands accept --repo to specify the target agent plugins repository. When --repo is omitted, the CLI resolves the repository using the following priority order:

  1. --repo flag value
  2. JFROG_AGENT_PLUGINS_REPO environment variable
  3. Auto-discovery: queries JFrog Artifactory for all local repositories with package type agentplugins
    • If exactly one is found, it is used automatically.
    • If multiple are found in interactive mode, you are prompted to select one.
    • If multiple are found in CI or quiet mode, the command fails with the list of options.

Expected Output

When more than one agentplugins repository exists and --repo is omitted:

Select an agent plugins repository: agents-local

CI Behavior

Fails with: multiple agent plugins repositories found (repo-a, repo-b); specify --repo or set JFROG_AGENT_PLUGINS_REPO.

Plugins Environment Variables

VariableCommandsDescriptionDefault
JFROG_AGENT_PLUGINS_REPOAllSpecifies the agent plugins repository when --repo is not set.
EVD_SIGNING_KEY_PATHpublishPath to the PGP private key for evidence signing. Overridden by --signing-key.
JFROG_CLI_SIGNING_KEYpublishAlternative path to the PGP signing key. Lower priority than EVD_SIGNING_KEY_PATH.
EVD_KEY_ALIASpublishAlias for the signing key. Overridden by --key-alias.
JFROG_CLI_BUILD_NAMEpublishBuild name for build-info collection. Overridden by --build-name.
JFROG_CLI_BUILD_NUMBERpublishBuild number for build-info collection. Overridden by --build-number.
JFROG_PLUGINS_DISABLE_QUIET_FAILUREinstallSet to true to allow installation to continue when evidence verification fails in CI or quiet mode.false

Related Topics