Skip to content

DevOps branch reference ​

The DevOps branch of the Studio Explorer contains one working screen, Extensions. The nodes Source Control, Build, Deployment and Packages are shown as "coming soon" in the Explorer and are not available in this release. For deployment of backend services and the plugin build pipeline see Deployment, Build, test and publish and Code extensions.

Extensions ​

Extensions is where an administrator installs, upgrades, configures, disables and uninstalls the extension plugins of the tenant, and where packages (themes, template packs, AI packs and plugin packages) are registered in and installed from the marketplace catalog. It has two tabs: Installed Plugins and Marketplace Catalog. Installing is always an explicit consent step that discloses what the plugin will be able to do. Tenant administrators and release managers use it. The Explorer node opens the screen whose title reads "Marketplace". For the publishing workflow and the catalog concepts see Marketplace and publishing.

Where to find it: Workspace > DevOps > Extensions. Page key marketplace.

Key concepts ​

TermMeaning
PluginA unit of extension described by a manifest: id, version, publisher, distribution mode, contributions (blocks, actions, functions, and so on), network scopes and dependencies.
InstallationThe tenant's record that a plugin version is installed (state installed or disabled), with its configuration and the capability consent that was approved.
Catalog entryA plugin the current Studio build ships (code and manifest). The list on the Installed Plugins tab merges the build's catalog with the tenant's installations.
Capability disclosureThe list derived from the manifest shown at install time: what the plugin registers, which network addresses it can reach, and whether its metadata is locked or editable. The approved disclosure is stored verbatim as the consent record.
Distributionlocked (contributed metadata cannot be edited by the tenant) or editable (contributions become ordinary tenant-editable metadata).
Marketplace packageA catalog listing (packageId, version, type, author, license, payload) that can be published for other tenants. Statuses draft and published.
Package typeOne of application, plugin, connector, widget, theme, report-pack, workflow-pack, ai-pack, localization-pack, template-pack.

Installed Plugins tab ​

The left grid ("Plugin catalog") lists every plugin id, with its publisher and version below the id, and a State chip:

State chipMeaning
available (outlined)Shipped with this build, not installed for the tenant
installed (green)Installed and active
disabled (amber)Installed but switched off

The grid supports search ("Search plugins") and a State filter. The empty text reads "No plugins are available to this Studio build. Phase 21's marketplace distribution supplies catalogs; hosts embed plugin code at build time."

Banners above the grid:

BannerShown when
"Installations unavailable: reason"The installation list could not be loaded
Plugin diagnostics (code and message, warning)The installed set has dependency or version problems
"Installed but not shipped with this build (contributions unavailable here): ids"The tenant has an installation whose code this build does not contain
"Upgrade available for id: installed vA, this build ships vB - its contributions stay inactive until upgraded."The installed version differs from the build's version
"reason - the catalog is read-only."The user lacks the install capability

Selecting a row opens the detail panel:

ElementDescription
HeaderPlugin id, version chip, publisher chip, distribution chip
Warning"This build does not ship this plugin's code - its contributions are unavailable in this session." when only the installation record exists
ContributesOne line per contribution kind with its count; blocks, actions and functions list their type or name
Network scopesAddresses the plugin may reach
Depends onEach dependency as id @ range with "satisfied by installed vX", "NOT satisfied - installed vX" or "not installed"
ButtonsInstall... (not installed, code available), Upgrade to vX... (installed version differs and code available), Disable... (installed), Enable (disabled), Uninstall... (installed or disabled)
Data noteFor plugins that declare a data-erasure hook: "Uninstall keeps this tenant's data" - the hook runs only on tenant offboarding
Configuration (JSON)Text area pre-filled with the stored configuration (default {}); Save configuration is disabled while the JSON is invalid ("Not valid JSON")

Consent panel (Install and Upgrade): title "Install id vX?" or "Upgrade id vA -> vB?". Content:

LineMeaning
"Register N kind"Each contribution kind and its count
"Reach the network at scope"One line per declared network scope
"Distribution: locked - its contributed metadata cannot be edited by this tenant" or "editable - contributions become ordinary tenant-editable metadata"Distribution mode
Error alerts (code and message)Dependency resolution failed, or an upgrade migration gate failed; the panel then only offers Close

Buttons Approve & install or Approve & upgrade, and Cancel. An upgrade also runs the new version's upgrade migration hook before the upgrade is sent; if the hook fails, its message is shown and nothing is changed.

Impact panel (Disable and Uninstall): title "Disable id?" or "Uninstall id?". It lists the installed plugins that depend on this one ("Installed plugins depend on it: ..."), and the artifacts that use Blocks from the plugin (found through the where-used index): "N artifacts use Blocks from this plugin - uninstalling breaks them" for uninstall, or "new authoring loses these Blocks; existing usage keeps its saved definitions" for disable. When neither exists it says "Nothing depends on it and no artifact references its Blocks." Buttons Uninstall anyway or Disable anyway, and Cancel.

Marketplace Catalog tab ​

Two lists and a registration form.

