bdy 1.23.6-dev → 1.23.7-dev-target-commands

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 (51) hide show
  1. package/distTs/detect-rules.json +351 -0
  2. package/distTs/package.json +3 -1
  3. package/distTs/src/api/client.js +156 -0
  4. package/distTs/src/cliIndex.js +4 -0
  5. package/distTs/src/command/artifact/list.js +1 -6
  6. package/distTs/src/command/distro/route/update.js +1 -1
  7. package/distTs/src/command/distro/update.js +9 -9
  8. package/distTs/src/command/environment/create.js +70 -0
  9. package/distTs/src/command/environment/delete.js +29 -0
  10. package/distTs/src/command/environment/get.js +48 -0
  11. package/distTs/src/command/environment/list.js +44 -0
  12. package/distTs/src/command/environment/resolve.js +22 -0
  13. package/distTs/src/command/environment/update.js +59 -0
  14. package/distTs/src/command/environment.js +20 -0
  15. package/distTs/src/command/pipeline/run/apply.js +62 -0
  16. package/distTs/src/command/target/create.js +33 -0
  17. package/distTs/src/command/target/delete.js +30 -0
  18. package/distTs/src/command/target/exec/command.js +65 -0
  19. package/distTs/src/command/target/exec/kill.js +25 -0
  20. package/distTs/src/command/target/exec/list.js +54 -0
  21. package/distTs/src/command/target/exec/logs.js +25 -0
  22. package/distTs/src/command/target/exec/status.js +41 -0
  23. package/distTs/src/command/target/exec.js +24 -0
  24. package/distTs/src/command/target/get.js +62 -0
  25. package/distTs/src/command/target/list.js +48 -0
  26. package/distTs/src/command/target/scope.js +60 -0
  27. package/distTs/src/command/target/update.js +31 -0
  28. package/distTs/src/command/target.js +22 -0
  29. package/distTs/src/command/yaml/actions/detect.js +268 -0
  30. package/distTs/src/command/yaml/actions/info.js +56 -0
  31. package/distTs/src/command/yaml/actions/list.js +70 -0
  32. package/distTs/src/command/yaml/actions/schema.js +104 -0
  33. package/distTs/src/command/yaml/actions.js +13 -0
  34. package/distTs/src/command/yaml/agents.js +88 -0
  35. package/distTs/src/command/yaml/cache.js +98 -0
  36. package/distTs/src/command/yaml/init.js +110 -0
  37. package/distTs/src/command/yaml/pipeline.js +42 -0
  38. package/distTs/src/command/yaml/render.js +83 -0
  39. package/distTs/src/command/yaml/schemaUtils.js +139 -0
  40. package/distTs/src/command/yaml/validate.js +259 -0
  41. package/distTs/src/command/yaml.js +18 -0
  42. package/distTs/src/diskCache.js +82 -0
  43. package/distTs/src/input.js +54 -0
  44. package/distTs/src/texts.js +198 -8
  45. package/distTs/src/utils.js +16 -2
  46. package/package.json +3 -1
  47. package/distTs/README.md +0 -181
  48. package/distTs/src/command/project/get.js +0 -18
  49. package/distTs/src/command/project/set.js +0 -31
  50. package/distTs/src/command/sandbox/get/yaml.js +0 -30
  51. package/distTs/src/command/vt/scrape.js +0 -193
