A plugin can declare what it needs — requires: ["Store@^1.0.0"] on its root — and clicking Install now honours that declaration. The catalog resolves the package's full dependency closure, skips whatever is already installed, and installs the rest one at a time, dependencies first. One click, in the right order.

Previously only the unattended first-boot install derived that order. A person clicking Install got exactly the one package they clicked, so installing a dependent before its dependency failed outright — and the message named a NodeType path from a package the clicker had never heard of ("NodeType(s) not registered: Training/Tour"), because the installer refuses any node whose type is not on the mesh yet. Whether an install worked came down to guessing the right order by hand.

A declared cycle is now refused up front with the loop spelled out (A → B → A) instead of being installed in an arbitrary order and failing later somewhere unrecognisable. The first-boot pass deliberately keeps its old, forgiving behaviour — nobody is present at startup to fix a malformed repo, and one bad package must not strand a whole instance — so it warns and still installs every package exactly once.

Dependencies the catalog does not offer stay non-blocking: the instance may simply not be granted them, so the install proceeds and the installer's own refusal remains the accurate error if the package really cannot work without one.

Reconnecting…
The server was updated. Reloading the page to pick up the latest version.