@vfarcic/dot-ai 0.102.0 → 0.104.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.
Files changed (50) hide show
  1. package/README.md +14 -0
  2. package/dist/core/nushell-runtime.d.ts +39 -0
  3. package/dist/core/nushell-runtime.d.ts.map +1 -0
  4. package/dist/core/nushell-runtime.js +103 -0
  5. package/dist/core/platform-operations.d.ts +76 -0
  6. package/dist/core/platform-operations.d.ts.map +1 -0
  7. package/dist/core/platform-operations.js +317 -0
  8. package/dist/interfaces/mcp.d.ts.map +1 -1
  9. package/dist/interfaces/mcp.js +9 -1
  10. package/dist/tools/build-platform.d.ts +25 -0
  11. package/dist/tools/build-platform.d.ts.map +1 -0
  12. package/dist/tools/build-platform.js +277 -0
  13. package/dist/tools/index.d.ts +1 -0
  14. package/dist/tools/index.d.ts.map +1 -1
  15. package/dist/tools/index.js +6 -1
  16. package/dist/tools/version.d.ts +7 -0
  17. package/dist/tools/version.d.ts.map +1 -1
  18. package/dist/tools/version.js +34 -5
  19. package/package.json +3 -2
  20. package/prompts/map-intent-to-operation.md +104 -0
  21. package/prompts/parse-script-operations.md +72 -0
  22. package/scripts/ack.nu +195 -0
  23. package/scripts/anthropic.nu +24 -0
  24. package/scripts/argo-workflows.nu +47 -0
  25. package/scripts/argocd.nu +85 -0
  26. package/scripts/aso.nu +74 -0
  27. package/scripts/atlas.nu +15 -0
  28. package/scripts/backstage.nu +349 -0
  29. package/scripts/cert-manager.nu +13 -0
  30. package/scripts/cnpg.nu +14 -0
  31. package/scripts/common.nu +116 -0
  32. package/scripts/crossplane.nu +718 -0
  33. package/scripts/dot.nu +32 -0
  34. package/scripts/external-secrets.nu +110 -0
  35. package/scripts/gatekeeper.nu +19 -0
  36. package/scripts/github.nu +42 -0
  37. package/scripts/image.nu +67 -0
  38. package/scripts/ingress.nu +149 -0
  39. package/scripts/kro.nu +11 -0
  40. package/scripts/kubernetes.nu +609 -0
  41. package/scripts/kubevela.nu +22 -0
  42. package/scripts/kyverno.nu +16 -0
  43. package/scripts/mcp.nu +139 -0
  44. package/scripts/port.nu +71 -0
  45. package/scripts/prometheus.nu +21 -0
  46. package/scripts/registry.nu +55 -0
  47. package/scripts/storage.nu +210 -0
  48. package/scripts/tests.nu +12 -0
  49. package/scripts/toolhive.nu +21 -0
  50. package/scripts/velero.nu +45 -0
