# Distribution boundary

Lycato's installable unit is a coordinated npm package closure, not a standalone copy of
`@lycato/cli` and not the source monorepo. The closure contains:

- `@lycato/cli` as the only user-facing executable;
- `@lycato/cockpit` as the local server and static UI used by `lycato serve`;
- `@lycato/core`, `@lycato/schemas`, and `@lycato/templates`;
- every `@lycato/adapter-*` and `@lycato/agent-*` runtime package named by the CLI manifest.

All packages in that closure are public, versioned together, and expose only their declared
`files` output. Agent packages include their prompt and agent descriptor because the compiled
worker resolves those assets at runtime. Source files, tests, and monorepo-only tooling are not
part of the runtime artifact.

## Release invariant

The closure must be built and published together through pnpm/Changesets. pnpm rewrites
`workspace:*` ranges to the coordinated release versions. Publishing `@lycato/cli` alone is an
invalid release because a registry install could not resolve its runtime packages.

`pnpm test:cli:clean-machine` enforces the local artifact form of this invariant. It builds the
workspace, packs the CLI and every runtime workspace dependency, installs all third-party runtime
dependencies in an isolated directory, extracts the package tarballs without source-tree symlinks,
and exercises the installed CLI and Cockpit server. The gate also checks package identity, public
access metadata, tarball integrity, required assets, and installed server resolution.

Public-registry availability remains a release-time canary: the local gate proves package contents
and runtime resolution but does not claim that a version has already propagated through npm.