@@ -0,0 +1,351 @@
1
+ {
2
+ "BUILD": {
3
+ "files": ["package.json", "requirements.txt", "pyproject.toml", "go.mod", "Gemfile", "pom.xml", "build.gradle", "build.gradle.kts", "Cargo.toml", "composer.json", "pubspec.yaml", "Makefile", "CMakeLists.txt"],
4
+ "packages": ["eslint", "oxlint", "@oxlint/cli", "@biomejs/biome", "prettier", "stylelint", "xo", "standard", "typescript"]
5
+ },
6
+ "DOCKERFILE": {
7
+ "files": ["Dockerfile", "Containerfile", "compose.yaml", "compose.yml", "docker-compose.yml", "docker-compose.yaml"]
8
+ },
9
+ "DOCKER_PUSH": {
10
+ "files": ["Dockerfile", "Containerfile"]
11
+ },
12
+ "RUN_DOCKER_CONTAINER": {
13
+ "files": ["Dockerfile", "Containerfile", "compose.yaml", "compose.yml", "docker-compose.yml"]
14
+ },
15
+ "DOCKERFILE_LINTER": {
16
+ "files": ["Dockerfile", "Containerfile"]
17
+ },
18
+ "DOCKER": {
19
+ "files": ["Dockerfile", "Containerfile", "compose.yaml", "compose.yml", "docker-compose.yml"]
20
+ },
21
+ "DOCKER_BUILD_MULTI_ARCH": {
22
+ "files": ["Dockerfile", "Containerfile"]
23
+ },
24
+ "NATIVE_BUILD_DOCKER_CLI": {
25
+ "files": ["Dockerfile", "Containerfile"]
26
+ },
27
+ "PROMOTE_IMAGE": {
28
+ "files": ["Dockerfile", "Containerfile"]
29
+ },
30
+ "KUBERNETES_APPLY": {
31
+ "files": ["k8s/", "kubernetes/", "kustomization.yaml", "kustomization.yml", "Kustomization"],
32
+ "packages": ["@aws-sdk/client-eks", "@google-cloud/container", "@azure/arm-containerservice"]
33
+ },
34
+ "KUBERNETES_SET_IMAGE": {
35
+ "files": ["k8s/", "kubernetes/"]
36
+ },
37
+ "KUBERNETES_RUN_POD": {
38
+ "files": ["k8s/", "kubernetes/"]
39
+ },
40
+ "KUBERNETES_RUN_JOB": {
41
+ "files": ["k8s/", "kubernetes/"]
42
+ },
43
+ "KUBERNETES_CLI": {
44
+ "files": ["k8s/", "kubernetes/", "kustomization.yaml", "kustomization.yml", "Kustomization"],
45
+ "packages": ["@kubernetes/client-node", "@aws-sdk/client-eks", "@google-cloud/container", "@azure/arm-containerservice"]
46
+ },
47
+ "HELM": {
48
+ "files": ["Chart.yaml", "helm/", "charts/"]
49
+ },
50
+ "WAIT_FOR_APPLY": {
51
+ "files": ["k8s/", "kubernetes/"]
52
+ },
53
+ "AMAZON_S3": {
54
+ "packages": ["aws-sdk", "@aws-sdk/client-s3"]
55
+ },
56
+ "AWS_CLI": {
57
+ "files": ["buildspec.yml"],
58
+ "packages": ["aws-sdk", "@aws-sdk/*"]
59
+ },
60
+ "AWS_CLI_2": {
61
+ "files": ["buildspec.yml"],
62
+ "packages": ["aws-sdk", "@aws-sdk/*"]
63
+ },
64
+ "AWS_LAMBDA_DEPLOY": {
65
+ "files": ["serverless.yml", "serverless.yaml", "samconfig.toml", "sam-template.yaml"],
66
+ "packages": ["aws-sdk", "@aws-sdk/client-lambda"]
67
+ },
68
+ "LAMBDA": {
69
+ "files": ["serverless.yml", "samconfig.toml"],
70
+ "packages": ["@aws-sdk/client-lambda"]
71
+ },
72
+ "AWS_ECS": {
73
+ "files": ["ecs-task-definition.json", "task-definition.json"],
74
+ "packages": ["@aws-sdk/client-ecs"]
75
+ },
76
+ "CODE_DEPLOY": {
77
+ "files": ["appspec.yml", "appspec.yaml"]
78
+ },
79
+ "ELASTIC_BEANSTALK": {
80
+ "files": [".elasticbeanstalk/"]
81
+ },
82
+ "MONITOR": {
83
+ "files": [".elasticbeanstalk/"]
84
+ },
85
+ "AWS_CLOUD_FORMATION": {
86
+ "files": ["cloudformation/"]
87
+ },
88
+ "CLOUD_FRONT": {
89
+ "packages": ["aws-sdk", "@aws-sdk/client-cloudfront"]
90
+ },
91
+ "CODE_PIPELINE": {
92
+ "files": ["buildspec.yml"]
93
+ },
94
+ "AWS_APP_RUNNER_DEPLOY": {
95
+ "packages": ["@aws-sdk/client-apprunner"]
96
+ },
97
+ "AWS_APP_RUNNER_MONITOR": {
98
+ "packages": ["@aws-sdk/client-apprunner"]
99
+ },
100
+ "AWS_CDK_CLI": {
101
+ "files": ["cdk.json"],
102
+ "packages": ["aws-cdk-lib", "aws-cdk"]
103
+ },
104
+ "DOWNLOAD_S3": {
105
+ "packages": ["aws-sdk", "@aws-sdk/client-s3"]
106
+ },
107
+ "GOOGLE_CLOUD_STORAGE": {
108
+ "packages": ["@google-cloud/storage"]
109
+ },
110
+ "GOOGLE_CLOUD_CLI": {
111
+ "packages": ["@google-cloud/*"]
112
+ },
113
+ "GOOGLE_APP_DEPLOY": {
114
+ "files": ["app.yaml"]
115
+ },
116
+ "GOOGLE_FUNCTION_DEPLOY": {
117
+ "files": ["firebase.json"],
118
+ "packages": ["@google-cloud/functions-framework"]
119
+ },
120
+ "GOOGLE_FUNCTION_INVOKE": {
121
+ "packages": ["@google-cloud/functions-framework"]
122
+ },
123
+ "GOOGLE_CLOUD_RUN_DEPLOY": {
124
+ "files": ["Dockerfile", "Containerfile"]
125
+ },
126
+ "GOOGLE_CDN_INVALIDATE": {
127
+ "packages": ["@google-cloud/compute"]
128
+ },
129
+ "FIREBASE": {
130
+ "files": ["firebase.json", ".firebaserc"],
131
+ "packages": ["firebase", "firebase-admin"]
132
+ },
133
+ "DOWNLOAD_GCS": {
134
+ "packages": ["@google-cloud/storage"]
135
+ },
136
+ "AZURE": {
137
+ "files": ["azure-pipelines.yml"]
138
+ },
139
+ "AZURE_CLI": {
140
+ "files": ["azure-pipelines.yml"],
141
+ "packages": ["@azure/*"]
142
+ },
143
+ "AZURE_STORAGE": {
144
+ "packages": ["@azure/storage-blob"]
145
+ },
146
+ "HEROKU": {
147
+ "files": ["Procfile"]
148
+ },
149
+ "HEROKU_CLI": {
150
+ "files": ["Procfile"]
151
+ },
152
+ "NETLIFY": {
153
+ "files": ["netlify.toml"]
154
+ },
155
+ "TERRAFORM": {
156
+ "files": ["*.tf", "*.tofu", "terraform/", ".terraform/"]
157
+ },
158
+ "ANDROID_SIGN": {
159
+ "files": ["android/", "app/src/main/AndroidManifest.xml"]
160
+ },
161
+ "ANDROID_SIGN_BUNDLE": {
162
+ "files": ["android/", "app/src/main/AndroidManifest.xml"]
163
+ },
164
+ "ANDROID_PUBLISH_APK": {
165
+ "files": ["android/", "app/src/main/AndroidManifest.xml"]
166
+ },
167
+ "ANDROID_PUBLISH_APP_BUNDLE": {
168
+ "files": ["android/", "app/src/main/AndroidManifest.xml"]
169
+ },
170
+ "FASTLANE_ANDROID": {
171
+ "files": ["fastlane/", "android/"]
172
+ },
173
+ "NATIVE_BUILD_MAC": {
174
+ "files": ["*.xcodeproj", "*.xcworkspace"]
175
+ },
176
+ "NATIVE_BUILD_MAC_VM": {
177
+ "files": ["*.xcodeproj", "*.xcworkspace"]
178
+ },
179
+ "NATIVE_BUILD_MAC_SIGN": {
180
+ "files": ["*.xcodeproj", "*.xcworkspace"]
181
+ },
182
+ "NATIVE_BUILD_MAC_DEPLOY": {
183
+ "files": ["*.xcodeproj", "*.xcworkspace"]
184
+ },
185
+ "NATIVE_BUILD_MAC_REACT": {
186
+ "files": ["ios/"],
187
+ "packages": ["react-native"]
188
+ },
189
+ "NATIVE_BUILD_MAC_CORDOVA": {
190
+ "packages": ["cordova"]
191
+ },
192
+ "NATIVE_BUILD_MAC_FASTLANE": {
193
+ "files": ["fastlane/Fastfile"]
194
+ },
195
+ "NATIVE_BUILD_MAC_FLUTTER": {
196
+ "files": ["pubspec.yaml", "ios/"]
197
+ },
198
+ "PLAYWRIGHT": {
199
+ "files": ["playwright.config.*"],
200
+ "packages": ["@playwright/test", "playwright"]
201
+ },
202
+ "CYPRESS": {
203
+ "files": ["cypress.config.*", "cypress/"],
204
+ "packages": ["cypress"]
205
+ },
206
+ "STORYBOOK": {
207
+ "files": [".storybook/"],
208
+ "packages": ["storybook", "@storybook/react"]
209
+ },
210
+ "LIGHTHOUSE": {
211
+ "packages": ["lighthouse"]
212
+ },
213
+ "JMETER_CLI": {
214
+ "files": ["*.jmx"]
215
+ },
216
+ "SNYK_CLI": {
217
+ "files": [".snyk"],
218
+ "packages": ["snyk"]
219
+ },
220
+ "STACK_HAWK_CLI": {
221
+ "files": ["stackhawk.yml"]
222
+ },
223
+ "BLACKFIRE_PHP": {
224
+ "packages": ["blackfire/php-sdk"]
225
+ },
226
+ "BLACKFIRE_PYTHON": {
227
+ "packages": ["blackfire"]
228
+ },
229
+ "BLACKFIRE_GO": {
230
+ "packages": ["github.com/blackfireio/go-blackfire"]
231
+ },
232
+ "SENTRY": {
233
+ "packages": ["@sentry/node", "@sentry/browser", "@sentry/react"]
234
+ },
235
+ "SENTRY_ENTERPRISE": {
236
+ "packages": ["@sentry/node", "@sentry/browser"]
237
+ },
238
+ "NEW_RELIC": {
239
+ "packages": ["newrelic"]
240
+ },
241
+ "NEW_RELIC_CLI": {
242
+ "packages": ["newrelic"]
243
+ },
244
+ "DATADOG": {
245
+ "packages": ["dd-trace", "datadog-metrics"]
246
+ },
247
+ "DATADOG_STATUS_CHECK": {
248
+ "packages": ["dd-trace"]
249
+ },
250
+ "ROLLBAR": {
251
+ "packages": ["rollbar"]
252
+ },
253
+ "HONEYBADGER": {
254
+ "packages": ["@honeybadger-io/js"]
255
+ },
256
+ "BUGSNAG": {
257
+ "packages": ["@bugsnag/js", "@bugsnag/node"]
258
+ },
259
+ "RAYGUN": {
260
+ "packages": ["raygun"]
261
+ },
262
+ "LOGGLY": {
263
+ "packages": ["node-loggly-bulk", "winston-loggly-bulk"]
264
+ },
265
+ "DO_SPACES": {
266
+ "packages": ["aws-sdk", "@aws-sdk/client-s3"]
267
+ },
268
+ "GIT_HUB_RELEASE": {
269
+ "files": [".github/workflows/"]
270
+ },
271
+ "GIT_HUB_CLI": {
272
+ "files": [".github/workflows/"]
273
+ },
274
+ "GIT_LAB_CLI": {
275
+ "files": [".gitlab-ci.yml"]
276
+ },
277
+ "SHOPIFY": {
278
+ "files": ["shopify.app.toml"],
279
+ "packages": ["@shopify/shopify-api"]
280
+ },
281
+ "SHOPIFY_CLI": {
282
+ "files": ["shopify.app.toml"],
283
+ "packages": ["@shopify/cli"]
284
+ },
285
+ "SHOPIFY_THEMEKIT_CLI": {
286
+ "files": ["shopify.app.toml"]
287
+ },
288
+ "WP_CLI": {
289
+ "files": ["wp-config.php", "wp-content/"]
290
+ },
291
+ "CONTENTFUL_CLI": {
292
+ "packages": ["contentful", "contentful-management"]
293
+ },
294
+ "MYSQL_CLI": {
295
+ "packages": ["mysql", "mysql2", "sequelize", "typeorm", "prisma", "drizzle-orm"]
296
+ },
297
+ "CLOUDFLARE": {
298
+ "files": ["wrangler.toml", "wrangler.json", "wrangler.jsonc"],
299
+ "packages": ["wrangler"]
300
+ },
301
+ "NATIVE_BUILD_WINDOWS": {
302
+ "files": ["*.sln", "*.slnx", "*.csproj"]
303
+ },
304
+ "GIT_CRYPT_UNLOCK": {
305
+ "files": [".git-crypt/"]
306
+ },
307
+ "GIT_CRYPT_LOCK": {
308
+ "files": [".git-crypt/"]
309
+ },
310
+ "JIRA_BUILD": {
311
+ "files": [".jira/"]
312
+ },
313
+ "JIRA_DEPLOYMENT": {
314
+ "files": [".jira/"]
315
+ },
316
+ "NPM_PUBLISH": {
317
+ "files": ["package.json"]
318
+ },
319
+ "DOCTL": {
320
+ "files": [".do/"],
321
+ "packages": ["digitalocean", "do-wrapper"]
322
+ },
323
+ "DIGITAL_OCEAN_CDN": {
324
+ "files": [".do/"],
325
+ "packages": ["digitalocean", "do-wrapper"]
326
+ },
327
+ "SLACK": {
328
+ "packages": ["@slack/web-api", "@slack/bolt", "@slack/webhook"]
329
+ },
330
+ "DISCORD2": {
331
+ "packages": ["discord.js", "discord-webhook-node"]
332
+ },
333
+ "MICROSOFT_TEAMS": {
334
+ "packages": ["botbuilder", "@microsoft/teams-js"]
335
+ },
336
+ "TELEGRAM": {
337
+ "packages": ["telegraf", "node-telegram-bot-api", "grammy"]
338
+ },
339
+ "EMAIL": {
340
+ "packages": ["nodemailer", "@sendgrid/mail", "postmark", "mailgun-js"]
341
+ },
342
+ "POWERSHELL": {
343
+ "files": ["*.ps1", "*.psm1"]
344
+ },
345
+ "GHOST_INSPECTOR_CLI": {
346
+ "packages": ["ghost-inspector"]
347
+ },
348
+ "BACKBLAZE_B2": {
349
+ "packages": ["backblaze-b2"]
350
+ }
351
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bdy",
3
3
  "preferGlobal": false,
4
- "version": "1.23.6-dev",
4
+ "version": "1.23.7-dev-target-commands",
5
5
  "type": "commonjs",
6
6
  "license": "MIT",
7
7
  "homepage": "https://buddy.works/docs/cli",
@@ -27,6 +27,8 @@
27
27
  "e2e:tunnel": "vitest run --config e2e/vitest.config.ts e2e/modules/tunnel/",
28
28
  "e2e:agent": "vitest run --config e2e/vitest.config.ts e2e/modules/agent/",
29
29
  "e2e:distro": "vitest run --config e2e/vitest.config.ts e2e/modules/distro/",
30
+ "e2e:target": "vitest run --config e2e/vitest.config.ts e2e/modules/target/",
31
+ "e2e:environment": "vitest run --config e2e/vitest.config.ts e2e/modules/environment/",
30
32
  "unit": "vitest run --config vitest.config.ts"
31
33
  },