@@ -0,0 +1,349 @@
1
+ #!/usr/bin/env nu
2
+
3
+ # Configures a Backstage instance with Crossplane integration
4
+ def --env "main configure backstage" [] {
5
+
6
+ rm --force --recursive backstage
7
+
8
+ print $"
9
+ When asked for a name for the Backstage app make sure to keep the default value (ansi yellow_bold)backstage(ansi reset)
10
+ Press the (ansi yellow_bold)enter key(ansi reset) to continue.
11
+ "
12
+ input
13
+
14
+ npx @backstage/create-app@latest
15
+
16
+ cd backstage
17
+
18
+ for package in [
19
+ "@terasky/backstage-plugin-crossplane-common@1.1.0",
20
+ "@terasky/backstage-plugin-crossplane-permissions-backend@1.1.1",
21
+ "@terasky/backstage-plugin-kubernetes-ingestor@1.5.0",
22
+ "@terasky/backstage-plugin-scaffolder-backend-module-terasky-utils@1.1.0"
23
+ ] {
24
+ yarn --cwd packages/backend add $package
25
+ }
26
+
27
+ for package in [
28
+ "@terasky/backstage-plugin-crossplane-resources-frontend@1.4.0"
29
+ ] {
30
+ yarn --cwd packages/app add $package
31
+ }
32
+
33
+ open app-config.yaml
34
+ | upsert backend.csp.upgrade-insecure-requests false
35
+ | upsert crossplane.enablePermissions false
36
+ | upsert kubernetesIngestor.components.enabled true
37
+ | upsert kubernetesIngestor.components.taskRunner.frequency 10
38
+ | upsert kubernetesIngestor.components.taskRunner.timeout 600
39
+ | upsert kubernetesIngestor.components.excludedNamespaces []
40
+ | upsert kubernetesIngestor.components.excludedNamespaces.0 "kube-public"
41
+ | upsert kubernetesIngestor.components.excludedNamespaces.1 "kube-system"
42
+ | upsert kubernetesIngestor.components.customWorkloadTypes []
43
+ | upsert kubernetesIngestor.components.customWorkloadTypes.0 { group: "core.oam.dev", apiVersion: "v1beta1", plural: "applications" }
44
+ | upsert kubernetesIngestor.components.disableDefaultWorkloadTypes "${DISABLE_DEFAULT_WORKLOAD_TYPES-false}"
45
+ | upsert kubernetesIngestor.components.onlyIngestAnnotatedResources false
46
+ | upsert kubernetesIngestor.crossplane.claims.ingestAllClaims true
47
+ | upsert kubernetesIngestor.crossplane.xrds.publishPhase.allowedTargets ["github.com"]
48
+ | upsert kubernetesIngestor.crossplane.xrds.publishPhase.target "github.com"
49
+ | upsert kubernetesIngestor.crossplane.xrds.publishPhase.target "github.com"
50
+ | upsert kubernetesIngestor.crossplane.xrds.publishPhase.allowRepoSelection true
51
+ | upsert kubernetesIngestor.crossplane.xrds.enabled true
52
+ | upsert kubernetesIngestor.crossplane.xrds.taskRunner.frequency 10
53
+ | upsert kubernetesIngestor.crossplane.xrds.taskRunner.timeout 600
54
+ | upsert kubernetesIngestor.crossplane.xrds.ingestAllXRDs true
55
+ | upsert kubernetesIngestor.crossplane.xrds.convertDefaultValuesToPlaceholders true
56
+ | upsert kubernetes {}
57
+ | upsert kubernetes.frontend.podDelete.enabled true
58
+ | upsert kubernetes.serviceLocatorMethod.type "multiTenant"
59
+ | upsert kubernetes.clusterLocatorMethods [{}]
60
+ | upsert kubernetes.clusterLocatorMethods.0.type "config"
61
+ | upsert kubernetes.clusterLocatorMethods.0.clusters [{}]
62
+ | upsert kubernetes.clusterLocatorMethods.0.clusters.0.url "${KUBE_URL}"
63
+ | upsert kubernetes.clusterLocatorMethods.0.clusters.0.name "kind"
64
+ | upsert kubernetes.clusterLocatorMethods.0.clusters.0.authProvider "serviceAccount"
65
+ | upsert kubernetes.clusterLocatorMethods.0.clusters.0.skipTLSVerify true
66
+ | upsert kubernetes.clusterLocatorMethods.0.clusters.0.skipMetricsLookup true
67
+ | upsert kubernetes.clusterLocatorMethods.0.clusters.0.serviceAccountToken "${KUBE_SA_TOKEN}"
68
+ | upsert kubernetes.clusterLocatorMethods.0.clusters.0.caData "${KUBE_CA_DATA}"
69
+ | save app-config.yaml --force
70
+
71
+ {
72
+ app: {
73
+ baseUrl: "${BACKSTAGE_HOST}"
74
+ }
75
+ backend: {
76
+ baseUrl: "${BACKSTAGE_HOST}"
77
+ database: {
78
+ client: "pg"
79
+ connection: {
80
+ host: "${DB_HOST}"
81
+ port: 5432
82
+ user: "${user}"
83
+ password: "${password}"
84
+ }
85
+ }
86
+ }
87
+ } | to yaml | save app-config.production.yaml --force
88
+
89
+ open packages/app/src/components/catalog/EntityPage.tsx
90
+ | (
91
+ str replace
92
+ `} from '@backstage/plugin-kubernetes';`
93
+ `} from '@backstage/plugin-kubernetes';
94
+
95
+ import { CrossplaneAllResourcesTable, CrossplaneResourceGraph, isCrossplaneAvailable } from '@terasky/backstage-plugin-crossplane-resources-frontend';`
96
+ ) | (
97
+ str replace
98
+ `const serviceEntityPage = (
99
+ <EntityLayout>
100
+ <EntityLayout.Route path="/" title="Overview">
101
+ {overviewContent}
102
+ </EntityLayout.Route>`
103
+ `const serviceEntityPage = (
104
+ <EntityLayout>
105
+ <EntityLayout.Route path="/" title="Overview">
106
+ {overviewContent}
107
+ </EntityLayout.Route>
108
+
109
+ <EntityLayout.Route if={isCrossplaneAvailable} path="/crossplane-resources" title="Crossplane Resources">
110
+ <CrossplaneAllResourcesTable />
111
+ </EntityLayout.Route>
112
+ <EntityLayout.Route if={isCrossplaneAvailable} path="/crossplane-graph" title="Crossplane Graph">
113
+ <CrossplaneResourceGraph />
114
+ </EntityLayout.Route>`
115
+ ) | (
116
+ str replace
117
+ `const componentPage = (
118
+ <EntitySwitch>`
119
+ `const componentPage = (
120
+ <EntitySwitch>
121
+ <EntitySwitch.Case if={isComponentType('crossplane-claim')}>
122
+ {serviceEntityPage}
123
+ </EntitySwitch.Case>`
124
+ ) | save packages/app/src/components/catalog/EntityPage.tsx --force
125
+
126
+ open packages/backend/src/index.ts
127
+ | (
128
+ str replace
129
+ `backend.start();`
130
+ `backend.add(import('@terasky/backstage-plugin-crossplane-permissions-backend'));
131
+ backend.add(import('@terasky/backstage-plugin-kubernetes-ingestor'));
132
+ backend.add(import('@terasky/backstage-plugin-scaffolder-backend-module-terasky-utils'));
133
+
134
+ backend.start();`
135
+ ) | save packages/backend/src/index.ts --force
136
+
137
+ cd ..
138
+
139
+ get cluster data --create_service_account true
140
+
141
+ $"export NODE_OPTIONS=--no-node-snapshot\n" | save --append .env
142
+
143
+ }
144
+
145
+ # Builds and publishes a Backstage Docker image and Helm chart
146
+ def --env "main build backstage" [
147
+ tag: string
148
+ --image = "ghcr.io/vfarcic/idp-full-backstage"
149
+ --github_org = "vfarcic"
150
+ ] {
151
+
152
+ docker login $image
153
+
154
+ cd backstage
155
+
156
+ yarn install --immutable
157
+
158
+ yarn tsc
159
+
160
+ yarn build:backend
161
+
162
+ (
163
+ docker buildx build
164
+ --file packages/backend/Dockerfile
165
+ --tag $"($image):($tag)"
166
+ --platform linux/amd64
167
+ .
168
+ )
169
+
170
+ docker image push $"($image):($tag)"
171
+
172
+ cd ..
173
+
174
+ open charts/backstage/Chart.yaml
175
+ | upsert version $tag
176
+ | upsert appVersion $tag
177
+ | save charts/backstage/Chart.yaml --force
178
+
179
+ open charts/backstage/values.yaml
180
+ | upsert image.repository $image
181
+ | upsert image.tag $tag
182
+ | save charts/backstage/values.yaml --force
183
+
184
+ helm package charts/backstage
185
+
186
+ helm push $"backstage-($tag).tgz" $"oci://ghcr.io/($image)"
187
+
188
+ start $"https://github.com/users/($github_org)/packages/container/package/idp-full-backstage"
189
+
190
+ print $"
191
+ Click (ansi yellow_bold)Package settings(ansi reset).
192
+ Click the (ansi yellow_bold)Change visibility(ansi reset) button, select (ansi yellow_bold)Public(ansi reset), type (ansi yellow_bold)idp-full-backstage(ansi reset) to confirm, and click the (ansi yellow_bold)I understand the consequences, change package visibility(ansi reset) button.
193
+ Press the (ansi yellow_bold)enter key(ansi reset) to continue.
194
+ "
195
+ input
196
+
197
+ start $"https://github.com/users/($github_org)/packages/container/package/idp-full-backstage%2Fbackstage"
198
+
199
+ print $"
200
+ Click (ansi yellow_bold)Package settings(ansi reset).
201
+ Click the (ansi yellow_bold)Change visibility(ansi reset) button, select (ansi yellow_bold)Public(ansi reset), type (ansi yellow_bold)idp-full-backstage/backstage(ansi reset) to confirm, and click the (ansi yellow_bold)I understand the consequences, change package visibility(ansi reset) button.
202
+ Press the (ansi yellow_bold)enter key(ansi reset) to continue.
203
+ "
204
+ input
205
+
206
+ rm $"backstage-($tag).tgz"
207
+
208
+ }
209
+
210
+ # Deploys Backstage to Kubernetes with necessary configuration
211
+ def --env "main apply backstage" [
212
+ tag: string # Available versions can be seen at https://github.com/users/vfarcic/packages/container/idp-full-backstage%2Fbackstage/versions
213
+ --kubeconfig = "kubeconfig-dot.yaml"
214
+ --ingress_host = "backstage.127.0.0.1.nip.io"
215
+ --github_token = "FIXME"
216
+ --create_service_account = false
217
+ --disable_default_workload_types = false
218
+ ] {
219
+
220
+ let cluster_data = (
221
+ get cluster data
222
+ --kubeconfig $kubeconfig
223
+ --create_service_account $create_service_account
224
+ )
225
+
226
+ {
227
+ apiVersion: "v1"
228
+ kind: "Secret"
229
+ metadata: {
230
+ name: "backstage-config"
231
+ namespace: "backstage"
232
+ }
233
+ type: "Opaque"
234
+ data: {
235
+ KUBE_URL: ($cluster_data.kube_url | encode base64)
236
+ KUBE_SA_TOKEN: $cluster_data.token_encoded
237
+ KUBE_CA_DATA: ($cluster_data.kube_ca_data | encode base64)
238
+ GITHUB_TOKEN: ($github_token | encode base64)
239
+ }
240
+ }
241
+ | to yaml
242
+ | kubectl --namespace backstage apply --filename -
243
+
244
+ (
245
+ helm upgrade --install cnpg cloudnative-pg
246
+ --repo https://cloudnative-pg.github.io/charts
247
+ --namespace cnpg-system --create-namespace --wait
248
+ )
249
+
250
+ (
251
+ helm upgrade --install backstage
252
+ oci://ghcr.io/vfarcic/idp-full-backstage/backstage
253
+ --namespace backstage --create-namespace
254
+ --set $"ingress.host=($ingress_host)"
255
+ --set $"ingrestor.disableDefaultWorkloadTypes=($disable_default_workload_types)"
256
+ --version $tag --wait
257
+ )
258
+
259
+ sleep 60sec
260
+
261
+ print $"Backstage is available at (ansi yellow_bold)http://($ingress_host)(ansi reset)"
262
+
263
+ start $"http://($ingress_host)"
264
+
265
+ }
266
+
267
+ def "get cluster data" [
268
+ --kubeconfig = "kubeconfig-dot.yaml"
269
+ --create_service_account = false
270
+ ] {
271
+
272
+ if $create_service_account {
273
+
274
+ {
275
+ apiVersion: "v1"
276
+ kind: "Namespace"
277
+ metadata: {
278
+ name: "backstage"
279
+ }
280
+ } | to yaml | kubectl apply --filename -
281
+
282
+ {
283
+ apiVersion: "v1"
284
+ kind: "ServiceAccount"
285
+ metadata: {
286
+ name: "backstage"
287
+ namespace: "backstage"
288
+ }
289
+ } | to yaml | kubectl apply --filename -
290
+
291
+ {
292
+ apiVersion: "v1"
293
+ kind: "Secret"
294
+ metadata: {
295
+ name: "backstage"
296
+ namespace: "backstage"
297
+ annotations: {
298
+ "kubernetes.io/service-account.name": "backstage"
299
+ }
300
+ }
301
+ type: "kubernetes.io/service-account-token"
302
+ } | to yaml | kubectl apply --filename -
303
+
304
+ {
305
+ apiVersion: "rbac.authorization.k8s.io/v1"
306
+ kind: "ClusterRoleBinding"
307
+ metadata: {
308
+ name: "backstage"
309
+ }
310
+ subjects: [{
311
+ kind: "ServiceAccount"
312
+ name: "backstage"
313
+ namespace: "backstage"
314
+ }]
315
+ roleRef: {
316
+ kind: "ClusterRole"
317
+ name: "cluster-admin"
318
+ apiGroup: "rbac.authorization.k8s.io"
319
+ }
320
+ } | to yaml | kubectl apply --filename -
321
+
322
+ }
323
+
324
+ let kube_url = open $kubeconfig
325
+ | get clusters.0.cluster.server
326
+ $"export KUBE_URL=($kube_url)\n" | save --append .env
327
+
328
+ let kube_ca_data = open $kubeconfig
329
+ | get clusters.0.cluster.certificate-authority-data
330
+ $"export KUBE_CA_DATA=($kube_ca_data)\n" | save --append .env
331
+
332
+ let token_encoded = (
333
+ kubectl --namespace backstage get secret backstage
334
+ --output yaml
335
+ )
336
+ | from yaml
337
+ | get data.token
338
+
339
+ let token = ($token_encoded | decode base64 | decode)
340
+ $"export KUBE_SA_TOKEN=($token)\n" | save --append .env
341
+
342
+ {
343
+ kube_url: $kube_url,
344
+ kube_ca_data: $kube_ca_data,
345
+ token_encoded: $token_encoded,
346
+ token: $token
347
+ }
348
+
349
+ }
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env nu
2
+
3
+ # Installs cert-manager for managing TLS certificates in Kubernetes
4
+ def "main apply certmanager" [] {
5
+
6
+ (
7
+ helm upgrade --install cert-manager cert-manager
8
+ --repo https://charts.jetstack.io
9
+ --namespace cert-manager --create-namespace
10
+ --set crds.enabled=true --wait
11
+ )
12
+
13
+ }
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env nu
2
+
3
+ # Installs Cloud-Native PostgreSQL (CNPG) operator
4
+ def "main apply cnpg" [] {
5
+
6
+ print $"\nInstalling (ansi yellow_bold)Cloud-Native PostgreSQL \(CNPG\)(ansi reset)...\n"
7
+
8
+ (
9
+ helm upgrade --install cnpg cloudnative-pg
10
+ --repo https://cloudnative-pg.github.io/charts
11
+ --namespace cnpg-system --create-namespace --wait
12
+ )
13
+
14
+ }
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env nu
2
+
3
+ # Prompts user to select a cloud provider from available options
4
+ #
5
+ # Returns:
6
+ # The selected provider name and saves it to .env file
7
+ def "main get provider" [
8
+ --providers = [aws azure google kind upcloud] # List of cloud providers to choose from
9
+ ] {
10
+
11
+ let message = $"
12
+ Right now, only providers listed below are supported in this demo.
13
+ Please send an email to (ansi yellow_bold)viktor@farcic.com(ansi reset) if you'd like to add additional providers.
14
+
15
+ (ansi yellow_bold)Select a provider(ansi green_bold)"
16
+
17
+ let provider = $providers | input list $message
18
+ print $"(ansi reset)"
19
+
20
+ $"export PROVIDER=($provider)\n" | save --append .env
21
+
22
+ $provider
23
+ }
24
+
25
+ # Prints a reminder to source the environment variables
26
+ def "main print source" [] {
27
+
28
+ print $"
29
+ Execute `(ansi yellow_bold)source .env(ansi reset)` to load the environment variables.
30
+ "
31
+
32
+ }
33
+
34
+ # Removes temporary files created during script execution
35
+ def "main delete temp_files" [] {
36
+
37
+ rm --force .env
38
+
39
+ rm --force kubeconfig*.yaml
40
+
41
+ }
42
+
43
+ # Retrieves and configures credentials for the specified cloud provider
44
+ #
45
+ # Examples:
46
+ # > main get creds aws
47
+ # > main get creds azure
48
+ def --env "main get creds" [
49
+ provider: string, # The cloud provider to configure credentials for (aws, azure, google)
50
+ --aws-access-key-id: string, # AWS Access Key ID (optional, falls back to AWS_ACCESS_KEY_ID env var)
51
+ --aws-secret-access-key: string, # AWS Secret Access Key (optional, falls back to AWS_SECRET_ACCESS_KEY env var)
52
+ --aws-account-id: string, # AWS Account ID (optional, falls back to AWS_ACCOUNT_ID env var)
53
+ --azure-tenant: string # Azure Tenant ID (optional, falls back to AZURE_TENANT env var)
54
+ ] {
55
+
56
+ mut creds = {provider: $provider}
57
+
58
+ if $provider == "google" {
59
+
60
+ gcloud auth login
61
+
62
+
63
+ } else if $provider == "aws" {
64
+
65
+ mut access_key = $aws_access_key_id
66
+ if ($access_key | is-empty) and ("AWS_ACCESS_KEY_ID" in $env) {
67
+ $access_key = $env.AWS_ACCESS_KEY_ID
68
+ } else if ($access_key | is-empty) {
69
+ error make { msg: "AWS Access Key ID required via --aws-access-key-id parameter or AWS_ACCESS_KEY_ID environment variable" }
70
+ }
71
+ $"export AWS_ACCESS_KEY_ID=($access_key)\n"
72
+ | save --append .env
73
+ $creds = ( $creds | upsert aws_access_key_id $access_key )
74
+
75
+ mut secret_key = $aws_secret_access_key
76
+ if ($secret_key | is-empty) and ("AWS_SECRET_ACCESS_KEY" in $env) {
77
+ $secret_key = $env.AWS_SECRET_ACCESS_KEY
78
+ } else if ($secret_key | is-empty) {
79
+ error make { msg: "AWS Secret Access Key required via --aws-secret-access-key parameter or AWS_SECRET_ACCESS_KEY environment variable" }
80
+ }
81
+ $"export AWS_SECRET_ACCESS_KEY=($secret_key)\n"
82
+ | save --append .env
83
+ $creds = ( $creds | upsert aws_secret_access_key $secret_key )
84
+
85
+ mut account_id = $aws_account_id
86
+ if ($account_id | is-empty) and ("AWS_ACCOUNT_ID" in $env) {
87
+ $account_id = $env.AWS_ACCOUNT_ID
88
+ } else if ($account_id | is-empty) {
89
+ error make { msg: "AWS Account ID required via --aws-account-id parameter or AWS_ACCOUNT_ID environment variable" }
90
+ }
91
+ $"export AWS_ACCOUNT_ID=($account_id)\n"
92
+ | save --append .env
93
+ $creds = ( $creds | upsert aws_account_id $account_id )
94
+
95
+ } else if $provider == "azure" {
96
+
97
+ mut tenant = $azure_tenant
98
+ if ($tenant | is-empty) and ("AZURE_TENANT" in $env) {
99
+ $tenant = $env.AZURE_TENANT
100
+ } else if ($tenant | is-empty) {
101
+ error make { msg: "Azure Tenant ID required via --azure-tenant parameter or AZURE_TENANT environment variable" }
102
+ }
103
+ $creds = ( $creds | upsert tenant_id $tenant )
104
+
105
+ az login --tenant $tenant
106
+
107
+ } else {
108
+
109
+ print $"(ansi red_bold)($provider)(ansi reset) is not a supported."
110
+ exit 1
111
+
112
+ }
113
+
114
+ $creds
115
+
116
+ }