PanelContent
Published catalogEvery published package across tenants: name, type chip, "packageId - vX - author - license", status chip. Packages of type template-pack, theme and ai-pack show Install
My packagesThis tenant's own listings at any status. Drafts show Publish and Withdraw

Register a new package form:

FieldType or valuesDefaultRequiredDescription
Package IDTextemptyYesUnique together with Version
NameTextemptyYesDisplay name
VersionText (semantic version)1.0.0YesMalformed values are rejected
Package typeSelect of the ten package typeswidgetYes
Platform compatibility (erpVersion)Text*YesExact 1.2.3, caret ^1.2.0, tilde ~1.2.0, or *
Author nameTextemptyYes
Author email (optional)TextemptyNo
LicenseTextemptyYes
Description (optional)Multi-lineemptyNo
Dependencies (JSON array, optional)JSON[]NoFor example [{"id": "acme.core", "versionRange": "^1.0.0"}]
Screenshots (one URL per line)Multi-lineemptyNoListing metadata
ChangelogMulti-lineemptyNoListing metadata
Supported countriesText, comma-separated ISO codesemptyNoFor example US, IN, AE
Supported industriesText, comma-separatedemptyNoFor example retail, manufacturing
PricingSelect Free, Paid; with Paid an Amount (USD) fieldFreeNoStored as {"model":"free"} or {"model":"paid","amount":N,"currency":"USD"}
Populate from an existing ThemeSelect and Populate (type theme only)noneNoFills the payload from one of the tenant's themes
Agents to includeText of agent codes and Fill from AI Studio (type ai-pack only)emptyNoExports the agents with their tools, skills, memory and hand-over settings as the payload (no document text)
Payload JSONMulti-line JSONemptyRequired for the listing to be installableFor example {"definitionJson": "..."} for a theme, {"portalName": "...", "portal": { ... } } for a template pack

Register draft is enabled when Package ID, Name, Version, Author name and License are filled. The form clears after a successful registration.

Install results are announced in a banner: for a theme or template pack "Installed as a new theme draft "name" - review it in the Themes screen before publishing." (or the Portals designer); for an AI pack "Installed the AI pack "name": its agents are drafts in AI Studio (existing ones with the same codes were kept) - test and publish them."

Actions ​

ActionEffectAPI
Install (plugin, after consent)Records the installation with the approved disclosurePOST /api/v1/authoring/plugins with pluginId, version, manifestJson, grantedCapabilitiesJson
Upgrade (after consent)Replaces the manifest and version, keeps configurationPOST /api/v1/authoring/plugins/{pluginId}/upgrade
Enable / DisableSets state installed or disabled; disabling deactivates AI tools the plugin owns, enabling reactivates themPOST /api/v1/authoring/plugins/{pluginId}/enable and /disable
UninstallMarks the installation uninstalled and deactivates the plugin's AI tools; tenant data is keptDELETE /api/v1/authoring/plugins/{pluginId}
Save configurationValidates against the plugin's declared configuration schema when it has one, then storesPUT /api/v1/authoring/plugins/{pluginId}/config with {"configJson":"{...}"}
Register draftCreates a draft listingPOST /api/v1/marketplace/packages
PublishPublishes a draft whose dependencies are all publishedPOST /api/v1/marketplace/packages/{packageId}/{version}/publish
WithdrawDeletes an unpublished draftDELETE /api/v1/marketplace/packages/{packageId}/{version}
Install (package)Materializes the package in the tenantPOST /api/v1/marketplace/packages/{packageId}/{version}/install
ListInstalled plugins; published catalog; own packagesGET /api/v1/authoring/plugins, GET /api/v1/marketplace/packages, GET /api/v1/marketplace/packages/mine

Further plugin endpoints, not on this screen: POST /api/v1/authoring/plugins/upload (multipart .spk), POST .../{pluginId}/upload (upgrade with a new package; force=true overrides the upgrade guard), GET .../{pluginId}/health, GET and PUT .../{pluginId}/deployment (EMBEDDED or SERVICE), PUT .../{pluginId}/feature-flags, GET .../{pluginId}/audit-log, POST .../{pluginId}/rollback, POST .../{pluginId}/force-unload. Package reviews: GET and POST /api/v1/marketplace/packages/{packageId}/reviews (rating 1 to 5).

Procedures ​

Install a plugin shipped with the build:

  1. Open Extensions and select the row acme.timesheet-extras (state available).
  2. Read the detail panel, then select Install....
  3. In the consent panel read the lines, for example "Register 2 blocks" and "Reach the network at https://api.acme.example", then select Approve & install.
  4. The row turns installed. Paste a configuration such as {"defaultRounding": 15} and select Save configuration.

Remove a plugin safely:

  1. Select the installed plugin and Disable.... Read the impact panel; the artifacts that use its Blocks are listed.
  2. Select Disable anyway. Test the affected pages. Re-enable with Enable if they break.
  3. Only then select Uninstall... and Uninstall anyway.

