c8ctl (pronounced: "cocktail") — a minimal-dependency CLI for Camunda 8 operations built on top of @camunda8/orchestration-cluster-api.
- Minimal Dependencies: Only one runtime dependency (
@camunda8/orchestration-cluster-api) - Multi-Tenant Support: Full support for multi-tenancy across all operations
- Profile Management: Store and manage multiple cluster configurations
- Camunda Modeler Integration: Automatically import and use profiles from Camunda Modeler
- Plugin System: Extend c8ctl with custom commands via npm packages
- Building Block Deployment: Automatic prioritization of
*_bb-*folders during deployment, marked with 🧱 in results - Process Application Support: Resources in folders with
.process-applicationfile marked with 📦 in results - Enhanced Deployment Results: Table view showing file paths, visual indicators, resource details, and versions
- Watch Mode: Monitors a folder for file changes and auto-redeploys (configurable extensions via
--extensions) .c8ignoreSupport: Filter deploy/watch file scanning with.gitignore-style patterns;node_modules/,target/,.git/ignored by default- Open Applications: Open Camunda web applications (Operate, Tasklist, Modeler, Optimize) in the browser directly from the CLI
- Search: Powerful search across process definitions, process instances, user tasks, incidents, jobs, and variables with filter, wildcard, and case-insensitive support
- Flexible Output: Switch between human-readable text and JSON output modes
Full transparency:
this cli is also a pilot-coding experiment, practicing Agentic Engineering.
Guided by humans, the codebase is (mostly) built by your friendly neighborhood LLM, fully dogfooding the Human-in-the-Loop pattern.
- Node.js >= 22.18.0 (for native TypeScript support)
npm install @camunda8/cli -gAfter installation, the CLI is available as c8ctl (or its alias c8).
Note: The c8 alias provides typing ergonomics for common keyboard layouts - the c key (left index finger) followed by 8 (right middle finger) makes for a comfortable typing experience on both QWERTY and QWERTZ keyboards.
# Show general help
c8ctl help
# Show detailed help for specific commands with all flags
c8ctl help list # Shows all list resources and their flags
c8ctl help get # Shows all get resources and their flags
c8ctl help create # Shows all create resources and their flags
c8ctl help complete # Shows all complete resources and their flags
c8ctl help await # Shows await command with all flags
c8ctl help search # Shows all search resources and their flags
c8ctl help deploy # Shows deploy command with all flags
c8ctl help run # Shows run command with all flags
c8ctl help watch # Shows watch command with all flags
c8ctl help open # Shows open command with all apps
c8ctl help cancel # Shows cancel command with all flags
c8ctl help resolve # Shows resolve command with all flags
c8ctl help fail # Shows fail command with all flags
c8ctl help activate # Shows activate command with all flags
c8ctl help publish # Shows publish command with all flags
c8ctl help correlate # Shows correlate command with all flags
c8ctl help cluster # Shows local cluster management help
c8ctl help profiles # Shows profile management help
c8ctl help plugin # Shows plugin management help
# Show version
c8ctl --versionWhen scanning directories, deploy, run, and watch only include files with these extensions:
.bpmn, .dmn, .form, .md, .txt, .xml, .rpa, .json, .config, .yml, .yaml
Use --extensions to override (e.g. --extensions=.bpmn,.dmn).
When scanning directories for deployment artifacts, c8ctl automatically ignores:
node_modules/target/.git/
Create a .c8ignore file in your project root to add custom patterns (.gitignore syntax):
# Ignore build output
dist/
build/
# Ignore draft processes
**/draft-*.bpmn
# But keep this specific one
!draft-approved.bpmn.c8ignore rules apply to both deploy (directory scan) and watch (file monitoring).
For comprehensive examples of all commands and their flags, see EXAMPLES.md.
c8ctl supports shell completion for bash, zsh, and fish.
# Auto-detect your shell and install completions
c8ctl completion install
# Or specify a shell explicitly
c8ctl completion install --shell zshThis writes a completion script to the c8ctl data directory and wires it into your shell config (RC file for bash/zsh; completions directory for fish). Completions are automatically refreshed when c8ctl is upgraded — no manual re-install needed.
If you prefer to manage the completion script yourself:
# Generate and source completion script
c8ctl completion bash > ~/.c8ctl-completion.bash
echo 'source ~/.c8ctl-completion.bash' >> ~/.bashrc
source ~/.bashrcOr for immediate use in the current session:
source <(c8ctl completion bash)# Generate and source completion script
c8ctl completion zsh > ~/.c8ctl-completion.zsh
echo 'source ~/.c8ctl-completion.zsh' >> ~/.zshrc
source ~/.zshrcOr for immediate use in the current session:
source <(c8ctl completion zsh)# Generate and install completion script
c8ctl completion fish > ~/.config/fish/completions/c8ctl.fishFish will automatically load the completion on next shell start.
Credentials are resolved in the following order:
--profileflag (one-off override)- Active profile from session state (⚠ warns if
CAMUNDA_*env vars are also present) - Environment variables (
CAMUNDA_*) - Default
localprofile (http://localhost:8080/v2)
Note: Credential configuration via environment variables follows the same conventions as the @camunda8/orchestration-cluster-api module.
# Using environment variables
export CAMUNDA_BASE_URL=https://camunda.example.com
export CAMUNDA_CLIENT_ID=your-client-id
export CAMUNDA_CLIENT_SECRET=your-client-secret
c8ctl list process-instances
# Create a profile from a .env file
c8ctl add profile staging --from-file .env.staging
# Create a profile from current environment variables
source .env.prod
c8ctl add profile prod --from-env
# Clear the active session profile (so env vars take effect)
c8ctl use profile --none
# Using profile override
c8ctl list process-instances --profile prodTenants are resolved in the following order:
- Active tenant from session state
- Default tenant from active profile
CAMUNDA_DEFAULT_TENANT_IDenvironment variable<default>tenant
# Set active tenant for the session
c8ctl use tenant my-tenant-id
# Now all commands use this tenant
c8ctl list process-instancesc8ctl supports two types of profiles:
- c8ctl profiles: Managed directly by c8ctl
- Camunda Modeler profiles: Automatically imported from Camunda Modeler (with
modeler:prefix)
For profile-related commands and flags, run:
c8ctl help profiles# Add a c8ctl profile
c8 add profile prod --baseUrl=https://camunda.example.com --clientId=xxx --clientSecret=yyy
# List all profiles (includes both c8ctl and modeler profiles)
c8 list profiles
# Set active profile (works with both types)
c8 use profile prod
c8 use profile "modeler:Local Dev"
# Remove c8ctl profile (modeler profiles are read-only)
c8 remove profile prodc8ctl automatically reads profiles from Camunda Modeler's profiles.json file. These profiles are:
- Read-only: Cannot be modified or deleted via c8ctl
- Prefixed: Always displayed with
modeler:prefix (e.g.,modeler:Local Dev) - Dynamic: Loaded fresh on each command execution (no caching)
- Platform-specific locations:
- Linux:
~/.config/camunda-modeler/profiles.json - macOS:
~/Library/Application Support/camunda-modeler/profiles.json - Windows:
%APPDATA%\camunda-modeler\profiles.json
- Linux:
Using modeler profiles:
# List includes modeler profiles with 'modeler:' prefix
c8 list profiles
# Use a modeler profile by name
c8 use profile modeler:Local Dev
# Use a modeler profile by cluster ID
c8 use profile modeler:abc123-def456
# One-off command with modeler profile
c8 list pi --profile=modeler:Cloud ClusterURL Construction:
- Self-managed (localhost): Appends
/v2to the URL (e.g.,http://localhost:8080/v2) - Cloud: Uses the cluster URL as-is (e.g.,
https://abc123.region.zeebe.camunda.io) - Any port: Supports any port number in the URL
# Show current output mode
c8ctl output
# Switch to JSON output
c8ctl output json
# Switch back to text output
c8ctl output textEnable debug logging to see detailed information about plugin loading and other internal operations:
# Enable debug mode with environment variable
DEBUG=1 c8 <command>
# Or use C8CTL_DEBUG
C8CTL_DEBUG=true c8 <command>
# Example: See plugin loading details
DEBUG=1 c8 list pluginsDebug output is written to stderr with timestamps and won't interfere with normal command output.
c8ctl supports a global plugin system that allows extending the CLI with custom commands via npm packages. Plugins are installed globally to a user-specific directory and tracked in a registry file.
Plugin Storage Locations:
The plugin system uses OS-specific directories:
| OS | Plugins Directory | Registry File |
|---|---|---|
| Linux | ~/.config/c8ctl/plugins/node_modules |
~/.config/c8ctl/plugins.json |
| macOS | ~/Library/Application Support/c8ctl/plugins/node_modules |
~/Library/Application Support/c8ctl/plugins.json |
| Windows | %APPDATA%\c8ctl\plugins\node_modules |
%APPDATA%\c8ctl\plugins.json |
Note: You can override the data directory with the
C8CTL_DATA_DIRenvironment variable.
# Create a new plugin from template
c8ctl init plugin my-plugin
# Load a plugin from npm registry
c8ctl load plugin <package-name>
# Load a plugin from a URL (including file URLs)
c8ctl load plugin --from <url>
c8ctl load plugin --from file:///path/to/plugin
c8ctl load plugin --from https://github.com/user/repo
c8ctl load plugin --from git://github.com/user/repo.git
# Upgrade a plugin to latest or specific version
c8ctl upgrade plugin <package-name>
c8ctl upgrade plugin <package-name> 1.2.3
# Downgrade a plugin to a specific version
c8ctl downgrade plugin <package-name> 1.0.0
# Unload a plugin
c8ctl unload plugin <package-name>
# List installed plugins (shows version and sync status)
c8ctl list plugins
# Synchronize plugins from registry
# - First tries npm rebuild for installed plugins
# - Falls back to fresh npm install if rebuild fails
c8ctl sync plugins
# View help including plugin commands
c8ctl helpGlobal Plugin System:
- Plugins are installed to a global directory (OS-specific, see table above)
- Plugin registry file (
plugins.json) tracks all installed plugins - No local
package.jsonis required in your working directory - Plugins are available globally from any directory
- The registry serves as the source of truth for installed plugins
- Default plugins are bundled with c8ctl and loaded automatically
- Plugin commands cannot override built-in commands - built-in commands always take precedence
c8ctl list pluginsshows plugin versions and sync status:✓ Installed- Plugin is in registry and installed⚠ Not installed- Plugin is in registry but not in global directory (runsync)⚠ Not in registry- Plugin is installed but not tracked in registry
c8ctl sync pluginssynchronizes plugins from the registry, rebuilding or reinstalling as neededc8ctl upgrade plugin <name> [version]respects the plugin source from the registry:- without
version: reinstalls the registered source as-is - npm package source with
version: installs<name>@<version> - URL/git source with
version: installs<source>#<version> - file source (
file://) withversion: version upgrade is not supported; useload plugin --fromwith the desired local plugin checkout
- without
c8ctl downgrade plugin <name> <version>respects the plugin source from the registry:- npm package source: installs
<name>@<version> - URL/git source: installs
<source>#<version> - file source (
file://): version downgrade is not supported; useload plugin --fromwith the desired local plugin checkout
- npm package source: installs
Plugin Development:
- Use
c8ctl init plugin <name>to scaffold a new plugin with TypeScript template - Convention over configuration: the directory is always prefixed with
c8ctl-plugin-, and the plugin is registered by the suffix after the prefix (e.g.,c8ctl init plugin c8ctl-plugin-foocreates directoryc8ctl-plugin-fooand registers plugin namefoo) - Generated scaffold includes all necessary files, build configuration, and an
AGENTS.mdguide for autonomous plugin implementation - Plugins have access to the c8ctl runtime via
globalThis.c8ctl - Plugins can create SDK clients via
globalThis.c8ctl.createClient(profile?, sdkConfig?) - Plugins can resolve tenant IDs via
globalThis.c8ctl.resolveTenantId(profile?) - Plugins can access c8ctl output-aware logging via
globalThis.c8ctl.getLogger() - See the bundled
hello-worldplugin indefault-plugins/for a complete example
Plugin Requirements:
- Plugin packages must be regular Node.js modules
- They must include a
c8ctl-plugin.jsorc8ctl-plugin.tsfile in the root directory - The plugin file must export a
commandsobject - Optionally export a
metadataobject to provide help text - Plugins are installed globally and work from any directory
- The runtime object
c8ctlprovides environment information to plugins - The runtime object
c8ctlexposescreateClient(profile?, sdkConfig?)for creating Camunda SDK clients from plugins - The runtime object
c8ctlexposesresolveTenantId(profile?)using the same fallback logic as built-in commands - The runtime object
c8ctlexposesgetLogger()returning the c8ctl logger instance (respects current output mode) - Important:
c8ctl-plugin.jsmust be JavaScript. Node.js doesn't support type stripping innode_modules. If writing in TypeScript, transpile to JS before publishing.
TypeScript Plugin Autocomplete:
import type { C8ctlPluginRuntime } from '@camunda8/cli/runtime';
const c8ctl = globalThis.c8ctl as C8ctlPluginRuntime;
const tenantId = c8ctl.resolveTenantId();
const logger = c8ctl.getLogger();
logger.info(`Tenant: ${tenantId}`);Example Plugin Structure:
// c8ctl-plugin.ts
export const metadata = {
name: 'my-plugin',
description: 'My custom c8ctl plugin',
commands: {
analyze: {
description: 'Analyze BPMN processes'
}
}
};
export const commands = {
analyze: async (args: string[]) => {
console.log('Analyzing...', args);
}
};When plugins are loaded, their commands automatically appear in c8ctl help output. See PLUGIN-HELP.md for detailed documentation on plugin help integration.
c8ctl ships two flags designed specifically for AI agents and programmatic consumers.
They appear in their own clearly labelled section in c8ctl help.
For a full machine-readable reference, see
CONTEXT.md.
Filters output to only the specified field names. Applies to all list, search,
and get commands. Field matching is case-insensitive.
# Only return Key and State columns — reduces context window size
c8ctl list pi --fields Key,State
c8ctl search pd --fields Key,processDefinitionId,name
# Works in both text and JSON modes
c8ctl output json
c8ctl list pi --fields Key,State,processDefinitionId | jq .Previews the API request that would be sent without executing it.
Works on all commands: queries (list, search, get) and mutations
(create, cancel, deploy, complete, fail, activate, resolve,
publish, correlate).
Emits a JSON object to stdout and exits 0:
{
"dryRun": true,
"command": "create process-instance",
"method": "POST",
"url": "http://localhost:8080/v2/process-instances",
"body": { "processDefinitionId": "my-process", "tenantId": "<default>" }
}Recommended agent workflow for mutations:
- Run with
--dry-runand show the user the would-be API call - Wait for user confirmation
- Re-run without
--dry-runto execute
# Preview before creating
c8ctl create pi --id=my-process --dry-run
# Preview a deployment
c8ctl deploy ./my-process.bpmn --dry-run
# Preview cancelling a process instance
c8ctl cancel pi 2251799813685249 --dry-run
# Debug a search query — see the filter body that would be sent
c8ctl search pi --state ACTIVE --between 2024-01-01..2024-12-31 --dry-run
# Inspect a list operation
c8ctl list pd --dry-run
# Preview a get request
c8ctl get pi 12345 --dry-runIn JSON output mode, c8ctl help emits structured JSON containing the full
command tree, flags (with types), and agent flags:
c8ctl output json
c8ctl help # → JSON with commands[], globalFlags[], agentFlags[], resourceAliases
c8ctl help list # → JSON for specific commandc8ctl includes a built-in cluster command for managing a local Camunda 8 instance (powered by a default plugin). No Docker or docker-compose required — it downloads and runs Camunda directly.
# Start the latest stable version
c8ctl cluster start
# Start a specific version
c8ctl cluster start 8.9
c8ctl cluster start 8.9.0-alpha5
# Stop the running cluster
c8ctl cluster stop
# Check cluster status
c8ctl cluster status
# Stream cluster logs
c8ctl cluster logs
# List locally cached versions
c8ctl cluster list
# List available remote versions
c8ctl cluster list-remote
# Pre-download a version without starting it
c8ctl cluster install 8.9
# Remove a cached version
c8ctl cluster delete 8.9Instead of an exact version number, you can use:
stable— the latest GA release (highest minor version that has shipped a.0release)alpha— the latest alpha-train release (highest minor version overall, which may only have alpha builds)- A major.minor pattern like
8.9— resolves to the latest patch/alpha within that minor
c8ctl cluster start with no version argument defaults to stable.
c8ctl cluster start stable
c8ctl cluster start alpha
c8ctl cluster start 8.9 # latest 8.9.xcluster startprefers locally cached versions. If the requested version is already installed, it starts immediately without going online. A non-blocking background check runs to hint if a newer build is available, but never delays startup.cluster installalways checks the remote download server for the latest build. If a newer ETag is detected for an already-installed version, it re-downloads.cluster list-remotefetches the full list of available versions from the download server.- Offline fallback: if the network is unavailable, alias resolution falls back to a locally cached mapping, then to a hardcoded default.
Run c8ctl help cluster for full details. See EXAMPLES.md for a complete local development workflow.
- Logger (
src/logger.ts): Handles output in text or JSON mode - Config (
src/config.ts): Manages profiles, session state, and credential resolution - Client (
src/client.ts): Factory for creating Camunda 8 SDK clients - Commands (
src/commands/): Domain-specific command handlers
c8ctl <verb> <resource> [arguments] [flags]Verbs:
list- List resourcessearch- Search resources with filtersget- Get resource by keycreate- Create resourcecancel- Cancel resourcecomplete- Complete resourcefail- Fail a jobactivate- Activate jobsresolve- Resolve incidentpublish- Publish messagecorrelate- Correlate messagedeploy- Deploy resourcesrun- Deploy and start processwatch(alias:w) - Watch for changes and auto-deployadd- Add a profileremove(alias:rm) - Remove a profileload- Load a pluginunload- Unload a pluginsync- Synchronize pluginsuse- Set active profile or tenantoutput- Show or set output formatcluster- Manage local Camunda 8 cluster (start, stop, status, logs, install, delete, list, list-remote)completion- Generate shell completion scriptfeedback- Open the feedback page to report issues or request features
Resources: process-instance (pi), process-definition (pd), user-task (ut), incident (inc), job, jobs, variables (vars), message (msg), topology, profile, tenant, plugin
Tip: Run c8ctl help <command> to see detailed help for specific commands with all available flags.
npm testnpm run test:unitIntegration tests require a running Camunda 8 instance at http://localhost:8080.
- Start a local Camunda 8 instance (e.g., using
c8ctl cluster start) - Run:
npm run test:integration
- Native TypeScript: Runs directly with Node.js 22.18+ (no compilation needed)
c8ctl/
├── src/
│ ├── index.ts # CLI entry point
│ ├── logger.ts # Output handling
│ ├── config.ts # Configuration management
│ ├── client.ts # SDK client factory
│ └── commands/ # Command handlers
│ └── ...
├── tests/
│ ├── unit/ # Unit tests
│ ├── integration/ # Integration tests
│ └── fixtures/ # Test fixtures
├── package.json
├── tsconfig.json
└── README.md# If installed globally
c8ctl <command>
# Or using the alias
c8 <command>
# For local development with Node.js 22.18+ (native TypeScript)
node src/index.ts <command>
# Testing with npm link (requires build first)
npm run build
npm link
c8ctl <command>Note: The build step is only required for publishing or using npm link. Development uses native TypeScript execution via node src/index.ts.
- Create command handler in
src/commands/ - Wire into
src/index.tscommand routing - Add tests in
tests/unit/andtests/integration/ - Update help text in
src/commands/help.ts - Document in
EXAMPLES.md
CAMUNDA_BASE_URL: Cluster base URLCAMUNDA_CLIENT_ID: OAuth client IDCAMUNDA_CLIENT_SECRET: OAuth client secretCAMUNDA_TOKEN_AUDIENCE: OAuth token audienceCAMUNDA_OAUTH_URL: OAuth token endpointCAMUNDA_DEFAULT_TENANT_ID: Default tenant ID
Configuration is stored in platform-specific user data directories:
- Linux:
~/.config/c8ctl/ - macOS:
~/Library/Application Support/c8ctl/ - Windows:
%APPDATA%\c8ctl\
Files:
profiles.json: Saved cluster configurationssession.json: Active profile, tenant, and output modeplugins.json: Plugin registry tracking installed plugins
c8ctl automatically reads profiles from Camunda Modeler (if installed):
- Linux:
~/.config/camunda-modeler/profiles.json - macOS:
~/Library/Application Support/camunda-modeler/profiles.json - Windows:
%APPDATA%\camunda-modeler\profiles.json
Modeler profiles are:
- Read-only in c8ctl (managed via Camunda Modeler)
- Automatically loaded on each command execution
- Prefixed with
modeler:when used in c8ctl - Support both cloud and self-managed clusters
These flags are accepted by every command.
| Flag | Type | Required | Description |
|---|---|---|---|
--help / -h |
boolean | Show help | |
--version / -v |
string | Show CLI version, or filter by process definition version on supported commands | |
--profile |
string | Use a specific profile | |
--dry-run |
boolean | Preview the API request without executing | |
--verbose |
boolean | Show verbose output | |
--fields |
string | Comma-separated list of fields to display |
| Alias | Resource |
|---|---|
auth |
authorization |
inc |
incident |
mr |
mapping-rule |
msg |
message |
pd |
process-definition |
pi |
process-instance |
ut |
user-task |
vars |
variable |
var |
variable |
These flags are available on list and search commands.
| Flag | Type | Required | Description |
|---|---|---|---|
--sortBy |
string | Sort results by field | |
--asc |
boolean | Sort ascending | |
--desc |
boolean | Sort descending | |
--limit |
string | Maximum number of results | |
--between |
string | Date range filter (e.g. 7d, 30d, 2024-01-01..2024-12-31) | |
--dateField |
string | Date field for --between filter |
List resources
Resources: pi (process-instance), pd (process-definition), ut (user-task), inc (incident), jobs, profiles (profile), plugins (plugin), users (user), roles (role), groups (group), tenants (tenant), auth (authorization), mapping-rules (mapping-rule)
Verb-level flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--all |
boolean | List all (disable pagination limit) |
Resource-specific flags:
process-definition (pd)
| Flag | Type | Required | Description |
|---|---|---|---|
--bpmnProcessId |
string | Filter by BPMN process ID | |
--id |
string | Filter by BPMN process ID (alias) | |
--processDefinitionId |
string | Filter by process definition ID | |
--name |
string | Filter by name | |
--key |
string | Filter by key | |
--iid |
string | Case-insensitive filter by BPMN process ID | |
--iname |
string | Case-insensitive filter by name |
process-instance (pi)
| Flag | Type | Required | Description |
|---|---|---|---|
--bpmnProcessId |
string | Filter by BPMN process ID | |
--id |
string | Filter by BPMN process ID (alias) | |
--processDefinitionId |
string | Filter by process definition ID | |
--processDefinitionKey |
string | Filter by process definition key | |
--state |
string | Filter by state (ACTIVE, COMPLETED, etc) | |
--key |
string | Filter by key | |
--parentProcessInstanceKey |
string | Filter by parent process instance key | |
--iid |
string | Case-insensitive filter by BPMN process ID |
user-task (ut)
| Flag | Type | Required | Description |
|---|---|---|---|
--state |
string | Filter by state | |
--assignee |
string | Filter by assignee | |
--processInstanceKey |
string | Filter by process instance key | |
--processDefinitionKey |
string | Filter by process definition key | |
--elementId |
string | Filter by element ID | |
--iassignee |
string | Case-insensitive filter by assignee |
incident (inc)
| Flag | Type | Required | Description |
|---|---|---|---|
--state |
string | Filter by state | |
--processInstanceKey |
string | Filter by process instance key | |
--processDefinitionKey |
string | Filter by process definition key | |
--bpmnProcessId |
string | Filter by BPMN process ID | |
--id |
string | Filter by BPMN process ID (alias) | |
--processDefinitionId |
string | Filter by process definition ID | |
--errorType |
string | Filter by error type | |
--errorMessage |
string | Filter by error message | |
--ierrorMessage |
string | Case-insensitive filter by error message | |
--iid |
string | Case-insensitive filter by BPMN process ID |
jobs
| Flag | Type | Required | Description |
|---|---|---|---|
--state |
string | Filter by state | |
--type |
string | Filter by job type | |
--processInstanceKey |
string | Filter by process instance key | |
--processDefinitionKey |
string | Filter by process definition key | |
--itype |
string | Case-insensitive filter by job type |
user
| Flag | Type | Required | Description |
|---|---|---|---|
--username |
string | Filter by username | |
--name |
string | Filter by name | |
--email |
string | Filter by email |
role
| Flag | Type | Required | Description |
|---|---|---|---|
--roleId |
string | Filter by role ID | |
--name |
string | Filter by name |
group
| Flag | Type | Required | Description |
|---|---|---|---|
--groupId |
string | Filter by group ID | |
--name |
string | Filter by name |
tenant
| Flag | Type | Required | Description |
|---|---|---|---|
--tenantId |
string | Filter by tenant ID | |
--name |
string | Filter by name |
authorization (auth)
| Flag | Type | Required | Description |
|---|---|---|---|
--ownerId |
string | Filter by owner ID | |
--ownerType |
string | Filter by owner type | |
--resourceType |
string | Filter by resource type | |
--resourceId |
string | Filter by resource ID |
mapping-rule (mr)
| Flag | Type | Required | Description |
|---|---|---|---|
--mappingRuleId |
string | Filter by mapping rule ID | |
--name |
string | Filter by name | |
--claimName |
string | Filter by claim name | |
--claimValue |
string | Filter by claim value |
Examples:
c8ctl list pi # List process instances
c8ctl list pd # List process definitions
c8ctl list users # List usersSearch resources with filters (wildcards, date ranges, case-insensitive)
Resources: pi (process-instance), pd (process-definition), ut (user-task), inc (incident), jobs, vars (variable), users (user), roles (role), groups (group), tenants (tenant), auth (authorization), mapping-rules (mapping-rule)
Resource-specific flags:
process-definition (pd)
| Flag | Type | Required | Description |
|---|---|---|---|
--bpmnProcessId |
string | Filter by BPMN process ID | |
--id |
string | Filter by BPMN process ID (alias) | |
--processDefinitionId |
string | Filter by process definition ID | |
--name |
string | Filter by name | |
--key |
string | Filter by key | |
--iid |
string | Case-insensitive filter by BPMN process ID | |
--iname |
string | Case-insensitive filter by name |
process-instance (pi)
| Flag | Type | Required | Description |
|---|---|---|---|
--bpmnProcessId |
string | Filter by BPMN process ID | |
--id |
string | Filter by BPMN process ID (alias) | |
--processDefinitionId |
string | Filter by process definition ID | |
--processDefinitionKey |
string | Filter by process definition key | |
--state |
string | Filter by state (ACTIVE, COMPLETED, etc) | |
--key |
string | Filter by key | |
--parentProcessInstanceKey |
string | Filter by parent process instance key | |
--iid |
string | Case-insensitive filter by BPMN process ID |
user-task (ut)
| Flag | Type | Required | Description |
|---|---|---|---|
--state |
string | Filter by state | |
--assignee |
string | Filter by assignee | |
--processInstanceKey |
string | Filter by process instance key | |
--processDefinitionKey |
string | Filter by process definition key | |
--elementId |
string | Filter by element ID | |
--iassignee |
string | Case-insensitive filter by assignee |
incident (inc)
| Flag | Type | Required | Description |
|---|---|---|---|
--state |
string | Filter by state | |
--processInstanceKey |
string | Filter by process instance key | |
--processDefinitionKey |
string | Filter by process definition key | |
--bpmnProcessId |
string | Filter by BPMN process ID | |
--id |
string | Filter by BPMN process ID (alias) | |
--processDefinitionId |
string | Filter by process definition ID | |
--errorType |
string | Filter by error type | |
--errorMessage |
string | Filter by error message | |
--ierrorMessage |
string | Case-insensitive filter by error message | |
--iid |
string | Case-insensitive filter by BPMN process ID |
jobs
| Flag | Type | Required | Description |
|---|---|---|---|
--state |
string | Filter by state | |
--type |
string | Filter by job type | |
--processInstanceKey |
string | Filter by process instance key | |
--processDefinitionKey |
string | Filter by process definition key | |
--itype |
string | Case-insensitive filter by job type |
variable (var, vars)
| Flag | Type | Required | Description |
|---|---|---|---|
--name |
string | Filter by variable name | |
--value |
string | Filter by value | |
--processInstanceKey |
string | Filter by process instance key | |
--scopeKey |
string | Filter by scope key | |
--fullValue |
boolean | Return full variable values (not truncated) | |
--iname |
string | Case-insensitive filter by name | |
--ivalue |
string | Case-insensitive filter by value |
user
| Flag | Type | Required | Description |
|---|---|---|---|
--username |
string | Filter by username | |
--name |
string | Filter by name | |
--email |
string | Filter by email |
role
| Flag | Type | Required | Description |
|---|---|---|---|
--roleId |
string | Filter by role ID | |
--name |
string | Filter by name |
group
| Flag | Type | Required | Description |
|---|---|---|---|
--groupId |
string | Filter by group ID | |
--name |
string | Filter by name |
tenant
| Flag | Type | Required | Description |
|---|---|---|---|
--tenantId |
string | Filter by tenant ID | |
--name |
string | Filter by name |
authorization (auth)
| Flag | Type | Required | Description |
|---|---|---|---|
--ownerId |
string | Filter by owner ID | |
--ownerType |
string | Filter by owner type | |
--resourceType |
string | Filter by resource type | |
--resourceId |
string | Filter by resource ID |
mapping-rule (mr)
| Flag | Type | Required | Description |
|---|---|---|---|
--mappingRuleId |
string | Filter by mapping rule ID | |
--name |
string | Filter by name | |
--claimName |
string | Filter by claim name | |
--claimValue |
string | Filter by claim value |
Examples:
c8ctl search pi --state=ACTIVE # Search for active process instances
c8ctl search pd --bpmnProcessId=myProcess # Search process definitions by ID
c8ctl search pd --name='*main*' # Search process definitions with wildcard
c8ctl search ut --assignee=john # Search user tasks assigned to john
c8ctl search inc --state=ACTIVE # Search for active incidents
c8ctl search jobs --type=myJobType # Search jobs by type
c8ctl search jobs --type='*service*' # Search jobs with type containing "service"
c8ctl search variables --name=myVar # Search for variables by name
c8ctl search variables --value=foo # Search for variables by value
c8ctl search variables --processInstanceKey=123 --fullValue # Search variables with full values
c8ctl search pd --iname='*order*' # Case-insensitive search by name
c8ctl search ut --iassignee=John # Case-insensitive search by assigneeGet a resource by key
Resources: pi (process-instance), pd (process-definition), inc (incident), topology, form, user, role, group, tenant, auth (authorization), mapping-rule
Positional arguments:
- process-definition:
<key>(required) - process-instance:
<key>(required) - incident:
<key>(required) - user:
<username>(required) - role:
<roleId>(required) - group:
<groupId>(required) - tenant:
<tenantId>(required) - authorization:
<authorizationKey>(required) - mapping-rule:
<mappingRuleId>(required) - form:
<key>(required)
Resource-specific flags:
process-definition (pd)
| Flag | Type | Required | Description |
|---|---|---|---|
--xml |
boolean | Get BPMN XML (process definitions) |
form
| Flag | Type | Required | Description |
|---|---|---|---|
--userTask |
boolean | Get form for user task | |
--ut |
boolean | Alias for --userTask | |
--processDefinition |
boolean | Get form for process definition | |
--pd |
boolean | Alias for --processDefinition |
process-instance (pi)
| Flag | Type | Required | Description |
|---|---|---|---|
--variables |
boolean | Include variables in output |
Examples:
c8ctl get pi 123456 # Get process instance by key
c8ctl get pi 123456 --variables # Get process instance with variables
c8ctl get pd 123456 # Get process definition by key
c8ctl get pd 123456 --xml # Get process definition XML
c8ctl get form 123456 # Get form (searches both user task and process definition)
c8ctl get form 123456 --ut # Get form for user task only
c8ctl get form 123456 --pd # Get start form for process definition only
c8ctl get user john # Get user by usernameCreate a resource (process instance, identity)
Resources: pi (process-instance), user, role, group, tenant, auth (authorization), mapping-rule
Verb-level flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--processDefinitionId |
string | Process definition ID (BPMN process ID) | |
--id |
string | Process definition ID (alias for --processDefinitionId) | |
--bpmnProcessId |
string | BPMN process ID (alias for --processDefinitionId) | |
--variables |
string | JSON variables | |
--awaitCompletion |
boolean | Wait for process to complete | |
--fetchVariables |
boolean | Fetch result variables on completion | |
--requestTimeout |
string | Await timeout in milliseconds | |
--username |
string | Username | |
--name |
string | Display name | |
--email |
string | Email address | |
--password |
string | Password | |
--roleId |
string | Role ID | |
--groupId |
string | Group ID | |
--tenantId |
string | Tenant ID | |
--mappingRuleId |
string | Mapping rule ID | |
--claimName |
string | Claim name | |
--claimValue |
string | Claim value |
Resource-specific flags:
authorization (auth)
| Flag | Type | Required | Description |
|---|---|---|---|
--ownerId |
string | Yes | Authorization owner ID |
--ownerType |
string | Yes | Authorization owner type |
--resourceType |
string | Yes | Authorization resource type |
--resourceId |
string | Yes | Authorization resource ID |
--permissions |
string | Yes | Comma-separated permissions |
Examples:
c8ctl create pi --id=myProcess # Create a process instance
c8ctl create pi --id=myProcess --awaitCompletion # Create and await completion
c8ctl create user --username=john --name='John Doe' --email=john@example.com --password=secret # Create a userDelete a resource by key
Usage: c8ctl delete <resource> <key>
Resources: user, role, group, tenant, auth (authorization), mapping-rule
Positional arguments:
- user:
<username>(required) - role:
<roleId>(required) - group:
<groupId>(required) - tenant:
<tenantId>(required) - authorization:
<authorizationKey>(required) - mapping-rule:
<mappingRuleId>(required)
Examples:
c8ctl delete user john # Delete userCancel a process instance
Usage: c8ctl cancel <resource> <key>
Resources: pi (process-instance)
Positional arguments:
- process-instance:
<key>(required)
Create and await process instance completion (server-side waiting)
Usage: c8ctl await <resource>
Resources: pi (process-instance)
Flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--processDefinitionId |
string | Process definition ID (BPMN process ID) | |
--id |
string | Process definition ID (alias for --processDefinitionId) | |
--bpmnProcessId |
string | BPMN process ID (alias for --processDefinitionId) | |
--variables |
string | JSON variables | |
--fetchVariables |
boolean | Fetch result variables on completion | |
--requestTimeout |
string | Await timeout in milliseconds |
Examples:
c8ctl await pi --id=myProcess # Create and wait for completionComplete a user task or job
Usage: c8ctl complete <resource> <key>
Resources: ut (user-task), job
Positional arguments:
- user-task:
<key>(required) - job:
<key>(required)
Flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--variables |
string | JSON variables |
Mark a job as failed with optional error message and retry count
Resources: job
Positional arguments:
- job:
<key>(required)
Flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--retries |
string | Remaining retries | |
--errorMessage |
string | Error message |
Activate jobs of a specific type for processing
Resources: jobs
Positional arguments:
- jobs:
<type>(required)
Flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--maxJobsToActivate |
string | Maximum number of jobs to activate | |
--timeout |
string | Job timeout in milliseconds | |
--worker |
string | Worker name |
Resolve an incident (marks resolved, allows process to continue)
Resources: inc (incident)
Positional arguments:
- incident:
<key>(required)
Publish a message for message correlation
Resources: msg (message)
Positional arguments:
- message:
<name>(required)
Flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--correlationKey |
string | Correlation key | |
--variables |
string | JSON variables | |
--timeToLive |
string | Time to live in milliseconds |
Correlate a message to a specific process instance
Resources: msg (message)
Positional arguments:
- message:
<name>(required)
Flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--correlationKey |
string | Yes | Correlation key |
--variables |
string | JSON variables | |
--timeToLive |
string | Time to live in milliseconds |
Set variables on an element instance (process instance or flow element scope). Variables are propagated to the outermost scope by default; use --local to restrict to the specified scope.
Usage: c8ctl set variable <key>
Resources: variable
Positional arguments:
- variable:
<key>(required)
Flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--variables |
string | Yes | JSON object of variables to set (required) |
--local |
boolean | Set variables in local scope only (default: propagate to outermost scope) |
Examples:
c8ctl set variable 2251799813685249 --variables='{"status":"approved"}' # Set variables on a process instance
c8ctl set variable 2251799813685249 --variables='{"x":1}' --local # Set variables in local scope onlyDeploy files to Camunda (auto-discovers deployable files in directories)
Usage: c8ctl deploy [path...]
Flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--force |
boolean | Deploy any file type, ignoring the default extension allow-list |
Examples:
c8ctl deploy ./my-process.bpmn # Deploy a BPMN fileDeploy and start a process instance from a BPMN file
Usage: c8ctl run <path>
Flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--variables |
string | JSON variables | |
--force |
boolean | Deploy any file type, ignoring the default extension allow-list |
Examples:
c8ctl run ./my-process.bpmn # Deploy and start processAssign a resource to a target (--to-user, --to-group, etc.)
Usage: c8ctl assign <resource> <id>
Resources: role, user, group, mapping-rule
Positional arguments:
- role:
<roleId>(required) - user:
<username>(required) - group:
<groupId>(required) - mapping-rule:
<mappingRuleId>(required)
Flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--to-user |
string | Target user ID | |
--to-group |
string | Target group ID | |
--to-tenant |
string | Target tenant ID | |
--to-mapping-rule |
string | Target mapping rule ID |
Examples:
c8ctl assign role admin --to-user=john # Assign role to userUnassign a resource from a target (--from-user, --from-group, etc.)
Usage: c8ctl unassign <resource> <id>
Resources: role, user, group, mapping-rule
Positional arguments:
- role:
<roleId>(required) - user:
<username>(required) - group:
<groupId>(required) - mapping-rule:
<mappingRuleId>(required)
Flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--from-user |
string | Source user ID | |
--from-group |
string | Source group ID | |
--from-tenant |
string | Source tenant ID | |
--from-mapping-rule |
string | Source mapping rule ID |
Examples:
c8ctl unassign role admin --from-user=john # Unassign role from userWatch files for changes and auto-deploy
Usage: c8ctl watch [path...]
Aliases: w
Flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--force |
boolean | Continue watching after all deployment errors | |
--extensions |
string | Comma-separated list of file extensions to watch (e.g. .bpmn,.dmn,.form) |
Examples:
c8ctl watch ./src # Watch directory for changesOpen Camunda web app in browser
Usage: c8ctl open <app>
Resources: operate, tasklist, modeler, optimize
Examples:
c8ctl open operate # Open Camunda Operate in browser
c8ctl open tasklist # Open Camunda Tasklist in browser
c8ctl open operate --profile=prod # Open Operate using a specific profileAdd a profile
Resources: profile
Positional arguments:
- profile:
<name>(required)
Flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--baseUrl |
string | Cluster base URL | |
--clientId |
string | OAuth client ID | |
--clientSecret |
string | OAuth client secret | |
--audience |
string | OAuth audience | |
--oAuthUrl |
string | OAuth token URL | |
--defaultTenantId |
string | Default tenant ID | |
--username |
string | Basic auth username | |
--password |
string | Basic auth password | |
--from-file |
string | Import from .env file | |
--from-env |
boolean | Import from environment variables |
Remove a profile (alias: rm)
Usage: c8ctl remove profile <name>
Aliases: rm
Resources: profile, plugin
Positional arguments:
- profile:
<name>(required) - plugin:
<package>(required)
Flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--none |
boolean | Clear active profile |
Load a c8ctl plugin (npm registry or URL)
Usage: c8ctl load plugin [name|--from url]
Resources: plugin
Positional arguments:
- plugin:
<package>(optional)
Flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--from |
string | Load plugin from URL |
Examples:
c8ctl load plugin my-plugin # Load plugin from npm registry
c8ctl load plugin --from https://github.com/org/plugin # Load plugin from URLUnload a c8ctl plugin (npm uninstall wrapper)
Usage: c8ctl unload plugin <name>
Aliases: rm
Resources: plugin
Positional arguments:
- plugin:
<package>(required)
Flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--force |
boolean | Force unload without confirmation |
Upgrade a plugin (respects source type)
Usage: c8ctl upgrade plugin <name> [version]
Resources: plugin
Positional arguments:
- plugin:
<package>(required),<version>(optional)
Examples:
c8ctl upgrade plugin my-plugin # Upgrade plugin to latest version
c8ctl upgrade plugin my-plugin 1.2.3 # Upgrade plugin to a specific version (source-aware)Downgrade a plugin to a specific version
Usage: c8ctl downgrade plugin <name> <version>
Resources: plugin
Positional arguments:
- plugin:
<package>(required),<version>(required)
Synchronize plugins from registry (rebuild/reinstall)
Resources: plugin
Examples:
c8ctl sync plugin # Synchronize pluginsCreate a new plugin from TypeScript template
Resources: plugin
Positional arguments:
- plugin:
<name>(optional)
Examples:
c8ctl init plugin my-plugin # Create new plugin from template (c8ctl-plugin-my-plugin)Set active profile or tenant
Usage: c8ctl use profile|tenant
Resources: profile, tenant
Positional arguments:
- profile:
<name>(optional) - tenant:
<tenantId>(required)
Flags:
| Flag | Type | Required | Description |
|---|---|---|---|
--none |
boolean | Clear active profile/tenant |
Examples:
c8ctl use profile prod # Set active profileShow or set output format
Usage: c8ctl output [json|text]
Resources: json, text
Examples:
c8ctl output json # Switch to JSON outputGenerate shell completion script
Usage: c8ctl completion bash|zsh|fish|install
Resources: bash, zsh, fish, install
Resource-specific flags:
install
| Flag | Type | Required | Description |
|---|---|---|---|
--shell |
string | Shell to install completions for (bash, zsh, fish) |
Examples:
c8ctl completion bash # Generate bash completion script
c8ctl completion install # Auto-detect shell and install completions (auto-refreshes on upgrade)
c8ctl completion install --shell zsh # Install completions for a specific shellStart a STDIO MCP proxy (bridges local MCP clients to remote Camunda 8)
Usage: c8ctl mcp-proxy [mcp-path]
Open the feedback page to report issues or request features
Show help (run 'c8ctl help <command>' for details)
Usage: c8ctl help [command]
Aliases: menu
Show active profile or output mode
Resources: profile, output
Examples:
c8ctl which profile # Show currently active profile
c8ctl which output # Show current output modeApache 2.0 - see LICENSE.md
See AGENTS.md for commit message conventions.