@robinmordasiewicz/xcsh 6.15.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/README.md ADDED
@@ -0,0 +1,206 @@
1
+ # xcsh
2
+
3
+ F5 Distributed Cloud Shell - A command-line interface for managing F5 Distributed Cloud resources.
4
+
5
+ ## Documentation
6
+
7
+ Full documentation is available at **[robinmordasiewicz.github.io/xcsh](https://robinmordasiewicz.github.io/xcsh)**
8
+
9
+ ## Installation
10
+
11
+ ### Homebrew
12
+
13
+ ```bash
14
+ brew tap robinmordasiewicz/tap
15
+ brew install --cask xcsh
16
+ ```
17
+
18
+ ### Install Script
19
+
20
+ ```bash
21
+ curl -fsSL https://raw.githubusercontent.com/robinmordasiewicz/xcsh/main/install.sh | sh
22
+ ```
23
+
24
+ ## Usage
25
+
26
+ ### Basic Command Structure
27
+
28
+ The CLI is organized around **domains** matching F5 Distributed Cloud API structure:
29
+
30
+ ```bash
31
+ xcsh <domain> <operation> <resource-type> [resource-name] [flags]
32
+ ```
33
+
34
+ ### Domain-Based Commands
35
+
36
+ Common domains include:
37
+
38
+ | Domain | Alias | Purpose |
39
+ |--------|-------|---------|
40
+ | `load_balancer` | `lb` | Load balancing and origin pools |
41
+ | `infrastructure` | `infra` | Core infrastructure resources |
42
+ | `security` | `sec` | WAF, DDoS, bot defense |
43
+ | `networking` | `net` | Network routing and configuration |
44
+ | `observability` | `obs`, `o11y` | Monitoring and observability |
45
+ | `api_security` | `apisec` | API protection and security |
46
+ | `identity` | `iam` | Identity and access management |
47
+
48
+ ### Examples
49
+
50
+ #### List Resources
51
+
52
+ ```bash
53
+ # List HTTP load balancers in default namespace
54
+ xcsh load_balancer list http_loadbalancer
55
+
56
+ # Using alias for shorter command
57
+ xcsh lb list http_loadbalancer
58
+
59
+ # List in specific namespace
60
+ xcsh lb list http_loadbalancer -n production
61
+ ```
62
+
63
+ #### Get a Specific Resource
64
+
65
+ ```bash
66
+ # Get a load balancer configuration
67
+ xcsh load_balancer get http_loadbalancer example-lb
68
+
69
+ # Get from specific namespace
70
+ xcsh lb get http_loadbalancer example-lb -n production
71
+ ```
72
+
73
+ #### Create a Resource
74
+
75
+ ```bash
76
+ # Create from YAML file
77
+ xcsh load_balancer create http_loadbalancer -i lb-config.yaml
78
+
79
+ # Create from inline JSON
80
+ xcsh lb create origin_pool --json-data '{"metadata":{"name":"example-pool"},...}'
81
+ ```
82
+
83
+ #### Delete a Resource
84
+
85
+ ```bash
86
+ # Delete with confirmation
87
+ xcsh load_balancer delete http_loadbalancer example-lb
88
+
89
+ # Delete without confirmation (for scripts)
90
+ xcsh lb delete http_loadbalancer example-lb --yes
91
+ ```
92
+
93
+ #### Apply (Create or Update)
94
+
95
+ ```bash
96
+ # Apply from YAML (creates if not exists, updates if does)
97
+ xcsh load_balancer apply http_loadbalancer -i lb-config.yaml
98
+ ```
99
+
100
+ #### Get Help
101
+
102
+ ```bash
103
+ # Show available domains
104
+ xcsh --help
105
+
106
+ # Show domain-specific operations
107
+ xcsh load_balancer --help
108
+
109
+ # Show operation-specific help
110
+ xcsh load_balancer list --help
111
+
112
+ # Show resource-type help
113
+ xcsh load_balancer list http_loadbalancer --help
114
+ ```
115
+
116
+ ## Development & Domain System
117
+
118
+ ### Automated Domain Synchronization
119
+
120
+ xcsh uses an **automated CI/CD-driven system** to keep domain definitions synchronized with upstream F5 Distributed Cloud API changes. This ensures the CLI always reflects the latest API structure without manual intervention.
121
+
122
+ #### How It Works
123
+
124
+ 1. **Daily Checks**: GitHub Actions workflow (`sync-upstream-specs.yml`) checks for new upstream spec versions daily at 6 AM UTC
125
+ 2. **Automatic Regeneration**: When updates are detected, the system:
126
+ - Downloads latest enriched API specifications
127
+ - Regenerates domain and resource registries
128
+ - Validates code quality and tests pass
129
+ - Creates a pull request with all changes
130
+ 3. **Idempotent Generation**: Code generation is deterministic - running it twice with identical inputs produces byte-for-byte identical output
131
+ 4. **CI/CD Validation**: Every commit validates that generated files match upstream specs and are reproducible
132
+
133
+ #### Domain Registry
134
+
135
+ The domain registry (`pkg/types/domains_generated.go`) is **automatically generated** from upstream API specifications (``.specs/index.json`). It currently contains **40 domains** organized by functional area:
136
+
137
+ - **Infrastructure**: cloud_infrastructure, site, site_management, container_services
138
+ - **Security**: waf, bot_and_threat_defense, network_security
139
+ - **Networking**: network, dns, network_connectivity, vpn
140
+ - **Observability**: observability_and_analytics, telemetry_and_insights, statistics
141
+ - **Identity**: identity, user_and_account_management, users
142
+ - **And 24 more...**
143
+
144
+ #### Manual Domain Configuration
145
+
146
+ Team-specific domain customization is managed in `.specs/domain_config.yaml`:
147
+
148
+ ```yaml
149
+ # Domain aliases (short command shortcuts)
150
+ aliases:
151
+ load_balancer: [lb]
152
+ security: [sec]
153
+ networking: [net]
154
+ infrastructure: [infra]
155
+
156
+ # Deprecated domains with migration guidance
157
+ deprecated_domains:
158
+ config:
159
+ maps_to: system
160
+ reason: "Configuration management merged into system domain"
161
+ deprecated_since: "v1.0.25"
162
+
163
+ # Missing metadata requiring upstream attention
164
+ missing_metadata:
165
+ - domain: api_security
166
+ missing_field: "is_preview"
167
+ reason: "Need to mark preview/beta domains"
168
+ ```
169
+
170
+ This file is **version-controlled** and survives automated spec updates, allowing teams to maintain consistent domain aliases across releases.
171
+
172
+ #### For Developers
173
+
174
+ To regenerate domain definitions:
175
+
176
+ ```bash
177
+ # Full generation pipeline
178
+ make generate
179
+
180
+ # Just regenerate domains
181
+ make generate-domains
182
+
183
+ # Verify idempotency (CI safety check)
184
+ make ci-generate
185
+ ```
186
+
187
+ The generation pipeline:
188
+
189
+ 1. Downloads latest specs via `scripts/download-specs.sh`
190
+ 2. Runs `scripts/generate-domains.go` to create domain registry
191
+ 3. Runs `scripts/generate-schemas.go` to create resource schemas
192
+ 4. Validates against `scripts/validate-specs.go`
193
+
194
+ #### Upstream Spec Quality
195
+
196
+ When spec organization issues are detected, the system can automatically report them to the upstream repository. Use the GitHub issue template to report specification problems:
197
+
198
+ - Missing metadata fields
199
+ - Resource classification issues
200
+ - Domain organization concerns
201
+
202
+ See `.github/ISSUE_TEMPLATE/upstream-spec-quality.md` for the standardized reporting format.
203
+
204
+ ## License
205
+
206
+ This project is open source. See the LICENSE file for details.
@@ -0,0 +1,219 @@
1
+ #compdef xcsh
2
+ # zsh completion for xcsh
3
+ # Generated by xcsh completion zsh
4
+
5
+ _xcsh() {
6
+ local curcontext="$curcontext" state line
7
+ typeset -A opt_args
8
+
9
+ local -a global_opts
10
+ global_opts=(
11
+ '(-h --help)'{-h,--help}'[Show help information]'
12
+ '(-v --version)'{-v,--version}'[Show version number]'
13
+ '(-i --interactive)'{-i,--interactive}'[Force interactive mode]'
14
+ '--no-color[Disable color output]'
15
+ '(-o --output)'{-o,--output}'[Output format]:format:(json yaml table)'
16
+ '(-ns --namespace)'{-ns,--namespace}'[Namespace]:namespace:_xcsh_namespaces'
17
+ )
18
+
19
+ _arguments -C \
20
+ "${global_opts[@]}" \
21
+ '1: :->domain' \
22
+ '2: :->action' \
23
+ '*: :->args'
24
+
25
+ case $state in
26
+ (domain)
27
+ local -a domains builtins
28
+ domains=(
29
+ 'admin_console_and_ui:F5 Distributed Cloud Admin Console And Ui API specifications'
30
+ 'api:F5 Distributed Cloud Api API specifications'
31
+ 'authentication:F5 Distributed Cloud Authentication API specifications'
32
+ 'bigip:F5 Distributed Cloud Bigip API specifications'
33
+ 'billing_and_usage:F5 Distributed Cloud Billing And Usage API specifications'
34
+ 'blindfold:F5 Distributed Cloud Blindfold API specifications'
35
+ 'bot_and_threat_defense:F5 Distributed Cloud Bot And Threat Defense API specifications'
36
+ 'cdn:F5 Distributed Cloud Cdn API specifications'
37
+ 'ce_management:F5 Distributed Cloud Ce Management API specifications'
38
+ 'certificates:F5 Distributed Cloud Certificates API specifications'
39
+ 'cloud_infrastructure:F5 Distributed Cloud Cloud Infrastructure API specifications'
40
+ 'cloudstatus:Monitor F5 Distributed Cloud service status and incidents'
41
+ 'completion:Generate shell completion scripts for bash, zsh, and fish'
42
+ 'container_services:F5 Distributed Cloud Container Services API specifications'
43
+ 'data_and_privacy_security:F5 Distributed Cloud Data And Privacy Security API specifications'
44
+ 'data_intelligence:F5 Distributed Cloud Data Intelligence API specifications'
45
+ 'ddos:F5 Distributed Cloud Ddos API specifications'
46
+ 'dns:F5 Distributed Cloud Dns API specifications'
47
+ 'generative_ai:F5 Distributed Cloud Generative Ai API specifications'
48
+ 'login:Authentication, identity, and session management'
49
+ 'managed_kubernetes:F5 Distributed Cloud Managed Kubernetes API specifications'
50
+ 'marketplace:F5 Distributed Cloud Marketplace API specifications'
51
+ 'network:F5 Distributed Cloud Network API specifications'
52
+ 'network_security:F5 Distributed Cloud Network Security API specifications'
53
+ 'nginx_one:F5 Distributed Cloud Nginx One API specifications'
54
+ 'object_storage:F5 Distributed Cloud Object Storage API specifications'
55
+ 'observability:F5 Distributed Cloud Observability API specifications'
56
+ 'rate_limiting:F5 Distributed Cloud Rate Limiting API specifications'
57
+ 'secops_and_incident_response:F5 Distributed Cloud Secops And Incident Response API specifications'
58
+ 'service_mesh:F5 Distributed Cloud Service Mesh API specifications'
59
+ 'shape:F5 Distributed Cloud Shape API specifications'
60
+ 'sites:F5 Distributed Cloud Sites API specifications'
61
+ 'statistics:F5 Distributed Cloud Statistics API specifications'
62
+ 'subscription:xcsh-specific subscription management commands (overview, quota analysis, validation)'
63
+ 'support:F5 Distributed Cloud Support API specifications'
64
+ 'telemetry_and_insights:F5 Distributed Cloud Telemetry And Insights API specifications'
65
+ 'tenant_and_identity:F5 Distributed Cloud Tenant And Identity API specifications'
66
+ 'threat_campaign:F5 Distributed Cloud Threat Campaign API specifications'
67
+ 'users:F5 Distributed Cloud Users API specifications'
68
+ 'virtual:F5 Distributed Cloud Virtual API specifications'
69
+ 'vpm_and_node_management:F5 Distributed Cloud Vpm And Node Management API specifications'
70
+ 'waf:F5 Distributed Cloud Waf API specifications'
71
+ 'apisec:Alias for api'
72
+ 'api-discovery:Alias for api'
73
+ 'authn:Alias for authentication'
74
+ 'oidc:Alias for authentication'
75
+ 'sso:Alias for authentication'
76
+ 'f5-bigip:Alias for bigip'
77
+ 'irule:Alias for bigip'
78
+ 'ltm:Alias for bigip'
79
+ 'bf:Alias for blindfold'
80
+ 'encrypt:Alias for blindfold'
81
+ 'secrets:Alias for blindfold'
82
+ 'cache:Alias for cdn'
83
+ 'content:Alias for cdn'
84
+ 'cert:Alias for certificates'
85
+ 'certs:Alias for certificates'
86
+ 'ssl:Alias for certificates'
87
+ 'tls:Alias for certificates'
88
+ 'cloud:Alias for cloud_infrastructure'
89
+ 'infra:Alias for cloud_infrastructure'
90
+ 'provider:Alias for cloud_infrastructure'
91
+ 'vk8s:Alias for container_services'
92
+ 'containers:Alias for container_services'
93
+ 'workloads:Alias for container_services'
94
+ 'di:Alias for data_intelligence'
95
+ 'intelligence:Alias for data_intelligence'
96
+ 'insights:Alias for data_intelligence'
97
+ 'dos:Alias for ddos'
98
+ 'ddos-protect:Alias for ddos'
99
+ 'dns-zone:Alias for dns'
100
+ 'zones:Alias for dns'
101
+ 'ai:Alias for generative_ai'
102
+ 'genai:Alias for generative_ai'
103
+ 'assistant:Alias for generative_ai'
104
+ 'mk8s:Alias for managed_kubernetes'
105
+ 'appstack:Alias for managed_kubernetes'
106
+ 'k8s-mgmt:Alias for managed_kubernetes'
107
+ 'market:Alias for marketplace'
108
+ 'addons:Alias for marketplace'
109
+ 'extensions:Alias for marketplace'
110
+ 'net:Alias for network'
111
+ 'routing:Alias for network'
112
+ 'bgp:Alias for network'
113
+ 'netsec:Alias for network_security'
114
+ 'nfw:Alias for network_security'
115
+ 'nginx:Alias for nginx_one'
116
+ 'nms:Alias for nginx_one'
117
+ 'nginx-plus:Alias for nginx_one'
118
+ 'storage:Alias for object_storage'
119
+ 's3:Alias for object_storage'
120
+ 'buckets:Alias for object_storage'
121
+ 'obs:Alias for observability'
122
+ 'monitoring:Alias for observability'
123
+ 'synth:Alias for observability'
124
+ 'ratelimit:Alias for rate_limiting'
125
+ 'throttle:Alias for rate_limiting'
126
+ 'policer:Alias for rate_limiting'
127
+ 'mesh:Alias for service_mesh'
128
+ 'svc-mesh:Alias for service_mesh'
129
+ 'shape-sec:Alias for shape'
130
+ 'safeap:Alias for shape'
131
+ 'site:Alias for sites'
132
+ 'deployment:Alias for sites'
133
+ 'stats:Alias for statistics'
134
+ 'metrics:Alias for statistics'
135
+ 'logs:Alias for statistics'
136
+ 'tickets:Alias for support'
137
+ 'help-desk:Alias for support'
138
+ 'telemetry:Alias for telemetry_and_insights'
139
+ 'ti:Alias for telemetry_and_insights'
140
+ 'threats:Alias for threat_campaign'
141
+ 'campaigns:Alias for threat_campaign'
142
+ 'threat-intel:Alias for threat_campaign'
143
+ 'user:Alias for users'
144
+ 'accounts:Alias for users'
145
+ 'iam:Alias for users'
146
+ 'lb:Alias for virtual'
147
+ 'loadbalancer:Alias for virtual'
148
+ 'vhost:Alias for virtual'
149
+ 'vpm:Alias for vpm_and_node_management'
150
+ 'nodes:Alias for vpm_and_node_management'
151
+ 'node-mgmt:Alias for vpm_and_node_management'
152
+ 'firewall:Alias for waf'
153
+ 'appfw:Alias for waf'
154
+ )
155
+ builtins=(
156
+ 'help:Show help information'
157
+ 'quit:Exit the shell'
158
+ 'exit:Exit the shell'
159
+ 'clear:Clear the screen'
160
+ 'history:Show command history'
161
+ 'context:Show current navigation context'
162
+ 'ctx:Show current navigation context'
163
+ )
164
+ _describe -t domains 'domain' domains
165
+ _describe -t builtins 'builtin' builtins
166
+ ;;
167
+ (action)
168
+ case ${line[1]} in
169
+ (login)
170
+ _values 'command' 'show:Command' 'profile:Subcommand group' 'context:Subcommand group'
171
+ ;;
172
+ (cloudstatus)
173
+ _values 'command' 'status:Command' 'summary:Command' 'components:Command' 'incidents:Command' 'maintenance:Command'
174
+ ;;
175
+ (completion)
176
+ _values 'command' 'bash:Command' 'zsh:Command' 'fish:Command'
177
+ ;;
178
+ (help|quit|exit|clear|history|context|ctx)
179
+ ;;
180
+ (*)
181
+ local -a actions
182
+ actions=(
183
+ 'list:List resources'
184
+ 'get:Get a specific resource'
185
+ 'create:Create a new resource'
186
+ 'delete:Delete a resource'
187
+ 'replace:Replace a resource'
188
+ 'apply:Apply configuration from file'
189
+ 'status:Get resource status'
190
+ 'patch:Patch a resource'
191
+ 'add-labels:Add labels to a resource'
192
+ 'remove-labels:Remove labels from a resource'
193
+ )
194
+ _describe -t actions 'action' actions
195
+ ;;
196
+ esac
197
+ ;;
198
+ (args)
199
+ local -a action_opts
200
+ action_opts=(
201
+ '(-n --name)'{-n,--name}'[Resource name]:name:'
202
+ '(-ns --namespace)'{-ns,--namespace}'[Namespace]:namespace:_xcsh_namespaces'
203
+ '(-o --output)'{-o,--output}'[Output format]:format:(json yaml table)'
204
+ '--limit[Maximum results]:limit:'
205
+ '--label[Filter by label]:label:'
206
+ '(-f --file)'{-f,--file}'[Configuration file]:file:_files'
207
+ )
208
+ _arguments "${action_opts[@]}"
209
+ ;;
210
+ esac
211
+ }
212
+
213
+ _xcsh_namespaces() {
214
+ local -a namespaces
215
+ namespaces=('default' 'system' 'shared')
216
+ _describe -t namespaces 'namespace' namespaces
217
+ }
218
+
219
+ _xcsh "$@"
@@ -0,0 +1,70 @@
1
+ # bash completion for xcsh
2
+ # Generated by xcsh completion bash
3
+ # shellcheck disable=SC2034,SC2207
4
+
5
+ _xcsh_completions() {
6
+ local cur prev words cword
7
+ _init_completion || return
8
+
9
+ local commands="admin_console_and_ui api authentication bigip billing_and_usage blindfold bot_and_threat_defense cdn ce_management certificates cloud_infrastructure cloudstatus completion container_services data_and_privacy_security data_intelligence ddos dns generative_ai login managed_kubernetes marketplace network network_security nginx_one object_storage observability rate_limiting secops_and_incident_response service_mesh shape sites statistics subscription support telemetry_and_insights tenant_and_identity threat_campaign users virtual vpm_and_node_management waf apisec api-discovery authn oidc sso f5-bigip irule ltm bf encrypt secrets cache content cert certs ssl tls cloud infra provider vk8s containers workloads di intelligence insights dos ddos-protect dns-zone zones ai genai assistant mk8s appstack k8s-mgmt market addons extensions net routing bgp netsec nfw nginx nms nginx-plus storage s3 buckets obs monitoring synth ratelimit throttle policer mesh svc-mesh shape-sec safeap site deployment stats metrics logs tickets help-desk telemetry ti threats campaigns threat-intel user accounts iam lb loadbalancer vhost vpm nodes node-mgmt firewall appfw help quit exit clear history"
10
+ local actions="list get create delete replace apply status patch add-labels remove-labels"
11
+ local builtins="help quit exit clear history context ctx"
12
+ local global_flags="--help -h --version -v --interactive -i --no-color --output -o --namespace -ns"
13
+
14
+ # Handle completion based on position
15
+ case ${cword} in
16
+ 1)
17
+ # First word: domains, builtins, or flags
18
+ if [[ "${cur}" == -* ]]; then
19
+ COMPREPLY=( $(compgen -W "${global_flags}" -- "${cur}") )
20
+ else
21
+ COMPREPLY=( $(compgen -W "${commands} ${builtins}" -- "${cur}") )
22
+ fi
23
+ return 0
24
+ ;;
25
+ 2)
26
+ # Second word: actions or subcommands based on first word
27
+ local domain="${words[1]}"
28
+ case "${domain}" in
29
+ login)
30
+ COMPREPLY=( $(compgen -W "show profile context" -- "${cur}") )
31
+ return 0
32
+ ;;
33
+ login/profile)
34
+ COMPREPLY=( $(compgen -W "list show create use delete" -- "${cur}") )
35
+ return 0
36
+ ;;
37
+ login/context)
38
+ COMPREPLY=( $(compgen -W "show set list" -- "${cur}") )
39
+ return 0
40
+ ;;
41
+ cloudstatus)
42
+ COMPREPLY=( $(compgen -W "status summary components incidents maintenance" -- "${cur}") )
43
+ return 0
44
+ ;;
45
+ completion)
46
+ COMPREPLY=( $(compgen -W "bash zsh fish" -- "${cur}") )
47
+ return 0
48
+ ;;
49
+ help|quit|exit|clear|history|context|ctx)
50
+ return 0
51
+ ;;
52
+ *)
53
+ # API domain - suggest actions
54
+ COMPREPLY=( $(compgen -W "${actions}" -- "${cur}") )
55
+ return 0
56
+ ;;
57
+ esac
58
+ ;;
59
+ *)
60
+ # Third+ word: flags
61
+ if [[ "${cur}" == -* ]]; then
62
+ local action_flags="--name -n --namespace -ns --output -o --json --yaml --limit --label"
63
+ COMPREPLY=( $(compgen -W "${action_flags}" -- "${cur}") )
64
+ fi
65
+ return 0
66
+ ;;
67
+ esac
68
+ }
69
+
70
+ complete -F _xcsh_completions xcsh