command.register adds a new slash command (name, description, argument hint, immediate flag), rejecting name collisions with other plugins, built-in commands, or MCP commands, and capping how many commands one plugin can register.
command.run lets a plugin queue a command invocation for the current session.
command.list lists available commands together with where each comes from (built-in, plugin, user, or MCP).
command.describe lets a hook dynamically override a command's description, argument hint, or hidden state.
A plugin command with no matching command.run hook now replies with an explanatory stub message instead of failing silently.
Plugins can also open and close a new UI surface called a "pane": a persistent, titled window, using new ui.open/ui.close operations (with id, title, and focus options). Each plugin can have at most 8 panes open at once.
Internally, the hooks event dispatch table was expanded to recognize ui.open, ui.close, command.run, and command.describe as valid events (and the old PreToolUse event was renamed classic.PreToolUse without changing its behavior).
Why
This gives plugins much deeper integration with Claude Code: they can add slash commands that behave like built-in ones, and they can show their own persistent UI panels instead of being limited to existing surfaces.