Publish a theme as a package:

  1. Open the Marketplace Catalog tab. Enter Package ID acme.theme-ocean, Name Ocean, Version 1.0.0, Package type theme, Author name, License MIT.
  2. Choose the theme in Populate from an existing Theme and select Populate; the Payload JSON is filled.
  3. Select Register draft, then Publish in My packages. Other tenants can now Install it.

Statuses and lifecycle ​

Plugin installation:

StateTransitions
installedDisable gives disabled; Uninstall gives uninstalled; Upgrade keeps installed
disabledEnable gives installed; Uninstall
uninstalledNot shown; a new Install creates a fresh installation

Each lifecycle change writes a plugin audit entry with the action INSTALL, UPGRADE, CONFIGURE, ENABLE, DISABLE, UNINSTALL or ROLLBACK, readable through GET /api/v1/authoring/plugins/{pluginId}/audit-log.

Marketplace package: draft to published; a draft can be withdrawn (deleted). Published packages cannot be withdrawn.

Permissions ​

OperationCapability
Install, upgrade, enable, disable, uninstall, configure, feature flags, rollback, force unload, deployment change, uploadINSTALL_PLUGINS on plugin
Register, publish, withdraw a packagePUBLISH_PACKAGES on package
Install a package of type themeAUTHOR on theme
Install a package of type template-packAUTHOR on portal
Install a package of type pluginINSTALL_PLUGINS on plugin
Browse, read reviews, list installations, health, audit lognone

Studio reads the actor's capabilities on load and disables the buttons with the title "Managing plugins is not permitted for your role" or "Publishing marketplace packages is not permitted for your role". The server enforces the same capabilities; a denied call answers Actor "x" lacks INSTALL_PLUGINS on plugin for tenant T.

API and CLI ​

bash
erp plugin list
erp plugin search timesheet
erp plugin install acme.timesheet-extras --manifest plugin.json
erp plugin publish ./dist/acme-timesheet-extras.spk --env prod
erp plugin force-unload acme.timesheet-extras
erp registry list --type theme
erp registry mine
erp registry publish acme.theme-ocean 1.0.0 --type theme --name Ocean --author "Acme" --license MIT --payload-file ocean.json
erp registry install acme.theme-ocean 1.0.0
erp tenant plugin list 7
erp tenant plugin enable 7 tenant-c-payroll --application HCM
erp api get /api/v1/authoring/plugins/acme.timesheet-extras/audit-log

erp registry install for a package of type plugin installs the package whose payload names an spkFileId, through the same install pipeline as a package upload. erp tenant plugin install|enable|disable|list manage tenant extension bindings (/api/v1/platform/tenant-extensions), the runtime binding of remote extension services, which is distinct from the plugin installations shown on this screen. See CLI operations reference and Customize an installed plugin.

Limits and behavior ​

  • The Installed Plugins tab installs the manifest-only plugins whose implementation ships inside this Studio build. Backend .spk packages are installed by upload or by erp plugin publish; their lifecycle (health, deployment mode, rollback) is exposed by the API above.
  • Package installs: only template-pack, theme, plugin and ai-pack are installable. The Studio screen offers Install for template-pack, theme and ai-pack. Any other type answers Only "template-pack"/"theme"/"plugin"/"ai-pack" packages install this way - "type" is not supported yet.
  • A theme or template pack installs as a new draft in the tenant; a theme name that already exists is made unique.
  • Publishing requires every declared dependency to resolve to an already published package that satisfies its versionRange.
  • Configuration is stored per tenant and survives upgrades.
  • Uninstall never deletes tenant data.
  • Pricing, plugin signing and security certification are not part of this release; the pricing field is stored as listing metadata only.

Errors and troubleshooting ​

Message or symptomCauseFix
"x" is already installed for tenant TDuplicate installUse Upgrade or Enable
pluginId, version, and manifestJson are required to install a pluginIncomplete API callSupply all three
No plugin installation "x" for tenant TNot installedInstall first
configJson does not satisfy this plugin's declared configSchemaJson: ...Configuration violates the plugin's schemaCorrect the JSON
"Not valid JSON" under ConfigurationSyntax errorFix the JSON
packageId, name, version, packageType, erpVersion, authorName, and license are requiredMissing fieldFill the field
Malformed semver version "x" / Malformed erpVersion range "x"Bad version or rangeUse 1.2.3, ^1.2.0, ~1.2.0 or *
Dependency on "x" has an unparseable versionRange "y"Bad dependency rangeCorrect the dependencies JSON
Package "x" version v is already registeredDuplicate listingIncrease the version
Cannot publish "x": unresolvable dependencies [...]A dependency is not publishedPublish the dependency first
"x" version v is not a draftPublish or withdraw on a published packageRegister a new version
This plugin package has no "spkFileId" payloadPlugin package without a file referenceRe-register with the payload
uploaded JAR is for plugin "a", not "b"Upgrade file belongs to another pluginUse the right package
plugin upgrade failed at stage S: message (reverted to vX)The upgrade failed and was revertedRead the stage and message
"x" has no previous version to roll back toRollback with no earlier versionNone
Upgrade panel shows only error alertsDependencies unsatisfied or upgrade gate failedInstall or upgrade the dependency, or fix the migration hook