lim 0.32.6 → 0.33.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 (106) hide show
  1. package/README.md +126 -7
  2. package/dist/base-command.d.ts +18 -1
  3. package/dist/base-command.d.ts.map +1 -1
  4. package/dist/base-command.js +73 -5
  5. package/dist/base-command.js.map +1 -1
  6. package/dist/commands/android/logcat.d.ts +18 -0
  7. package/dist/commands/android/logcat.d.ts.map +1 -0
  8. package/dist/commands/android/logcat.js +79 -0
  9. package/dist/commands/android/logcat.js.map +1 -0
  10. package/dist/commands/gradle/build.d.ts +1 -0
  11. package/dist/commands/gradle/build.d.ts.map +1 -1
  12. package/dist/commands/gradle/build.js +20 -9
  13. package/dist/commands/gradle/build.js.map +1 -1
  14. package/dist/commands/gradle/logs.d.ts +16 -0
  15. package/dist/commands/gradle/logs.d.ts.map +1 -0
  16. package/dist/commands/gradle/logs.js +63 -0
  17. package/dist/commands/gradle/logs.js.map +1 -0
  18. package/dist/commands/gradle/run.d.ts +3 -0
  19. package/dist/commands/gradle/run.d.ts.map +1 -0
  20. package/dist/commands/gradle/run.js +5 -0
  21. package/dist/commands/gradle/run.js.map +1 -0
  22. package/dist/commands/gradle/tools/index.d.ts +3 -0
  23. package/dist/commands/gradle/tools/index.d.ts.map +1 -0
  24. package/dist/commands/gradle/tools/index.js +5 -0
  25. package/dist/commands/gradle/tools/index.js.map +1 -0
  26. package/dist/commands/gradle/tools/install.d.ts +3 -0
  27. package/dist/commands/gradle/tools/install.d.ts.map +1 -0
  28. package/dist/commands/gradle/tools/install.js +5 -0
  29. package/dist/commands/gradle/tools/install.js.map +1 -0
  30. package/dist/commands/gradle/use.d.ts +3 -0
  31. package/dist/commands/gradle/use.d.ts.map +1 -0
  32. package/dist/commands/gradle/use.js +5 -0
  33. package/dist/commands/gradle/use.js.map +1 -0
  34. package/dist/commands/xcode/build.d.ts.map +1 -1
  35. package/dist/commands/xcode/build.js +15 -9
  36. package/dist/commands/xcode/build.js.map +1 -1
  37. package/dist/commands/xcode/logs.d.ts +16 -0
  38. package/dist/commands/xcode/logs.d.ts.map +1 -0
  39. package/dist/commands/xcode/logs.js +77 -0
  40. package/dist/commands/xcode/logs.js.map +1 -0
  41. package/dist/commands/xcode/logs.test.d.ts +2 -0
  42. package/dist/commands/xcode/logs.test.d.ts.map +1 -0
  43. package/dist/commands/xcode/logs.test.js +78 -0
  44. package/dist/commands/xcode/logs.test.js.map +1 -0
  45. package/dist/commands/xcode/run.d.ts +2 -26
  46. package/dist/commands/xcode/run.d.ts.map +1 -1
  47. package/dist/commands/xcode/run.js +2 -103
  48. package/dist/commands/xcode/run.js.map +1 -1
  49. package/dist/commands/xcode/tools/index.d.ts +3 -0
  50. package/dist/commands/xcode/tools/index.d.ts.map +1 -0
  51. package/dist/commands/xcode/tools/index.js +5 -0
  52. package/dist/commands/xcode/tools/index.js.map +1 -0
  53. package/dist/commands/xcode/tools/install.d.ts +3 -0
  54. package/dist/commands/xcode/tools/install.d.ts.map +1 -0
  55. package/dist/commands/xcode/tools/install.js +5 -0
  56. package/dist/commands/xcode/tools/install.js.map +1 -0
  57. package/dist/commands/xcode/use.d.ts +3 -0
  58. package/dist/commands/xcode/use.d.ts.map +1 -0
  59. package/dist/commands/xcode/use.js +5 -0
  60. package/dist/commands/xcode/use.js.map +1 -0
  61. package/dist/commands/xcode/version/set.d.ts.map +1 -1
  62. package/dist/commands/xcode/version/set.js +1 -48
  63. package/dist/commands/xcode/version/set.js.map +1 -1
  64. package/dist/lib/additional-files.js +1 -1
  65. package/dist/lib/additional-files.js.map +1 -1
  66. package/dist/lib/build-command-helpers.d.ts +10 -0
  67. package/dist/lib/build-command-helpers.d.ts.map +1 -0
  68. package/dist/lib/build-command-helpers.js +28 -0
  69. package/dist/lib/build-command-helpers.js.map +1 -0
  70. package/dist/lib/build-logs.d.ts +27 -0
  71. package/dist/lib/build-logs.d.ts.map +1 -0
  72. package/dist/lib/build-logs.js +141 -0
  73. package/dist/lib/build-logs.js.map +1 -0
  74. package/dist/lib/build-logs.test.d.ts +2 -0
  75. package/dist/lib/build-logs.test.d.ts.map +1 -0
  76. package/dist/lib/build-logs.test.js +187 -0
  77. package/dist/lib/build-logs.test.js.map +1 -0
  78. package/dist/lib/build-run-command.d.ts +3 -0
  79. package/dist/lib/build-run-command.d.ts.map +1 -0
  80. package/dist/lib/build-run-command.js +89 -0
  81. package/dist/lib/build-run-command.js.map +1 -0
  82. package/dist/lib/build-tools-command.d.ts +3 -0
  83. package/dist/lib/build-tools-command.d.ts.map +1 -0
  84. package/dist/lib/build-tools-command.js +51 -0
  85. package/dist/lib/build-tools-command.js.map +1 -0
  86. package/dist/lib/build-use-command.d.ts +3 -0
  87. package/dist/lib/build-use-command.d.ts.map +1 -0
  88. package/dist/lib/build-use-command.js +93 -0
  89. package/dist/lib/build-use-command.js.map +1 -0
  90. package/dist/lib/build-use-command.test.d.ts +2 -0
  91. package/dist/lib/build-use-command.test.d.ts.map +1 -0
  92. package/dist/lib/build-use-command.test.js +151 -0
  93. package/dist/lib/build-use-command.test.js.map +1 -0
  94. package/dist/lib/gradle-build-options.d.ts +1 -0
  95. package/dist/lib/gradle-build-options.d.ts.map +1 -1
  96. package/dist/lib/gradle-build-options.js +6 -0
  97. package/dist/lib/gradle-build-options.js.map +1 -1
  98. package/dist/lib/gradle-build-options.test.js +6 -0
  99. package/dist/lib/gradle-build-options.test.js.map +1 -1
  100. package/dist/lib/sync-flags.js +3 -3
  101. package/dist/lib/sync-flags.js.map +1 -1
  102. package/dist/lib/xcode-tools.test.d.ts +2 -0
  103. package/dist/lib/xcode-tools.test.d.ts.map +1 -0
  104. package/dist/lib/xcode-tools.test.js +163 -0
  105. package/dist/lib/xcode-tools.test.js.map +1 -0
  106. package/package.json +4 -4
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getBuildLogs = getBuildLogs;
4
+ /**
5
+ * Returns logs for a specific build or the latest build, including one still running.
6
+ * Retained SSE is preferred for the latest build; durable object storage is
7
+ * preferred for a specific build once its metadata sidecar exists.
8
+ */
9
+ async function getBuildLogs(options) {
10
+ if (options.execId) {
11
+ if (!isBuildExecId(options.execId)) {
12
+ throw new Error(`Invalid build exec ID ${options.execId}; expected build-<number>.`);
13
+ }
14
+ const persisted = await tryListPersisted(options.listPersisted);
15
+ const record = persisted.records.find((entry) => entry.id === options.execId);
16
+ if (record) {
17
+ return readPersisted(options, record);
18
+ }
19
+ try {
20
+ return await readRetained(options, options.execId);
21
+ }
22
+ catch (retainedError) {
23
+ if (!isRetainedBuildNotFound(retainedError)) {
24
+ throw retainedError;
25
+ }
26
+ // Persistence commits just after the terminal event. Refresh once to
27
+ // close that race before reporting a missing/pruned exec.
28
+ const refreshed = await tryListPersisted(options.listPersisted);
29
+ const refreshedRecord = refreshed.records.find((entry) => entry.id === options.execId);
30
+ if (refreshedRecord) {
31
+ return readPersisted(options, refreshedRecord);
32
+ }
33
+ if (refreshed.error) {
34
+ throw refreshed.error;
35
+ }
36
+ if (!isMissingBuild(retainedError))
37
+ throw retainedError;
38
+ throw new Error(`Build ${options.execId} was not found on instance ${options.instanceId}.`);
39
+ }
40
+ }
41
+ try {
42
+ return await readRetained(options, 'latest');
43
+ }
44
+ catch (latestError) {
45
+ if (!isRetainedBuildNotFound(latestError)) {
46
+ throw latestError;
47
+ }
48
+ const persisted = await tryListPersisted(options.listPersisted);
49
+ const latest = persisted.records[persisted.records.length - 1];
50
+ if (latest) {
51
+ return readPersisted(options, latest);
52
+ }
53
+ if (persisted.error) {
54
+ throw persisted.error;
55
+ }
56
+ if (!isMissingBuild(latestError))
57
+ throw latestError;
58
+ throw new Error(`No active or persisted builds found for instance ${options.instanceId}.`);
59
+ }
60
+ }
61
+ async function readRetained(options, execId) {
62
+ const parts = [];
63
+ const observed = await options.observe(execId, {
64
+ follow: options.follow,
65
+ onEvent: (event) => {
66
+ let text;
67
+ let stream = 'stdout';
68
+ if (event.type === 'command') {
69
+ text = `$ ${event.data}`;
70
+ }
71
+ else if (event.type === 'stdout') {
72
+ text = event.data;
73
+ }
74
+ else if (event.type === 'stderr') {
75
+ text = event.data;
76
+ stream = 'stderr';
77
+ }
78
+ if (text === undefined)
79
+ return;
80
+ const chunk = text.endsWith('\n') ? text : `${text}\n`;
81
+ parts.push(chunk);
82
+ options.onText?.(chunk, stream);
83
+ },
84
+ });
85
+ return {
86
+ instanceId: options.instanceId,
87
+ execId: observed.execId,
88
+ status: observed.status,
89
+ ...(observed.exitCode !== undefined && { exitCode: observed.exitCode }),
90
+ logs: parts.join(''),
91
+ source: 'retained',
92
+ };
93
+ }
94
+ async function readPersisted(options, record) {
95
+ const logs = await (options.fetchText ?? fetchBuildLog)(record.downloadUrl);
96
+ options.onText?.(logs, 'stdout');
97
+ return {
98
+ instanceId: options.instanceId,
99
+ execId: record.id,
100
+ status: record.status,
101
+ ...(record.exitCode !== undefined && { exitCode: record.exitCode }),
102
+ logs,
103
+ source: 'persisted',
104
+ };
105
+ }
106
+ async function tryListPersisted(listPersisted) {
107
+ try {
108
+ const records = (await listPersisted()).filter((record) => isBuildExecId(record.id));
109
+ records.sort((a, b) => {
110
+ const aId = BigInt(a.id.slice(6));
111
+ const bId = BigInt(b.id.slice(6));
112
+ return (aId < bId ? -1
113
+ : aId > bId ? 1
114
+ : 0);
115
+ });
116
+ return { records };
117
+ }
118
+ catch (error) {
119
+ return { records: [], error };
120
+ }
121
+ }
122
+ async function fetchBuildLog(url) {
123
+ const response = await fetch(url);
124
+ if (!response.ok) {
125
+ throw new Error(`Failed to download build log: ${response.status} ${response.statusText}`);
126
+ }
127
+ return response.text();
128
+ }
129
+ function isRetainedBuildNotFound(err) {
130
+ // A deleted instance can still have persisted build logs.
131
+ return err instanceof Error && err.status === 404;
132
+ }
133
+ function isMissingBuild(err) {
134
+ return (err.message.includes('GET exec logs failed: 404') &&
135
+ (err.message.includes('"message":"build not found"') ||
136
+ err.message.includes('"message":"no builds exist"')));
137
+ }
138
+ function isBuildExecId(execId) {
139
+ return /^build-[0-9]+$/.test(execId);
140
+ }
141
+ //# sourceMappingURL=build-logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-logs.js","sourceRoot":"","sources":["../../src/lib/build-logs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=build-logs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-logs.test.d.ts","sourceRoot":"","sources":["../../src/lib/build-logs.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const build_logs_1 = require("./build-logs");
4
+ describe('getBuildLogs', () => {
5
+ test('returns an active build snapshot', async () => {
6
+ const onText = jest.fn();
7
+ const listPersisted = jest.fn(async () => []);
8
+ await expect((0, build_logs_1.getBuildLogs)({
9
+ instanceId: 'xcode_test',
10
+ follow: false,
11
+ listPersisted,
12
+ observe: async (execId, options) => {
13
+ expect(execId).toBe('latest');
14
+ options.onEvent({ type: 'command', data: 'xcodebuild -scheme App' });
15
+ options.onEvent({ type: 'stdout', data: 'Compiling' });
16
+ return { execId: 'build-3', status: 'RUNNING' };
17
+ },
18
+ onText,
19
+ })).resolves.toEqual({
20
+ instanceId: 'xcode_test',
21
+ execId: 'build-3',
22
+ status: 'RUNNING',
23
+ logs: '$ xcodebuild -scheme App\nCompiling\n',
24
+ source: 'retained',
25
+ });
26
+ expect(listPersisted).not.toHaveBeenCalled();
27
+ expect(onText).toHaveBeenCalledTimes(2);
28
+ });
29
+ test('falls back from missing retained logs to the latest persisted build', async () => {
30
+ const records = [
31
+ { id: 'build-1', status: 'FAILED', exitCode: 1, downloadUrl: 'https://logs/1' },
32
+ { id: 'build-2', status: 'SUCCEEDED', exitCode: 0, downloadUrl: 'https://logs/2' },
33
+ { id: 'run-3', status: 'SUCCEEDED', exitCode: 0, downloadUrl: 'https://logs/run' },
34
+ ];
35
+ await expect((0, build_logs_1.getBuildLogs)({
36
+ instanceId: 'gradle_test',
37
+ follow: false,
38
+ listPersisted: async () => records,
39
+ observe: async () => {
40
+ throw notFound();
41
+ },
42
+ fetchText: async (url) => `downloaded ${url}\n`,
43
+ })).resolves.toEqual({
44
+ instanceId: 'gradle_test',
45
+ execId: 'build-2',
46
+ status: 'SUCCEEDED',
47
+ exitCode: 0,
48
+ logs: 'downloaded https://logs/2\n',
49
+ source: 'persisted',
50
+ });
51
+ });
52
+ test('prefers durable logs for a specific completed build', async () => {
53
+ const observe = jest.fn();
54
+ const record = {
55
+ id: 'build-1',
56
+ status: 'CANCELLED',
57
+ exitCode: -1,
58
+ downloadUrl: 'https://logs/1',
59
+ };
60
+ const result = await (0, build_logs_1.getBuildLogs)({
61
+ instanceId: 'xcode_test',
62
+ execId: 'build-1',
63
+ follow: true,
64
+ listPersisted: async () => [record],
65
+ observe,
66
+ fetchText: async () => 'cancelled\n',
67
+ });
68
+ expect(result.source).toBe('persisted');
69
+ expect(result.status).toBe('CANCELLED');
70
+ expect(observe).not.toHaveBeenCalled();
71
+ });
72
+ test('refreshes persisted logs after a terminal retention race', async () => {
73
+ const record = {
74
+ id: 'build-1',
75
+ status: 'SUCCEEDED',
76
+ exitCode: 0,
77
+ downloadUrl: 'https://logs/1',
78
+ };
79
+ const listPersisted = jest
80
+ .fn()
81
+ .mockResolvedValueOnce([])
82
+ .mockResolvedValueOnce([record]);
83
+ const result = await (0, build_logs_1.getBuildLogs)({
84
+ instanceId: 'xcode_test',
85
+ execId: 'build-1',
86
+ follow: false,
87
+ listPersisted,
88
+ observe: async () => {
89
+ throw notFound();
90
+ },
91
+ fetchText: async () => 'finished\n',
92
+ });
93
+ expect(result.source).toBe('persisted');
94
+ expect(listPersisted).toHaveBeenCalledTimes(2);
95
+ });
96
+ test('uses the latest retained build during the durable upload gap', async () => {
97
+ const listPersisted = jest.fn(async () => []);
98
+ const result = await (0, build_logs_1.getBuildLogs)({
99
+ instanceId: 'xcode_test',
100
+ follow: false,
101
+ listPersisted,
102
+ observe: async (execId) => {
103
+ expect(execId).toBe('latest');
104
+ return { execId: 'build-9', status: 'SUCCEEDED', exitCode: 0 };
105
+ },
106
+ });
107
+ expect(result).toMatchObject({ execId: 'build-9', status: 'SUCCEEDED', source: 'retained' });
108
+ expect(listPersisted).not.toHaveBeenCalled();
109
+ });
110
+ test('does not mask active stream failures with stale logs', async () => {
111
+ const stale = { id: 'build-1', status: 'SUCCEEDED', downloadUrl: 'https://logs/1' };
112
+ const unavailable = Object.assign(new Error('daemon unavailable'), { status: 503 });
113
+ const listPersisted = jest.fn(async () => [stale]);
114
+ await expect((0, build_logs_1.getBuildLogs)({
115
+ instanceId: 'xcode_test',
116
+ follow: false,
117
+ listPersisted,
118
+ observe: async () => {
119
+ throw unavailable;
120
+ },
121
+ })).rejects.toBe(unavailable);
122
+ expect(listPersisted).not.toHaveBeenCalled();
123
+ });
124
+ test('reports a missing exec without an instance-level 404', async () => {
125
+ const error = await (0, build_logs_1.getBuildLogs)({
126
+ instanceId: 'xcode_test',
127
+ execId: 'build-404',
128
+ follow: false,
129
+ listPersisted: async () => [],
130
+ observe: async () => {
131
+ throw notFound();
132
+ },
133
+ }).catch((err) => err);
134
+ expect(error).toEqual(new Error('Build build-404 was not found on instance xcode_test.'));
135
+ expect(error.status).toBeUndefined();
136
+ });
137
+ test('preserves an instance-level 404 for BaseCommand handling', async () => {
138
+ const instanceMissing = Object.assign(new Error('404 GET exec logs failed: 404 {"message":"instance not found"}'), { status: 404 });
139
+ await expect((0, build_logs_1.getBuildLogs)({
140
+ instanceId: 'xcode_missing',
141
+ execId: 'build-1',
142
+ follow: false,
143
+ listPersisted: async () => [],
144
+ observe: async () => {
145
+ throw instanceMissing;
146
+ },
147
+ })).rejects.toBe(instanceMissing);
148
+ });
149
+ test('reports when an instance has no builds', async () => {
150
+ await expect((0, build_logs_1.getBuildLogs)({
151
+ instanceId: 'xcode_empty',
152
+ follow: false,
153
+ listPersisted: async () => [],
154
+ observe: async () => {
155
+ throw notFound();
156
+ },
157
+ })).rejects.toThrow('No active or persisted builds found for instance xcode_empty.');
158
+ });
159
+ test('reads the newest persisted build after the instance is deleted', async () => {
160
+ const instanceMissing = Object.assign(new Error('instance not found'), { status: 404 });
161
+ const records = [
162
+ { id: 'build-10', status: 'SUCCEEDED', exitCode: 0, downloadUrl: 'https://logs/10' },
163
+ { id: 'build-9', status: 'FAILED', exitCode: 1, downloadUrl: 'https://logs/9' },
164
+ ];
165
+ const result = await (0, build_logs_1.getBuildLogs)({
166
+ instanceId: 'xcode_deleted',
167
+ follow: false,
168
+ listPersisted: async () => records,
169
+ observe: async () => {
170
+ throw instanceMissing;
171
+ },
172
+ fetchText: async (url) => `downloaded ${url}\n`,
173
+ });
174
+ expect(result).toMatchObject({
175
+ execId: 'build-10',
176
+ logs: 'downloaded https://logs/10\n',
177
+ source: 'persisted',
178
+ });
179
+ expect(records[0]?.id).toBe('build-10');
180
+ });
181
+ });
182
+ function notFound() {
183
+ return Object.assign(new Error('404 GET exec logs failed: 404 {"message":"build not found"}'), {
184
+ status: 404,
185
+ });
186
+ }
187
+ //# sourceMappingURL=build-logs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-logs.test.js","sourceRoot":"","sources":["../../src/lib/build-logs.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { BaseCommand } from '../base-command';
2
+ export declare function buildRunCommand(platform: 'xcode' | 'gradle'): typeof BaseCommand;
3
+ //# sourceMappingURL=build-run-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-run-command.d.ts","sourceRoot":"","sources":["../../src/lib/build-run-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAK9C,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,WAAW,CAuFhF"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildRunCommand = buildRunCommand;
4
+ const core_1 = require("@oclif/core");
5
+ const base_command_1 = require("../base-command");
6
+ const sync_flags_1 = require("./sync-flags");
7
+ const build_command_helpers_1 = require("./build-command-helpers");
8
+ const env_entries_1 = require("./env-entries");
9
+ function buildRunCommand(platform) {
10
+ var _a;
11
+ return _a = class BuildRun extends base_command_1.BaseCommand {
12
+ async run() {
13
+ const delimiter = this.argv.indexOf('--');
14
+ if (delimiter < 0) {
15
+ this.error(`Separate the remote command with --, for example: lim ${platform} run -- make api`);
16
+ }
17
+ const commandArgs = this.argv.slice(delimiter + 1);
18
+ if (commandArgs.length === 0) {
19
+ this.error('A command is required after `--`.');
20
+ }
21
+ const { args, flags } = await this.parse(_a, this.argv.slice(0, delimiter));
22
+ this.setParsedFlags(flags);
23
+ const env = (0, env_entries_1.parseEnvEntries)(flags.env ?? [], (message) => this.error(message));
24
+ const commandLine = commandArgs.length === 1 ? commandArgs[0] : commandArgs.map(quoteShellArgument).join(' ');
25
+ await this.withAuth(async () => {
26
+ const { target, client } = await this.resolveBuildToolClient(platform, flags.id);
27
+ // The build sandbox hosts no simulators, so simctl install/boot/launch
28
+ // is denied there. Steer to the attach flow before the command runs.
29
+ if (platform === 'xcode' && /\bsimctl\b/.test(commandLine)) {
30
+ this.info(`Note: the ${platform} sandbox does not host simulators, so simctl cannot install or launch apps here. ` +
31
+ 'Create a cloud iOS simulator attached to this instance instead; it gets the latest build installed ' +
32
+ 'right away and every next build installed and reloaded automatically:\n' +
33
+ ` lim ios create --attach ${target.id}`);
34
+ }
35
+ if (!flags['no-sync']) {
36
+ await (0, build_command_helpers_1.syncBuildProject)(client, (0, sync_flags_1.syncOptionsFromFlags)(flags), (message) => this.info(message));
37
+ }
38
+ this.info(`Running in ${args.cwd ?? '.'}: ${commandLine}`);
39
+ const proc = client.run(commandLine, {
40
+ cwd: args.cwd ?? '.',
41
+ ...(env && { env }),
42
+ ...(flags.timeout !== undefined && { timeoutSeconds: flags.timeout }),
43
+ });
44
+ await (0, build_command_helpers_1.streamBuildCommand)(proc, (message, options) => this.error(message, options));
45
+ });
46
+ }
47
+ },
48
+ _a.summary = `Run a command on a ${platform} sandbox`,
49
+ _a.description = 'Sync the current directory, then run a one-shot shell command in the remote workspace with streamed output.',
50
+ _a.examples = [
51
+ `<%= config.bin %> ${platform} run -- make api`,
52
+ `<%= config.bin %> ${platform} run apps/api -- make generate`,
53
+ `<%= config.bin %> ${platform} run --env API_ENV=development -- npm run generate`,
54
+ `<%= config.bin %> ${platform} run --no-sync -- mise run build`,
55
+ ],
56
+ _a.args = {
57
+ cwd: core_1.Args.string({
58
+ description: 'Remote working directory relative to the synced workspace root. Defaults to ".".',
59
+ required: false,
60
+ default: '.',
61
+ }),
62
+ },
63
+ _a.flags = {
64
+ ...base_command_1.BaseCommand.baseFlags,
65
+ ...sync_flags_1.syncFlags,
66
+ id: core_1.Flags.string({
67
+ description: `${platform} instance ID to run on. Defaults to the most recent standalone ${platform} target.`,
68
+ }),
69
+ env: core_1.Flags.string({
70
+ description: 'Environment variable in KEY=VALUE form. Repeat for multiple variables.',
71
+ multiple: true,
72
+ multipleNonGreedy: true,
73
+ }),
74
+ timeout: core_1.Flags.integer({
75
+ description: 'Server-side command timeout in seconds. Defaults to 3600, max 21600.',
76
+ min: 1,
77
+ max: 21600,
78
+ }),
79
+ 'no-sync': core_1.Flags.boolean({
80
+ description: 'Skip syncing the current directory before running the command.',
81
+ default: false,
82
+ }),
83
+ },
84
+ _a;
85
+ }
86
+ function quoteShellArgument(value) {
87
+ return `'${value.split("'").join("'\"'\"'")}'`;
88
+ }
89
+ //# sourceMappingURL=build-run-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-run-command.js","sourceRoot":"","sources":["../../src/lib/build-run-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { BaseCommand } from '../base-command';
2
+ export declare function buildToolsCommand(platform: 'xcode' | 'gradle', action?: 'list' | 'install'): typeof BaseCommand;
3
+ //# sourceMappingURL=build-tools-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-tools-command.d.ts","sourceRoot":"","sources":["../../src/lib/build-tools-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI9C,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,OAAO,GAAG,QAAQ,EAC5B,MAAM,GAAE,MAAM,GAAG,SAAkB,GAClC,OAAO,WAAW,CA+CpB"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildToolsCommand = buildToolsCommand;
4
+ const core_1 = require("@oclif/core");
5
+ const base_command_1 = require("../base-command");
6
+ const sync_flags_1 = require("./sync-flags");
7
+ const build_command_helpers_1 = require("./build-command-helpers");
8
+ function buildToolsCommand(platform, action = 'list') {
9
+ var _a;
10
+ const install = action === 'install';
11
+ return _a = class BuildTools extends base_command_1.BaseCommand {
12
+ async run() {
13
+ const { flags } = await this.parse(_a);
14
+ this.setParsedFlags(flags);
15
+ await this.withAuth(async () => {
16
+ const { client } = await this.resolveBuildToolClient(platform, flags.id, 'existing');
17
+ if (flags.sync)
18
+ await (0, build_command_helpers_1.syncBuildProject)(client, (0, sync_flags_1.syncOptionsFromFlags)(flags), (message) => this.info(message));
19
+ await (0, build_command_helpers_1.streamBuildCommand)(client.run(install ? 'mise install' : 'mise ls --current', { cwd: flags.cwd }), (message, options) => this.error(message, options), install ? 'Tool installation failed' : 'Tool inspection failed');
20
+ });
21
+ }
22
+ },
23
+ _a.summary = install ?
24
+ `Install selected tools in a ${platform} sandbox`
25
+ : `Show the selected developer tools in a ${platform} sandbox`,
26
+ _a.description = install ?
27
+ 'Sync the project and run mise install in an existing sandbox. Use --no-sync to install the current sandbox selections without uploading local changes.'
28
+ : 'Inspect an existing sandbox without syncing or creating an instance. Use --sync to upload local project changes first. The first operation with project mise configuration also initializes its tools.',
29
+ _a.examples = install ?
30
+ [
31
+ `<%= config.bin %> ${platform} tools install`,
32
+ `<%= config.bin %> ${platform} tools install --cwd apps/mobile --no-sync`,
33
+ ]
34
+ : [`<%= config.bin %> ${platform} tools`, `<%= config.bin %> ${platform} tools --sync`],
35
+ _a.flags = {
36
+ ...base_command_1.BaseCommand.baseFlags,
37
+ create: { ...base_command_1.BaseCommand.baseFlags.create, hidden: true, default: false },
38
+ ...sync_flags_1.syncFlags,
39
+ id: core_1.Flags.string({
40
+ description: `${platform} instance ID. Defaults to the most recent ${platform} target.`,
41
+ }),
42
+ cwd: core_1.Flags.string({ description: 'Project directory relative to the sync root.', default: '.' }),
43
+ sync: core_1.Flags.boolean({
44
+ description: 'Sync the local project before resolving its tools.',
45
+ default: install,
46
+ allowNo: install,
47
+ }),
48
+ },
49
+ _a;
50
+ }
51
+ //# sourceMappingURL=build-tools-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-tools-command.js","sourceRoot":"","sources":["../../src/lib/build-tools-command.ts"],"names":[],"mappings":";;AAKA,8CAkDC;AAvDD,sCAAoC;AACpC,kDAA8C;AAC9C,6CAA+D;AAC/D,mEAA+E;AAE/E,SAAgB,iBAAiB,CAC/B,QAA4B,EAC5B,SAA6B,MAAM;;IAEnC,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC;IACrC,YAAO,MAAM,UAAW,SAAQ,0BAAW;YA8BzC,KAAK,CAAC,GAAG;gBACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,EAAU,CAAC,CAAC;gBAC/C,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBAC3B,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;oBAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;oBACrF,IAAI,KAAK,CAAC,IAAI;wBACZ,MAAM,IAAA,wCAAgB,EAAC,MAAM,EAAE,IAAA,iCAAoB,EAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC/F,MAAM,IAAA,0CAAkB,EACtB,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,mBAAmB,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,EAC9E,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,EAClD,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,wBAAwB,CAChE,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QA3CQ,UAAO,GACZ,OAAO,CAAC,CAAC;YACP,+BAA+B,QAAQ,UAAU;YACnD,CAAC,CAAC,0CAA0C,QAAQ,UAAW;QAC1D,cAAW,GAChB,OAAO,CAAC,CAAC;YACP,wJAAwJ;YAC1J,CAAC,CAAC,wMAAyM;QACtM,WAAQ,GACb,OAAO,CAAC,CAAC;YACP;gBACE,qBAAqB,QAAQ,gBAAgB;gBAC7C,qBAAqB,QAAQ,4CAA4C;aAC1E;YACH,CAAC,CAAC,CAAC,qBAAqB,QAAQ,QAAQ,EAAE,qBAAqB,QAAQ,eAAe,CAAE;QACnF,QAAK,GAAG;YACb,GAAG,0BAAW,CAAC,SAAS;YACxB,MAAM,EAAE,EAAE,GAAG,0BAAW,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE;YACzE,GAAG,sBAAS;YACZ,EAAE,EAAE,YAAK,CAAC,MAAM,CAAC;gBACf,WAAW,EAAE,GAAG,QAAQ,6CAA6C,QAAQ,UAAU;aACxF,CAAC;YACF,GAAG,EAAE,YAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,8CAA8C,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;YAChG,IAAI,EAAE,YAAK,CAAC,OAAO,CAAC;gBAClB,WAAW,EAAE,oDAAoD;gBACjE,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE,OAAO;aACjB,CAAC;SACF;WAeF;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { BaseCommand } from '../base-command';
2
+ export declare function buildUseCommand(platform: 'xcode' | 'gradle'): typeof BaseCommand;
3
+ //# sourceMappingURL=build-use-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-use-command.d.ts","sourceRoot":"","sources":["../../src/lib/build-use-command.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAK9C,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,WAAW,CAqFhF"}
@@ -0,0 +1,93 @@
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.buildUseCommand = buildUseCommand;
7
+ const path_1 = __importDefault(require("path"));
8
+ const core_1 = require("@oclif/core");
9
+ const mise_tools_1 = require("@limrun/api/mise-tools");
10
+ const base_command_1 = require("../base-command");
11
+ const xcode_version_1 = require("./xcode-version");
12
+ const sync_flags_1 = require("./sync-flags");
13
+ const build_command_helpers_1 = require("./build-command-helpers");
14
+ function buildUseCommand(platform) {
15
+ var _a;
16
+ return _a = class BuildUse extends base_command_1.BaseCommand {
17
+ async run() {
18
+ const { flags, argv } = await this.parse(_a);
19
+ this.setParsedFlags(flags);
20
+ let xcodeMajor;
21
+ const requests = [];
22
+ for (const request of argv) {
23
+ if (request.startsWith('xcode@')) {
24
+ if (platform !== 'xcode')
25
+ this.error('Select Xcode with lim xcode use xcode@<major>.');
26
+ xcodeMajor = (0, xcode_version_1.parseXcodeMajor)(request.slice('xcode@'.length), 'xcode use xcode@<major>');
27
+ }
28
+ else {
29
+ requests.push(request);
30
+ }
31
+ }
32
+ const tools = requests.length ? (0, mise_tools_1.parseToolRequests)(requests) : {};
33
+ const directory = path_1.default.resolve(process.cwd(), flags.cwd);
34
+ const relative = path_1.default.relative(process.cwd(), directory);
35
+ if (relative === '..' || relative.startsWith(`..${path_1.default.sep}`) || path_1.default.isAbsolute(relative))
36
+ this.error('--cwd must stay inside the synced directory.');
37
+ if (xcodeMajor)
38
+ await this.setPreferredXcodeVersion(xcodeMajor, flags.id);
39
+ if (!requests.length)
40
+ return;
41
+ const file = await (0, mise_tools_1.writeMiseTools)(directory, tools);
42
+ this.info(`Saved ${Object.entries(tools)
43
+ .map(([name, version]) => `${name}@${version}`)
44
+ .join(', ')} in ${file}.`);
45
+ await this.withAuth(async () => {
46
+ const { client } = await this.resolveBuildToolClient(platform, flags.id);
47
+ const sync = (0, sync_flags_1.syncOptionsFromFlags)(flags);
48
+ const fileRelative = path_1.default.relative(process.cwd(), file).split(path_1.default.sep).join('/');
49
+ await (0, build_command_helpers_1.syncBuildProject)(client, {
50
+ ...sync,
51
+ include: (p) => p === fileRelative ||
52
+ fileRelative.startsWith(p.endsWith('/') ? p : `${p}/`) ||
53
+ (sync?.include?.(p) ?? false),
54
+ }, (message) => this.info(message));
55
+ // Remove explicit sandbox overrides for these tools before resolving the new project requests.
56
+ const remove = Object.keys(tools)
57
+ .map((name) => `'${name}'`)
58
+ .join(' ');
59
+ const command = [
60
+ `if test -f .limrun-runtime-mise.toml; then mise unuse --no-prune --path .limrun-runtime-mise.toml ${remove}; fi`,
61
+ 'mise ls --current',
62
+ ].join(' && ');
63
+ const proc = client.run(command, { cwd: flags.cwd });
64
+ await (0, build_command_helpers_1.streamBuildCommand)(proc, (message, options) => this.error(message, options), 'Tool selection failed after saving the project configuration');
65
+ this.info(`Run lim ${platform} tools install if a selected version is missing.`);
66
+ });
67
+ }
68
+ },
69
+ _a.summary = `Select developer tool versions for a ${platform} sandbox`,
70
+ _a.description = (platform === 'xcode' ?
71
+ 'xcode@<major> selects Xcode for the workspace, like lim xcode version set. '
72
+ : '') +
73
+ `Save requested versions unchanged in the project mise configuration and sync them to the sandbox. The sandbox applies Limrun's major/minor compatibility rules. The first sandbox operation with project mise configuration initializes its tools. Run lim ${platform} tools install after later changes.`,
74
+ _a.strict = false,
75
+ _a.args = {
76
+ tools: core_1.Args.string({ required: true, description: 'One or more tool@version requests' }),
77
+ },
78
+ _a.examples = [
79
+ ...(platform === 'xcode' ? ['<%= config.bin %> xcode use xcode@27'] : []),
80
+ `<%= config.bin %> ${platform} use node@24 pnpm@10 ruby@3.3`,
81
+ `<%= config.bin %> ${platform} use --cwd apps/mobile yarn@4`,
82
+ ],
83
+ _a.flags = {
84
+ ...base_command_1.BaseCommand.baseFlags,
85
+ ...sync_flags_1.syncFlags,
86
+ id: core_1.Flags.string({
87
+ description: `${platform} instance ID. Defaults to the most recent ${platform} target.`,
88
+ }),
89
+ cwd: core_1.Flags.string({ description: 'Project directory relative to the sync root.', default: '.' }),
90
+ },
91
+ _a;
92
+ }
93
+ //# sourceMappingURL=build-use-command.js.map