32
34
  "files": [
@@ -563,6 +563,162 @@ class ApiClient {
563
563
  q.project = project;
564
564
  return await this.getResourceByIdentifier(workspace, q);
565
565
  }
566
+ // Target methods
567
+ targetScopeQuery(scope) {
568
+ const query = {};
569
+ if (scope.project)
570
+ query.project_name = scope.project;
571
+ if (scope.pipelineId)
572
+ query.pipeline_id = scope.pipelineId.toString();
573
+ if (scope.environmentId)
574
+ query.environment_id = scope.environmentId;
575
+ return query;
576
+ }
577
+ async getTargets(workspace, filters = {}) {
578
+ return await this.request({
579
+ method: 'GET',
580
+ path: `/workspaces/${encodeURIComponent(workspace)}/targets`,
581
+ query: this.targetScopeQuery(filters),
582
+ parseResponseBody: true,
583
+ });
584
+ }
585
+ async getTarget(workspace, targetId) {
586
+ return await this.request({
587
+ method: 'GET',
588
+ path: `/workspaces/${encodeURIComponent(workspace)}/targets/${encodeURIComponent(targetId)}`,
589
+ parseResponseBody: true,
590
+ });
591
+ }
592
+ async createTargetByYaml(workspace, scope, body) {
593
+ return await this.request({
594
+ method: 'POST',
595
+ path: `/workspaces/${encodeURIComponent(workspace)}/targets/yaml`,
596
+ query: this.targetScopeQuery(scope),
597
+ body,
598
+ parseResponseBody: true,
599
+ });
600
+ }
601
+ async updateTargetByYaml(workspace, targetId, body) {
602
+ return await this.request({
603
+ method: 'PATCH',
604
+ path: `/workspaces/${encodeURIComponent(workspace)}/targets/${encodeURIComponent(targetId)}/yaml`,
605
+ body,
606
+ parseResponseBody: true,
607
+ });
608
+ }
609
+ async deleteTarget(workspace, targetId) {
610
+ return await this.request({
611
+ method: 'DELETE',
612
+ path: `/workspaces/${encodeURIComponent(workspace)}/targets/${encodeURIComponent(targetId)}`,
613
+ parseResponseBody: false,
614
+ });
615
+ }
616
+ async executeTargetCommand(workspace, targetId, body) {
617
+ return await this.request({
618
+ method: 'POST',
619
+ path: `/workspaces/${encodeURIComponent(workspace)}/targets/${encodeURIComponent(targetId)}/execs`,
620
+ body,
621
+ parseResponseBody: true,
622
+ });
623
+ }
624
+ async getTargetExecs(workspace, targetId, limit) {
625
+ const query = {};
626
+ if (limit)
627
+ query.limit = limit.toString();
628
+ return await this.request({
629
+ method: 'GET',
630
+ path: `/workspaces/${encodeURIComponent(workspace)}/targets/${encodeURIComponent(targetId)}/execs`,
631
+ query,
632
+ parseResponseBody: true,
633
+ });
634
+ }
635
+ async getTargetExec(workspace, execId, wait) {
636
+ const query = {};
637
+ if (wait)
638
+ query.wait = wait.toString();
639
+ return await this.request({
640
+ method: 'GET',
641
+ path: `/workspaces/${encodeURIComponent(workspace)}/targets/execs/${encodeURIComponent(execId)}`,
642
+ query,
643
+ parseResponseBody: true,
644
+ });
645
+ }
646
+ async cancelTargetExec(workspace, execId) {
647
+ return await this.request({
648
+ method: 'DELETE',
649
+ path: `/workspaces/${encodeURIComponent(workspace)}/targets/execs/${encodeURIComponent(execId)}`,
650
+ parseResponseBody: false,
651
+ });
652
+ }
653
+ async getTargetExecLog(workspace, execId, offset, limit) {
654
+ const query = {};
655
+ if (offset)
656
+ query.offset = offset.toString();
657
+ if (limit)
658
+ query.limit = limit.toString();
659
+ return await this.request({
660
+ method: 'GET',
661
+ path: `/workspaces/${encodeURIComponent(workspace)}/targets/execs/${encodeURIComponent(execId)}/log`,
662
+ query,
663
+ parseResponseBody: true,
664
+ });
665
+ }
666
+ async getTargetByIdentifier(workspace, identifier, line = {}) {
667
+ return await this.getResourceByIdentifier(workspace, {
668
+ target: identifier,
669
+ ...line,
670
+ });
671
+ }
672
+ // Environment methods
673
+ async getEnvironments(workspace, project) {
674
+ const query = {};
675
+ if (project)
676
+ query.project_name = project;
677
+ return await this.request({
678
+ method: 'GET',
679
+ path: `/workspaces/${encodeURIComponent(workspace)}/environments`,
680
+ query,
681
+ parseResponseBody: true,
682
+ });
683
+ }
684
+ async getEnvironment(workspace, environmentId) {
685
+ return await this.request({
686
+ method: 'GET',
687
+ path: `/workspaces/${encodeURIComponent(workspace)}/environments/${encodeURIComponent(environmentId)}`,
688
+ parseResponseBody: true,
689
+ });
690
+ }
691
+ async createEnvironment(workspace, body) {
692
+ return await this.request({
693
+ method: 'POST',
694
+ path: `/workspaces/${encodeURIComponent(workspace)}/environments`,
695
+ body,
696
+ parseResponseBody: true,
697
+ });
698
+ }
699
+ async updateEnvironment(workspace, environmentId, body) {
700
+ return await this.request({
701
+ method: 'PATCH',
702
+ path: `/workspaces/${encodeURIComponent(workspace)}/environments/${encodeURIComponent(environmentId)}`,
703
+ body,
704
+ parseResponseBody: true,
705
+ });
706
+ }
707
+ async deleteEnvironment(workspace, environmentId) {
708
+ return await this.request({
709
+ method: 'DELETE',
710
+ path: `/workspaces/${encodeURIComponent(workspace)}/environments/${encodeURIComponent(environmentId)}`,
711
+ parseResponseBody: false,
712
+ });
713
+ }
714
+ async getEnvironmentByIdentifier(workspace, identifier, project) {
715
+ const q = {
716
+ environment: identifier,
717
+ };
718
+ if (project)
719
+ q.project = project;
720
+ return await this.getResourceByIdentifier(workspace, q);
721
+ }
566
722
  // Sandbox methods
567
723
  async createSandbox(workspace, project, body) {
568
724
  return await this.request({
@@ -24,6 +24,8 @@ const artifact_1 = __importDefault(require("./command/artifact"));
24
24
  const api_1 = __importDefault(require("./command/api"));
25
25
  const domain_1 = __importDefault(require("./command/domain"));
26
26
  const distro_1 = __importDefault(require("./command/distro"));
27
+ const target_1 = __importDefault(require("./command/target"));
28
+ const environment_1 = __importDefault(require("./command/environment"));
27
29
  const register_1 = __importDefault(require("./command/register"));
28
30
  const mcp_1 = __importDefault(require("./command/mcp"));
29
31
  function cliIndex() {
@@ -47,6 +49,8 @@ function cliIndex() {
47
49
  program.addCommand(sandbox_1.default);
48
50
  program.addCommand(domain_1.default);
49
51
  program.addCommand(distro_1.default);
52
+ program.addCommand(target_1.default);
53
+ program.addCommand(environment_1.default);
50
54
  program.addCommand(login_1.default);
51
55
  program.addCommand(register_1.default);
52
56
  program.addCommand(whoami_1.default);
@@ -22,10 +22,7 @@ commandArtifactList.action(async (options) => {
22
22
  const response = await client.getArtifacts(workspace, scope === distro_1.SCOPE.PROJECT ? project : null);
23
23
  const artifacts = response.artifacts || [];
24
24
  if (options.format === 'json') {
25
- const filtered = scope === distro_1.SCOPE.PROJECT
26
- ? artifacts.filter((a) => a.scope !== distro_1.SCOPE.WORKSPACE)
27
- : artifacts;
28
- output_1.default.json(filtered);
25
+ output_1.default.json(artifacts);
29
26
  }
30
27
  else {
31
28
  if (artifacts.length === 0) {
@@ -33,8 +30,6 @@ commandArtifactList.action(async (options) => {
33
30
  }
34
31
  const data = [['NAME', 'IDENTIFIER', 'TYPE', 'URL']];
35
32
  for (const artifact of artifacts) {
36
- if (scope === distro_1.SCOPE.PROJECT && artifact.scope === distro_1.SCOPE.WORKSPACE)
37
- continue;
38
33
  data.push([
39
34
  artifact.name,
40
35
  artifact.identifier,
@@ -77,7 +77,7 @@ commandDistroRouteUpdate.action(async (identifier, routeId, options) => {
77
77
  changed = true;
78
78
  }
79
79
  if (!changed) {
80
- output_1.default.exitError(texts_1.ERR_COMMAND_ROUTE_NO_UPDATE);
80
+ output_1.default.exitError(texts_1.ERR_COMMAND_NO_UPDATE);
81
81
  }
82
82
  const result = await client.updateRoute(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id, routeId, body);
83
83
  output_1.default.id(result.id);
@@ -27,14 +27,6 @@ commandDistroUpdate.action(async (identifier, options) => {
27
27
  const workspace = input_1.default.restApiWorkspace(options.workspace);
28
28
  const project = input_1.default.restApiProject(options.project, true);
29
29
  const scope = input_1.default.scope(project, options.scope);
30
- const client = input_1.default.restApiTokenClient();
31
- const data = await client.getDistributionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
32
- if (!data || !data.domain) {
33
- output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
34
- }
35
- if (!data || !data.distribution_id) {
36
- output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_NOT_FOUND);
37
- }
38
30
  const body = {};
39
31
  let changed = false;
40
32
  if (options.name) {
@@ -54,7 +46,15 @@ commandDistroUpdate.action(async (identifier, options) => {
54
46
  changed = true;
55
47
  }
56
48
  if (!changed) {
57
- output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_NO_UPDATE);
49
+ output_1.default.exitError(texts_1.ERR_COMMAND_NO_UPDATE);
50
+ }
51
+ const client = input_1.default.restApiTokenClient();
52
+ const data = await client.getDistributionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
53
+ if (!data || !data.domain) {
54
+ output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
55
+ }
56
+ if (!data || !data.distribution_id) {
57
+ output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_NOT_FOUND);
58
58
  }
59
59
  const result = await client.updateDistribution(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id, body);
60
60
  output_1.default.identifier(result.identifier);
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("../../utils");
7
+ const texts_1 = require("../../texts");
8
+ const input_1 = __importDefault(require("../../input"));
9
+ const output_1 = __importDefault(require("../../output"));
10
+ const distro_1 = require("../../types/distro");
11
+ const commandEnvironmentCreate = (0, utils_1.newCommand)('create', texts_1.DESC_COMMAND_ENVIRONMENT_CREATE);
12
+ commandEnvironmentCreate.alias('add');
13
+ commandEnvironmentCreate.option('-i, --identifier <identifier>', texts_1.OPTION_ENVIRONMENT_CREATE_IDENTIFIER);
14
+ commandEnvironmentCreate.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
15
+ commandEnvironmentCreate.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
16
+ commandEnvironmentCreate.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
17
+ commandEnvironmentCreate.option('--tags <tags>', texts_1.OPTION_ENVIRONMENT_TAGS);
18
+ commandEnvironmentCreate.option('--public-url <url>', texts_1.OPTION_ENVIRONMENT_PUBLIC_URL);
19
+ commandEnvironmentCreate.option('--icon <icon>', texts_1.OPTION_ENVIRONMENT_ICON);
20
+ commandEnvironmentCreate.option('--note <note>', texts_1.OPT_COMMAND_NOTE);
21
+ commandEnvironmentCreate.option('--agent-note <note>', texts_1.OPT_COMMAND_AGENT_NOTE);
22
+ commandEnvironmentCreate.argument('[name]', texts_1.OPTION_ENVIRONMENT_NAME);
23
+ commandEnvironmentCreate.addHelpText('after', `\nEXAMPLES:${texts_1.EXAMPLE_ENVIRONMENT_CREATE}`);
24
+ commandEnvironmentCreate.action(async (name, options) => {
25
+ const humanId = require('human-id').default;
26
+ const workspace = input_1.default.restApiWorkspace(options.workspace);
27
+ const project = input_1.default.restApiProject(options.project, true);
28
+ const scope = input_1.default.scope(project, options.scope);
29
+ if (!name) {
30
+ if (options.identifier)
31
+ name = options.identifier;
32
+ else
33
+ name = humanId({ separator: '-', capitalize: false });
34
+ }
35
+ // identifier is required by the API; derive a slug from the name when
36
+ // -i is not given (hyphens cannot appear at the start or end)
37
+ const slug = name
38
+ .toLowerCase()
39
+ .replace(/[^a-z0-9_-]+/g, '-')
40
+ .replace(/^-+|-+$/g, '');
41
+ const data = {
42
+ name,
43
+ identifier: options.identifier || slug,
44
+ scope,
45
+ };
46
+ if (project && scope === distro_1.SCOPE.PROJECT) {
47
+ data.project = {
48
+ name: project,
49
+ };
50
+ }
51
+ if (options.tags) {
52
+ data.tags = input_1.default.tags(options.tags);
53
+ }
54
+ if (options.publicUrl) {
55
+ data.public_url = options.publicUrl;
56
+ }
57
+ if (options.icon) {
58
+ data.icon = options.icon;
59
+ }
60
+ if (options.note) {
61
+ data.note = options.note;
62
+ }
63
+ if (options.agentNote) {
64
+ data.agent_note = options.agentNote;
65
+ }
66
+ const client = input_1.default.restApiTokenClient();
67
+ const result = await client.createEnvironment(workspace, data);
68
+ output_1.default.exitSuccess((0, texts_1.TXT_ENVIRONMENT_CREATED)(result.identifier, result.html_url));
69
+ });
70
+ exports.default = commandEnvironmentCreate;