bdy 1.25.21-dev → 1.25.22-master

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bdy",
3
3
  "preferGlobal": false,
4
- "version": "1.25.21-dev",
4
+ "version": "1.25.22-master",
5
5
  "type": "commonjs",
6
6
  "license": "MIT",
7
7
  "homepage": "https://buddy.works/docs/cli",
@@ -704,25 +704,25 @@ class ApiClient {
704
704
  parseResponseBody: true,
705
705
  });
706
706
  }
707
- async getTargetExec(workspace, execId, wait) {
707
+ async getTargetExec(workspace, targetId, execId, wait) {
708
708
  const query = {};
709
709
  if (wait)
710
710
  query.wait = wait.toString();
711
711
  return await this.request({
712
712
  method: 'GET',
713
- path: `/workspaces/${encodeURIComponent(workspace)}/targets/execs/${encodeURIComponent(execId)}`,
713
+ path: `/workspaces/${encodeURIComponent(workspace)}/targets/${encodeURIComponent(targetId)}/execs/${encodeURIComponent(execId)}`,
714
714
  query,
715
715
  parseResponseBody: true,
716
716
  });
717
717
  }
718
- async cancelTargetExec(workspace, execId) {
718
+ async cancelTargetExec(workspace, targetId, execId) {
719
719
  return await this.request({
720
720
  method: 'DELETE',
721
- path: `/workspaces/${encodeURIComponent(workspace)}/targets/execs/${encodeURIComponent(execId)}`,
721
+ path: `/workspaces/${encodeURIComponent(workspace)}/targets/${encodeURIComponent(targetId)}/execs/${encodeURIComponent(execId)}`,
722
722
  parseResponseBody: false,
723
723
  });
724
724
  }
725
- async getTargetExecLog(workspace, execId, offset, limit) {
725
+ async getTargetExecLog(workspace, targetId, execId, offset, limit) {
726
726
  const query = {};
727
727
  if (offset)
728
728
  query.offset = offset.toString();
@@ -730,7 +730,7 @@ class ApiClient {
730
730
  query.limit = limit.toString();
731
731
  return await this.request({
732
732
  method: 'GET',
733
- path: `/workspaces/${encodeURIComponent(workspace)}/targets/execs/${encodeURIComponent(execId)}/log`,
733
+ path: `/workspaces/${encodeURIComponent(workspace)}/targets/${encodeURIComponent(targetId)}/execs/${encodeURIComponent(execId)}/log`,
734
734
  query,
735
735
  parseResponseBody: true,
736
736
  });
@@ -0,0 +1,62 @@
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 cliError_1 = __importDefault(require("../../../cliError"));
7
+ const utils_1 = require("../../../utils");
8
+ const texts_1 = require("../../../texts");
9
+ const output_1 = __importDefault(require("../../../output"));
10
+ const input_1 = __importDefault(require("../../../input"));
11
+ const sandbox_1 = require("../../../types/sandbox");
12
+ const fetchSource_1 = require("../fetchSource");
13
+ const commandSandboxFetchAdd = (0, utils_1.newCommand)('add', texts_1.DESC_COMMAND_SANDBOX_FETCH_ADD, {
14
+ requiredScopes: [utils_1.REST_API_SCOPE.SANDBOX_WRITE],
15
+ examples: texts_1.EXAMPLE_SANDBOX_FETCH_ADD,
16
+ });
17
+ commandSandboxFetchAdd.alias('create');
18
+ (0, utils_1.sandboxScopeOptions)(commandSandboxFetchAdd);
19
+ commandSandboxFetchAdd.argument('<identifier>', texts_1.OPTION_SANDBOX_IDENTIFIER);
20
+ commandSandboxFetchAdd.option('--ref <ref>', texts_1.OPTION_SANDBOX_FETCH_REF);
21
+ commandSandboxFetchAdd.option('--repository <url>', texts_1.OPTION_SANDBOX_FETCH_REPOSITORY);
22
+ commandSandboxFetchAdd.option('--path <directory>', texts_1.OPTION_SANDBOX_FETCH_PATH);
23
+ commandSandboxFetchAdd.option('--artifact <name:version>', texts_1.OPTION_SANDBOX_FETCH_ARTIFACT);
24
+ commandSandboxFetchAdd.option('--source-path <path>', texts_1.OPTION_SANDBOX_FETCH_SOURCE_PATH);
25
+ commandSandboxFetchAdd.option('--build <command>', texts_1.OPTION_SANDBOX_FETCH_BUILD);
26
+ commandSandboxFetchAdd.option('--format <text|json>', texts_1.OPTION_FORMAT);
27
+ commandSandboxFetchAdd.action(async (identifier, options) => {
28
+ if (options.artifact && (options.repository || options.ref)) {
29
+ output_1.default.exitError(new cliError_1.default('usage_error', texts_1.ERR_SANDBOX_FETCH_MIX_ARTIFACT));
30
+ }
31
+ if (options.sourcePath && !options.artifact) {
32
+ output_1.default.exitError(new cliError_1.default('usage_error', texts_1.ERR_SANDBOX_FETCH_SOURCE_PATH));
33
+ }
34
+ const workspace = input_1.default.restApiWorkspace(options.workspace);
35
+ const client = input_1.default.restApiTokenClient();
36
+ const sandboxId = await input_1.default.sandboxId(client, workspace, options, identifier);
37
+ let type = sandbox_1.SANDBOX_FETCH.PROJECT_REPO;
38
+ if (options.artifact)
39
+ type = sandbox_1.SANDBOX_FETCH.ARTIFACT;
40
+ else if (options.repository)
41
+ type = sandbox_1.SANDBOX_FETCH.PUBLIC_REPO;
42
+ const body = { type };
43
+ if (options.repository)
44
+ body.repository = options.repository;
45
+ if (options.ref)
46
+ body.ref = options.ref;
47
+ if (options.path)
48
+ body.path = options.path;
49
+ if (options.artifact)
50
+ body.artifact = options.artifact;
51
+ if (options.sourcePath)
52
+ body.source_path = options.sourcePath;
53
+ if (options.build)
54
+ body.build_command = options.build;
55
+ const fetch = await client.addSandboxFetch(workspace, sandboxId, body);
56
+ // a fetch added to a stopped sandbox stays STALE until it is refetched
57
+ const path = (0, fetchSource_1.sandboxFetchPath)(fetch);
58
+ output_1.default.exitResult(options.format === 'json', fetch, fetch.status === sandbox_1.SANDBOX_FETCH_STATUS.STALE
59
+ ? (0, texts_1.TXT_SANDBOX_FETCH_ADDED_STALE)(identifier, path)
60
+ : (0, texts_1.TXT_SANDBOX_FETCH_ADDED)(path));
61
+ });
62
+ exports.default = commandSandboxFetchAdd;
@@ -0,0 +1,33 @@
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 output_1 = __importDefault(require("../../../output"));
9
+ const input_1 = __importDefault(require("../../../input"));
10
+ const fetchSource_1 = require("../fetchSource");
11
+ const commandSandboxFetchDelete = (0, utils_1.newCommand)('delete', texts_1.DESC_COMMAND_SANDBOX_FETCH_DELETE, {
12
+ requiredScopes: [utils_1.REST_API_SCOPE.SANDBOX_WRITE],
13
+ examples: texts_1.EXAMPLE_SANDBOX_FETCH_DELETE,
14
+ });
15
+ commandSandboxFetchDelete.alias('rm');
16
+ (0, utils_1.sandboxScopeOptions)(commandSandboxFetchDelete);
17
+ commandSandboxFetchDelete.option('-f, --force', texts_1.OPTION_CONFIRM_FORCE);
18
+ commandSandboxFetchDelete.option('--format <text|json>', texts_1.OPTION_FORMAT);
19
+ commandSandboxFetchDelete.argument('<identifier>', texts_1.OPTION_SANDBOX_IDENTIFIER);
20
+ commandSandboxFetchDelete.argument('<fetch>', texts_1.OPTION_SANDBOX_FETCH_ARG);
21
+ commandSandboxFetchDelete.action(async (identifier, fetchRef, options) => {
22
+ const workspace = input_1.default.restApiWorkspace(options.workspace);
23
+ const client = input_1.default.restApiTokenClient();
24
+ const sandboxId = await input_1.default.sandboxId(client, workspace, options, identifier);
25
+ const fetch = await (0, fetchSource_1.resolveSandboxFetch)(client, workspace, sandboxId, fetchRef);
26
+ const json = options.format === 'json';
27
+ const confirmed = await output_1.default.confirmDestructive(options.force, (0, texts_1.TXT_SANDBOX_FETCH_DELETE_CONFIRM)(identifier, (0, fetchSource_1.sandboxFetchPath)(fetch)), json);
28
+ if (!confirmed)
29
+ output_1.default.exitResult(json, { deleted: null });
30
+ await client.deleteSandboxFetch(workspace, sandboxId, fetch.id);
31
+ output_1.default.exitResult(json, { deleted: fetch }, (0, texts_1.TXT_SANDBOX_FETCH_DELETED)((0, fetchSource_1.sandboxFetchPath)(fetch)));
32
+ });
33
+ exports.default = commandSandboxFetchDelete;
@@ -0,0 +1,51 @@
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 output_1 = __importDefault(require("../../../output"));
9
+ const input_1 = __importDefault(require("../../../input"));
10
+ const sandbox_1 = require("../../../types/sandbox");
11
+ const fetchSource_1 = require("../fetchSource");
12
+ const commandSandboxFetchGet = (0, utils_1.newCommand)('get', texts_1.DESC_COMMAND_SANDBOX_FETCH_GET, {
13
+ requiredScopes: [utils_1.REST_API_SCOPE.SANDBOX_READ],
14
+ examples: texts_1.EXAMPLE_SANDBOX_FETCH_GET,
15
+ });
16
+ (0, utils_1.sandboxScopeOptions)(commandSandboxFetchGet);
17
+ commandSandboxFetchGet.option('--format <text|json>', texts_1.OPTION_FORMAT);
18
+ commandSandboxFetchGet.argument('<identifier>', texts_1.OPTION_SANDBOX_IDENTIFIER);
19
+ commandSandboxFetchGet.argument('<fetch>', texts_1.OPTION_SANDBOX_FETCH_ARG);
20
+ commandSandboxFetchGet.action(async (identifier, fetchRef, options) => {
21
+ const workspace = input_1.default.restApiWorkspace(options.workspace);
22
+ const client = input_1.default.restApiTokenClient();
23
+ const sandboxId = await input_1.default.sandboxId(client, workspace, options, identifier);
24
+ const found = await (0, fetchSource_1.resolveSandboxFetch)(client, workspace, sandboxId, fetchRef);
25
+ // the single fetch endpoint is the one that measures behind/outdated
26
+ const f = await client.getSandboxFetch(workspace, sandboxId, found.id);
27
+ if (options.format === 'json') {
28
+ output_1.default.json(f);
29
+ }
30
+ else {
31
+ const isArtifact = f.type === sandbox_1.SANDBOX_FETCH.ARTIFACT;
32
+ const data = [
33
+ ['Field', 'Value'],
34
+ ['ID', f.id || '-'],
35
+ ['Type', f.type || '-'],
36
+ ['Path', (0, fetchSource_1.sandboxFetchPath)(f)],
37
+ ['Source', (0, fetchSource_1.sandboxFetchSource)(f)],
38
+ [isArtifact ? 'Version' : 'Ref', (0, fetchSource_1.sandboxFetchRefOrVersion)(f)],
39
+ ['Build command', f.build_command || '-'],
40
+ ['Status', f.status || '-'],
41
+ ['Revision', f.current_revision || '-'],
42
+ ['Behind', (0, fetchSource_1.sandboxFetchBehind)(f)],
43
+ ['Fetched', f.fetched_date || '-'],
44
+ ];
45
+ if (f.error_message)
46
+ data.push(['Error', f.error_message]);
47
+ output_1.default.table(data);
48
+ }
49
+ output_1.default.exitNormal();
50
+ });
51
+ exports.default = commandSandboxFetchGet;
@@ -0,0 +1,50 @@
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 output_1 = __importDefault(require("../../../output"));
9
+ const input_1 = __importDefault(require("../../../input"));
10
+ const fetchSource_1 = require("../fetchSource");
11
+ const commandSandboxFetchList = (0, utils_1.newCommand)('list', texts_1.DESC_COMMAND_SANDBOX_FETCH_LIST, {
12
+ requiredScopes: [utils_1.REST_API_SCOPE.SANDBOX_READ],
13
+ examples: texts_1.EXAMPLE_SANDBOX_FETCH_LIST,
14
+ });
15
+ commandSandboxFetchList.alias('ls');
16
+ (0, utils_1.sandboxScopeOptions)(commandSandboxFetchList);
17
+ commandSandboxFetchList.option('--format <text|json>', texts_1.OPTION_FORMAT);
18
+ commandSandboxFetchList.argument('<identifier>', texts_1.OPTION_SANDBOX_IDENTIFIER);
19
+ commandSandboxFetchList.action(async (identifier, options) => {
20
+ const workspace = input_1.default.restApiWorkspace(options.workspace);
21
+ const client = input_1.default.restApiTokenClient();
22
+ const sandboxId = await input_1.default.sandboxId(client, workspace, options, identifier);
23
+ const response = await client.listSandboxFetches(workspace, sandboxId);
24
+ const fetches = response.fetches || [];
25
+ if (options.format === 'json') {
26
+ output_1.default.json(fetches);
27
+ }
28
+ else {
29
+ if (fetches.length === 0) {
30
+ output_1.default.exitError(texts_1.ERR_SANDBOX_FETCHES_NOT_FOUND);
31
+ }
32
+ const data = [
33
+ ['ID', 'Path', 'Source', 'Ref/Version', 'Status', 'Revision', 'Behind'],
34
+ ];
35
+ for (const f of fetches) {
36
+ data.push([
37
+ f.id || '-',
38
+ (0, fetchSource_1.sandboxFetchPath)(f),
39
+ (0, fetchSource_1.sandboxFetchSource)(f),
40
+ (0, fetchSource_1.sandboxFetchRefOrVersion)(f),
41
+ f.status || '-',
42
+ (0, fetchSource_1.sandboxFetchRevision)(f),
43
+ (0, fetchSource_1.sandboxFetchBehind)(f),
44
+ ]);
45
+ }
46
+ output_1.default.table(data);
47
+ }
48
+ output_1.default.exitNormal();
49
+ });
50
+ exports.default = commandSandboxFetchList;
@@ -0,0 +1,27 @@
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 output_1 = __importDefault(require("../../../output"));
9
+ const input_1 = __importDefault(require("../../../input"));
10
+ const fetchSource_1 = require("../fetchSource");
11
+ const commandSandboxFetchRefetch = (0, utils_1.newCommand)('refetch', texts_1.DESC_COMMAND_SANDBOX_FETCH_REFETCH, {
12
+ requiredScopes: [utils_1.REST_API_SCOPE.SANDBOX_WRITE],
13
+ examples: texts_1.EXAMPLE_SANDBOX_FETCH_REFETCH,
14
+ });
15
+ (0, utils_1.sandboxScopeOptions)(commandSandboxFetchRefetch);
16
+ commandSandboxFetchRefetch.option('--format <text|json>', texts_1.OPTION_FORMAT);
17
+ commandSandboxFetchRefetch.argument('<identifier>', texts_1.OPTION_SANDBOX_IDENTIFIER);
18
+ commandSandboxFetchRefetch.argument('<fetch>', texts_1.OPTION_SANDBOX_FETCH_ARG);
19
+ commandSandboxFetchRefetch.action(async (identifier, fetchRef, options) => {
20
+ const workspace = input_1.default.restApiWorkspace(options.workspace);
21
+ const client = input_1.default.restApiTokenClient();
22
+ const sandboxId = await input_1.default.sandboxId(client, workspace, options, identifier);
23
+ const found = await (0, fetchSource_1.resolveSandboxFetch)(client, workspace, sandboxId, fetchRef);
24
+ const fetch = await client.refetchSandboxFetch(workspace, sandboxId, found.id);
25
+ output_1.default.exitResult(options.format === 'json', fetch, (0, texts_1.TXT_SANDBOX_FETCH_REFETCHED)((0, fetchSource_1.sandboxFetchPath)(fetch)));
26
+ });
27
+ exports.default = commandSandboxFetchRefetch;
@@ -0,0 +1,28 @@
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 list_1 = __importDefault(require("./fetch/list"));
9
+ const get_1 = __importDefault(require("./fetch/get"));
10
+ const add_1 = __importDefault(require("./fetch/add"));
11
+ const delete_1 = __importDefault(require("./fetch/delete"));
12
+ const refetch_1 = __importDefault(require("./fetch/refetch"));
13
+ const commandSandboxFetch = (0, utils_1.newCommand)('fetch', texts_1.DESC_COMMAND_SANDBOX_FETCH, {
14
+ examples: [
15
+ ...texts_1.EXAMPLE_SANDBOX_FETCH_LIST,
16
+ ...texts_1.EXAMPLE_SANDBOX_FETCH_GET,
17
+ ...texts_1.EXAMPLE_SANDBOX_FETCH_ADD,
18
+ ...texts_1.EXAMPLE_SANDBOX_FETCH_DELETE,
19
+ ...texts_1.EXAMPLE_SANDBOX_FETCH_REFETCH,
20
+ ],
21
+ });
22
+ commandSandboxFetch.alias('f');
23
+ commandSandboxFetch.addCommand(list_1.default);
24
+ commandSandboxFetch.addCommand(get_1.default);
25
+ commandSandboxFetch.addCommand(add_1.default);
26
+ commandSandboxFetch.addCommand(delete_1.default);
27
+ commandSandboxFetch.addCommand(refetch_1.default);
28
+ exports.default = commandSandboxFetch;
@@ -0,0 +1,90 @@
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
+ exports.findSandboxFetch = exports.resolveSandboxFetch = exports.sandboxFetchPath = exports.sandboxFetchRevision = exports.sandboxFetchRefOrVersion = exports.sandboxFetchBehind = exports.sandboxFetchSource = exports.SANDBOX_FETCH_DEFAULT = void 0;
7
+ const cliError_1 = __importDefault(require("../../cliError"));
8
+ const texts_1 = require("../../texts");
9
+ const sandbox_1 = require("../../types/sandbox");
10
+ exports.SANDBOX_FETCH_DEFAULT = ':default';
11
+ // Where the files come from: the project repository, a public repository URL or
12
+ // the artifact (with the path inside it when only part of it is fetched)
13
+ const sandboxFetchSource = (f) => {
14
+ if (f.type === sandbox_1.SANDBOX_FETCH.ARTIFACT) {
15
+ const artifact = f.artifact || '-';
16
+ return f.source_path ? `${artifact} (${f.source_path})` : artifact;
17
+ }
18
+ if (f.type === sandbox_1.SANDBOX_FETCH.PUBLIC_REPO)
19
+ return f.repository || '-';
20
+ return 'project repository';
21
+ };
22
+ exports.sandboxFetchSource = sandboxFetchSource;
23
+ // How far the fetched files are from what the fetch points at. Repositories count
24
+ // commits behind the ref, artifacts only know whether the version moved on. Null
25
+ // means the API could not measure it (e.g. an unreachable public repository).
26
+ const sandboxFetchBehind = (f) => {
27
+ if (f.type === sandbox_1.SANDBOX_FETCH.ARTIFACT) {
28
+ if (f.outdated === true)
29
+ return 'outdated';
30
+ if (f.outdated === false)
31
+ return 'up to date';
32
+ return '-';
33
+ }
34
+ if (typeof f.behind !== 'number')
35
+ return '-';
36
+ if (f.behind === 0)
37
+ return 'up to date';
38
+ return `${f.behind} behind`;
39
+ };
40
+ exports.sandboxFetchBehind = sandboxFetchBehind;
41
+ // The ref of a repository fetch, the version of an artifact fetch (name:version)
42
+ const sandboxFetchRefOrVersion = (f) => {
43
+ if (f.type === sandbox_1.SANDBOX_FETCH.ARTIFACT) {
44
+ const artifact = f.artifact || '';
45
+ const idx = artifact.lastIndexOf(':');
46
+ return idx > 0 ? artifact.substring(idx + 1) : '-';
47
+ }
48
+ return f.ref || '-';
49
+ };
50
+ exports.sandboxFetchRefOrVersion = sandboxFetchRefOrVersion;
51
+ const sandboxFetchRevision = (f) => f.current_revision ? f.current_revision.substring(0, 7) : '-';
52
+ exports.sandboxFetchRevision = sandboxFetchRevision;
53
+ // How a fetch is named in messages: its target directory, ":default" for the
54
+ // fetch into the app directory (the API keeps its path empty)
55
+ const sandboxFetchPath = (f) => f.path || exports.SANDBOX_FETCH_DEFAULT;
56
+ exports.sandboxFetchPath = sandboxFetchPath;
57
+ const trimSlash = (p) => (p || '').replace(/\/+$/, '');
58
+ // The API ID or an explicitly set target directory, no app directory needed
59
+ const matchSandboxFetch = (fetches, ref) => fetches.find((f) => f.id === ref) ||
60
+ fetches.find((f) => !!f.path && trimSlash(f.path) === trimSlash(ref));
61
+ // Lists the sandbox fetches and picks one. The sandbox itself is read only when
62
+ // the ref may name the app directory: ":default", or the directory given
63
+ // explicitly for the fetch into it, which keeps an empty path
64
+ const resolveSandboxFetch = async (client, workspace, sandboxId, ref) => {
65
+ const response = await client.listSandboxFetches(workspace, sandboxId);
66
+ const fetches = response.fetches || [];
67
+ let appDir;
68
+ if (!matchSandboxFetch(fetches, ref)) {
69
+ const sandbox = await client.getSandbox(workspace, sandboxId);
70
+ appDir = sandbox.app_dir;
71
+ }
72
+ return (0, exports.findSandboxFetch)(fetches, ref, appDir);
73
+ };
74
+ exports.resolveSandboxFetch = resolveSandboxFetch;
75
+ // A fetch is identified by its target directory, ":default" (or the app directory
76
+ // itself) names the one into the app directory. The API ID is accepted too, so
77
+ // output of `list --format json` can be fed back directly.
78
+ const findSandboxFetch = (fetches, ref, appDir) => {
79
+ let found = matchSandboxFetch(fetches, ref);
80
+ if (!found &&
81
+ (ref === exports.SANDBOX_FETCH_DEFAULT ||
82
+ (!!appDir && trimSlash(ref) === trimSlash(appDir)))) {
83
+ found = fetches.find((f) => !f.path || (!!appDir && trimSlash(f.path) === trimSlash(appDir)));
84
+ }
85
+ if (!found) {
86
+ throw new cliError_1.default('not_found', texts_1.ERR_SANDBOX_FETCH_NOT_FOUND, texts_1.HINT_SANDBOX_FETCH_LIST);
87
+ }
88
+ return found;
89
+ };
90
+ exports.findSandboxFetch = findSandboxFetch;
@@ -47,18 +47,19 @@ commandTargetExecCommand.action(async (identifier, command, options) => {
47
47
  command: cmd,
48
48
  });
49
49
  const execId = exec.execution_id;
50
+ const target = (0, scope_1.targetExecRef)(identifier, options);
50
51
  const json = options.format === 'json';
51
52
  // Preserve the execution id before status validation can fail.
52
53
  if (!json) {
53
54
  if (options.async) {
54
- output_1.default.note((0, texts_1.TXT_TARGET_EXEC_BACKGROUND)(execId));
55
+ output_1.default.note((0, texts_1.TXT_TARGET_EXEC_BACKGROUND)(target, execId));
55
56
  output_1.default.data(execId);
56
57
  }
57
58
  else {
58
59
  output_1.default.note((0, texts_1.TXT_TARGET_EXEC_ID)(execId));
59
60
  }
60
61
  }
61
- const recoveryHint = (0, texts_1.TXT_TARGET_EXEC_RECOVERY)(execId);
62
+ const recoveryHint = (0, texts_1.TXT_TARGET_EXEC_RECOVERY)(target, execId);
62
63
  let code = options.exitCode
63
64
  ? (0, utils_1.executionExitCode)(exec.status, recoveryHint)
64
65
  : undefined;
@@ -71,12 +72,12 @@ commandTargetExecCommand.action(async (identifier, command, options) => {
71
72
  }
72
73
  if (json) {
73
74
  while (exec.status === utils_1.TARGET_EXEC_STATUS.INPROGRESS) {
74
- exec = await client.getTargetExec(workspace, execId, EXEC_WAIT_MS);
75
+ exec = await client.getTargetExec(workspace, target_id, execId, EXEC_WAIT_MS);
75
76
  if (options.exitCode)
76
77
  code = (0, utils_1.executionExitCode)(exec.status, recoveryHint);
77
78
  }
78
79
  const log = [];
79
- await (0, scope_1.forwardExecLog)(client, workspace, execId, 0, (lines) => log.push(...lines));
80
+ await (0, scope_1.forwardExecLog)(client, workspace, target_id, execId, 0, (lines) => log.push(...lines));
80
81
  output_1.default.json({ ...exec, log });
81
82
  output_1.default.exitCode(code ?? (exec.status === utils_1.TARGET_EXEC_STATUS.SUCCESSFUL ? 0 : 1));
82
83
  }
@@ -87,12 +88,12 @@ commandTargetExecCommand.action(async (identifier, command, options) => {
87
88
  let loggedBytes;
88
89
  const drainLog = async () => {
89
90
  loggedBytes = exec.bytes_out;
90
- const log = await (0, scope_1.forwardExecLog)(client, workspace, execId, offset);
91
+ const log = await (0, scope_1.forwardExecLog)(client, workspace, target_id, execId, offset);
91
92
  offset = log.offset;
92
93
  truncated = truncated || log.truncated;
93
94
  };
94
95
  while (exec.status === utils_1.TARGET_EXEC_STATUS.INPROGRESS) {
95
- exec = await client.getTargetExec(workspace, execId, EXEC_WAIT_MS);
96
+ exec = await client.getTargetExec(workspace, target_id, execId, EXEC_WAIT_MS);
96
97
  if (options.exitCode)
97
98
  (0, utils_1.executionExitCode)(exec.status, recoveryHint);
98
99
  if (exec.bytes_out !== loggedBytes)
@@ -105,11 +106,11 @@ commandTargetExecCommand.action(async (identifier, command, options) => {
105
106
  output_1.default.noteWarning(texts_1.WARN_TARGET_EXEC_TRUNCATED);
106
107
  }
107
108
  if (exec.status === utils_1.TARGET_EXEC_STATUS.SUCCESSFUL) {
108
- output_1.default.note((0, texts_1.TXT_TARGET_EXEC_SUCCESS)(execId));
109
+ output_1.default.note((0, texts_1.TXT_TARGET_EXEC_SUCCESS)(target, execId));
109
110
  output_1.default.exitNormal();
110
111
  }
111
112
  output_1.default.exitError(exec.status === utils_1.TARGET_EXEC_STATUS.CANCELLED
112
- ? (0, texts_1.TXT_TARGET_EXEC_CANCELLED)(execId)
113
- : (0, texts_1.TXT_TARGET_EXEC_FAILED)(execId, exec.failure_reason), 1);
113
+ ? (0, texts_1.TXT_TARGET_EXEC_CANCELLED)(target, execId)
114
+ : (0, texts_1.TXT_TARGET_EXEC_FAILED)(target, execId, exec.failure_reason), 1);
114
115
  });
115
116
  exports.default = commandTargetExecCommand;
@@ -7,25 +7,31 @@ const utils_1 = require("../../../utils");
7
7
  const texts_1 = require("../../../texts");
8
8
  const input_1 = __importDefault(require("../../../input"));
9
9
  const output_1 = __importDefault(require("../../../output"));
10
+ const scope_1 = require("../scope");
10
11
  const commandTargetExecKill = (0, utils_1.newCommand)('kill', texts_1.DESC_COMMAND_TARGET_EXEC_KILL, { requiredScopes: [utils_1.REST_API_SCOPE.TARGET_USE], examples: texts_1.EXAMPLE_TARGET_EXEC_KILL });
11
12
  commandTargetExecKill.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
13
+ commandTargetExecKill.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
14
+ commandTargetExecKill.option('--pipeline <identifier>', texts_1.OPTION_TARGET_PIPELINE);
15
+ commandTargetExecKill.option('--environment <identifier>', texts_1.OPTION_TARGET_ENVIRONMENT);
12
16
  commandTargetExecKill.option('-f, --force', texts_1.OPTION_CONFIRM_FORCE);
13
17
  commandTargetExecKill.option('--format <text|json>', texts_1.OPTION_FORMAT);
18
+ commandTargetExecKill.argument('<identifier>', texts_1.OPTION_TARGET_IDENTIFIER);
14
19
  commandTargetExecKill.argument('<exec-id>', texts_1.OPTION_TARGET_EXEC_ID);
15
- commandTargetExecKill.action(async (execId, options) => {
20
+ commandTargetExecKill.action(async (identifier, execId, options) => {
16
21
  const workspace = input_1.default.restApiWorkspace(options.workspace);
17
22
  const client = input_1.default.restApiTokenClient();
23
+ const target_id = await (0, scope_1.resolveTargetId)(client, workspace, identifier, options);
18
24
  // Resolve the exec before the prompt so a bad id fails the same way
19
25
  // (Resource not found, exit 1) with and without --force - otherwise the
20
26
  // confirmation error would hide the invalid id. With --force
21
27
  // the DELETE itself surfaces the 404, so the extra request is skipped.
22
28
  if (!options.force)
23
- await client.getTargetExec(workspace, execId);
29
+ await client.getTargetExec(workspace, target_id, execId);
24
30
  const json = options.format === 'json';
25
31
  const confirmed = await output_1.default.confirmDestructive(options.force, (0, texts_1.TXT_TARGET_EXEC_KILL_CONFIRM)(execId), json);
26
32
  if (!confirmed)
27
33
  output_1.default.exitResult(json, { killed: null });
28
- await client.cancelTargetExec(workspace, execId);
34
+ await client.cancelTargetExec(workspace, target_id, execId);
29
35
  output_1.default.exitResult(json, { killed: execId }, (0, texts_1.TXT_TARGET_EXEC_KILLED)(execId));
30
36
  });
31
37
  exports.default = commandTargetExecKill;
@@ -10,23 +10,28 @@ const output_1 = __importDefault(require("../../../output"));
10
10
  const scope_1 = require("../scope");
11
11
  const commandTargetExecLogs = (0, utils_1.newCommand)('logs', texts_1.DESC_COMMAND_TARGET_EXEC_LOGS, { requiredScopes: [utils_1.REST_API_SCOPE.TARGET_READ], helpText: texts_1.HELP_TARGET_EXEC_LOGS_JSONL, examples: texts_1.EXAMPLE_TARGET_EXEC_LOGS });
12
12
  commandTargetExecLogs.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
13
+ commandTargetExecLogs.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
14
+ commandTargetExecLogs.option('--pipeline <identifier>', texts_1.OPTION_TARGET_PIPELINE);
15
+ commandTargetExecLogs.option('--environment <identifier>', texts_1.OPTION_TARGET_ENVIRONMENT);
13
16
  commandTargetExecLogs.option('--offset <n>', texts_1.OPTION_TARGET_EXEC_LOG_OFFSET);
14
17
  commandTargetExecLogs.option('--limit <n>', texts_1.OPTION_TARGET_EXEC_LOG_LIMIT);
18
+ commandTargetExecLogs.argument('<identifier>', texts_1.OPTION_TARGET_IDENTIFIER);
15
19
  commandTargetExecLogs.argument('<exec-id>', texts_1.OPTION_TARGET_EXEC_ID);
16
20
  commandTargetExecLogs.option('--format <text|jsonl>', texts_1.OPTION_EXEC_FORMAT_JSONL);
17
21
  commandTargetExecLogs.option('--exit-code', texts_1.OPTION_EXEC_EXIT_CODE);
18
- commandTargetExecLogs.action(async (execId, options) => {
22
+ commandTargetExecLogs.action(async (identifier, execId, options) => {
19
23
  const workspace = input_1.default.restApiWorkspace(options.workspace);
20
24
  const client = input_1.default.restApiTokenClient();
25
+ const target_id = await (0, scope_1.resolveTargetId)(client, workspace, identifier, options);
21
26
  const offset = options.offset ? parseInt(options.offset, 10) : 0;
22
27
  const limit = options.limit ? parseInt(options.limit, 10) : undefined;
23
- const { truncated } = await (0, scope_1.forwardExecLog)(client, workspace, execId, offset, options.format === 'jsonl'
28
+ const { truncated } = await (0, scope_1.forwardExecLog)(client, workspace, target_id, execId, offset, options.format === 'jsonl'
24
29
  ? (lines) => lines.forEach((data) => output_1.default.json({ type: 'log', data }))
25
30
  : undefined, limit);
26
31
  if (truncated)
27
32
  output_1.default.noteWarning(texts_1.WARN_TARGET_EXEC_TRUNCATED);
28
33
  if (options.format === 'jsonl' || options.exitCode) {
29
- const exec = await client.getTargetExec(workspace, execId);
34
+ const exec = await client.getTargetExec(workspace, target_id, execId);
30
35
  const code = options.exitCode ? (0, utils_1.executionExitCode)(exec.status) : undefined;
31
36
  if (options.format === 'jsonl')
32
37
  output_1.default.json({
@@ -7,15 +7,21 @@ const utils_1 = require("../../../utils");
7
7
  const texts_1 = require("../../../texts");
8
8
  const input_1 = __importDefault(require("../../../input"));
9
9
  const output_1 = __importDefault(require("../../../output"));
10
+ const scope_1 = require("../scope");
10
11
  const commandTargetExecStatus = (0, utils_1.newCommand)('status', texts_1.DESC_COMMAND_TARGET_EXEC_STATUS, { requiredScopes: [utils_1.REST_API_SCOPE.TARGET_READ], examples: texts_1.EXAMPLE_TARGET_EXEC_STATUS, helpText: texts_1.HELP_TARGET_EXEC_STATUS });
11
12
  commandTargetExecStatus.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
13
+ commandTargetExecStatus.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
14
+ commandTargetExecStatus.option('--pipeline <identifier>', texts_1.OPTION_TARGET_PIPELINE);
15
+ commandTargetExecStatus.option('--environment <identifier>', texts_1.OPTION_TARGET_ENVIRONMENT);
12
16
  commandTargetExecStatus.option('--format <text|json>', texts_1.OPTION_EXEC_FORMAT_JSON);
17
+ commandTargetExecStatus.argument('<identifier>', texts_1.OPTION_TARGET_IDENTIFIER);
13
18
  commandTargetExecStatus.argument('<exec-id>', texts_1.OPTION_TARGET_EXEC_ID);
14
19
  commandTargetExecStatus.option('--exit-code', texts_1.OPTION_EXEC_EXIT_CODE);
15
- commandTargetExecStatus.action(async (execId, options) => {
20
+ commandTargetExecStatus.action(async (identifier, execId, options) => {
16
21
  const workspace = input_1.default.restApiWorkspace(options.workspace);
17
22
  const client = input_1.default.restApiTokenClient();
18
- const exec = await client.getTargetExec(workspace, execId);
23
+ const target_id = await (0, scope_1.resolveTargetId)(client, workspace, identifier, options);
24
+ const exec = await client.getTargetExec(workspace, target_id, execId);
19
25
  const code = options.exitCode ? (0, utils_1.executionExitCode)(exec.status) : undefined;
20
26
  if (options.format === 'json') {
21
27
  output_1.default.json(exec);
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.resolveTargetScope = exports.targetScopeOf = exports.targetAddressOf = exports.forwardExecLog = exports.resolveTargetId = void 0;
6
+ exports.resolveTargetScope = exports.targetScopeOf = exports.targetAddressOf = exports.forwardExecLog = exports.targetExecRef = exports.resolveTargetId = void 0;
7
7
  const utils_1 = require("../../utils");
8
8
  const texts_1 = require("../../texts");
9
9
  const output_1 = __importDefault(require("../../output"));
@@ -18,10 +18,11 @@ const input_1 = __importDefault(require("../../input"));
18
18
  // line - that is how workspace targets stay addressable from a line context,
19
19
  // which the CLI enters on its own from BUDDY_PROJECT or a linked project.
20
20
  //
21
- // strictLine is for mutating commands (update/delete/exec command): an
22
- // explicit line flag is a statement "the target of this project/pipeline/
23
- // environment", so no fallback, and the scope is verified once more in case
24
- // the API resolves loosely again.
21
+ // strictLine is for commands that act on the target itself (update/delete/
22
+ // exec command): the requested line - from a flag, BUDDY_PROJECT or a linked
23
+ // project alike - is a statement "the target of this project/pipeline/
24
+ // environment", so no fallback. An explicit flag additionally gets the scope
25
+ // verified once more in case the API resolves loosely again.
25
26
  const resolveTargetId = async (client, workspace, identifier, options, strictLine = false) => {
26
27
  const project = input_1.default.restApiProject(options.project, true);
27
28
  const line = input_1.default.targetLine(project, options.pipeline, options.environment);
@@ -57,6 +58,24 @@ const resolveTargetId = async (client, workspace, identifier, options, strictLin
57
58
  return resolved.target_id;
58
59
  };
59
60
  exports.resolveTargetId = resolveTargetId;
61
+ // Executions live under their target, so follow-up commands printed in hints
62
+ // need the target again - with the line it was resolved through, or a
63
+ // project/pipeline/environment target would not resolve on the next call.
64
+ // The project is the one resolveTargetId used, so one implied by
65
+ // BUDDY_PROJECT or a linked directory is spelled out: the hint has to work
66
+ // from another shell or directory too.
67
+ const targetExecRef = (identifier, options) => {
68
+ let ref = identifier;
69
+ const project = input_1.default.restApiProject(options.project, true);
70
+ if (project)
71
+ ref += ` -p ${project}`;
72
+ if (options.pipeline)
73
+ ref += ` --pipeline ${options.pipeline}`;
74
+ if (options.environment)
75
+ ref += ` --environment ${options.environment}`;
76
+ return ref;
77
+ };
78
+ exports.targetExecRef = targetExecRef;
60
79
  // Lines the CLI requests per log fetch.
61
80
  const EXEC_LOG_PAGE = 1000;
62
81
  // The exec log endpoint pages by line offset; its `truncated` field
@@ -66,7 +85,7 @@ const EXEC_LOG_PAGE = 1000;
66
85
  // next_offset - offset lines are emitted to avoid re-printing the partial
67
86
  // line on the next pass. A page shorter than requested means the committed
68
87
  // log is drained, so the common case costs a single request.
69
- const forwardExecLog = async (client, workspace, execId, startOffset, emitPage = (lines) => output_1.default.data(lines.join('\n')), maxLines) => {
88
+ const forwardExecLog = async (client, workspace, targetId, execId, startOffset, emitPage = (lines) => output_1.default.data(lines.join('\n')), maxLines) => {
70
89
  let offset = startOffset;
71
90
  let emitted = 0;
72
91
  let truncated = false;
@@ -76,7 +95,7 @@ const forwardExecLog = async (client, workspace, execId, startOffset, emitPage =
76
95
  : Math.min(EXEC_LOG_PAGE, maxLines - emitted);
77
96
  if (pageLimit <= 0)
78
97
  break;
79
- const log = await client.getTargetExecLog(workspace, execId, offset, pageLimit);
98
+ const log = await client.getTargetExecLog(workspace, targetId, execId, offset, pageLimit);
80
99
  truncated = truncated || !!log.truncated;
81
100
  const next = log.next_offset ?? offset;
82
101
  if (next <= offset)
@@ -502,7 +502,7 @@ exports.OPTION_EXEC_FORMAT_JSONL = 'Output format: jsonl, text. JSONL CLI errors
502
502
  exports.OPTION_EXEC_FORMAT_JSON = 'Output format: json, text. JSON CLI errors: {error:{code,message,hint}}, exit 1 (2 or 3 with --exit-code). Default: text';
503
503
  const ERR_EXEC_STATUS_UNKNOWN = (status) => `Unknown execution status: ${status ?? '(missing)'}`;
504
504
  exports.ERR_EXEC_STATUS_UNKNOWN = ERR_EXEC_STATUS_UNKNOWN;
505
- const TXT_TARGET_EXEC_RECOVERY = (id) => `Execution ID: ${id}. Run 'bdy target exec logs ${id}' to read logs.`;
505
+ const TXT_TARGET_EXEC_RECOVERY = (target, id) => `Execution ID: ${id}. Run 'bdy target exec logs ${target} ${id}' to read logs.`;
506
506
  exports.TXT_TARGET_EXEC_RECOVERY = TXT_TARGET_EXEC_RECOVERY;
507
507
  const ERR_PIPELINE_RUN_STATUS_UNKNOWN = (status) => `Unknown pipeline run status: ${status ?? '(missing)'}`;
508
508
  exports.ERR_PIPELINE_RUN_STATUS_UNKNOWN = ERR_PIPELINE_RUN_STATUS_UNKNOWN;
@@ -1124,18 +1124,18 @@ exports.TXT_TARGET_DELETED = TXT_TARGET_DELETED;
1124
1124
  // Target exec messages
1125
1125
  const TXT_TARGET_EXEC_ID = (id) => `Execution id: ${id}`;
1126
1126
  exports.TXT_TARGET_EXEC_ID = TXT_TARGET_EXEC_ID;
1127
- const TXT_TARGET_EXEC_BACKGROUND = (execId) => `Command started in background: ${execId}. To view status or logs of the execution run:
1128
- bdy tg exec status ${execId}
1129
- bdy tg exec logs ${execId}`;
1127
+ const TXT_TARGET_EXEC_BACKGROUND = (target, execId) => `Command started in background: ${execId}. To view status or logs of the execution run:
1128
+ bdy tg exec status ${target} ${execId}
1129
+ bdy tg exec logs ${target} ${execId}`;
1130
1130
  exports.TXT_TARGET_EXEC_BACKGROUND = TXT_TARGET_EXEC_BACKGROUND;
1131
- const TXT_TARGET_EXEC_SUCCESS = (execId) => `Command finished successfully: ${execId}. To view logs of the execution run:
1132
- bdy tg exec logs ${execId}`;
1131
+ const TXT_TARGET_EXEC_SUCCESS = (target, execId) => `Command finished successfully: ${execId}. To view logs of the execution run:
1132
+ bdy tg exec logs ${target} ${execId}`;
1133
1133
  exports.TXT_TARGET_EXEC_SUCCESS = TXT_TARGET_EXEC_SUCCESS;
1134
- const TXT_TARGET_EXEC_FAILED = (execId, reason) => `Command failed${reason ? ` (${reason})` : ''}: ${execId}. To view logs of the execution run:
1135
- bdy tg exec logs ${execId}`;
1134
+ const TXT_TARGET_EXEC_FAILED = (target, execId, reason) => `Command failed${reason ? ` (${reason})` : ''}: ${execId}. To view logs of the execution run:
1135
+ bdy tg exec logs ${target} ${execId}`;
1136
1136
  exports.TXT_TARGET_EXEC_FAILED = TXT_TARGET_EXEC_FAILED;
1137
- const TXT_TARGET_EXEC_CANCELLED = (execId) => `Command cancelled: ${execId}. To view logs of the execution run:
1138
- bdy tg exec logs ${execId}`;
1137
+ const TXT_TARGET_EXEC_CANCELLED = (target, execId) => `Command cancelled: ${execId}. To view logs of the execution run:
1138
+ bdy tg exec logs ${target} ${execId}`;
1139
1139
  exports.TXT_TARGET_EXEC_CANCELLED = TXT_TARGET_EXEC_CANCELLED;
1140
1140
  exports.WARN_TARGET_EXEC_TRUNCATED = 'Command output was truncated by the server';
1141
1141
  const TXT_TARGET_EXEC_KILL_CONFIRM = (execId) => `Are you sure you want to cancel execution '${execId}'?`;
@@ -2166,21 +2166,21 @@ exports.EXAMPLE_TARGET_EXEC_COMMAND = [
2166
2166
  exports.EXAMPLE_TARGET_EXEC_STATUS = [
2167
2167
  {
2168
2168
  description: 'return the execution state using semantic exit codes',
2169
- command: 'bdy target exec status exec-id --exit-code',
2169
+ command: 'bdy target exec status target-identifier exec-id --exit-code',
2170
2170
  },
2171
2171
  {
2172
2172
  description: 'show status of execution:',
2173
- command: 'bdy tg exec status exec-id',
2173
+ command: 'bdy tg exec status target-identifier exec-id',
2174
2174
  },
2175
2175
  ];
2176
2176
  exports.EXAMPLE_TARGET_EXEC_KILL = [
2177
2177
  {
2178
2178
  description: 'cancel running execution:',
2179
- command: 'bdy tg exec kill exec-id',
2179
+ command: 'bdy tg exec kill target-identifier exec-id',
2180
2180
  },
2181
2181
  {
2182
2182
  description: 'cancel running execution and automatically confirm:',
2183
- command: 'bdy tg exec kill exec-id -f',
2183
+ command: 'bdy tg exec kill target-identifier exec-id -f',
2184
2184
  },
2185
2185
  ];
2186
2186
  exports.EXAMPLE_TARGET_EXEC_LIST = [
@@ -2196,19 +2196,19 @@ exports.EXAMPLE_TARGET_EXEC_LIST = [
2196
2196
  exports.EXAMPLE_TARGET_EXEC_LOGS = [
2197
2197
  {
2198
2198
  description: 'return the execution state using semantic exit codes',
2199
- command: 'bdy target exec logs exec-id --exit-code',
2199
+ command: 'bdy target exec logs target-identifier exec-id --exit-code',
2200
2200
  },
2201
2201
  {
2202
2202
  description: 'show logs of execution:',
2203
- command: 'bdy tg exec logs exec-id',
2203
+ command: 'bdy tg exec logs target-identifier exec-id',
2204
2204
  },
2205
2205
  {
2206
2206
  description: 'show logs of execution starting from line 100:',
2207
- command: 'bdy tg exec logs exec-id --offset 100',
2207
+ command: 'bdy tg exec logs target-identifier exec-id --offset 100',
2208
2208
  },
2209
2209
  {
2210
2210
  description: 'Return log records as JSONL',
2211
- command: 'bdy target exec logs execution-id --format jsonl',
2211
+ command: 'bdy target exec logs target-identifier execution-id --format jsonl',
2212
2212
  },
2213
2213
  ];
2214
2214
  exports.EXAMPLE_ENVIRONMENT_LIST = [
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bdy",
3
3
  "preferGlobal": false,
4
- "version": "1.25.21-dev",
4
+ "version": "1.25.22-master",
5
5
  "type": "commonjs",
6
6
  "license": "MIT",
7
7
  "homepage": "https://buddy.works/docs/cli",