From b704232e88c59307012b21ae8c8c684b087c27f9 Mon Sep 17 00:00:00 2001 From: Jonathan Norris Date: Tue, 15 Jul 2025 17:06:15 -0400 Subject: [PATCH 01/10] feat: add dashboard links and output schemas to environmentTools.ts --- oclif.manifest.json | 2 +- src/mcp/tools/environmentTools.ts | 173 +++++++++++++++++++++++++++++- src/mcp/utils/api.ts | 25 +++++ 3 files changed, 195 insertions(+), 5 deletions(-) diff --git a/oclif.manifest.json b/oclif.manifest.json index ee18e43e6..790e81773 100644 --- a/oclif.manifest.json +++ b/oclif.manifest.json @@ -1,5 +1,5 @@ { - "version": "5.21.0", + "version": "5.21.1", "commands": { "authCommand": { "id": "authCommand", diff --git a/src/mcp/tools/environmentTools.ts b/src/mcp/tools/environmentTools.ts index a71fd4e8f..ee588680d 100644 --- a/src/mcp/tools/environmentTools.ts +++ b/src/mcp/tools/environmentTools.ts @@ -14,6 +14,18 @@ import { } from '../types' import { ToolHandler } from '../server' +// Helper function to generate environment dashboard links +const generateEnvironmentDashboardLink = ( + orgId: string, + projectKey: string, +): string => { + return `https://app.devcycle.com/o/${orgId}/settings/p/${projectKey}/environments` +} + +// ============================================================================= +// INPUT SCHEMAS +// ============================================================================= + // Reusable schema components const ENVIRONMENT_KEY_PROPERTY = { type: 'string' as const, @@ -78,6 +90,151 @@ const ENVIRONMENT_COMMON_PROPERTIES = { }, } +// ============================================================================= +// OUTPUT SCHEMAS +// ============================================================================= + +// Shared SDK key properties +const SDK_KEY_PROPERTIES = { + mobile: { + type: 'string' as const, + description: 'Mobile SDK key for client-side mobile applications', + }, + server: { + type: 'string' as const, + description: 'Server SDK key for server-side applications', + }, + client: { + type: 'string' as const, + description: 'Client SDK key for client-side web applications', + }, +} + +// Output schema components +const SDK_KEYS_OBJECT_SCHEMA = { + type: 'object' as const, + description: 'SDK keys for mobile, server, and client applications', + properties: SDK_KEY_PROPERTIES, + required: ['mobile', 'server', 'client'], +} + +const ENVIRONMENT_OBJECT_SCHEMA = { + type: 'object' as const, + description: 'A DevCycle environment configuration', + properties: { + _id: { + type: 'string' as const, + description: 'Unique identifier for the environment', + }, + key: { + type: 'string' as const, + description: 'The environment key (unique, immutable)', + }, + name: { + type: 'string' as const, + description: 'Display name of the environment', + }, + description: { + type: 'string' as const, + description: 'Optional description of the environment', + }, + color: { + type: 'string' as const, + description: 'Color used to represent this environment in the UI', + }, + type: { + type: 'string' as const, + description: + 'Environment type (e.g., development, staging, production)', + }, + settings: { + type: 'object' as const, + description: 'Environment-specific configuration settings', + }, + sdkKeys: SDK_KEYS_OBJECT_SCHEMA, + createdAt: { + type: 'string' as const, + description: 'ISO timestamp when the environment was created', + }, + updatedAt: { + type: 'string' as const, + description: 'ISO timestamp when the environment was last updated', + }, + }, + required: [ + '_id', + 'key', + 'name', + 'type', + 'sdkKeys', + 'createdAt', + 'updatedAt', + ], +} + +const DASHBOARD_LINK_PROPERTY = { + type: 'string' as const, + format: 'uri' as const, + description: + 'URL to view and manage environments in the DevCycle dashboard', +} + +// Complete output schema definitions +const LIST_ENVIRONMENTS_OUTPUT_SCHEMA = { + type: 'object' as const, + description: + 'Response containing a list of environments and dashboard link', + properties: { + result: { + type: 'array' as const, + description: 'Array of environment objects in the project', + items: ENVIRONMENT_OBJECT_SCHEMA, + }, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], +} + +const GET_SDK_KEYS_OUTPUT_SCHEMA = { + type: 'object' as const, + description: 'Response containing SDK keys and dashboard link', + properties: { + result: { + type: 'object' as const, + description: + 'SDK keys for the requested environment (filtered by keyType if specified)', + properties: SDK_KEY_PROPERTIES, + }, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], +} + +const CREATE_ENVIRONMENT_OUTPUT_SCHEMA = { + type: 'object' as const, + description: + 'Response containing the newly created environment and dashboard link', + properties: { + result: ENVIRONMENT_OBJECT_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], +} + +const UPDATE_ENVIRONMENT_OUTPUT_SCHEMA = { + type: 'object' as const, + description: + 'Response containing the updated environment and dashboard link', + properties: { + result: ENVIRONMENT_OBJECT_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], +} + +// ============================================================================= +// TOOL DEFINITIONS +// ============================================================================= export const environmentToolDefinitions: Tool[] = [ { name: 'list_environments', @@ -86,6 +243,7 @@ export const environmentToolDefinitions: Tool[] = [ type: 'object', properties: PAGINATION_PROPERTIES, }, + outputSchema: LIST_ENVIRONMENTS_OUTPUT_SCHEMA, }, { name: 'get_sdk_keys', @@ -102,6 +260,7 @@ export const environmentToolDefinitions: Tool[] = [ }, required: ['environmentKey'], }, + outputSchema: GET_SDK_KEYS_OUTPUT_SCHEMA, }, { name: 'create_environment', @@ -111,6 +270,7 @@ export const environmentToolDefinitions: Tool[] = [ properties: ENVIRONMENT_COMMON_PROPERTIES, required: ['name', 'key'], }, + outputSchema: CREATE_ENVIRONMENT_OUTPUT_SCHEMA, }, { name: 'update_environment', @@ -120,6 +280,7 @@ export const environmentToolDefinitions: Tool[] = [ properties: ENVIRONMENT_COMMON_PROPERTIES, required: ['key'], }, + outputSchema: UPDATE_ENVIRONMENT_OUTPUT_SCHEMA, }, ] @@ -127,18 +288,19 @@ export const environmentToolHandlers: Record = { list_environments: async (args: unknown, apiClient: DevCycleApiClient) => { const validatedArgs = ListEnvironmentsArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'listEnvironments', validatedArgs, async (authToken, projectKey) => { return await fetchEnvironments(authToken, projectKey) }, + generateEnvironmentDashboardLink, ) }, get_sdk_keys: async (args: unknown, apiClient: DevCycleApiClient) => { const validatedArgs = GetSdkKeysArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'getSdkKeys', validatedArgs, async (authToken, projectKey) => { @@ -162,12 +324,13 @@ export const environmentToolHandlers: Record = { } } }, + generateEnvironmentDashboardLink, ) }, create_environment: async (args: unknown, apiClient: DevCycleApiClient) => { const validatedArgs = CreateEnvironmentArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'createEnvironment', validatedArgs, async (authToken, projectKey) => { @@ -177,12 +340,13 @@ export const environmentToolHandlers: Record = { validatedArgs, ) }, + generateEnvironmentDashboardLink, ) }, update_environment: async (args: unknown, apiClient: DevCycleApiClient) => { const validatedArgs = UpdateEnvironmentArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'updateEnvironment', validatedArgs, async (authToken, projectKey) => { @@ -194,6 +358,7 @@ export const environmentToolHandlers: Record = { updateParams, ) }, + generateEnvironmentDashboardLink, ) }, } diff --git a/src/mcp/utils/api.ts b/src/mcp/utils/api.ts index 84073896a..8c166eb17 100644 --- a/src/mcp/utils/api.ts +++ b/src/mcp/utils/api.ts @@ -67,6 +67,31 @@ export class DevCycleApiClient { } } + /** + * Helper method to execute API calls and include dashboard links in the response + */ + public async executeWithDashboardLink( + operationName: string, + args: any, + operation: (authToken: string, projectKey: string) => Promise, + dashboardLink: (orgId: string, projectKey: string) => string, + ): Promise<{ result: T; dashboardLink: string }> { + const result = await this.executeWithLogging( + operationName, + args, + operation, + ) + + const organizationId = this.auth.getOrgId() + const projectKey = this.auth.getProjectKey() + const link = dashboardLink(organizationId, projectKey) + + return { + result, + dashboardLink: link, + } + } + public getAuth(): DevCycleAuth { return this.auth } From 0c415957cb693290d84cbda95dd1abee85bd0478 Mon Sep 17 00:00:00 2001 From: Jonathan Norris Date: Tue, 15 Jul 2025 17:31:34 -0400 Subject: [PATCH 02/10] feat: dashboard links working --- oclif.manifest.json | 5995 ----------------------------- src/mcp/tools/environmentTools.ts | 12 +- 2 files changed, 8 insertions(+), 5999 deletions(-) delete mode 100644 oclif.manifest.json diff --git a/oclif.manifest.json b/oclif.manifest.json deleted file mode 100644 index 790e81773..000000000 --- a/oclif.manifest.json +++ /dev/null @@ -1,5995 +0,0 @@ -{ - "version": "5.21.1", - "commands": { - "authCommand": { - "id": "authCommand", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": true, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "org": { - "name": "org", - "type": "option", - "description": "The name or ID of the org to sign into", - "multiple": false - } - }, - "args": {} - }, - "base": { - "id": "base", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": true, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": {} - }, - "createCommand": { - "id": "createCommand", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": true, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "key": { - "name": "key", - "type": "option", - "description": "Unique ID", - "multiple": false - }, - "name": { - "name": "name", - "type": "option", - "description": "Human readable name", - "multiple": false - } - }, - "args": {} - }, - "getCommand": { - "id": "getCommand", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": true, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "sortBy": { - "name": "sortBy", - "type": "option", - "description": "Sort By", - "multiple": false, - "options": [ - "key", - "name", - "updatedAt", - "createdAt" - ] - }, - "sortOrder": { - "name": "sortOrder", - "type": "option", - "description": "Sort Order", - "multiple": false, - "options": [ - "asc", - "desc" - ] - } - }, - "args": {} - }, - "updateCommand": { - "id": "updateCommand", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": true, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": {} - }, - "updateCommandWithCommonProperties": { - "id": "updateCommandWithCommonProperties", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": true, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "name": { - "name": "name", - "type": "option", - "description": "Human readable name", - "multiple": false - } - }, - "args": { - "key": { - "name": "key" - } - } - }, - "wink": { - "id": "wink", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": true, - "aliases": [], - "hiddenAliases": [], - "flags": {}, - "args": {} - }, - "alias:add": { - "id": "alias:add", - "description": "Add a variable alias to the repo configuration", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "examples": [ - "<%= config.bin %> <%= command.id %>", - "<%= config.bin %> <%= command.id %> --alias=VARIABLE_ALIAS --variable=variable-key" - ], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "alias": { - "name": "alias", - "type": "option", - "description": "The alias used in the code", - "multiple": false - }, - "variable": { - "name": "variable", - "type": "option", - "description": "The DevCycle variable key", - "multiple": false - } - }, - "args": {} - }, - "cleanup": { - "id": "cleanup", - "description": "Replace a DevCycle variable with a static value in the current version of your code. Currently only JavaScript is supported.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "examples": [ - "<%= config.bin %> <%= command.id %>", - "<%= config.bin %> <%= command.id %> my-variable-key --value true --type Boolean", - "<%= config.bin %> <%= command.id %> some-var --value \"My Custom Name\" --type String" - ], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "value": { - "name": "value", - "type": "option", - "description": "Value to use in place of variable.", - "multiple": false - }, - "type": { - "name": "type", - "type": "option", - "description": "The type of the value that will be replacing the variable. Valid values include: String, Boolean, Number, JSON", - "multiple": false, - "options": [ - "String", - "Boolean", - "Number", - "JSON" - ] - }, - "include": { - "name": "include", - "type": "option", - "description": "Files to include when scanning for variables to cleanup. By default all files are included. Accepts multiple glob patterns.", - "multiple": true - }, - "exclude": { - "name": "exclude", - "type": "option", - "description": "Files to exclude when scanning for variables to cleanup. By default all files are included. Accepts multiple glob patterns.", - "multiple": true - }, - "output": { - "name": "output", - "type": "option", - "description": "Where the refactored code will be output. By default it overwrites the source file.", - "multiple": false, - "options": [ - "console", - "file" - ], - "default": "file" - }, - "var-alias": { - "name": "var-alias", - "type": "option", - "description": "Aliases to use when identifying variables in your code. Should contain a code reference mapped to a DevCycle variable key, eg. \"--var-alias \"VARIABLES.ENABLE_V1=enable-v1\"", - "multiple": true - } - }, - "args": { - "key": { - "name": "key", - "description": "Key of variable to replace." - } - } - }, - "diff": { - "id": "diff", - "description": "Print a diff of DevCycle variable usage between two versions of your code.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "examples": [ - "<%= config.bin %> <%= command.id %>", - "<%= config.bin %> <%= command.id %> --match-pattern js=\"dvcClient\\.variable\\(\\s*[\"']([^\"']*)[\"']\"" - ], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "include": { - "name": "include", - "type": "option", - "description": "Files to include in the diff. By default all files are included. Accepts multiple glob patterns.", - "multiple": true - }, - "exclude": { - "name": "exclude", - "type": "option", - "description": "Files to exclude in the diff. By default all files are included. Accepts multiple glob patterns.", - "multiple": true - }, - "file": { - "name": "file", - "type": "option", - "char": "f", - "description": "File path of existing diff file to inspect.", - "multiple": false - }, - "client-name": { - "name": "client-name", - "type": "option", - "description": "Name(s) of the DevCycle client variable to match on. Accepts multiple values.", - "multiple": true - }, - "match-pattern": { - "name": "match-pattern", - "type": "option", - "description": "Additional full Regex pattern to use to match variable usages in your code. Should contain exactly one capture group which matches on the key of the variable. Must specify the file extension to override the pattern for, eg. \"--match-pattern js=\"", - "multiple": true - }, - "var-alias": { - "name": "var-alias", - "type": "option", - "description": "Aliases to use when identifying variables in your code. Should contain a code reference mapped to a DevCycle variable key, eg. \"--var-alias \"VARIABLES.ENABLE_V1=enable-v1\"", - "multiple": true - }, - "pr-link": { - "name": "pr-link", - "type": "option", - "description": "Link to the PR to use for formatting the line number outputs with clickable links.", - "hidden": true, - "multiple": false - }, - "format": { - "name": "format", - "type": "option", - "description": "Format to use when outputting the diff results.", - "multiple": false, - "options": [ - "console", - "markdown", - "markdown-no-html" - ], - "default": "console" - }, - "show-regex": { - "name": "show-regex", - "type": "boolean", - "description": "Output the regex pattern used to find variable usage", - "allowNo": false - } - }, - "args": { - "diff-pattern": { - "name": "diff-pattern", - "description": "A \"git diff\"-compatible diff pattern, eg. \"branch1 branch2\"" - } - } - }, - "environments:create": { - "id": "environments:create", - "description": "Create a new Environment for an existing Feature.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "key": { - "name": "key", - "type": "option", - "description": "Unique ID", - "multiple": false - }, - "name": { - "name": "name", - "type": "option", - "description": "Human readable name", - "multiple": false - }, - "type": { - "name": "type", - "type": "option", - "description": "The type of environment", - "multiple": false, - "options": [ - "development", - "staging", - "production", - "disaster_recovery" - ] - }, - "description": { - "name": "description", - "type": "option", - "description": "Description for the dashboard", - "multiple": false - } - }, - "args": {} - }, - "environments:get": { - "id": "environments:get", - "description": "Retrieve Environments from the management API", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "examples": [ - "<%= config.bin %> <%= command.id %>", - "<%= config.bin %> <%= command.id %> --keys=environment-one,environment-two" - ], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "keys": { - "name": "keys", - "type": "option", - "description": "Comma-separated list of environment keys to fetch details for", - "multiple": false - } - }, - "args": {} - }, - "environments:list": { - "id": "environments:list", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [ - "environments:ls" - ], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": {} - }, - "environments:update": { - "id": "environments:update", - "description": "Update a Environment.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "name": { - "name": "name", - "type": "option", - "description": "Human readable name", - "multiple": false - }, - "key": { - "name": "key", - "type": "option", - "description": "Unique ID", - "multiple": false - }, - "type": { - "name": "type", - "type": "option", - "description": "The type of environment", - "multiple": false, - "options": [ - "development", - "staging", - "production", - "disaster_recovery" - ] - }, - "description": { - "name": "description", - "type": "option", - "description": "Description for the environment", - "multiple": false - } - }, - "args": { - "key": { - "name": "key" - } - } - }, - "features:create": { - "id": "features:create", - "description": "Create a new Feature.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "key": { - "name": "key", - "type": "option", - "description": "Unique ID", - "multiple": false - }, - "name": { - "name": "name", - "type": "option", - "description": "Human readable name", - "multiple": false - }, - "variables": { - "name": "variables", - "type": "option", - "description": "The variables to create for the feature", - "multiple": false - }, - "variations": { - "name": "variations", - "type": "option", - "description": "The variations to set for the feature", - "multiple": false - }, - "sdkVisibility": { - "name": "sdkVisibility", - "type": "option", - "description": "The visibility of the feature for the SDKs", - "multiple": false - }, - "interactive": { - "name": "interactive", - "type": "boolean", - "char": "i", - "description": "Interactive Feature Creation Mode", - "allowNo": false - } - }, - "args": {} - }, - "features:delete": { - "id": "features:delete", - "description": "Delete a feature", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": { - "feature": { - "name": "feature", - "description": "Feature key or id to delete" - } - } - }, - "features:get": { - "id": "features:get", - "description": "Retrieve Features from the Management API", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "examples": [ - "<%= config.bin %> <%= command.id %>", - "<%= config.bin %> <%= command.id %> --keys=feature-one,feature-two" - ], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "keys": { - "name": "keys", - "type": "option", - "description": "Comma-separated list of feature keys to fetch details for", - "multiple": false - }, - "search": { - "name": "search", - "type": "option", - "description": "Filter features by search query", - "multiple": false - }, - "page": { - "name": "page", - "type": "option", - "description": "Page number to fetch", - "multiple": false - }, - "per-page": { - "name": "per-page", - "type": "option", - "description": "Number of features to fetch per page", - "multiple": false - } - }, - "args": {} - }, - "features:list": { - "id": "features:list", - "description": "View all features in a project", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [ - "features:ls" - ], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "search": { - "name": "search", - "type": "option", - "description": "Filter features by search query", - "multiple": false - }, - "page": { - "name": "page", - "type": "option", - "description": "Page number to fetch", - "multiple": false - }, - "per-page": { - "name": "per-page", - "type": "option", - "description": "Number of features to fetch per page", - "multiple": false - } - }, - "args": {} - }, - "features:update": { - "id": "features:update", - "description": "Update a Feature.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "name": { - "name": "name", - "type": "option", - "description": "Human readable name", - "multiple": false - }, - "variables": { - "name": "variables", - "type": "option", - "description": "The variables to set for the feature", - "multiple": false - }, - "variations": { - "name": "variations", - "type": "option", - "description": "The variations to set for the feature", - "multiple": false - }, - "sdkVisibility": { - "name": "sdkVisibility", - "type": "option", - "description": "The visibility of the feature for the SDKs", - "multiple": false - }, - "key": { - "name": "key", - "type": "option", - "description": "The unique key of the feature", - "multiple": false - }, - "description": { - "name": "description", - "type": "option", - "description": "A description of the feature", - "multiple": false - } - }, - "args": { - "key": { - "name": "key" - } - } - }, - "generate:types": { - "id": "generate:types", - "description": "Generate Variable Types from the management API", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "output-dir": { - "name": "output-dir", - "type": "option", - "description": "Directory to output the generated types to", - "multiple": false, - "default": "." - }, - "react": { - "name": "react", - "type": "boolean", - "description": "Generate types for use with React", - "allowNo": false, - "deprecated": { - "message": "The React SDK since v1.30.0 does not require this flag. Its types can be augmented automatically" - } - }, - "nextjs": { - "name": "nextjs", - "type": "boolean", - "description": "Generate types for use with Next.js", - "allowNo": false, - "deprecated": { - "message": "The Next.js SDK since v2.7.0 does not require this flag. Its types can be augmented automatically" - } - }, - "no-declaration": { - "name": "no-declaration", - "type": "boolean", - "description": "Do not generate a \"declare module\" statement that automatically overrides SDK types.", - "allowNo": false - }, - "old-repos": { - "name": "old-repos", - "type": "boolean", - "description": "Generate types for use with old DevCycle repos (@devcycle/devcycle-react-sdk, @devcycle/devcycle-js-sdk)", - "allowNo": false - }, - "inline-comments": { - "name": "inline-comments", - "type": "boolean", - "description": "Inline variable informaton comment on the same line as the type definition", - "hidden": true, - "allowNo": false - }, - "include-descriptions": { - "name": "include-descriptions", - "type": "boolean", - "description": "Include variable descriptions in the variable information comment", - "allowNo": false - }, - "strict-custom-data": { - "name": "strict-custom-data", - "type": "boolean", - "description": "Generate stricter custom data types", - "allowNo": false - }, - "obfuscate": { - "name": "obfuscate", - "type": "boolean", - "description": "Obfuscate the variable keys.", - "allowNo": false - }, - "include-deprecation-warnings": { - "name": "include-deprecation-warnings", - "type": "boolean", - "description": "Include @deprecated tags for variables of completed features", - "allowNo": false - } - }, - "args": {} - }, - "identity:get": { - "id": "identity:get", - "description": "Print your DevCycle Identity.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": {} - }, - "identity:update": { - "id": "identity:update", - "description": "Update your DevCycle Identity.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "userId": { - "name": "userId", - "type": "option", - "description": "DevCycle Identity User ID to be used for Overrides & Self-Targeting", - "multiple": false - }, - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": {} - }, - "keys:get": { - "id": "keys:get", - "description": "Retrieve SDK keys from the Management API.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "examples": [ - "<%= config.bin %> <%= command.id %>", - "<%= config.bin %> <%= command.id %> --keys=environment-one,environment-two" - ], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "env": { - "name": "env", - "type": "option", - "description": "Environment to fetch a key for", - "multiple": false - }, - "type": { - "name": "type", - "type": "option", - "description": "The type of SDK key to retrieve", - "multiple": false, - "options": [ - "mobile", - "client", - "server" - ] - } - }, - "args": {} - }, - "login:again": { - "id": "login:again", - "description": "Log in through the DevCycle Universal Login, using saved credentials only.This will open a browser window.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "examples": [ - "<%= config.bin %> <%= command.id %>" - ], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "org": { - "name": "org", - "type": "option", - "description": "The name or ID of the org to sign into", - "multiple": false - } - }, - "args": {} - }, - "login:sso": { - "id": "login:sso", - "description": "Log in through the DevCycle Universal Login. This will open a browser window.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "examples": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "org": { - "name": "org", - "type": "option", - "description": "The name or ID of the org to sign into", - "multiple": false - } - }, - "args": {} - }, - "logout": { - "id": "logout", - "description": "Discards any auth configuration that has been stored in the auth configuration file.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "examples": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": {} - }, - "organizations:get": { - "id": "organizations:get", - "description": "Retrieve Organizations available to the current user", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": {} - }, - "organizations:list": { - "id": "organizations:list", - "description": "List the keys of all organizations available to the current user", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [ - "organizations:ls" - ], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": {} - }, - "organizations:select": { - "id": "organizations:select", - "description": "Select which organization to access through the API", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "org": { - "name": "org", - "type": "option", - "description": "The name or ID of the org to sign into", - "multiple": false - } - }, - "args": {} - }, - "overrides:clear": { - "id": "overrides:clear", - "description": "Clear Overrides for a given Feature or Project.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "all": { - "name": "all", - "type": "boolean", - "description": "All Overrides for the Project", - "allowNo": false - }, - "feature": { - "name": "feature", - "type": "option", - "description": "The key or id of the Feature to clear the Override for", - "multiple": false - }, - "environment": { - "name": "environment", - "type": "option", - "description": "The key or id of the Environment to clear the Override for", - "multiple": false - }, - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": {} - }, - "overrides:get": { - "id": "overrides:get", - "description": "View the Overrides associated with your DevCycle Identity in your current project.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "feature": { - "name": "feature", - "type": "option", - "description": "The key or id of the Feature to get Overrides for", - "multiple": false - }, - "environment": { - "name": "environment", - "type": "option", - "description": "The key or id of the Environment to get Overrides for", - "multiple": false - }, - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": {} - }, - "overrides:list": { - "id": "overrides:list", - "description": "View the Overrides associated with your DevCycle Identity in your current project.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [ - "overrides:ls" - ], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "columns": { - "name": "columns", - "type": "option", - "description": "only show provided columns (comma-separated)", - "multiple": false, - "exclusive": [ - "extended" - ] - }, - "sort": { - "name": "sort", - "type": "option", - "description": "property to sort by (prepend '-' for descending)", - "multiple": false - }, - "filter": { - "name": "filter", - "type": "option", - "description": "filter property by partial string matching, ex: name=foo", - "multiple": false - }, - "csv": { - "name": "csv", - "type": "boolean", - "description": "output is csv format [alias: --output=csv]", - "allowNo": false, - "exclusive": [ - "no-truncate" - ] - }, - "output": { - "name": "output", - "type": "option", - "description": "output in a more machine friendly format", - "multiple": false, - "options": [ - "csv", - "json", - "yaml" - ], - "exclusive": [ - "no-truncate", - "csv" - ] - }, - "extended": { - "name": "extended", - "type": "boolean", - "char": "x", - "description": "show extra columns", - "allowNo": false, - "exclusive": [ - "columns" - ] - }, - "no-truncate": { - "name": "no-truncate", - "type": "boolean", - "description": "do not truncate output to fit screen", - "allowNo": false, - "exclusive": [ - "csv" - ] - }, - "no-header": { - "name": "no-header", - "type": "boolean", - "description": "hide table header from output", - "allowNo": false, - "exclusive": [ - "csv" - ] - } - }, - "args": {} - }, - "overrides:update": { - "id": "overrides:update", - "description": "Update an Override", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "examples": [ - "<%= config.bin %> <%= command.id %> --feature feature-key --environment env-key --variation variation-key" - ], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "feature": { - "name": "feature", - "type": "option", - "description": "The feature to update an Override for", - "multiple": false - }, - "environment": { - "name": "environment", - "type": "option", - "description": "The environment to update an Override for", - "multiple": false - }, - "variation": { - "name": "variation", - "type": "option", - "description": "The variation that will be used as the Override", - "multiple": false - } - }, - "args": {} - }, - "projects:create": { - "id": "projects:create", - "description": "Create a new Project", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "key": { - "name": "key", - "type": "option", - "description": "Unique ID", - "multiple": false - }, - "name": { - "name": "name", - "type": "option", - "description": "Human readable name", - "multiple": false - }, - "description": { - "name": "description", - "type": "option", - "description": "Description for the dashboard", - "multiple": false - } - }, - "args": {} - }, - "projects:current": { - "id": "projects:current", - "description": "View currently selected project", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": {} - }, - "projects:get": { - "id": "projects:get", - "description": "Retrieve all projects in the current Organization", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "sortBy": { - "name": "sortBy", - "type": "option", - "description": "Sort By", - "multiple": false, - "options": [ - "key", - "name", - "updatedAt", - "createdAt" - ] - }, - "sortOrder": { - "name": "sortOrder", - "type": "option", - "description": "Sort Order", - "multiple": false, - "options": [ - "asc", - "desc" - ] - } - }, - "args": {} - }, - "projects:list": { - "id": "projects:list", - "description": "List the keys of all projects in the current Organization", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [ - "projects:ls" - ], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": {} - }, - "projects:select": { - "id": "projects:select", - "description": "Select which project to access through the API", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "org": { - "name": "org", - "type": "option", - "description": "The name or ID of the org to sign into", - "multiple": false - } - }, - "args": {} - }, - "repo:init": { - "id": "repo:init", - "description": "Create the repo configuration file. This will open a browser window.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "examples": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "org": { - "name": "org", - "type": "option", - "description": "The name or ID of the org to sign into", - "multiple": false - } - }, - "args": {} - }, - "status": { - "id": "status", - "description": "Print CLI version information, configuration file locations and auth status.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": {} - }, - "targeting:disable": { - "id": "targeting:disable", - "description": "Disable the Targeting for the specified Environment on a Feature", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "examples": [ - "<%= config.bin %> <%= command.id %> feature-one environment-one" - ], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": { - "feature": { - "name": "feature", - "description": "The Feature for the Targeting Rules" - }, - "environment": { - "name": "environment", - "description": "The Environment where the Targeting Rules will be enabled" - } - } - }, - "targeting:enable": { - "id": "targeting:enable", - "description": "Enable the Targeting for the specified Environment on a Feature", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "examples": [ - "<%= config.bin %> <%= command.id %> feature-one environment-one" - ], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": { - "feature": { - "name": "feature", - "description": "The Feature for the Targeting Rules" - }, - "environment": { - "name": "environment", - "description": "The Environment where the Targeting Rules will be enabled" - } - } - }, - "targeting:get": { - "id": "targeting:get", - "description": "Retrieve Targeting for a Feature from the Management API", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "examples": [ - "<%= config.bin %> <%= command.id %> feature-one", - "<%= config.bin %> <%= command.id %> feature-one environment-one" - ], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": { - "feature": { - "name": "feature", - "description": "The Feature to get the Targeting Rules" - }, - "environment": { - "name": "environment", - "description": "The Environment to get the Targeting Rules", - "required": false - } - } - }, - "targeting:update": { - "id": "targeting:update", - "description": "Update Targeting rules for a Feature. The definition is the audience for the feature, while serve is the key of the variation to serve to the audience.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "targets": { - "name": "targets", - "type": "option", - "description": "List of targeting rules.", - "multiple": false - }, - "status": { - "name": "status", - "type": "option", - "description": "The status to set the targeting rule to.", - "multiple": false, - "options": [ - "enable", - "disable" - ] - } - }, - "args": { - "feature": { - "name": "feature", - "description": "The Feature for the Targeting Rule." - }, - "environment": { - "name": "environment", - "description": "The Environment where the Targeting Rule will be updated." - } - } - }, - "usages": { - "id": "usages", - "description": "Print all DevCycle variable usages in the current version of your code.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "examples": [ - "<%= config.bin %> <%= command.id %>", - "<%= config.bin %> <%= command.id %> --match-pattern js=\"dvcClient\\.variable\\(\\s*[\"']([^\"']*)[\"']\"" - ], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "include": { - "name": "include", - "type": "option", - "description": "Files to include when scanning for usages. By default all files are included. Accepts multiple glob patterns.", - "multiple": true - }, - "exclude": { - "name": "exclude", - "type": "option", - "description": "Files to exclude when scanning for usages. By default all files are included. Accepts multiple glob patterns.", - "multiple": true - }, - "client-name": { - "name": "client-name", - "type": "option", - "description": "Name(s) of the DevCycle client variable to match on. Accepts multiple values.", - "multiple": true - }, - "match-pattern": { - "name": "match-pattern", - "type": "option", - "description": "Additional full Regex pattern to use to match variable usages in your code. Should contain exactly one capture group which matches on the key of the variable. Must specify the file extension to override the pattern for, eg. \"--match-pattern js=\"", - "multiple": true - }, - "var-alias": { - "name": "var-alias", - "type": "option", - "description": "Aliases to use when identifying variables in your code. Should contain a code reference mapped to a DevCycle variable key, eg. \"--var-alias \"VARIABLES.ENABLE_V1=enable-v1\"", - "multiple": true - }, - "format": { - "name": "format", - "type": "option", - "description": "Format to use when outputting the usage results.", - "multiple": false, - "options": [ - "console", - "json" - ], - "default": "console" - }, - "show-regex": { - "name": "show-regex", - "type": "boolean", - "description": "Output the regex pattern used to find variable usage", - "allowNo": false - }, - "only-unused": { - "name": "only-unused", - "type": "boolean", - "description": "Show usages of variables that are not defined in your DevCycle config.", - "allowNo": false - }, - "output": { - "name": "output", - "type": "option", - "char": "o", - "description": "Output file path for JSON format. If not specified, output will be written to stdout.", - "multiple": false - } - }, - "args": {} - }, - "variables:create": { - "id": "variables:create", - "description": "Create a new Variable for an existing Feature.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "key": { - "name": "key", - "type": "option", - "description": "Unique ID", - "multiple": false - }, - "name": { - "name": "name", - "type": "option", - "description": "Human readable name", - "multiple": false - }, - "type": { - "name": "type", - "type": "option", - "description": "The type of variable", - "multiple": false, - "options": [ - "String", - "Boolean", - "Number", - "JSON" - ] - }, - "feature": { - "name": "feature", - "type": "option", - "description": "The key or id of the feature to create the variable for", - "multiple": false - }, - "variations": { - "name": "variations", - "type": "option", - "description": "Set a value for this variable in each variation of the associated feature. Should be a JSON object with the keys being variation keys.", - "multiple": false - }, - "description": { - "name": "description", - "type": "option", - "description": "Description for the dashboard", - "multiple": false - } - }, - "args": {} - }, - "variables:get": { - "id": "variables:get", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "keys": { - "name": "keys", - "type": "option", - "description": "Comma-separated list of variable keys to fetch details for", - "multiple": false - }, - "search": { - "name": "search", - "type": "option", - "description": "Filter variables by search query", - "multiple": false - }, - "page": { - "name": "page", - "type": "option", - "description": "Page number to fetch", - "multiple": false - }, - "per-page": { - "name": "per-page", - "type": "option", - "description": "Number of variables to fetch per page", - "multiple": false - } - }, - "args": {} - }, - "variables:list": { - "id": "variables:list", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [ - "variables:ls" - ], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "search": { - "name": "search", - "type": "option", - "description": "Filter variables by search query", - "multiple": false - }, - "page": { - "name": "page", - "type": "option", - "description": "Page number to fetch", - "multiple": false - }, - "per-page": { - "name": "per-page", - "type": "option", - "description": "Number of variables to fetch per page", - "multiple": false - } - }, - "args": {} - }, - "variables:update": { - "id": "variables:update", - "description": "Update a Variable.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "name": { - "name": "name", - "type": "option", - "description": "Human readable name", - "multiple": false - }, - "description": { - "name": "description", - "type": "option", - "description": "Description for the variable", - "multiple": false - } - }, - "args": { - "key": { - "name": "key" - } - } - }, - "variations:create": { - "id": "variations:create", - "description": "Create a new Variation for an existing Feature.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "examples": [ - "<%= config.bin %> <%= command.id %>", - "<%= config.bin %> <%= command.id %> --variables='{ \"bool-var\": true, \"num-var\": 80, \"string-var\": \"test\" }'" - ], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "key": { - "name": "key", - "type": "option", - "description": "Unique ID", - "multiple": false - }, - "name": { - "name": "name", - "type": "option", - "description": "Human readable name", - "multiple": false - }, - "variables": { - "name": "variables", - "type": "option", - "description": "The variables to create for the variation", - "multiple": false - } - }, - "args": { - "feature": { - "name": "feature", - "description": "Feature key or id" - } - } - }, - "variations:get": { - "id": "variations:get", - "description": "Retrieve variations for a feature from the management API", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": { - "feature": { - "name": "feature", - "description": "Feature key or id" - } - } - }, - "variations:list": { - "id": "variations:list", - "description": "List the keys of all variations in a feature", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [ - "variations:ls" - ], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - } - }, - "args": { - "feature": { - "name": "feature", - "description": "Feature key or id" - } - } - }, - "variations:update": { - "id": "variations:update", - "description": "Update a Variation.", - "strict": true, - "pluginName": "@devcycle/cli", - "pluginAlias": "@devcycle/cli", - "pluginType": "core", - "hidden": false, - "aliases": [], - "hiddenAliases": [], - "flags": { - "config-path": { - "name": "config-path", - "type": "option", - "description": "Override the default location to look for the user.yml file", - "helpGroup": "Global", - "multiple": false - }, - "auth-path": { - "name": "auth-path", - "type": "option", - "description": "Override the default location to look for an auth.yml file", - "helpGroup": "Global", - "multiple": false - }, - "repo-config-path": { - "name": "repo-config-path", - "type": "option", - "description": "Override the default location to look for the repo config.yml file", - "helpGroup": "Global", - "multiple": false - }, - "client-id": { - "name": "client-id", - "type": "option", - "description": "Client ID to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "client-secret": { - "name": "client-secret", - "type": "option", - "description": "Client Secret to use for DevCycle API Authorization", - "helpGroup": "Global", - "multiple": false - }, - "project": { - "name": "project", - "type": "option", - "description": "Project key to use for the DevCycle API requests", - "helpGroup": "Global", - "multiple": false - }, - "no-api": { - "name": "no-api", - "type": "boolean", - "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", - "helpGroup": "Global", - "allowNo": false - }, - "headless": { - "name": "headless", - "type": "boolean", - "description": "Disable all interactive flows and format output for easy parsing.", - "helpGroup": "Global", - "allowNo": false - }, - "caller": { - "name": "caller", - "type": "option", - "description": "The integration that is calling the CLI.", - "hidden": true, - "helpGroup": "Global", - "multiple": false, - "options": [ - "github.pr_insights", - "github.code_usages", - "gitlab.pr_insights", - "gitlab.code_usages", - "bitbucket.pr_insights", - "bitbucket.code_usages", - "cli", - "vscode_extension" - ] - }, - "no-browser-auth": { - "name": "no-browser-auth", - "type": "boolean", - "description": "Disable automatic opening of a browser window", - "hidden": true, - "helpGroup": "Global", - "allowNo": false - }, - "name": { - "name": "name", - "type": "option", - "description": "Human readable name", - "multiple": false - }, - "variables": { - "name": "variables", - "type": "option", - "description": "The variables to create for the variation", - "multiple": false - }, - "key": { - "name": "key", - "type": "option", - "description": "The variation key", - "multiple": false - } - }, - "args": { - "feature": { - "name": "feature", - "description": "Feature key or ID" - }, - "key": { - "name": "key" - } - } - } - } -} \ No newline at end of file diff --git a/src/mcp/tools/environmentTools.ts b/src/mcp/tools/environmentTools.ts index ee588680d..41b9b8b3f 100644 --- a/src/mcp/tools/environmentTools.ts +++ b/src/mcp/tools/environmentTools.ts @@ -238,7 +238,8 @@ const UPDATE_ENVIRONMENT_OUTPUT_SCHEMA = { export const environmentToolDefinitions: Tool[] = [ { name: 'list_environments', - description: 'List environments in the current project', + description: + 'List environments in the current project. Include dashboard link in the response.', inputSchema: { type: 'object', properties: PAGINATION_PROPERTIES, @@ -247,7 +248,8 @@ export const environmentToolDefinitions: Tool[] = [ }, { name: 'get_sdk_keys', - description: 'Get SDK keys for an environment', + description: + 'Get SDK keys for an environment. Include dashboard link in the response.', inputSchema: { type: 'object', properties: { @@ -264,7 +266,8 @@ export const environmentToolDefinitions: Tool[] = [ }, { name: 'create_environment', - description: 'Create a new environment', + description: + 'Create a new environment. Include dashboard link in the response.', inputSchema: { type: 'object', properties: ENVIRONMENT_COMMON_PROPERTIES, @@ -274,7 +277,8 @@ export const environmentToolDefinitions: Tool[] = [ }, { name: 'update_environment', - description: 'Update an existing environment', + description: + 'Update an existing environment. Include dashboard link in the response.', inputSchema: { type: 'object', properties: ENVIRONMENT_COMMON_PROPERTIES, From 09a5b353eb3acdb0dfefb2eaf6b57ce909560bb4 Mon Sep 17 00:00:00 2001 From: Jonathan Norris Date: Wed, 16 Jul 2025 17:10:54 -0400 Subject: [PATCH 03/10] feat: update projectTools with dashboard links --- src/mcp/tools/projectTools.ts | 276 ++++++++++++++++++++++++---------- 1 file changed, 195 insertions(+), 81 deletions(-) diff --git a/src/mcp/tools/projectTools.ts b/src/mcp/tools/projectTools.ts index 72a82c7f0..6ef5b2fd5 100644 --- a/src/mcp/tools/projectTools.ts +++ b/src/mcp/tools/projectTools.ts @@ -13,107 +13,217 @@ import { } from '../types' import { ToolHandler } from '../server' +// Helper functions to generate project dashboard links +const generateProjectDashboardLink = ( + orgId: string, + projectKey: string, +): string => { + return `https://app.devcycle.com/o/${orgId}/p/${projectKey}` +} + +const generateOrganizationSettingsLink = (orgId: string): string => { + return `https://app.devcycle.com/o/${orgId}/settings` +} + +const generateEditProjectLink = (orgId: string, projectKey: string): string => { + return `https://app.devcycle.com/o/${orgId}/settings/p/${projectKey}/details` +} + +// ============================================================================= +// INPUT SCHEMAS +// ============================================================================= + +const PROJECT_KEY_PROPERTY = { + type: 'string' as const, + description: 'The project key (unique, immutable)', +} + +const PAGINATION_PROPERTIES = { + search: { + type: 'string' as const, + description: 'Search query to filter projects (minimum 3 characters)', + minLength: 3, + }, + page: { + type: 'number' as const, + description: 'Page number (default: 1)', + minimum: 1, + }, + perPage: { + type: 'number' as const, + description: 'Number of items per page (default: 100, max: 1000)', + minimum: 1, + maximum: 1000, + }, + sortBy: { + type: 'string' as const, + description: 'Field to sort by (default: createdAt)', + enum: [ + 'createdAt', + 'updatedAt', + 'name', + 'key', + 'createdBy', + 'propertyKey', + ] as const, + }, + sortOrder: { + type: 'string' as const, + enum: ['asc', 'desc'] as const, + description: 'Sort order (default: desc)', + }, + createdBy: { + type: 'string' as const, + description: 'Filter by creator user ID', + }, +} + +const PROJECT_COMMON_PROPERTIES = { + name: { + type: 'string' as const, + description: 'Project name', + }, + description: { + type: 'string' as const, + description: 'Project description', + }, + key: PROJECT_KEY_PROPERTY, + color: { + type: 'string' as const, + description: 'Project color (hex format)', + }, +} + +// ============================================================================= +// OUTPUT SCHEMAS +// ============================================================================= + +const PROJECT_OBJECT_SCHEMA = { + type: 'object' as const, + description: 'A DevCycle project configuration', + properties: { + _id: { + type: 'string' as const, + description: 'Unique identifier for the project', + }, + key: PROJECT_KEY_PROPERTY, + name: { + type: 'string' as const, + description: 'Display name of the project', + }, + description: { + type: 'string' as const, + description: 'Optional description of the project', + }, + color: { + type: 'string' as const, + description: 'Color used to represent this project in the UI', + }, + createdAt: { + type: 'string' as const, + description: 'ISO timestamp when the project was created', + }, + updatedAt: { + type: 'string' as const, + description: 'ISO timestamp when the project was last updated', + }, + }, + required: ['_id', 'key', 'name', 'createdAt', 'updatedAt'], +} + +const DASHBOARD_LINK_PROPERTY = { + type: 'string' as const, + format: 'uri' as const, + description: 'URL to view and manage projects in the DevCycle dashboard', +} + +// Complete output schema definitions +const LIST_PROJECTS_OUTPUT_SCHEMA = { + type: 'object' as const, + properties: { + result: { + type: 'array' as const, + description: 'Array of project objects in the organization', + items: PROJECT_OBJECT_SCHEMA, + }, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], +} + +const GET_CURRENT_PROJECT_OUTPUT_SCHEMA = { + type: 'object' as const, + properties: { + result: PROJECT_OBJECT_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], +} + +const CREATE_PROJECT_OUTPUT_SCHEMA = { + type: 'object' as const, + properties: { + result: PROJECT_OBJECT_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], +} + +const UPDATE_PROJECT_OUTPUT_SCHEMA = { + type: 'object' as const, + properties: { + result: PROJECT_OBJECT_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], +} + +// ============================================================================= +// TOOL DEFINITIONS +// ============================================================================= + export const projectToolDefinitions: Tool[] = [ { name: 'list_projects', - description: 'List all projects in the current organization', + description: + 'List all projects in the current organization. Include dashboard link in the response.', inputSchema: { type: 'object', - properties: { - sortBy: { - type: 'string', - enum: [ - 'createdAt', - 'updatedAt', - 'name', - 'key', - 'createdBy', - 'propertyKey', - ], - description: 'Field to sort by (default: createdAt)', - }, - sortOrder: { - type: 'string', - enum: ['asc', 'desc'], - description: 'Sort order (default: desc)', - }, - search: { - type: 'string', - description: - 'Search query to filter projects (minimum 3 characters)', - }, - createdBy: { - type: 'string', - description: 'Filter by creator user ID', - }, - page: { - type: 'number', - description: 'Page number (default: 1)', - }, - perPage: { - type: 'number', - description: - 'Number of items per page (default: 100, max: 1000)', - }, - }, + properties: PAGINATION_PROPERTIES, }, + outputSchema: LIST_PROJECTS_OUTPUT_SCHEMA, }, { name: 'get_current_project', - description: 'Get the currently selected project', + description: + 'Get the currently selected project. Include dashboard link in the response.', inputSchema: { type: 'object', properties: {}, }, + outputSchema: GET_CURRENT_PROJECT_OUTPUT_SCHEMA, }, { name: 'create_project', - description: 'Create a new project', + description: + 'Create a new project. Include dashboard link in the response.', inputSchema: { type: 'object', - properties: { - name: { - type: 'string', - description: 'Project name', - }, - description: { - type: 'string', - description: 'Project description', - }, - key: { - type: 'string', - description: 'Unique project key', - }, - }, + properties: PROJECT_COMMON_PROPERTIES, required: ['name', 'key'], }, + outputSchema: CREATE_PROJECT_OUTPUT_SCHEMA, }, { name: 'update_project', - description: 'Update an existing project', + description: + 'Update an existing project. Include dashboard link in the response.', inputSchema: { type: 'object', - properties: { - key: { - type: 'string', - description: - 'Project key to identify the project to update', - }, - name: { - type: 'string', - description: 'Updated project name', - }, - description: { - type: 'string', - description: 'Updated project description', - }, - color: { - type: 'string', - description: 'Project color (hex format)', - }, - }, + properties: PROJECT_COMMON_PROPERTIES, required: ['key'], }, + outputSchema: UPDATE_PROJECT_OUTPUT_SCHEMA, }, ] @@ -121,50 +231,54 @@ export const projectToolHandlers: Record = { list_projects: async (args: unknown, apiClient: DevCycleApiClient) => { const validatedArgs = ListProjectsArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'listProjects', validatedArgs, async (authToken) => { + // projectKey not used for listing all projects return await fetchProjects(authToken, validatedArgs) }, - false, + generateOrganizationSettingsLink, ) }, get_current_project: async ( args: unknown, apiClient: DevCycleApiClient, ) => { - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'getCurrentProject', null, async (authToken, projectKey) => { return await fetchProject(authToken, projectKey) }, + generateProjectDashboardLink, ) }, create_project: async (args: unknown, apiClient: DevCycleApiClient) => { const validatedArgs = CreateProjectArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'createProject', validatedArgs, async (authToken) => { + // projectKey not used for creating projects return await createProject(authToken, validatedArgs) }, - false, + generateProjectDashboardLink, ) }, update_project: async (args: unknown, apiClient: DevCycleApiClient) => { const validatedArgs = UpdateProjectArgsSchema.parse(args) const { key, ...updateParams } = validatedArgs - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'updateProject', validatedArgs, async (authToken) => { + // projectKey not used - we use the key from validated args return await updateProject(authToken, key, updateParams) }, - false, + generateEditProjectLink, ) }, } From a3aea840d7257a48d2180c3fbfeddfb2d2cf2ae3 Mon Sep 17 00:00:00 2001 From: Jonathan Norris Date: Thu, 17 Jul 2025 09:14:51 -0400 Subject: [PATCH 04/10] feat: update self targeting tools with dashboard links --- src/mcp/tools/selfTargetingTools.ts | 212 +++++++++++++++++++++++----- 1 file changed, 173 insertions(+), 39 deletions(-) diff --git a/src/mcp/tools/selfTargetingTools.ts b/src/mcp/tools/selfTargetingTools.ts index 23d54a6a6..850ee882a 100644 --- a/src/mcp/tools/selfTargetingTools.ts +++ b/src/mcp/tools/selfTargetingTools.ts @@ -14,90 +14,218 @@ import { } from '../types' import { ToolHandler } from '../server' +// Helper functions to generate dashboard links +const generateSelfTargetingDashboardLink = (orgId: string): string => { + return `https://app.devcycle.com/o/${orgId}/settings/profile-overrides` +} + +// ============================================================================= +// INPUT SCHEMAS +// ============================================================================= + +const FEATURE_KEY_PROPERTY = { + type: 'string' as const, + description: 'The key of the feature', +} + +const ENVIRONMENT_KEY_PROPERTY = { + type: 'string' as const, + description: 'The key of the environment', +} + +const VARIATION_KEY_PROPERTY = { + type: 'string' as const, + description: 'The key of the variation to serve', +} + +const DVC_USER_ID_PROPERTY = { + type: 'string' as const, + description: + 'DevCycle User ID for self-targeting (use null or empty string to clear)', +} + +const OVERRIDE_COMMON_PROPERTIES = { + feature_key: FEATURE_KEY_PROPERTY, + environment_key: ENVIRONMENT_KEY_PROPERTY, + variation_key: VARIATION_KEY_PROPERTY, +} + +// ============================================================================= +// OUTPUT SCHEMAS +// ============================================================================= + +const USER_PROFILE_OBJECT_SCHEMA = { + type: 'object' as const, + description: 'DevCycle user profile for self-targeting', + properties: { + dvcUserId: { + type: 'string' as const, + description: 'DevCycle User ID for self-targeting', + }, + }, +} + +const OVERRIDE_OBJECT_SCHEMA = { + type: 'object' as const, + description: 'A self-targeting override configuration', + properties: { + feature: { + type: 'string' as const, + description: 'Feature key', + }, + environment: { + type: 'string' as const, + description: 'Environment key', + }, + variation: { + type: 'string' as const, + description: 'Variation key', + }, + }, + required: ['feature', 'environment', 'variation'], +} + +const MESSAGE_RESPONSE_SCHEMA = { + type: 'object' as const, + description: 'Simple message response', + properties: { + message: { + type: 'string' as const, + description: 'Response message', + }, + }, + required: ['message'], +} + +const DASHBOARD_LINK_PROPERTY = { + type: 'string' as const, + format: 'uri' as const, + description: + 'URL to view and manage self-targeting in the DevCycle dashboard', +} + +// Complete output schema definitions +const GET_SELF_TARGETING_IDENTITY_OUTPUT_SCHEMA = { + type: 'object' as const, + properties: { + result: USER_PROFILE_OBJECT_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], +} + +const UPDATE_SELF_TARGETING_IDENTITY_OUTPUT_SCHEMA = { + type: 'object' as const, + properties: { + result: USER_PROFILE_OBJECT_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], +} + +const LIST_SELF_TARGETING_OVERRIDES_OUTPUT_SCHEMA = { + type: 'object' as const, + properties: { + result: { + type: 'array' as const, + description: 'Array of self-targeting override objects', + items: OVERRIDE_OBJECT_SCHEMA, + }, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], +} + +const SET_SELF_TARGETING_OVERRIDE_OUTPUT_SCHEMA = { + type: 'object' as const, + properties: { + result: OVERRIDE_OBJECT_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], +} + +const CLEAR_OVERRIDES_OUTPUT_SCHEMA = { + type: 'object' as const, + properties: { + result: MESSAGE_RESPONSE_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], +} + +// ============================================================================= +// TOOL DEFINITIONS +// ============================================================================= + export const selfTargetingToolDefinitions: Tool[] = [ { name: 'get_self_targeting_identity', - description: 'Get current DevCycle identity for self-targeting', + description: + 'Get current DevCycle identity for self-targeting. Include dashboard link in the response.', inputSchema: { type: 'object', properties: {}, }, + outputSchema: GET_SELF_TARGETING_IDENTITY_OUTPUT_SCHEMA, }, { name: 'update_self_targeting_identity', description: - 'Update DevCycle identity for self-targeting and overrides', + 'Update DevCycle identity for self-targeting and overrides. Include dashboard link in the response.', inputSchema: { type: 'object', properties: { - dvc_user_id: { - type: 'string', - description: - 'DevCycle User ID for self-targeting (use null or empty string to clear)', - }, + dvc_user_id: DVC_USER_ID_PROPERTY, }, required: ['dvc_user_id'], }, + outputSchema: UPDATE_SELF_TARGETING_IDENTITY_OUTPUT_SCHEMA, }, { name: 'list_self_targeting_overrides', description: - 'List all self-targeting overrides for the current project', + 'List all self-targeting overrides for the current project. Include dashboard link in the response.', inputSchema: { type: 'object', properties: {}, }, + outputSchema: LIST_SELF_TARGETING_OVERRIDES_OUTPUT_SCHEMA, }, { name: 'set_self_targeting_override', description: - 'Set a self-targeting override for a feature variation. ⚠️ IMPORTANT: Always confirm with the user before setting overrides for production environments (environments where type = "production").', + 'Set a self-targeting override for a feature variation. ⚠️ IMPORTANT: Always confirm with the user before setting overrides for production environments (environments where type = "production"). Include dashboard link in the response.', inputSchema: { type: 'object', - properties: { - feature_key: { - type: 'string', - description: 'The key of the feature', - }, - environment_key: { - type: 'string', - description: 'The key of the environment', - }, - variation_key: { - type: 'string', - description: 'The key of the variation to serve', - }, - }, + properties: OVERRIDE_COMMON_PROPERTIES, required: ['feature_key', 'environment_key', 'variation_key'], }, + outputSchema: SET_SELF_TARGETING_OVERRIDE_OUTPUT_SCHEMA, }, { name: 'clear_feature_self_targeting_overrides', description: - 'Clear self-targeting overrides for a specific feature/environment. ⚠️ IMPORTANT: Always confirm with the user before clearing overrides for production environments (environments where type = "production").', + 'Clear self-targeting overrides for a specific feature/environment. ⚠️ IMPORTANT: Always confirm with the user before clearing overrides for production environments (environments where type = "production"). Include dashboard link in the response.', inputSchema: { type: 'object', properties: { - feature_key: { - type: 'string', - description: 'The key of the feature', - }, - environment_key: { - type: 'string', - description: 'The key of the environment', - }, + feature_key: FEATURE_KEY_PROPERTY, + environment_key: ENVIRONMENT_KEY_PROPERTY, }, required: ['feature_key', 'environment_key'], }, + outputSchema: CLEAR_OVERRIDES_OUTPUT_SCHEMA, }, { name: 'clear_all_self_targeting_overrides', description: - 'Clear all self-targeting overrides for the current project', + 'Clear all self-targeting overrides for the current project. ⚠️ IMPORTANT: Always confirm with the user before clearing all overrides as it can clear production environments (environments where type = "production"). Include dashboard link in the response.', inputSchema: { type: 'object', properties: {}, }, + outputSchema: CLEAR_OVERRIDES_OUTPUT_SCHEMA, }, ] @@ -106,12 +234,13 @@ export const selfTargetingToolHandlers: Record = { args: unknown, apiClient: DevCycleApiClient, ) => { - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'getSelfTargetingIdentity', null, async (authToken, projectKey) => { return await fetchUserProfile(authToken, projectKey) }, + generateSelfTargetingDashboardLink, ) }, update_self_targeting_identity: async ( @@ -120,7 +249,7 @@ export const selfTargetingToolHandlers: Record = { ) => { const validatedArgs = UpdateSelfTargetingIdentityArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'updateSelfTargetingIdentity', validatedArgs, async (authToken, projectKey) => { @@ -128,18 +257,20 @@ export const selfTargetingToolHandlers: Record = { dvcUserId: validatedArgs.dvc_user_id, }) }, + generateSelfTargetingDashboardLink, ) }, list_self_targeting_overrides: async ( args: unknown, apiClient: DevCycleApiClient, ) => { - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'listSelfTargetingOverrides', null, async (authToken, projectKey) => { return await fetchProjectOverridesForUser(authToken, projectKey) }, + generateSelfTargetingDashboardLink, ) }, set_self_targeting_override: async ( @@ -148,7 +279,7 @@ export const selfTargetingToolHandlers: Record = { ) => { const validatedArgs = SetSelfTargetingOverrideArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'setSelfTargetingOverride', validatedArgs, async (authToken, projectKey) => { @@ -162,6 +293,7 @@ export const selfTargetingToolHandlers: Record = { }, ) }, + generateSelfTargetingDashboardLink, ) }, clear_feature_self_targeting_overrides: async ( @@ -170,7 +302,7 @@ export const selfTargetingToolHandlers: Record = { ) => { const validatedArgs = ClearSelfTargetingOverridesArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'clearFeatureSelfTargetingOverrides', validatedArgs, async (authToken, projectKey) => { @@ -185,19 +317,21 @@ export const selfTargetingToolHandlers: Record = { message: `Cleared override for feature '${validatedArgs.feature_key}' in environment '${validatedArgs.environment_key}'`, } }, + generateSelfTargetingDashboardLink, ) }, clear_all_self_targeting_overrides: async ( args: unknown, apiClient: DevCycleApiClient, ) => { - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'clearAllSelfTargetingOverrides', null, async (authToken, projectKey) => { await deleteAllProjectOverrides(authToken, projectKey) return { message: 'Cleared all overrides for the project' } }, + generateSelfTargetingDashboardLink, ) }, } From d139ec867a72401b42dcfe143856522460515bde Mon Sep 17 00:00:00 2001 From: Jonathan Norris Date: Thu, 17 Jul 2025 10:40:01 -0400 Subject: [PATCH 05/10] feat: update variableTools --- src/mcp/tools/variableTools.ts | 353 +++++++++++++++++++++------------ 1 file changed, 225 insertions(+), 128 deletions(-) diff --git a/src/mcp/tools/variableTools.ts b/src/mcp/tools/variableTools.ts index 9b5e77f49..0b2c16117 100644 --- a/src/mcp/tools/variableTools.ts +++ b/src/mcp/tools/variableTools.ts @@ -14,167 +14,260 @@ import { } from '../types' import { ToolHandler } from '../server' +// Helper function to generate variable dashboard links +const generateVariablesDashboardLink = ( + orgId: string, + projectKey: string, +): string => { + return `https://app.devcycle.com/o/${orgId}/p/${projectKey}/variables` +} + +// ============================================================================= +// INPUT SCHEMAS +// ============================================================================= + +const VARIABLE_KEY_PROPERTY = { + type: 'string' as const, + description: 'The variable key (unique, immutable)', +} + +const PAGINATION_PROPERTIES = { + search: { + type: 'string' as const, + description: 'Search query to filter variables', + }, + page: { + type: 'number' as const, + description: 'Page number (default: 1)', + minimum: 1, + }, + per_page: { + type: 'number' as const, + description: 'Number of items per page (default: 100, max: 1000)', + minimum: 1, + maximum: 1000, + }, +} + +const VARIABLE_TYPE_PROPERTY = { + type: 'string' as const, + enum: ['String', 'Boolean', 'Number', 'JSON'] as const, + description: 'Variable type', +} + +const VALIDATION_SCHEMA_PROPERTY = { + type: 'object' as const, + description: 'Validation schema for variable values', + properties: { + schemaType: { + type: 'string' as const, + description: 'Schema type', + }, + enumValues: { + type: 'array' as const, + description: 'Allowed enum values', + }, + regexPattern: { + type: 'string' as const, + description: 'Regex pattern for validation', + }, + jsonSchema: { + type: 'string' as const, + description: 'JSON schema for validation', + }, + description: { + type: 'string' as const, + description: 'Schema description', + }, + exampleValue: { + description: 'Example value for the schema', + }, + }, +} + +const VARIABLE_COMMON_PROPERTIES = { + name: { + type: 'string' as const, + description: 'Variable name (1-100 characters)', + }, + description: { + type: 'string' as const, + description: 'Variable description (max 1000 characters)', + }, + key: { + type: 'string' as const, + description: + 'Unique variable key (1-100 characters, must match pattern ^[a-z0-9-_.]+$)', + }, + _feature: { + type: 'string' as const, + description: 'Feature key or ID to associate with this variable', + }, + type: VARIABLE_TYPE_PROPERTY, + defaultValue: { + description: 'Default value for the variable', + }, + validationSchema: VALIDATION_SCHEMA_PROPERTY, +} + +const UPDATE_VARIABLE_PROPERTIES = { + key: { + type: 'string' as const, + description: 'Current variable key', + }, + name: VARIABLE_COMMON_PROPERTIES.name, + description: VARIABLE_COMMON_PROPERTIES.description, + type: VARIABLE_COMMON_PROPERTIES.type, + validationSchema: VARIABLE_COMMON_PROPERTIES.validationSchema, +} + +// ============================================================================= +// OUTPUT SCHEMAS +// ============================================================================= + +const VARIABLE_OBJECT_SCHEMA = { + type: 'object' as const, + description: 'A DevCycle variable configuration', + properties: { + _id: { + type: 'string' as const, + description: 'Unique identifier for the variable', + }, + key: VARIABLE_KEY_PROPERTY, + name: { + type: 'string' as const, + description: 'Display name of the variable', + }, + description: { + type: 'string' as const, + description: 'Optional description of the variable', + }, + type: { + type: 'string' as const, + description: 'Variable type (String, Boolean, Number, JSON)', + }, + defaultValue: { + description: 'Default value for the variable', + }, + _feature: { + type: 'string' as const, + description: 'Associated feature ID', + }, + validationSchema: { + type: 'object' as const, + description: 'Validation schema for the variable', + }, + createdAt: { + type: 'string' as const, + description: 'ISO timestamp when the variable was created', + }, + updatedAt: { + type: 'string' as const, + description: 'ISO timestamp when the variable was last updated', + }, + }, + required: ['_id', 'key', 'name', 'type', 'createdAt', 'updatedAt'], +} + +const MESSAGE_RESPONSE_SCHEMA = { + type: 'object' as const, + description: 'Simple message response', + properties: { + message: { + type: 'string' as const, + description: 'Response message', + }, + }, + required: ['message'], +} + +const DASHBOARD_LINK_PROPERTY = { + type: 'string' as const, + format: 'uri' as const, + description: 'URL to view and manage variables in the DevCycle dashboard', +} + +// ============================================================================= +// TOOL DEFINITIONS +// ============================================================================= + export const variableToolDefinitions: Tool[] = [ { name: 'list_variables', - description: 'List variables in the current project', + description: + 'List variables in the current project. Include dashboard link in the response.', inputSchema: { type: 'object', + properties: PAGINATION_PROPERTIES, + }, + outputSchema: { + type: 'object' as const, properties: { - search: { - type: 'string', - description: 'Search query to filter variables', - }, - page: { - type: 'number', - description: 'Page number (default: 1)', - }, - per_page: { - type: 'number', - description: - 'Number of items per page (default: 100, max: 1000)', + result: { + type: 'array' as const, + description: 'Array of variable objects in the project', + items: VARIABLE_OBJECT_SCHEMA, }, + dashboardLink: DASHBOARD_LINK_PROPERTY, }, + required: ['result', 'dashboardLink'], }, }, { name: 'create_variable', description: - 'Create a new variable. ⚠️ IMPORTANT: Variables can affect feature flags in production environments. Always confirm with the user before creating variables for features that are active in production.', + 'Create a new variable. Include dashboard link in the response.', inputSchema: { type: 'object', + properties: VARIABLE_COMMON_PROPERTIES, + required: ['key', 'type'], + }, + outputSchema: { + type: 'object' as const, properties: { - name: { - type: 'string', - description: 'Variable name (1-100 characters)', - }, - description: { - type: 'string', - description: 'Variable description (max 1000 characters)', - }, - key: { - type: 'string', - description: - 'Unique variable key (1-100 characters, must match pattern ^[a-z0-9-_.]+$)', - }, - _feature: { - type: 'string', - description: - 'Feature key or ID to associate with this variable', - }, - type: { - type: 'string', - enum: ['String', 'Boolean', 'Number', 'JSON'], - description: 'Variable type', - }, - defaultValue: { - description: 'Default value for the variable', - }, - validationSchema: { - type: 'object', - description: 'Validation schema for variable values', - properties: { - schemaType: { - type: 'string', - description: 'Schema type', - }, - enumValues: { - type: 'array', - description: 'Allowed enum values', - }, - regexPattern: { - type: 'string', - description: 'Regex pattern for validation', - }, - jsonSchema: { - type: 'string', - description: 'JSON schema for validation', - }, - description: { - type: 'string', - description: 'Schema description', - }, - exampleValue: { - description: 'Example value for the schema', - }, - }, - }, + result: VARIABLE_OBJECT_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, }, - required: ['key', 'type'], + required: ['result', 'dashboardLink'], }, }, { name: 'update_variable', description: - 'Update an existing variable. ⚠️ IMPORTANT: Variable changes can affect feature flags in production environments. Always confirm with the user before updating variables for features that are active in production.', + 'Update an existing variable. ⚠️ IMPORTANT: Variable changes can affect feature flags in production environments. Always confirm with the user before updating variables for features that are active in production. Include dashboard link in the response.', inputSchema: { type: 'object', + properties: UPDATE_VARIABLE_PROPERTIES, + required: ['key'], + }, + outputSchema: { + type: 'object' as const, properties: { - key: { - type: 'string', - description: 'Current variable key', - }, - name: { - type: 'string', - description: 'Updated variable name (1-100 characters)', - }, - description: { - type: 'string', - description: - 'Updated variable description (max 1000 characters)', - }, - type: { - type: 'string', - enum: ['String', 'Boolean', 'Number', 'JSON'], - description: 'Variable type', - }, - validationSchema: { - type: 'object', - description: 'Validation schema for variable values', - properties: { - schemaType: { - type: 'string', - description: 'Schema type', - }, - enumValues: { - type: 'array', - description: 'Allowed enum values', - }, - regexPattern: { - type: 'string', - description: 'Regex pattern for validation', - }, - jsonSchema: { - type: 'string', - description: 'JSON schema for validation', - }, - description: { - type: 'string', - description: 'Schema description', - }, - exampleValue: { - description: 'Example value for the schema', - }, - }, - }, + result: VARIABLE_OBJECT_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, }, - required: ['key'], + required: ['result', 'dashboardLink'], }, }, { name: 'delete_variable', description: - 'Delete a variable. ⚠️ CRITICAL: Deleting a variable will remove it from ALL environments including production. ALWAYS confirm with the user before deleting any variable.', + 'Delete a variable. ⚠️ CRITICAL: Deleting a variable will remove it from ALL environments including production. ALWAYS confirm with the user before deleting any variable. Include dashboard link in the response.', inputSchema: { type: 'object', properties: { - key: { - type: 'string', - description: 'Variable key to delete', - }, + key: VARIABLE_KEY_PROPERTY, }, required: ['key'], }, + outputSchema: { + type: 'object' as const, + properties: { + result: MESSAGE_RESPONSE_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, ] @@ -182,7 +275,7 @@ export const variableToolHandlers: Record = { list_variables: async (args: unknown, apiClient: DevCycleApiClient) => { const validatedArgs = ListVariablesArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'listVariables', validatedArgs, async (authToken, projectKey) => { @@ -192,12 +285,13 @@ export const variableToolHandlers: Record = { validatedArgs, ) }, + generateVariablesDashboardLink, ) }, create_variable: async (args: unknown, apiClient: DevCycleApiClient) => { const validatedArgs = CreateVariableArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'createVariable', validatedArgs, async (authToken, projectKey) => { @@ -207,12 +301,13 @@ export const variableToolHandlers: Record = { validatedArgs, ) }, + generateVariablesDashboardLink, ) }, update_variable: async (args: unknown, apiClient: DevCycleApiClient) => { const validatedArgs = UpdateVariableArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'updateVariable', validatedArgs, async (authToken, projectKey) => { @@ -225,12 +320,13 @@ export const variableToolHandlers: Record = { updateData, ) }, + generateVariablesDashboardLink, ) }, delete_variable: async (args: unknown, apiClient: DevCycleApiClient) => { const validatedArgs = DeleteVariableArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'deleteVariable', validatedArgs, async (authToken, projectKey) => { @@ -239,6 +335,7 @@ export const variableToolHandlers: Record = { message: `Variable '${validatedArgs.key}' deleted successfully`, } }, + generateVariablesDashboardLink, ) }, } From 84ec00d9c01556ffa28a2cf42988a297b8e7ac3e Mon Sep 17 00:00:00 2001 From: Jonathan Norris Date: Thu, 17 Jul 2025 10:46:22 -0400 Subject: [PATCH 06/10] chore: cleanup ouput schemas --- src/mcp/tools/environmentTools.ts | 77 +++++++++++--------------- src/mcp/tools/projectTools.ts | 52 ++++++----------- src/mcp/tools/selfTargetingTools.ts | 86 +++++++++++++---------------- 3 files changed, 86 insertions(+), 129 deletions(-) diff --git a/src/mcp/tools/environmentTools.ts b/src/mcp/tools/environmentTools.ts index 41b9b8b3f..af57b681c 100644 --- a/src/mcp/tools/environmentTools.ts +++ b/src/mcp/tools/environmentTools.ts @@ -180,48 +180,7 @@ const DASHBOARD_LINK_PROPERTY = { } // Complete output schema definitions -const LIST_ENVIRONMENTS_OUTPUT_SCHEMA = { - type: 'object' as const, - description: - 'Response containing a list of environments and dashboard link', - properties: { - result: { - type: 'array' as const, - description: 'Array of environment objects in the project', - items: ENVIRONMENT_OBJECT_SCHEMA, - }, - dashboardLink: DASHBOARD_LINK_PROPERTY, - }, - required: ['result', 'dashboardLink'], -} - -const GET_SDK_KEYS_OUTPUT_SCHEMA = { - type: 'object' as const, - description: 'Response containing SDK keys and dashboard link', - properties: { - result: { - type: 'object' as const, - description: - 'SDK keys for the requested environment (filtered by keyType if specified)', - properties: SDK_KEY_PROPERTIES, - }, - dashboardLink: DASHBOARD_LINK_PROPERTY, - }, - required: ['result', 'dashboardLink'], -} - -const CREATE_ENVIRONMENT_OUTPUT_SCHEMA = { - type: 'object' as const, - description: - 'Response containing the newly created environment and dashboard link', - properties: { - result: ENVIRONMENT_OBJECT_SCHEMA, - dashboardLink: DASHBOARD_LINK_PROPERTY, - }, - required: ['result', 'dashboardLink'], -} - -const UPDATE_ENVIRONMENT_OUTPUT_SCHEMA = { +const ENVIRONMENT_OUTPUT_SCHEMA = { type: 'object' as const, description: 'Response containing the updated environment and dashboard link', @@ -244,7 +203,20 @@ export const environmentToolDefinitions: Tool[] = [ type: 'object', properties: PAGINATION_PROPERTIES, }, - outputSchema: LIST_ENVIRONMENTS_OUTPUT_SCHEMA, + outputSchema: { + type: 'object' as const, + description: + 'Response containing a list of environments and dashboard link', + properties: { + result: { + type: 'array' as const, + description: 'Array of environment objects in the project', + items: ENVIRONMENT_OBJECT_SCHEMA, + }, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'get_sdk_keys', @@ -262,7 +234,20 @@ export const environmentToolDefinitions: Tool[] = [ }, required: ['environmentKey'], }, - outputSchema: GET_SDK_KEYS_OUTPUT_SCHEMA, + outputSchema: { + type: 'object' as const, + description: 'Response containing SDK keys and dashboard link', + properties: { + result: { + type: 'object' as const, + description: + 'SDK keys for the requested environment (filtered by keyType if specified)', + properties: SDK_KEY_PROPERTIES, + }, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'create_environment', @@ -273,7 +258,7 @@ export const environmentToolDefinitions: Tool[] = [ properties: ENVIRONMENT_COMMON_PROPERTIES, required: ['name', 'key'], }, - outputSchema: CREATE_ENVIRONMENT_OUTPUT_SCHEMA, + outputSchema: ENVIRONMENT_OUTPUT_SCHEMA, }, { name: 'update_environment', @@ -284,7 +269,7 @@ export const environmentToolDefinitions: Tool[] = [ properties: ENVIRONMENT_COMMON_PROPERTIES, required: ['key'], }, - outputSchema: UPDATE_ENVIRONMENT_OUTPUT_SCHEMA, + outputSchema: ENVIRONMENT_OUTPUT_SCHEMA, }, ] diff --git a/src/mcp/tools/projectTools.ts b/src/mcp/tools/projectTools.ts index 6ef5b2fd5..8bc5ef4bc 100644 --- a/src/mcp/tools/projectTools.ts +++ b/src/mcp/tools/projectTools.ts @@ -138,38 +138,7 @@ const DASHBOARD_LINK_PROPERTY = { } // Complete output schema definitions -const LIST_PROJECTS_OUTPUT_SCHEMA = { - type: 'object' as const, - properties: { - result: { - type: 'array' as const, - description: 'Array of project objects in the organization', - items: PROJECT_OBJECT_SCHEMA, - }, - dashboardLink: DASHBOARD_LINK_PROPERTY, - }, - required: ['result', 'dashboardLink'], -} - -const GET_CURRENT_PROJECT_OUTPUT_SCHEMA = { - type: 'object' as const, - properties: { - result: PROJECT_OBJECT_SCHEMA, - dashboardLink: DASHBOARD_LINK_PROPERTY, - }, - required: ['result', 'dashboardLink'], -} - -const CREATE_PROJECT_OUTPUT_SCHEMA = { - type: 'object' as const, - properties: { - result: PROJECT_OBJECT_SCHEMA, - dashboardLink: DASHBOARD_LINK_PROPERTY, - }, - required: ['result', 'dashboardLink'], -} - -const UPDATE_PROJECT_OUTPUT_SCHEMA = { +const PROJECT_OUTPUT_SCHEMA = { type: 'object' as const, properties: { result: PROJECT_OBJECT_SCHEMA, @@ -191,7 +160,18 @@ export const projectToolDefinitions: Tool[] = [ type: 'object', properties: PAGINATION_PROPERTIES, }, - outputSchema: LIST_PROJECTS_OUTPUT_SCHEMA, + outputSchema: { + type: 'object' as const, + properties: { + result: { + type: 'array' as const, + description: 'Array of project objects in the organization', + items: PROJECT_OBJECT_SCHEMA, + }, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'get_current_project', @@ -201,7 +181,7 @@ export const projectToolDefinitions: Tool[] = [ type: 'object', properties: {}, }, - outputSchema: GET_CURRENT_PROJECT_OUTPUT_SCHEMA, + outputSchema: PROJECT_OUTPUT_SCHEMA, }, { name: 'create_project', @@ -212,7 +192,7 @@ export const projectToolDefinitions: Tool[] = [ properties: PROJECT_COMMON_PROPERTIES, required: ['name', 'key'], }, - outputSchema: CREATE_PROJECT_OUTPUT_SCHEMA, + outputSchema: PROJECT_OUTPUT_SCHEMA, }, { name: 'update_project', @@ -223,7 +203,7 @@ export const projectToolDefinitions: Tool[] = [ properties: PROJECT_COMMON_PROPERTIES, required: ['key'], }, - outputSchema: UPDATE_PROJECT_OUTPUT_SCHEMA, + outputSchema: PROJECT_OUTPUT_SCHEMA, }, ] diff --git a/src/mcp/tools/selfTargetingTools.ts b/src/mcp/tools/selfTargetingTools.ts index 850ee882a..44a40c8ac 100644 --- a/src/mcp/tools/selfTargetingTools.ts +++ b/src/mcp/tools/selfTargetingTools.ts @@ -105,7 +105,7 @@ const DASHBOARD_LINK_PROPERTY = { } // Complete output schema definitions -const GET_SELF_TARGETING_IDENTITY_OUTPUT_SCHEMA = { +const SELF_TARGETING_IDENTITY_OUTPUT_SCHEMA = { type: 'object' as const, properties: { result: USER_PROFILE_OBJECT_SCHEMA, @@ -114,46 +114,6 @@ const GET_SELF_TARGETING_IDENTITY_OUTPUT_SCHEMA = { required: ['result', 'dashboardLink'], } -const UPDATE_SELF_TARGETING_IDENTITY_OUTPUT_SCHEMA = { - type: 'object' as const, - properties: { - result: USER_PROFILE_OBJECT_SCHEMA, - dashboardLink: DASHBOARD_LINK_PROPERTY, - }, - required: ['result', 'dashboardLink'], -} - -const LIST_SELF_TARGETING_OVERRIDES_OUTPUT_SCHEMA = { - type: 'object' as const, - properties: { - result: { - type: 'array' as const, - description: 'Array of self-targeting override objects', - items: OVERRIDE_OBJECT_SCHEMA, - }, - dashboardLink: DASHBOARD_LINK_PROPERTY, - }, - required: ['result', 'dashboardLink'], -} - -const SET_SELF_TARGETING_OVERRIDE_OUTPUT_SCHEMA = { - type: 'object' as const, - properties: { - result: OVERRIDE_OBJECT_SCHEMA, - dashboardLink: DASHBOARD_LINK_PROPERTY, - }, - required: ['result', 'dashboardLink'], -} - -const CLEAR_OVERRIDES_OUTPUT_SCHEMA = { - type: 'object' as const, - properties: { - result: MESSAGE_RESPONSE_SCHEMA, - dashboardLink: DASHBOARD_LINK_PROPERTY, - }, - required: ['result', 'dashboardLink'], -} - // ============================================================================= // TOOL DEFINITIONS // ============================================================================= @@ -167,7 +127,7 @@ export const selfTargetingToolDefinitions: Tool[] = [ type: 'object', properties: {}, }, - outputSchema: GET_SELF_TARGETING_IDENTITY_OUTPUT_SCHEMA, + outputSchema: SELF_TARGETING_IDENTITY_OUTPUT_SCHEMA, }, { name: 'update_self_targeting_identity', @@ -180,7 +140,7 @@ export const selfTargetingToolDefinitions: Tool[] = [ }, required: ['dvc_user_id'], }, - outputSchema: UPDATE_SELF_TARGETING_IDENTITY_OUTPUT_SCHEMA, + outputSchema: SELF_TARGETING_IDENTITY_OUTPUT_SCHEMA, }, { name: 'list_self_targeting_overrides', @@ -190,7 +150,18 @@ export const selfTargetingToolDefinitions: Tool[] = [ type: 'object', properties: {}, }, - outputSchema: LIST_SELF_TARGETING_OVERRIDES_OUTPUT_SCHEMA, + outputSchema: { + type: 'object' as const, + properties: { + result: { + type: 'array' as const, + description: 'Array of self-targeting override objects', + items: OVERRIDE_OBJECT_SCHEMA, + }, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'set_self_targeting_override', @@ -201,7 +172,14 @@ export const selfTargetingToolDefinitions: Tool[] = [ properties: OVERRIDE_COMMON_PROPERTIES, required: ['feature_key', 'environment_key', 'variation_key'], }, - outputSchema: SET_SELF_TARGETING_OVERRIDE_OUTPUT_SCHEMA, + outputSchema: { + type: 'object' as const, + properties: { + result: OVERRIDE_OBJECT_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'clear_feature_self_targeting_overrides', @@ -215,7 +193,14 @@ export const selfTargetingToolDefinitions: Tool[] = [ }, required: ['feature_key', 'environment_key'], }, - outputSchema: CLEAR_OVERRIDES_OUTPUT_SCHEMA, + outputSchema: { + type: 'object' as const, + properties: { + result: MESSAGE_RESPONSE_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'clear_all_self_targeting_overrides', @@ -225,7 +210,14 @@ export const selfTargetingToolDefinitions: Tool[] = [ type: 'object', properties: {}, }, - outputSchema: CLEAR_OVERRIDES_OUTPUT_SCHEMA, + outputSchema: { + type: 'object' as const, + properties: { + result: MESSAGE_RESPONSE_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, ] From 2a31b871af5e4b48acd9a86c396060ab2105c274 Mon Sep 17 00:00:00 2001 From: Jonathan Norris Date: Thu, 17 Jul 2025 12:24:59 -0400 Subject: [PATCH 07/10] feat: update featureTools.ts with dashboard links and input/output schemas --- src/mcp/tools/featureTools.ts | 425 +++++++++++++++++++++++++++++----- src/mcp/utils/api.ts | 4 +- 2 files changed, 371 insertions(+), 58 deletions(-) diff --git a/src/mcp/tools/featureTools.ts b/src/mcp/tools/featureTools.ts index 69abf0887..0f727a91f 100644 --- a/src/mcp/tools/featureTools.ts +++ b/src/mcp/tools/featureTools.ts @@ -36,11 +36,32 @@ import { GetFeatureAuditLogHistoryArgsSchema, } from '../types' import { ToolHandler } from '../server' +import { Feature } from '../../api/schemas' -// Reusable schema components +// Helper function to generate feature dashboard links +const generateFeaturesDashboardLink = ( + orgId: string, + projectKey: string, +): string => { + return `https://app.devcycle.com/o/${orgId}/p/${projectKey}/features` +} + +const generateFeatureDashboardLink = ( + orgId: string, + projectKey: string, + featureKey: string, + page: 'overview' | 'manage-feature' | 'audit-log' = 'overview', +): string => { + return `https://app.devcycle.com/o/${orgId}/p/${projectKey}/features/${featureKey}/${page}` +} + +// ============================================================================= +// INPUT SCHEMAS +// ============================================================================= const FEATURE_KEY_PROPERTY = { type: 'string' as const, - description: 'The key of the feature', + description: + 'The key of the feature (unique, immutable, max 100 characters, pattern: ^[a-z0-9-_.]+$)', } const ENVIRONMENT_KEY_PROPERTY = { @@ -131,7 +152,7 @@ const FEATURE_VARIABLES_PROPERTY = { const VARIATION_KEY_PROPERTY = { type: 'string' as const, description: - 'Unique variation key (max 100 characters, pattern: ^[a-z0-9-_.]+$)', + 'Unique variation key (unique, immutable, max 100 characters, pattern: ^[a-z0-9-_.]+$)', } const VARIATION_NAME_PROPERTY = { @@ -166,27 +187,132 @@ const FEATURE_ENVIRONMENT_REQUIRED_PROPERTIES = { environment_key: ENVIRONMENT_KEY_PROPERTY, } +// ============================================================================= +// OUTPUT SCHEMAS +// ============================================================================= + +const FEATURE_OBJECT_SCHEMA = { + type: 'object' as const, + description: 'A DevCycle feature configuration', + properties: { + _id: { + type: 'string' as const, + description: 'MongoDB ID for the feature', + }, + key: FEATURE_KEY_PROPERTY, + name: { + type: 'string' as const, + description: 'Display name of the feature', + }, + description: { + type: 'string' as const, + description: 'Optional description of the feature', + }, + type: { + type: 'string' as const, + description: 'Feature type (release, experiment, permission, ops)', + }, + status: { + type: 'string' as const, + description: 'Feature status (active, complete, archived)', + }, + variations: { + type: 'array' as const, + description: 'Array of variations for this feature', + }, + createdAt: { + type: 'string' as const, + description: 'ISO timestamp when the feature was created', + }, + updatedAt: { + type: 'string' as const, + description: 'ISO timestamp when the feature was last updated', + }, + }, + required: [ + '_id', + 'key', + 'name', + 'type', + 'status', + 'createdAt', + 'updatedAt', + ], +} + +const VARIATION_OBJECT_SCHEMA = { + type: 'object' as const, + description: 'A feature variation configuration', + properties: { + _id: { + type: 'string' as const, + description: 'Unique identifier for the variation', + }, + key: VARIATION_KEY_PROPERTY, + name: { + type: 'string' as const, + description: 'Display name of the variation', + }, + variables: { + type: 'object' as const, + description: 'Variable values for this variation', + }, + }, + required: ['_id', 'key', 'name'], +} + +const MESSAGE_RESPONSE_SCHEMA = { + type: 'object' as const, + description: 'Simple message response', + properties: { + message: { + type: 'string' as const, + description: 'Response message', + }, + }, + required: ['message'], +} + +const DASHBOARD_LINK_PROPERTY = { + type: 'string' as const, + format: 'uri' as const, + description: 'URL to view and manage features in the DevCycle dashboard', +} + +// ============================================================================= +// TOOL DEFINITIONS +// ============================================================================= + export const featureToolDefinitions: Tool[] = [ { name: 'list_features', - description: 'List features in the current project', + description: + 'List features in the current project. Include dashboard link in the response.', inputSchema: { type: 'object', properties: PAGINATION_PROPERTIES, }, + outputSchema: { + type: 'object' as const, + properties: { + result: { + type: 'array' as const, + description: 'Array of feature objects in the project', + items: FEATURE_OBJECT_SCHEMA, + }, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'create_feature', description: - 'Create a new feature flag (supports interactive mode). ⚠️ IMPORTANT: If creating configurations for production environments, always confirm with the user before proceeding.', + 'Create a new feature flag. Include dashboard link in the response.', inputSchema: { type: 'object', properties: { - key: { - type: 'string', - description: - 'Unique feature key (max 100 characters, pattern: ^[a-z0-9-_.]+$)', - }, + key: FEATURE_KEY_PROPERTY, name: FEATURE_NAME_PROPERTY, description: FEATURE_DESCRIPTION_PROPERTY, type: FEATURE_TYPE_PROPERTY, @@ -228,26 +354,25 @@ export const featureToolDefinitions: Tool[] = [ }, }, }, - interactive: { - type: 'boolean', - description: - 'Use interactive mode to prompt for missing fields', - }, }, }, + outputSchema: { + type: 'object' as const, + properties: { + result: FEATURE_OBJECT_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'update_feature', description: - 'Update an existing feature flag. ⚠️ IMPORTANT: Changes to feature flags may affect production environments. Always confirm with the user before making changes to features that are active in production.', + 'Update an existing feature flag. ⚠️ IMPORTANT: Changes to feature flags may affect production environments. Always confirm with the user before making changes to features that are active in production. Include dashboard link in the response.', inputSchema: { type: 'object', properties: { - key: { - type: 'string', - description: - 'The key of the feature to update(1-100 characters, must match pattern ^[a-z0-9-_.]+$)', - }, + key: FEATURE_KEY_PROPERTY, name: FEATURE_NAME_PROPERTY, description: FEATURE_DESCRIPTION_PROPERTY, type: FEATURE_TYPE_PROPERTY, @@ -274,19 +399,23 @@ export const featureToolDefinitions: Tool[] = [ }, required: ['key'], }, + outputSchema: { + type: 'object' as const, + properties: { + result: FEATURE_OBJECT_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'update_feature_status', description: - 'Update the status of an existing feature flag. ⚠️ IMPORTANT: Changes to feature status may affect production environments. Always confirm with the user before making changes to features that are active in production.', + 'Update the status of an existing feature flag. ⚠️ IMPORTANT: Changes to feature status may affect production environments. Always confirm with the user before making changes to features that are active in production. Include dashboard link in the response.', inputSchema: { type: 'object', properties: { - key: { - type: 'string', - description: - 'The key of the feature to update status for (1-100 characters, must match pattern ^[a-z0-9-_.]+$)', - }, + key: FEATURE_KEY_PROPERTY, status: { type: 'string', enum: ['active', 'complete', 'archived'], @@ -300,11 +429,19 @@ export const featureToolDefinitions: Tool[] = [ }, required: ['key', 'status'], }, + outputSchema: { + type: 'object' as const, + properties: { + result: FEATURE_OBJECT_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'delete_feature', description: - 'Delete an existing feature flag. ⚠️ CRITICAL: Deleting a feature flag will remove it from ALL environments including production. ALWAYS confirm with the user before deleting any feature flag.', + 'Delete an existing feature flag. ⚠️ CRITICAL: Deleting a feature flag will remove it from ALL environments including production. ALWAYS confirm with the user before deleting any feature flag. Include dashboard link in the response.', inputSchema: { type: 'object', properties: { @@ -315,10 +452,19 @@ export const featureToolDefinitions: Tool[] = [ }, required: ['key'], }, + outputSchema: { + type: 'object' as const, + properties: { + result: MESSAGE_RESPONSE_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'fetch_feature_variations', - description: 'Get a list of variations for a feature', + description: + 'Get a list of variations for a feature. Include dashboard link in the response.', inputSchema: { type: 'object', properties: { @@ -326,10 +472,23 @@ export const featureToolDefinitions: Tool[] = [ }, required: ['feature_key'], }, + outputSchema: { + type: 'object' as const, + properties: { + result: { + type: 'array' as const, + description: 'Array of variation objects for the feature', + items: VARIATION_OBJECT_SCHEMA, + }, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'create_feature_variation', - description: 'Create a new variation within a feature', + description: + 'Create a new variation within a feature. Include dashboard link in the response.', inputSchema: { type: 'object', properties: { @@ -345,10 +504,19 @@ export const featureToolDefinitions: Tool[] = [ }, required: ['feature_key', 'key', 'name'], }, + outputSchema: { + type: 'object' as const, + properties: { + result: VARIATION_OBJECT_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'update_feature_variation', - description: 'Update an existing variation by key', + description: + 'Update an existing variation by key. Include dashboard link in the response.', inputSchema: { type: 'object', properties: { @@ -374,31 +542,55 @@ export const featureToolDefinitions: Tool[] = [ }, required: ['feature_key', 'variation_key'], }, + outputSchema: { + type: 'object' as const, + properties: { + result: VARIATION_OBJECT_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'enable_feature_targeting', description: - 'Enable targeting for a feature in an environment. ⚠️ IMPORTANT: Always confirm with the user before making changes to production environments (environments where type = "production").', + 'Enable targeting for a feature in an environment. ⚠️ IMPORTANT: Always confirm with the user before making changes to production environments (environments where type = "production"). Include dashboard link in the response.', inputSchema: { type: 'object', properties: FEATURE_ENVIRONMENT_REQUIRED_PROPERTIES, required: ['feature_key', 'environment_key'], }, + outputSchema: { + type: 'object' as const, + properties: { + result: MESSAGE_RESPONSE_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'disable_feature_targeting', description: - 'Disable targeting for a feature in an environment. ⚠️ IMPORTANT: Always confirm with the user before making changes to production environments (environments where type = "production").', + 'Disable targeting for a feature in an environment. ⚠️ IMPORTANT: Always confirm with the user before making changes to production environments (environments where type = "production"). Include dashboard link in the response.', inputSchema: { type: 'object', properties: FEATURE_ENVIRONMENT_REQUIRED_PROPERTIES, required: ['feature_key', 'environment_key'], }, + outputSchema: { + type: 'object' as const, + properties: { + result: MESSAGE_RESPONSE_SCHEMA, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'list_feature_targeting', description: - 'List feature configurations (targeting rules) for a feature', + 'List feature configurations (targeting rules) for a feature. Include dashboard link in the response.', inputSchema: { type: 'object', properties: { @@ -407,11 +599,22 @@ export const featureToolDefinitions: Tool[] = [ }, required: ['feature_key'], }, + outputSchema: { + type: 'object' as const, + properties: { + result: { + type: 'object' as const, + description: 'Feature targeting configuration object', + }, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'update_feature_targeting', description: - 'Update feature configuration (targeting rules) for a feature in an environment. ⚠️ IMPORTANT: Always confirm with the user before making changes to production environments (environments where type = "production").', + 'Update feature configuration (targeting rules) for a feature in an environment. ⚠️ IMPORTANT: Always confirm with the user before making changes to production environments (environments where type = "production"). Include dashboard link in the response.', inputSchema: { type: 'object', properties: { @@ -563,11 +766,22 @@ export const featureToolDefinitions: Tool[] = [ }, required: ['feature_key', 'environment_key'], }, + outputSchema: { + type: 'object' as const, + properties: { + result: { + type: 'object' as const, + description: 'Updated feature targeting configuration', + }, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, { name: 'get_feature_audit_log_history', description: - 'Get timeline of feature flag changes from DevCycle audit log', + 'Get timeline of feature flag changes from DevCycle audit log. Include dashboard link in the response.', inputSchema: { type: 'object', properties: { @@ -582,6 +796,21 @@ export const featureToolDefinitions: Tool[] = [ }, required: ['feature_key'], }, + outputSchema: { + type: 'object' as const, + properties: { + result: { + type: 'array' as const, + description: 'Array of audit log entries for the feature', + items: { + type: 'object' as const, + description: 'Audit log entry', + }, + }, + dashboardLink: DASHBOARD_LINK_PROPERTY, + }, + required: ['result', 'dashboardLink'], + }, }, ] @@ -589,18 +818,19 @@ export const featureToolHandlers: Record = { list_features: async (args: unknown, apiClient: DevCycleApiClient) => { const validatedArgs = ListFeaturesArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'listFeatures', validatedArgs, async (authToken, projectKey) => { return await fetchFeatures(authToken, projectKey, validatedArgs) }, + generateFeaturesDashboardLink, ) }, create_feature: async (args: unknown, apiClient: DevCycleApiClient) => { const validatedArgs = CreateFeatureArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'createFeature', validatedArgs, async (authToken, projectKey) => { @@ -622,12 +852,19 @@ export const featureToolHandlers: Record = { return await createFeature(authToken, projectKey, featureData) }, + (orgId, projectKey, result) => + generateFeatureDashboardLink( + orgId, + projectKey, + result.key, + 'overview', + ), ) }, update_feature: async (args: unknown, apiClient: DevCycleApiClient) => { const validatedArgs = UpdateFeatureArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'updateFeature', validatedArgs, async (authToken, projectKey) => { @@ -640,6 +877,13 @@ export const featureToolHandlers: Record = { updateData, ) }, + (orgId, projectKey, result) => + generateFeatureDashboardLink( + orgId, + projectKey, + result.key, + 'manage-feature', + ), ) }, update_feature_status: async ( @@ -648,7 +892,7 @@ export const featureToolHandlers: Record = { ) => { const validatedArgs = UpdateFeatureStatusArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'updateFeatureStatus', validatedArgs, async (authToken, projectKey) => { @@ -661,21 +905,28 @@ export const featureToolHandlers: Record = { statusData, ) }, + (orgId, projectKey, result) => + generateFeatureDashboardLink( + orgId, + projectKey, + result.key, + 'overview', + ), ) }, delete_feature: async (args: unknown, apiClient: DevCycleApiClient) => { const validatedArgs = DeleteFeatureArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'deleteFeature', validatedArgs, async (authToken, projectKey) => { - return await deleteFeature( - authToken, - projectKey, - validatedArgs.key, - ) + await deleteFeature(authToken, projectKey, validatedArgs.key) + return { + message: `Feature '${validatedArgs.key}' deleted successfully`, + } }, + generateFeaturesDashboardLink, ) }, fetch_feature_variations: async ( @@ -684,7 +935,7 @@ export const featureToolHandlers: Record = { ) => { const validatedArgs = ListVariationsArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'fetchFeatureVariations', validatedArgs, async (authToken, projectKey) => { @@ -694,6 +945,13 @@ export const featureToolHandlers: Record = { validatedArgs.feature_key, ) }, + (orgId, projectKey) => + generateFeatureDashboardLink( + orgId, + projectKey, + validatedArgs.feature_key, + 'overview', + ), ) }, create_feature_variation: async ( @@ -702,7 +960,7 @@ export const featureToolHandlers: Record = { ) => { const validatedArgs = CreateVariationArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'createFeatureVariation', validatedArgs, async (authToken, projectKey) => { @@ -715,6 +973,13 @@ export const featureToolHandlers: Record = { variationData, ) }, + (orgId, projectKey, result) => + generateFeatureDashboardLink( + orgId, + projectKey, + result.key, + 'manage-feature', + ), ) }, update_feature_variation: async ( @@ -723,7 +988,7 @@ export const featureToolHandlers: Record = { ) => { const validatedArgs = UpdateVariationArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'updateFeatureVariation', validatedArgs, async (authToken, projectKey) => { @@ -738,6 +1003,13 @@ export const featureToolHandlers: Record = { variationData, ) }, + (orgId, projectKey, result) => + generateFeatureDashboardLink( + orgId, + projectKey, + result.key, + 'manage-feature', + ), ) }, enable_feature_targeting: async ( @@ -746,17 +1018,27 @@ export const featureToolHandlers: Record = { ) => { const validatedArgs = EnableTargetingArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'enableTargeting', validatedArgs, async (authToken, projectKey) => { - return await enableTargeting( + await enableTargeting( authToken, projectKey, validatedArgs.feature_key, validatedArgs.environment_key, ) + return { + message: `Targeting enabled for feature '${validatedArgs.feature_key}' in environment '${validatedArgs.environment_key}'`, + } }, + (orgId, projectKey) => + generateFeatureDashboardLink( + orgId, + projectKey, + validatedArgs.feature_key, + 'manage-feature', + ), ) }, disable_feature_targeting: async ( @@ -765,17 +1047,27 @@ export const featureToolHandlers: Record = { ) => { const validatedArgs = DisableTargetingArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'disableTargeting', validatedArgs, async (authToken, projectKey) => { - return await disableTargeting( + await disableTargeting( authToken, projectKey, validatedArgs.feature_key, validatedArgs.environment_key, ) + return { + message: `Targeting disabled for feature '${validatedArgs.feature_key}' in environment '${validatedArgs.environment_key}'`, + } }, + (orgId, projectKey) => + generateFeatureDashboardLink( + orgId, + projectKey, + validatedArgs.feature_key, + 'manage-feature', + ), ) }, list_feature_targeting: async ( @@ -784,7 +1076,7 @@ export const featureToolHandlers: Record = { ) => { const validatedArgs = ListFeatureTargetingArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'listFeatureTargeting', validatedArgs, async (authToken, projectKey) => { @@ -795,6 +1087,13 @@ export const featureToolHandlers: Record = { validatedArgs.environment_key, ) }, + (orgId, projectKey) => + generateFeatureDashboardLink( + orgId, + projectKey, + validatedArgs.feature_key, + 'manage-feature', + ), ) }, update_feature_targeting: async ( @@ -803,7 +1102,7 @@ export const featureToolHandlers: Record = { ) => { const validatedArgs = UpdateFeatureTargetingArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'updateFeatureTargeting', validatedArgs, async (authToken, projectKey) => { @@ -818,6 +1117,13 @@ export const featureToolHandlers: Record = { configData, ) }, + (orgId, projectKey) => + generateFeatureDashboardLink( + orgId, + projectKey, + validatedArgs.feature_key, + 'manage-feature', + ), ) }, get_feature_audit_log_history: async ( @@ -826,7 +1132,7 @@ export const featureToolHandlers: Record = { ) => { const validatedArgs = GetFeatureAuditLogHistoryArgsSchema.parse(args) - return await apiClient.executeWithLogging( + return await apiClient.executeWithDashboardLink( 'getFeatureAuditLogHistory', validatedArgs, async (authToken, projectKey) => { @@ -837,6 +1143,13 @@ export const featureToolHandlers: Record = { validatedArgs.days_back || 30, ) }, + (orgId, projectKey) => + generateFeatureDashboardLink( + orgId, + projectKey, + validatedArgs.feature_key, + 'audit-log', + ), ) }, } diff --git a/src/mcp/utils/api.ts b/src/mcp/utils/api.ts index 8c166eb17..6cf03b42e 100644 --- a/src/mcp/utils/api.ts +++ b/src/mcp/utils/api.ts @@ -74,7 +74,7 @@ export class DevCycleApiClient { operationName: string, args: any, operation: (authToken: string, projectKey: string) => Promise, - dashboardLink: (orgId: string, projectKey: string) => string, + dashboardLink: (orgId: string, projectKey: string, result: T) => string, ): Promise<{ result: T; dashboardLink: string }> { const result = await this.executeWithLogging( operationName, @@ -84,7 +84,7 @@ export class DevCycleApiClient { const organizationId = this.auth.getOrgId() const projectKey = this.auth.getProjectKey() - const link = dashboardLink(organizationId, projectKey) + const link = dashboardLink(organizationId, projectKey, result) return { result, From f1fc69c9a3364e2cfcd9d68d69b626b36cc47e65 Mon Sep 17 00:00:00 2001 From: Jonathan Norris Date: Thu, 17 Jul 2025 12:30:32 -0400 Subject: [PATCH 08/10] fix: add oclif.manifest file back --- oclif.manifest.json | 5995 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 5995 insertions(+) create mode 100644 oclif.manifest.json diff --git a/oclif.manifest.json b/oclif.manifest.json new file mode 100644 index 000000000..790e81773 --- /dev/null +++ b/oclif.manifest.json @@ -0,0 +1,5995 @@ +{ + "version": "5.21.1", + "commands": { + "authCommand": { + "id": "authCommand", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": true, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "org": { + "name": "org", + "type": "option", + "description": "The name or ID of the org to sign into", + "multiple": false + } + }, + "args": {} + }, + "base": { + "id": "base", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": true, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": {} + }, + "createCommand": { + "id": "createCommand", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": true, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "key": { + "name": "key", + "type": "option", + "description": "Unique ID", + "multiple": false + }, + "name": { + "name": "name", + "type": "option", + "description": "Human readable name", + "multiple": false + } + }, + "args": {} + }, + "getCommand": { + "id": "getCommand", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": true, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "sortBy": { + "name": "sortBy", + "type": "option", + "description": "Sort By", + "multiple": false, + "options": [ + "key", + "name", + "updatedAt", + "createdAt" + ] + }, + "sortOrder": { + "name": "sortOrder", + "type": "option", + "description": "Sort Order", + "multiple": false, + "options": [ + "asc", + "desc" + ] + } + }, + "args": {} + }, + "updateCommand": { + "id": "updateCommand", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": true, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": {} + }, + "updateCommandWithCommonProperties": { + "id": "updateCommandWithCommonProperties", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": true, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "name": { + "name": "name", + "type": "option", + "description": "Human readable name", + "multiple": false + } + }, + "args": { + "key": { + "name": "key" + } + } + }, + "wink": { + "id": "wink", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": true, + "aliases": [], + "hiddenAliases": [], + "flags": {}, + "args": {} + }, + "alias:add": { + "id": "alias:add", + "description": "Add a variable alias to the repo configuration", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "examples": [ + "<%= config.bin %> <%= command.id %>", + "<%= config.bin %> <%= command.id %> --alias=VARIABLE_ALIAS --variable=variable-key" + ], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "alias": { + "name": "alias", + "type": "option", + "description": "The alias used in the code", + "multiple": false + }, + "variable": { + "name": "variable", + "type": "option", + "description": "The DevCycle variable key", + "multiple": false + } + }, + "args": {} + }, + "cleanup": { + "id": "cleanup", + "description": "Replace a DevCycle variable with a static value in the current version of your code. Currently only JavaScript is supported.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "examples": [ + "<%= config.bin %> <%= command.id %>", + "<%= config.bin %> <%= command.id %> my-variable-key --value true --type Boolean", + "<%= config.bin %> <%= command.id %> some-var --value \"My Custom Name\" --type String" + ], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "value": { + "name": "value", + "type": "option", + "description": "Value to use in place of variable.", + "multiple": false + }, + "type": { + "name": "type", + "type": "option", + "description": "The type of the value that will be replacing the variable. Valid values include: String, Boolean, Number, JSON", + "multiple": false, + "options": [ + "String", + "Boolean", + "Number", + "JSON" + ] + }, + "include": { + "name": "include", + "type": "option", + "description": "Files to include when scanning for variables to cleanup. By default all files are included. Accepts multiple glob patterns.", + "multiple": true + }, + "exclude": { + "name": "exclude", + "type": "option", + "description": "Files to exclude when scanning for variables to cleanup. By default all files are included. Accepts multiple glob patterns.", + "multiple": true + }, + "output": { + "name": "output", + "type": "option", + "description": "Where the refactored code will be output. By default it overwrites the source file.", + "multiple": false, + "options": [ + "console", + "file" + ], + "default": "file" + }, + "var-alias": { + "name": "var-alias", + "type": "option", + "description": "Aliases to use when identifying variables in your code. Should contain a code reference mapped to a DevCycle variable key, eg. \"--var-alias \"VARIABLES.ENABLE_V1=enable-v1\"", + "multiple": true + } + }, + "args": { + "key": { + "name": "key", + "description": "Key of variable to replace." + } + } + }, + "diff": { + "id": "diff", + "description": "Print a diff of DevCycle variable usage between two versions of your code.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "examples": [ + "<%= config.bin %> <%= command.id %>", + "<%= config.bin %> <%= command.id %> --match-pattern js=\"dvcClient\\.variable\\(\\s*[\"']([^\"']*)[\"']\"" + ], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "include": { + "name": "include", + "type": "option", + "description": "Files to include in the diff. By default all files are included. Accepts multiple glob patterns.", + "multiple": true + }, + "exclude": { + "name": "exclude", + "type": "option", + "description": "Files to exclude in the diff. By default all files are included. Accepts multiple glob patterns.", + "multiple": true + }, + "file": { + "name": "file", + "type": "option", + "char": "f", + "description": "File path of existing diff file to inspect.", + "multiple": false + }, + "client-name": { + "name": "client-name", + "type": "option", + "description": "Name(s) of the DevCycle client variable to match on. Accepts multiple values.", + "multiple": true + }, + "match-pattern": { + "name": "match-pattern", + "type": "option", + "description": "Additional full Regex pattern to use to match variable usages in your code. Should contain exactly one capture group which matches on the key of the variable. Must specify the file extension to override the pattern for, eg. \"--match-pattern js=\"", + "multiple": true + }, + "var-alias": { + "name": "var-alias", + "type": "option", + "description": "Aliases to use when identifying variables in your code. Should contain a code reference mapped to a DevCycle variable key, eg. \"--var-alias \"VARIABLES.ENABLE_V1=enable-v1\"", + "multiple": true + }, + "pr-link": { + "name": "pr-link", + "type": "option", + "description": "Link to the PR to use for formatting the line number outputs with clickable links.", + "hidden": true, + "multiple": false + }, + "format": { + "name": "format", + "type": "option", + "description": "Format to use when outputting the diff results.", + "multiple": false, + "options": [ + "console", + "markdown", + "markdown-no-html" + ], + "default": "console" + }, + "show-regex": { + "name": "show-regex", + "type": "boolean", + "description": "Output the regex pattern used to find variable usage", + "allowNo": false + } + }, + "args": { + "diff-pattern": { + "name": "diff-pattern", + "description": "A \"git diff\"-compatible diff pattern, eg. \"branch1 branch2\"" + } + } + }, + "environments:create": { + "id": "environments:create", + "description": "Create a new Environment for an existing Feature.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "key": { + "name": "key", + "type": "option", + "description": "Unique ID", + "multiple": false + }, + "name": { + "name": "name", + "type": "option", + "description": "Human readable name", + "multiple": false + }, + "type": { + "name": "type", + "type": "option", + "description": "The type of environment", + "multiple": false, + "options": [ + "development", + "staging", + "production", + "disaster_recovery" + ] + }, + "description": { + "name": "description", + "type": "option", + "description": "Description for the dashboard", + "multiple": false + } + }, + "args": {} + }, + "environments:get": { + "id": "environments:get", + "description": "Retrieve Environments from the management API", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "examples": [ + "<%= config.bin %> <%= command.id %>", + "<%= config.bin %> <%= command.id %> --keys=environment-one,environment-two" + ], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "keys": { + "name": "keys", + "type": "option", + "description": "Comma-separated list of environment keys to fetch details for", + "multiple": false + } + }, + "args": {} + }, + "environments:list": { + "id": "environments:list", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [ + "environments:ls" + ], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": {} + }, + "environments:update": { + "id": "environments:update", + "description": "Update a Environment.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "name": { + "name": "name", + "type": "option", + "description": "Human readable name", + "multiple": false + }, + "key": { + "name": "key", + "type": "option", + "description": "Unique ID", + "multiple": false + }, + "type": { + "name": "type", + "type": "option", + "description": "The type of environment", + "multiple": false, + "options": [ + "development", + "staging", + "production", + "disaster_recovery" + ] + }, + "description": { + "name": "description", + "type": "option", + "description": "Description for the environment", + "multiple": false + } + }, + "args": { + "key": { + "name": "key" + } + } + }, + "features:create": { + "id": "features:create", + "description": "Create a new Feature.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "key": { + "name": "key", + "type": "option", + "description": "Unique ID", + "multiple": false + }, + "name": { + "name": "name", + "type": "option", + "description": "Human readable name", + "multiple": false + }, + "variables": { + "name": "variables", + "type": "option", + "description": "The variables to create for the feature", + "multiple": false + }, + "variations": { + "name": "variations", + "type": "option", + "description": "The variations to set for the feature", + "multiple": false + }, + "sdkVisibility": { + "name": "sdkVisibility", + "type": "option", + "description": "The visibility of the feature for the SDKs", + "multiple": false + }, + "interactive": { + "name": "interactive", + "type": "boolean", + "char": "i", + "description": "Interactive Feature Creation Mode", + "allowNo": false + } + }, + "args": {} + }, + "features:delete": { + "id": "features:delete", + "description": "Delete a feature", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": { + "feature": { + "name": "feature", + "description": "Feature key or id to delete" + } + } + }, + "features:get": { + "id": "features:get", + "description": "Retrieve Features from the Management API", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "examples": [ + "<%= config.bin %> <%= command.id %>", + "<%= config.bin %> <%= command.id %> --keys=feature-one,feature-two" + ], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "keys": { + "name": "keys", + "type": "option", + "description": "Comma-separated list of feature keys to fetch details for", + "multiple": false + }, + "search": { + "name": "search", + "type": "option", + "description": "Filter features by search query", + "multiple": false + }, + "page": { + "name": "page", + "type": "option", + "description": "Page number to fetch", + "multiple": false + }, + "per-page": { + "name": "per-page", + "type": "option", + "description": "Number of features to fetch per page", + "multiple": false + } + }, + "args": {} + }, + "features:list": { + "id": "features:list", + "description": "View all features in a project", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [ + "features:ls" + ], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "search": { + "name": "search", + "type": "option", + "description": "Filter features by search query", + "multiple": false + }, + "page": { + "name": "page", + "type": "option", + "description": "Page number to fetch", + "multiple": false + }, + "per-page": { + "name": "per-page", + "type": "option", + "description": "Number of features to fetch per page", + "multiple": false + } + }, + "args": {} + }, + "features:update": { + "id": "features:update", + "description": "Update a Feature.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "name": { + "name": "name", + "type": "option", + "description": "Human readable name", + "multiple": false + }, + "variables": { + "name": "variables", + "type": "option", + "description": "The variables to set for the feature", + "multiple": false + }, + "variations": { + "name": "variations", + "type": "option", + "description": "The variations to set for the feature", + "multiple": false + }, + "sdkVisibility": { + "name": "sdkVisibility", + "type": "option", + "description": "The visibility of the feature for the SDKs", + "multiple": false + }, + "key": { + "name": "key", + "type": "option", + "description": "The unique key of the feature", + "multiple": false + }, + "description": { + "name": "description", + "type": "option", + "description": "A description of the feature", + "multiple": false + } + }, + "args": { + "key": { + "name": "key" + } + } + }, + "generate:types": { + "id": "generate:types", + "description": "Generate Variable Types from the management API", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "output-dir": { + "name": "output-dir", + "type": "option", + "description": "Directory to output the generated types to", + "multiple": false, + "default": "." + }, + "react": { + "name": "react", + "type": "boolean", + "description": "Generate types for use with React", + "allowNo": false, + "deprecated": { + "message": "The React SDK since v1.30.0 does not require this flag. Its types can be augmented automatically" + } + }, + "nextjs": { + "name": "nextjs", + "type": "boolean", + "description": "Generate types for use with Next.js", + "allowNo": false, + "deprecated": { + "message": "The Next.js SDK since v2.7.0 does not require this flag. Its types can be augmented automatically" + } + }, + "no-declaration": { + "name": "no-declaration", + "type": "boolean", + "description": "Do not generate a \"declare module\" statement that automatically overrides SDK types.", + "allowNo": false + }, + "old-repos": { + "name": "old-repos", + "type": "boolean", + "description": "Generate types for use with old DevCycle repos (@devcycle/devcycle-react-sdk, @devcycle/devcycle-js-sdk)", + "allowNo": false + }, + "inline-comments": { + "name": "inline-comments", + "type": "boolean", + "description": "Inline variable informaton comment on the same line as the type definition", + "hidden": true, + "allowNo": false + }, + "include-descriptions": { + "name": "include-descriptions", + "type": "boolean", + "description": "Include variable descriptions in the variable information comment", + "allowNo": false + }, + "strict-custom-data": { + "name": "strict-custom-data", + "type": "boolean", + "description": "Generate stricter custom data types", + "allowNo": false + }, + "obfuscate": { + "name": "obfuscate", + "type": "boolean", + "description": "Obfuscate the variable keys.", + "allowNo": false + }, + "include-deprecation-warnings": { + "name": "include-deprecation-warnings", + "type": "boolean", + "description": "Include @deprecated tags for variables of completed features", + "allowNo": false + } + }, + "args": {} + }, + "identity:get": { + "id": "identity:get", + "description": "Print your DevCycle Identity.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": {} + }, + "identity:update": { + "id": "identity:update", + "description": "Update your DevCycle Identity.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "userId": { + "name": "userId", + "type": "option", + "description": "DevCycle Identity User ID to be used for Overrides & Self-Targeting", + "multiple": false + }, + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": {} + }, + "keys:get": { + "id": "keys:get", + "description": "Retrieve SDK keys from the Management API.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "examples": [ + "<%= config.bin %> <%= command.id %>", + "<%= config.bin %> <%= command.id %> --keys=environment-one,environment-two" + ], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "env": { + "name": "env", + "type": "option", + "description": "Environment to fetch a key for", + "multiple": false + }, + "type": { + "name": "type", + "type": "option", + "description": "The type of SDK key to retrieve", + "multiple": false, + "options": [ + "mobile", + "client", + "server" + ] + } + }, + "args": {} + }, + "login:again": { + "id": "login:again", + "description": "Log in through the DevCycle Universal Login, using saved credentials only.This will open a browser window.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "examples": [ + "<%= config.bin %> <%= command.id %>" + ], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "org": { + "name": "org", + "type": "option", + "description": "The name or ID of the org to sign into", + "multiple": false + } + }, + "args": {} + }, + "login:sso": { + "id": "login:sso", + "description": "Log in through the DevCycle Universal Login. This will open a browser window.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "examples": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "org": { + "name": "org", + "type": "option", + "description": "The name or ID of the org to sign into", + "multiple": false + } + }, + "args": {} + }, + "logout": { + "id": "logout", + "description": "Discards any auth configuration that has been stored in the auth configuration file.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "examples": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": {} + }, + "organizations:get": { + "id": "organizations:get", + "description": "Retrieve Organizations available to the current user", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": {} + }, + "organizations:list": { + "id": "organizations:list", + "description": "List the keys of all organizations available to the current user", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [ + "organizations:ls" + ], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": {} + }, + "organizations:select": { + "id": "organizations:select", + "description": "Select which organization to access through the API", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "org": { + "name": "org", + "type": "option", + "description": "The name or ID of the org to sign into", + "multiple": false + } + }, + "args": {} + }, + "overrides:clear": { + "id": "overrides:clear", + "description": "Clear Overrides for a given Feature or Project.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "all": { + "name": "all", + "type": "boolean", + "description": "All Overrides for the Project", + "allowNo": false + }, + "feature": { + "name": "feature", + "type": "option", + "description": "The key or id of the Feature to clear the Override for", + "multiple": false + }, + "environment": { + "name": "environment", + "type": "option", + "description": "The key or id of the Environment to clear the Override for", + "multiple": false + }, + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": {} + }, + "overrides:get": { + "id": "overrides:get", + "description": "View the Overrides associated with your DevCycle Identity in your current project.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "feature": { + "name": "feature", + "type": "option", + "description": "The key or id of the Feature to get Overrides for", + "multiple": false + }, + "environment": { + "name": "environment", + "type": "option", + "description": "The key or id of the Environment to get Overrides for", + "multiple": false + }, + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": {} + }, + "overrides:list": { + "id": "overrides:list", + "description": "View the Overrides associated with your DevCycle Identity in your current project.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [ + "overrides:ls" + ], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "columns": { + "name": "columns", + "type": "option", + "description": "only show provided columns (comma-separated)", + "multiple": false, + "exclusive": [ + "extended" + ] + }, + "sort": { + "name": "sort", + "type": "option", + "description": "property to sort by (prepend '-' for descending)", + "multiple": false + }, + "filter": { + "name": "filter", + "type": "option", + "description": "filter property by partial string matching, ex: name=foo", + "multiple": false + }, + "csv": { + "name": "csv", + "type": "boolean", + "description": "output is csv format [alias: --output=csv]", + "allowNo": false, + "exclusive": [ + "no-truncate" + ] + }, + "output": { + "name": "output", + "type": "option", + "description": "output in a more machine friendly format", + "multiple": false, + "options": [ + "csv", + "json", + "yaml" + ], + "exclusive": [ + "no-truncate", + "csv" + ] + }, + "extended": { + "name": "extended", + "type": "boolean", + "char": "x", + "description": "show extra columns", + "allowNo": false, + "exclusive": [ + "columns" + ] + }, + "no-truncate": { + "name": "no-truncate", + "type": "boolean", + "description": "do not truncate output to fit screen", + "allowNo": false, + "exclusive": [ + "csv" + ] + }, + "no-header": { + "name": "no-header", + "type": "boolean", + "description": "hide table header from output", + "allowNo": false, + "exclusive": [ + "csv" + ] + } + }, + "args": {} + }, + "overrides:update": { + "id": "overrides:update", + "description": "Update an Override", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "examples": [ + "<%= config.bin %> <%= command.id %> --feature feature-key --environment env-key --variation variation-key" + ], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "feature": { + "name": "feature", + "type": "option", + "description": "The feature to update an Override for", + "multiple": false + }, + "environment": { + "name": "environment", + "type": "option", + "description": "The environment to update an Override for", + "multiple": false + }, + "variation": { + "name": "variation", + "type": "option", + "description": "The variation that will be used as the Override", + "multiple": false + } + }, + "args": {} + }, + "projects:create": { + "id": "projects:create", + "description": "Create a new Project", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "key": { + "name": "key", + "type": "option", + "description": "Unique ID", + "multiple": false + }, + "name": { + "name": "name", + "type": "option", + "description": "Human readable name", + "multiple": false + }, + "description": { + "name": "description", + "type": "option", + "description": "Description for the dashboard", + "multiple": false + } + }, + "args": {} + }, + "projects:current": { + "id": "projects:current", + "description": "View currently selected project", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": {} + }, + "projects:get": { + "id": "projects:get", + "description": "Retrieve all projects in the current Organization", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "sortBy": { + "name": "sortBy", + "type": "option", + "description": "Sort By", + "multiple": false, + "options": [ + "key", + "name", + "updatedAt", + "createdAt" + ] + }, + "sortOrder": { + "name": "sortOrder", + "type": "option", + "description": "Sort Order", + "multiple": false, + "options": [ + "asc", + "desc" + ] + } + }, + "args": {} + }, + "projects:list": { + "id": "projects:list", + "description": "List the keys of all projects in the current Organization", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [ + "projects:ls" + ], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": {} + }, + "projects:select": { + "id": "projects:select", + "description": "Select which project to access through the API", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "org": { + "name": "org", + "type": "option", + "description": "The name or ID of the org to sign into", + "multiple": false + } + }, + "args": {} + }, + "repo:init": { + "id": "repo:init", + "description": "Create the repo configuration file. This will open a browser window.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "examples": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "org": { + "name": "org", + "type": "option", + "description": "The name or ID of the org to sign into", + "multiple": false + } + }, + "args": {} + }, + "status": { + "id": "status", + "description": "Print CLI version information, configuration file locations and auth status.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": {} + }, + "targeting:disable": { + "id": "targeting:disable", + "description": "Disable the Targeting for the specified Environment on a Feature", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "examples": [ + "<%= config.bin %> <%= command.id %> feature-one environment-one" + ], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": { + "feature": { + "name": "feature", + "description": "The Feature for the Targeting Rules" + }, + "environment": { + "name": "environment", + "description": "The Environment where the Targeting Rules will be enabled" + } + } + }, + "targeting:enable": { + "id": "targeting:enable", + "description": "Enable the Targeting for the specified Environment on a Feature", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "examples": [ + "<%= config.bin %> <%= command.id %> feature-one environment-one" + ], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": { + "feature": { + "name": "feature", + "description": "The Feature for the Targeting Rules" + }, + "environment": { + "name": "environment", + "description": "The Environment where the Targeting Rules will be enabled" + } + } + }, + "targeting:get": { + "id": "targeting:get", + "description": "Retrieve Targeting for a Feature from the Management API", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "examples": [ + "<%= config.bin %> <%= command.id %> feature-one", + "<%= config.bin %> <%= command.id %> feature-one environment-one" + ], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": { + "feature": { + "name": "feature", + "description": "The Feature to get the Targeting Rules" + }, + "environment": { + "name": "environment", + "description": "The Environment to get the Targeting Rules", + "required": false + } + } + }, + "targeting:update": { + "id": "targeting:update", + "description": "Update Targeting rules for a Feature. The definition is the audience for the feature, while serve is the key of the variation to serve to the audience.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "targets": { + "name": "targets", + "type": "option", + "description": "List of targeting rules.", + "multiple": false + }, + "status": { + "name": "status", + "type": "option", + "description": "The status to set the targeting rule to.", + "multiple": false, + "options": [ + "enable", + "disable" + ] + } + }, + "args": { + "feature": { + "name": "feature", + "description": "The Feature for the Targeting Rule." + }, + "environment": { + "name": "environment", + "description": "The Environment where the Targeting Rule will be updated." + } + } + }, + "usages": { + "id": "usages", + "description": "Print all DevCycle variable usages in the current version of your code.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "examples": [ + "<%= config.bin %> <%= command.id %>", + "<%= config.bin %> <%= command.id %> --match-pattern js=\"dvcClient\\.variable\\(\\s*[\"']([^\"']*)[\"']\"" + ], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "include": { + "name": "include", + "type": "option", + "description": "Files to include when scanning for usages. By default all files are included. Accepts multiple glob patterns.", + "multiple": true + }, + "exclude": { + "name": "exclude", + "type": "option", + "description": "Files to exclude when scanning for usages. By default all files are included. Accepts multiple glob patterns.", + "multiple": true + }, + "client-name": { + "name": "client-name", + "type": "option", + "description": "Name(s) of the DevCycle client variable to match on. Accepts multiple values.", + "multiple": true + }, + "match-pattern": { + "name": "match-pattern", + "type": "option", + "description": "Additional full Regex pattern to use to match variable usages in your code. Should contain exactly one capture group which matches on the key of the variable. Must specify the file extension to override the pattern for, eg. \"--match-pattern js=\"", + "multiple": true + }, + "var-alias": { + "name": "var-alias", + "type": "option", + "description": "Aliases to use when identifying variables in your code. Should contain a code reference mapped to a DevCycle variable key, eg. \"--var-alias \"VARIABLES.ENABLE_V1=enable-v1\"", + "multiple": true + }, + "format": { + "name": "format", + "type": "option", + "description": "Format to use when outputting the usage results.", + "multiple": false, + "options": [ + "console", + "json" + ], + "default": "console" + }, + "show-regex": { + "name": "show-regex", + "type": "boolean", + "description": "Output the regex pattern used to find variable usage", + "allowNo": false + }, + "only-unused": { + "name": "only-unused", + "type": "boolean", + "description": "Show usages of variables that are not defined in your DevCycle config.", + "allowNo": false + }, + "output": { + "name": "output", + "type": "option", + "char": "o", + "description": "Output file path for JSON format. If not specified, output will be written to stdout.", + "multiple": false + } + }, + "args": {} + }, + "variables:create": { + "id": "variables:create", + "description": "Create a new Variable for an existing Feature.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "key": { + "name": "key", + "type": "option", + "description": "Unique ID", + "multiple": false + }, + "name": { + "name": "name", + "type": "option", + "description": "Human readable name", + "multiple": false + }, + "type": { + "name": "type", + "type": "option", + "description": "The type of variable", + "multiple": false, + "options": [ + "String", + "Boolean", + "Number", + "JSON" + ] + }, + "feature": { + "name": "feature", + "type": "option", + "description": "The key or id of the feature to create the variable for", + "multiple": false + }, + "variations": { + "name": "variations", + "type": "option", + "description": "Set a value for this variable in each variation of the associated feature. Should be a JSON object with the keys being variation keys.", + "multiple": false + }, + "description": { + "name": "description", + "type": "option", + "description": "Description for the dashboard", + "multiple": false + } + }, + "args": {} + }, + "variables:get": { + "id": "variables:get", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "keys": { + "name": "keys", + "type": "option", + "description": "Comma-separated list of variable keys to fetch details for", + "multiple": false + }, + "search": { + "name": "search", + "type": "option", + "description": "Filter variables by search query", + "multiple": false + }, + "page": { + "name": "page", + "type": "option", + "description": "Page number to fetch", + "multiple": false + }, + "per-page": { + "name": "per-page", + "type": "option", + "description": "Number of variables to fetch per page", + "multiple": false + } + }, + "args": {} + }, + "variables:list": { + "id": "variables:list", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [ + "variables:ls" + ], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "search": { + "name": "search", + "type": "option", + "description": "Filter variables by search query", + "multiple": false + }, + "page": { + "name": "page", + "type": "option", + "description": "Page number to fetch", + "multiple": false + }, + "per-page": { + "name": "per-page", + "type": "option", + "description": "Number of variables to fetch per page", + "multiple": false + } + }, + "args": {} + }, + "variables:update": { + "id": "variables:update", + "description": "Update a Variable.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "name": { + "name": "name", + "type": "option", + "description": "Human readable name", + "multiple": false + }, + "description": { + "name": "description", + "type": "option", + "description": "Description for the variable", + "multiple": false + } + }, + "args": { + "key": { + "name": "key" + } + } + }, + "variations:create": { + "id": "variations:create", + "description": "Create a new Variation for an existing Feature.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "examples": [ + "<%= config.bin %> <%= command.id %>", + "<%= config.bin %> <%= command.id %> --variables='{ \"bool-var\": true, \"num-var\": 80, \"string-var\": \"test\" }'" + ], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "key": { + "name": "key", + "type": "option", + "description": "Unique ID", + "multiple": false + }, + "name": { + "name": "name", + "type": "option", + "description": "Human readable name", + "multiple": false + }, + "variables": { + "name": "variables", + "type": "option", + "description": "The variables to create for the variation", + "multiple": false + } + }, + "args": { + "feature": { + "name": "feature", + "description": "Feature key or id" + } + } + }, + "variations:get": { + "id": "variations:get", + "description": "Retrieve variations for a feature from the management API", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": { + "feature": { + "name": "feature", + "description": "Feature key or id" + } + } + }, + "variations:list": { + "id": "variations:list", + "description": "List the keys of all variations in a feature", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [ + "variations:ls" + ], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + } + }, + "args": { + "feature": { + "name": "feature", + "description": "Feature key or id" + } + } + }, + "variations:update": { + "id": "variations:update", + "description": "Update a Variation.", + "strict": true, + "pluginName": "@devcycle/cli", + "pluginAlias": "@devcycle/cli", + "pluginType": "core", + "hidden": false, + "aliases": [], + "hiddenAliases": [], + "flags": { + "config-path": { + "name": "config-path", + "type": "option", + "description": "Override the default location to look for the user.yml file", + "helpGroup": "Global", + "multiple": false + }, + "auth-path": { + "name": "auth-path", + "type": "option", + "description": "Override the default location to look for an auth.yml file", + "helpGroup": "Global", + "multiple": false + }, + "repo-config-path": { + "name": "repo-config-path", + "type": "option", + "description": "Override the default location to look for the repo config.yml file", + "helpGroup": "Global", + "multiple": false + }, + "client-id": { + "name": "client-id", + "type": "option", + "description": "Client ID to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "client-secret": { + "name": "client-secret", + "type": "option", + "description": "Client Secret to use for DevCycle API Authorization", + "helpGroup": "Global", + "multiple": false + }, + "project": { + "name": "project", + "type": "option", + "description": "Project key to use for the DevCycle API requests", + "helpGroup": "Global", + "multiple": false + }, + "no-api": { + "name": "no-api", + "type": "boolean", + "description": "Disable API-based enhancements for commands where authorization is optional. Suppresses warnings about missing credentials.", + "helpGroup": "Global", + "allowNo": false + }, + "headless": { + "name": "headless", + "type": "boolean", + "description": "Disable all interactive flows and format output for easy parsing.", + "helpGroup": "Global", + "allowNo": false + }, + "caller": { + "name": "caller", + "type": "option", + "description": "The integration that is calling the CLI.", + "hidden": true, + "helpGroup": "Global", + "multiple": false, + "options": [ + "github.pr_insights", + "github.code_usages", + "gitlab.pr_insights", + "gitlab.code_usages", + "bitbucket.pr_insights", + "bitbucket.code_usages", + "cli", + "vscode_extension" + ] + }, + "no-browser-auth": { + "name": "no-browser-auth", + "type": "boolean", + "description": "Disable automatic opening of a browser window", + "hidden": true, + "helpGroup": "Global", + "allowNo": false + }, + "name": { + "name": "name", + "type": "option", + "description": "Human readable name", + "multiple": false + }, + "variables": { + "name": "variables", + "type": "option", + "description": "The variables to create for the variation", + "multiple": false + }, + "key": { + "name": "key", + "type": "option", + "description": "The variation key", + "multiple": false + } + }, + "args": { + "feature": { + "name": "feature", + "description": "Feature key or ID" + }, + "key": { + "name": "key" + } + } + } + } +} \ No newline at end of file From 73889fecd783362889ac64896f1d3fd7cf59f3c9 Mon Sep 17 00:00:00 2001 From: Jonathan Norris Date: Thu, 17 Jul 2025 15:25:37 -0400 Subject: [PATCH 09/10] chore: cleanup tool calls --- src/api/features.ts | 13 +- src/api/variables.ts | 12 +- src/mcp/tools/environmentTools.ts | 103 +++++------- src/mcp/tools/featureTools.ts | 239 +++++++++++----------------- src/mcp/tools/projectTools.ts | 71 ++++----- src/mcp/tools/selfTargetingTools.ts | 41 +---- src/mcp/tools/variableTools.ts | 83 ++++++---- src/mcp/types.ts | 19 ++- 8 files changed, 266 insertions(+), 315 deletions(-) diff --git a/src/api/features.ts b/src/api/features.ts index 8c76876ba..a9accf741 100644 --- a/src/api/features.ts +++ b/src/api/features.ts @@ -19,11 +19,20 @@ export const fetchFeatures = async ( token: string, project_id: string, queries: { - feature?: string page?: number perPage?: number + sortBy?: + | 'createdAt' + | 'updatedAt' + | 'name' + | 'key' + | 'createdBy' + | 'propertyKey' + sortOrder?: 'asc' | 'desc' search?: string - staleness?: string + createdBy?: string + type?: 'release' | 'experiment' | 'permission' | 'ops' + status?: 'active' | 'complete' | 'archived' } = {}, ): Promise => { const response = await apiClient.get(FEATURE_URL, { diff --git a/src/api/variables.ts b/src/api/variables.ts index 2b019d4dd..87bef5a7b 100644 --- a/src/api/variables.ts +++ b/src/api/variables.ts @@ -70,10 +70,20 @@ export const fetchVariables = async ( token: string, project_id: string, queries: { - feature?: string page?: number perPage?: number + sortBy?: + | 'createdAt' + | 'updatedAt' + | 'name' + | 'key' + | 'createdBy' + | 'propertyKey' + sortOrder?: 'asc' | 'desc' search?: string + feature?: string + type?: 'String' | 'Boolean' | 'Number' | 'JSON' + status?: 'active' | 'archived' } = {}, ) => { return await apiClient.get('/v1/projects/:project/variables', { diff --git a/src/mcp/tools/environmentTools.ts b/src/mcp/tools/environmentTools.ts index af57b681c..2f1e53d10 100644 --- a/src/mcp/tools/environmentTools.ts +++ b/src/mcp/tools/environmentTools.ts @@ -13,6 +13,10 @@ import { UpdateEnvironmentArgsSchema, } from '../types' import { ToolHandler } from '../server' +import { + DASHBOARD_LINK_PROPERTY, + ENVIRONMENT_KEY_PROPERTY, +} from './commonSchemas' // Helper function to generate environment dashboard links const generateEnvironmentDashboardLink = ( @@ -27,17 +31,46 @@ const generateEnvironmentDashboardLink = ( // ============================================================================= // Reusable schema components -const ENVIRONMENT_KEY_PROPERTY = { +const ENVIRONMENT_COLOR_PROPERTY = { + type: 'string' as const, + description: 'Color used to represent this environment in the UI', +} + +const ENVIRONMENT_TYPE_PROPERTY = { type: 'string' as const, - description: - "The key of the environment, must be unique and can't be changed after creation", + enum: [ + 'development', + 'staging', + 'production', + 'disaster_recovery', + ] as const, } -const PAGINATION_PROPERTIES = { +const ENVIRONMENT_COMMON_PROPERTIES = { + key: ENVIRONMENT_KEY_PROPERTY, + name: { + type: 'string' as const, + }, + description: { + type: 'string' as const, + }, + color: ENVIRONMENT_COLOR_PROPERTY, + type: ENVIRONMENT_TYPE_PROPERTY, + settings: { + type: 'object' as const, + properties: { + appIconUri: { + type: 'string' as const, + description: 'URI for the app icon', + }, + }, + }, +} + +const ENVIRONMENT_PAGINATION_PROPERTIES = { search: { type: 'string' as const, - description: - 'Search query to filter environments (minimum 3 characters)', + description: 'Search query to filter results (minimum 3 characters)', minLength: 3, }, page: { @@ -53,7 +86,6 @@ const PAGINATION_PROPERTIES = { }, sortBy: { type: 'string' as const, - description: 'Field to sort by (default: createdAt)', enum: [ 'createdAt', 'updatedAt', @@ -62,6 +94,7 @@ const PAGINATION_PROPERTIES = { 'createdBy', 'propertyKey', ] as const, + description: 'Field to sort by', }, sortOrder: { type: 'string' as const, @@ -70,23 +103,7 @@ const PAGINATION_PROPERTIES = { }, createdBy: { type: 'string' as const, - description: 'Filter by creator user ID', - }, -} - -const ENVIRONMENT_COMMON_PROPERTIES = { - key: ENVIRONMENT_KEY_PROPERTY, - name: { - type: 'string' as const, - description: 'The name of the environment', - }, - description: { - type: 'string' as const, - description: 'The description of the environment', - }, - color: { - type: 'string' as const, - description: 'The color for the environment', + description: 'Filter by user who created the environment', }, } @@ -113,7 +130,6 @@ const SDK_KEY_PROPERTIES = { // Output schema components const SDK_KEYS_OBJECT_SCHEMA = { type: 'object' as const, - description: 'SDK keys for mobile, server, and client applications', properties: SDK_KEY_PROPERTIES, required: ['mobile', 'server', 'client'], } @@ -122,35 +138,11 @@ const ENVIRONMENT_OBJECT_SCHEMA = { type: 'object' as const, description: 'A DevCycle environment configuration', properties: { + ...ENVIRONMENT_COMMON_PROPERTIES, _id: { type: 'string' as const, description: 'Unique identifier for the environment', }, - key: { - type: 'string' as const, - description: 'The environment key (unique, immutable)', - }, - name: { - type: 'string' as const, - description: 'Display name of the environment', - }, - description: { - type: 'string' as const, - description: 'Optional description of the environment', - }, - color: { - type: 'string' as const, - description: 'Color used to represent this environment in the UI', - }, - type: { - type: 'string' as const, - description: - 'Environment type (e.g., development, staging, production)', - }, - settings: { - type: 'object' as const, - description: 'Environment-specific configuration settings', - }, sdkKeys: SDK_KEYS_OBJECT_SCHEMA, createdAt: { type: 'string' as const, @@ -172,18 +164,9 @@ const ENVIRONMENT_OBJECT_SCHEMA = { ], } -const DASHBOARD_LINK_PROPERTY = { - type: 'string' as const, - format: 'uri' as const, - description: - 'URL to view and manage environments in the DevCycle dashboard', -} - // Complete output schema definitions const ENVIRONMENT_OUTPUT_SCHEMA = { type: 'object' as const, - description: - 'Response containing the updated environment and dashboard link', properties: { result: ENVIRONMENT_OBJECT_SCHEMA, dashboardLink: DASHBOARD_LINK_PROPERTY, @@ -201,7 +184,7 @@ export const environmentToolDefinitions: Tool[] = [ 'List environments in the current project. Include dashboard link in the response.', inputSchema: { type: 'object', - properties: PAGINATION_PROPERTIES, + properties: ENVIRONMENT_PAGINATION_PROPERTIES, }, outputSchema: { type: 'object' as const, diff --git a/src/mcp/tools/featureTools.ts b/src/mcp/tools/featureTools.ts index 0f727a91f..5983b1ee3 100644 --- a/src/mcp/tools/featureTools.ts +++ b/src/mcp/tools/featureTools.ts @@ -36,7 +36,14 @@ import { GetFeatureAuditLogHistoryArgsSchema, } from '../types' import { ToolHandler } from '../server' -import { Feature } from '../../api/schemas' +import { + DASHBOARD_LINK_PROPERTY, + MESSAGE_RESPONSE_SCHEMA, + FEATURE_KEY_PROPERTY, + ENVIRONMENT_KEY_PROPERTY, + VARIATION_KEY_PROPERTY, + TARGET_AUDIENCE_PROPERTY, +} from './commonSchemas' // Helper function to generate feature dashboard links const generateFeaturesDashboardLink = ( @@ -58,21 +65,10 @@ const generateFeatureDashboardLink = ( // ============================================================================= // INPUT SCHEMAS // ============================================================================= -const FEATURE_KEY_PROPERTY = { - type: 'string' as const, - description: - 'The key of the feature (unique, immutable, max 100 characters, pattern: ^[a-z0-9-_.]+$)', -} - -const ENVIRONMENT_KEY_PROPERTY = { - type: 'string' as const, - description: 'The key of the environment', -} const ENVIRONMENT_KEY_OPTIONAL_PROPERTY = { type: 'string' as const, - description: - 'The key of the environment (optional - if not provided, returns all environments)', + description: 'Optional environment key to filter by', } const FEATURE_NAME_PROPERTY = { @@ -91,14 +87,75 @@ const FEATURE_TYPE_PROPERTY = { description: 'Feature type', } +const FEATURE_STATUS_PROPERTY = { + type: 'string' as const, + enum: ['active', 'complete', 'archived'] as const, + description: 'Feature status', +} + const CONTROL_VARIATION_PROPERTY = { type: 'string' as const, description: 'The key of the variation that is used as the control variation for Metrics', } +const FEATURE_PAGINATION_PROPERTIES = { + page: { + type: 'number' as const, + description: 'Page number', + minimum: 1, + default: 1, + }, + perPage: { + type: 'number' as const, + description: 'Items per page', + minimum: 1, + maximum: 1000, + default: 100, + }, + sortBy: { + type: 'string' as const, + description: 'Sort field', + enum: [ + 'createdAt', + 'updatedAt', + 'name', + 'key', + 'createdBy', + 'propertyKey', + ], + default: 'createdAt', + }, + sortOrder: { + type: 'string' as const, + description: 'Sort order', + enum: ['asc', 'desc'], + default: 'desc', + }, + search: { + type: 'string' as const, + description: 'Search query to filter results', + minLength: 3, + }, + createdBy: { + type: 'string' as const, + description: 'Filter by creator', + }, + type: { + type: 'string' as const, + description: 'Filter by feature type', + enum: ['release', 'experiment', 'permission', 'ops'], + }, + status: { + type: 'string' as const, + description: 'Filter by feature status', + enum: ['active', 'complete', 'archived'], + }, +} + const FEATURE_SETTINGS_PROPERTY = { type: 'object' as const, + description: 'Feature-level settings (all properties required if provided)', properties: { publicName: { type: 'string' as const, @@ -114,7 +171,6 @@ const FEATURE_SETTINGS_PROPERTY = { description: 'Whether opt-in is enabled for the feature', }, }, - description: 'Feature-level settings (all properties required if provided)', required: ['publicName', 'publicDescription', 'optInEnabled'] as const, } @@ -123,19 +179,16 @@ const SDK_VISIBILITY_PROPERTY = { properties: { mobile: { type: 'boolean' as const, - description: 'Whether the feature is visible to mobile SDKs', }, client: { type: 'boolean' as const, - description: 'Whether the feature is visible to client SDKs', }, server: { type: 'boolean' as const, - description: 'Whether the feature is visible to server SDKs', }, }, description: - 'SDK Type Visibility Settings (all properties required if provided)', + 'SDK Type Visibility Settings for mobile, client, and server SDKs', required: ['mobile', 'client', 'server'] as const, } @@ -149,12 +202,6 @@ const FEATURE_VARIABLES_PROPERTY = { }, } -const VARIATION_KEY_PROPERTY = { - type: 'string' as const, - description: - 'Unique variation key (unique, immutable, max 100 characters, pattern: ^[a-z0-9-_.]+$)', -} - const VARIATION_NAME_PROPERTY = { type: 'string' as const, description: 'Human-readable variation name (max 100 characters)', @@ -167,26 +214,6 @@ const VARIATION_VARIABLES_PROPERTY = { additionalProperties: true, } -const PAGINATION_PROPERTIES = { - search: { - type: 'string' as const, - description: 'Search query to filter features', - }, - page: { - type: 'number' as const, - description: 'Page number (default: 1)', - }, - per_page: { - type: 'number' as const, - description: 'Number of items per page (default: 100, max: 1000)', - }, -} - -const FEATURE_ENVIRONMENT_REQUIRED_PROPERTIES = { - feature_key: FEATURE_KEY_PROPERTY, - environment_key: ENVIRONMENT_KEY_PROPERTY, -} - // ============================================================================= // OUTPUT SCHEMAS // ============================================================================= @@ -200,22 +227,10 @@ const FEATURE_OBJECT_SCHEMA = { description: 'MongoDB ID for the feature', }, key: FEATURE_KEY_PROPERTY, - name: { - type: 'string' as const, - description: 'Display name of the feature', - }, - description: { - type: 'string' as const, - description: 'Optional description of the feature', - }, - type: { - type: 'string' as const, - description: 'Feature type (release, experiment, permission, ops)', - }, - status: { - type: 'string' as const, - description: 'Feature status (active, complete, archived)', - }, + name: FEATURE_NAME_PROPERTY, + description: FEATURE_DESCRIPTION_PROPERTY, + type: FEATURE_TYPE_PROPERTY, + status: FEATURE_STATUS_PROPERTY, variations: { type: 'array' as const, description: 'Array of variations for this feature', @@ -246,12 +261,11 @@ const VARIATION_OBJECT_SCHEMA = { properties: { _id: { type: 'string' as const, - description: 'Unique identifier for the variation', + description: 'MongoDB ID for the variation', }, key: VARIATION_KEY_PROPERTY, name: { type: 'string' as const, - description: 'Display name of the variation', }, variables: { type: 'object' as const, @@ -261,24 +275,6 @@ const VARIATION_OBJECT_SCHEMA = { required: ['_id', 'key', 'name'], } -const MESSAGE_RESPONSE_SCHEMA = { - type: 'object' as const, - description: 'Simple message response', - properties: { - message: { - type: 'string' as const, - description: 'Response message', - }, - }, - required: ['message'], -} - -const DASHBOARD_LINK_PROPERTY = { - type: 'string' as const, - format: 'uri' as const, - description: 'URL to view and manage features in the DevCycle dashboard', -} - // ============================================================================= // TOOL DEFINITIONS // ============================================================================= @@ -290,7 +286,7 @@ export const featureToolDefinitions: Tool[] = [ 'List features in the current project. Include dashboard link in the response.', inputSchema: { type: 'object', - properties: PAGINATION_PROPERTIES, + properties: FEATURE_PAGINATION_PROPERTIES, }, outputSchema: { type: 'object' as const, @@ -347,10 +343,7 @@ export const featureToolDefinitions: Tool[] = [ description: 'Targeting rules for this environment', }, - status: { - type: 'string', - description: 'Status for this environment', - }, + status: FEATURE_STATUS_PROPERTY, }, }, }, @@ -416,11 +409,7 @@ export const featureToolDefinitions: Tool[] = [ type: 'object', properties: { key: FEATURE_KEY_PROPERTY, - status: { - type: 'string', - enum: ['active', 'complete', 'archived'], - description: 'The status to set the feature to', - }, + status: FEATURE_STATUS_PROPERTY, staticVariation: { type: 'string', description: @@ -520,25 +509,15 @@ export const featureToolDefinitions: Tool[] = [ inputSchema: { type: 'object', properties: { - feature_key: FEATURE_KEY_PROPERTY, - variation_key: { - type: 'string', - description: 'The key of the variation to update', - }, - key: { - type: 'string', - description: - 'New variation key (max 100 characters, pattern: ^[a-z0-9-_.]+$)', - }, - name: { - type: 'string', - description: 'New variation name (max 100 characters)', - }, - variables: VARIATION_VARIABLES_PROPERTY, _id: { type: 'string', - description: 'Internal variation ID (optional)', + description: 'MongoDB ID for the variation', }, + feature_key: FEATURE_KEY_PROPERTY, + variation_key: VARIATION_KEY_PROPERTY, + key: VARIATION_KEY_PROPERTY, + name: VARIATION_NAME_PROPERTY, + variables: VARIATION_VARIABLES_PROPERTY, }, required: ['feature_key', 'variation_key'], }, @@ -557,7 +536,10 @@ export const featureToolDefinitions: Tool[] = [ 'Enable targeting for a feature in an environment. ⚠️ IMPORTANT: Always confirm with the user before making changes to production environments (environments where type = "production"). Include dashboard link in the response.', inputSchema: { type: 'object', - properties: FEATURE_ENVIRONMENT_REQUIRED_PROPERTIES, + properties: { + feature_key: FEATURE_KEY_PROPERTY, + environment_key: ENVIRONMENT_KEY_PROPERTY, + }, required: ['feature_key', 'environment_key'], }, outputSchema: { @@ -575,7 +557,10 @@ export const featureToolDefinitions: Tool[] = [ 'Disable targeting for a feature in an environment. ⚠️ IMPORTANT: Always confirm with the user before making changes to production environments (environments where type = "production"). Include dashboard link in the response.', inputSchema: { type: 'object', - properties: FEATURE_ENVIRONMENT_REQUIRED_PROPERTIES, + properties: { + feature_key: FEATURE_KEY_PROPERTY, + environment_key: ENVIRONMENT_KEY_PROPERTY, + }, required: ['feature_key', 'environment_key'], }, outputSchema: { @@ -634,45 +619,12 @@ export const featureToolDefinitions: Tool[] = [ properties: { _id: { type: 'string', - description: - 'Target ID (optional for new targets)', + description: 'MongoDB ID for the target', }, name: { type: 'string', - description: 'Target name (optional)', - }, - audience: { - type: 'object', - description: - 'Audience definition for the target', - properties: { - name: { - type: 'string', - description: - 'Audience name (max 100 characters, optional)', - }, - filters: { - type: 'object', - description: - 'Audience filters with logical operator', - properties: { - filters: { - type: 'array', - description: - 'Array of filter conditions (supports all, optIn, user, userCountry, userAppVersion, userPlatformVersion, userCustom, audienceMatch filters)', - }, - operator: { - type: 'string', - enum: ['and', 'or'], - description: - 'Logical operator for combining filters', - }, - }, - required: ['filters', 'operator'], - }, - }, - required: ['filters'], }, + audience: TARGET_AUDIENCE_PROPERTY, distribution: { type: 'array', description: @@ -804,7 +756,6 @@ export const featureToolDefinitions: Tool[] = [ description: 'Array of audit log entries for the feature', items: { type: 'object' as const, - description: 'Audit log entry', }, }, dashboardLink: DASHBOARD_LINK_PROPERTY, diff --git a/src/mcp/tools/projectTools.ts b/src/mcp/tools/projectTools.ts index 8bc5ef4bc..da89d1632 100644 --- a/src/mcp/tools/projectTools.ts +++ b/src/mcp/tools/projectTools.ts @@ -12,6 +12,7 @@ import { UpdateProjectArgsSchema, } from '../types' import { ToolHandler } from '../server' +import { DASHBOARD_LINK_PROPERTY, PROJECT_KEY_PROPERTY } from './commonSchemas' // Helper functions to generate project dashboard links const generateProjectDashboardLink = ( @@ -26,38 +27,46 @@ const generateOrganizationSettingsLink = (orgId: string): string => { } const generateEditProjectLink = (orgId: string, projectKey: string): string => { - return `https://app.devcycle.com/o/${orgId}/settings/p/${projectKey}/details` + return `https://app.devcycle.com/o/${orgId}/settings/projects/${projectKey}/edit` } // ============================================================================= // INPUT SCHEMAS // ============================================================================= -const PROJECT_KEY_PROPERTY = { - type: 'string' as const, - description: 'The project key (unique, immutable)', -} - -const PAGINATION_PROPERTIES = { - search: { +const PROJECT_COMMON_PROPERTIES = { + name: { + type: 'string' as const, + description: 'Project name', + }, + description: { type: 'string' as const, - description: 'Search query to filter projects (minimum 3 characters)', - minLength: 3, + description: 'Project description', }, + key: PROJECT_KEY_PROPERTY, + color: { + type: 'string' as const, + description: 'Project color (hex format)', + }, +} + +const PROJECT_PAGINATION_PROPERTIES = { page: { type: 'number' as const, - description: 'Page number (default: 1)', + description: 'Page number', minimum: 1, + default: 1, }, perPage: { type: 'number' as const, - description: 'Number of items per page (default: 100, max: 1000)', + description: 'Items per page', minimum: 1, maximum: 1000, + default: 100, }, sortBy: { type: 'string' as const, - description: 'Field to sort by (default: createdAt)', + description: 'Sort field', enum: [ 'createdAt', 'updatedAt', @@ -65,32 +74,22 @@ const PAGINATION_PROPERTIES = { 'key', 'createdBy', 'propertyKey', - ] as const, + ], + default: 'createdAt', }, sortOrder: { type: 'string' as const, - enum: ['asc', 'desc'] as const, - description: 'Sort order (default: desc)', - }, - createdBy: { - type: 'string' as const, - description: 'Filter by creator user ID', - }, -} - -const PROJECT_COMMON_PROPERTIES = { - name: { - type: 'string' as const, - description: 'Project name', + description: 'Sort order', + enum: ['asc', 'desc'], + default: 'desc', }, - description: { + search: { type: 'string' as const, - description: 'Project description', + description: 'Search query to filter results', }, - key: PROJECT_KEY_PROPERTY, - color: { + createdBy: { type: 'string' as const, - description: 'Project color (hex format)', + description: 'Filter by creator', }, } @@ -131,12 +130,6 @@ const PROJECT_OBJECT_SCHEMA = { required: ['_id', 'key', 'name', 'createdAt', 'updatedAt'], } -const DASHBOARD_LINK_PROPERTY = { - type: 'string' as const, - format: 'uri' as const, - description: 'URL to view and manage projects in the DevCycle dashboard', -} - // Complete output schema definitions const PROJECT_OUTPUT_SCHEMA = { type: 'object' as const, @@ -158,7 +151,7 @@ export const projectToolDefinitions: Tool[] = [ 'List all projects in the current organization. Include dashboard link in the response.', inputSchema: { type: 'object', - properties: PAGINATION_PROPERTIES, + properties: PROJECT_PAGINATION_PROPERTIES, }, outputSchema: { type: 'object' as const, diff --git a/src/mcp/tools/selfTargetingTools.ts b/src/mcp/tools/selfTargetingTools.ts index 44a40c8ac..fc6d4432e 100644 --- a/src/mcp/tools/selfTargetingTools.ts +++ b/src/mcp/tools/selfTargetingTools.ts @@ -13,6 +13,13 @@ import { ClearSelfTargetingOverridesArgsSchema, } from '../types' import { ToolHandler } from '../server' +import { + DASHBOARD_LINK_PROPERTY, + MESSAGE_RESPONSE_SCHEMA, + FEATURE_KEY_PROPERTY, + ENVIRONMENT_KEY_PROPERTY, + VARIATION_KEY_PROPERTY, +} from './commonSchemas' // Helper functions to generate dashboard links const generateSelfTargetingDashboardLink = (orgId: string): string => { @@ -23,21 +30,6 @@ const generateSelfTargetingDashboardLink = (orgId: string): string => { // INPUT SCHEMAS // ============================================================================= -const FEATURE_KEY_PROPERTY = { - type: 'string' as const, - description: 'The key of the feature', -} - -const ENVIRONMENT_KEY_PROPERTY = { - type: 'string' as const, - description: 'The key of the environment', -} - -const VARIATION_KEY_PROPERTY = { - type: 'string' as const, - description: 'The key of the variation to serve', -} - const DVC_USER_ID_PROPERTY = { type: 'string' as const, description: @@ -85,25 +77,6 @@ const OVERRIDE_OBJECT_SCHEMA = { required: ['feature', 'environment', 'variation'], } -const MESSAGE_RESPONSE_SCHEMA = { - type: 'object' as const, - description: 'Simple message response', - properties: { - message: { - type: 'string' as const, - description: 'Response message', - }, - }, - required: ['message'], -} - -const DASHBOARD_LINK_PROPERTY = { - type: 'string' as const, - format: 'uri' as const, - description: - 'URL to view and manage self-targeting in the DevCycle dashboard', -} - // Complete output schema definitions const SELF_TARGETING_IDENTITY_OUTPUT_SCHEMA = { type: 'object' as const, diff --git a/src/mcp/tools/variableTools.ts b/src/mcp/tools/variableTools.ts index 0b2c16117..f9b231632 100644 --- a/src/mcp/tools/variableTools.ts +++ b/src/mcp/tools/variableTools.ts @@ -13,6 +13,11 @@ import { DeleteVariableArgsSchema, } from '../types' import { ToolHandler } from '../server' +import { + DASHBOARD_LINK_PROPERTY, + MESSAGE_RESPONSE_SCHEMA, + VARIABLE_KEY_PROPERTY, +} from './commonSchemas' // Helper function to generate variable dashboard links const generateVariablesDashboardLink = ( @@ -25,27 +30,57 @@ const generateVariablesDashboardLink = ( // ============================================================================= // INPUT SCHEMAS // ============================================================================= - -const VARIABLE_KEY_PROPERTY = { - type: 'string' as const, - description: 'The variable key (unique, immutable)', -} - -const PAGINATION_PROPERTIES = { - search: { - type: 'string' as const, - description: 'Search query to filter variables', - }, +const VARIABLE_PAGINATION_PROPERTIES = { page: { type: 'number' as const, - description: 'Page number (default: 1)', + description: 'Page number', minimum: 1, + default: 1, }, - per_page: { + perPage: { type: 'number' as const, - description: 'Number of items per page (default: 100, max: 1000)', + description: 'Items per page', minimum: 1, maximum: 1000, + default: 100, + }, + sortBy: { + type: 'string' as const, + description: 'Sort field', + enum: [ + 'createdAt', + 'updatedAt', + 'name', + 'key', + 'createdBy', + 'propertyKey', + ], + default: 'createdAt', + }, + sortOrder: { + type: 'string' as const, + description: 'Sort order', + enum: ['asc', 'desc'], + default: 'desc', + }, + search: { + type: 'string' as const, + description: 'Search query to filter variables', + minLength: 3, + }, + feature: { + type: 'string' as const, + description: 'Filter by feature', + }, + type: { + type: 'string' as const, + description: 'Filter by variable type', + enum: ['String', 'Boolean', 'Number', 'JSON'], + }, + status: { + type: 'string' as const, + description: 'Filter by variable status', + enum: ['active', 'archived'], }, } @@ -169,24 +204,6 @@ const VARIABLE_OBJECT_SCHEMA = { required: ['_id', 'key', 'name', 'type', 'createdAt', 'updatedAt'], } -const MESSAGE_RESPONSE_SCHEMA = { - type: 'object' as const, - description: 'Simple message response', - properties: { - message: { - type: 'string' as const, - description: 'Response message', - }, - }, - required: ['message'], -} - -const DASHBOARD_LINK_PROPERTY = { - type: 'string' as const, - format: 'uri' as const, - description: 'URL to view and manage variables in the DevCycle dashboard', -} - // ============================================================================= // TOOL DEFINITIONS // ============================================================================= @@ -198,7 +215,7 @@ export const variableToolDefinitions: Tool[] = [ 'List variables in the current project. Include dashboard link in the response.', inputSchema: { type: 'object', - properties: PAGINATION_PROPERTIES, + properties: VARIABLE_PAGINATION_PROPERTIES, }, outputSchema: { type: 'object' as const, diff --git a/src/mcp/types.ts b/src/mcp/types.ts index 422688a31..0094eaaa1 100644 --- a/src/mcp/types.ts +++ b/src/mcp/types.ts @@ -10,9 +10,24 @@ export const ListFeaturesArgsSchema = z.object({ }) export const ListVariablesArgsSchema = z.object({ - search: z.string().optional(), - page: z.number().min(1).optional(), + page: z.number().min(1).default(1).optional(), perPage: z.number().min(1).max(1000).default(100).optional(), + sortBy: z + .enum([ + 'createdAt', + 'updatedAt', + 'name', + 'key', + 'createdBy', + 'propertyKey', + ]) + .default('createdAt') + .optional(), + sortOrder: z.enum(['asc', 'desc']).default('desc').optional(), + search: z.string().min(3).optional(), + feature: z.string().optional(), + type: z.enum(['String', 'Boolean', 'Number', 'JSON']).optional(), + status: z.enum(['active', 'archived']).optional(), }) export const CreateVariableArgsSchema = schemas.CreateVariableDto From 53aa9fdfb92129fa80b93480323e8ce742e9b8d9 Mon Sep 17 00:00:00 2001 From: Jonathan Norris Date: Thu, 17 Jul 2025 15:38:26 -0400 Subject: [PATCH 10/10] chore: update feature list query params --- src/api/features.ts | 1 + src/mcp/tools/commonSchemas.ts | 348 +++++++++++++++++++++++++++++++++ src/mcp/tools/featureTools.ts | 5 + src/mcp/types.ts | 22 ++- 4 files changed, 374 insertions(+), 2 deletions(-) create mode 100644 src/mcp/tools/commonSchemas.ts diff --git a/src/api/features.ts b/src/api/features.ts index a9accf741..ac5581ed0 100644 --- a/src/api/features.ts +++ b/src/api/features.ts @@ -30,6 +30,7 @@ export const fetchFeatures = async ( | 'propertyKey' sortOrder?: 'asc' | 'desc' search?: string + staleness?: 'all' | 'unused' | 'released' | 'unmodified' | 'notStale' createdBy?: string type?: 'release' | 'experiment' | 'permission' | 'ops' status?: 'active' | 'complete' | 'archived' diff --git a/src/mcp/tools/commonSchemas.ts b/src/mcp/tools/commonSchemas.ts new file mode 100644 index 000000000..59d5c1ac7 --- /dev/null +++ b/src/mcp/tools/commonSchemas.ts @@ -0,0 +1,348 @@ +/** + * Common schema definitions used across multiple MCP tool files + */ + +// ============================================================================= +// SHARED OUTPUT SCHEMA PROPERTIES +// ============================================================================= + +export const DASHBOARD_LINK_PROPERTY = { + type: 'string' as const, + format: 'uri' as const, + description: 'URL to view and manage resources in the DevCycle dashboard', +} + +export const MESSAGE_RESPONSE_SCHEMA = { + type: 'object' as const, + properties: { + message: { + type: 'string' as const, + }, + }, + required: ['message'], +} + +// ============================================================================= +// SHARED INPUT SCHEMA PROPERTIES +// ============================================================================= + +export const FEATURE_KEY_PROPERTY = { + type: 'string' as const, + description: + 'The key of the feature (unique, immutable, max 100 characters, pattern: ^[a-z0-9-_.]+$)', +} + +export const ENVIRONMENT_KEY_PROPERTY = { + type: 'string' as const, + description: + 'The key of the environment (unique, immutable, max 100 characters, pattern: ^[a-z0-9-_.]+$)', +} + +export const VARIATION_KEY_PROPERTY = { + type: 'string' as const, + description: + 'Unique variation key (unique, immutable, max 100 characters, pattern: ^[a-z0-9-_.]+$)', +} + +export const VARIABLE_KEY_PROPERTY = { + type: 'string' as const, + description: + 'The variable key (unique, immutable, max 100 characters, pattern: ^[a-z0-9-_.]+$)', +} + +export const PROJECT_KEY_PROPERTY = { + type: 'string' as const, + description: + 'The project key (unique, immutable, max 100 characters, pattern: ^[a-z0-9-_.]+$)', +} + +// Filter type definitions based on DevCycle API swagger schemas + +export const ALL_FILTER_SCHEMA = { + type: 'object' as const, + description: 'Filter that matches all users', + properties: { + type: { + type: 'string' as const, + description: 'Filter type of this audience', + enum: ['all'] as const, + }, + }, + required: ['type'] as const, +} + +export const USER_FILTER_SCHEMA = { + type: 'object' as const, + description: 'Filter by basic user properties', + properties: { + type: { + type: 'string' as const, + description: 'Filter type of this audience', + enum: ['user'] as const, + }, + subType: { + type: 'string' as const, + description: 'Sub type of this filter', + enum: ['user_id', 'email', 'platform', 'deviceModel'] as const, + }, + comparator: { + type: 'string' as const, + description: 'Comparator to use', + enum: [ + '=', + '!=', + 'exist', + '!exist', + 'contain', + '!contain', + 'startWith', + '!startWith', + 'endWith', + '!endWith', + ] as const, + }, + values: { + type: 'array' as const, + description: + 'Array of values (required for all filters except exist/!exist)', + items: { + type: 'string' as const, + }, + }, + }, + required: ['type', 'subType', 'comparator'] as const, +} + +export const USER_COUNTRY_FILTER_SCHEMA = { + type: 'object' as const, + description: 'Filter by user country', + properties: { + type: { + type: 'string' as const, + description: 'Filter type of this audience', + enum: ['user'] as const, + }, + subType: { + type: 'string' as const, + description: 'Sub type of this filter', + enum: ['country'] as const, + }, + comparator: { + type: 'string' as const, + description: 'Comparator to use', + enum: [ + '=', + '!=', + 'exist', + '!exist', + 'contain', + '!contain', + 'startWith', + '!startWith', + 'endWith', + '!endWith', + ] as const, + }, + values: { + type: 'array' as const, + description: 'Array of country codes (e.g., CA, US)', + items: { + type: 'string' as const, + }, + }, + }, + required: ['type', 'subType', 'comparator'] as const, +} + +export const USER_APP_VERSION_FILTER_SCHEMA = { + type: 'object' as const, + description: 'Filter by application version', + properties: { + type: { + type: 'string' as const, + description: 'Filter type of this audience', + enum: ['user'] as const, + }, + subType: { + type: 'string' as const, + description: 'Sub type of this filter', + enum: ['appVersion'] as const, + }, + comparator: { + type: 'string' as const, + description: 'Comparator to use', + enum: ['=', '!=', '>', '>=', '<', '<=', 'exist', '!exist'] as const, + }, + values: { + type: 'array' as const, + description: 'Array of version strings (e.g., 1.0.2)', + items: { + type: 'string' as const, + }, + }, + }, + required: ['type', 'subType', 'comparator'] as const, +} + +export const USER_PLATFORM_VERSION_FILTER_SCHEMA = { + type: 'object' as const, + description: 'Filter by platform version', + properties: { + type: { + type: 'string' as const, + description: 'Filter type of this audience', + enum: ['user'] as const, + }, + subType: { + type: 'string' as const, + description: 'Sub type of this filter', + enum: ['platformVersion'] as const, + }, + comparator: { + type: 'string' as const, + description: 'Comparator to use', + enum: ['=', '!=', '>', '>=', '<', '<=', 'exist', '!exist'] as const, + }, + values: { + type: 'array' as const, + description: 'Array of platform version strings', + items: { + type: 'string' as const, + }, + }, + }, + required: ['type', 'subType', 'comparator'] as const, +} + +export const USER_CUSTOM_FILTER_SCHEMA = { + type: 'object' as const, + description: 'Filter by custom user data properties', + properties: { + type: { + type: 'string' as const, + description: 'Filter type of this audience', + enum: ['user'] as const, + }, + subType: { + type: 'string' as const, + description: 'Sub type of this filter', + enum: ['customData'] as const, + }, + comparator: { + type: 'string' as const, + description: 'Comparator to use', + enum: [ + '=', + '!=', + '>', + '>=', + '<', + '<=', + 'exist', + '!exist', + 'contain', + '!contain', + 'startWith', + '!startWith', + 'endWith', + '!endWith', + ] as const, + }, + dataKey: { + type: 'string' as const, + description: 'Data Key used for custom data', + minLength: 1, + }, + dataKeyType: { + type: 'string' as const, + description: 'Data Key Type used for custom data', + enum: ['String', 'Boolean', 'Number'] as const, + }, + values: { + type: 'array' as const, + description: 'Array of values (type depends on dataKeyType)', + items: { + anyOf: [ + { type: 'string' as const }, + { type: 'number' as const }, + { type: 'boolean' as const }, + ], + }, + }, + }, + required: [ + 'type', + 'subType', + 'comparator', + 'dataKey', + 'dataKeyType', + ] as const, +} + +export const AUDIENCE_MATCH_FILTER_SCHEMA = { + type: 'object' as const, + description: 'Filter by audience membership', + properties: { + type: { + type: 'string' as const, + enum: ['audienceMatch'] as const, + }, + comparator: { + type: 'string' as const, + enum: ['=', '!='] as const, + }, + _audiences: { + type: 'array' as const, + description: 'Array of audience IDs to match against', + items: { + type: 'string' as const, + }, + }, + }, + required: ['type'] as const, +} + +// Target Audience schema based on DevCycle API swagger definition +export const TARGET_AUDIENCE_PROPERTY = { + type: 'object' as const, + description: 'Audience definition for the target', + properties: { + name: { + type: 'string' as const, + description: + 'Audience display name, must be set for project-level audiences.', + example: 'Android Users', + maxLength: 100, + minLength: 1, + }, + filters: { + type: 'object' as const, + description: + 'Audience filters, describing logic for segmenting users', + properties: { + filters: { + type: 'array' as const, + description: 'Array of filter conditions', + items: { + anyOf: [ + ALL_FILTER_SCHEMA, + USER_FILTER_SCHEMA, + USER_COUNTRY_FILTER_SCHEMA, + USER_APP_VERSION_FILTER_SCHEMA, + USER_PLATFORM_VERSION_FILTER_SCHEMA, + USER_CUSTOM_FILTER_SCHEMA, + AUDIENCE_MATCH_FILTER_SCHEMA, + ], + }, + }, + operator: { + type: 'string' as const, + description: 'Operator type for combining filters', + enum: ['and', 'or'] as const, + }, + }, + required: ['filters', 'operator'] as const, + }, + }, + required: ['filters'] as const, +} diff --git a/src/mcp/tools/featureTools.ts b/src/mcp/tools/featureTools.ts index 5983b1ee3..717ec0f25 100644 --- a/src/mcp/tools/featureTools.ts +++ b/src/mcp/tools/featureTools.ts @@ -151,6 +151,11 @@ const FEATURE_PAGINATION_PROPERTIES = { description: 'Filter by feature status', enum: ['active', 'complete', 'archived'], }, + staleness: { + type: 'string' as const, + description: 'Filter by feature staleness', + enum: ['all', 'unused', 'released', 'unmodified', 'notStale'], + }, } const FEATURE_SETTINGS_PROPERTY = { diff --git a/src/mcp/types.ts b/src/mcp/types.ts index 0094eaaa1..696beb876 100644 --- a/src/mcp/types.ts +++ b/src/mcp/types.ts @@ -4,9 +4,27 @@ import { UpdateFeatureStatusDto } from '../api/schemas' // Zod schemas for MCP tool arguments export const ListFeaturesArgsSchema = z.object({ - search: z.string().optional(), - page: z.number().min(1).optional(), + page: z.number().min(1).default(1).optional(), perPage: z.number().min(1).max(1000).default(100).optional(), + sortBy: z + .enum([ + 'createdAt', + 'updatedAt', + 'name', + 'key', + 'createdBy', + 'propertyKey', + ]) + .default('createdAt') + .optional(), + sortOrder: z.enum(['asc', 'desc']).default('desc').optional(), + search: z.string().min(3).optional(), + staleness: z + .enum(['all', 'unused', 'released', 'unmodified', 'notStale']) + .optional(), + createdBy: z.string().optional(), + type: z.enum(['release', 'experiment', 'permission', 'ops']).optional(), + status: z.enum(['active', 'complete', 'archived']).optional(), }) export const ListVariablesArgsSchema = z.object({