@robinmordasiewicz/xcsh 6.19.0 → 6.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -7936,7 +7936,7 @@ var require_react_reconciler_development = __commonJS({
7936
7936
  var HostPortal = 4;
7937
7937
  var HostComponent = 5;
7938
7938
  var HostText = 6;
7939
- var Fragment = 7;
7939
+ var Fragment2 = 7;
7940
7940
  var Mode = 8;
7941
7941
  var ContextConsumer = 9;
7942
7942
  var ContextProvider = 10;
@@ -8076,7 +8076,7 @@ var require_react_reconciler_development = __commonJS({
8076
8076
  return "DehydratedFragment";
8077
8077
  case ForwardRef:
8078
8078
  return getWrappedName$1(type, type.render, "ForwardRef");
8079
- case Fragment:
8079
+ case Fragment2:
8080
8080
  return "Fragment";
8081
8081
  case HostComponent:
8082
8082
  return type;
@@ -11210,7 +11210,7 @@ var require_react_reconciler_development = __commonJS({
11210
11210
  }
11211
11211
  }
11212
11212
  function updateFragment2(returnFiber, current2, fragment, lanes, key) {
11213
- if (current2 === null || current2.tag !== Fragment) {
11213
+ if (current2 === null || current2.tag !== Fragment2) {
11214
11214
  var created = createFiberFromFragment(fragment, returnFiber.mode, lanes, key);
11215
11215
  created.return = returnFiber;
11216
11216
  return created;
@@ -11613,7 +11613,7 @@ var require_react_reconciler_development = __commonJS({
11613
11613
  if (child.key === key) {
11614
11614
  var elementType = element.type;
11615
11615
  if (elementType === REACT_FRAGMENT_TYPE) {
11616
- if (child.tag === Fragment) {
11616
+ if (child.tag === Fragment2) {
11617
11617
  deleteRemainingChildren(returnFiber, child.sibling);
11618
11618
  var existing = useFiber(child, element.props.children);
11619
11619
  existing.return = returnFiber;
@@ -17104,7 +17104,7 @@ var require_react_reconciler_development = __commonJS({
17104
17104
  var _resolvedProps2 = workInProgress2.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2);
17105
17105
  return updateForwardRef(current2, workInProgress2, type, _resolvedProps2, renderLanes2);
17106
17106
  }
17107
- case Fragment:
17107
+ case Fragment2:
17108
17108
  return updateFragment(current2, workInProgress2, renderLanes2);
17109
17109
  case Mode:
17110
17110
  return updateMode(current2, workInProgress2, renderLanes2);
@@ -17541,7 +17541,7 @@ var require_react_reconciler_development = __commonJS({
17541
17541
  case SimpleMemoComponent:
17542
17542
  case FunctionComponent:
17543
17543
  case ForwardRef:
17544
- case Fragment:
17544
+ case Fragment2:
17545
17545
  case Mode:
17546
17546
  case Profiler:
17547
17547
  case ContextConsumer:
@@ -22309,7 +22309,7 @@ var require_react_reconciler_development = __commonJS({
22309
22309
  return fiber;
22310
22310
  }
22311
22311
  function createFiberFromFragment(elements, mode, lanes, key) {
22312
- var fiber = createFiber(Fragment, elements, key, mode);
22312
+ var fiber = createFiber(Fragment2, elements, key, mode);
22313
22313
  fiber.lanes = lanes;
22314
22314
  return fiber;
22315
22315
  }
@@ -38537,6 +38537,46 @@ function throttle(func, throttleMs = 0, options = {}) {
38537
38537
  });
38538
38538
  }
38539
38539
 
38540
+ // node_modules/ansi-escapes/index.js
38541
+ var ansi_escapes_exports = {};
38542
+ __export(ansi_escapes_exports, {
38543
+ ConEmu: () => ConEmu,
38544
+ beep: () => beep,
38545
+ clearScreen: () => clearScreen,
38546
+ clearTerminal: () => clearTerminal,
38547
+ clearViewport: () => clearViewport,
38548
+ cursorBackward: () => cursorBackward,
38549
+ cursorDown: () => cursorDown,
38550
+ cursorForward: () => cursorForward,
38551
+ cursorGetPosition: () => cursorGetPosition,
38552
+ cursorHide: () => cursorHide,
38553
+ cursorLeft: () => cursorLeft,
38554
+ cursorMove: () => cursorMove,
38555
+ cursorNextLine: () => cursorNextLine,
38556
+ cursorPrevLine: () => cursorPrevLine,
38557
+ cursorRestorePosition: () => cursorRestorePosition,
38558
+ cursorSavePosition: () => cursorSavePosition,
38559
+ cursorShow: () => cursorShow,
38560
+ cursorTo: () => cursorTo,
38561
+ cursorUp: () => cursorUp,
38562
+ default: () => base_exports,
38563
+ enterAlternativeScreen: () => enterAlternativeScreen,
38564
+ eraseDown: () => eraseDown,
38565
+ eraseEndLine: () => eraseEndLine,
38566
+ eraseLine: () => eraseLine,
38567
+ eraseLines: () => eraseLines,
38568
+ eraseScreen: () => eraseScreen,
38569
+ eraseStartLine: () => eraseStartLine,
38570
+ eraseUp: () => eraseUp,
38571
+ exitAlternativeScreen: () => exitAlternativeScreen,
38572
+ iTerm: () => iTerm,
38573
+ image: () => image,
38574
+ link: () => link,
38575
+ scrollDown: () => scrollDown,
38576
+ scrollUp: () => scrollUp,
38577
+ setCwd: () => setCwd
38578
+ });
38579
+
38540
38580
  // node_modules/ansi-escapes/base.js
38541
38581
  var base_exports = {};
38542
38582
  __export(base_exports, {
@@ -38733,6 +38773,51 @@ var ConEmu = {
38733
38773
  };
38734
38774
  var setCwd = (cwd2 = cwdFunction()) => iTerm.setCwd(cwd2) + ConEmu.setCwd(cwd2);
38735
38775
 
38776
+ // src/stubs/ansi-escapes.ts
38777
+ var ESC2 = "\x1B[";
38778
+ var eraseScreen2 = `${ESC2}2J`;
38779
+ var cursorHome = `${ESC2}H`;
38780
+ var patchedClearTerminal = `${eraseScreen2}${cursorHome}`;
38781
+ var {
38782
+ beep: beep2,
38783
+ clearScreen: clearScreen2,
38784
+ clearViewport: clearViewport2,
38785
+ cursorBackward: cursorBackward2,
38786
+ cursorDown: cursorDown2,
38787
+ cursorForward: cursorForward2,
38788
+ cursorGetPosition: cursorGetPosition2,
38789
+ cursorHide: cursorHide2,
38790
+ cursorLeft: cursorLeft2,
38791
+ cursorMove: cursorMove2,
38792
+ cursorNextLine: cursorNextLine2,
38793
+ cursorPrevLine: cursorPrevLine2,
38794
+ cursorRestorePosition: cursorRestorePosition2,
38795
+ cursorSavePosition: cursorSavePosition2,
38796
+ cursorShow: cursorShow2,
38797
+ cursorTo: cursorTo2,
38798
+ cursorUp: cursorUp2,
38799
+ enterAlternativeScreen: enterAlternativeScreen2,
38800
+ eraseDown: eraseDown2,
38801
+ eraseEndLine: eraseEndLine2,
38802
+ eraseLine: eraseLine2,
38803
+ eraseLines: eraseLines2,
38804
+ eraseScreen: eraseScreenOriginal,
38805
+ eraseStartLine: eraseStartLine2,
38806
+ eraseUp: eraseUp2,
38807
+ exitAlternativeScreen: exitAlternativeScreen2,
38808
+ image: image2,
38809
+ link: link2,
38810
+ scrollDown: scrollDown2,
38811
+ scrollUp: scrollUp2,
38812
+ setCwd: setCwd2,
38813
+ iTerm: iTerm2,
38814
+ ConEmu: ConEmu2
38815
+ } = ansi_escapes_exports;
38816
+ var ansi_escapes_default = {
38817
+ ...base_exports,
38818
+ clearTerminal: patchedClearTerminal
38819
+ };
38820
+
38736
38821
  // node_modules/is-in-ci/index.js
38737
38822
  import { env } from "process";
38738
38823
  var isInCi = env.CI !== "0" && env.CI !== "false" && ("CI" in env || "CONTINUOUS_INTEGRATION" in env || Object.keys(env).some((key) => key.startsWith("CI_")));
@@ -42856,11 +42941,11 @@ var create = (stream, { showCursor = false } = {}) => {
42856
42941
  return;
42857
42942
  }
42858
42943
  previousOutput = output;
42859
- stream.write(base_exports.eraseLines(previousLineCount) + output);
42944
+ stream.write(ansi_escapes_default.eraseLines(previousLineCount) + output);
42860
42945
  previousLineCount = output.split("\n").length;
42861
42946
  };
42862
42947
  render2.clear = () => {
42863
- stream.write(base_exports.eraseLines(previousLineCount));
42948
+ stream.write(ansi_escapes_default.eraseLines(previousLineCount));
42864
42949
  previousOutput = "";
42865
42950
  previousLineCount = 0;
42866
42951
  };
@@ -43535,7 +43620,7 @@ var Ink = class {
43535
43620
  this.fullStaticOutput += staticOutput;
43536
43621
  }
43537
43622
  if (outputHeight >= this.options.stdout.rows) {
43538
- this.options.stdout.write(base_exports.clearTerminal + this.fullStaticOutput + output);
43623
+ this.options.stdout.write(ansi_escapes_default.clearTerminal + this.fullStaticOutput + output);
43539
43624
  this.lastOutput = output;
43540
43625
  return;
43541
43626
  }
@@ -43688,6 +43773,25 @@ var getInstance = (stdout, createInstance) => {
43688
43773
 
43689
43774
  // node_modules/ink/build/components/Static.js
43690
43775
  var import_react11 = __toESM(require_react(), 1);
43776
+ function Static(props) {
43777
+ const { items, children: render2, style: customStyle } = props;
43778
+ const [index, setIndex] = (0, import_react11.useState)(0);
43779
+ const itemsToRender = (0, import_react11.useMemo)(() => {
43780
+ return items.slice(index);
43781
+ }, [items, index]);
43782
+ (0, import_react11.useLayoutEffect)(() => {
43783
+ setIndex(items.length);
43784
+ }, [items.length]);
43785
+ const children = itemsToRender.map((item, itemIndex) => {
43786
+ return render2(item, index + itemIndex);
43787
+ });
43788
+ const style = (0, import_react11.useMemo)(() => ({
43789
+ position: "absolute",
43790
+ flexDirection: "column",
43791
+ ...customStyle
43792
+ }), [customStyle]);
43793
+ return import_react11.default.createElement("ink-box", { internal_static: true, style }, children);
43794
+ }
43691
43795
 
43692
43796
  // node_modules/ink/build/components/Transform.js
43693
43797
  var import_react12 = __toESM(require_react(), 1);
@@ -44005,6 +44109,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44005
44109
  name: "admin_console_and_ui",
44006
44110
  displayName: "Admin Console And Ui",
44007
44111
  description: "Provides management capabilities for static components used in the F5 XC admin console and user interface. Enables operations to deploy, retrieve, update, and list static UI assets within namespace boundaries. Supports configuration of console interface elements, component metadata management, and asset lifecycle operations. Use this domain to manage custom UI components, static resources, and interface configurations that extend or customize the admin console experience.",
44112
+ descriptionShort: "Static UI component and console asset management",
44113
+ descriptionMedium: "Manage static components for the admin console interface. Deploy, retrieve, and list UI assets and configuration elements within namespaces.",
44008
44114
  aliases: [],
44009
44115
  complexity: "simple",
44010
44116
  isPreview: false,
@@ -44017,6 +44123,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44017
44123
  name: "api",
44018
44124
  displayName: "Api",
44019
44125
  description: "Comprehensive API lifecycle management including automatic discovery and cataloging of APIs across your infrastructure, security testing to identify vulnerabilities and validate behavior, credential management for secure API access, and policy-driven API grouping. Define testing policies to continuously validate API security posture, organize APIs into logical groups for governance, and integrate with WAF and network security controls. Supports marking endpoints as non-API traffic and...",
44126
+ descriptionShort: "API discovery, security testing, and credential management",
44127
+ descriptionMedium: "Discover and catalog APIs, test security behavior, manage credentials, and define API groups with testing policies for comprehensive API lifecycle...",
44020
44128
  aliases: ["apisec", "api-discovery"],
44021
44129
  complexity: "advanced",
44022
44130
  isPreview: false,
@@ -44079,6 +44187,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44079
44187
  name: "authentication",
44080
44188
  displayName: "Authentication",
44081
44189
  description: "F5 Distributed Cloud Authentication API specifications",
44190
+ descriptionShort: "Authentication API",
44191
+ descriptionMedium: "F5 Distributed Cloud Authentication API specifications",
44082
44192
  aliases: ["authn", "oidc", "sso"],
44083
44193
  complexity: "simple",
44084
44194
  isPreview: false,
@@ -44091,6 +44201,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44091
44201
  name: "bigip",
44092
44202
  displayName: "Bigip",
44093
44203
  description: "Configure and manage BigIP F5 appliance integration with Distributed Cloud infrastructure. Create and deploy iRule scripts for advanced traffic manipulation, manage data groups for dynamic configuration, configure Access Policy Manager (APM) settings for authentication and access control, and define BigIP virtual servers. Provides metrics collection for APM performance monitoring and enables seamless hybrid deployments combining traditional BigIP infrastructure with cloud-native services...",
44204
+ descriptionShort: "BigIP appliance management, iRules, and data groups",
44205
+ descriptionMedium: "Manage BigIP F5 appliances including iRule script configuration, data groups, APM policies, and virtual server integration with Distributed Cloud.",
44094
44206
  aliases: ["f5-bigip", "irule", "ltm"],
44095
44207
  complexity: "moderate",
44096
44208
  isPreview: false,
@@ -44103,6 +44215,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44103
44215
  name: "billing_and_usage",
44104
44216
  displayName: "Billing And Usage",
44105
44217
  description: "Comprehensive billing and usage management for F5 XC tenants. Handle subscription plan transitions between tiers, configure primary and secondary payment methods, and download invoice PDFs. Monitor resource quota limits and current usage across namespaces. Supports custom invoice listing, quota configuration per namespace, and contact management for billing communications. Essential for financial operations, capacity planning, and subscription lifecycle management.",
44218
+ descriptionShort: "Subscription billing, payment methods, and usage tracking",
44219
+ descriptionMedium: "Manage subscription plans, payment methods, invoices, and resource quotas. Track usage limits and billing transitions across namespaces.",
44106
44220
  aliases: [],
44107
44221
  complexity: "moderate",
44108
44222
  isPreview: false,
@@ -44115,6 +44229,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44115
44229
  name: "blindfold",
44116
44230
  displayName: "Blindfold",
44117
44231
  description: "Configure and manage cryptographic secret protection with policy-based access controls. Create secret policies and policy rules that govern how sensitive data is encrypted, shared, and accessed across namespaces. Retrieve public keys for encryption operations, process policy information for secret sharing workflows, and decrypt secrets with proper authorization. Monitor secret access through comprehensive audit logs with aggregation and scrolling capabilities. Enforce data protection...",
44232
+ descriptionShort: "Secret encryption and policy-based data protection",
44233
+ descriptionMedium: "Manage encryption keys, secret policies, and sensitive data protection. Configure policy rules for secure secret sharing with audit logging.",
44118
44234
  aliases: ["bf", "encrypt", "secrets"],
44119
44235
  complexity: "moderate",
44120
44236
  isPreview: false,
@@ -44127,6 +44243,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44127
44243
  name: "bot_and_threat_defense",
44128
44244
  displayName: "Bot And Threat Defense",
44129
44245
  description: "Manage comprehensive bot and threat defense capabilities including Shape bot defense instance configuration, threat protection manager (TPM) categories for threat classification, and API key provisioning for automated defense systems. Create and manage TPM categories to organize threats by type, configure bot defense instances per namespace, and handle TPM manager lifecycle operations. Supports preauthorization and provisioning workflows for integrating threat intelligence services with...",
44246
+ descriptionShort: "Bot detection, threat categorization, and defense management",
44247
+ descriptionMedium: "Configure bot defense instances, manage threat categories, and provision TPM API keys for automated threat detection and mitigation.",
44130
44248
  aliases: [],
44131
44249
  complexity: "moderate",
44132
44250
  isPreview: false,
@@ -44139,6 +44257,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44139
44257
  name: "cdn",
44140
44258
  displayName: "Cdn",
44141
44259
  description: "Content Delivery Network services for global content distribution and edge caching. Configure CDN load balancers with custom caching rules based on paths, headers, cookies, and query parameters. Define cache TTL policies, eligibility options, and cache-control behaviors. Monitor CDN performance through access logs and metrics aggregation. Perform cache purge operations for content invalidation. Manage addon subscriptions and track service operation status for CDN deployments.",
44260
+ descriptionShort: "CDN load balancing, caching rules, and content delivery",
44261
+ descriptionMedium: "Configure CDN load balancers and caching rules for content delivery. Manage cache policies, purge operations, and access logs for optimized...",
44142
44262
  aliases: ["cache", "content"],
44143
44263
  complexity: "advanced",
44144
44264
  isPreview: false,
@@ -44151,6 +44271,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44151
44271
  name: "ce_management",
44152
44272
  displayName: "Ce Management",
44153
44273
  description: "Configure and manage Customer Edge (CE) site infrastructure across distributed deployments. Define network interfaces with DHCP, IPv6, and dedicated management settings. Organize sites into fleets for coordinated management. Handle site registration workflows including token-based registration, image downloads, and suggested configuration values. Monitor and execute site upgrades with pre-upgrade checks and status tracking. Supports both dedicated and Ethernet interface types with...",
44274
+ descriptionShort: "Customer Edge site lifecycle and network configuration",
44275
+ descriptionMedium: "Manage Customer Edge sites including network interfaces, fleet configurations, site upgrades, and registration workflows for distributed deployments.",
44154
44276
  aliases: [],
44155
44277
  complexity: "advanced",
44156
44278
  isPreview: false,
@@ -44163,6 +44285,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44163
44285
  name: "certificates",
44164
44286
  displayName: "Certificates",
44165
44287
  description: "Comprehensive certificate lifecycle management for securing application communications. Configure SSL/TLS certificates and certificate chains for endpoints, manage trusted Certificate Authority (CA) lists for client verification, and maintain Certificate Revocation Lists (CRLs) to invalidate compromised certificates. Supports certificate manifests for organized deployment across namespaces, enabling mTLS authentication, HTTPS termination, and secure service-to-service communication patterns.",
44288
+ descriptionShort: "SSL/TLS certificate and trusted CA management",
44289
+ descriptionMedium: "Manage SSL/TLS certificates, certificate chains, trusted CA lists, and certificate revocation lists for secure communications.",
44166
44290
  aliases: ["cert", "certs", "ssl", "tls"],
44167
44291
  complexity: "moderate",
44168
44292
  isPreview: false,
@@ -44175,6 +44299,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44175
44299
  name: "cloud_infrastructure",
44176
44300
  displayName: "Cloud Infrastructure",
44177
44301
  description: "Establish and manage connectivity to major cloud providers including AWS, Azure, and GCP. Configure cloud credentials and authentication for secure provider access. Create and manage VPC attachments, transit gateways, and route tables for cross-cloud networking. Support elastic provisioning with automatic resource discovery and reapplication workflows. Monitor cloud connection metrics and segment performance. Integrate with Customer Edge sites for hybrid cloud deployments across multiple...",
44302
+ descriptionShort: "Multi-cloud provider connectivity and credential management",
44303
+ descriptionMedium: "Connect to AWS, Azure, and GCP cloud providers. Manage cloud credentials, VPC attachments, transit gateways, and cross-cloud networking with...",
44178
44304
  aliases: ["cloud", "infra", "provider"],
44179
44305
  complexity: "moderate",
44180
44306
  isPreview: false,
@@ -44187,6 +44313,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44187
44313
  name: "container_services",
44188
44314
  displayName: "Container Services",
44189
44315
  description: "Container Services (XCCS) enables deployment and management of containerized applications across distributed edge sites without requiring full Kubernetes complexity. Create virtual Kubernetes clusters for isolated multi-tenant environments, define workload flavors for resource allocation, and deploy container workloads with simplified orchestration. Monitor workload usage and PVC metrics, manage namespace isolation, and integrate with site infrastructure for edge-native container...",
44316
+ descriptionShort: "Edge container workloads and virtual Kubernetes management",
44317
+ descriptionMedium: "Deploy and manage containerized workloads at the edge with simplified orchestration. Configure virtual Kubernetes clusters, workload flavors, and...",
44190
44318
  aliases: ["vk8s", "containers", "workloads"],
44191
44319
  complexity: "moderate",
44192
44320
  isPreview: false,
@@ -44199,6 +44327,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44199
44327
  name: "data_and_privacy_security",
44200
44328
  displayName: "Data And Privacy Security",
44201
44329
  description: "Manage comprehensive data privacy and security controls including sensitive data detection policies, custom data type definitions, and log management analytics (LMA) region configurations. Define patterns for identifying PII, financial data, and other sensitive information with configurable actions for masking, alerting, or blocking. Configure LMA regions with Elasticsearch, Kafka, or ClickHouse backends for centralized security logging and compliance auditing. Integrate geo-configurations...",
44330
+ descriptionShort: "Sensitive data detection, classification, and privacy...",
44331
+ descriptionMedium: "Configure data types, sensitive data policies, and LMA regions for detecting, classifying, and protecting personally identifiable information and...",
44202
44332
  aliases: [],
44203
44333
  complexity: "simple",
44204
44334
  isPreview: false,
@@ -44211,6 +44341,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44211
44341
  name: "data_intelligence",
44212
44342
  displayName: "Data Intelligence",
44213
44343
  description: "F5 Distributed Cloud Data Intelligence API specifications",
44344
+ descriptionShort: "Data Intelligence API",
44345
+ descriptionMedium: "F5 Distributed Cloud Data Intelligence API specifications",
44214
44346
  aliases: ["di", "intelligence", "insights"],
44215
44347
  complexity: "moderate",
44216
44348
  isPreview: false,
@@ -44223,6 +44355,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44223
44355
  name: "ddos",
44224
44356
  displayName: "Ddos",
44225
44357
  description: "Comprehensive DDoS protection and infrastructure security management. Configure deny list rules to block malicious traffic sources, create firewall rule groups for granular traffic filtering, and manage protection tunnels for secure infrastructure connectivity. The infraprotect APIs enable proactive threat mitigation through customizable security policies, real-time tunnel status monitoring, and namespace-scoped rule management. Integrates with network security and virtual load balancing for...",
44358
+ descriptionShort: "DDoS protection and infrastructure security policies",
44359
+ descriptionMedium: "Configure DDoS protection policies, deny lists, and firewall rules. Monitor infrastructure threats and manage protection tunnels for network security.",
44226
44360
  aliases: ["dos", "ddos-protect"],
44227
44361
  complexity: "advanced",
44228
44362
  isPreview: false,
@@ -44235,6 +44369,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44235
44369
  name: "dns",
44236
44370
  displayName: "Dns",
44237
44371
  description: "Comprehensive DNS management for zones, domains, and resource records. Configure DNS load balancing with health checks for high availability. Import and export zone files via BIND format or AXFR transfers. Manage resource record sets including A, AAAA, CNAME, CAA, CERT, AFSDB, and DLV records. Monitor DNS performance through metrics and request logs. Clone zones from existing domains and enforce DNS compliance policies across namespaces.",
44372
+ descriptionShort: "DNS zone management, load balancing, and record...",
44373
+ descriptionMedium: "Manage DNS zones, configure DNS load balancing with health checks, and control resource record sets. Supports zone imports, BIND file handling,...",
44238
44374
  aliases: ["dns-zone", "zones"],
44239
44375
  complexity: "advanced",
44240
44376
  isPreview: false,
@@ -44297,6 +44433,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44297
44433
  name: "generative_ai",
44298
44434
  displayName: "Generative Ai",
44299
44435
  description: "Generative AI services providing intelligent automation and analysis capabilities. Configure AI assistant policies and submit queries with feedback tracking for continuous improvement. Enable flow anomaly detection powered by machine learning. Manage AI data collection through the BFDP subsystem including feature enablement, token management, and subscription controls. Supports IP allocation for GIA services. Integrates dashboard visualization with customizable displays, filters, and link...",
44436
+ descriptionShort: "AI-powered features, assistants, and data collection",
44437
+ descriptionMedium: "Access generative AI capabilities including AI assistant queries, flow anomaly detection, and AI data collection with feedback mechanisms.",
44300
44438
  aliases: ["ai", "genai", "assistant"],
44301
44439
  complexity: "simple",
44302
44440
  isPreview: true,
@@ -44309,6 +44447,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44309
44447
  name: "managed_kubernetes",
44310
44448
  displayName: "Managed Kubernetes",
44311
44449
  description: "Configure and manage Managed Kubernetes (XCKS) security and access controls. Define cluster roles with fine-grained permissions for API resources and non-resource URLs. Create role bindings to associate users and groups with cluster-wide permissions. Enforce pod security standards through admission controllers with configurable enforcement levels. Manage private container registries for secure image distribution. Integrates with external Kubernetes clusters including EKS, AKS, and GKE for...",
44450
+ descriptionShort: "Kubernetes RBAC, pod security, and container registries",
44451
+ descriptionMedium: "Manage Kubernetes cluster roles, RBAC bindings, pod security admission policies, and container registries for enterprise deployments.",
44312
44452
  aliases: ["mk8s", "appstack", "k8s-mgmt"],
44313
44453
  complexity: "moderate",
44314
44454
  isPreview: false,
@@ -44321,6 +44461,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44321
44461
  name: "marketplace",
44322
44462
  displayName: "Marketplace",
44323
44463
  description: "Access and manage the marketplace ecosystem including third-party integrations, add-on services, and external connectors. Configure connection types for direct, GRE tunnel, and IPSec connectivity with customizable IKE parameters and DPD keepalive settings. Manage navigation tiles for custom UI extensions, activate and monitor add-on service status across namespaces, and integrate with external platforms like Terraform. Supports TPM policy management and configuration management instances for...",
44464
+ descriptionShort: "Third-party integrations, add-ons, and extensions",
44465
+ descriptionMedium: "Manage marketplace extensions, external connectors, and third-party add-on services. Configure Terraform integrations and TPM policies.",
44324
44466
  aliases: ["market", "addons", "extensions"],
44325
44467
  complexity: "moderate",
44326
44468
  isPreview: false,
@@ -44333,6 +44475,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44333
44475
  name: "network",
44334
44476
  displayName: "Network",
44335
44477
  description: "Comprehensive network infrastructure management including BGP routing with ASN configuration and peering policies, IPsec tunnel establishment with full IKE phase 1 and phase 2 parameter control, and network connector configuration for hybrid cloud connectivity. Supports SRv6 segment routing, subnet management, DC cluster groups for data center integration, static and dynamic route definitions, and IP prefix set policies. Enables secure site-to-site VPN connections, multi-cloud network...",
44478
+ descriptionShort: "BGP routing, IPsec tunnels, and network connectivity",
44479
+ descriptionMedium: "Configure BGP routing policies, IPsec tunnels with IKE phases, network connectors, SRv6, and IP prefix sets for secure site-to-site connectivity.",
44336
44480
  aliases: ["net", "routing", "bgp"],
44337
44481
  complexity: "advanced",
44338
44482
  isPreview: false,
@@ -44345,6 +44489,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44345
44489
  name: "network_security",
44346
44490
  displayName: "Network Security",
44347
44491
  description: "Network security controls for protecting traffic at the network layer. Configure network firewalls with stateful inspection and ACL rules. Define NAT policies for address translation, port forwarding, and dynamic pool management. Create network policy sets for segmentation and micro-segmentation between workloads. Implement policy-based routing to direct traffic based on source, destination, or application criteria. Manage segment connections for multi-site network isolation. Configure...",
44492
+ descriptionShort: "Network firewall, NAT, ACL, and policy-based routing",
44493
+ descriptionMedium: "Configure network firewalls, NAT policies, ACLs, and policy-based routing. Manage network segmentation, port forwarding, and forward proxy policies.",
44348
44494
  aliases: ["netsec", "nfw"],
44349
44495
  complexity: "advanced",
44350
44496
  isPreview: false,
@@ -44357,6 +44503,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44357
44503
  name: "nginx_one",
44358
44504
  displayName: "Nginx One",
44359
44505
  description: "Integrate and manage NGINX One platform capabilities including subscription lifecycle management, NGINX Plus instance provisioning, and server configuration. Configure dataplane servers, manage nginx instances with WAF and API discovery specifications, and enable service discovery integrations. Supports NGINX Configuration Sync Gateway (CSG) configurations for centralized management workflows. Typical operations include subscribing to NGINX One services, retrieving server status and...",
44506
+ descriptionShort: "NGINX One platform integration and instance management",
44507
+ descriptionMedium: "Manage NGINX One platform subscriptions, configure NGINX Plus instances and servers, and integrate service discovery with centralized...",
44360
44508
  aliases: ["nginx", "nms", "nginx-plus"],
44361
44509
  complexity: "simple",
44362
44510
  isPreview: false,
@@ -44369,6 +44517,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44369
44517
  name: "object_storage",
44370
44518
  displayName: "Object Storage",
44371
44519
  description: "Manage versioned object storage for mobile application components and platform integrations. Upload and retrieve mobile app shield configurations, SDK integrations, and custom artifacts organized by namespace and object type. Support for multiple versions of each object enables rollback and version-specific deployments. Presigned URLs provide secure, time-limited access for direct object downloads. Object types include mobile-app-shield for application protection, mobile-integrator for...",
44520
+ descriptionShort: "Object storage for mobile SDK artifacts and integrations",
44521
+ descriptionMedium: "Store and retrieve versioned objects including mobile app shields, SDK integrations, and custom artifacts with presigned URL access.",
44372
44522
  aliases: ["storage", "s3", "buckets"],
44373
44523
  complexity: "simple",
44374
44524
  isPreview: false,
@@ -44381,6 +44531,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44381
44531
  name: "observability",
44382
44532
  displayName: "Observability",
44383
44533
  description: "Comprehensive synthetic monitoring and observability capabilities for proactive infrastructure health assessment. Configure DNS monitors to validate resolution across AWS regions, set up HTTP monitors for endpoint availability testing, and track SSL/TLS certificate expiration status. Access real-time health summaries at global and namespace levels, review historical monitoring data, and generate detailed reports for DNS and HTTP monitors. Integrate with dashboards to visualize monitoring...",
44534
+ descriptionShort: "Synthetic monitoring, health checks, and observability...",
44535
+ descriptionMedium: "Configure synthetic monitoring with DNS and HTTP health checks. Track certificate status, monitor global health summaries, and analyze monitoring...",
44384
44536
  aliases: ["obs", "monitoring", "synth"],
44385
44537
  complexity: "advanced",
44386
44538
  isPreview: false,
@@ -44393,6 +44545,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44393
44545
  name: "rate_limiting",
44394
44546
  displayName: "Rate Limiting",
44395
44547
  description: "Manage rate limiting policies to protect applications from traffic surges and abuse. Configure rate limiters with customizable thresholds, time periods, and enforcement actions including blocking or throttling. Implement policers using leaky bucket algorithms for smooth traffic shaping. Define protocol-specific policers for granular control over different traffic types. Integrate with virtual hosts and load balancers to enforce rate limits at the edge, preventing resource exhaustion and...",
44548
+ descriptionShort: "Traffic rate limiting, policers, and throttling controls",
44549
+ descriptionMedium: "Configure rate limiters and policers to control traffic flow. Define request thresholds, leaky bucket algorithms, and enforcement actions for API...",
44396
44550
  aliases: ["ratelimit", "throttle", "policer"],
44397
44551
  complexity: "simple",
44398
44552
  isPreview: false,
@@ -44405,6 +44559,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44405
44559
  name: "secops_and_incident_response",
44406
44560
  displayName: "Secops And Incident Response",
44407
44561
  description: "Security operations and incident response capabilities for detecting and mitigating malicious user activity. Create mitigation policies that define automated responses based on user threat levels, including blocking, challenging, or rate limiting suspicious users. Configure rules that match specific malicious user types and threat severity levels to appropriate mitigation actions. Supports namespace-scoped configurations for managing security policies across different application...",
44562
+ descriptionShort: "Malicious user detection and automated threat mitigation",
44563
+ descriptionMedium: "Configure automated responses to malicious user behavior. Define mitigation rules based on threat levels and apply actions like blocking or rate...",
44408
44564
  aliases: [],
44409
44565
  complexity: "simple",
44410
44566
  isPreview: false,
@@ -44417,6 +44573,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44417
44573
  name: "service_mesh",
44418
44574
  displayName: "Service Mesh",
44419
44575
  description: "Manage service mesh infrastructure including endpoint discovery and intelligent routing between distributed services. Define application types with learned API schemas, security risk classifications, and authentication configurations. Configure NFV (Network Function Virtualization) services with lifecycle management including force-delete operations. Leverage machine learning capabilities for automatic API endpoint detection, schema learning, and traffic pattern analysis. Integrate with...",
44576
+ descriptionShort: "Service mesh connectivity, discovery, and NFV management",
44577
+ descriptionMedium: "Configure service mesh networking with endpoint discovery, application type definitions, API endpoint learning, and NFV service lifecycle management.",
44420
44578
  aliases: ["mesh", "svc-mesh"],
44421
44579
  complexity: "advanced",
44422
44580
  isPreview: false,
@@ -44429,6 +44587,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44429
44587
  name: "shape",
44430
44588
  displayName: "Shape",
44431
44589
  description: "Shape Security integration for advanced bot defense and threat prevention capabilities. Configure bot infrastructure deployments with policy management, deployment history tracking, and status monitoring. Manage mobile SDK attributes for application shielding and integrator configurations. Subscribe to bot defense add-ons and client-side defense services. Includes SafeAP policy configuration, threat recognition rules, and automated bot mitigation across namespaces with comprehensive...",
44590
+ descriptionShort: "Bot defense and threat prevention with Shape Security",
44591
+ descriptionMedium: "Configure Shape Security policies for bot defense, threat recognition, and mobile SDK protection. Manage bot infrastructure deployments and SafeAP...",
44432
44592
  aliases: ["shape-sec", "safeap"],
44433
44593
  complexity: "advanced",
44434
44594
  isPreview: false,
@@ -44441,6 +44601,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44441
44601
  name: "sites",
44442
44602
  displayName: "Sites",
44443
44603
  description: "Comprehensive site infrastructure management for deploying F5 XC across multiple cloud providers and edge locations. Configure AWS Transit Gateway sites with VPN tunnels, VPC IP prefixes, and security settings. Manage virtual sites for logical grouping and policy application. Deploy Secure Mesh sites for networking-focused edge deployments, integrate external Kubernetes clusters as Customer Edge nodes, and configure cloud-specific resources including AWS VPC, Azure VNet, and GCP VPC sites....",
44604
+ descriptionShort: "Multi-cloud site deployment and edge infrastructure",
44605
+ descriptionMedium: "Deploy and manage F5 XC sites across AWS, Azure, and GCP. Configure AWS TGW sites, virtual sites, managed Kubernetes, and Customer Edge integrations.",
44444
44606
  aliases: ["site", "deployment"],
44445
44607
  complexity: "advanced",
44446
44608
  isPreview: false,
@@ -44505,6 +44667,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44505
44667
  name: "statistics",
44506
44668
  displayName: "Statistics",
44507
44669
  description: "Comprehensive operational analytics and monitoring capabilities for distributed cloud infrastructure. Configure alert policies with custom matchers and grouping rules to detect anomalies across namespaces. Manage alert receivers with confirmation, testing, and verification workflows for reliable notification delivery. Access flow statistics, view historical alerts, generate reports and graphs for capacity planning, track service topology and discovery patterns, and monitor real-time status...",
44670
+ descriptionShort: "Flow statistics, alerts, logs, and operational analytics",
44671
+ descriptionMedium: "Access flow statistics and analytics, configure alert policies and receivers, view logs, generate reports and graphs, and monitor site status.",
44508
44672
  aliases: ["stats", "metrics", "logs"],
44509
44673
  complexity: "advanced",
44510
44674
  isPreview: false,
@@ -44517,6 +44681,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44517
44681
  name: "support",
44518
44682
  displayName: "Support",
44519
44683
  description: "Manage the complete customer support ticket lifecycle including creation, commenting, priority adjustment, escalation, and closure. Submit specialized requests such as tax exemption verification. Access site-level diagnostic capabilities including TCP dump capture, listing, and management for network troubleshooting. Integrates with operational workflows to enable support teams to gather diagnostic data directly from distributed sites while maintaining ticket-based tracking of all customer...",
44684
+ descriptionShort: "Customer support ticket lifecycle and site diagnostics",
44685
+ descriptionMedium: "Create, track, and manage support tickets with escalation workflows. Includes site diagnostic tools for packet capture and troubleshooting.",
44520
44686
  aliases: ["tickets", "help-desk"],
44521
44687
  complexity: "moderate",
44522
44688
  isPreview: false,
@@ -44529,6 +44695,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44529
44695
  name: "telemetry_and_insights",
44530
44696
  displayName: "Telemetry And Insights",
44531
44697
  description: "F5 Distributed Cloud Telemetry And Insights API specifications",
44698
+ descriptionShort: "Telemetry And Insights API",
44699
+ descriptionMedium: "F5 Distributed Cloud Telemetry And Insights API specifications",
44532
44700
  aliases: ["telemetry", "ti"],
44533
44701
  complexity: "moderate",
44534
44702
  isPreview: false,
@@ -44541,6 +44709,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44541
44709
  name: "tenant_and_identity",
44542
44710
  displayName: "Tenant And Identity",
44543
44711
  description: "Comprehensive user and tenant identity management for F5 Distributed Cloud. Configure user settings including profile images, notification preferences (admin and combined), and view preferences. Manage user sessions with listing and control capabilities. Handle OTP (one-time password) administration including admin resets. Support identity management (IDM) enable/disable operations. Process initial access requests for new users. Manage customer support ticket attachments and interactions for...",
44712
+ descriptionShort: "User settings, notifications, sessions, and identity...",
44713
+ descriptionMedium: "Manage user profiles, notification preferences, session controls, OTP settings, and customer support interactions. Configure identity management...",
44544
44714
  aliases: [],
44545
44715
  complexity: "advanced",
44546
44716
  isPreview: false,
@@ -44553,6 +44723,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44553
44723
  name: "threat_campaign",
44554
44724
  displayName: "Threat Campaign",
44555
44725
  description: "F5 Distributed Cloud Threat Campaign API specifications",
44726
+ descriptionShort: "Threat Campaign API",
44727
+ descriptionMedium: "F5 Distributed Cloud Threat Campaign API specifications",
44556
44728
  aliases: ["threats", "campaigns", "threat-intel"],
44557
44729
  complexity: "moderate",
44558
44730
  isPreview: false,
@@ -44565,6 +44737,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44565
44737
  name: "users",
44566
44738
  displayName: "Users",
44567
44739
  description: "Comprehensive user and identity management for the F5 XC platform. Create and manage registration tokens for site and node onboarding, including cloud-init configuration retrieval. Define known label keys and values to establish consistent resource tagging taxonomies across namespaces. Configure implicit labels for automatic resource classification. Supports full lifecycle management of user-related configuration objects with metadata tracking, state management, and condition monitoring for...",
44740
+ descriptionShort: "User accounts, tokens, and label management",
44741
+ descriptionMedium: "Manage user accounts, registration tokens, and label systems. Configure known and implicit labels for resource organization and user identification.",
44568
44742
  aliases: ["user", "accounts", "iam"],
44569
44743
  complexity: "simple",
44570
44744
  isPreview: false,
@@ -44577,6 +44751,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44577
44751
  name: "virtual",
44578
44752
  displayName: "Virtual",
44579
44753
  description: "Comprehensive application delivery and traffic management capabilities including HTTP/HTTPS/TCP/UDP load balancers, origin pool configuration, virtual host management, and advanced routing rules. Supports rate limiting policies, service policy enforcement, geo-location-based routing, and proxy forwarding configurations. Integrates with security features including malware protection, threat campaign detection, and WAF policy attachment. Provides health check configuration, endpoint...",
44754
+ descriptionShort: "HTTP/HTTPS load balancing and traffic management",
44755
+ descriptionMedium: "Configure HTTP, TCP, and UDP load balancers with origin pools, virtual hosts, routing rules, rate limiting, and service policies for application...",
44580
44756
  aliases: ["lb", "loadbalancer", "vhost"],
44581
44757
  complexity: "advanced",
44582
44758
  isPreview: false,
@@ -44641,6 +44817,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44641
44817
  name: "vpm_and_node_management",
44642
44818
  displayName: "Vpm And Node Management",
44643
44819
  description: "F5 Distributed Cloud Vpm And Node Management API specifications",
44820
+ descriptionShort: "Vpm And Node Management API",
44821
+ descriptionMedium: "F5 Distributed Cloud Vpm And Node Management API specifications",
44644
44822
  aliases: ["vpm", "nodes", "node-mgmt"],
44645
44823
  complexity: "simple",
44646
44824
  isPreview: false,
@@ -44653,6 +44831,8 @@ var generatedDomains = /* @__PURE__ */ new Map([
44653
44831
  name: "waf",
44654
44832
  displayName: "Waf",
44655
44833
  description: "Web Application Firewall (WAF) configuration and management for protecting applications against common attacks and vulnerabilities. Define application firewall policies with attack type detection, bot protection settings, and custom blocking pages. Manage WAF exclusion policies for legitimate traffic patterns, configure signature staging and release workflows, and monitor security events with detailed rule hit metrics. Supports AI-powered risk-based blocking, anonymization settings for...",
44834
+ descriptionShort: "Web application firewall rules and security policies",
44835
+ descriptionMedium: "Configure web application firewall rules, manage security policies, and enable attack detection with customizable blocking actions and signature...",
44656
44836
  aliases: ["firewall", "appfw"],
44657
44837
  complexity: "advanced",
44658
44838
  isPreview: false,
@@ -44678,6 +44858,13 @@ function initializeAliasRegistry() {
44678
44858
  function resolveDomain(nameOrAlias) {
44679
44859
  return aliasRegistry.get(nameOrAlias);
44680
44860
  }
44861
+ function getDomainInfo(nameOrAlias) {
44862
+ const canonical = resolveDomain(nameOrAlias);
44863
+ if (!canonical) {
44864
+ return void 0;
44865
+ }
44866
+ return domainRegistry.get(canonical);
44867
+ }
44681
44868
  function allDomains() {
44682
44869
  return Array.from(domainRegistry.keys()).sort();
44683
44870
  }
@@ -44983,8 +45170,8 @@ var HistoryManager = class _HistoryManager {
44983
45170
  var CLI_NAME = "xcsh";
44984
45171
  var CLI_FULL_NAME = "F5 Distributed Cloud Shell";
44985
45172
  function getVersion() {
44986
- if ("6.19.0") {
44987
- return "6.19.0";
45173
+ if ("6.21.0") {
45174
+ return "6.21.0";
44988
45175
  }
44989
45176
  if (process.env.XCSH_VERSION) {
44990
45177
  return process.env.XCSH_VERSION;
@@ -44992,6 +45179,7 @@ function getVersion() {
44992
45179
  return "dev";
44993
45180
  }
44994
45181
  var CLI_VERSION = getVersion();
45182
+ var CONFIG_FILE_NAME = ".xcshconfig";
44995
45183
  var ENV_PREFIX = "F5XC";
44996
45184
  var F5_LOGO = ` ________
44997
45185
  (\u2592\u2592\u2592\u2592\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2593\u2592\u2592\u2592\u2592)
@@ -45034,6 +45222,15 @@ var REPO_OWNER = "robinmordasiewicz";
45034
45222
  var REPO_NAME = CLI_NAME;
45035
45223
  var REPO_URL = `https://github.com/${REPO_OWNER}/${REPO_NAME}`;
45036
45224
  var DOCS_URL = `https://${REPO_OWNER}.github.io/${REPO_NAME}/`;
45225
+ function colorRed(text) {
45226
+ return `${colors.red}${text}${colors.reset}`;
45227
+ }
45228
+ function colorBoldWhite(text) {
45229
+ return `${colors.boldWhite}${text}${colors.reset}`;
45230
+ }
45231
+ function colorDim(text) {
45232
+ return `${colors.dim}${text}${colors.reset}`;
45233
+ }
45037
45234
 
45038
45235
  // src/profile/manager.ts
45039
45236
  var import_yaml = __toESM(require_dist(), 1);
@@ -46482,22 +46679,8 @@ var REPLSession = class {
46482
46679
  };
46483
46680
 
46484
46681
  // src/repl/prompt.ts
46485
- function buildPlainPrompt(session) {
46486
- const parts = [];
46487
- const profileName = session.getActiveProfileName();
46488
- if (profileName) {
46489
- parts.push(`${profileName}@xc`);
46490
- } else {
46491
- parts.push("xc");
46492
- }
46493
- const ctx = session.getContextPath();
46494
- if (ctx.domain !== "") {
46495
- parts.push(ctx.domain);
46496
- if (ctx.action !== "") {
46497
- parts.push(ctx.action);
46498
- }
46499
- }
46500
- return `<${parts.join(".")}> `;
46682
+ function buildPlainPrompt(_session) {
46683
+ return "> ";
46501
46684
  }
46502
46685
 
46503
46686
  // src/repl/App.tsx
@@ -46778,151 +46961,10 @@ function toDisplayTier(tier) {
46778
46961
 
46779
46962
  // src/repl/components/Banner.tsx
46780
46963
  var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
46781
- var BOX = {
46782
- topLeft: "\u256D",
46783
- topRight: "\u256E",
46784
- bottomLeft: "\u2570",
46785
- bottomRight: "\u256F",
46786
- horizontal: "\u2500",
46787
- vertical: "\u2502",
46788
- leftT: "\u251C",
46789
- rightT: "\u2524"
46790
- };
46791
46964
  var TOTAL_WIDTH = 80;
46792
46965
  var INNER_WIDTH = TOTAL_WIDTH - 2;
46793
46966
  var logoLines = F5_LOGO.split("\n");
46794
46967
  var LOGO_WIDTH = Math.max(...logoLines.map((l) => stringWidth(l)));
46795
- var HELP_LINES = [
46796
- "Type 'help' for commands",
46797
- "Run 'namespace <ns>' to set",
46798
- "Press Ctrl+C twice to exit"
46799
- ];
46800
- var HELP_START_ROW = 8;
46801
- function padToWidth(str, targetWidth) {
46802
- const currentWidth = stringWidth(str);
46803
- if (currentWidth >= targetWidth) return str;
46804
- return str + " ".repeat(targetWidth - currentWidth);
46805
- }
46806
- function colorizeLogoLine(line) {
46807
- const elements = [];
46808
- let currentColor = null;
46809
- let buffer = "";
46810
- let keyIndex = 0;
46811
- const flush = () => {
46812
- if (buffer) {
46813
- if (currentColor) {
46814
- elements.push(
46815
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { color: currentColor, children: buffer }, keyIndex++)
46816
- );
46817
- } else {
46818
- elements.push(/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { children: buffer }, keyIndex++));
46819
- }
46820
- buffer = "";
46821
- }
46822
- };
46823
- for (const char of line) {
46824
- let newColor;
46825
- switch (char) {
46826
- case "\u2593":
46827
- // Dark shade - red
46828
- case "\u2592":
46829
- // Medium shade - red
46830
- case "(":
46831
- case ")":
46832
- case "|":
46833
- case "_":
46834
- newColor = "#E4002B";
46835
- break;
46836
- case "\u2588":
46837
- newColor = "#ffffff";
46838
- break;
46839
- default:
46840
- newColor = null;
46841
- }
46842
- if (newColor !== currentColor) {
46843
- flush();
46844
- currentColor = newColor;
46845
- }
46846
- buffer += char === "\u2593" ? "\u2588" : char;
46847
- }
46848
- flush();
46849
- return elements;
46850
- }
46851
- function buildContentRow(logoLine, helpText, innerWidth) {
46852
- const paddedLogo = padToWidth(logoLine, LOGO_WIDTH);
46853
- const helpColumnWidth = innerWidth - LOGO_WIDTH - 1;
46854
- const paddedHelp = padToWidth(helpText, helpColumnWidth);
46855
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Text, { children: [
46856
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { color: "#E4002B", children: BOX.vertical }),
46857
- colorizeLogoLine(paddedLogo),
46858
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { children: " " }),
46859
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { bold: true, color: "#ffffff", children: paddedHelp }),
46860
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { color: "#E4002B", children: BOX.vertical })
46861
- ] });
46862
- }
46863
- function Banner({
46864
- version,
46865
- connectionInfo
46866
- }) {
46867
- const title = ` ${CLI_FULL_NAME} v${version} `;
46868
- const titleWidth = stringWidth(title);
46869
- const leftDashes = 3;
46870
- const rightDashes = TOTAL_WIDTH - 1 - leftDashes - titleWidth - 1;
46871
- const connectionLines = [];
46872
- if (!connectionInfo.isConnected) {
46873
- connectionLines.push("Not connected - run: export F5XC_API_URL=...");
46874
- } else {
46875
- if (connectionInfo.tenant) {
46876
- connectionLines.push(`Tenant: ${connectionInfo.tenant}`);
46877
- }
46878
- if (connectionInfo.username) {
46879
- connectionLines.push(`User: ${connectionInfo.username}`);
46880
- }
46881
- if (connectionInfo.tier) {
46882
- const displayTier = toDisplayTier(connectionInfo.tier);
46883
- if (displayTier) {
46884
- connectionLines.push(`Tier: ${displayTier}`);
46885
- }
46886
- }
46887
- }
46888
- connectionLines.push(`Namespace: ${connectionInfo.namespace}`);
46889
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Box_default, { flexDirection: "column", marginY: 1, children: [
46890
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Text, { children: [
46891
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Text, { color: "#E4002B", children: [
46892
- BOX.topLeft,
46893
- BOX.horizontal.repeat(leftDashes)
46894
- ] }),
46895
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { bold: true, color: "#ffffff", children: title }),
46896
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Text, { color: "#E4002B", children: [
46897
- BOX.horizontal.repeat(Math.max(0, rightDashes)),
46898
- BOX.topRight
46899
- ] })
46900
- ] }),
46901
- logoLines.map((logoLine, index) => {
46902
- const helpIndex = index - HELP_START_ROW;
46903
- const helpText = helpIndex >= 0 && helpIndex < HELP_LINES.length ? HELP_LINES[helpIndex] : "";
46904
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Box_default, { children: buildContentRow(logoLine, helpText ?? "", INNER_WIDTH) }, index);
46905
- }),
46906
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Text, { color: "#E4002B", children: [
46907
- BOX.leftT,
46908
- BOX.horizontal.repeat(INNER_WIDTH),
46909
- BOX.rightT
46910
- ] }),
46911
- connectionLines.map((line, index) => {
46912
- const paddedLine = padToWidth(` ${line}`, INNER_WIDTH);
46913
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Text, { children: [
46914
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { color: "#E4002B", children: BOX.vertical }),
46915
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { bold: true, color: "#ffffff", children: paddedLine }),
46916
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Text, { color: "#E4002B", children: BOX.vertical })
46917
- ] }, index);
46918
- }),
46919
- /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Text, { color: "#E4002B", children: [
46920
- BOX.bottomLeft,
46921
- BOX.horizontal.repeat(INNER_WIDTH),
46922
- BOX.bottomRight
46923
- ] })
46924
- ] });
46925
- }
46926
46968
 
46927
46969
  // src/repl/components/Suggestions.tsx
46928
46970
  var import_react24 = __toESM(require_react(), 1);
@@ -47199,6 +47241,9 @@ var DomainRegistry = class {
47199
47241
  }
47200
47242
  const firstArg = args[0]?.toLowerCase() ?? "";
47201
47243
  const restArgs = args.slice(1);
47244
+ if (firstArg === "--help" || firstArg === "-h" || firstArg === "help") {
47245
+ return this.showDomainHelp(domain);
47246
+ }
47202
47247
  const subgroup = domain.subcommands.get(firstArg);
47203
47248
  if (subgroup) {
47204
47249
  if (restArgs.length === 0) {
@@ -47856,7 +47901,7 @@ function formatWhoamiBox(info, options) {
47856
47901
  const lines = [];
47857
47902
  const red = colors.red;
47858
47903
  const reset = colors.reset;
47859
- const BOX2 = {
47904
+ const BOX = {
47860
47905
  topLeft: "\u256D",
47861
47906
  topRight: "\u256E",
47862
47907
  bottomLeft: "\u2570",
@@ -47922,12 +47967,12 @@ function formatWhoamiBox(info, options) {
47922
47967
  const leftDashes = 1;
47923
47968
  const rightDashes = Math.max(0, remainingWidth - leftDashes);
47924
47969
  lines.push(
47925
- `${red}${BOX2.topLeft}${BOX2.horizontal.repeat(leftDashes)}${reset}${title}${red}${BOX2.horizontal.repeat(rightDashes)}${BOX2.topRight}${reset}`
47970
+ `${red}${BOX.topLeft}${BOX.horizontal.repeat(leftDashes)}${reset}${title}${red}${BOX.horizontal.repeat(rightDashes)}${BOX.topRight}${reset}`
47926
47971
  );
47927
47972
  for (const text of formattedContent) {
47928
47973
  const padding = innerWidth - text.length;
47929
47974
  lines.push(
47930
- `${red}${BOX2.vertical}${reset} ${text}${" ".repeat(Math.max(0, padding - 1))}${red}${BOX2.vertical}${reset}`
47975
+ `${red}${BOX.vertical}${reset} ${text}${" ".repeat(Math.max(0, padding - 1))}${red}${BOX.vertical}${reset}`
47931
47976
  );
47932
47977
  }
47933
47978
  if (quotaLines.length > 0) {
@@ -47936,12 +47981,12 @@ function formatWhoamiBox(info, options) {
47936
47981
  const quotaLeft = 1;
47937
47982
  const quotaRight = Math.max(0, quotaRemaining - quotaLeft);
47938
47983
  lines.push(
47939
- `${red}${BOX2.leftT}${BOX2.horizontal.repeat(quotaLeft)}${reset}${quotaTitle}${red}${BOX2.horizontal.repeat(quotaRight)}${BOX2.rightT}${reset}`
47984
+ `${red}${BOX.leftT}${BOX.horizontal.repeat(quotaLeft)}${reset}${quotaTitle}${red}${BOX.horizontal.repeat(quotaRight)}${BOX.rightT}${reset}`
47940
47985
  );
47941
47986
  for (const text of quotaLines) {
47942
47987
  const padding = innerWidth - text.length;
47943
47988
  lines.push(
47944
- `${red}${BOX2.vertical}${reset} ${text}${" ".repeat(Math.max(0, padding - 1))}${red}${BOX2.vertical}${reset}`
47989
+ `${red}${BOX.vertical}${reset} ${text}${" ".repeat(Math.max(0, padding - 1))}${red}${BOX.vertical}${reset}`
47945
47990
  );
47946
47991
  }
47947
47992
  }
@@ -47951,17 +47996,17 @@ function formatWhoamiBox(info, options) {
47951
47996
  const addonLeft = 1;
47952
47997
  const addonRight = Math.max(0, addonRemaining - addonLeft);
47953
47998
  lines.push(
47954
- `${red}${BOX2.leftT}${BOX2.horizontal.repeat(addonLeft)}${reset}${addonTitle}${red}${BOX2.horizontal.repeat(addonRight)}${BOX2.rightT}${reset}`
47999
+ `${red}${BOX.leftT}${BOX.horizontal.repeat(addonLeft)}${reset}${addonTitle}${red}${BOX.horizontal.repeat(addonRight)}${BOX.rightT}${reset}`
47955
48000
  );
47956
48001
  for (const text of addonLines) {
47957
48002
  const padding = innerWidth - text.length;
47958
48003
  lines.push(
47959
- `${red}${BOX2.vertical}${reset} ${text}${" ".repeat(Math.max(0, padding - 1))}${red}${BOX2.vertical}${reset}`
48004
+ `${red}${BOX.vertical}${reset} ${text}${" ".repeat(Math.max(0, padding - 1))}${red}${BOX.vertical}${reset}`
47960
48005
  );
47961
48006
  }
47962
48007
  }
47963
48008
  lines.push(
47964
- `${red}${BOX2.bottomLeft}${BOX2.horizontal.repeat(innerWidth)}${BOX2.bottomRight}${reset}`
48009
+ `${red}${BOX.bottomLeft}${BOX.horizontal.repeat(innerWidth)}${BOX.bottomRight}${reset}`
47965
48010
  );
47966
48011
  return lines;
47967
48012
  }
@@ -47997,7 +48042,9 @@ var profileSubcommands = {
47997
48042
  };
47998
48043
  var loginDomain = {
47999
48044
  name: "login",
48000
- description: "Authentication, identity, and session management",
48045
+ description: "Authentication, identity, and session management for F5 XC. Manage connection profiles to save and switch between tenants, handle context for namespace targeting, and verify current authentication status with whoami.",
48046
+ descriptionShort: "Authentication and session management",
48047
+ descriptionMedium: "Manage connection profiles, authentication contexts, and session identity for F5 Distributed Cloud.",
48001
48048
  commands: /* @__PURE__ */ new Map([["show", whoamiCommand]]),
48002
48049
  subcommands: /* @__PURE__ */ new Map([
48003
48050
  ["profile", profileSubcommands],
@@ -48665,7 +48712,9 @@ function formatSummaryYaml(summary) {
48665
48712
  }
48666
48713
  var cloudstatusDomain = {
48667
48714
  name: "cloudstatus",
48668
- description: "Monitor F5 Distributed Cloud service status and incidents",
48715
+ description: "Monitor F5 Distributed Cloud service status and incidents. Check overall status indicators, view component health, track active incidents and their updates, and monitor scheduled maintenance windows.",
48716
+ descriptionShort: "F5 XC service status and incidents",
48717
+ descriptionMedium: "Monitor F5 Distributed Cloud service health, active incidents, component status, and scheduled maintenance windows.",
48669
48718
  commands: /* @__PURE__ */ new Map([
48670
48719
  ["status", statusCommand],
48671
48720
  ["summary", summaryCommand],
@@ -49320,7 +49369,7 @@ function getAllDomains() {
49320
49369
  for (const domain of customDomains.all()) {
49321
49370
  domains.push({
49322
49371
  name: domain.name,
49323
- description: domain.description,
49372
+ description: domain.descriptionShort,
49324
49373
  aliases: []
49325
49374
  });
49326
49375
  seen.add(domain.name);
@@ -49342,7 +49391,7 @@ function getAllDomains() {
49342
49391
  if (seen.has(name)) continue;
49343
49392
  domains.push({
49344
49393
  name,
49345
- description: info.description,
49394
+ description: info.descriptionShort,
49346
49395
  aliases: info.aliases
49347
49396
  });
49348
49397
  seen.add(name);
@@ -49685,7 +49734,9 @@ var fishCommand = {
49685
49734
  };
49686
49735
  var completionDomain = {
49687
49736
  name: "completion",
49688
- description: "Generate shell completion scripts for bash, zsh, and fish",
49737
+ description: "Generate shell completion scripts for bash, zsh, and fish shells. Enables tab-completion for xcsh commands, domains, actions, and flags in your preferred shell environment.",
49738
+ descriptionShort: "Shell completion script generation",
49739
+ descriptionMedium: "Generate tab-completion scripts for bash, zsh, and fish shells to enhance the xcsh command-line experience.",
49689
49740
  commands: /* @__PURE__ */ new Map([
49690
49741
  ["bash", bashCommand],
49691
49742
  ["zsh", zshCommand],
@@ -50209,7 +50260,7 @@ var Completer = class {
50209
50260
  if (addedDomains.has(domain)) continue;
50210
50261
  suggestions.push({
50211
50262
  text: domain,
50212
- description: meta.description,
50263
+ description: meta.descriptionShort,
50213
50264
  category: "domain"
50214
50265
  });
50215
50266
  addedDomains.add(domain);
@@ -50807,9 +50858,383 @@ function formatAPIError(statusCode, body, operation) {
50807
50858
  return lines.join("\n");
50808
50859
  }
50809
50860
 
50861
+ // src/config/envvars.ts
50862
+ var EnvVarRegistry = [
50863
+ {
50864
+ name: `${ENV_PREFIX}_API_URL`,
50865
+ description: "API endpoint URL",
50866
+ relatedFlag: "",
50867
+ required: true
50868
+ },
50869
+ {
50870
+ name: `${ENV_PREFIX}_API_TOKEN`,
50871
+ description: "API authentication token",
50872
+ relatedFlag: "",
50873
+ required: true
50874
+ },
50875
+ {
50876
+ name: `${ENV_PREFIX}_NAMESPACE`,
50877
+ description: "Default namespace",
50878
+ relatedFlag: "-ns"
50879
+ },
50880
+ {
50881
+ name: `${ENV_PREFIX}_OUTPUT_FORMAT`,
50882
+ description: "Output format (json, yaml, table)",
50883
+ relatedFlag: "-o"
50884
+ },
50885
+ {
50886
+ name: `${ENV_PREFIX}_SUBSCRIPTION_TIER`,
50887
+ description: "Subscription tier for feature validation",
50888
+ relatedFlag: ""
50889
+ },
50890
+ {
50891
+ name: "NO_COLOR",
50892
+ description: "Disable color output",
50893
+ relatedFlag: "--no-color"
50894
+ }
50895
+ ];
50896
+ function formatEnvVarsSection() {
50897
+ const maxLen = Math.max(...EnvVarRegistry.map((e) => e.name.length));
50898
+ const lines = ["ENVIRONMENT VARIABLES"];
50899
+ for (const env3 of EnvVarRegistry) {
50900
+ const padding = " ".repeat(maxLen - env3.name.length + 3);
50901
+ const flagNote = env3.relatedFlag ? ` [${env3.relatedFlag}]` : "";
50902
+ lines.push(` ${env3.name}${padding}${env3.description}${flagNote}`);
50903
+ }
50904
+ return lines;
50905
+ }
50906
+ function formatConfigSection() {
50907
+ return [
50908
+ "CONFIGURATION",
50909
+ ` Config file: ~/${CONFIG_FILE_NAME}`,
50910
+ " Priority: CLI flags > environment variables > config file > defaults",
50911
+ "",
50912
+ "DOCUMENTATION",
50913
+ ` ${DOCS_URL}`
50914
+ ];
50915
+ }
50916
+
50917
+ // src/repl/help.ts
50918
+ function formatRootHelp() {
50919
+ return [
50920
+ "",
50921
+ colorBoldWhite(`${CLI_NAME} - ${CLI_FULL_NAME} v${CLI_VERSION}`),
50922
+ "",
50923
+ "DESCRIPTION",
50924
+ ` Interactive CLI for F5 Distributed Cloud services.`,
50925
+ "",
50926
+ "USAGE",
50927
+ ` ${CLI_NAME} Enter interactive REPL mode`,
50928
+ ` ${CLI_NAME} <domain> <action> Execute command non-interactively`,
50929
+ ` ${CLI_NAME} help [topic] Show help for a topic`,
50930
+ "",
50931
+ "EXAMPLES",
50932
+ ` ${CLI_NAME} tenant_and_identity list namespace List all namespaces`,
50933
+ ` ${CLI_NAME} virtual get http_loadbalancer Get a specific load balancer`,
50934
+ ` ${CLI_NAME} dns list List DNS zones`,
50935
+ ` ${CLI_NAME} waf list -ns prod List WAF policies in prod`,
50936
+ ` ${CLI_NAME} --interactive Force interactive REPL mode`,
50937
+ "",
50938
+ ...formatDomainsSection(),
50939
+ "",
50940
+ ...formatGlobalFlags(),
50941
+ "",
50942
+ ...formatEnvVarsSection(),
50943
+ "",
50944
+ ...formatConfigSection(),
50945
+ "",
50946
+ "NAVIGATION (Interactive Mode)",
50947
+ " <domain> Navigate into a domain (e.g., 'dns', 'lb')",
50948
+ " /domain Navigate directly to domain from anywhere",
50949
+ " .. Go up one level",
50950
+ " / Return to root",
50951
+ " context Show current navigation context",
50952
+ "",
50953
+ "BUILTINS",
50954
+ " help Show this help",
50955
+ " domains List all available domains",
50956
+ " clear Clear the screen",
50957
+ " history Show command history",
50958
+ " quit, exit Exit the shell",
50959
+ ""
50960
+ ];
50961
+ }
50962
+ function formatGlobalFlags() {
50963
+ return [
50964
+ "GLOBAL FLAGS",
50965
+ " -v, --version Show version number",
50966
+ " -h, --help Show this help",
50967
+ " -i, --interactive Force interactive mode",
50968
+ " --no-color Disable color output",
50969
+ " -o, --output <fmt> Output format (json, yaml, table)",
50970
+ " -ns, --namespace <ns> Target namespace"
50971
+ ];
50972
+ }
50973
+ function formatEnvironmentVariables() {
50974
+ return formatEnvVarsSection();
50975
+ }
50976
+ function formatDomainHelp(domain) {
50977
+ const output = ["", colorBoldWhite(`${domain.displayName}`), ""];
50978
+ output.push(` ${domain.description}`);
50979
+ output.push("");
50980
+ if (domain.category || domain.complexity) {
50981
+ const meta = [];
50982
+ if (domain.category) meta.push(`Category: ${domain.category}`);
50983
+ if (domain.complexity) meta.push(`Complexity: ${domain.complexity}`);
50984
+ output.push(colorDim(` ${meta.join(" | ")}`));
50985
+ output.push("");
50986
+ }
50987
+ output.push("USAGE");
50988
+ output.push(` ${CLI_NAME} ${domain.name} <action> [options]`);
50989
+ output.push("");
50990
+ output.push("ACTIONS");
50991
+ const actionDescriptions = {
50992
+ list: "List resources",
50993
+ get: "Get a specific resource by name",
50994
+ create: "Create a new resource",
50995
+ delete: "Delete a resource",
50996
+ replace: "Replace a resource configuration",
50997
+ apply: "Apply configuration from file",
50998
+ status: "Get resource status",
50999
+ patch: "Patch a resource",
51000
+ "add-labels": "Add labels to a resource",
51001
+ "remove-labels": "Remove labels from a resource"
51002
+ };
51003
+ for (const action of validActions) {
51004
+ const desc = actionDescriptions[action] ?? action;
51005
+ output.push(` ${action.padEnd(16)} ${desc}`);
51006
+ }
51007
+ output.push("");
51008
+ output.push("EXAMPLES");
51009
+ output.push(` ${CLI_NAME} ${domain.name} list`);
51010
+ output.push(` ${CLI_NAME} ${domain.name} get my-resource`);
51011
+ output.push(
51012
+ ` ${CLI_NAME} ${domain.name} create my-resource -f config.yaml`
51013
+ );
51014
+ output.push(` ${CLI_NAME} ${domain.name} delete my-resource`);
51015
+ output.push("");
51016
+ if (domain.useCases && domain.useCases.length > 0) {
51017
+ output.push("USE CASES");
51018
+ for (const useCase of domain.useCases.slice(0, 5)) {
51019
+ output.push(` - ${useCase}`);
51020
+ }
51021
+ output.push("");
51022
+ }
51023
+ if (domain.relatedDomains && domain.relatedDomains.length > 0) {
51024
+ output.push("RELATED DOMAINS");
51025
+ output.push(` ${domain.relatedDomains.join(", ")}`);
51026
+ output.push("");
51027
+ }
51028
+ if (domain.aliases && domain.aliases.length > 0) {
51029
+ output.push("ALIASES");
51030
+ output.push(` ${domain.aliases.join(", ")}`);
51031
+ output.push("");
51032
+ }
51033
+ output.push(colorDim(`For global options, run: ${CLI_NAME} --help`));
51034
+ output.push("");
51035
+ return output;
51036
+ }
51037
+ function formatActionHelp(domainName, action) {
51038
+ const domain = getDomainInfo(domainName);
51039
+ const displayDomain = domain?.displayName ?? domainName;
51040
+ const actionDescriptions = {
51041
+ list: {
51042
+ desc: "List all resources in the namespace",
51043
+ usage: `${CLI_NAME} ${domainName} list [--limit N] [--label key=value]`
51044
+ },
51045
+ get: {
51046
+ desc: "Get a specific resource by name",
51047
+ usage: `${CLI_NAME} ${domainName} get <name> [-o json|yaml|table]`
51048
+ },
51049
+ create: {
51050
+ desc: "Create a new resource",
51051
+ usage: `${CLI_NAME} ${domainName} create <name> -f <file.yaml>`
51052
+ },
51053
+ delete: {
51054
+ desc: "Delete a resource by name",
51055
+ usage: `${CLI_NAME} ${domainName} delete <name>`
51056
+ },
51057
+ replace: {
51058
+ desc: "Replace an existing resource configuration",
51059
+ usage: `${CLI_NAME} ${domainName} replace <name> -f <file.yaml>`
51060
+ },
51061
+ apply: {
51062
+ desc: "Apply configuration from a file (create or update)",
51063
+ usage: `${CLI_NAME} ${domainName} apply -f <file.yaml>`
51064
+ },
51065
+ status: {
51066
+ desc: "Get the current status of a resource",
51067
+ usage: `${CLI_NAME} ${domainName} status <name>`
51068
+ },
51069
+ patch: {
51070
+ desc: "Patch specific fields of a resource",
51071
+ usage: `${CLI_NAME} ${domainName} patch <name> -f <patch.yaml>`
51072
+ },
51073
+ "add-labels": {
51074
+ desc: "Add labels to a resource",
51075
+ usage: `${CLI_NAME} ${domainName} add-labels <name> key=value`
51076
+ },
51077
+ "remove-labels": {
51078
+ desc: "Remove labels from a resource",
51079
+ usage: `${CLI_NAME} ${domainName} remove-labels <name> key`
51080
+ }
51081
+ };
51082
+ const actionInfo = actionDescriptions[action] ?? {
51083
+ desc: `Execute ${action} operation`,
51084
+ usage: `${CLI_NAME} ${domainName} ${action} [options]`
51085
+ };
51086
+ return [
51087
+ "",
51088
+ colorBoldWhite(`${displayDomain} - ${action}`),
51089
+ "",
51090
+ ` ${actionInfo.desc}`,
51091
+ "",
51092
+ "USAGE",
51093
+ ` ${actionInfo.usage}`,
51094
+ "",
51095
+ "OPTIONS",
51096
+ " -n, --name <name> Resource name",
51097
+ " -ns, --namespace <ns> Target namespace",
51098
+ " -o, --output <fmt> Output format (json, yaml, table)",
51099
+ " -f, --file <path> Configuration file",
51100
+ "",
51101
+ colorDim(`For domain help, run: ${CLI_NAME} ${domainName} --help`),
51102
+ ""
51103
+ ];
51104
+ }
51105
+ function formatTopicHelp(topic) {
51106
+ const lowerTopic = topic.toLowerCase();
51107
+ const domainInfo = getDomainInfo(lowerTopic);
51108
+ if (domainInfo) {
51109
+ return formatDomainHelp(domainInfo);
51110
+ }
51111
+ switch (lowerTopic) {
51112
+ case "domains":
51113
+ return formatDomainsHelp();
51114
+ case "actions":
51115
+ return formatActionsHelp();
51116
+ case "navigation":
51117
+ case "nav":
51118
+ return formatNavigationHelp();
51119
+ case "env":
51120
+ case "environment":
51121
+ return ["", ...formatEnvironmentVariables(), ""];
51122
+ case "flags":
51123
+ return ["", ...formatGlobalFlags(), ""];
51124
+ default:
51125
+ return [
51126
+ "",
51127
+ `Unknown help topic: ${topic}`,
51128
+ "",
51129
+ "Available topics:",
51130
+ " domains List all available domains",
51131
+ " actions List available actions",
51132
+ " navigation Navigation commands",
51133
+ " env Environment variables",
51134
+ " flags Global flags",
51135
+ " <domain> Help for a specific domain (e.g., 'help dns')",
51136
+ ""
51137
+ ];
51138
+ }
51139
+ }
51140
+ function formatDomainsHelp() {
51141
+ const output = ["", colorBoldWhite("Available Domains"), ""];
51142
+ const categories = /* @__PURE__ */ new Map();
51143
+ for (const domain of domainRegistry.values()) {
51144
+ const category = domain.category ?? "Other";
51145
+ if (!categories.has(category)) {
51146
+ categories.set(category, []);
51147
+ }
51148
+ categories.get(category)?.push(domain);
51149
+ }
51150
+ const sortedCategories = Array.from(categories.keys()).sort();
51151
+ for (const category of sortedCategories) {
51152
+ const domains = categories.get(category) ?? [];
51153
+ output.push(colorBoldWhite(` ${category}`));
51154
+ for (const domain of domains.sort(
51155
+ (a, b) => a.name.localeCompare(b.name)
51156
+ )) {
51157
+ const aliases = domain.aliases.length > 0 ? colorDim(` (${domain.aliases.join(", ")})`) : "";
51158
+ output.push(
51159
+ ` ${domain.name.padEnd(24)} ${domain.descriptionShort}`
51160
+ );
51161
+ if (aliases) {
51162
+ output.push(` ${"".padEnd(24)} Aliases:${aliases}`);
51163
+ }
51164
+ }
51165
+ output.push("");
51166
+ }
51167
+ return output;
51168
+ }
51169
+ function formatActionsHelp() {
51170
+ return [
51171
+ "",
51172
+ colorBoldWhite("Available Actions"),
51173
+ "",
51174
+ " list List all resources in the namespace",
51175
+ " get Get a specific resource by name",
51176
+ " create Create a new resource from a file",
51177
+ " delete Delete a resource by name",
51178
+ " replace Replace a resource configuration",
51179
+ " apply Apply configuration (create or update)",
51180
+ " status Get resource status",
51181
+ " patch Patch specific fields of a resource",
51182
+ " add-labels Add labels to a resource",
51183
+ " remove-labels Remove labels from a resource",
51184
+ "",
51185
+ "USAGE",
51186
+ ` ${CLI_NAME} <domain> <action> [options]`,
51187
+ "",
51188
+ "EXAMPLES",
51189
+ ` ${CLI_NAME} dns list`,
51190
+ ` ${CLI_NAME} lb get my-loadbalancer`,
51191
+ ` ${CLI_NAME} waf create my-policy -f policy.yaml`,
51192
+ ""
51193
+ ];
51194
+ }
51195
+ function formatNavigationHelp() {
51196
+ return [
51197
+ "",
51198
+ colorBoldWhite("Navigation Commands"),
51199
+ "",
51200
+ " <domain> Navigate into a domain context",
51201
+ " /<domain> Navigate directly to domain from anywhere",
51202
+ " .. Go up one level in context",
51203
+ " / Return to root context",
51204
+ " back Go up one level (same as ..)",
51205
+ " root Return to root (same as /)",
51206
+ "",
51207
+ "CONTEXT DISPLAY",
51208
+ " context Show current navigation context",
51209
+ " ctx Alias for context",
51210
+ "",
51211
+ "EXAMPLES",
51212
+ " xcsh> dns # Enter dns domain",
51213
+ " dns> list # Execute list in dns context",
51214
+ " dns> .. # Return to root",
51215
+ " xcsh> /waf # Jump directly to waf",
51216
+ " waf> /dns # Jump from waf to dns",
51217
+ ""
51218
+ ];
51219
+ }
51220
+ function formatDomainsSection() {
51221
+ const output = ["DOMAINS"];
51222
+ const domains = Array.from(domainRegistry.values()).sort(
51223
+ (a, b) => a.name.localeCompare(b.name)
51224
+ );
51225
+ const maxNameLen = Math.max(...domains.map((d) => d.name.length));
51226
+ for (const domain of domains) {
51227
+ const padding = " ".repeat(maxNameLen - domain.name.length + 2);
51228
+ output.push(` ${domain.name}${padding}${domain.descriptionShort}`);
51229
+ }
51230
+ return output;
51231
+ }
51232
+
50810
51233
  // src/repl/executor.ts
50811
51234
  var BUILTIN_COMMANDS = /* @__PURE__ */ new Set([
50812
51235
  "help",
51236
+ "--help",
51237
+ "-h",
50813
51238
  "clear",
50814
51239
  "quit",
50815
51240
  "exit",
@@ -50858,9 +51283,11 @@ function parseCommand(input) {
50858
51283
  };
50859
51284
  }
50860
51285
  const firstWord = trimmed.split(/\s+/)[0]?.toLowerCase() ?? "";
50861
- if (BUILTIN_COMMANDS.has(firstWord)) {
51286
+ const normalizedFirst = firstWord.startsWith("/") ? firstWord.slice(1) : firstWord;
51287
+ if (BUILTIN_COMMANDS.has(firstWord) || BUILTIN_COMMANDS.has(normalizedFirst)) {
51288
+ const effectiveCommand = normalizedFirst === "--help" || normalizedFirst === "-h" ? "help" : normalizedFirst;
50862
51289
  return {
50863
- raw: trimmed,
51290
+ raw: effectiveCommand,
50864
51291
  isDirectNavigation: false,
50865
51292
  isBuiltin: true,
50866
51293
  args: trimmed.split(/\s+/).slice(1)
@@ -51027,32 +51454,57 @@ function executeBuiltin(cmd, session, ctx) {
51027
51454
  }));
51028
51455
  }
51029
51456
  if (command === "help" || command.startsWith("help ")) {
51457
+ const topic = cmd.args[0]?.trim() ?? "";
51458
+ if (topic) {
51459
+ return {
51460
+ output: formatTopicHelp(topic),
51461
+ shouldExit: false,
51462
+ shouldClear: false,
51463
+ contextChanged: false
51464
+ };
51465
+ }
51466
+ if (ctx.isRoot()) {
51467
+ return {
51468
+ output: formatRootHelp(),
51469
+ shouldExit: false,
51470
+ shouldClear: false,
51471
+ contextChanged: false
51472
+ };
51473
+ }
51474
+ if (ctx.isDomain()) {
51475
+ const domain = ctx.domain ?? "";
51476
+ const domainInfo = getDomainInfo(domain);
51477
+ if (domainInfo) {
51478
+ return {
51479
+ output: formatDomainHelp(domainInfo),
51480
+ shouldExit: false,
51481
+ shouldClear: false,
51482
+ contextChanged: false
51483
+ };
51484
+ }
51485
+ return {
51486
+ output: [
51487
+ `Help for domain: ${domain}`,
51488
+ "",
51489
+ "Use 'help' at root for full help."
51490
+ ],
51491
+ shouldExit: false,
51492
+ shouldClear: false,
51493
+ contextChanged: false
51494
+ };
51495
+ }
51496
+ if (ctx.isAction()) {
51497
+ const domain = ctx.domain ?? "";
51498
+ const action = ctx.action ?? "";
51499
+ return {
51500
+ output: formatActionHelp(domain, action),
51501
+ shouldExit: false,
51502
+ shouldClear: false,
51503
+ contextChanged: false
51504
+ };
51505
+ }
51030
51506
  return {
51031
- output: [
51032
- "xcsh - F5 Distributed Cloud Shell",
51033
- "",
51034
- "Navigation:",
51035
- " /domain Navigate directly to domain",
51036
- " exit, back, .. Navigate up one level (exits at root)",
51037
- " /, root Navigate to root context",
51038
- " context, ctx Show current context",
51039
- "",
51040
- "Built-in commands:",
51041
- " help Show this help",
51042
- " clear Clear the screen",
51043
- " quit Exit the shell",
51044
- " history Show command history",
51045
- " domains List available domains",
51046
- " whoami Show current user and connection (-q/--quota, -a/--addons, -v/--verbose, --json)",
51047
- " version Show version info",
51048
- "",
51049
- "Keyboard shortcuts:",
51050
- " Tab Trigger/cycle completions",
51051
- " Up/Down Navigate history or suggestions",
51052
- " Ctrl+C twice Exit (within 500ms)",
51053
- " Ctrl+D Exit immediately",
51054
- " Escape Cancel suggestions"
51055
- ],
51507
+ output: formatRootHelp(),
51056
51508
  shouldExit: false,
51057
51509
  shouldClear: false,
51058
51510
  contextChanged: false
@@ -51083,6 +51535,27 @@ async function handleDirectNavigation(cmd, ctx, session) {
51083
51535
  );
51084
51536
  return customDomains.execute(canonicalDomain, allArgs, session);
51085
51537
  }
51538
+ if (cmd.targetAction === "--help" || cmd.targetAction === "-h" || cmd.targetAction === "help") {
51539
+ const domainInfo = getDomainInfo(cmd.targetDomain);
51540
+ if (domainInfo) {
51541
+ return {
51542
+ output: formatDomainHelp(domainInfo),
51543
+ shouldExit: false,
51544
+ shouldClear: false,
51545
+ contextChanged: false
51546
+ };
51547
+ }
51548
+ return {
51549
+ output: [
51550
+ `${cmd.targetDomain} - Run '${cmd.targetDomain}' for available commands.`,
51551
+ "",
51552
+ `For global options, run: help`
51553
+ ],
51554
+ shouldExit: false,
51555
+ shouldClear: false,
51556
+ contextChanged: false
51557
+ };
51558
+ }
51086
51559
  const extensionDomain = aliasRegistry.get(cmd.targetDomain) ?? cmd.targetDomain;
51087
51560
  const merged = extensionRegistry.getMergedDomain(extensionDomain);
51088
51561
  if (merged?.hasExtension && cmd.targetAction) {
@@ -51166,6 +51639,28 @@ async function handleDomainNavigation(domain, args, ctx, session) {
51166
51639
  const canonicalDomain = resolveDomainAlias(domain);
51167
51640
  return customDomains.execute(canonicalDomain, args, session);
51168
51641
  }
51642
+ const firstArg = args[0]?.toLowerCase() ?? "";
51643
+ if (firstArg === "--help" || firstArg === "-h" || firstArg === "help") {
51644
+ const domainInfo = getDomainInfo(domain);
51645
+ if (domainInfo) {
51646
+ return {
51647
+ output: formatDomainHelp(domainInfo),
51648
+ shouldExit: false,
51649
+ shouldClear: false,
51650
+ contextChanged: false
51651
+ };
51652
+ }
51653
+ return {
51654
+ output: [
51655
+ `${domain} - Run '${domain}' for available commands.`,
51656
+ "",
51657
+ `For global options, run: help`
51658
+ ],
51659
+ shouldExit: false,
51660
+ shouldClear: false,
51661
+ contextChanged: false
51662
+ };
51663
+ }
51169
51664
  const merged = extensionRegistry.getMergedDomain(domain);
51170
51665
  if (merged?.hasExtension) {
51171
51666
  if (args.length > 0) {
@@ -51508,9 +52003,9 @@ function App2() {
51508
52003
  },
51509
52004
  []
51510
52005
  );
51511
- const [output, setOutput] = (0, import_react28.useState)([]);
51512
- const [showBanner, setShowBanner] = (0, import_react28.useState)(true);
51513
- const [prompt, setPrompt] = (0, import_react28.useState)("<xc> ");
52006
+ const [outputItems, setOutputItems] = (0, import_react28.useState)([]);
52007
+ const outputIdRef = (0, import_react28.useRef)(0);
52008
+ const [prompt, setPrompt] = (0, import_react28.useState)("> ");
51514
52009
  const [width, setWidth] = (0, import_react28.useState)(stdout?.columns ?? 80);
51515
52010
  const [gitInfo, setGitInfo] = (0, import_react28.useState)(void 0);
51516
52011
  const [statusHint, setStatusHint] = (0, import_react28.useState)("Ctrl+C twice to exit");
@@ -51558,12 +52053,17 @@ function App2() {
51558
52053
  };
51559
52054
  }, [stdout]);
51560
52055
  const addOutput = (0, import_react28.useCallback)((line) => {
51561
- setOutput((prev) => {
51562
- const newLines = [...prev, ...line.split("\n")];
51563
- if (newLines.length > 1e3) {
51564
- return newLines.slice(newLines.length - 1e3);
52056
+ const lines = line.split("\n");
52057
+ const newItems = lines.map((content) => ({
52058
+ id: outputIdRef.current++,
52059
+ content
52060
+ }));
52061
+ setOutputItems((prev) => {
52062
+ const combined = [...prev, ...newItems];
52063
+ if (combined.length > 1e3) {
52064
+ return combined.slice(combined.length - 1e3);
51565
52065
  }
51566
- return newLines;
52066
+ return combined;
51567
52067
  });
51568
52068
  }, []);
51569
52069
  const applyCompletion = (0, import_react28.useCallback)(
@@ -51605,10 +52105,9 @@ function App2() {
51605
52105
  const trimmed = cmd.trim();
51606
52106
  if (!trimmed) return;
51607
52107
  addOutput(prompt + trimmed);
51608
- setShowBanner(false);
51609
52108
  const result = await executeCommand(trimmed, session);
51610
52109
  if (result.shouldClear) {
51611
- setOutput([]);
52110
+ setOutputItems([]);
51612
52111
  } else {
51613
52112
  result.output.forEach((line) => addOutput(line));
51614
52113
  }
@@ -51672,10 +52171,17 @@ function App2() {
51672
52171
  if (key.tab) {
51673
52172
  const currentInput = inputRef.current;
51674
52173
  if (completion.isShowing) {
51675
- if (key.shift) {
51676
- completion.navigateUp();
51677
- } else {
51678
- completion.navigateDown();
52174
+ const selected = completion.suggestions.at(
52175
+ completion.selectedIndex
52176
+ );
52177
+ if (selected) {
52178
+ applyCompletion({
52179
+ label: selected.text,
52180
+ value: selected.text,
52181
+ description: selected.description,
52182
+ category: selected.category ?? "builtin"
52183
+ });
52184
+ completion.hide();
51679
52185
  }
51680
52186
  } else {
51681
52187
  completion.triggerCompletion(currentInput).then((suggestion) => {
@@ -51742,52 +52248,151 @@ function App2() {
51742
52248
  },
51743
52249
  [applyCompletion, completion]
51744
52250
  );
51745
- if (!isInitialized) {
51746
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Box_default, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Text, { children: "Initializing..." }) });
51747
- }
51748
- const maxOutputLines = Math.max(5, 20);
51749
- const connectionInfo = {
51750
- tenant: session.getTenant() || void 0,
51751
- username: session.getUsername() || void 0,
51752
- tier: session.getTier() || void 0,
51753
- namespace: session.getNamespace(),
51754
- isConnected: session.isConnected()
51755
- };
51756
52251
  return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(Box_default, { flexDirection: "column", width, children: [
51757
- showBanner && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Banner, { version: CLI_VERSION, connectionInfo }),
51758
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Box_default, { flexDirection: "column", children: output.slice(-maxOutputLines).map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Text, { children: line }, i)) }),
51759
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
51760
- InputBox,
51761
- {
51762
- prompt,
51763
- value: input,
51764
- onChange: handleInputChange,
51765
- onSubmit: handleSubmit,
51766
- width,
51767
- isActive: true,
51768
- inputKey
51769
- }
51770
- ),
51771
- completion.isShowing && completion.suggestions.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
51772
- Suggestions,
51773
- {
51774
- suggestions: toUISuggestions(completion.suggestions),
51775
- selectedIndex: completion.selectedIndex,
51776
- onSelect: handleSuggestionSelect,
51777
- onNavigate: handleSuggestionNavigate,
51778
- onCancel: completion.hide,
51779
- maxVisible: 10,
51780
- isActive: false
51781
- }
51782
- ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(StatusBar, { gitInfo, width, hint: statusHint })
52252
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Static, { items: outputItems, children: (item) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Text, { children: item.content }, item.id) }),
52253
+ isInitialized ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
52254
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
52255
+ InputBox,
52256
+ {
52257
+ prompt,
52258
+ value: input,
52259
+ onChange: handleInputChange,
52260
+ onSubmit: handleSubmit,
52261
+ width,
52262
+ isActive: true,
52263
+ inputKey
52264
+ }
52265
+ ),
52266
+ completion.isShowing && completion.suggestions.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
52267
+ Suggestions,
52268
+ {
52269
+ suggestions: toUISuggestions(
52270
+ completion.suggestions
52271
+ ),
52272
+ selectedIndex: completion.selectedIndex,
52273
+ onSelect: handleSuggestionSelect,
52274
+ onNavigate: handleSuggestionNavigate,
52275
+ onCancel: completion.hide,
52276
+ maxVisible: 10,
52277
+ isActive: false
52278
+ }
52279
+ ) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
52280
+ StatusBar,
52281
+ {
52282
+ gitInfo,
52283
+ width,
52284
+ hint: statusHint
52285
+ }
52286
+ )
52287
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Text, { children: "Initializing..." })
51783
52288
  ] });
51784
52289
  }
51785
52290
 
51786
52291
  // src/index.tsx
51787
52292
  var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1);
52293
+ function colorizeLogoLine(line) {
52294
+ let result = "";
52295
+ let currentColor = "none";
52296
+ for (const char of line) {
52297
+ let newColor;
52298
+ switch (char) {
52299
+ case "\u2593":
52300
+ // Dark shade - red (rendered as solid block)
52301
+ case "\u2592":
52302
+ // Medium shade - red
52303
+ case "(":
52304
+ case ")":
52305
+ case "|":
52306
+ case "_":
52307
+ newColor = "red";
52308
+ break;
52309
+ case "\u2588":
52310
+ newColor = "white";
52311
+ break;
52312
+ default:
52313
+ newColor = "none";
52314
+ }
52315
+ if (newColor !== currentColor) {
52316
+ if (currentColor !== "none") {
52317
+ result += colors.reset;
52318
+ }
52319
+ if (newColor === "red") {
52320
+ result += colors.red;
52321
+ } else if (newColor === "white") {
52322
+ result += colors.boldWhite;
52323
+ }
52324
+ currentColor = newColor;
52325
+ }
52326
+ result += char === "\u2593" ? "\u2588" : char;
52327
+ }
52328
+ if (currentColor !== "none") {
52329
+ result += colors.reset;
52330
+ }
52331
+ return result;
52332
+ }
52333
+ function printBannerToScrollback() {
52334
+ const BOX = {
52335
+ topLeft: "\u256D",
52336
+ topRight: "\u256E",
52337
+ bottomLeft: "\u2570",
52338
+ bottomRight: "\u256F",
52339
+ horizontal: "\u2500",
52340
+ vertical: "\u2502",
52341
+ leftT: "\u251C",
52342
+ rightT: "\u2524"
52343
+ };
52344
+ const logoLines2 = F5_LOGO.split("\n");
52345
+ const logoWidth = Math.max(...logoLines2.map((l) => [...l].length));
52346
+ const TOTAL_WIDTH2 = Math.max(80, logoWidth + 4);
52347
+ const INNER_WIDTH2 = TOTAL_WIDTH2 - 2;
52348
+ const HELP_LINES = [
52349
+ "Type 'help' for commands",
52350
+ "Run 'namespace <ns>' to set",
52351
+ "Press Ctrl+C twice to exit"
52352
+ ];
52353
+ const HELP_START_ROW = 8;
52354
+ const title = ` ${CLI_FULL_NAME} v${CLI_VERSION} `;
52355
+ const leftDashes = 3;
52356
+ const rightDashes = TOTAL_WIDTH2 - 1 - leftDashes - title.length - 1;
52357
+ const output = [];
52358
+ output.push(
52359
+ colorRed(BOX.topLeft + BOX.horizontal.repeat(leftDashes)) + colorBoldWhite(title) + colorRed(
52360
+ BOX.horizontal.repeat(Math.max(0, rightDashes)) + BOX.topRight
52361
+ )
52362
+ );
52363
+ for (let i = 0; i < logoLines2.length; i++) {
52364
+ const logoLine = logoLines2[i] ?? "";
52365
+ const helpIndex = i - HELP_START_ROW;
52366
+ const helpText = helpIndex >= 0 && helpIndex < HELP_LINES.length ? HELP_LINES[helpIndex] ?? "" : "";
52367
+ const paddedLogo = logoLine.padEnd(logoWidth);
52368
+ const coloredLogo = colorizeLogoLine(paddedLogo);
52369
+ const helpColumnWidth = INNER_WIDTH2 - logoWidth - 1;
52370
+ const paddedHelp = helpText.padEnd(helpColumnWidth);
52371
+ output.push(
52372
+ colorRed(BOX.vertical) + coloredLogo + " " + colorBoldWhite(paddedHelp) + colorRed(BOX.vertical)
52373
+ );
52374
+ }
52375
+ output.push(
52376
+ colorRed(
52377
+ BOX.bottomLeft + BOX.horizontal.repeat(INNER_WIDTH2) + BOX.bottomRight
52378
+ )
52379
+ );
52380
+ output.push("");
52381
+ process.stdout.write(output.join("\n") + "\n");
52382
+ }
51788
52383
  var program2 = new Command();
51789
- program2.name(CLI_NAME).description("F5 Distributed Cloud Shell - Interactive CLI for F5 XC").version(CLI_VERSION, "-v, --version", "Show version number").option("-i, --interactive", "Force interactive mode").option("--no-color", "Disable color output").argument("[command...]", "Command to execute non-interactively").allowUnknownOption(true).action(
52384
+ program2.configureHelp({
52385
+ formatHelp: () => formatRootHelp().join("\n")
52386
+ });
52387
+ program2.name(CLI_NAME).description("F5 Distributed Cloud Shell - Interactive CLI for F5 XC").version(CLI_VERSION, "-v, --version", "Show version number").option("-i, --interactive", "Force interactive mode").option("--no-color", "Disable color output").option("-h, --help", "Show help").argument("[command...]", "Command to execute non-interactively").allowUnknownOption(true).helpOption(false).action(
51790
52388
  async (commandArgs, options) => {
52389
+ if (options.help && commandArgs.length === 0) {
52390
+ formatRootHelp().forEach((line) => console.log(line));
52391
+ process.exit(0);
52392
+ }
52393
+ if (options.help && commandArgs.length > 0) {
52394
+ commandArgs.push("--help");
52395
+ }
51791
52396
  if (commandArgs.length === 0 || options.interactive) {
51792
52397
  if (!process.stdin.isTTY && !options.interactive) {
51793
52398
  console.error(
@@ -51798,6 +52403,7 @@ program2.name(CLI_NAME).description("F5 Distributed Cloud Shell - Interactive CL
51798
52403
  );
51799
52404
  process.exit(1);
51800
52405
  }
52406
+ printBannerToScrollback();
51801
52407
  process.stdin.resume();
51802
52408
  render_default(/* @__PURE__ */ (0, import_jsx_runtime6.jsx)(App2, {}));
51803
52409
  return;