Skip to main content

XTP CLI

The xtp CLI offers a variety of essential functions that support the entire plugin development and distribution lifecycle. The CLI lets developers:

  • Create: Generate boilerplate & compile plugin code. Idiomatic code generation is powered by the details set in a Host App's XTP Schema.

  • Test: Leverage a powerful testing and simulation system to verify that plugins function correctly and meet all requirements.

  • Push: Uploading the plugin to the platform for validation, hosting, distribution, download & execution.

  • Manage: Control the version and activation of plugins' installation in a Host App. Inspect authorized plugins' details, configurations, and status.

While the CLI is mostly targeted to plugin developers, we highly recommend Host App operators install it as well.

Installation

curl https://static.dylibso.com/cli/install.sh -s | bash

To verify that the installation worked correctly, run xtp in your terminal. You should see something like the following:

$ xtp

d8P
d888888P
?88, 88P ?88' ?88,.d88b,
'?8bd8P' 88P '?88' ?88
d8P?8b, 88b 88b d8P
d8P' '?8b '?8b 888888P'
88P'
d88
?8P

Usage:
xtp [command]

Available Commands:
app Manage your apps
auth Manage authentication status
completion Generate the autocompletion script for the specified shell
extension-point Manage extensionpoints
help Help about any command
login log in
plugin Manage plugins
self Manage the CLI itself

Flags:
-h, --help help for xtp
-v, --version version for xtp

Use "xtp [command] --help" for more information about a command.

If you don't, there may be an issue with your $PATH environment variable. Reach out to us on Discord for help!

Usage

Create Plugins

Initializing a new plugin project through the CLI offers a streamlined & optimized developer experience. XTP enables generating common boilerplate code for serialization, function signatures, and more. This is all derived from the XTP Schema.

To generate a plugin starter project (highly recommended), run the xtp plugin init command:

Generate boilerplate code for the specified extension point

Usage:
xtp plugin init --language [LANGUAGE] --path [PATH] --extension-point [Extension Point ID] --feature-flags [FEATURE_FLAGS] --template [TEMPLATE] [flags]

Flags:
-a, --app string The app ID the plugin is installed in
-e, --extension-point string The extension point ID to generate code for. Can't be used with --schema-file
-f, --feature none Feature flags to enable for the plugin. Pass in none to disable all feature flags.
-h, --help help for init
-l, --language string The language to generate code in
-p, --path string The path to generate the code in
--schema-file string The schema file to generate code from. Can't be used with --extension-point
-t, --template string The template to use for code generation. Example: ./xtp-typescript-bindgen, @dylibso/xtp-typescript-bindgen, or https://github.com/dylibso/xtp-typescript-bindgen
-y, --yes Skip confirmation prompt

If the command exits successfully, you will have a full plugin project generated at the path specified.

In addition to the boilerplate generated code, there is an xtp.toml file in the root of the output project directory. This file enables the rest of the xtp CLI experience to test, upload & bind plugins into Host Apps. You can edit it as you wish, but be aware of changes as they may impact the behavior of other xtp CLI actions.

A functional, but not exhaustive TOML configuration would look like:

app_id = "app_01j0ss4f9jea0sajj6njngrm8d"
bin = "dist/plugin.wasm"
extension_point_id = "ext_01j0t0wtzgfe1ttqr96d1z12yd"
name = "example-2"

[scripts]
build = "npm run build"

[[test]]
# see the section on XTP Test & Simulations:
# https://docs.xtp.dylibso.com/...
note

By default, the name property in the xtp.toml file is set to the name of the directory you create when you run the xtp plugin init command. However, you can change name to anything you prefer by editing the file.

Test Plugins & Simulate Host Environments Locally

Testing the behavior and performance characteristics of a plugin is a critical step to the plugin lifecycle. Integrating dynamic, potentially untrusted code and executing it at runtime is complicated! Tests provide a level of assurance that every Host App needs in order to build reliable & stable plugin integrations.

Luckily, this is easy with XTP. Host Apps and plugin authors can write tests the many XTP Test libraries provided:

You can define tests to execute in your xtp.toml file using [[test]] sections. Read more here to better understand the configuration to run tests using the CLI.

Simulations

Just as you're able to write tests to validate plugin behavior locally, host users are able to provide tests that ensure plugin behavior meets expectations. These host-provided tests and mocks are called "Simulations". Whenever you push your plugin, XTP runs Simulations to validate it. You'll see the output of the simulation whenever you run xtp plugin push. (For the host's perspective on Simulations, see "Create Simulations"!) Whenever you push your plugin, you'll see output from simulation runs:

→ xtp plugin push
✅ Version ver_01j2ezfc4keedv36p5twwk4dj6 uploaded for Plugin plugin
🧪 validated content-type...!
🧪 validated artifact content as webassembly...!
🧪 validated checkfile in modsurfer
🧪 artifact is valid (great job!)
🧪 running simulations
🧪 Simulations
───────────────────────────────────────────────────────────────────────────────
Simulation Test Name Info
───────────────────────────────────────────────────────────────────────────────
⏩ frobnicator skipped (binding is inactive)
🧪 reticulates-splines reticulates-splines
✅ reticulates-splines reticulates-splines all tests passed
✅ All simulations 2 / 2 passed
✅ Version ver_01j2ezfc4keedv36p5twwk4dj6 has been processed for Plugin plugin

XTP will reject plugins which fail to pass tests under Simulation:

→ xtp plugin push
✅ Version ver_01j2ezv4mtfqn9bdmfc1gzkq5w uploaded for Plugin plugin-chris
🧪 validated content-type...!
🧪 validated artifact content as webassembly...!
🧪 validated checkfile in modsurfer
🧪 artifact is valid (great job!)
🧪 running simulations
🧪 Simulations summary
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Simulation Test Name Info
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
❌ frobnicator frobnicator Uncaught TypeError: not a function at assert (script.js:125) at test (script.js:169)
🧪 reticulates-splines reticulates-splines
✅ reticulates-splines reticulates-splines all tests passed
❌ All simulations 0 / 1 (1 failure)
Error: processing Plugin failed: ERROR

In this case, xtp plugin push will display the error output in order to debug the failure.

Deploy Your Plugin

The XTP CLI allows you, as a plugin author, to compile and push plugin code to host applications in a convenient and optimized way. It's as easy as running xtp plugin push.

As a plugin author, you get to choose a name for your plugin, configured in xtp.toml. By default, this will be the directory name where you created your plugin. When you xtp plugin push your code, the latest version of your plugin will be made available to the host under that name. (We call this "binding" a plugin.)

(Advanced users might want to advertise a plugin to the host under a different name than the plugin name. XTP supports this use case via xtp plugin push --as <name> and the xtp bind subcommand. See the section on Artifacts and Bindings for more information.)

Plugins are validated by common tests built-in to XTP, as well as host-provided Simulations before activation.

Deactivate a Plugin

You can deactivate or "unbind" a plugin from an Extension Point by running xtp plugin unbind --name <name>, using the name of the plugin as defined in the name property of the xtp.toml, or the name passed in via --as parameter specified when the plugin was uploaded.

Inspecting & Exploring Plugins

The CLI provides simple plugin catalog inspection and exploration. Guest users can list their plugins per Extension Points and access information about them.

Use xtp plugin view and xtp plugin list to interactively navigate and explore your plugins applicable to the Host Apps and Extension Points you have access to.