plugin command
Manage formae plugins.
Usage
formae plugin [OPTIONS] [COMMAND]
Commands
| Command | Description |
|---|---|
list |
List installed plugins |
search |
Search the catalog of available plugins |
info |
Show detailed information about a plugin |
install |
Install one or more plugins |
uninstall |
Remove one or more plugins (alias: remove) |
update |
Update installed plugins |
init |
Scaffold a new plugin from the template |
Where plugins are installed. formae plugin install, uninstall, and update run locally. /opt/pel is root-owned and the agent runs as the pel user, so the install commands typically need sudo. Resource plugins (e.g. aws, gcp, azure) must therefore be installed on the host that runs the agent. Auth plugins (e.g. auth-basic) run on both the agent and the CLI, so they must be installed on each host that runs either — same command, run twice. See Resource vs auth plugins below.
list
Lists plugins installed on the agent and on locally. Each row is annotated with where the plugin lives so dual-install drift on auth plugins is visible at a glance.
Usage
formae plugin list
Example output
Resource plugins:
✓ aws 0.1.5 (agent + cli)
✓ azure 0.1.2 (agent + cli)
✓ grafana 0.1.2 (agent)
Auth plugins:
✓ auth-basic 0.1.0 (agent + cli)
⚠ auth-oidc agent 0.5.0 / cli 0.4.1 version mismatch
The annotations:
| Tag | Meaning |
|---|---|
(agent + cli) |
Same plugin at the same version on both sides |
(agent) |
Only installed on the agent host |
(cli) |
Only installed on the local CLI host |
version mismatch |
Installed on both sides but versions differ — typically auth-plugin drift |
If the CLI cannot reach the agent (or the agent is offline), list falls back to showing only the local view.
search
Search for available plugins. Without a query, all available plugins are listed.
Usage
formae plugin search [<query>] [--category <c>] [--type resource|auth] [--channel <c>]
Flags
| Flag | Description |
|---|---|
--category |
Filter by category (e.g. cloud, auth, observability) |
--type |
Filter by plugin type: resource or auth |
--channel |
Search a non-default channel (e.g. dev) |
Examples
# All available plugins
formae plugin search
# All AWS-related plugins
formae plugin search aws
# All auth plugins on the dev channel
formae plugin search --type auth --channel dev
Example output
aws AWS resources via CloudControl ✓ installed
azure Azure Resource Manager resources
gcp Google Cloud Platform resources
oci Oracle Cloud Infrastructure
ovh OVHCloud
auth-basic HTTP Basic auth between CLI and agent
The ✓ installed marker shows plugins already present on the agent.
info
Show detailed information about a single plugin: type, namespace, category, summary, publisher, and the latest available + currently installed versions.
Usage
formae plugin info <name>
Example output
aws 0.1.5 (installed)
Type: resource
Namespace: AWS
Category: cloud
Summary: AWS resources via CloudControl
Publisher: platform.engineering
install
Install one or more plugins into the local /opt/pel tree on the host where you run the command. Use name to install the latest version, or name@version to pin.
formae plugin install does not call the agent. Because /opt/pel is root-owned, the install commands typically need sudo, so you'll see a sudo prompt unless you've already invoked sudo formae plugin install.
Usage
sudo formae plugin install <name>[@<version>]...
Examples
# Latest stable
sudo formae plugin install aws
# Pin a specific version
sudo formae plugin install azure@0.1.2
# Several at once (mix of pinned and latest)
sudo formae plugin install aws@0.1.5 grafana sftp
Where to run it
| Plugin type | Where to install | Restart |
|---|---|---|
Resource (e.g. aws) |
On the agent host | Restart the agent to load the new plugin |
Auth (e.g. auth-basic) |
On every host that runs the CLI or the agent | Restart the agent on the agent host |
For auth plugins, run the same command twice — once on each host. There is no automatic dual install in 0.85; the CLI installs only on the host it runs on. Container deployments are the natural single-step case: the Dockerfile's RUN ops install … (or RUN formae plugin install …) line bakes the plugins into the image, so the running container is immutable and no extra step is needed at start time.
After every successful install the command prints:
! If this host runs the formae agent, restart it to load the new plugins: formae agent restart
Re-running
install is idempotent — re-running it for an already-installed package at the same version is a no-op. If the install fails partway through (e.g., a network blip during the sudo re-exec), simply re-run the same command.
uninstall
Remove plugins from the local /opt/pel tree. remove is an alias.
Usage
sudo formae plugin uninstall <name>...
sudo formae plugin remove <name>...
Example
sudo formae plugin uninstall grafana sftp
sudo formae plugin uninstall auth-basic
Like install, this command is local-only — run it on every host where the plugin is installed (both the agent host and each CLI host for auth plugins). Restart the agent on the agent host afterwards so it stops loading the removed plugin.
update
Update installed plugins to the latest available version (in the channel they were installed from). With no arguments, every installed plugin is considered for update.
Usage
# Upgrade everything
sudo formae plugin update
# Upgrade specific plugins
sudo formae plugin update aws azure
# Pin to a specific update target
sudo formae plugin update aws@0.1.6
Like install, update is local-only. For auth plugins, run it on each host the plugin lives on. Restart the agent on the agent host to load the updated binaries.
Resource vs auth plugins
formae has two plugin shapes, distinguished by the type field in their manifest:
| Type | Runs in | Installed on | Examples |
|---|---|---|---|
resource |
Agent process | Agent host | aws, azure, gcp, oci, ovh, compose, grafana, sftp |
auth |
Agent and CLI | Agent host and CLI host | auth-basic |
Resource plugins talk to cloud APIs to create, read, update, delete, and discover infrastructure. They only need to be on the agent because that's where the orchestration happens.
Auth plugins are different — they participate in every CLI ⇄ agent exchange. The CLI runs the auth plugin to construct an authentication header; the agent runs the same plugin to verify it. That means the same auth plugin must be present on both sides, at the same version.
In 0.85, the install, uninstall, and update commands act on the host they run on — there is no automatic dual install. For auth plugins, run the same command on each host where the plugin needs to live. On a single-host deployment that's one host; with separate CLI and agent hosts it's two. formae plugin list shows agent and CLI views together with version-mismatch warnings, so drift is easy to spot. A future release will restore the single-command "install everywhere it needs to live" UX.
init
Initialize a new formae plugin project from the official template. This command can run interactively (prompting for values) or non-interactively using command-line flags.
Usage
# Interactive mode (default)
formae plugin init
# Non-interactive mode
formae plugin init --name <name> --namespace <ns> --description <desc> \
--author <author> --module-path <path> [--license <license>] [--output-dir <dir>] --no-input
Flags
| Flag | Required | Description |
|---|---|---|
--name |
Yes* | Plugin name (lowercase, letters/numbers/hyphens) |
--namespace |
Yes* | Target technology namespace (e.g., AWS, GCP) |
--description |
Yes* | Brief description of the plugin |
--author |
Yes* | Plugin author for license copyright |
--module-path |
Yes* | Go module path (e.g., github.com/your-org/formae-plugin-foo) |
--license |
No | SPDX license identifier (default: Apache-2.0) |
--output-dir |
No | Target directory (default: ./<name>) |
--no-input |
No | Disable interactive prompts; requires all flags marked with * |
Interactive Prompts
When running without --no-input, the command prompts for:
| Prompt | Required | Description |
|---|---|---|
| Plugin name | Yes | Lowercase identifier (letters, numbers, hyphens) |
| Namespace | Yes | Resource type prefix (e.g., AWS, MYCLOUD) |
| Description | Yes | Brief description of the plugin |
| Author | Yes | Your name or organization (used in license) |
| Module path | Yes | Go module path for imports (e.g., github.com/your-org/formae-plugin-foo) |
| License | No | SPDX license identifier (default: Apache-2.0) |
| Output directory | No | Where to create the project (default: ./<name>) |
If flags are provided, those values are used and only missing values are prompted.
Examples
Interactive mode:
$ formae plugin init
Formae Plugin Initialization
Plugin name: mycloud
Namespace: MYCLOUD
Description: MyCloud provider plugin
Author: Acme Corp
Module path: github.com/acme-corp/formae-plugin-mycloud
License [Apache-2.0]:
Output directory [./mycloud]:
Downloading template from GitHub...
Initializing plugin 'mycloud' from template...
Done! Next steps:
1. cd mycloud
2. Define your resources in schema/pkl/
3. Implement ResourcePlugin interface in mycloud.go
4. Run 'make build' to build the plugin
Non-interactive mode (for automation/CI):
formae plugin init \
--name mycloud \
--namespace MYCLOUD \
--description "MyCloud provider plugin" \
--author "Acme Corp" \
--module-path github.com/acme-corp/formae-plugin-mycloud \
--license MIT \
--output-dir ./plugins/mycloud \
--no-input
Partial flags (prompts for missing values):
# Provides name and namespace, prompts for the rest
formae plugin init --name mycloud --namespace MYCLOUD
Generated Project Structure
mycloud/
├── formae-plugin.pkl # Plugin manifest
├── mycloud.go # ResourcePlugin implementation
├── main.go # Entry point
├── schema/pkl/
│ ├── PklProject
│ └── mycloud.pkl # Resource schemas
├── conformance_test.go # Conformance tests
├── scripts/ci/ # CI hooks
├── go.mod
└── Makefile
Validation Rules
Plugin name:
- Must start with a letter
- Can only contain letters, numbers, and hyphens
Namespace:
- Must start with a letter
- Can only contain letters and numbers
Next Steps
After running formae plugin init, see the Plugin SDK documentation for guidance on: