Integration CLI Reference
This reference documents shared specify integration commands, catalog
management, and lifecycle behavior. For agent-specific setup, installed paths,
options, and limitations, start with the integration guides.
Run these commands inside a project initialized with specify init.
For a new project, use specify init <project> --integration <key>.
Supported AI Coding Agents
The integration directory
lists supported agents and their exact keys, with a dedicated guide for each
integration. Run specify integration list to inspect local availability.
Command Invocation
Invoke Spec Kit's process steps inside your coding agent, not in the terminal. In GitHub Copilot's default mode, these are skills you invoke in the agent's chat. CLI installation and setup commands are separate terminal operations. The steps are the same across integrations, but their spelling depends on the agent and its installed mode:
| Integration or mode | SDD example | Extension example |
|---|---|---|
| GitHub Copilot, default skills mode | /speckit-specify |
/speckit-bug-assess |
| Dotted slash-command notation used in the references | /speckit.specify |
/speckit.bug.assess |
| Codex, Command Code, ZCode skills | $speckit-specify |
$speckit-bug-assess |
| Kimi skills | /skill:speckit-specify |
/skill:speckit-bug-assess |
Use the form exposed by your agent. See the GitHub Copilot guide for its skills and commands layouts, or choose another agent from the integration directory.
List Available Integrations
specify integration list
| Option | Description |
|---|---|
--catalog |
Also browse the catalog, including external integrations not installed in this project. |
Shows built-in and trusted installed external integrations, their setup requirements, and their multi-install safety declarations. Installed integrations and the default are marked separately.
Search Available Integrations
specify integration search [query]
| Option | Description |
|---|---|
--tag |
Filter by tag |
--author |
Filter by author |
Searches the active catalog stack. Without a query, lists all available integrations.
Integration Info
specify integration info <integration_id>
specify integration info <integration_id> --versions
Shows an integration's catalog metadata, source catalog, and whether it is active.
--versions lists the advertised current and historical versions from the
winning catalog, with the current release first and older releases in descending
version order. Discovery-only sources are labeled as such.
Install an Integration
specify integration install <key>
| Option | Description |
|---|---|
--script sh\|ps\|py |
Script type: sh (bash/zsh), ps (PowerShell), or py (Python) |
--force |
Opt in to installing alongside integrations that are not declared multi-install safe |
--integration-options |
Integration-specific options (e.g. --integration-options="--commands-dir .myagent/cmds") |
--trust-integration |
After reviewing the code, pre-authorize an external adapter's Python execution without the interactive trust prompt |
Installs the integration into the current project. Multi-install proceeds
automatically only when all involved integrations are declared safe. Otherwise,
use switch to replace the default or --force to opt in to multi-install.
Failed setup triggers rollback.
Catalog history is metadata only. integration install still resolves
registered built-in implementations directly, or the current external adapter
release from an install-enabled catalog, not historical catalog records.
There is no integration install --version. The default community catalog
remains discovery-only.
Installing an additional integration does not change the default integration. Use specify integration use <key> to change the default.
Extensions and presets follow the default integration only. Use use <key> or
switch <key> to activate another integration and register their commands for it.
Catalog-installed external adapters
Register a reviewed catalog in the initialized project, then install its adapter:
specify integration catalog add https://example.com/catalog.json --name samples
specify integration install sample-agent
specify integration use sample-agent
Installation prompts for trust before downloading/importing Python. For automation, explicitly authorize code you have reviewed:
specify integration install sample-agent --trust-integration
specify integration upgrade sample-agent --trust-integration
The source must have install_allowed: true. The default community catalog is
discovery-only; neither --force nor the trust flag bypasses that policy.
Catalog listing/search/info do not import catalog code. See the
catalog schema for required metadata and supported
archive URLs.
Search advertises specify integration install <id> for install-enabled sources;
discovery-only results do not advertise installation.
specify check probes an external adapter's required descriptor tools rather
than its catalog ID. With no required tools declared, CLI adapters are checked
using their runtime executable; optional tools do not produce missing-tool
errors. These checks do not run the executable or invoke generic version probes.
Installed adapter code persists separately from generated agent files. New CLI
processes load the trusted package without consulting the catalog. Missing,
modified, or incompatible code is an error, not a silent fallback. Upgrade
fetches the catalog's current version; uninstall removes the package while
preserving modified generated files by default.
Metadata-only workflow status and workflow info remain available without
loading adapter code, including when an installed adapter is damaged. Workflow
execution and resume still report adapter-loading failures explicitly.
Execution consent is user-local and bound to the project, integration, and verified package contents. Copying project metadata does not transfer consent. After copying a project or changing users, review the adapter and reauthorize from an install-enabled catalog:
specify integration upgrade sample-agent --force --trust-integration
Forced uninstall also works when package code is untrusted or its entire directory is missing; it does not import that code.
For initialization, a project/user catalog or SPECKIT_INTEGRATION_CATALOG_URL
can supply an external adapter:
specify init my-project --integration sample-agent --trust-integration
Review the external adapter API before publishing a package. No pip installation or source-registry edit is needed for adapters using the host API and standard library.
If your CLI rejects multi-install, check specify version and follow the
upgrade guide. A one-shot uvx invocation does not update the
persistent specify executable on your PATH.
Uninstall an Integration
specify integration uninstall [<key>]
| Option | Description |
|---|---|
--force |
Remove files even if they have been modified |
Removes the specified integration, or the default if no key is given. Manifest-tracked generated files use content hashes for cleanup:
- Unmodified files are removed automatically.
- Modified files (where you've made manual edits) are preserved so your customizations are not lost.
- Use
--forceto remove modified tracked files too.
These are the rules for manifest-tracked generated files. Integration-specific cleanup can differ: Hermes global skills and Kimi legacy skills can be removed without modified-file protection. Check the agent guide before uninstalling or switching away.
Uninstall also removes the integration's registered extension and preset
artifacts; the extensions and presets themselves stay installed. Removing the
default selects a remaining integration and registers enabled contributions for
it. Removing the last integration does not install none automatically.
Switch to a Different Integration
specify integration switch <key>
| Option | Description |
|---|---|
--script sh\|ps\|py |
Script type: sh (bash/zsh), ps (PowerShell), or py (Python) |
--force |
Force removal of modified files during uninstall; when the target is already installed, overwrite managed shared templates while changing the default |
--refresh-shared-infra |
Also overwrite shared infrastructure files even if you customized them (otherwise customizations are preserved) |
--integration-options |
Options for the target integration when it is not already installed |
--trust-integration |
Authorize downloading and executing a reviewed external adapter without the interactive trust prompt |
- Target not installed: removes the current default, installs the target, and makes it the default. Other installed integrations remain.
- Target already installed: changes the default without removing any
integrations, like
use. To change its setup options, runupgrade <key> --integration-options ...first, thenuse <key>;switchrejects setup options for installed targets.
Both paths register enabled extensions and presets for the new default.
See the option table for the different meanings of --force.
When switching to an external adapter that must be downloaded and installed,
use --trust-integration only after reviewing its code:
specify integration switch sample-agent --trust-integration
Switching to an already-installed adapter still validates its existing trust. The flag does not bypass that validation or a catalog's discovery-only policy. See catalog-installed external adapters for the trust requirements.
Use an Installed Integration
specify integration use <key>
| Option | Description |
|---|---|
--force |
Overwrite managed shared templates while changing the default |
Sets the default integration without uninstalling any other installed integrations. This also refreshes managed shared templates so command references match the new default integration's invocation style. Modified or untracked shared templates are preserved unless --force is used.
It also registers enabled extension and preset commands or skills for the new default, including contributions installed while another integration was active.
Upgrade an Integration
specify integration upgrade [<key>]
| Option | Description |
|---|---|
--force |
Overwrite files even if they have been modified |
--script sh\|ps\|py |
Script type: sh (bash/zsh), ps (PowerShell), or py (Python) |
--integration-options |
Options for the integration |
--trust-integration |
Authorize downloading/importing the reviewed replacement external adapter |
Reinstalls an installed integration with updated templates and commands (e.g., after upgrading Spec Kit). Defaults to the default integration; if a key is provided, it must be one of the installed integrations. Detects locally modified files and blocks the upgrade unless --force is used. Stale files from the previous install that are no longer needed are removed automatically. Shared templates stay aligned with the default integration even when upgrading a non-default integration.
Enabled extensions and presets are re-registered only when upgrading the currently active (default) integration. A non-default upgrade still refreshes that integration's core commands, but does not re-register its extension or preset layers — use/switch that integration afterward to rescaffold them.
If the generated-file manifest is missing, upgrade reports that there is nothing
to upgrade and leaves the installed adapter package, generated files, and local
recovery ownership unchanged, including with --force. Replacement code is
persisted only after the upgrade regenerates the managed files successfully.
If an upgrade would change an integration between command and skills layouts while preset artifacts are registered for it, the upgrade is rejected before changing files. Remove the affected presets, run the layout-changing upgrade, then reinstall them.
For external adapters, forced upgrade or uninstall can recover damaged or
unloadable packages using user-local ownership records. Without that proof,
old-only generated files are preserved with a manual-cleanup warning. Recovery
preserves shared event dispatchers and partially owned settings; a trusted
replacement may still overwrite its declared destinations under upgrade --force.
Recovery does not bypass catalog policy or replacement-package trust.
Failed operations roll back their own changes, not unrelated user files or workflow progress. Conflicting concurrent edits are reported with recovery snapshots retained. Adapter authors should follow the storage, loading, and lifecycle contract for ownership, journaling, and recovery requirements.
Report Integration Status
specify integration status
specify integration status --json
Reports the current project's integration status without changing files. The
status report includes the default integration, installed integrations,
multi-install safety, missing managed files, modified managed files, invalid
manifest paths, shared Spec Kit infrastructure health, unchecked manifests, and
the target integration for default-sensitive shared templates. The JSON form is
intended for CI and coding agents that need stable machine-readable status data;
it also reports the raw recorded integrations and the integration manifests that
were checked when state repair heuristics differ from the recorded file.
The command exits 0 when the report status is ok or warning; it exits 1
only when the report status is error. In JSON output, multi_install_safe
is null when no installed integration set can be evaluated, such as when the
integration state is missing, unreadable, lacks a valid recorded integration
list, or records no installed integrations.
Catalog Management
Integration catalogs control where the discovery commands (search and info) look for integrations. Catalogs are checked in priority order.
Catalog management, integration list --catalog, and integration info do not
execute adapter code. Ordinary integration listing, setup, selection, status,
registration, and workflow dispatch load trusted installed implementations.
List Catalogs
specify integration catalog list
Shows the active catalog sources. Project-level sources (when configured) are removable by index; otherwise the active sources are shown as non-removable.
Add a Catalog
specify integration catalog add <url>
| Option | Description |
|---|---|
--name <name> |
Optional name for the catalog |
Adds a custom catalog URL to the project's .specify/integration-catalogs.yml. The URL must use HTTPS (except http://localhost, http://127.0.0.1, or http://[::1] for local testing).
Re-adding the same URL with the same name succeeds without changing the configuration; a different name is rejected.
Remove a Catalog
specify integration catalog remove <index>
Removes a project catalog source by its 0-based index in catalog list.
Catalog Resolution Order
The first configured layer replaces lower layers. Within that layer, lower numeric priority wins:
- Environment variable —
SPECKIT_INTEGRATION_CATALOG_URLoverrides all catalogs - Project config —
.specify/integration-catalogs.yml - User config —
~/.specify/integration-catalogs.yml - Built-in defaults — official catalog + community catalog
Historical Integration Metadata
An integration entry may retain the existing top-level fields for its advertised
current release and add a releases mapping of historical version to metadata.
Single-version entries remain valid without a releases key. For example:
{
"id": "my-agent",
"name": "My Agent",
"version": "2.0.0",
"description": "Current release",
"releases": {
"1.0.0": {
"description": "Historical release",
"repository": "https://example.com/my-agent/v1",
"requires": {"speckit_version": ">=0.7"}
}
}
}
The top-level fields retain their original meaning for older clients and for
unqualified search, info, list --catalog, and install commands. Historical
records may contain name, description, author, repository, license,
tags (a list of strings), and requires (a mapping). Shared identity, name,
author, and source policy are retained; current-only metadata such as
description, repository, tags, and requirements is not inherited by an
older release unless explicitly supplied in its record. Release records cannot
override id, version, releases, or source policy, and cannot advertise
download URLs or archives.
For programmatic metadata lookup,
IntegrationCatalog.get_integration_info(id, version="1.0.0") selects the
exact historical record from the winning source, or returns None if that
version is missing. get_integration_versions(id) returns the versions
advertised by that same source. PEP 440-equivalent spellings (such as v1.0
and 1.0.0) match the same release while retaining its catalog spelling.
The current release must not be repeated in releases; malformed records and
duplicate equivalent versions are rejected. An absent version never falls
through to a lower-priority source or silently selects current. These lookups
do not install an integration.
Integration-Specific Options
Pass agent-specific setup options through --integration-options. Their
semantics, examples, and migration caveats live in the relevant agent guide:
| Integration | Guide |
|---|---|
| Generic | Output directory and skills mode |
| GitHub Copilot | Skills and commands layouts |
| IBM Bob | Legacy commands and migration |
| Kimi Code | Legacy migration |
Other agent-specific details are listed in the integration directory.
Runtime Events
Event-capable integrations accept --events true|false through the setup
--integration-options string; the default is enabled. Handler definitions
come from integration defaults, installed extensions, and
.specify/integration-events.yml. Enabling events does not create handlers
where none are configured, and an integration emits only the native events
it supports.
To configure project overrides, create .specify/integration-events.yml.
Replace <key> with your integration key and the example command with an
installed, script-backed Spec Kit command:
integrations:
<key>:
events:
post_tool_use:
- command: speckit.my-extension.check
matcher: "*"
timeout: 60
Each event accepts a handler mapping or a list of handlers. A handler requires
a non-empty command string; matcher is an optional native filter string,
and timeout is an optional positive integer in seconds.
Integration defaults and extension handlers accumulate. A valid project override
replaces the entire event map for that integration, not just the events
listed in the override. Set events: {} under the integration key to disable
all its handlers. If the override cannot be read or parsed, or an event fails
validation, Spec Kit warns and retains the defaults and extension handlers.
--events false takes precedence over all these sources.
With events enabled, apply configuration changes using
specify integration upgrade <key>.
For an event-capable integration, disable Spec Kit event handlers during an upgrade:
specify integration upgrade <key> --integration-options="--events false"
Supplying --integration-options replaces stored setup options, so repeat other
options you want to keep. A disabled event set removes previously installed
Spec Kit hooks rather than merely stopping new hook generation.
Agent-specific guides identify native event configuration paths and
limitations. These runtime events are distinct from extension command hooks.
Workflow CLI Dispatch
The agent guides distinguish IDE setup from workflow CLI support. Some IDE integrations can dispatch workflow steps if their separate CLI is available; others explicitly do not support command/prompt dispatch. Adapter support means Spec Kit can construct the invocation, not that every vendor CLI release has been exercised against it.
CLI-capable adapters support
SPECKIT_INTEGRATION_<KEY>_EXECUTABLE for executable selection and
SPECKIT_INTEGRATION_<KEY>_EXTRA_ARGS for additional CLI arguments, where
<KEY> is uppercase with hyphens replaced by underscores. Extra arguments are
parsed using POSIX shell quoting. Placement and duplicate-flag behavior differ
by adapter; see the agent guide, especially for Docker Agent and Goose.
Setup --integration-options are separate from workflow
integration_args and integration_options.
Adapters reject non-empty per-step configuration unless they implement it;
Docker Agent currently exposes structured agent/safety configuration.
Headless approval flags, model forwarding, and structured-output support are
also adapter-specific, not universal guarantees.
GitHub Issue Creation
The deprecated speckit.taskstoissues command still runs with a warning but
will be removed in a future minor release. Install the opt-in GitHub extension
with specify extension add github and use speckit.github.taskstoissues
instead. See the extension's migration guide
for invocation syntax and migration details; the core command does not install
the extension automatically.
FAQ
Can I install multiple integrations in the same project?
Yes, but it is intended for team portability rather than the default setup. Multiple integrations are allowed automatically only when the installed integration and the new integration are declared multi-install safe by Spec Kit. For other combinations, pass --force to acknowledge that multiple agents may see unrelated agent-specific instructions or commands.
Spec Kit tracks one default integration in .specify/integration.json with default_integration, all installed integrations with installed_integrations, per-integration runtime settings with integration_settings, and a dedicated integration_state_schema for future state migrations. The legacy integration field remains as an alias for the default integration.
Which integrations are multi-install safe?
For integrations that generate agent files, safety requires static, unique output paths, stable command invocation settings, and a separate manifest whose managed files do not overlap another safe integration. Registry tests enforce those invariants. Shared Spec Kit templates remain aligned to the single default.
Run specify integration list to inspect each integration's declaration.
Each integration's guide documents its safety status and installed command
directories.
Integrations that share a command directory with another integration, require dynamic install paths such as --commands-dir, or merge shared tool settings are not declared safe by default. They can still be installed alongside another integration with --force.
What happens to my changes when I uninstall or switch?
Manifest-tracked files you've modified are preserved automatically. Only
unmodified tracked files (matching their original SHA-256 hash) are removed.
Use --force to override this. See
uninstall for integration-specific cleanup exceptions.
How do I know which key to use?
Run specify integration list to see all available integrations with their keys,
or check the integration directory.
Do I need the AI coding agent installed to use an integration?
CLI-based integrations require the tool to be installed. IDE-based integrations
work through the IDE itself and may not require a separate CLI for setup.
Workflow dispatch can have additional CLI requirements; see your integration's
guide. specify integration list shows each integration's setup requirements.
When should I use upgrade vs switch?
Use upgrade when you've upgraded Spec Kit and want to refresh an installed integration's managed files. Use switch when you want to replace the current default with another integration; if the target is already installed, switch behaves like use.
Do extensions and presets I install apply to every installed integration?
No. Extensions (specify extension add) and presets (specify preset add) register their command overrides for the currently active (default) integration only, even if other integrations are installed. A non-default integration does not receive those artifacts until it becomes the default: specify integration use <key> (or switch <key>) rescaffolds every enabled extension and preset for the newly active integration. specify integration upgrade follows the same rule — it only re-registers extensions and presets when upgrading the active integration.