Use

Install

Onboard a project from apm.yml.

ht install is the default onboarding command in a repo that already has apm.yml. It is the same loop as ht apply with no plugin selector — not a second resolver and not Microsoft's apm CLI.

A teammate who has never used HarnessTap can git clone and run:

ht install

That reads repo-root apm.yml, resolves dependencies.apm (including a fetched git, catalog, or path package’s own dependencies.apm) / 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 (.claude/, .cursor/, AGENTS.md, and so on). Nested devDependencies are not installed. Pin targets: so the written set does not follow whichever tool folders exist on the current machine. Preview with ht targets. ht compile is the same apply-from-manifest loop under a named entry. Target selection is unchanged from CLI #157. Root dependencies.mcp (including registry ids) stay on the CLI #159 path.

Commit apm.lock.yaml plus the generated harness output so the next clone installs the same tree.

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 --force

Same loop as apply

ht apply with no plugin selector is the same command. Use ht apply <plugin> when you want to materialize a named library, catalog, or packed bundle instead of the repo manifest.

Flags match project-scope apply: --project, --dry-run, --update, --force, --target, --all, --harness (and the other apply project flags). --target and --harness occupy the same slot and are mutually exclusive with --all. There is no plugin selector and no --global. Install fails closed when no target can be resolved.

When executables: is opted in, unapproved executable primitives from deps are parked; install still succeeds and prints ht approve <ref>. Root dependencies.mcp is depth 0 and is not parked. See Apply.

MCP Registry identities

Bare dependencies.mcp strings such as io.github.github/github-mcp-server (optional @version) are MCP Registry v0.1 identities. ht install fetches GET /v0.1/servers/{id}/versions/{latest|pin} from registry.modelcontextprotocol.io (override with HARNESSTAP_MCP_REGISTRY_URL) and writes the same native MCP files already emitted for harnesses HT serializes.

Resolution: prefer a registry remotes[] HTTP/SSE URL when present (GitHub MCP → https://api.githubcopilot.com/mcp/ plus ${AUTHORIZATION}); otherwise pick the first package in npmocipypinuget order and emit npx / docker run -i --rm / uvx / dnx. Secret headers and env stay ${VAR} placeholders.

Self-defined entries (registry: false with command / url) skip the registry. ht install --mcp <id> and ht mcp install <id> snapshot apm.yml, append the identity, then run install; a failed install or --dry-run restores the prior bytes. ht mcp search|list|show are cheap official-registry discovery.

Details: MCP Registry identities.

Export the recorded inventory with ht lock export (CycloneDX / SPDX from the lockfile; not an attestation).

See also: Apply, MCP Registry identities, Compile and targets, Apply git dependencies, Desktop Project Install.