Skill v1.0.1
currentAutomated scan100/1004 files
version: "1.0.1" name: docyrus-cli-app description: Use the Docyrus CLI (docyrus) to interact with the Docyrus platform from the terminal. Use when the user asks to authenticate, list apps, query or manage data records (ds), manage dev app data source schema objects (studio) including data sources, fields, enums, data views, forms, webforms, HTML/PDF/DOCX export templates, and email templates, send API requests, switch environments, tenants, or accounts, discover tenant OpenAPI specs, or use the Bun-powered terminal UI via docyrus tui. Triggers on tasks involving docyrus CLI commands, terminal-based Docyrus operations, docyrus ds list, docyrus studio, docyrus studio data-view, docyrus studio form, docyrus studio webform, docyrus studio html-template, docyrus studio email-template, docyrus discover, docyrus auth, docyrus env, docyrus tui, or shell-based Docyrus workflows.
Docyrus CLI
Guide for using the docyrus CLI to interact with the Docyrus platform from the terminal.
Command Overview
| Command | Description | |
|---|---|---|
docyrus | Show active environment, current auth context, and help summary | |
docyrus env list / env use | Manage named environments | |
docyrus auth login | Authenticate via OAuth2 device flow or manual tokens | |
docyrus auth logout | Logout the active account for the current environment | |
docyrus auth who | Show the active user and tenant | |
docyrus auth accounts list / use | Manage saved user accounts | |
docyrus auth tenants list / use | Manage saved tenants for a user | |
docyrus apps list | List apps from /v1/apps | |
docyrus ds get | Get data source metadata | |
docyrus ds list | Query records with filters, sorting, pagination | |
docyrus ds create / update / delete | Mutate records, including bulk create/update | |
docyrus studio ... | CRUD for dev app data sources, fields, enums, data views, forms, webforms, HTML/PDF/DOCX templates, and email templates | |
docyrus discover api | Download tenant OpenAPI spec | |
docyrus discover namespaces / path / endpoint / entity / search | Explore the downloaded tenant OpenAPI spec | |
docyrus connect list-connectors | List integration connectors with optional keyword search | |
docyrus connect get-connector <slug> | Get connector details including data sources and actions | |
docyrus connect get-action <slug> <actionKey> | Get action details with input/output JSON schemas | |
docyrus connect list-connections <slug> | Get tenant and user connections for a connector | |
docyrus connect curl <slug> <endpoint> | Send HTTP request through a connector's provider auth | |
docyrus connect run-action <appSlug> <actionKey> | Run a connector or app action | |
docyrus curl | Send arbitrary API requests | |
docyrus tui | Launch the OpenTUI terminal UI (requires Bun) |
See [references/cli-manifest.md](references/cli-manifest.md) for complete command reference with flags and arguments.
Common Workflows
Settings Scope
By default, docyrus stores settings in a project-local .docyrus/ folder in the current working directory.
- Local default:
./.docyrus/ - Global override:
~/.docyrus/via-gor--global - Tenant OpenAPI cache:
<settings-root>/tenans/<tenantId>/openapi.json
Examples:
# Local project settings (default)docyrus auth login --clientId "83a8df32-3738-4b5a-a0c7-87976adb1631"# Force global settings for this rundocyrus -g auth login --clientId "83a8df32-3738-4b5a-a0c7-87976adb1631"
Environments
The CLI does not use API_BASE_URL. It uses saved named environments:
live(prodalias) ->https://api.docyrus.combeta->https://beta-api.docyrus.comalpha->https://alpha-api.docyrus.comdev->https://localhost:3366
Examples:
docyrusdocyrus env list --jsondocyrus env use beta --json
Running docyrus without a subcommand returns the active environment, help summary, and current auth context.
Authentication
Device flow login:
docyrus auth login --clientId "83a8df32-3738-4b5a-a0c7-87976adb1631" --json
Manual token login:
docyrus auth login \--accessToken "<access-token>" \--refreshToken "<optional-refresh-token>" \--clientId "<optional-client-id>" \--json
Rules:
--refreshTokenrequires--accessToken- if local login omits
--clientId, the CLI falls back to the saved global client ID when available - explicit or previously resolved client IDs are saved to config for reuse
- default scopes are hardcoded in the CLI and include
openid,email,profile,offline_access,ReadWrite.All,User.ReadWrite,Users.Read.All,Tenant.Read,Teams.Read.All,DS.ReadWrite.All,Docs.ReadWrite.All, andArchitect.ReadWrite.All
Multi-account and multi-tenant workflows:
docyrus auth accounts list --jsondocyrus auth accounts use --userId "<user-id>" --jsondocyrus auth tenants list --userId "<user-id>" --jsondocyrus auth tenants use 1002 --jsondocyrus auth tenants use "8d130f7a-4bc4-4be6-a05b-0f8f1b2d93e9" --userId "<user-id>" --jsondocyrus auth who --json
auth tenants use takes a positional tenant selector. If it is numeric, the CLI treats it as tenantNo; otherwise it must be a UUID tenant ID.
Successful Result Shape
Every successful command injects a top-level context field:
{"data": {},"context": {"email": "user@example.com","tenantName": "Acme","tenantNo": 1002,"tenantDisplay": "Acme (1002)"}}
If there is no active session, context is null.
Discover API and Entities
Discover commands require an active session. Commands other than discover api auto-download the OpenAPI spec if it is missing locally.
docyrus discover api --jsondocyrus discover namespaces --jsondocyrus discover path /v1/users --jsondocyrus discover endpoint /v1/users/me --jsondocyrus discover endpoint [PUT]/v1/users/me/photo --jsondocyrus discover entity UserEntity --jsondocyrus discover search users,UserEntity --json
Discover Data Sources
docyrus apps list --jsondocyrus ds get crm contacts --json
Query Records (ds list)
Basic listing:
docyrus ds list crm contacts --columns "name, email, phone" --limit 20
With filters:
docyrus ds list crm contacts \--columns "name, email" \--filters '{"rules":[{"field":"status","operator":"=","value":"active"}]}'
With relation expansion:
docyrus ds list crm contacts \--columns "name, ...related_account(account_name, account_phone)"
Date shortcut filter:
docyrus ds list crm tasks --filters '{"rules":[{"field":"created_on","operator":"this_month"}]}'
See [references/list-query-examples.md](references/list-query-examples.md) for more filter, sort, pagination, and combined query examples.
Record Mutations
Create:
docyrus ds create crm contacts --data '{"name":"Jane Doe","email":"jane@example.com"}'
Update:
docyrus ds update crm contacts <recordId> --data '{"phone":"+1234567890"}'
Delete:
docyrus ds delete crm contacts <recordId>
Batch and file input:
docyrus ds create crm contacts --data '[{"name":"A"},{"name":"B"}]' --jsondocyrus ds update crm contacts --data '[{"id":"1","phone":"+111"},{"id":"2","phone":"+222"}]' --jsondocyrus ds create crm contacts --from-file ./contacts-create.csv --jsondocyrus ds update crm contacts <recordId> --from-file ./contact-update.json --json
Array payloads route to bulk endpoints and are limited to 50 items per request.
Studio Schema CRUD (studio)
Use studio for developer-facing schema operations: data sources, fields, enums, saved views, forms, webforms, and export templates. Most data-source-scoped commands accept either --appId/--appSlug and either --dataSourceId/--dataSourceSlug, and the CLI resolves whichever side you did not pass.
# Data sourcesdocyrus studio list-data-sources --appSlug crm --expand fields --jsondocyrus studio get-data-source --appSlug crm --dataSourceSlug contacts --jsondocyrus studio create-data-source --appSlug crm --title "Contacts" --name "contacts" --slug "contacts" --jsondocyrus studio update-data-source --appId <appId> --dataSourceId <dataSourceId> --data '{"title":"Contacts v2"}' --jsondocyrus studio delete-data-source --appId <appId> --dataSourceSlug contacts --jsondocyrus studio bulk-create-data-sources --appId <appId> --from-file ./data-sources.json --json# Fieldsdocyrus studio list-fields --appSlug crm --dataSourceSlug contacts --jsondocyrus studio get-field --appSlug crm --dataSourceSlug contacts --fieldSlug email --jsondocyrus studio create-field --appId <appId> --dataSourceId <dataSourceId> --name "Email" --slug "email" --type "text" --jsondocyrus studio update-field --appId <appId> --dataSourceId <dataSourceId> --fieldId <fieldId> --data '{"name":"Primary Email"}' --jsondocyrus studio delete-field --appId <appId> --dataSourceId <dataSourceId> --fieldSlug email --jsondocyrus studio create-fields-batch --appId <appId> --dataSourceId <dataSourceId> --data '[{"name":"Status","slug":"status","type":"text"}]' --jsondocyrus studio update-fields-batch --appId <appId> --dataSourceId <dataSourceId> --from-file ./fields-update.json --jsondocyrus studio delete-fields-batch --appId <appId> --dataSourceId <dataSourceId> --data '["field-1","field-2"]' --json# Enumsdocyrus studio list-enums --appId <appId> --dataSourceId <dataSourceId> --fieldId <fieldId> --jsondocyrus studio create-enums --appId <appId> --dataSourceId <dataSourceId> --fieldId <fieldId> --data '[{"name":"Open","sortOrder":1}]' --jsondocyrus studio update-enums --appId <appId> --dataSourceId <dataSourceId> --fieldId <fieldId> --from-file ./enums-update.json --jsondocyrus studio delete-enums --appId <appId> --dataSourceId <dataSourceId> --fieldId <fieldId> --data '["enum-1","enum-2"]' --json# Data views (/v1/apps/:appSlug/data-sources/:dataSourceSlug/views)docyrus studio list-data-views --appSlug crm --dataSourceSlug contacts --jsondocyrus studio get-data-view --appSlug crm --dataSourceSlug contacts --viewId <viewId> --jsondocyrus studio create-data-view --appSlug crm --dataSourceSlug contacts --name "Active customers" \--filters '{"rules":[{"field":"status","operator":"=","value":"active"}]}' --isDefault --jsondocyrus studio update-data-view --appSlug crm --dataSourceSlug contacts --viewId <viewId> --data '{"name":"Renamed view"}' --jsondocyrus studio delete-data-view --appSlug crm --dataSourceSlug contacts --viewId <viewId> --json# Forms (/v1/apps/:appSlug/data-sources/:dataSourceSlug/forms)docyrus studio list-forms --appSlug crm --dataSourceSlug contacts --jsondocyrus studio get-form --appSlug crm --dataSourceSlug contacts --formId <formId> --jsondocyrus studio create-form --appSlug crm --dataSourceSlug contacts --name "Lead intake" --title "New lead" --jsondocyrus studio update-form --appSlug crm --dataSourceSlug contacts --formId <formId> --data '{"title":"Renamed"}' --jsondocyrus studio delete-form --appSlug crm --dataSourceSlug contacts --formId <formId> --json# Webforms (/v1/dev/webforms)docyrus studio list-webforms --jsondocyrus studio list-webforms --appSlug crm --dataSourceSlug contacts --jsondocyrus studio get-webform --webformId <webformId> --jsondocyrus studio create-webform --name "Contact form" --schema '{"components":[]}' --status 1 --jsondocyrus studio create-webform --appSlug crm --dataSourceSlug contacts --from-file ./contact-webform.json --jsondocyrus studio update-webform --webformId <webformId> --data '{"name":"Renamed"}' --jsondocyrus studio delete-webform --webformId <webformId> --json# HTML / PDF / DOCX export templates (/v1/dev/html-templates)docyrus studio list-html-templates --appSlug crm --dataSourceSlug contacts --limit 10 --jsondocyrus studio get-html-template --templateId <templateId> --jsondocyrus studio create-html-template --appSlug crm --dataSourceSlug contacts \--name "Invoice" --sourceType pdf --pageFormat A4 --pageOrientation portrait \--body "<h1>{{ company.name }}</h1>" --isDefault --jsondocyrus studio update-html-template --templateId <templateId> --data '{"name":"Invoice v2"}' --jsondocyrus studio delete-html-template --templateId <templateId> --json# Email templates (/v1/dev/email-templates)docyrus studio list-email-templates --jsondocyrus studio get-email-template --templateId <templateId> --jsondocyrus studio create-email-template --name "Welcome" --subject "Hello {{ user.name }}" --body "<p>Hi</p>" --jsondocyrus studio update-email-template --templateId <templateId> --data '{"subject":"Hi {{ user.name }}"}' --jsondocyrus studio delete-email-template --templateId <templateId> --json
Connectors and Actions (connect)
Connectors are external integration providers (e.g. Meta WhatsApp, Microsoft Graph, Salesforce). Use the connect subcommands to find connectors, inspect their data sources and actions, check connection status, send requests through their auth configuration, and run actions.
Discovery workflow:
# 1. Search for connectors by keyworddocyrus connect list-connectors --q whatsapp --json# 2. Get connector details (data sources + actions)docyrus connect get-connector meta-whatsapp --json# 3. Get full action details with input/output schemasdocyrus connect get-action meta-whatsapp sendWhatsappMessage --json# 4. Check if tenant/user has active connectionsdocyrus connect list-connections meta-whatsapp --json
Send requests through connector auth (`curl`):
The connect curl command sends HTTP requests to external providers using the connector's stored auth credentials (OAuth tokens, API keys, base URL).
# GET request with query paramsdocyrus connect curl meta-whatsapp \"433457363182570/phone_numbers" \-d '{"fields":"id,display_phone_number,verified_name"}' --json# POST request (send WhatsApp message)docyrus connect curl meta-whatsapp \"418088118057836/messages" \-X POST \-d '{"messaging_product":"whatsapp","to":"905551234567","type":"template","template":{"name":"sample_template","language":{"code":"en_US"}}}' \--contentType "application/json" --json# With explicit auth header overridedocyrus connect curl meta-whatsapp \"me/businesses" \--headers '{"Authorization":"Bearer <token>"}' \-d '{"fields":"id,name"}' --json# With connection ID overridedocyrus connect curl meta-whatsapp \"some/endpoint" \-c <connection-uuid> --json
Aliases: -X (method), -d (data), -c (connectionId).
Run actions:
The connect run-action command runs predefined connector or app actions via POST /v1/apps/:appSlug/actions/:actionKey/run.
# Run an action with parametersdocyrus connect run-action base sendWhatsappMessage \--params '{"to":"905551234567","templateName":"hello_world"}' --json# Dry run — preview request without executingdocyrus connect run-action base sendWhatsappMessage \--params '{"to":"905551234567"}' --dryRun --json# With connection overridedocyrus connect run-action base sendWhatsappMessage \-p '{"to":"905551234567"}' -c <connection-uuid> --json
Aliases: -p (params), -c (connectionId), -n (dryRun).
Arbitrary API Calls
docyrus curl /v1/users/medocyrus curl /v1/apps -X GET --format jsondocyrus curl /v1/some/endpoint -X POST -d '{"key":"value"}'
Terminal UI
Launch the OpenTUI interface:
docyrus tui
It requires Bun installed locally. The TUI reuses the existing CLI command graph.
Key Rules
- Settings are project-local by default in
./.docyrus/; use-gor--globalfor~/.docyrus/ - The CLI uses named environments, not
API_BASE_URL apps listuses/v1/appsdscommands useappSluganddataSourceSlugds createandds updateaccept--dataJSON or--from-file(.jsonor.csv), but not both- Array payloads use bulk endpoints with a maximum of 50 items
- Bulk update requires
idin every item and must not include positional<recordId> --filtersaccepts a JSON filter group such as{"combinator":"and","rules":[...]}- Related-field filters use
rel_<relation_slug>/<field_slug> --columnssupports relation expansion(), spread..., aliasing:, and functions@--formatsupportstoon,json,yaml,md, andjsonl- Successful responses inject
contextwithemail,tenantName,tenantNo, andtenantDisplay - Studio selectors are exclusive pairs: exactly one of
--appId|--appSlug,--dataSourceId|--dataSourceSlug, and--fieldId|--fieldSlugas required - Studio write commands accept
--dataor--from-file(JSON only), and explicit flags override overlapping JSON keys studiodata-view and form commands route through/v1/apps/:appSlug/data-sources/:dataSourceSlug/...; the CLI bidirectionally resolves between id and slug, so pass either sidestudiowebform commands route through/v1/dev/webforms; CRUD uses--webformId, and create/list accept either--dataSourceIdor--dataSourceSlug(slug requires--appIdor--appSlug)studiohtml-template and email-template commands route through/v1/dev/html-templatesand/v1/dev/email-templates; CRUD uses--templateId, and the optional data-source binding accepts either--dataSourceIdor--dataSourceSlug(slug requires--appIdor--appSlug)connectsubcommands use the/v1/connectorsAPI endpoints, not the OpenAPI specconnect curlsends requests through the connector's provider auth (OAuth tokens, base URL); the--headersoption can override the Authorization headerconnect curldata is sent as body for POST/PUT/PATCH and as query params for GETconnect run-actionruns actions via/v1/apps/:appSlug/actions/:actionKey/runwith--paramsas the JSON body
References
- [CLI Manifest](references/cli-manifest.md) — Complete command reference with flags, arguments, and command notes.
- [List Query Examples](references/list-query-examples.md) — Practical
ds listexamples covering columns, filters, sorting, pagination, and combined queries.