$ tapestry --help

The CLI, end to end.

The tapestry CLI is a Node.js tool for Tapestry worlds. It handles the full project lifecycle: scaffolding, pack management, server control, publishing, and engine management.

Install the CLI via npm. Requires Node.js.
$ npm install -g @tapestry-mud/cli
QUICK START
tapestry init scaffold

Initialize a new Tapestry game project in the current directory. Creates tapestry.yaml, server.yaml, and a packs/ directory.

$ tapestry init
  Initialized: midnight-bazaar
    tapestry.yaml  project manifest
    server.yaml    engine config
    packs/         installed packages
    .gitignore     excludes packs/ from git
-y, --yes
Skip prompts and use defaults (for CI and scripting).
tapestry install [package] most used

Install a package and its dependencies from the registry, updating the lockfile. Without an argument, installs everything declared in tapestry.yaml.

$ tapestry install @tapestry/core
  + @tapestry/core           0.1.0  (official)
  ✓ resolved 1 package, 0 transitive deps — locked.
tapestry start

Launch the Tapestry engine. Reads tapestry.yaml for engine channel and version, auto-pulls the image if needed, then starts the telnet + WebSocket listeners.

$ tapestry start
  ▸ pulling engine image (stable) …
  ▸ loading packs …
  ✓ listening on :4000 (telnet) · :4001 (WebSocket)
tapestry stop

Stop the running Tapestry engine container in this directory.

$ tapestry stop
  ✓ engine stopped
PACK MANAGEMENT
tapestry uninstall <package>

Remove an installed package.

$ tapestry uninstall @tapestry/weather
tapestry update [package]

Update a package — or all packages — to the latest compatible versions allowed by the manifest.

$ tapestry update @tapestry/combat-core
tapestry list

Show installed packages with version, type, and enabled/disabled status.

$ tapestry list
  @tapestry/core         0.1.0  core    enabled
  @tapestry/example-pack 0.1.1  world   enabled
tapestry enable <package> also: disable

enable activates a package in the engine boot order; disable removes it from the boot order without deleting files.

$ tapestry disable @tapestry/weather
  ⚠ pack disabled — restart the engine to apply
tapestry outdated

Show installed packages that have newer versions available in the registry.

$ tapestry outdated
  @tapestry/combat-core  0.1.0 → 0.2.0
ENGINE
tapestry engine install

Fetch the engine artifact for the configured mode (docker / binary / source), pinned by tapestry.yaml.

$ tapestry engine install
  ▸ pulling ghcr.io/tapestry-mud/tapestry:latest …
  ✓ engine ready (stable)
tapestry engine update

Update the engine to the configured version for the current channel.

$ tapestry engine update
  ✓ engine updated (stable · latest)
tapestry engine info

Show the installed engine version, mode, and image or path.

$ tapestry engine info
  channel  stable
  version  latest
  mode     docker
  image    ghcr.io/tapestry-mud/tapestry:latest
tapestry engine versions

List the available engine channels published in the registry.

$ tapestry engine versions
  stable   latest
  nightly  edge
REGISTRY
tapestry info <package>

Show details for a registry package: manifest, versions, dist-tags, and dependencies.

$ tapestry info @tapestry/core
ACCOUNT
tapestry register

Create an account on the registry. You're logged in immediately — a session is issued on success. Your handle is your publishing scope (publish to @yourhandle/…).

$ tapestry register
  Handle: you
  Email: you@example.com
  Password: ••••••••
  ✓ Registered as you. Logged in.
tapestry login

Authenticate with the registry interactively (email + password). Stores a short-lived access token plus a rotating refresh token in ~/.tapestryrc (mode 0600). The CLI refreshes the access token silently, so you stay logged in without re-entering your password — re-login is only needed after ~30 days of inactivity.

$ tapestry login
  Email: you@example.com
  Password: ••••••••
  ✓ Logged in.
tapestry logout

Revoke your session on the registry and remove ~/.tapestryrc. The refresh token is invalidated server-side, so the session can't be resumed.

$ tapestry logout
  ✓ Logged out.
tapestry change-password

Change your registry account password. Requires an active session.

$ tapestry change-password
  Current password: ••••••••
  New password: ••••••••
  ✓ password updated
PACK AUTHORING
tapestry create pack <name> scaffold

Scaffold a new pack folder with a manifest and annotated example content.

$ tapestry create pack my-weather-extras
  ✓ created packs/my-weather-extras
    pack.yaml      pack manifest
    content/       example entities, rooms, commands
tapestry validate

Validate pack.yaml in the current directory — the same checks the registry runs on publish, without uploading.

$ tapestry validate
  ✓ manifest valid · 0 errors · 0 warnings
tapestry pack

Build a tarball from the current pack directory for local inspection — no upload. Useful for CI artefacts or local testing.

$ tapestry pack
  ✓ @you/my-pack-0.2.0.tgz  (18 KB)
tapestry publish

Build and upload the current pack to the registry. Run it locally after tapestry login — or in GitHub Actions, where it authenticates automatically via OIDC trusted publishing (see below), with no stored token.

$ tapestry publish
  ✓ validated @you/my-pack@0.2.0
  ▸ uploading …
  ✓ published — tapestry install @you/my-pack
tapestry unpublish <package>

Remove a package version (e.g. @you/my-pack@0.2.0) or all versions from the registry. You must own the scope.

$ tapestry unpublish @you/my-pack@0.2.0
--force
Admin override: bypass the ownership check.
TRUSTED PUBLISHING

Publish from CI with no secrets. Instead of storing a long-lived registry token, authorize a GitHub repository to publish to your scope. In a GitHub Actions workflow, tapestry publish detects the OIDC environment, exchanges a short-lived id-token for a registry access token, and publishes — nothing is stored. Grant permissions: id-token: write in the job, then register the binding once.

# .github/workflows/publish.yml
permissions:
  contents: read
  id-token: write
tapestry trust add | list | rm OIDC

Manage trusted publishers — the scope ← GitHub repo bindings that authorize OIDC publishing. Run as the scope owner (or an admin).

$ tapestry trust add you you/your-packs
  ✓ Trusted publisher #3: @you ← you/your-packs
$ tapestry trust list
  #3  @you ← you/your-packs
$ tapestry trust rm 3
  ✓ Removed trusted publisher #3.
--ref <ref>
(add) Restrict to a git ref, e.g. refs/heads/master.
--environment <env>
(add) Restrict to a GitHub Actions environment.
--scope <scope>
(list) Filter by scope.
ADMIN
tapestry dist-tag set | list

Manage dist-tags (named pointers to versions, like stable and latest) for a registry package. Setting a tag requires owner or admin rights.

$ tapestry dist-tag set @you/my-pack stable 0.2.0
  ✓ @you/my-pack: stable → 0.2.0
$ tapestry dist-tag list @you/my-pack
  latest  0.2.0
  stable  0.2.0
tapestry preset set | delete admin only

Manage registry presets — named bundles of an engine channel plus pinned pack versions, used to seed new projects.

$ tapestry preset set starter 0.0.1 stable '{"@tapestry/core":"0.1.0"}'
$ tapestry preset delete starter