Command reference
Canonical HarnessTap CLI commands, aliases, and important flags.
This page mirrors the grouped CLI surface exposed by harnesstap --help. Use it as the canonical reference for command names, aliases, and the most important flags. For workflow examples, see the scenario guides.
Global options
Available on harnesstap / ht:
-V, --harnesstap-version— print the HarnessTap CLI version-v, --verbose— show verbose error output--no-color— disable ANSI colors--no-interactive— disable interactive prompts-h, --help— show help
Noun shorthand aliases
| Full noun | Alias |
|---|---|
plugin | l (legacy shorthand from the old layer noun) |
resource | r |
harness | h |
environment | e |
profile | p |
auth | a |
migrate | m |
help
Core HarnessTap concepts and a numbered scenario index. Scenario playbooks live in docs/scenarios/details/.
ht help
ht help --format json
ht help scenario 11
ht help scenario 7 --format jsoninit
Initialize local HarnessTap state.
ht init
ht init --main claude-code --aliases cursor,codex
ht init --format jsonKey options:
--main <slug>— set the default main harness--aliases <slugs>— comma-separated alias harnesses--no-default-profile— skip seeding theglobal defaultprofile plugin andactive-profile.jsonpointer--interactive— prompt for harness selection instead of relying on explicit flags--format <mode>—humanorjson
init seeds a local global default profile plugin (tagged profile) from library resources imported from home, writes active-profile.json unless --no-default-profile is passed, and prints the tracked directory list (home as ~). Global apply does not run automatically — run ht profile use "global default" to materialize home harness files.
init completion
Generate shell completion scripts for bash, zsh, or fish. After installation, Tab completes:
- subcommands and flags for every
htcommand - dynamic values such as local plugin, profile plugin, and resource names
- harness slugs, cloud accounts, and catalog plugins (when authenticated) for supported commands
Install by appending or saving the script for your shell:
ht init completion bash >> ~/.bashrc
ht init completion zsh >> ~/.zshrc
ht init completion fish > ~/.config/fish/completions/ht.fishRestart your shell or source the file, then try ht plugin show <Tab> to list local plugins.
Both ht and harnesstap invocations are supported.
add
Install skills from a remote GitHub repo, Git URL, or local skill-package directory. Discovers skills recursively under skills/ or .agents/skills/, imports the full package into the HarnessTap library, and installs a selected subset to disk.
ht add mattpocock/skills
ht add mattpocock/skills --list
ht add mattpocock/skills --skill caveman,grill-me --global --yes
ht add mattpocock/skills --create-plugin mattpocock-skills --global -y
ht add ./local/skills-repo --project .| Flag | Purpose |
|---|---|
--skill <names> | Install subset (comma-separated) |
--all | Install all discovered skills |
--harness <slugs> | Target harnesses (default: main + alias harnesses from preferences) |
--global | Install to user home paths |
--project [path] | Install to project directory (default . when flag present without value) |
--method symlink|copy | Installation method (default symlink) |
--plugin <name> | Attach installed skills to an existing plugin |
--create-plugin <name> | Create a plugin and attach installed skills |
--list | Discover skills only; no import or install |
--dry-run | Show plan without writing |
-y, --yes | Skip interactive prompts |
--format human|json | Output mode |
Scope rule: exactly one of --global or --project must be resolved before install (the wizard asks if neither is set). Import to the library always runs on a successful add except with --list or --dry-run.
Project-local verbs
Git-style commands for working in a project directory. Each defaults to the current directory when [path] is omitted.
Commands
scan [path]— import resources from a project tree (hash-aware upsert; prompts on content drift when interactive)use— switch to a project-configured profile fromapm.yml(ht use --profile <key>, not a positional profile name)mirror [path]— mirror alias harness outputs from the main harness statestatus [path]— show project status with drift summaryhistory [path]— list snapshots for a tracked projectrevert [snapshot-id]— restore files from a previous snapshot
Apply plugins with top-level apply (not under this group). Onboard from repo-root apm.yml with top-level install (the same loop as apply with no plugin selector). Preview resolved apply targets with targets; compile is the same apply-from-manifest loop under a named entry.
Important options
scan --harness <slug>— scan only one harnessscan --dry-run— preview imports without writing to the DBscan --overwrite— replace library rows when scan content differsscan --skip-existing— keep existing rows when scan content differsscan --namespace <name>— namespace for imported project resourcesscan --global— install imported plugin sources into global harness locationsscan --harness <slugs>— harness targets for--globalplugin installsuse --profile <key>— profile key fromapm.yml(required unless--list)use --list— list profiles from project config without applyinguse --dry-run— preview global apply without writinguse --force— apply even when the profile is already active and in syncuse --no-pull— fail when composition refs are missing locallyuse --harness <slugs>/--on-conflict <replace|skip|prompt>/--account <name>/--base-url <url>/--format jsonmirror --dry-run— preview alias mirror writesmirror --force-shift-reference <slug>— set the project main harness before mirroringmirror --reference <strategy>— reference source: main, plugin, agents, or automirror --format jsonstatus --check— exit1when drift exists since the last snapshot, or whenapm.lock.yamldisagrees with the applied manifest (CI)status --format json— includes adriftobject when git-backedhistory --format jsonhistory --show-id— show full snapshot IDs in human tables
Preconditions and side effects
history,status --check,harness project set, andharness project statusrequire a git repository with a configuredoriginremote.applycan write files in non-git directories, but snapshots are only stored when the project has a gitorigin.revertrequires a snapshot ID fromhistory.applyresolves environment values through the cascade: home environment ◂ configured-plugin default (last wins).
install
Project onboarding from repo-root apm.yml. Same loop as apply with no plugin selector — not a second resolver and not Microsoft's apm CLI.
ht install
ht install --project .
ht install --target cursor,claude
ht install --mcp io.github.github/github-mcp-server --target cursor
ht install --harness claude-code,cursor
ht install --dry-run
ht install --update
ht install --forceReads dependencies.apm (and transitive dependencies.apm on fetched git / catalog / path packages) / dependencies.mcp (including MCP Registry v0.1 identities such as io.github.github/github-mcp-server), compiles local .apm/ primitives, writes apm.lock.yaml, and materializes the resolved target harness directories. Registry strings fetch GET /v0.1/servers/{id}/versions/latest from registry.modelcontextprotocol.io and emit the same native MCP files HT already writes. Self-defined registry: false entries stay inline. --mcp <id> appends the identity to apm.yml then runs install; a failed install rolls the manifest write back. Target resolution: --target / --all / --harness, then targets: in apm.yml, then project/global harness preference, then filesystem auto-detect. Declared targets: wins over preference and folder detection. Fails closed when no target can be resolved. Commit the lockfile plus generated harness output (.claude/, .cursor/, AGENTS.md, and so on). Same project-scope flags as apply. Does not take a plugin selector or --global. See the Use ramp: install a project.
ht install --mcp io.github.github/github-mcp-server --target cursormcp
Discover and install MCP Registry v0.1 servers. Same registry and emit path as ht install.
ht mcp search github
ht mcp list
ht mcp show io.github.github/github-mcp-server
ht mcp install io.github.github/github-mcp-server --target cursormcp install is an alias of ht install --mcp. Search/list/show call the official registry only. Install uses the same apply-from-manifest loop as ht install (including transitive dependencies.apm).
lock export
Serialize apm.lock.yaml into a CycloneDX 1.5 (default) or SPDX 2.3 SBOM inventory. Reads the lockfile only — no re-resolve, no re-hash, no network. Not a signed attestation and not SLSA. See the Use ramp: export a lockfile SBOM.
ht lock export
ht lock export --format cyclonedx -o sbom.json
ht lock export --format spdx --timestamp 2024-06-01T00:00:00+00:00
ht lock export --project .Key options:
-f, --format <format>—cyclonedx(default) orspdx-o, --output <file>— write a file instead of stdout--project <path>— project directory (default.)-g, --global— read~/.harnesstap/apm.lock.yamlwhen that file already exists--timestamp <ts>— pin timezone-aware ISO 8601 for reproducible output (elseSOURCE_DATE_EPOCH, then lockfilegenerated_at)
Declared licenses come from lock declared_license (the dependency manifest license: recorded at apply/install). Undeclared licenses are omitted in CycloneDX and written as NOASSERTION in SPDX.
apply
Top-level apply resolves a plugin (and its dependency graph) and materializes it.
- Default scope is the project (cwd /
--project). - Pass
--globalto materialize into machine home paths (profile plugins also update the active profile pointer when applicable). - First human line reports destination (
→ project …or→ machine home …). - Flags include
--dry-run,--explain,--update,--target,--all,--harness,--strict-plugin-versions,--ignore-plugin-versions,--sync-plugins, and--force(override critical hidden-Unicode findings). - Selectors may be local plugin names, catalog identities, a packed bundle directory, a
.zipproduced byht pack, or a.ap.jsonenvelope. Packed bundles withpack.bundle_filesare rehashed and fail closed on tampering. - With no selector, apply is the same loop as
ht install: it readsapm.yml. Git entries independencies.apmresolve to an exact commit, fetch that SHA, and recordrepo_url/resolved_commit(pluspathwhen set) inapm.lock.yaml. After each fetched git / catalog / path APM package, apply walks that package’sdependencies.apmand pins those too. Cycles, missing packages, and hash mismatches fail closed; the root manifest wins on name collisions. A later apply without--updatereplays the lock. See Apply git dependencies and the Use ramp: install a project. - With no plugin selector, apply compiles local
.apm/primitives (and root primitive dirs when.apm/is absent) into the resolved target harness directories via the existing writers. Resolution:--target/--all/--harness, thenapm.ymltargets/target, thencompilation.target, then project/global harness preference, then filesystem auto-detect. Apply-from-manifest fails closed when no target resolves. See the Use ramp: apply to a project. - Before writing, apply scans generated files for hidden Unicode. Critical findings block apply unless
--forceis passed; warnings are printed and apply continues. Whenapm.lock.yamlalready haslocal_deployed_file_hashesand--updateis not set, apply rehashes the generated tree and fails closed on mismatch, extra, or missing files. - When
executables:is opted in (project block or non-empty policyexecutables:), unapproved dependency hooks / bin / self-defined MCP are parked. Apply still succeeds and printsht approve <ref>. The lock recordsexec_status.
ht layer … is a hidden deprecated alias for ht plugin … for one release; prefer ht plugin and top-level ht apply.
compile
Named entry over apply-from-manifest: compile local .apm/ primitives into the resolved target harness directories. Same writers and local_deployed_file_hashes as ht install / ht apply. See the Use ramp: compile for declared targets.
ht compile
ht compile --target cursor
ht compile -t claude,cursor --dry-run
ht compile --allResolution: --target / --all / --harness, then targets: in apm.yml, then project/global harness preference, then filesystem auto-detect. Fails closed when no target resolves. Does not take a plugin selector or --global.
targets
Show which apply harness targets resolve for this project, and why. This is not ht harness list.
ht targets
ht targets --json
ht targets --all --jsonSame resolution order as ht compile. --json emits one object per canonical target plus the resolved list. --all includes the agent-skills meta-target row.
pack
Pack a project that has apm.yml into an Agent Plugins 1.0 bundle (plugin.json, primitive dirs, embedded apm.lock.yaml). See the Author ramp: pack a bundle.
ht pack
ht pack --archive -o ./dist
ht pack --dry-run --verboseKey options:
-o, --output <dir>— output directory (defaultbuild)--archive— write a.zipinstead of a directory--dry-run— print the file list without writing--verbose— list every packed file and remapping--project <path>— project directory (default.)--format json
Consumers install the artifact with ht apply <dir-or-zip>. Bundles are target-agnostic. There is no --format apm flag.
audit
Scan a project for hidden Unicode, verify lockfile SHA-256 hashes, and evaluate apm-policy.yml. See the Use ramp: audit a project.
ht audit
ht audit --file .cursorrules
ht audit --ci --format json
ht audit --ci --require-policy
ht audit --strip --dry-runKey options:
--file <path>— scan one file--ci— fail on critical Unicode, lockfile hash mismatch / extra / missing, blocking policy, orrequired-executable-untrusted--policy <path>— policy file (defaultapm-policy.yml)--require-policy— with--ci, fail if no policy file is present--strip— remove critical and warning hidden characters (preserves emoji)--dry-run— preview--strip--project <path>— project directory (default.)--format json
--ci cannot be combined with --strip, --file, or --dry-run. --dry-run requires --strip. --require-policy requires --ci. Required-but-untrusted executables fail --ci with required-executable-untrusted.
approve
Approve executable primitives from dependency packages. Writes project apm.yml executables.allow by default.
ht approve owner/repo
ht approve --user owner/repo
ht approve --pending
ht approve --all
ht approve --recommended
ht approve --list--user writes ~/.harnesstap/config.jsonc (can only narrow past an org or project deny). Grant keys are owner/repo or owner/repo#version (version-blind in v1).
deny
Block executable primitives. Writes project apm.yml executables.deny by default; --user writes the personal store.
ht deny owner/repo
ht deny --user owner/repopolicy explain
Print the effective executable-trust decision for one package: allowed or blocked per type, deciding layer, and shadowed layers.
ht policy explain owner/repo
ht policy explain owner/repo --format jsonplugin (l)
Manage design plugins (resource bundles), composition attachments, portable bundle export/import, and HarnessTap Cloud catalog workflows.
Remote library discovery, install, and publish live on plugin, not auth. Use auth only for authentication and org context.
Commands
plugin create <name>plugin list— local plugins plus streamed remote catalog plugins (default); use--local-onlyfor local plugins onlyplugin show <name>plugin editor [name]— open a plugin definition file in your system editorplugin search [query]— search marketplace catalogs for pluginsplugin add <ref> --to <plugin>— add a dependency to a plugin (ref: local name,org/catalog/name,name@marketplace, or git URL)plugin edit [name]— interactively add/remove attachments, set default environment, or script changes with--add/--remove/--apply/--environment/--clear-environmentplugin delete [name]- Prefer top-level
apply [plugin...](see above). The oldplugin apply/l applyspelling was removed when apply moved to the root. plugin cut <plugin> --version <semver>— cut a new local version from the working headplugin versions <plugin>— list local versions (head + frozen)plugin rollback <plugin> --to <semver>— copy a frozen version onto the working headplugin fork <plugin>— copy an upstream or catalog plugin into an editable authored plugin (default name<plugin>-fork; local authored plugins cannot be forked)plugin pull <selector>— download a remote plugin bundle and import itplugin catalog list— show default catalog, connected orgs/libraries, registered publish catalogs, and cloud base URLplugin catalog— interactive publish-binding wizard (plugin picker → catalog checkboxes)plugin catalog bindings [plugin]— show effective publish targets (non-TTY) or edit bindings (--add,--remove,--clear;--addreplaces the full allow list)plugin catalog register org/catalog— register a publish destinationplugin catalog unregister org/catalog— remove a publish destination from the registryplugin catalog registered— list registered publish catalogsplugin catalog connect org <slug>— opt into another org's public libraries (saves the org even when it currently has no public plugins; warns, exit 0)plugin catalog disconnect org <slug>plugin catalog connect plugin <org>/<slug>or<org>/<catalog>/<slug>— opt into a single public libraryplugin catalog disconnect plugin <org>/<slug>or<org>/<catalog>/<slug>plugin publish <plugin>— export bundle and upload to all effective publish targets (registered catalogs, or per-plugin allow list)plugin publish plan <plugin>— dry-run: list effective targets and planned versionsplugin diff <left> <right>plugin doctor [name]— validate a plugin without writing to diskplugin check [name]— compare library working heads to marketplace, git, and catalog originsplugin update [name]— update a working head from origin (--allfor every outdated syncable head)plugin why <target>— explain why a version was selected or which plugin won a resource (skill:name, plugin name)plugin from-project [name] --project <path>
Important options
plugin create -d, --description <text>— plugin descriptionplugin create --tags <tags>— comma-separated tagsplugin create --version <semver>— plugin version (default1.0.0)plugin create --from <source>— import a skill package (owner/repo, git URL, or local path) and attach selected skillsplugin create --skill <names>— comma-separated skills to attach when using--fromplugin create --all— attach all discovered skills when using--fromplugin create --exclude-category <names>— exclude skill categories (repeatable or comma-separated)plugin create --on-conflict <policy>— when the plugin exists:cancel(default),merge, oroverwriteplugin create --install— opt-in hub install; requires--globalor--projectplugin create --dry-run— preview configuration without writingplugin list --format jsonplugin list --show-idplugin list -s, --search <query>— filter local and remote plugins by name, description, or tagsplugin list --local-only— list only local pluginsplugin list --remote-only— skip local section; remote-only JSON emits a top-level arrayplugin list --tag <tag>— filter remote catalog plugins by tagplugin list --account <name>/--base-url <url>— cloud account and base URL for remote listingplugin list --no-interactive— disable TTY browse wizard (streaming print-only)
See Interactive list keyboard reference for TTY browse/search shortcuts.
plugin show --format jsonplugin editor --format jsonplugin search --refresh— refresh marketplace catalogs before searchingplugin search --plugin <name>— attach the selected plugin pin to this plugin (interactive browse picker on TTY)plugin search --format json/--no-interactiveplugin add --to <plugin>— required target plugin (deprecated--layeralias)plugin add --format jsonplugin edit --type <type>— restrict tables to one attachment typeplugin edit --search <query>— pre-fill the interactive search filterplugin edit --show-idplugin edit --all— show every resource per type (default caps at 10)plugin edit --dry-run— preview membership changes without writingplugin edit --format json --no-interactive— read-only membership snapshotplugin edit --add <selector>— add attachment (repeatable; use--typewhen selector omits prefix). Plugin dependencies useplugin:ref@source(marketplace, local path, git URL, ororg/catalog/name); legacyplugin_pin:/plugin:still resolve with a noticeplugin edit --remove <selector>— remove attachment (repeatable)plugin edit --apply <file.json>— apply membership from JSON specplugin edit --version <constraint>— plugin dependencies only (scripting adds)plugin edit --sync— sync an upstream plugin immediately after add (default: lazy)plugin edit --embed— mark plugin dependency as embed-on-export when addingplugin edit --environment <name>— bind a default environment to the configured plugin thatapplyresolvesplugin edit --clear-environment— clear the configured plugin default environmentapply --project <path>— target project directory (default.)apply --target <slugs>/--all/--harness <slugs>— APM target slugs or HarnessTap harness slugs (same resolution slot)apply --dry-run— show planned file writes onlyapply --explain— print the resolution trail (selected versions and every resource decision)apply --update— ignoreapm.lock.yamland re-resolve the dependency graph (including gitdependencies.apmrefs)apply --strict-plugin-versions/--ignore-plugin-versions/--sync-pluginsplugin why --project <path>— project with the lockfile to inspect (default.)plugin why --root <plugin>— resolve against this root instead of the lockfile rootplugin why --format jsonplugin cut --version <semver>— required new version (must differ from the current head)plugin cut --format jsonplugin versions --format jsonplugin rollback --to <semver>— frozen version to copy onto the working headplugin rollback --yes— skip confirm (required when non-interactive)plugin fork --as <name>— name for the authored fork (default<plugin>-fork)plugin fork --format jsonplugin diff --format jsonplugin doctor --check <name>— run one check (repeatable)plugin doctor --list-checks— list available checksplugin doctor --format json— exits1when the plugin is invalidplugin check --refresh— force-fetch origins (otherwise check may use the marketplace refresh cache)plugin check --format json— same rows as the human table; exits1when any row iserrorplugin update --all— update every outdated syncable working headplugin update --force— reapply even when fingerprints matchplugin update --yes— skip--allconfirmation (required off-TTY)plugin update --format json— exits1when any row isfailedplugin from-project -d, --description <text>plugin from-project --harness <slug>plugin pull --as <name>plugin pull --org <slug>plugin pull --catalog <slug>— catalog slug when selector omits catalog (defaultdefault)plugin pull --version <constraint>plugin pull --account <name>plugin pull --base-url <url>plugin publish org/catalog— one-off publish to a single catalog (does not change bindings)plugin publish --org <slug> --catalog <slug>— one-off override (same as positionalorg/catalog)plugin publish --account <name>plugin catalog bindings --add org/catalog— replace per-plugin allow list (repeatable; auto-registers missing catalogs)plugin catalog bindings --remove org/catalog— remove one target from the allow listplugin catalog bindings --clear— revert plugin to all registered catalogsplugin catalog register --account <name>— optional account for a registered catalog
plugin pull and plugin list remote discovery query catalog scope plus registered publish catalogs (plugin catalog register). Use plugin catalog connect to add other public orgs or libraries explicitly. Register publish destinations with plugin catalog register before plugin publish when no bindings exist. plugin pull fails on local name conflict instead of overwriting. apply resolves bare catalog names at apply time; use plugin pull to install plugins for offline reuse. Apply resolves nested plugin dependencies as a graph (nearest-to-root resource precedence; equal-depth set-like types use declaration order with a warning).
auth (a)
Manage HarnessTap Cloud authentication and cloud account state.
Commands
auth login [account]auth statusauth orgsauth logout
Important options
auth login --base-url <url>auth status --account <name> --format jsonauth orgs --switch <slug>auth orgs --format json— when not logged in, prints[]on stdout and warns on stderr (human mode warns on stdout)auth logout --account <name>
Token refresh runs before remote calls. The CLI does not silently switch accounts or organizations during other commands. There is no --profile flag on auth — use --account.
profile (p)
Manage profile plugins (plugins tagged profile) and global profile switching. Profiles apply to machine home harness paths; use apply for projects.
Root shorthand: when the first non-option argument is not a known command and matches a local profile plugin name, ht <name> runs profile use <name>, leaving any leading global flags in place (e.g. ht work, ht --no-color work).
Commands
profile list/profile ls— list local profile plugins, then stream remote catalog plugins withtag=profile; marks active profileprofile show <name>— same detail view asplugin show, plus active profile markerprofile status— active profile and whether global harness files are in syncprofile use <name>— merge profile stack, apply globally, set active pointerprofile create <name>— create profile plugin, promote an existing plugin, or import from--fromprofile delete <name>— demote a profile plugin and optionally delete the underlying pluginprofile pull <selector>— install from catalog (plugin pullalias; warns if not profile-tagged)profile publish <name>— publish with profile validation warnings (plugin publishalias)profile preview [name]— apply preview (home/project/both) without writing. Inherited host-plugin material already on disk is omitted from stack/file deltas; host-native plugin MCP is treated as present.profile switch <name>— switch active profile (restores the previous profile on failure; see--helpfor conflict flags)profile stash— stash untracked on-disk resources for the active profileprofile stash list/profile stash pop/profile stash apply— list, restore-and-remove, or restore stashed profiles- Live files:
profile add-resource,add-all-resources,commit-resource,remove-resource,restore-file,file-diff— adopt, snapshot, detach, or diff on-disk resources against the profile library (--scope home|project,--projectwhen scope is project)
Important options
profile list --format jsonprofile list -s, --search <query>— filter local and remote profile pluginsprofile list --local-only— list only local profile pluginsprofile list --remote-only— skip local sectionprofile list --account <name>/--base-url <url>/--no-interactiveprofile show --format jsonprofile show --show-idprofile status --check— exit 1 when global state is out of syncprofile status --harness <slugs>/--format jsonprofile create -d, --description <text>profile create --from <source>— same skill-package options asplugin create --fromprofile create --use— apply globally and set active after create/promoteprofile create --use --dry-run— preview global applyprofile create -y, --yes— skip the interactive enable promptprofile delete --plugin— also delete the underlying plugin without promptingprofile delete -y, --yes— skip the interactive plugin delete promptprofile use --profile <key>— profile key fromapm.yml(delegates to project config when set)profile use --project <path>— project directory forapm.ymldiscovery (default.)profile use --force— apply even when the profile is already active and in syncprofile use --dry-run— preview global file writesprofile use --harness <slugs>— comma-separated harness slugs (default: global harness preference)profile use --on-conflict <replace|skip|prompt>profile use --account <name>— cloud account for auto-pull of missing published dependenciesprofile use --base-url <url>profile use --no-pull— fail when composition refs are missing locallyprofile use --format jsonprofile pull— same flags asplugin pull(--as,--org,--catalog,--version,--account,--base-url)profile publish --org <slug>/--catalog <slug>/--account <name>/--format jsonprofile preview --scope <home|project|both>— preview scope (defaulthome)profile preview --project <path>/--harness <slugs>/--format jsonprofile switch— same apply flags asprofile use(--dry-run,--harness,--on-conflict,--no-pull,--account,--base-url,--format json)profile stash—--dry-run,--harness,--on-conflict,--format jsonprofile stash pop/profile stash apply— same pull/apply flags asprofile useprofile add-resource <name> --selector <type:name> --scope <home|project>— adopt one untracked on-disk resourceprofile add-all-resources <name> --scope <home|project>— adopt every untracked material resource in the scopeprofile commit-resource <name> --path <path>or--selector <type:name>— snapshot live disk into the profile libraryprofile remove-resource <name> --selector <type:name>— detach a material resource from the profile stackprofile restore-file <name> --path <path>— overwrite the live managed file with the profile snapshotprofile file-diff <name> --path <path>— unified diff of live content vs after-apply snapshot
profile use auto-pulls missing published plugin composition refs by default. If the profile plugin defines default_environment_id, the home active environment pointer is updated on switch.
resource (r)
Manage individual imported resources such as instructions, skills, rules, or agents.
Commands
resource listresource show <selector>—name,type:name,type:name@namespace, or ULIDresource sync [selector]— refreshmarketplace_linkdefinitions and sync plugin resources from install rootsresource delete [resource]resource directories list|add|remove|rescan— manage directories scanned into the resource library
Important options
resource list --type <type>resource list --search <query>
See Interactive list keyboard reference for TTY browse/search shortcuts.
resource list --show-idresource show --format jsonresource show --show-idresource show --all-fieldsresource sync --overwriteresource sync --on-conflict <overwrite|ignore|fail>— defaultfailresource sync --forceresource sync --dry-runresource sync --prune— remove orphaned child resources after syncresource directories list --format jsonresource directories add <path>— track a directory and import resources (skip existing)resource directories remove <path>— stop tracking a directory (library resources stay)resource directories rescan— re-scan home defaults and every tracked directoryresource listshows material resources pluspluginresources;plugincomposition refs are hidden by defaultresource list --all— show every resource per type (default caps at 10 per type)plugin editselectors accepttype:name@namespacefor compose-safe resolution- Host plugin pins are
pluginresources; useresource sync,plugin show,plugin doctor,plugin fork, andapply --strict-plugin-versionsfor pin workflows
environment (e)
Manage named environment bundles (env vars, model config, permissions, and secret references) and global or per-terminal active-environment pointers.
Environment values are the runtime how configuration that plugins satisfy through needs[] contracts and MCP env keys. They are distinct from toolkit configuration (harness_preferences, config.jsonc).
Commands
environment create <name>— blank (default), from project (--from-project), or from configured plugin requirements (--from-plugin); interactive wizard on TTY when no mode flags are setenvironment edit [name]— interactively edit values, or use scripting flags for non-interactive updatesenvironment listenvironment show <name>— values, secret refs, reverse references;--pluginanalyzes requirement gaps for a configured pluginenvironment delete [name]environment use <name>— set the global active environment;--localapplies only to this terminal sessionenvironment status— show active environment and terminal env var drift
Important options
environment create --blank— create an empty environment (default when no mode flag is set)environment create --from-project <path>— import scoped project values required by the plugin stackenvironment create --from-plugin <selector>— seed from configured pluginneeds[], MCP env keys, and model metadata (repeatable or comma-separated)environment create --refresh— update an existing environment (--from-projectonly)environment create --bind— bind the new environment as the configured plugin default (--from-pluginonly)environment create --plugins <selectors>— configured plugin scope for--from-project(default: project's last-applied plugins)environment create --strict— exit non-zero when required keys are missingenvironment create --include-permissions— include scanned permission resources (--from-projectonly)environment create --description <text>environment create --dry-run— preview without persistingenvironment create --interactive/-y, --yesenvironment create --format jsonenvironment edit --var KEY=VALUE/--unset-var KEY— scripting mode env var updatesenvironment edit --model <name>/--model-provider <provider>/--unset-modelenvironment edit --permission action:pattern/--unset-permission <selector>environment edit --secret KEY:provider:ref/--unset-secret KEYenvironment edit --format json— read-only edit snapshot (non-TTY)environment edit --interactive/-y, --yesenvironment list --format jsonenvironment show --plugin <selector>— compare environment values against a configured plugin's requirementsenvironment show --format json— includesrequirement_gapswhen--pluginis setenvironment delete --force— delete even when referencedenvironment delete --interactive/-y, --yesenvironment use --local— session-scoped active environment without changing global pointerenvironment status --plugins <selectors>— include configured plugin default environments in expected valuesenvironment status --check— exit non-zero when terminal env vars drift from expected valuesenvironment status --format json
harness (h)
Manage global harness preferences and git-backed project overrides.
Commands
harness listharness setharness statusharness project setharness project status
Important options
harness list --supported— only harnesses HarnessTap can serialize nativelyharness list --format jsonharness set --main <slug> --aliases <slugs>harness project set --project <path>harness project set --materialization-strategy <symlink-preferred|copy>harness project status --format json
migrate (m)
Offline sharing for workspace archives, individual plugins, or single resources — without publishing to the cloud catalog.
Use migrate when:
- setting up a new laptop from an existing HarnessTap install (full workspace)
- sharing a curated plugin or resource with a teammate offline
- backing up your local workspace before a reinstall
For multiplayer distribution, use plugin publish / plugin pull via HarnessTap Cloud.
Commands
migrate export [file]— export workspace, plugin, or resource as an Agent Plugins package (or workspace archive); interactive when[file]omitted on a TTYmigrate import [file]— import a package directory,.ap.jsonenvelope, or.tar.gzworkspace archive (auto-detects scope)migrate resolve-order— pin last-applied resource winners as overrides where current resolution would pick a different plugin
Important options
migrate export --workspace— full workspace archive (.tar.gz)migrate export --plugin <name>— Agent Plugins package directory (comma-separated for multi-plugin); acceptsname(working head) orname@version(frozen snapshot). Refuses dirty working heads — cut first (plugin cut)migrate export --resource <selector>— single-resource package (wraps the resource in a one-resource plugin)migrate export --single-file— write a.ap.jsonenvelope instead of a package directorymigrate export -o, --file <path>— output path (overrides positional)migrate export --include-plugins/--embed-plugins— embed plugin trees (workspace and plugin scope)migrate import --workspace/--plugin/--resource— force import scopemigrate export --format json/migrate import --format json— machine-readable summary (CLI output format, not transport)migrate resolve-order --dry-run— report planned override writes without changing pluginsmigrate resolve-order --format json
--environment is removed on both export and import — environments are machine-local secret references. Include them in a --workspace archive instead.
Workspace archives include Agent Plugins packages, named environments (secret refs only), harness preferences, config, and active-profile.json when present. They do not include tracked project records, project snapshots, or cloud accounts.
See Scenario 28 and Scenario 17.